1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
|
--
-- (C) 2020-22 - ntop.org
--
--
-- This module implements the ICMP probe.
--
local do_trace = false
-- #################################################################
-- This is the script state, which must be manually cleared in the check
-- function. Can be then used in the collect_results function to match the
-- probe requests with probe replies.
local am_hosts = {}
local resolved_hosts = {}
-- #################################################################
-- The function called periodically to send the host probes.
-- measurement is `icmp`
-- hosts contains the list of hosts to probe, The table keys are
-- the hosts identifiers, whereas the table values contain host information
-- see (am_utils.key2host for the details on such format).
local function check_oneshot(measurement, hosts, granularity)
local plugins_utils = require("plugins_utils")
local am_utils = require "am_utils"
am_hosts[measurement] = {}
resolved_hosts[measurement] = {}
for key, host in pairs(hosts) do
local domain_name = host.host
local ip_address = am_utils.resolveHost(domain_name)
local ifname = host.ifname
if do_trace then
print("["..measurement.."] Pinging address "..tostring(ip_address).."/"..domain_name.."\n")
end
if not ip_address then
goto continue
end
-- ICMP results are retrieved in batch (see below ntop.collectPingResults)
ntop.pingHost(ip_address, isIPv6(ip_address), false --[[ one shot ICMP]], ifname)
am_hosts[measurement][ip_address] = key
resolved_hosts[measurement][key] = {
resolved_addr = ip_address,
}
::continue::
end
end
-- #################################################################
-- @brief Async ping
local function check_icmp_oneshot(hosts, granularity)
if do_trace then
print("[check_icmp_oneshot] "..granularity.."\n")
end
check_oneshot("icmp", hosts, granularity)
end
-- #################################################################
-- The function responsible for collecting the results.
-- measurement is `icmp`
-- It must return a table containing a list of hosts along with their retrieved
-- measurement. The keys of the table are the host key. The values have the following format:
-- table
-- resolved_addr: (optional) the resolved IP address of the host
-- value: (optional) the measurement numeric value. If unspecified, the host is still considered unreachable.
local function collect_oneshot(measurement, granularity)
-- Collect possible ICMP results
local res = ntop.collectPingResults(false)
for host, value in pairs(res or {}) do
local key = am_hosts[measurement][host]
if(do_trace) then
print("["..measurement.."] Reading ICMP response for host ".. host .."\n")
print("["..measurement.."] value: ".. value .." key: "..(key or "nil").."\n")
end
if resolved_hosts[measurement][key] then
-- Report the host as reachable with its value
resolved_hosts[measurement][key].value = tonumber(value)
end
end
-- NOTE: unreachable hosts can still be reported in order to properly
-- display their resolved address
return resolved_hosts[measurement]
end
-- #################################################################
-- @brief Collect async ping results (ipv4 icmp)
local function collect_icmp_oneshot(granularity)
if do_trace then
print("[collect_icmp_oneshot] "..granularity.."\n")
end
return collect_oneshot("icmp", granularity)
end
-- #################################################################
local function check_icmp_available()
return(ntop.isPingAvailable())
end
-- #################################################################
return {
-- Defines a list of measurements implemented by this script.
-- The probing logic is implemented into the check() and collect_results().
--
-- Here is how the probing occurs:
-- 1. The check function is called with the list of hosts to probe. Ideally this
-- call should not block (e.g. should not wait for the results)
-- 2. The active_monitoring.lua code sleeps for some seconds
-- 3. The collect_results function is called. This should retrieve the results
-- for the hosts checked in the check() function and return the results.
--
-- The alerts for non-responding hosts and the Active Monitoring timeseries are automatically
-- generated by active_monitoring.lua . The timeseries are saved in the following schemas:
-- "am_host:val_min", "am_host:val_5mins", "am_host:val_hour".
measurements = {
{
-- The unique key for the measurement
key = "icmp",
-- The localization string for this measurement
i18n_label = "icmp",
-- The function called periodically to send the host probes
check = check_icmp_oneshot,
-- The function responsible for collecting the results
collect_results = collect_icmp_oneshot,
-- The granularities allowed for the probe. See supported_granularities in active_monitoring.lua
granularities = {"min", "5mins", "hour"},
-- The localization string for the measurement unit (e.g. "ms", "Mbits")
i18n_unit = "active_monitoring_stats.msec",
-- The localization string for the Jitter unit (e.g. "ms", "Mbits")
i18n_jitter_unit = nil,
-- The localization string for the Active Monitoring timeseries menu entry
i18n_am_ts_label = "graphs.num_ms_rtt",
-- The operator to use when comparing the measurement with the threshold, "gt" for ">" or "lt" for "<".
operator = "gt",
-- If set, indicates a maximum threshold value
max_threshold = 10000,
-- If set, indicates the default threshold value
default_threshold = nil,
-- A list of additional timeseries (the am_host:val_* is always shown) to show in the charts.
-- See https://www.ntop.org/guides/ntopng/api/timeseries/adding_new_timeseries.html#charting-new-metrics .
additional_timeseries = {},
-- Js function to call to format the measurement value. See ntopng_utils.js .
value_js_formatter = "NtopUtils.fmillis",
-- The raw measurement value is multiplied by this factor before being written into the chart
chart_scaling_value = 1,
-- The localization string for the Active Monitoring metric in the chart
i18n_am_ts_metric = "flow_details.round_trip_time",
-- A list of additional notes (localization strings) to show into the timeseries charts
i18n_chart_notes = {},
-- If set, the user cannot change the host
force_host = nil,
-- An alternative localization string for the unrachable alert message
unreachable_alert_i18n = nil,
},
},
-- A setup function to possibly disable the plugin
setup = check_icmp_available,
}
|