> 
    generate_url(array('page' => 'dashboard')), 'icon' => $config['icon']['globe']); // Dashboards if ($_SESSION['userlevel'] > 7) { $dashboards = dbFetchRows("SELECT * FROM `dashboards`"); $entries = array(); if (safe_count($dashboards)) { //$navbar['observium']['dash']['text'] = "Dashboards"; foreach ($dashboards as $dash) { $entries[] = array('text' => $dash['dash_name'], 'url' => generate_url(array('page' => "dashboard", 'dash' => $dash['dash_id'])), 'icon' => $config['icon']['overview']); } } $entries[] = array('divider' => TRUE); $entries[] = array('title' => 'Create Dashboard', 'url' => generate_url(array('page' => 'dashboard_add')), 'icon' => $config['icon']['plus']); } $navbar['observium']['entries'][] = array('title' => 'Dashboard', 'url' => generate_url(array('page' => 'dashboard')), 'icon' => $config['icon']['overview'], 'entries' => $entries); $navbar['observium']['entries'][] = array('divider' => TRUE); unset($entries); // End Dashboards // Weathermaps if ($config['weathermap']['enable'] === TRUE && $_SESSION['userlevel'] > 7) { $entries = array(); foreach(dbFetchRows("SELECT * FROM `weathermaps`") as $weathermap) { $entries[] = array('text' => $weathermap['wmap_name'], 'url' => generate_url(array('page' => "wmap", 'mapname' => $weathermap['wmap_name'])), 'icon' => 'sprite-map'); } $navbar['observium']['entries'][] = array('title' => 'Weathermaps', 'url' => generate_url(array('page' => 'wmap')), 'icon' => 'sprite-map-2', 'entries' => $entries); $navbar['observium']['entries'][] = array('divider' => TRUE); } // End Weathermaps // Show Groups if (OBSERVIUM_EDITION !== 'community' && $_SESSION['userlevel'] >= 5) { $group_menu = array(); $entity_group_menu = array(); $group_menu[] = array('url' => generate_url(array('page' => 'group_add')), 'title' => 'Create New Group', 'icon' => $config['icon']['plus']); $group_count = 0; $groups_count = []; $group_menu_simple = []; $group_menu_nested = [ [ 'divider' => TRUE ] ]; $groups_by_type = get_groups_by_type(); $groups_by_type_count = safe_count($groups_by_type); // Reduce individual group queries $ids = []; foreach ($groups_by_type as $type => $groups) { foreach ($groups as $group) { $ids[] = $group['group_id']; } } foreach (dbFetchRows("SELECT COUNT(*) AS `count`, `group_id` FROM `group_table` WHERE 1" . generate_query_values($ids, 'group_id') . " GROUP BY `group_id`") as $entry) { $groups_count[$entry['group_id']] = $entry['count']; } unset($ids); //r($groups_count); foreach ($groups_by_type as $type => $groups) { $group_menu_entries = [ 'url' => generate_url(array('page' => 'groups', 'entity_type' => $type)), 'title' => $config['entities'][$type]['names'], 'icon' => $config['entities'][$type]['icon'], 'count' => safe_count($groups) ]; $group_count += safe_count($groups); foreach ($groups as $group) { //$group['member_count'] = dbFetchCell("SELECT COUNT(*) FROM `group_table` WHERE `group_id` = ?", array($group['group_id'])); $group['member_count'] = $groups_count[$group['group_id']]; $entity_type = $config['entities'][$group['entity_type']]; $group_menu_entries['entries'][] = array('url' => generate_url(array('page' => 'group', 'group_id' => $group['group_id'])), 'title' => escape_html($group['group_name']), 'icon' => $config['entities'][$group['entity_type']]['icon'], 'count' => $group['member_count']); $entity_group_menu[$group['entity_type']][] = array('url' => generate_url(array('page' => 'group', 'group_id' => $group['group_id'])), 'title' => escape_html($group['group_name']), 'icon' => $config['entities'][$group['entity_type']]['icon'], 'count' => $group['member_count']); } // Nested $group_menu_nested[] = $group_menu_entries; // Simple $group_menu_simple[] = [ 'divider' => TRUE ]; if ($groups_by_type_count > 3 && safe_count($groups) > 7) { // Force nested for single group type $group_menu_simple[] = $group_menu_entries; } else { $group_menu_simple = array_merge($group_menu_simple, $group_menu_entries['entries']); } } if ($groups_by_type_count > 2 && $group_count > 30) { $navbar['observium']['entries'][] = [ 'title' => 'Groups', 'url' => generate_url(array('page' => 'groups')), 'icon' => $config['icon']['group'], 'count' => $group_count, 'entries' => array_merge($group_menu, $group_menu_nested) ]; } else { $navbar['observium']['entries'][] = [ 'title' => 'Groups', 'url' => generate_url(array('page' => 'groups')), 'icon' => $config['icon']['group'], 'count' => $group_count, 'entries' => array_merge($group_menu, $group_menu_simple) ]; } //$navbar['observium']['entries'][] = [ 'title' => 'Groups', 'url' => generate_url(array('page' => 'groups')), 'icon' => $config['icon']['group'], 'count' => $group_count, 'entries' => $group_menu]; $navbar['observium']['entries'][] = array('divider' => TRUE); unset($group_menu, $group_menu_simple, $group_menu_nested, $group_menu_entries, $groups_by_type); } $navbar['observium']['entries'][] = array('title' => 'Alerts', 'url' => generate_url(array('page' => 'alerts')), 'icon' => $config['icon']['alert']); if ($_SESSION['userlevel'] >= 5) { $alert_checks[] = array('url' => generate_url(array('page' => 'add_alert_check')), 'title' => 'Create New Checker', 'icon' => $config['icon']['plus']); $alert_checks[] = array('divider' => TRUE); $counts['alert_checks'] = 0; foreach(dbFetchRows("SELECT * FROM `alert_tests` ORDER BY entity_type, alert_name") AS $alert_check) { $counts['alert_checks']++; $alert_checks[] = array('url' => generate_url(array('page' => 'alert_check', 'alert_test_id' => $alert_check['alert_test_id'])), 'title' => escape_html($alert_check['alert_name']), 'icon' => $config['entities'][$alert_check['entity_type']]['icon']); } //$counts['alert_checks'] = dbFetchCell("SELECT COUNT(*) FROM `alert_tests`"); $navbar['observium']['entries'][] = array('title' => 'Alert Checks', 'url' => generate_url(array('page' => 'alert_checks')), 'count' => $counts['alert_checks'], 'icon' => $config['icon']['alert-rules'], 'entries' => $alert_checks); } $navbar['observium']['entries'][] = array('title' => 'Alert Logs', 'url' => generate_url(array('page' => 'alert_log')), 'icon' => $config['icon']['alert-log']); if (OBSERVIUM_EDITION !== 'community') { $navbar['observium']['entries'][] = array('title' => 'Scheduled Maintenance', 'url' => generate_url(array('page' => 'alert_maintenance')), 'icon' => $config['icon']['scheduled-maintenance'], 'userlevel' => 7); } $navbar['observium']['entries'][] = array('divider' => TRUE); if (isset($config['enable_syslog']) && $config['enable_syslog']) { $navbar['observium']['entries'][] = array('title' => 'Syslog', 'url' => generate_url(array('page' => 'syslog')), 'icon' => $config['icon']['syslog']); if (OBSERVIUM_EDITION !== 'community') { $navbar['observium']['entries'][] = array('title' => 'Syslog Alerts', 'url' => generate_url(array('page' => 'syslog_alerts')), 'icon' => $config['icon']['syslog-alerts']); $navbar['observium']['entries'][] = array('title' => 'Syslog Rules', 'url' => generate_url(array('page' => 'syslog_rules')), 'icon' => $config['icon']['syslog-rules'], 'userlevel' => 7); $navbar['observium']['entries'][] = array('divider' => TRUE); } } if (isset($config['enable_map']) && $config['enable_map']) { // FIXME link is wrong. Is this a supported feature? No. It smells. HTML page was removed, map.php generator code remains. See replacement below. $navbar['observium']['entries'][] = array('title' => 'Network Map', 'url' => generate_url(array('page' => 'map')), 'icon' => $config['icon']['netmap']); } $navbar['observium']['entries'][] = array('title' => 'Network Map', 'url' => generate_url(array('page' => 'map')), 'icon' => $config['icon']['netmap']); $navbar['observium']['entries'][] = array('title' => 'Event Log', 'url' => generate_url(array('page' => 'eventlog')), 'icon' => $config['icon']['eventlog']); $navbar['observium']['entries'][] = array('divider' => TRUE); if ($_SESSION['userlevel'] >= 7) { // Print Contacts $counts['contacts'] = dbFetchCell("SELECT COUNT(*) FROM `alert_contacts`"); $navbar['observium']['entries'][] = array('title' => 'Contacts', 'url' => generate_url(array('page' => 'contacts')), 'count' => $counts['contacts'], 'icon' => $config['icon']['contacts']); $navbar['observium']['entries'][] = array('divider' => TRUE); } if (OBSERVIUM_EDITION !== 'community' && $_SESSION['userlevel'] >= 5) { // Custom OIDs $oids = dbFetchRows("SELECT `oids`.*, COUNT(*) AS `count` FROM `oids` JOIN `oids_entries` ON `oids`.`oid_id` = `oids_entries`.`oid_id` WHERE 1 GROUP BY `oids`.`oid_id`"); $oid_count = safe_count($oids); foreach ($oids AS $oid) { $oids_menu[] = array('title' => $oid['oid_descr'], 'url' => generate_url(array('page' => 'customoid', 'oid_id' => $oid['oid_id'])), 'count' => $oid['count'], 'icon' => $config['icon']['customoid']); } $navbar['observium']['entries'][] = array('title' => 'Custom OIDs', 'url' => generate_url(array('page' => 'customoids')), 'count' => $oid_count, 'icon' => $config['icon']['customoid'], 'entries' => $oids_menu); //$navbar['observium']['entries'][] = array('divider' => TRUE); $navbar['observium']['entries'][] = array('title' => 'Probes', 'url' => generate_url(array('page' => 'probes')), 'icon' => $config['icon']['status']); $navbar['observium']['entries'][] = array('divider' => TRUE); } $navbar['observium']['entries'][] = array('title' => 'Hardware Inventory', 'url' => generate_url(array('page' => 'inventory')), 'icon' => $config['icon']['inventory']); if ($cache['packages']['count']) { $navbar['observium']['entries'][] = array('title' => 'Software Packages', 'url' => generate_url(array('page' => 'packages')), 'icon' => $config['icon']['packages']); } $navbar['observium']['entries'][] = array('divider' => TRUE); // Build search submenu $search_sections = array('ipv4' => 'IPv4 Address', 'ipv6' => 'IPv6 Address', 'mac' => 'MAC Address', 'arp' => 'ARP/NDP Tables', 'fdb' => 'FDB Tables'); if ($cache['wifi_sessions']['count']) { $search_sections['dot1x'] = '.1x Sessions'; } foreach ($search_sections as $search_page => $search_name) { $search_menu[] = array('title' => $search_name, 'url' => generate_url(array('page' => 'search', 'search' => $search_page)), 'icon' => $config['icon']['search']); } $navbar['observium']['entries'][] = array('title' => 'Search', 'url' => generate_url(array('page' => 'search')), 'icon' => $config['icon']['search'], 'entries' => $search_menu); //////////// Build devices menu $navbar['devices'] = array('url' => generate_url(array('page' => 'devices')), 'icon' => $config['icon']['devices'], 'title' => 'Devices'); $navbar['devices']['entries'][] = array('title' => 'All Devices', 'count' => $cache['devices']['stat']['count'], 'count_array' => $cache['devices']['stat'], 'url' => generate_url(array('page' => 'devices')), 'icon' => $config['icon']['devices']); if (safe_count($entity_group_menu['device'])) { $navbar['devices']['entries'][] = array('divider' => TRUE); $navbar['devices']['entries'][] = array('title' => 'Groups', 'url' => generate_url(array('page' => 'groups', 'entity_type' => 'device')), 'icon' => $config['icon']['group'], 'count' => safe_count($entity_group_menu['device']), 'entries' => $entity_group_menu['device']); } $navbar['devices']['entries'][] = array('divider' => TRUE); // Build location submenu if ($config['show_locations']) { switch ($config['location']['menu']['type']) { case 'geocoded': $navbar['devices']['entries'][] = array('locations' => TRUE); // Pretty complicated recursive function, workaround not having it converted to returning an array break; case 'nested': $locations = array('title' => 'Locations', 'icon' => $config['icon']['location']); // Init empty array foreach (get_locations() as $location) { // If location is empty, substitute by OBS_VAR_UNSET as empty location parameter would be ignored $name = ($location === '' ? OBS_VAR_UNSET : escape_html($location)); $location_split = explode($config['location']['menu']['nested_split_char'], $name, $config['location']['menu']['nested_max_depth']); // Turn array around if nested reversed option is active if ($config['location']['menu']['nested_reversed']) { $location_split = array_reverse($location_split); } $ref = &$locations; // Start from top menu array for ($i = 0; $i < safe_count($location_split); $i++) { $location_part = trim($location_split[$i]); $ref = &$ref['entries'][$location_part]; if (!is_array($ref)) { // Get partial location string up to the point where we are $location_slice = array_slice($location_split, 0, $i + 1); // Turn array around again (to normal presentation) if nested reversed option is active if ($config['location']['menu']['nested_reversed']) { $location_slice = array_reverse($location_slice); } // Generate URL based on slice $location_url = generate_url(array('page' => 'devices', 'location_text' => '"'. trim(implode($config['location']['menu']['nested_split_char'], $location_slice)).'"' )); $ref = array('icon' => $config['icon']['location'], 'title' => $location_part, 'url' => $location_url); } } } $navbar['devices']['entries'][] = $locations; break; case 'plain': default: foreach (get_locations() as $location) { // If location is empty, substitute by OBS_VAR_UNSET as empty location parameter would be ignored $name = ($location === '' ? OBS_VAR_UNSET : escape_html($location)); // No nested menu, just list all locations one after another $location_menu[] = array('url' => generate_location_url($location), 'icon' => $config['icon']['location'], 'title' => $name); } $navbar['devices']['entries'][] = array('title' => 'Locations', 'url' => generate_url(array('page' => 'locations')), 'icon' => $config['icon']['locations'], 'entries' => $location_menu); break; } $navbar['devices']['entries'][] = array('divider' => TRUE); } // Build list per device type foreach ($config['device_types'] as $devtype) { if (array_key_exists($devtype['type'], (array)$cache['device_types'])) { $navbar['devices']['entries'][] = array('title' => $devtype['text'], 'icon' => $devtype['icon'], 'count_array' => $cache['devices']['types'][$devtype['type']], 'count' => $cache['device_types'][$devtype['type']], 'url' => generate_url(array('page' => 'devices', 'type' => $devtype['type']))); } } if ($cache['devices']['stat']['down'] + $cache['devices']['stat']['ignored'] + $cache['devices']['stat']['disabled']) { $navbar['devices']['entries'][] = array('divider' => TRUE); if ($cache['devices']['stat']['down']) { $navbar['devices']['entries'][] = array('url' => generate_url(array('page' => 'devices', 'status' => '0')), 'icon' => $config['icon']['exclamation'], 'title' => 'Down', 'count_array' => ['down' => $cache['devices']['stat']['down']]); } if ($cache['devices']['stat']['ignored']) { $navbar['devices']['entries'][] = array('url' => generate_url(array('page' => 'devices', 'ignore' => '1')), 'icon' => $config['icon']['ignore'], 'title' => 'Ignored', 'count_array' => ['ignored' => $cache['devices']['stat']['ignored']]); } if ($cache['devices']['stat']['disabled']) { $navbar['devices']['entries'][] = array('url' => generate_url(array('page' => 'devices', 'disabled' => '1')), 'icon' => $config['icon']['shutdown'], 'title' => 'Disabled', 'count_array' => ['disabled' => $cache['devices']['stat']['disabled']]); } } if ($_SESSION['userlevel'] >= 10) { $navbar['devices']['entries'][] = array('divider' => TRUE); $navbar['devices']['entries'][] = array('url' => generate_url(array('page' => 'addhost')), 'icon' => $config['icon']['plus'], 'title' => 'Add Device'); $navbar['devices']['entries'][] = array('url' => generate_url(array('page' => 'delhost')), 'icon' => $config['icon']['minus'], 'title' => 'Delete Device'); } if ($cache['vm']['count']) { $navbar['devices']['entries'][] = array('divider' => TRUE); $navbar['devices']['entries'][] = array('title' => 'Virtual Machines', 'count' => $cache['vm']['count'], 'url' => generate_url(array('page' => 'vms')), 'icon' => $config['icon']['virtual-machine']); } //////////// Build ports menu $navbar['ports'] = array('url' => generate_url(array('page' => 'ports')), 'icon' => $config['entities']['port']['icon'], 'title' => 'Ports'); $navbar['ports']['entries'][] = array('title' => 'All Ports', 'count' => $cache['ports']['stat']['count'], 'url' => generate_url(array('page' => 'ports')), 'icon' => $config['entities']['port']['icon']); $navbar['ports']['entries'][] = array('divider' => TRUE); if (safe_count($entity_group_menu['port'])) { $navbar['ports']['entries'][] = array('title' => 'Groups', 'url' => generate_url(array('page' => 'groups', 'entity_type' => 'port')), 'icon' => $config['icon']['group'], 'count' => safe_count($entity_group_menu['port']), 'entries' => $entity_group_menu['port']); $navbar['ports']['entries'][] = array('divider' => TRUE); } $navbar['ports']['entries'][] = array('title' => 'VLANs', 'url' => generate_url(array('page' => 'vlan')), 'icon' => $config['icon']['vlan']); $navbar['ports']['entries'][] = array('divider' => TRUE); if ($cache['p2pradios']['count']) { $navbar['ports']['entries'][] = array('title' => 'P2P Radios', 'count' => $cache['p2pradios']['count'], 'url' => generate_url(array('page' => 'p2pradios')), 'icon' => $config['entities']['p2pradio']['icon']); $navbar['ports']['entries'][] = array('divider' => TRUE); } if ($config['enable_billing']) { $navbar['ports']['entries'][] = array('title' => 'Traffic Accounting', 'url' => generate_url(array('page' => 'bills')), 'icon' => $config['icon']['billing']); $ifbreak = 1; } if ($cache['neighbours']['count']) { $navbar['ports']['entries'][] = array('title' => 'Neighbours', 'url' => generate_url(array('page' => 'neighbours')), 'icon' => $config['icon']['neighbours'], 'count' => $cache['neighbours']['count']); $ifbreak = 1; } if ($config['enable_pseudowires'] && $cache['pseudowires']['count']) { $navbar['ports']['entries'][] = array('title' => 'Pseudowires', 'count' => $cache['pseudowires']['count'], 'url' => generate_url(array('page' => 'pseudowires')), 'icon' => $config['icon']['pseudowire']); $ifbreak = 1; } if ($cache['mac_accounting']['count']) { $navbar['ports']['entries'][] = array('title' => 'MAC Accounting', 'count' => $cache['mac_accounting']['count'], 'url' => generate_url(array('page' => 'ports', 'mac_accounting' => 'yes')), 'icon' => $config['icon']['port']); $ifbreak = 1; } if ($cache['cbqos']['count']) { $navbar['ports']['entries'][] = array('title' => 'CBQoS', 'count' => $cache['cbqos']['count'], 'url' => generate_url(array('page' => 'ports', 'cbqos' => 'yes')), 'icon' => $config['icon']['cbqos']); $ifbreak = 1; } if ($cache['sla']['count']) { $navbar['ports']['entries'][] = array('title' => 'IP SLA', 'count' => $cache['sla']['count'], 'url' => generate_url(array('page' => 'slas')), 'icon' => $config['icon']['sla']); $ifbreak = 1; } if ($ifbreak) { $navbar['ports']['entries'][] = array('divider' => TRUE); $ifbreak = 0; } if ($_SESSION['userlevel'] >= '5') { // FIXME new icons if ($config['int_customers']) { $navbar['ports']['entries'][] = array('url' => generate_url(array('page' => 'customers')), 'icon' => $config['icon']['port-customer'], 'title' => 'Customers'); $ifbreak = 1; } if ($config['int_l2tp']) { $navbar['ports']['entries'][] = array('url' => generate_url(array('page' => 'iftype', 'type' => 'l2tp')), 'icon' => $config['icon']['users'], 'title' => 'L2TP'); $ifbreak = 1; } if ($config['int_transit']) { $navbar['ports']['entries'][] = array('url' => generate_url(array('page' => 'iftype', 'type' => 'transit')), 'icon' => $config['icon']['port-transit'], 'title' => 'Transit'); $ifbreak = 1; } if ($config['int_peering']) { $navbar['ports']['entries'][] = array('url' => generate_url(array('page' => 'iftype', 'type' => 'peering')), 'icon' => $config['icon']['port-peering'], 'title' => 'Peering'); $ifbreak = 1; } if ($config['int_peering'] && $config['int_transit']) { $navbar['ports']['entries'][] = array('url' => generate_url(array('page' => 'iftype', 'type' => 'peering,transit')), 'icon' => $config['icon']['port-peering-transit'], 'title' => 'Peering & Transit'); $ifbreak = 1; } if ($config['int_core']) { $navbar['ports']['entries'][] = array('url' => generate_url(array('page' => 'iftype', 'type' => 'core')), 'icon' => $config['icon']['port-core'], 'title' => 'Core'); $ifbreak = 1; } // Custom interface groups can be set - see Interface Description Parsing foreach ($config['int_groups'] as $int_type) { $navbar['ports']['entries'][] = array('url' => generate_url(array('page' => 'iftype', 'type' => $int_type)), 'icon' => $config['icon']['port'], 'title' => str_replace(',', ' & ', $int_type)); $ifbreak = 1; } } if ($ifbreak) { $navbar['ports']['entries'][] = array('divider' => TRUE); } $navbar['ports']['entries']['statuses'] = array('title' => 'Status Breakdown', 'url' => generate_url(array('page' => '#')), 'icon' => $config['entities']['port']['icon'], 'entries' => array()); if ($cache['ports']['stat']['errored']) { $navbar['ports']['entries']['statuses']['entries'][] = array('url' => generate_url(array('page' => 'ports', 'errors' => 'yes')), 'icon' => $config['icon']['flag'], 'title' => 'Errored', 'count' => $cache['ports']['stat']['errored']); } if ($cache['ports']['stat']['down']) { $navbar['ports']['entries']['statuses']['entries'][] = array('url' => generate_url(array('page' => 'ports', 'state' => 'down')), 'icon' => $config['icon']['down'], 'title' => 'Down', 'count' => $cache['ports']['stat']['down']); } if ($cache['ports']['stat']['shutdown']) { $navbar['ports']['entries']['statuses']['entries'][] = array('url' => generate_url(array('page' => 'ports', 'state' => 'shutdown')), 'icon' => $config['icon']['shutdown'], 'title' => 'Shutdown', 'count' => $cache['ports']['stat']['shutdown']); } if ($cache['ports']['stat']['ignored']) { $navbar['ports']['entries']['statuses']['entries'][] = array('url' => generate_url(array('page' => 'ports', 'ignore' => '1')), 'icon' => $config['icon']['ignore'], 'title' => 'Ignored', 'count' => $cache['ports']['stat']['ignored']); } if ($cache['ports']['stat']['poll_disabled']) { $navbar['ports']['entries']['statuses']['entries'][] = array('url' => generate_url(array('page' => 'ports', 'disabled' => '1')), 'icon' => $config['icon']['ignore'], 'title' => 'Poll Disabled', 'count' => $cache['ports']['stat']['poll_disabled']); } if ($cache['ports']['stat']['deleted']) { $navbar['ports']['entries']['statuses']['entries'][] = array('url' => generate_url(array('page' => 'deleted-ports')), 'icon' => $config['icon']['stop'], 'title' => 'Deleted', 'count' => $cache['ports']['stat']['deleted']); } //////////// Build health menu $navbar['health'] = array('url' => '#', 'icon' => $config['icon']['health'], 'title' => 'Health'); $health_items = array('processor' => array('text' => 'Processors', 'icon' => $config['icon']['processor']), 'mempool' => array('text' => 'Memory', 'icon' => $config['icon']['mempool']), 'storage' => array('text' => 'Storage', 'icon' => $config['icon']['storage']) ); if ($cache['printersupplies']['count']) { $health_items['printersupplies'] = array('text' => 'Printer Supplies', 'icon' => $config['icon']['printersupply']); } if ($cache['status']['count']) { $health_items['status'] = array('text' => 'Status', 'icon' => $config['entities']['status']['icon'], 'count_array' => $cache['statuses']['stat']); } if ($cache['counter']['count']) { $health_items['counter'] = array('text' => 'Counter', 'icon' => $config['entities']['counter']['icon'], 'count_array' => $cache['counters']['stat']); } foreach ($health_items as $item => $item_data) { $navbar['health']['entries'][] = array('url' => generate_url(array('page' => 'health', 'metric' => $item)), 'icon' => $item_data['icon'], 'title' => $item_data['text'], 'count_array' => $item_data['count_array']); unset($menu_sensors[$item]); $sep++; } //r($cache['sensor_types']); $menu_items[0] = array('fanspeed', 'humidity', 'temperature', 'airflow'); $menu_items[1] = array('current', 'voltage', 'power', 'apower', 'rpower', 'frequency'); $menu_items[2] = array_diff(array_keys((array)$cache['sensors']['types']), $menu_items[0], $menu_items[1]); foreach ($menu_items as $items) { if (is_array($items)) { sort($items); } foreach ($items as $item) { if (isset($cache['sensors']['types'][$item]) && is_array($cache['sensors']['types'][$item])) { if ($sep) { $navbar['health']['entries'][] = array('divider' => TRUE); $sep = 0; } //$alert_icon = ($cache['sensor_types'][$item]['alert'] ? '' : ''); $navbar['health']['entries'][] = [ 'url' => generate_url(array('page' => 'health', 'metric' => $item)), 'count_array' => $cache['sensors']['types'][$item], 'count' => $cache['sensors']['types'][$item]['count'], 'alert_count' => $cache['sensors']['types'][$item]['alert'], 'icon' => $config['sensor_types'][$item]['icon'], 'title' => nicecase($item) ]; } } $sep++; } //////////// Build applications menu if ($_SESSION['userlevel'] >= '5' && ($cache['applications']['count']) > 0) { $navbar['apps'] = array('url' => '#', 'icon' => $config['icon']['apps'], 'title' => 'Apps'); $app_list = dbFetchRows("SELECT `app_type` FROM `applications` WHERE 1 " . $cache['where']['devices_permitted'] . " GROUP BY `app_type`;"); foreach ($app_list as $app) { $image = $config['html_dir'] . "/images/icons/" . $app['app_type'] . ".png"; //$icon = (is_file($image) ? $app['app_type'] : "apps"); // Detect and add application icon $icon = $app['app_type']; $image = $config['html_dir'] . '/images/apps/' . $icon . '.png'; if (is_file($image)) { // Icon found //$icon = $app['app_type']; } else { list($icon) = explode('-', str_replace('_', '-', $app['app_type'])); $image = $config['html_dir'] . '/images/apps/' . $icon . '.png'; if ($icon != $app['app_type'] && is_file($image)) { // 'postfix_qshape' -> 'postfix' // 'exim-mailqueue' -> 'exim' } else { $icon = 'apps'; // Generic } } $entry = array('url' => generate_url(array('page' => 'apps', 'app' => $app['app_type'])), 'title' => nicecase($app['app_type'])); $entry['image'] = 'images/apps/' . $icon . '.png'; if (is_file($config['html_dir'] . '/images/apps/' . $icon . '_2x.png')) { // HiDPI icon $entry['image_2x'] = 'images/apps/' . $icon . '_2x.png'; } $navbar['apps']['entries'][] = $entry; } unset($entry); } //////////// Build routing menu if ($_SESSION['userlevel'] >= '5' && ($cache['routing']['bgp']['count'] + $cache['routing']['ospf']['count'] + $cache['routing']['cef']['count'] + $cache['routing']['vrf']['count']) > 0) { $navbar['routing'] = array('url' => '#', 'icon' => $config['icon']['routing'], 'title' => 'Routing'); $separator = 0; if (safe_count($entity_group_menu['bgp_peer']) || safe_count($entity_group_menu['bgp_peer_af'])) { if (safe_count($entity_group_menu['bgp_peer'])) { $navbar['routing']['entries'][] = [ 'title' => 'BGP Peer Groups', 'url' => generate_url([ 'page' => 'groups', 'entity_type' => 'bgp_peer' ]), 'icon' => $config['icon']['group'], 'count' => safe_count($entity_group_menu['bgp_peer']), 'entries' => array_merge($entity_group_menu['bgp_peer']) ]; } if (safe_count($entity_group_menu['bgp_peer_af'])) { $navbar['routing']['entries'][] = [ 'title' => 'BGP Peer (AFI/SAFI) Groups', 'url' => generate_url([ 'page' => 'groups', 'entity_type' => 'bgp_peer_af' ]), 'icon' => $config['icon']['group'], 'count' => safe_count($entity_group_menu['bgp_peer_af']), 'entries' => array_merge($entity_group_menu['bgp_peer_af']) ]; } $separator = 1; } if ($cache['routing']['vrf']['count']) { if ($separator) { $navbar['routing']['entries'][] = array('divider' => TRUE); $separator = 0; } $navbar['routing']['entries'][] = array('url' => generate_url(array('page' => 'routing', 'protocol' => 'vrf')), 'icon' => $config['icon']['vrf'], 'title' => 'VRFs', 'count' => $cache['routing']['vrf']['count']); } if ($cache['routing']['cef']['count']) { if ($separator) { $navbar['routing']['entries'][] = array('divider' => TRUE); $separator = 0; } $navbar['routing']['entries'][] = array('url' => generate_url(array('page' => 'routing', 'protocol' => 'cef')), 'icon' => $config['icon']['cef'], 'title' => 'CEF', 'count' => $cache['routing']['cef']['count']); $separator++; } if ($cache['routing']['eigrp']['count']) { if ($separator) { $navbar['routing']['entries'][] = array('divider' => TRUE); $separator = 0; } $navbar['routing']['entries'][] = array('url' => generate_url(array('page' => 'routing', 'protocol' => 'eigrp')), 'icon' => $config['icon']['ospf'], 'title' => 'EIGRP', 'count' => $cache['routing']['eigrp']['count']); $separator++; } if ($cache['routing']['ospf']['count']) { if ($separator) { $navbar['routing']['entries'][] = array('divider' => TRUE); $separator = 0; } $navbar['routing']['entries'][] = array('url' => generate_url(array('page' => 'routing', 'protocol' => 'ospf')), 'icon' => $config['icon']['ospf'], 'title' => 'OSPF', 'count' => $cache['routing']['ospf']['count']); $separator++; } // BGP Sessions if ($cache['routing']['bgp']['count']) { if ($separator) { $navbar['routing']['entries'][] = array('divider' => TRUE); $separator = 0; } $navbar['routing']['entries'][] = array('url' => generate_url(array('page' => 'routing', 'protocol' => 'bgp', 'type' => 'all', 'graph' => 'NULL')), 'icon' => $config['icon']['bgp'], 'title' => 'BGP All Sessions', 'count' => $cache['routing']['bgp']['count']); $navbar['routing']['entries'][] = array('url' => generate_url(array('page' => 'routing', 'protocol' => 'bgp', 'type' => 'external', 'graph' => 'NULL')), 'icon' => $config['icon']['bgp-external'], 'title' => 'BGP External', 'count' => $cache['routing']['bgp']['external']); $navbar['routing']['entries'][] = array('url' => generate_url(array('page' => 'routing', 'protocol' => 'bgp', 'type' => 'internal', 'graph' => 'NULL')), 'icon' => $config['icon']['bgp-internal'], 'title' => 'BGP Internal', 'count' => $cache['routing']['bgp']['internal']); } // Do Alerts at the bottom if ($cache['routing']['bgp']['alerts']) { $navbar['routing']['entries'][] = array('divider' => TRUE); $navbar['routing']['entries'][] = array('url' => generate_url(array('page' => 'routing', 'protocol' => 'bgp', 'adminstatus' => 'start', 'state' => 'down')), 'icon' => $config['icon']['bgp-alert'], 'title' => 'BGP Alerts', 'count' => $cache['routing']['bgp']['alerts']); } } // Custom navbar entries. if (is_file("includes/navbar-custom.inc.php")) { include_once("includes/navbar-custom.inc.php"); } // Build navbar from $navbar array foreach ($navbar as $dropdown) { // echo('
  • ' . PHP_EOL); if (str_contains($dropdown['icon'], 'sprite')) { $element = 'span'; } else { $element = 'i'; } echo('
  • ' . PHP_EOL); echo(' ' . PHP_EOL); echo(' <' . $element . ' class="' . $dropdown['icon'] . '"> ' . $dropdown['title'] . ' ' . PHP_EOL); echo(' ' . PHP_EOL); echo(' <' . $element . ' class="' . $dropdown['icon'] . '" style="margin-right: 5px;">' . PHP_EOL); echo('
      ' . PHP_EOL); foreach ($dropdown['entries'] as $entry) { if (isset($entry['entries']) && safe_count($entry['entries'])) { navbar_submenu($entry); } else { navbar_entry($entry); } } echo('
    ' . PHP_EOL); echo('
  • ' . PHP_EOL); } unset($navbar); // The menus on the right are not handled by the navbar array code yet. // max-width: 80vw - See: https://jira.observium.org/browse/OBS-3667 ?>
  • li > a\').first().prop(\'href\')); $(\'form#searchform\').prop(\'action\', $(\'div#suggestions > li > a\').first().prop(\'href\')); // Only submit if we actually have a suggestion to link to if ($(\'div#suggestions > li > a\').length > 0) { this.form.submit(); } } }); }); }); '); $ua = array('browser' => detect_browser_type()); if (get_var_true($_SESSION['touch'])) { //$ua['url'] = generate_url($vars, array('touch' => 'no')); $ua['attribs']['onclick'] = "ajax_action('touch_off');"; } else { //$ua['url'] = generate_url($vars, array('touch' => 'yes')); $ua['attribs']['onclick'] = "ajax_action('touch_on');"; } if (get_var_true($vars['touch'])) { $ua['icon'] = 'glyphicon glyphicon-hand-up'; } elseif ($ua['browser'] === 'mobile') { $ua['icon'] = 'glyphicon glyphicon-phone'; } elseif ($ua['browser'] === 'tablet') { $ua['icon'] = 'icon-tablet'; } else { $ua['icon'] = 'icon-laptop'; } $ua['remote_addr'] = get_remote_addr(); $remote_addr_header = get_remote_addr(TRUE); // Remote addr by http header if ($remote_addr_header && $ua['remote_addr'] != $remote_addr_header) { $ua['remote_addr'] = $remote_addr_header . ' (' . $ua['remote_addr'] . ')'; } $ua['content'] = 'Your current IP: ' . $ua['remote_addr'] . '
    '; if ($config['web_mouseover'] && $ua['browser'] != 'mobile') { // Add popup with current IP and previous session $last_id = dbFetchCell("SELECT `id` FROM `authlog` WHERE `user` = ? AND `result` LIKE 'Logged In%' ORDER BY `id` DESC LIMIT 1;", array($_SESSION['username'])); $ua['previous_session'] = dbFetchRow("SELECT * FROM `authlog` WHERE `user` = ? AND `id` < ? AND `result` LIKE 'Logged In%' ORDER BY `id` DESC LIMIT 1;", array($_SESSION['username'], $last_id)); if ($ua['previous_session']) { $ua['previous_browser'] = detect_browser($ua['previous_session']['user_agent']); $ua['content'] .= '
    Previous session from ' . ($_SESSION['userlevel'] > 5 ? $ua['previous_session']['address'] : preg_replace('/^\d+/', '*', $ua['previous_session']['address'])) . ''; $ua['content'] .= '
    at ' . format_timestamp($ua['previous_session']['datetime']) . ''; $ua['content'] .= '
    ' . get_icon($ua['previous_browser']['icon']) . ' ' . $ua['previous_browser']['browser_full'] . ' (' . $ua['previous_browser']['platform'] . ')' . '
    '; } } $ua['url'] = "#"; echo '
  • ' . generate_tooltip_link($ua['url'], ' ', $ua['content'], NULL, $ua['attribs']) . '
  • '; ?>
    • '); echo(' Refresh '); echo('
        '); foreach ($page_refresh['list'] as $refresh_time) { $refresh_class = ($refresh_time == $page_refresh['current'] ? 'active' : ''); if (!$page_refresh['allowed']) { $refresh_class = 'disabled'; } if ($refresh_time == 0) { echo('
      • Manually
      • '); } else { echo('
      • Every ' . format_uptime($refresh_time, 'longest') . '
      • '); } } echo('
      '); echo(''); echo('
    • '); echo('
    • '); echo(' Personalisation'); echo('
        '); // This definition not exist in community edition if (OBSERVIUM_EDITION !== 'community') { foreach($config['themes'] as $theme_name => $theme_data) { if ($_SESSION['theme'] !== $theme_name) { echo('
      • '.$theme_data['name'].'
      • '); } } if ($config['web_theme_default'] !== $_SESSION['theme'] && $config['web_theme_default'] !== 'system') { // Reset default echo('
      • Reset
      • '); } echo('
      • '); } if ($config['graphs']['size'] === 'big') { echo('
      • Normal Graphs
      • '); } else { echo('
      • Large Graphs
      • '); } echo('
      '); echo('
    • '); ?>
    • My Profile
    • = 10) { echo('
    • '); echo('
    • '); echo(' Users & Groups'); echo('
        '); if (auth_usermanagement()) { echo('
      • Add User
      • '); } echo('
      • Edit User
      • '); //if (auth_usermanagement()) //{ // echo('
      • Remove User
      • '); //} echo('
      • '); echo('
      • Roles
      • '); echo('
      • '); echo('
      • Authentication Log
      • '); echo('
      '); echo('
    • '); echo('
    • '); echo(' Global Settings'); echo('
        '); echo('
      • Edit
      • '); echo('
      • Full Dump
      • '); echo('
      • Changed Dump
      • '); echo('
      '); echo('
    • '); } echo('
    • '); navbar_entry(array('title' => 'Polling Information', 'url' => generate_url(array('page' => 'pollerlog')), 'icon' => $config['icon']['pollerlog'])); if ($_SESSION['userlevel'] >= 7) { navbar_entry(array('title' => 'Process List', 'url' => generate_url(array('page' => 'processes')), 'icon' => $config['icon']['processes'])); navbar_entry(array('title' => 'OSes', 'url' => generate_url(array('page' => 'os')), 'icon' => $config['icon']['config'])); navbar_entry(array('title' => 'MIBs', 'url' => generate_url(array('page' => 'mibs')), 'icon' => $config['icon']['mibs'])); } if (auth_can_logout()) { ?>
    • Logout
    • Help
    • About ' . OBSERVIUM_PRODUCT, array('page' => 'about'), array(), FALSE)); ?>