mirror of
https://github.com/ntop/ntopng.git
synced 2026-04-30 16:09:32 +00:00
2554 lines
96 KiB
Lua
2554 lines
96 KiB
Lua
--
|
|
-- (C) 2013-17 - ntop.org
|
|
--
|
|
|
|
dirs = ntop.getDirs()
|
|
package.path = dirs.installdir .. "/scripts/lua/modules/?.lua;" .. package.path
|
|
|
|
local shaper_utils
|
|
|
|
if(ntop.isPro()) then
|
|
package.path = dirs.installdir .. "/pro/scripts/lua/modules/?.lua;" .. package.path
|
|
require "snmp_utils"
|
|
shaper_utils = require("shaper_utils")
|
|
end
|
|
|
|
require "lua_utils"
|
|
require "graph_utils"
|
|
require "alert_utils"
|
|
require "historical_utils"
|
|
local json = require ("dkjson")
|
|
local host_pools_utils = require "host_pools_utils"
|
|
|
|
debug_hosts = false
|
|
page = _GET["page"]
|
|
protocol_id = _GET["protocol"]
|
|
application = _GET["application"]
|
|
host_info = url2hostinfo(_GET)
|
|
host_ip = host_info["host"]
|
|
host_name = hostinfo2hostkey(host_info)
|
|
host_vlan = host_info["vlan"] or 0
|
|
always_show_hist = _GET["always_show_hist"]
|
|
|
|
ntopinfo = ntop.getInfo()
|
|
active_page = "hosts"
|
|
|
|
interface.select(ifname)
|
|
ifstats = interface.getStats()
|
|
|
|
ifId = ifstats.id
|
|
|
|
is_packetdump_enabled = isLocalPacketdumpEnabled()
|
|
host = nil
|
|
family = nil
|
|
|
|
prefs = ntop.getPrefs()
|
|
|
|
local hostkey = hostinfo2hostkey(host_info, nil, true --[[ force show vlan --]])
|
|
local labelKey = host_info["host"].."@"..host_info["vlan"]
|
|
|
|
if((host_name == nil) or (host_ip == nil)) then
|
|
sendHTTPHeader('text/html; charset=iso-8859-1')
|
|
ntop.dumpFile(dirs.installdir .. "/httpdocs/inc/header.inc")
|
|
dofile(dirs.installdir .. "/scripts/lua/inc/menu.lua")
|
|
print("<div class=\"alert alert alert-danger\"><img src=".. ntop.getHttpPrefix() .. "/img/warning.png> Host parameter is missing (internal error ?)</div>")
|
|
return
|
|
end
|
|
|
|
if(protocol_id == nil) then protocol_id = "" end
|
|
|
|
|
|
|
|
-- print(">>>") print(host_info["host"]) print("<<<")
|
|
if(debug_hosts) then traceError(TRACE_DEBUG,TRACE_CONSOLE, "Host:" .. host_info["host"] .. ", Vlan: "..host_vlan.."\n") end
|
|
|
|
host = interface.getHostInfo(host_info["host"], host_vlan)
|
|
restoreFailed = false
|
|
|
|
if((host == nil) and ((_POST["mode"] == "restore") or (page == "historical"))) then
|
|
if(debug_hosts) then traceError(TRACE_DEBUG,TRACE_CONSOLE, "Restored Host Info\n") end
|
|
interface.restoreHost(host_info["host"], host_vlan)
|
|
host = interface.getHostInfo(host_info["host"], host_vlan)
|
|
restoreFailed = true
|
|
end
|
|
|
|
only_historical = false
|
|
|
|
local host_pool_id
|
|
|
|
if (host ~= nil) then
|
|
if (isAdministrator() and (_POST["pool"] ~= nil)) then
|
|
host_pool_id = _POST["pool"]
|
|
local prev_pool = tostring(host["host_pool_id"])
|
|
|
|
if host_pool_id ~= prev_pool then
|
|
local key = host2member(host["ip"], host["vlan"])
|
|
host_pools_utils.deletePoolMember(ifId, prev_pool, key)
|
|
host_pools_utils.addPoolMember(ifId, host_pool_id, key)
|
|
interface.reloadHostPools()
|
|
end
|
|
else
|
|
host_pool_id = tostring(host["host_pool_id"])
|
|
end
|
|
end
|
|
|
|
if(host == nil) then
|
|
if (rrd_exists(host_ip, "bytes.rrd") and always_show_hist == "true") then
|
|
page = "historical"
|
|
only_historical = true
|
|
sendHTTPHeader('text/html; charset=iso-8859-1')
|
|
ntop.dumpFile(dirs.installdir .. "/httpdocs/inc/header.inc")
|
|
dofile(dirs.installdir .. "/scripts/lua/inc/menu.lua")
|
|
print [[
|
|
<div class="bs-docs-example">
|
|
<nav class="navbar navbar-default" role="navigation">
|
|
<div class="navbar-collapse collapse">
|
|
<ul class="nav navbar-nav">
|
|
]]
|
|
print("\n<li class=\"active\"><a href=\"#\"><i class='fa fa-area-chart fa-lg'></i></a></li>\n")
|
|
print [[
|
|
<li><a href="javascript:history.go(-1)"><i class='fa fa-reply'></i></a></li>
|
|
</ul>
|
|
</div>
|
|
</nav>
|
|
</div>
|
|
]]
|
|
else
|
|
-- We need to check if this is an aggregated host
|
|
if(not(restoreFailed) and (host_info ~= nil) and (host_info["host"] ~= nil)) then json = ntop.getCache(host_info["host"].. "." .. ifId .. ".json") end
|
|
sendHTTPHeader('text/html; charset=iso-8859-1')
|
|
ntop.dumpFile(dirs.installdir .. "/httpdocs/inc/header.inc")
|
|
if page == "alerts" then
|
|
print('<script>window.location.href = "')
|
|
print(ntop.getHttpPrefix())
|
|
print('/lua/show_alerts.lua?entity='..alertEntity("host")..'&entity_val=')
|
|
print(hostkey)
|
|
print('";</script>')
|
|
else
|
|
dofile(dirs.installdir .. "/scripts/lua/inc/menu.lua")
|
|
print('<div class=\"alert alert-danger\"><i class="fa fa-warning fa-lg"></i> Host '.. hostinfo2hostkey(host_info) .. ' cannot be found. ')
|
|
if((json ~= nil) and (json ~= "")) then
|
|
print[[<form id="host_restore_form" method="post">]]
|
|
print[[<input name="mode" type="hidden" value="restore" />]]
|
|
print[[<input name="csrf" type="hidden" value="]] print(ntop.getRandomCSRFValue()) print[[" />]]
|
|
print[[</form>]]
|
|
print[[ Click <a href="javascript:void(0);" onclick="$('#host_restore_form').submit();">here</a> to restore it from cache.]]
|
|
else
|
|
print(purgedErrorString())
|
|
end
|
|
|
|
print("</div>")
|
|
dofile(dirs.installdir .. "/scripts/lua/inc/footer.lua")
|
|
end
|
|
return
|
|
end
|
|
else
|
|
sendHTTPHeader('text/html; charset=iso-8859-1')
|
|
ntop.dumpFile(dirs.installdir .. "/httpdocs/inc/header.inc")
|
|
print("<link href=\""..ntop.getHttpPrefix().."/css/tablesorted.css\" rel=\"stylesheet\">\n")
|
|
dofile(dirs.installdir .. "/scripts/lua/inc/menu.lua")
|
|
|
|
-- Added global javascript variable, in order to disable the refresh of pie chart in case
|
|
-- of historical interface
|
|
print('\n<script>var refresh = 3000 /* ms */;</script>\n')
|
|
|
|
if(host["ip"] ~= nil) then
|
|
host_name = hostinfo2hostkey(host)
|
|
host_info["host"] = host["ip"]
|
|
end
|
|
|
|
if(_POST["custom_name"] ~=nil) then
|
|
setHostAltName(hostinfo2hostkey(host_info), _POST["custom_name"])
|
|
end
|
|
|
|
host["label"] = getHostAltName(hostinfo2hostkey(host_info), host["mac"])
|
|
|
|
if((host["label"] == nil) or (host["label"] == "")) then
|
|
host["label"] = getHostAltName(host["ip"])
|
|
end
|
|
|
|
hostbase = dirs.workingdir .. "/" .. ifId .. "/rrd/" .. getPathFromKey(hostinfo2hostkey(host_info))
|
|
rrdname = hostbase .. "/bytes.rrd"
|
|
-- print(rrdname)
|
|
print [[
|
|
<div class="bs-docs-example">
|
|
<nav class="navbar navbar-default" role="navigation">
|
|
<div class="navbar-collapse collapse">
|
|
<ul class="nav navbar-nav">
|
|
]]
|
|
if((debug_hosts) and (host["ip"] ~= nil)) then traceError(TRACE_DEBUG,TRACE_CONSOLE, "Host:" .. host["ip"] .. ", Vlan: "..host["vlan"].."\n") end
|
|
url=ntop.getHttpPrefix().."/lua/host_details.lua?ifid="..ifId.."&"..hostinfo2url(host_info)
|
|
|
|
print("<li><a href=\"#\">Host: "..host_info["host"].."</A> </li>")
|
|
|
|
if((page == "overview") or (page == nil)) then
|
|
print("<li class=\"active\"><a href=\"#\"><i class=\"fa fa-home fa-lg\"></i>\n")
|
|
else
|
|
print("<li><a href=\""..url.."&page=overview\"><i class=\"fa fa-home fa-lg\"></i>\n")
|
|
end
|
|
|
|
if(page == "traffic") then
|
|
print("<li class=\"active\"><a href=\"#\">Traffic</a></li>\n")
|
|
else
|
|
if(host["ip"] ~= nil) then
|
|
print("<li><a href=\""..url.."&page=traffic\">Traffic</a></li>")
|
|
end
|
|
end
|
|
|
|
if(page == "packets") then
|
|
print("<li class=\"active\"><a href=\"#\">Packets</a></li>\n")
|
|
else
|
|
if((host["ip"] ~= nil) and (
|
|
(host["udp.packets.sent"] > 0)
|
|
or (host["udp.packets.rcvd"] > 0)
|
|
or (host["tcp.packets.sent"] > 0)
|
|
or (host["tcp.packets.rcvd"] > 0))) then
|
|
print("<li><a href=\""..url.."&page=packets\">Packets</a></li>")
|
|
end
|
|
end
|
|
|
|
if(page == "ports") then
|
|
print("<li class=\"active\"><a href=\"#\">Ports</a></li>\n")
|
|
else
|
|
if(host["ip"] ~= nil) then
|
|
print("<li><a href=\""..url.."&page=ports\">Ports</a></li>")
|
|
end
|
|
end
|
|
|
|
if(not(isLoopback(ifname))) then
|
|
if(page == "peers") then
|
|
print("<li class=\"active\"><a href=\"#\">Peers</a></li>\n")
|
|
else
|
|
if(host["ip"] ~= nil) then
|
|
print("<li><a href=\""..url.."&page=peers\">Peers</a></li>")
|
|
end
|
|
end
|
|
end
|
|
|
|
if((host["ICMPv4"] ~= nil) or (host["ICMPv6"] ~= nil)) then
|
|
if(page == "ICMP") then
|
|
print("<li class=\"active\"><a href=\"#\">ICMP</a></li>\n")
|
|
else
|
|
print("<li><a href=\""..url.."&page=ICMP\">ICMP</a></li>")
|
|
end
|
|
end
|
|
|
|
if(page == "ndpi") then
|
|
direction = _GET["direction"]
|
|
print("<li class=\"active\"><a href=\"#\">Protocols</a></li>\n")
|
|
else
|
|
if(host["ip"] ~= nil) then
|
|
print("<li><a href=\""..url.."&page=ndpi\">Protocols</a></li>")
|
|
end
|
|
end
|
|
|
|
if(prefs.is_flow_activity_enabled) then
|
|
if(page == "activities") then
|
|
print("<li class=\"active\"><a href=\"#\">Activities</a></li>\n")
|
|
else
|
|
if interface.isPcapDumpInterface() == false and host["ip"] ~= nil then
|
|
print("<li><a href=\""..url.."&page=activities\">Activities</a></li>")
|
|
end
|
|
end
|
|
end
|
|
|
|
if(page == "dns") then
|
|
print("<li class=\"active\"><a href=\"#\">DNS</a></li>\n")
|
|
else
|
|
if((host["dns"] ~= nil)
|
|
and ((host["dns"]["sent"]["num_queries"]+host["dns"]["rcvd"]["num_queries"]) > 0)) then
|
|
print("<li><a href=\""..url.."&page=dns\">DNS</a></li>")
|
|
end
|
|
end
|
|
|
|
http = host["http"]
|
|
|
|
if(page == "http") then
|
|
print("<li class=\"active\"><a href=\"#\">HTTP")
|
|
else
|
|
if((http ~= nil)
|
|
and ((http["sender"]["query"]["total"]+ http["receiver"]["response"]["total"]) > 0)) then
|
|
print("<li><a href=\""..url.."&page=http\">HTTP")
|
|
if(host["active_http_hosts"] > 0) then print(" <span class='badge badge-top-right'>".. host["active_http_hosts"] .."</span>") end
|
|
end
|
|
end
|
|
|
|
print("</a></li>\n")
|
|
|
|
if(page == "flows") then
|
|
print("<li class=\"active\"><a href=\"#\">Flows</a></li>\n")
|
|
else
|
|
if(host["ip"] ~= nil) then
|
|
print("<li><a href=\""..url.."&page=flows\">Flows</a></li>")
|
|
end
|
|
end
|
|
|
|
if(page == "categories") then
|
|
print("<li class=\"active\"><a href=\"#\"><i class=\"fa fa-sort-alpha-asc fa-lg\"></i></a></li>\n")
|
|
else
|
|
if(host["categories"] ~= nil) then
|
|
print("<li><a href=\""..url.."&page=categories\"><i class=\"fa fa-sort-alpha-asc fa-lg\"></i></a></li>")
|
|
end
|
|
end
|
|
|
|
if host["localhost"] == true then
|
|
if(ntop.isEnterprise()) then
|
|
if(page == "snmp") then
|
|
print("<li class=\"active\"><a href=\"#\">SNMP</a></li>\n")
|
|
elseif interface.isPcapDumpInterface() == false then
|
|
print("<li><a href=\""..url.."&page=snmp\">SNMP</a></li>")
|
|
end
|
|
end
|
|
end
|
|
|
|
if(not(isLoopback(ifname))) then
|
|
if(page == "talkers") then
|
|
print("<li class=\"active\"><a href=\"#\">Talkers</a></li>\n")
|
|
else
|
|
print("<li><a href=\""..url.."&page=talkers\">Talkers</a></li>")
|
|
end
|
|
|
|
if(page == "geomap") then
|
|
print("<li class=\"active\"><a href=\"#\"><i class='fa fa-globe fa-lg'></i></a></li>\n")
|
|
else
|
|
if((host["ip"] ~= nil) and (host["privatehost"] == false)) then
|
|
print("<li><a href=\""..url.."&page=geomap\"><i class='fa fa-globe fa-lg'></i></a></li>")
|
|
end
|
|
end
|
|
else
|
|
|
|
end
|
|
|
|
if(false) then
|
|
-- NOTE: code temporarily disabled
|
|
if(not(isLoopback(ifname))) then
|
|
if(page == "jaccard") then
|
|
print("<li class=\"active\"><a href=\"#\">Similarity</a></li>\n")
|
|
else
|
|
if(host["ip"] ~= nil) then
|
|
print("<li><a href=\""..url.."&page=jaccard\">Similarity</a></li>")
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
if(host.systemhost) then
|
|
if(page == "sprobe") then
|
|
print("<li class=\"active\"><a href=\"#\"><i class=\"fa fa-flag fa-lg\"></i></a></li>\n")
|
|
else
|
|
if(ifstats.sprobe) then
|
|
print("<li><a href=\""..url.."&page=sprobe\"><i class=\"fa fa-flag fa-lg\"></i></a></li>")
|
|
end
|
|
end
|
|
end
|
|
|
|
if (host["ip"] ~= nil and host['localhost']) and areAlertsEnabled() then
|
|
if(page == "alerts") then
|
|
print("\n<li class=\"active\"><a href=\"#\"><i class=\"fa fa-warning fa-lg\"></i></a></li>\n")
|
|
elseif interface.isPcapDumpInterface() == false then
|
|
print("\n<li><a href=\""..url.."&page=alerts\"><i class=\"fa fa-warning fa-lg\"></i></a></li>")
|
|
end
|
|
end
|
|
|
|
if(ntop.exists(rrdname)) then
|
|
if(page == "historical") then
|
|
print("\n<li class=\"active\"><a href=\"#\"><i class='fa fa-area-chart fa-lg'></i></a></li>\n")
|
|
else
|
|
print("\n<li><a href=\""..url.."&page=historical\"><i class='fa fa-area-chart fa-lg'></i></a></li>")
|
|
end
|
|
end
|
|
|
|
if host["localhost"] == true then
|
|
if(ntop.isEnterprise()) then
|
|
if(page == "traffic_report") then
|
|
print("\n<li class=\"active\"><a href=\"#\"><i class='fa fa-file-text report-icon'></i></a></li>\n")
|
|
else
|
|
print("\n<li><a href=\""..url.."&page=traffic_report\"><i class='fa fa-file-text report-icon'></i></a></li>")
|
|
end
|
|
else
|
|
print("\n<li><a href=\"#\" title=\""..i18n('enterpriseOnly').."\"><i class='fa fa-file-text report-icon'></i></A></li>\n")
|
|
end
|
|
end
|
|
|
|
if ((isAdministrator()) and (host["ip"] ~= nil)) then
|
|
if(page == "config") then
|
|
print("\n<li class=\"active\"><a href=\"#\"><i class=\"fa fa-cog fa-lg\"></i></a></li>\n")
|
|
elseif interface.isPcapDumpInterface() == false then
|
|
print("\n<li><a href=\""..url.."&page=config\"><i class=\"fa fa-cog fa-lg\"></i></a></li>")
|
|
end
|
|
end
|
|
|
|
print [[
|
|
<li><a href="javascript:history.go(-1)"><i class='fa fa-reply'></i></a></li>
|
|
</ul>
|
|
</div>
|
|
</nav>
|
|
</div>
|
|
]]
|
|
|
|
--tprint(host)
|
|
if((page == "overview") or (page == nil)) then
|
|
print("<table class=\"table table-bordered table-striped\">\n")
|
|
|
|
if(host["ip"] ~= nil) then
|
|
if(host["mac"] ~= "00:00:00:00:00:00") then
|
|
print("<tr><th width=35%>(Router/AccessPoint) MAC Address</th><td>" ..get_symbolic_mac(host["mac"]).. " "..getHostIcon(host["mac"]).."</td><td>")
|
|
else
|
|
if(host["localhost"] == true and is_packetdump_enabled) then
|
|
print("<tr><th width=35%>Traffic Dump</th><td colspan=2>")
|
|
end
|
|
end
|
|
print('</td></tr>')
|
|
|
|
if(host['localhost'] and (host["mac"] ~= "") and (info["version.enterprise_edition"])) then
|
|
local ports = find_mac_snmp_ports(host["mac"], _GET["snmp_recache"] == "true")
|
|
|
|
if(ports ~= nil) then
|
|
local rsps = 1
|
|
|
|
for snmp_device_ip,port in pairs(ports) do
|
|
rsps = rsps + 1
|
|
end
|
|
|
|
if(rsps > 1) then
|
|
print('<tr><td width=35% rowspan='..rsps..'><b>Host SNMP Localization <a href="'..url..'&snmp_recache=true" title="Refresh"><i class="fa fa-refresh fa-sm" aria-hidden="true"></i></a></b><p><small>NOTE: Hosts are located in SNMP devices using the <A HREF=https://tools.ietf.org/html/rfc4188>Bridge MIB</A>.</small></td>')
|
|
print("<th>SNMP Device</th><th>Device Port</th></tr>\n")
|
|
for snmp_device_ip,port in pairs(ports) do
|
|
local community = get_snmp_community(snmp_device_ip)
|
|
local trunk
|
|
|
|
print("<tr><td align=right><A HREF='" .. ntop.getHttpPrefix() .. "/lua/pro/enterprise/snmp_device_info.lua?ip="..snmp_device_ip.."'>"..ntop.getResolvedAddress(snmp_device_ip).."</A></td>")
|
|
|
|
if(port.trunk) then trunk = ' <span class="label label-info">trunk<span>' else trunk = "" end
|
|
print("<td align=right><A HREF='" .. ntop.getHttpPrefix() .. "/lua/pro/enterprise/snmp_device_info.lua?ip="..snmp_device_ip .. "&ifIdx="..port.id.."'>"..port.id.." <span class=\"label label-default\">"..get_snmp_port_label(snmp_device_ip, community, port.id).."</span>"..trunk.."</A></td></tr>\n")
|
|
end
|
|
end
|
|
end
|
|
end
|
|
print("</tr>")
|
|
|
|
print("<tr><th>IP Address</th><td colspan=1>" .. host["ip"])
|
|
|
|
historicalProtoHostHref(getInterfaceId(ifname), host["ip"], nil, nil, nil)
|
|
|
|
if(host["local_network_name"] ~= nil) then
|
|
print(" [ <A HREF='"..ntop.getHttpPrefix().."/lua/flows_stats.lua?network="..host["local_network_id"].."'>".. host["local_network_name"].."</A> ]")
|
|
end
|
|
|
|
if((host["city"] ~= nil) and (host["city"] ~= "")) then
|
|
print(" [ " .. host["city"] .." "..getFlag(host["country"]).." ]")
|
|
end
|
|
|
|
print[[</td><td><span>Host Pool: ]]
|
|
if not ifstats.isView then
|
|
print[[<a href="]] print(ntop.getHttpPrefix()) print[[/lua/hosts_stats.lua?pool=]] print(host_pool_id) print[[">]] print(host_pools_utils.getPoolName(ifId, host_pool_id)) print[[</a></span>]]
|
|
else
|
|
-- no link for view interfaces
|
|
print(host_pools_utils.getPoolName(ifId, host_pool_id))
|
|
end
|
|
print("</td></tr>")
|
|
else
|
|
if(host["mac"] ~= nil) then
|
|
print("<tr><th>MAC Address</th><td colspan=2>" .. host["mac"].. "</td></tr>\n")
|
|
end
|
|
end
|
|
|
|
if(ifstats.vlan and (host["vlan"] ~= nil)) then
|
|
print("<tr><th>")
|
|
|
|
if(ifstats.sprobe) then
|
|
print('Source Id')
|
|
else
|
|
print('VLAN ID')
|
|
end
|
|
|
|
print("</th><td colspan=2><A HREF="..ntop.getHttpPrefix().."/lua/hosts_stats.lua?vlan="..host["vlan"]..">"..host["vlan"].."</A></td></tr>\n")
|
|
end
|
|
|
|
if(host["os"] ~= "") then
|
|
print("<tr>")
|
|
if(host["os"] ~= "") then
|
|
print("<th>OS</th><td> <A HREF='"..ntop.getHttpPrefix().."/lua/hosts_stats.lua?os=" .. string.gsub(host["os"], " ", '%%20').. "'>"..mapOS2Icon(host["os"]) .. "</A></td><td></td>\n")
|
|
else
|
|
print("<th></th><td></td>\n")
|
|
end
|
|
print("</tr>")
|
|
end
|
|
|
|
if((host["asn"] ~= nil) and (host["asn"] > 0)) then
|
|
print("<tr><th>ASN</th><td>")
|
|
|
|
print("<A HREF='" .. ntop.getHttpPrefix() .. "/lua/hosts_stats.lua?asn=".. host.asn .."'>"..host.asname.."</A> [ ASN <A HREF='" .. ntop.getHttpPrefix() .. "/lua/hosts_stats.lua?asn=".. host.asn.."'>".. host.asn.."</A> ]</td>")
|
|
print('<td><A HREF="http://itools.com/tool/arin-whois-domain-search?q='.. host["ip"] ..'&submit=Look+up">Whois Lookup</A> <i class="fa fa-external-link"></i></td>')
|
|
print("</td></tr>\n")
|
|
end
|
|
|
|
if(host["ip"] ~= nil) then
|
|
if(host["name"] == nil) then
|
|
host["name"] = ntop.getResolvedAddress(host["ip"])
|
|
end
|
|
print("<tr><th>Name</th>")
|
|
|
|
if(isAdministrator()) then
|
|
print("<td><A HREF=\"http://" .. host["name"] .. "\"> <span id=name>")
|
|
else
|
|
print("<td colspan=2>")
|
|
end
|
|
|
|
if(host["ip"] == host["name"]) then
|
|
print("<img border=0 src=".. ntop.getHttpPrefix() .. "/img/throbber.gif style=\"vertical-align:text-top;\" id=throbber> ")
|
|
end
|
|
|
|
--tprint(host) io.write("\n")
|
|
print(host["name"] .. "</span></A> <i class=\"fa fa-external-link\"></i> ")
|
|
if(host["localhost"] == true) then print('<span class="label label-success">Local Host</span>') else print('<span class="label label-default">Remote</span>') end
|
|
if(host["privatehost"] == true) then print(' <span class="label label-warning">Private IP</span>') end
|
|
if(host["systemhost"] == true) then print(' <span class="label label-info">System IP<i class=\"fa fa-flag\"></i></span>') end
|
|
if(host["is_blacklisted"] == true) then print(' <span class="label label-danger">Blacklisted Host</span>') end
|
|
|
|
print(getHostIcon(labelKey))
|
|
print("</td><td></td>\n")
|
|
end
|
|
|
|
if(host["num_alerts"] > 0) then
|
|
print("<tr><th><i class=\"fa fa-warning fa-lg\" style='color: #B94A48;'></i> <A HREF='"..ntop.getHttpPrefix().."/lua/host_details.lua?ifid="..ifId.."&"..hostinfo2url(host_info).."&page=alerts'>Alerts</A></th><td colspan=2></li> <span id=num_alerts>"..host["num_alerts"] .. "</span> <span id=alerts_trend></span></td></tr>\n")
|
|
end
|
|
|
|
print("<tr><th>First / Last Seen</th><td nowrap><span id=first_seen>" .. formatEpoch(host["seen.first"]) .. " [" .. secondsToTime(os.time()-host["seen.first"]) .. " ago]" .. "</span></td>\n")
|
|
print("<td width='35%'><span id=last_seen>" .. formatEpoch(host["seen.last"]) .. " [" .. secondsToTime(os.time()-host["seen.last"]) .. " ago]" .. "</span></td></tr>\n")
|
|
|
|
|
|
if((host["bytes.sent"]+host["bytes.rcvd"]) > 0) then
|
|
print("<tr><th>Sent vs Received Traffic Breakdown</th><td colspan=2>")
|
|
breakdownBar(host["bytes.sent"], "Sent", host["bytes.rcvd"], "Rcvd", 0, 100)
|
|
print("</td></tr>\n")
|
|
end
|
|
|
|
print("<tr><th>Traffic Sent / Received</th><td><span id=pkts_sent>" .. formatPackets(host["packets.sent"]) .. "</span> / <span id=bytes_sent>".. bytesToSize(host["bytes.sent"]) .. "</span> <span id=sent_trend></span></td><td><span id=pkts_rcvd>" .. formatPackets(host["packets.rcvd"]) .. "</span> / <span id=bytes_rcvd>".. bytesToSize(host["bytes.rcvd"]) .. "</span> <span id=rcvd_trend></span></td></tr>\n")
|
|
|
|
local flows_th = "Recently Active Flows / Total"
|
|
if interface.isPacketInterface() then
|
|
if interface.isPcapDumpInterface() == false then
|
|
flows_th = "Active Flows / Total Active / Low Goodput"
|
|
else
|
|
flows_th = "Flows / Total Active / Low Goodput"
|
|
end
|
|
end
|
|
|
|
print("<tr><th rowspan=2>"..flows_th.."</th><th>'As Client'</th><th>'As Server'</th></tr>\n")
|
|
print("<tr><td><span id=active_flows_as_client>" .. formatValue(host["active_flows.as_client"]) .. "</span> <span id=trend_as_active_client></span> \n")
|
|
print("/ <span id=flows_as_client>" .. formatValue(host["flows.as_client"]) .. "</span> <span id=trend_as_client></span> \n")
|
|
if interface.isPacketInterface() then
|
|
print("/ <span id=low_goodput_as_client>" .. formatValue(host["low_goodput_flows.as_client"]) .. "</span> <span id=low_goodput_trend_as_client></span>\n")
|
|
end
|
|
print("</td>")
|
|
|
|
print("<td><span id=active_flows_as_server>" .. formatValue(host["active_flows.as_server"]) .. "</span> <span id=trend_as_active_server></span> \n")
|
|
print("/ <span id=flows_as_server>"..formatValue(host["flows.as_server"]) .. "</span> <span id=trend_as_server></span> \n")
|
|
if interface.isPacketInterface() then
|
|
print("/ <span id=low_goodput_as_server>" .. formatValue(host["low_goodput_flows.as_server"]) .. "</span> <span id=low_goodput_trend_as_server></span>\n")
|
|
end
|
|
print("</td></tr>")
|
|
|
|
if host["tcp.packets.seq_problems"] == true then
|
|
print("<tr><th width=30% rowspan=3>TCP Packets Sent Analysis</th><th>Retransmissions</th><td align=right><span id=pkt_retransmissions>".. formatPackets(host["tcp.packets.retransmissions"]) .."</span> <span id=pkt_retransmissions_trend></span></td></tr>\n")
|
|
print("<tr></th><th>Out of Order</th><td align=right><span id=pkt_ooo>".. formatPackets(host["tcp.packets.out_of_order"]) .."</span> <span id=pkt_ooo_trend></span></td></tr>\n")
|
|
print("<tr></th><th>Lost</th><td align=right><span id=pkt_lost>".. formatPackets(host["tcp.packets.lost"]) .."</span> <span id=pkt_lost_trend></span></td></tr>\n")
|
|
end
|
|
|
|
|
|
if((host["info"] ~= nil) or (host["label"] ~= nil))then
|
|
print("<tr><th>Further Host Names/Information</th><td colspan=2>")
|
|
if(host["info"] ~= nil) then print(host["info"]) end
|
|
if((host["label"] ~= nil) and (host["info"] ~= host["label"])) then print(host["label"]) end
|
|
print("</td></tr>\n")
|
|
end
|
|
|
|
if(host["json"] ~= nil) then print("<tr><th><A HREF='http://en.wikipedia.org/wiki/JSON'>JSON</A></th><td colspan=2><i class=\"fa fa-download fa-lg\"></i> <A HREF='"..ntop.getHttpPrefix().."/lua/host_get_json.lua?ifid="..ifId.."&"..hostinfo2url(host_info).."'>Download<A></td></tr>\n") end
|
|
|
|
|
|
print("</table>\n")
|
|
|
|
elseif((page == "packets")) then
|
|
print [[
|
|
|
|
<table class="table table-bordered table-striped">
|
|
]]
|
|
|
|
if(host["bytes.sent"] > 0) then
|
|
print('<tr><th class="text-left">Sent Distribution</th><td colspan=5><div class="pie-chart" id="sizeSentDistro"></div></td></tr>')
|
|
end
|
|
if(host["bytes.rcvd"] > 0) then
|
|
print('<tr><th class="text-left">Received Distribution</th><td colspan=5><div class="pie-chart" id="sizeRecvDistro"></div></td></tr>')
|
|
end
|
|
if (host["tcp.packets.rcvd"] + host["tcp.packets.sent"] > 0) then
|
|
print('<tr><th class="text-left">TCP Flags Distribution</th><td colspan=5><div class="pie-chart" id="flagsDistro"></div></td></tr>')
|
|
end
|
|
if (not isEmptyString(host["mac"])) and (host["mac"] ~= "00:00:00:00:00:00") then
|
|
local macinfo = interface.getMacInfo(host["mac"], host_info["vlan"])
|
|
|
|
if (macinfo ~= nil) and (macinfo["arp_requests.sent"] + macinfo["arp_requests.rcvd"] + macinfo["arp_replies.sent"] + macinfo["arp_replies.rcvd"] > 0) then
|
|
print('<tr><th class="text-left">ARP Distribution</th><td colspan=5><div class="pie-chart" id="arpDistro"></div></td></tr>')
|
|
end
|
|
end
|
|
|
|
hostinfo2json(host_info)
|
|
print [[
|
|
</table>
|
|
|
|
<script type='text/javascript'>
|
|
window.onload=function() {
|
|
|
|
do_pie("#sizeSentDistro", ']]
|
|
print (ntop.getHttpPrefix())
|
|
print [[/lua/host_pkt_distro.lua', { distr: "size", direction: "sent", ifid: "]] print(ifId.."") print ('", '..hostinfo2json(host_info) .."}, \"\", refresh); \n")
|
|
print [[
|
|
do_pie("#sizeRecvDistro", ']]
|
|
print (ntop.getHttpPrefix())
|
|
print [[/lua/host_pkt_distro.lua', { distr: "size", direction: "recv", ifid: "]] print(ifId.."") print ('", '..hostinfo2json(host_info) .."}, \"\", refresh); \n")
|
|
print [[
|
|
do_pie("#flagsDistro", ']]
|
|
print (ntop.getHttpPrefix())
|
|
print [[/lua/if_tcpflags_pkt_distro.lua', { ifid: "]] print(ifId.."") print ('", '..hostinfo2json(host_info) .."}, \"\", refresh); \n")
|
|
|
|
local macinfo = table.clone(host_info)
|
|
macinfo["host"] = host["mac"]
|
|
|
|
print [[
|
|
do_pie("#arpDistro", ']]
|
|
print (ntop.getHttpPrefix())
|
|
print [[/lua/get_arp_data.lua', { ifid: "]] print(ifId.."") print ('", '..hostinfo2json(macinfo) .."}, \"\", refresh); \n")
|
|
print [[
|
|
|
|
}
|
|
|
|
</script><p>
|
|
]]
|
|
|
|
elseif((page == "ports")) then
|
|
print [[
|
|
|
|
<table class="table table-bordered table-striped">
|
|
]]
|
|
|
|
if(host["bytes.sent"] > 0) then
|
|
print('<tr><th class="text-left">Client Ports</th><td colspan=5><div class="pie-chart" id="clientPortsDistro"></div></td></tr>')
|
|
end
|
|
if(host["bytes.rcvd"] > 0) then
|
|
print('<tr><th class="text-left">Server Ports</th><td colspan=5><div class="pie-chart" id="serverPortsDistro"></div></td></tr>')
|
|
end
|
|
hostinfo2json(host_info)
|
|
print [[
|
|
</table>
|
|
|
|
<script type='text/javascript'>
|
|
window.onload=function() {
|
|
|
|
do_pie("#clientPortsDistro", ']]
|
|
print (ntop.getHttpPrefix())
|
|
print [[/lua/iface_ports_list.lua', { clisrv: "client", ifid: "]] print(ifId.."") print ('", '..hostinfo2json(host_info) .."}, \"\", refresh); \n")
|
|
print [[
|
|
do_pie("#serverPortsDistro", ']]
|
|
print (ntop.getHttpPrefix())
|
|
print [[/lua/iface_ports_list.lua', { clisrv: "server", ifid: "]] print(ifId.."") print ('", '..hostinfo2json(host_info) .."}, \"\", refresh); \n")
|
|
print [[
|
|
|
|
}
|
|
|
|
</script><p>
|
|
]]
|
|
|
|
elseif((page == "peers")) then
|
|
host_info = url2hostinfo(_GET)
|
|
peers = getTopFlowPeers(hostinfo2hostkey(host_info), 1 --[[exists query]])
|
|
found = 0
|
|
|
|
for key, value in pairs(peers) do
|
|
found = 1
|
|
break
|
|
end
|
|
|
|
if(found) then
|
|
print [[
|
|
|
|
<table border=0>
|
|
<tr><td>
|
|
<div id="chart-row-hosts">
|
|
<strong>Top ]] print(hostinfo2hostkey(host_info) ) print [[ Peers</strong>
|
|
<div class="clearfix"></div>
|
|
</div>
|
|
|
|
<div id="chart-ring-protocol">
|
|
<strong>Top Peer Protocols</strong>
|
|
<div class="clearfix"></div>
|
|
</div>
|
|
</td></tr></table>
|
|
|
|
<div class="row">
|
|
<div>
|
|
<table class="table table-hover dc-data-table">
|
|
<thead>
|
|
<tr class="header">
|
|
<th>Host</th>
|
|
<th>L7 Protocol</th>
|
|
<th>Traffic Volume</th>
|
|
</tr>
|
|
</thead>
|
|
</table>
|
|
</div>
|
|
|
|
|
|
<script>
|
|
var protocolChart = dc.pieChart("#chart-ring-protocol");
|
|
var hostChart = dc.rowChart("#chart-row-hosts");
|
|
|
|
$.ajax({
|
|
type: 'GET',]]
|
|
print("url: '"..ntop.getHttpPrefix().."/lua/host_top_peers_protocols.lua?ifid="..ifId.."&host="..host_info["host"])
|
|
if((host_info["vlan"] ~= nil) and ifstats.vlan) then print("&vlan="..host_info["vlan"]) end
|
|
print("',\n")
|
|
print [[
|
|
data: { },
|
|
error: function(content) { console.log("Host Top Peers: Parse error"); },
|
|
success: function(content) {
|
|
var rsp;
|
|
// set crossfilter
|
|
var ndx = crossfilter(content),
|
|
protocolDim = ndx.dimension(function(d) {return d.l7proto;}),
|
|
trafficDim = ndx.dimension(function(d) {return Math.floor(d.traffic/10);}),
|
|
nameDim = ndx.dimension(function(d) {return d.name;});
|
|
// actually this script expects input data to be aggregated by host, otherwise we are making the sum of logarithms here
|
|
trafficPerl7proto = protocolDim.group().reduceSum(function(d) {return +d.traffic;}),
|
|
trafficPerhost = nameDim.group().reduceSum(function(d) {return +d.traffic;}),
|
|
trafficHist = trafficDim.group().reduceCount();
|
|
|
|
protocolChart
|
|
.width(400).height(300)
|
|
.dimension(protocolDim)
|
|
.group(trafficPerl7proto)
|
|
.innerRadius(70);
|
|
|
|
// Tooltip
|
|
protocolChart.title(function(d){
|
|
return d.key+": " + bytesToVolume(Math.pow(10, d.value));
|
|
})
|
|
|
|
protocolChart.on("click", function(){ alert("A"); });
|
|
|
|
hostChart
|
|
.width(600).height(300)
|
|
.dimension(nameDim)
|
|
.group(trafficPerhost)
|
|
.elasticX(true);
|
|
|
|
// Tooltip
|
|
hostChart.title(function(d){
|
|
return "Host "+d.key+": " + bytesToVolume(Math.pow(10, d.value));
|
|
})
|
|
|
|
hostChart.xAxis().tickFormat(function(_v) {
|
|
var v = Math.pow(10, _v);
|
|
|
|
if(v < 1024)
|
|
return(v.toFixed(2));
|
|
else
|
|
return bytesToVolume(v);
|
|
});
|
|
|
|
// dimension by full date
|
|
var dateDimension = ndx.dimension(function (d) {
|
|
return d.host;
|
|
});
|
|
|
|
dc.dataTable(".dc-data-table")
|
|
.dimension(dateDimension)
|
|
.group(function (d) { return d.name; })
|
|
.size(10) // (optional) max number of records to be shown, :default = 25
|
|
// dynamic columns creation using an array of closures
|
|
.columns([
|
|
function (d) {
|
|
return d.url;
|
|
},
|
|
function (d) {
|
|
return d.l7proto_url;
|
|
},
|
|
function (d) {
|
|
return bytesToVolume(Math.pow(10, d.traffic));
|
|
}
|
|
])
|
|
// (optional) sort using the given field, :default = function(d){return d;}
|
|
.sortBy(function (d) {
|
|
return +d.traffic;
|
|
})
|
|
// (optional) sort order, :default ascending
|
|
.order(d3.descending)
|
|
// (optional) custom renderlet to post-process chart using D3
|
|
.renderlet(function (table) {
|
|
table.selectAll(".dc-table-group").classed("info", true);
|
|
});
|
|
|
|
|
|
dc.renderAll();
|
|
}
|
|
});
|
|
|
|
</script>
|
|
]]
|
|
|
|
|
|
else
|
|
print("<disv class=\"alert alert-danger\"><img src=".. ntop.getHttpPrefix() .. "/img/warning.png> No active flows have been observed for the specified host</div>")
|
|
end
|
|
elseif((page == "traffic")) then
|
|
total = 0
|
|
for id, _ in ipairs(l4_keys) do
|
|
k = l4_keys[id][2]
|
|
if(host[k..".bytes.sent"] ~= nil) then total = total + host[k..".bytes.sent"] end
|
|
if(host[k..".bytes.rcvd"] ~= nil) then total = total + host[k..".bytes.rcvd"] end
|
|
end
|
|
|
|
if(total == 0) then
|
|
print("<div class=\"alert alert-danger\"><img src=".. ntop.getHttpPrefix() .. "/img/warning.png> No traffic has been observed for the specified host</div>")
|
|
else
|
|
print [[
|
|
|
|
<table class="table table-bordered table-striped">
|
|
<tr><th class="text-left">L4 Protocol Overview</th><td colspan=5><div class="pie-chart" id="topApplicationProtocols"></div></td></tr>
|
|
</div>
|
|
|
|
<script type='text/javascript'>
|
|
window.onload=function() {
|
|
|
|
do_pie("#topApplicationProtocols", ']]
|
|
print (ntop.getHttpPrefix())
|
|
print [[/lua/host_l4_stats.lua', { ifid: "]] print(ifId.."") print('", '..hostinfo2json(host_info) .."}, \"\", refresh); \n")
|
|
print [[
|
|
}
|
|
|
|
</script><p>
|
|
]]
|
|
|
|
print("<tr><th>Protocol</th><th>Sent</th><th>Received</th><th>Breakdown</th><th colspan=2>Total</th></tr>\n")
|
|
|
|
for id, _ in ipairs(l4_keys) do
|
|
label = l4_keys[id][1]
|
|
k = l4_keys[id][2]
|
|
sent = host[k..".bytes.sent"]
|
|
if(sent == nil) then sent = 0 end
|
|
rcvd = host[k..".bytes.rcvd"]
|
|
if(rcvd == nil) then rcvd = 0 end
|
|
|
|
if((sent > 0) or (rcvd > 0)) then
|
|
print("<tr><th>")
|
|
fname = getRRDName(ifId, hostinfo2hostkey(host_info), k)
|
|
if(not ntop.exists(fname)) then
|
|
print("<A HREF=\""..ntop.getHttpPrefix().."/lua/host_details.lua?ifid="..ifId.."&"..hostinfo2url(host_info) .. "&page=historical&rrd_file=".. k ..".rrd\">".. label .."</A>")
|
|
else
|
|
print(label)
|
|
end
|
|
t = sent+rcvd
|
|
historicalProtoHostHref(ifId, host, l4_keys[id][3], nil, nil)
|
|
print("</th><td class=\"text-right\">" .. bytesToSize(sent) .. "</td><td class=\"text-right\">" .. bytesToSize(rcvd) .. "</td><td>")
|
|
breakdownBar(sent, "Sent", rcvd, "Rcvd", 0, 100)
|
|
print("</td><td class=\"text-right\">" .. bytesToSize(t).. "</td><td class=\"text-right\">" .. round((t * 100)/total, 2).. " %</td></tr>\n")
|
|
end
|
|
end
|
|
print("</table></tr>\n")
|
|
|
|
print("</table>\n")
|
|
end
|
|
|
|
|
|
elseif((page == "ICMP")) then
|
|
|
|
print [[
|
|
<table id="myTable" class="table table-bordered table-striped tablesorter">
|
|
<thead><tr><th>ICMP Message</th><th>Last Sent Peer</th><th>Last Rcvd Peer</th><th>Breakdown</th><th style='text-align:right;'>Packets Sent</th><th style='text-align:right;'>Packets Received</th><th style='text-align:right;'>Total</th></tr></thead>
|
|
<tbody id="host_details_icmp_tbody">
|
|
</tbody>
|
|
</table>
|
|
|
|
<script>
|
|
function update_icmp_table() {
|
|
$.ajax({
|
|
type: 'GET',
|
|
url: ']]
|
|
print(ntop.getHttpPrefix())
|
|
print [[/lua/get_icmp_data.lua',
|
|
data: { ifid: "]] print(ifId.."") print ("\" , ") print(hostinfo2json(host_info))
|
|
|
|
print [[ },
|
|
success: function(content) {
|
|
$('#host_details_icmp_tbody').html(content);
|
|
$('#myTable').trigger("update");
|
|
}
|
|
});
|
|
}
|
|
|
|
update_icmp_table();
|
|
setInterval(update_icmp_table, 5000);
|
|
|
|
</script>
|
|
|
|
]]
|
|
elseif((page == "ndpi")) then
|
|
if(host["ndpi"] ~= nil) then
|
|
print [[
|
|
|
|
<table class="table table-bordered table-striped">
|
|
<tr><th class="text-left">Protocol Overview</th>
|
|
<td colspan=3>
|
|
<div class="pie-chart" id="topApplicationProtocols"></div>
|
|
</td>
|
|
<td colspan=2>
|
|
<div class="pie-chart" id="topApplicationBreeds"></div>
|
|
</td>
|
|
</tr>
|
|
</div>
|
|
|
|
<script type='text/javascript'>
|
|
window.onload=function() {
|
|
|
|
do_pie("#topApplicationProtocols", ']]
|
|
print (ntop.getHttpPrefix())
|
|
print [[/lua/iface_ndpi_stats.lua', { ifid: "]] print(ifId.."") print ("\" , ") print(hostinfo2json(host_info)) print [[ }, "", refresh);
|
|
|
|
do_pie("#topApplicationBreeds", ']]
|
|
print (ntop.getHttpPrefix())
|
|
print [[/lua/iface_ndpi_stats.lua', { breed: "true", ifid: "]] print(ifId.."") print ("\" , ") print(hostinfo2json(host_info)) print [[ }, "", refresh);
|
|
|
|
|
|
|
|
}
|
|
|
|
</script>
|
|
<p>
|
|
]]
|
|
|
|
print("</table>\n")
|
|
|
|
local direction_filter = ""
|
|
local base_url = ntop.getHttpPrefix().."/lua/host_details.lua?ifid="..ifId.."&"..hostinfo2url(host_info).."&page=ndpi";
|
|
|
|
if(direction ~= nil) then
|
|
direction_filter = '<span class="glyphicon glyphicon-filter"></span>'
|
|
end
|
|
|
|
print('<div class="dt-toolbar btn-toolbar pull-right">')
|
|
print('<div class="btn-group"><button class="btn btn-link dropdown-toggle" data-toggle="dropdown">Direction ' .. direction_filter .. '<span class="caret"></span></button> <ul class="dropdown-menu" role="menu" id="direction_dropdown">')
|
|
print('<li><a href="'..base_url..'">All</a></li>')
|
|
print('<li><a href="'..base_url..'&direction=sent">Sent only</a></li>')
|
|
print('<li><a href="'..base_url..'&direction=recv">Received only</a></li>')
|
|
print('</ul></div></div>')
|
|
|
|
print [[
|
|
<table class="table table-bordered table-striped">
|
|
]]
|
|
|
|
print("<thead><tr><th>Application Protocol</th><th>Duration</th><th>Sent</th><th>Received</th><th>Breakdown</th><th colspan=2>Total</th></tr></thead>\n")
|
|
|
|
print ('<tbody id="host_details_ndpi_tbody">\n')
|
|
print ("</tbody>")
|
|
print("</table>\n")
|
|
|
|
print [[
|
|
<script>
|
|
function update_ndpi_table() {
|
|
$.ajax({
|
|
type: 'GET',
|
|
url: ']]
|
|
print(ntop.getHttpPrefix())
|
|
print [[/lua/host_details_ndpi.lua',
|
|
data: { ifid: "]] print(ifId.."") print ("\" , ") print(hostinfo2json(host_info))
|
|
if direction ~= nil then print(", sflow_filter:\"") print(direction..'"') end
|
|
print [[ },
|
|
success: function(content) {
|
|
$('#host_details_ndpi_tbody').html(content);
|
|
// Let the TableSorter plugin know that we updated the table
|
|
$('#h_ndpi_tbody').trigger("update");
|
|
}
|
|
});
|
|
}
|
|
update_ndpi_table();
|
|
]]
|
|
|
|
-- Update interval ndpi table
|
|
print("setInterval(update_ndpi_table, 5000);")
|
|
|
|
print [[
|
|
|
|
</script>
|
|
|
|
]]
|
|
|
|
end
|
|
|
|
elseif(page == "activities") then
|
|
print("<table class=\"table table-bordered table-striped\">\n")
|
|
|
|
print [[
|
|
<tr><th>Host Activity</th><td colspan=2>
|
|
<span id="sentHeatmap"></span>
|
|
<button id="sent-heatmap-prev-selector" style="margin-bottom: 10px;" class="btn btn-default btn-sm"><i class="fa fa-angle-left fa-lg""></i></button>
|
|
<button id="heatmap-refresh" style="margin-bottom: 10px;" class="btn btn-default btn-sm"><i class="fa fa-refresh fa-lg"></i></button>
|
|
<button id="sent-heatmap-next-selector" style="margin-bottom: 10px;" class="btn btn-default btn-sm"><i class="fa fa-angle-right fa-lg"></i></button>
|
|
<p><span id="heatmapInfo"></span>
|
|
|
|
<script type="text/javascript">
|
|
|
|
var sent_calendar = new CalHeatMap();
|
|
sent_calendar.init({
|
|
itemSelector: "#sentHeatmap",
|
|
data: "]]
|
|
print(ntop.getHttpPrefix().."/lua/get_host_activitymap.lua?ifid="..ifId.."&"..hostinfo2url(host_info)..'",\n')
|
|
|
|
timezone = get_timezone()
|
|
|
|
now = ((os.time()-5*3600)*1000)
|
|
today = os.time()
|
|
today = today - (today % 86400) - 2*3600
|
|
today = today * 1000
|
|
|
|
print("/* "..timezone.." */\n")
|
|
print("\t\tstart: new Date("..now.."),\n") -- now-3h
|
|
print("\t\tminDate: new Date("..today.."),\n")
|
|
print("\t\tmaxDate: new Date("..(os.time()*1000).."),\n")
|
|
print [[
|
|
domain : "hour",
|
|
range : 6,
|
|
nextSelector: "#sent-heatmap-next-selector",
|
|
previousSelector: "#sent-heatmap-prev-selector",
|
|
|
|
onClick: function(date, nb) {
|
|
if(nb === null) { ("#heatmapInfo").html(""); }
|
|
else {
|
|
$("#heatmapInfo").html(date + ": detected traffic for <b>" + nb + "</b> seconds ("+ Math.round((nb*100)/60)+" % of time).");
|
|
}
|
|
}
|
|
|
|
});
|
|
|
|
$(document).ready(function(){
|
|
$('#heatmap-refresh').click(function(){
|
|
sent_calendar.update(]]
|
|
print("\""..ntop.getHttpPrefix().."/lua/get_host_activitymap.lua?ifid="..ifId.."&"..hostinfo2url(host_info)..'\");\n')
|
|
print [[
|
|
});
|
|
});
|
|
|
|
</script>
|
|
|
|
</td></tr>
|
|
]]
|
|
|
|
-- Host activity stats
|
|
if host["localhost"] == true then
|
|
print [[ <tr><th>Protocol Activity</th><td colspan=2>
|
|
<div style='margin-top:0.5em;'>
|
|
<input type="radio" name="showmode" value="updown" onclick="if(this.value != curmode) setShowMode(this.value);" checked> User Traffic<br>
|
|
<input type="radio" name="showmode" value="bg" onclick="if(this.value != curmode) setShowMode(this.value);"> Background Traffic
|
|
</div>
|
|
|
|
<div id="useractivityContainer"></div>
|
|
|
|
<div style='margin-bottom:1em;'>
|
|
Resolution:
|
|
<select onchange="onChangeStep(this);">
|
|
]]
|
|
|
|
if(ntop.getCache("ntopng.prefs.host_activity_rrd_creation") == "1") then
|
|
print [[
|
|
|
|
|
|
<option disabled>Historical</option>
|
|
<option value="86400">1 day</option>
|
|
<option value="3600">1 hour</option>
|
|
<option value="300" selected="selected">5 min</option>
|
|
<option disabled></option>
|
|
]]
|
|
end
|
|
|
|
print [[
|
|
<option disabled>Realtime</option>
|
|
<option value="60">1 min</option>
|
|
<option value="10">10 sec</option>
|
|
<option value="5">5 sec</option>
|
|
<option value="1">1 sec</option>
|
|
</select>
|
|
</div>
|
|
]]
|
|
|
|
if(ntop.getCache("ntopng.prefs.host_activity_rrd_creation") == "0") then
|
|
print('Please enable <A HREF="/lua/admin/prefs.lua?tab=on_disk_rrds">Activities Timeseries</A> preferences to save historical host activities.<p>')
|
|
end
|
|
|
|
print [[
|
|
<script src="]] print(ntop.getHttpPrefix()) print [[/js/cubism.v1.js"></script>
|
|
<script src="]] print(ntop.getHttpPrefix()) print [[/js/cubism.rrd-server.js"></script>
|
|
<style type = "text/css">
|
|
]] ntop.dumpFile(dirs.installdir .. "/httpdocs/css/cubism.css") print[[
|
|
</style>
|
|
|
|
<script type="text/javascript">
|
|
var activitiesurl = "]] print(ntop.getHttpPrefix().."/lua/get_host_activity.lua?ifid="..ifId.."&host="..host_ip) print[[";
|
|
var HorizonGraphWidth = 576;
|
|
var curmode = "updown";
|
|
var curstep = 0;
|
|
var context = null;
|
|
var horizon = null;
|
|
var rrdserver = null;
|
|
|
|
function onChangeStep(control) {
|
|
var newvalue = control.value;
|
|
|
|
if (curstep != newvalue) {
|
|
$(control).blur();
|
|
setShowMode(curmode, newvalue);
|
|
}
|
|
}
|
|
|
|
function resetContext(newstep) {
|
|
if (newstep != curstep) {
|
|
// hard reset
|
|
curstep = newstep;
|
|
$('#useractivity').remove();
|
|
|
|
if (context) {
|
|
context.stop();
|
|
delete rrdserver;
|
|
delete horizon;
|
|
delete context;
|
|
}
|
|
|
|
var div = $('<div id="useractivity"></div>')
|
|
.css("margin", "2em 0 1em 0")
|
|
.css("position", "relative")
|
|
.css("width", HorizonGraphWidth);
|
|
$('#useractivityContainer').append(div);
|
|
|
|
context = cubism.context().size(HorizonGraphWidth).step(curstep*1000);
|
|
horizon = context.horizon();
|
|
rrdserver = cubism.rrdserver(context, HorizonGraphWidth);
|
|
|
|
// to set labels place on mousemove
|
|
context.on("focus", function(i) {
|
|
d3.selectAll(".value").style("right", i == null ? null : context.size() - i + "px");
|
|
});
|
|
} else {
|
|
// soft reset
|
|
d3.selectAll(".horizon").remove();
|
|
$('#useractivity').empty();
|
|
}
|
|
}
|
|
|
|
function setShowMode(mode, newstep) {
|
|
curmode = mode;
|
|
newstep = newstep ? newstep : curstep;
|
|
if (context)
|
|
context.stop();
|
|
|
|
$.ajax({
|
|
type: 'GET',
|
|
url: activitiesurl + '&step=' + newstep,
|
|
success: function(content) {
|
|
resetContext(newstep);
|
|
|
|
var metrics = [];
|
|
var parsed = JSON.parse(content);
|
|
Object.keys(parsed).sort().map(function(activity_name) {
|
|
metrics.push(rrdserver.metric(activitiesurl+"&activity="+parsed[activity_name], activity_name, mode === "bg"));
|
|
});
|
|
if (metrics.length > 0) {
|
|
// data
|
|
d3.select("#useractivity")
|
|
.selectAll(".horizon")
|
|
.data(metrics)
|
|
.enter().append("div", ".bottom")
|
|
.attr("class", "horizon")
|
|
.call(horizon.format(function(x) { return bytesToSize(x); }));
|
|
|
|
// bottom axis
|
|
d3.select("#useractivity")
|
|
.append("div")
|
|
.attr("class", "axis")
|
|
.call(context.axis().orient("bottom"));
|
|
|
|
// vertical line on mousemove
|
|
d3.select("#useractivity")
|
|
.append("div")
|
|
.attr("class", "rule")
|
|
.call(context.rule());
|
|
|
|
context.start();
|
|
} else {
|
|
$('#useractivity').text("No data so far");
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
setShowMode("updown", 300);
|
|
</script>
|
|
<p>
|
|
<b>NOTE:</b><br>The above map filters host application traffic by splitting it in real user traffic (e.g. web page access)
|
|
<br>and background traffic (e.g. your email client periodically checks for email presence). Host traffic sent (upload)<br>
|
|
is marked as negative value in <font color=blue>blue</font>, traffic received (download) is marked as positive in <font color=green>green</font>.
|
|
</td></tr> ]]
|
|
|
|
-- showHostActivityStats(hostbase, "", "1h")
|
|
end
|
|
|
|
print("</table>\n")
|
|
elseif(page == "dns") then
|
|
if(host["dns"] ~= nil) then
|
|
print("<table class=\"table table-bordered table-striped\">\n")
|
|
print("<tr><th>DNS Breakdown</th><th>Queries</th><th>Positive Replies</th><th>Error Replies</th><th colspan=2>Reply Breakdown</th></tr>")
|
|
print("<tr><th>Sent</th><td class=\"text-right\"><span id=dns_sent_num_queries>".. formatValue(host["dns"]["sent"]["num_queries"]) .."</span> <span id=trend_sent_num_queries></span></td>")
|
|
print("<td class=\"text-right\"><span id=dns_sent_num_replies_ok>".. formatValue(host["dns"]["sent"]["num_replies_ok"]) .."</span> <span id=trend_sent_num_replies_ok></span></td>")
|
|
print("<td class=\"text-right\"><span id=dns_sent_num_replies_error>".. formatValue(host["dns"]["sent"]["num_replies_error"]) .."</span> <span id=trend_sent_num_replies_error></span></td><td colspan=2>")
|
|
breakdownBar(host["dns"]["sent"]["num_replies_ok"], "OK", host["dns"]["sent"]["num_replies_error"], "Error", 0, 100)
|
|
print("</td></tr>")
|
|
|
|
if(host["dns"]["sent"]["num_queries"] > 0) then
|
|
print [[
|
|
<tr><th>DNS Query Sent Distribution</th><td colspan=5>
|
|
<div class="pie-chart" id="dnsSent"></div>
|
|
<script type='text/javascript'>
|
|
|
|
do_pie("#dnsSent", ']]
|
|
print (ntop.getHttpPrefix())
|
|
print [[/lua/host_dns_breakdown.lua', { ]] print(hostinfo2json(host_info)) print [[, direction: "sent" }, "", refresh);
|
|
</script>
|
|
</td></tr>
|
|
]]
|
|
end
|
|
|
|
print("<tr><th>Rcvd</th><td class=\"text-right\"><span id=dns_rcvd_num_queries>".. formatValue(host["dns"]["rcvd"]["num_queries"]) .."</span> <span id=trend_rcvd_num_queries></span></td>")
|
|
print("<td class=\"text-right\"><span id=dns_rcvd_num_replies_ok>".. formatValue(host["dns"]["rcvd"]["num_replies_ok"]) .."</span> <span id=trend_rcvd_num_replies_ok></span></td>")
|
|
print("<td class=\"text-right\"><span id=dns_rcvd_num_replies_error>".. formatValue(host["dns"]["rcvd"]["num_replies_error"]) .."</span> <span id=trend_rcvd_num_replies_error></span></td><td colspan=2>")
|
|
breakdownBar(host["dns"]["rcvd"]["num_replies_ok"], "OK", host["dns"]["rcvd"]["num_replies_error"], "Error", 50, 100)
|
|
print("</td></tr>")
|
|
|
|
if(host["dns"]["rcvd"]["num_queries"] > 0) then
|
|
print [[
|
|
<tr><th>DNS Rcvd Query Distribution</th><td colspan=5>
|
|
<div class="pie-chart" id="dnsRcvd"></div>
|
|
<script type='text/javascript'>
|
|
|
|
do_pie("#dnsRcvd", ']]
|
|
print (ntop.getHttpPrefix())
|
|
print [[/lua/host_dns_breakdown.lua', { ]] print(hostinfo2json(host_info)) print [[, direction: "recv" }, "", refresh);
|
|
</script>
|
|
</td></tr>
|
|
]]
|
|
end
|
|
|
|
print('<tr><th rowspan=2>Request vs Reply</th><th colspan=2>Ratio<th><th>Breakdown</th></tr>')
|
|
local dns_ratio = tonumber(host["dns"]["sent"]["num_queries"]) / tonumber(host["dns"]["rcvd"]["num_replies_ok"]+host["dns"]["rcvd"]["num_replies_error"])
|
|
local dns_ratio_str = string.format("%.2f", dns_ratio)
|
|
|
|
if(dns_ratio < 0.9) then
|
|
dns_ratio_str = "<font color=red>".. dns_ratio_str .."</font>"
|
|
end
|
|
|
|
print('<tr><td align=right>'.. dns_ratio_str ..'</td><td colspan=3>')
|
|
breakdownBar(host["dns"]["sent"]["num_queries"], "Queries", host["dns"]["rcvd"]["num_replies_ok"]+host["dns"]["rcvd"]["num_replies_error"], "Replies", 30, 70)
|
|
|
|
print [[
|
|
</td></tr>
|
|
</table>
|
|
<small><b>NOTE:</b><br>Ideally the request vs reply DNS ratio should be 1 (one reply per request). When much lower than that then there are issues worth to be investigated as it means that the number of replies received is much lower than expected and this can indicate that we are using unresponsive DNS resolvers or that they are misconfigured (e.g. they have been move to another IP).
|
|
</small>
|
|
]]
|
|
end
|
|
elseif(page == "http") then
|
|
if(http ~= nil) then
|
|
print("<table class=\"table table-bordered table-striped\">\n")
|
|
|
|
if(host["sites"] ~= nil) then
|
|
local top_sites = json.decode(host["sites"], 1, nil)
|
|
local top_sites_old = json.decode(host["sites.old"], 1, nil)
|
|
old_top_len = table.len(top_sites_old) if(old_top_len > 10) then old_top_len = 10 end
|
|
top_len = table.len(top_sites) if(top_len > 10) then top_len = 10 end
|
|
if(old_top_len > top_len) then num = old_top_len else num = top_len end
|
|
|
|
print("<tr><th rowspan="..(1+num)..">Top Visited Sites</th><th>Current Sites</th><th>Contacts</th><th>Last 5 Minute Sites</th><th>Contacts</th></tr>\n")
|
|
sites = {}
|
|
for k,v in pairsByValues(top_sites, rev) do
|
|
table.insert(sites, { k, v })
|
|
end
|
|
|
|
sites_old = {}
|
|
for k,v in pairsByValues(top_sites_old, rev) do
|
|
table.insert(sites_old, { k, v })
|
|
end
|
|
|
|
for i=1,num do
|
|
if(sites[i] == nil) then sites[i] = { "", 0 } end
|
|
if(sites_old[i] == nil) then sites_old[i] = { "", 0 } end
|
|
print("<tr><th>")
|
|
if(sites[i][1] ~= "") then
|
|
print(formatWebSite(sites[i][1]).."</th><td align=right>"..sites[i][2].."</td>\n")
|
|
else
|
|
print(" </th><td> </td>\n")
|
|
end
|
|
|
|
if(sites_old[i][1] ~= "") then
|
|
print("<th>"..formatWebSite(sites_old[i][1]).."</th><td align=right>"..sites_old[i][2].."</td></tr>\n")
|
|
else
|
|
print(" </th><td> </td></tr>\n")
|
|
end
|
|
end
|
|
end
|
|
|
|
print("<tr><th rowspan=6 width=20%><A HREF='http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods'>HTTP Queries</A></th><th width=20%>Method</th><th width=20%>Requests</th><th colspan=2>Distribution</th></tr>")
|
|
print("<tr><th>GET</th><td style=\"text-align: right;\"><span id=http_query_num_get>".. formatValue(http["sender"]["query"]["num_get"]) .."</span> <span id=trend_http_query_num_get></span></td><td colspan=2 rowspan=5>")
|
|
|
|
print [[
|
|
<div class="pie-chart" id="httpQueries"></div>
|
|
<script type='text/javascript'>
|
|
|
|
do_pie("#httpQueries", ']]
|
|
print (ntop.getHttpPrefix())
|
|
print [[/lua/host_http_breakdown.lua', { ]] print(hostinfo2json(host_info)) print [[, http_mode: "queries" }, "", refresh);
|
|
</script>
|
|
]]
|
|
|
|
print("</td></tr>")
|
|
print("<tr><th>POST</th><td style=\"text-align: right;\"><span id=http_query_num_post>".. formatValue(http["sender"]["query"]["num_post"]) .."</span> <span id=trend_http_query_num_post></span></td></tr>")
|
|
print("<tr><th>HEAD</th><td style=\"text-align: right;\"><span id=http_query_num_head>".. formatValue(http["sender"]["query"]["num_head"]) .."</span> <span id=trend_http_query_num_head></span></td></tr>")
|
|
print("<tr><th>PUT</th><td style=\"text-align: right;\"><span id=http_query_num_put>".. formatValue(http["sender"]["query"]["num_put"]) .."</span> <span id=trend_http_query_num_put></span></td></tr>")
|
|
print("<tr><th>Other Method</th><td style=\"text-align: right;\"><span id=http_query_num_other>".. formatValue(http["sender"]["query"]["num_other"]) .."</span> <span id=trend_http_query_num_other></span></td></tr>")
|
|
print("<tr><th colspan=4> </th></tr>")
|
|
print("<tr><th rowspan=6 width=20%><A HREF='http://en.wikipedia.org/wiki/List_of_HTTP_status_codes'>HTTP Responses</A></th><th width=20%>Response code</th><th width=20%>Responses</th><th colspan=2>Distribution</th></tr>")
|
|
print("<tr><th>1xx (Informational)</th><td style=\"text-align: right;\"><span id=http_response_num_1xx>".. formatValue(http["receiver"]["response"]["num_1xx"]) .."</span> <span id=trend_http_response_num_1xx></span></td><td colspan=2 rowspan=5>")
|
|
|
|
print [[
|
|
<div class="pie-chart" id="httpResponses"></div>
|
|
<script type='text/javascript'>
|
|
|
|
do_pie("#httpResponses", ']]
|
|
print (ntop.getHttpPrefix())
|
|
print [[/lua/host_http_breakdown.lua', { ]] print(hostinfo2json(host_info)) print [[, http_mode: "responses" }, "", refresh);
|
|
</script>
|
|
]]
|
|
print("</td></tr>")
|
|
print("<tr><th>2xx (Success)</th><td style=\"text-align: right;\"><span id=http_response_num_2xx>".. formatValue(http["receiver"]["response"]["num_2xx"]) .."</span> <span id=trend_http_response_num_2xx></span></td></tr>")
|
|
print("<tr><th>3xx (Redirection)</th><td style=\"text-align: right;\"><span id=http_response_num_3xx>".. formatValue(http["receiver"]["response"]["num_3xx"]) .."</span> <span id=trend_http_response_num_3xx></span></td></tr>")
|
|
print("<tr><th>4xx (Client Error)</th><td style=\"text-align: right;\"><span id=http_response_num_4xx>".. formatValue(http["receiver"]["response"]["num_4xx"]) .."</span> <span id=trend_http_response_num_4xx></span></td></tr>")
|
|
print("<tr><th>5xx (Server Error)</th><td style=\"text-align: right;\"><span id=http_response_num_5xx>".. formatValue(http["receiver"]["response"]["num_5xx"]) .."</span> <span id=trend_http_response_num_5xx></span></td></tr>")
|
|
|
|
vh = http["virtual_hosts"]
|
|
if(vh ~= nil) then
|
|
local now = os.time()
|
|
local ago1h = now - 3600
|
|
num = table.len(vh)
|
|
if(num > 0) then
|
|
local ifId = getInterfaceId(ifname)
|
|
print("<tr><th rowspan="..(num+1).." width=20%>Virtual Hosts</th><th>Name</th><th>Traffic Sent</th><th>Traffic Received</th><th>Requests Served</th></tr>\n")
|
|
for k,v in pairsByKeys(vh, asc) do
|
|
local j = string.gsub(k, "%.", "___")
|
|
print("<tr><td><A HREF='http://"..k.."'>"..k.."</A> <i class='fa fa-external-link'></i>")
|
|
historicalProtoHostHref(ifId, host, nil, nil, k)
|
|
print("</td>")
|
|
print("<td align=right><span id="..j.."_bytes_vhost_sent>"..bytesToSize(vh[k]["bytes.sent"]).."</span></td>")
|
|
print("<td align=right><span id="..j.."_bytes_vhost_rcvd>"..bytesToSize(vh[k]["bytes.rcvd"]).."</span></td>")
|
|
print("<td align=right><span id="..j.."_num_vhost_req_serv>"..formatValue(vh[k]["http.requests"]).."</span></td></tr>\n")
|
|
end
|
|
end
|
|
end
|
|
|
|
print("</table>\n")
|
|
end
|
|
elseif(page == "flows") then
|
|
|
|
print [[
|
|
<div id="table-flows"></div>
|
|
<script>
|
|
var url_update = "]]
|
|
print (ntop.getHttpPrefix())
|
|
print [[/lua/get_flows_data.lua?ifid=]]
|
|
print(ifId.."&")
|
|
if (application ~= nil) then
|
|
print("application="..application.."&")
|
|
end
|
|
print (hostinfo2url(host_info)..'";')
|
|
|
|
ntop.dumpFile(dirs.installdir .. "/httpdocs/inc/flows_stats_id.inc")
|
|
if(ifstats.sprobe) then show_sprobe = true else show_sprobe = false end
|
|
if(ifstats.vlan) then show_vlan = true else show_vlan = false end
|
|
-- Set the host table option
|
|
if(show_sprobe) then print ('flow_rows_option["sprobe"] = true;\n') end
|
|
if(show_vlan) then print ('flow_rows_option["vlan"] = true;\n') end
|
|
|
|
|
|
local active_flows_msg = "Active Flows"
|
|
if not interface.isPacketInterface() then
|
|
active_flows_msg = "Recently "..active_flows_msg
|
|
elseif interface.isPcapDumpInterface() then
|
|
active_flows_msg = "Flows"
|
|
end
|
|
|
|
local application_filter = ''
|
|
if(application ~= nil) then
|
|
application_filter = '<span class="glyphicon glyphicon-filter"></span>'
|
|
end
|
|
local dt_buttons = "['<div class=\"btn-group\"><button class=\"btn btn-link dropdown-toggle\" data-toggle=\"dropdown\">Applications " .. application_filter .. "<span class=\"caret\"></span></button> <ul class=\"dropdown-menu\" role=\"menu\" >"
|
|
dt_buttons = dt_buttons..'<li><a href="'..ntop.getHttpPrefix()..url..'&page=flows">All Proto</a></li>'
|
|
|
|
local ndpi_stats = interface.getnDPIStats(host_info["host"], host_vlan)
|
|
|
|
for key, value in pairsByKeys(ndpi_stats["ndpi"], asc) do
|
|
local class_active = ''
|
|
if(key == application) then
|
|
class_active = ' class="active"'
|
|
end
|
|
dt_buttons = dt_buttons..'<li '..class_active..'><a href="'..ntop.getHttpPrefix()..url..'&page=flows&application='..key..'">'..key..'</a></li>'
|
|
end
|
|
|
|
dt_buttons = dt_buttons .. "</ul></div>']"
|
|
|
|
if(show_sprobe) then
|
|
print [[
|
|
//console.log(url_update);
|
|
flow_rows_option["sprobe"] = true;
|
|
flow_rows_option["type"] = 'host';
|
|
$("#table-flows").datatable({
|
|
url: url_update ,
|
|
buttons: ]] print(dt_buttons) print[[,
|
|
rowCallback: function ( row ) { return flow_table_setID(row); },
|
|
showPagination: true,
|
|
]]
|
|
-- Set the preference table
|
|
preference = tablePreferences("rows_number",_GET["perPage"])
|
|
if(preference ~= "") then print ('perPage: '..preference.. ",\n") end
|
|
|
|
print ('sort: [ ["' .. getDefaultTableSort("flows") ..'","' .. getDefaultTableSortOrder("flows").. '"] ],\n')
|
|
|
|
|
|
print('title: "'..active_flows_msg..'",')
|
|
|
|
ntop.dumpFile(dirs.installdir .. "/httpdocs/inc/sflows_stats_top.inc")
|
|
prefs = ntop.getPrefs()
|
|
ntop.dumpFile(dirs.installdir .. "/httpdocs/inc/sflows_stats_bottom.inc")
|
|
else
|
|
|
|
print [[
|
|
flow_rows_option["type"] = 'host';
|
|
$("#table-flows").datatable({
|
|
url: url_update,
|
|
buttons: ]] print(dt_buttons) print[[,
|
|
rowCallback: function ( row ) { return flow_table_setID(row); },
|
|
showPagination: true,
|
|
]]
|
|
|
|
print('title: "'..active_flows_msg..'",')
|
|
|
|
-- Set the preference table
|
|
preference = tablePreferences("rows_number",_GET["perPage"])
|
|
if(preference ~= "") then print ('perPage: '..preference.. ",\n") end
|
|
|
|
|
|
print ('sort: [ ["' .. getDefaultTableSort("flows") ..'","' .. getDefaultTableSortOrder("flows").. '"] ],\n')
|
|
|
|
print [[
|
|
columns: [
|
|
{
|
|
title: "Key",
|
|
field: "key",
|
|
hidden: true
|
|
},
|
|
{
|
|
title: "",
|
|
field: "column_key",
|
|
css: {
|
|
textAlign: 'center'
|
|
}
|
|
},
|
|
{
|
|
title: "Application",
|
|
field: "column_ndpi",
|
|
sortable: true,
|
|
css: {
|
|
textAlign: 'center'
|
|
}
|
|
},
|
|
{
|
|
title: "L4 Proto",
|
|
field: "column_proto_l4",
|
|
sortable: true,
|
|
css: {
|
|
textAlign: 'center'
|
|
}
|
|
},]]
|
|
|
|
if(show_vlan) then
|
|
|
|
if(ifstats.sprobe) then
|
|
print('{ title: "Source Id",\n')
|
|
else
|
|
if(ifstats.vlan) then
|
|
print('{ title: "VLAN",\n')
|
|
end
|
|
end
|
|
|
|
|
|
print [[
|
|
field: "column_vlan",
|
|
sortable: true,
|
|
css: {
|
|
textAlign: 'center'
|
|
}
|
|
|
|
},
|
|
]]
|
|
end
|
|
print [[
|
|
{
|
|
title: "Client",
|
|
field: "column_client",
|
|
sortable: true,
|
|
},
|
|
{
|
|
title: "Server",
|
|
field: "column_server",
|
|
sortable: true,
|
|
},
|
|
{
|
|
title: "Duration",
|
|
field: "column_duration",
|
|
sortable: true,
|
|
css: {
|
|
textAlign: 'right'
|
|
}
|
|
},
|
|
{
|
|
title: "Actual Thpt",
|
|
field: "column_thpt",
|
|
sortable: true,
|
|
css: {
|
|
textAlign: 'right'
|
|
}
|
|
},
|
|
{
|
|
title: "Total Bytes",
|
|
field: "column_bytes",
|
|
sortable: true,
|
|
css: {
|
|
textAlign: 'right'
|
|
}
|
|
|
|
}
|
|
,{
|
|
title: "Info",
|
|
field: "column_info",
|
|
sortable: true,
|
|
css: {
|
|
textAlign: 'left'
|
|
}
|
|
}
|
|
]
|
|
});
|
|
</script>
|
|
|
|
]]
|
|
|
|
end
|
|
elseif(page == "categories") then
|
|
print [[
|
|
<table class="table table-bordered table-striped">
|
|
<tr><th class="text-left">Traffic Categories</th><td><div class="pie-chart" id="topTrafficCategories"></div></td></tr>
|
|
</div>
|
|
|
|
<script type='text/javascript'>
|
|
window.onload=function() {
|
|
|
|
do_pie("#topTrafficCategories", ']]
|
|
print (ntop.getHttpPrefix())
|
|
print [[/lua/host_category_stats.lua', { ifid: "]] print(ifId.."") print('", '..hostinfo2json(host_info) .."}, \"\", refresh); \n")
|
|
print [[
|
|
}
|
|
|
|
</script>
|
|
|
|
<tr><td colspan=2>
|
|
<div id="table-categories"></div>
|
|
<script type='text/javascript'>
|
|
$("#table-categories").datatable({
|
|
title: "",
|
|
url: "]] print(ntop.getHttpPrefix().."/lua/get_host_categories.lua?"..hostinfo2url(host_info).."&ifid="..ifId) print [[",
|
|
]]
|
|
|
|
-- Set the preference table
|
|
preference = tablePreferences("rows_number",_GET["perPage"])
|
|
if (preference ~= "") then print ('perPage: '..preference.. ",\n") end
|
|
|
|
-- Automatic default sorted. NB: the column must exist.
|
|
print ('sort: [ ["' .. getDefaultTableSort("host_categories") ..'","' .. getDefaultTableSortOrder("host_categories").. '"] ],')
|
|
|
|
|
|
print [[
|
|
showPagination: true,
|
|
columns: [
|
|
{
|
|
title: "Category Id",
|
|
field: "column_id",
|
|
hidden: true,
|
|
sortable: true,
|
|
},
|
|
{
|
|
title: "Traffic Category",
|
|
field: "column_label",
|
|
sortable: true,
|
|
css: {
|
|
textAlign: 'left'
|
|
}
|
|
},
|
|
{
|
|
title: "Traffic Volume",
|
|
field: "column_bytes",
|
|
sortable: true,
|
|
css: {
|
|
textAlign: 'right'
|
|
}
|
|
},
|
|
{
|
|
title: "Traffic %",
|
|
field: "column_pct",
|
|
sortable: false,
|
|
css: {
|
|
textAlign: 'right'
|
|
}
|
|
}
|
|
]
|
|
});
|
|
</script>
|
|
<div>
|
|
<small> <b>NOTE</b>:<ul><li>Percentages are related only to classified traffic.
|
|
]]
|
|
if ntop.getCache("ntopng.prefs.host_categories_rrd_creation") ~= "1" then
|
|
print("<li>Historical per-category traffic data can be enabled via ntopng <a href=\""..ntop.getHttpPrefix().."/lua/admin/prefs.lua\"<i class=\"fa fa-flask\"></i> Preferences</a>.")
|
|
print(" When enabled, RRDs with 5-minute samples will be created for each category detected and historical data will become accessible by clicking on each category.</li>")
|
|
else
|
|
print("<li>Category labels can be clicked to browse historical data.</li>")
|
|
end
|
|
print [[
|
|
</ul>
|
|
</small>
|
|
</div>
|
|
|
|
</td></tr>
|
|
</table>
|
|
]]
|
|
elseif(page == "snmp" and ntop.isEnterprise()) then
|
|
local sys_object_id = true
|
|
local community = get_snmp_community(host_ip)
|
|
|
|
local snmp_devices = get_snmp_devices()
|
|
if snmp_devices[host_ip] == nil then -- host has not been configured
|
|
|
|
local msg = "Host "..host_ip.. " has not been configured as an SNMP device."
|
|
msg = msg.." Visit page <a href='"..ntop.getHttpPrefix().."/lua/pro/enterprise/snmpdevices_stats.lua'>SNMP</a> to add this host to the list of configured SNMP devices."
|
|
|
|
local trying = "<span id='trying_default_community'> Trying to retrieve host SNMP MIB using the default community '"..community.."'"
|
|
trying = trying.. " <img border=0 src=".. ntop.getHttpPrefix() .. "/img/throbber.gif style='vertical-align:text-top;' id=throbber></span>"
|
|
|
|
print("<div class='alert alert-info'><i class='fa fa-info-circle fa-lg' aria-hidden='true'></i> "..msg.."</div>")
|
|
print(trying)
|
|
|
|
sys_object_id = get_snmp_value(host_ip, community, "1.3.6.1.2.1.1.2.0", false)
|
|
end
|
|
|
|
if(sys_object_id ~= nil) then
|
|
print("<script type='text/javascript'>$('#trying_default_community').html(\"Showing SNMP MIB information retrieved using the default community '"..community.."':<br><br>\")</script>")
|
|
print_snmp_report(host_ip, true)
|
|
else
|
|
print("<script type='text/javascript'>$('#trying_default_community').html(\"<div class='alert alert-warning'>Unable to retrieve host SNMP MIB using the default community '"..community.."'.</div>\")</script>")
|
|
end
|
|
|
|
elseif(page == "talkers") then
|
|
print("<center>")
|
|
print('<div class="row">')
|
|
dofile(dirs.installdir .. "/scripts/lua/inc/sankey.lua")
|
|
print("</div></center></br>")
|
|
elseif(page == "geomap") then
|
|
print("<center>")
|
|
|
|
|
|
print [[
|
|
<style type="text/css">
|
|
#map-canvas { width: 800px; height: 480px; }
|
|
</style>
|
|
|
|
</center>
|
|
]]
|
|
|
|
addGoogleMapsScript()
|
|
|
|
print[[
|
|
|
|
<script src="]] print(ntop.getHttpPrefix()) print [[/js/markerclusterer.js"></script>
|
|
<div class="container-fluid">
|
|
<div class="row-fluid">
|
|
<div class="span8">
|
|
<div id="map-canvas"></div>
|
|
]]
|
|
|
|
ntop.dumpFile(dirs.installdir .. "/httpdocs/inc/geolocation_disclaimer.inc")
|
|
|
|
print [[
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<script type="text/javascript">
|
|
/* IP Address to zoom */
|
|
var zoomIP = "]] print('ifid='..ifId.."&"..hostinfo2url(host_info)) print [[ ";
|
|
var url_prefix = "]] print(ntop.getHttpPrefix()) print [[";
|
|
</script>
|
|
<script type="text/javascript" src="]] print(ntop.getHttpPrefix()) print [[/js/googleMapJson.js" ></script>
|
|
]]
|
|
|
|
elseif(page == "jaccard") then
|
|
-- NOTE: code temporarily disabled
|
|
|
|
print [[
|
|
<div id="prg" class="container">
|
|
<div class="progress progress-striped active">
|
|
<div class="bar" style="width: 100%;"></div>
|
|
</div>
|
|
</div>
|
|
]]
|
|
|
|
jaccard = interface.similarHostActivity(host_info["host"],host_info["vlan"])
|
|
|
|
if(jaccard ~= nil) then
|
|
print [[
|
|
<script type="text/javascript">
|
|
var $bar = $('#prg');
|
|
|
|
$bar.hide();
|
|
$bar.remove();
|
|
</script>
|
|
]]
|
|
|
|
vals = {}
|
|
for k,v in pairs(jaccard) do
|
|
vals[v] = k
|
|
end
|
|
|
|
max_hosts = 10
|
|
|
|
n = 0
|
|
|
|
if(host["name"] == nil) then host["name"] = ntop.getResolvedAddress(host["ip"]) end
|
|
|
|
for v,k in pairsByKeys(vals, rev) do
|
|
|
|
if(v > 0) then
|
|
if(n == 0) then
|
|
print("<table class=\"table table-bordered table-striped\">\n")
|
|
print("<tr><th>Local Hosts Similar to ".. hostinfo2hostkey(host) .."</th><th>Jaccard Coefficient</th><th>Activity Map</th>\n")
|
|
end
|
|
|
|
correlated_host = interface.getHostInfo(k)
|
|
if(correlated_host ~= nil) then
|
|
|
|
if(correlated_host["name"] == nil) then correlated_host["name"] = ntop.getResolvedAddress(correlated_host["ip"]) end
|
|
|
|
-- print the host row together with the Jaccard coefficient
|
|
print("<tr>")
|
|
-- print("<th align=left><A HREF='"..ntop.getHttpPrefix().."/lua/host_details.lua?host="..k.."'>"..correlated_host["name"].."</a></th>")
|
|
print("<th align=left><A HREF='"..ntop.getHttpPrefix().."/lua/host_details.lua?ifid="..ifId.."&"..hostinfo2url(correlated_host).."'>"..hostinfo2hostkey(correlated_host).."</a></th>")
|
|
print("<th>"..round(v,2).."</th>");
|
|
|
|
-- print the activity map row
|
|
print("<td>");
|
|
print("<span id=\"sentHeatmap"..n.."\"></span>");
|
|
print [[
|
|
<script type="text/javascript">
|
|
var sent_calendar = new CalHeatMap();
|
|
sent_calendar.init({
|
|
]]
|
|
print("itemSelector: \"#sentHeatmap"..n.."\",data: \"");
|
|
print(ntop.getHttpPrefix().."/lua/get_host_activitymap.lua?ifid="..ifId.."&"..hostinfo2url(correlated_host)..'",\n')
|
|
-- print(ntop.getHttpPrefix().."/lua/get_host_activitymap.lua?host="..k..'",\n')
|
|
|
|
timezone = get_timezone()
|
|
|
|
now = ((os.time()-5*3600)*1000)
|
|
today = os.time()
|
|
today = today - (today % 86400) - 2*3600
|
|
today = today * 1000
|
|
|
|
print("/* "..timezone.." */\n")
|
|
print("\t\tstart: new Date("..now.."),\n") -- now-3h
|
|
print("\t\tminDate: new Date("..today.."),\n")
|
|
print("\t\tmaxDate: new Date("..(os.time()*1000).."),\n")
|
|
print [[
|
|
domain : "hour",
|
|
range : 6,
|
|
nextSelector: "#sent-heatmap-next-selector",
|
|
previousSelector: "#sent-heatmap-prev-selector",
|
|
});
|
|
|
|
$(document).ready(function(){
|
|
$('#heatmap-refresh').click(function(){
|
|
sent_calendar.update(]]
|
|
print("\""..ntop.getHttpPrefix().."/lua/get_host_activitymap.lua?ifid="..ifId.."&"..hostinfo2url(correlated_host)..'\");\n')
|
|
print [[
|
|
});
|
|
});
|
|
</script>
|
|
</td>
|
|
]]
|
|
|
|
print("</td></tr>")
|
|
n = n +1
|
|
|
|
if(n >= max_hosts) then
|
|
break
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
if(n > 0) then
|
|
print("</table>\n")
|
|
else
|
|
print("There is no host correlated to ".. hostinfo2hostkey(host).."<p>\n")
|
|
end
|
|
|
|
print [[
|
|
<b>Note</b>:
|
|
<ul>
|
|
<li>Jaccard Similarity considers only activity map as shown in the <A HREF="]]
|
|
print (ntop.getHttpPrefix())
|
|
print [[/lua/host_details.lua?ifid=]] print(ifId.."&"..hostinfo2url(host_info)) print [[">host overview</A>.
|
|
<li>Two hosts are similar according to the Jaccard coefficient when their activity tends to overlap. In particular when their activity map is very similar. The <A HREF="http://en.wikipedia.org/wiki/Jaccard_index">Jaccard similarity coefficient</A> is a number between +1 and 0.
|
|
</ul>
|
|
]]
|
|
end
|
|
|
|
elseif(page == "contacts") then
|
|
|
|
if(num > 0) then
|
|
mode = "embed"
|
|
if(host["name"] == nil) then host["name"] = ntop.getResolvedAddress(host["ip"]) end
|
|
name = host["name"]
|
|
dofile(dirs.installdir .. "/scripts/lua/hosts_interaction.lua")
|
|
|
|
print("<table class=\"table table-bordered table-striped\">\n")
|
|
print("<tr><th width=50%>Client Contacts (Initiator)</th><th width=50%>Server Contacts (Receiver)</th></tr>\n")
|
|
|
|
print("<tr>")
|
|
|
|
if(cnum == 0) then
|
|
print("<td>No client contacts so far</td>")
|
|
else
|
|
print("<td><table class=\"table table-bordered table-striped\">\n")
|
|
print("<tr><th width=75%>Server Address</th><th>Contacts</th></tr>\n")
|
|
|
|
-- TOFIX VLAN (We need to remove the host vlan and add the client vlan)
|
|
-- Client
|
|
sortTable = {}
|
|
for k,v in pairs(host["contacts"]["client"]) do
|
|
|
|
sortTable[v]=k
|
|
end
|
|
|
|
num = 0
|
|
max_num = 64 -- Do not create huge maps
|
|
for _v,k in pairsByKeys(sortTable, rev) do
|
|
|
|
if(num >= max_num) then break end
|
|
num = num + 1
|
|
name = interface.getHostInfo(k)
|
|
|
|
-- TOFIX VLAN (We need to remove the host vlan and add the client vlan)
|
|
v = host["contacts"]["client"][k]
|
|
info = interface.getHostInfo(k)
|
|
|
|
if(info ~= nil) then
|
|
if(info["name"] ~= nil) then n = info["name"] else n = ntop.getResolvedAddress(info["ip"]) end
|
|
url = "<A HREF=\""..ntop.getHttpPrefix().."/lua/host_details.lua?ifid="..ifId.."&"..hostinfo2url(info).."\">"..n.."</A>"
|
|
else
|
|
url = k
|
|
end
|
|
|
|
if(info ~= nil) then
|
|
url = url .. getFlag(info["country"]).." "
|
|
end
|
|
-- print(v.."<br>")
|
|
print("<tr><th>"..url.."</th><td class=\"text-right\">" .. formatValue(v) .. "</td></tr>\n")
|
|
end
|
|
print("</table></td>\n")
|
|
end
|
|
|
|
if(snum == 0) then
|
|
print("<td>No server contacts so far</td>")
|
|
else
|
|
print("<td><table class=\"table table-bordered table-striped\">\n")
|
|
print("<tr><th width=75%>Client Address</th><th>Contacts</th></tr>\n")
|
|
|
|
-- Server
|
|
sortTable = {}
|
|
for k,v in pairs(host["contacts"]["server"]) do sortTable[v]=k end
|
|
|
|
for _v,k in pairsByKeys(sortTable, rev) do
|
|
v = host["contacts"]["server"][k]
|
|
info = interface.getHostInfo(k)
|
|
if(info ~= nil) then
|
|
if(info["name"] ~= nil) then n = info["name"] else n = ntop.getResolvedAddress(info["ip"]) end
|
|
url = "<A HREF=\""..ntop.getHttpPrefix().."/lua/host_details.lua?ifid="..ifId.."&"..hostinfo2url(info).."\">"..n.."</A>"
|
|
else
|
|
url = k
|
|
end
|
|
|
|
if(info ~= nil) then
|
|
url = url ..getFlag(info["country"]).." "
|
|
end
|
|
print("<tr><th>"..url.."</th><td class=\"text-right\">" .. formatValue(v) .. "</td></tr>\n")
|
|
end
|
|
print("</table></td>\n")
|
|
end
|
|
|
|
print("</tr>\n")
|
|
|
|
print("</table>\n")
|
|
else
|
|
print("No contacts for this host")
|
|
end
|
|
|
|
elseif(page == "alerts") then
|
|
|
|
drawAlertSourceSettings(hostkey,
|
|
i18n("show_alerts.host_delete_config_btn"), i18n("show_alerts.host_delete_config_confirm"),
|
|
"host_details.lua", {ifid=ifId, host=host_ip},
|
|
host_name, "host")
|
|
|
|
elseif (page == "config") then
|
|
|
|
if(not isAdministrator()) then
|
|
return
|
|
end
|
|
|
|
if(host["localhost"] == true and is_packetdump_enabled) then
|
|
local dump_status = host["dump_host_traffic"]
|
|
|
|
if(_POST["dump_traffic"] ~= nil) then
|
|
if(_POST["dump_traffic"] == "true") then
|
|
dump_status = true
|
|
else
|
|
dump_status = false
|
|
end
|
|
interface.select(ifname) -- if we submitted a form, nothing is select()ed
|
|
interface.setHostDumpPolicy(dump_status, host_info["host"], host_vlan)
|
|
end
|
|
|
|
if(dump_status) then
|
|
dump_traffic_checked = 'checked="checked"'
|
|
dump_traffic_value = "false" -- Opposite
|
|
else
|
|
dump_traffic_checked = ""
|
|
dump_traffic_value = "true" -- Opposite
|
|
end
|
|
end
|
|
|
|
if(_POST["custom_icon"] ~= nil) then
|
|
setHostIcon(labelKey, _POST["custom_icon"])
|
|
end
|
|
|
|
print[[
|
|
<table class="table table-bordered table-striped">
|
|
<tr>
|
|
<th>Host Alias</th>
|
|
<td>
|
|
<form class="form-inline" style="margin-bottom: 0px;" method="post">
|
|
<input type="text" name="custom_name" class="form-control" placeholder="Custom Name" value="]]
|
|
if(host["label"] ~= nil) then print(host["label"]) end
|
|
print[["></input> ]]
|
|
pickIcon(labelKey, host["mac"])
|
|
print [[
|
|
<input id="csrf" name="csrf" type="hidden" value="]] print(ntop.getRandomCSRFValue()) print[[" />
|
|
<button type="submit" class="btn btn-default">]] print(i18n("save")) print[[</button>
|
|
</form>
|
|
</td>
|
|
</tr>]]
|
|
if not ifstats.isView then
|
|
print[[<tr>
|
|
<th>Host Pool</th>
|
|
<td>
|
|
<form class="form-inline" style="margin-bottom: 0px; display:inline;" method="post">
|
|
<select name="pool" class="form-control" style="width:20em; display:inline;">]]
|
|
for _,pool in ipairs(host_pools_utils.getPoolsList(ifId)) do
|
|
print[[<option value="]] print(pool.id) print[["]]
|
|
if pool.id == host_pool_id then
|
|
print[[ selected]]
|
|
end
|
|
print[[>]] print(pool.name) print[[</option>]]
|
|
end
|
|
print[[
|
|
</select>
|
|
<input id="csrf" name="csrf" type="hidden" value="]] print(ntop.getRandomCSRFValue()) print[[" />
|
|
<button type="submit" class="btn btn-default">]] print(i18n("save")) print[[</button>
|
|
</form>
|
|
</td>
|
|
</tr>]]
|
|
end
|
|
print [[<tr>
|
|
<th>Dump Host Traffic</th>
|
|
<td>
|
|
<form id="alert_prefs" class="form-inline" style="margin-bottom: 0px;" method="post">
|
|
<input type="hidden" name="dump_traffic" value="]] print(dump_traffic_value) print[[">
|
|
<input type="checkbox" value="1" ]] print(dump_traffic_checked) print[[ onclick="this.form.submit();">
|
|
<i class="fa fa-hdd-o fa-lg"></i>
|
|
<a href="]] print(ntop.getHttpPrefix()) print[[/lua/if_stats.lua?ifid=]] print(getInterfaceId(ifname).."") print[[&page=packetdump">Dump Traffic</a>
|
|
</input>
|
|
<input id="csrf" name="csrf" type="hidden" value="]] print(ntop.getRandomCSRFValue()) print[["/>
|
|
</form>
|
|
</td>
|
|
</tr>]]
|
|
|
|
if(ifstats.inline and (host.localhost or host.systemhost)) then
|
|
-- Traffic policy
|
|
drop_host_traffic = _POST["drop_host_traffic"]
|
|
host_key = hostinfo2hostkey(host_info)
|
|
if(drop_host_traffic ~= nil) then
|
|
if(drop_host_traffic == "false") then
|
|
ntop.delHashCache("ntopng.prefs.drop_host_traffic", host_key)
|
|
else
|
|
ntop.setHashCache("ntopng.prefs.drop_host_traffic", host_key, drop_host_traffic)
|
|
end
|
|
|
|
interface.updateHostTrafficPolicy(host_info["host"], host_vlan)
|
|
else
|
|
drop_host_traffic = ntop.getHashCache("ntopng.prefs.drop_host_traffic", host_key)
|
|
if(drop_host_traffic == nil) then drop_host_traffic = "false" end
|
|
end
|
|
|
|
print("<tr><th>Host Traffic Policy</th><td>")
|
|
|
|
if(host["localhost"] == true) then
|
|
drop_traffic = ntop.getHashCache("ntopng.prefs.drop_host_traffic", host_key)
|
|
if(drop_traffic == "true") then
|
|
drop_traffic_checked = 'checked="checked"'
|
|
drop_traffic_value = "false" -- Opposite
|
|
else
|
|
drop_traffic_checked = ""
|
|
drop_traffic_value = "true" -- Opposite
|
|
end
|
|
|
|
print[[<form id="alert_prefs" class="form-inline" style="margin-bottom:0px; margin-right:1em; display:inline;" method="post">]]
|
|
print('<input type="hidden" name="drop_host_traffic" value="'..drop_traffic_value..'"><input type="checkbox" value="1" '..drop_traffic_checked..' onclick="this.form.submit();"> Drop All Host Traffic</input>')
|
|
print('<input id="csrf" name="csrf" type="hidden" value="'..ntop.getRandomCSRFValue()..'" />\n')
|
|
print('</form>')
|
|
end
|
|
|
|
print[[<a class="btn btn-default btn-sm" href="]]
|
|
print(ntop.getHttpPrefix())
|
|
print[[/lua/if_stats.lua?page=filtering&pool=]]
|
|
print(tostring(host["host_pool_id"]))
|
|
print[[#protocols">Modify Host Pool Policy</a>]]
|
|
print('</td></tr>')
|
|
|
|
print('</form>')
|
|
print('</td></tr>')
|
|
end
|
|
|
|
print[[
|
|
</table>]]
|
|
|
|
elseif(page == "historical") then
|
|
if(_GET["rrd_file"] == nil) then
|
|
rrdfile = "bytes.rrd"
|
|
else
|
|
rrdfile=_GET["rrd_file"]
|
|
end
|
|
|
|
host_url = "host="..host_ip
|
|
host_key = host_ip
|
|
if(host_vlan and (host_vlan > 0)) then
|
|
host_url = host_url.."&vlan="..host_vlan
|
|
host_key = host_key.."@"..host_vlan
|
|
end
|
|
drawRRD(ifId, host_key, rrdfile, _GET["zoom"], ntop.getHttpPrefix()..'/lua/host_details.lua?ifid='..ifId..'&'..host_url..'&page=historical', 1, _GET["epoch"], nil, makeTopStatsScriptsArray())
|
|
elseif(page == "traffic_report") then
|
|
dofile(dirs.installdir .. "/pro/scripts/lua/enterprise/traffic_report.lua")
|
|
elseif(page == "sprobe") then
|
|
|
|
|
|
print [[
|
|
<br>
|
|
<!-- Left Tab -->
|
|
<div class="tabbable tabs-left">
|
|
|
|
<ul class="nav nav-tabs">
|
|
<li class="active"><a href="#Users" data-toggle="tab">Users</a></li>
|
|
<li><a href="#Processes" data-toggle="tab">Processes</a></li>
|
|
<li ><a href="#Tree" data-toggle="tab">Tree</a></li>
|
|
</ul>
|
|
|
|
<!-- Tab content-->
|
|
<div class="tab-content">
|
|
]]
|
|
|
|
print [[
|
|
<div class="tab-pane active" id="Users">
|
|
Show :
|
|
<div class="btn-group btn-toggle btn-sm" data-toggle="buttons" id="show_users">
|
|
<label class="btn btn-default btn-sm active">
|
|
<input type="radio" name="show_users" value="All">All</label>
|
|
<label class="btn btn-default btn-sm">
|
|
<input type="radio" name="show_users" value="Client" checked="">Client</label>
|
|
<label class="btn btn-default btn-sm">
|
|
<input type="radio" name="show_users" value="Server" checked="">Server</label>
|
|
</div>
|
|
Aggregated by :
|
|
<div class="btn-group">
|
|
<button id="aggregation_users_displayed" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown">
|
|
Traffic <span class="caret"></span></button>
|
|
<ul class="dropdown-menu" id="aggregation_users">
|
|
<li><a>Traffic</a></li>
|
|
<li><a>Active memory</a></li>
|
|
<!-- <li><a>Latency</a></li> -->
|
|
</ul>
|
|
</div><!-- /btn-group -->
|
|
<br/>
|
|
<br/>
|
|
<table class="table table-bordered table-striped">
|
|
<tr>
|
|
<th class="text-center span3">Top Users</th>
|
|
<td class="span3"><div class="pie-chart" id="topUsers"></div></td>
|
|
|
|
</tr>
|
|
</table>
|
|
</div> <!-- Tab Users-->
|
|
]]
|
|
|
|
print [[
|
|
<div class="tab-pane" id="Processes">
|
|
Show :
|
|
<div class="btn-group btn-toggle btn-sm" data-toggle="buttons" id="show_processes">
|
|
<label class="btn btn-default btn-sm active">
|
|
<input type="radio" name="show_processes" value="All">All</label>
|
|
<label class="btn btn-default btn-sm">
|
|
<input type="radio" name="show_processes" value="Client" checked="">Client</label>
|
|
<label class="btn btn-default btn-sm">
|
|
<input type="radio" name="show_processes" value="Server" checked="">Server</label>
|
|
</div>
|
|
Aggregated by :
|
|
<div class="btn-group">
|
|
<button id="aggregation_processes_displayed" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown">Traffic <span class="caret"></span></button>
|
|
<ul class="dropdown-menu" id="aggregation_processes">
|
|
<li><a>Traffic</a></li>
|
|
<li><a>Active memory</a></li>
|
|
<!-- <li><a>Latency</a></li> -->
|
|
</ul>
|
|
</div><!-- /btn-group -->
|
|
<br/>
|
|
<br/>
|
|
<table class="table table-bordered table-striped">
|
|
<tr>
|
|
<th class="text-center span3">Top Processes</th>
|
|
<td class="span3"><div class="pie-chart" id="topProcess"></div></td>
|
|
|
|
</tr>
|
|
</table>
|
|
</div> <!-- Tab Processes-->
|
|
]]
|
|
|
|
print [[
|
|
<div class="tab-pane" id="Tree">
|
|
|
|
Show :
|
|
<div class="btn-group btn-toggle btn-sm" data-toggle="buttons" id="show_tree">
|
|
<label class="btn btn-default btn-sm active">
|
|
<input type="radio" name="show_tree" value="All">All</label>
|
|
<label class="btn btn-default btn-sm">
|
|
<input type="radio" name="show_tree" value="Client" checked="">Client</label>
|
|
<label class="btn btn-default btn-sm">
|
|
<input type="radio" name="show_tree" value="Server" checked="">Server</label>
|
|
</div>
|
|
Aggregated by :
|
|
<div class="btn-group">
|
|
<button id="aggregation_tree_displayed" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown">Traffic <span class="caret"></span></button>
|
|
<ul class="dropdown-menu" id="aggregation_tree">
|
|
<li><a>Traffic</a></li>
|
|
<li><a>Active memory</a></li>
|
|
<!-- <li><a>Latency</a></li> -->
|
|
</ul>
|
|
</div><!-- /btn-group -->
|
|
<br/>
|
|
<br/>
|
|
<table class="table table-bordered table-striped">
|
|
<tr>
|
|
<th class="text-center span3">Processes Traffic Tree
|
|
</th>
|
|
<td class="span3">
|
|
<div id="sequence_sunburst" >
|
|
<div id="sequence_processTree" class="sequence"></div>
|
|
<div id="chart_processTree" class="chart"></div>
|
|
<div align="center" class="info">Mouse over to show the process information or double click to show more information.</div>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
|
|
</table>
|
|
</div> <!-- Tab Tree-->
|
|
]]
|
|
|
|
print [[
|
|
</div> <!-- End Tab content-->
|
|
</div> <!-- End Left Tab -->
|
|
|
|
|
|
]]
|
|
|
|
print [[
|
|
|
|
<link href="/css/sequence_sunburst.css" rel="stylesheet">
|
|
<script src="/js/sequence_sunburst.js"></script>
|
|
|
|
<script type='text/javascript'>
|
|
// Default value
|
|
var sprobe_debug = false;
|
|
var processes;
|
|
var processes_type = "bytes";
|
|
var processes_filter = "All";
|
|
var users;
|
|
var users_type = "bytes";
|
|
var users_filter = "All";
|
|
var tree;
|
|
var tree_type = "bytes";
|
|
var tree_filter = "All";
|
|
|
|
|
|
]]
|
|
|
|
-- Users graph javascript
|
|
print [[
|
|
users = do_pie("#topUsers", ']]
|
|
print (ntop.getHttpPrefix())
|
|
print [[/lua/host_sflow_distro.lua', { distr: users_type, sflowdistro_mode: "user", sflow_filter: users_filter , ifid: "]] print(ifId.."") print ('", '..hostinfo2json(host_info).." }, \"\", refresh); \n")
|
|
|
|
print [[
|
|
|
|
$('#aggregation_users li > a').click(function(e){
|
|
$('#aggregation_users_displayed').html(this.innerHTML+' <span class="caret"></span>');
|
|
|
|
if(this.innerHTML == "Active memory") {
|
|
users_type= "memory"
|
|
} else if(this.innerHTML == "Latency") {
|
|
users_type = "latency";
|
|
} else {
|
|
users_type = "bytes";
|
|
}
|
|
if(sprobe_debug) { alert("]]
|
|
print (ntop.getHttpPrefix())
|
|
print [[/lua/host_sflow_distro.lua?host=..&distr="+users_type+"&sflowdistro_mode=user&sflow_filter="+users_filter); }
|
|
users.setUrlParams({ type: users_type, mode: "user", sflow_filter: users_filter, ifid: "]] print(ifId.."") print ('",'.. hostinfo2json(host_info) .. "}") print [[ );
|
|
}); ]]
|
|
|
|
print [[
|
|
$("#show_users input:radio").change(function() {
|
|
users_filter = this.value
|
|
if(sprobe_debug) { alert("users_type: "+users_type+"\n users_filter: "+users_filter); }
|
|
if(sprobe_debug) { alert("url: ]]
|
|
print (ntop.getHttpPrefix())
|
|
print [[/lua/host_sflow_distro.lua?host=..&distr="+users_type+"&sflowdistro_mode=user&sflow_filter="+users_filter); }
|
|
users.setUrlParams({ type: users_type, mode: "user", sflow_filter: users_filter, ifid: "]] print(ifId.."") print ('",'.. hostinfo2json(host_info) .. "}") print [[ );
|
|
});]]
|
|
|
|
|
|
-- Processes graph javascript
|
|
|
|
print [[
|
|
processes = do_pie("#topProcess", ']]
|
|
print (ntop.getHttpPrefix())
|
|
print [[/lua/host_sflow_distro.lua', { distr: processes_type, sflowdistro_mode: "process", sflow_filter: processes_filter , ifid: "]] print(ifId.."")print ('", '..hostinfo2json(host_info).." }, \"\", refresh); \n")
|
|
|
|
print [[
|
|
|
|
$('#aggregation_processes li > a').click(function(e){
|
|
$('#aggregation_processes_displayed').html(this.innerHTML+' <span class="caret"></span>');
|
|
|
|
if(this.innerHTML == "Active memory") {
|
|
processes_type= "memory"
|
|
} else if(this.innerHTML == "Latency") {
|
|
processes_type = "latency";
|
|
} else {
|
|
processes_type = "bytes";
|
|
}
|
|
if(sprobe_debug) { alert(this.innerHTML+"-"+processes_type); }
|
|
processes.setUrlParams({ type: processes_type, sflowdistro_mode: "process", sflow_filter: processes_filter , ifid: "]] print(ifId.."") print ('",'.. hostinfo2json(host_info) .. "}") print [[ );
|
|
}); ]]
|
|
|
|
print [[
|
|
$("#show_processes input:radio").change(function() {
|
|
processes_filter = this.value
|
|
if(sprobe_debug) { alert("processes_type: "+processes_type+"\n processes_filter: "+processes_filter); }
|
|
processes.setUrlParams({ type: processes_type, sflowdistro_mode: "process", sflow_filter: processes_filter, ifid: "]] print(ifId.."") print ('",'.. hostinfo2json(host_info) .. "}") print [[ );
|
|
});]]
|
|
|
|
|
|
-- Processes Tree graph javascript
|
|
print [[
|
|
tree = do_sequence_sunburst("chart_processTree","sequence_processTree",refresh,']]
|
|
print (ntop.getHttpPrefix())
|
|
print [[/lua/sflow_tree.lua',{distr: "bytes" , sflow_filter: tree_filter ]] print (','.. hostinfo2json(host_info)) print [[ },"","Bytes"); ]]
|
|
|
|
print [[
|
|
|
|
$('#aggregation_tree li > a').click(function(e){
|
|
$('#aggregation_tree_displayed').html(this.innerHTML+' <span class="caret"></span>');
|
|
|
|
if(this.innerHTML == "Active memory") {
|
|
tree_type= "memory"
|
|
} else if(this.innerHTML == "Latency") {
|
|
tree_type = "latency";
|
|
} else {
|
|
tree_type = "bytes";
|
|
}
|
|
if(sprobe_debug) { alert(this.innerHTML+"-"+tree_type); }
|
|
tree[0].setUrlParams({type: tree_type , sflow_filter: tree_filter ]] print (','.. hostinfo2json(host_info).." }") print [[ );
|
|
}); ]]
|
|
|
|
print [[
|
|
|
|
$("#show_tree input:radio").change(function() {
|
|
tree_filter = this.value
|
|
if(sprobe_debug) { alert("tree_type: "+tree_type+"\ntree_filter: "+tree_filter); }
|
|
tree[0].setUrlParams({type: tree_type , sflow_filter: tree_filter]] print (','.. hostinfo2json(host_info).." }") print [[ );
|
|
});]]
|
|
|
|
print [[ </script>]]
|
|
|
|
-- End Sprobe Page
|
|
end
|
|
end
|
|
|
|
if (host ~= nil) then
|
|
print[[<script type="text/javascript" src="]] print(ntop.getHttpPrefix()) print [[/js/jquery.tablesorter.js"></script>]]
|
|
|
|
print [[
|
|
<script>
|
|
|
|
$(document).ready(function() {
|
|
$("#myTable").tablesorter();
|
|
});
|
|
|
|
]]
|
|
print("var last_pkts_sent = " .. host["packets.sent"] .. ";\n")
|
|
print("var last_pkts_rcvd = " .. host["packets.rcvd"] .. ";\n")
|
|
print("var last_num_alerts = " .. host["num_alerts"] .. ";\n")
|
|
print("var last_active_flows_as_server = " .. host["active_flows.as_server"] .. ";\n")
|
|
print("var last_active_flows_as_client = " .. host["active_flows.as_client"] .. ";\n")
|
|
print("var last_flows_as_server = " .. host["flows.as_server"] .. ";\n")
|
|
print("var last_flows_as_client = " .. host["flows.as_client"] .. ";\n")
|
|
print("var last_low_goodput_flows_as_client = " .. host["low_goodput_flows.as_client"] .. ";\n")
|
|
print("var last_low_goodput_flows_as_server = " .. host["low_goodput_flows.as_server"] .. ";\n")
|
|
print("var last_tcp_retransmissions = " .. host["tcp.packets.retransmissions"] .. ";\n")
|
|
print("var last_tcp_ooo = " .. host["tcp.packets.out_of_order"] .. ";\n")
|
|
print("var last_tcp_lost = " .. host["tcp.packets.lost"] .. ";\n")
|
|
|
|
if(host["dns"] ~= nil) then
|
|
print("var last_dns_sent_num_queries = " .. host["dns"]["sent"]["num_queries"] .. ";\n")
|
|
print("var last_dns_sent_num_replies_ok = " .. host["dns"]["sent"]["num_replies_ok"] .. ";\n")
|
|
print("var last_dns_sent_num_replies_error = " .. host["dns"]["sent"]["num_replies_error"] .. ";\n")
|
|
print("var last_dns_rcvd_num_queries = " .. host["dns"]["rcvd"]["num_queries"] .. ";\n")
|
|
print("var last_dns_rcvd_num_replies_ok = " .. host["dns"]["rcvd"]["num_replies_ok"] .. ";\n")
|
|
print("var last_dns_rcvd_num_replies_error = " .. host["dns"]["rcvd"]["num_replies_error"] .. ";\n")
|
|
end
|
|
|
|
if(http ~= nil) then
|
|
print("var last_http_query_num_get = " .. http["sender"]["query"]["num_get"] .. ";\n")
|
|
print("var last_http_query_num_post = " .. http["sender"]["query"]["num_post"] .. ";\n")
|
|
print("var last_http_query_num_head = " .. http["sender"]["query"]["num_head"] .. ";\n")
|
|
print("var last_http_query_num_put = " .. http["sender"]["query"]["num_put"] .. ";\n")
|
|
print("var last_http_query_num_other = " .. http["sender"]["query"]["num_other"] .. ";\n")
|
|
print("var last_http_response_num_1xx = " .. http["receiver"]["response"]["num_1xx"] .. ";\n")
|
|
print("var last_http_response_num_2xx = " .. http["receiver"]["response"]["num_2xx"] .. ";\n")
|
|
print("var last_http_response_num_3xx = " .. http["receiver"]["response"]["num_3xx"] .. ";\n")
|
|
print("var last_http_response_num_4xx = " .. http["receiver"]["response"]["num_4xx"] .. ";\n")
|
|
print("var last_http_response_num_5xx = " .. http["receiver"]["response"]["num_5xx"] .. ";\n")
|
|
end
|
|
|
|
print [[
|
|
var host_details_interval = window.setInterval(function() {
|
|
$.ajax({
|
|
type: 'GET',
|
|
url: ']]
|
|
print (ntop.getHttpPrefix())
|
|
print [[/lua/host_stats.lua',
|
|
data: { ifid: "]] print(ifId.."") print('", '..hostinfo2json(host_info)) print [[ },
|
|
/* error: function(content) { alert("JSON Error: inactive host purged or ntopng terminated?"); }, */
|
|
success: function(content) {
|
|
var host = jQuery.parseJSON(content);
|
|
var http = host.http;
|
|
$('#first_seen').html(epoch2Seen(host["seen.first"]));
|
|
$('#last_seen').html(epoch2Seen(host["seen.last"]));
|
|
$('#pkts_sent').html(formatPackets(host["packets.sent"]));
|
|
$('#pkts_rcvd').html(formatPackets(host["packets.rcvd"]));
|
|
$('#bytes_sent').html(bytesToVolume(host["bytes.sent"]));
|
|
$('#bytes_rcvd').html(bytesToVolume(host["bytes.rcvd"]));
|
|
$('#pkt_retransmissions').html(formatPackets(host["tcp.packets.retransmissions"]));
|
|
$('#pkt_ooo').html(formatPackets(host["tcp.packets.out_of_order"]));
|
|
$('#pkt_lost').html(formatPackets(host["tcp.packets.lost"]));
|
|
if(!host["name"]) {
|
|
$('#name').html(host["ip"]);
|
|
} else {
|
|
$('#name').html(host["name"]);
|
|
}
|
|
$('#num_alerts').html(host["num_alerts"]);
|
|
$('#active_flows_as_client').html(addCommas(host["active_flows.as_client"]));
|
|
$('#flows_as_client').html(addCommas(host["flows.as_client"]));
|
|
$('#low_goodput_as_client').html(addCommas(host["low_goodput_flows.as_client"]));
|
|
$('#active_flows_as_server').html(addCommas(host["active_flows.as_server"]));
|
|
$('#flows_as_server').html(addCommas(host["flows.as_server"]));
|
|
$('#low_goodput_as_server').html(addCommas(host["low_goodput_flows.as_server"]));
|
|
]]
|
|
|
|
if(host["dns"] ~= nil) then
|
|
print [[
|
|
$('#dns_sent_num_queries').html(addCommas(host["dns"]["sent"]["num_queries"]));
|
|
$('#dns_sent_num_replies_ok').html(addCommas(host["dns"]["sent"]["num_replies_ok"]));
|
|
$('#dns_sent_num_replies_error').html(addCommas(host["dns"]["sent"]["num_replies_error"]));
|
|
$('#dns_rcvd_num_queries').html(addCommas(host["dns"]["rcvd"]["num_queries"]));
|
|
$('#dns_rcvd_num_replies_ok').html(addCommas(host["dns"]["rcvd"]["num_replies_ok"]));
|
|
$('#dns_rcvd_num_replies_error').html(addCommas(host["dns"]["rcvd"]["num_replies_error"]));
|
|
|
|
if(host["dns"]["sent"]["num_queries"] == last_dns_sent_num_queries) {
|
|
$('#trend_sent_num_queries').html("<i class=\"fa fa-minus\"></i>");
|
|
} else {
|
|
last_dns_sent_num_queries = host["dns"]["sent"]["num_queries"];
|
|
$('#trend_sent_num_queries').html("<i class=\"fa fa-arrow-up\"></i>");
|
|
}
|
|
|
|
if(host["dns"]["sent"]["num_replies_ok"] == last_dns_sent_num_replies_ok) {
|
|
$('#trend_sent_num_replies_ok').html("<i class=\"fa fa-minus\"></i>");
|
|
} else {
|
|
last_dns_sent_num_replies_ok = host["dns"]["sent"]["num_replies_ok"];
|
|
$('#trend_sent_num_replies_ok').html("<i class=\"fa fa-arrow-up\"></i>");
|
|
}
|
|
|
|
if(host["dns"]["sent"]["num_replies_error"] == last_dns_sent_num_replies_error) {
|
|
$('#trend_sent_num_replies_error').html("<i class=\"fa fa-minus\"></i>");
|
|
} else {
|
|
last_dns_sent_num_replies_error = host["dns"]["sent"]["num_replies_error"];
|
|
$('#trend_sent_num_replies_error').html("<i class=\"fa fa-arrow-up\"></i>");
|
|
}
|
|
|
|
if(host["dns"]["rcvd"]["num_queries"] == last_dns_rcvd_num_queries) {
|
|
$('#trend_rcvd_num_queries').html("<i class=\"fa fa-minus\"></i>");
|
|
} else {
|
|
last_dns_rcvd_num_queries = host["dns"]["rcvd"]["num_queries"];
|
|
$('#trend_rcvd_num_queries').html("<i class=\"fa fa-arrow-up\"></i>");
|
|
}
|
|
|
|
if(host["dns"]["rcvd"]["num_replies_ok"] == last_dns_rcvd_num_replies_ok) {
|
|
$('#trend_rcvd_num_replies_ok').html("<i class=\"fa fa-minus\"></i>");
|
|
} else {
|
|
last_dns_rcvd_num_replies_ok = host["dns"]["rcvd"]["num_replies_ok"];
|
|
$('#trend_rcvd_num_replies_ok').html("<i class=\"fa fa-arrow-up\"></i>");
|
|
}
|
|
|
|
if(host["dns"]["rcvd"]["num_replies_error"] == last_dns_rcvd_num_replies_error) {
|
|
$('#trend_rcvd_num_replies_error').html("<i class=\"fa fa-minus\"></i>");
|
|
} else {
|
|
last_dns_rcvd_num_replies_error = host["dns"]["rcvd"]["num_replies_error"];
|
|
$('#trend_rcvd_num_replies_error').html("<i class=\"fa fa-arrow-up\"></i>");
|
|
}
|
|
]]
|
|
end
|
|
|
|
if((host ~= nil) and (http ~= nil)) then
|
|
vh = http["virtual_hosts"]
|
|
if(vh ~= nil) then
|
|
num = table.len(vh)
|
|
if(num > 0) then
|
|
print [[
|
|
var last_http_val = {};
|
|
if((host !== undefined) && (http !== undefined)) {
|
|
$.each(http["virtual_hosts"], function(idx, obj) {
|
|
var key = idx.replace(/\./g,'___');
|
|
$('#'+key+'_bytes_vhost_rcvd').html(bytesToVolume(obj["bytes.rcvd"])+" "+get_trend(obj["bytes.rcvd"], last_http_val[key+"_rcvd"]));
|
|
$('#'+key+'_bytes_vhost_sent').html(bytesToVolume(obj["bytes.sent"])+" "+get_trend(obj["bytes.sent"], last_http_val[key+"_sent"]));
|
|
$('#'+key+'_num_vhost_req_serv').html(addCommas(obj["http.requests"])+" "+get_trend(obj["http.requests"], last_http_val[key+"_req_serv"]));
|
|
last_http_val[key+"_rcvd"] = obj["bytes.rcvd"];
|
|
last_http_val[key+"_sent"] = obj["bytes.sent"];
|
|
last_http_val[key+"_req_serv"] = obj["bytes.http_requests"];
|
|
});
|
|
}
|
|
]]
|
|
end
|
|
|
|
methods = { "get", "post", "head", "put", "other" }
|
|
for i, method in ipairs(methods) do
|
|
print('\t$("#http_query_num_'..method..'").html(addCommas(http["sender"]["query"]["num_'..method..'"]));\n')
|
|
print('\tif(http["sender"]["query"]["num_'..method..'"] == last_http_query_num_'..method..') {\n\t$("#trend_http_query_num_'..method..'").html(\'<i class=\"fa fa-minus\"></i>\');\n')
|
|
print('} else {\n\tlast_http_query_num_'..method..' = http["sender"]["query"]["num_'..method..'"];$("#trend_http_query_num_'..method..'").html(\'<i class=\"fa fa-arrow-up\"></i>\'); }\n')
|
|
end
|
|
|
|
retcodes = { "1xx", "2xx", "3xx", "4xx", "5xx" }
|
|
for i, retcode in ipairs(retcodes) do
|
|
print('\t$("#http_response_num_'..retcode..'").html(addCommas(http["receiver"]["response"]["num_'..retcode..'"]));\n')
|
|
print('\tif(http["receiver"]["response"]["num_'..retcode..'"] == last_http_response_num_'..retcode..') {\n\t$("#trend_http_response_num_'..retcode..'").html(\'<i class=\"fa fa-minus\"></i>\');\n')
|
|
print('} else {\n\tlast_http_response_num_'..retcode..' = http["receiver"]["response"]["num_'..retcode..'"];$("#trend_http_response_num_'..retcode..'").html(\'<i class=\"fa fa-arrow-up\"></i>\'); }\n')
|
|
end
|
|
end
|
|
end
|
|
|
|
print [[
|
|
/* **************************************** */
|
|
|
|
$('#trend_as_active_client').html(drawTrend(host["active_flows.as_client"], last_active_flows_as_client, ""));
|
|
$('#trend_as_client').html(drawTrend(host["flows.as_client"], last_flows_as_client, ""));
|
|
$('#low_goodput_trend_as_client').html(drawTrend(host["low_goodput_flows.as_client"], last_low_goodput_flows_as_client, " style=\"color: #B94A48;\""));
|
|
$('#trend_as_active_server').html(drawTrend(host["active_flows.as_server"], last_active_flows_as_server, ""));
|
|
$('#trend_as_server').html(drawTrend(host["flows.as_server"], last_flows_as_server, ""));
|
|
$('#low_goodput_trend_as_server').html(drawTrend(host["low_goodput_flows.as_server"], last_low_goodput_flows_as_server, " style=\"color: #B94A48;\""));
|
|
|
|
$('#alerts_trend').html(drawTrend(host["num_alerts"], last_num_alerts, " style=\"color: #B94A48;\""));
|
|
$('#sent_trend').html(drawTrend(host["packets.sent"], last_pkts_sent, ""));
|
|
$('#rcvd_trend').html(drawTrend(host["packets.rcvd"], last_pkts_rcvd, ""));
|
|
$('#pkt_retransmissions_trend').html(drawTrend(host["tcp.packets.retransmissions"], last_tcp_retransmissions, ""));
|
|
$('#pkt_ooo_trend').html(drawTrend(host["tcp.packets.out_of_order"], last_tcp_ooo, ""));
|
|
$('#pkt_lost_trend').html(drawTrend(host["tcp.packets.lost"], last_tcp_lost, ""));
|
|
|
|
last_num_alerts = host["num_alerts"];
|
|
last_pkts_sent = host["packets.sent"];
|
|
last_pkts_rcvd = host["packets.rcvd"];
|
|
last_active_flows_as_client = host["active_flows.as_client"];
|
|
last_active_flows_as_server = host["active_flows.as_server"];
|
|
last_flows_as_client = host["flows.as_client"];
|
|
last_low_goodput_flows_as_server = host["low_goodput_flows.as_server"];
|
|
last_low_goodput_flows_as_client = host["low_goodput_flows.as_client"];
|
|
last_flows_as_server = host["flows.as_server"];
|
|
last_tcp_retransmissions = host["tcp.packets.retransmissions"];
|
|
last_tcp_ooo = host["tcp.packets.out_of_order"];
|
|
last_tcp_lost = host["tcp.packets.lost"];
|
|
]]
|
|
|
|
|
|
print [[
|
|
|
|
/* **************************************** */
|
|
|
|
/*
|
|
$('#throughput').html(rsp.throughput);
|
|
|
|
var values = thptChart.text().split(",");
|
|
values.shift();
|
|
values.push(rsp.throughput_raw);
|
|
thptChart.text(values.join(",")).change();
|
|
*/
|
|
}
|
|
});
|
|
}, 3000);
|
|
|
|
</script>
|
|
]]
|
|
end
|
|
|
|
dofile(dirs.installdir .. "/scripts/lua/inc/footer.lua")
|