mirror of
https://github.com/ntop/ntopng.git
synced 2026-05-09 07:39:03 +00:00
Plugins are a convenient way to group together related lua scripts. Their primary use case is to group user scripts and their alert/status definition. The builtin ntopng user scripts and definitions are now packed into plugins directories. In future, we will support loading of user created plugins. Plugins are loaded at startup into some runtime directories and then used. Other changes provided by this commit include: - Add sample flow logger plugin - Initial support for system user scripts - Rename edge to threshold - Migrate system probes to user scripts/plugins - Migrate scripts to more explicit alerts_api.checkThresholdAlert api
689 lines
27 KiB
Lua
689 lines
27 KiB
Lua
--
|
|
-- (C) 2013-19 - ntop.org
|
|
--
|
|
|
|
local dirs = ntop.getDirs()
|
|
package.path = dirs.installdir .. "/scripts/lua/modules/?.lua;" .. package.path
|
|
if((dirs.scriptdir ~= nil) and (dirs.scriptdir ~= "")) then package.path = dirs.scriptdir .. "/lua/modules/?.lua;" .. package.path end
|
|
require "lua_utils"
|
|
local alerts_api = require("alerts_api")
|
|
local recording_utils = require "recording_utils"
|
|
local remote_assistance = require "remote_assistance"
|
|
local telemetry_utils = require "telemetry_utils"
|
|
local ts_utils = require("ts_utils_core")
|
|
|
|
local is_admin = isAdministrator()
|
|
|
|
print[[
|
|
<script>
|
|
/* Some localization strings to pass from lua to javacript */
|
|
var i18n = {
|
|
"no_results_found": "]] print(i18n("no_results_found")) print[[",
|
|
"change_number_of_rows": "]] print(i18n("change_number_of_rows")) print[[",
|
|
"no_data_available": "]] print(i18n("no_data_available")) print[[",
|
|
"showing_x_to_y_rows": "]] print(i18n("showing_x_to_y_rows", {x="{0}", y="{1}", tot="{2}"})) print[[",
|
|
"actions": "]] print(i18n("actions")) print[[",
|
|
"query_was_aborted": "]] print(i18n("graphs.query_was_aborted")) print[[",
|
|
"exports": "]] print(i18n("system_stats.exports_label")) print[[",
|
|
};
|
|
|
|
var http_prefix = "]] print(ntop.getHttpPrefix()) print[[";
|
|
</script>]]
|
|
|
|
if ntop.isnEdge() then
|
|
dofile(dirs.installdir .. "/pro/scripts/lua/nedge/inc/menu.lua")
|
|
return
|
|
end
|
|
|
|
local template = require "template_utils"
|
|
|
|
prefs = ntop.getPrefs()
|
|
local iface_names = interface.getIfNames()
|
|
|
|
-- tprint(iface_names)
|
|
|
|
num_ifaces = 0
|
|
for k,v in pairs(iface_names) do
|
|
num_ifaces = num_ifaces+1
|
|
end
|
|
|
|
-- Adding main container div for the time being
|
|
--print("<div class=\"container\">")
|
|
print("<div class=\"\" style=\"margin: 20px\">")
|
|
|
|
print [[
|
|
<div class="masthead">
|
|
<ul class="nav nav-pills float-right">
|
|
]]
|
|
|
|
|
|
|
|
interface.select(ifname)
|
|
local ifs = interface.getStats()
|
|
local is_pcap_dump = interface.isPcapDumpInterface()
|
|
local is_packet_interface = interface.isPacketInterface()
|
|
ifId = ifs.id
|
|
|
|
-- ##############################################
|
|
-- Dashboard
|
|
|
|
if not is_pcap_dump then
|
|
if(active_page == "dashboard") then
|
|
print [[ <li class="nav-item dropdown active">
|
|
<a class="nav-link dropdown-toggle active" data-toggle="dropdown" href="#">
|
|
]]
|
|
else
|
|
print [[ <li class="dropdown">
|
|
<a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#">
|
|
]]
|
|
end
|
|
|
|
print [[
|
|
<i class="fa fa-tachometer-alt fa-lg"></i> <b class="caret"></b>
|
|
</a>
|
|
|
|
<ul class="dropdown-menu">
|
|
<li class="nav-item"><a class="dropdown-item" href="]]
|
|
|
|
print(ntop.getHttpPrefix())
|
|
if ntop.isPro() then
|
|
print("/lua/pro/dashboard.lua")
|
|
else
|
|
print("/lua/index.lua")
|
|
end
|
|
|
|
print [["><i class="fa fa-tachometer-alt"></i> ]] print(i18n("dashboard.traffic_dashboard")) print[[</a></li>]]
|
|
|
|
if(interface.isDiscoverableInterface()) then
|
|
print('<li class="nav-item"><a class="dropdown-item" href="'..ntop.getHttpPrefix()..'/lua/discover.lua"><i class="fa fa-lightbulb"></i> ') print(i18n("prefs.network_discovery")) print('</a></li>')
|
|
end
|
|
|
|
if(ntop.isPro()) then
|
|
print('<li class="nav-item"><a class="dropdown-item" href="'..ntop.getHttpPrefix()..'/lua/pro/report.lua"><i class="fa fa-chart-area"></i> ') print(i18n("report.traffic_report")) print('</a></li>')
|
|
end
|
|
|
|
if ntop.isPro() and prefs.is_dump_flows_to_mysql_enabled and not ifs.isViewed then
|
|
print('<li class="dropdown-divider"></li>')
|
|
print('<li class="nav-item"><a class="dropdown-item" href="'..ntop.getHttpPrefix()..'/lua/pro/db_explorer.lua?ifid='..ifId..'"><i class="fa fa-history"></i> ') print(i18n("db_explorer.historical_data_explorer")) print('</a></li>')
|
|
end
|
|
|
|
|
|
print [[
|
|
</ul>
|
|
]]
|
|
end
|
|
|
|
-- ##############################################
|
|
-- Alerts
|
|
|
|
if ntop.getPrefs().are_alerts_enabled == true then
|
|
local active = ""
|
|
local style = ""
|
|
local color = ""
|
|
|
|
-- if alert_cache["num_alerts_engaged"] > 0 then
|
|
-- color = 'style="color: #B94A48;"' -- bootstrap danger red
|
|
-- end
|
|
|
|
if not ifs["has_alerts"] and not alerts_api.hasEntitiesWithAlertsDisabled(ifId) then
|
|
style = ' style="display: none;"'
|
|
end
|
|
|
|
if active_page == "alerts" then
|
|
active = ' active'
|
|
end
|
|
|
|
-- local color = "#F0AD4E" -- bootstrap warning orange
|
|
print [[
|
|
<li class="nav-item dropdown]] print(active) print[[" id="alerts-id"]] print(style) print[[>
|
|
<a class="nav-link dropdown-toggle]] print(active) print[[" data-toggle="dropdown" href="#">
|
|
<i class="fa fa-exclamation-triangle fa-lg "]] print(color) print[["></i> <b class="caret"></b>
|
|
</a>
|
|
<ul class="dropdown-menu">
|
|
<li class="nav-item">
|
|
<a class="dropdown-item" href="]]
|
|
print(ntop.getHttpPrefix())
|
|
print [[/lua/show_alerts.lua">
|
|
<i class="fa fa-exclamation-triangle" id="alerts-menu-triangle"></i> ]] print(i18n("show_alerts.detected_alerts")) print[[
|
|
</a>
|
|
</li>
|
|
]]
|
|
if ntop.isEnterprise() then
|
|
print[[
|
|
<li class="nav-item">
|
|
<a class="dropdown-item" href="]]
|
|
print(ntop.getHttpPrefix())
|
|
print[[/lua/pro/enterprise/alerts_dashboard.lua"><i class="fa fa-tachometer-alt"></i> ]] print(i18n("alerts_dashboard.alerts_dashboard")) print[[
|
|
</a>
|
|
</li>
|
|
<li class="dropdown-divider"></li>
|
|
<li class="nav-item"><a class="dropdown-item" href="]] print(ntop.getHttpPrefix())
|
|
print[[/lua/pro/enterprise/flow_alerts_explorer.lua"><i class="fa fa-history"></i> ]] print(i18n("flow_alerts_explorer.label")) print[[
|
|
</a>
|
|
</li>
|
|
]]
|
|
end
|
|
|
|
print[[
|
|
</ul>
|
|
</li>
|
|
]]
|
|
end
|
|
|
|
-- ##############################################
|
|
-- Flows
|
|
|
|
url = ntop.getHttpPrefix().."/lua/flows_stats.lua"
|
|
|
|
if(active_page == "flows") then
|
|
print('<li class="nav-item active"><a class="nav-link active" href="'..url..'">') print(i18n("flows")) print('</a></li>')
|
|
else
|
|
print('<li class="nav-item"><a class="nav-link" href="'..url..'">') print(i18n("flows")) print('</a></li>')
|
|
end
|
|
|
|
-- ##############################################
|
|
-- Hosts
|
|
|
|
if not ifs.isViewed then -- Currently, hosts are not kept for viewed interfaces, only for their view
|
|
if active_page == "hosts" then
|
|
print [[ <li class="nav-item dropdown active">
|
|
<a class="nav-link dropdown-toggle active" data-toggle="dropdown" href="#">
|
|
]]
|
|
else
|
|
print [[ <li class="nav-item dropdown">
|
|
<a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#">
|
|
]]
|
|
end
|
|
|
|
print(i18n("flows_page.hosts")) print[[ <b class="caret"></b>
|
|
</a>
|
|
<ul class="dropdown-menu">
|
|
<li class="nav-item"><a class="dropdown-item" href="]]
|
|
print(ntop.getHttpPrefix())
|
|
print [[/lua/hosts_stats.lua">]] print(i18n("flows_page.hosts")) print[[</a></li>
|
|
]]
|
|
|
|
|
|
if ifs["has_macs"] == true then
|
|
print('<li class="nav-item"><a class="dropdown-item" href="'..ntop.getHttpPrefix()..'/lua/macs_stats.lua?devices_mode=source_macs_only">') print(i18n("users.devices")) print('</a></li>')
|
|
end
|
|
|
|
print('<li class="nav-item"><a class="dropdown-item" href="'..ntop.getHttpPrefix()..'/lua/network_stats.lua">') print(i18n("networks")) print('</a></li>')
|
|
|
|
print('<li class="nav-item"><a class="dropdown-item" href="'..ntop.getHttpPrefix()..'/lua/pool_stats.lua">') print(i18n("host_pools.host_pools")) print('</a></li>')
|
|
|
|
if(ntop.hasGeoIP()) then
|
|
print('<li class="nav-item"><a class="dropdown-item" href="'..ntop.getHttpPrefix()..'/lua/as_stats.lua">') print(i18n("prefs.toggle_asn_rrds_title")) print('</a></li>')
|
|
print('<li class="nav-item"><a class="dropdown-item" href="'..ntop.getHttpPrefix()..'/lua/country_stats.lua">') print(i18n("countries")) print('</a></li>')
|
|
end
|
|
print('<li class="nav-item"><a class="dropdown-item" href="'..ntop.getHttpPrefix()..'/lua/os_stats.lua">') print(i18n("operating_systems")) print('</a></li>')
|
|
|
|
if(interface.hasVLANs()) then
|
|
print('<li class="nav-item"><a class="dropdown-item" href="'..ntop.getHttpPrefix()..'/lua/vlan_stats.lua">') print(i18n("vlan_stats.vlans")) print('</a></li>')
|
|
end
|
|
|
|
if ifs.has_seen_pods then
|
|
print('<li class="nav-item"><a class="dropdown-item" href="'..ntop.getHttpPrefix()..'/lua/pods_stats.lua">') print(i18n("containers_stats.pods")) print('</a></li>')
|
|
end
|
|
if ifs.has_seen_containers then
|
|
print('<li class="nav-item"><a class="dropdown-item" href="'..ntop.getHttpPrefix()..'/lua/containers_stats.lua">') print(i18n("containers_stats.containers")) print('</a></li>')
|
|
end
|
|
|
|
print('<li class="dropdown-divider"></li>')
|
|
print('<li class="dropdown-header">') print(i18n("local_traffic")) print('</li>')
|
|
|
|
print('<li class="nav-item"><a class="dropdown-item" href="'..ntop.getHttpPrefix()..'/lua/http_servers_stats.lua">') print(i18n("http_servers_stats.http_servers")) print('</a></li>')
|
|
|
|
if not is_pcap_dump then
|
|
print('<li class="nav-item"><a class="dropdown-item" href="'..ntop.getHttpPrefix()..'/lua/top_hosts.lua"><i class="fa fa-trophy"></i> ') print(i18n("processes_stats.top_hosts")) print('</a></li>')
|
|
end
|
|
|
|
print('<li class="dropdown-divider"></li>')
|
|
|
|
if(not(isLoopback(ifname))) then
|
|
print [[
|
|
<li class="nav-item"><a class="dropdown-item" href="]]
|
|
print(ntop.getHttpPrefix())
|
|
print [[/lua/hosts_geomap.lua"><i class="fa fa-map-marker"></i> ]] print(i18n("geo_map.geo_map")) print[[</a></li>]]
|
|
|
|
print[[<li class="nav-item"><a class="dropdown-item" href="]] print(ntop.getHttpPrefix())
|
|
print [[/lua/hosts_treemap.lua"><i class="fa fa-sitemap"></i> ]] print(i18n("tree_map.hosts_treemap")) print[[</a></li>]]
|
|
end
|
|
|
|
if(ntop.getPrefs().is_arp_matrix_generation_enabled) then
|
|
print('<li class="nav-item"><a class="dropdown-item" href="'..ntop.getHttpPrefix()..'/lua/arp_matrix_graph.lua"><i class="fa fa-th-large"></i> ') print(i18n("arp_top_talkers")) print('</a></li>')
|
|
end
|
|
|
|
print [[
|
|
<li class="nav-item"><a class="dropdown-item" href="]]
|
|
print(ntop.getHttpPrefix())
|
|
print [[/lua/bubble.lua"><i class="fa fa-circle"></i> Host Explorer</a></li>
|
|
]]
|
|
|
|
print("</ul> </li>")
|
|
|
|
end -- closes not ifs.isViewed
|
|
|
|
-- ##############################################
|
|
-- Exporters
|
|
|
|
local info = ntop.getInfo()
|
|
|
|
if((ifs["type"] == "zmq") and ntop.isEnterprise()) then
|
|
if active_page == "exporters" then
|
|
print [[ <li class="nav-item dropdown active">
|
|
<a class="nav-link dropdown-toggle active" data-toggle="dropdown" href="#">
|
|
]]
|
|
else
|
|
print [[ <li class="nav-item dropdown">
|
|
<a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#">
|
|
]]
|
|
end
|
|
|
|
print(i18n("flow_devices.exporters")) print[[ <b class="caret"></b>
|
|
</a>
|
|
<ul class="dropdown-menu">
|
|
]]
|
|
|
|
local has_ebpf_events, has_sflow_devs = false, false
|
|
if ifs.has_seen_ebpf_events then
|
|
has_ebpf_events = true
|
|
print('<li class="nav-item"><a class="dropdown-item" href="'..ntop.getHttpPrefix()..'/lua/pro/enterprise/event_exporters.lua ">') print(i18n("event_exporters.event_exporters")) print('</a></li>')
|
|
elseif table.len(interface.getSFlowDevices() or {}) > 0 then
|
|
has_sflow_devs = true
|
|
print('<li class="nav-item"><a class="dropdown-item" href="'..ntop.getHttpPrefix()..'/lua/pro/enterprise/flowdevices_stats.lua?sflow_filter=All">') print(i18n("flows_page.sflow_devices")) print('</a></li>')
|
|
|
|
end
|
|
|
|
if has_ebpf_events or has_sflow_devs then
|
|
print('<li class="dropdown-divider"></li>')
|
|
print('<li class="nav-item" class="dropdown-header">') print(i18n("flows")) print('</li>')
|
|
end
|
|
|
|
print('<li class="nav-item"><a class="dropdown-item" href="'..ntop.getHttpPrefix()..'/lua/pro/enterprise/flowdevices_stats.lua">') print(i18n("flows_page.flow_exporters")) print('</a></li>')
|
|
|
|
print [[
|
|
|
|
</ul>
|
|
</li>]]
|
|
end
|
|
|
|
-- ##############################################
|
|
-- Interface
|
|
|
|
if(num_ifaces > 0) then
|
|
|
|
url = ntop.getHttpPrefix().."/lua/if_stats.lua"
|
|
|
|
if(active_page == "if_stats") then
|
|
print('<li class="nav-item active"><a class="nav-link active" href="'..url..'">') print(i18n("interface")) print('</a></li>')
|
|
else
|
|
print('<li class="nav-item"><a class="nav-link" href="'..url..'">') print(i18n("interface")) print('</a></li>')
|
|
end
|
|
|
|
-- ##############################################
|
|
-- System
|
|
|
|
if isAllowedSystemInterface() then
|
|
local plugins_utils = require("plugins_utils")
|
|
|
|
if active_page == "system_stats" or active_page == "system_interfaces_stats" then
|
|
print [[ <li class="nav-item dropdown active">
|
|
<a class="nav-link dropdown-toggle active" data-toggle="dropdown" href="#">
|
|
]]
|
|
else
|
|
print [[ <li class="nav-item dropdown">
|
|
<a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#">
|
|
]]
|
|
end
|
|
print(i18n("system")) print[[ <b class="caret"></b>
|
|
</a>
|
|
<ul class="dropdown-menu">]]
|
|
|
|
if ntop.isEnterprise() then
|
|
print('<li class="nav-item"><a class="dropdown-item" href="'..ntop.getHttpPrefix()..'/lua/pro/enterprise/snmpdevices_stats.lua">') print(i18n("prefs.snmp")) print('</a></li>')
|
|
end
|
|
|
|
print[[<li class="nav-item"><a class="dropdown-item" href="]] print(ntop.getHttpPrefix()) print[[/lua/system_stats.lua">]] print(i18n("system_status")) print[[</a></li>]]
|
|
|
|
if num_ifaces > 1 then
|
|
print[[<li class="nav-item"><a class="dropdown-item" href="]] print(ntop.getHttpPrefix()) print[[/lua/system_interfaces_stats.lua">]] print(i18n("system_interfaces_status")) print[[</a></li>]]
|
|
end
|
|
|
|
local menu = plugins_utils.getMenuEntries() or {}
|
|
|
|
if not table.empty(menu) then
|
|
print('<li class="divider"></li>')
|
|
|
|
for _, entry in pairsByField(menu, "sort_order", rev) do
|
|
print[[<li class="nav-item"><a class="dropdown-item" href="]] print(entry.url) print[[">]] print(i18n(entry.label) or entry.label) print[[</a></li>]]
|
|
end
|
|
end
|
|
|
|
print[[</ul>]]
|
|
end
|
|
|
|
-- ##############################################
|
|
-- Admin
|
|
|
|
if active_page == "admin" then
|
|
print [[ <li class="nav-item dropdown active">
|
|
<a class="nav-link dropdown-toggle active" data-toggle="dropdown" href="#">
|
|
]]
|
|
else
|
|
print [[ <li class="nav-item dropdown">
|
|
<a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#">
|
|
]]
|
|
end
|
|
|
|
print [[
|
|
<i class="fa fa-cog fa-lg"></i> <b class="caret"></b>
|
|
</a>
|
|
<ul class="dropdown-menu">]]
|
|
|
|
if _SESSION["localuser"] then
|
|
if(is_admin) then
|
|
print[[<li class="nav-item"><a class="dropdown-item" href="]] print(ntop.getHttpPrefix())
|
|
print[[/lua/admin/users.lua"><i class="fa fa-user"></i> ]] print(i18n("manage_users.manage_users")) print[[</a></li>]]
|
|
else
|
|
print [[<li class="nav-item"><a class="dropdown-item" href="#password_dialog" data-toggle="modal"><i class="fa fa-user"></i> ]] print(i18n("login.change_password")) print[[</a></li>]]
|
|
end
|
|
end
|
|
|
|
if(is_admin) then
|
|
print("<li class=\"nav-item\"><a class=\"dropdown-item\" href=\""..ntop.getHttpPrefix().."/lua/admin/prefs.lua\"><i class=\"fa fa-flask\"></i> ") print(i18n("prefs.preferences")) print("</a></li>\n")
|
|
|
|
if remote_assistance.isAvailable() then
|
|
print("<li class=\"nav-item\"><a class=\"dropdown-item\" href=\""..ntop.getHttpPrefix().."/lua/admin/remote_assistance.lua\"><i class=\"fa fa-comment-dots\"></i> ") print(i18n("remote_assistance.remote_assistance")) print("</a></li>\n")
|
|
end
|
|
|
|
if(ntop.isPro()) then
|
|
print("<li class=\"nav-item\"><a class=\"dropdown-item\" href=\""..ntop.getHttpPrefix().."/lua/pro/admin/edit_profiles.lua\"><i class=\"fa fa-user-md\"></i> ") print(i18n("traffic_profiles.traffic_profiles")) print("</a></li>\n")
|
|
if(false) then
|
|
print("<li class=\"nav-item\"><a class=\"dropdown-item\" href=\""..ntop.getHttpPrefix().."/lua/pro/admin/list_reports.lua\"><i class=\"fa fa-archive\"></i> Reports Archive</a></li>\n")
|
|
end
|
|
end
|
|
|
|
print("<li class=\"nav-item\"><a class=\"dropdown-item\" href=\""..ntop.getHttpPrefix().."/lua/admin/edit_categories.lua\"><i class=\"fa fa-tags\"></i> ") print(i18n("custom_categories.apps_and_categories")) print("</a></li>\n")
|
|
print("<li class=\"nav-item\"><a class=\"dropdown-item\" href=\""..ntop.getHttpPrefix().."/lua/admin/edit_category_lists.lua\"><i class=\"fa fa-sticky-note\"></i> ") print(i18n("category_lists.category_lists")) print("</a></li>\n")
|
|
|
|
|
|
print("<li class=\"nav-item\"><a class=\"dropdown-item\" href=\""..ntop.getHttpPrefix().."/lua/admin/edit_device_protocols.lua\"><i class=\"fa fa-tablet\"></i> ") print(i18n("device_protocols.device_protocols")) print("</a></li>\n")
|
|
end
|
|
|
|
if _SESSION["localuser"] or is_admin then
|
|
print [[
|
|
<li class="dropdown-divider"></li>]]
|
|
end
|
|
|
|
print [[
|
|
<li class="nav-item"><a class="dropdown-item" href="]]
|
|
print(ntop.getHttpPrefix())
|
|
print [[/lua/manage_data.lua"><i class="fa fa-hdd"></i> ]] print(i18n("manage_data.manage_data")) print[[</a></li>]]
|
|
|
|
if(is_admin) then
|
|
print [[
|
|
<li class="nav-item"><a class="dropdown-item" href="]]
|
|
print(ntop.getHttpPrefix())
|
|
print [[/lua/get_config.lua"><i class="fa fa-download"></i> ]] print(i18n("conf_backup.conf_backup")) print[[</a></li>]]
|
|
|
|
print[[ <li class="nav-item"><a class="dropdown-item" href="https://www.ntop.org/guides/ntopng/web_gui/settings.html#restore-configuration" target="_blank"><i class="fa fa-upload"></i> ]] print(i18n("conf_backup.conf_restore")) print[[ <i class="fa fa-external-link"></i></a></li>]]
|
|
end
|
|
|
|
print[[
|
|
</ul>
|
|
</li>]]
|
|
|
|
-- ##############################################
|
|
-- Interfaces Selector
|
|
|
|
print [[ <li class="nav-item dropdown"> ]]
|
|
|
|
print [[
|
|
<a class="nav-link dropdown-toggle " data-toggle="dropdown" href="#"> { ]] print(getHumanReadableInterfaceName(ifname)) print[[ }<b class="caret"></b>
|
|
</a>
|
|
<ul class="dropdown-menu">
|
|
]]
|
|
|
|
local views = {}
|
|
local drops = {}
|
|
local recording = {}
|
|
local packetinterfaces = {}
|
|
local ifnames = {}
|
|
local ifdescr = {}
|
|
local ifHdescr = {}
|
|
local ifCustom = {}
|
|
local dynamic = {}
|
|
|
|
for v,k in pairs(iface_names) do
|
|
interface.select(k)
|
|
local _ifstats = interface.getStats()
|
|
ifnames[_ifstats.id] = k
|
|
ifdescr[_ifstats.id] = _ifstats.description
|
|
--io.write("["..k.."/"..v.."][".._ifstats.id.."] "..ifnames[_ifstats.id].."=".._ifstats.id.."\n")
|
|
if(_ifstats.isView == true) then views[k] = true end
|
|
if(_ifstats.isDynamic == true) then dynamic[k] = true end
|
|
if(recording_utils.isEnabled(_ifstats.id)) then recording[k] = true end
|
|
if(interface.isPacketInterface()) then packetinterfaces[k] = true end
|
|
if(_ifstats.stats_since_reset.drops * 100 > _ifstats.stats_since_reset.packets) then
|
|
drops[k] = true
|
|
end
|
|
ifHdescr[_ifstats.id] = getHumanReadableInterfaceName(_ifstats.description.."")
|
|
ifCustom[_ifstats.id] = _ifstats.customIftype
|
|
end
|
|
|
|
-- First round: only physical interfaces
|
|
-- Second round: only virtual interfaces
|
|
|
|
for round = 1, 2 do
|
|
|
|
for k,_ in pairsByValues(ifHdescr, asc) do
|
|
local descr
|
|
|
|
if((round == 1) and (ifCustom[k] ~= nil)) then
|
|
-- do nothing
|
|
elseif((round == 2) and (ifCustom[k] == nil)) then
|
|
-- do nothing
|
|
else
|
|
v = ifnames[k]
|
|
|
|
local page_params = table.clone(_GET)
|
|
page_params.ifid = k
|
|
-- ntop.getHttpPrefix()
|
|
local url = getPageUrl("", page_params)
|
|
|
|
print(" <li class=\"nav-item\">")
|
|
|
|
if(v == ifname) then
|
|
print("<a class=\"dropdown-item\" href=\""..url.."\">")
|
|
else
|
|
print[[<form id="switch_interface_form_]] print(tostring(k)) print[[" method="post" action="]] print(url) print[[">]]
|
|
print[[<input name="switch_interface" type="hidden" value="1" />]]
|
|
print[[<input name="csrf" type="hidden" value="]] print(ntop.getRandomCSRFValue()) print[[" />]]
|
|
print[[</form>]]
|
|
print[[<a class="dropdown-item" href="javascript:void(0);" onclick="$('#switch_interface_form_]] print(tostring(k)) print[[').submit();">]]
|
|
end
|
|
|
|
if(v == ifname) then print("<i class=\"fa fa-check\"></i> ") end
|
|
if(isPausedInterface(v)) then print('<i class="fa fa-pause"></i> ') end
|
|
|
|
descr = getHumanReadableInterfaceName(v.."")
|
|
|
|
if(string.contains(descr, "{")) then -- Windows
|
|
descr = ifdescr[k]
|
|
else
|
|
if(v ~= ifdescr[k]) then
|
|
descr = descr .. " (".. ifdescr[k] ..")"
|
|
end
|
|
end
|
|
|
|
print(descr)
|
|
|
|
if(views[v] == true) then
|
|
print(' <i class="fa fa-eye" aria-hidden="true"></i> ')
|
|
end
|
|
|
|
if(dynamic[v] == true) then
|
|
print(' <i class="fa fa-code-branch" aria-hidden="true"></i> ')
|
|
end
|
|
|
|
if(drops[v] == true) then
|
|
print(' <span><i class="fa fa-tint" aria-hidden="true"></i></span>')
|
|
end
|
|
|
|
if(recording[v] == true) then
|
|
print(' <i class="fa fa-hdd" aria-hidden="true"></i> ')
|
|
end
|
|
|
|
print("</a>")
|
|
print("</li>\n")
|
|
end
|
|
end
|
|
end
|
|
|
|
print [[
|
|
|
|
</ul>
|
|
</li>
|
|
]]
|
|
end -- num_ifaces > 0
|
|
|
|
print("<li><span style=\"margin: 26px\"></span></li>")
|
|
|
|
|
|
-- ##############################################
|
|
-- Info
|
|
|
|
if active_page == "home" or active_page == "about" or active_page == "telemetry" or active_page == "directories" then
|
|
print [[ <li class="nav-item dropdown active">
|
|
<a class="nav-link dropdown-toggle active" data-toggle="dropdown" href="#">
|
|
]]
|
|
else
|
|
print [[ <li class="nav-item dropdown">
|
|
<a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#">
|
|
]]
|
|
end
|
|
|
|
print [[
|
|
<i class="fa fa-life-ring fa-lg"></i> <b class="caret"></b>
|
|
</a>
|
|
<ul class="dropdown-menu">
|
|
<li class="nav-item"><a class="dropdown-item" href="]] print(ntop.getHttpPrefix()) print [[/lua/about.lua"><i class="fa fa-question-circle"></i> ]] print(i18n("about.about_ntopng")) print[[</a></li>
|
|
<li class="nav-item"><a class="dropdown-item" href="]] print(ntop.getHttpPrefix()) print[[/lua/telemetry.lua"><i class="fa fa-rss"></i> ]] print(i18n("telemetry")) print[[</a></li>
|
|
<li class="nav-item"><a class="dropdown-item" href="http://blog.ntop.org/" target="_blank"><i class="fa fa-bullhorn"></i> ]] print(i18n("about.ntop_blog")) print[[ <i class="fa fa-external-link"></i></a></li>
|
|
<li class="nav-item"><a class="dropdown-item" href="https://t.me/ntop_community" target="_blank"><i class="fab fa-telegram"></i> ]] print(i18n("about.telegram")) print[[ <i class="fa fa-external-link"></i></a></li>
|
|
<li class="nav-item"><a class="dropdown-item" href="https://github.com/ntop/ntopng/issues" target="_blank"><i class="fa fa-bug"></i> ]] print(i18n("about.report_issue")) print[[ <i class="fa fa-external-link"></i></a></li>
|
|
|
|
<li class="dropdown-divider"></li>
|
|
<li class="nav-item"><a class="dropdown-item" href="]] print(ntop.getHttpPrefix()) print [[/lua/directories.lua"><i class="fa fa-folder"></i> ]] print(i18n("about.directories")) print[[</a></li>
|
|
<li class="nav-item"><a class="dropdown-item" href="]] print(ntop.getHttpPrefix()) print[[/lua/user_scripts_overview.lua"><i class="fab fa-superpowers"></i> ]] print(i18n("about.user_scripts")) print[[</a></li>
|
|
<li class="nav-item"><a class="dropdown-item" href="]] print(ntop.getHttpPrefix()) print[[/lua/defs_overview.lua"><i class="fa fa-exclamation-triangle"></i> ]] print(i18n("about.alert_defines")) print[[</a></li>
|
|
<li class="nav-item"><a class="dropdown-item" href="https://www.ntop.org/guides/ntopng/" target="_blank"><i class="fa fa-book"></i> ]] print(i18n("about.readme_and_manual")) print[[ <i class="fa fa-external-link"></i></a></li>
|
|
<li class="nav-item"><a class="dropdown-item" href="https://www.ntop.org/guides/ntopng/api/" target="_blank"><i class="fa fa-book"></i> ]] print("Lua/C API") print[[ <i class="fa fa-external-link"></i></a></li>
|
|
|
|
</ul>
|
|
]]
|
|
|
|
-- ##############################################
|
|
-- Search
|
|
|
|
print("<li>")
|
|
print(
|
|
template.gen("typeahead_input.html", {
|
|
typeahead={
|
|
base_id = "host_search",
|
|
action = "", -- see makeFindHostBeforeSubmitCallback
|
|
json_key = "ip",
|
|
query_field = "host",
|
|
class = "typeahead-dropdown-right",
|
|
query_url = ntop.getHttpPrefix() .. "/lua/find_host.lua",
|
|
query_title = i18n("search_host"),
|
|
style = "width:16em;",
|
|
before_submit = [[makeFindHostBeforeSubmitCallback("]] .. ntop.getHttpPrefix() .. [[")]],
|
|
max_items = "'all'" --[[ let source script decide ]],
|
|
}
|
|
})
|
|
)
|
|
print("</li>")
|
|
|
|
-- ##############################################
|
|
-- Logout
|
|
|
|
if(_SESSION["user"] ~= nil and _SESSION["user"] ~= ntop.getNologinUser()) then
|
|
|
|
print[[
|
|
|
|
<li class="nav-link"><a href="]]
|
|
print(ntop.getHttpPrefix())
|
|
print [[/lua/logout.lua" onclick="return confirm(']] print(i18n("login.logout_message")) print [[')"> <i class="fa fa-sign-out-alt fa-lg"></i> </a></li>]]
|
|
|
|
|
|
end
|
|
|
|
|
|
if(not is_admin) then
|
|
dofile(dirs.installdir .. "/scripts/lua/inc/password_dialog.lua")
|
|
end
|
|
|
|
|
|
|
|
|
|
print("</ul>\n<h3 class=\"muted\"><A href=\""..ntop.getHttpPrefix().."/\">")
|
|
|
|
addLogoSvg()
|
|
|
|
print("</A></h3>\n</div>\n")
|
|
|
|
-- select the original interface back to prevent possible issues
|
|
interface.select(ifname)
|
|
|
|
if(dirs.workingdir == "/var/tmp/ntopng") then
|
|
print('<br><div class="alert alert-danger" role="alert"><i class="fa fa-exclamation-triangle fa-lg" id="alerts-menu-triangle"></i> <A HREF="https://www.ntop.org/support/faq/migrate-the-data-directory-in-ntopng/">')
|
|
print(i18n("about.datadir_warning"))
|
|
print('</a></div>')
|
|
end
|
|
|
|
local lbd_serialize_by_mac = (_POST["lbd_hosts_as_macs"] == "1") or (ntop.getPref(string.format("ntopng.prefs.ifid_%u.serialize_local_broadcast_hosts_as_macs", ifs.id)) == "1")
|
|
|
|
if(ifs.has_seen_dhcp_addresses and is_admin and (not is_pcap_dump) and is_packet_interface) then
|
|
if(not lbd_serialize_by_mac) then
|
|
if(ntop.getPref(string.format("ntopng.prefs.ifid_%u.disable_host_identifier_message", ifs.id)) ~= "1") then
|
|
print('<br><div id="host-id-message-warning" class="alert alert-warning" role="alert"><i class="fa fa-exclamation-triangle fa-lg" id="alerts-menu-triangle"></i> ')
|
|
print[[<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>]]
|
|
print(i18n("about.host_identifier_warning", {name=i18n("prefs.toggle_host_tskey_title"), url = ntop.getHttpPrefix().."/lua/if_stats.lua?page=config"}))
|
|
print('</a></div>')
|
|
end
|
|
elseif isEmptyString(_POST["dhcp_ranges"]) then
|
|
local dhcp_utils = require("dhcp_utils")
|
|
local ranges = dhcp_utils.listRanges(ifs.id)
|
|
|
|
if(table.empty(ranges)) then
|
|
print('<br><div class="alert alert-warning" role="alert"><i class="fa fa-exclamation-triangle fa-lg" id="alerts-menu-triangle"></i> ')
|
|
print(i18n("about.dhcp_range_missing_warning", {
|
|
name = i18n("prefs.toggle_host_tskey_title"),
|
|
url = ntop.getHttpPrefix().."/lua/if_stats.lua?page=config",
|
|
dhcp_url = ntop.getHttpPrefix().."/lua/if_stats.lua?page=dhcp"}))
|
|
print('</a></div>')
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Hidden by default, will be shown by the footer if necessary
|
|
print('<div id="influxdb-error-msg" class="alert alert-danger" style="display:none" role="alert"><i class="fa fa-exclamation-triangle fa-lg" id="alerts-menu-triangle"></i> <span id="influxdb-error-msg-text"></span>')
|
|
print[[<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>]]
|
|
print('</div>')
|
|
|
|
-- Hidden by default, will be shown by the footer if necessary
|
|
print('<div id="move-rrd-to-influxdb" class="alert alert-warning" style="display:none" role="alert"><i class="fa fa-exclamation-triangle fa-lg" id="alerts-menu-triangle"></i> ')
|
|
print[[<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>]]
|
|
print(i18n("about.influxdb_migration_msg", {url="https://www.ntop.org/ntopng/ntopng-and-time-series-from-rrd-to-influxdb-new-charts-with-time-shift/"}))
|
|
print('</div>')
|
|
|
|
if(_SESSION["INVALID_CSRF"]) then
|
|
print('<div id="move-rrd-to-influxdb" class="alert alert-warning" role="alert"><i class="fa fa-exclamation-triangle fa-lg" id="alerts-menu-triangle"></i> ')
|
|
print[[<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>]]
|
|
print(i18n("expired_csrf"))
|
|
print('</div>')
|
|
end
|
|
|
|
telemetry_utils.show_notice()
|