<?php /** * Auxiliary functions to manage menu. * * @category Include * @package Pandora FMS * @subpackage Menu * @version 1.0.0 * @license See below * * ______ ___ _______ _______ ________ * | __ \.-----.--.--.--| |.-----.----.-----. | ___| | | __| * | __/| _ | | _ || _ | _| _ | | ___| |__ | * |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______| * * ============================================================================ * Copyright (c) 2005-2021 Artica Soluciones Tecnologicas * Please see http://pandorafms.org for full contribution list * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation for version 2. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * ============================================================================ */ // Begin. global $config; // Set variable to store menu type (classic or collapsed). if (is_ajax() === true && empty(get_parameter('menuType')) === false) { $_SESSION['menu_type'] = get_parameter('menuType', 'classic'); return; } /** * Prints a complete menu structure. * * @param array $menu Menu structure to print. * * @return void */ function menu_print_menu(&$menu) { global $config; global $menuTypeClass; global $tab_active; global $menu1_selected; global $menu2_selected; static $idcounter = 0; echo '<div class="menu">'; $sec = (string) get_parameter('sec'); $sec2 = (string) get_parameter('sec2'); if ($sec2 === 'operation/agentes/ver_agente') { $sec2 = 'godmode/agentes/configurar_agente'; } else if ($sec2 === 'godmode/servers/discovery') { $wiz = (string) get_parameter('wiz'); $sec2 = 'godmode/servers/discovery&wiz='.$wiz; $mode = (string) get_parameter('mode', ''); if (empty($mode) === false) { $sec2 .= '&mode='.$mode; } } else if ($sec2 === 'godmode/groups/group_list') { $tab = (string) get_parameter('tab'); if ($tab === 'credbox') { $sec2 = 'godmode/groups/group_list&tab='.$tab; } } else if ($sec2 === 'godmode/setup/setup') { $section = (string) get_parameter('section'); $sec2 = 'godmode/setup/setup§ion='.$section; } else if ($sec2 === 'godmode/massive/massive_operations') { $tab = (string) get_parameter('tab'); $sec2 = 'godmode/massive/massive_operations&tab='.$tab; } else if ($sec2 === 'godmode/events/events') { $section = (string) get_parameter('section'); $sec2 = 'godmode/events/events§ion='.$section; } else if ($sec2 === 'operation/dashboard/dashboard') { $id = (int) get_parameter('dashboardId', 0); if (empty($id) === false) { $sec2 = 'operation/dashboard/dashboard&dashboardId='.$id; } } else if ($sec2 === 'enterprise/operation/services/services') { $tab = (string) get_parameter('tab', ''); $action = (string) get_parameter('action', ''); $id_service = (int) get_parameter('id_service', 0); if (empty($tab) === false && empty($action) === false && empty($id_service) === false ) { $sec2 = sprintf( 'enterprise/operation/services/services&tab=%s&action=%s&id_service=%d', $tab, $action, $id_service ); } } else if ($sec2 === 'operation/visual_console/render_view') { $id = (int) get_parameter('id', 0); if (empty($id) === false) { $sec2 = 'operation/visual_console/render_view&id='.$id; } } else if ($sec2 === 'operation/messages/message_edit') { $new_msg = (int) get_parameter('new_msg', 0); if (empty($new_msg) === false) { $sec2 = 'operation/messages/message_edit&new_msg='.$new_msg; } } else { $sec2 = (string) get_parameter('sec2'); } $menu_selected = false; $allsec2 = explode('sec2=', $_SERVER['REQUEST_URI']); if (isset($allsec2[1]) === true) { $allsec2 = $allsec2[1]; } else { $allsec2 = $sec2; } // Open list of menu. echo '<ul'.((isset($menu['class']) === true) ? ' class="'.$menu['class'].'"' : '').'>'; // Use $config because a global var is required because normal // and godmode menu are painted separately. if (isset($config['count_main_menu']) === false) { $config['count_main_menu'] = 0; } foreach ($menu as $mainsec => $main) { $extensionInMenuParameter = (string) get_parameter('extension_in_menu'); $showSubsection = true; if (empty($extensionInMenuParameter) === false) { $showSubsection = ($extensionInMenuParameter === $mainsec); } if ($mainsec === 'class') { continue; } $id = (isset($main['id']) === false) ? 'menu_'.(++$idcounter) : $main['id']; $submenu = false; $classes = [ 'menu_icon', ($menuTypeClass === 'classic') ? 'no_hidden_menu' : 'menu_icon_collapsed', ]; if (isset($main['sub']) === true) { $classes[] = ''; $submenu = true; } if (isset($main['refr']) === false) { $main['refr'] = 0; } if (($sec === $mainsec) && ((bool) $showSubsection === true)) { $classes[] = ''; } else { $classes[] = ''; if ($extensionInMenuParameter === $mainsec) { $classes[] = ''; } } $output = ''; if (! $submenu) { $main['sub'] = []; // Empty array won't go through foreach. } $submenu_output = ''; $count_sub = 0; $count_sub_access = 0; $first_sub_sec2 = ''; foreach ($main['sub'] as $subsec2 => $sub) { $count_sub++; // Init some variables. $visible = false; $selected = false; $subsec2 = io_safe_output($subsec2); // Choose valid suboptions (sec2). $check_2 = true; if (isset($sub['sub2'])) { $check_2 = false; } if (enterprise_hook('enterprise_acl', [$config['id_user'], $mainsec, $subsec2, $check_2]) == false) { continue; } // We store the first subsection to use it if the main section has not access. if ($count_sub_access == 0) { $first_sub_sec2 = $subsec2; } $count_sub_access++; $class = ''; $selected_submenu2 = false; // Look for submenus in level2! if (isset($sub['sub2'])) { $class .= 'has_submenu '; // This hacks avoid empty delimiter error when sec2 is not provided. if (!$sec2) { $sec2 = ' '; } // Check if some submenu was selected to mark this (the parent) as selected. foreach (array_keys($sub['sub2']) as $key) { if (strpos($key, $sec2) !== false) { $selected_submenu2 = true; break; } } } // Create godmode option if submenu has godmode on. if (isset($sub['subsecs'])) { // Sometimes you need to add all paths because in the // same dir are code from visual console and reports // for example. if (is_array($sub['subsecs'])) { // Compare each string. foreach ($sub['subsecs'] as $god_path) { if (strpos($sec2, $god_path) !== false) { $selected_submenu2 = true; break; } } } else { // If there is only a string just compare. if (strpos($sec2, $sub['subsecs']) !== false) { $selected_submenu2 = true; } } } // Set class. if (($sec2 == $subsec2 || $allsec2 == $subsec2 || $selected_submenu2) && isset($sub[$subsec2]['options']) && (get_parameter_get($sub[$subsec2]['options']['name']) == $sub[$subsec2]['options']['value']) ) { // If the subclass is selected and there are options and that options value is true. $class .= 'submenu_selected selected'; $menu_selected = true; $menu2_selected = $sub['id']; $selected = true; $visible = true; } else if (($sec2 === $subsec2 || $allsec2 === $subsec2 || $selected_submenu2 === true) && isset($sub[$subsec2]['options']) === false) { $class .= 'submenu_selected selected'; $selected = true; $menu_selected = true; $menu2_selected = $sub['id']; $hasExtensions = (array_key_exists('hasExtensions', $main) === true) ? $main['hasExtensions'] : false; if ((empty($extensionInMenuParameter) === false) && ((bool) $hasExtensions === true)) { $visible = true; } else { $visible = false; } } else { // Else it's not selected. $class .= 'submenu_not_selected'; } if (isset($sub['refr']) === false) { $sub['refr'] = 0; } // Define submenu class to draw tree image. $sub_tree_class = 'submenu_text'; if (isset($sub['type']) && $sub['type'] == 'direct') { // This is an external link. $submenu_output .= '<li title="'.$sub['id'].'" id="'.str_replace(' ', '_', $sub['id']).'" class="'.$class.'">'; if (isset($sub['subtype']) && $sub['subtype'] == 'nolink') { $submenu_output .= '<div class=" SubNoLink '.$sub_tree_class.'"><span class="w70p span_has_menu_text">'.$sub['text'].'</span><div class="w21p arrow_menu_down"></div></div>'; } else if (isset($sub['subtype']) && $sub['subtype'] == 'new_blank') { $submenu_output .= '<a href="'.$subsec2.'" target="_blank"><div class="'.$sub_tree_class.'">'.$sub['text'].'</div></a>'; } else { $submenu_output .= '<a href="'.$subsec2.'"><div class="'.$sub_tree_class.'">'.$sub['text'].'</div></a>'; } } else { // This is an internal link. if (isset($sub[$subsec2]['options'])) { $link_add = '&'.$sub[$subsec2]['options']['name'].'='.$sub[$subsec2]['options']['value']; } else { $link_add = ''; } $submenu_output .= '<li id="'.str_replace(' ', '_', $sub['id']).'" '.($class ? ' class="'.$class.'"' : '').'>'; // Ini Add icon extension. $secExtension = null; if (array_key_exists('extension', $sub)) { $secExtensionBool = $sub['extension']; } else { $secExtensionBool = false; } // DISABLE SUBMENU IMAGES. $secExtensionBool = false; if ($secExtensionBool) { if (strlen($sub['icon']) > 0) { $icon_enterprise = false; if (isset($sub['enterprise'])) { $icon_enterprise = (bool) $sub['enterprise']; } if ($icon_enterprise) { $imageIcon = 'enterprise/extensions/'.$sub['icon']; } else { $imageIcon = 'extensions/'.$sub['icon']; } if (!file_exists(realpath($imageIcon))) { $imageIcon = $imageIconDefault; } } else { $imageIcon = $imageIconDefault; } // $submenu_output .= '<div style="background: url('.$imageIcon.') no-repeat; width: 16px; height: 16px; float: left; margin: 5px 0px 0px 3px;"> </div>'; } $secExtension = null; if (array_key_exists('sec', $sub)) { $secExtension = $sub['sec']; } if (strlen($secExtension) > 0) { $secUrl = $secExtension; $extensionInMenu = 'extension_in_menu='.$mainsec.'&'; } else { $secUrl = $mainsec; $extensionInMenu = ''; } if (isset($sub['text']) || $selected) { $title = ' title="'.$sub['text'].' "'; } else { $title = ''; } $submenu_output .= '<a href="index.php?'.$extensionInMenu.'sec='.$secUrl.'&'.'sec2='.$subsec2.($sub['refr'] ? '&refr='.$sub['refr'] : '').$link_add.'"'.$title.'>'.'<div class="'.$sub_tree_class.'">'.$sub['text'].'</div>'.'</a>'; } // Print second level submenu. if (isset($sub['sub2'])) { $submenu2_list = ''; $count_sub2 = 0; foreach ($sub['sub2'] as $key => $sub2) { if (enterprise_hook('enterprise_acl', [$config['id_user'], $mainsec, $subsec2, false, $key]) == false) { continue; } $count_sub2++; if (isset($sub2['type']) && $sub2['type'] == 'direct') { if (isset($sub2['subtype']) && $sub2['subtype'] == 'new_blank') { $link = $key.'"'.'target = \'_blank\''; } } else { $link = 'index.php?sec='.$subsec2.'&sec2='.$key; } $class = 'sub_subMenu'; if ($key == $sec2) { $class .= ' selected'; } // Define submenu2 class to draw tree image. if ($count_sub2 >= count($sub['sub2'])) { $sub_tree_class = 'submenu_text submenu2_text_last'; } else { $sub_tree_class = 'submenu_text submenu2_text_middle'; } if (isset($sub2['title'])) { $sub_title = $sub2['title']; } else { $sub_title = $sub2['text']; } $submenu2_list .= '<li class="'.$class.'" >'; $submenu2_list .= '<a href="'.$link.'"><div class="'.$sub_tree_class.'" title="'.$sub_title.'" >'.$sub2['text'].'</div></a></li>'; $sub_title = ''; } // Add submenu2 to submenu string. $submenu_output .= '<ul id="sub'.str_replace(' ', '_', $sub['id']).'" class="submenu2">'; $submenu_output .= $submenu2_list; $submenu_output .= '</ul>'; } // Submenu close list! $submenu_output .= '</li>'; } // Choose valid section (sec). if ((bool) enterprise_hook( 'enterprise_acl', [ $config['id_user'], $mainsec, ($main['sec2'] ?? null), ] ) === false ) { if ($count_sub_access > 0) { // If any susection have access but main section not, we change main link to first subsection found $main['sec2'] = $first_sub_sec2; } else { continue; } } if ($menu_selected) { $seleccionado = 'selected'; $menu1_selected = $id; if ($menu['class'] === 'operation') { $tab_active = 'display'; } else { $tab_active = 'management'; } } else { $seleccionado = ''; } // Print out the first level. $output .= '<li title="'.$main['text'].'" class="'.implode(' ', $classes).' '.$seleccionado.' flex_li" id="icon_'.$id.'">'; if ($menuTypeClass === 'collapsed') { $div = '<div class="icon_'.$id.' w100p"></div><span class="w55p" style="display: none">'.$main['text'].'</span><div class="arrow_menu_down w30p" style="display: none"></div>'; } else { if ($id === 'about') { $div = '<div class="icon_'.$id.' w15p"></div><span class="w55p">'.$main['text'].'</span>'; } else { $div = '<div class="icon_'.$id.' w15p"></div><span class="w55p">'.$main['text'].'</span><div class="arrow_menu_down w30p"></div>'; } } $output .= sprintf('<div id="title_menu" class="title_menu_classic">%s</div>', $div); // Add the notification ball if defined. if (isset($main['notification']) === true) { $output .= '<div class="notification_ball">'.$main['notification'].'</div>'; } if ($submenu_output != '') { // WARNING: IN ORDER TO MODIFY THE VISIBILITY OF MENU'S AND SUBMENU'S (eg. with cookies) YOU HAVE TO ADD TO THIS ELSEIF. DON'T MODIFY THE CSS. if ($visible || in_array('selected', $classes)) { $visible = true; } if (!$showSubsection) { $visible = false; } $output .= sprintf('<ul id="subicon_%s" class="submenu">%s</ul>', $id, $submenu_output); } $config['count_main_menu']++; $output .= '</li>'; echo $output; $menu_selected = false; } // Finish menu. echo '</ul>'; // Invisible UL for adding border-top. echo '</div>'; } /** * Get all the data structure of menu. Operation and Godmode * * @return array Menu structure. */ function menu_get_full_sec() { global $menu_operation; global $menu_godmode; if ($menu_godmode == null || $menu_operation == null) { return []; } else { $menu = ($menu_operation + $menu_godmode); } unset($menu['class']); menu_add_extras($menu); return $menu; } /** * Build an extra access pages array and merge it with menu * * @param menu array (pass by reference) */ function menu_add_extras(&$menu) { global $config; $menu_extra = []; $menu_extra['gusuarios']['sub']['godmode/users/configure_user']['text'] = __('Configure user'); $menu_extra['gusuarios']['sub']['godmode/users/configure_profile']['text'] = __('Configure profile'); $menu_extra['gmodules']['sub']['godmode/modules/manage_network_templates_form']['text'] = __('Module templates management'); $menu_extra['gmodules']['sub']['godmode/modules/manage_inventory_modules_form']['text'] = __('Inventory modules management'); $menu_extra['gagente']['sub']['godmode/agentes/configurar_agente']['text'] = __('Agents management'); $menu_extra['galertas']['sub']['godmode/alerts/configure_alert_template']['text'] = __('Configure alert template'); $menu_extra['network']['sub']['operation/visual_console/render_view']['text'] = __('View visual console'); $menu_extra['network']['sub']['godmode/reporting/visual_console_builder']['text'] = __('Builder visual console'); $menu_extra['reporting']['sub']['operation/reporting/reporting_viewer']['text'] = __('View reporting'); $menu_extra['reporting']['sub']['operation/reporting/graph_viewer']['text'] = __('Graph viewer'); $menu_extra['reporting']['sub']['godmode/reporting/graph_builder']['text'] = __('Manage custom graphs'); $menu_extra['reporting']['sub']['godmode/reporting/graph_container']['text'] = __('View graph containers'); $menu_extra['reporting']['sub']['godmode/reporting/create_container']['text'] = __('Manage graph containers'); $menu_extra['reporting']['sub']['enterprise/godmode/reporting/graph_template_list']['text'] = __('View graph templates'); $menu_extra['reporting']['sub']['enterprise/godmode/reporting/graph_template_editor']['text'] = __('Manage graph templates'); $menu_extra['reporting']['sub']['enterprise/godmode/reporting/graph_template_item_editor']['text'] = __('Graph template items'); $menu_extra['reporting']['sub']['enterprise/godmode/reporting/graph_template_wizard']['text'] = __('Graph template wizard'); $menu_extra['reporting']['sub']['godmode/reporting/reporting_builder&tab=wizard&action=wizard']['text'] = __('Templates wizard'); $menu_extra['reporting']['sub']['godmode/reporting/reporting_builder&tab=template&action=list_template']['text'] = __('Templates'); $menu_extra['reporting']['sub']['godmode/reporting/reporting_builder&action=edit']['text'] = __('Edit custom reports'); $menu_extra['reporting']['sub']['godmode/reporting/reporting_builder&tab=list_items&action=edit']['text'] = __('List items'); $menu_extra['reporting']['sub']['godmode/reporting/reporting_builder&tab=item_editor&action=new']['text'] = __('Edit item'); $menu_extra['reporting']['sub']['godmode/reporting/reporting_builder&tab=wizard&action=edit']['text'] = __('Wizard'); $menu_extra['reporting']['sub']['godmode/reporting/reporting_builder&tab=wizard_sla&action=edit']['text'] = __('Wizard sla'); $menu_extra['reporting']['sub']['godmode/reporting/reporting_builder&tab=global&action=edit']['text'] = __('Global custom reports'); $menu_extra['reporting']['sub']['godmode/reporting/reporting_builder&tab=advanced&action=edit']['text'] = __('Avanced options'); if ($config['activate_gis']) { $menu_extra['godgismaps']['sub']['godmode/gis_maps/configure_gis_map']['text'] = __('Manage GIS Maps'); } $menu_extra['workspace']['sub']['operation/messages/message_edit']['text'] = __('Manage messages'); $menu_extra['gagente']['sub']['godmode/groups/configure_modu_group']['text'] = __('Manage module groups'); $menu_extra['gagente']['sub']['godmode/agentes/configure_field']['text'] = __('Manage custom field'); $menu_extra['galertas']['sub']['godmode/alerts/configure_alert_action']['text'] = __('Manage alert actions'); $menu_extra['galertas']['sub']['godmode/alerts/configure_alert_command']['text'] = __('Manage commands'); $menu_extra['gservers']['sub']['enterprise/godmode/servers/manage_export_form']['text'] = __('Manage export targets'); $menu_extra['estado']['sub']['snmpconsole']['sub2']['godmode/snmpconsole/snmp_trap_generator']['text'] = __('SNMP trap generator'); $menu_extra['estado']['sub']['snmpconsole']['sub2']['operation/snmpconsole/snmp_view']['text'] = __('SNMP console'); $menu_extra['workspace']['sub']['operation/incidents/incident_detail']['text'] = __('Manage incident'); $menu_extra['gusuarios']['sub']['godmode/groups/configure_group']['text'] = __('Manage groups'); $menu_extra['gusuarios']['sub']['godmode/tag/edit_tag']['text'] = __('Tags management'); // Duplicate extensions as sec=extension to check it from url. foreach ($menu as $k => $m) { if (!isset($m['sub'])) { continue; } foreach ($m['sub'] as $kk => $mm) { if (isset($mm['sec'])) { if (empty($menu[$mm['sec']]['sub'][$kk]['text']) === true) { $menu_extra[$mm['sec']]['sub'][$kk]['text'] = $mm['text']; } } } } $menu = array_merge_recursive($menu, $menu_extra); // Remove the duplicate the text entries. foreach ($menu as $k => $m) { if (!empty($m['text'])) { if (is_array($m['text'])) { $menu[$k]['text'] = reset($m['text']); } } } } /** * Get the sec list built in menu * * @param bool If true, the array returned will have the structure * to combo categories (optgroup) * * @return array Sections list */ function menu_get_sec($with_categories=false) { $menu = menu_get_full_sec(); unset($menu['class']); $in_godmode = false; foreach ($menu as $k => $v) { if ($with_categories) { if (!$in_godmode && $k[0] == 'g') { // Hack to dont confuse with gis activated because godmode // sec starts with g (like gismaps). if ($k != 'gismaps') { $in_godmode = true; } } if ($k === 'discovery') { $in_godmode = true; } if ($in_godmode) { $category = __('Administration'); } else { $category = __('Operation'); } $sec_array[$k]['optgroup'] = $category; $sec_array[$k]['name'] = $v['text']; } else { $sec_array[$k] = $v['text']; } } return $sec_array; } /** * Get the sec list built in menu * * @param bool If true, the array returned will have the structure * to combo categories (optgroup) * * @return array Sections list */ function get_sec($sec=false) { $menu = menu_get_full_sec(); unset($menu['class']); $in_godmode = false; foreach ($menu as $k => $v) { if (isset($v['sub'][$sec])) { return $k; } } return false; } /** * Get the pages in a section * * @param string sec code * @param string menu hash. All the menu structure (For example * returned by menu_get_full_sec(), json encoded and after that * base64 encoded. If this value is false this data is obtained from * menu_get_full_sec(); * * @return array Sections list */ function menu_get_sec_pages($sec, $menu_hash=false) { if (!$menu_hash) { $menu = menu_get_full_sec(); } else { $menu = json_decode(base64_decode($menu_hash), true); } $sec2_array = []; if (isset($sec)) { // Get the sec2 of the main section. $sec2_array[$menu[$sec]['sec2']] = $menu[$sec]['text']; // Get the sec2 of the subsections. foreach ($menu[$sec]['sub'] as $k => $v) { // Avoid special cases of standalone windows. if (preg_match('/^javascript:/', $k) || preg_match('/\.php/', $k)) { if ($sec !== 'links' && $sec !== 'eventos') { continue; } } $sec2_array[$k] = $v['text']; } } $sec2_array = array_unique($sec2_array); return $sec2_array; } /** * Get the pages in a section2 * $menu * * @param string sec code * @param string menu hash. All the menu structure (For example * returned by menu_get_full_sec(), json encoded and after that * base64 encoded. If this value is false this data is obtained from * menu_get_full_sec(); * * @return array Sections list */ function menu_get_sec2_pages($sec, $sec2, $menu_hash=false) { if ($menu_hash === false) { $menu = menu_get_full_sec(); } else { $menu = json_decode(base64_decode($menu_hash), true); } $sec3_array = []; $sec2 = io_safe_output($sec2); if (isset($menu[$sec]['sub']) && isset($menu[$sec]['sub'][$sec2]['sub2'])) { // Get the sec2 of the subsections. foreach ($menu[$sec]['sub'][$sec2]['sub2'] as $k => $v) { $sec3_array[$k] = $v['text']; } } return $sec3_array; } /** * Check if a page (sec2) is in a section (sec) * * @param string section (sec) code * @param string page (sec2)code * * @return true if the page is in section, false otherwise */ function menu_sec2_in_sec($sec, $sec2) { $sec2_array = menu_get_sec_pages($sec); if ($sec2_array != null && in_array($sec2, array_keys($sec2_array))) { return true; } return false; } function menu_sec3_in_sec2($sec, $sec2, $sec3) { $sec3_array = menu_get_sec2_pages($sec, $sec2, $menu_hash = false); if ($sec3_array != null && in_array($sec3, array_keys($sec3_array))) { return true; } return false; } /** * Prepare menu data for enterprise acl conf. * * @param array $pages * @param string $sec * @return string $pages */ function menu_pepare_acl_select_data($pages, $sec) { $exclude_pages = [ 'estado' => 'operation/agentes/tactical', 'network' => 'operation/agentes/networkmap_list', 'extensions' => [ 'operation/extensions', 'enterprise/extensions/vmware', 'extensions/users_connected', ], 'gmodules' => 'godmode/modules/manage_network_templates', 'geventos' => 'godmode/events/events&section=filter', 'gsetup' => 'godmode/setup/setup§ion=general', ]; foreach ($exclude_pages as $exclude_sec => $sec2) { if ($sec === $exclude_sec) { if (is_array($sec2) === true) { foreach ($sec2 as $value) { unset($pages[$value]); } } unset($pages[$sec2]); } } return $pages; } if (is_ajax()) { $about = (bool) get_parameter('about'); if ($about) { global $config; global $pandora_version; global $build_version; $product_name = io_safe_output(get_product_name()); include_once $config['homedir'].'/include/class/Diagnostics.class.php'; $d = new Diagnostics; $db_health = json_decode($d->getDatabaseHealthStatus()); $db_info = json_decode($d->getDatabaseStatusInfo()); $db_fragmentation = json_decode($d->getTablesFragmentation()); $sys_info = json_decode($d->getSystemInfo()); $php_sys = json_decode($d->getPHPSetup()); $system_date = json_decode($d->getSystemDate()); $fragmentation_status = ''; if ($db_fragmentation->data->tablesFragmentationStatus->status === 1) { $fragmentation_status = html_print_image( 'images/validate.svg', true, [ 'title' => __('Successfully'), 'style' => 'width:15px;', ] ); } else { $fragmentation_status = html_print_image( 'images/fail@svg.svg', true, [ 'title' => __('Error'), 'style' => 'width:15px;', ] ); } $image_about = ui_get_full_url('/images/custom_logo/logo-default-pandorafms.png', false, false, false); if (enterprise_installed() === false) { if ($config['style'] === 'pandora_black') { $image_about = 'images/custom_logo/'.HEADER_LOGO_BLACK_CLASSIC; } else if ($config['style'] === 'pandora') { $image_about = 'images/custom_logo/'.HEADER_LOGO_DEFAULT_CLASSIC; } } else { if ($config['style'] === 'pandora_black' && $config['custom_logo'] === HEADER_LOGO_DEFAULT_CLASSIC) { $config['custom_logo'] = HEADER_LOGO_BLACK_CLASSIC; } else if ($config['style'] === 'pandora' && $config['custom_logo'] === HEADER_LOGO_BLACK_CLASSIC) { $config['custom_logo'] = HEADER_LOGO_DEFAULT_CLASSIC; } $image_about = 'images/custom_logo/'.$config['custom_logo']; if (file_exists(ENTERPRISE_DIR.'/'.$image_about) === true) { $image_about = ENTERPRISE_DIR.'/'.$image_about; } } if (is_metaconsole() === true) { $image_about = ui_get_full_url('/enterprise/images/custom_logo/pandoraFMS_metaconsole_full.svg', false, false, false); if ($config['meta_custom_logo'] === 'pandoraFMS_metaconsole_full.svg') { $image_about = 'images/custom_logo/'.$config['meta_custom_logo']; } else { $image_about = '../images/custom_logo/'.$config['meta_custom_logo']; } if (file_exists(ENTERPRISE_DIR.'/'.$image_about) === true) { $image_about = $image_about; } } $dialog = ' <div id="about-tabs" class="invisible overflow-hidden"> <ul> <li><a href="#tab-general-view">'.__('Information').'</a></li> <li><a href="#tab-database">'.__('Database').'</a></li> <li><a href="#tab-system-info">'.__('System Info').'</a></li> <li><a href="#tab-php-system">'.__('PHP System').'</a></li> <li class="ui-tabs-close-button" style="float:right!important;"> <img id="about-close" style="cursor: pointer;" src="'.ui_get_full_url('/include/styles/images/dialog-titlebar-close.png', false, false, false).'" alt="'.__('Close').'" title="'.__('Close').'" width="25px"> </li> </ul> <div id="tab-general-view"> <table class="table-about"> <tbody> <tr> <th style="width: 40%; border: 0px;"> <img src="'.$image_about.'" alt="logo" width="70%"> </th> <th style="width: 60%; text-align: left; border: 0px;"> <h1>'.$product_name.'</h1> <p><span>'.__('Version').' '.$pandora_version.' - '.(enterprise_installed() ? 'Enterprise' : 'Community').'</span></p> <p><span>'.__('MR version').'</span> MR'.$config['MR'].'</p> <p><span>'.__('Build').'</span> '.$build_version.'</p> <p style="margin-bottom: 20px!important;"><span>'.__('Support expires').'</span> 2023/04/26</p>'; if (((bool) check_acl($config['id_user'], 0, 'PM') === true) && (is_metaconsole() === false)) { $dialogButtons = []; $dialogButtons[] = html_print_button( __('Update manager'), 'update_manager', false, 'location.href="'.ui_get_full_url('/index.php?sec=gsetup&sec2=godmode/update_manager/update_manager&tab=history', false, false, false).'"', [ 'icon' => 'cog', 'mode' => 'mini secondary', ], true ); $dialogButtons[] = html_print_button( __('System report'), 'system_report', false, 'location.href="'.ui_get_full_url('/index.php?sec=gextensions&sec2=tools/diagnostics', false, false, false).'"', [ 'icon' => 'info', 'mode' => 'mini secondary', ], true ); $dialog .= html_print_div( [ 'style' => 'flex-direction: row;', 'class' => 'action-buttons', 'content' => implode('', $dialogButtons), ], true ); } $dialog .= '</th> </tr> </tbody> </table> <p class="trademark-copyright">Trademark and copyright 2004 - '.date('Y').' Pandora FMS. All rights reserved</p> </div> <div id="tab-database" class="div-scroll"> <table class="table-about"> <tbody style="text-align: left;"> <tr> <th colspan="2"> <h2><span> - </span>'.__('Database health status').'</h2> </th> </tr> <tr> <th style="width: 50%;"> <p><span>'.$db_health->data->unknownAgents->name.'</span></p> </th> <th style="width: 50%;"> <p>'.$db_health->data->unknownAgents->value.'</p> </th> </tr> <tr> <th style="width: 50%;"> <p><span>'.$db_health->data->notInitAgents->name.'</span></p> </th> <th style="width: 50%;"> <p>'.$db_health->data->notInitAgents->value.'</p> </th> </tr> <tr class="about-last-tr"> <th style="width: 50%;"> <p class="about-last-p"><span>'.$db_health->data->pandoraDbLastRun->name.'</span></p> </th> <th style="width: 50%;"> <p class="about-last-p">'.$db_health->data->pandoraDbLastRun->value.'</p> </th> </tr> <tr> <th colspan="2"> <h2><span> - </span>'.__('Database status info').'</h2> </th> </tr> <tr> <th style="width: 50%;"> <p><span>'.$db_info->data->dbSchemeFirstVersion->name.'</span></p> </th> <th style="width: 50%;"> <p>'.$db_info->data->dbSchemeFirstVersion->value.'</p> </th> </tr> <tr> <th style="width: 50%;"> <p><span>'.$db_info->data->dbSchemeVersion->name.'</span></p> </th> <th style="width: 50%;"> <p>'.$db_info->data->dbSchemeVersion->value.'</p> </th> </tr> <tr> <th style="width: 50%;"> <p><span>'.$db_info->data->dbSchemeBuild->name.'</span></p> </th> <th style="width: 50%;"> <p>'.$db_info->data->dbSchemeBuild->value.'</p> </th> </tr> <tr class="about-last-tr"> <th style="width: 50%;"> <p class="about-last-p"><span>'.$db_info->data->dbSize->name.'</span></p> </th> <th style="width: 50%;"> <p class="about-last-p">'.$db_info->data->dbSize->value.'</p> </th> </tr> <tr> <th colspan="2"> <h2><span> - </span>'.__('Tables fragmentation in the %s database', $product_name).'</h2> </th> </tr> <tr> <th style="width: 50%;"> <p><span>'.$db_fragmentation->data->tablesFragmentationMax->name.'</span></p> </th> <th style="width: 50%;"> <p>'.$db_fragmentation->data->tablesFragmentationMax->value.'</p> </th> </tr> <tr> <th style="width: 50%;"> <p><span>'.$db_fragmentation->data->tablesFragmentationValue->name.'</span></p> </th> <th style="width: 50%;"> <p>'.$db_fragmentation->data->tablesFragmentationValue->value.'</p> </th> </tr> <tr> <th style="width: 50%;"> <p><span>'.$db_fragmentation->data->tablesFragmentationStatus->name.'</span></p> </th> <th style="width: 50%;"> <p>'.$fragmentation_status.'</p> </th> </tr> </tbody> </table> </div> <div id="tab-system-info"> <table class="table-about"> <tbody style="text-align: left;"> <tr> <th colspan="2"> <h2><span> - </span>'.__('System Info').'</h2> </th> </tr> <tr> <th style="width: 15%;"> <p><span>'.$sys_info->data->cpuInfo->name.'</span></p> </th> <th style="width: 85%;"> <p>'.$sys_info->data->cpuInfo->value.'</p> </th> </tr> <tr> <th style="width: 15%;"> <p><span>'.$sys_info->data->ramInfo->name.'</span></p> </th> <th style="width: 85%;"> <p>'.$sys_info->data->ramInfo->value.'</p> </th> </tr> <tr> <th style="width: 15%;"> <p><span>'.$sys_info->data->osInfo->name.'</span></p> </th> <th style="width: 85%;"> <p>'.$sys_info->data->osInfo->value.'</p> </th> </tr> <tr> <th style="width: 15%;"> <p><span>'.$sys_info->data->hostnameInfo->name.'</span></p> </th> <th style="width: 85%;"> <p>'.$sys_info->data->hostnameInfo->value.'</p> </th> </tr> <tr> <th style="width: 15%;"> <p><span>'.$sys_info->data->ipInfo->name.'</span></p> </th> <th style="width: 85%;"> <p>'.$sys_info->data->ipInfo->value.'</p> </th> </tr> <tr> <th style="width: 15%;"> <p><span>'.$system_date->data->date->name.'</span></p> </th> <th style="width: 85%;"> <p>'.$system_date->data->date->value.'</p> </th> </tr> </tbody> </table> </div> <div id="tab-php-system"> <table class="table-about"> <tbody style="text-align: left;"> <tr> <th colspan="2"> <h2><span> - </span>'.__('PHP system').'</h2> </th> </tr> <tr> <th style="width: 35%;"> <p><span>'.$php_sys->data->phpVersion->name.'</span></p> </th> <th style="width: 65%;"> <p>'.$php_sys->data->phpVersion->value.'</p> </th> </tr> <tr> <th style="width: 35%;"> <p><span>'.$php_sys->data->maxExecutionTime->name.'</span></p> </th> <th style="width: 65%;"> <p>'.$php_sys->data->maxExecutionTime->value.'</p> </th> </tr> <tr> <th style="width: 35%;"> <p><span>'.$php_sys->data->maxInputTime->name.'</span></p> </th> <th style="width: 65%;"> <p>'.$php_sys->data->maxInputTime->value.'</p> </th> </tr> <tr> <th style="width: 35%;"> <p><span>'.$php_sys->data->memoryLimit->name.'</span></p> </th> <th style="width: 65%;"> <p>'.$php_sys->data->memoryLimit->value.'</p> </th> </tr> <tr> <th style="width: 35%;"> <p><span>'.$php_sys->data->sessionLifetime->name.'</span></p> </th> <th style="width: 65%;"> <p>'.$php_sys->data->sessionLifetime->value.'</p> </th> </tr> </tbody> </table> </div> </div> '; echo $dialog; } }