mirror of
https://github.com/ntop/ntopng.git
synced 2026-04-30 07:59:35 +00:00
141 lines
4.2 KiB
Lua
141 lines
4.2 KiB
Lua
--
|
|
-- (C) 2019-24 - ntop.org
|
|
--
|
|
local dirs = ntop.getDirs()
|
|
package.path = dirs.installdir .. "/scripts/lua/modules/?.lua;" .. package.path
|
|
|
|
require "http_lint"
|
|
local am_utils = require "am_utils"
|
|
local auth = require "auth"
|
|
local rest_utils = require "rest_utils"
|
|
|
|
-- ################################################
|
|
|
|
local action = _POST["action"]
|
|
local host = _POST["host"]
|
|
local measurement = _POST["measurement"]
|
|
local ifname = _POST["ifname"]
|
|
|
|
local res = {}
|
|
|
|
local function isValidHostMeasurementCombination(host, measurement)
|
|
-- Strips the prefix (either http:// or https://) and a possible port
|
|
|
|
-- Extract the domain, e.g.,
|
|
-- http://user:password@www.example.com/p1/p2 becomes www.example.com
|
|
-- http://www.example.com:3000/p1/p2 becomes www.example.com
|
|
|
|
-- See if domain has user and password encoded, i.e.,
|
|
-- http://user:password@www.example.com becomes www.example.com
|
|
local domain = host:match('^%w+://[^:]+:[^@]+@([^/:]+)')
|
|
|
|
if not domain then
|
|
-- Domain has no user and password encoded, i.e.,
|
|
-- http://www.example.com:3000/p1/p2
|
|
domain = host:match('^%w+://([^/:]+)')
|
|
end
|
|
|
|
-- Take the domain (if found) or the host as-is
|
|
host = domain or host
|
|
|
|
local host_v4 = isIPv4(host)
|
|
local host_v6 = isIPv6(host)
|
|
|
|
if not host_v4 and not host_v6 then
|
|
-- Host is a domain, try to resolve it as ipv4, then ipv6
|
|
if ntop.resolveHost(host, true) then
|
|
-- Valid Host
|
|
return (true)
|
|
elseif ntop.resolveHost(host, false) then
|
|
-- Valid Host
|
|
return (true)
|
|
else
|
|
res.result = i18n('active_monitoring_stats.invalid_host')
|
|
return (false)
|
|
end
|
|
end
|
|
|
|
return (true)
|
|
end
|
|
|
|
-- ################################################
|
|
|
|
if isEmptyString(action) then
|
|
res.result = i18n('active_monitoring_stats.empty_action')
|
|
rest_utils.answer(rest_utils.consts.success.ok, res)
|
|
return
|
|
end
|
|
|
|
-- ################################################
|
|
|
|
if isEmptyString(host) then
|
|
res.result = i18n("missing_x_parameter", {
|
|
param = 'Host'
|
|
})
|
|
rest_utils.answer(rest_utils.consts.success.ok, res)
|
|
return
|
|
end
|
|
|
|
-- ################################################
|
|
|
|
if isEmptyString(measurement) then
|
|
res.result = i18n("missing_x_parameter", {
|
|
param = 'Measurement'
|
|
})
|
|
rest_utils.answer(rest_utils.consts.success.ok, res)
|
|
return
|
|
end
|
|
|
|
-- ################################################
|
|
|
|
if not auth.has_capability(auth.capabilities.active_monitoring) then
|
|
res.result = i18n("not_admin")
|
|
rest_utils.answer(rest_utils.consts.success.ok, res)
|
|
return
|
|
end
|
|
|
|
-- ################################################
|
|
|
|
if not isValidHostMeasurementCombination(host, measurement) then
|
|
rest_utils.answer(rest_utils.consts.success.ok, res)
|
|
return
|
|
end
|
|
|
|
-- ################################################
|
|
|
|
local url = am_utils.formatAmHost(host, measurement)
|
|
if (action == "add") then
|
|
local threshold = _POST["threshold"]
|
|
local granularity = _POST["granularity"]
|
|
|
|
-- If already existing simply do not add the host
|
|
if not am_utils.hasHost(host, measurement) then
|
|
am_utils.addHost(host, ifname, measurement, threshold, granularity)
|
|
end
|
|
|
|
res.result = 'ok'
|
|
elseif (action == "edit") then
|
|
local threshold = _POST["threshold"]
|
|
local granularity = _POST["granularity"]
|
|
local old_am_host = _POST["old_host"]
|
|
local old_measurement = _POST["old_measurement"]
|
|
local old_granularity = _POST["old_granularity"]
|
|
local old_url = am_utils.formatAmHost(old_am_host, old_measurement)
|
|
|
|
if am_utils.getHost(old_am_host, old_measurement) then
|
|
if ((old_am_host ~= host) or (old_measurement ~= measurement)) then
|
|
-- The key has changed, delete the old host and create a new one
|
|
am_utils.deleteHost(old_am_host, old_measurement) -- also calls discardHostTimeseries
|
|
am_utils.addHost(host, ifname, measurement, threshold, granularity)
|
|
else
|
|
-- The key is the same, only update its settings
|
|
am_utils.editHost(host, ifname, measurement, threshold, granularity)
|
|
end
|
|
end
|
|
|
|
res.result = 'ok'
|
|
end
|
|
|
|
-- ################################################
|
|
|
|
rest_utils.answer(rest_utils.consts.success.ok, res)
|