ntopng/scripts/callbacks/system/snmp_device.lua

152 lines
5.1 KiB
Lua

--
-- (C) 2019-20 - ntop.org
--
local dirs = ntop.getDirs()
package.path = dirs.installdir .. "/scripts/lua/modules/?.lua;" .. package.path
package.path = dirs.installdir .. "/scripts/lua/modules/pools/?.lua;" .. package.path
require "lua_utils"
local alert_utils = require "alert_utils"
local snmp_device_pools = require "snmp_device_pools"
local snmp_utils = require "snmp_utils"
local snmp_consts = require "snmp_consts"
local alerts_api = require("alerts_api")
local user_scripts = require("user_scripts")
local alert_consts = require("alert_consts")
local snmp_config = require "snmp_config"
local snmp_cached_dev = require "snmp_cached_dev"
local do_benchmark = true -- Compute benchmarks and store their results
local do_print_benchmark = false -- Print benchmarks results to standard output
local do_trace = false -- Trace lua calls
local config_alerts = nil
local available_modules = nil
local ifid = nil
local confisets = nil
local pools_instance = nil
local snmp_device_entity = alert_consts.alert_entities.snmp_device.entity_id
-- The function below ia called once (#pragma once)
function setup(str_granularity)
if do_trace then print("alert.lua:setup("..str_granularity..") called\n") end
interface.select(getSystemInterfaceId())
ifid = interface.getId()
local ifname = getInterfaceName(tostring(ifid))
-- Load the threshold checking functions
available_modules = user_scripts.load(ifid, user_scripts.script_types.snmp_device, "snmp_device", {
do_benchmark = do_benchmark,
})
configsets = user_scripts.getConfigsets()
-- Instance of snmp device pools to get assigned members
pools_instance = snmp_device_pools:create()
end
-- #################################################################
-- The function below ia called once (#pragma once)
function teardown(str_granularity)
if(do_trace) then print("alert.lua:teardown("..str_granularity..") called\n") end
user_scripts.teardown(available_modules, do_benchmark, do_print_benchmark)
end
-- #################################################################
local cur_granularity
local function snmp_device_run_user_scripts(cached_device)
local granularity = cur_granularity
local device_ip = cached_device["host_ip"]
local snmp_device_entity = alerts_api.snmpDeviceEntity(device_ip)
local all_modules = available_modules.modules
local now = os.time()
now = now - now % 300
local info = {
granularity = granularity,
alert_entity = snmp_device_entity,
user_script = check,
cached_device = cached_device,
now = now,
}
-- Retrieve the confset_id (possibly) associated to this snmp device
local confset_id = pools_instance:get_configset_id(device_ip)
-- Retrieve the configuration associated to the confset_id
local device_conf = user_scripts.getConfigById(configsets, confset_id, "snmp_device")
-- Run callback for each device
for mod_key, hook_fn in pairs(available_modules.hooks["snmpDevice"] or {}) do
local script = all_modules[mod_key]
local conf = user_scripts.getTargetHookConfig(device_conf, script)
if(conf.enabled) then
alerts_api.invokeScriptHook(script, confset_id, hook_fn, device_ip, info, conf)
end
end
-- Run callback for each interface
for mod_key, hook_fn in pairs(available_modules.hooks["snmpDeviceInterface"] or {}) do
local script = all_modules[mod_key]
local conf = user_scripts.getTargetHookConfig(device_conf, script)
-- For each interface of the current device...
for snmp_interface_index, snmp_interface in pairs(cached_device.interfaces) do
local if_type = snmp_consts.snmp_iftype(snmp_interface.type)
if(script.skip_virtual_interfaces and
((if_type == "propVirtual") or (if_type == "softwareLoopback"))) then
goto continue
end
if(conf.enabled) then
local iface_entity = alerts_api.snmpDeviceEntity(device_ip) -- Use the same entity as for the global device
-- Augment data with counters and status
snmp_interface["if_counters"] = cached_device.if_counters[snmp_interface_index]
snmp_interface["bridge"] = cached_device.bridge[snmp_interface_index]
alerts_api.invokeScriptHook(script, confset_id, hook_fn, device_ip, snmp_interface_index, table.merge(snmp_interface, {
granularity = granularity,
alert_entity = iface_entity,
user_script = script,
conf = conf.script_conf,
now = now,
}))
end
::continue::
end
end
return true
end
-- #################################################################
-- The function below is called once per local snmp_device
function runScripts(granularity)
cur_granularity = granularity
if(table.empty(available_modules.hooks)) then
-- Nothing to do
return
end
-- NOTE: don't use foreachSNMPDevice, we want to get all the SNMP
-- devices, not only the active ones, without changing the device state
local snmpdevs = snmp_config.get_all_configured_devices()
for device_ip, device in pairs(snmpdevs) do
local cached_device = snmp_cached_dev:create(device_ip)
if cached_device then
snmp_device_run_user_scripts(cached_device)
end
end
end