ntopng/scripts/lua/modules/dhcp_server_utils.lua
2026-01-19 16:23:53 +01:00

123 lines
4.1 KiB
Lua

--
-- (C) 2013-26 - ntop.org
--
require "ntop_utils"
local sys_utils = require "sys_utils"
local dhcp_enabled_key = "ntopng.nedge.dhcp.kea.enabled"
local dhcp_server_utils = {}
-- ###############################################################
-- Cached module (check once)
local cached_module = nil
-- ###############################################################
-- @brief Check if a systemd service exists
-- @param service_name The name of the systemd service
-- @return true if the service exists, false otherwise
local function serviceExists(service_name)
local cmd = "systemctl list-unit-files " .. service_name .. ".service 2>/dev/null | grep -q " .. service_name
local result = sys_utils.execShellCmd(cmd .. " && echo 'exists'")
return not isEmptyString(result)
end
-- ###############################################################
-- Detect which DHCP server is available on the system and return
-- the appropriate DHCP server module (kea_dhcp_server or isc_dhcp_server)
function dhcp_server_utils.getDhcpServerHandler()
if cached_module then
return cached_module
end
local kea_service = "kea-dhcp4-server"
local kea_service_alias = "isc-kea-dhcp4-server"
local isc_service = "isc-dhcp-server"
-- Check if kea-dhcp4-server systemd service exists
local kea_exists = serviceExists(kea_service)
if not kea_exists then
-- Try with the service alias (this depends on version)
kea_service = kea_service_alias
kea_exists = serviceExists(kea_service)
end
if kea_exists then
traceError(TRACE_INFO, TRACE_CONSOLE, "Using Kea DHCP server")
cached_module = require "conf_handlers.kea_dhcp_server"
cached_module.service_name = kea_service
else
traceError(TRACE_INFO, TRACE_CONSOLE, "Using ISC DHCP server")
cached_module = require "conf_handlers.isc_dhcp_server"
cached_module.service_name = isc_service
end
return cached_module
end
-- ###############################################################
function dhcp_server_utils.getDhcpServerName()
local dhcp_handler = dhcp_server_utils.getDhcpServerHandler()
return dhcp_handler.service_name
end
-- ###############################################################
-- This function is used to check if the DHCP server status is up
-- and if not, restart it.
function dhcp_server_utils.checkRestartDHCPService()
if ntop.isnEdge() then
local dhcp_handler = dhcp_server_utils.getDhcpServerHandler()
if (ntop.getCache(dhcp_enabled_key) or '0') == '1' then
if not sys_utils.isActiveService(dhcp_handler.service_name) then
sys_utils.restartService(dhcp_handler.service_name)
end
end
end
end
-- ###############################################################
-- This function is used to start the DHCP server
function dhcp_server_utils.startDHCPService()
if ntop.isnEdge() then
local dhcp_handler = dhcp_server_utils.getDhcpServerHandler()
ntop.setCache(dhcp_enabled_key, '1')
sys_utils.enableService(dhcp_handler.service_name)
sys_utils.restartService(dhcp_handler.service_name)
end
end
-- ###############################################################
-- This function is used to stop the DHCP server
function dhcp_server_utils.stopDHCPService()
if ntop.isnEdge() then
local dhcp_handler = dhcp_server_utils.getDhcpServerHandler()
ntop.setCache(dhcp_enabled_key, '0')
sys_utils.disableService(dhcp_handler.service_name)
sys_utils.stopService(dhcp_handler.service_name)
end
end
-- ###############################################################
-- @brief Write DHCP server configuration
-- @param dhcp_config The DHCP server configuration table
-- @param all_interfaces Table mapping interface names to roles (lan/wan)
-- @param dns_config The DNS configuration table with global and secondary DNS
-- @return true on success, false on error
function dhcp_server_utils.writeDhcpServerConfiguration(dhcp_config, all_interfaces, dns_config)
local dhcp_handler = dhcp_server_utils.getDhcpServerHandler()
return dhcp_handler.writeDhcpServerConfiguration(dhcp_config, all_interfaces, dns_config)
end
-- ###############################################################
return dhcp_server_utils