* arp matrix graph and fix

* bug fix

* graph fix

* bug fix

* tests on arp graph

* merged heatmap.js and map.js

* graph dinamic resize

* minor fix

* graph dinamic width

* graph performance improvement

* clean code

* fix manual refresh

* message for empty graph

* clean code

* more clean

* update arpMap and host details

* migrate to v4.min version of d3.js
This commit is contained in:
Francesco Staccini 2019-04-17 13:23:10 +02:00 committed by simonemainardi
parent 94b143c8a3
commit 1d9b35be42
13 changed files with 1247 additions and 224 deletions

View file

@ -1,5 +1,5 @@
--
-- (C) 2013-18 - ntop.org
-- (C) 2013-19 - ntop.org
--
local dirs = ntop.getDirs()
@ -7,8 +7,133 @@ package.path = dirs.installdir .. "/scripts/lua/modules/?.lua;" .. package.path
require "lua_utils"
local json = require("dkjson")
sendHTTPContentTypeHeader('application/json')
local matrix = interface.getArpStatsMatrixInfo()
sendHTTPContentTypeHeader('application/json')
print(json.encode(matrix, {indent = true}))
local host_info = url2hostinfo(_GET)
local host_ip = host_info["host"]
local page = _GET["page"]
local treshold = 0
local function createHeatmap(matrix, type)
if not matrix then return nil end
local t = {}
local tmp = {}
local v = 0
local t_res = {}
-- function cmp(a,b)
-- return a.y_label > b.y_label
-- end
for _, m_elem in pairs(matrix) do
for i,stats in pairs(m_elem)do
tmp = split(i,"-")
src_ip = tmp[1]
dst_ip = tmp[2]
if type == "requests" then v = stats["src2dst.requests"]
elseif type == "replies" then v = stats["src2dst.replies"]
elseif type == "all" then v = stats["src2dst.requests"] + stats["src2dst.replies"]
end
if v > treshold then
table.insert( t_res, { x_label = dst_ip, y_label = src_ip, value = v })
end
v = 0
if type == "requests" then v = stats["dst2src.requests"]
elseif type == "replies" then v = stats["dst2src.replies"]
elseif type == "all" then v = stats["dst2src.requests"] + stats["dst2src.replies"]
end
if v > treshold then
table.insert( t_res, { x_label = src_ip, y_label = dst_ip, value = v })
end
--table.sort(t_res, cmp) --for lexicographical order
end
end
return t_res
end
--NOTE: function currently not used
local function createMap4Target(matrix, type, ip_target)
local tmp = {}
local v = 0
local t_res = {}
local treshold = 0
for _, m_elem in pairs(matrix) do
for i,stats in pairs(m_elem)do
tmp = split(i,"-")
src_ip = tmp[1]
dst_ip = tmp[2]
if type == "requests" then v = stats["src2dst.requests"]
elseif type == "replies" then v = stats["src2dst.replies"]
elseif type == "all" then v = stats["src2dst.requests"] + stats["src2dst.replies"]
end
if (v > treshold) and (src_ip == ip_target) then
table.insert( t_res, { x_label = dst_ip, y_label = src_ip, value = v })
end
v = 0
if type == "requests" then v = stats["dst2src.requests"]
elseif type == "replies" then v = stats["dst2src.replies"]
elseif type == "all" then v = stats["dst2src.requests"] + stats["dst2src.replies"]
end
if (v > treshold) and (dst_ip == ip_target) then
table.insert( t_res, { x_label = src_ip, y_label = dst_ip, value = v })
end
end
end
return t_res
end
--return 2 counters: number of ARP requests received, and the number of senders for that requests
local function arpTalkers(matrix, host_ip)
local req_num = 0;
local talkers_num = 0;
if (matrix and host_ip) then
for _, m_elem in pairs(matrix) do
for i, stats in pairs(m_elem)do
tmp = split(i,"-")
src_ip = tmp[1]
dst_ip = tmp[2]
if ((stats["src2dst.requests"] > 0) and (src_ip == host_ip)) or
((stats["dst2src.requests"] > 0) and (dst_ip == host_ip))then
req_num = req_num + stats["src2dst.requests"] + stats["dst2src.requests"]
talkers_num = talkers_num + 1
end
end
end
end
return {talkers_num = talkers_num, req_num = req_num}
end
if host_ip then
print( json.encode( arpTalkers(matrix, host_ip) ) )
else
print( json.encode( createHeatmap(matrix, "all"), {indent = true} ) )
end