mirror of
https://github.com/ntop/ntopng.git
synced 2026-05-06 20:46:19 +00:00
230 lines
6.6 KiB
Lua
230 lines
6.6 KiB
Lua
--
|
|
-- (C) 2019 - ntop.org
|
|
--
|
|
|
|
local rtt_utils = {}
|
|
local ts_utils = require "ts_utils_core"
|
|
local format_utils = require "format_utils"
|
|
|
|
-- ##############################################
|
|
|
|
local rtt_hosts_key = string.format("ntopng.prefs.ifid_%d.system_rtt_hosts", getSystemInterfaceId())
|
|
|
|
-- ##############################################
|
|
|
|
local function rtt_last_updates_key(key)
|
|
return string.format("ntopng.cache.ifid_%d.system_rtt_hosts.last_update." .. key, getSystemInterfaceId())
|
|
end
|
|
|
|
-- ##############################################
|
|
|
|
function rtt_utils.host2key(host, iptype, probetype)
|
|
return table.concat({host, iptype, probetype}, "@")
|
|
end
|
|
|
|
-- ##############################################
|
|
|
|
function rtt_utils.setLastRttUpdate(key, when, rtt, ipaddress)
|
|
ntop.setCache(rtt_last_updates_key(key), string.format("%u@%.2f@%s", when, rtt, ipaddress))
|
|
end
|
|
|
|
-- ##############################################
|
|
|
|
function rtt_utils.getLastRttUpdate(key)
|
|
local val = ntop.getCache(rtt_last_updates_key(key))
|
|
|
|
if(val ~= nil)then
|
|
local parts = string.split(val, "@")
|
|
|
|
if((parts ~= nil) and (#parts == 3)) then
|
|
return {
|
|
when = parts[1],
|
|
value = parts[2],
|
|
ip = parts[3],
|
|
}
|
|
end
|
|
end
|
|
end
|
|
|
|
-- ##############################################
|
|
|
|
function rtt_utils.key2label(key)
|
|
local parts = string.split(key, "@")
|
|
|
|
if((parts ~= nil) and (#parts == 3)) then
|
|
-- TODO improve
|
|
return string.format("%s [%s] (%s)", parts[1], parts[2], string.upper(parts[3]))
|
|
end
|
|
|
|
return key
|
|
end
|
|
|
|
-- ##############################################
|
|
|
|
function rtt_utils.deserializeHost(val)
|
|
local parts = string.split(val, "|")
|
|
|
|
if((parts ~= nil) and (#parts == 4)) then
|
|
local value = {
|
|
host = parts[1],
|
|
iptype = parts[2], -- ipv4 or ipv6
|
|
probetype = parts[3],
|
|
max_rtt = tonumber(parts[4]),
|
|
}
|
|
|
|
return value
|
|
end
|
|
end
|
|
|
|
-- ##############################################
|
|
|
|
function rtt_utils.getHostsSerialized()
|
|
return ntop.getHashAllCache(rtt_hosts_key) or {}
|
|
end
|
|
|
|
-- ##############################################
|
|
|
|
function rtt_utils.getHostSerialized(host_key)
|
|
return ntop.getHashCache(rtt_hosts_key, host_key) or {}
|
|
end
|
|
|
|
-- ##############################################
|
|
|
|
function rtt_utils.getHosts()
|
|
local hosts = rtt_utils.getHostsSerialized()
|
|
local rv = {}
|
|
|
|
for host, val in pairs(hosts) do
|
|
rv[host] = rtt_utils.deserializeHost(val)
|
|
end
|
|
|
|
return rv
|
|
end
|
|
|
|
-- ##############################################
|
|
|
|
function rtt_utils.getHost(host_key)
|
|
if not host_key then
|
|
return
|
|
end
|
|
|
|
res = rtt_utils.getHostSerialized(host_key)
|
|
|
|
if not isEmptyString(res) then
|
|
return rtt_utils.deserializeHost(res)
|
|
end
|
|
end
|
|
|
|
-- ##############################################
|
|
|
|
function rtt_utils.addHost(host, value)
|
|
ntop.setHashCache(rtt_hosts_key, host, value)
|
|
end
|
|
|
|
-- ##############################################
|
|
|
|
function rtt_utils.removeHost(host)
|
|
local alerts_api = require("alerts_api")
|
|
local rtt_host_entity = alerts_api.pingedHostEntity(host)
|
|
local old_ifname = ifname
|
|
|
|
interface.select(getSystemInterfaceId())
|
|
alerts_api.releaseEntityAlerts(rtt_host_entity)
|
|
interface.select(old_ifname)
|
|
|
|
ntop.delHashCache(rtt_hosts_key, host)
|
|
end
|
|
|
|
-- ##############################################
|
|
|
|
local function get_rtt_host_table_data(host_key)
|
|
local host_conf = rtt_utils.getHost(host_key)
|
|
if not host_conf then
|
|
return
|
|
end
|
|
|
|
local host_rtt = rtt_utils.getLastRttUpdate(host_key)
|
|
|
|
local host_chart = ''
|
|
if ts_utils.exists("monitored_host:rtt", {ifid = getSystemInterfaceId(), host = host_key}) then
|
|
host_chart = '<a href="'.. ntop.getHttpPrefix() ..'/lua/system/rtt_stats.lua?rtt_host='.. host_key ..'&page=historical"><i class="fa fa-area-chart fa-lg"></i></a>'
|
|
end
|
|
|
|
return {conf = host_conf, rtt = host_rtt, chart = host_chart}
|
|
end
|
|
|
|
-- ##############################################
|
|
|
|
local function print_host_rtt_table_row(host, i18n_host_label, host_value, host_data)
|
|
print[[
|
|
<tr>
|
|
<th width=10%>]] print(i18n(i18n_host_label)) print[[</th>
|
|
<td width=20%>]] print(host_value) print[[</td>]]
|
|
|
|
if not host_data then
|
|
print[[<td colspan=4><i>]] print(i18n("system_stats.no_rtt_configured_for_host", {host = host_value})) print[[.</i>]]
|
|
print[[ <a href="]] print(ntop.getHttpPrefix()) print[[/lua/host_details.lua?]] print(hostinfo2url(host)) print[[&page=config"><i class="fa fa-cog"></i></a>]]
|
|
print[[</td>]]
|
|
else
|
|
local last_val = ''
|
|
local last_update = ''
|
|
if host_data["rtt"] then
|
|
last_val = format_utils.formatValue(host_data["rtt"]["value"]).." ms"
|
|
last_update = format_utils.formatPastEpochShort(host_data["rtt"]["when"])
|
|
end
|
|
|
|
print[[
|
|
<td style="text-align: center;">]] print(host_data["chart"]) print[[</td>
|
|
<td style="text-align: center;">]] print(formatValue(host_data["conf"]["max_rtt"])) print[[ ms</td>
|
|
<td style="text-align: center;">]] print(last_val) print[[</td>
|
|
<td style="text-align: center;">]] print(last_update) print[[</td>
|
|
</tr>]]
|
|
end
|
|
end
|
|
|
|
-- ##############################################
|
|
|
|
function rtt_utils.print_host_rtt_table(host)
|
|
local host_ip = host["ip"]
|
|
local host_ip_key = rtt_utils.host2key(host_ip, ternary(isIPv4(host_ip), "ipv4", "ipv6"), "icmp")
|
|
local host_ip_data = get_rtt_host_table_data(host_ip_key)
|
|
|
|
local host_name = getResolvedAddress(hostkey2hostinfo(host["ip"]))
|
|
local host_name_key
|
|
local host_name_data
|
|
|
|
if host_name ~= host_ip then
|
|
host_name_key = rtt_utils.host2key(host_name, ternary(isIPv4(host_ip), "ipv4", "ipv6"), "icmp")
|
|
host_name_data = get_rtt_host_table_data(host_name_key)
|
|
end
|
|
|
|
print[[
|
|
<table class="table table-bordered table-striped">
|
|
<thead>
|
|
<tr>
|
|
<th width=10% colspan=2>]] print(i18n("traffic_profiles.host_traffic")) print[[</th>
|
|
<th style="text-align: center;" width=5%>]] print(i18n("chart")) print[[</th>
|
|
<th style="text-align: center;">]] print(i18n("system_stats.max_rtt_no_ms")) print[[</th>
|
|
<th style="text-align: center;">]] print(i18n("system_stats.last_rtt")) print[[</th>
|
|
<th style="text-align: center;">]] print(i18n("category_lists.last_update")) print[[</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>]]
|
|
|
|
print_host_rtt_table_row(host, "ip_address", host_ip, host_ip_data)
|
|
|
|
if host_name ~= host_ip and host_name_data
|
|
and ((host_name_data["conf"]["iptype"] == "ipv4" and isIPv4(host_ip))
|
|
or (host_name_data["conf"]["iptype"] == "ipv6" and isIPv6(host_ip))) then
|
|
print_host_rtt_table_row(host, "name", host_name, host_name_data)
|
|
end
|
|
|
|
print[[
|
|
</tbody>
|
|
</table>
|
|
]]
|
|
end
|
|
|
|
-- ##############################################
|
|
|
|
return rtt_utils
|