-- -- (C) 2014-19 - ntop.org -- local dirs = ntop.getDirs() package.path = dirs.installdir .. "/scripts/lua/modules/?.lua;" .. package.path local alerts_api = require "alerts_api" local format_utils = require "format_utils" local user_scripts = require "user_scripts" local ts_utils = require("ts_utils") local flow_callbacks_utils = {} local ifid = interface.getId() -- ############################################## local function printStatsCols(total_stats, cur_elapsed, cur_num_calls, cur_avg_speed) print("".. format_utils.secondsToTime(cur_elapsed) .." (" .. string.format("%.1f", cur_elapsed * 100 / total_stats.tot_elapsed) .. "%)") print("".. format_utils.formatValue(cur_num_calls) .." (" .. string.format("%.1f", cur_num_calls * 100 / total_stats.tot_num_calls) .. "%)") print("".. format_utils.formatValue(round(cur_avg_speed, 0)) .."") end -- ############################################## local function print_callbacks_config_table(descr, expert_view) print[[]] print[[]] print[[]] print[[]] print[[]] if(expert_view) then print[[]] end print[[]] print[[]] print[[]] print[[]] print('\n') local total_stats = { tot_elapsed = 0, tot_num_calls = 0, } local benchmarks = user_scripts.getLastBenchmark(ifid, "flow") -- A user module link is currently required for the total local total_user_module = nil for mod_k, user_script in pairsByKeys(descr.modules, asc) do local hooks_benchmarks = benchmarks[mod_k] or {} -- Calculate the total stats for _, mod_benchmark in pairs(hooks_benchmarks) do total_stats.tot_elapsed = total_stats.tot_elapsed + mod_benchmark["tot_elapsed"] total_stats.tot_num_calls = total_stats.tot_num_calls + mod_benchmark["tot_num_calls"] end end for mod_k, user_script in pairsByKeys(descr.modules, asc) do local hooks_benchmarks = benchmarks[mod_k] or {} local num_hooks = table.len(hooks_benchmarks) local title local description local rowspan = "" if(not total_user_module) then total_user_module = mod_k end if(user_script.gui) then title = i18n(user_script.gui.i18n_title) or user_script.gui.i18n_title description = i18n(user_script.gui.i18n_description) or user_script.gui.i18n_description else title = user_script.key description = "" end if(expert_view and (num_hooks > 0)) then rowspan = string.format(' rowspan="%d"', num_hooks) end local url = '' if(user_script.edition == "community") then local path = string.sub(user_script.source_path, string.len(ntop.getDirs().scriptdir)+1) url = '' end print("") print("") print("") if(expert_view) then if(num_hooks > 0) then local ctr = 0 for mod_fn, mod_benchmark in pairsByKeys(hooks_benchmarks, asc) do print("") local avg_speed = (mod_benchmark["tot_num_calls"] / mod_benchmark["tot_elapsed"]) printStatsCols(total_stats, mod_benchmark["tot_elapsed"], mod_benchmark["tot_num_calls"], avg_speed) ctr = ctr + 1 if(ctr ~= num_hooks) then print("") end end else print("") end else if(num_hooks > 0) then -- Accumulate the stats for each hook local total_duration = 0 local num_calls = 0 for mod_fn, mod_benchmark in pairsByKeys(hooks_benchmarks, asc) do total_duration = total_duration + mod_benchmark["tot_elapsed"] num_calls = num_calls + mod_benchmark["tot_num_calls"] end local avg_speed = (num_calls / total_duration) printStatsCols(total_stats, total_duration, num_calls, avg_speed) else print("") end end end local avg_speed = (total_stats.tot_num_calls / total_stats.tot_elapsed) -- Print total stats print("") end print("") print[[
]] print(i18n("flow_callbacks.callback")) print[[]] print(i18n("chart")) print[[]] print(i18n("flow_callbacks.callback_config")) print[[]] print(i18n("flow_callbacks.callback_function")) print[[]] print(i18n("flow_callbacks.last_duration")) print[[]] print(i18n("flow_callbacks.last_num_calls")) print[[]] print(i18n("flow_callbacks.last_calls_per_sec")) print[[
".. title .." "..url.."
") print(""..description.."
") if(ts_utils.exists("flow_user_script:duration", {ifid=ifid, user_script=mod_k, subdir="flow"})) then print('') end print("") if(user_script.gui and user_script.gui.input_builder) then local conf = user_scripts.getConfiguration(user_script) local k = user_script.key -- TODO remove after implementing the new gui local value = ternary(user_script.gui.post_handler == user_scripts.checkbox_post_handler, conf.enabled, conf.script_conf) print(user_script.gui.input_builder(user_script.gui or {}, k, value)) else print('') end print("".. mod_fn .."
" .. i18n("total") .. "") if(ts_utils.exists("flow_user_script:total_stats", {ifid=ifid, subdir="flow"})) then print('') end print("") if(expert_view) then print("
]] end -- ################################# function flow_callbacks_utils.print_callbacks_config() local show_advanced_prefs = false if(_GET["show_advanced_prefs"] == "1") then show_advanced_prefs = true end local ifid = interface.getId() local descr = user_scripts.load(ifid, user_scripts.script_types.flow, "flow") print [[
]] if table.len(_POST) > 0 then user_scripts.handlePOST("flow", descr) end print[[
]] print_callbacks_config_table(descr, show_advanced_prefs) print[[]] print[[]] print[[
]] print[[
]] local cls_on = "btn btn-sm" local cls_off = cls_on if show_advanced_prefs then cls_on = cls_on..' btn-primary active' cls_off = cls_off..' btn-secondary' else cls_on = cls_on..' btn-secondary' cls_off = cls_off..' btn-primary active' end print('') print('') print[[
]] print("
" .. i18n("flow_callbacks.notes") .. ":
") end return flow_callbacks_utils