mirror of
https://github.com/ntop/ntopng.git
synced 2026-04-30 07:59:35 +00:00
171 lines
6.5 KiB
Lua
171 lines
6.5 KiB
Lua
--
|
|
-- (C) 2014-24 - ntop.org
|
|
--
|
|
require "label_utils"
|
|
require "ntop_utils"
|
|
require "check_redis_prefs"
|
|
|
|
local consts = require "consts"
|
|
|
|
-- ##############################################
|
|
|
|
local host_utils = {}
|
|
|
|
-- ##############################################
|
|
|
|
-- @brief Implements the logic to decide whether to show or not the url for a given `host_info`
|
|
local function hostdetails_exists(host_info, hostdetails_params)
|
|
if not hostdetails_params then
|
|
hostdetails_params = {}
|
|
end
|
|
|
|
if hostdetails_params["page"] ~= "historical" and not hostdetails_params["ts_schema"] then
|
|
-- If the requested host_details.lua page is not the "historical" page
|
|
-- and if no ts_schema has been requested
|
|
-- then we check for host existance in memory, to make sure the page host_details.lua
|
|
-- won't bring to an empty page.
|
|
if not host_info["ipkey"] then
|
|
-- host_info hasn't been generated with Host::lua so we can try and
|
|
-- see if the host is active
|
|
local active_host = interface.getHostInfo(hostinfo2hostkey(host_info))
|
|
if not active_host then
|
|
return false
|
|
end
|
|
end
|
|
else
|
|
-- If the requested page is the "historical" page, or if a ts_schema has been requested,
|
|
-- then we assume page host_details.lua
|
|
-- exists if the timeseries are enabled and if the requested timeseries exists for the host
|
|
if not hostdetails_params["ts_schema"] then
|
|
-- Default schema for hosts
|
|
hostdetails_params["ts_schema"] = "host:traffic"
|
|
end
|
|
|
|
-- A ts_schema has been requested, let's see if it exists
|
|
local ts_utils = require("ts_utils_core")
|
|
local tags = table.merge(host_info, hostdetails_params)
|
|
if not tags["ifid"] then
|
|
tags["ifid"] = interface.getId()
|
|
end
|
|
|
|
if not interfaceHasClickHouseSupport() and not ts_utils.exists(hostdetails_params["ts_schema"], tags) then
|
|
-- If here, the requested schema, along with its hostdetails_params doesn't exist
|
|
return false
|
|
end
|
|
end
|
|
return true
|
|
end
|
|
|
|
-- ##############################################
|
|
|
|
function host_utils.flow2hostinfo(host_info, host_type)
|
|
local host_name
|
|
local res = interface.getHostMinInfo(host_info[host_type .. ".ip"])
|
|
|
|
if ((res == nil) or (res["name"] == nil)) then
|
|
host_name = host_info[host_type .. ".ip"]
|
|
else
|
|
host_name = res["name"]
|
|
end
|
|
|
|
return ({
|
|
host = host_info[host_type .. ".ip"],
|
|
vlan = host_info[host_type .. ".vlan"],
|
|
name = host_name
|
|
})
|
|
end
|
|
|
|
-- ##############################################
|
|
|
|
--
|
|
-- Catch the main information about an host from the host_info table and return the corresponding url.
|
|
-- Example:
|
|
-- hostinfo2url(host_key), return an url based on the host_key
|
|
-- hostinfo2url(host[key]), return an url based on the host value
|
|
-- hostinfo2url(flow[key],"cli"), return an url based on the client host information in the flow table
|
|
-- hostinfo2url(flow[key],"srv"), return an url based on the server host information in the flow table
|
|
--
|
|
|
|
function host_utils.hostinfo2url(host_info, host_type, novlan)
|
|
local rsp = ''
|
|
-- local version = 0
|
|
local version = 1
|
|
|
|
if (host_type == "cli") then
|
|
if (host_info["cli.ip"] ~= nil) then
|
|
rsp = rsp .. 'host=' .. hostinfo2hostkey(host_utils.flow2hostinfo(host_info, "cli"))
|
|
end
|
|
|
|
elseif (host_type == "srv") then
|
|
if (host_info["srv.ip"] ~= nil) then
|
|
rsp = rsp .. 'host=' .. hostinfo2hostkey(host_utils.flow2hostinfo(host_info, "srv"))
|
|
end
|
|
else
|
|
|
|
if ((type(host_info) ~= "table")) then
|
|
host_info = hostkey2hostinfo(host_info)
|
|
end
|
|
|
|
if (host_info["host"] ~= nil) then
|
|
rsp = rsp .. 'host=' .. host_info["host"]
|
|
elseif (host_info["ip"] ~= nil) then
|
|
rsp = rsp .. 'host=' .. host_info["ip"]
|
|
elseif (host_info["mac"] ~= nil) then
|
|
rsp = rsp .. 'host=' .. host_info["mac"]
|
|
-- Note: the host'name' is not supported (not accepted by lint)
|
|
-- elseif(host_info["name"] ~= nil) then
|
|
-- rsp = rsp..'host='..host_info["name"]
|
|
end
|
|
end
|
|
|
|
if (novlan == nil) then
|
|
if ((host_info["vlan"] ~= nil) and (tonumber(host_info["vlan"]) ~= 0)) then
|
|
if (version == 0) then
|
|
rsp = rsp .. '&vlan=' .. tostring(host_info["vlan"])
|
|
elseif (version == 1) then
|
|
rsp = rsp .. '@' .. tostring(host_info["vlan"])
|
|
end
|
|
end
|
|
end
|
|
|
|
return rsp
|
|
end
|
|
|
|
-- ##############################################
|
|
|
|
-- @brief Generates an host_details.lua url (if available)
|
|
-- @param host_info A lua table containing at least keys `host` and `vlan` or a full lua table generated with Host::lua
|
|
-- @param href_params A lua table containing params host_details.lua params, e.g., {page = "historical"}
|
|
-- @param href_check Performs existance checks on the link to avoid generating links to inactive hosts or hosts without timeseries
|
|
-- @return A string containing the url (if available) or an empty string when the url is not available
|
|
function host_utils.hostinfo2detailsurl(host_info, href_params, href_check)
|
|
local res = ''
|
|
|
|
if not href_check or hostdetails_exists(host_info, href_params) then
|
|
local auth = require "auth"
|
|
local url_params = table.tconcat(href_params or {}, "=", "&")
|
|
|
|
-- Alerts pages for the host are in alert_stats.lua (Alerts menu)
|
|
if href_params and href_params.page == "engaged-alerts" then
|
|
if auth.has_capability(auth.capabilities.alerts) then
|
|
res = string.format("%s/lua/alert_stats.lua?page=host&status=engaged&ip=%s%s%s", ntop.getHttpPrefix(),
|
|
hostinfo2hostkey(host_info), consts.SEPARATOR, "eq")
|
|
end
|
|
elseif href_params and href_params.page == "alerts" then
|
|
if auth.has_capability(auth.capabilities.alerts) then
|
|
res = string.format("%s/lua/alert_stats.lua?page=host&status=historical&ip=%s%s%s",
|
|
ntop.getHttpPrefix(), hostinfo2hostkey(host_info), consts.SEPARATOR, "eq")
|
|
end
|
|
-- All other pages are in host_details.lua
|
|
else
|
|
res = string.format("%s/lua/host_details.lua?%s%s%s", ntop.getHttpPrefix(), hostinfo2url(host_info),
|
|
isEmptyString(url_params) and '' or '&', url_params)
|
|
end
|
|
end
|
|
|
|
return res
|
|
end
|
|
|
|
-- ##############################################
|
|
|
|
return host_utils
|