-- -- (C) 2013-16 - ntop.org -- dirs = ntop.getDirs() package.path = dirs.installdir .. "/scripts/lua/modules/?.lua;" .. package.path require "lua_utils" sendHTTPHeader('text/html; charset=iso-8859-1') -- Table parameters all = _GET["all"] currentPage = _GET["currentPage"] perPage = _GET["perPage"] sortColumn = _GET["sortColumn"] sortOrder = _GET["sortOrder"] protocol = _GET["protocol"] net = _GET["net"] long_names = _GET["long_names"] criteria = _GET["criteria"] -- Host comparison parameters mode = _GET["mode"] tracked = _GET["tracked"] -- Used when filtering by ASn, VLAN or network asn = _GET["asn"] vlan = _GET["vlan"] network = _GET["network"] country = _GET["country"] os_ = _GET["os"] mac = _GET["mac"] -- table_id = _GET["table"] function update_host_name(h) if(h["name"] == nil) then if(h["ip"] ~= nil) then h["name"] = ntop.getResolvedAddress(h["ip"]) else h["name"] = h["mac"] end end return(h["name"]) end -- Get from redis the throughput type bps or pps throughput_type = getThroughputType() if(long_names == nil) then long_names = false else if(long_names == "1") then long_names = true else long_names = false end end criteria_key = nil sortPrefs = "hosts" if(criteria ~= nil) then criteria_key, criteria_format = label2criteriakey(criteria) sortPrefs = "localhosts_"..criteria mode = "local" end if((sortColumn == nil) or (sortColumn == "column_"))then sortColumn = getDefaultTableSort(sortPrefs) else if((sortColumn ~= "column_") and (sortColumn ~= "")) then tablePreferences("sort_"..sortPrefs,sortColumn) end end if(sortOrder == nil) then sortOrder = getDefaultTableSortOrder(sortPrefs) else if((sortColumn ~= "column_") and (sortColumn ~= "")) then tablePreferences("sort_order_"..sortPrefs,sortOrder) end end if(currentPage == nil) then currentPage = 1 else currentPage = tonumber(currentPage) end if(perPage == nil) then perPage = getDefaultTableSize() else perPage = tonumber(perPage) tablePreferences("rows_number",perPage) end if(tracked ~= nil) then tracked = tonumber(tracked) else tracked = 0 end if((mode == nil) or (mode == "")) then mode = "all" end interface.select(ifname) to_skip = (currentPage-1) * perPage if(sortOrder == "desc") then sOrder = false else sOrder = true end hosts_retrv_function = interface.getHostsInfo if mode == "local" then hosts_retrv_function = interface.getLocalHostsInfo elseif mode == "remote" then hosts_retrv_function = interface.getRemoteHostsInfo end hosts_stats = hosts_retrv_function(false, sortColumn, perPage, to_skip, sOrder, country, os_, tonumber(vlan), tonumber(asn), tonumber(network), mac) -- false = little details --io.write("hello\n") --tprint(hosts_stats) --io.write("---\n") if(hosts_stats == nil) then total = 0 else total = hosts_stats["numHosts"] end hosts_stats = hosts_stats["hosts"] -- for k,v in pairs(hosts_stats) do io.write(k.." ["..sortColumn.."]\n") end if(all ~= nil) then perPage = 0 currentPage = 0 end print ("{ \"currentPage\" : " .. currentPage .. ",\n \"data\" : [\n") now = os.time() vals = {} sort_mode = mode -- for k,v in pairs(hosts_stats) do io.write(k.."\n") end if(net ~= nil) then net = string.gsub(net, "_", "/") end if(mode == "network") then my_networks = { } for key, value in pairs(hosts_stats) do h = hosts_stats[key] nw_name = h["local_network_name"] if(h["local_network_name"] ~= nil) then -- io.write(nw_name.."\n") if(nw_name ~= nil) then if(my_networks[nw_name] == nil) then h["ip"] = nw_name h["name"] = nw_name -- FIX my_networks[nw_name] = h else my_networks[nw_name]["num_alerts"] = my_networks[nw_name]["num_alerts"] + h["num_alerts"] my_networks[nw_name]["throughput_bps"] = my_networks[nw_name]["throughput_bps"] + h["throughput_bps"] my_networks[nw_name]["throughput_pps"] = my_networks[nw_name]["throughput_pps"] + h["throughput_pps"] my_networks[nw_name]["bytes.sent"] = my_networks[nw_name]["bytes.sent"] + h["bytes.sent"] my_networks[nw_name]["bytes.rcvd"] = my_networks[nw_name]["bytes.rcvd"] + h["bytes.rcvd"] if(my_networks[nw_name]["seen.first"] > h["seen.first"]) then my_networks[nw_name]["seen.first"] = h["seen.first"] end end end end end hosts_stats = my_networks mode = "local" end num = 0 if(hosts_stats ~= nil) then for key, value in pairs(hosts_stats) do num = num + 1 postfix = string.format("0.%04u", num) ok = true if not(mode == "all" or mode == "remote" or mode == "local") then ok = false end if(net ~= nil) then if((value["local_network_name"] == nil) or (value["local_network_name"] ~= net)) then ok = false end end if(ok == true) then if(client ~= nil) then ok = false for k,v in pairs(hosts_stats[key]["contacts"]["client"]) do --io.write(k.."\n") if((ok == false) and (k == client)) then ok = true end end if(ok == false) then for k,v in pairs(hosts_stats[key]["contacts"]["server"]) do -- io.write(k.."\n") if((ok == false) and (k == client)) then ok = true end end end else ok = true end end if((protocol ~= nil) and (ok == true)) then info = interface.getHostInfo(key) if((info == nil) or (info["ndpi"][protocol] == nil)) then ok = false end end if(ok == true) then -- io.write("==>"..key.."\n") -- tprint(hosts_stats[key]) -- io.write("==>"..hosts_stats[key]["bytes.sent"].."[" .. sortColumn .. "]["..key.."]\n") if(sortColumn == "column_") then vals[key] = key -- hosts_stats[key]["ipkey"] elseif(sortColumn == "column_name") then hosts_stats[key]["name"] = update_host_name(hosts_stats[key]) vals[hosts_stats[key]["name"]..postfix] = key elseif(sortColumn == "column_since") then vals[(now-hosts_stats[key]["seen.first"])+postfix] = key elseif(sortColumn == "column_alerts") then vals[hosts_stats[key]["num_alerts"]+postfix] = key -- print("["..key.."=".. hosts_stats[key]["num_alerts"].."]\n") elseif(sortColumn == "column_family") then vals[(now-hosts_stats[key]["family"])+postfix] = key elseif(sortColumn == "column_last") then vals[(now-hosts_stats[key]["seen.last"]+1)+postfix] = key elseif(sortColumn == "column_category") then if(hosts_stats[key]["category"] == nil) then hosts_stats[key]["category"] = "" end vals[hosts_stats[key]["category"]..postfix] = key elseif(sortColumn == "column_httpbl") then if(hosts_stats[key]["httpbl"] == nil) then hosts_stats[key]["httpbl"] = "" end vals[hosts_stats[key]["httpbl"]..postfix] = key elseif(sortColumn == "column_asn") then vals[hosts_stats[key]["asn"]..postfix] = key elseif(sortColumn == "column_country") then vals[hosts_stats[key]["country"]..postfix] = key elseif(sortColumn == "column_vlan") then vals[hosts_stats[key]["vlan"]..postfix] = key elseif(sortColumn == "column_thpt") then vals[hosts_stats[key]["throughput_"..throughput_type]+postfix] = key elseif(sortColumn == "column_queries") then vals[hosts_stats[key]["queries.rcvd"]+postfix] = key elseif(sortColumn == "column_ip") then vals[hosts_stats[key]["ipkey"]+postfix] = key -- looking_glass_criteria elseif(criteria ~= nil) then -- io.write("==> "..criteria.."\n") if(sortColumn == "column_"..criteria) then local c = hosts_stats[key]["criteria"] if(c ~= nil) then vals[c[criteria_key]+postfix] = key --io.write(key.."="..hosts_stats[key]["criteria"][criteria_key].."\n") end end end else -- io.write(key.."\n") -- io.write(hosts_stats[key].."\n") -- for k,v in pairs(hosts_stats[key]) do io.write(k.."\n") end vals[(hosts_stats[key]["bytes.sent"]+hosts_stats[key]["bytes.rcvd"])+postfix] = key end end end if(sortOrder == "asc") then funct = asc else funct = rev end num = 0 for _key, _value in pairsByKeys(vals, funct) do key = vals[_key] if((key ~= nil) and (not(key == "")) and ((asn == nil) or (asn == tostring(hosts_stats[key]["asn"]))) and ((os_ == nil) or (os_ == tostring(hosts_stats[key]["os"]))) and ((country == nil) or (country == tostring(hosts_stats[key]["country"]))) and ((mac == nil) or (mac == tostring(hosts_stats[key]["mac"]))) and ((vlan == nil) or (vlan == tostring(hosts_stats[key]["vlan"]))) and ((network == nil) or (network == tostring(hosts_stats[key]["local_network_id"])))) then value = hosts_stats[key] if((num < perPage) or (all ~= nil))then if(num > 0) then print ",\n" end print ('{ ') symkey = hostinfo2jqueryid(hosts_stats[key]) print ('\"key\" : \"'..symkey..'\",') print ("\"column_ip\" : \"") else url = ntop.getHttpPrefix().."/lua/host_details.lua?" ..hostinfo2url(hosts_stats[key]) print(url .. "'>") end print(mapOS2Icon(key)) print(" ") if(value["systemhost"] == true) then print(" ") end if((value["country"] ~= nil) and (value["country"] ~= "")) then print(" ") end print(" ") print(getOSIcon(value["os"])) icon = "" if(mac ~= nil) then icon = getHostIcon(hosts_stats[key]["mac"]) end if(icon == "") then icon = getHostIcon(hosts_stats[key]["ip"].."@"..hosts_stats[key]["vlan"]) end print(icon) if(value["dump_host_traffic"] == true) then print(" ") end print("\", ") if(url ~= nil) then print("\"column_url\" : \""..url.."\", ") end print("\"column_name\" : \"") if(value["name"] == nil) then value["name"] = ntop.getResolvedAddress(key) end if(value["name"] == "") then value["name"] = key end if(long_names) then print(value["name"]) else print(shortHostName(value["name"])) end if(value["ip"] ~= nil) then label = getHostAltName(value["ip"]) if(label ~= value["ip"]) then print (" ["..label.."]") end end if((value["httpbl"] ~= nil) and (string.len(value["httpbl"]) > 2)) then print (" ") end if((value["num_alerts"] ~= nil) and (value["num_alerts"] > 0)) then print(" ") end -- print("") if((value["httpbl"] ~= nil) and (string.len(value["httpbl"]) > 2)) then print("\", \"column_httpbl\" : \"".. value["httpbl"]) end if(value["vlan"] ~= nil) then if(value["vlan"] ~= 0) then print("\", \"column_vlan\" : "..value["vlan"]) else print("\", \"column_vlan\" : \"0\"") end else print("\", \"column_vlan\" : \"\"") end if(value["asn"] ~= nil) then if(value["asn"] == 0) then print(", \"column_asn\" : 0") else print(", \"column_asn\" : \""..value["asname"].."\"") end end print(", \"column_since\" : \"" .. secondsToTime(now-value["seen.first"]+1) .. "\", ") print("\"column_last\" : \"" .. secondsToTime(now-value["seen.last"]+1) .. "\", ") if((criteria_key ~= nil) and (value["criteria"] ~= nil)) then print("\"column_"..criteria.."\" : \"" .. criteria_format(value["criteria"][criteria_key]) .. "\", ") end if((value["throughput_trend_"..throughput_type] ~= nil) and (value["throughput_trend_"..throughput_type] > 0)) then if(throughput_type == "pps") then print ("\"column_thpt\" : \"" .. pktsToSize(value["throughput_pps"]).. " ") else print ("\"column_thpt\" : \"" .. bitsToSize(8*value["throughput_bps"]).. " ") end if(value["throughput_trend_"..throughput_type] == 1) then print("") elseif(value["throughput_trend_"..throughput_type] == 2) then print("") elseif(value["throughput_trend_"..throughput_type] == 3) then print("") end print("\",") else print ("\"column_thpt\" : \"0 "..throughput_type.."\",") end print("\"column_traffic\" : \"" .. bytesToSize(value["bytes.sent"]+value["bytes.rcvd"])) print ("\", \"column_alerts\" : \"") if((value["num_alerts"] ~= nil) and (value["num_alerts"] > 0)) then print(""..value["num_alerts"]) else print("0") end if(value["localhost"] ~= nil or value["systemhost"] ~= nil) then print ("\", \"column_location\" : \"") if value["localhost"] == true or value["systemhost"] == true then print("Local") else print("Remote") end if value["is_blacklisted"] == true then print(" Blacklist") end end sent2rcvd = round((value["bytes.sent"] * 100) / (value["bytes.sent"]+value["bytes.rcvd"]), 0) print ("\", \"column_breakdown\" : \"
Sent
Rcvd
") print("\" } ") num = num + 1 end end end -- for print ("\n], \"perPage\" : " .. perPage .. ",\n") if(sortColumn == nil) then sortColumn = "" end if(sortOrder == nil) then sortOrder = "" end print ("\"sort\" : [ [ \"" .. sortColumn .. "\", \"" .. sortOrder .."\" ] ],\n") print ("\"totalRows\" : " .. total .. " \n}")