-- -- (C) 2013-24 - ntop.org -- require "lua_utils" local graph_utils = require "graph_utils" local recording_utils = require "recording_utils" local template = require "template_utils" local format_utils = require "format_utils" local master_ifid = interface.getMasterInterfaceId() local info = ntop.getInfo() if((not isAdministrator()) or (not recording_utils.isAvailable())) then return end local record_traffic = false local smart_record_traffic = false local flow_export = false -- POST check if(_SERVER["REQUEST_METHOD"] == "POST") then local snaplen local disk_space local smart_disk_space -- Toggle traffic recording if not isEmptyString(_POST["record_traffic"]) then record_traffic = true ntop.setCache('ntopng.prefs.ifid_'..master_ifid..'.traffic_recording.enabled', "1") else ntop.delCache('ntopng.prefs.ifid_'..master_ifid..'.traffic_recording.enabled') end -- Set BPF filter local bpf_filter = '' if not isEmptyString(_POST["bpf_filter"]) then bpf_filter = _POST["bpf_filter"] end ntop.setCache('ntopng.prefs.ifid_'..master_ifid..'.traffic_recording.bpf_filter', bpf_filter) -- Set capture len snaplen = recording_utils.default_snaplen if not isEmptyString(_POST["snaplen"]) then snaplen = tonumber(_POST["snaplen"]) end ntop.setCache('ntopng.prefs.ifid_'..master_ifid..'.traffic_recording.snaplen', tostring(snaplen)) -- Set disk space disk_space = recording_utils.default_disk_space if not isEmptyString(_POST["disk_space"]) then disk_space = tonumber(_POST["disk_space"])*1024 end ntop.setCache('ntopng.prefs.ifid_'..master_ifid..'.traffic_recording.disk_space', tostring(disk_space)) if ntop.isEnterpriseXL() then -- Toggle smart recording if not isEmptyString(_POST["smart_record_traffic"]) then smart_record_traffic = true ntop.setCache('ntopng.prefs.ifid_'..master_ifid..'.smart_traffic_recording.instance', recording_utils.getN2diskInstanceName(master_ifid)) ntop.setCache('ntopng.prefs.ifid_'..master_ifid..'.smart_traffic_recording.enabled', "1") else ntop.delCache('ntopng.prefs.ifid_'..master_ifid..'.smart_traffic_recording.enabled') ntop.delCache('ntopng.prefs.ifid_'..master_ifid..'.smart_traffic_recording.instance') end interface.updateSmartRecording() -- Set smart disk space smart_disk_space = recording_utils.default_disk_space if not isEmptyString(_POST["smart_disk_space"]) then smart_disk_space = tonumber(_POST["smart_disk_space"])*1024 end ntop.setCache('ntopng.prefs.ifid_'..master_ifid..'.smart_traffic_recording.disk_space', tostring(smart_disk_space)) end if recording_utils.isSupportedZMQInterface(master_ifid) then local ext_ifname if not isEmptyString(_POST["custom_name"]) then -- param check for ifname,_ in pairs(recording_utils.getExtInterfaces(master_ifid, true)) do if ifname == _POST["custom_name"] then ext_ifname = ifname break end end end if ext_ifname ~= nil then ntop.setCache('ntopng.prefs.ifid_'..master_ifid..'.traffic_recording.ext_ifname', ext_ifname) end if not isEmptyString(_POST["flow_export"]) then flow_export = true ntop.setCache('ntopng.prefs.ifid_'..master_ifid..'.traffic_recording_flow_export.enabled', "1") else ntop.delCache('ntopng.prefs.ifid_'..master_ifid..'.traffic_recording_flow_export.enabled') end end -- Configure/start or stop the recording service if record_traffic then local config = {} config.snaplen = snaplen config.max_disk_space = disk_space config.bpf_filter = bpf_filter if ntop.isEnterpriseXL() and smart_record_traffic then config.enable_smart_recording = true config.max_smart_disk_space = smart_disk_space end if recording_utils.isSupportedZMQInterface(master_ifid) and flow_export then config.zmq_endpoint = recording_utils.getZMQProbeAddr(master_ifid) recording_utils.stop(master_ifid) -- stop before starting as the interface can be changed end if recording_utils.createConfig(master_ifid, config) then recording_utils.restart(master_ifid, config) end else recording_utils.stop(master_ifid) end end if ntop.getCache('ntopng.prefs.ifid_'..master_ifid..'.traffic_recording.enabled') == "1" then record_traffic = true if ntop.isEnterpriseXL() and ntop.getCache('ntopng.prefs.ifid_'..master_ifid..'.smart_traffic_recording.enabled') == "1" then smart_record_traffic = true end end if ntop.getCache('ntopng.prefs.ifid_'..master_ifid..'.traffic_recording_flow_export.enabled') == "1" then flow_export = true end local snaplen = ntop.getCache('ntopng.prefs.ifid_'..master_ifid..'.traffic_recording.snaplen') or recording_utils.default_snaplen local bpf_filter = ntop.getCache('ntopng.prefs.ifid_'..master_ifid..'.traffic_recording.bpf_filter') local disk_space = ntop.getCache('ntopng.prefs.ifid_'..master_ifid..'.traffic_recording.disk_space') local smart_disk_space = ntop.getCache('ntopng.prefs.ifid_'..master_ifid..'.smart_traffic_recording.disk_space') local storage_info = recording_utils.storageInfo(master_ifid) local max_space = recording_utils.recommendedSpace(master_ifid, storage_info) -- Compute suggested max disk space max_space = math.floor(max_space/(1024*1024*1024))*1024 if ntop.isEnterpriseXL() then -- Compute recommended values for storage and smart storage if isEmptyString(disk_space) and isEmptyString(smart_disk_space) then disk_space = max_space/2 smart_disk_space = max_space/2 elseif isEmptyString(disk_space) then disk_space = ternary(max_space > tonumber(smart_disk_space), max_space - tonumber(smart_disk_space), 0) elseif isEmptyString(smart_disk_space) then smart_disk_space = ternary(max_space > tonumber(disk_space), max_space - tonumber(disk_space), 0) end smart_disk_space = tostring(math.floor(tonumber(smart_disk_space)/1024)) else -- Compute recommended values for storage only if isEmptyString(disk_space) then disk_space = max_space end end -- Convert disk space to GUI unit disk_space = tostring(math.floor(tonumber(disk_space)/1024)) print("