-- -- (C) 2013-15 - ntop.org -- dirs = ntop.getDirs() package.path = dirs.installdir .. "/scripts/lua/modules/?.lua;" .. package.path require "lua_utils" require "flow_utils" require "voip_utils" local json = require ("dkjson") sendHTTPHeader('text/html; charset=iso-8859-1') ntop.dumpFile(dirs.installdir .. "/httpdocs/inc/header.inc") warn_shown = 0 function displayProc(proc) print("
| ") if(ifstats.sprobe) then print('Source Id') else print('VLAN ID') end print(" | " .. flow["vlan"].. " | |||
|---|---|---|---|---|
| Flow Peers | ") print(flowinfo2hostname(flow,"cli",ifstats.vlan)) if(flow["cli.systemhost"] == true) then print(" ") end print("") if(flow["cli.port"] > 0) then print(":" .. flow["cli.port"]) end print(" \n") print("") print(flowinfo2hostname(flow,"srv",ifstats.vlan)) if(flow["srv.systemhost"] == true) then print(" ") end print("") if(flow["srv.port"] > 0) then print(":" .. flow["srv.port"].. "") end print(" | |||
| Protocol | ") if(ifstats.inline and flow["verdict.pass"]) then print("") else print(" | ")
end
if(flow["verdict.pass"] == false) then print(" | ")
if(ifstats.inline) then
print('') if(flow["verdict.pass"]) then print('') end print(' | ') end print("|
| Flow Shapers | ") c = flowinfo2hostname(flow,"cli",ifstats.vlan) s = flowinfo2hostname(flow,"srv",ifstats.vlan) shaper_key = "ntopng.prefs."..ifstats.id..".shaper_max_rate" cli_max_rate = ntop.getHashCache(shaper_key, flow["shaper.cli2srv_a"]) if(cli_max_rate == "") then cli_max_rate = -1 end srv_max_rate = ntop.getHashCache(shaper_key, flow["shaper.cli2srv_b"]) if(srv_max_rate == "") then srv_max_rate = -1 end max_rate = getFlowMaxRate(cli_max_rate, srv_max_rate) print(""..c.." "..s.." | "..maxRateToString(max_rate).." | "..c.." "..s.." | "..maxRateToString(max_rate).." | ") print("") end print("
| First / Last Seen | " .. formatEpoch(flow["seen.first"]) .. " [" .. secondsToTime(os.time()-flow["seen.first"]) .. " ago]" .. " | \n")
print("" .. formatEpoch(flow["seen.last"]) .. " [" .. secondsToTime(os.time()-flow["seen.last"]) .. " ago]" .. " | ||
| Total Traffic Volume | " .. bytesToSize(flow["bytes"]) .. " | |||
| Client vs Server Traffic Breakdown | ")
cli2srv = round((flow["cli2srv.bytes"] * 100) / flow["bytes"], 0)
cli_name = shortHostName(ntop.getResolvedAddress(flow["cli.ip"]))
srv_name = shortHostName(ntop.getResolvedAddress(flow["srv.ip"]))
if(flow["cli.port"] > 0) then
cli_name = cli_name .. ":" .. flow["cli.port"]
srv_name = srv_name .. ":" .. flow["srv.port"]
end
print(' ')
print(" | |||
| Network Latency Breakdown | ")
cli2srv = round(((flow["tcp.nw_latency.client"] * 100) / s), 0)
c = string.format("%.3f", flow["tcp.nw_latency.client"])
print(' ')
s = string.format("%.3f", flow["tcp.nw_latency.server"])
print(' ')
print(" | |||
| Client to Server Traffic | " .. formatPackets(flow["cli2srv.packets"]) .. " / ".. bytesToSize(flow["cli2srv.bytes"]) .. " | |||
| Server to Client Traffic | " .. formatPackets(flow["srv2cli.packets"]) .. " / ".. bytesToSize(flow["srv2cli.bytes"]) .. " | |||
| TCP Packet Analysis | ") print(" | |||
| Client to Server / Server to Client | ||||
| Retransmissions | ".. formatPackets(flow["cli2srv.retransmissions"]) .." / ".. formatPackets(flow["srv2cli.retransmissions"]) .." | |||
| Out of Order | ".. formatPackets(flow["cli2srv.out_of_order"]) .." / ".. formatPackets(flow["srv2cli.out_of_order"]) .." | |||
| Lost | ".. formatPackets(flow["cli2srv.lost"]) .." / ".. formatPackets(flow["srv2cli.lost"]) .." | |||
| SSL Certificate | ") print(flow["ssl.certificate"]) if(flow["category"] ~= nil) then print(" "..getCategoryIcon(flow["ssl.certificate"], flow["category"])) end print(" | |||
| TCP Flags | ") flow_completed = false flow_reset = false if(hasbit(flow["tcp_flags"],0x01)) then print('FIN ') flow_completed = true end if(hasbit(flow["tcp_flags"],0x02)) then print('SYN ') end if(hasbit(flow["tcp_flags"],0x04)) then print('RST ') flow_completed = true flow_reset = true end if(hasbit(flow["tcp_flags"],0x08)) then print('PUSH ') end if(hasbit(flow["tcp_flags"],0x10)) then print('ACK ') end if(hasbit(flow["tcp_flags"],0x20)) then print('URG ') end if(flow_reset) then print(" This flow has been reset and probably the server application is down.") else if(flow_completed) then print(" This flow is completed and will soon expire.") else print(" This flow is active.") end end print(" | |||
| Actual / Peak Throughput | ") if (throughput_type == "bps") then print("" .. bitsToSize(8*flow["throughput_bps"]) .. " ") elseif (throughput_type == "pps") then print("" .. pktsToSize(flow["throughput_bps"]) .. " ") end if (throughput_type == "bps") then print(" / " .. bitsToSize(8*flow["top_throughput_bps"]) .. " ") elseif (throughput_type == "pps") then print(" / " .. pktsToSize(flow["top_throughput_bps"]) .. " ") end print(" | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0") print(" | ||
| ') width = 1024 height = 200 url = ntop.getHttpPrefix().."/lua/sprobe_flow_data.lua?flow_key="..flow_key dofile(dirs.installdir .. "/scripts/lua/inc/sprobe.lua") print(' | ||||
| Client Process Information | ||||
| Server Process Information | ||||
| DNS Query | ") if(string.ends(flow["dns.last_query"], "arpa")) then print(flow["dns.last_query"]) else print(""..flow["dns.last_query"].." ") end if(flow["category"] ~= nil) then print(" "..getCategoryIcon(flow["dns.last_query"], flow["category"])) end print(" | |||
| HTTP | HTTP Method | "..flow["http.last_method"].." | ||
| Server Name | ") if(flow["host_server_name"] ~= nil) then s = flow["host_server_name"] else s = flowinfo2hostname(flow,"srv",ifstats.vlan) end print(s) if(flow["category"] ~= nil) then print(" "..getCategoryIcon(flow["host_server_name"], flow["category"])) end print(" | |||
| URL | ") if(flow["http.last_url"] ~= "") then print(""..shortenString(flow["http.last_url"]).." ") else print(shortenString(flow["http.last_url"])) end print(" | |||
| Response Code | "..flow["http.last_return_code"].." | |||
| Server Name | "..flow["host_server_name"].." | |||
| Profile Name | "..flow["profile"].." | |||
| Dump Flow Traffic | ") print [[ ') print(" | |||
| Additional Flow Elements | ||||
| " .. getFlowKey(key) .. " | " .. handleCustomFlowField(key, value) .. " | |||