--
-- (C) 2013-20 - 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 blog_utils = require("blog_utils")
local page_utils = require("page_utils")
local delete_data_utils = require "delete_data_utils"
local menu_alert_notifications = require("menu_alert_notifications")
local host_pools = require "host_pools"
local is_nedge = ntop.isnEdge()
local is_admin = isAdministrator()
local is_windows = ntop.isWindows()
local info = ntop.getInfo()
local updates_supported = (is_admin and ntop.isPackage() and not ntop.isWindows())
-- this is a global variable
local is_system_interface = page_utils.is_system_view()
print([[
]])
print[[
]]
local template = require "template_utils"
prefs = ntop.getPrefs()
local iface_names = interface.getIfNames()
-- tprint(prefs)
-- tprint(iface_names)
num_ifaces = 0
for k,v in pairs(iface_names) do
num_ifaces = num_ifaces+1
end
interface.select(ifname)
local ifs = interface.getStats()
local is_pcap_dump = interface.isPcapDumpInterface()
local is_packet_interface = interface.isPacketInterface()
ifId = ifs.id
-- NOTE: see sidebar.js for the client logic
page_utils.init_menubar()
if is_nedge then
dofile(dirs.installdir .. "/pro/scripts/lua/nedge/inc/menubar.lua")
else
-- ##############################################
-- Dashboard
page_utils.add_menubar_section(
{
section = page_utils.menu_sections.dashboard,
hidden = is_pcap_dump or is_system_interface,
entries = {
{
entry = page_utils.menu_entries.traffic_dashboard,
url = ntop.isPro() and '/lua/pro/dashboard.lua' or '/lua/index.lua',
},
{
entry = page_utils.menu_entries.network_discovery,
hidden = not interface.isDiscoverableInterface() or interface.isLoopback(),
url = "/lua/discover.lua",
},
{
entry = page_utils.menu_entries.traffic_report,
hidden = not ntop.isPro(),
url = "/lua/pro/report.lua",
},
{
entry = page_utils.menu_entries.divider,
hidden = not ntop.isPro() or not prefs.is_dump_flows_to_mysql_enabled or ifs.isViewed,
},
{
entry = page_utils.menu_entries.db_explorer,
hidden = not ntop.isPro() or not prefs.is_dump_flows_to_mysql_enabled or ifs.isViewed,
url = "/lua/pro/db_explorer.lua?ifid="..ifId,
},
},
}
)
-- ##############################################
-- Alerts
page_utils.add_menubar_section(
{
section = page_utils.menu_sections.alerts,
hidden = not ntop.getPrefs().are_alerts_enabled or is_system_interface,
entries = {
{
entry = page_utils.menu_entries.detected_alerts,
url = '/lua/show_alerts.lua',
},
{
entry = page_utils.menu_entries.alerts_dashboard,
hidden = not ntop.isEnterpriseM(),
url = '/lua/pro/enterprise/alerts_dashboard.lua',
},
{
entry = page_utils.menu_entries.divider,
hidden = not ntop.isEnterpriseM(),
},
{
entry = page_utils.menu_entries.flow_alerts_explorer,
hidden = not ntop.isEnterpriseM(),
url = '/lua/pro/enterprise/flow_alerts_explorer.lua',
},
},
}
)
-- ##############################################
-- Flows
page_utils.add_menubar_section(
{
hidden = is_system_interface,
section = page_utils.menu_sections.flows,
url = "/lua/flows_stats.lua",
}
)
-- ##############################################
-- Hosts
page_utils.add_menubar_section(
{
section = page_utils.menu_sections.hosts,
hidden = ifs.isViewed or is_system_interface,
entries = {
{
entry = page_utils.menu_entries.hosts,
url = '/lua/hosts_stats.lua',
},
{
entry = page_utils.menu_entries.devices,
hidden = not ifs.has_macs,
url = '/lua/macs_stats.lua?devices_mode=source_macs_only',
},
{
entry = page_utils.menu_entries.networks,
url = '/lua/network_stats.lua',
},
{
entry = page_utils.menu_entries.host_pools,
url = '/lua/pool_stats.lua',
},
{
entry = page_utils.menu_entries.autonomous_systems,
hidden = not ntop.hasGeoIP(),
url = '/lua/as_stats.lua',
},
{
entry = page_utils.menu_entries.countries,
hidden = not ntop.hasGeoIP(),
url = '/lua/country_stats.lua',
},
{
entry = page_utils.menu_entries.operating_systems,
url = '/lua/os_stats.lua',
},
{
entry = page_utils.menu_entries.vlans,
hidden = not interface.hasVLANs(),
url = '/lua/vlan_stats.lua',
},
{
entry = page_utils.menu_entries.pods,
hidden = not ifs.has_seen_pods,
url = '/lua/pods_stats.lua',
},
{
entry = page_utils.menu_entries.containers,
hidden = not ifs.has_seen_containers,
url = '/lua/containers_stats.lua',
},
{
entry = page_utils.menu_entries.divider,
},
{
entry = page_utils.menu_entries.http_servers,
url = '/lua/http_servers_stats.lua',
},
{
entry = page_utils.menu_entries.top_hosts,
hidden = is_pcap_dump,
url = '/lua/top_hosts.lua',
},
{
entry = page_utils.menu_entries.divider,
},
{
entry = page_utils.menu_entries.geo_map,
hidden = interface.isLoopback() or not ntop.hasGeoIP(),
url = '/lua/hosts_geomap.lua',
},
{
entry = page_utils.menu_entries.host_explorer,
url = '/lua/bubble.lua',
},
},
}
)
-- ##############################################
-- Exporters
page_utils.add_menubar_section(
{
section = page_utils.menu_sections.exporters,
hidden = (ifs.type ~= "zmq" or not ntop.isEnterpriseM()) or is_system_interface,
entries = {
{
entry = page_utils.menu_entries.event_exporters,
hidden = not ifs.has_seen_ebpf_events,
url = '/lua/pro/enterprise/event_exporters.lua',
},
{
entry = page_utils.menu_entries.sflow_exporters,
hidden = table.len(interface.getSFlowDevices() or {}) == 0,
url = '/lua/pro/enterprise/flowdevices_stats.lua?sflow_filter=All',
},
{
entry = page_utils.menu_entries.flow_exporters,
url = '/lua/pro/enterprise/flowdevices_stats.lua',
},
},
}
)
end
-- ##############################################
-- Interface
page_utils.add_menubar_section(
{
section = page_utils.menu_sections.if_stats,
hidden = is_system_interface,
url = "/lua/if_stats.lua",
}
)
-- ##############################################
-- System Health
page_utils.add_menubar_section({
hidden = not is_system_interface,
section = page_utils.menu_sections.health,
entries = {
{
entry = page_utils.menu_entries.system_status,
url = '/lua/system_stats.lua',
},
{
entry = page_utils.menu_entries.interfaces_status,
url = '/lua/system_interfaces_stats.lua',
},
}
})
-- ##############################################
-- SNMP
page_utils.add_menubar_section({
hidden = not is_system_interface or not ntop.isEnterpriseM(),
url = "/lua/pro/enterprise/snmpdevices_stats.lua",
section = page_utils.menu_sections.snmp
})
-- ##############################################
-- System
local system_entries = {}
-- Add plugin entries...
for k, entry in pairsByField(page_utils.plugins_menu, "sort_order", rev) do
system_entries[#system_entries + 1] = {
entry = page_utils.menu_entries[entry.menu_entry.key],
url = entry.url,
}
end
-- Possibly add nEdge entries
if is_nedge then
for _, entry in ipairs(
{
{
entry = page_utils.menu_entries.divider,
hidden = not is_admin,
},
{
entry = page_utils.menu_entries.system_setup,
hidden = not is_admin,
url = '/lua/pro/nedge/system_setup/interfaces.lua',
},
{
entry = page_utils.menu_entries.dhcp_leases,
hidden = not is_admin or not ntop.isRoutingMode(),
url = '/lua/pro/nedge/admin/dhcp_leases.lua',
},
{
entry = page_utils.menu_entries.port_forwarding,
hidden = not is_admin or not ntop.isRoutingMode(),
url = '/lua/pro/nedge/admin/port_forwarding.lua',
},
{
entry = page_utils.menu_entries.nedge_users,
hidden = not is_admin or not is_system_interface,
url = '/lua/pro/nedge/admin/nf_list_users.lua',
},
}) do
system_entries[#system_entries + 1] = entry
end
end
page_utils.add_menubar_section(
{
section = page_utils.menu_sections.system_stats,
hidden = not isAllowedSystemInterface() or not is_system_interface,
entries = system_entries,
}
)
-- ##############################################
-- Tools
page_utils.add_menubar_section({
hidden = not is_system_interface,
section = page_utils.menu_sections.tools,
entries = {
{
entry = page_utils.menu_entries.remote_assistance,
hidden = not is_admin or not remote_assistance.isAvailable(),
url = '/lua/admin/remote_assistance.lua',
},
{
entry = page_utils.menu_entries.conf_backup,
hidden = not is_admin or is_windows,
url = '/lua/get_config.lua',
},
{
entry = page_utils.menu_entries.conf_restore,
hidden = not is_admin or is_windows,
url = 'https://www.ntop.org/guides/ntopng/web_gui/settings.html#restore-configuration',
},
}
})
-- ##############################################
-- Pools
page_utils.add_menubar_section({
hidden = not is_system_interface or is_nedge,
section = page_utils.menu_sections.pools,
entries = {
{
entry = page_utils.menu_entries.manage_pools,
hidden = not is_admin,
url = '/lua/admin/manage_pools.lua'
},
{
entry = page_utils.menu_entries.host_members,
hidden = not is_admin,
url = '/lua/admin/manage_host_members.lua',
}
}
})
-- ##############################################
local inactive_interfaces = delete_data_utils.list_inactive_interfaces()
local num_inactive_interfaces = ternary(not ntop.isnEdge(), table.len(inactive_interfaces or {}), 0)
local delete_active_interface_requested_system = delete_data_utils.delete_active_interface_data_requested(getSystemInterfaceId())
-- Admin
page_utils.add_menubar_section(
{
section = page_utils.menu_sections.admin,
hidden = not is_admin,
entries = {
{
entry = page_utils.menu_entries.manage_users,
hidden = not _SESSION["localuser"] or not is_admin,
url = '/lua/admin/users.lua',
},
{
entry = page_utils.menu_entries.preferences,
hidden = not is_admin,
url = '/lua/admin/prefs.lua',
},
{
entry = page_utils.menu_entries.scripts_config,
hidden = not is_admin,
url = '/lua/admin/scripts_config.lua',
},
{
entry = page_utils.menu_entries.endpoint_notifications,
hidden = not is_admin,
url = '/lua/admin/endpoint_notifications_list.lua',
},
{
entry = page_utils.menu_entries.endpoint_recipients,
hidden = not is_admin,
url = '/lua/admin/endpoint_recipients_list.lua',
},
{
entry = page_utils.menu_entries.divider,
hidden = not is_admin,
},
{
entry = page_utils.menu_entries.manage_data,
hidden = not is_admin or is_system_interface,
url = '/lua/manage_data.lua',
},
{
hidden = (not is_system_interface or delete_active_interface_requested_system),
custom = ([[
]])
},
{
hidden = (num_inactive_interfaces <= 0 or not is_system_interface) ,
custom = ([[
]])
},
{
entry = page_utils.menu_entries.divider,
},
{
entry = page_utils.menu_entries.profiles,
hidden = not is_admin or not ntop.isPro() or is_nedge,
url = '/lua/pro/admin/edit_profiles.lua',
},
{
entry = page_utils.menu_entries.categories,
hidden = not is_admin,
url = '/lua/admin/edit_categories.lua',
},
{
entry = page_utils.menu_entries.category_lists,
hidden = not is_admin,
url = '/lua/admin/edit_category_lists.lua',
},
{
entry = page_utils.menu_entries.device_protocols,
hidden = not is_admin,
url = '/lua/admin/edit_device_protocols.lua',
},
},
}
)
-- ##############################################
-- Developer
if not info.oem then
page_utils.add_menubar_section(
{
section = page_utils.menu_sections.dev,
entries = {
{
entry = page_utils.menu_entries.plugins,
url = '/lua/plugins_overview.lua',
},
{
entry = page_utils.menu_entries.user_scripts_dev,
url = '/lua/user_scripts_overview.lua',
},
{
entry = page_utils.menu_entries.alert_definitions,
url = '/lua/defs_overview.lua',
},
{
entry = page_utils.menu_entries.directories,
url = '/lua/directories.lua',
},
{
entry = page_utils.menu_entries.api,
url = 'https://www.ntop.org/guides/ntopng/api/',
},
{
entry = page_utils.menu_entries.divider,
hidden = not is_admin,
},
{
entry = page_utils.menu_entries.widgets_list,
hidden = not is_admin,
url = '/lua/widgets_list.lua',
},
{
entry = page_utils.menu_entries.datasources_list,
hidden = not is_admin,
url = '/lua/datasources_list.lua',
},
},
}
)
end
-- ##############################################
-- About
page_utils.add_menubar_section(
{
section = page_utils.menu_sections.about,
hidden = info.oem,
entries = {
{
entry = page_utils.menu_entries.about,
url = '/lua/about.lua',
},
{
entry = page_utils.menu_entries.telemetry,
url = '/lua/telemetry.lua',
},
{
entry = page_utils.menu_entries.blog,
url = 'http://blog.ntop.org/',
},
{
entry = page_utils.menu_entries.telegram,
url = 'https://t.me/ntop_community',
},
{
entry = page_utils.menu_entries.manual,
url = 'https://www.ntop.org/guides/ntopng/',
},
{
entry = page_utils.menu_entries.divider
},
{
entry = page_utils.menu_entries.report_issue,
url = 'https://github.com/ntop/ntopng/issues',
},
{
entry = page_utils.menu_entries.suggest_feature,
url = 'https://www.ntop.org/support/need-help-2/contact-us/',
}
},
}
)
-- ##############################################
page_utils.print_menubar()
-- ##############################################
-- Interface
if(num_ifaces > 0) then
url = ntop.getHttpPrefix().."/lua/if_stats.lua"
-- ##############################################
-- Updates submenu
if updates_supported then
-- Updates check
print[[
]]
end
end -- num_ifaces > 0
-- ##############################################
print([[
]])
-- begging of #n-container
print([[
")
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('
')
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('