ntopng/scripts/callbacks/system/startup.lua
emanuele-f 139a16ffe3 Fix protocol categories association lost after reboot
After the recent changes, there is only one global nDPI struct which
is share across all the interfaces. However, the struct can be swapped
during normal operating, so it's necessary to reload the associations
every time a new nDPI struct is allocated.

Fixes #3139
2019-12-19 15:11:21 +01:00

202 lines
6.6 KiB
Lua

--
-- (C) 2013-18 - ntop.org
--
--
-- This script is executed once at startup similar to /etc/rc.local on Unix
--
local dirs = ntop.getDirs()
package.path = dirs.installdir .. "/scripts/lua/modules/?.lua;" .. package.path
if(ntop.isPro()) then
package.path = dirs.installdir .. "/pro/scripts/callbacks/system/?.lua;" .. package.path
require("startup")
end
require "lua_utils"
-- Important: load this before any other alert related module
local plugins_utils = require "plugins_utils"
plugins_utils.loadPlugins()
require "alert_utils"
local discover_utils = require "discover_utils"
local host_pools_utils = require "host_pools_utils"
local os_utils = require "os_utils"
local lists_utils = require "lists_utils"
local recovery_utils = require "recovery_utils"
local delete_data_utils = require "delete_data_utils"
local ts_utils = require "ts_utils"
local user_scripts = require("user_scripts")
local presets_utils = require "presets_utils"
local prefs = ntop.getPrefs()
host_pools_utils.initPools()
if(ntop.isPro()) then
shaper_utils = require "shaper_utils"
shaper_utils.initShapers()
end
-- Load the default user scripts configuration
user_scripts.loadDefaultConfig()
-- Use a specific bridging_policy_target_type default for previous user installations
if isEmptyString(ntop.getPref("ntopng.prefs.bridging_policy_target_type")) then
for _, ifname in pairs(interface.getIfNames()) do
local ifid = getInterfaceId(ifname)
interface.select(ifname)
local stats = interface.getStats()
if stats.inline then
-- Override the default
ntop.setPref("ntopng.prefs.bridging_policy_target_type", "both")
break
end
end
end
-- ##################################################################
-- Migration from old ntop auth_type to new separeted keys
local old_auth_val = ntop.getPref("ntopng.prefs.auth_type")
local new_local_auth = ntop.getPref("ntopng.prefs.local.auth_enabled")
local new_ldap_auth = ntop.getPref("ntopng.prefs.ldap.auth_enabled")
if((not isEmptyString(old_auth_val)) and isEmptyString(new_ldap_auth) and isEmptyString(new_local_auth)) then
if old_auth_val == "ldap" then
ntop.setPref("ntopng.prefs.local.auth_enabled", "0")
ntop.setPref("ntopng.prefs.ldap.auth_enabled", "1")
elseif old_auth_val == "ldap_local" then
ntop.setPref("ntopng.prefs.local.auth_enabled", "1")
ntop.setPref("ntopng.prefs.ldap.auth_enabled", "1")
end
end
-- ##################################################################
local has_pcap_dump_interface = false
local function cleanupIfname(ifname)
interface.select(ifname)
local ifid = getInterfaceId(ifname)
if interface.isPcapDumpInterface() then
has_pcap_dump_interface = true
end
local alerts_status_path = os_utils.fixPath(dirs.workingdir .. "/" .. ifid .. "/json/")
ntop.rmdir(alerts_status_path)
-- Remove the active devices and pools keys
deleteActiveDevicesKey(ifid)
deleteActivePoolsKey(ifid)
-- Remove network discovery request on startup
discover_utils.clearNetworkDiscovery(ifid)
-- Note: we do not delete this as quotas are persistent across ntopng restart
--deletePoolsQuotaExceededItemsKey(ifid)
-- Clean old InfluxDB export cache
local export_dir = os_utils.fixPath(dirs.workingdir .. "/".. ifid .."/ts_export")
ntop.rmdir(export_dir)
end
-- Remove the json dumps previously needed for alerts generation
for _, ifname in pairs(interface.getIfNames()) do
cleanupIfname(ifname)
end
cleanupIfname(getSystemInterfaceName())
-- Also flush the export queue
ntop.delCache("ntopng.influx_file_queue")
-- ##################################################################
-- Check remote assistance expiration
local remote_assistance = require "remote_assistance"
remote_assistance.checkAvailable()
remote_assistance.checkExpiration()
-- ##################################################################
local recording_utils = require "recording_utils"
recording_utils.checkAvailable()
-- ##################################################################
local companion_interface_utils = require "companion_interface_utils"
companion_interface_utils.initCompanions()
-- ##################################################################
lists_utils.clearErrors()
lists_utils.downloadLists()
lists_utils.reloadLists()
-- Need to do the actual reload also here as otherwise some
-- flows may be misdetected until housekeeping.lua is executed
lists_utils.checkReloadLists()
-- ##################################################################
-- Initialize device policies (presets)
-- NOTE: Must go after lists_utils initialization and reload
-- as new custom protocols can be set by lists utils
presets_utils.init()
presets_utils.reloadAllDevicePolicies()
-- TODO: migrate custom re-arm settings
-- this will retrieve host pools and policers configurtions via HTTP if enabled
if ntop.isnEdge() then
local http_bridge_conf_utils = require "http_bridge_conf_utils"
http_bridge_conf_utils.configureBridge()
end
processAlertNotifications(os.time(), 0, true --[[ force ]])
notify_ntopng_start()
if not recovery_utils.check_clean_shutdown() then
package.path = dirs.installdir .. "/scripts/callbacks/system/?.lua;" .. package.path
require("recovery")
end
recovery_utils.unmark_clean_shutdown()
-- Need to run setup at startup since the schemas may be changed
ts_utils.setupAgain()
-- Migrate "iface:ndpi_categories" under the correct folder
if(ntop.getCache("ntopng.cache.rrd_category_migration") ~= "1") then
for ifid, ifname in pairs(delete_data_utils.list_all_interfaces()) do
ntop.mkdir(dirs.workingdir .. "/" .. ifid .. "/rrd/ndpi_categories")
for cat_name, cat_id in pairs(interface.getnDPICategories()) do
local old_path = os_utils.fixPath(dirs.workingdir .. "/" .. ifid .. "/rrd/"..cat_name..".rrd")
if ntop.exists(old_path) then
local new_path = os_utils.fixPath(dirs.workingdir .. "/" .. ifid .. "/rrd/ndpi_categories/"..cat_name..".rrd")
traceError(TRACE_INFO, TRACE_CONSOLE, "Migrating Category RRD: " .. old_path)
os.rename(old_path, new_path)
end
end
end
-- do not perform migration again
ntop.setCache("ntopng.cache.rrd_category_migration", "1")
end
if(has_pcap_dump_interface) then
-- Load the lists at the very beginning in order to avoid misclassification
-- when reading from PCAP dump. This can take some time.
traceError(TRACE_NORMAL, TRACE_CONSOLE, "Loading category lists...")
lists_utils.checkReloadLists()
traceError(TRACE_NORMAL, TRACE_CONSOLE, "Loading category lists done")
end
-- Show the warning at most 1 time per run
ntop.delCache("ntopng.cache.rrd_format_change_warning_shown")