ntopng/scripts/lua/get_arp_matrix_data.lua
Francesco Staccini 1d9b35be42 ARP Map (#2540)
* 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
2019-04-17 13:23:10 +02:00

139 lines
4 KiB
Lua

--
-- (C) 2013-19 - ntop.org
--
local dirs = ntop.getDirs()
package.path = dirs.installdir .. "/scripts/lua/modules/?.lua;" .. package.path
require "lua_utils"
local json = require("dkjson")
sendHTTPContentTypeHeader('application/json')
local matrix = interface.getArpStatsMatrixInfo()
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