ntopng/scripts/lua/experiments/stats_to_mbroker.lua

178 lines
5.5 KiB
Lua

--
-- (C) 2019-24 - ntop.org
--
local dirs = ntop.getDirs()
package.path = dirs.installdir .. "/scripts/lua/modules/?.lua;" .. package.path
package.path = dirs.installdir .. "/scripts/lua/modules/vulnerability_scan/?.lua;" .. package.path
-- ############################################
local topic = "test.interface.stats"
-- ############################################
-- Requires
require "ntop_utils"
local periodic_activities_utils = require "periodic_activities_utils"
local callback_utils = require("callback_utils")
local recording_utils = require("recording_utils")
local auth = require "auth"
local vs_utils = require "vs_utils"
local json = require("dkjson")
-- ############################################
if (ntop.getPref("ntopng.prefs.toggle_message_broker") ~= "1") then
return
end
-- ############################################
local function userHasRestrictions()
local allowed_nets = ntop.getPref("ntopng.user.admin.allowed_nets")
for _, net in pairs(split(allowed_nets, ",")) do
if not isEmptyString(net) and net ~= "0.0.0.0/0" and net ~= "::/0" then
return true
end
end
return false
end
local function countHosts()
local res = {
local_hosts = 0,
hosts = 0,
}
for host, info in callback_utils.getHostsIterator(false --[[no details]]) do
if info.localhost then
res.local_hosts = res.local_hosts + 1
end
res.hosts = res.hosts + 1
end
return res
end
local function format_info(ifstats)
local ifstats = interface.getStats()
local interface_name = getInterfaceName(ifstats.id)
local res = {}
if(ifstats ~= nil) then
local uptime = ntop.getUptime()
local prefs = ntop.getPrefs()
-- Round up
local hosts_pctg = math.floor(1+((ifstats.stats.hosts*100)/prefs.max_num_hosts))
local flows_pctg = math.floor(1+((ifstats.stats.flows*100)/prefs.max_num_flows))
local macs_pctg = math.floor(1+((ifstats.stats.current_macs*100)/prefs.max_num_hosts))
res["ifid"] = ifid
res["ifname"] = interface_name
res["drops"] = ifstats.stats_since_reset.drops
res["throughput_bps"] = ifstats.stats.throughput_bps;
if (vs_utils.is_available()) then
local total, total_in_progress = vs_utils.check_in_progress_status()
res["vs_in_progress"] = total_in_progress or 0
end
if prefs.is_dump_flows_enabled then
res["flow_export_drops"] = ifstats.stats_since_reset.db.flow_export_drops
res["flow_export_count"] = ifstats.stats_since_reset.db.flow_export_count
end
if auth.has_capability(auth.capabilities.alerts) then
res["engaged_alerts"] = ifstats["num_alerts_engaged"] or 0
res["engaged_alerts_warning"] = ifstats["num_alerts_engaged_by_severity"]["warning"]
res["engaged_alerts_error"] = ifstats["num_alerts_engaged_by_severity"]["error"]
res["alerted_flows"] = ifstats["num_alerted_flows"] or 0
res["alerted_flows_warning"] = ifstats["num_alerted_flows_warning"] or 0
res["alerted_flows_error"] = ifstats["num_alerted_flows_error"] or 0
end
if periodic_activities_utils.have_degraded_performance() then
res["degraded_performance"] = true
end
if not userHasRestrictions() then
res["num_flows"] = ifstats.stats.flows
res["num_hosts"] = ifstats.stats.hosts
res["num_local_hosts"] = ifstats.stats.local_hosts
res["num_devices"] = ifstats.stats.devices
res["num_rcvd_only_hosts"] = ifstats.stats.hosts_rcvd_only
res["num_local_rcvd_only_hosts"] = ifstats.stats.local_rcvd_only_hosts
else
res["num_hosts"] = countHosts().hosts
res["num_local_hosts"] = countHosts().local_hosts
end
res["localtime"] = os.date("%H:%M:%S %z", res["epoch"])
res["uptime"] = secondsToTime(uptime)
if ntop.isPro() then
local product_info = ntop.getInfo(true)
if product_info["pro.out_of_maintenance"] then
res["out_of_maintenance"] = true
end
end
res["hosts_pctg"] = hosts_pctg
res["flows_pctg"] = flows_pctg
res["macs_pctg"] = macs_pctg
if isAdministrator() then
res["num_live_captures"] = ifstats.stats.num_live_captures
end
local ingress_thpt = ifstats["eth"]["ingress"]["throughput"]
local egress_thpt = ifstats["eth"]["egress"]["throughput"]
res["throughput"] = {
download = ingress_thpt["bps"],
upload = egress_thpt["bps"]
}
if recording_utils.isAvailable() then
if recording_utils.isEnabled(ifstats.id) then
if recording_utils.isActive(ifstats.id) then
res["traffic_recording"] = "recording"
else
res["traffic_recording"] = "failed"
end
end
if recording_utils.isEnabled(ifstats.id) then
local jobs_info = recording_utils.extractionJobsInfo(ifstats.id)
if jobs_info.ready > 0 then
res["traffic_extraction"] = "ready"
elseif jobs_info.total > 0 then
res["traffic_extraction"] = jobs_info.total
end
res["traffic_extraction_num_tasks"] = jobs_info.total
end
end
-- Adding a preference if active discovery is enabled
res["active_discovery_active"] = ntop.getPref("ntopng.prefs.is_periodic_network_discovery_running.ifid_" .. interface.getId()) == "1"
end
return res
end
-- #############################################
-- Retrieves interface stats and
-- sends them to message broker (nats)
local iface_info = interface.getStats()
ntop.publish(topic,json.encode(format_info(iface_info)))
-- #############################################