-- -- (C) 2013-26 - ntop.org -- local dirs = ntop.getDirs() package.path = dirs.installdir .. "/pro/scripts/lua/enterprise/modules/?.lua;" .. package.path package.path = dirs.installdir .. "/scripts/lua/modules/?.lua;" .. package.path package.path = dirs.installdir .. "/scripts/lua/modules/toasts/?.lua;" .. package.path package.path = dirs.installdir .. "/scripts/lua/modules/vulnerability_scan/?.lua;" .. package.path if ((dirs.scriptdir ~= nil) and (dirs.scriptdir ~= "")) then package.path = dirs.scriptdir .. "/lua/modules/?.lua;" .. package.path end require "lua_utils" require "check_redis_prefs" local recording_utils = require "recording_utils" local format_utils = require "format_utils" local page_utils = require("page_utils") local toasts_manager = require("toasts_manager") local blog_utils = require("blog_utils") local template_utils = require "template_utils" local auth = require "auth" local vs_utils = require "vs_utils" local behavior_utils = require("behavior_utils") local checks = require "checks" local has_local_auth = (ntop.getPref("ntopng.prefs.local.auth_enabled") ~= '0') local has_help_enabled = (ntop.getPref("ntopng.prefs.menu_entries.help") ~= '0') local has_developer_enabled = (ntop.getPref("ntopng.prefs.menu_entries.developer") ~= '0') -- ************************************ local prefs = ntop.getPrefs() local asset_inventory_enabled = assetsInventoryEnabled() local is_influxdb_enabled = ntop.getPref("ntopng.prefs.timeseries_driver") == "influxdb" local has_ch_support = hasClickHouseSupport() -- user data local is_admin = isAdministrator() local session_user = _SESSION['user'] -- interface local ifid_stats = interface.getStats() local ifId = ifid_stats.id local has_vlans = interface.hasVLANs() local is_allowed_sys_interface = isAllowedSystemInterface() local system_ifid = getSystemInterfaceId() local interface_id = ifid_stats.id local random_csrf = ntop.getRandomCSRFValue() local is_system_interface = toboolean(page_utils.is_system_view()) local is_pcap_dump = interface.isPcapDumpInterface() local is_packet_interface = interface.isPacketInterface() local is_db_view_interface = interface.isDatabaseViewInterface() local is_viewed = ifid_stats.isViewed local is_sub_interface = interface.isSubInterface() local is_zmq_interface = interface.isZMQInterface() local is_discoverable_interface = interface.isDiscoverableInterface() local is_loopback_interface = interface.isLoopback() local is_viewed_interface = interface.isViewed() local iface_names = interface.getIfNames() local current_ifid = interface.getId() -- compute number of interfaces num_ifaces = 0 for k, v in pairs(iface_names) do num_ifaces = num_ifaces + 1 end -- nedge versions local is_nedge = ntop.isnEdge() -- for ntopng is always false local is_routing_mode = false if is_nedge then is_routing_mode = ntop.isRoutingMode() end local is_nedge_enterprise = ntop.isnEdgeEnterprise() -- ntopng info/version local info = ntop.getInfo() local is_pro = ntop.isPro() local is_enterprise_M = ntop.isEnterpriseM() local is_enterprise = ntop.isEnterprise() local is_enterprise_L = ntop.isEnterpriseL() local is_enterprise_XL = ntop.isEnterpriseXL() local is_appliance = ntop.isAppliance() local is_windows = ntop.isWindows() -- dependencies / additional features local is_geoip_enabled = ntop.hasGeoIP() local limit_resource_usage = ntop.limitResourcesUsage() local is_vs_utils_available = vs_utils.is_available() local is_asn_mode_enabled = isASNModeEnabled() local has_dump_cache = ntop.hasDumpCache() local is_no_login_user = isNoLoginUser() local http_prefix = ntop.getHttpPrefix() -- exporters local flowDevices = (interface.getFlowDevices and interface.getFlowDevices()) or {} local sFlowDevices = interface.getSFlowDevices() or {} local obsPointsInfo = interface.getObsPointsInfo() or {} local obs_points = obsPointsInfo["ObsPoints"] or {} local num_obs_points = obsPointsInfo.numObsPoints or 0 local checks_config = checks.getConfigset()["config"] local interface_config = checks_config["interface"] local flow_config = checks_config["flow"] -- Check if some alerts are enabled local devices_exclusion_enabled = false local acl_violation_enabled = false if (interface_config) then -- Interface alerts if (interface_config["device_connection_disconnection"]) and (interface_config["device_connection_disconnection"]["min"]["enabled"]) then devices_exclusion_enabled = true end end -- Infrastructure local infrastructure_view = false local infrastructure_instances = {} infrastructure_view, infrastructure_instances = isInfrastructureView() -- ************************************ local observationPointId = nil print([[
]]) print [[ ]] -- 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 or is_db_view_interface, entries = {{ entry = page_utils.menu_entries.traffic_dashboard, url = '/lua/index.lua' }, { entry = page_utils.menu_entries.assets_dashboard, hidden = (not has_ch_support) or (not asset_inventory_enabled) or (not is_enterprise_L), url = "/lua/pro/assets_dashboard.lua" }, { entry = page_utils.menu_entries.traffic_report, hidden = not (is_enterprise and has_ch_support) or infrastructure_view or is_viewed, -- disable if interface is viewed url = "/lua/pro/report.lua" }, { entry = page_utils.menu_entries.hr_chart, hidden = (not is_enterprise_M) or (not has_ch_support) or (not ifid_stats["has_hr_flows"]), url = "/lua/pro/hr_chart.lua" }} }) -- ############################################## -- Active Monitoring -- The Monitoring entry are used to go to the System interface pages -- without using the Interface dropdown. The section is hidden -- in system interface. -- Interface is not system page_utils.add_menubar_section({ section = page_utils.menu_sections.monitoring, hidden = is_system_interface or not is_admin, entries = {{ entry = page_utils.menu_entries.active_monitoring, hidden = is_windows, url = "/lua/active_monitoring.lua" }, { entry = page_utils.menu_entries.network_discovery, hidden = not is_discoverable_interface or is_windows or is_loopback_interface or limit_resource_usage or infrastructure_view, url = "/lua/discover.lua" }, { entry = page_utils.menu_entries.infrastructure_dashboard, hidden = (not is_enterprise_L and not is_nedge_enterprise) or not is_admin, url = '/lua/pro/enterprise/infrastructure_config.lua' }, { entry = page_utils.menu_entries.snmp_monitoring, hidden = (not is_enterprise_M and not is_nedge_enterprise), url = "/lua/pro/enterprise/snmpdevices_stats.lua" }, { entry = page_utils.menu_entries.vulnerability_scan, url = '/lua/vulnerability_scan.lua', hidden = not is_vs_utils_available or is_zmq_interface }} }) -- ############################################## -- Alerts page_utils.add_menubar_section({ section = page_utils.menu_sections.alerts, hidden = not prefs.are_alerts_enabled or not auth.has_capability(auth.capabilities.alerts) or is_db_view_interface or infrastructure_view, entries = {{ entry = page_utils.menu_entries.alerts_list, url = "/lua/alert_stats.lua" }, { entry = page_utils.menu_entries.alerts_graph, url = "/lua/pro/alerts_graph.lua", hidden = (not is_enterprise_L and not is_nedge_enterprise) or (not has_ch_support) or (is_pcap_dump) }, { entry = page_utils.menu_entries.alerts_geomap, url = "/lua/pro/alerts_geomap.lua", hidden = true or (not is_enterprise_XL) }, { entry = page_utils.menu_entries.alerts_analysis, url = "/lua/pro/enterprise/alerts_analysis.lua", hidden = (not is_enterprise) or is_pcap_dump }, { entry = page_utils.menu_entries.divider }, { entry = page_utils.menu_sections.notifications, hidden = (not is_admin) or is_pcap_dump, url = '/lua/admin/endpoint_notifications_list.lua' }} }) -- ############################################## -- Flows page_utils.add_menubar_section({ section = page_utils.menu_sections.flows, hidden = is_asn_mode_enabled or (is_system_interface or infrastructure_view), entries = {{ entry = page_utils.menu_entries.active_flows, url = "/lua/flows_stats.lua" }, { entry = page_utils.menu_entries.db_explorer, hidden = (not is_enterprise and not is_nedge_enterprise) or not auth.has_capability(auth.capabilities.historical_flows) or ifid_stats.isViewed or ifid_stats['type'] == 'db' or not has_ch_support, url = "/lua/pro/db_search.lua" }, { entry = page_utils.menu_entries.server_ports, url = '/lua/server_ports.lua', hidden = not is_enterprise_L }, { entry = page_utils.menu_entries.divider }, { entry = page_utils.menu_entries.bgp_looking_glass, url = '/lua/bgp_looking_glass.lua', hidden = isEmptyString(ntop.getPref("ntopng.prefs.bgp_server.ip_address")) or isEmptyString(ntop.getPref('ntopng.prefs.bgp_server.port')) }} }) -- ############################################## -- chatbot, hide if viewed interface or system or not enterprise xl page_utils.add_menubar_section({ section = page_utils.menu_sections.nanalyst, hidden = not page_utils.has_nanalyst(), entries = {{ entry = page_utils.menu_entries.nanalyst, url = '/lua/pro/nanalyst.lua' },{ entry = page_utils.menu_entries.ai_policy, url = '/lua/pro/ai_policy.lua' }, { entry = page_utils.menu_entries.analyst_pipeline, url = '/lua/pro/analyst_pipeline.lua' }, { entry = page_utils.menu_entries.ai_usage_stats, url = '/lua/pro/ai_stats.lua' },{ entry = page_utils.menu_entries.ai_audit, url = '/lua/pro/ai_audit.lua' }, }}) -- ############################################## -- Views menu entry for ASN Mode -- Group hosts, flows page_utils.add_menubar_section({ section = page_utils.menu_sections.views, hidden = not is_asn_mode_enabled or (is_system_interface or is_viewed or infrastructure_view), entries = {{ entry = page_utils.menu_entries.hosts_asn_mode, url = '/lua/hosts_stats.lua' }, { entry = page_utils.menu_entries.active_flows_asn_mode, url = "/lua/flows_stats.lua" }, { entry = page_utils.menu_entries.historical_flows_asn_mode, hidden = (not is_enterprise and not is_nedge_enterprise) or not auth.has_capability(auth.capabilities.historical_flows) or ifid_stats.isViewed or ifid_stats['type'] == 'db' or not has_ch_support, url = "/lua/pro/db_search.lua" }, { entry = page_utils.menu_entries.server_ports_asn_mode, url = '/lua/server_ports.lua', hidden = not is_enterprise_L }, { entry = page_utils.menu_entries.divider }, { entry = page_utils.menu_entries.bgp_looking_glass, url = '/lua/bgp_looking_glass.lua', hidden = isEmptyString(ntop.getPref("ntopng.prefs.bgp_server.ip_address")) or isEmptyString(ntop.getPref('ntopng.prefs.bgp_server.port')) }} }) -- ############################################## -- Hosts page_utils.add_menubar_section({ section = page_utils.menu_sections.hosts, hidden = is_system_interface or is_viewed or infrastructure_view or is_asn_mode_enabled, entries = {{ entry = page_utils.menu_entries.hosts, url = '/lua/hosts_stats.lua' }, { entry = page_utils.menu_entries.devices, hidden = (not ifid_stats.has_macs), url = '/lua/macs_stats.lua' }, { entry = page_utils.menu_entries.divider }, { hidden = not (is_enterprise_M and not is_windows) or not asset_inventory_enabled, entry = page_utils.menu_entries.assets, url = '/lua/pro/assets.lua' }} }) -- ############################################## -- Exporters local has_exporters = (ifid_stats.type == "zmq") or (ifid_stats.type == "custom") or (is_pro and (table.len(flowDevices) > 0)) page_utils.add_menubar_section({ section = page_utils.menu_sections.collection, hidden = not has_exporters or not is_enterprise_M or is_system_interface or infrastructure_view, entries = {{ entry = page_utils.menu_entries.sflow_exporters, hidden = table.len(sFlowDevices) == 0, url = '/lua/pro/enterprise/sflowdevices_stats.lua' }, { entry = page_utils.menu_entries.nprobe, url = '/lua/pro/enterprise/nprobe.lua' }, { entry = page_utils.menu_entries.exporters_interfaces_stats, url = '/lua/pro/exporters_interfaces_stats.lua' }, { entry = page_utils.menu_entries.observation_points, hidden = (num_obs_points) == 0, url = '/lua/pro/enterprise/observation_points.lua' }} }) end -- ############################################## -- Maps local service_map_available = false local asset_map_available = is_enterprise_XL service_map_available, _ = behavior_utils.mapsAvailable() page_utils.add_menubar_section({ section = page_utils.menu_sections.maps, hidden = is_system_interface or is_viewed or infrastructure_view, entries = {{ entry = page_utils.menu_entries.analysis_map, hidden = not service_map_available, url = '/lua/pro/enterprise/network_maps.lua?map=service_map' }, { entry = page_utils.menu_entries.geo_map, hidden = is_loopback_interface or not is_geoip_enabled, url = '/lua/hosts_geomap.lua' }, { entry = page_utils.menu_entries.hosts_map, hidden = not is_enterprise or is_asn_mode_enabled, url = '/lua/pro/enterprise/hosts_map.lua' }} }) -- ############################################## -- Interface page_utils.add_menubar_section({ hidden = is_system_interface or infrastructure_view, section = page_utils.menu_sections.if_stats, entries = {{ entry = page_utils.menu_entries.interface, url = "/lua/if_stats.lua" }, { entry = page_utils.menu_entries.divider }, { entry = page_utils.menu_entries.networks, hidden = is_viewed_interface, url = '/lua/network_stats.lua' }, { entry = page_utils.menu_entries.host_pools, hidden = is_nedge, url = '/lua/pool_stats.lua' }, { entry = page_utils.menu_entries.autonomous_systems, hidden = (not is_geoip_enabled) or is_viewed_interface, url = '/lua/as_stats.lua' }, { entry = page_utils.menu_entries.countries, hidden = not is_geoip_enabled or is_viewed_interface, url = '/lua/country_stats.lua' }, { entry = page_utils.menu_entries.vlans, hidden = not has_vlans or is_viewed_interface, url = '/lua/vlan_stats.lua' }, { entry = page_utils.menu_entries.pods, hidden = not ifid_stats.has_seen_pods, url = '/lua/pods_stats.lua' }, { entry = page_utils.menu_entries.containers, hidden = not ifid_stats.has_seen_containers, url = '/lua/containers_stats.lua' }} }) -- ############################################## -- System Health local 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' }, { entry = page_utils.menu_entries.influxdb_status, url = '/lua/monitor/influxdb_monitor.lua', hidden = not is_influxdb_enabled }, { entry = page_utils.menu_entries.redis_status, url = '/lua/monitor/redis_monitor.lua', hidden = false -- TODO: add a check for redis monitoring status }, { entry = page_utils.menu_entries.clickhouse_status, url = '/lua/pro/enterprise/monitor/clickhouse_monitor.lua', hidden = not has_ch_support }} -- Add script entries relative to system health (e.g., redis) ... for k, entry in pairsByField(page_utils.scripts_menu, "sort_order", rev) do -- NOTE: match on the health key to only pick the right subset of entries if entry.menu_entry.section == page_utils.menu_sections.health.key then health_entries[#health_entries + 1] = { entry = page_utils.menu_entries[entry.menu_entry.key], url = entry.url } end end page_utils.add_menubar_section({ hidden = not is_system_interface, section = page_utils.menu_sections.health, entries = health_entries }) -- ############################################## -- Pollers (e.g., SNMP, active monitoring) -- System interface menu local poller_entries = {{ entry = page_utils.menu_entries.divider }, { hidden = not asset_inventory_enabled, entry = page_utils.menu_entries.assets_snmp, url = '/lua/pro/assets.lua' }, { entry = page_utils.menu_entries.snmp, hidden = not is_system_interface or (not is_enterprise_M and not is_nedge_enterprise), url = "/lua/pro/enterprise/snmpdevices_stats.lua" }, { entry = page_utils.menu_entries.active_monitoring, hidden = not is_system_interface, url = "/lua/active_monitoring.lua" }, { entry = page_utils.menu_entries.infrastructure_dashboard, hidden = (not is_enterprise_L and not is_nedge_enterprise) or not is_admin, url = '/lua/pro/enterprise/infrastructure_config.lua' }} -- Add script entries relative to pollers (e.g., active monitoring) ... for k, entry in pairsByField(page_utils.scripts_menu, "sort_order", rev) do if entry.menu_entry.section == page_utils.menu_sections.pollers.key then poller_entries[#poller_entries + 1] = { entry = page_utils.menu_entries[entry.menu_entry.key], url = entry.url } end end page_utils.add_menubar_section({ hidden = not is_system_interface, section = page_utils.menu_sections.pollers, entries = poller_entries }) -- ############################################## -- System local system_entries = {} -- Add script entries... for k, entry in pairsByField(page_utils.scripts_menu, "sort_order", rev) do -- Skip pollers, they've already been set under pollers section if not entry.menu_entry.section == "pollers" then system_entries[#system_entries + 1] = { entry = page_utils.menu_entries[entry.menu_entry.key], url = entry.url } end end -- Possibly add nEdge entries if is_nedge or is_appliance then -- Possibly add a divider if system_entries already contain elements if #system_entries > 0 then system_entries[#system_entries + 1] = { entry = page_utils.menu_entries.divider, hidden = not is_admin } end end if is_nedge then for _, entry in ipairs({{ entry = page_utils.menu_entries.system_setup, hidden = not is_admin, url = '/lua/system_setup_ui/interfaces.lua' }, { entry = page_utils.menu_entries.dhcp_static_leases, hidden = not is_admin or not is_routing_mode, url = '/lua/pro/nedge/admin/dhcp_leases.lua' }, { entry = page_utils.menu_entries.dhcp_active_leases, hidden = not is_admin or not is_routing_mode, url = '/lua/pro/nedge/admin/dhcp_active_leases.lua' }, { entry = page_utils.menu_entries.port_forwarding, hidden = not is_admin or not is_routing_mode, url = '/lua/pro/nedge/admin/port_forwarding.lua' }, { entry = page_utils.menu_entries.rules_config, hidden = not is_admin or not is_routing_mode, url = '/lua/pro/nedge/admin/rules_config.lua' }, { entry = page_utils.menu_entries.forwarders_config, hidden = not is_admin or not is_routing_mode, url = '/lua/pro/nedge/admin/forwarders_config.lua' }}) do system_entries[#system_entries + 1] = entry end end if is_appliance then for _, entry in ipairs({{ entry = page_utils.menu_entries.system_setup, hidden = not is_admin, url = '/lua/system_setup_ui/mode.lua' }}) do system_entries[#system_entries + 1] = entry end end if #system_entries > 0 then page_utils.add_menubar_section({ section = page_utils.menu_sections.system_stats, hidden = not is_allowed_sys_interface or not is_system_interface, entries = system_entries }) end -- ############################################## -- Pools page_utils.add_menubar_section({ hidden = true, -- Always add the pools menu (moved to the Hosts submenu) 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' }} }) -- ############################################## -- Notifications page_utils.add_menubar_section({ section = page_utils.menu_sections.notifications, hidden = not is_system_interface or not is_admin, url = '/lua/admin/endpoint_notifications_list.lua' }) -- ############################################## local scripts_config_url = "/lua/admin/edit_configset.lua?subdir=all" if tonumber(system_ifid) == tonumber(current_ifid) then scripts_config_url = "/lua/admin/edit_configset.lua?subdir=system" end -- Rules & Policies page_utils.add_menubar_section({ section = page_utils.menu_sections.policies, hidden = infrastructure_view or not is_admin, entries = {{ entry = page_utils.menu_entries.access_control_list, hidden = not is_admin or not is_enterprise_L or is_asn_mode_enabled, url = '/lua/pro/admin/access_control_list.lua' }, { entry = page_utils.menu_entries.device_protocols, hidden = not is_admin or is_asn_mode_enabled, url = '/lua/admin/edit_device_protocols.lua' }, { entry = page_utils.menu_entries.device_exclusions, section = page_utils.menu_sections.hosts, hidden = not is_admin or not auth.has_capability(auth.capabilities.checks) or not is_enterprise_M or not devices_exclusion_enabled, url = '/lua/pro/admin/edit_device_exclusions.lua' }, { entry = page_utils.menu_entries.network_config, section = page_utils.menu_sections.admin, hidden = not is_admin or not auth.has_capability(auth.capabilities.checks), url = '/lua/admin/network_configuration.lua' }, { entry = page_utils.menu_entries.traffic_rules, url = '/lua/pro/traffic_rules.lua', hidden = not is_enterprise or not is_admin }, { entry = page_utils.menu_entries.divider }, { entry = page_utils.menu_entries.scripts_config, section = page_utils.menu_sections.checks, hidden = not is_admin or not auth.has_capability(auth.capabilities.checks), url = scripts_config_url }, { entry = page_utils.menu_entries.alert_exclusions, section = page_utils.menu_sections.admin, hidden = not is_admin or not auth.has_capability(auth.capabilities.checks) or not is_enterprise_M or (tonumber(system_ifid) == tonumber(current_ifid)), url = '/lua/pro/admin/edit_alert_exclusions.lua?subdir=host' }, { entry = page_utils.menu_entries.divider }, { entry = page_utils.menu_entries.profiles, hidden = not is_admin or not is_pro or is_nedge or is_asn_mode_enabled, url = '/lua/pro/admin/edit_profiles.lua' }} }) page_utils.add_menubar_section({ section = page_utils.menu_sections.admin, hidden = not is_admin, entries = {{ entry = page_utils.menu_entries.nedge_users, hidden = not is_admin or not is_nedge, url = '/lua/pro/nedge/admin/nf_list_users.lua' }, { entry = page_utils.menu_entries.manage_users, -- Note: 'not _SESSION["localuser"]' indicates that this is an external -- user (e.g. LDAP), in that case allow users management if fallback is enabled. hidden = not is_admin or (not _SESSION["localuser"] and not has_local_auth), url = '/lua/admin/users.lua' }, { entry = page_utils.menu_entries.preferences, hidden = not is_admin, url = '/lua/admin/prefs.lua' }, { hidden = not is_admin, entry = page_utils.menu_entries.tags, url = '/lua/tags.lua' }, { entry = page_utils.menu_entries.divider }, { entry = page_utils.menu_entries.category_lists, hidden = not is_admin, url = '/lua/admin/blacklists.lua?enabled_status=enabled' }, { entry = page_utils.menu_entries.manage_configurations, hidden = not is_admin or not has_dump_cache, url = '/lua/admin/manage_configurations.lua' }, { entry = page_utils.menu_entries.divider }, { entry = page_utils.menu_entries.categories, hidden = not is_admin, url = '/lua/admin/edit_categories.lua' }} }) -- ############################################## -- Developer if not info.oem and auth.has_capability(auth.capabilities.developer) then if not is_enterprise_M or (has_developer_enabled) then page_utils.add_menubar_section({ section = page_utils.menu_sections.dev, entries = {{ entry = page_utils.menu_entries.rest_api, url = '/lua/swagger.lua' }, { entry = page_utils.menu_entries.analyze_pcap, url = '/lua/upload_pcap.lua' }, { entry = page_utils.menu_entries.manage_data, hidden = not is_admin, url = '/lua/manage_data.lua' }, { entry = page_utils.menu_entries.checks_dev, url = '/lua/checks_overview.lua' }, { entry = page_utils.menu_entries.alert_definitions, url = '/lua/defs_overview.lua' }, { entry = page_utils.menu_entries.ts_definitions, url = '/lua/ts_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/' }} }) end end -- ############################################## -- About if not is_enterprise_M or has_help_enabled then 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.license, hidden = (not is_admin), url = '/lua/license.lua' }, { entry = page_utils.menu_entries.limits, hidden = (not is_admin), url = '/lua/limits.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/' }} }) end -- ############################################## page_utils.print_menubar() -- ############################################## -- Interface print([[ ]]) -- begging of #n-container print([[
]]) -- ################################################### -- Render toasts toasts_manager.render_toasts("main-container", toasts_manager.load_main_toasts()) -- ################################################### print("
") -- Hidden by default, will be shown by the footer if necessary print( '') -- Hidden by default, will be shown by the footer if necessary print( '') -- See if we are starting up and display an informative message local secs_to_first_data = interface.getSecsToFirstData() -- Do not show messages that stay too short on screen (5 sec or more) if secs_to_first_data > 5 then print [[ ]] end if (_SESSION["INVALID_CSRF"]) then print( '') end -- end of main alerts print("
") -- append password change modal if (not is_admin) then dofile(dirs.installdir .. "/scripts/lua/inc/password_dialog.lua") end