From f2ebd96cc8a3f37042e3d0164a79cd41d4ddc344 Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Thu, 20 Oct 2022 09:43:02 +0200 Subject: [PATCH 001/563] WIP: Created new way to do the menus --- pandora_console/godmode/menu.php | 3 +- pandora_console/include/class/Menu.class.php | 126 +++++ .../include/class/MenuItem.class.php | 431 ++++++++++++++++++ pandora_console/include/functions_menu.php | 53 +-- pandora_console/include/styles/nMenu.css | 6 + pandora_console/operation/menu.php | 118 ++++- 6 files changed, 696 insertions(+), 41 deletions(-) create mode 100644 pandora_console/include/class/Menu.class.php create mode 100644 pandora_console/include/class/MenuItem.class.php create mode 100644 pandora_console/include/styles/nMenu.css diff --git a/pandora_console/godmode/menu.php b/pandora_console/godmode/menu.php index d63595d553..5097054b48 100644 --- a/pandora_console/godmode/menu.php +++ b/pandora_console/godmode/menu.php @@ -32,10 +32,11 @@ require_once 'include/functions_menu.php'; check_login(); -$access_console_node = !is_reporting_console_node(); +$access_console_node = is_reporting_console_node() === false; $menu_godmode = []; $menu_godmode['class'] = 'godmode'; +$menuGodmode = []; if ($access_console_node === true) { enterprise_include('godmode/menu.php'); } diff --git a/pandora_console/include/class/Menu.class.php b/pandora_console/include/class/Menu.class.php new file mode 100644 index 0000000000..bce38a89db --- /dev/null +++ b/pandora_console/include/class/Menu.class.php @@ -0,0 +1,126 @@ +ACL_el_que_sea') === true) { + haz cosas aqui + } + + */ + + public function __construct( + private string $name, + private array $items=[], + private array $menu=[] + ) { + + } + + + /** + * Create Item function. + * + * @param MenuItem $menuItem Item for print. + * + * @return array. + */ + public function generateItem(MenuItem $menuItem) + { + // Start with empty element. + $item = []; + if ($menuItem->canBeDisplayed() === true) { + // Handle of information. + if (empty($menuItem->getUrl()) === false) { + $urlPath = $menuItem->getUrl(); + } else { + $urlPath = ui_get_full_url( + $menuItem->getSec().'/'.$menuItem->getSec2().'/'.$menuItem->getParameters() + ); + } + + // Creation of the line. + $item[] = '
  • '; + + // Create the link if is neccesary. + if (empty($urlPath) === false) { + $item[] = sprintf( + '%s', + $urlPath, + $menuItem->getText() + ); + } + + // Check if this item has submenu. If is the case, create it. + if ($menuItem->hasSubmenu() === true) { + $item[] = ''; + } + + $item[] = '
  • '; + } + + return $item; + } + + + /** + * Generate the menu. + * + * @return void. + */ + public function generateMenu() + { + $output = []; + /* + Estructura + + */ + $output[] = ''; + + $this->menu[] = $output; + + } + + + /** + * Prints the menu. + * + * @return void. + */ + public function printMenu() + { + if (empty($this->menu) === false) { + foreach ($this->menu as $element) { + echo $element."\n"; + } + } + } + + +} diff --git a/pandora_console/include/class/MenuItem.class.php b/pandora_console/include/class/MenuItem.class.php new file mode 100644 index 0000000000..3ec088ac72 --- /dev/null +++ b/pandora_console/include/class/MenuItem.class.php @@ -0,0 +1,431 @@ +id) === true && empty($this->text) === false) { + $this->id = str_replace(' ', '_', $text); + } + + return $this; + } + + + /** + * Set Text. The caption of the option. + * + * @param string $text Text. + * + * @return void. + */ + public function setText(string $text) + { + $this->text = $text; + } + + + /** + * Get Text + * + * @return string. + */ + public function getText() + { + return $this->text; + } + + + /** + * Set URL. Raw URL avoid sec and sec2 information. + * + * @param string $url Url. + * + * @return void. + */ + public function setUrl(string $url) + { + $this->url = $url; + } + + + /** + * Get URL + * + * @return string. + */ + public function getUrl() + { + return $this->url; + } + + + /** + * Set sec + * + * @param string $sec Sec. + * + * @return void. + */ + public function setSec(string $sec) + { + $this->sec = $sec; + } + + + /** + * Get sec + * + * @return string. + */ + public function getSec() + { + return $this->sec; + } + + + /** + * Set sec2 + * + * @param string $sec2 Sec2. + * + * @return void. + */ + public function setSec2(string $sec2) + { + $this->sec2 = $sec2; + } + + + /** + * Get sec2 + * + * @return string. + */ + public function getSec2() + { + return $this->sec2; + } + + + /** + * Set parameters. Added parameters for builded url (sec + sec2). + * + * @param string $parameters Parameters. + * + * @return void. + */ + public function setParameters(string $parameters) + { + $this->parameters = $parameters; + } + + + /** + * Get parameters + * + * @return string. + */ + public function getParameters() + { + return $this->parameters; + } + + + /** + * Set id. This is useful for identify the option selected. + * + * @param string $id Id. + * + * @return void. + */ + public function setId(string $id) + { + $this->id = $id; + } + + + /** + * Get id + * + * @return string. + */ + public function getId() + { + return $this->id; + } + + + /** + * Set icon. Must be relative path. + * + * @param string $icon Icon. + * + * @return void. + */ + public function setIcon(string $icon) + { + $this->icon = $icon; + } + + + /** + * Get icon + * + * @return string. + */ + public function getIcon() + { + return $this->icon; + } + + + /** + * Set class. + * + * @param string $class Class. + * + * @return void. + */ + public function setClass(string $class) + { + $this->class = $class; + } + + + /** + * Get class + * + * @return string. + */ + public function getClass() + { + return $this->class; + } + + + /** + * Set submenu. Array with options under this selection. + * + * @param array $submenu Submenu. + * + * @return void. + */ + public function setSubmenu(array $submenu) + { + $this->submenu = $submenu; + } + + + /** + * Get Submenu + * + * @return array. + */ + public function getSubmenu() + { + return $this->submenu; + } + + + /** + * Set ACLs. Attach only allowed ACLs in an array. + * + * @param array $acl ACL. + * + * @return void. + */ + public function setACL(array $acl) + { + $this->acl = $acl; + } + + + /** + * Get ACLs + * + * @return array. + */ + public function getACL() + { + return $this->acl; + } + + + /** + * Set activation token. + * + * @param array $activationToken ACL. + * + * @return void. + */ + public function setActivationToken(array $activationToken) + { + $this->activationToken = $activationToken; + } + + + /** + * Get activation token. + * + * @return array. + */ + public function getActivationToken() + { + return $this->activationToken; + } + + + /** + * Set refr + * + * @param integer $refr Refr. + * + * @return void. + */ + public function setRefr(int $refr) + { + $this->refr = $refr; + } + + + /** + * Get Refr + * + * @return integer. + */ + public function getRefr() + { + return $this->refr; + } + + + /** + * Set display. The item will be exists if this value is true. + * + * @param boolean $display Display. + * + * @return void. + */ + public function setDisplay(bool $display) + { + $this->display = $display; + } + + + /** + * Get Display + * + * @return boolean. + */ + public function getDisplay() + { + return $this->display; + } + + + /** + * Set enabled + * + * @param boolean $enabled Enabled. + * + * @return void. + */ + public function setEnabled(bool $enabled) + { + $this->enabled = $enabled; + } + + + /** + * Get enabled + * + * @return boolean. + */ + public function getEnabled() + { + return $this->enabled; + } + + + /** + * Returns true if this object have submenu. + * + * @return boolean. + */ + public function hasSubmenu() + { + return empty($this->getSubmenu()) === false; + } + + + /** + * Returns true if this object can be displayed. + * + * @return boolean. + */ + public function canBeDisplayed() + { + // Global config. + global $config; + $response = true; + + if ($this->getDisplay() === false) { + // Display value is false. + $response = false; + } else if (empty($this->getACL()) === false) { + // Check all the ACLs. + $acls = $this->getACL(); + foreach ($acls as $acl) { + $response = check_acl($config['id_user'], 0, $acl); + // In false case, end the check. + if ($response === false) { + break; + } + } + } + + return $response; + } + + +} diff --git a/pandora_console/include/functions_menu.php b/pandora_console/include/functions_menu.php index 8b1f1deaae..5ac1239d9f 100644 --- a/pandora_console/include/functions_menu.php +++ b/pandora_console/include/functions_menu.php @@ -53,12 +53,12 @@ function menu_print_menu(&$menu) $sec = (string) get_parameter('sec'); $sec2 = (string) get_parameter('sec2'); - if ($sec2 == 'operation/agentes/ver_agente') { + if ($sec2 === 'operation/agentes/ver_agente') { $sec2 = 'godmode/agentes/configurar_agente'; - } else if ($sec2 == 'godmode/servers/discovery') { + } else if ($sec2 === 'godmode/servers/discovery') { $wiz = (string) get_parameter('wiz'); $sec2 = 'godmode/servers/discovery&wiz='.$wiz; - } else if ($sec2 == 'godmode/groups/group_list') { + } else if ($sec2 === 'godmode/groups/group_list') { $tab = (string) get_parameter('tab'); if ($tab === 'credbox') { $sec2 = 'godmode/groups/group_list&tab='.$tab; @@ -70,58 +70,39 @@ function menu_print_menu(&$menu) $menu_selected = false; $allsec2 = explode('sec2=', $_SERVER['REQUEST_URI']); - if (isset($allsec2[1])) { + if (isset($allsec2[1]) === true) { $allsec2 = $allsec2[1]; } else { $allsec2 = $sec2; } // Open list of menu. - echo ''; + echo ''; // Use $config because a global var is required because normal // and godmode menu are painted separately. - if (!isset($config['count_main_menu'])) { + if (isset($config['count_main_menu']) === false) { $config['count_main_menu'] = 0; } foreach ($menu as $mainsec => $main) { - $extensionInMenuParameter = (string) get_parameter('extension_in_menu', ''); + $extensionInMenuParameter = (string) get_parameter('extension_in_menu'); $showSubsection = true; - if ($extensionInMenuParameter != '') { - if ($extensionInMenuParameter == $mainsec) { - $showSubsection = true; - } else { - $showSubsection = false; - } + if (empty($extensionInMenuParameter) === false) { + $showSubsection = ($extensionInMenuParameter === $mainsec); } - if ($mainsec == 'class') { + if ($mainsec === 'class') { continue; } - // ~ if (enterprise_hook ('enterprise_acl', array ($config['id_user'], $mainsec)) == false) - // ~ continue; - if (! isset($main['id'])) { - $id = 'menu_'.(++$idcounter); - } else { - $id = $main['id']; - } - + $id = (isset($main['id']) === false) ? 'menu_'.(++$idcounter) : $main['id']; $submenu = false; - - if ($menuTypeClass === 'classic') { - $classes = [ - 'menu_icon', - 'no_hidden_menu', - ]; - } else { - $classes = [ - 'menu_icon', - 'menu_icon_collapsed', - ]; - } + $classes = [ + 'menu_icon', + ($menuTypeClass === 'classic') ? 'no_hidden_menu' : 'menu_icon_collapsed', + ]; if (isset($main['sub']) === true) { $classes[] = ''; @@ -132,11 +113,11 @@ function menu_print_menu(&$menu) $main['refr'] = 0; } - if (($sec == $mainsec) && ($showSubsection)) { + if (($sec === $mainsec) && ((bool) $showSubsection === true)) { $classes[] = ''; } else { $classes[] = ''; - if ($extensionInMenuParameter == $mainsec) { + if ($extensionInMenuParameter === $mainsec) { $classes[] = ''; } } diff --git a/pandora_console/include/styles/nMenu.css b/pandora_console/include/styles/nMenu.css new file mode 100644 index 0000000000..99a9ae70b1 --- /dev/null +++ b/pandora_console/include/styles/nMenu.css @@ -0,0 +1,6 @@ +.operation li, +.godmode li { + display: flex; + justify-content: flex-start; + align-items: center; +} diff --git a/pandora_console/operation/menu.php b/pandora_console/operation/menu.php index fb303dd3fa..03c073fa23 100644 --- a/pandora_console/operation/menu.php +++ b/pandora_console/operation/menu.php @@ -19,12 +19,122 @@ use PandoraFMS\Dashboard\Manager; require_once 'include/functions_menu.php'; require_once $config['homedir'].'/include/functions_visual_map.php'; +require_once 'include/class/MenuItem.class.php'; enterprise_include('operation/menu.php'); $menu_operation = []; $menu_operation['class'] = 'operation'; +$menuOperation = []; + +$subMenuMonitoring = []; + + +$subMenuMonitoringViews = []; + +// L0. Monitoring. +$menuOperation['monitoring'] = new MenuItem(__('Monitoring')); +$menuOperation['monitoring']->setIcon('icon'); +$menuOperation['monitoring']->setClass('menu'); +$menuOperation['monitoring']->setACL(['AR']); +$monitoringItems = []; + +// L1. Views. +$monitoringItems['views'] = new MenuItem(__('Views')); +$monitoringItems['views']->setIcon('icono'); +$monitoringItems['views']->setClass('submenu'); +$monitoringViewsItems = []; + +// L2. Tactical view. +$monitoringViewsItems['tacticalView'] = new MenuItem(__('Tactical view')); +$monitoringViewsItems['tacticalView']->setSec('view'); +$monitoringViewsItems['tacticalView']->setSec2('operation/agentes/tactical'); +$monitoringViewsItems['tacticalView']->setClass('submenu'); + +// L2. Group View. +$monitoringViewsItems['groupView'] = new MenuItem(__('Group view')); +$monitoringViewsItems['groupView']->setSec('view'); +$monitoringViewsItems['groupView']->setSec2('operation/agentes/group_view'); +$monitoringViewsItems['groupView']->setClass('submenu'); + +// L2. Tree View. +$monitoringViewsItems['treeView'] = new MenuItem(__('Tree view')); +$monitoringViewsItems['treeView']->setSec('view'); +$monitoringViewsItems['treeView']->setSec2('operation/tree'); +$monitoringViewsItems['treeView']->setClass('submenu'); + +// L2. Monitor detail. +$monitoringViewsItems['monitorDetail'] = new MenuItem(__('Monitor detail')); +$monitoringViewsItems['monitorDetail']->setSec('view'); +$monitoringViewsItems['monitorDetail']->setSec2('operation/agentes/status_monitor'); +$monitoringViewsItems['monitorDetail']->setClass('submenu'); + +// L2. Interface view. +$monitoringViewsItems['interfaceView'] = new MenuItem(__('Interface View')); +$monitoringViewsItems['interfaceView']->setSec('view'); +$monitoringViewsItems['interfaceView']->setSec2('operation/agentes/interface_view'); +$monitoringViewsItems['interfaceView']->setClass('submenu'); + +// L2. Enterprise Tag view. +$idTagView = 'tagView'; +$monitoringViewsItems[$idTagView] = enterprise_hook('tag_view_submenu', $idTagView); + +// L2. Alert detail view. +$monitoringViewsItems['alertDetail'] = new MenuItem(__('Alert Detail')); +$monitoringViewsItems['alertDetail']->setSec('view'); +$monitoringViewsItems['alertDetail']->setSec2('operation/agentes/alerts_status'); +$monitoringViewsItems['alertDetail']->setClass('submenu'); + +// L2. Heatmap view. +$monitoringViewsItems['heatmapView'] = new MenuItem(__('Heatmap view')); +$monitoringViewsItems['heatmapView']->setSec('view'); +$monitoringViewsItems['heatmapView']->setSec2('operation/heatmap'); +$monitoringViewsItems['heatmapView']->setClass('submenu'); + +$monitoringItems['views']->setSubmenu($monitoringViewsItems); + +// L1. Inventory. +$monitoringItems['inventory'] = new MenuItem(__('Inventory')); +$monitoringItems['inventory']->setSec('estado'); +$monitoringItems['inventory']->setSec2('enterprise/operation/inventory/inventory'); +$monitoringItems['inventory']->setClass('submenu'); + +// L1. Network. +$monitoringItems['network'] = new MenuItem(); +$monitoringItems['network']->setDisplay((bool) $config['activate_netflow'] === true); +$monitoringItems['network']->setText(__('Network')); + +// L2. Netflow explorer. +$monitoringNetworkItems['netflowExplorer'] = new MenuItem(); +$monitoringNetworkItems['netflowExplorer']->setText(__('Netflow Explorer')); +$monitoringNetworkItems['netflowExplorer']->setSec('network_traffic'); +$monitoringNetworkItems['netflowExplorer']->setSec2('operation/netflow/netflow_explorer'); + +// L2. Netflow Live view. +$monitoringNetworkItems['netflowLiveView'] = new MenuItem(); +$monitoringNetworkItems['netflowLiveView']->setText(__('Netflow Live View')); +$monitoringNetworkItems['netflowLiveView']->setSec('network_traffic'); +$monitoringNetworkItems['netflowLiveView']->setSec2('operation/netflow/nf_live_view'); + +// L2. Network usage map. +$monitoringNetworkItems['networkUsageMap'] = new MenuItem(); +$monitoringNetworkItems['networkUsageMap']->setText(__('Network usage map')); +$monitoringNetworkItems['networkUsageMap']->setSec('network_traffic'); +$monitoringNetworkItems['networkUsageMap']->setSec2('operation/network/network_usage_map'); + +$monitoringItems['network']->setSubmenu($monitoringNetworkItems); + +$menuOperation['monitoring']->setSubmenu($monitoringItems); + +// L0. Topology Maps. +$menuOperation['topologyMaps'] = new MenuItem(__('Topology Maps')); +$menuOperation['topologyMaps']->setIcon('icon'); +$menuOperation['topologyMaps']->setClass('menu'); + +$menuOperation['topologyMaps']->setSubmenu($topologyMapsItems); + + $access_console_node = !is_reporting_console_node(); if ($access_console_node === true) { // Agent read, Server read. @@ -74,8 +184,8 @@ if ($access_console_node === true) { $sub['view']['sub2'] = $sub2; enterprise_hook('inventory_menu'); - - if ($config['activate_netflow']) { + /* + if ($config['activate_netflow']) { $sub['network_traffic'] = [ 'text' => __('Network'), 'id' => 'Network', @@ -112,8 +222,8 @@ if ($access_console_node === true) { ); $sub['network_traffic']['sub2'] = $netflow_sub; - } - + } + */ if ($config['log_collector'] == 1) { enterprise_hook('log_collector_menu'); } From bf6ec7e99c9945f9a629a53d12741cc639ff817c Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Thu, 20 Oct 2022 10:37:58 +0200 Subject: [PATCH 002/563] Added new fonts --- pandora_console/include/fonts/Pandora-Bold.woff | Bin 0 -> 39276 bytes .../include/fonts/Pandora-Light.woff | Bin 0 -> 54820 bytes .../include/fonts/Pandora-Regular.woff | Bin 0 -> 34716 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 pandora_console/include/fonts/Pandora-Bold.woff create mode 100644 pandora_console/include/fonts/Pandora-Light.woff create mode 100644 pandora_console/include/fonts/Pandora-Regular.woff diff --git a/pandora_console/include/fonts/Pandora-Bold.woff b/pandora_console/include/fonts/Pandora-Bold.woff new file mode 100644 index 0000000000000000000000000000000000000000..25ab32f58d51c00be1a4bdab7e462c2d2945a81b GIT binary patch literal 39276 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 ~Mx~2AB?j+L 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 K4*)sy1!4d-LgxPf literal 0 HcmV?d00001 diff --git a/pandora_console/include/fonts/Pandora-Light.woff b/pandora_console/include/fonts/Pandora-Light.woff new file mode 100644 index 0000000000000000000000000000000000000000..7d5cdaa9f0194d1b63b38446906d6e99a11acc7c GIT binary patch literal 54820 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 I0RR910OYKqU;qFB literal 0 HcmV?d00001 diff --git a/pandora_console/include/fonts/Pandora-Regular.woff b/pandora_console/include/fonts/Pandora-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..257304a04018c4b6315cbe0048bce2ea4925b243 GIT binary patch literal 34716 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 @igF`38cJY0 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 c0RR910NUQy#Q*>R0L_ehHUIzs0L_eTE4eV+eE Date: Fri, 21 Oct 2022 13:32:57 +0200 Subject: [PATCH 003/563] CSS changes --- pandora_console/include/styles/pandora.css | 548 +++++++++++++++----- pandora_console/include/styles/register.css | 69 --- 2 files changed, 427 insertions(+), 190 deletions(-) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index eeff4d2fce..c19d13ea81 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -33,6 +33,23 @@ * --------------------------------------------------------------------- */ +@font-face { + font-family: "Pandora-Bold"; + src: url("../fonts/Pandora-Bold.woff") format("woff"); + font-weight: 700; +} + +@font-face { + font-family: "Pandora-Regular"; + src: url("../fonts/Pandora-Regular.woff") format("woff"); + font-weight: 400; +} + +@font-face { + font-family: "Pandora-Light"; + src: url("../fonts/Pandora-Light.woff") format("woff"); + font-weight: 100; +} @font-face { font-family: "lato"; src: url("../fonts/Lato-Regular.woff") format("woff"); @@ -139,7 +156,7 @@ body { flex-direction: column; min-height: 100%; font-weight: 400; - font-family: "lato"; + font-family: "Pandora-Regular"; } body.body-report { @@ -178,11 +195,6 @@ input.button { margin: 10px 15px; } -input[type="submit"], -input[type="button"] { - cursor: pointer; -} - h1, h2, h3, @@ -1810,7 +1822,10 @@ table.rounded_cells td { border-radius: 6px; } -.action-buttons, +.action-buttons { + display: flex; + flex-direction: row-reverse; +} .right { text-align: right; } @@ -1858,107 +1873,6 @@ input.spinn { padding-right: 30px; } -button.next, -input.next { - background-image: url(../../images/input_go.png); -} -button.upd, -input.upd { - background-image: url(../../images/input_update.png); -} -button.wand, -input.wand { - background-image: url(../../images/input_wand.png); -} -button.wand:disabled, -input.wand:disabled { - background-image: url(../../images/input_wand.disabled.png); -} -button.search, -input.search { - background-image: url(../../images/input_zoom.png); -} -button.search:disabled, -input.search:disabled { - background-image: url(../../images/input_zoom.disabled.png); -} -button.ok, -input.ok { - background-image: url(../../images/input_tick.png); -} -button.ok:disabled, -input.ok:disabled { - background-image: url(../../images/input_tick.disabled.png); -} -button.add, -input.add { - background-image: url(../../images/input_add.png); -} -button.add:disabled, -input.add:disabled { - background-image: url(../../images/input_add.disabled.png); -} -button.cancel, -input.cancel { - background-image: url(../../images/input_cross.png); -} -button.cancel:disabled, -input.cancel:disabled { - background-image: url(../../images/input_cross.disabled.png); -} -button.delete, -input.delete { - background-image: url(../../images/input_delete.png); -} -button.delete:disabled, -input.delete:disabled { - background-image: url(../../images/input_delete.disabled.png); -} -button.cog, -input.cog { - background-image: url(../../images/input_cog.png); -} -button.cog:disabled, -input.cog:disabled { - background-image: url(../../images/input_cog.disabled.png); -} -button.config, -input.config { - background-image: url(../../images/input_config.png); -} -button.config:disabled, -input.config:disabled { - background-image: url(../../images/input_config.disabled.png); -} -button.filter, -input.filter { - background-image: url(../../images/input_filter.png); -} -button.filter:disabled, -input.filter:disabled { - background-image: url(../../images/input_filter.disabled.png); -} -button.pdf, -input.pdf { - background-image: url(../../images/input_pdf.png); -} -button.pdf:disabled, -input.pdf:disabled { - background-image: url(../../images/input_pdf.disabled.png); -} -button.camera, -input.camera { - background-image: url(../../images/input_camera.png); -} -button.spinn, -input.spinn { - background-image: url(../../images/spinner_green.gif); -} -button.deploy, -input.deploy { - background-image: url(../../images/input_deploy.png); -} - button.add-item-img, input.add-item-img { background-image: url(../../images/add.png); @@ -7128,12 +7042,6 @@ div.graph div.legend table { height: 30em; } -.agent_manager { - display: flex; - justify-content: flex-end; - align-items: center; -} - #p_configurar_agente { float: right; font-style: lato; @@ -9072,13 +8980,407 @@ div#err_msg_centralised { } } -.text_input { - background-color: transparent !important; - border: none; - border-radius: 0; - border-bottom: 1px solid #ccc; - margin-bottom: 4px; - padding: 2px 5px; +input { + background-color: #f6f7fb; + height: 24px; + border: 1px solid #c0ccdc; + border-radius: 8px; + padding-left: 12px; + font: normal normal normal 12px Pandora-Light; + color: #2b3332; +} + +input:disabled { + background-color: #e5e9ed; + color: #8a96a6; +} + +input[type="button"], +input[type="submit"] { + width: 175px; + height: 45px; + background-color: #14524f; + box-shadow: 0px 3px 6px #c7c7c7; + letter-spacing: 0px; + color: #ffffff; + font-family: Pandora-Regular; + font-size: 16px; + margin-left: 1em; + cursor: pointer; +} + +input[type="button"]:hover, +input[type="submit"]:hover { + background-color: #1d7873; +} + +input[type="button"]:active, +input[type="submit"]:active { + background-color: #0d312f; + color: #ffffff; +} + +input[type="button"].secondary, +input[type="submit"].secondary { + width: 175px; + height: 45px; + background-color: #ffffff; + border: 2px solid #14524f; + color: #14524f; +} + +input[type="button"].secondary:hover, +input[type="submit"].secondary:hover { + border: 2px solid #1d7873; + color: #1d7873; +} + +input[type="button"].secondary:active, +input[type="submit"].secondary:active { + border: 2px solid #0d312f; + color: #0d312f; +} + +button.inputButton, +button.submitButton { + display: flex; + justify-content: space-between; + flex-direction: row; + min-width: 110px; + height: 32px; + font-size: 16px !important; + align-items: center; + line-height: 24px; + box-shadow: 0px 3px 6px #c7c7c7; + background-color: #14524f; + color: #fff; + border: 1px solid #14524f; + border-radius: 5px; + padding-left: 0.5em; + cursor: pointer; +} + +button.inputButton:hover, +button.submitButton:hover { + background-color: #1d7873; + border-color: #1d7873; +} + +button.inputButton:active, +button.submitButton:active { + background-color: #0d312f; + border-color: #0d312f; +} + +/* Button */ +button.inputButton > div, +button.submitButton > div { + background-color: #fff; + width: 2rem; + height: 2rem; + margin-left: 1rem; +} + +button.inputButton.secondary, +button.submitButton.secondary { + background-color: #fff; + color: #14524f; + border: 2px solid #14524f; +} + +button.inputButton.secondary > div, +button.submitButton.secondary > div { + background-color: #14524f !important; +} + +button.inputButton.secondary:hover, +button.submitButton.secondary:hover { + color: #1d7873 !important; + border-color: #1d7873 !important; +} + +button.inputButton.secondary:hover > div, +button.submitButton.secondary:hover > div { + background-color: #1d7873 !important; +} + +button.inputButton.secondary:active, +button.submitButton.secondary:active { + color: #0d312f !important; + border-color: #0d312f !important; +} + +button.inputButton.secondary:active > div, +button.submitButton.secondary:active > div { + background-color: #0d312f !important; +} + +button div.camera { + mask: url(../../images/svg/picture.svg) no-repeat center / contain; + -webkit-mask: url(../../images/svg/picture.svg) no-repeat center / contain; +} + +button div.ok { + mask: url(../../images/svg/ok.svg) no-repeat center / contain; + -webkit-mask: url(../../images/svg/ok.svg) no-repeat center / contain; +} + +button div.next { + mask: url(../../images/svg/arrow.svg) no-repeat center / contain; + -webkit-mask: url(../../images/svg/arrow.svg) no-repeat center / contain; +} + +button div.search { + mask: url(../../images/svg/search.svg) no-repeat center / contain; + -webkit-mask: url(../../images/svg/search.svg) no-repeat center / contain; +} + +button div.wand, +button div.upd { + mask: url(../../images/svg/success.svg) no-repeat center / contain; + -webkit-mask: url(../../images/svg/success.svg) no-repeat center / contain; +} + +button div.add { + mask: url(../../images/svg/plus.svg) no-repeat center / contain; + -webkit-mask: url(../../images/svg/plus.svg) no-repeat center / contain; +} + +button div.delete { + mask: url(../../images/svg/trash.svg) no-repeat center / contain; + -webkit-mask: url(../../images/svg/trash.svg) no-repeat center / contain; +} + +button div.cancel { + mask: url(../../images/svg/left.svg) no-repeat center / contain; + -webkit-mask: url(../../images/svg/left.svg) no-repeat center / contain; +} + +.ui-dialog-buttonset { + display: flex; +} + +button.ui-button-text-only.ui-widget.sub { + display: flex; + justify-content: center; + flex-direction: column; + align-content: center; + min-width: 100px; + height: 32px; + font-size: 16px !important; + align-items: center; + line-height: 24px; + box-shadow: 0px 3px 6px #c7c7c7; + border-radius: 5px; + cursor: pointer; + padding: 0; +} + +button.ui-button.ui-widget.submit-next { + background-color: #14524f; + color: #fff; + border: 1px solid #14524f; +} + +button.ui-button.ui-widget.submit-next:hover { + background-color: #1d7873; + border-color: #1d7873; +} + +button.ui-button.ui-widget.submit-next:active { + background-color: #0d312f; + border-color: #0d312f; +} + +button.ui-button.ui-widget.submit-cancel { + background-color: #fff; + color: #14524f; + border: 1px solid #fff; +} + +button.ui-button.ui-widget.submit-cancel:hover { + color: #1d7873; +} + +button.ui-button.ui-widget.submit-cancel:active { + color: #0d312f; +} + +/* clean the next */ +button.next, +input.next { + background-image: url(../../images/svg/arrow.svg); + background-position: 90% center; + background-repeat: no-repeat; + background-size: 24px; +} + +button.upd, +input.upd { + background-image: url(../../images/input_update.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.wand, +input.wand { + background-image: url(../../images/input_wand.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.wand:disabled, +input.wand:disabled { + background-image: url(../../images/input_wand.disabled.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.search, +input.search { + background-image: url(../../images/input_zoom.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.search:disabled, +input.search:disabled { + background-image: url(../../images/input_zoom.disabled.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.ok, +input.ok { + background-image: url(../../images/input_tick.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.ok:disabled, +input.ok:disabled { + background-image: url(../../images/input_tick.disabled.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.add, +input.add { + background-image: url(../../images/input_add.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.add:disabled, +input.add:disabled { + background-image: url(../../images/input_add.disabled.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.cancel, +input.cancel { + background-image: url(../../images/input_cross.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.cancel:disabled, +input.cancel:disabled { + background-image: url(../../images/input_cross.disabled.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.delete, +input.delete { + background-image: url(../../images/input_delete.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.delete:disabled, +input.delete:disabled { + background-image: url(../../images/input_delete.disabled.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.cog, +input.cog { + background-image: url(../../images/input_cog.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.cog:disabled, +input.cog:disabled { + background-image: url(../../images/input_cog.disabled.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.config, +input.config { + background-image: url(../../images/input_config.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.config:disabled, +input.config:disabled { + background-image: url(../../images/input_config.disabled.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.filter, +input.filter { + background-image: url(../../images/input_filter.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.filter:disabled, +input.filter:disabled { + background-image: url(../../images/input_filter.disabled.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.pdf, +input.pdf { + background-image: url(../../images/input_pdf.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.pdf:disabled, +input.pdf:disabled { + background-image: url(../../images/input_pdf.disabled.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.camera, +input.camera { + background-image: url(../../images/input_camera.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.spinn, +input.spinn { + background-image: url(../../images/spinner_green.gif); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.deploy, +input.deploy { + background-image: url(../../images/input_deploy.png); + background-position: 90% center; + background-repeat: no-repeat; } .password_input { @@ -9119,3 +9421,7 @@ div#err_msg_centralised { margin-right: -110px; margin-top: 13px; } + +.svg_ico_border { + fill: #fff; +} diff --git a/pandora_console/include/styles/register.css b/pandora_console/include/styles/register.css index 77d56dbc85..3f867e3e9b 100644 --- a/pandora_console/include/styles/register.css +++ b/pandora_console/include/styles/register.css @@ -1,72 +1,3 @@ -input[type="submit"].submit-cancel, -button.submit-cancel.ui-button.ui-corner-all.ui-widget, -button.submit-cancel { - color: #fb4444; - border: 1px solid #fb4444; - background: #fff; - padding: 5px; - font-size: 1.3em; - margin: 0.5em 1em 0.5em 0; - cursor: pointer; - text-align: center; - height: 30px; - width: auto; - min-width: 90px; -} - -input[type="submit"].submit-cancel:hover, -button.submit-cancel.ui-button.ui-corner-all.ui-widget:hover, -button.submit-cancel:hover { - color: #fff; - background: #fb4444; -} - -input[type="submit"].submit-next, -button.submit-next.ui-button.ui-corner-all.ui-widget, -input[type="button"].submit-next { - color: #82b92e; - border: 1px solid #82b92e; - background: #fff; - padding: 5px; - font-size: 1.3em; - margin: 0.5em 0em; - cursor: pointer; - text-align: center; - height: 30px; - width: auto; - min-width: 90px; -} - -input[type="submit"].submit-next:hover, -button.submit-next.ui-button.ui-corner-all.ui-widget:hover, -input[type="button"].submit-next:hover { - color: #fff; - background: #82b92e; -} - -input[type="submit"].submit-warning, -button.submit-warning.ui-button.ui-corner-all.ui-widget, -input[type="button"].submit-warning { - color: #c9d511; - border: 1px solid #c9d511; - background: #fff; - padding: 5px; - font-size: 1.3em; - margin: 0.5em 1em 0.5em 0; - cursor: pointer; - text-align: center; - height: 30px; - width: auto; - min-width: 90px; -} - -input[type="submit"].submit-warning:hover, -button.submit-warning.ui-button.ui-corner-all.ui-widget:hover, -input[type="button"].submit-warning:hover { - color: #fff; - background: #c9d511; -} - div.submit_buttons_container { position: relative; margin: 10px auto 0px; From 6a21fcd6a927cecedca0994e85d8119de2eba5bf Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Fri, 21 Oct 2022 13:33:49 +0200 Subject: [PATCH 004/563] SVG files --- pandora_console/images/svg/add.svg | 1 + pandora_console/images/svg/arrow.svg | 1 + pandora_console/images/svg/bell.svg | 1 + pandora_console/images/svg/bubble.svg | 1 + pandora_console/images/svg/cog.svg | 1 + pandora_console/images/svg/device.svg | 1 + pandora_console/images/svg/display.svg | 1 + pandora_console/images/svg/down.svg | 1 + pandora_console/images/svg/duplicate.svg | 1 + pandora_console/images/svg/envelope.svg | 1 + pandora_console/images/svg/exit.svg | 1 + pandora_console/images/svg/eye.svg | 1 + pandora_console/images/svg/fail.svg | 1 + pandora_console/images/svg/file.svg | 1 + pandora_console/images/svg/house.svg | 1 + pandora_console/images/svg/iconos-19.svg | 1 + pandora_console/images/svg/iconos-27.svg | 1 + pandora_console/images/svg/info.svg | 1 + pandora_console/images/svg/left.svg | 1 + pandora_console/images/svg/menu_horizontal.svg | 1 + pandora_console/images/svg/menu_vertical.svg | 1 + pandora_console/images/svg/ok.svg | 1 + pandora_console/images/svg/picture.svg | 1 + pandora_console/images/svg/plus.svg | 1 + pandora_console/images/svg/protected.svg | 1 + pandora_console/images/svg/right.svg | 1 + pandora_console/images/svg/search.svg | 1 + pandora_console/images/svg/settings.svg | 1 + pandora_console/images/svg/sound.svg | 1 + pandora_console/images/svg/star.svg | 1 + pandora_console/images/svg/success.svg | 1 + pandora_console/images/svg/trash.svg | 1 + pandora_console/images/svg/up.svg | 1 + pandora_console/images/svg/user.svg | 1 + 34 files changed, 34 insertions(+) create mode 100644 pandora_console/images/svg/add.svg create mode 100644 pandora_console/images/svg/arrow.svg create mode 100644 pandora_console/images/svg/bell.svg create mode 100644 pandora_console/images/svg/bubble.svg create mode 100644 pandora_console/images/svg/cog.svg create mode 100644 pandora_console/images/svg/device.svg create mode 100644 pandora_console/images/svg/display.svg create mode 100644 pandora_console/images/svg/down.svg create mode 100644 pandora_console/images/svg/duplicate.svg create mode 100644 pandora_console/images/svg/envelope.svg create mode 100644 pandora_console/images/svg/exit.svg create mode 100644 pandora_console/images/svg/eye.svg create mode 100644 pandora_console/images/svg/fail.svg create mode 100644 pandora_console/images/svg/file.svg create mode 100644 pandora_console/images/svg/house.svg create mode 100644 pandora_console/images/svg/iconos-19.svg create mode 100644 pandora_console/images/svg/iconos-27.svg create mode 100644 pandora_console/images/svg/info.svg create mode 100644 pandora_console/images/svg/left.svg create mode 100644 pandora_console/images/svg/menu_horizontal.svg create mode 100644 pandora_console/images/svg/menu_vertical.svg create mode 100644 pandora_console/images/svg/ok.svg create mode 100644 pandora_console/images/svg/picture.svg create mode 100644 pandora_console/images/svg/plus.svg create mode 100644 pandora_console/images/svg/protected.svg create mode 100644 pandora_console/images/svg/right.svg create mode 100644 pandora_console/images/svg/search.svg create mode 100644 pandora_console/images/svg/settings.svg create mode 100644 pandora_console/images/svg/sound.svg create mode 100644 pandora_console/images/svg/star.svg create mode 100644 pandora_console/images/svg/success.svg create mode 100644 pandora_console/images/svg/trash.svg create mode 100644 pandora_console/images/svg/up.svg create mode 100644 pandora_console/images/svg/user.svg diff --git a/pandora_console/images/svg/add.svg b/pandora_console/images/svg/add.svg new file mode 100644 index 0000000000..b80fa3fb0d --- /dev/null +++ b/pandora_console/images/svg/add.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/arrow.svg b/pandora_console/images/svg/arrow.svg new file mode 100644 index 0000000000..7fb5d31ac4 --- /dev/null +++ b/pandora_console/images/svg/arrow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/bell.svg b/pandora_console/images/svg/bell.svg new file mode 100644 index 0000000000..eec47bd762 --- /dev/null +++ b/pandora_console/images/svg/bell.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/bubble.svg b/pandora_console/images/svg/bubble.svg new file mode 100644 index 0000000000..08bf0727fb --- /dev/null +++ b/pandora_console/images/svg/bubble.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/cog.svg b/pandora_console/images/svg/cog.svg new file mode 100644 index 0000000000..4fc3b6b6fb --- /dev/null +++ b/pandora_console/images/svg/cog.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/device.svg b/pandora_console/images/svg/device.svg new file mode 100644 index 0000000000..46ea97ad8c --- /dev/null +++ b/pandora_console/images/svg/device.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/display.svg b/pandora_console/images/svg/display.svg new file mode 100644 index 0000000000..38e3a84fa4 --- /dev/null +++ b/pandora_console/images/svg/display.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/down.svg b/pandora_console/images/svg/down.svg new file mode 100644 index 0000000000..b515cd5102 --- /dev/null +++ b/pandora_console/images/svg/down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/duplicate.svg b/pandora_console/images/svg/duplicate.svg new file mode 100644 index 0000000000..54b78c2aad --- /dev/null +++ b/pandora_console/images/svg/duplicate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/envelope.svg b/pandora_console/images/svg/envelope.svg new file mode 100644 index 0000000000..b50e20e331 --- /dev/null +++ b/pandora_console/images/svg/envelope.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/exit.svg b/pandora_console/images/svg/exit.svg new file mode 100644 index 0000000000..16e0eae613 --- /dev/null +++ b/pandora_console/images/svg/exit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/eye.svg b/pandora_console/images/svg/eye.svg new file mode 100644 index 0000000000..5f9c897222 --- /dev/null +++ b/pandora_console/images/svg/eye.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/fail.svg b/pandora_console/images/svg/fail.svg new file mode 100644 index 0000000000..f6a60f9276 --- /dev/null +++ b/pandora_console/images/svg/fail.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/file.svg b/pandora_console/images/svg/file.svg new file mode 100644 index 0000000000..6ef321521c --- /dev/null +++ b/pandora_console/images/svg/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/house.svg b/pandora_console/images/svg/house.svg new file mode 100644 index 0000000000..1361d98cdc --- /dev/null +++ b/pandora_console/images/svg/house.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/iconos-19.svg b/pandora_console/images/svg/iconos-19.svg new file mode 100644 index 0000000000..8471a06bea --- /dev/null +++ b/pandora_console/images/svg/iconos-19.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/iconos-27.svg b/pandora_console/images/svg/iconos-27.svg new file mode 100644 index 0000000000..9eb41e512d --- /dev/null +++ b/pandora_console/images/svg/iconos-27.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/info.svg b/pandora_console/images/svg/info.svg new file mode 100644 index 0000000000..a7b23d52d4 --- /dev/null +++ b/pandora_console/images/svg/info.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/left.svg b/pandora_console/images/svg/left.svg new file mode 100644 index 0000000000..d74cf540b3 --- /dev/null +++ b/pandora_console/images/svg/left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/menu_horizontal.svg b/pandora_console/images/svg/menu_horizontal.svg new file mode 100644 index 0000000000..bcd2f124cb --- /dev/null +++ b/pandora_console/images/svg/menu_horizontal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/menu_vertical.svg b/pandora_console/images/svg/menu_vertical.svg new file mode 100644 index 0000000000..1b5e468eb1 --- /dev/null +++ b/pandora_console/images/svg/menu_vertical.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/ok.svg b/pandora_console/images/svg/ok.svg new file mode 100644 index 0000000000..af6c3850cd --- /dev/null +++ b/pandora_console/images/svg/ok.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/picture.svg b/pandora_console/images/svg/picture.svg new file mode 100644 index 0000000000..978557a383 --- /dev/null +++ b/pandora_console/images/svg/picture.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/plus.svg b/pandora_console/images/svg/plus.svg new file mode 100644 index 0000000000..18736fde28 --- /dev/null +++ b/pandora_console/images/svg/plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/protected.svg b/pandora_console/images/svg/protected.svg new file mode 100644 index 0000000000..39f9c69aa1 --- /dev/null +++ b/pandora_console/images/svg/protected.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/right.svg b/pandora_console/images/svg/right.svg new file mode 100644 index 0000000000..e74f4abeb8 --- /dev/null +++ b/pandora_console/images/svg/right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/search.svg b/pandora_console/images/svg/search.svg new file mode 100644 index 0000000000..14f8f5fd8e --- /dev/null +++ b/pandora_console/images/svg/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/settings.svg b/pandora_console/images/svg/settings.svg new file mode 100644 index 0000000000..16858510e1 --- /dev/null +++ b/pandora_console/images/svg/settings.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/sound.svg b/pandora_console/images/svg/sound.svg new file mode 100644 index 0000000000..1ff57a311f --- /dev/null +++ b/pandora_console/images/svg/sound.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/star.svg b/pandora_console/images/svg/star.svg new file mode 100644 index 0000000000..1ba2f60041 --- /dev/null +++ b/pandora_console/images/svg/star.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/success.svg b/pandora_console/images/svg/success.svg new file mode 100644 index 0000000000..26e83ff1f7 --- /dev/null +++ b/pandora_console/images/svg/success.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/trash.svg b/pandora_console/images/svg/trash.svg new file mode 100644 index 0000000000..0dc58d9e0f --- /dev/null +++ b/pandora_console/images/svg/trash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/up.svg b/pandora_console/images/svg/up.svg new file mode 100644 index 0000000000..88fe9cb5be --- /dev/null +++ b/pandora_console/images/svg/up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/user.svg b/pandora_console/images/svg/user.svg new file mode 100644 index 0000000000..797b4e04a0 --- /dev/null +++ b/pandora_console/images/svg/user.svg @@ -0,0 +1 @@ + \ No newline at end of file From 20a41a1b2df8bd4c8e157b6abdc307df0386f980 Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Fri, 21 Oct 2022 13:35:57 +0200 Subject: [PATCH 005/563] New buttons code changes --- pandora_console/include/functions_html.php | 130 +++++++++++++++++---- 1 file changed, 107 insertions(+), 23 deletions(-) diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index 80b1ed0717..f916bb917a 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -3322,36 +3322,70 @@ function html_print_input_color($name, $value, $id='', $class=false, $return=fal * @param string $label Input label. * @param string $name Input name. * @param boolean $disabled Whether to disable by default or not. Enabled by default. - * @param array $attributes Additional HTML attributes. + * @param mixed $attributes Additional HTML attributes. * @param boolean $return Whether to return an output string or echo now (optional, echo by default). * * @return string HTML code if return parameter is true. */ function html_print_submit_button($label='OK', $name='', $disabled=false, $attributes='', $return=false) { - if (!$name) { + if (empty($name) === true) { $name = 'unnamed'; } - if (is_array($attributes)) { + // Icon for show in button. + $iconToUse = ''; + if (is_array($attributes) === true) { $attr_array = $attributes; $attributes = ''; foreach ($attr_array as $attribute => $value) { - $attributes .= $attribute.'="'.$value.'" '; + if ($attribute === 'icon') { + $iconToUse = $value; + } else if ($attribute === 'secondary') { + $secondary = true; + } else { + $attributes .= $attribute.'="'.$value.'" '; + } } + } else if (empty($attributes) === false && is_string($attributes) === true) { + $tmpData = explode(' ', $attributes); + $iconToUse = $tmpData[(array_search('sub', $tmpData) + 1)]; + $iconToUse = preg_replace('([^A-Za-z])', '', $iconToUse); } - $output = ' '', + 'class' => sprintf( + 'subIcon %s%s', + $iconToUse, + $secondary + ), + ], + true + ); + } else { + $iconDiv = ''; } - $output .= ' />'; - if (!$return) { + $output = sprintf( + '', + $secondary, + ($disabled === true) ? ' disabled' : '', + $label, + $iconDiv + ); + + if ($return === false) { echo $output; + } else { + return $output; } - - return $output; } @@ -3364,7 +3398,7 @@ function html_print_submit_button($label='OK', $name='', $disabled=false, $attri * @param string $name Input name. * @param boolean $disabled Whether to disable by default or not. Enabled by default. * @param string $script JavaScript to attach - * @param string $attributes Additional HTML attributes. + * @param mixed $attributes Additional HTML attributes. * @param boolean $return Whether to return an output string or echo now (optional, echo by default). * @param boolean $imageButton Set the button as a image button without text, by default is false. * @@ -3374,30 +3408,80 @@ function html_print_button($label='OK', $name='', $disabled=false, $script='', $ { $output = ''; - $alt = $title = ''; - if ($imageButton) { - $alt = $title = $label; - $label = ''; + if (empty($name) === true) { + $name = 'unnamed'; } - $output .= ' $value) { + if ($attribute === 'icon') { + $iconToUse = $value; + } else if ($attribute === 'secondary') { + $secondary = true; + } else { + $attributes .= $attribute.'="'.$value.'" '; + } + } + } else if (empty($attributes) === false && is_string($attributes) === true) { + $tmpData = explode(' ', $attributes); + $iconToUse = $tmpData[(array_search('sub', $tmpData) + 1)]; + $iconToUse = preg_replace('([^A-Za-z])', '', $iconToUse); } - $output .= ' />'; + // $secondary = true; + // Transform secondary boolean to string. + $secondary = ($secondary === true) ? ' secondary' : ''; - if ($modal && !enterprise_installed()) { + if (empty($iconToUse) === false) { + $iconDiv = html_print_div( + [ + 'style' => '', + 'class' => sprintf( + 'subIcon %s%s', + $iconToUse, + $secondary + ), + ], + true + ); + } else { + $iconDiv = ''; + } + + if ($imageButton === false) { + $content = $label; + $content .= $iconDiv; + } else { + $content = $iconDiv; + } + + $output = sprintf( + '', + $secondary, + (empty($name) === false) ? ' name="'.$name.'"' : '', + (empty($name) === false) ? ' id="button-'.$name.'"' : '', + (empty($label) === false) ? ' value="'.$label.'"' : '', + ($disabled === true) ? ' disabled' : '', + (empty($script) === false) ? ' onClick="'.$script.'"' : '', + $content + ); + + if ($modal !== false && enterprise_installed() === false) { $output .= "

    "; } - if ($return) { + if ($return === true) { return $output; + } else { + echo $output; } - echo $output; } From 83de025bc94fe52d13726167d3dee3e2554f2d33 Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Fri, 21 Oct 2022 13:47:41 +0200 Subject: [PATCH 006/563] Several adaptations --- pandora_console/extensions/module_groups.php | 10 +++++++++- .../godmode/agentes/modificar_agente.php | 17 ++++++++++++++--- .../godmode/agentes/module_manager.php | 10 +++++++++- .../operation/agentes/estado_agente.php | 7 +++++-- 4 files changed, 37 insertions(+), 7 deletions(-) diff --git a/pandora_console/extensions/module_groups.php b/pandora_console/extensions/module_groups.php index a04e6a08dc..4dfe0e6b6d 100644 --- a/pandora_console/extensions/module_groups.php +++ b/pandora_console/extensions/module_groups.php @@ -280,7 +280,15 @@ function mainModuleGroups() html_print_input_text('module_group_search', $module_group_search); echo ''; - echo ""; + html_print_submit_button( + __('Search'), + 'srcbutton', + false, + [ + 'icon' => 'search', + 'secondary' => true, + ] + ); echo ''; echo ''; echo ''; diff --git a/pandora_console/godmode/agentes/modificar_agente.php b/pandora_console/godmode/agentes/modificar_agente.php index 3b714c277b..abaef3eaaa 100644 --- a/pandora_console/godmode/agentes/modificar_agente.php +++ b/pandora_console/godmode/agentes/modificar_agente.php @@ -369,7 +369,15 @@ echo ui_print_help_tip( ); echo ''; -echo ""; +html_print_submit_button( + __('Search'), + 'srcbutton', + false, + [ + 'icon' => 'search', + 'secondary' => true, + ] +); echo ''; echo ''; echo ''; @@ -945,7 +953,7 @@ if ($agents !== false) { ui_print_info_message(['no_close' => true, 'message' => __('There are no defined agents') ]); } -if (check_acl($config['id_user'], 0, 'AW')) { +if ((bool) check_acl($config['id_user'], 0, 'AW') === true) { // Create agent button. echo '
    '; echo '
    '; @@ -953,7 +961,10 @@ if (check_acl($config['id_user'], 0, 'AW')) { __('Create agent'), 'crt-2', false, - 'class="sub next"' + [ + 'icon' => 'search', + 'secondary' => true, + ] ); echo '
    '; echo '
    '; diff --git a/pandora_console/godmode/agentes/module_manager.php b/pandora_console/godmode/agentes/module_manager.php index 6cfa2685b4..20ecf6145a 100644 --- a/pandora_console/godmode/agentes/module_manager.php +++ b/pandora_console/godmode/agentes/module_manager.php @@ -226,7 +226,15 @@ if (($policy_page) || (isset($agent))) { html_print_input_hidden('edit_module', 1); echo ''; echo ''; - echo ''; + html_print_submit_button( + __('Create'), + 'updbutton', + false, + [ + 'icon' => 'next', + 'secondary' => true, + ] + ); echo ''; echo ''; echo ''; diff --git a/pandora_console/operation/agentes/estado_agente.php b/pandora_console/operation/agentes/estado_agente.php index 0210545a26..4b634f5f53 100644 --- a/pandora_console/operation/agentes/estado_agente.php +++ b/pandora_console/operation/agentes/estado_agente.php @@ -290,8 +290,11 @@ echo ''; html_print_submit_button( __('Search'), 'srcbutton', - '', - ['class' => 'sub search'] + false, + [ + 'icon' => 'search', + 'secondary' => true, + ] ); echo ''; From 95eecb1b7e89abb4c7f3273b357eb579a2a2614e Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Mon, 24 Oct 2022 09:41:57 +0200 Subject: [PATCH 007/563] Little changes --- pandora_console/include/styles/pandora.css | 186 +-------------------- 1 file changed, 4 insertions(+), 182 deletions(-) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index c19d13ea81..deb107d076 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -9047,16 +9047,16 @@ button.submitButton { justify-content: space-between; flex-direction: row; min-width: 110px; - height: 32px; - font-size: 16px !important; + height: 48px; + font-size: 14px !important; align-items: center; line-height: 24px; box-shadow: 0px 3px 6px #c7c7c7; background-color: #14524f; color: #fff; border: 1px solid #14524f; - border-radius: 5px; - padding-left: 0.5em; + border-radius: 50px; + padding: 0 10px 0 12px; cursor: pointer; } @@ -9072,7 +9072,6 @@ button.submitButton:active { border-color: #0d312f; } -/* Button */ button.inputButton > div, button.submitButton > div { background-color: #fff; @@ -9206,183 +9205,6 @@ button.ui-button.ui-widget.submit-cancel:active { color: #0d312f; } -/* clean the next */ -button.next, -input.next { - background-image: url(../../images/svg/arrow.svg); - background-position: 90% center; - background-repeat: no-repeat; - background-size: 24px; -} - -button.upd, -input.upd { - background-image: url(../../images/input_update.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.wand, -input.wand { - background-image: url(../../images/input_wand.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.wand:disabled, -input.wand:disabled { - background-image: url(../../images/input_wand.disabled.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.search, -input.search { - background-image: url(../../images/input_zoom.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.search:disabled, -input.search:disabled { - background-image: url(../../images/input_zoom.disabled.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.ok, -input.ok { - background-image: url(../../images/input_tick.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.ok:disabled, -input.ok:disabled { - background-image: url(../../images/input_tick.disabled.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.add, -input.add { - background-image: url(../../images/input_add.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.add:disabled, -input.add:disabled { - background-image: url(../../images/input_add.disabled.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.cancel, -input.cancel { - background-image: url(../../images/input_cross.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.cancel:disabled, -input.cancel:disabled { - background-image: url(../../images/input_cross.disabled.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.delete, -input.delete { - background-image: url(../../images/input_delete.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.delete:disabled, -input.delete:disabled { - background-image: url(../../images/input_delete.disabled.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.cog, -input.cog { - background-image: url(../../images/input_cog.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.cog:disabled, -input.cog:disabled { - background-image: url(../../images/input_cog.disabled.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.config, -input.config { - background-image: url(../../images/input_config.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.config:disabled, -input.config:disabled { - background-image: url(../../images/input_config.disabled.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.filter, -input.filter { - background-image: url(../../images/input_filter.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.filter:disabled, -input.filter:disabled { - background-image: url(../../images/input_filter.disabled.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.pdf, -input.pdf { - background-image: url(../../images/input_pdf.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.pdf:disabled, -input.pdf:disabled { - background-image: url(../../images/input_pdf.disabled.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.camera, -input.camera { - background-image: url(../../images/input_camera.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.spinn, -input.spinn { - background-image: url(../../images/spinner_green.gif); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.deploy, -input.deploy { - background-image: url(../../images/input_deploy.png); - background-position: 90% center; - background-repeat: no-repeat; -} - .password_input { background-color: transparent !important; border: none !important; From b2b9de121017139227b39406c21b63795b442705 Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Mon, 24 Oct 2022 12:05:51 +0200 Subject: [PATCH 008/563] Improved visual styles continuing guide line --- pandora_console/include/styles/pandora.css | 33 ++++++++++++++++------ 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index deb107d076..cda80757a5 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -1826,6 +1826,9 @@ table.rounded_cells td { display: flex; flex-direction: row-reverse; } +.action-buttons > button { + margin-left: 16px; +} .right { text-align: right; } @@ -9052,24 +9055,31 @@ button.submitButton { align-items: center; line-height: 24px; box-shadow: 0px 3px 6px #c7c7c7; - background-color: #14524f; color: #fff; border: 1px solid #14524f; border-radius: 50px; padding: 0 10px 0 12px; cursor: pointer; + background: linear-gradient( + 90deg, + #14524f 0%, + #14524f 49%, + #1d7873 50%, + #1d7873 100% + ); + background-size: 200% 1px; + transition: ease-in 0.3s; } button.inputButton:hover, button.submitButton:hover { - background-color: #1d7873; - border-color: #1d7873; + background-position: -100% 0; } button.inputButton:active, button.submitButton:active { - background-color: #0d312f; - border-color: #0d312f; + transition: ease-in 100ms; + border: 5px solid #57ea82; } button.inputButton > div, @@ -9135,6 +9145,7 @@ button div.search { } button div.wand, +button div.update, button div.upd { mask: url(../../images/svg/success.svg) no-repeat center / contain; -webkit-mask: url(../../images/svg/success.svg) no-repeat center / contain; @@ -9164,13 +9175,13 @@ button.ui-button-text-only.ui-widget.sub { justify-content: center; flex-direction: column; align-content: center; - min-width: 100px; + min-width: 180px; height: 32px; font-size: 16px !important; align-items: center; line-height: 24px; box-shadow: 0px 3px 6px #c7c7c7; - border-radius: 5px; + border-radius: 16px; cursor: pointer; padding: 0; } @@ -9198,11 +9209,15 @@ button.ui-button.ui-widget.submit-cancel { } button.ui-button.ui-widget.submit-cancel:hover { - color: #1d7873; + /*color: #1d7873;*/ + background-color: #e1e7ee; + border-color: #e1e7ee; } button.ui-button.ui-widget.submit-cancel:active { - color: #0d312f; + color: #fff; + background-color: #96a2bf; + border-color: #96a2bf; } .password_input { From d0fa29d2de13707c68787151535c239e9e34fac5 Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Mon, 24 Oct 2022 12:06:45 +0200 Subject: [PATCH 009/563] Adapted some buttons --- .../general/first_task/service_list.php | 7 ++++- .../general/first_task/transactional_list.php | 7 ++++- .../godmode/servers/modificar_server.php | 31 +++++++++++++------ 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/pandora_console/general/first_task/service_list.php b/pandora_console/general/first_task/service_list.php index f3b816c006..0ea4a01878 100755 --- a/pandora_console/general/first_task/service_list.php +++ b/pandora_console/general/first_task/service_list.php @@ -37,7 +37,12 @@ ui_require_css_file('first_task'); ?>

    - +
    diff --git a/pandora_console/general/first_task/transactional_list.php b/pandora_console/general/first_task/transactional_list.php index c1d9ef2f42..4fe3f52e7a 100644 --- a/pandora_console/general/first_task/transactional_list.php +++ b/pandora_console/general/first_task/transactional_list.php @@ -38,7 +38,12 @@ Transaction graphs represent the different processes within our infrastructure t ?>

    - +
    diff --git a/pandora_console/godmode/servers/modificar_server.php b/pandora_console/godmode/servers/modificar_server.php index 34524c6aa7..6aec7b7ba7 100644 --- a/pandora_console/godmode/servers/modificar_server.php +++ b/pandora_console/godmode/servers/modificar_server.php @@ -96,17 +96,30 @@ if (isset($_GET['server'])) { html_print_table($table); - echo '
    '; - echo ''; - echo '
    '; + html_print_div( + [ + 'class' => 'action-buttons w100p', + 'content' => html_print_submit_button( + __('Update'), + '', + false, + [ 'icon' => 'update' ], + true + ), + ] + ); + echo ''; - if ($row['server_type'] == 13) { - echo '
    '; - ui_toggle($content, __('Credential boxes'), '', 'toggle_credential', false); - echo '
    '; + if ((int) $row['server_type'] === 13) { + html_print_div( + [ + 'class' => 'mrgn_top_20px', + 'content' => ui_toggle($content, __('Credential boxes'), '', 'toggle_credential', false, true), + ], + ); } -} else if (isset($_GET['server_remote'])) { +} else if (isset($_GET['server_remote']) === true) { // Headers. $id_server = get_parameter_get('server_remote'); $ext = get_parameter('ext', ''); @@ -168,7 +181,7 @@ if (isset($_GET['server'])) { ui_print_page_header(__('%s servers', get_product_name()), 'images/gm_servers.png', false, '', true); // Move SNMP modules back to the enterprise server. - if (isset($_GET['server_reset_snmp_enterprise'])) { + if (isset($_GET['server_reset_snmp_enterprise']) === true) { $result = db_process_sql('UPDATE tagente_estado SET last_error=0'); if ($result === false) { From 828f12e6f39c2adaa45672199bc08a94f06ef72d Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Mon, 24 Oct 2022 12:34:03 +0200 Subject: [PATCH 010/563] Defined buttons --- pandora_console/include/styles/pandora.css | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index cda80757a5..0a67d0d04b 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -9051,7 +9051,8 @@ button.submitButton { flex-direction: row; min-width: 110px; height: 48px; - font-size: 14px !important; + font-size: 13px !important; + font-family: "Pandora-Light"; align-items: center; line-height: 24px; box-shadow: 0px 3px 6px #c7c7c7; @@ -9166,6 +9167,10 @@ button div.cancel { -webkit-mask: url(../../images/svg/left.svg) no-repeat center / contain; } +button div.cog { + mask: url(../../images/svg/cog.svg) no-repeat center / contain; + -webkit-mask: url(../../images/svg/cog.svg) no-repeat center / contain; +} .ui-dialog-buttonset { display: flex; } From dca36cbe0b12e9a403b60fcb884236d6fe5c4dea Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Mon, 24 Oct 2022 13:12:11 +0200 Subject: [PATCH 011/563] Improve CSS --- pandora_console/include/styles/pandora.css | 2 +- pandora_console/include/styles/wizard.css | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 0a67d0d04b..c9e9548a24 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -9068,7 +9068,7 @@ button.submitButton { #1d7873 50%, #1d7873 100% ); - background-size: 200% 1px; + background-size: 202% 1px; transition: ease-in 0.3s; } diff --git a/pandora_console/include/styles/wizard.css b/pandora_console/include/styles/wizard.css index 4f55f19e3e..9d01aa42aa 100644 --- a/pandora_console/include/styles/wizard.css +++ b/pandora_console/include/styles/wizard.css @@ -155,9 +155,18 @@ ul.wizard li > textarea { } .action_button_list { + display: flex; + align-content: center; + justify-content: flex-end; height: 60px; } +.action_button_list ul { + display: flex; + flex-direction: row-reverse; + justify-content: flex-start; + align-items: center; +} .action_button_list li { display: inline; } From 4cf92cc995da5fb9781ff355929da9fb744f2f95 Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Mon, 24 Oct 2022 13:13:56 +0200 Subject: [PATCH 012/563] Adapted views --- pandora_console/godmode/setup/links.php | 34 ++++++++++++++++--- .../operation/agentes/pandora_networkmap.php | 26 +++++++++----- 2 files changed, 47 insertions(+), 13 deletions(-) diff --git a/pandora_console/godmode/setup/links.php b/pandora_console/godmode/setup/links.php index 7135936d34..adb23600d5 100644 --- a/pandora_console/godmode/setup/links.php +++ b/pandora_console/godmode/setup/links.php @@ -123,12 +123,26 @@ if ((isset($_GET['form_add'])) or (isset($_GET['form_edit']))) { echo ''; echo ""; echo "
    "; - if (isset($_GET['form_add'])) { - echo ""; + if (isset($_GET['form_add']) === true) { + $actionForPerform = __('Create'); + $iconForPerform = 'wand'; } else { - echo ""; + $actionForPerform = __('Update'); + $iconForPerform = 'update'; } + html_print_div( + [ + 'class' => 'action-buttons', + 'content' => html_print_submit_button( + $actionForPerform, + 'crtbutton', + false, + [ 'icon' => $iconForPerform ] + ), + ], + ); + echo '
    '; } else { // Main list view for Links editor @@ -170,6 +184,18 @@ if ((isset($_GET['form_add'])) or (isset($_GET['form_edit']))) { echo ""; echo "
    "; echo "
    "; - echo ""; + + html_print_div( + [ + 'class' => 'action-buttons', + 'content' => html_print_submit_button( + __('Add'), + 'form_add', + false, + [ 'icon' => 'wand' ] + ), + ], + ); + echo '
    '; } diff --git a/pandora_console/operation/agentes/pandora_networkmap.php b/pandora_console/operation/agentes/pandora_networkmap.php index 9c57ad033f..5a03df54a4 100644 --- a/pandora_console/operation/agentes/pandora_networkmap.php +++ b/pandora_console/operation/agentes/pandora_networkmap.php @@ -14,7 +14,7 @@ * |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______| * * ============================================================================ - * Copyright (c) 2005-2021 Artica Soluciones Tecnologicas + * Copyright (c) 2005-2022 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 @@ -822,19 +822,27 @@ switch ($tab) { } if ($networkmaps_write || $networkmaps_manage) { - echo "
    "; - echo '
    '; + echo ''; html_print_input_hidden('new_networkmap', 1); - html_print_submit_button(__('Create network map'), 'crt', false, 'class="sub next float-right"'); echo '
    '; - echo '
    '; - echo "
    "; - echo '
    '; + echo ''; html_print_input_hidden('new_empty_networkmap', 1); - html_print_submit_button(__('Create empty network map'), 'crt', false, 'class="sub next float-right mrgn_right_20px"'); echo '
    '; - echo '
    '; + + html_print_div( + [ + 'class' => 'action-buttons', + 'content' => html_print_submit_button(__('Create network map'), 'crt', false, [ 'icon' => 'next', 'form' => 'new_networkmap' ], true).html_print_submit_button(__('Create empty network map'), 'crt', false, [ 'icon' => 'next', 'form' => 'empty_networkmap' ], true), + ], + false + ); + /* + echo "
    "; + html_print_submit_button(__('Create network map'), 'crt', false, 'class="sub next"'); + html_print_submit_button(__('Create empty network map'), 'crt', false, 'class="sub next"'); + echo '
    '; + */ } break; } From 9cc811a436be4726da9eb70e535b5f979bd05336 Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Mon, 24 Oct 2022 13:14:19 +0200 Subject: [PATCH 013/563] Improve code for buttons --- pandora_console/include/functions_html.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index f916bb917a..4b10ba8917 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -3335,16 +3335,15 @@ function html_print_submit_button($label='OK', $name='', $disabled=false, $attri // Icon for show in button. $iconToUse = ''; + $attributesOutput = ''; if (is_array($attributes) === true) { - $attr_array = $attributes; - $attributes = ''; - foreach ($attr_array as $attribute => $value) { + foreach ($attributes as $attribute => $value) { if ($attribute === 'icon') { $iconToUse = $value; } else if ($attribute === 'secondary') { $secondary = true; } else { - $attributes .= $attribute.'="'.$value.'" '; + $attributesOutput .= $attribute.'="'.$value.'" '; } } } else if (empty($attributes) === false && is_string($attributes) === true) { @@ -3374,9 +3373,10 @@ function html_print_submit_button($label='OK', $name='', $disabled=false, $attri } $output = sprintf( - '', + '', $secondary, ($disabled === true) ? ' disabled' : '', + $attributesOutput, $label, $iconDiv ); @@ -3460,7 +3460,7 @@ function html_print_button($label='OK', $name='', $disabled=false, $script='', $ } $output = sprintf( - '', + '', $secondary, (empty($name) === false) ? ' name="'.$name.'"' : '', (empty($name) === false) ? ' id="button-'.$name.'"' : '', From 300a07c3b2c8a6d4bfa927e03f610a3acdcd7f9c Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Mon, 24 Oct 2022 14:54:15 +0200 Subject: [PATCH 014/563] Improve buttons --- pandora_console/include/styles/pandora.css | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index c9e9548a24..e47d1f3afd 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -9057,10 +9057,14 @@ button.submitButton { line-height: 24px; box-shadow: 0px 3px 6px #c7c7c7; color: #fff; - border: 1px solid #14524f; + border: 2px solid #14524f; border-radius: 50px; padding: 0 10px 0 12px; cursor: pointer; +} + +button.inputButton:not(.secondary), +button.submitButton:not(.secondary) { background: linear-gradient( 90deg, #14524f 0%, @@ -9075,13 +9079,19 @@ button.submitButton { button.inputButton:hover, button.submitButton:hover { background-position: -100% 0; + /*border: 5px solid #1d7873;*/ } button.inputButton:active, button.submitButton:active { transition: ease-in 100ms; - border: 5px solid #57ea82; + border: 2px solid #57ea82; } +/*button.inputButton:active, +button.submitButton:active { + transition: ease-in 100ms; + background-color: #0d312f; +}*/ button.inputButton > div, button.submitButton > div { From 3634aab8077d840691d817ff1f925240b2ea7268 Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Mon, 24 Oct 2022 19:54:15 +0200 Subject: [PATCH 015/563] Code improvement --- pandora_console/include/functions_html.php | 85 ++++++++-------------- pandora_console/include/styles/pandora.css | 67 ++++++++++++----- 2 files changed, 77 insertions(+), 75 deletions(-) diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index 4b10ba8917..4d3ae6abc5 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -3329,56 +3329,19 @@ function html_print_input_color($name, $value, $id='', $class=false, $return=fal */ function html_print_submit_button($label='OK', $name='', $disabled=false, $attributes='', $return=false) { - if (empty($name) === true) { - $name = 'unnamed'; + if (is_string($attributes) === true) { + $attributes = []; } - // Icon for show in button. - $iconToUse = ''; - $attributesOutput = ''; - if (is_array($attributes) === true) { - foreach ($attributes as $attribute => $value) { - if ($attribute === 'icon') { - $iconToUse = $value; - } else if ($attribute === 'secondary') { - $secondary = true; - } else { - $attributesOutput .= $attribute.'="'.$value.'" '; - } - } - } else if (empty($attributes) === false && is_string($attributes) === true) { - $tmpData = explode(' ', $attributes); - $iconToUse = $tmpData[(array_search('sub', $tmpData) + 1)]; - $iconToUse = preg_replace('([^A-Za-z])', '', $iconToUse); - } + $attributes['type'] = 'submit'; - // $secondary = true; - // Transform secondary boolean to string. - $secondary = ($secondary === true) ? ' secondary' : ''; - - if (empty($iconToUse) === false) { - $iconDiv = html_print_div( - [ - 'style' => '', - 'class' => sprintf( - 'subIcon %s%s', - $iconToUse, - $secondary - ), - ], - true - ); - } else { - $iconDiv = ''; - } - - $output = sprintf( - '', - $secondary, - ($disabled === true) ? ' disabled' : '', - $attributesOutput, + $output = html_print_button( $label, - $iconDiv + $name, + $disabled, + '', + $attributes, + true ); if ($return === false) { @@ -3407,6 +3370,7 @@ function html_print_submit_button($label='OK', $name='', $disabled=false, $attri function html_print_button($label='OK', $name='', $disabled=false, $script='', $attributes='', $return=false, $imageButton=false, $modal=false, $message='') { $output = ''; + $classes = ''; if (empty($name) === true) { $name = 'unnamed'; @@ -3420,8 +3384,14 @@ function html_print_button($label='OK', $name='', $disabled=false, $script='', $ foreach ($attr_array as $attribute => $value) { if ($attribute === 'icon') { $iconToUse = $value; - } else if ($attribute === 'secondary') { - $secondary = true; + } else if ($attribute === 'mode') { + $buttonMode = $value; + $classes .= ' '.$value; + } else if ($attribute === 'type') { + $buttonType = $value; + $classes .= ' '.$value.'Button'; + } else if ($attribute === 'class') { + $classes .= ' '.$value; } else { $attributes .= $attribute.'="'.$value.'" '; } @@ -3432,18 +3402,14 @@ function html_print_button($label='OK', $name='', $disabled=false, $script='', $ $iconToUse = preg_replace('([^A-Za-z])', '', $iconToUse); } - // $secondary = true; - // Transform secondary boolean to string. - $secondary = ($secondary === true) ? ' secondary' : ''; - if (empty($iconToUse) === false) { $iconDiv = html_print_div( [ 'style' => '', 'class' => sprintf( - 'subIcon %s%s', + 'subIcon %s %s', $iconToUse, - $secondary + (isset($buttonMode) === true) ? $buttonMode : '' ), ], true @@ -3459,9 +3425,16 @@ function html_print_button($label='OK', $name='', $disabled=false, $script='', $ $content = $iconDiv; } + // In case of not selected button type, in this case, will be normal button. + if (isset($buttonType) === false || ($buttonType !== 'button' && $buttonType !== 'submit')) { + $buttonType = 'button'; + $classes .= ' buttonButton'; + } + $output = sprintf( - '', - $secondary, + '', + $buttonType, + $classes, (empty($name) === false) ? ' name="'.$name.'"' : '', (empty($name) === false) ? ' id="button-'.$name.'"' : '', (empty($label) === false) ? ' value="'.$label.'"' : '', diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index e47d1f3afd..fee3efcb72 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -9044,7 +9044,7 @@ input[type="submit"].secondary:active { color: #0d312f; } -button.inputButton, +button.buttonButton, button.submitButton { display: flex; justify-content: space-between; @@ -9063,8 +9063,43 @@ button.submitButton { cursor: pointer; } -button.inputButton:not(.secondary), -button.submitButton:not(.secondary) { +button.buttonButton.mini, +button.submitButton.mini { + height: 32px; +} + +button.buttonButton.link, +button.submitButton.link { + height: 32px; + text-decoration: underline; + box-shadow: none; + background: rgba(0, 0, 0, 0) !important; + border-color: rgba(0, 0, 0, 0) !important; + color: #14524f; +} + +button.buttonButton.link > div, +button.submitButton.link > div { + color: #14524f; +} + +button.buttonButton.link:hover, +button.submitButton.link:hover, +button.buttonButton.link > div:hover, +button.submitButton.link > div:hover { + background-color: #e1e7ee; +} + +button.buttonButton.link:hover, +button.submitButton.link:hover, +button.buttonButton.link > div:hover, +button.submitButton.link > div:hover { + color: #fff; + background-color: #96a2bf; +} + +button.buttonButton:not(.secondary):not(.link), +button.submitButton:not(.secondary):not(.link) { background: linear-gradient( 90deg, #14524f 0%, @@ -9076,24 +9111,18 @@ button.submitButton:not(.secondary) { transition: ease-in 0.3s; } -button.inputButton:hover, +button.buttonButton:hover, button.submitButton:hover { - background-position: -100% 0; - /*border: 5px solid #1d7873;*/ + background-position: -100% 0 !important; } -button.inputButton:active, +button.buttonButton:active, button.submitButton:active { transition: ease-in 100ms; border: 2px solid #57ea82; } -/*button.inputButton:active, -button.submitButton:active { - transition: ease-in 100ms; - background-color: #0d312f; -}*/ -button.inputButton > div, +button.buttonButton > div, button.submitButton > div { background-color: #fff; width: 2rem; @@ -9101,36 +9130,36 @@ button.submitButton > div { margin-left: 1rem; } -button.inputButton.secondary, +button.buttonButton.secondary, button.submitButton.secondary { background-color: #fff; color: #14524f; border: 2px solid #14524f; } -button.inputButton.secondary > div, +button.buttonButton.secondary > div, button.submitButton.secondary > div { background-color: #14524f !important; } -button.inputButton.secondary:hover, +button.buttonButton.secondary:hover, button.submitButton.secondary:hover { color: #1d7873 !important; border-color: #1d7873 !important; } -button.inputButton.secondary:hover > div, +button.buttonButton.secondary:hover > div, button.submitButton.secondary:hover > div { background-color: #1d7873 !important; } -button.inputButton.secondary:active, +button.buttonButton.secondary:active, button.submitButton.secondary:active { color: #0d312f !important; border-color: #0d312f !important; } -button.inputButton.secondary:active > div, +button.buttonButton.secondary:active > div, button.submitButton.secondary:active > div { background-color: #0d312f !important; } From 00de0faac3a5181694f4749f092e0b99fe24aa11 Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Mon, 24 Oct 2022 19:55:22 +0200 Subject: [PATCH 016/563] Adapted views --- pandora_console/extensions/module_groups.php | 4 +- .../godmode/agentes/agent_manager.php | 26 +++++++---- .../godmode/agentes/modificar_agente.php | 24 +++++----- .../godmode/agentes/module_manager.php | 4 +- .../godmode/events/event_edit_filter.php | 4 +- pandora_console/include/ajax/events.php | 44 +++++++++++-------- .../include/class/ModuleTemplates.class.php | 12 ++--- .../operation/agentes/estado_agente.php | 4 +- 8 files changed, 71 insertions(+), 51 deletions(-) diff --git a/pandora_console/extensions/module_groups.php b/pandora_console/extensions/module_groups.php index 4dfe0e6b6d..d8b432da08 100644 --- a/pandora_console/extensions/module_groups.php +++ b/pandora_console/extensions/module_groups.php @@ -285,8 +285,8 @@ function mainModuleGroups() 'srcbutton', false, [ - 'icon' => 'search', - 'secondary' => true, + 'icon' => 'search', + 'mode' => 'secondary', ] ); echo ''; diff --git a/pandora_console/godmode/agentes/agent_manager.php b/pandora_console/godmode/agentes/agent_manager.php index 676a4db993..f5a8154908 100644 --- a/pandora_console/godmode/agentes/agent_manager.php +++ b/pandora_console/godmode/agentes/agent_manager.php @@ -967,26 +967,34 @@ echo ''; if ($id_agente) { - echo '
    '; - html_print_submit_button( + $submitButton = html_print_submit_button( __('Update'), 'updbutton', false, - 'class="sub upd"' + [ 'icon' => 'update'], + true ); - html_print_input_hidden('update_agent', 1); - html_print_input_hidden('id_agente', $id_agente); + $submitButton .= html_print_input_hidden('update_agent', 1); + $submitButton .= html_print_input_hidden('id_agente', $id_agente); } else { - html_print_submit_button( + $submitButton = html_print_submit_button( __('Create'), 'crtbutton', false, - 'class="sub wand"' + [ 'icon' => 'wand'], + true ); - html_print_input_hidden('create_agent', 1); + $submitButton .= html_print_input_hidden('create_agent', 1); } -echo '
    '; +html_print_div( + [ + 'class' => 'action-buttons', + 'content' => $submitButton, + ] +); + +echo ''; ui_require_jquery_file('pandora.controls'); ui_require_jquery_file('ajaxqueue'); diff --git a/pandora_console/godmode/agentes/modificar_agente.php b/pandora_console/godmode/agentes/modificar_agente.php index abaef3eaaa..b91b1556bc 100644 --- a/pandora_console/godmode/agentes/modificar_agente.php +++ b/pandora_console/godmode/agentes/modificar_agente.php @@ -374,8 +374,8 @@ html_print_submit_button( 'srcbutton', false, [ - 'icon' => 'search', - 'secondary' => true, + 'icon' => 'search', + 'mode' => 'mini', ] ); echo ''; @@ -955,19 +955,23 @@ if ($agents !== false) { if ((bool) check_acl($config['id_user'], 0, 'AW') === true) { // Create agent button. - echo '
    '; echo '
    '; - html_print_submit_button( - __('Create agent'), - 'crt-2', - false, + html_print_div( [ - 'icon' => 'search', - 'secondary' => true, + 'class' => 'action-buttons', + 'content' => html_print_submit_button( + __('Create agent'), + 'crt-2', + false, + [ + 'icon' => 'cog', + 'mode' => 'secondary', + ], + true + ), ] ); echo '
    '; - echo '
    '; } echo ''; diff --git a/pandora_console/godmode/agentes/module_manager.php b/pandora_console/godmode/agentes/module_manager.php index 20ecf6145a..35f50687db 100644 --- a/pandora_console/godmode/agentes/module_manager.php +++ b/pandora_console/godmode/agentes/module_manager.php @@ -231,8 +231,8 @@ if (($policy_page) || (isset($agent))) { 'updbutton', false, [ - 'icon' => 'next', - 'secondary' => true, + 'icon' => 'next', + 'mode' => 'secondary', ] ); echo ''; diff --git a/pandora_console/godmode/events/event_edit_filter.php b/pandora_console/godmode/events/event_edit_filter.php index 91045ce0ea..8badf3d1e2 100644 --- a/pandora_console/godmode/events/event_edit_filter.php +++ b/pandora_console/godmode/events/event_edit_filter.php @@ -675,10 +675,10 @@ echo '
    '; if ($id) { html_print_input_hidden('update', 1); html_print_input_hidden('id', $id); - html_print_submit_button(__('Update'), 'crt', false, 'class="sub upd"'); + html_print_submit_button(__('Update'), 'crt', false, ['icon' => 'update']); } else { html_print_input_hidden('create', 1); - html_print_submit_button(__('Create'), 'crt', false, 'class="sub wand"'); + html_print_submit_button(__('Create'), 'crt', false, ['icon' => 'wand']); } echo '
    '; diff --git a/pandora_console/include/ajax/events.php b/pandora_console/include/ajax/events.php index 0d0b77ffd4..3b19e13a52 100644 --- a/pandora_console/include/ajax/events.php +++ b/pandora_console/include/ajax/events.php @@ -553,16 +553,13 @@ if ($load_filter_modal) { $table->width = '100%'; $table->cellspacing = 4; $table->cellpadding = 4; + $table->styleTable = 'font-weight: bold; color: #555; text-align:left;'; $table->class = 'databox'; - if (is_metaconsole()) { + $filter_id_width = '200px'; + if (is_metaconsole() === true) { $table->cellspacing = 0; $table->cellpadding = 0; $table->class = 'databox filters'; - } - - $table->styleTable = 'font-weight: bold; color: #555; text-align:left;'; - $filter_id_width = '200px'; - if (is_metaconsole()) { $filter_id_width = '150px'; } @@ -587,7 +584,10 @@ if ($load_filter_modal) { __('Load filter'), 'load_filter', false, - 'class="sub upd"', + [ + 'icon' => 'update', + 'mode' => 'secondary', + ], true ); $data[1] .= html_print_input_hidden('load_filter', 1, true); @@ -726,14 +726,14 @@ if ($save_filter_modal) { $table->cellspacing = 4; $table->cellpadding = 4; $table->class = 'databox'; - if (is_metaconsole()) { + if (is_metaconsole() === true) { $table->class = 'databox filters'; $table->cellspacing = 0; $table->cellpadding = 0; } $table->styleTable = 'font-weight: bold; text-align:left;'; - if (!is_metaconsole()) { + if (is_metaconsole() === false) { $table->style[0] = 'width: 50%; width:50%;'; } @@ -824,15 +824,23 @@ if ($save_filter_modal) { $table->rowclass[] = ''; html_print_table($table); - echo '
    '; - echo html_print_submit_button( - __('Save filter'), - 'save_filter', - false, - 'class="sub upd float-right" onclick="save_new_filter();"', - true - ); - echo '
    '; + + html_print_div( + [ + 'class' => 'action-buttons', + 'content' => html_print_submit_button( + __('Save filter'), + 'save_filter', + false, + [ + 'icon' => 'update', + 'mode' => 'secondary', + 'onClick' => 'save_new_filter();', + ], + true + ), + ] + ); } else { include 'general/noaccess.php'; } diff --git a/pandora_console/include/class/ModuleTemplates.class.php b/pandora_console/include/class/ModuleTemplates.class.php index ba67142560..f478549269 100644 --- a/pandora_console/include/class/ModuleTemplates.class.php +++ b/pandora_console/include/class/ModuleTemplates.class.php @@ -998,16 +998,16 @@ class ModuleTemplates extends HTML { global $config; - $createNewTemplate = ($this->id_np == 0) ? true : false; + $createNewTemplate = ((int) $this->id_np === 0); - if ($createNewTemplate) { + if ($createNewTemplate === true) { // Assignation for submit button. - $formButtonClass = 'sub wand'; + $formButtonClass = 'wand'; $formAction = 'create'; $formButtonLabel = __('Create'); } else { // Assignation for submit button. - $formButtonClass = 'sub upd'; + $formButtonClass = 'update'; $formAction = 'update'; $formButtonLabel = __('Update'); } @@ -1099,7 +1099,7 @@ class ModuleTemplates extends HTML 'name' => 'action_button', 'label' => $formButtonLabel, 'type' => 'submit', - 'attributes' => 'class="float-right '.$formButtonClass.'"', + 'attributes' => [ 'icon' => $formButtonClass ], 'return' => true, ], ]; @@ -1110,7 +1110,7 @@ class ModuleTemplates extends HTML 'name' => 'add_components_button', 'label' => __('Add components'), 'type' => 'button', - 'attributes' => 'class="float-right sub cog"', + 'attributes' => [ 'icon' => 'cog' ], 'script' => 'showAddComponent();', 'return' => true, ], diff --git a/pandora_console/operation/agentes/estado_agente.php b/pandora_console/operation/agentes/estado_agente.php index 4b634f5f53..0dd5469f33 100644 --- a/pandora_console/operation/agentes/estado_agente.php +++ b/pandora_console/operation/agentes/estado_agente.php @@ -292,8 +292,8 @@ html_print_submit_button( 'srcbutton', false, [ - 'icon' => 'search', - 'secondary' => true, + 'icon' => 'search', + 'mode' => 'secondary', ] ); From 15f2a6ae8851ecc253f618296867299ebecbad84 Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Tue, 25 Oct 2022 09:08:34 +0200 Subject: [PATCH 017/563] Testing with links --- .../godmode/setup/setup_visuals.php | 29 ++++++++++++++++--- pandora_console/include/styles/pandora.css | 10 ++++--- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/pandora_console/godmode/setup/setup_visuals.php b/pandora_console/godmode/setup/setup_visuals.php index 897d5ddea0..af64e0055a 100755 --- a/pandora_console/godmode/setup/setup_visuals.php +++ b/pandora_console/godmode/setup/setup_visuals.php @@ -160,7 +160,18 @@ $table_styles->data[$row][1] = html_print_select( '', true ); -$table_styles->data[$row][1] .= ' '.html_print_button(__('View'), 'status_set_preview', false, '', 'class="sub camera logo_preview"', true); +$table_styles->data[$row][1] .= html_print_button( + __('View'), + 'status_set_preview', + false, + '', + [ + 'icon' => 'camera', + 'mode' => 'link', + 'class' => 'logo_preview', + ], + true +); $row++; // Divs to show icon status Colours (Default). @@ -1579,9 +1590,19 @@ echo ''.__('Other configuration').' '.ui_print_help_icon('other_conf_tab html_print_table($table_other); echo ''; -echo '
    '; -html_print_submit_button(__('Update'), 'update_button', false, 'class="sub upd"'); -echo '
    '; +html_print_div( + [ + 'class' => 'action-buttons w100p', + 'content' => html_print_submit_button( + __('Update'), + 'update_button', + false, + [ 'icon' => 'next' ], + true + ), + ] +); + echo ''; diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index fee3efcb72..aa1d4c754f 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -9071,7 +9071,6 @@ button.submitButton.mini { button.buttonButton.link, button.submitButton.link { height: 32px; - text-decoration: underline; box-shadow: none; background: rgba(0, 0, 0, 0) !important; border-color: rgba(0, 0, 0, 0) !important; @@ -9091,11 +9090,14 @@ button.submitButton.link > div:hover { } button.buttonButton.link:hover, -button.submitButton.link:hover, +button.submitButton.link:hover { + color: #1d7873; + text-decoration: underline; + font-family: "Pandora-Bold"; +} button.buttonButton.link > div:hover, button.submitButton.link > div:hover { - color: #fff; - background-color: #96a2bf; + background-color: #1d7873; } button.buttonButton:not(.secondary):not(.link), From 70d0e38382e55da66908a1327f2a4b16b8664d07 Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Tue, 25 Oct 2022 11:46:28 +0200 Subject: [PATCH 018/563] Adapt views --- .../godmode/setup/setup_visuals.php | 262 +++++++++++++++--- .../godmode/users/configure_user.php | 10 +- pandora_console/include/functions_events.php | 40 ++- pandora_console/include/functions_ui.php | 40 ++- .../operation/network/network_report.php | 2 +- 5 files changed, 297 insertions(+), 57 deletions(-) diff --git a/pandora_console/godmode/setup/setup_visuals.php b/pandora_console/godmode/setup/setup_visuals.php index af64e0055a..3e0e5cc817 100755 --- a/pandora_console/godmode/setup/setup_visuals.php +++ b/pandora_console/godmode/setup/setup_visuals.php @@ -130,6 +130,7 @@ $table_styles = new stdClass(); $table_styles->width = '100%'; $table_styles->class = 'databox filters'; $table_styles->style[0] = 'font-weight: bold;'; +$table_styles->style[1] = 'display: flex; align-items: center;'; $table_styles->size[0] = '50%'; $table_styles->data = []; @@ -146,7 +147,6 @@ $table_styles->data[$row][1] = html_print_select( ); $row++; - $table_styles->data[$row][0] = __('Status icon set'); $iconsets['default'] = __('Colors'); $iconsets['faces'] = __('Faces'); @@ -236,7 +236,18 @@ $table_styles->data[$row][1] = html_print_select( false, 'width:240px' ); -$table_styles->data[$row][1] .= ' '.html_print_button(__('View'), 'login_background_preview', false, '', 'class="sub camera logo_preview"', true); +$table_styles->data[$row][1] .= html_print_button( + __('View'), + 'login_background_preview', + false, + '', + [ + 'icon' => 'camera', + 'mode' => 'link', + 'class' => 'logo_preview', + ], + true +); $row++; @@ -290,16 +301,44 @@ function logo_custom_enterprise($name, $logo) $table_styles->data[$row][0] = __('Custom logo (menu)'); $table_styles->data[$row][1] = logo_custom_enterprise('custom_logo', $config['custom_logo']); -$table_styles->data[$row][1] .= ' '.html_print_button(__('View'), 'custom_logo_preview', $open, '', 'class="sub camera logo_preview"', true, false, $open, 'visualmodal'); +$table_styles->data[$row][1] .= ' '.html_print_button( + __('View'), + 'custom_logo_preview', + $open, + '', + [ + 'icon' => 'camera', + 'mode' => 'link', + 'class' => 'logo_preview', + ], + true, + false, + $open, + 'visualmodal' +); $row++; $table_styles->data[$row][0] = __('Custom logo collapsed (menu)'); $table_styles->data[$row][1] = logo_custom_enterprise('custom_logo_collapsed', $config['custom_logo_collapsed']); -$table_styles->data[$row][1] .= ' '.html_print_button(__('View'), 'custom_logo_collapsed_preview', $open, '', 'class="sub camera logo_preview"', true, false, $open, 'visualmodal'); +$table_styles->data[$row][1] .= ' '.html_print_button( + __('View'), + 'custom_logo_collapsed_preview', + $open, + '', + [ + 'icon' => 'camera', + 'mode' => 'link', + 'class' => 'logo_preview', + ], + true, + false, + $open, + 'visualmodal' +); $row++; $table_styles->data[$row][0] = __('Custom logo (header white background)'); -if (enterprise_installed()) { +if (enterprise_installed() === true) { $ent_files = list_files('enterprise/images/custom_logo', 'png', 1, 0); $open_files = list_files('images/custom_logo', 'png', 1, 0); @@ -334,7 +373,21 @@ if (enterprise_installed()) { ); } -$table_styles->data[$row][1] .= ' '.html_print_button(__('View'), 'custom_logo_white_bg_preview', $open, '', 'class="sub camera logo_preview"', true, false, $open, 'visualmodal'); +$table_styles->data[$row][1] .= ' '.html_print_button( + __('View'), + 'custom_logo_white_bg_preview', + $open, + '', + [ + 'icon' => 'camera', + 'mode' => 'link', + 'class' => 'logo_preview', + ], + true, + false, + $open, + 'visualmodal' +); $row++; $table_styles->data[$row][0] = __('Custom logo (login)'); @@ -371,11 +424,25 @@ if (enterprise_installed()) { ); } -$table_styles->data[$row][1] .= ' '.html_print_button(__('View'), 'custom_logo_login_preview', $open, '', 'class="sub camera logo_preview"', true, false, $open, 'visualmodal'); +$table_styles->data[$row][1] .= ' '.html_print_button( + __('View'), + 'custom_logo_login_preview', + $open, + '', + [ + 'icon' => 'camera', + 'mode' => 'link', + 'class' => 'logo_preview', + ], + true, + false, + $open, + 'visualmodal' +); $row++; -// Splash login -if (enterprise_installed()) { +// Splash login. +if (enterprise_installed() === true) { $table_styles->data[$row][0] = __('Custom Splash (login)'); $table_styles->data[$row][1] = html_print_select( @@ -393,11 +460,25 @@ if (enterprise_installed()) { 'width:240px' ); - $table_styles->data[$row][1] .= ' '.html_print_button(__('View'), 'custom_splash_login_preview', $open, '', 'class="sub camera logo_preview"', true, false, $open, 'visualmodal'); + $table_styles->data[$row][1] .= ' '.html_print_button( + __('View'), + 'custom_splash_login_preview', + $open, + '', + [ + 'icon' => 'camera', + 'mode' => 'link', + 'class' => 'logo_preview', + ], + true, + false, + $open, + 'visualmodal' + ); $row++; } -if (enterprise_installed()) { +if (enterprise_installed() === true) { // Get all the custom logos. $files = list_files('enterprise/images/custom_general_logos', 'png', 1, 0); @@ -418,7 +499,21 @@ if (enterprise_installed()) { false, 'width:240px' ); - $table_styles->data[$row][1] .= ' '.html_print_button(__('View'), 'custom_docs_logo_preview', $open, '', 'class="sub camera logo_preview"', true, false, $open, 'visualmodal'); + $table_styles->data[$row][1] .= ' '.html_print_button( + __('View'), + 'custom_docs_logo_preview', + $open, + '', + [ + 'icon' => 'camera', + 'mode' => 'link', + 'class' => 'logo_preview', + ], + true, + false, + $open, + 'visualmodal' + ); $row++; // Custom support icon. @@ -437,7 +532,21 @@ if (enterprise_installed()) { false, 'width:240px' ); - $table_styles->data[$row][1] .= ' '.html_print_button(__('View'), 'custom_support_logo_preview', $open, '', 'class="sub camera logo_preview"', true, false, $open, 'visualmodal'); + $table_styles->data[$row][1] .= ' '.html_print_button( + __('View'), + 'custom_support_logo_preview', + $open, + '', + [ + 'icon' => 'camera', + 'mode' => 'link', + 'class' => 'logo_preview', + ], + true, + false, + $open, + 'visualmodal' + ); $row++; // Custom center networkmap icon. @@ -456,7 +565,21 @@ if (enterprise_installed()) { false, 'width:240px' ); - $table_styles->data[$row][1] .= ' '.html_print_button(__('View'), 'custom_network_center_logo_preview', $open, '', 'class="sub camera logo_preview"', true, false, $open, 'visualmodal'); + $table_styles->data[$row][1] .= ' '.html_print_button( + __('View'), + 'custom_network_center_logo_preview', + $open, + '', + [ + 'icon' => 'camera', + 'mode' => 'link', + 'class' => 'logo_preview', + ], + true, + false, + $open, + 'visualmodal' + ); $row++; // Custom center mobile console icon. @@ -475,7 +598,21 @@ if (enterprise_installed()) { false, 'width:240px' ); - $table_styles->data[$row][1] .= ' '.html_print_button(__('View'), 'custom_mobile_console_logo_preview', $open, '', 'class="sub camera logo_preview"', true, false, $open, 'visualmodal'); + $table_styles->data[$row][1] .= ' '.html_print_button( + __('View'), + 'custom_mobile_console_logo_preview', + $open, + '', + [ + 'icon' => 'camera', + 'mode' => 'link', + 'class' => 'logo_preview', + ], + true, + false, + $open, + 'visualmodal' + ); $row++; } @@ -489,45 +626,45 @@ $table_styles->data[$row][0] = __('Subtitle (header)'); $table_styles->data[$row][1] = html_print_input_text('custom_subtitle_header', $config['custom_subtitle_header'], '', 50, 40, true); $row++; -// login title1 -if (enterprise_installed()) { +// Login title1. +if (enterprise_installed() === true) { $table_styles->data[$row][0] = __('Title 1 (login)'); $table_styles->data[$row][1] = html_print_input_text('custom_title1_login', $config['custom_title1_login'], '', 50, 50, true); $row++; } -// login text2 -if (enterprise_installed()) { +// Login text2. +if (enterprise_installed() === true) { $table_styles->data[$row][0] = __('Title 2 (login)'); $table_styles->data[$row][1] = html_print_input_text('custom_title2_login', $config['custom_title2_login'], '', 50, 50, true); $row++; } -if (enterprise_installed()) { +if (enterprise_installed() === true) { $table_styles->data[$row][0] = __('Docs URL (login)'); $table_styles->data[$row][1] = html_print_input_text('custom_docs_url', $config['custom_docs_url'], '', 50, 50, true); $row++; } -if (enterprise_installed()) { +if (enterprise_installed() === true) { $table_styles->data[$row][0] = __('Support URL (login)'); $table_styles->data[$row][1] = html_print_input_text('custom_support_url', $config['custom_support_url'], '', 50, 50, true); $row++; } -if (enterprise_installed()) { +if (enterprise_installed() === true) { $table_styles->data[$row][0] = __('Product name'); $table_styles->data[$row][1] = html_print_input_text('rb_product_name', get_product_name(), '', 30, 255, true); $row++; } -if (enterprise_installed()) { +if (enterprise_installed() === true) { $table_styles->data[$row][0] = __('Copyright notice'); $table_styles->data[$row][1] = html_print_input_text('rb_copyright_notice', get_copyright_notice(), '', 30, 255, true); $row++; } -if (enterprise_installed()) { +if (enterprise_installed() === true) { $table_styles->data[$row][0] = __('Disable logo in graphs'); $table_styles->data[$row][1] = html_print_checkbox_switch( 'fixed_graph', @@ -563,7 +700,7 @@ $table_styles->data[$row][1] = html_print_checkbox_switch( $row++; -// For 5.1 Autohidden menu feature +// For 5.1 Autohidden menu feature. $table_styles->data['autohidden'][0] = __('Automatically hide submenu'); $table_styles->data['autohidden'][1] = html_print_checkbox_switch( 'autohidden_menu', @@ -589,6 +726,7 @@ $table_gis = new stdClass(); $table_gis->width = '100%'; $table_gis->class = 'databox filters'; $table_gis->style[0] = 'font-weight: bold;'; +$table_gis->style[1] = 'display: flex; align-items: center;'; $table_gis->size[0] = '50%'; $table_gis->data = []; @@ -617,7 +755,18 @@ $table_gis->data[$row][1] = html_print_select( '', true ); -$table_gis->data[$row][1] .= ' '.html_print_button(__('View'), 'gis_icon_preview', false, '', 'class="sub camera logo_preview"', true); +$table_gis->data[$row][1] .= ' '.html_print_button( + __('View'), + 'gis_icon_preview', + false, + '', + [ + 'icon' => 'camera', + 'mode' => 'link', + 'class' => 'logo_preview', + ], + true +); $row++; // ---------------------------------------------------------------------- @@ -1323,15 +1472,15 @@ $table_other->data[$row][1] = ''.__('Example').' '.date($config['date_f $table_other->data[$row][1] .= html_print_input_text('date_format', $config['date_format'], '', 30, 100, true); $row++; -if ($config['prominent_time'] == 'comparation') { +if ($config['prominent_time'] === 'comparation') { $timestamp = false; $comparation = true; $compact = false; -} else if ($config['prominent_time'] == 'timestamp') { +} else if ($config['prominent_time'] === 'timestamp') { $timestamp = true; $comparation = false; $compact = false; -} else if ($config['prominent_time'] == 'compact') { +} else if ($config['prominent_time'] === 'compact') { $timestamp = false; $comparation = false; $compact = true; @@ -1363,7 +1512,10 @@ $table_other->data[$row][3] = html_print_button( 'custom_value_add_btn', false, '', - 'class="sub next"', + [ + 'icon' => 'next', + 'mode' => 'secondary mini', + ], true ); @@ -1386,10 +1538,13 @@ $table_other->data[$row][3] = html_print_button( 'custom_values_del_btn', empty($count_custom_postprocess), '', - 'class="sub cancel"', + [ + 'icon' => 'cancel', + 'mode' => 'secondary mini', + ], true ); -// This hidden field will be filled from jQuery before submit +// This hidden field will be filled from jQuery before submit. $table_other->data[$row][1] .= html_print_input_hidden( 'custom_value_to_delete', '', @@ -1414,17 +1569,37 @@ $units = [ $table_other->data[$row][1] = __('Value').': '; $table_other->data[$row][1] .= html_print_input_text('interval_value', '', '', 5, 5, true); $table_other->data[$row][2] = html_print_select($units, 'interval_unit', 1, '', '', '', true, false, false); -$table_other->data[$row][3] = html_print_button(__('Add'), 'interval_add_btn', false, '', 'class="sub next"', true); +$table_other->data[$row][3] = html_print_button( + __('Add'), + 'interval_add_btn', + false, + '', + [ + 'icon' => 'next', + 'mode' => 'secondary mini', + ], + true +); $row++; $table_other->data[$row][0] = ''; $table_other->data[$row][1] = __('Delete interval').': '; $table_other->data[$row][2] = html_print_select(get_periods(false, false), 'intervals', '', '', '', '', true); -$table_other->data[$row][3] = html_print_button(__('Delete'), 'interval_del_btn', empty($config['interval_values']), '', 'class="sub cancel"', true); +$table_other->data[$row][3] = html_print_button( + __('Delete'), + 'interval_del_btn', + empty($config['interval_values']), + '', + [ + 'icon' => 'cancel', + 'mode' => 'secondary mini', + ], + true +); $table_other->data[$row][1] .= html_print_input_hidden('interval_values', $config['interval_values'], true); -// This hidden field will be filled from jQuery before submit +// This hidden field will be filled from jQuery before submit. $table_other->data[$row][1] .= html_print_input_hidden('interval_to_delete', '', true); $table_other->data[$row][3] .= '

    '; // ---------------------------------------------------------------------- @@ -1434,7 +1609,17 @@ $table_other->data[$row][0] = __('Module units'); $table_other->data[$row][1] = __('Value').': '; $table_other->data[$row][1] .= html_print_input_text('custom_module_unit', '', '', 15, 50, true); $table_other->data[$row][2] = ''; -$table_other->data[$row][3] = html_print_button(__('Add'), 'module_unit_add_btn', false, '', 'class="sub next"', true); +$table_other->data[$row][3] = html_print_button( + __('Add'), + 'module_unit_add_btn', + false, + '', + [ + 'icon' => 'next', + 'mode' => 'secondary mini', + ], + true +); $row++; $table_other->data[$row][0] = ''; @@ -1445,7 +1630,10 @@ $table_other->data[$row][3] = html_print_button( 'custom_module_unit_del_btn', empty($count_custom_postprocess), '', - 'class="sub cancel"', + [ + 'icon' => 'cancel', + 'mode' => 'secondary mini', + ], true ); diff --git a/pandora_console/godmode/users/configure_user.php b/pandora_console/godmode/users/configure_user.php index 2609c7f23c..c4d269ab70 100644 --- a/pandora_console/godmode/users/configure_user.php +++ b/pandora_console/godmode/users/configure_user.php @@ -1508,14 +1508,20 @@ if ($config['admin_can_add_user']) { __('Create'), 'crtbutton', false, - 'class="sub wand" form="user_profile_form"' + [ + 'icon' => 'wand', + 'form' => 'user_profile_form', + ] ); } else { html_print_submit_button( __('Update'), 'uptbutton', false, - 'class="sub upd" form="user_profile_form"' + [ + 'icon' => 'update', + 'form' => 'user_profile_form', + ] ); } } diff --git a/pandora_console/include/functions_events.php b/pandora_console/include/functions_events.php index a9a5a7d676..f8b17781f8 100644 --- a/pandora_console/include/functions_events.php +++ b/pandora_console/include/functions_events.php @@ -3325,7 +3325,10 @@ function events_page_responses($event) 'owner_button', false, 'event_change_owner('.$event['id_evento'].', '.$event['server_id'].');', - 'class="sub next w70p"', + [ + 'icon' => 'next', + 'mode' => 'mini secondary', + ], true ); @@ -3404,7 +3407,10 @@ function events_page_responses($event) 'status_button', false, 'event_change_status(\''.$event['similar_ids'].'\','.$event['server_id'].');', - 'class="sub next w70p"', + [ + 'icon' => 'next', + 'mode' => 'mini secondary', + ], true ); } @@ -3432,7 +3438,10 @@ function events_page_responses($event) 'comment_button', false, '$(\'#link_comments\').trigger(\'click\');', - 'class="sub next w70p"', + [ + 'icon' => 'next', + 'mode' => 'mini secondary', + ], true ); @@ -3456,7 +3465,10 @@ function events_page_responses($event) 'delete_button', false, 'if(!confirm(\''.__('Are you sure?').'\')) { return false; } this.form.submit();', - 'class="sub cancel w70p"', + [ + 'icon' => 'cancel', + 'mode' => 'mini secondary', + ], true ); $data[2] .= html_print_input_hidden('delete', 1, true); @@ -3511,7 +3523,10 @@ function events_page_responses($event) 'custom_response_button', false, 'execute_response('.$event['id_evento'].','.$server_id.',0)', - "class='sub next w70p'", + [ + 'icon' => 'next', + 'mode' => 'mini secondary', + ], true ); } @@ -4190,7 +4205,10 @@ function events_page_details($event, $server_id=0) 'custom_button', false, '$(\'#link_custom_fields\').trigger(\'click\');', - 'class="sub next"', + [ + 'icon' => 'next', + 'mode' => 'mini secondary', + ], true ); $table_details->data[] = $data; @@ -5042,7 +5060,10 @@ function events_page_comments($event, $ajax=false, $groupedComments=[]) 'comment_button', false, 'event_comment(\''.base64_encode(json_encode($event)).'\');', - 'class="sub next"', + [ + 'icon' => 'next', + 'mode' => 'mini secondary', + ], true ); $comments_form .= '
    '; @@ -5638,7 +5659,10 @@ function get_row_response_action( 'btn_str', false, 'perform_response(\''.base64_encode(json_encode($event_response)).'\','.$response_id.',\''.trim($index).'\')', - "class='sub next'", + [ + 'icon' => 'next', + 'mode' => 'mini secondary', + ], true ); $output .= ''; diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index 1e9d9f8dd7..d45097afb3 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -3381,24 +3381,46 @@ function ui_print_datatable(array $parameters) } $filter .= '
  • '; - // Search button. - $filter .= ''; // Extra buttons. if (isset($parameters['form']['extra_buttons']) === true && is_array($parameters['form']['extra_buttons']) === true ) { foreach ($parameters['form']['extra_buttons'] as $button) { - $filter .= ''; + $filter .= html_print_button( + $button['text'], + $button['id'], + false, + $button['onclick'], + [ + 'style' => ($button['style'] ?? ''), + 'mode' => 'mini secondary', + 'class' => $button['class'], + ], + true + ); } } + // Search button. + $filter .= html_print_div( + [ + 'class' => 'action-buttons', + 'content' => html_print_submit_button( + __('Filter'), + $form_id.'_search_bt', + false, + [ + 'icon' => 'search', + 'mode' => 'mini', + 'class' => $search_button_class, + ], + true + ), + ], + true + ); + $filter .= '
  • '; $filter .= '
    '; diff --git a/pandora_console/operation/network/network_report.php b/pandora_console/operation/network/network_report.php index 700f94e01e..b9c4cbf6d1 100644 --- a/pandora_console/operation/network/network_report.php +++ b/pandora_console/operation/network/network_report.php @@ -270,7 +270,7 @@ $chart_data = []; $hide_filter = !empty($main_value) && ($action === 'udp' || $action === 'tcp'); foreach ($data as $item) { $row = []; - $row['main'] = '
    '; + $row['main'] = '
    '; $row['main'] .= $item['host']; if (!$hide_filter) { $row['main'] .= html_print_link_with_params( From 21e0a39b406037355d53fe62394d2fb7eb016f8b Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Tue, 25 Oct 2022 11:46:59 +0200 Subject: [PATCH 019/563] Improve CSS --- pandora_console/include/styles/pandora.css | 81 +++++++++++----------- 1 file changed, 42 insertions(+), 39 deletions(-) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index aa1d4c754f..e54704c111 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -4227,12 +4227,7 @@ form ul.form_flex li ul li { text-align: center; } -.div-v-centered { - display: flex; - align-items: center; -} - -.div-v-centered > form > input[type="image"] { +.flex_center > form > input[type="image"] { margin: 0; padding: 0; width: 14px; @@ -9068,38 +9063,6 @@ button.submitButton.mini { height: 32px; } -button.buttonButton.link, -button.submitButton.link { - height: 32px; - box-shadow: none; - background: rgba(0, 0, 0, 0) !important; - border-color: rgba(0, 0, 0, 0) !important; - color: #14524f; -} - -button.buttonButton.link > div, -button.submitButton.link > div { - color: #14524f; -} - -button.buttonButton.link:hover, -button.submitButton.link:hover, -button.buttonButton.link > div:hover, -button.submitButton.link > div:hover { - background-color: #e1e7ee; -} - -button.buttonButton.link:hover, -button.submitButton.link:hover { - color: #1d7873; - text-decoration: underline; - font-family: "Pandora-Bold"; -} -button.buttonButton.link > div:hover, -button.submitButton.link > div:hover { - background-color: #1d7873; -} - button.buttonButton:not(.secondary):not(.link), button.submitButton:not(.secondary):not(.link) { background: linear-gradient( @@ -9137,6 +9100,7 @@ button.submitButton.secondary { background-color: #fff; color: #14524f; border: 2px solid #14524f; + box-shadow: none; } button.buttonButton.secondary > div, @@ -9166,6 +9130,40 @@ button.submitButton.secondary:active > div { background-color: #0d312f !important; } +button.buttonButton.link, +button.submitButton.link { + background-color: rgba(0, 0, 0, 0); + color: #14524f; + border: 0; + box-shadow: none; + justify-content: flex-start; +} + +button.buttonButton.link > div, +button.submitButton.link > div { + background-color: #14524f !important; +} + +button.buttonButton.link:hover, +button.submitButton.link:hover { + color: #1d7873 !important; + text-decoration: underline; +} + +button.buttonButton.link:hover > div, +button.submitButton.link:hover > div { + background-color: #1d7873 !important; +} + +button.buttonButton.link:active, +button.submitButton.link:active { + color: #0d312f !important; +} + +button.buttonButton.link:active > div, +button.submitButton.link:active > div { + background-color: #0d312f !important; +} button div.camera { mask: url(../../images/svg/picture.svg) no-repeat center / contain; -webkit-mask: url(../../images/svg/picture.svg) no-repeat center / contain; @@ -9255,7 +9253,6 @@ button.ui-button.ui-widget.submit-cancel { } button.ui-button.ui-widget.submit-cancel:hover { - /*color: #1d7873;*/ background-color: #e1e7ee; border-color: #e1e7ee; } @@ -9266,6 +9263,12 @@ button.ui-button.ui-widget.submit-cancel:active { border-color: #96a2bf; } +.list_button_alignment { + display: flex; + align-items: center; +} + +/* FINISH */ .password_input { background-color: transparent !important; border: none !important; From ab865cd133243da6f516149d720e040cbd380781 Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Tue, 25 Oct 2022 13:13:09 +0200 Subject: [PATCH 020/563] Added new image --- pandora_console/include/styles/pandora.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index e54704c111..10a7484521 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -1825,6 +1825,7 @@ table.rounded_cells td { .action-buttons { display: flex; flex-direction: row-reverse; + align-items: center; } .action-buttons > button { margin-left: 16px; @@ -9210,6 +9211,10 @@ button div.cog { mask: url(../../images/svg/cog.svg) no-repeat center / contain; -webkit-mask: url(../../images/svg/cog.svg) no-repeat center / contain; } +button div.fail { + mask: url(../../images/svg/fail.svg) no-repeat center / contain; + -webkit-mask: url(../../images/svg/fail.svg) no-repeat center / contain; +} .ui-dialog-buttonset { display: flex; } From 13b0c7d0c8ab244585d26f616629246e0441a6ac Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Tue, 25 Oct 2022 13:13:52 +0200 Subject: [PATCH 021/563] Fixed views --- pandora_console/extensions/quick_shell.php | 2 +- .../godmode/agentes/agent_template.php | 16 +++- .../godmode/agentes/modificar_agente.php | 7 +- .../godmode/agentes/module_manager.php | 68 ++++++++++------- .../godmode/alerts/alert_list.builder.php | 36 +++++++-- .../godmode/alerts/alert_list.list.php | 15 +++- .../include/class/ExternalTools.class.php | 25 ++++++- .../operation/agentes/alerts_status.php | 24 +++--- .../operation/agentes/estado_agente.php | 16 +++- .../operation/agentes/estado_monitores.php | 10 ++- pandora_console/operation/agentes/graphs.php | 73 ++++++++++++++----- .../operation/agentes/ver_agente.php | 2 +- 12 files changed, 218 insertions(+), 76 deletions(-) diff --git a/pandora_console/extensions/quick_shell.php b/pandora_console/extensions/quick_shell.php index 7cbb5607e1..a01283eb25 100644 --- a/pandora_console/extensions/quick_shell.php +++ b/pandora_console/extensions/quick_shell.php @@ -202,7 +202,7 @@ function quickShell() 'arguments' => [ 'type' => 'submit', 'label' => __('Connect'), - 'attributes' => 'class="sub next"', + 'attributes' => ['icon' => 'cog'], ], ], ], diff --git a/pandora_console/godmode/agentes/agent_template.php b/pandora_console/godmode/agentes/agent_template.php index 31e6de29b5..b4313aee88 100644 --- a/pandora_console/godmode/agentes/agent_template.php +++ b/pandora_console/godmode/agentes/agent_template.php @@ -185,7 +185,21 @@ echo ""; html_print_select($select, 'template_id', '', '', '', 0, false, false, true, '', false, 'max-width: 200px !important'); echo ''; echo ''; -html_print_submit_button(__('Assign'), 'crt', false, 'class="sub next mgn_tp_0"'); +html_print_div( + [ + 'class' => 'action-buttons', + 'content' => html_print_submit_button( + __('Assign'), + 'crt', + false, + [ + 'icon' => 'wand', + 'mode' => 'mini', + ], + true + ), + ] +); echo ''; echo ''; echo ''; diff --git a/pandora_console/godmode/agentes/modificar_agente.php b/pandora_console/godmode/agentes/modificar_agente.php index b91b1556bc..df45d9da73 100644 --- a/pandora_console/godmode/agentes/modificar_agente.php +++ b/pandora_console/godmode/agentes/modificar_agente.php @@ -375,7 +375,7 @@ html_print_submit_button( false, [ 'icon' => 'search', - 'mode' => 'mini', + 'mode' => 'secondary mini', ] ); echo ''; @@ -963,10 +963,7 @@ if ((bool) check_acl($config['id_user'], 0, 'AW') === true) { __('Create agent'), 'crt-2', false, - [ - 'icon' => 'cog', - 'mode' => 'secondary', - ], + [ 'icon' => 'next' ], true ), ] diff --git a/pandora_console/godmode/agentes/module_manager.php b/pandora_console/godmode/agentes/module_manager.php index 35f50687db..e846562795 100644 --- a/pandora_console/godmode/agentes/module_manager.php +++ b/pandora_console/godmode/agentes/module_manager.php @@ -80,7 +80,15 @@ if (($policy_page !== false) || (isset($agent) === true)) { echo ''; echo ""; -html_print_submit_button(__('Filter'), 'filter', false, 'class="sub search"'); +html_print_submit_button( + __('Filter'), + 'filter', + false, + [ + 'icon' => 'search', + 'mode' => 'secondary mini', + ] +); echo ''; echo ""; echo ''; @@ -232,7 +240,7 @@ if (($policy_page) || (isset($agent))) { false, [ 'icon' => 'next', - 'mode' => 'secondary', + 'mode' => 'mini secondary', ] ); echo ''; @@ -1283,33 +1291,43 @@ if (check_acl_one_of_groups($config['id_user'], $all_groups, 'AW')) { html_print_table($table); -if (check_acl_one_of_groups($config['id_user'], $all_groups, 'AW')) { - echo '
    '; - +if ((bool) check_acl_one_of_groups($config['id_user'], $all_groups, 'AW') === true) { html_print_input_hidden('submit_modules_action', 1); - html_print_select( + html_print_div( [ - 'disable' => 'Disable selected modules', - 'delete' => 'Delete selected modules', - ], - 'module_action', - '', - '', - '', - 0, - false, - false, - false + 'class' => 'action-buttons', + 'content' => html_print_submit_button( + __('Execute action'), + 'submit_modules_action', + false, + [ + 'icon' => 'next', + 'mode' => 'link', + ], + true + ).html_print_select( + [ + 'disable' => 'Disable selected modules', + 'delete' => 'Delete selected modules', + ], + 'module_action', + '', + '', + '', + 0, + true, + false, + false, + '', + false, + false, + false, + 300 + ), + ] ); - html_print_submit_button( - __('Execute action'), - 'submit_modules_action', - false, - 'class="sub next"' - ); - echo '
    '; echo ''; } ?> @@ -1317,7 +1335,7 @@ if (check_acl_one_of_groups($config['id_user'], $all_groups, 'AW')) { + Date: Tue, 25 Oct 2022 16:26:23 +0200 Subject: [PATCH 024/563] Fixed for only icon buttons --- pandora_console/include/functions_html.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index 4d3ae6abc5..b43615bf09 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -3402,14 +3402,14 @@ function html_print_button($label='OK', $name='', $disabled=false, $script='', $ $iconToUse = preg_replace('([^A-Za-z])', '', $iconToUse); } - if (empty($iconToUse) === false) { + if (empty($iconToUse) === false || (isset($buttonMode) === true && $buttonMode !== 'onlyIcon')) { $iconDiv = html_print_div( [ 'style' => '', 'class' => sprintf( 'subIcon %s %s', $iconToUse, - (isset($buttonMode) === true) ? $buttonMode : '' + (empty($buttonMode) === false) ? $buttonMode : '' ), ], true From 5aaa415ed9bb48e87e002c3518b3a6ec6bf4ecea Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Tue, 25 Oct 2022 17:11:18 +0200 Subject: [PATCH 025/563] Several fixes --- .../include/class/AgentWizard.class.php | 7 ++- pandora_console/include/functions_html.php | 3 +- .../operation/agentes/ver_agente.php | 2 +- pandora_console/operation/users/user_edit.php | 54 +++++++++++++++---- 4 files changed, 51 insertions(+), 15 deletions(-) diff --git a/pandora_console/include/class/AgentWizard.class.php b/pandora_console/include/class/AgentWizard.class.php index 0c80bce84c..a22c215388 100644 --- a/pandora_console/include/class/AgentWizard.class.php +++ b/pandora_console/include/class/AgentWizard.class.php @@ -751,7 +751,10 @@ class AgentWizard extends HTML 'label' => $this->actionLabel, 'name' => 'sub-protocol', 'type' => 'submit', - 'attributes' => 'class="sub next" onclick="$(\'#form-main-wizard\').submit();"', + 'attributes' => [ + 'icon' => 'cog', + 'onclick' => '$(\'#form-main-wizard\').submit();', + ], 'return' => true, ], ]; @@ -3658,7 +3661,7 @@ class AgentWizard extends HTML 'label' => __('Create modules'), 'name' => 'create-modules-action', 'type' => 'button', - 'attributes' => 'class="sub cog float-right"', + 'attributes' => [ 'icon' => 'next' ], 'script' => 'processListModules();', 'return' => true, ], diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index b43615bf09..cc1d12fb2d 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -3333,13 +3333,14 @@ function html_print_submit_button($label='OK', $name='', $disabled=false, $attri $attributes = []; } + // Set the button type from here. $attributes['type'] = 'submit'; $output = html_print_button( $label, $name, $disabled, - '', + (isset($attributes['onclick']) === true) ? $attributes['onclick'] : '', $attributes, true ); diff --git a/pandora_console/operation/agentes/ver_agente.php b/pandora_console/operation/agentes/ver_agente.php index 48f4283b1b..9fed0b0d70 100644 --- a/pandora_console/operation/agentes/ver_agente.php +++ b/pandora_console/operation/agentes/ver_agente.php @@ -1386,7 +1386,7 @@ $maintab['text'] = '

    '.__('Event filter').'

    '; $user_groups = implode(',', array_keys((users_get_groups($config['id_user'], 'AR', true)))); $event_filter .= html_print_select_from_sql( @@ -736,7 +744,14 @@ if ($config['ehorus_enabled'] && $config['ehorus_user_level_conf']) { $row = []; $row['name'] = __('Test'); - $row['control'] = html_print_button(__('Start'), 'test-ehorus', false, 'ehorus_connection_test("'.$ehorus_host.'",'.$ehorus_port.')', 'class="sub next"', true); + $row['control'] = html_print_button( + __('Start'), + 'test-ehorus', + false, + 'ehorus_connection_test("'.$ehorus_host.'",'.$ehorus_port.')', + [ 'icon' => 'next' ], + true + ); $row['control'] .= ' '; $row['control'] .= ' '; $row['control'] .= ' '; @@ -782,7 +797,14 @@ if ($config['integria_enabled'] && $config['integria_user_level_conf']) { $row = []; $row['name'] = __('Test'); - $row['control'] = html_print_button(__('Start'), 'test-integria', false, 'integria_connection_test("'.$integria_host.'",'.$integria_api_pass.')', 'class="sub next"', true); + $row['control'] = html_print_button( + __('Start'), + 'test-integria', + false, + 'integria_connection_test("'.$integria_host.'",'.$integria_api_pass.')', + [ 'icon' => 'next' ], + true + ); $row['control'] .= ' '; $row['control'] .= ' '; $row['control'] .= ' '; @@ -796,15 +818,25 @@ if ($config['integria_enabled'] && $config['integria_user_level_conf']) { if ($is_management_allowed === true) { - echo '
    '; - if (!$config['user_can_update_info']) { - echo ''.__('You can not change your user info under the current authentication scheme').''; + if ((bool) $config['user_can_update_info'] === false) { + $outputButton = ''.__('You can not change your user info under the current authentication scheme').''; } else { - html_print_csrf_hidden(); - html_print_submit_button(__('Update'), 'uptbutton', $view_mode, 'class="sub upd"'); + $outputButton = html_print_submit_button( + __('Update'), + 'uptbutton', + $view_mode, + [ 'icon' => 'update' ], + true + ); + $outputButton .= html_print_csrf_hidden(true); } - echo '
    '; + html_print_div( + [ + 'class' => 'action-buttons', + 'content' => $outputButton, + ] + ); } echo ''; From ffa0d2408394fdd704bbbe7dc62eb0c627a99b4a Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Tue, 25 Oct 2022 21:59:30 +0200 Subject: [PATCH 026/563] Improve CSS --- pandora_console/include/styles/pandora.css | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index b426879d51..718d3eea2e 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -9102,6 +9102,7 @@ button.submitButton > div { button.buttonButton.onlyIcon, button.submitButton.onlyIcon { width: 32px; + height: 32px; border: none; box-shadow: none; } @@ -9276,7 +9277,8 @@ button.ui-button.ui-widget.submit-next:active { button.ui-button.ui-widget.submit-cancel { background-color: #fff; color: #14524f; - border: 1px solid #fff; + border: 0; + box-shadow: none; } button.ui-button.ui-widget.submit-cancel:hover { From c7aa456d605a5d809c9a1c8bbd61cc7951215df5 Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Wed, 26 Oct 2022 10:51:12 +0200 Subject: [PATCH 027/563] Adapt views --- pandora_console/godmode/setup/performance.php | 18 ++-- pandora_console/godmode/setup/setup_auth.php | 75 +++++++-------- .../godmode/setup/setup_ehorus.php | 54 ++++++++--- .../godmode/setup/setup_general.php | 45 ++++++--- .../godmode/setup/setup_integria.php | 92 +++++++++++++------ .../godmode/setup/setup_websocket_engine.php | 18 ++-- 6 files changed, 197 insertions(+), 105 deletions(-) diff --git a/pandora_console/godmode/setup/performance.php b/pandora_console/godmode/setup/performance.php index 89b745cfca..ab226eb116 100644 --- a/pandora_console/godmode/setup/performance.php +++ b/pandora_console/godmode/setup/performance.php @@ -725,15 +725,19 @@ echo '
    '; html_print_table($table_other); echo '
    '; -echo '
    '; html_print_input_hidden('update_config', 1); -html_print_submit_button( - __('Update'), - 'update_button', - false, - 'class="sub upd"' +html_print_div( + [ + 'class' => 'action-buttons w100p', + 'content' => html_print_submit_button( + __('Update'), + 'update_button', + false, + [ 'icon' => 'update' ], + true + ), + ] ); -echo '
    '; echo ''; ?> diff --git a/pandora_console/godmode/setup/setup_auth.php b/pandora_console/godmode/setup/setup_auth.php index e1318f96c2..ebe6c08c60 100644 --- a/pandora_console/godmode/setup/setup_auth.php +++ b/pandora_console/godmode/setup/setup_auth.php @@ -1,30 +1,30 @@ data = []; $table->width = '100%'; @@ -62,7 +62,7 @@ if (is_ajax()) { ); $table->data['fallback_local_auth'] = $row; - if (enterprise_installed()) { + if (enterprise_installed() === true) { $is_management_allowed = is_management_allowed(); // Autocreate remote users. $row = []; @@ -83,9 +83,6 @@ if (is_ajax()) { } switch ($type_auth) { - case 'mysql': - break; - case 'ldap': // LDAP server. $row = []; @@ -335,11 +332,12 @@ if (is_ajax()) { case 'saml': case 'integria': // Add enterprise authentication options. - if (enterprise_installed()) { + if (enterprise_installed() === true) { add_enterprise_auth_options($table, $type_auth); } break; + case 'mysql': default: // Default case. break; @@ -373,7 +371,7 @@ if (is_ajax()) { true ); - if (!$config['double_auth_enabled']) { + if ((bool) $config['double_auth_enabled'] === false) { $table->rowclass['2FA_all_users'] = 'invisible'; } else { $table->rowclass['2FA_all_users'] = ''; @@ -432,7 +430,7 @@ $auth_methods = [ 'mysql' => __('Local %s', get_product_name()), 'ldap' => __('ldap'), ]; -if (enterprise_installed()) { +if (enterprise_installed() === true) { add_enterprise_auth_methods($auth_methods); } @@ -452,7 +450,7 @@ $table->data['auth'] = $row; // Form. echo '
    '; -if (!is_metaconsole()) { +if (is_metaconsole() === false) { html_print_input_hidden('update_config', 1); } else { // To use it in the metasetup. @@ -461,15 +459,20 @@ if (!is_metaconsole()) { } html_print_table($table); -echo '
    '; -echo '
    '; -html_print_submit_button( - __('Update'), - 'update_button', - false, - 'class="sub upd"' +html_print_div([ 'id' => 'table_auth_result' ]); +html_print_div( + [ + 'class' => 'action-buttons w100p', + 'content' => html_print_submit_button( + __('Update'), + 'update_button', + false, + [ 'icon' => 'update' ], + true + ), + ] ); -echo '
    '; + echo '
    '; ?> diff --git a/pandora_console/godmode/setup/setup_ehorus.php b/pandora_console/godmode/setup/setup_ehorus.php index 136c0e6075..0aceb31710 100644 --- a/pandora_console/godmode/setup/setup_ehorus.php +++ b/pandora_console/godmode/setup/setup_ehorus.php @@ -1,12 +1,20 @@ data['ehorus_req_timeout'] = $row; // Test. $row = []; $row['name'] = __('Test'); -$row['control'] = html_print_button(__('Start'), 'test-ehorus', false, '', 'class="sub next"', true); +$row['control'] = html_print_button( + __('Start'), + 'test-ehorus', + false, + '', + [ + 'icon' => 'cog', + 'mode' => 'secondary mini', + ], + true +); $row['control'] .= ''; $row['control'] .= ''; $row['control'] .= ''; @@ -119,7 +138,7 @@ $table_remote->data['ehorus_test'] = $row; // Print. echo '
    '; echo ''; echo '
    '; - echo '
    '; - html_print_submit_button(__('Update'), 'update_button', false, 'class="sub upd"'); - echo '
    '; + html_print_div( + [ + 'class' => 'action-buttons w100p', + 'content' => html_print_submit_button( + __('Update'), + 'update_button', + false, + ['icon' => 'update'], + true + ), + ] + ); echo ''; -?> + ?> diff --git a/pandora_console/godmode/setup/setup_general.php b/pandora_console/godmode/setup/setup_general.php index 93a3d64a27..6c6afc156a 100644 --- a/pandora_console/godmode/setup/setup_general.php +++ b/pandora_console/godmode/setup/setup_general.php @@ -620,7 +620,7 @@ echo ''.__('Mail configuration').''; 'email_test_dialog', false, "show_email_test('".$uniqid."');", - 'class="sub next"', + [ 'icon' => 'next' ], true ); @@ -634,9 +634,19 @@ echo ''.__('Mail configuration').''; echo '
    '; - echo '
    '; - html_print_submit_button(__('Update'), 'update_button', false, 'class="sub upd"'); - echo '
    '; + html_print_div( + [ + 'class' => 'action-buttons w100p', + 'content' => html_print_submit_button( + __('Update'), + 'update_button', + false, + ['icon' => 'update'], + true + ), + ] + ); + echo ''; @@ -667,17 +677,26 @@ echo ''.__('Mail configuration').''; true ); - $table_mail_test->data[1][0] = html_print_button( - __('Send'), - 'email_test', - false, - '', - 'class="sub next"', + $table_mail_test->data[1][0] = '  Email could not be sent'; + + $table_mail_test->data[1][1] = html_print_div( + [ + 'class' => 'action-buttons w100p', + 'content' => html_print_button( + __('Send'), + 'email_test', + false, + '', + [ + 'icon' => 'cog', + 'mode' => 'mini', + ], + true + ), + ], true ); - $table_mail_test->data[1][1] = '  Email could not be sent'; - echo ''; } @@ -814,6 +833,6 @@ $(document).ready (function () { } }) - $('input#button-email_test').click(perform_email_test); + $('#button-email_test').click(perform_email_test); }); diff --git a/pandora_console/godmode/setup/setup_integria.php b/pandora_console/godmode/setup/setup_integria.php index 7f9b419fac..15d17e8542 100644 --- a/pandora_console/godmode/setup/setup_integria.php +++ b/pandora_console/godmode/setup/setup_integria.php @@ -1,12 +1,20 @@ 1]); - } else { - echo json_encode(['login' => 0]); - } + echo json_encode(['login' => ($login_result !== false) ? 1 : 0]); return; } @@ -312,7 +313,17 @@ $table_remote->data['integria_req_timeout'] = $row; $row = []; $row['name'] = __('Inventory'); -$row['control'] = html_print_button(__('Sync inventory'), 'sync-inventory', false, '', 'class="sub next"', true); +$row['control'] = html_print_button( + __('Sync inventory'), + 'sync-inventory', + false, + '', + [ + 'icon' => 'cog', + 'mode' => 'secondary mini', + ], + true +); $row['control'] .= ''; $row['control'] .= ''; $row['control'] .= ''; @@ -564,7 +575,17 @@ $table_cr_settings->data['custom_response_incident_status'] = $row; // Test. $row = []; $row['name'] = __('Test'); -$row['control'] = html_print_button(__('Start'), 'test-integria', false, '', 'class="sub next"', true); +$row['control'] = html_print_button( + __('Start'), + 'test-integria', + false, + '', + [ + 'icon' => 'cog', + 'mode' => 'secondary mini', + ], + true +); $row['control'] .= ''; $row['control'] .= ''; $row['control'] .= ''; @@ -628,13 +649,31 @@ if ($has_connection != false) { echo '
    '; echo '
    '; - echo '
    '; - html_print_submit_button(__('Update'), 'update_button', false, 'class="sub upd"'); - echo '
    '; + html_print_div( + [ + 'class' => 'action-buttons w100p', + 'content' => html_print_submit_button( + __('Update'), + 'update_button', + false, + ['icon' => 'update'], + true + ), + ] + ); } else { - echo '
    '; - html_print_submit_button(__('Update and continue'), 'update_button', false, 'class="sub next"'); - echo '
    '; + html_print_div( + [ + 'class' => 'action-buttons w100p', + 'content' => html_print_submit_button( + __('Update and continue'), + 'update_button', + false, + ['icon' => 'update'], + true + ), + ] + ); } @@ -653,7 +692,7 @@ echo ''; var handleUserLevel = function(event) { var is_checked = $('input:checkbox[name="integria_enabled"]').is(':checked'); var is_checked_userlevel = $('input:checkbox[name="integria_user_level_conf"]').is(':checked'); - + if (event.target.value == '1' && is_checked && !is_checked_userlevel) { showUserPass(); $('input:checkbox[name="integria_user_level_conf"]').attr('checked', true); @@ -797,11 +836,11 @@ echo ''; } var handleInventorySync = function (event) { - + var badRequestMessage = ''; var notFoundMessage = ''; var invalidPassMessage = ''; - + var hideLoadingImage = function () { $('span#test-integria-spinner-sync').hide(); } @@ -821,7 +860,6 @@ echo ''; $('span#test-integria-failure-sync').show(); } - hideSuccessImage(); hideFailureImage(); showLoadingImage(); @@ -887,9 +925,7 @@ echo ''; }); } - $('input#button-test-integria').click(handleTest); - $('input#button-sync-inventory').click(handleInventorySync); - - + $('#button-test-integria').click(handleTest); + $('#button-sync-inventory').click(handleInventorySync); diff --git a/pandora_console/godmode/setup/setup_websocket_engine.php b/pandora_console/godmode/setup/setup_websocket_engine.php index 0422000120..f6e05c09de 100644 --- a/pandora_console/godmode/setup/setup_websocket_engine.php +++ b/pandora_console/godmode/setup/setup_websocket_engine.php @@ -84,12 +84,16 @@ if (function_exists('quickShellSettings') === true) { quickShellSettings(); } -echo '
    '; -html_print_submit_button( - __('Update'), - 'update_button', - false, - 'class="sub upd"' +html_print_div( + [ + 'class' => 'action-buttons w100p', + 'content' => html_print_submit_button( + __('Update'), + 'update_button', + false, + [ 'icon' => 'update' ], + true + ), + ] ); -echo '
    '; echo ''; From 5e4bf4863cdd3fa6a784f2259e805d2e003f5fa1 Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Wed, 26 Oct 2022 12:02:56 +0200 Subject: [PATCH 028/563] Adapted views --- .../general/first_task/custom_fields.php | 54 ++++++++++++++----- .../agentes/status_monitor_custom_fields.php | 15 ++++-- .../godmode/reporting/map_builder.php | 54 ++++++++++++------- .../reporting/visual_console_favorite.php | 16 ++++-- .../operation/agentes/status_monitor.php | 43 ++++++++------- pandora_console/operation/tree.php | 13 ++++- 6 files changed, 137 insertions(+), 58 deletions(-) diff --git a/pandora_console/general/first_task/custom_fields.php b/pandora_console/general/first_task/custom_fields.php index c8767a3c48..11f9f30c2d 100644 --- a/pandora_console/general/first_task/custom_fields.php +++ b/pandora_console/general/first_task/custom_fields.php @@ -1,16 +1,32 @@ true, 'message' => __('There are no custom __('Custom Fields')]); ?>
    -

    +

    true, 'message' => __('There are no custom ?>

    + 'action-buttons', + 'content' => html_print_submit_button( + __('Create Custom Fields'), + 'button_task', + false, + [ 'icon' => 'next' ], + true + ), + ] + ); + ?>
    diff --git a/pandora_console/godmode/agentes/status_monitor_custom_fields.php b/pandora_console/godmode/agentes/status_monitor_custom_fields.php index d9960c7547..b4077e2eb8 100644 --- a/pandora_console/godmode/agentes/status_monitor_custom_fields.php +++ b/pandora_console/godmode/agentes/status_monitor_custom_fields.php @@ -202,10 +202,19 @@ $table->data[1][2] = html_print_select( echo '
    '; html_print_table($table); -echo '
    '; - html_print_submit_button(__('Update'), 'upd_button', false, 'class="sub upd"'); +html_print_div( + [ + 'class' => 'action-buttons w100p', + 'content' => html_print_submit_button( + __('Update'), + 'update_button', + false, + [ 'icon' => 'update' ], + true + ), + ] +); echo ''; -echo '
    '; ?> diff --git a/pandora_console/godmode/reporting/visual_console_builder.elements.php b/pandora_console/godmode/reporting/visual_console_builder.elements.php index 61674f9012..e969d08379 100755 --- a/pandora_console/godmode/reporting/visual_console_builder.elements.php +++ b/pandora_console/godmode/reporting/visual_console_builder.elements.php @@ -1,22 +1,38 @@ '; -} else { - echo "
    "; -} - -if (!defined('METACONSOLE')) { - echo '
    '; -} - -if (!defined('METACONSOLE')) { html_print_input_hidden('action', 'update'); } else { + echo ""; html_print_input_hidden('action2', 'update'); } html_print_table($table); -echo '
    '; -html_print_submit_button(__('Update'), 'go', false, 'class="sub next"'); -echo ' '; -html_print_button(__('Delete'), 'delete', false, 'submit_delete_multiple_items();', 'class="sub delete"'); -echo '
    '; +$buttons = html_print_submit_button( + __('Update'), + 'go', + false, + [ 'icon' => 'next' ], + true +); + +$buttons .= html_print_button( + __('Delete'), + 'delete', + false, + 'submit_delete_multiple_items();', + [ + 'icon' => 'delete', + 'mode' => 'secondary', + ], + true +); + +html_print_div( + [ + 'class' => 'action-buttons', + 'content' => $buttons, + ] +); + echo ''; -// Form for multiple delete -if (!defined('METACONSOLE')) { - $url_multiple_delete = 'index.php?'.'sec=network&'.'sec2=godmode/reporting/visual_console_builder&'.'tab='.$activeTab.'&'.'id_visual_console='.$visualConsole['id']; - - echo '
    '; +// Form for multiple delete. +if (is_metaconsole() === false) { + $url_multiple_delete = 'index.php?sec=network&sec2=godmode/reporting/visual_console_builder&tab='.$activeTab.'&id_visual_console='.$visualConsole['id']; } else { - $url_multiple_delete = 'index.php?'.'operation=edit_visualmap&'.'sec=screen&'.'sec2=screens/screens&'.'action=visualmap&'.'pure=0&'.'tab=list_elements&'.'id_visual_console='.$idVisualConsole; - - echo "'.html -if (is_metaconsole()) { +if (is_metaconsole() === true) { $pure = get_parameter('pure', 0); echo ''; } -if (defined('METACONSOLE')) { +if (is_metaconsole() === true) { echo "
    ".__('Wizard').'
    '; } html_print_table($table); -echo '
    '; -if (is_metaconsole()) { +if (is_metaconsole() === true) { html_print_input_hidden('action2', 'update'); } else { html_print_input_hidden('action', 'update'); } html_print_input_hidden('id_visual_console', $visualConsole['id']); -html_print_submit_button(__('Add'), 'go', false, 'class="sub wizard wand"'); -echo '
    '; +html_print_div( + [ + 'class' => 'action-buttons', + 'content' => html_print_submit_button( + __('Add'), + 'go', + false, + [ 'icon' => 'wand' ], + true + ), + ] +); + echo '
    '; // Trick for it have a traduct text for javascript. diff --git a/pandora_console/operation/events/events.php b/pandora_console/operation/events/events.php index e289632aad..0fd926acdb 100644 --- a/pandora_console/operation/events/events.php +++ b/pandora_console/operation/events/events.php @@ -2374,25 +2374,38 @@ if (check_acl( echo '
    '; echo '
    '; echo ''; - html_print_select( + + $elements = html_print_button( + __('Execute event response'), + 'submit_event_response', + false, + 'execute_event_response(true);', + [ + 'icon' => 'cog', + 'mode' => 'mini', + ], + true + ); + + $elements .= html_print_select( $array_events_actions, 'response_id', '', '', '', 0, - false, + true, false, false ); - echo '  '; - html_print_button( - __('Execute event response'), - 'submit_event_response', - false, - 'execute_event_response(true);', - 'class="sub next"' + + html_print_div( + [ + 'class' => 'action-buttons', + 'content' => $elements, + ] ); + echo "
    '; echo ''; $table->data[0][2] = ''.__('Module').''; if ($is_metaconsole === true) { - $table->data[0][3] = html_print_select($fields, 'module_inventory_general_view', $inventory_module, $filteringFunction, __('Basic info'), 0, true, false, true, '', false, 'min-width: 194px; max-width: 200px;'); + // array_unshift($fields, __('All')); + $table->data[0][3] = html_print_select($fields, 'module_inventory_general_view', $inventory_module, $filteringFunction, __('All'), 0, true, false, true, '', false, 'min-width: 194px; max-width: 200px;'); } else { $sql = 'SELECT name as indexname, name FROM tmodule_inventory, tagent_module_inventory @@ -381,7 +382,7 @@ if ($is_metaconsole === true) { $fields[$id] = $value; } - array_unshift($fields, 'All'); + array_unshift($fields, __('All')); $table->data[0][3] = html_print_select($fields, 'module_inventory_general_view', $inventory_module, '', __('Basic info'), 'basic', true, false, false); } From 17c0e78d06b484ddeabbf502e9426a72522ecec9 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Thu, 26 Jan 2023 13:25:24 +0100 Subject: [PATCH 118/563] Improve TreeView --- pandora_console/images/minus.svg | 14 ++ pandora_console/images/plus.svg | 16 ++ pandora_console/include/class/Tree.class.php | 1 + pandora_console/include/functions_agents.php | 30 +++- .../include/functions_treeview.php | 155 +++++++++-------- pandora_console/include/functions_ui.php | 156 +++++++++++------- .../include/javascript/fixed-bottom-box.js | 6 +- .../include/javascript/tree/TreeController.js | 44 +++-- .../lib/Dashboard/Widgets/tree_view.php | 8 +- .../include/styles/fixed-bottom-box.css | 39 +---- pandora_console/include/styles/pandora.css | 11 ++ pandora_console/include/styles/tree.css | 132 ++++++++++----- pandora_console/operation/tree.php | 15 +- 13 files changed, 392 insertions(+), 235 deletions(-) create mode 100644 pandora_console/images/minus.svg create mode 100644 pandora_console/images/plus.svg diff --git a/pandora_console/images/minus.svg b/pandora_console/images/minus.svg new file mode 100644 index 0000000000..fbefe9cbdf --- /dev/null +++ b/pandora_console/images/minus.svg @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/pandora_console/images/plus.svg b/pandora_console/images/plus.svg new file mode 100644 index 0000000000..16651c428c --- /dev/null +++ b/pandora_console/images/plus.svg @@ -0,0 +1,16 @@ + + + + + + + + + + diff --git a/pandora_console/include/class/Tree.class.php b/pandora_console/include/class/Tree.class.php index 7daea2bf1f..2588d3f48f 100644 --- a/pandora_console/include/class/Tree.class.php +++ b/pandora_console/include/class/Tree.class.php @@ -669,6 +669,7 @@ class Tree } $module['statusImageHTML'] = ui_print_status_image($statusType, htmlspecialchars($statusTitle), true); + $module['statusImageHTML'] = 'cipote'; // HTML of the server type image. $module['serverTypeHTML'] = ui_print_servertype_icon((int) $module['server_type']); diff --git a/pandora_console/include/functions_agents.php b/pandora_console/include/functions_agents.php index 12e9c20282..0e28cf7cec 100644 --- a/pandora_console/include/functions_agents.php +++ b/pandora_console/include/functions_agents.php @@ -3004,7 +3004,10 @@ function agents_tree_view_status_img_ball($critical, $warning, $unknown, $total, STATUS_AGENT_NO_MONITORS_BALL, __('No Monitors'), true, - false, + [ + 'is_tree_view', + true, + ], false, // Use CSS shape instead of image. true @@ -3016,7 +3019,10 @@ function agents_tree_view_status_img_ball($critical, $warning, $unknown, $total, STATUS_ALERT_FIRED_BALL, __('Alert fired on agent'), true, - false, + [ + 'is_tree_view', + true, + ], false, // Use CSS shape instead of image. true @@ -3028,7 +3034,10 @@ function agents_tree_view_status_img_ball($critical, $warning, $unknown, $total, STATUS_AGENT_CRITICAL_BALL, __('At least one module in CRITICAL status'), true, - false, + [ + 'is_tree_view', + true, + ], false, // Use CSS shape instead of image. true @@ -3038,7 +3047,10 @@ function agents_tree_view_status_img_ball($critical, $warning, $unknown, $total, STATUS_AGENT_WARNING_BALL, __('At least one module in WARNING status'), true, - false, + [ + 'is_tree_view', + true, + ], false, // Use CSS shape instead of image. true @@ -3048,7 +3060,10 @@ function agents_tree_view_status_img_ball($critical, $warning, $unknown, $total, STATUS_AGENT_DOWN_BALL, __('At least one module is in UKNOWN status'), true, - false, + [ + 'is_tree_view', + true, + ], false, // Use CSS shape instead of image. true @@ -3058,7 +3073,10 @@ function agents_tree_view_status_img_ball($critical, $warning, $unknown, $total, STATUS_AGENT_OK_BALL, __('All Monitors OK'), true, - false, + [ + 'is_tree_view', + true, + ], false, // Use CSS shape instead of image. true diff --git a/pandora_console/include/functions_treeview.php b/pandora_console/include/functions_treeview.php index 35e4c80690..66bd44847f 100755 --- a/pandora_console/include/functions_treeview.php +++ b/pandora_console/include/functions_treeview.php @@ -55,29 +55,19 @@ function treeview_printModuleTable($id_module, $server_data=false, $no_head=fals $table = new StdClass(); $table->width = '100%'; - $table->class = 'floating_form'; + $table->class = 'floating_form margin-top-10'; $table->id = 'tree_view_module_data'; $table->style = []; - $table->style['title'] = 'height: 46px; width: 30%; padding-right: 5px; text-align: end;'; - $table->style['data'] = 'height: 46px; width: 70%; padding-left: 5px; font-family: \'Pandora-Regular\';'; + $table->style['title'] = 'height: 32px; width: 30%; padding-right: 5px; text-align: end;'; + $table->style['data'] = 'height: 32px; width: 70%; padding-left: 5px; font-family: \'Pandora-Regular\';'; $table->data = []; // Module name. - if ($module['disabled']) { - $cellName = ''.ui_print_truncate_text($module['nombre'], GENERIC_SIZE_TEXT, true, true, true, '[…]', 'text-transform: uppercase;').ui_print_help_tip(__('Disabled'), true).''; - } else { - $cellName = ui_print_truncate_text($module['nombre'], GENERIC_SIZE_TEXT, true, true, true, '[…]', 'text-transform: uppercase;'); - } + $cellName = ((bool) $module['disabled'] === true) ? ''.$module['nombre'].''.ui_print_help_tip(__('Disabled'), true) : $module['nombre']; $row = []; $row['title'] = __('Name'); - $row['data'] = html_print_anchor( - [ - 'href' => $console_url.'index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&id_agente='.$module['id_agente'].'&tab=module&edit_module=1&id_agent_module='.$module['id_agente_modulo'].$url_hash, - 'content' => $cellName, - ], - true - ); + $row['data'] = $cellName; $table->data['name'] = $row; // Interval. @@ -126,14 +116,7 @@ function treeview_printModuleTable($id_module, $server_data=false, $no_head=fals $row = []; $row['title'] = __('Description'); - $row['data'] = ui_print_truncate_text( - $module['descripcion'], - 'description', - true, - true, - true, - '[…]' - ); + $row['data'] = $module['descripcion']; $table->data['description'] = $row; // Tags. @@ -321,6 +304,18 @@ function treeview_printModuleTable($id_module, $server_data=false, $no_head=fals $row['data'] = $time_elapsed; $table->data['tags'] = $row; + // Edit module button. + $row = []; + $row['title'] = html_print_button( + __('Edit module'), + 'edit_module_link', + false, + 'window.location.assign(\''.$console_url.'index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&id_agente='.$module['id_agente'].'&tab=module&edit_module=1&id_agent_module='.$module['id_agente_modulo'].$url_hash.'\')', + [ 'mode' => 'link' ], + true + ); + $table->data['edit_button'] = $row; + $table->colspan['edit_button'] = 2; // Title. echo ''.__('Module information').''; // End of table. @@ -570,19 +565,15 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) $table->class = 'floating_form'; $table->id = 'tree_view_agent_detail'; $table->style = []; - $table->style['title'] = 'height: 46px; width: 30%; padding-right: 5px; text-align: end;'; - $table->style['data'] = 'height: 46px; width: 70%; padding-left: 5px; font-family: \'Pandora-Regular\';'; + $table->style['title'] = 'height: 32px; width: 30%; padding-right: 5px; text-align: end;'; + $table->style['data'] = 'height: 32px; width: 70%; padding-left: 5px; font-family: \'Pandora-Regular\';'; $table->head = []; $table->data = []; // Agent name. - if ($agent['disabled']) { - $cellName = ''; - } else { - $cellName = ''; - } + $cellName = ((bool) $agent['disabled'] === true) ? '' : ''; - if (is_metaconsole()) { + if (is_metaconsole() === true) { $pwd = $server_data['auth_token']; // Create HASH login info. $user = $config['id_user']; @@ -592,28 +583,18 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) $hashdata = $user.$pwd_deserialiced['auth_token']; $hashdata = md5($hashdata); - $url = $server_data['server_url'].'/index.php?'.'sec=estado&'.'sec2=operation/agentes/ver_agente&'.'id_agente='.$agent['id_agente']; - - if ($grants_on_node && (bool) $user_access_node !== false) { - $cellName .= html_print_anchor( - [ - 'onClick' => 'sendHash(\''.$url.'\')', - 'content' => ''.$agent['alias'].'', - ], - true - ); + if ((bool) $grants_on_node === true && (bool) $user_access_node !== false) { + $urlAgent = 'sendHash(\''.$server_data['server_url'].'/index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente='.$agent['id_agente'].'\')'; } else { - $cellName .= ''.$agent['alias'].''; + $urlAgent = ''; } } else { - $url = ui_get_full_url( - 'index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente='.$agent['id_agente'] - ); - $cellName .= ''; - $cellName .= ''.$agent['alias'].''; + $urlAgent = 'window.location.assign(\'index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente='.$agent['id_agente'].'\')'; } - if ($agent['disabled']) { + $cellName = $agent['alias']; + + if ((bool) $agent['disabled'] === true) { $cellName .= ui_print_help_tip(__('Disabled'), true).''; } @@ -640,6 +621,10 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) ); } + if (empty($address) === true) { + $address = __('N/A'); + } + $row = []; $row['title'] = __('IP Address'); $row['data'] = $address; @@ -660,7 +645,7 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) // Last contact. $last_contact = ui_print_timestamp($agent['ultimo_contacto'], true, ['class' => 'font_11']); - if ($agent['ultimo_contacto_remoto'] == '01-01-1970 00:00:00') { + if ($agent['ultimo_contacto_remoto'] === '01-01-1970 00:00:00') { $last_remote_contact = __('Never'); } else { $last_remote_contact = date_w_fixed_tz( @@ -669,9 +654,14 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) } $row = []; - $row['title'] = __('Last contact').' / '.__('Remote'); - $row['data'] = "$last_contact / $last_remote_contact"; - $table->data['contact'] = $row; + $row['title'] = __('Last contact'); + $row['data'] = $last_contact; + $table->data['last_contact'] = $row; + + $row = []; + $row['title'] = __('Remote contact'); + $row['data'] = $last_remote_contact; + $table->data['remote_contact'] = $row; // Next contact (agent). $progress = agents_get_next_contact($id_agente); @@ -681,12 +671,28 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) $row['data'] = ui_progress( $progress, '100%', - '1.5', - '#82b92e', - true + '1.2', + '#ececec', + true, + '', + false, + 'line-height: 13px;' ); $table->data['next_contact'] = $row; + // Edit agent button. + $row = []; + $row['title'] = html_print_button( + __('Edit agent'), + 'edit_agent_link', + false, + $urlAgent, + [ 'mode' => 'link' ], + true + ); + $table->data['edit_button'] = $row; + $table->colspan['edit_button'] = 2; + // End of table. $agent_table = html_print_table($table, true); /* @@ -711,7 +717,27 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) } */ // Print agent data toggle. - ui_toggle($agent_table, ''.__('Agent data').'', '', '', false, false, '', 'white-box-content', 'white_table_graph'); + ui_toggle( + $agent_table, + ''.__('Agent data').'', + '', + '', + false, + false, + '', + 'white-box-content', + 'white_table_graph', + '', + '', + false, + false, + false, + '', + '', + null, + null, + true + ); // Advanced data. $table = new StdClass(); @@ -719,8 +745,8 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) $table->class = 'floating_form'; $table->id = 'tree_view_agent_advanced'; $table->style = []; - $table->style['title'] = 'height: 46px; width: 30%; padding-right: 5px; text-align: end;'; - $table->style['data'] = 'height: 46px; width: 70%; padding-left: 5px; font-family: \'Pandora-Regular\';'; + $table->style['title'] = 'height: 32px; width: 30%; padding-right: 5px; text-align: end;'; + $table->style['data'] = 'height: 32px; width: 70%; padding-left: 5px; font-family: \'Pandora-Regular\';'; $table->head = []; $table->data = []; @@ -803,8 +829,7 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) // End of table advanced. $table_advanced = html_print_table($table, true); - $table_advanced .= '
    '; - + echo '
    '; ui_toggle( $table_advanced, ''.__('Advanced information').'', @@ -814,7 +839,7 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) false, '', 'white-box-content', - 'white_table_graph' + 'white_table_graph margin-top-20' ); if ($config['agentaccess']) { @@ -825,7 +850,7 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) false ); $access_graph .= '
    '; - + echo '
    '; ui_toggle( $access_graph, ''.__('Agent access rate (24h)').'', @@ -835,7 +860,7 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) false, '', 'white-box-content', - 'white_table_graph' + 'white_table_graph margin-top-20' ); } @@ -853,7 +878,7 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) $server_id ); $events_graph .= '

    '; - + echo '
    '; ui_toggle( $events_graph, ''.__('Events (24h)').'', @@ -863,7 +888,7 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) false, '', 'white-box-content', - 'white_table_graph' + 'white_table_graph margin-top-20' ); // Table network interfaces diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index f49076c952..d0bc862ac6 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -2813,6 +2813,7 @@ function ui_print_status_image( if ($image_with_css === true) { $shape_status = get_shape_status_set($type); + $shape_status['is_tree_view'] = true; return ui_print_status_sets($type, $title, $return, $shape_status, $extra_info); } else { $imagepath .= '/'.$type; @@ -2970,7 +2971,9 @@ function ui_print_status_sets( $options['style'] .= ' background: '.modules_get_color_status($status).';'; } - if (isset($options['class']) === true) { + if (isset($options['is_tree_view']) === true) { + $options['class'] = 'item_status_tree_view'; + } else if (isset($options['class']) === true) { $options['class'] = $options['class']; } @@ -2992,6 +2995,16 @@ function ui_print_status_sets( $output .= '> 
    '; + if (isset($options['is_tree_view']) === true) { + $output = html_print_div( + [ + 'class' => '', + 'content' => $output, + ], + true + ); + } + if ($return === false) { echo $output; } else { @@ -3004,13 +3017,13 @@ function ui_print_status_sets( * Generates a progress bar CSS based. * Requires css progress.css * - * @param integer $progress Progress. - * @param string $width Width. - * @param integer $height Height in 'em'. - * @param string $color Color. - * @param boolean $return Return or paint (if false). - * @param boolean $text Text to be displayed,by default progress %. - * @param array $ajax Ajax: [ 'page' => 'page', 'data' => 'data' ] Sample: + * @param integer $progress Progress. + * @param string $width Width. + * @param integer $height Height in 'em'. + * @param string $color Color. + * @param boolean $return Return or paint (if false). + * @param boolean $text Text to be displayed,by default progress %. + * @param array $ajax Ajax: [ 'page' => 'page', 'data' => 'data' ] Sample: * [ * 'page' => 'operation/agentes/ver_agente', Target page. * 'interval' => 100 / $agent["intervalo"], Ask every interval seconds. @@ -3021,6 +3034,8 @@ function ui_print_status_sets( * ], * ]. * + * @param string $otherStyles Raw styles for control. + * * @return string HTML code. */ function ui_progress( @@ -3030,7 +3045,8 @@ function ui_progress( $color='#82b92e', $return=true, $text='', - $ajax=false + $ajax=false, + $otherStyles='' ) { if (!$progress) { $progress = 0; @@ -3052,7 +3068,7 @@ function ui_progress( ui_require_css_file('progress'); $output = ''; + $output .= '" style="width: '.$width.'; height: '.$height.'em; border-color: '.$color.'; '.$otherStyles.'">'; $output .= ''; $output .= ''; @@ -4100,6 +4116,7 @@ function ui_print_event_priority( * @param string $toggl_attr Main box extra attributes. * @param boolean|null $switch_on Switch enabled disabled or depending on hidden_Default. * @param string|null $switch_name Use custom switch input name or generate one. + * @param boolean|null $disableToggle If True, the toggle is disabled. * * @return string HTML. */ @@ -4121,23 +4138,33 @@ function ui_toggle( $attributes_switch='', $toggl_attr='', $switch_on=null, - $switch_name=null + $switch_name=null, + $disableToggle=false ) { // Generate unique Id. $uniqid = uniqid(''); - $image_a = html_print_image( - $img_a, - true, - [ 'style' => 'object-fit: contain;' ], - true - ); - $image_b = html_print_image( - $img_b, - true, - [ 'style' => 'object-fit: contain;' ], - true - ); + if (empty($img_a) === false) { + $image_a = html_print_image( + $img_a, + true, + [ 'style' => 'object-fit: contain;' ], + true + ); + } else { + $image_a = ''; + } + + if (empty($img_b) === false) { + $image_b = html_print_image( + $img_b, + true, + [ 'style' => 'object-fit: contain;' ], + true + ); + } else { + $image_b = ''; + } // Options. $style = 'overflow:hidden;width: -webkit-fill-available;width: -moz-fill-available;'; @@ -4165,7 +4192,7 @@ function ui_toggle( // Link to toggle. $output = '
    '; - $output .= '
    '; + $output .= '
    '; if ($reverseImg === false) { if ($switch === true) { if (empty($switch_name) === true) { @@ -4241,45 +4268,48 @@ function ui_toggle( $output .= '
    '; $output .= '
    '; - // JQuery Toggle. - $output .= ''; + if ($disableToggle === false) { + // JQuery Toggle. + $output .= ''; + } + $output .= '
    '; if (!$return) { diff --git a/pandora_console/include/javascript/fixed-bottom-box.js b/pandora_console/include/javascript/fixed-bottom-box.js index 88fea06f22..1943106deb 100644 --- a/pandora_console/include/javascript/fixed-bottom-box.js +++ b/pandora_console/include/javascript/fixed-bottom-box.js @@ -101,13 +101,17 @@ self._renderHead = function(head) { head = head || self._head; + var headBody = $("
    "); + headBody.addClass("fixed-bottom-box-head-body"); var headClose = $(""); headClose.addClass("fixed-bottom-box-head-close").click(function(event) { self.close(); }); self._box.head = $("
    "); - self._box.head.addClass("fixed-bottom-box-head").append(headClose); + self._box.head + .addClass("fixed-bottom-box-head") + .append(headClose, headBody); self._box.append(self._box.head); self.emit("head-rendered", { diff --git a/pandora_console/include/javascript/tree/TreeController.js b/pandora_console/include/javascript/tree/TreeController.js index 389215a183..69a308ac69 100644 --- a/pandora_console/include/javascript/tree/TreeController.js +++ b/pandora_console/include/javascript/tree/TreeController.js @@ -239,8 +239,10 @@ var TreeController = { } if (type == "services") { - var $counters = $("
    "); - $counters.addClass("tree-node-counters"); + var $counters = $(""); + $counters + .addClass("tree-node-counters") + .addClass("tree-node-service-counters"); if ( counters.total_services + @@ -648,11 +650,11 @@ var TreeController = { element.icon.length > 0 ) { $content.append( - '
    ' + '" />
    ' ); } else if ( typeof element.iconHTML != "undefined" && @@ -728,8 +730,11 @@ var TreeController = { typeof element.statusImageHTML != "undefined" && element.statusImageHTML.length > 0 ) { + console.log("es aqui pollito agente"); var $statusImage = $(element.statusImageHTML); - $statusImage.addClass("agent-status"); + $statusImage.addClass("node-icon"); + $statusImage.addClass("node-status"); + //$statusImage.addClass("agent-status"); $content.append($statusImage); } @@ -809,8 +814,6 @@ var TreeController = { } if (element.name !== null) { - console.log(element.name); - console.log("2"); $content.append("   " + element.name); } @@ -853,13 +856,12 @@ var TreeController = { } if (element.name !== null) { - console.log(element.name); - console.log("3"); $content.append("   " + element.name); } break; case "services": + $content.addClass("node-service"); if ( typeof element.statusImageHTML != "undefined" && element.statusImageHTML.length > 0 @@ -874,7 +876,7 @@ var TreeController = { (element.title ? element.title : element.name) + '" data-use_title_for_force_title="1" src="' + (controller.baseURL.length > 0 ? controller.baseURL : "") + - 'images/info@svg.svg" class="img_help" ' + + 'images/info@svg.svg" style="width: 16px" class="img_help" ' + ' alt="' + element.name + '"/> '; @@ -903,14 +905,24 @@ var TreeController = { typeof element.elementDescription !== "undefined" && element.elementDescription != "" ) { - $content.append(" " + element.elementDescription); + $content.append( + '' + + element.elementDescription + + "" + ); } else if ( typeof element.description !== "undefined" && element.description != "" ) { - $content.append(" " + element.description); + $content.append( + '' + + element.description + + "" + ); } else { - $content.append('' + element.name + ""); + $content.append( + '' + element.name + "" + ); } } else { $content.remove($node); @@ -975,6 +987,8 @@ var TreeController = { $statusImage.addClass("module-status"); $content.append($statusImage); + } else { + $content.addClass("module-only-caption"); } element.name = htmlDecode(element.name); @@ -1174,7 +1188,7 @@ var TreeController = { element.icon.length > 0 ) { $content.append( - '
    ' + + '' + element.name + "" ); diff --git a/pandora_console/include/lib/Dashboard/Widgets/tree_view.php b/pandora_console/include/lib/Dashboard/Widgets/tree_view.php index 2c0441ead8..bdb30b16ce 100644 --- a/pandora_console/include/lib/Dashboard/Widgets/tree_view.php +++ b/pandora_console/include/lib/Dashboard/Widgets/tree_view.php @@ -571,15 +571,17 @@ class TreeViewWidget extends Widget $base_url = \ui_get_full_url('/'); // Spinner. - $output .= \html_print_image( + $output .= ui_print_spinner(__('Loading'), true); + /* + $output .= \html_print_image( 'images/spinner.gif', true, [ 'class' => 'loading_tree', 'style' => 'display: none;', ] - ); - + ); + */ // Container tree. $style = 'height:'.$height.'px; width:'.$width.'px;'; $style .= 'text-align: left; padding:10px;'; diff --git a/pandora_console/include/styles/fixed-bottom-box.css b/pandora_console/include/styles/fixed-bottom-box.css index b98861c214..b8882ee0a2 100644 --- a/pandora_console/include/styles/fixed-bottom-box.css +++ b/pandora_console/include/styles/fixed-bottom-box.css @@ -25,20 +25,12 @@ div.fixed-bottom-box { /* Overrides end */ div.fixed-bottom-box > div.fixed-bottom-box-head { - width: 20px !important; - height: 30px; + width: 100% !important; + height: 40px; line-height: 30px; vertical-align: middle; position: absolute; - top: 10px; - right: 20px; - /* background-color: #3f3f3f; */ - /* border-radius: 10px 10px 0 0; */ - /* -moz-border-radius: 10px 10px 0 0; */ - /* -webkit-border-radius: 10px 10px 0 0; */ - /* -o-border-radius: 10px 10px 0 0; */ - /* -ms-border-radius: 10px 10px 0 0; */ - /* -khtml-border-radius: 10px 10px 0 0; */ + border-bottom: 1px solid #aeaeae; } div.fixed-bottom-box @@ -60,39 +52,21 @@ div.fixed-bottom-box background-image: url(../../images/close@svg.svg); background-repeat: no-repeat; background-position: center; - float: right; + position: absolute; + top: 10px; + right: 20px; } div.fixed-bottom-box > div.fixed-bottom-box-head > div.fixed-bottom-box-head-body:hover { cursor: pointer; - /* - background-color: #747474; - - border-radius: inherit; - -moz-border-radius: inherit; - -webkit-border-radius: inherit; - -o-border-radius: inherit; - -ms-border-radius: inherit; - -khtml-border-radius: inherit; - */ } div.fixed-bottom-box > div.fixed-bottom-box-head > span.fixed-bottom-box-head-close:hover { cursor: pointer; - /* - background-color: #747474; - - border-radius: 0 10px 0 0; - -moz-border-radius: 0 10px 0 0; - -webkit-border-radius: 0 10px 0 0; - -o-border-radius: 0 10px 0 0; - -ms-border-radius: 0 10px 0 0; - -khtml-border-radius: 0 10px 0 0; - */ } div.fixed-bottom-box.fixed-bottom-box-hided @@ -119,5 +93,6 @@ div.fixed-bottom-box > div.fixed-bottom-box-content { box-sizing: border-box; width: 100% !important; height: 100% !important; + max-height: 100% !important; border-left: 1px solid #aeaeae; } diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index e4f71b3c06..ad0f9579c2 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -1123,6 +1123,9 @@ p.center { margin-bottom: 10px; } +.margin-top-20 { + margin-top: 20px; +} .margin-bottom-20 { margin-bottom: 20px; } @@ -11007,3 +11010,11 @@ p.trademark-copyright { height: 80%; overflow: auto; } + +.item_status_tree_view { + position: absolute; + top: 7px; + left: 8px; + width: 24px; + height: 24px; +} diff --git a/pandora_console/include/styles/tree.css b/pandora_console/include/styles/tree.css index 5741ba280b..1da0b7650c 100644 --- a/pandora_console/include/styles/tree.css +++ b/pandora_console/include/styles/tree.css @@ -19,20 +19,42 @@ float: right; } +.tree-node .node-content.node-service { + display: flex; + flex-wrap: nowrap; + align-items: center; + justify-content: flex-start; +} .tree-node img { padding: 10px; } .tree-node .node-icon { - background-position: 10px; - background-repeat: no-repeat; width: 40px; - height: 38px; display: inline-block; box-sizing: border-box; border-right: 1px solid #aeaeae; } +.tree-node .node-icon .node-icon-container { + display: flex; + align-items: center; + justify-content: center; + height: 38px; +} + +.tree-node .node-icon .node-icon-container img { + padding: 0; + width: 20px; +} +.tree-node .node-status { + width: 40px; + height: 38px; + border-radius: 7px 0 0 7px; + padding: 1px; + box-sizing: border-box; + position: absolute; +} .tree-node .node-name { position: relative; top: -15px; @@ -51,6 +73,7 @@ background-repeat: repeat-y; */ min-height: 26px; + margin-top: 8px; } div.tree-node { @@ -67,10 +90,9 @@ div.tree-node span { .node-content { border: 1px solid #aeaeae; border-radius: 8px; - width: calc(100% - 40px); + width: calc(100% - 50px); box-sizing: border-box; height: 40px; - /*height: 26px;*/ font-size: 1.2em; display: flex; flex-direction: row; @@ -80,7 +102,7 @@ div.tree-node span { .node-content > img { position: relative; - top: -2px; + /*top: -2px;*/ } .node-content:hover { @@ -93,8 +115,7 @@ div.tree-node span { .leaf-icon { width: 18px; - /*height: 20px;*/ - height: 35px; + height: 32px; } .node-content, @@ -108,45 +129,28 @@ div.tree-node span { } .tree-node.leaf-open > .leaf-icon { - background-image: url(../../images/tree/last_expanded.png); - cursor: pointer; -} - -.tree-node.tree-first.leaf-open > .leaf-icon { - background-image: url(../../images/tree/first_expanded.png); - cursor: pointer; + background-image: url(../../images/minus.svg); } .tree-node.leaf-closed > .leaf-icon { - background-image: url(../../images/tree/last_closed.png); - cursor: pointer; + background-image: url(../../images/plus.svg); } - -.tree-node.tree-first.leaf-closed > .leaf-icon { - background-image: url(../../images/tree/first_closed.png); - cursor: pointer; -} - -.tree-node.leaf-loading > .leaf-icon { - background-image: url(../../images/tree/last_expanded.png); -} - -.tree-node.leaf-empty > .leaf-icon { - background-image: url(../../images/tree/last_leaf.png); -} - -.tree-node.tree-first.leaf-empty > .leaf-icon { - background-image: url(../../images/tree/first_leaf.png); -} - +.tree-node.leaf-open > .leaf-icon, +.tree-node.tree-first.leaf-open > .leaf-icon, +.tree-node.leaf-closed > .leaf-icon, +.tree-node.tree-first.leaf-closed > .leaf-icon, +.tree-node.leaf-loading > .leaf-icon, +.tree-node.leaf-empty > .leaf-icon, +.tree-node.tree-first.leaf-empty > .leaf-icon, .tree-node.leaf-error > .leaf-icon { - background-image: url(../../images/tree/last_leaf.png); + cursor: pointer; } .tree-node > .leaf-icon { - background-position: 0px 0px; + background-position: 0px 11px; background-repeat: no-repeat; - width: 17px; + float: left; + margin-right: 10px; } .tree-node > .node-content > img { @@ -168,31 +172,48 @@ div.tree-node span { border-bottom-left-radius: 6px; height: 38px; position: relative; +} + +.tree-node > .node-content > .agent-status.status_balls { top: -1px; } + .tree-node > .node-content > .module-status.status_small_balls { - top: -8px; + /*top: -8px;*/ } .tree-node > .node-content > .module-name { margin: 0 0 0 1em; /*width: 250px;*/ width: 55%; - display: inline-block; + /*display: inline-block;*/ + flex: 1 1 80%; position: relative; font-weight: bold; } +.tree-node > .node-content > .module-name-parent.module-only-caption { + top: 9px; +} + +.tree-node > .node-content.module-only-caption > .module-name { + top: 7px; +} + +/*.node-content.module.module-only-caption:not(:first-of-type) { + margin-top: 8px; +}*/ .tree-node > .node-content > .module-name-alias { font-size: 12pt; font-weight: normal; top: 8px; + margin-left: 3.3em; } .tree-node > .node-content > .module-name-parent { font-size: 12pt; margin-left: 0.5em; - top: -14px; + top: -4px; } .tree-node > .node-content > .module-value { @@ -233,6 +254,9 @@ div.tree-node span { right: 10px; } +.tree-node > .node-content > .tree-node-counters.tree-node-service-counters { + top: 0; +} .tree-node > .node-content > img { vertical-align: middle; } @@ -272,15 +296,21 @@ div#tree-controller-recipient { .tree-group .node-content { position: relative; - top: -10px; + /*top: -10px;*/ } .tree-group .node-content.module { - top: -12px; + /*top: -12px;*/ + /* top: -35px; */ + display: flex; + flex-wrap: nowrap; + flex-direction: row; + align-items: center; + width: calc(100% - 50px); + margin: 8px 0 0 8px; } .node-content .module-button { - margin-top: 5px; padding: 6px; } @@ -289,3 +319,17 @@ div#tree-controller-recipient { background-color: #fff; border-radius: 8px; } +.tree-group .node-content.module:last-child { + margin-bottom: 15px; +} + +.tree-node.leaf-open:last-child, +.tree-node.leaf-closed:last-child, +.tree-node.leaf-empty:last-child { + margin-bottom: 8px; +} + +.tree-root > .tree-node { + margin-top: 0; + margin-bottom: 10px; +} diff --git a/pandora_console/operation/tree.php b/pandora_console/operation/tree.php index d1aa8f5448..a91be60326 100755 --- a/pandora_console/operation/tree.php +++ b/pandora_console/operation/tree.php @@ -310,16 +310,17 @@ ui_include_time_picker(); ui_require_jquery_file('ui.datepicker-'.get_user_language(), 'include/javascript/i18n/'); ui_require_javascript_file('TreeController', 'include/javascript/tree/'); - -html_print_image( +ui_print_spinner(__('Loading')); +/* + html_print_image( 'images/spinner.gif', false, [ 'class' => 'loading_tree', 'style' => 'display: none;', ] -); - + ); +*/ html_print_div( [ 'id' => 'tree-controller-recipient', @@ -356,7 +357,8 @@ enterprise_hook('close_meta_frame'); if (typeof treeController.recipient != 'undefined' && treeController.recipient.length > 0) treeController.recipient.empty(); - $(".loading_tree").show(); + showSpinner(); + //$(".loading_tree").show(); var parameters = {}; parameters['page'] = "include/ajax/tree.ajax"; @@ -407,7 +409,8 @@ enterprise_hook('close_meta_frame'); data: parameters, success: function(data) { if (data.success) { - $(".loading_tree").hide(); + hideSpinner(); + //$(".loading_tree").hide(); var foundMessage = ''; if (data.tree.length === 0) { foundMessage = ""; From 251fc46d1772264121cae84d781d01b85330980f Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Thu, 26 Jan 2023 13:43:03 +0100 Subject: [PATCH 119/563] Resolve issue with filters --- pandora_console/include/styles/pandora.css | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index ad0f9579c2..35cc36229d 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -10797,14 +10797,20 @@ pre.external_tools_output { } .fixed_filter_bar input, -.fixed_filter_bar .select2-container .select2-selection--single { +.filter_table input, +.fixed_filter_bar .select2-container .select2-selection--single, +.filter_table .select2-container .select2-selection--single { height: 32px !important; } -.fixed_filter_bar .select2-selection__arrow { +.fixed_filter_bar .select2-selection__arrow, +.filter_table .select2-selection__arrow { top: -4px !important; } - +.filter_table + .select2-container + .select2-selection--single + .select2-selection__rendered, .fixed_filter_bar .select2-container .select2-selection--single @@ -10813,6 +10819,10 @@ pre.external_tools_output { } .fixed_filter_bar + .select2-container--default + .select2-search--dropdown + .select2-search__field, +.filter_table .select2-container--default .select2-search--dropdown .select2-search__field { From deb69a0659fa7f779ce763d21e3a363cc3451e4f Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Thu, 26 Jan 2023 16:00:08 +0100 Subject: [PATCH 120/563] Fix issue with info box messages --- pandora_console/include/functions_ui.php | 34 +++++++------------ pandora_console/include/javascript/pandora.js | 12 +++++++ pandora_console/index.php | 16 +++++++++ 3 files changed, 41 insertions(+), 21 deletions(-) diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index d0bc862ac6..a008104594 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -378,33 +378,25 @@ function ui_print_message($message, $class='', $attributes='', $return=false, $t // JavaScript help vars. $messageCreated = html_print_table($messageTable, true); $autocloseTime = ((int) $config['notification_autoclose_time'] * 1000); - $definedMessageTop = '20'; - ob_start(); - ?> - - $id, - 'style' => 'top: 120px;', - 'class' => 'info_box_container', - 'content' => $jsCode.$messageCreated, + 'style' => 'top: '.$position.'px;', + 'class' => $classes, + 'content' => $messageCreated, ], true ); diff --git a/pandora_console/include/javascript/pandora.js b/pandora_console/include/javascript/pandora.js index 03a2ec8fe3..2b2eb1d23f 100644 --- a/pandora_console/include/javascript/pandora.js +++ b/pandora_console/include/javascript/pandora.js @@ -2296,3 +2296,15 @@ $(document).ready(function() { }); } }); + +function close_info_box(id) { + $("#" + id).fadeOut("slow", function() { + $("#" + id).remove(); + }); +} + +function autoclose_info_box(id, autoCloseTime) { + setTimeout(() => { + close_info_box(id); + }, autoCloseTime); +} diff --git a/pandora_console/index.php b/pandora_console/index.php index 6e9390fd90..ab6a664307 100755 --- a/pandora_console/index.php +++ b/pandora_console/index.php @@ -42,6 +42,11 @@ if (__PAN_XHPROF__ === 1) { } } +// Needed for InfoBox count. +if (isset($_SESSION['info_box_count']) === true) { + $_SESSION['info_box_count'] = 0; +} + // Set character encoding to UTF-8 // fixes a lot of multibyte character issues. if (function_exists('mb_internal_encoding') === true) { @@ -1674,6 +1679,17 @@ require 'include/php_to_js_values.php'; "html" ); } + + // Info messages action. + $(document).ready(function() { + var $autocloseTime = ; + var $listOfMessages = document.querySelectorAll('.info_box_autoclose'); + $listOfMessages.forEach( + function(item) { + autoclose_info_box(item.id, $autocloseTime) + } + ); + }); Date: Fri, 27 Jan 2023 12:41:06 +0100 Subject: [PATCH 121/563] fix filter events sounds pandora_enterprise#10188 --- pandora_console/include/ajax/events.php | 31 ++++++++++++++++++++ pandora_console/include/functions_events.php | 1 - 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/pandora_console/include/ajax/events.php b/pandora_console/include/ajax/events.php index d9be30cc33..bfff7a1171 100644 --- a/pandora_console/include/ajax/events.php +++ b/pandora_console/include/ajax/events.php @@ -2493,6 +2493,37 @@ if ($get_events_fired) { $filter = events_get_event_filter($filter_id); } + if (is_metaconsole() === true) { + $servers = metaconsole_get_servers(); + if (is_array($servers) === true) { + $servers = array_reduce( + $servers, + function ($carry, $item) { + $carry[$item['id']] = $item['server_name']; + return $carry; + } + ); + } else { + $servers = []; + } + + if ($filter['server_id'] === '') { + $filter['server_id'] = array_keys($servers); + } else { + if (is_array($filter['server_id']) === false) { + if (is_numeric($filter['server_id']) === true) { + if ($filter['server_id'] !== 0) { + $filter['server_id'] = [$filter['server_id']]; + } else { + $filter['server_id'] = array_keys($servers); + } + } else { + $filter['server_id'] = explode(',', $filter['server_id']); + } + } + } + } + // Set time. $filter['event_view_hr'] = 0; diff --git a/pandora_console/include/functions_events.php b/pandora_console/include/functions_events.php index 3740257717..48ef7b2c30 100644 --- a/pandora_console/include/functions_events.php +++ b/pandora_console/include/functions_events.php @@ -4948,7 +4948,6 @@ function events_page_general_acknowledged($event_id) global $config; $Acknowledged = ''; $event = db_get_row('tevento', 'id_evento', $event_id); - hd($event['ack_utimestamp'], true); if ($event !== false && $event['estado'] == 1) { $user_ack = db_get_value( 'fullname', From 34fede2ce103f9c9add426828ddf8a2cbe7aa61e Mon Sep 17 00:00:00 2001 From: Jonathan Date: Fri, 27 Jan 2023 12:42:23 +0100 Subject: [PATCH 122/563] #9819 New section configuration sound event --- pandora_console/extras/mr/65.sql | 10 + .../godmode/events/configuration_sounds.php | 71 +++ pandora_console/include/ajax/events.php | 5 + .../include/class/EventSound.class.php | 495 ++++++++++++++++++ .../operation/events/sound_events.php | 5 + pandora_console/operation/menu.php | 4 + 6 files changed, 590 insertions(+) create mode 100644 pandora_console/extras/mr/65.sql create mode 100644 pandora_console/godmode/events/configuration_sounds.php create mode 100644 pandora_console/include/class/EventSound.class.php diff --git a/pandora_console/extras/mr/65.sql b/pandora_console/extras/mr/65.sql new file mode 100644 index 0000000000..7e65e62c2f --- /dev/null +++ b/pandora_console/extras/mr/65.sql @@ -0,0 +1,10 @@ +START TRANSACTION; + +CREATE TABLE `tevent_sound` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` TEXT NULL, + `sound` TEXT NULL, + `active` TINYINT NOT NULL DEFAULT '1', +PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +COMMIT; diff --git a/pandora_console/godmode/events/configuration_sounds.php b/pandora_console/godmode/events/configuration_sounds.php new file mode 100644 index 0000000000..d4e9d77688 --- /dev/null +++ b/pandora_console/godmode/events/configuration_sounds.php @@ -0,0 +1,71 @@ + '[EventSound]'.$e->getMessage() ]); + exit; + } else { + echo '[EventSound]'.$e->getMessage(); + } + + // Stop this execution, but continue 'globally'. + return; +} + +// AJAX controller. +if ((bool) is_ajax() === true) { + $method = get_parameter('method'); + + if (method_exists($controller, $method) === true) { + if ($controller->ajaxMethod($method) === true) { + $controller->{$method}(); + } else { + $controller->error('Unavailable method.'); + } + } else { + $controller->error('Method not found. ['.$method.']'); + } + + // Stop any execution. + exit; +} else { + // Run. + $controller->run(); +} diff --git a/pandora_console/include/ajax/events.php b/pandora_console/include/ajax/events.php index d9be30cc33..2f06006f0b 100644 --- a/pandora_console/include/ajax/events.php +++ b/pandora_console/include/ajax/events.php @@ -2348,6 +2348,11 @@ if ($drawConsoleSound === true) { 'Star_Trek_emergency_simulation.wav' => 'StarTrek emergency simulation', ]; + $eventsounds = mysql_db_get_all_rows_sql('SELECT * FROM tevent_sound WHERE active = 1'); + foreach ($eventsounds as $key => $row) { + $sounds[$row['sound']] = $row['name']; + } + $inputs[] = [ 'class' => 'test-sounds', 'direct' => 1, diff --git a/pandora_console/include/class/EventSound.class.php b/pandora_console/include/class/EventSound.class.php new file mode 100644 index 0000000000..93f42ec7c4 --- /dev/null +++ b/pandora_console/include/class/EventSound.class.php @@ -0,0 +1,495 @@ +ajaxController = $ajaxController; + } + + + /** + * Run view + * + * @return void + */ + public function run() + { + global $config; + $tab = get_parameter('tab', ''); + $action = get_parameter('action', ''); + $message_ok = 0; + $error_msg = __('Name already exist'); + $ok_msg = __('Successfully created'); + + if ($action == 'create') { + $name = get_parameter('name', ''); + $sound = get_parameter('file', ''); + + $exist = db_get_all_rows_sql(sprintf('SELECT * FROM tevent_sound WHERE name = "%s"', $name)); + + if ($exist === false) { + $uploadMaxFilesize = config_return_in_bytes(ini_get('upload_max_filesize')); + + $upload_status = get_file_upload_status('file'); + $upload_result = translate_file_upload_status($upload_status); + if ($uploadMaxFilesize < $sound['size']) { + $error_msg = __('File is too large to upload. Check the configuration in php.ini.'); + } else { + $pathname = $config['homedir'].'/include/sounds/'; + $nameSound = str_replace(' ', '_', $_FILES['file']['name']); + $target_file = $pathname.basename($nameSound); + + if (file_exists($target_file)) { + $error_msg = __('Sound already are exists.'); + } else { + if (move_uploaded_file($_FILES['file']['tmp_name'], $target_file)) { + $insert = db_process_sql_insert( + 'tevent_sound', + [ + 'name' => $name, + 'sound' => $nameSound, + ] + ); + $ok_msg = __('Successfully created'); + } else { + $error_msg = __('Fail uploading the sound'); + } + } + } + + if ($insert > 0) { + $tab = ''; + $message_ok = 1; + } + } else { + $error_msg = __('Sound already are exists'); + } + } else if ($action == 'change_action') { + $id = get_parameter('id', ''); + $new_action = (int) get_parameter('set_action', '1'); + + $exist = db_get_all_rows_sql(sprintf('SELECT * FROM tevent_sound WHERE id = "%s"', $id)); + + if ($exist !== false) { + $result = db_process_sql_update( + 'tevent_sound', + ['active' => $new_action], + ['id' => $id] + ); + if (false === (bool) $result) { + $error_msg = __('Error on update status'); + } else { + $message_ok = 1; + } + } else { + $error_msg = __('Sound not exist'); + } + } + + if ($action) { + ui_print_result_message( + $message_ok, + $ok_msg, + $error_msg, + '', + false + ); + } + + $base_url = 'index.php?sec=eventos&sec2=godmode/events/configuration_sounds'; + $setup_url = $base_url.'&tab=add'; + $tabs = [ + 'list' => [ + 'text' => ''.html_print_image( + 'images/eye_show.png', + true, + [ + 'title' => __('Sounds'), + 'class' => 'invert_filter', + ] + ).'', + 'active' => (bool) ($tab != 'add'), + ], + 'options' => [ + 'text' => ''.html_print_image( + 'images/pen.png', + true, + [ + 'title' => __('Create'), + 'class' => 'invert_filter', + ] + ).'', + 'active' => (bool) ($tab == 'add'), + ], + ]; + + if ($tab === 'add') { + $helpHeader = ''; + $titleHeader = __('Add new sound'); + } else { + $helpHeader = 'servers_ha_clusters_tab'; + $titleHeader = __('Events sound list'); + } + + // Header. + ui_print_standard_header( + $titleHeader, + 'images/gm_servers.png', + false, + $helpHeader, + false, + $tabs, + [ + [ + 'link' => '', + 'label' => __('Events'), + ], + [ + 'link' => '', + 'label' => __('Configuration Sounds'), + ], + ] + ); + + // Javascript. + ui_require_jquery_file('pandora'); + // CSS. + ui_require_css_file('wizard'); + ui_require_css_file('discovery'); + + if ($tab === 'add') { + echo '
    '; + $table = new stdClass(); + $table->width = '100%'; + + $table->class = 'databox filters'; + $table->data = []; + $table->data[0][0] = __('Name:'); + + $table->data[0][1] = html_print_input_text( + 'name', + '', + '', + 80, + 100, + true, + false, + true + ); + + $table->data[1][0] = __('WAV Sound'); + $table->data[1][1] = html_print_input_file('file', true, ['required' => true]); + + html_print_table($table); + + echo '
    '; + html_print_submit_button( + __('Create'), + 'save_sound', + false, + 'class="sub wand"' + ); + echo '
    '; + echo '
    '; + + // Load own javascript file. + echo $this->loadJS(); + } else { + // Datatables list. + try { + $columns = [ + 'name', + 'sound', + [ + 'text' => 'options', + 'class' => 'action_buttons mw120px', + ], + ]; + + $column_names = [ + __('Name'), + __('Sound'), + __('Options'), + ]; + + $this->tableId = 'event_sounds'; + + if (is_metaconsole() === true) { + // Only in case of Metaconsole, format the frame. + open_meta_frame(); + } + + // Load datatables user interface. + ui_print_datatable( + [ + 'id' => $this->tableId, + 'class' => 'info_table', + 'style' => 'width: 100%', + 'columns' => $columns, + 'column_names' => $column_names, + 'ajax_url' => $this->ajaxController, + 'ajax_data' => ['method' => 'draw'], + 'no_sortable_columns' => [-1], + 'order' => [ + 'field' => 'id', + 'direction' => 'asc', + ], + 'search_button_class' => 'sub filter', + 'form' => [ + 'inputs' => [ + [ + 'label' => __('Free search').ui_print_help_tip(__('Search filter by Name or Sound fields content'), true), + 'type' => 'text', + 'class' => 'w200px', + 'id' => 'filter_text', + 'name' => 'filter_text', + ], + [ + 'label' => __('Active'), + 'type' => 'select', + 'fields' => [ + '' => __('All'), + '0' => __('No'), + '1' => __('Yes'), + ], + 'class' => 'w100px', + 'id' => 'active', + 'name' => 'active', + ], + ], + ], + ] + ); + } catch (Exception $e) { + echo $e->getMessage(); + } + + if (is_metaconsole() === true) { + // Close the frame. + close_meta_frame(); + } + + // Load own javascript file. + echo $this->loadJS(); + } + } + + + /** + * Get the data for draw the table. + * + * @return void. + */ + public function draw() + { + global $config; + // Initialice filter. + $filter = '1=1'; + // Init data. + $data = []; + // Count of total records. + $count = 0; + // Catch post parameters. + $start = get_parameter('start', 0); + $length = get_parameter('length', $config['block_size']); + // There is a limit of (2^32)^2 (18446744073709551615) rows in a MyISAM table, show for show all use max nrows. + $length = ($length != '-1') ? $length : '18446744073709551615'; + $order = get_datatable_order(); + $filters = get_parameter('filter', []); + $filterText = $filters['filter_text']; + $filterActive = $filters['active']; + + if (empty($filterText) === false) { + $filter .= sprintf( + " AND (name LIKE '%%%s%%' OR sound LIKE '%%%s%%')", + $filterText, + $filterText + ); + } + + if (in_array($filterActive, [0, 1])) { + $filter .= sprintf( + ' AND active = %s', + $filterActive, + ); + } + + $count = (int) db_get_value_sql(sprintf('SELECT COUNT(*) as "total" FROM tevent_sound WHERE %s', $filter)); + + $sql = sprintf( + 'SELECT * + FROM tevent_sound + WHERE %s + ORDER BY %s + LIMIT %d, %d', + $filter, + $order, + $start, + $length + ); + $data = db_get_all_rows_sql($sql); + + foreach ($data as $key => $row) { + if ($row['active'] === '1') { + $img = 'images/lightbulb.png'; + $action = __('Disable sound'); + $new_action = 0; + } else { + $img = 'images/lightbulb_off.png'; + $action = __('Enable sound'); + $new_action = 1; + } + + $options = ''; + $options .= html_print_image( + $img, + true, + [ + 'title' => $action, + 'class' => 'invert_filter', + ] + ); + $options .= ''; + + $data[$key]['options'] = $options; + } + + echo json_encode( + [ + 'data' => $data, + 'recordsTotal' => $count, + 'recordsFiltered' => $count, + ] + ); + } + + + /** + * Checks if target method is available to be called using AJAX. + * + * @param string $method Target method. + * + * @return boolean True allowed, false not. + */ + public function ajaxMethod(string $method) + { + return in_array($method, $this->AJAXMethods); + } + + + /** + * Load Javascript code. + * + * @return string. + */ + public function loadJS() + { + // Nothing for this moment. + ob_start(); + + // Javascript content. + ?> + + 'StarTrek emergency simulation', ]; +$eventsounds = mysql_db_get_row_sql('SELECT * FROM tevent_sound WHERE active = 1'); +foreach ($eventsounds as $key => $row) { + $sounds[$row['sound']] = $row['name']; +} + $inputs[] = [ 'label' => \__('Sounds'), 'class' => 'flex-row', diff --git a/pandora_console/operation/menu.php b/pandora_console/operation/menu.php index bb0802a567..fd681495be 100644 --- a/pandora_console/operation/menu.php +++ b/pandora_console/operation/menu.php @@ -477,6 +477,10 @@ if ($access_console_node === true) { } Date: Fri, 27 Jan 2023 12:44:15 +0100 Subject: [PATCH 123/563] blink button test sound events pandora_enterprise#10189 --- .../include/javascript/pandora_events.js | 2 + .../include/styles/sound_events.css | 56 +++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/pandora_console/include/javascript/pandora_events.js b/pandora_console/include/javascript/pandora_events.js index c2ee675f0d..92eadf14fe 100644 --- a/pandora_console/include/javascript/pandora_events.js +++ b/pandora_console/include/javascript/pandora_events.js @@ -1030,8 +1030,10 @@ function openSoundEventModal(settings) { function test_sound_button(test_sound, urlSound) { if (test_sound === true) { + $("#button-melody_sound").addClass("blink-image"); add_audio(urlSound); } else { + $("#button-melody_sound").removeClass("blink-image"); remove_audio(); } } diff --git a/pandora_console/include/styles/sound_events.css b/pandora_console/include/styles/sound_events.css index 667446b1e8..9990550fda 100644 --- a/pandora_console/include/styles/sound_events.css +++ b/pandora_console/include/styles/sound_events.css @@ -301,3 +301,59 @@ background: #e63c52; } } + +/* Firefox old*/ +@-moz-keyframes blink { + 0% { + opacity: 1; + } + 50% { + opacity: 0; + } + 100% { + opacity: 1; + } +} + +@-webkit-keyframes blink { + 0% { + opacity: 1; + } + 50% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +/* IE */ +@-ms-keyframes blink { + 0% { + opacity: 1; + } + 50% { + opacity: 0.5; + } + 100% { + opacity: 1; + } +} +/* Opera and prob css3 final iteration */ +@keyframes blink { + 0% { + opacity: 1; + } + 50% { + opacity: 0.5; + } + 100% { + opacity: 1; + } +} +.blink-image { + -moz-animation: blink normal 2s infinite ease-in-out; /* Firefox */ + -webkit-animation: blink normal 2s infinite ease-in-out; /* Webkit */ + -ms-animation: blink normal 2s infinite ease-in-out; /* IE */ + animation: blink normal 2s infinite ease-in-out; /* Opera and prob css3 final iteration */ + filter: hue-rotate(120deg); +} From 7111fd66e2fc23008fb7080dad788d9325d4f95f Mon Sep 17 00:00:00 2001 From: Calvo Date: Fri, 27 Jan 2023 13:43:23 +0100 Subject: [PATCH 124/563] Fix empty module data list view --- pandora_console/operation/agentes/status_monitor.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/operation/agentes/status_monitor.php b/pandora_console/operation/agentes/status_monitor.php index 8da3b9b2ba..82ba6fcfee 100644 --- a/pandora_console/operation/agentes/status_monitor.php +++ b/pandora_console/operation/agentes/status_monitor.php @@ -1939,7 +1939,7 @@ if (!empty($result)) { } else { $sub_string = substr(io_safe_output($row['datos']), 0, 12); if ($module_value == $sub_string) { - if ($module_value == 0 && !$sub_string) { + if ((empty($module_value) === true || $module_value == 0) && !$sub_string) { $salida = 0; } else { $data_macro = modules_get_unit_macro($row['datos'], $row['unit']); From 624463d5739ec26dff469ddede86dc8b31e85d7d Mon Sep 17 00:00:00 2001 From: Jonathan Date: Mon, 30 Jan 2023 08:27:03 +0100 Subject: [PATCH 125/563] #9819 change setcion menu configuration sound --- pandora_console/godmode/menu.php | 4 ++++ pandora_console/operation/menu.php | 5 ----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/pandora_console/godmode/menu.php b/pandora_console/godmode/menu.php index d98eb9d3c6..9dc13b6abb 100644 --- a/pandora_console/godmode/menu.php +++ b/pandora_console/godmode/menu.php @@ -435,6 +435,10 @@ if ((bool) check_acl($config['id_user'], 0, 'PM') === true || (bool) check_acl($ } } + $sub['godmode/events/configuration_sounds']['text'] = __('Configuration Sounds'); + $sub['godmode/events/configuration_sounds']['id'] = 'Configuration Sounds'; + $sub['godmode/events/configuration_sounds']['pages'] = ['godmode/events/configuration_sounds']; + $menu_godmode['gextensions']['sub'] = $sub; } diff --git a/pandora_console/operation/menu.php b/pandora_console/operation/menu.php index fd681495be..c777e1d97b 100644 --- a/pandora_console/operation/menu.php +++ b/pandora_console/operation/menu.php @@ -477,10 +477,6 @@ if ($access_console_node === true) { } Date: Mon, 30 Jan 2023 13:39:27 +0100 Subject: [PATCH 126/563] Polish TreeView --- pandora_console/include/class/Tree.class.php | 1 - .../include/functions_treeview.php | 119 ++++++++---------- pandora_console/include/functions_ui.php | 1 + .../include/javascript/fixed-bottom-box.js | 6 + .../include/javascript/tree/TreeController.js | 22 ++-- .../include/styles/fixed-bottom-box.css | 24 ++-- pandora_console/include/styles/pandora.css | 1 + pandora_console/include/styles/progress.css | 2 +- pandora_console/include/styles/tree.css | 41 ++++-- pandora_console/operation/tree.php | 5 +- 10 files changed, 114 insertions(+), 108 deletions(-) diff --git a/pandora_console/include/class/Tree.class.php b/pandora_console/include/class/Tree.class.php index 2588d3f48f..7daea2bf1f 100644 --- a/pandora_console/include/class/Tree.class.php +++ b/pandora_console/include/class/Tree.class.php @@ -669,7 +669,6 @@ class Tree } $module['statusImageHTML'] = ui_print_status_image($statusType, htmlspecialchars($statusTitle), true); - $module['statusImageHTML'] = 'cipote'; // HTML of the server type image. $module['serverTypeHTML'] = ui_print_servertype_icon((int) $module['server_type']); diff --git a/pandora_console/include/functions_treeview.php b/pandora_console/include/functions_treeview.php index 66bd44847f..bf0874f407 100755 --- a/pandora_console/include/functions_treeview.php +++ b/pandora_console/include/functions_treeview.php @@ -55,7 +55,7 @@ function treeview_printModuleTable($id_module, $server_data=false, $no_head=fals $table = new StdClass(); $table->width = '100%'; - $table->class = 'floating_form margin-top-10'; + $table->class = 'floating_form'; $table->id = 'tree_view_module_data'; $table->style = []; $table->style['title'] = 'height: 32px; width: 30%; padding-right: 5px; text-align: end;'; @@ -70,6 +70,21 @@ function treeview_printModuleTable($id_module, $server_data=false, $no_head=fals $row['data'] = $cellName; $table->data['name'] = $row; + // Edit module button. + $row = []; + $row['title'] = html_print_button( + __('Edit module'), + 'edit_module_link', + false, + 'window.location.assign(\''.$console_url.'index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&id_agente='.$module['id_agente'].'&tab=module&edit_module=1&id_agent_module='.$module['id_agente_modulo'].$url_hash.'\')', + [ + 'mode' => 'link', + 'style' => 'float: right;justify-content: end;padding: 0;', + ], + true + ); + $table->data['edit_button'] = $row; + // Interval. $row = []; $row['title'] = __('Interval'); @@ -304,20 +319,8 @@ function treeview_printModuleTable($id_module, $server_data=false, $no_head=fals $row['data'] = $time_elapsed; $table->data['tags'] = $row; - // Edit module button. - $row = []; - $row['title'] = html_print_button( - __('Edit module'), - 'edit_module_link', - false, - 'window.location.assign(\''.$console_url.'index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&id_agente='.$module['id_agente'].'&tab=module&edit_module=1&id_agent_module='.$module['id_agente_modulo'].$url_hash.'\')', - [ 'mode' => 'link' ], - true - ); - $table->data['edit_button'] = $row; - $table->colspan['edit_button'] = 2; // Title. - echo ''.__('Module information').''; + echo ''; // End of table. html_print_table($table); @@ -562,7 +565,7 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) $table = new StdClass(); $table->width = '100%'; - $table->class = 'floating_form'; + $table->class = 'floating_form border-bottom-gray'; $table->id = 'tree_view_agent_detail'; $table->style = []; $table->style['title'] = 'height: 32px; width: 30%; padding-right: 5px; text-align: end;'; @@ -603,6 +606,22 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) $row['data'] = $cellName; $table->data['name'] = $row; + // Edit agent button. + $row = []; + $row['title'] = html_print_button( + __('Edit agent'), + 'edit_agent_link', + false, + $urlAgent, + [ + 'mode' => 'link', + 'style' => 'float: right;justify-content: end;padding: 0;', + ], + true + ); + $row['data'] = ''; + $table->data['edit_button'] = $row; + // Addresses. $ips = []; $addresses = agents_get_addresses($id_agente); @@ -670,7 +689,7 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) $row['title'] = __('Next agent contact'); $row['data'] = ui_progress( $progress, - '100%', + '80%', '1.2', '#ececec', true, @@ -680,19 +699,6 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) ); $table->data['next_contact'] = $row; - // Edit agent button. - $row = []; - $row['title'] = html_print_button( - __('Edit agent'), - 'edit_agent_link', - false, - $urlAgent, - [ 'mode' => 'link' ], - true - ); - $table->data['edit_button'] = $row; - $table->colspan['edit_button'] = 2; - // End of table. $agent_table = html_print_table($table, true); /* @@ -716,28 +722,10 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) $agent_table .= $go_to_agent; } */ + // Title. + echo ''; // Print agent data toggle. - ui_toggle( - $agent_table, - ''.__('Agent data').'', - '', - '', - false, - false, - '', - 'white-box-content', - 'white_table_graph', - '', - '', - false, - false, - false, - '', - '', - null, - null, - true - ); + echo $agent_table; // Advanced data. $table = new StdClass(); @@ -829,7 +817,6 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) // End of table advanced. $table_advanced = html_print_table($table, true); - echo '
    '; ui_toggle( $table_advanced, ''.__('Advanced information').'', @@ -838,8 +825,8 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) true, false, '', - 'white-box-content', - 'white_table_graph margin-top-20' + 'white-box-content border-bottom-gray', + 'white_table_graph margin-top-10 margin-bottom-10' ); if ($config['agentaccess']) { @@ -850,7 +837,6 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) false ); $access_graph .= '
    '; - echo '
    '; ui_toggle( $access_graph, ''.__('Agent access rate (24h)').'', @@ -859,8 +845,8 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) true, false, '', - 'white-box-content', - 'white_table_graph margin-top-20' + 'white-box-content border-bottom-gray', + 'white_table_graph margin-top-10 margin-bottom-10' ); } @@ -878,7 +864,6 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) $server_id ); $events_graph .= '

    '; - echo '
    '; ui_toggle( $events_graph, ''.__('Events (24h)').'', @@ -888,18 +873,18 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) false, '', 'white-box-content', - 'white_table_graph margin-top-20' + 'white_table_graph margin-bottom-10 border-bottom-gray' ); - // Table network interfaces + // Table network interfaces. $network_interfaces_by_agents = agents_get_network_interfaces([$agent]); $network_interfaces = []; - if (!empty($network_interfaces_by_agents) && !empty($network_interfaces_by_agents[$id_agente])) { + if (empty($network_interfaces_by_agents) === false && empty($network_interfaces_by_agents[$id_agente]) === false) { $network_interfaces = $network_interfaces_by_agents[$id_agente]['interfaces']; } - if (!empty($network_interfaces)) { + if (empty($network_interfaces) === false) { $table = new stdClass(); $table->id = 'agent_interface_info'; $table->class = 'databox'; @@ -911,10 +896,10 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) $table->data = []; foreach ($network_interfaces as $interface_name => $interface) { - if (!empty($interface['traffic'])) { - $permission = check_acl($config['id_user'], $agent['id_grupo'], 'RR'); + if (empty($interface['traffic']) === false) { + $permission = (bool) check_acl($config['id_user'], $agent['id_grupo'], 'RR'); - if ($permission) { + if ($permission === true) { $params = [ 'interface_name' => $interface_name, 'agent_id' => $id_agente, @@ -922,14 +907,14 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) 'traffic_module_out' => $interface['traffic']['out'], ]; - if (defined('METACONSOLE') && !empty($server_id)) { + if (is_metaconsole() === true && empty($server_id) === false) { $params['server'] = $server_id; } $params_json = json_encode($params); $params_encoded = base64_encode($params_json); $url = ui_get_full_url('operation/agentes/interface_traffic_graph_win.php', false, false, false); - $graph_url = "$url?params=$params_encoded"; + $graph_url = $url.'?params='.$params_encoded; $win_handle = dechex(crc32($interface['status_module_id'].$interface_name)); $graph_link = ""; @@ -955,7 +940,7 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) $table->data[] = $data; } - // End of table network interfaces + // End of table network interfaces. $table_interfaces = html_print_table($table, true); $table_interfaces .= '
    '; diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index a008104594..90d8ac041d 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -2917,6 +2917,7 @@ function get_shape_status_set($type) case STATUS_ALERT_NOT_FIRED_BALL: case STATUS_ALERT_DISABLED_BALL: $return = ['class' => 'status_small_balls']; + // $return = ['class' => 'status_balls']; break; default: diff --git a/pandora_console/include/javascript/fixed-bottom-box.js b/pandora_console/include/javascript/fixed-bottom-box.js index 1943106deb..0d07eedb41 100644 --- a/pandora_console/include/javascript/fixed-bottom-box.js +++ b/pandora_console/include/javascript/fixed-bottom-box.js @@ -44,6 +44,7 @@ self._width = params.width || 300; self._height = params.height || 400; + self._headTitle = params.headTitle || ""; self.setWidth = function(width) { if (typeof width !== "number" || width <= 0) @@ -103,6 +104,11 @@ var headBody = $("
    "); headBody.addClass("fixed-bottom-box-head-body"); + headBody.append( + $( + '' + ) + ); var headClose = $(""); headClose.addClass("fixed-bottom-box-head-close").click(function(event) { self.close(); diff --git a/pandora_console/include/javascript/tree/TreeController.js b/pandora_console/include/javascript/tree/TreeController.js index 69a308ac69..3dd22194dc 100644 --- a/pandora_console/include/javascript/tree/TreeController.js +++ b/pandora_console/include/javascript/tree/TreeController.js @@ -622,6 +622,10 @@ var TreeController = { data: postData, success: function(data, textStatus, xhr) { callback(null, data); + console.log(data); + $("#fixed-bottom-box-head-title").html( + $("#fixedBottomHeadTitle").html() + ); }, error: function(xhr, textStatus, errorThrown) { callback(errorThrown); @@ -730,11 +734,9 @@ var TreeController = { typeof element.statusImageHTML != "undefined" && element.statusImageHTML.length > 0 ) { - console.log("es aqui pollito agente"); var $statusImage = $(element.statusImageHTML); $statusImage.addClass("node-icon"); $statusImage.addClass("node-status"); - //$statusImage.addClass("agent-status"); $content.append($statusImage); } @@ -906,7 +908,7 @@ var TreeController = { element.elementDescription != "" ) { $content.append( - '' + + '' + element.elementDescription + "" ); @@ -915,13 +917,15 @@ var TreeController = { element.description != "" ) { $content.append( - '' + + '' + element.description + "" ); } else { $content.append( - '' + element.name + "" + '' + + element.name + + "" ); } } else { @@ -977,14 +981,14 @@ var TreeController = { break; case "module": $content.addClass("module"); - + //console.log(element); $statusImage.addClass("node-status"); // Status image if ( typeof element.statusImageHTML != "undefined" && element.statusImageHTML.length > 0 ) { var $statusImage = $(element.statusImageHTML); - $statusImage.addClass("module-status"); + $statusImage.addClass("node-icon").addClass("node-status"); $content.append($statusImage); } else { @@ -1047,7 +1051,6 @@ var TreeController = { }); actionButtons.append(graphImageHistogram); - //$content.append(graphImageHistogram); } // Graph pop-up @@ -1101,7 +1104,6 @@ var TreeController = { }); actionButtons.append($graphImage); - //$content.append($graphImage); } // Data pop-up @@ -1140,7 +1142,6 @@ var TreeController = { }); actionButtons.append($dataImage); - //$content.append($dataImage); } } } @@ -1176,7 +1177,6 @@ var TreeController = { .css("cursor", "pointer"); actionButtons.append($alertsImage); - //$content.append($alertsImage); } $content.append(actionButtons); diff --git a/pandora_console/include/styles/fixed-bottom-box.css b/pandora_console/include/styles/fixed-bottom-box.css index b8882ee0a2..ede8a885d8 100644 --- a/pandora_console/include/styles/fixed-bottom-box.css +++ b/pandora_console/include/styles/fixed-bottom-box.css @@ -2,12 +2,7 @@ div.fixed-bottom-box { background: #fff; height: -webkit-fill-available; height: -moz-fill-available; - border-radius: 10px 10px 0 0; - -moz-border-radius: 10px 10px 0 0; - -webkit-border-radius: 10px 10px 0 0; - -o-border-radius: 10px 10px 0 0; - -ms-border-radius: 10px 10px 0 0; - -khtml-border-radius: 10px 10px 0 0; + border-left: 1px solid #aeaeae; } /* Overrides */ @@ -29,8 +24,8 @@ div.fixed-bottom-box > div.fixed-bottom-box-head { height: 40px; line-height: 30px; vertical-align: middle; - position: absolute; - border-bottom: 1px solid #aeaeae; + box-sizing: border-box; + border-bottom: 1px solid #eaeaea; } div.fixed-bottom-box @@ -38,10 +33,10 @@ div.fixed-bottom-box > div.fixed-bottom-box-head-body { height: inherit; line-height: inherit; - color: #ffffff; + background-color: #fff; font-weight: bold; vertical-align: middle; - text-align: center; + border-bottom: 1px solid #eaeaea; } div.fixed-bottom-box @@ -54,7 +49,7 @@ div.fixed-bottom-box background-position: center; position: absolute; top: 10px; - right: 20px; + right: 10px; } div.fixed-bottom-box @@ -94,5 +89,10 @@ div.fixed-bottom-box > div.fixed-bottom-box-content { width: 100% !important; height: 100% !important; max-height: 100% !important; - border-left: 1px solid #aeaeae; +} + +#fixed-bottom-box-head-title { + position: absolute; + top: 10px; + left: 20px; } diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 35cc36229d..4f61b95064 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -10986,6 +10986,7 @@ pre.external_tools_output { padding-bottom: 17px; } +.border-bottom-gray, .table-about .about-last-tr { border-bottom: 1px solid #eaeaea; } diff --git a/pandora_console/include/styles/progress.css b/pandora_console/include/styles/progress.css index 1717bbe06d..66921d7da6 100644 --- a/pandora_console/include/styles/progress.css +++ b/pandora_console/include/styles/progress.css @@ -5,7 +5,7 @@ width: 100%; display: inline-block; display: flex; - border-radius: 8px; + border-radius: 4px; line-height: 24px; font-size: 11pt; } diff --git a/pandora_console/include/styles/tree.css b/pandora_console/include/styles/tree.css index 1da0b7650c..edab87260c 100644 --- a/pandora_console/include/styles/tree.css +++ b/pandora_console/include/styles/tree.css @@ -8,9 +8,10 @@ flex-direction: row; flex-wrap: wrap; align-items: center; - width: calc(100% - 25px); - border: 1px solid #aeaeae; - border-radius: 8px; + width: calc(100% - 24px); + border: 1px solid #eaeaea; + border-radius: 4px; + background-color: #fff; margin-bottom: 8px; } @@ -33,7 +34,7 @@ width: 40px; display: inline-block; box-sizing: border-box; - border-right: 1px solid #aeaeae; + border-right: 1px solid #eaeaea; } .tree-node .node-icon .node-icon-container { @@ -62,7 +63,7 @@ .tree-group { margin-left: 24px; - padding-top: 1px; + /*padding-top: 1px;*/ } .tree-node { @@ -73,7 +74,7 @@ background-repeat: repeat-y; */ min-height: 26px; - margin-top: 8px; + margin-top: 1px; } div.tree-node { @@ -88,8 +89,9 @@ div.tree-node span { background: 0 0; } .node-content { - border: 1px solid #aeaeae; - border-radius: 8px; + border: 1px solid #eaeaea; + background-color: #fff; + border-radius: 4px; width: calc(100% - 50px); box-sizing: border-box; height: 40px; @@ -190,19 +192,30 @@ div.tree-node span { flex: 1 1 80%; position: relative; font-weight: bold; + font-size: 11pt; } .tree-node > .node-content > .module-name-parent.module-only-caption { top: 9px; } +.node-service > .node-service-name { + flex: 1 1 50%; + font-size: 11pt; + font-weight: bold; +} .tree-node > .node-content.module-only-caption > .module-name { top: 7px; } +.node-content.module:not(.module-only-caption) .module-name { + margin-left: 3.5em; + font-weight: normal; +} /*.node-content.module.module-only-caption:not(:first-of-type) { margin-top: 8px; }*/ + .tree-node > .node-content > .module-name-alias { font-size: 12pt; font-weight: normal; @@ -210,6 +223,9 @@ div.tree-node span { margin-left: 3.3em; } +.tree-node > .node-content.module-only-caption > .module-name-alias { + margin-left: 1em; +} .tree-node > .node-content > .module-name-parent { font-size: 12pt; margin-left: 0.5em; @@ -269,10 +285,9 @@ div.tree-node span { div#tree-controller-recipient { text-align: left; - width: 65%; - /* width: 98%; */ + width: calc((100% - 34%) - 20px); margin-top: 10px; - margin-left: 10px; + margin-left: 20px; } .tree-controller-recipient { @@ -307,7 +322,7 @@ div#tree-controller-recipient { flex-direction: row; align-items: center; width: calc(100% - 50px); - margin: 8px 0 0 8px; + margin: 1px 0 0 8px; } .node-content .module-button { @@ -331,5 +346,5 @@ div#tree-controller-recipient { .tree-root > .tree-node { margin-top: 0; - margin-bottom: 10px; + margin-bottom: 2px; } diff --git a/pandora_console/operation/tree.php b/pandora_console/operation/tree.php index a91be60326..a850a632c9 100755 --- a/pandora_console/operation/tree.php +++ b/pandora_console/operation/tree.php @@ -333,7 +333,7 @@ if (is_metaconsole() === true) { } enterprise_hook('close_meta_frame'); - +$infoHeadTitle = 'Sombra oscura'; ?> @@ -438,11 +438,10 @@ enterprise_hook('close_meta_frame'); break; } } - treeController.init({ recipient: $("div#tree-controller-recipient"), - detailRecipient: $.fixedBottomBox({ width: 400, height: window.innerHeight * 0.9 }), + detailRecipient: $.fixedBottomBox({ width: 400, height: window.innerHeight * 0.9, headTitle: "" }), page: parameters['page'], emptyMessage: "", foundMessage: foundMessage, From 0162767f6d0c315ff35c6a88ab8dc231c579307c Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Mon, 30 Jan 2023 13:39:58 +0100 Subject: [PATCH 127/563] Clean debug --- .../godmode/agentes/module_manager_editor_common.php | 9 --------- 1 file changed, 9 deletions(-) diff --git a/pandora_console/godmode/agentes/module_manager_editor_common.php b/pandora_console/godmode/agentes/module_manager_editor_common.php index 981bda17a5..cd149dd5ca 100644 --- a/pandora_console/godmode/agentes/module_manager_editor_common.php +++ b/pandora_console/godmode/agentes/module_manager_editor_common.php @@ -1937,15 +1937,6 @@ $(document).ready (function () { $('.switch_radio_button label').on('click', function(){ var thisLabel = $(this).attr('for'); - /* - console.log(thisLabel); - console.log($('#'+thisLabel).attr('name')); - console.log($('#'+thisLabel).attr('value')); - console.log($('[name='+$('#'+thisLabel).attr('name')+']')); - */ - //console.log($('#'+$('#'+thisLabel).attr('name')).val()); - //$('[name='+$('#'+thisLabel).attr('name')+']').val($('#'+thisLabel).attr('value')); - //$('[name='+$('#'+thisLabel).attr('name')+']').prop('checked', true); $('#'+thisLabel).attr('checked', 'checked'); $('#'+thisLabel).siblings().attr('checked', false); From 9694699ab091476678858258dfc0b5b536a4eb33 Mon Sep 17 00:00:00 2001 From: alejandro Date: Mon, 30 Jan 2023 15:31:58 +0100 Subject: [PATCH 128/563] update google sheet plugin --- .../google_sheets/pandora_googlesheet.py | 72 ++++++++++++++----- 1 file changed, 54 insertions(+), 18 deletions(-) diff --git a/pandora_plugins/google_sheets/pandora_googlesheet.py b/pandora_plugins/google_sheets/pandora_googlesheet.py index a6e599b429..d02fc4cd3b 100644 --- a/pandora_plugins/google_sheets/pandora_googlesheet.py +++ b/pandora_plugins/google_sheets/pandora_googlesheet.py @@ -1,7 +1,13 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + import gspread -import argparse +import argparse,json,sys from oauth2client.service_account import ServiceAccountCredentials from pprint import pprint +from os import remove + +import base64 __author__ = "Alejandro Sánchez Carrion" __copyright__ = "Copyright 2022, PandoraFMS" @@ -15,33 +21,63 @@ Version = {__version__} Manual execution -python3 pandora_googlesheets.py --cred --row --column +python3 pandora_googlesheets.py --creds_json/creds_base64 --row --column """ parser = argparse.ArgumentParser(description= info, formatter_class=argparse.RawTextHelpFormatter) -parser.add_argument('--cred', help='') -parser.add_argument('--name', help='') -parser.add_argument('--row', help='',type=int) -parser.add_argument('--column', help='',type=int) +parser.add_argument('--creds_json', help='To authenticate with a json file.') +parser.add_argument('--creds_base64', help='To authenticate with a file that includes the credentials for base64 authentication.') +parser.add_argument('--name', help='Name of the google sheets document.') +parser.add_argument('--cell', help='To collect the value of a cell.') +parser.add_argument('--row', help='To collect the value of a row.',type=int) +parser.add_argument('--column', help='To collect the value of a column.',type=int) +parser.add_argument('--sheet', help='To indicate the name of the document sheet, put it in quotation marks and count spaces and capital letters.',type=str) args = parser.parse_args() scope = ["https://spreadsheets.google.com/feeds",'https://www.googleapis.com/auth/spreadsheets',"https://www.googleapis.com/auth/drive.file","https://www.googleapis.com/auth/drive"] -creds = ServiceAccountCredentials.from_json_keyfile_name(args.cred, scope) + + + + +## authenticate with file json input +if args.creds_json is not None and args.creds_base64 == None: + creds = ServiceAccountCredentials.from_json_keyfile_name(args.creds_json, scope) +## authenticate with base64 input +elif args.creds_base64 is not None and args.creds_json== None: + ## base64 to json + with open(args.creds_base64, 'r') as file: + data = file.read().replace('\n', '') + text=base64.b64decode(data).decode('utf-8') + with open("cred.json", "w") as outfile: + outfile.write(text) + creds = ServiceAccountCredentials.from_json_keyfile_name("cred.json", scope) + remove("cred.json") +else: + print("You need to use the --creds_json or creds_base 64 parameter to authenticate. You can only select one.") + sys.exit() client = gspread.authorize(creds) -sheet = client.open(args.name).sheet1 # Open the spreadhseet +sheet = client.open(args.name) # Open the spreadhseet +worksheet = sheet.worksheet(args.sheet) # Open worksheet -data = sheet.get_all_records() # Get a list of all records +if args.cell is not None and args.row==None and args.column==None : -if args.row is not None and args.column==None: - row = sheet.row_values(args.row) # Get a specific row - print(row) -elif args.row ==None and args.column is not None: - col = sheet.col_values(args.column) # Get a specific column - print(col) -elif args.row is not None and args.column is not None: - cell = sheet.cell(args.row,args.column).value # Get the value of a specific cell - print(cell) + val = worksheet.acell(args.cell).value + +elif args.row is not None and args.column==None and args.cell == None: + + val = worksheet.row_values(args.row) # Get a specific row + +elif args.column is not None and args.row== None and args.cell == None: + + val = worksheet.col_values(args.column) # Get a specific column + +else: + print("To search for data in a cell use the --cell parameter, for data in a column --column and in a row --row, only one of these parameters can be used at a time.") + sys.exit() + + +print(val) From 891e485781e5aec3ad96f92df42fea500f2bd665 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Mon, 30 Jan 2023 16:14:05 +0100 Subject: [PATCH 129/563] Fixed users list view --- .../godmode/users/profile_list.php | 19 +- pandora_console/godmode/users/user_list.php | 235 ++++++++++++------ pandora_console/include/functions_html.php | 2 +- pandora_console/include/styles/pandora.css | 5 +- 4 files changed, 173 insertions(+), 88 deletions(-) diff --git a/pandora_console/godmode/users/profile_list.php b/pandora_console/godmode/users/profile_list.php index da8eac4e9e..f2094c87c3 100644 --- a/pandora_console/godmode/users/profile_list.php +++ b/pandora_console/godmode/users/profile_list.php @@ -80,13 +80,24 @@ if (is_metaconsole() === false) { $buttons[$tab]['active'] = true; - ui_print_page_header( - __('User management').' » '.__('Profiles defined on %s', get_product_name()), + // Header. + ui_print_standard_header( + __('User Profile management'), 'images/gm_users.png', false, 'profile_tab', - true, - $buttons + false, + $buttons, + [ + [ + 'link' => '', + 'label' => __('Profiles'), + ], + [ + 'link' => '', + 'label' => __('Manage users'), + ], + ] ); $sec = 'gusuarios'; } else { diff --git a/pandora_console/godmode/users/user_list.php b/pandora_console/godmode/users/user_list.php index a110631c0a..07f577da65 100644 --- a/pandora_console/godmode/users/user_list.php +++ b/pandora_console/godmode/users/user_list.php @@ -14,7 +14,7 @@ * |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______| * * ============================================================================ - * Copyright (c) 2005-2021 Artica Soluciones Tecnologicas + * Copyright (c) 2005-2023 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 @@ -285,13 +285,24 @@ if (is_metaconsole() === true) { $buttons[$tab]['active'] = true; - ui_print_page_header( - __('User management').' » '.__('Users defined on %s', get_product_name()), + // Header. + ui_print_standard_header( + __('Users management'), 'images/gm_users.png', false, '', - true, - $buttons + false, + $buttons, + [ + [ + 'link' => '', + 'label' => __('Profiles'), + ], + [ + 'link' => '', + 'label' => __('Manage users'), + ], + ] ); $sec = 'gusuarios'; @@ -443,12 +454,14 @@ if (($filter_group == 0) && ($filter_search == '')) { $search = false; } -$table = new stdClass(); -$table->width = '100%'; -$table->class = 'databox filters'; -$table->rowclass[0] = ''; -$table->data[0][0] = ''.__('Group').''; -$table->data[0][1] = html_print_select_groups( +$filterTable = new stdClass(); +$filterTable->width = '100%'; +$filterTable->class = 'fixed_filter_bar'; +$filterTable->rowclass[0] = ''; +$filterTable->cellstyle[0][0] = 'width:0'; +$filterTable->cellstyle[0][1] = 'width:0'; +$filterTable->data[0][0] = __('Group'); +$filterTable->data[1][0] = html_print_select_groups( false, 'AR', true, @@ -459,8 +472,8 @@ $table->data[0][1] = html_print_select_groups( 0, true ); -$table->data[0][2] = ''.__('Search').''.ui_print_help_tip(__('Search by username, fullname or email'), true); -$table->data[0][3] = html_print_input_text( +$filterTable->data[0][1] = __('Search').ui_print_help_tip(__('Search by username, fullname or email'), true); +$filterTable->data[1][1] = html_print_input_text( 'filter_search', $filter_search, __('Search by username, fullname or email'), @@ -468,11 +481,16 @@ $table->data[0][3] = html_print_input_text( 90, true ); -$table->data[0][4] = html_print_submit_button( +$filterTable->cellstyle[1][2] = 'vertical-align: bottom'; +$filterTable->data[1][2] = html_print_submit_button( __('Search'), 'search', false, - ['class' => 'sub search'], + [ + 'icon' => 'search', + 'class' => 'float-right', + 'mode' => 'secondary mini', + ], true ); @@ -497,22 +515,16 @@ if (is_metaconsole() === false && is_management_allowed() === false) { if (is_metaconsole() === true) { - $table->width = '96%'; + $filterTable->width = '96%'; $form_filter = "
    "; - $form_filter .= html_print_table($table, true); + $form_filter .= html_print_table($filterTable, true); $form_filter .= '
    '; ui_toggle($form_filter, __('Show Options')); } else { $form_filter = "
    "; - $form_filter .= html_print_table($table, true); + $form_filter .= html_print_table($filterTable, true); $form_filter .= '
    '; - ui_toggle( - $form_filter, - __('Users control filter'), - __('Toggle filter(s)'), - '', - !$search - ); + echo $form_filter; } // Urls to sort the table. @@ -527,8 +539,9 @@ $url_down_last = '?sec='.$sec.'&sec2=godmode/users/user_list&sort_field=last_con $table = new stdClass(); $table->cellpadding = 0; $table->cellspacing = 0; -$table->width = '100%'; -$table->class = 'info_table'; +$table->class = 'info_table tactical_table'; +$table->id = 'user_list'; +$table->styleTable = 'margin: 0 10px'; $table->head = []; $table->data = []; @@ -536,15 +549,18 @@ $table->align = []; $table->size = []; $table->valign = []; -$table->head[0] = __('User ID').ui_get_sorting_arrows($url_up_id, $url_down_id, $selectUserIDUp, $selectUserIDDown); -$table->head[1] = __('Name').ui_get_sorting_arrows($url_up_name, $url_down_name, $selectFullnameUp, $selectFullnameDown); -$table->head[2] = __('Last contact').ui_get_sorting_arrows($url_up_last, $url_down_last, $selectLastConnectUp, $selectLastConnectDown); +$table->head[0] = ''.__('User ID').''; +$table->head[0] .= ui_get_sorting_arrows($url_up_id, $url_down_id, $selectUserIDUp, $selectUserIDDown); +$table->head[1] = ''.__('Name').''; +$table->head[1] .= ui_get_sorting_arrows($url_up_name, $url_down_name, $selectFullnameUp, $selectFullnameDown); +$table->head[2] = ''.__('Last contact').''; +$table->head[2] .= ui_get_sorting_arrows($url_up_last, $url_down_last, $selectLastConnectUp, $selectLastConnectDown); -$table->head[3] = __('Admin'); -$table->head[4] = __('Profile / Group'); -$table->head[5] = __('Description'); +$table->head[3] = ''.__('Admin').''; +$table->head[4] = ''.__('Profile / Group').''; +$table->head[5] = ''.__('Description').''; if ($is_management_allowed === true) { - $table->head[6] = ''.__('Op.').''; + $table->head[6] = ''.__('Actions').''; } if (is_metaconsole() === false) { @@ -579,7 +595,7 @@ if ($user_is_admin) { } else { $group_um = users_get_groups_UM($config['id_user']); // 0 is the group 'all'. - if (isset($group_um[0])) { + if (isset($group_um[0]) === true) { $info1 = get_users($order); } else { foreach ($group_um as $group => $value) { @@ -636,9 +652,6 @@ foreach ($info1 as $user_id => $user_info) { $info = $info1; -// Prepare pagination. -ui_pagination(count($info)); - $offset = (int) get_parameter('offset'); $limit = (int) $config['block_size']; @@ -720,12 +733,12 @@ foreach ($info as $user_id => $user_info) { if ($user_info['is_admin']) { $data[3] = html_print_image( - 'images/user_suit.png', + 'images/user.svg', true, [ 'alt' => __('Admin'), 'title' => __('Administrator'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ).' '; } else { @@ -784,10 +797,10 @@ foreach ($info as $user_id => $user_info) { } $data[5] = ui_print_string_substr($user_info['comments'], 24, true); - + $table->cellclass[][6] = 'table_action_buttons'; + $data[6] = ''; + $userListActionButtons = []; if ($is_management_allowed === true) { - $table->cellclass[][6] = 'table_action_buttons'; - $data[6] = ''; if ($user_is_admin || $config['id_user'] == $user_info['id_user'] || isset($group_um[0]) @@ -796,30 +809,47 @@ foreach ($info as $user_id => $user_info) { ) { // Disable / Enable user. if (isset($user_info['not_delete']) === false) { - if ($user_info['disabled'] == 0) { + if ((int) $user_info['disabled'] === 0) { $toDoString = __('Disable'); $toDoAction = '1'; - $toDoImage = 'images/lightbulb.png'; + $toDoImage = 'images/disable.svg'; $toDoClass = ''; } else { $toDoString = __('Enable'); $toDoAction = '0'; - $toDoImage = 'images/lightbulb_off.png'; + $toDoImage = 'images/enable.svg'; $toDoClass = 'filter_none'; } - $data[6] = '
    '; - $data[6] .= html_print_input_hidden( + $userListActionButtons[] = html_print_menu_button( + [ + 'href' => ui_get_full_url( + sprintf( + 'index.php?sec=%s&sec2=godmode/users/user_list&disable_user=%s&pure=%s&id=%s', + $sec, + $toDoAction, + $pure, + $user_info['id_user'] + ) + ), + 'image' => $toDoImage, + 'title' => $toDoString, + ], + true + ); + /* + $data[6] = ''; + $data[6] .= html_print_input_hidden( 'id', $user_info['id_user'], true - ); - $data[6] .= html_print_input_hidden( + ); + $data[6] .= html_print_input_hidden( 'disable_user', $toDoAction, true - ); - $data[6] .= html_print_input_image( + ); + $data[6] .= html_print_input_image( 'submit_disable_enable', $toDoImage, '', @@ -828,66 +858,101 @@ foreach ($info as $user_id => $user_info) { [ 'data-title' => $toDoString, 'data-use_title_for_force_title' => '1', - 'class' => 'forced_title no-padding '.$toDoClass, + 'class' => 'main_menu_icon forced_title no-padding '.$toDoClass, ] - ); - $data[6] .= '
    '; + ); + $data[6] .= ''; + */ } - // Edit user. - $data[6] .= '
    '; - $data[6] .= html_print_input_hidden( + /* + // Edit user. + $data[6] .= ''; + $data[6] .= html_print_input_hidden( 'id_user', $user_info['id_user'], true - ); - $data[6] .= html_print_input_hidden( + ); + $data[6] .= html_print_input_hidden( 'edit_user', '1', true - ); - $data[6] .= html_print_input_image( + ); + $data[6] .= html_print_input_image( 'submit_edit_user', - 'images/config.png', + 'images/edit.svg', '', 'padding:0', true, [ 'data-title' => __('Edit'), 'data-use_title_for_force_title' => '1', - 'class' => 'forced_title no-padding', + 'class' => 'main_menu_icon forced_title no-padding', ] + ); + $data[6] .= '
    ';*/ + + $userListActionButtons[] = html_print_menu_button( + [ + 'href' => ui_get_full_url( + sprintf( + 'index.php?sec=%s&sec2=godmode/users/configure_user&edit_user=1&pure=%s&id_user=%s', + $sec, + $pure, + $user_info['id_user'] + ) + ), + 'image' => 'images/edit.svg', + 'title' => __('Edit user'), + ], + true ); - $data[6] .= ''; if ($config['admin_can_delete_user'] && $user_info['id_user'] != $config['id_user'] && isset($user_info['not_delete']) === false ) { - $data[6] .= '
    '; - $data[6] .= html_print_input_hidden( + /* + $data[6] .= ''; + $data[6] .= html_print_input_hidden( 'delete_user', $user_info['id_user'], true - ); - $data[6] .= html_print_input_hidden( + ); + $data[6] .= html_print_input_hidden( 'user_del', '1', true - ); - $data[6] .= html_print_input_image( + ); + $data[6] .= html_print_input_image( 'submit_delete_user', - 'images/cross.png', + 'images/delete.svg', '', 'padding:0', true, [ 'data-title' => __('Delete'), 'data-use_title_for_force_title' => '1', - 'class' => 'forced_title no-padding', + 'class' => 'main_menu_icon forced_title no-padding', ] + ); + $data[6] .= '
    '; + */ + $userListActionButtons[] = html_print_menu_button( + [ + 'href' => ui_get_full_url( + sprintf( + 'index.php?sec=%s&sec2=godmode/users/user_list&user_del=1&pure=%s&delete_user=%s', + $sec, + $pure, + $user_info['id_user'] + ) + ), + 'image' => 'images/delete.svg', + 'title' => __('Delete'), + ], + true ); - $data[6] .= ''; if (is_metaconsole() === true) { $data[6] .= '
    '; @@ -907,11 +972,16 @@ foreach ($info as $user_id => $user_info) { true ); $data[6] .= '
    '; + } else { + $data[6] = implode('', $userListActionButtons); } } else { $data[6] .= ''; // Delete button not in this mode. } + + // TODO. Check this in META!!! + $data[6] = implode('', $userListActionButtons); } else { $data[6] .= ''; // Delete button not in this mode. @@ -922,24 +992,27 @@ foreach ($info as $user_id => $user_info) { } html_print_table($table); -ui_pagination(count($info), false, 0, 0, false, 'offset', true, 'pagination-bottom'); - -echo '
    '; unset($table); if ($is_management_allowed === true) { if ($config['admin_can_add_user'] !== false) { echo '
    '; + html_print_action_buttons( + html_print_submit_button( + __('Create user'), + 'crt', + false, + [ 'icon' => 'wand' ], + true + ), + ['type' => 'form_action'], + ); html_print_input_hidden('new_user', 1); - html_print_submit_button(__('Create user'), 'crt', false, 'class="sub next"'); echo '
    '; } else { echo ''.__("The current authentication scheme doesn't support creating users on %s", get_product_name()).''; } } - -echo '
    '; - enterprise_hook('close_meta_frame'); ?> diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index feab991df6..c729655e8f 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -3950,7 +3950,7 @@ function html_print_table(&$table, $return=false) } $output .= ''."\n"; - + hd($output, true); if ($return) { return $output; } diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 4f61b95064..a85fd6c322 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -4302,8 +4302,8 @@ span.log_zone_line_error { width: 50%; } -.rowPair:hover, -.rowOdd:hover { +tr.rowPair:hover, +tr.rowOdd:hover { background-color: #eee; } @@ -10769,6 +10769,7 @@ pre.external_tools_output { .fixed_filter_bar { position: sticky; top: 114px; + margin-bottom: 10px; border: 1px solid #e5e9ed; background-color: #fff; z-index: 1; From 9305fd17babafe6ef2cb69444cb44bc224be981f Mon Sep 17 00:00:00 2001 From: Calvo Date: Mon, 30 Jan 2023 17:16:20 +0100 Subject: [PATCH 130/563] Fix get agent status on unknown modules --- pandora_server/lib/PandoraFMS/DB.pm | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/pandora_server/lib/PandoraFMS/DB.pm b/pandora_server/lib/PandoraFMS/DB.pm index 338a914ab4..4a42019023 100644 --- a/pandora_server/lib/PandoraFMS/DB.pm +++ b/pandora_server/lib/PandoraFMS/DB.pm @@ -618,8 +618,13 @@ sub get_agent_status ($$$) { $module_status = 2; } elsif ($module_status != 2) { - if ($m_status == 0) { - $module_status = 0; + if ($m_status == 3) { + $module_status = 3; + } + elsif ($module_status != 3) { + if ($m_status == 3) { + $module_status = 3; + } } } } @@ -647,6 +652,8 @@ sub get_agent_status ($$$) { return 3; } } + + print "MS ::::::::::::::".Dumper($module_status); return $module_status; } From 825137d18bdfdbbd5de0ffb38619ef5fc0df6d39 Mon Sep 17 00:00:00 2001 From: Calvo Date: Mon, 30 Jan 2023 17:17:48 +0100 Subject: [PATCH 131/563] Fix get agent status on unknown modules --- pandora_server/lib/PandoraFMS/DB.pm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandora_server/lib/PandoraFMS/DB.pm b/pandora_server/lib/PandoraFMS/DB.pm index 4a42019023..993f4e1fe8 100644 --- a/pandora_server/lib/PandoraFMS/DB.pm +++ b/pandora_server/lib/PandoraFMS/DB.pm @@ -622,8 +622,8 @@ sub get_agent_status ($$$) { $module_status = 3; } elsif ($module_status != 3) { - if ($m_status == 3) { - $module_status = 3; + if ($m_status == 0) { + $module_status = 0; } } } From cb6e523e337e4b4f9e67d912f91e64a5404e2db0 Mon Sep 17 00:00:00 2001 From: Calvo Date: Mon, 30 Jan 2023 17:27:00 +0100 Subject: [PATCH 132/563] Fix style --- pandora_server/lib/PandoraFMS/DB.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_server/lib/PandoraFMS/DB.pm b/pandora_server/lib/PandoraFMS/DB.pm index 993f4e1fe8..7795ffbcea 100644 --- a/pandora_server/lib/PandoraFMS/DB.pm +++ b/pandora_server/lib/PandoraFMS/DB.pm @@ -623,7 +623,7 @@ sub get_agent_status ($$$) { } elsif ($module_status != 3) { if ($m_status == 0) { - $module_status = 0; + $module_status = 0; } } } From b88f26500b66ac5b2752865ef8a2994535de4bf7 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Tue, 31 Jan 2023 08:35:47 +0100 Subject: [PATCH 133/563] #9819 Change labels Accoustic console --- pandora_console/godmode/menu.php | 4 ++-- pandora_console/include/class/EventSound.class.php | 6 +++--- pandora_console/operation/events/events.php | 6 +++--- pandora_console/operation/events/sound_events.php | 4 ++-- pandora_console/operation/menu.php | 8 ++++---- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/pandora_console/godmode/menu.php b/pandora_console/godmode/menu.php index 9dc13b6abb..d4f903290e 100644 --- a/pandora_console/godmode/menu.php +++ b/pandora_console/godmode/menu.php @@ -435,8 +435,8 @@ if ((bool) check_acl($config['id_user'], 0, 'PM') === true || (bool) check_acl($ } } - $sub['godmode/events/configuration_sounds']['text'] = __('Configuration Sounds'); - $sub['godmode/events/configuration_sounds']['id'] = 'Configuration Sounds'; + $sub['godmode/events/configuration_sounds']['text'] = __('Accoustic console setup'); + $sub['godmode/events/configuration_sounds']['id'] = 'Accoustic console setup'; $sub['godmode/events/configuration_sounds']['pages'] = ['godmode/events/configuration_sounds']; $menu_godmode['gextensions']['sub'] = $sub; diff --git a/pandora_console/include/class/EventSound.class.php b/pandora_console/include/class/EventSound.class.php index 93f42ec7c4..b943e9cce1 100644 --- a/pandora_console/include/class/EventSound.class.php +++ b/pandora_console/include/class/EventSound.class.php @@ -209,7 +209,7 @@ class EventSound extends HTML $titleHeader = __('Add new sound'); } else { $helpHeader = 'servers_ha_clusters_tab'; - $titleHeader = __('Events sound list'); + $titleHeader = __('Accoustic console sound list'); } // Header. @@ -223,11 +223,11 @@ class EventSound extends HTML [ [ 'link' => '', - 'label' => __('Events'), + 'label' => __('Admin tools'), ], [ 'link' => '', - 'label' => __('Configuration Sounds'), + 'label' => __('Accoustic console setup'), ], ] ); diff --git a/pandora_console/operation/events/events.php b/pandora_console/operation/events/events.php index 648581a3a6..eb885bf479 100644 --- a/pandora_console/operation/events/events.php +++ b/pandora_console/operation/events/events.php @@ -1473,13 +1473,13 @@ if ($pure) { ] ).'
    '; - // Sound events. + // Accoustic console. $sound_event['active'] = false; $sound_event['text'] = ''.html_print_image( 'images/sound.png', true, [ - 'title' => __('Sound events'), + 'title' => __('Accoustic console'), 'class' => 'invert_filter', ] ).''; @@ -1529,7 +1529,7 @@ if ($pure) { switch ($section) { case 'sound_event': $onheader['sound_event']['active'] = true; - $section_string = __('Sound events'); + $section_string = __('Accoustic console'); break; case 'history': diff --git a/pandora_console/operation/events/sound_events.php b/pandora_console/operation/events/sound_events.php index 2f2b11e065..6ce7a31c3a 100644 --- a/pandora_console/operation/events/sound_events.php +++ b/pandora_console/operation/events/sound_events.php @@ -60,7 +60,7 @@ ob_start(); echo ''; echo ''; -echo ''.__('Sound Events').''; +echo ''.__('Accoustic console').''; ui_require_css_file('wizard'); ui_require_css_file('discovery'); ?> @@ -161,7 +161,7 @@ if ($config['style'] === 'pandora_black' && !is_metaconsole()) { echo ''; echo ""; -echo "

    ".__('Sound console').'

    '; +echo "

    ".__('Accoustic console').'

    '; // Connection lost alert. ui_require_css_file('register', 'include/styles/', true); diff --git a/pandora_console/operation/menu.php b/pandora_console/operation/menu.php index c777e1d97b..eed84a4d48 100644 --- a/pandora_console/operation/menu.php +++ b/pandora_console/operation/menu.php @@ -432,11 +432,11 @@ if ($access_console_node === true) { $sub['operation/events/events_rss.php?user='.$config['id_user'].'&hashup='.$hashup.'&fb64='.$fb64]['type'] = 'direct'; } - // Sound Events. + // Accoustic console. $data_sound = base64_encode( json_encode( [ - 'title' => __('Sound Console'), + 'title' => __('Accoustic console'), 'start' => __('Start'), 'stop' => __('Stop'), 'noAlert' => __('No alert'), @@ -449,8 +449,8 @@ if ($access_console_node === true) { ); $javascript = 'javascript: openSoundEventModal(`'.$data_sound.'`);'; - $sub[$javascript]['text'] = __('Sound Events'); - $sub[$javascript]['id'] = 'Sound Events Modal'; + $sub[$javascript]['text'] = __('Accoustic console'); + $sub[$javascript]['id'] = 'Accoustic console Modal'; $sub[$javascript]['type'] = 'direct'; echo ''; From 6f55707e731003414edb4aa97b8ec292c4f849c2 Mon Sep 17 00:00:00 2001 From: Calvo Date: Tue, 31 Jan 2023 09:11:03 +0100 Subject: [PATCH 134/563] Fix style --- pandora_server/lib/PandoraFMS/DB.pm | 2 -- 1 file changed, 2 deletions(-) diff --git a/pandora_server/lib/PandoraFMS/DB.pm b/pandora_server/lib/PandoraFMS/DB.pm index 7795ffbcea..91f838dfd9 100644 --- a/pandora_server/lib/PandoraFMS/DB.pm +++ b/pandora_server/lib/PandoraFMS/DB.pm @@ -653,8 +653,6 @@ sub get_agent_status ($$$) { } } - print "MS ::::::::::::::".Dumper($module_status); - return $module_status; } From a200362ffe4223e3bae63692b36a4964b28d7205 Mon Sep 17 00:00:00 2001 From: Ramon Novoa Date: Tue, 31 Jan 2023 09:54:31 +0100 Subject: [PATCH 135/563] Make sure producers always release agent locks. A MySQL error that didn't bring the server down could result in a consumer returning without releasing its agent lock. --- pandora_server/lib/PandoraFMS/DataServer.pm | 38 ++++++++------------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/pandora_server/lib/PandoraFMS/DataServer.pm b/pandora_server/lib/PandoraFMS/DataServer.pm index 6f16bd4281..ac4364dca1 100644 --- a/pandora_server/lib/PandoraFMS/DataServer.pm +++ b/pandora_server/lib/PandoraFMS/DataServer.pm @@ -304,21 +304,22 @@ sub data_consumer ($$) { agent_unlock($pa_config, $agent_name); return; } - unlink ($file_name); - if (defined($xml_data->{'server_name'})) { - process_xml_server ($self->getConfig (), $file_name, $xml_data, $self->getDBH ()); - } elsif (defined($xml_data->{'connection_source'})) { - enterprise_hook('process_xml_connections', [$self->getConfig (), $file_name, $xml_data, $self->getDBH ()]); - } elsif (defined($xml_data->{'ipam_source'})) { - enterprise_hook('process_xml_ipam', [$self->getConfig (), $file_name, $xml_data, $self->getDBH ()]); - } elsif (defined($xml_data->{'network_matrix'})){ - process_xml_matrix_network( - $self->getConfig(), $xml_data, $self->getDBH() - ); - } else { - process_xml_data ($self->getConfig (), $file_name, $xml_data, $self->getServerID (), $self->getDBH ()); - } + + eval { + if (defined($xml_data->{'server_name'})) { + process_xml_server ($self->getConfig (), $file_name, $xml_data, $self->getDBH ()); + } elsif (defined($xml_data->{'connection_source'})) { + enterprise_hook('process_xml_connections', [$self->getConfig (), $file_name, $xml_data, $self->getDBH ()]); + } elsif (defined($xml_data->{'ipam_source'})) { + enterprise_hook('process_xml_ipam', [$self->getConfig (), $file_name, $xml_data, $self->getDBH ()]); + } elsif (defined($xml_data->{'network_matrix'})){ + process_xml_matrix_network( $self->getConfig(), $xml_data, $self->getDBH()); + } else { + process_xml_data ($self->getConfig (), $file_name, $xml_data, $self->getServerID (), $self->getDBH ()); + } + }; + agent_unlock($pa_config, $agent_name); return; } @@ -1174,15 +1175,6 @@ sub process_xml_matrix_network { sub agent_lock { my ($pa_config, $dbh, $agent_name) = @_; - # Do not lock on LIFO mode if the agent already exist. - # get_agent_id will be called again from process_xml_data, - # so the should be no race conditions if the agent does - # not exist. - if ($pa_config->{'dataserver_lifo'} == 1 && - get_agent_id ($dbh, $agent_name) > 0) { - return 1; - } - $AgentSem->down (); if (defined ($Agents{$agent_name})) { $AgentSem->up (); From 6437460e8381781ad75d8368e3e6f6d004a1e497 Mon Sep 17 00:00:00 2001 From: Calvo Date: Tue, 31 Jan 2023 09:57:55 +0100 Subject: [PATCH 136/563] Fix style --- pandora_server/lib/PandoraFMS/DB.pm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pandora_server/lib/PandoraFMS/DB.pm b/pandora_server/lib/PandoraFMS/DB.pm index 91f838dfd9..27ea483870 100644 --- a/pandora_server/lib/PandoraFMS/DB.pm +++ b/pandora_server/lib/PandoraFMS/DB.pm @@ -620,11 +620,11 @@ sub get_agent_status ($$$) { elsif ($module_status != 2) { if ($m_status == 3) { $module_status = 3; - } + } elsif ($module_status != 3) { - if ($m_status == 0) { - $module_status = 0; - } + if ($m_status == 0) { + $module_status = 0; + } } } } From c8b1d22c5d28b035c90f8bc9df34434539172a3e Mon Sep 17 00:00:00 2001 From: alejandro Date: Tue, 31 Jan 2023 10:23:42 +0100 Subject: [PATCH 137/563] change parameter --creds_Base64 --- pandora_plugins/google_sheets/pandora_googlesheet.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/pandora_plugins/google_sheets/pandora_googlesheet.py b/pandora_plugins/google_sheets/pandora_googlesheet.py index d02fc4cd3b..bfa346aa40 100644 --- a/pandora_plugins/google_sheets/pandora_googlesheet.py +++ b/pandora_plugins/google_sheets/pandora_googlesheet.py @@ -21,7 +21,7 @@ Version = {__version__} Manual execution -python3 pandora_googlesheets.py --creds_json/creds_base64 --row --column +python3 pandora_googlesheets.py --creds_json/creds_base64 --name --sheet --cell --row --column """ @@ -47,9 +47,7 @@ if args.creds_json is not None and args.creds_base64 == None: ## authenticate with base64 input elif args.creds_base64 is not None and args.creds_json== None: ## base64 to json - with open(args.creds_base64, 'r') as file: - data = file.read().replace('\n', '') - text=base64.b64decode(data).decode('utf-8') + text=base64.b64decode(args.creds_base64).decode('utf-8') with open("cred.json", "w") as outfile: outfile.write(text) creds = ServiceAccountCredentials.from_json_keyfile_name("cred.json", scope) From d49f1320f53474739a82e711fa07c04fe36a0385 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Tue, 31 Jan 2023 12:37:55 +0100 Subject: [PATCH 138/563] #10127 added param 'id_node' in set_validate_events for update from metaconsole --- pandora_console/include/functions_api.php | 47 ++++++++++++++++++++--- 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/pandora_console/include/functions_api.php b/pandora_console/include/functions_api.php index 89e764aaaa..11149e86f8 100644 --- a/pandora_console/include/functions_api.php +++ b/pandora_console/include/functions_api.php @@ -11061,20 +11061,55 @@ function api_set_event_validate_filter($trash1, $trash2, $other, $trash3) function api_set_validate_events($id_event, $trash1, $other, $return_type, $user_in_db) { - $text = $other['data']; + $node_int = 0; + if ($other['type'] == 'string') { + returnError('Parameter error.'); + return; + } else if ($other['type'] == 'array') { + $text = $other['data'][0]; + if (is_metaconsole() === true) { + if (isset($other['data'][1]) === true + && empty($other['data'][1]) === false + ) { + $node_int = $other['data'][1]; + } + } + } - // Set off the standby mode when close an event - $event = events_get_event($id_event); - alerts_agent_module_standby($event['id_alert_am'], 0); + try { + if (is_metaconsole() === true + && (int) $node_int > 0 + ) { + $node = new Node($node_int); + $node->connect(); + } - $result = events_change_status($id_event, EVENT_VALIDATE); + // Set off the standby mode when close an event + $event = events_get_event($id_event); + alerts_agent_module_standby($event['id_alert_am'], 0); + $result = events_change_status($id_event, EVENT_VALIDATE); - if ($result) { if (!empty($text)) { // Set the comment for the validation events_comment($id_event, $text); } + } catch (\Exception $e) { + if (is_metaconsole() === true + && $node_int > 0 + ) { + $node->disconnect(); + } + $result = false; + } finally { + if (is_metaconsole() === true + && $node_int > 0 + ) { + $node->disconnect(); + } + } + + if ($result) { returnData( 'string', [ From fbdd91e4fff4997b05b74cc7c33c4a85dad3a869 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Tue, 31 Jan 2023 12:59:49 +0100 Subject: [PATCH 139/563] Improve user profile list view --- .../godmode/users/profile_list.php | 53 ++++++++++++------- 1 file changed, 35 insertions(+), 18 deletions(-) diff --git a/pandora_console/godmode/users/profile_list.php b/pandora_console/godmode/users/profile_list.php index f2094c87c3..c06e78f3aa 100644 --- a/pandora_console/godmode/users/profile_list.php +++ b/pandora_console/godmode/users/profile_list.php @@ -323,8 +323,8 @@ if ($is_management_allowed === true && $create_profile === true) { $table = new stdClass(); $table->cellpadding = 0; $table->cellspacing = 0; +$table->styleTable = 'margin: 10px'; $table->class = 'info_table profile_list'; -$table->width = '100%'; $table->head = []; $table->data = []; @@ -362,7 +362,7 @@ if ($is_management_allowed === true) { $table->align = array_fill(1, 11, 'center'); -$table->size['profiles'] = '200px'; +$table->size['profiles'] = '150px'; $table->size['AR'] = '10px'; $table->size['AW'] = '10px'; $table->size['AD'] = '10px'; @@ -387,7 +387,7 @@ $table->size['NW'] = '10px'; $table->size['NM'] = '10px'; $table->size['PM'] = '10px'; if ($is_management_allowed === true) { - $table->size['operations'] = '5%'; + $table->size['operations'] = '6%'; } $profiles = db_get_all_rows_in_table('tperfil'); @@ -396,11 +396,11 @@ if ($profiles === false) { } $img = html_print_image( - 'images/ok.png', + 'images/validate.svg', true, [ 'border' => 0, - 'class' => 'invert_filter', + 'class' => 'main_menu_icon', ] ); @@ -439,22 +439,29 @@ foreach ($profiles as $profile) { $table->cellclass[]['operations'] = 'table_action_buttons'; if ($is_management_allowed === true) { $data['operations'] = ''.html_print_image( - 'images/config.png', + 'images/edit.svg', true, [ 'title' => __('Edit'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon', ] ).''; - if (check_acl($config['id_user'], 0, 'PM') || users_is_admin()) { - $data['operations'] .= ''.html_print_image( - 'images/cross.png', - true, + if ((bool) check_acl($config['id_user'], 0, 'PM') === true || (bool) users_is_admin() === true) { + $data['operations'] .= html_print_anchor( [ - 'title' => __('Delete'), - 'class' => 'invert_filter', - ] - ).''; + 'href' => 'index.php?sec='.$sec.'&sec2=godmode/users/profile_list&delete_profile=1&id='.$profile['id_perfil'].'&pure='.$pure, + 'onClick' => 'if (!confirm(\' '.__('Are you sure?').'\')) return false;', + 'content' => html_print_image( + 'images/delete.svg', + true, + [ + 'title' => __('Delete'), + 'class' => 'main_menu_icon', + ] + ), + ], + true + ); } } @@ -469,10 +476,20 @@ if (isset($data) === true) { if ($is_management_allowed === true) { echo '
    '; - echo '
    '; html_print_input_hidden('new_profile', 1); - html_print_submit_button(__('Create'), 'crt', false, 'class="sub next"'); - echo '
    '; + html_print_action_buttons( + html_print_submit_button( + __('Create profile'), + 'crt', + false, + [ 'icon' => 'next' ], + true + ), + [ + 'type' => 'data_table', + 'class' => 'fixed_action_buttons', + ] + ); echo '
    '; } From 407ce7baa0156ee15ab18dbbd743a1330200ffe6 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Tue, 31 Jan 2023 13:33:02 +0100 Subject: [PATCH 140/563] #9003 changed command center name to Merging tool --- pandora_console/general/node_deactivated.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/general/node_deactivated.php b/pandora_console/general/node_deactivated.php index c88f4f599e..ae0e3b8f24 100644 --- a/pandora_console/general/node_deactivated.php +++ b/pandora_console/general/node_deactivated.php @@ -56,7 +56,7 @@ ui_require_css_file('maintenance'); 'Please navigate to %s to unify system', ''.__('command center').'' + ).'" target="_new">'.__('merging tool').'' ); ?>

    From dcc5f76166b6d7b764d49d47150f60819996f83c Mon Sep 17 00:00:00 2001 From: Daniel Maya Date: Wed, 1 Feb 2023 09:45:10 +0100 Subject: [PATCH 141/563] #9663 menu redesing 2 --- pandora_console/include/styles/menu2.css | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/pandora_console/include/styles/menu2.css b/pandora_console/include/styles/menu2.css index c5661f3ed2..88c4a7fb3f 100644 --- a/pandora_console/include/styles/menu2.css +++ b/pandora_console/include/styles/menu2.css @@ -31,7 +31,7 @@ .operation .menu_icon ul.submenu > li, .godmode .menu_icon ul.submenu > li { background-color: #f6f7fb; - padding-left: 1.5em; + padding-left: 3.5em !important; } .menu ul { @@ -77,7 +77,7 @@ .submenu2 { /* position: absolute; */ z-index: 999; - width: 262px; + width: 238px; } .sub_subMenu { @@ -115,24 +115,8 @@ .submenu_selected { margin-bottom: 0px; - box-shadow: inset 4px 0 #82b92e; - /* color: #1D7874 !important; - font-weight: bold; */ } -/* .selected.submenu_selected { - background-color: #202020; -} - -li.submenu_selected.selected { - background-color: #202020; - font-weight: 600; -} - -li.sub_subMenu.selected { - background-color: #161616; -} */ - .menu .menu_icon, .menu li.links { background-repeat: no-repeat; From f476538170d3d0f52cb66aadbdb8570b80ee5d8c Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Wed, 1 Feb 2023 10:27:11 +0100 Subject: [PATCH 142/563] #10282 disable button edit trap in open version --- pandora_console/include/class/SnmpConsole.class.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pandora_console/include/class/SnmpConsole.class.php b/pandora_console/include/class/SnmpConsole.class.php index 9aae307bc5..843973152a 100644 --- a/pandora_console/include/class/SnmpConsole.class.php +++ b/pandora_console/include/class/SnmpConsole.class.php @@ -926,7 +926,10 @@ class SnmpConsole extends HTML 'class' => 'invert_filter', ] ).''; - $tmp->action .= ''.html_print_image('images/edit.png', true, ['alt' => __('SNMP trap editor'), 'title' => __('SNMP trap editor')]).''; + + if ($config['enterprise_installed']) { + $tmp->action .= ''.html_print_image('images/edit.png', true, ['alt' => __('SNMP trap editor'), 'title' => __('SNMP trap editor')]).''; + } $tmp->m = html_print_checkbox_extended('snmptrapid[]', $tmp->id_trap, false, false, '', 'class="chk"', true); From 2b9f7f9b09a3b76310c1bc30a0fa7a5c6458cb99 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Wed, 1 Feb 2023 10:47:36 +0100 Subject: [PATCH 143/563] #10267 limit entries in events list --- pandora_console/operation/events/events.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pandora_console/operation/events/events.php b/pandora_console/operation/events/events.php index 18c928727a..ba27a38a6e 100644 --- a/pandora_console/operation/events/events.php +++ b/pandora_console/operation/events/events.php @@ -2413,8 +2413,6 @@ try { 100, 200, 500, - 1000, - -1, ], [ $config['block_size'], @@ -2423,8 +2421,6 @@ try { 100, 200, 500, - 1000, - 'All', ], ], 'order' => [ From 11e04e2f6ad577a39b8e5305375b938a87f672d9 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Wed, 1 Feb 2023 11:16:24 +0100 Subject: [PATCH 144/563] #10234 fixed js added when file download --- pandora_console/include/get_file.php | 1 + 1 file changed, 1 insertion(+) diff --git a/pandora_console/include/get_file.php b/pandora_console/include/get_file.php index f312340df5..8c9d849ea9 100644 --- a/pandora_console/include/get_file.php +++ b/pandora_console/include/get_file.php @@ -97,6 +97,7 @@ if (empty($file) === true || empty($hash) === true || $hash !== md5($file_raw.$c header('Content-Length: '.filesize($downloadable_file)); header('Content-Disposition: attachment; filename="'.basename($downloadable_file).'"'); readfile($downloadable_file); + return; } } From 2c8c1d45931e0e15d1ef1dfd002054365dfdaf18 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Wed, 1 Feb 2023 15:14:32 +0100 Subject: [PATCH 145/563] Minor fixes and improvements --- .../include/functions_treeview.php | 313 ++++++++---------- pandora_console/include/styles/tree.css | 2 + .../agentes/estado_generalagente.php | 9 +- .../operation/agentes/estado_monitores.php | 24 -- 4 files changed, 148 insertions(+), 200 deletions(-) diff --git a/pandora_console/include/functions_treeview.php b/pandora_console/include/functions_treeview.php index bf0874f407..153cca45e5 100755 --- a/pandora_console/include/functions_treeview.php +++ b/pandora_console/include/functions_treeview.php @@ -67,23 +67,16 @@ function treeview_printModuleTable($id_module, $server_data=false, $no_head=fals $row = []; $row['title'] = __('Name'); - $row['data'] = $cellName; - $table->data['name'] = $row; - - // Edit module button. - $row = []; - $row['title'] = html_print_button( - __('Edit module'), - 'edit_module_link', - false, - 'window.location.assign(\''.$console_url.'index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&id_agente='.$module['id_agente'].'&tab=module&edit_module=1&id_agent_module='.$module['id_agente_modulo'].$url_hash.'\')', + $row['data'] = html_print_anchor( [ - 'mode' => 'link', - 'style' => 'float: right;justify-content: end;padding: 0;', + 'href' => $console_url.'index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&id_agente='.$module['id_agente'].'&tab=module&edit_module=1&id_agent_module='.$module['id_agente_modulo'].$url_hash, + 'title' => __('Click here for view this module'), + 'class' => 'font_11', + 'content' => $cellName, ], true ); - $table->data['edit_button'] = $row; + $table->data['name'] = $row; // Interval. $row = []; @@ -601,26 +594,20 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) $cellName .= ui_print_help_tip(__('Disabled'), true).'
    '; } + // Agent name. $row = []; $row['title'] = __('Agent name'); - $row['data'] = $cellName; - $table->data['name'] = $row; - - // Edit agent button. - $row = []; - $row['title'] = html_print_button( - __('Edit agent'), - 'edit_agent_link', - false, - $urlAgent, + $row['data'] = html_print_anchor( [ - 'mode' => 'link', - 'style' => 'float: right;justify-content: end;padding: 0;', + 'href' => $urlAgent, + 'title' => __('Click here for view this agent'), + 'class' => 'font_11', + 'content' => $cellName, ], true ); - $row['data'] = ''; - $table->data['edit_button'] = $row; + + $table->data['name'] = $row; // Addresses. $ips = []; @@ -699,134 +686,41 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) ); $table->data['next_contact'] = $row; - // End of table. - $agent_table = html_print_table($table, true); - /* - if ($user_access_node && check_acl($config['id_user'], $agent['id_grupo'], 'AW')) { - $go_to_agent = ''; - - $agent_table .= $go_to_agent; - } - */ // Title. echo ''; // Print agent data toggle. - echo $agent_table; + html_print_table($table); - // Advanced data. - $table = new StdClass(); - $table->width = '100%'; - $table->class = 'floating_form'; - $table->id = 'tree_view_agent_advanced'; - $table->style = []; - $table->style['title'] = 'height: 32px; width: 30%; padding-right: 5px; text-align: end;'; - $table->style['data'] = 'height: 32px; width: 70%; padding-left: 5px; font-family: \'Pandora-Regular\';'; - $table->head = []; - $table->data = []; + // Events graph toggle. + $eventsGraph = html_print_div( + [ + 'class' => 'graphic_agents', + 'content' => graph_graphic_agentevents( + $id_agente, + '500px;', + '100px', + SECONDS_1DAY, + '', + true, + false, + 550, + 1, + $server_id + ), + ], + true + ); - // Agent version. - $row = []; - $row['title'] = __('Agent Version'); - $row['data'] = $agent['agent_version']; - $table->data['agent_version'] = $row; - - // Position Information. - if ($config['activate_gis']) { - $dataPositionAgent = gis_get_data_last_position_agent($agent['id_agente']); - - if ($dataPositionAgent !== false) { - if (empty($dataPositionAgent['description']) === false) { - $positionContent .= $dataPositionAgent['description']; - } else { - $positionContent .= $dataPositionAgent['stored_longitude'].', '.$dataPositionAgent['stored_latitude']; - } - - $position = html_print_anchor( - [ - 'href' => $console_url.'index.php?sec=estado&sec2=operation/agentes/ver_agente&tab=gis&id_agente='.$id_agente, - 'content' => $positionContent, - ], - true - ); - - $row = []; - $row['title'] = __('Position (Long, Lat)'); - $row['data'] = $position; - $table->data['agent_position'] = $row; - } - } - - // If the url description is setted. - if (empty($agent['url_address']) === false) { - $row = []; - $row['title'] = __('Url address'); - $row['data'] = html_print_anchor( - [ - 'href' => $agent['url_address'], - 'content' => $agent['url_address'], - ], - true - ); - $table->data['agent_address'] = $row; - } - - // Timezone Offset. - if ($agent['timezone_offset'] != 0) { - $row = []; - $row['title'] = __('Timezone Offset'); - $row['data'] = $agent['timezone_offset']; - $table->data['agent_timezone_offset'] = $row; - } - - // Custom fields - $fields = db_get_all_rows_filter('tagent_custom_fields', ['display_on_front' => 1]); - if ($fields === false) { - $fields = []; - } - - if ($fields) { - foreach ($fields as $field) { - $custom_value = db_get_value_filter('description', 'tagent_custom_data', ['id_field' => $field['id_field'], 'id_agent' => $id_agente]); - if (!empty($custom_value)) { - $row = []; - $row['title'] = $field['name'].ui_print_help_tip(__('Custom field'), true); - if ($field['is_password_type']) { - $row['data'] = '••••••••'; - } else { - $row['data'] = ui_bbcode_to_html($custom_value); - } - - $table->data['custom_field_'.$field['id_field']] = $row; - } - } - } - - // End of table advanced. - $table_advanced = html_print_table($table, true); ui_toggle( - $table_advanced, - ''.__('Advanced information').'', + $eventsGraph, + ''.__('Events (24h)').'', '', '', - true, + false, false, '', - 'white-box-content border-bottom-gray', - 'white_table_graph margin-top-10 margin-bottom-10' + 'white-box-content', + 'white_table_graph margin-bottom-10 border-bottom-gray' ); if ($config['agentaccess']) { @@ -850,32 +744,6 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) ); } - $events_graph = '
    '; - $events_graph .= graph_graphic_agentevents( - $id_agente, - '340px;margin:0', - '60px', - SECONDS_1DAY, - '', - true, - false, - 550, - 1, - $server_id - ); - $events_graph .= '

    '; - ui_toggle( - $events_graph, - ''.__('Events (24h)').'', - '', - '', - true, - false, - '', - 'white-box-content', - 'white_table_graph margin-bottom-10 border-bottom-gray' - ); - // Table network interfaces. $network_interfaces_by_agents = agents_get_network_interfaces([$agent]); @@ -947,7 +815,108 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) ui_toggle($table_interfaces, __('Interface information').' (SNMP)'); } - if (!empty($server_data) && is_metaconsole()) { + // Advanced data. + $table_advanced = new StdClass(); + $table_advanced->width = '100%'; + $table_advanced->class = 'floating_form'; + $table_advanced->id = 'tree_view_agent_advanced'; + $table_advanced->style = []; + $table_advanced->style['title'] = 'height: 32px; width: 30%; padding-right: 5px; text-align: end;'; + $table_advanced->style['data'] = 'height: 32px; width: 70%; padding-left: 5px; font-family: \'Pandora-Regular\';'; + $table_advanced->head = []; + $table_advanced->data = []; + + // Agent version. + $row = []; + $row['title'] = __('Agent Version'); + $row['data'] = $agent['agent_version']; + $table_advanced->data['agent_version'] = $row; + + // Position Information. + if ($config['activate_gis']) { + $dataPositionAgent = gis_get_data_last_position_agent($agent['id_agente']); + + if ($dataPositionAgent !== false) { + if (empty($dataPositionAgent['description']) === false) { + $positionContent .= $dataPositionAgent['description']; + } else { + $positionContent .= $dataPositionAgent['stored_longitude'].', '.$dataPositionAgent['stored_latitude']; + } + + $position = html_print_anchor( + [ + 'href' => $console_url.'index.php?sec=estado&sec2=operation/agentes/ver_agente&tab=gis&id_agente='.$id_agente, + 'content' => $positionContent, + ], + true + ); + + $row = []; + $row['title'] = __('Position (Long, Lat)'); + $row['data'] = $position; + $table_advanced->data['agent_position'] = $row; + } + } + + // If the url description is setted. + if (empty($agent['url_address']) === false) { + $row = []; + $row['title'] = __('Url address'); + $row['data'] = html_print_anchor( + [ + 'href' => $agent['url_address'], + 'content' => $agent['url_address'], + ], + true + ); + $table_advanced->data['agent_address'] = $row; + } + + // Timezone Offset. + if ($agent['timezone_offset'] != 0) { + $row = []; + $row['title'] = __('Timezone Offset'); + $row['data'] = $agent['timezone_offset']; + $table_advanced->data['agent_timezone_offset'] = $row; + } + + // Custom fields. + $fields = db_get_all_rows_filter('tagent_custom_fields', ['display_on_front' => 1]); + if ($fields === false) { + $fields = []; + } + + if ($fields) { + foreach ($fields as $field) { + $custom_value = db_get_value_filter('description', 'tagent_custom_data', ['id_field' => $field['id_field'], 'id_agent' => $id_agente]); + if (empty($custom_value) === false) { + $row = []; + $row['title'] = $field['name'].ui_print_help_tip(__('Custom field'), true); + if ($field['is_password_type']) { + $row['data'] = '••••••••'; + } else { + $row['data'] = ui_bbcode_to_html($custom_value); + } + + $table_advanced->data['custom_field_'.$field['id_field']] = $row; + } + } + } + + // End of table advanced. + ui_toggle( + html_print_table($table_advanced, true), + ''.__('Advanced information').'', + '', + '', + true, + false, + '', + 'white-box-content border-bottom-gray', + 'white_table_graph margin-top-10 margin-bottom-10' + ); + + if (empty($server_data) === false && is_metaconsole() === true) { metaconsole_restore_db(); } diff --git a/pandora_console/include/styles/tree.css b/pandora_console/include/styles/tree.css index edab87260c..54bc3753df 100644 --- a/pandora_console/include/styles/tree.css +++ b/pandora_console/include/styles/tree.css @@ -8,10 +8,12 @@ flex-direction: row; flex-wrap: wrap; align-items: center; + /* width: calc(100% - 24px); border: 1px solid #eaeaea; border-radius: 4px; background-color: #fff; + */ margin-bottom: 8px; } diff --git a/pandora_console/operation/agentes/estado_generalagente.php b/pandora_console/operation/agentes/estado_generalagente.php index e6e8193134..e81839c02d 100755 --- a/pandora_console/operation/agentes/estado_generalagente.php +++ b/pandora_console/operation/agentes/estado_generalagente.php @@ -462,9 +462,9 @@ $data = []; $data[0] = __('Next contact'); $data[1] = ui_progress( $progress, - '97%', - 2.1, - '#BBB', + '80%', + '1.2', + '#ececec', true, $progressCaption, [ @@ -475,7 +475,8 @@ $data[1] = ui_progress( 'refresh_contact' => 1, ], - ] + ], + 'line-height: 13px;' ); $table_contact->data[] = $data; diff --git a/pandora_console/operation/agentes/estado_monitores.php b/pandora_console/operation/agentes/estado_monitores.php index 6d3c710ba7..150aaff728 100755 --- a/pandora_console/operation/agentes/estado_monitores.php +++ b/pandora_console/operation/agentes/estado_monitores.php @@ -521,30 +521,6 @@ function print_form_filter_monitors( AGENT_MODULE_STATUS_UNKNOWN => __('Unknown'), ]; - $table->data[0][1] = html_print_select( - $status_list, - 'status_filter_monitor', - $status_filter_monitor, - '', - '', - 0, - true - ); - - $table->data[0][2] = __('Free text for search (*):').ui_print_help_tip( - __('Search by module name or alert name, list matches.'), - true - ); - - $table->data[0][3] = html_print_input_text( - 'status_text_monitor', - $status_text_monitor, - '', - '', - 100, - true - ); - $table->data[0][4] = __('Module group'); $rows = db_get_all_rows_sql( sprintf( 'SELECT * From bd26aa8f8d6a108acd7c2589f24a3d9f15f5057f Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Wed, 1 Feb 2023 15:31:02 +0100 Subject: [PATCH 146/563] Minor fixes --- .../include/javascript/tree/TreeController.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/pandora_console/include/javascript/tree/TreeController.js b/pandora_console/include/javascript/tree/TreeController.js index 3dd22194dc..51c69830cd 100644 --- a/pandora_console/include/javascript/tree/TreeController.js +++ b/pandora_console/include/javascript/tree/TreeController.js @@ -622,7 +622,6 @@ var TreeController = { data: postData, success: function(data, textStatus, xhr) { callback(null, data); - console.log(data); $("#fixed-bottom-box-head-title").html( $("#fixedBottomHeadTitle").html() ); @@ -1281,8 +1280,6 @@ var TreeController = { if (error) { // console.error(error); } else { - console.log(element.name); - console.log("1"); controller.detailRecipient .render(element.name, data) .open(); @@ -1312,14 +1309,15 @@ var TreeController = { // Add children var $children = _processGroup($node, element.children); $node.data("children", $children); - + /* if ( typeof element.searchChildren == "undefined" || !element.searchChildren ) { $leafIcon.click(function(e) { + console.log(e); e.preventDefault(); - + return; if ($node.hasClass("leaf-open")) { $node .removeClass("leaf-open") @@ -1335,6 +1333,7 @@ var TreeController = { } }); } + */ } if ( From e465fb67596758b1c039f34a91f3d70c71574688 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Wed, 1 Feb 2023 17:35:56 +0100 Subject: [PATCH 147/563] #9003 changed merging tool for command center in warning --- pandora_console/general/node_deactivated.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/general/node_deactivated.php b/pandora_console/general/node_deactivated.php index ae0e3b8f24..c88f4f599e 100644 --- a/pandora_console/general/node_deactivated.php +++ b/pandora_console/general/node_deactivated.php @@ -56,7 +56,7 @@ ui_require_css_file('maintenance'); 'Please navigate to %s to unify system', ''.__('merging tool').'' + ).'" target="_new">'.__('command center').'' ); ?>

    From 1d8112ae74dbcbbeb421ff9ac735c897b4677690 Mon Sep 17 00:00:00 2001 From: Pablo Aragon Date: Thu, 2 Feb 2023 10:05:24 +0100 Subject: [PATCH 148/563] 9983-Changes inventory reports --- .../reporting_builder.item_editor.php | 109 +++++++++--- .../godmode/reporting/reporting_builder.php | 10 ++ .../include/functions_reporting.php | 165 ++++++++++++++---- .../include/functions_reporting_html.php | 139 +++++++++++++-- pandora_console/include/functions_tags.php | 2 +- 5 files changed, 351 insertions(+), 74 deletions(-) diff --git a/pandora_console/godmode/reporting/reporting_builder.item_editor.php b/pandora_console/godmode/reporting/reporting_builder.item_editor.php index 80e72e65cf..fb9f653316 100755 --- a/pandora_console/godmode/reporting/reporting_builder.item_editor.php +++ b/pandora_console/godmode/reporting/reporting_builder.item_editor.php @@ -923,6 +923,12 @@ switch ($action) { $selected_agent_group_filter = $es['agent_group_filter']; $selected_module_group = $es['module_group']; + + $search_module_name = $es['search_module_name']; + $tags = $es['tags']; + $alias = $es['alias']; + $description_switch = $es['description_switch']; + $last_status_change = $es['last_status_change']; break; case 'inventory': @@ -3880,38 +3886,93 @@ $class = 'databox filters'; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -6376,6 +6437,11 @@ function chooseType() { $("#row_agent_group_filter").hide(); $("#row_module_group_filter").hide(); $("#row_module_group_filter").hide(); + $("#row_alias").hide(); + $("#row_search_module_name").hide(); + $("#row_description_switch").hide(); + $("#row_last_status_change").hide(); + $("#row_tags").hide(); $("#row_os").hide(); $("#row_custom_field_filter").hide(); $("#row_custom_field").hide(); @@ -7002,7 +7068,6 @@ function chooseType() { $("#row_agents_inventory_display_options").show(); $("#row_agent_server_filter").show(); $("#row_agent_group_filter").show(); - $("#row_group").show(); $("#row_os").show(); $("#row_custom_field").show(); $("#row_custom_field_filter").show(); @@ -7028,10 +7093,14 @@ function chooseType() { break; case 'modules_inventory': - $("#row_group").show(); $("#row_agent_server_filter").show(); $("#row_agent_group_filter").show(); $("#row_module_group_filter").show(); + $("#row_alias").show(); + $("#row_search_module_name").show(); + $("#row_description_switch").show(); + $("#row_last_status_change").show(); + $("#row_tags").show(); break; diff --git a/pandora_console/godmode/reporting/reporting_builder.php b/pandora_console/godmode/reporting/reporting_builder.php index 5e3d76bfc4..5ecb194b23 100755 --- a/pandora_console/godmode/reporting/reporting_builder.php +++ b/pandora_console/godmode/reporting/reporting_builder.php @@ -2333,6 +2333,11 @@ switch ($action) { $es['agent_server_filter'] = get_parameter('agent_server_filter'); $es['module_group'] = get_parameter('module_group'); $es['agent_group_filter'] = get_parameter('agent_group_filter'); + $es['search_module_name'] = get_parameter('search_module_name'); + $es['tags'] = get_parameter('tags'); + $es['alias'] = get_parameter('alias', ''); + $es['description_switch'] = get_parameter('description_switch', ''); + $es['last_status_change'] = get_parameter('last_status_change', ''); $values['external_source'] = json_encode($es); break; @@ -3121,6 +3126,11 @@ switch ($action) { $es['agent_server_filter'] = get_parameter('agent_server_filter'); $es['module_group'] = get_parameter('module_group'); $es['agent_group_filter'] = get_parameter('agent_group_filter'); + $es['search_module_name'] = get_parameter('search_module_name'); + $es['tags'] = get_parameter('tags'); + $es['alias'] = get_parameter('alias', ''); + $es['description_switch'] = get_parameter('description_switch', ''); + $es['last_status_change'] = get_parameter('last_status_change', ''); $values['external_source'] = json_encode($es); break; diff --git a/pandora_console/include/functions_reporting.php b/pandora_console/include/functions_reporting.php index 637ae59752..7a928f2dfc 100755 --- a/pandora_console/include/functions_reporting.php +++ b/pandora_console/include/functions_reporting.php @@ -2619,9 +2619,10 @@ function reporting_agents_inventory($report, $content) $custom_field_sql = ''; $search_sql = ''; + $sql_order_by = 'ORDER BY tagente.id_agente ASC'; if (empty(array_filter($es_agent_custom_fields)) === false) { - $custom_field_sql = 'INNER JOIN tagent_custom_data tacd ON tacd.id_agent = tagente.id_agente'; + $custom_field_sql = 'LEFT JOIN tagent_custom_data tacd ON tacd.id_agent = tagente.id_agente'; if ($es_agent_custom_fields[0] != 0) { $custom_field_sql .= ' AND tacd.id_field IN ('.implode(',', $es_agent_custom_fields).')'; } @@ -2655,6 +2656,12 @@ function reporting_agents_inventory($report, $content) $user_groups_to_sql = implode(',', array_keys(users_get_groups())); + if (array_search('alias', $es_agents_inventory_display_options) !== false) { + $sql_order_by = 'ORDER BY tagente.alias ASC'; + } else if (array_search('direccion', $es_agents_inventory_display_options) !== false) { + $sql_order_by = 'ORDER BY tagente.direccion ASC'; + } + $sql = sprintf( 'SELECT DISTINCT(tagente.id_agente) AS id_agente, tagente.id_os, @@ -2670,12 +2677,12 @@ function reporting_agents_inventory($report, $content) LEFT JOIN tagente_modulo tam ON tam.id_agente = tagente.id_agente %s - WHERE (tagente.id_grupo IN (%s) OR tasg.id_group IN (%s)) - %s', + WHERE (tagente.id_grupo IN (%s) OR tasg.id_group IN (%s))%s%s', $custom_field_sql, $user_groups_to_sql, $user_groups_to_sql, - $search_sql + $search_sql, + $sql_order_by ); if (is_metaconsole()) { @@ -2807,11 +2814,16 @@ function reporting_modules_inventory($report, $content) $search_sql = ''; if (empty($es_agent_group_filter) === false) { - $search_sql .= ' AND (ta.id_grupo = '.$es_agent_group_filter.' OR tasg.id_group = '.$es_agent_group_filter.')'; + $search_sql .= '(ta.id_grupo = '.$es_agent_group_filter.' OR tasg.id_group = '.$es_agent_group_filter.')'; } if (empty($module_group) === false && $module_group > -1) { - $search_sql .= ' AND tam.id_module_group = '.$module_group; + $modules = implode(',', $module_group); + if ($search_sql !== '') { + $search_sql .= ' AND '; + } + + $search_sql .= 'tam.id_module_group IN ('.$modules.')'; } $user_groups_to_sql = ''; @@ -2821,25 +2833,80 @@ function reporting_modules_inventory($report, $content) $user_groups = $user_groupsAR; $user_groups_to_sql = implode(',', array_keys($user_groups)); + $sql_alias = ''; + $sql_order_by = 'ORDER BY tam.nombre ASC'; + if ((int) $external_source['alias'] === 1) { + $sql_alias = " ta.alias,\n "; + $sql_order_by = 'ORDER BY ta.alias ASC, tam.nombre ASC'; + } + + $sql_description = ''; + if ((int) $external_source['description_switch'] === 1) { + $sql_description = "\n tam.descripcion,"; + } + + $sql_last_status = ''; + $sql_last_status_join = ''; + if ((int) $external_source['last_status_change'] === 1) { + $sql_last_status = ",\n tae.last_status_change"; + $sql_last_status_join = "\n LEFT JOIN tagente_estado tae"; + $sql_last_status_join .= "\n ON tae.id_agente_modulo = tam.id_agente_modulo"; + } + + if (empty($external_source['search_module_name']) === false) { + if ($search_sql !== '') { + $search_sql .= ' AND '; + } + + $search_sql .= "tam.nombre LIKE '%".$external_source['search_module_name']."%'"; + } + + $tags_condition = tags_get_user_tags(); + $tags_imploded = implode(',', array_keys($tags_condition)); + if (users_is_admin() === false) { + if ($search_sql !== '') { + $search_sql .= ' AND '; + } + + $search_sql .= 'ttm.id_tag IN ('.$tags_imploded.')'; + } + + if (empty($external_source['tags']) === false) { + $external_tags_imploded = implode(',', $external_source['tags']); + if ($search_sql !== '') { + $search_sql .= ' AND '; + } + + $search_sql .= 'ttm.id_tag IN ('.$external_tags_imploded.')'; + } + + $sql_where = ''; + if (empty($search_sql) === false) { + $sql_where .= 'WHERE '.$search_sql; + } + $sql = sprintf( - 'SELECT tam.id_agente_modulo, - tam.nombre, - tam.descripcion, + 'SELECT DISTINCT(tam.id_agente_modulo), + %s tam.id_agente_modulo, + tam.nombre,%s tam.id_module_group, - ttm.id_tag, ta.id_grupo AS group_id, - tasg.id_group AS sec_group_id + tasg.id_group AS sec_group_id%s FROM tagente_modulo tam INNER JOIN tagente ta ON tam.id_agente = ta.id_agente LEFT JOIN tagent_secondary_group tasg ON ta.id_agente = tasg.id_agent LEFT JOIN ttag_module ttm - ON ttm.id_agente_modulo = tam.id_agente_modulo - WHERE (ta.id_grupo IN (%s) OR tasg.id_group IN (%s)) %s', - $user_groups_to_sql, - $user_groups_to_sql, - $search_sql + ON ttm.id_agente_modulo = tam.id_agente_modulo%s + %s + %s', + $sql_alias, + $sql_description, + $sql_last_status, + $sql_last_status_join, + $sql_where, + $sql_order_by ); if (is_metaconsole()) { @@ -2865,6 +2932,23 @@ function reporting_modules_inventory($report, $content) $agents = db_get_all_rows_sql($sql); + foreach ($agents as $agent_key => $agent_value) { + $sql2 = 'SELECT tm.id_tag + FROM ttag_module tm + WHERE tm.id_agente_modulo = '.$agent_value['id_agente_modulo']; + + $tags_rows = db_get_all_rows_sql($sql2); + $tags_ids = []; + + foreach ($tags_rows as $tag_row) { + array_push($tags_ids, $tag_row['id_tag']); + } + + $column_value = implode(',', $tags_ids); + $agents[$agent_key]['tags'] = $column_value; + $agents[$agent_key]['server_id'] = $server_id; + } + $return_data[$server_id] = $agents; if (is_metaconsole()) { @@ -2884,33 +2968,44 @@ function reporting_modules_inventory($report, $content) $module_row_data = []; + $i = 0; + foreach ($return['data'] as $row) { - if (is_array($module_row_data[$row['id_agente_modulo']]) === false) { - $module_row_data[$row['id_agente_modulo']]['nombre'] = $row['nombre']; - $module_row_data[$row['id_agente_modulo']]['descripcion'] = $row['descripcion']; - $module_row_data[$row['id_agente_modulo']]['id_module_group'] = $row['id_module_group']; - $module_row_data[$row['id_agente_modulo']]['id_tag'] = []; - $module_row_data[$row['id_agente_modulo']]['group_id'] = []; - $module_row_data[$row['id_agente_modulo']]['sec_group_id'] = []; + if (array_key_exists('alias', $row) === true) { + $module_row_data[$i]['alias'] = $row['alias']; } - if (in_array($row['id_tag'], $module_row_data[$row['id_agente_modulo']]['id_tag']) === false - && $row['id_tag'] !== null - ) { - $module_row_data[$row['id_agente_modulo']]['id_tag'][] = $row['id_tag']; + if (array_key_exists('nombre', $row) === true) { + $module_row_data[$i]['nombre'] = $row['nombre']; } - if (in_array($row['group_id'], $module_row_data[$row['id_agente_modulo']]['group_id']) === false - && $row['group_id'] !== null - ) { - $module_row_data[$row['id_agente_modulo']]['group_id'][] = $row['group_id']; + if (array_key_exists('descripcion', $row) === true) { + $module_row_data[$i]['descripcion'] = $row['descripcion']; } - if (in_array($row['sec_group_id'], $module_row_data[$row['id_agente_modulo']]['sec_group_id']) === false - && $row['sec_group_id'] !== null - ) { - $module_row_data[$row['id_agente_modulo']]['sec_group_id'][] = $row['sec_group_id']; + $module_row_data[$i]['id_module_group'] = $row['id_module_group']; + $module_row_data[$i]['id_tag'] = []; + $module_row_data[$i]['group_id'] = []; + $module_row_data[$i]['sec_group_id'] = []; + + if (array_key_exists('tags', $row) === true) { + $module_row_data[$i]['id_tag'][] = $row['tags']; } + + if (array_key_exists('id_group', $row) === true) { + $module_row_data[$i]['group_id'][] = $row['group_id']; + } + + if (array_key_exists('sec_group_id', $row) === true) { + $module_row_data[$i]['sec_group_id'][] = $row['sec_group_id']; + } + + if (array_key_exists('last_status_change', $row) === true) { + $human_last_status_change = human_time_comparation($row['last_status_change']); + $module_row_data[$i]['last_status_change'] = $human_last_status_change; + } + + $i++; } $return['data'] = $module_row_data; diff --git a/pandora_console/include/functions_reporting_html.php b/pandora_console/include/functions_reporting_html.php index 8d709a1003..520d7a834f 100644 --- a/pandora_console/include/functions_reporting_html.php +++ b/pandora_console/include/functions_reporting_html.php @@ -1551,6 +1551,57 @@ function reporting_html_agents_inventory($table, $item, $pdf=0) $table1->head = []; + // Sort array columns. + $tmp_sort_array = []; + foreach ($item['data'] as $data_key => $data_value) { + if (array_key_exists('alias', $data_value) === true) { + $tmp_sort_array['alias'] = $data_value['alias']; + } + + if (array_key_exists('direccion', $data_value) === true) { + $tmp_sort_array['direccion'] = $data_value['direccion']; + } + + if (array_key_exists('id_os', $data_value) === true) { + $tmp_sort_array['id_os'] = $data_value['id_os']; + } + + if (array_key_exists('agent_version', $data_value) === true) { + $tmp_sort_array['agent_version'] = $data_value['agent_version']; + } + + if (array_key_exists('id_grupo', $data_value) === true) { + $tmp_sort_array['id_grupo'] = $data_value['id_grupo']; + } + + if (array_key_exists('comentarios', $data_value) === true) { + $tmp_sort_array['comentarios'] = $data_value['comentarios']; + } + + if (array_key_exists('url_address', $data_value) === true) { + $tmp_sort_array['url_address'] = $data_value['url_address']; + } + + if (array_key_exists('remote', $data_value) === true) { + $tmp_sort_array['remote'] = $data_value['remote']; + } + + if (array_key_exists('secondary_groups', $data_value) === true) { + $tmp_sort_array['secondary_groups'] = $data_value['secondary_groups']; + } + + if (array_key_exists('custom_fields', $data_value) === true) { + $tmp_sort_array['custom_fields'] = $data_value['custom_fields']; + } + + if (array_key_exists('estado', $data_value) === true) { + $tmp_sort_array['estado'] = $data_value['estado']; + } + + unset($item['data'][$data_key]); + $item['data'][$data_key] = $tmp_sort_array; + } + foreach ($item['data'][0] as $field_key => $field_value) { switch ($field_key) { case 'alias': @@ -1632,7 +1683,7 @@ function reporting_html_agents_inventory($table, $item, $pdf=0) } else if ($data_field_key === 'estado') { $column_value = ($pdf === 0) ? ui_print_module_status((int) $data_field_value, true) : modules_get_modules_status((int) $data_field_value); } else if ($data_field_key === 'id_grupo') { - $column_value = ui_print_group_icon((int) $data_field_value, true, 'groups_small', '', $show_link); + $column_value = groups_get_name((int) $data_field_value); } else if ($data_field_key === 'custom_fields') { $custom_fields_value = []; @@ -1648,7 +1699,7 @@ function reporting_html_agents_inventory($table, $item, $pdf=0) if (is_array($data_field_value)) { foreach ($data_field_value as $value) { - $custom_fields_value[] = ui_print_group_icon((int) $value['id_group'], true, 'groups_small', '', $show_link); + $custom_fields_value[] = groups_get_name((int) $value['id_group']); } } @@ -1705,19 +1756,50 @@ function reporting_html_modules_inventory($table, $item, $pdf=0) $table1->style[0] = 'text-align: left;vertical-align: top;min-width: 100px;'; $table1->style[1] = 'text-align: left;vertical-align: top;min-width: 100px;'; - $table1->style[2] = 'text-align: left;vertical-align: top; min-width: 100px'; + $table1->style[2] = 'text-align: left;vertical-align: top;min-width: 100px;'; $table1->style[3] = 'text-align: left;vertical-align: top;min-width: 100px;'; $table1->style[4] = 'text-align: left;vertical-align: top;min-width: 100px;'; - $table1->style[5] = 'text-align: left;vertical-align: top; min-width: 100px'; + $table1->style[5] = 'text-align: left;vertical-align: top;min-width: 100px;'; + $table1->style[6] = 'text-align: left;vertical-align: top;min-width: 100px;'; + $table1->style[7] = 'text-align: left;vertical-align: top;min-width: 100px;'; $table1->head = []; + $first_index = array_key_first($item['data']); - $table1->head[] = __('Name'); - $table1->head[] = __('Description'); - $table1->head[] = __('Module group'); - $table1->head[] = __('Tags'); - $table1->head[] = __('Agent group'); - $table1->head[] = __('Agent secondary groups'); + foreach ($item['data'][$first_index] as $field_key => $field_value) { + switch ($field_key) { + case 'alias': + $table1->head[] = __('Alias'); + break; + + case 'nombre': + $table1->head[] = __('Name'); + break; + + case 'descripcion': + $table1->head[] = __('Description'); + break; + + case 'id_module_group': + $table1->head[] = __('Module group'); + break; + + case 'id_tag': + $table1->head[] = __('Tags'); + break; + + case 'group_id': + $table1->head[] = __('Agent group'); + break; + + case 'sec_group_id': + $table1->head[] = __('Agent secondary groups'); + break; + + case 'last_status_change': + $table1->head[] = __('Last status change'); + } + } $table1->headstyle[0] = 'text-align: left'; $table1->headstyle[1] = 'text-align: left'; @@ -1725,15 +1807,20 @@ function reporting_html_modules_inventory($table, $item, $pdf=0) $table1->headstyle[3] = 'text-align: left'; $table1->headstyle[4] = 'text-align: left'; $table1->headstyle[5] = 'text-align: left'; + $table1->headstyle[6] = 'text-align: left'; + $table1->headstyle[7] = 'text-align: left'; $table1->data = []; foreach ($item['data'] as $module_id => $module_data) { + unset($module_data['server_id']); $row = []; $first_item = array_pop(array_reverse($module_data)); foreach ($module_data as $data_field_key => $data_field_value) { - if ($data_field_key === 'nombre') { + if ($data_field_key === 'alias') { + $column_value = $data_field_value; + } else if ($data_field_key === 'nombre') { $column_value = $data_field_value; } else if ($data_field_key === 'descripcion') { $column_value = $data_field_value; @@ -1746,13 +1833,27 @@ function reporting_html_modules_inventory($table, $item, $pdf=0) $column_value = $module_group_name; } else if ($data_field_key === 'id_tag') { - $tags_names = array_map( - function ($tag_id) { - return db_get_value('name', 'ttag', 'id_tag', $tag_id); - }, - $data_field_value - ); - $column_value = implode('
    ', $tags_names); + if (empty($data_field_value[0]) === false) { + $sql = 'SELECT name + FROM ttag + WHERE id_tag IN ('.$data_field_value[0].')'; + + $tags_rows = db_get_all_rows_sql($sql); + $tags_names = []; + foreach ($tags_rows as $tag_row) { + array_push($tags_names, $tag_row['name']); + } + + $column_value = implode('
    ', $tags_names); + } else { + $tags_names = array_map( + function ($tag_id) { + return db_get_value('name', 'ttag', 'id_tag', $tag_id); + }, + $data_field_value + ); + $column_value = implode('
    ', $tags_names); + } } else if ($data_field_key === 'group_id') { $column_value = groups_get_name($data_field_value[0]); } else if ($data_field_key === 'sec_group_id') { @@ -1764,6 +1865,8 @@ function reporting_html_modules_inventory($table, $item, $pdf=0) ); $column_value = implode('
    ', $sec_groups_names); + } else if ($data_field_key === 'last_status_change') { + $column_value = $data_field_value; } $row[] = $column_value; diff --git a/pandora_console/include/functions_tags.php b/pandora_console/include/functions_tags.php index 9e7d55a648..c664828a84 100644 --- a/pandora_console/include/functions_tags.php +++ b/pandora_console/include/functions_tags.php @@ -1048,7 +1048,7 @@ function tags_has_user_acl_tags($id_user=false) * @param string Access flag where check what tags have the user * @param bool returns 0 if the user has all the tags * - * @return string SQL condition for tagente_module + * @return array Returns the user's Tags */ function tags_get_user_tags($id_user=false, $access='AR', $return_tag_any=false) { From 18f2cee2a7698e6b6e4624d72d14400109eea0ce Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Thu, 2 Feb 2023 11:18:47 +0100 Subject: [PATCH 149/563] #10283 fixed filter design in snmp console --- .../include/class/SnmpConsole.class.php | 105 +++++++++--------- pandora_console/include/styles/tables.css | 22 +++- 2 files changed, 74 insertions(+), 53 deletions(-) diff --git a/pandora_console/include/class/SnmpConsole.class.php b/pandora_console/include/class/SnmpConsole.class.php index 9aae307bc5..96553d2ac4 100644 --- a/pandora_console/include/class/SnmpConsole.class.php +++ b/pandora_console/include/class/SnmpConsole.class.php @@ -413,73 +413,74 @@ class SnmpConsole extends HTML 'class' => 'flex-row', 'inputs' => [ [ - 'label' => __('Alert'), - 'type' => 'select', - 'id' => 'filter_alert', - 'name' => 'filter_alert', - 'class' => 'w200px', - 'fields' => $show_alerts, - 'return' => true, - 'selected' => $this->filter_alert, + 'label' => __('Alert'), + 'type' => 'select', + 'id' => 'filter_alert', + 'input_class' => 'filter_input_datatable', + 'name' => 'filter_alert', + 'fields' => $show_alerts, + 'return' => true, + 'selected' => $this->filter_alert, ], [ - 'label' => __('Severity'), - 'type' => 'select', - 'id' => 'filter_severity', - 'name' => 'filter_severity', - 'class' => 'w200px', - 'fields' => $severities, - 'return' => true, - 'selected' => $this->filter_severity, + 'label' => __('Severity'), + 'type' => 'select', + 'id' => 'filter_severity', + 'input_class' => 'filter_input_datatable', + 'name' => 'filter_severity', + 'fields' => $severities, + 'return' => true, + 'selected' => $this->filter_severity, ], [ - 'label' => __('Free search'), - 'type' => 'text', - 'class' => 'w400px', - 'id' => 'filter_free_search', - 'name' => 'filter_free_search', - 'value' => $this->filter_free_search, + 'label' => __('Free search'), + 'type' => 'text', + 'id' => 'filter_free_search', + 'input_class' => 'filter_input_datatable', + 'name' => 'filter_free_search', + 'value' => $this->filter_free_search, ], [ - 'label' => __('Status'), - 'type' => 'select', - 'id' => 'filter_status', - 'name' => 'filter_status', - 'class' => 'w200px', - 'fields' => $status_array, - 'return' => true, - 'selected' => $this->filter_status, + 'label' => __('Status'), + 'type' => 'select', + 'id' => 'filter_status', + 'input_class' => 'filter_input_datatable', + 'name' => 'filter_status', + 'fields' => $status_array, + 'return' => true, + 'selected' => $this->filter_status, ], [ - 'label' => __('Group by Enterprise String/IP'), - 'type' => 'select', - 'name' => 'filter_group_by', - 'selected' => $this->filter_group_by, - 'disabled' => false, - 'return' => true, - 'id' => 'filter_group_by', - 'fields' => [ + 'label' => __('Group by Enterprise String/IP'), + 'type' => 'select', + 'name' => 'filter_group_by', + 'selected' => $this->filter_group_by, + 'disabled' => false, + 'return' => true, + 'id' => 'filter_group_by', + 'input_class' => 'filter_input_datatable', + 'fields' => [ 0 => __('No'), 1 => __('Yes'), ], ], [ - 'label' => __('Max. hours old'), - 'type' => 'text', - 'class' => 'w200px', - 'id' => 'filter_hours_ago', - 'name' => 'filter_hours_ago', - 'value' => $this->filter_hours_ago, + 'label' => __('Max. hours old'), + 'type' => 'text', + 'id' => 'filter_hours_ago', + 'input_class' => 'filter_input_datatable', + 'name' => 'filter_hours_ago', + 'value' => $this->filter_hours_ago, ], [ - 'label' => __('Trap type'), - 'type' => 'select', - 'id' => 'filter_trap_type', - 'name' => 'filter_trap_type', - 'class' => 'w200px', - 'fields' => $trap_types, - 'return' => true, - 'selected' => $this->filter_trap_type, + 'label' => __('Trap type'), + 'type' => 'select', + 'id' => 'filter_trap_type', + 'input_class' => 'filter_input_datatable', + 'name' => 'filter_trap_type', + 'fields' => $trap_types, + 'return' => true, + 'selected' => $this->filter_trap_type, ], ], ], diff --git a/pandora_console/include/styles/tables.css b/pandora_console/include/styles/tables.css index 40ecaf11ba..fca924b6e0 100644 --- a/pandora_console/include/styles/tables.css +++ b/pandora_console/include/styles/tables.css @@ -323,6 +323,25 @@ a.pandora_pagination.current:hover { cursor: default; } +.filter_input_datatable { + width: 45% !important; + display: flex; + flex-wrap: nowrap; + flex-direction: row; + max-width: 450px; + min-width: 400px; +} +.filter_input_datatable input { + flex: 1; +} +.filter_input_datatable label { + width: 93px; + max-width: 100%; +} +.filter_input_datatable .select2.select2-container { + flex: 1; +} + /* Default datatable filter style */ .datatable_filter.content { display: flex; @@ -336,7 +355,8 @@ a.pandora_pagination.current:hover { } .datatable_filter.content li { flex: 1 1 auto; - margin: 1em auto; + margin: 1em 0; + padding: 0px 10px; } .sorting_desc { background: url(../../images/sort_down_green.png) no-repeat; From c9ea46e219f58da0df3eacbec1b89933add280f0 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Thu, 2 Feb 2023 11:25:59 +0100 Subject: [PATCH 150/563] #10283 align left input only in datatable_filter --- pandora_console/include/styles/tables.css | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pandora_console/include/styles/tables.css b/pandora_console/include/styles/tables.css index fca924b6e0..30592ed6db 100644 --- a/pandora_console/include/styles/tables.css +++ b/pandora_console/include/styles/tables.css @@ -341,7 +341,9 @@ a.pandora_pagination.current:hover { .filter_input_datatable .select2.select2-container { flex: 1; } - +.datatable_filter.content li.filter_input_datatable { + margin: 1em 0; +} /* Default datatable filter style */ .datatable_filter.content { display: flex; @@ -355,7 +357,7 @@ a.pandora_pagination.current:hover { } .datatable_filter.content li { flex: 1 1 auto; - margin: 1em 0; + margin: 1em auto; padding: 0px 10px; } .sorting_desc { From 5106e658c362e9599dfa2ecbc292385f20245e44 Mon Sep 17 00:00:00 2001 From: Ramon Novoa Date: Thu, 2 Feb 2023 11:49:09 +0100 Subject: [PATCH 151/563] Improve pandora_server_tasks. * Do not let pandora_server_tasks die. * Remove a query from self_monitoring that could freeze the pandora_server_tasks thread. --- pandora_server/bin/pandora_server | 180 +++++++++++++------------- pandora_server/lib/PandoraFMS/Core.pm | 11 -- 2 files changed, 91 insertions(+), 100 deletions(-) diff --git a/pandora_server/bin/pandora_server b/pandora_server/bin/pandora_server index fd8fa0d99d..1f6d17af49 100755 --- a/pandora_server/bin/pandora_server +++ b/pandora_server/bin/pandora_server @@ -387,112 +387,114 @@ sub pandora_server_tasks ($) { my $counter = 0; my $first_run = 1; while ($THRRUN == 1) { - if (pandora_is_master($pa_config) == 1) { + eval { + if (pandora_is_master($pa_config) == 1) { - # TASKS EXECUTED ONCE - # ------------------- - if ($first_run == 1) { - $first_run = 0; + # TASKS EXECUTED ONCE + # ------------------- + if ($first_run == 1) { + $first_run = 0; - # Update the agent cache. - enterprise_hook('update_agent_cache', [\%Config]); - } - - # TASKS EXECUTED EVERY 5 SECONDS (Low latency tasks) - # -------------------------------------------------- - if (($counter % 5) == 0) { - - # Update forced alerts - pandora_exec_forced_alerts ($pa_config, $dbh); - - my @agents = get_db_rows ($dbh, 'SELECT id_agente, update_alert_count FROM tagente WHERE update_alert_count=1'); - foreach my $agent (@agents) { - if ($agent->{'update_alert_count'} == 1) { - pandora_update_agent_alert_count ($pa_config, $dbh, $agent->{'id_agente'}); - } + # Update the agent cache. + enterprise_hook('update_agent_cache', [\%Config]); } - } - # TASKS EXECUTED EVERY 30 SECONDS (Mid latency tasks) - # --------------------------------------------------- - if (($counter % 30) == 0) { + # TASKS EXECUTED EVERY 5 SECONDS (Low latency tasks) + # -------------------------------------------------- + if (($counter % 5) == 0) { - # Update module status and fired alert counts - my @agents = get_db_rows ($dbh, 'SELECT id_agente, nombre, update_module_count, update_secondary_groups FROM tagente WHERE (update_module_count=1 OR update_secondary_groups=1)'); - foreach my $agent (@agents) { - logger ($pa_config, "Updating module status and fired alert counts for agent " . $agent->{'nombre'}, 10); + # Update forced alerts + pandora_exec_forced_alerts ($pa_config, $dbh); - if ($agent->{'update_module_count'} == 1) { - pandora_update_agent_module_count ($pa_config, $dbh, $agent->{'id_agente'}); - } - - if ($agent->{'update_secondary_groups'} == 1) { - pandora_update_secondary_groups_cache ($pa_config, $dbh, $agent->{'id_agente'}); + my @agents = get_db_rows ($dbh, 'SELECT id_agente, update_alert_count FROM tagente WHERE update_alert_count=1'); + foreach my $agent (@agents) { + if ($agent->{'update_alert_count'} == 1) { + pandora_update_agent_alert_count ($pa_config, $dbh, $agent->{'id_agente'}); + } } } - # Keepalive module control.(very DB intensive, not run frecuently - pandora_module_keep_alive_nd ($pa_config, $dbh); - - # Set the status of unknown modules - pandora_module_unknown ($pa_config, $dbh); - - # Check if an autodisabled agent needs to be autodisable - pandora_disable_autodisable_agents ($pa_config, $dbh); - } - - # TASKS EXECUTED EVERY 60 SECONDS (High latency tasks) - # ---------------------------------------------------- - if (($counter % 60) == 0) { - # Downtimes are executed only 30 x Server Threshold secs - pandora_planned_downtime ($pa_config, $dbh); - - # Realtime stats (Only master server!) - ( VERY HEAVY !) - # Realtimestats == 1, generated by WEB Console, not by server! - if (defined($pa_config->{"realtimestats"}) && $pa_config->{"realtimestats"} == 0){ + # TASKS EXECUTED EVERY 30 SECONDS (Mid latency tasks) + # --------------------------------------------------- + if (($counter % 30) == 0) { + + # Update module status and fired alert counts + my @agents = get_db_rows ($dbh, 'SELECT id_agente, nombre, update_module_count, update_secondary_groups FROM tagente WHERE (update_module_count=1 OR update_secondary_groups=1)'); + foreach my $agent (@agents) { + logger ($pa_config, "Updating module status and fired alert counts for agent " . $agent->{'nombre'}, 10); + + if ($agent->{'update_module_count'} == 1) { + pandora_update_agent_module_count ($pa_config, $dbh, $agent->{'id_agente'}); + } + + if ($agent->{'update_secondary_groups'} == 1) { + pandora_update_secondary_groups_cache ($pa_config, $dbh, $agent->{'id_agente'}); + } + } + + # Keepalive module control.(very DB intensive, not run frecuently + pandora_module_keep_alive_nd ($pa_config, $dbh); - # Check if I need to refresh stats - my $last_execution_stats = get_db_value ($dbh, "SELECT MAX(utimestamp) FROM tgroup_stat"); - if (!defined($last_execution_stats) || $last_execution_stats < (time() - $pa_config->{"stats_interval"})){ - pandora_group_statistics ($pa_config, $dbh); - pandora_server_statistics ($pa_config, $dbh); - } + # Set the status of unknown modules + pandora_module_unknown ($pa_config, $dbh); + + # Check if an autodisabled agent needs to be autodisable + pandora_disable_autodisable_agents ($pa_config, $dbh); } - # Check if snmptrapd is freeze. - pandora_snmptrapd_still_working ($pa_config, $dbh); + # TASKS EXECUTED EVERY 60 SECONDS (High latency tasks) + # ---------------------------------------------------- + if (($counter % 60) == 0) { + # Downtimes are executed only 30 x Server Threshold secs + pandora_planned_downtime ($pa_config, $dbh); + + # Realtime stats (Only master server!) - ( VERY HEAVY !) + # Realtimestats == 1, generated by WEB Console, not by server! + if (defined($pa_config->{"realtimestats"}) && $pa_config->{"realtimestats"} == 0){ + + # Check if I need to refresh stats + my $last_execution_stats = get_db_value ($dbh, "SELECT MAX(utimestamp) FROM tgroup_stat"); + if (!defined($last_execution_stats) || $last_execution_stats < (time() - $pa_config->{"stats_interval"})){ + pandora_group_statistics ($pa_config, $dbh); + pandora_server_statistics ($pa_config, $dbh); + } + } + + # Check if snmptrapd is freeze. + pandora_snmptrapd_still_working ($pa_config, $dbh); - # Event auto-expiry - my $expiry_time = $pa_config->{"event_expiry_time"}; - my $expiry_window = $pa_config->{"event_expiry_window"}; - if ($expiry_time > 0 && $expiry_window > 0 && $expiry_window > $expiry_time) { - my $time_ref = time (); - my $expiry_limit = $time_ref - $expiry_time; - my $expiry_window = $time_ref - $expiry_window; - db_do ($dbh, 'UPDATE tevento SET estado=1, ack_utimestamp=? WHERE estado=0 AND utimestamp < ? AND utimestamp > ?', $time_ref, $expiry_limit, $expiry_window); + # Event auto-expiry + my $expiry_time = $pa_config->{"event_expiry_time"}; + my $expiry_window = $pa_config->{"event_expiry_window"}; + if ($expiry_time > 0 && $expiry_window > 0 && $expiry_window > $expiry_time) { + my $time_ref = time (); + my $expiry_limit = $time_ref - $expiry_time; + my $expiry_window = $time_ref - $expiry_window; + db_do ($dbh, 'UPDATE tevento SET estado=1, ack_utimestamp=? WHERE estado=0 AND utimestamp < ? AND utimestamp > ?', $time_ref, $expiry_limit, $expiry_window); + } } } - } - # COMMON TASKS (master and non-master) - # --------------------------------------------------------------- - if (($counter % 30) == 0) { - # Update configuration options from the console. - pandora_get_sharedconfig ($pa_config, $dbh); + # COMMON TASKS (master and non-master) + # --------------------------------------------------------------- + if (($counter % 30) == 0) { + # Update configuration options from the console. + pandora_get_sharedconfig ($pa_config, $dbh); - # Rotate the log file. - pandora_rotate_logfile($pa_config); - - # Set event storm protection - pandora_set_event_storm_protection (pandora_get_tconfig_token ($dbh, 'event_storm_protection', 0)); - } - # Pandora self monitoring - if (defined($pa_config->{"self_monitoring"}) - && $pa_config->{"self_monitoring"} == 1 - && !is_metaconsole($pa_config) - && $counter % $pa_config->{'self_monitoring_interval'} == 0) { - pandora_self_monitoring ($pa_config, $dbh); - } + # Rotate the log file. + pandora_rotate_logfile($pa_config); + + # Set event storm protection + pandora_set_event_storm_protection (pandora_get_tconfig_token ($dbh, 'event_storm_protection', 0)); + } + # Pandora self monitoring + if (defined($pa_config->{"self_monitoring"}) + && $pa_config->{"self_monitoring"} == 1 + && !is_metaconsole($pa_config) + && $counter % $pa_config->{'self_monitoring_interval'} == 0) { + pandora_self_monitoring ($pa_config, $dbh); + } + }; # Avoid counter overflow if ($counter >= ~0){ diff --git a/pandora_server/lib/PandoraFMS/Core.pm b/pandora_server/lib/PandoraFMS/Core.pm index b2ea690cfa..89e283a64e 100644 --- a/pandora_server/lib/PandoraFMS/Core.pm +++ b/pandora_server/lib/PandoraFMS/Core.pm @@ -6005,10 +6005,6 @@ sub pandora_self_monitoring ($$) { $pandoradb = 1; } - my $start_performance = time; - get_db_value($dbh, "SELECT COUNT(*) FROM tagente_datos"); - my $read_speed = int((time - $start_performance) * 1e6); - my $elasticsearch_perfomance = enterprise_hook("elasticsearch_performance", [$pa_config, $dbh]); $xml_output .= $elasticsearch_perfomance if defined($elasticsearch_perfomance); @@ -6055,13 +6051,6 @@ sub pandora_self_monitoring ($$) { $xml_output .=" "; } - $xml_output .=" "; - $xml_output .=" Execution_Time"; - $xml_output .=" generic_data"; - $xml_output .=" us"; - $xml_output .=" $read_speed"; - $xml_output .=" "; - $xml_output .= ""; my $filename = $pa_config->{"incomingdir"}."/".$pa_config->{'servername'}.".self.".$utimestamp.".data"; From 1437c5a0e708e4c563dc5feccab87e8425752ff6 Mon Sep 17 00:00:00 2001 From: Daniel Maya Date: Thu, 2 Feb 2023 13:28:48 +0100 Subject: [PATCH 152/563] #9663 menu redesing 3 --- pandora_console/general/new_main_menu.php | 45 +++++++++----- pandora_console/include/functions_menu.php | 3 + pandora_console/include/styles/menu2.css | 70 ++++++++++++++++++---- pandora_console/include/styles/pandora.css | 1 - 4 files changed, 92 insertions(+), 27 deletions(-) diff --git a/pandora_console/general/new_main_menu.php b/pandora_console/general/new_main_menu.php index b60fa1fd0f..f41c42a77e 100644 --- a/pandora_console/general/new_main_menu.php +++ b/pandora_console/general/new_main_menu.php @@ -77,7 +77,7 @@ echo '
    '; require 'operation/menu.php'; echo '
    '; -echo ''; $('#div_management').css('display', 'block'); }) + const id_selected = ''; + if (id_selected != '') { + $(`ul#subicon_${id_selected}`).show(); + // Arrow. + $(`#icon_${id_selected}`).children().first().children().last().removeClass('arrow_menu_down'); + $(`#icon_${id_selected}`).children().first().children().last().addClass('arrow_menu_up'); + // Span. + $(`#icon_${id_selected}`).children().first().children().eq(1).addClass('span_selected'); + } + var click_display = ""; $('.title_menu_classic').click(function() { - if (typeof(table_hover) != 'undefined') { - $("ul#sub" + table_hover[0].id).hide(); + const table_hover = $(this).parent(); + const id = table_hover[0].id; + const classes = $(`#${id}`).attr('class'); + + if (classes.includes('selected') === true) { + $(`#${id}`).removeClass('selected'); + $(`ul#sub${id}`).hide(); // Arrow. table_hover.children().first().children().last().removeClass('arrow_menu_up'); table_hover.children().first().children().last().addClass('arrow_menu_down'); // Span. table_hover.children().first().children().eq(1).removeClass('span_selected'); - if (table_hover[0].id == $(this).parent()[0].id) { - table_hover = undefined; - return; - } + } else { + $(`#${id}`).addClass('selected'); + $(`ul#sub${id}`).show(); + // Arrow. + $(this).children().last().removeClass('arrow_menu_down'); + $(this).children().last().addClass('arrow_menu_up'); + // Span. + $(this).children().eq(1).addClass('span_selected'); } - - table_hover = $(this).parent(); - handsIn = 1; - $("ul#sub" + table_hover[0].id).show(); - // Arrow. - $(this).children().last().removeClass('arrow_menu_down'); - $(this).children().last().addClass('arrow_menu_up'); - // Span. - $(this).children().eq(1).addClass('span_selected'); }); $('.has_submenu').click(function() { if (typeof(table_hover2) != 'undefined') { + $(`#${table_hover2[0].id}`).css("background-color", ""); $("#sub" + table_hover2[0].id).hide(); // Arrow. table_hover2.children().first().children().last().removeClass('arrow_menu_up'); @@ -150,6 +161,8 @@ echo '
    '; table_hover2 = $(this); handsIn2 = 1; + + $(`#${table_hover2[0].id}`).css("background-color", "#eff2f2"); $("#sub" + table_hover2[0].id).show(); // Arrow. table_hover2.children().first().children().last().removeClass('arrow_menu_down'); diff --git a/pandora_console/include/functions_menu.php b/pandora_console/include/functions_menu.php index 3f882916b2..47e55624e6 100644 --- a/pandora_console/include/functions_menu.php +++ b/pandora_console/include/functions_menu.php @@ -48,6 +48,8 @@ function menu_print_menu(&$menu) global $config; global $menuTypeClass; global $tab_active; + global $menu1_selected; + global $menu2_selected; static $idcounter = 0; echo '
    '.$comments.'
    '; -html_print_div( - [ - 'class' => 'user_edit_third_row white_box', - 'content' => html_print_div( - [ - 'class' => 'edit_user_allowed_ip', - 'content' => $allowedIP, - ], - true - ), - ] -); - if (!empty($ehorus)) { echo '
    '.$ehorus.'
    '; } echo ''; -echo '
    '; if ($config['admin_can_add_user']) { html_print_csrf_hidden(); - if ($new_user) { - html_print_input_hidden('create_user', 1); - } else { - html_print_input_hidden('update_user', 1); - } + html_print_input_hidden((($new_user === true) ? 'create_user' : 'update_user'), 1); } echo '
    '; @@ -1857,40 +1840,38 @@ if ($new_user === true) { echo ''; -if ($is_err === true && $new_user === true) { - profile_print_profile_table($id, io_safe_output($json_profile), false, true); -} else { - profile_print_profile_table($id, io_safe_output($json_profile)); -} +$actionButtons = []; -echo '
    '; - -echo '
    '; -if ($config['admin_can_add_user']) { - if ($new_user) { - html_print_submit_button( - __('Create'), - 'crtbutton', - false, - [ - 'icon' => 'wand', - 'form' => 'user_profile_form', - ] - ); +if ((bool) $config['admin_can_add_user'] === true) { + if ($new_user === true) { + $submitButtonCaption = __('Create'); + $submitButtonName = 'crtbutton'; + $submitButtonIcon = 'wand'; } else { - html_print_submit_button( - __('Update'), - 'uptbutton', - false, - [ - 'icon' => 'update', - 'form' => 'user_profile_form', - ] - ); + $submitButtonCaption = __('Update'); + $submitButtonName = 'uptbutton'; + $submitButtonIcon = 'update'; } + + $actionButtons[] = html_print_submit_button( + $submitButtonCaption, + $submitButtonName, + false, + [ + 'icon' => $submitButtonIcon, + 'form' => 'user_profile_form', + ], + true + ); } -echo '
    '; +$actionButtons[] = html_print_go_back_button( + ui_get_full_url('index.php?sec=gusuarios&sec2=godmode/users/user_list&tab=user&pure=0'), + ['button_class' => ''], + true +); + +html_print_action_buttons(implode('', $actionButtons), ['type' => 'form_action']); echo ''; diff --git a/pandora_console/godmode/users/user_management.php b/pandora_console/godmode/users/user_management.php index 9acd4684b0..f9c96da433 100644 --- a/pandora_console/godmode/users/user_management.php +++ b/pandora_console/godmode/users/user_management.php @@ -585,6 +585,10 @@ $userManagementTable->data['title_additionalSettings'][1] = html_print_subtitle_ $userManagementTable->rowclass['captions_addSettings'] = 'field_half_width pdd_t_10px'; $userManagementTable->rowclass['fields_addSettings'] = 'field_half_width'; $userManagementTable->cellstyle['fields_addSettings'][1] = 'flex-wrap: wrap'; +$userManagementTable->cellstyle['captions_addSettings'][1] = 'width: 35%'; +$userManagementTable->cellstyle['captions_addSettings'][2] = 'width: 15%'; +$userManagementTable->cellstyle['fields_addSettings'][1] = 'width: 35%'; +$userManagementTable->cellstyle['fields_addSettings'][2] = 'width: 15%'; $userManagementTable->data['captions_addSettings'][0] = __('Comments'); $userManagementTable->data['fields_addSettings'][0] = html_print_textarea( 'comments', @@ -600,16 +604,23 @@ $userManagementTable->data['captions_addSettings'][1] .= ui_print_help_tip( __('Add the source IPs that will allow console access. Each IP must be separated only by comma. * allows all.'), true ); -$userManagementTable->data['fields_addSettings'][1] = html_print_textarea( - 'allowed_ip_list', - 2, - 65, - $user_info['allowed_ip_list'], - (((bool) $view_mode === true) ? 'readonly="readonly"' : ''), +$userManagementTable->data['fields_addSettings'][1] = html_print_div( + [ + 'class' => 'edit_user_allowed_ip', + 'content' => html_print_textarea( + 'allowed_ip_list', + 2, + 65, + $user_info['allowed_ip_list'], + (((bool) $view_mode === true) ? 'readonly="readonly"' : ''), + true + ), + ], true ); -$userManagementTable->data['fields_addSettings'][1] .= html_print_div( +$userManagementTable->data['captions_addSettings'][2] = __('Allow all IPs'); +$userManagementTable->data['fields_addSettings'][2] = html_print_div( [ 'class' => 'margin-top-10', 'content' => html_print_checkbox_switch( @@ -617,9 +628,60 @@ $userManagementTable->data['fields_addSettings'][1] .= html_print_div( 0, $user_info['allowed_ip_active'], true - ).''.__('Allow all IPs').'', + ), ], true ); + +$userManagementTable->rowclass['captions_loginErrorUser'] = 'field_half_width pdd_t_10px'; +$userManagementTable->rowclass['fields_loginErrorUser'] = 'field_half_width'; +$userManagementTable->cellstyle['captions_loginErrorUser'][0] = 'width: 25%'; +$userManagementTable->cellstyle['captions_loginErrorUser'][1] = 'width: 25%'; +$userManagementTable->cellstyle['fields_loginErrorUser'][0] = 'width: 25%'; +$userManagementTable->cellstyle['fields_loginErrorUser'][1] = 'width: 25%'; +$userManagementTable->data['captions_loginErrorUser'][0] = __('Not Login'); +$userManagementTable->data['captions_loginErrorUser'][0] .= ui_print_help_tip( + __('The user with not login set only can access to API.'), + true +); +$userManagementTable->data['fields_loginErrorUser'][0] = html_print_checkbox_switch( + 'not_login', + 1, + $user_info['not_login'], + true +); + +$userManagementTable->data['captions_loginErrorUser'][1] = __('Local user'); +$userManagementTable->data['captions_loginErrorUser'][1] .= ui_print_help_tip( + __('The user with local authentication enabled will always use local authentication.'), + true +); +$userManagementTable->data['fields_loginErrorUser'][1] = html_print_checkbox_switch( + 'local_user', + 1, + $user_info['local_user'], + true +); + +$userManagementTable->data['captions_loginErrorUser'][2] = __('Session time'); +$userManagementTable->data['captions_loginErrorUser'][2] .= ui_print_help_tip( + __('This is defined in minutes, If you wish a permanent session should putting -1 in this field.'), + true +); +$userManagementTable->data['fields_loginErrorUser'][2] = html_print_input_text( + 'session_time', + $user_info['session_time'], + '', + 5, + 5, + true.false, + false, + '', + 'class="input_line_small"' +); + html_print_table($userManagementTable); + +// User Profile definition table. +profile_print_profile_table($id, io_safe_output($json_profile), false, ($is_err === true && $new_user === true)); From 31acafc00feae644f72748fb9d355d67ad0ab724 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Mon, 6 Feb 2023 09:06:34 +0100 Subject: [PATCH 162/563] #10253 Enforcement options in setup visuals and general setup --- .../godmode/setup/setup_general.php | 18 +++--- .../godmode/setup/setup_visuals.php | 60 ++++++++++++------- 2 files changed, 50 insertions(+), 28 deletions(-) diff --git a/pandora_console/godmode/setup/setup_general.php b/pandora_console/godmode/setup/setup_general.php index fa889f3071..8e26dfee27 100644 --- a/pandora_console/godmode/setup/setup_general.php +++ b/pandora_console/godmode/setup/setup_general.php @@ -512,13 +512,17 @@ $table->data[$i++][1] = html_print_checkbox_switch( ); $table->data[$i][0] = __('Limit for bulk operations'); -$table->data[$i++][1] = html_print_input_text( - 'limit_parameters_massive', - $config['limit_parameters_massive'], - '', - 10, - 10, - true +$table->data[$i++][1] = html_print_input( + [ + 'type' => 'number', + 'size' => 5, + 'max' => 2000, + 'name' => 'limit_parameters_massive', + 'value' => $config['limit_parameters_massive'], + 'return' => true, + 'min' => 100, + 'style' => 'width:50px', + ] ); $table->data[$i][0] = __('Include agents manually disabled'); diff --git a/pandora_console/godmode/setup/setup_visuals.php b/pandora_console/godmode/setup/setup_visuals.php index afc79e3f01..918747a19f 100755 --- a/pandora_console/godmode/setup/setup_visuals.php +++ b/pandora_console/godmode/setup/setup_visuals.php @@ -64,7 +64,18 @@ $table_behaviour->size[0] = '50%'; $table_behaviour->data = []; $table_behaviour->data[$row][0] = __('Block size for pagination'); -$table_behaviour->data[$row][1] = html_print_input_text('block_size', $config['global_block_size'], '', 5, 5, true); +$table_behaviour->data[$row][1] = html_print_input( + [ + 'type' => 'number', + 'size' => 5, + 'max' => 200, + 'name' => 'block_size', + 'value' => $config['global_block_size'], + 'return' => true, + 'min' => 10, + 'style' => 'width:50px', + ] +); $row++; $values = []; @@ -823,16 +834,19 @@ if (enterprise_installed() === false) { } $table_chars->data[$row][0] = __('Data precision'); -$table_chars->data[$row][1] = html_print_input_text( - 'graph_precision', - $config['graph_precision'], - '', - 5, - 5, - true, - $disabled_graph_precision, - false, - 'onChange="change_precision()"' +$table_chars->data[$row][1] = html_print_input( + [ + 'type' => 'number', + 'size' => 5, + 'max' => 5, + 'name' => 'graph_precision', + 'value' => $config['graph_precision'], + 'return' => true, + 'min' => 1, + 'style' => 'width:50px', + ($disabled_graph_precision) ? 'readonly' : '' => 'readonly', + 'onchange' => 'change_precision()', + ] ); $row++; @@ -841,17 +855,21 @@ if (isset($config['short_module_graph_data']) === false) { } $table_chars->data[$row][0] = __('Data precision in graphs'); -$table_chars->data[$row][1] = html_print_input_text( - 'short_module_graph_data', - $config['short_module_graph_data'], - '', - 5, - 5, - true, - $disabled_graph_precision, - false, - 'onChange="change_precision()"' +$table_chars->data[$row][1] = html_print_input( + [ + 'type' => 'number', + 'size' => 5, + 'max' => 20, + 'name' => 'short_module_graph_data', + 'value' => $config['short_module_graph_data'], + 'return' => true, + 'min' => 1, + 'style' => 'width:50px', + ($disabled_graph_precision) ? 'readonly' : '' => 'readonly', + 'onchange' => 'change_precision()', + ] ); + $row++; $table_chars->data[$row][0] = __( From ac144de6d62e4292f2300271be96df8fd522c5d5 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Mon, 6 Feb 2023 10:17:51 +0100 Subject: [PATCH 163/563] WIP: Minor fixes --- .../godmode/users/configure_user.php | 4 +- .../godmode/users/user_management.php | 50 +++++++++---------- pandora_console/include/styles/pandora.css | 1 + 3 files changed, 27 insertions(+), 28 deletions(-) diff --git a/pandora_console/godmode/users/configure_user.php b/pandora_console/godmode/users/configure_user.php index 2b2f31eb30..865ab8eb9d 100644 --- a/pandora_console/godmode/users/configure_user.php +++ b/pandora_console/godmode/users/configure_user.php @@ -1101,7 +1101,7 @@ if (!$new_user) { !$new_user || $view_mode, '', [ - 'class' => 'input_line user_icon_input', + 'class' => 'input_line', 'placeholder' => __('User ID'), ], true @@ -1238,7 +1238,7 @@ $email = '
    '.html_print_input_text_extended( $view_mode, '', [ - 'class' => 'input input_line email_icon_input', + 'class' => 'input input_line', 'placeholder' => __('E-mail'), ], true diff --git a/pandora_console/godmode/users/user_management.php b/pandora_console/godmode/users/user_management.php index f9c96da433..c40cf6d349 100644 --- a/pandora_console/godmode/users/user_management.php +++ b/pandora_console/godmode/users/user_management.php @@ -150,7 +150,7 @@ $userManagementTable->data['title_profile_information'][1] = html_print_subtitle // Id user. if ($new_user === true) { - $userManagementTable->rowclass['captions_iduser'] = 'field_half_width pdd_t_10px'; + $userManagementTable->rowclass['captions_iduser'] = 'field_half_width'; $userManagementTable->rowclass['fields_iduser'] = 'field_half_width'; $userManagementTable->data['captions_iduser'][0] = __('User ID'); $userManagementTable->data['fields_iduser'][0] = html_print_input_text_extended( @@ -163,7 +163,7 @@ if ($new_user === true) { !$new_user || $view_mode, '', [ - 'class' => 'input_line user_icon_input', + 'class' => 'input', 'placeholder' => __('User ID'), ], true @@ -173,7 +173,7 @@ if ($new_user === true) { } // User Full name. -$userManagementTable->rowclass['captions_fullname'] = 'field_half_width pdd_t_10px'; +$userManagementTable->rowclass['captions_fullname'] = 'field_half_width'; $userManagementTable->rowclass['fields_fullname'] = 'field_half_width'; $userManagementTable->data['captions_fullname'][0] = __('Full name'); $userManagementTable->data['fields_fullname'][0] = html_print_input_text_extended( @@ -193,7 +193,7 @@ $userManagementTable->data['fields_fullname'][0] = html_print_input_text_extende ); // User Email. -$userManagementTable->rowclass['captions_email'] = 'field_half_width pdd_t_10px'; +$userManagementTable->rowclass['captions_email'] = 'field_half_width'; $userManagementTable->rowclass['fields_email'] = 'field_half_width'; $userManagementTable->data['captions_email'][0] = __('Email'); $userManagementTable->data['fields_email'][0] = html_print_input_text_extended( @@ -206,14 +206,14 @@ $userManagementTable->data['fields_email'][0] = html_print_input_text_extended( $view_mode, '', [ - 'class' => 'input input_line email_icon_input', + 'class' => 'input', 'placeholder' => __('E-mail'), ], true ); // User phone number. -$userManagementTable->rowclass['captions_phone'] = 'field_half_width pdd_t_10px'; +$userManagementTable->rowclass['captions_phone'] = 'field_half_width'; $userManagementTable->rowclass['fields_phone'] = 'field_half_width'; $userManagementTable->data['captions_phone'][0] = __('Phone number'); $userManagementTable->data['fields_phone'][0] = html_print_input_text_extended( @@ -226,7 +226,7 @@ $userManagementTable->data['fields_phone'][0] = html_print_input_text_extended( $view_mode, '', [ - 'class' => 'input input_line phone_icon_input', + 'class' => 'input', 'placeholder' => __('Phone number'), ], true @@ -377,7 +377,7 @@ $autorefreshControlsContent[] = html_print_anchor( 'id' => 'addAutorefreshPage', 'href' => 'javascript:', 'content' => html_print_image( - 'images/darrowright_green.png', + 'images/plus.svg', true, [ 'id' => 'right_autorefreshlist', @@ -393,7 +393,7 @@ $autorefreshControlsContent[] = html_print_anchor( 'id' => 'removeAutorefreshPage', 'href' => 'javascript:', 'content' => html_print_image( - 'images/darrowleft_green.png', + 'images/minus.svg', true, [ 'id' => 'left_autorefreshlist', @@ -441,12 +441,13 @@ $autorefreshTable = html_print_div( true ); -// $userManagementTable->rowclass['captions_autorefreshList'] = 'field_half_width pdd_t_10px'; -// $userManagementTable->rowclass['fields_autorefreshList'] = 'field_half_width'; +$userManagementTable->rowclass['captions_autorefreshList'] = 'field_half_width'; +$userManagementTable->rowclass['fields_autorefreshList'] = 'field_half_width'; +// $userManagementTable->cellclass['fields_autorefreshList'][0] = 'field_half_width'; $userManagementTable->data['captions_autorefreshList'] = __('Autorefresh pages'); $userManagementTable->data['fields_autorefreshList'] = $autorefreshTable; -$userManagementTable->rowclass['captions_autorefreshTime'] = 'field_half_width pdd_t_10px'; +$userManagementTable->rowclass['captions_autorefreshTime'] = 'field_half_width'; $userManagementTable->rowclass['fields_autorefreshTime'] = 'field_half_width'; $userManagementTable->data['captions_autorefreshTime'][0] = __('Time for autorefresh'); $userManagementTable->data['captions_autorefreshTime'][0] .= ui_print_help_tip( @@ -478,7 +479,7 @@ $userManagementTable->data['title_lookAndFeel'][0] = html_print_div( ); $userManagementTable->data['title_lookAndFeel'][1] = html_print_subtitle_table(__('Language and Appearance'), [], true); -$userManagementTable->rowclass['captions_lang_colorscheme'] = 'field_half_width pdd_t_10px'; +$userManagementTable->rowclass['captions_lang_colorscheme'] = 'field_half_width'; $userManagementTable->rowclass['fields_lang_colorscheme'] = 'field_half_width'; $userManagementTable->data['captions_lang_colorscheme'][0] = __('Language'); $userManagementTable->data['fields_lang_colorscheme'][0] = html_print_select_from_sql( @@ -494,7 +495,7 @@ $userManagementTable->data['fields_lang_colorscheme'][0] = html_print_select_fro $userManagementTable->data['captions_lang_colorscheme'][1] = __('User color scheme'); $userManagementTable->data['fields_lang_colorscheme'][1] = skins_print_select($id_usr, 'skin', $user_info['id_skin'], '', __('None'), 0, true); -$userManagementTable->rowclass['captions_blocksize_eventfilter'] = 'field_half_width pdd_t_10px'; +$userManagementTable->rowclass['captions_blocksize_eventfilter'] = 'field_half_width'; $userManagementTable->rowclass['fields_blocksize_eventfilter'] = 'field_half_width'; $userManagementTable->data['captions_blocksize_eventfilter'][0] = __('Block size for pagination'); $userManagementTable->data['fields_blocksize_eventfilter'][0] = html_print_input_text( @@ -530,9 +531,9 @@ $homeScreenTable->data = []; // Home screen. $homeScreenTable->data['captions_homescreen'][0] = __('Home screen'); $homeScreenTable->colspan['captions_homescreen'] = 2; -$homeScreenTable->rowclass['captions_homescreen'] = 'field_half_width pdd_t_10px'; +$homeScreenTable->rowclass['captions_homescreen'] = 'field_half_width'; $homeScreenTable->rowclass['fields_homescreen'] = 'field_half_width'; -// $homeScreenTable->rowclass['fields_homescreen'] = 'w540px'; +$homeScreenTable->rowclass['fields_homescreen'] = 'w540px'; $homeScreenTable->data['fields_homescreen'][0] = html_print_select( $homeScreenValues, 'section', @@ -550,9 +551,10 @@ $userManagementTable->rowclass['homescreen_table'] = 'table_section'; $userManagementTable->data['homescreen_table'] = html_print_table($homeScreenTable, true); // Timezone. -$userManagementTable->rowclass['captions_timezone'] = 'field_half_width pdd_t_10px'; +$userManagementTable->rowclass['captions_timezone'] = 'field_half_width'; $userManagementTable->rowclass['fields_timezone'] = 'field_half_width'; $userManagementTable->colspan['captions_timezone'][0] = 2; +$userManagementTable->cellstyle['fields_timezone'][0] = 'align-self: baseline;'; $userManagementTable->data['captions_timezone'][0] = __('Time zone'); $userManagementTable->data['fields_timezone'][0] = html_print_timezone_select('timezone', $user_info['timezone']); $userManagementTable->data['fields_timezone'][0] .= ui_print_help_tip( @@ -568,7 +570,6 @@ $userManagementTable->data['fields_timezone'][1] = html_print_div( true ); - // Title for Language and Appearance. $userManagementTable->rowclass['title_additionalSettings'] = 'w100p'; $userManagementTable->cellstyle['title_additionalSettings'][0] = 'width: 40px;'; @@ -582,7 +583,7 @@ $userManagementTable->data['title_additionalSettings'][0] = html_print_div( ); $userManagementTable->data['title_additionalSettings'][1] = html_print_subtitle_table(__('Additional settings'), [], true); -$userManagementTable->rowclass['captions_addSettings'] = 'field_half_width pdd_t_10px'; +$userManagementTable->rowclass['captions_addSettings'] = 'field_half_width'; $userManagementTable->rowclass['fields_addSettings'] = 'field_half_width'; $userManagementTable->cellstyle['fields_addSettings'][1] = 'flex-wrap: wrap'; $userManagementTable->cellstyle['captions_addSettings'][1] = 'width: 35%'; @@ -592,7 +593,7 @@ $userManagementTable->cellstyle['fields_addSettings'][2] = 'width: 15%'; $userManagementTable->data['captions_addSettings'][0] = __('Comments'); $userManagementTable->data['fields_addSettings'][0] = html_print_textarea( 'comments', - 2, + 5, 65, $user_info['comments'], ($view_mode ? 'readonly="readonly"' : ''), @@ -609,7 +610,7 @@ $userManagementTable->data['fields_addSettings'][1] = html_print_div( 'class' => 'edit_user_allowed_ip', 'content' => html_print_textarea( 'allowed_ip_list', - 2, + 5, 65, $user_info['allowed_ip_list'], (((bool) $view_mode === true) ? 'readonly="readonly"' : ''), @@ -634,7 +635,7 @@ $userManagementTable->data['fields_addSettings'][2] = html_print_div( ); -$userManagementTable->rowclass['captions_loginErrorUser'] = 'field_half_width pdd_t_10px'; +$userManagementTable->rowclass['captions_loginErrorUser'] = 'field_half_width'; $userManagementTable->rowclass['fields_loginErrorUser'] = 'field_half_width'; $userManagementTable->cellstyle['captions_loginErrorUser'][0] = 'width: 25%'; $userManagementTable->cellstyle['captions_loginErrorUser'][1] = 'width: 25%'; @@ -675,10 +676,7 @@ $userManagementTable->data['fields_loginErrorUser'][2] = html_print_input_text( '', 5, 5, - true.false, - false, - '', - 'class="input_line_small"' + true ); html_print_table($userManagementTable); diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 1a153156c7..5a30fbbe8f 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -5283,6 +5283,7 @@ input:checked + .p-slider:before { align-items: center; justify-content: center; margin-bottom: 15px; + width: 50%; } .autorefresh_select_text { From aaae7454fa4f73acb35a575cd00886a061f20e0c Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Mon, 6 Feb 2023 10:37:01 +0100 Subject: [PATCH 164/563] #10259 create control for token agentaccess if agents morte than 200 --- pandora_console/godmode/setup/performance.php | 5 ++- .../include/class/ConsoleSupervisor.php | 39 +++++++++++++++++++ .../include/functions_notifications.php | 1 + 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/pandora_console/godmode/setup/performance.php b/pandora_console/godmode/setup/performance.php index 969ff868c1..05b0bbdf26 100644 --- a/pandora_console/godmode/setup/performance.php +++ b/pandora_console/godmode/setup/performance.php @@ -151,6 +151,9 @@ if ($update_config == 1 && $config['history_db_enabled'] == 1) { } } +$total_agents = db_get_value('count(*)', 'tagente'); +$disable_agentaccess = ($total_agents >= 200) ? true : false; + $table_status = new StdClass(); $table_status->width = '100%'; $table_status->class = 'databox filters'; @@ -577,7 +580,7 @@ $table_other->data[$i++][1] = html_print_input_text( ); $table_other->data[$i][0] = __('Use agent access graph'); -$table_other->data[$i++][1] = html_print_checkbox_switch('agentaccess', 1, $config['agentaccess'], true); +$table_other->data[$i++][1] = html_print_checkbox_switch('agentaccess', 1, $config['agentaccess'], true, $disable_agentaccess); $table_other->data[$i][0] = __('Max. recommended number of files in attachment directory'); $table_other->data[$i++][1] = html_print_input_text( diff --git a/pandora_console/include/class/ConsoleSupervisor.php b/pandora_console/include/class/ConsoleSupervisor.php index b6a6d3df43..ce6d2df301 100644 --- a/pandora_console/include/class/ConsoleSupervisor.php +++ b/pandora_console/include/class/ConsoleSupervisor.php @@ -258,6 +258,11 @@ class ConsoleSupervisor $this->checkSyncQueueStatus(); } + /* + * Check number of agents is equals and more than 200. + * NOTIF.ACCESSSTASTICS.PERFORMANCE + */ + $this->checkAccessStatisticsPerformance(); } @@ -518,6 +523,12 @@ class ConsoleSupervisor $this->checkSyncQueueLength(); $this->checkSyncQueueStatus(); } + + /* + * Check number of agents is equals and more than 200. + * NOTIF.ACCESSSTASTICS.PERFORMANCE + */ + $this->checkAccessStatisticsPerformance(); } @@ -532,6 +543,34 @@ class ConsoleSupervisor } + /** + * Check number of agents and disable agentaccess token if number + * is equals and more than 200. + * + * @return void + */ + public function checkAccessStatisticsPerformance() + { + $total_agents = db_get_value('count(*)', 'tagente'); + + if ($total_agents >= 200) { + db_process_sql_update('tconfig', ['value' => 0], ['token' => 'agentaccess']); + $this->notify( + [ + 'type' => 'NOTIF.ACCESSSTASTICS.PERFORMANCE', + 'title' => __('Access statistics performance'), + 'message' => __( + 'Usage of agent access statistics IS NOT RECOMMENDED on systems with more than 200 agents due performance penalty' + ), + 'url' => '__url__/index.php?sec=general&sec2=godmode/setup/setup§ion=perf', + ] + ); + } else { + $this->cleanNotifications('NOTIF.ACCESSSTASTICS.PERFORMANCE'); + } + } + + /** * Update targets for given notification using object targets. * diff --git a/pandora_console/include/functions_notifications.php b/pandora_console/include/functions_notifications.php index 705d67ab3b..8ed023ddde 100644 --- a/pandora_console/include/functions_notifications.php +++ b/pandora_console/include/functions_notifications.php @@ -159,6 +159,7 @@ function notifications_get_subtypes(?string $source=null) 'NOTIF.SERVER.STATUS', 'NOTIF.SERVER.QUEUE', 'NOTIF.SERVER.MASTER', + 'NOTIF.ACCESSSTASTICS.PERFORMANCE', ], ]; From b12b3c2a2c8b417a52337e7d5e2ebf3415c31897 Mon Sep 17 00:00:00 2001 From: Ramon Novoa Date: Mon, 6 Feb 2023 10:48:25 +0100 Subject: [PATCH 165/563] Limit the number of unknown modules processed per iteration. --- pandora_server/conf/pandora_server.conf.new | 5 ++- pandora_server/lib/PandoraFMS/Config.pm | 40 +++++++++++---------- pandora_server/lib/PandoraFMS/Core.pm | 2 +- 3 files changed, 26 insertions(+), 21 deletions(-) diff --git a/pandora_server/conf/pandora_server.conf.new b/pandora_server/conf/pandora_server.conf.new index 93c6857382..d04de89830 100644 --- a/pandora_server/conf/pandora_server.conf.new +++ b/pandora_server/conf/pandora_server.conf.new @@ -598,6 +598,9 @@ unknown_events 1 # Time interval (as a multiple of the module interval) before a module becomes unknown. Twice the module's interval by default. #unknown_interval 2 +# Number of unknown modules that will be processed per iteration. +unknown_block_size 1000 + # Maximum executing time of an alert (in seconds) global_alert_timeout 15 @@ -732,4 +735,4 @@ tentacle_service_watchdog 1 # Enable (1) or disable (0) the parameter of mysql ssl certification (mysql_ssl_verify_server_cert) (enabled by default). -verify_mysql_ssl_cert 1 \ No newline at end of file +verify_mysql_ssl_cert 1 diff --git a/pandora_server/lib/PandoraFMS/Config.pm b/pandora_server/lib/PandoraFMS/Config.pm index 0b93dfd8b1..5f85f686ad 100644 --- a/pandora_server/lib/PandoraFMS/Config.pm +++ b/pandora_server/lib/PandoraFMS/Config.pm @@ -527,33 +527,35 @@ sub pandora_load_config { $pa_config->{"unknown_updates"} = 0; # 7.0.718 - $pa_config->{"provisioningserver"} = 1; # 7.0 720 - $pa_config->{"provisioningserver_threads"} = 1; # 7.0 720 - $pa_config->{"provisioning_cache_interval"} = 300; # 7.0 720 + $pa_config->{"provisioningserver"} = 1; # 7.0.720 + $pa_config->{"provisioningserver_threads"} = 1; # 7.0.720 + $pa_config->{"provisioning_cache_interval"} = 300; # 7.0.720 - $pa_config->{"autoconfigure_agents"} = 1; # 7.0 725 - $pa_config->{"autoconfigure_agents_threshold"} = 300; #7.0 764 + $pa_config->{"autoconfigure_agents"} = 1; # 7.0.725 + $pa_config->{"autoconfigure_agents_threshold"} = 300; #7.0.764 - $pa_config->{'snmp_extlog'} = ""; # 7.0 726 + $pa_config->{'snmp_extlog'} = ""; # 7.0.726 - $pa_config->{"fsnmp"} = "/usr/bin/pandorafsnmp"; # 7.0 732 + $pa_config->{"fsnmp"} = "/usr/bin/pandorafsnmp"; # 7.0.732 - $pa_config->{"event_inhibit_alerts"} = 0; # 7.0 737 + $pa_config->{"event_inhibit_alerts"} = 0; # 7.0.737 - $pa_config->{"alertserver"} = 0; # 7.0 756 - $pa_config->{"alertserver_threads"} = 1; # 7.0 756 - $pa_config->{"alertserver_warn"} = 180; # 7.0 756 - $pa_config->{"alertserver_queue"} = 0; # 7.0 764 + $pa_config->{"alertserver"} = 0; # 7.0.756 + $pa_config->{"alertserver_threads"} = 1; # 7.0.756 + $pa_config->{"alertserver_warn"} = 180; # 7.0.756 + $pa_config->{"alertserver_queue"} = 0; # 7.0.764 - $pa_config->{'ncmserver'} = 0; # 7.0 758 - $pa_config->{'ncmserver_threads'} = 1; # 7.0 758 - $pa_config->{'ncm_ssh_utility'} = '/usr/share/pandora_server/util/ncm_ssh_extension'; # 7.0 758 + $pa_config->{'ncmserver'} = 0; # 7.0.758 + $pa_config->{'ncmserver_threads'} = 1; # 7.0.758 + $pa_config->{'ncm_ssh_utility'} = '/usr/share/pandora_server/util/ncm_ssh_extension'; # 7.0.758 - $pa_config->{"pandora_service_cmd"} = 'service pandora_server'; # 7.0 761 - $pa_config->{"tentacle_service_cmd"} = 'service tentacle_serverd'; # 7.0 761 - $pa_config->{"tentacle_service_watchdog"} = 1; # 7.0 761 + $pa_config->{"pandora_service_cmd"} = 'service pandora_server'; # 7.0.761 + $pa_config->{"tentacle_service_cmd"} = 'service tentacle_serverd'; # 7.0.761 + $pa_config->{"tentacle_service_watchdog"} = 1; # 7.0.761 - $pa_config->{"dataserver_smart_queue"} = 0; # 765. + $pa_config->{"dataserver_smart_queue"} = 0; # 7.0.765 + + $pa_config->{"unknown_block_size"} = 1000; # 7.0.769 # Check for UID0 if ($pa_config->{"quiet"} != 0){ diff --git a/pandora_server/lib/PandoraFMS/Core.pm b/pandora_server/lib/PandoraFMS/Core.pm index 57c3284b70..27f08b0bc7 100644 --- a/pandora_server/lib/PandoraFMS/Core.pm +++ b/pandora_server/lib/PandoraFMS/Core.pm @@ -6214,7 +6214,7 @@ sub pandora_module_unknown ($$) { ') ) AND tagente_estado.utimestamp != 0 - AND (tagente_estado.current_interval * ?) + tagente_estado.utimestamp < UNIX_TIMESTAMP()', $pa_config->{'unknown_interval'}); + AND (tagente_estado.current_interval * ?) + tagente_estado.utimestamp < UNIX_TIMESTAMP() LIMIT ?', $pa_config->{'unknown_interval'}, $pa_config->{'unknown_block_size'}); foreach my $module (@modules) { From fecee4895f234509784eb023bb5c4412bc1685ce Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Mon, 6 Feb 2023 11:04:08 +0100 Subject: [PATCH 166/563] #10259 fixed bug in agentaccess token --- pandora_console/godmode/setup/performance.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/godmode/setup/performance.php b/pandora_console/godmode/setup/performance.php index 05b0bbdf26..1e0fc4df69 100644 --- a/pandora_console/godmode/setup/performance.php +++ b/pandora_console/godmode/setup/performance.php @@ -152,7 +152,7 @@ if ($update_config == 1 && $config['history_db_enabled'] == 1) { } $total_agents = db_get_value('count(*)', 'tagente'); -$disable_agentaccess = ($total_agents >= 200) ? true : false; +$disable_agentaccess = ($total_agents >= 200 && $config['agentaccess'] == 0) ? true : false; $table_status = new StdClass(); $table_status->width = '100%'; From 3e45b548b6e833aff67ea34a8d7608ab7e2ee2a5 Mon Sep 17 00:00:00 2001 From: Calvo Date: Mon, 6 Feb 2023 11:58:50 +0100 Subject: [PATCH 167/563] Pandora db delete /tmp/cron-session-cookies file --- pandora_server/util/pandora_db.pl | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index f0437a5bfb..84fdfb75d5 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -1067,12 +1067,18 @@ sub pandora_delete_old_session_data { $ulimit_timestamp = time() - $session_timeout; - log_message ('PURGE', "Deleting old session data from tsessions_php\n"); + log_message ('PURGE', "Deleting old session data from tsessions_php"); while(db_delete_limit ($dbh, 'tsessions_php', 'last_active < ?', $SMALL_OPERATION_STEP, $ulimit_timestamp) ne '0E0') { usleep (10000); }; db_do ($dbh, "DELETE FROM tsessions_php WHERE data IS NULL OR id_session REGEXP '^cron-'"); + + # Delete cron cookies file + my $cookie_file = '/tmp/cron-session-cookies'; + log_message ('PURGE', "Deleting cron session file"); + unlink($cookie_file) or die log_message ('PURGE', "Could not delete session file"); + } ############################################################################### From a7a0886e6ce7121299492edadd84f15d50bb5aea Mon Sep 17 00:00:00 2001 From: "alejandro.campos@artica.es" Date: Mon, 6 Feb 2023 13:24:37 +0100 Subject: [PATCH 168/563] policy maintenance mode --- pandora_console/include/functions.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/pandora_console/include/functions.php b/pandora_console/include/functions.php index 7d4fee1d21..790df73e8a 100644 --- a/pandora_console/include/functions.php +++ b/pandora_console/include/functions.php @@ -6397,3 +6397,23 @@ function getBearerToken() return false; } + + +/** + * Check whether an instance of pandora_db is running. + * + * @return boolean Result. + */ +function is_pandora_db_running() +{ + $is_free_lock = mysql_db_process_sql( + 'SELECT IS_FREE_LOCK("pandora_pandora_db") AS "value"', + 'affected_rows', + '', + false + ); + + $is_free_lock = (bool) $is_free_lock[0]['value']; + + return !$is_free_lock; +} \ No newline at end of file From de3a74ae1ac61deadcfaaac4fe29ecb0dba14f26 Mon Sep 17 00:00:00 2001 From: "alejandro.campos@artica.es" Date: Mon, 6 Feb 2023 13:27:25 +0100 Subject: [PATCH 169/563] policy maintenance mode --- pandora_console/include/functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/include/functions.php b/pandora_console/include/functions.php index 790df73e8a..75e8e7ee58 100644 --- a/pandora_console/include/functions.php +++ b/pandora_console/include/functions.php @@ -6416,4 +6416,4 @@ function is_pandora_db_running() $is_free_lock = (bool) $is_free_lock[0]['value']; return !$is_free_lock; -} \ No newline at end of file +} From a1ccfc99eca99efe7b28a206adce400a3b3bb4af Mon Sep 17 00:00:00 2001 From: "alejandro.campos@artica.es" Date: Mon, 6 Feb 2023 13:41:31 +0100 Subject: [PATCH 170/563] policy maintenance mode --- pandora_console/include/functions.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pandora_console/include/functions.php b/pandora_console/include/functions.php index 75e8e7ee58..a4713b6f67 100644 --- a/pandora_console/include/functions.php +++ b/pandora_console/include/functions.php @@ -6406,8 +6406,11 @@ function getBearerToken() */ function is_pandora_db_running() { + // Get current DB name: useful for metaconsole connection to node. + $db_name = db_get_sql('SELECT DATABASE()'); + $is_free_lock = mysql_db_process_sql( - 'SELECT IS_FREE_LOCK("pandora_pandora_db") AS "value"', + 'SELECT IS_FREE_LOCK("'.$db_name.'_pandora_db") AS "value"', 'affected_rows', '', false From aedf6986b3899d769a3e905f1320b62a0d4d160e Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Mon, 6 Feb 2023 15:22:39 +0100 Subject: [PATCH 171/563] #10253 added console alert for control variables performance --- pandora_console/godmode/setup/performance.php | 66 +++++++------- .../godmode/setup/setup_general.php | 6 +- .../godmode/setup/setup_visuals.php | 14 +-- .../include/class/ConsoleSupervisor.php | 80 +++++++++++++++++ pandora_console/include/functions_config.php | 90 +++++++++++++++++++ .../include/functions_notifications.php | 1 + 6 files changed, 217 insertions(+), 40 deletions(-) diff --git a/pandora_console/godmode/setup/performance.php b/pandora_console/godmode/setup/performance.php index aa0f3d7c82..f616460e6d 100644 --- a/pandora_console/godmode/setup/performance.php +++ b/pandora_console/godmode/setup/performance.php @@ -151,6 +151,8 @@ if ($update_config == 1 && $config['history_db_enabled'] == 1) { } } +$performance_variables_control = (array) json_decode(io_safe_output($config['performance_variables_control'])); + $table_status = new StdClass(); $table_status->width = '100%'; $table_status->class = 'databox filters'; @@ -261,11 +263,11 @@ $table->data[1][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 45, + 'max' => $performance_variables_control['event_purge']->max, 'name' => 'event_purge', 'value' => $config['event_purge'], 'return' => true, - 'min' => 1, + 'min' => $performance_variables_control['event_purge']->min, 'style' => 'width:43px', ] ); @@ -275,11 +277,11 @@ $table->data[2][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 45, + 'max' => $performance_variables_control['trap_purge']->max, 'name' => 'trap_purge', 'value' => $config['trap_purge'], 'return' => true, - 'min' => 1, + 'min' => $performance_variables_control['trap_purge']->min, 'style' => 'width:43px', ] ); @@ -289,11 +291,11 @@ $table->data[3][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 365, + 'max' => $performance_variables_control['audit_purge']->max, 'name' => 'audit_purge', 'value' => $config['audit_purge'], 'return' => true, - 'min' => 7, + 'min' => $performance_variables_control['audit_purge']->min, 'style' => 'width:43px', ] ); @@ -303,11 +305,11 @@ $table->data[4][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 365, + 'max' => $performance_variables_control['string_purge']->max, 'name' => 'string_purge', 'value' => $config['string_purge'], 'return' => true, - 'min' => 7, + 'min' => $performance_variables_control['string_purge']->min, 'style' => 'width:43px', ] ); @@ -317,11 +319,11 @@ $table->data[5][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 365, + 'max' => $performance_variables_control['gis_purge']->max, 'name' => 'gis_purge', 'value' => $config['gis_purge'], 'return' => true, - 'min' => 7, + 'min' => $performance_variables_control['gis_purge']->min, 'style' => 'width:43px', ] ); @@ -331,11 +333,11 @@ $table->data[6][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 365, + 'max' => $performance_variables_control['days_purge']->max, 'name' => 'days_purge', 'value' => $config['days_purge'], 'return' => true, - 'min' => 7, + 'min' => $performance_variables_control['days_purge']->min, 'style' => 'width:43px', ] ); @@ -345,11 +347,11 @@ $table->data[7][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 365, + 'max' => $performance_variables_control['days_compact']->max, 'name' => 'days_compact', 'value' => $config['days_compact'], 'return' => true, - 'min' => 0, + 'min' => $performance_variables_control['days_compact']->min, 'style' => 'width:43px', ] ); @@ -359,11 +361,11 @@ $table->data[8][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 90, + 'max' => $performance_variables_control['days_delete_unknown']->max, 'name' => 'days_delete_unknown', 'value' => $config['days_delete_unknown'], 'return' => true, - 'min' => 0, + 'min' => $performance_variables_control['days_delete_unknown']->min, 'style' => 'width:43px', ] ); @@ -374,11 +376,11 @@ $table->data[9][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 90, + 'max' => $performance_variables_control['days_delete_not_initialized']->max, 'name' => 'days_delete_not_initialized', 'value' => $config['days_delete_not_initialized'], 'return' => true, - 'min' => 0, + 'min' => $performance_variables_control['days_delete_not_initialized']->min, 'style' => 'width:43px', ] ); @@ -388,11 +390,11 @@ $table->data[10][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 90, + 'max' => $performance_variables_control['days_autodisable_deletion']->max, 'name' => 'days_autodisable_deletion', 'value' => $config['days_autodisable_deletion'], 'return' => true, - 'min' => 0, + 'min' => $performance_variables_control['days_autodisable_deletion']->min, 'style' => 'width:43px', ] ); @@ -539,11 +541,11 @@ $table->data[] = [ [ 'type' => 'number', 'size' => 5, - 'max' => 30, + 'max' => $performance_variables_control['delete_old_network_matrix']->max, 'name' => 'delete_old_network_matrix', 'value' => $config['delete_old_network_matrix'], 'return' => true, - 'min' => 1, + 'min' => $performance_variables_control['delete_old_network_matrix']->min, 'style' => 'width:43px', ] ), @@ -563,11 +565,11 @@ $table_other->data[$i++][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 500, + 'max' => $performance_variables_control['report_limit']->max, 'name' => 'report_limit', 'value' => $config['report_limit'], 'return' => true, - 'min' => 1, + 'min' => $performance_variables_control['report_limit']->min, 'style' => 'width:43px', ] ); @@ -597,11 +599,11 @@ $table_other->data[$i++][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 360, + 'max' => $performance_variables_control['event_view_hr']->max, 'name' => 'event_view_hr', 'value' => $config['event_view_hr'], 'return' => true, - 'min' => 1, + 'min' => $performance_variables_control['event_view_hr']->min, 'style' => 'width:43px', ] ); @@ -645,11 +647,11 @@ $table_other->data[$i++][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 10000, + 'max' => $performance_variables_control['big_operation_step_datos_purge']->max, 'name' => 'big_operation_step_datos_purge', 'value' => $config['big_operation_step_datos_purge'], 'return' => true, - 'min' => 100, + 'min' => $performance_variables_control['big_operation_step_datos_purge']->min, 'style' => 'width:50px', ] ); @@ -661,11 +663,11 @@ $table_other->data[$i++][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 10000, + 'max' => $performance_variables_control['small_operation_step_datos_purge']->max, 'name' => 'small_operation_step_datos_purge', 'value' => $config['small_operation_step_datos_purge'], 'return' => true, - 'min' => 100, + 'min' => $performance_variables_control['small_operation_step_datos_purge']->min, 'style' => 'width:50px', ] ); @@ -695,11 +697,11 @@ $table_other->data[$i++][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 100000, + 'max' => $performance_variables_control['row_limit_csv']->max, 'name' => 'row_limit_csv', 'value' => $config['row_limit_csv'], 'return' => true, - 'min' => 1, + 'min' => $performance_variables_control['row_limit_csv']->min, 'style' => 'width:63px', ] ); diff --git a/pandora_console/godmode/setup/setup_general.php b/pandora_console/godmode/setup/setup_general.php index 8e26dfee27..987294185d 100644 --- a/pandora_console/godmode/setup/setup_general.php +++ b/pandora_console/godmode/setup/setup_general.php @@ -47,6 +47,8 @@ if (is_ajax()) { exit(); } +$performance_variables_control = (array) json_decode(io_safe_output($config['performance_variables_control'])); + $table = new StdClass(); $table->class = 'databox filters'; $table->id = 'setup_general'; @@ -516,11 +518,11 @@ $table->data[$i++][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 2000, + 'max' => $performance_variables_control['limit_parameters_massive']->max, 'name' => 'limit_parameters_massive', 'value' => $config['limit_parameters_massive'], 'return' => true, - 'min' => 100, + 'min' => $performance_variables_control['limit_parameters_massive']->min, 'style' => 'width:50px', ] ); diff --git a/pandora_console/godmode/setup/setup_visuals.php b/pandora_console/godmode/setup/setup_visuals.php index 918747a19f..e27e7b858d 100755 --- a/pandora_console/godmode/setup/setup_visuals.php +++ b/pandora_console/godmode/setup/setup_visuals.php @@ -53,6 +53,8 @@ $row = 0; echo '
    '; html_print_input_hidden('update_config', 1); +$performance_variables_control = (array) json_decode(io_safe_output($config['performance_variables_control'])); + // ---------------------------------------------------------------------- // BEHAVIOUR CONFIGURATION // ---------------------------------------------------------------------- @@ -68,11 +70,11 @@ $table_behaviour->data[$row][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 200, + 'max' => $performance_variables_control['block_size']->max, 'name' => 'block_size', 'value' => $config['global_block_size'], 'return' => true, - 'min' => 10, + 'min' => $performance_variables_control['block_size']->min, 'style' => 'width:50px', ] ); @@ -838,11 +840,11 @@ $table_chars->data[$row][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 5, + 'max' => $performance_variables_control['graph_precision']->max, 'name' => 'graph_precision', 'value' => $config['graph_precision'], 'return' => true, - 'min' => 1, + 'min' => $performance_variables_control['graph_precision']->min, 'style' => 'width:50px', ($disabled_graph_precision) ? 'readonly' : '' => 'readonly', 'onchange' => 'change_precision()', @@ -859,11 +861,11 @@ $table_chars->data[$row][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 20, + 'max' => $performance_variables_control['short_module_graph_data']->max, 'name' => 'short_module_graph_data', 'value' => $config['short_module_graph_data'], 'return' => true, - 'min' => 1, + 'min' => $performance_variables_control['short_module_graph_data']->min, 'style' => 'width:50px', ($disabled_graph_precision) ? 'readonly' : '' => 'readonly', 'onchange' => 'change_precision()', diff --git a/pandora_console/include/class/ConsoleSupervisor.php b/pandora_console/include/class/ConsoleSupervisor.php index b6a6d3df43..e426858e8a 100644 --- a/pandora_console/include/class/ConsoleSupervisor.php +++ b/pandora_console/include/class/ConsoleSupervisor.php @@ -248,6 +248,11 @@ class ConsoleSupervisor $this->checkAuditLogOldLocation(); + /* + * Check if performance variables are corrects + */ + $this->checkPerformanceVariables(); + /* * Checks if sync queue is longer than limits. * NOTIF.SYNCQUEUE.LENGTH @@ -509,6 +514,11 @@ class ConsoleSupervisor $this->checkAuditLogOldLocation(); + /* + * Check if performance variables are corrects + */ + $this->checkPerformanceVariables(); + /* * Checks if sync queue is longer than limits. * NOTIF.SYNCQUEUE.LENGTH @@ -521,6 +531,76 @@ class ConsoleSupervisor } + /** + * Check if performance variables are corrects + * + * @return void + */ + public function checkPerformanceVariables() + { + global $config; + + $names = [ + 'event_purge' => 'Max. days before events are deleted', + 'trap_purge' => 'Max. days before traps are deleted', + 'audit_purge' => 'Max. days before audited events are deleted', + 'string_purge' => 'Max. days before string data is deleted', + 'gis_purge' => 'Max. days before GIS data is deleted', + 'days_purge' => 'Max. days before purge', + 'days_compact' => 'Max. days before data is compacted', + 'days_delete_unknown' => 'Max. days before unknown modules are deleted', + 'days_delete_not_initialized' => 'Max. days before delete not initialized modules', + 'days_autodisable_deletion' => 'Max. days before autodisabled agents are deleted', + 'delete_old_network_matrix' => 'Max. days before delete old network matrix data', + 'report_limit' => 'Item limit for real-time reports', + 'event_view_hr' => 'Default hours for event view', + 'big_operation_step_datos_purge' => 'Big Operation Step to purge old data', + 'small_operation_step_datos_purge' => 'Small Operation Step to purge old data', + 'row_limit_csv' => 'Row limit in csv log', + 'limit_parameters_massive' => 'Limit for bulk operations', + 'block_size' => 'Block size for pagination', + 'short_module_graph_data' => 'Data precision', + 'graph_precision' => 'Data precision in graphs', + ]; + + $variables = (array) json_decode(io_safe_output($config['performance_variables_control'])); + + foreach ($variables as $variable => $values) { + if (empty($config[$variable]) === true || $config[$variable] === '') { + continue; + } + + $message = ''; + $limit_value = ''; + if ($config[$variable] > $values->max) { + $message = 'Check the setting of %s, a value greater than %s is not recommended'; + $limit_value = $values->max; + } + + if ($config[$variable] < $values->min) { + $message = 'Check the setting of %s, a value less than %s is not recommended'; + $limit_value = $values->min; + } + + if ($limit_value !== '' && $message !== '') { + $this->notify( + [ + 'type' => 'NOTIF.VARIABLES.PERFORMANCE.'.$variable, + 'title' => __('Incorrect config value'), + 'message' => __( + $message, + $names[$variable], + $limit_value + ), + 'url' => '__url__/index.php?sec=general&sec2=godmode/setup/setup', + ] + ); + } + } + + } + + /** * Executes console maintenance operations. Executed ALWAYS through CRON. * diff --git a/pandora_console/include/functions_config.php b/pandora_console/include/functions_config.php index b0d15d5cef..ee42d68055 100644 --- a/pandora_console/include/functions_config.php +++ b/pandora_console/include/functions_config.php @@ -2293,6 +2293,96 @@ function config_process_config() config_update_value('2Fa_auth', ''); } + if (isset($config['performance_variables_control']) === false) { + config_update_value( + 'performance_variables_control', + json_encode( + [ + 'event_purge' => [ + 'max' => 45, + 'min' => 1, + ], + 'trap_purge' => [ + 'max' => 45, + 'min' => 1, + ], + 'audit_purge' => [ + 'max' => 365, + 'min' => 7, + ], + 'string_purge' => [ + 'max' => 365, + 'min' => 7, + ], + 'gis_purge' => [ + 'max' => 365, + 'min' => 7, + ], + 'days_purge' => [ + 'max' => 365, + 'min' => 7, + ], + 'days_compact' => [ + 'max' => 365, + 'min' => 0, + ], + 'days_delete_unknown' => [ + 'max' => 90, + 'min' => 0, + ], + 'days_delete_not_initialized' => [ + 'max' => 90, + 'min' => 0, + ], + 'days_autodisable_deletion' => [ + 'max' => 90, + 'min' => 0, + ], + 'delete_old_network_matrix' => [ + 'max' => 30, + 'min' => 1, + ], + 'report_limit' => [ + 'max' => 500, + 'min' => 1, + ], + 'event_view_hr' => [ + 'max' => 360, + 'min' => 1, + ], + 'big_operation_step_datos_purge' => [ + 'max' => 10000, + 'min' => 100, + ], + 'small_operation_step_datos_purge' => [ + 'max' => 10000, + 'min' => 100, + ], + 'row_limit_csv' => [ + 'max' => 1000000, + 'min' => 1, + ], + 'limit_parameters_massive' => [ + 'max' => 2000, + 'min' => 100, + ], + 'block_size' => [ + 'max' => 200, + 'min' => 10, + ], + 'short_module_graph_data' => [ + 'max' => 20, + 'min' => 1, + ], + 'graph_precision' => [ + 'max' => 5, + 'min' => 1, + ], + ] + ) + ); + } + if (isset($config['agent_wizard_defaults']) === false) { config_update_value( 'agent_wizard_defaults', diff --git a/pandora_console/include/functions_notifications.php b/pandora_console/include/functions_notifications.php index 705d67ab3b..1a4167d8c3 100644 --- a/pandora_console/include/functions_notifications.php +++ b/pandora_console/include/functions_notifications.php @@ -159,6 +159,7 @@ function notifications_get_subtypes(?string $source=null) 'NOTIF.SERVER.STATUS', 'NOTIF.SERVER.QUEUE', 'NOTIF.SERVER.MASTER', + 'NOTIF.VARIABLES.PERFORMANCE', ], ]; From 6d85b912e2c5f635a390ba4746a5deebe1b0f2f1 Mon Sep 17 00:00:00 2001 From: Pablo Aragon Date: Mon, 6 Feb 2023 16:34:40 +0100 Subject: [PATCH 172/563] 9962-Omnishell in agent view --- pandora_console/images/omnishell.png | Bin 0 -> 606 bytes pandora_console/include/functions_html.php | 21 ++++++++++++++++++ pandora_console/include/functions_ui.php | 18 +++++++++++++++ .../operation/agentes/ver_agente.php | 21 ++++++++++++++++++ 4 files changed, 60 insertions(+) create mode 100644 pandora_console/images/omnishell.png diff --git a/pandora_console/images/omnishell.png b/pandora_console/images/omnishell.png new file mode 100644 index 0000000000000000000000000000000000000000..02c8f0e071e936d8b8fe8d83261e3d25a867b588 GIT binary patch literal 606 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc#=yY%t50_}ki(Mh=?zc(M!jHiZ6P)IEGjV&JEe^ z#q20jYPQ>R<$?vRQ4vcvbw+q9oOct>IU4m@w63XsLBi^#3nDlSIh)LqxYp|UDsYsA zRlcn{H$$@Q@tT_!8>-*WseX26=1ybfPe1>BE3nuz({Z!gx!G?%v`>5DpJF80-`85E zCwsm0`^y&s)~g~*S_Jx-QsO%`1X{MGXf<5>yeE~@Op5m*zsH6EjWhq5*qaY7mpAb{ z=^wDq&+gRMHB67ggm<=7?cLY8a``dOH`z%xa{g(XBgIc=CY|>>bAZ2Yrb}Z&cXq1! zn#LNDPKoZLWotaM&K%-;ZP~Uobcc$XP-p1z!e=5GnZ|?soj0C%zq!e{?UiazhH=Bx`-_bDH@tpRyg2jbm4)3^8tcBu)E|@nuV?he zZB#ZBaqcwgp3GH#az!7k0 zRZ*LF8HeNg2%TlW{?@%X%d=vk^7&@@C(W(K0ShJK`dvF>e>|T2r$NCbtf1ufj{MC6 zdk>%9ypW~hwBTg@m4`BlcgAq`Kizuh(6lv=F5fy=5x7kB!{=C$qVvy+n>6SD`D|0R j;0MdX+; literal 0 HcmV?d00001 diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index 31c2e5214a..44a8289b0d 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -84,6 +84,27 @@ function html_debug_print($var, $file='', $oneline=false) } +/** + * Console log. + */ +function jslog($var) +{ + $more_info = ''; + if (is_string($var)) { + $more_info = 'size: '.strlen($var); + } else if (is_bool($var)) { + $more_info = 'val: '.($var ? 'true' : 'false'); + } else if (is_null($var)) { + $more_info = 'is null'; + } else if (is_array($var)) { + $more_info = count($var); + } + + echo ''."\n"; + echo ''; +} + + // Alias for "html_debug_print" function html_debug($var, $file='', $oneline=false) { diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index 6a658997f6..ce17086f02 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -7084,3 +7084,21 @@ function ui_get_inventory_module_add_form( } +function ui_print_status_div($status) +{ + switch ((int) $status) { + case 0: + $return = '
     
    '; + break; + + case 1: + $return = '
     
    '; + break; + + default: + $return = '
     
    '; + break; + } + + return $return; +} \ No newline at end of file diff --git a/pandora_console/operation/agentes/ver_agente.php b/pandora_console/operation/agentes/ver_agente.php index ece6ec2d6c..b5aa181e8b 100644 --- a/pandora_console/operation/agentes/ver_agente.php +++ b/pandora_console/operation/agentes/ver_agente.php @@ -37,6 +37,7 @@ require_once $config['homedir'].'/include/functions_groups.php'; require_once $config['homedir'].'/include/functions_modules.php'; require_once $config['homedir'].'/include/functions_users.php'; enterprise_include_once('include/functions_metaconsole.php'); +enterprise_include_once('include/functions_omnishell.php'); ui_require_javascript_file('openlayers.pandora'); ui_require_css_file('agent_view'); @@ -1485,6 +1486,17 @@ if ($policyTab == -1) { $policyTab = ''; } + +// Omnishell. +$tasks = count_tasks_agent($id_agente); + +if ($tasks === true) { + $omnishellTab = enterprise_hook('omnishell_tab'); + if ($omnishellTab == -1) { + $omnishellTab = ''; + } +} + // WUX Console. $modules_wux = enterprise_hook('get_wux_modules', [$id_agente]); if ($modules_wux) { @@ -1747,6 +1759,7 @@ $onheader = [ 'ncm_view' => ($ncm_tab ?? null), 'external_tools' => ($external_tools ?? null), 'incident' => ($incidenttab ?? null), + 'omnishell' => ($omnishellTab ?? null), ]; @@ -1871,6 +1884,10 @@ switch ($tab) { $tab_name = 'Policies'; break; + case 'omnishell': + $tab_name = 'Omnishell'; + break; + case 'ux_console_tab': $tab_name = 'UX Console'; break; @@ -2009,6 +2026,10 @@ switch ($tab) { enterprise_include('operation/agentes/policy_view.php'); break; + case 'omnishell': + enterprise_include('operation/agentes/omnishell_view.php'); + break; + case 'ux_console_tab': enterprise_include('operation/agentes/ux_console_view.php'); break; From a2d7573d30dbfb39514c79fcdf14ae42aa97f64f Mon Sep 17 00:00:00 2001 From: Jonathan Date: Mon, 6 Feb 2023 16:44:14 +0100 Subject: [PATCH 173/563] #9479 Create module and edit/delete on metaconsole --- .../include/functions_treeview.php | 2 + .../operation/agentes/status_monitor.php | 65 ++++++++++++------- 2 files changed, 42 insertions(+), 25 deletions(-) diff --git a/pandora_console/include/functions_treeview.php b/pandora_console/include/functions_treeview.php index 198d4a51c8..2062ccb8c8 100755 --- a/pandora_console/include/functions_treeview.php +++ b/pandora_console/include/functions_treeview.php @@ -696,6 +696,8 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) $go_to_agent .= ''; $go_to_agent .= html_print_submit_button(__('Go to cluster edition'), 'upd_button', false, 'class="sub config"', true); } else { + $go_to_agent .= ''; + $go_to_agent .= html_print_submit_button(__('Go to module creation'), 'upd_button', false, 'class="sub config"', true); $go_to_agent .= ''; $go_to_agent .= html_print_submit_button(__('Go to agent edition'), 'upd_button', false, 'class="sub config"', true); } diff --git a/pandora_console/operation/agentes/status_monitor.php b/pandora_console/operation/agentes/status_monitor.php index 4770ac4687..8381dddb87 100644 --- a/pandora_console/operation/agentes/status_monitor.php +++ b/pandora_console/operation/agentes/status_monitor.php @@ -276,6 +276,7 @@ if ($loaded_filter['id_filter'] > 0) { if (is_array($tag_filter) === false) { $tag_filter = json_decode($tag_filter, true); } + if ($tag_filter === '') { $tag_filter = [0 => 0]; } @@ -1468,6 +1469,12 @@ if (!empty($result)) { $table->align[11] = 'left'; } + if (check_acl($config['id_user'], 0, 'AR')) { + $actions_list = true; + $table->head[12] = __('Actions'); + $table->align[12] = 'left'; + } + $id_type_web_content_string = db_get_value( 'id_tipo', 'ttipo_modulo', @@ -1588,31 +1595,6 @@ if (!empty($result)) { if (in_array('data_type', $show_fields) || is_metaconsole()) { $data[2] = html_print_image('images/'.modules_show_icon_type($row['module_type']), true, ['class' => 'invert_filter']); $agent_groups = is_metaconsole() ? $row['groups_in_server'] : agents_get_all_groups_agent($row['id_agent'], $row['id_group']); - if (check_acl_one_of_groups($config['id_user'], $agent_groups, 'AW')) { - $show_edit_icon = true; - if (defined('METACONSOLE')) { - if (!can_user_access_node()) { - $show_edit_icon = false; - } - - $url_edit_module = $row['server_url'].'index.php?'.'sec=gagente&'.'sec2=godmode/agentes/configurar_agente&'.'id_agente='.$row['id_agent'].'&'.'tab=module&'.'id_agent_module='.$row['id_agente_modulo'].'&'.'edit_module=1'.'&loginhash=auto&loginhash_data='.$row['hashdata'].'&loginhash_user='.str_rot13($row['user']); - } else { - $url_edit_module = 'index.php?'.'sec=gagente&'.'sec2=godmode/agentes/configurar_agente&'.'id_agente='.$row['id_agent'].'&'.'tab=module&'.'id_agent_module='.$row['id_agente_modulo'].'&'.'edit_module=1'; - } - - if ($show_edit_icon) { - $table->cellclass[][2] = 'action_buttons'; - $data[2] .= ''.html_print_image( - 'images/config.png', - true, - [ - 'alt' => '0', - 'border' => '', - 'title' => __('Edit'), - ] - ).''; - } - } } if (in_array('module_name', $show_fields) || is_metaconsole()) { @@ -2088,6 +2070,39 @@ if (!empty($result)) { $data[11] = ui_print_timestamp($row['utimestamp'], true, $option); } + if (check_acl_one_of_groups($config['id_user'], $agent_groups, 'AW')) { + if (defined('METACONSOLE')) { + $url_edit_module = $row['server_url'].'index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&'; + $url_edit_module .= 'loginhash=auto&id_agente='.$row['id_agent']; + $url_edit_module .= '&tab=module&id_agent_module='.$row['id_agente_modulo'].'&edit_module=1&'; + $url_edit_module .= 'loginhash_data='.$row['hashdata'].'&loginhash_user='.str_rot13($row['user']); + + $url_delete_module = $row['server_url'].'index.php?sec=gagente&sec2=godmode/agentes/configurar_agente'; + $url_delete_module .= '&id_agente='.$row['id_agent'].'&delete_module='.$row['id_agente_modulo']; + + $table->cellclass[][2] = 'action_buttons'; + $data[12] .= ''.html_print_image( + 'images/config.png', + true, + [ + 'alt' => '0', + 'border' => '', + 'title' => __('Edit'), + ] + ).''; + $onclick = 'onclick="javascript: if (!confirm(\''.__('Are you sure to delete?').'\')) return false;'; + $data[12] .= ''.html_print_image( + 'images/delete.png', + true, + [ + 'alt' => '0', + 'border' => '', + 'title' => __('Delete'), + ] + ).''; + } + } + array_push($table->data, $data); } From e5a18f67a7ada45f54ef11b35be4832f1f750523 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Mon, 6 Feb 2023 16:51:36 +0100 Subject: [PATCH 174/563] #10307 added user info in in progress status event --- pandora_console/include/functions_events.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/pandora_console/include/functions_events.php b/pandora_console/include/functions_events.php index 3740257717..ca35739891 100644 --- a/pandora_console/include/functions_events.php +++ b/pandora_console/include/functions_events.php @@ -2018,7 +2018,7 @@ function events_change_status( // Update ack info if the new status is validated. $ack_utimestamp = 0; $ack_user = $config['id_user']; - if ((int) $new_status === EVENT_STATUS_VALIDATED) { + if ((int) $new_status === EVENT_STATUS_VALIDATED || (int) $new_status === EVENT_STATUS_INPROCESS) { $ack_utimestamp = time(); } @@ -4814,7 +4814,7 @@ function events_page_general($event) $data = []; $data[0] = __('Acknowledged by'); - if ($event['estado'] == 1) { + if ($event['estado'] == 1 || $event['estado'] == 2) { if (empty($event['id_usuario']) === true) { $user_ack = __('Autovalidated'); } else { @@ -4948,8 +4948,7 @@ function events_page_general_acknowledged($event_id) global $config; $Acknowledged = ''; $event = db_get_row('tevento', 'id_evento', $event_id); - hd($event['ack_utimestamp'], true); - if ($event !== false && $event['estado'] == 1) { + if ($event !== false && ($event['estado'] == 1 || $event['estado'] == 2)) { $user_ack = db_get_value( 'fullname', 'tusuario', From dfdcb688d406ced8202636c77c643f02d4139482 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Mon, 6 Feb 2023 23:10:28 +0100 Subject: [PATCH 175/563] Improve code --- .../godmode/users/configure_profile.php | 37 +- .../godmode/users/configure_user.php | 390 +++++++++--------- .../godmode/users/user_management.php | 67 +-- pandora_console/include/functions_events.php | 2 +- pandora_console/include/functions_html.php | 12 +- pandora_console/include/functions_profile.php | 57 +-- .../include/functions_reporting.php | 2 +- pandora_console/include/functions_ui.php | 2 - pandora_console/include/styles/pandora.css | 13 +- 9 files changed, 310 insertions(+), 272 deletions(-) diff --git a/pandora_console/godmode/users/configure_profile.php b/pandora_console/godmode/users/configure_profile.php index 4cddff8932..82af2e5e8e 100644 --- a/pandora_console/godmode/users/configure_profile.php +++ b/pandora_console/godmode/users/configure_profile.php @@ -39,12 +39,13 @@ if (! check_acl($config['id_user'], 0, 'UM')) { } enterprise_include_once('meta/include/functions_users_meta.php'); - -$tab = get_parameter('tab', 'profile'); -$pure = get_parameter('pure', 0); - +// Get parameters. +$tab = get_parameter('tab', 'profile'); +$pure = get_parameter('pure', 0); +$new_profile = (bool) get_parameter('new_profile'); +$id_profile = (int) get_parameter('id'); // Header. -if (!is_metaconsole()) { +if (is_metaconsole() === false) { $buttons = [ 'user' => [ 'active' => false, @@ -72,13 +73,29 @@ if (!is_metaconsole()) { $buttons[$tab]['active'] = true; - ui_print_page_header( - __('User management').' » '.__('Profiles defined on %s', get_product_name()), + $profile = db_get_row('tperfil', 'id_perfil', $id_profile); + + ui_print_standard_header( + __('Edit profile %s', $profile['name']), 'images/gm_users.png', false, 'configure_profiles_tab', true, - $buttons + $buttons, + [ + [ + 'link' => '', + 'label' => __('Profiles'), + ], + [ + 'link' => '', + 'label' => __('Manage users'), + ], + [ + 'link' => ui_get_full_url('index.php?sec=gusuarios&sec2=godmode/users/profile_list&tab=profile'), + 'label' => __('User Profile management'), + ], + ] ); $sec2 = 'gusuarios'; } else { @@ -86,10 +103,6 @@ if (!is_metaconsole()) { $sec2 = 'advanced'; } - -$new_profile = (bool) get_parameter('new_profile'); -$id_profile = (int) get_parameter('id'); - // Edit profile. if ($id_profile || $new_profile) { if ($new_profile) { diff --git a/pandora_console/godmode/users/configure_user.php b/pandora_console/godmode/users/configure_user.php index 865ab8eb9d..fdfcfd1b3c 100644 --- a/pandora_console/godmode/users/configure_user.php +++ b/pandora_console/godmode/users/configure_user.php @@ -54,71 +54,27 @@ if ($enterprise_include === true) { enterprise_include_once('meta/include/functions_users_meta.php'); } -if (is_metaconsole() === false) { - date_default_timezone_set('UTC'); - include 'include/javascript/timezonepicker/includes/parser.inc'; - - // Read in options for map builder. - $bases = [ - 'gray' => 'Gray', - 'blue-marble' => 'Blue marble', - 'night-electric' => 'Night Electric', - 'living' => 'Living Earth', - ]; - - $local_file = 'include/javascript/timezonepicker/images/gray-400.png'; - - // Dimensions must always be exact since the imagemap does not scale. - $array_size = getimagesize($local_file); - - $map_width = $array_size[0]; - $map_height = $array_size[1]; - - $timezones = timezone_picker_parse_files( - $map_width, - $map_height, - 'include/javascript/timezonepicker/tz_world.txt', - 'include/javascript/timezonepicker/tz_islands.txt' - ); - - foreach ($timezones as $timezone_name => $tz) { - if ($timezone_name == 'America/Montreal') { - $timezone_name = 'America/Toronto'; - } else if ($timezone_name == 'Asia/Chongqing') { - $timezone_name = 'Asia/Shanghai'; - } - - $area_data_timezone_polys .= ''; - foreach ($tz['polys'] as $coords) { - $area_data_timezone_polys .= ''; - } - - $area_data_timezone_rects .= ''; - foreach ($tz['rects'] as $coords) { - $area_data_timezone_rects .= ''; - } - } -} - // This defines the working user. Beware with this, old code get confusses // and operates with current logged user (dangerous). $id = get_parameter('id', get_parameter('id_user', '')); +// Check if we are the same user for edit or we have a proper profile for edit users. +if ($id !== $config['id_user']) { + if ((bool) check_acl($config['id_user'], 0, 'UM') === false) { + db_pandora_audit( + AUDIT_LOG_ACL_VIOLATION, + 'Trying to access User Management' + ); + include 'general/noaccess.php'; + + return; + } +} + // ID given as parameter. $pure = get_parameter('pure', 0); - $user_info = get_user_info($id); $is_err = false; -if ((bool) check_acl($config['id_user'], 0, 'UM') === false) { - db_pandora_audit( - AUDIT_LOG_ACL_VIOLATION, - 'Trying to access User Management' - ); - include 'general/noaccess.php'; - - return; -} - if (is_ajax() === true) { $delete_profile = (bool) get_parameter('delete_profile'); $get_user_profile = (bool) get_parameter('get_user_profile'); @@ -270,7 +226,7 @@ enterprise_hook('open_meta_frame'); $tab = get_parameter('tab', 'user'); // Save autorefresh list. -$autorefresh_list = get_parameter_post('autorefresh_list'); +$autorefresh_list = (array) get_parameter_post('autorefresh_list'); $autorefresh_white_list = (($autorefresh_list[0] === '') || ($autorefresh_list[0] === '0')) ? '' : json_encode($autorefresh_list); // Header. @@ -338,6 +294,7 @@ if ((bool) $config['user_can_update_info'] === true) { $view_mode = true; } +$delete_profile = (is_ajax() === true) ? (bool) get_parameter('delete_profile') : false; $new_user = (bool) get_parameter('new_user'); $create_user = (bool) get_parameter('create_user'); $add_profile = (bool) get_parameter('add_profile'); @@ -564,6 +521,7 @@ if ($create_user === true) { $info ); + HD('patatas', true); ui_print_result_message( $result, __('Successfully created'), @@ -1002,7 +960,7 @@ if ($add_profile && empty($json_profile)) { ); } -if ($values) { +if (isset($values) === true && empty($values) === false) { $user_info = $values; } @@ -1530,7 +1488,7 @@ $default_event_filter .= html_print_select( false ).'
    '; -if ($config['ehorus_user_level_conf']) { +if (isset($config['ehorus_user_level_conf']) === true && (bool) $config['ehorus_user_level_conf'] === true) { $ehorus = '

    '.__('eHorus user access enabled').'

    '; $ehorus .= html_print_checkbox_switch( 'ehorus_user_level_enabled', @@ -1562,7 +1520,7 @@ if ($config['ehorus_user_level_conf']) { $double_auth_enabled = (bool) db_get_value('id', 'tuser_double_auth', 'id_user', $id); -if ($config['double_auth_enabled'] && check_acl($config['id_user'], 0, 'PM')) { +if (isset($config['double_auth_enabled']) === true && (bool) ($config['double_auth_enabled']) === true && check_acl($config['id_user'], 0, 'PM')) { $double_authentication = '

    '.__('Double authentication').'

    '; if (($config['2FA_all_users'] == '' && !$double_auth_enabled) || ($config['double_auth_enabled'] == '' && $double_auth_enabled) @@ -1678,14 +1636,10 @@ if (is_metaconsole() === true) { ).'
    '; } + +echo '
    '; echo ''; - -require_once 'user_management.php'; - - - - if (!$id) { $user_id_update_view = $user_id; $user_id_create = ''; @@ -1696,138 +1650,138 @@ if (!$id) { if (is_metaconsole() === true) { $access_or_pagination = $meta_access; + if ($id != '' && !$is_err) { + $div_user_info = ' + '; + } else { + $div_user_info = ' + '; + } + + echo '
    +
    + +

    Extra info

    '.$email.$phone.$not_login.$local_user.$session_time.'
    +
    +
    +
    '.$language.$access_or_pagination.$skin.$default_event_filter.$double_authentication.'
    + +
    '.$timezone; + + echo $search_custom_fields_view.$metaconsole_agents_manager.$metaconsole_access_node; + + $autorefresh_show = '

    '._('Autorefresh').ui_print_help_tip( + __('This will activate autorefresh in selected pages'), + true + ).'

    '; + $select_out = html_print_select( + $autorefresh_list_out, + 'autorefresh_list_out[]', + '', + '', + '', + '', + true, + true, + true, + '', + false, + 'width:100%' + ); + $arrows = ' '; + $select_in = html_print_select( + $autorefresh_list, + 'autorefresh_list[]', + '', + '', + '', + '', + true, + true, + true, + '', + false, + 'width:100%' + ); + + $table_ichanges = ''; + + $autorefresh_show .= $table_ichanges; + + // Time autorefresh. + $times = get_refresh_time_array(); + $time_autorefresh = '

    '.__('Time autorefresh'); + $time_autorefresh .= ui_print_help_tip( + __('Interval of autorefresh of the elements, by default they are 30 seconds, needing to enable the autorefresh first'), + true + ).'

    '; + $time_autorefresh .= html_print_select( + $times, + 'time_autorefresh', + $user_info['time_autorefresh'], + '', + '', + '', + true, + false, + false + ).'
    '; + + + echo '
    +
    +
    '.$autorefresh_show.$time_autorefresh.'
    +
    +
    '.$comments.'
    +
    '; + + if (empty($ehorus) === false) { + html_print_div( + [ + 'class' => 'user_edit_third_row white_box', + 'content' => $ehorus, + ], + true + ); + } } else { $access_or_pagination = $size_pagination; -} - -if ($id != '' && !$is_err) { - $div_user_info = ' - '; -} else { - $div_user_info = ' - '; -} - -echo '
    -
    - -

    Extra info

    '.$email.$phone.$not_login.$local_user.$session_time.'
    -
    -
    -
    '.$language.$access_or_pagination.$skin.$default_event_filter.$double_authentication.'
    - -
    '.$timezone; -if (is_metaconsole() === false) { - echo '
    - - - '.$area_data_timezone_polys.$area_data_timezone_rects.' -
    '; -} else { - echo $search_custom_fields_view.$metaconsole_agents_manager.$metaconsole_access_node; -} - -$autorefresh_show = '

    '._('Autorefresh').ui_print_help_tip( - __('This will activate autorefresh in selected pages'), - true -).'

    '; -$select_out = html_print_select( - $autorefresh_list_out, - 'autorefresh_list_out[]', - '', - '', - '', - '', - true, - true, - true, - '', - false, - 'width:100%' -); -$arrows = ' '; -$select_in = html_print_select( - $autorefresh_list, - 'autorefresh_list[]', - '', - '', - '', - '', - true, - true, - true, - '', - false, - 'width:100%' -); - -$table_ichanges = ''; - -$autorefresh_show .= $table_ichanges; - -// Time autorefresh. -$times = get_refresh_time_array(); -$time_autorefresh = '

    '.__('Time autorefresh'); -$time_autorefresh .= ui_print_help_tip( - __('Interval of autorefresh of the elements, by default they are 30 seconds, needing to enable the autorefresh first'), - true -).'

    '; -$time_autorefresh .= html_print_select( - $times, - 'time_autorefresh', - $user_info['time_autorefresh'], - '', - '', - '', - true, - false, - false -).'
    '; - - -echo '
    -
    -
    '.$autorefresh_show.$time_autorefresh.'
    -
    -
    '.$comments.'
    -
    '; - -if (!empty($ehorus)) { - echo '
    '.$ehorus.'
    '; + // WIP: Only for node. + include_once 'user_management.php'; } echo '
    '; -if ($config['admin_can_add_user']) { +if ((bool) $config['admin_can_add_user'] === true) { html_print_csrf_hidden(); html_print_input_hidden((($new_user === true) ? 'create_user' : 'update_user'), 1); } @@ -1837,8 +1791,8 @@ if ($new_user === true) { html_print_input_hidden('json_profile', $json_profile); } - echo ''; +echo '
    '; $actionButtons = []; @@ -1873,10 +1827,11 @@ $actionButtons[] = html_print_go_back_button( html_print_action_buttons(implode('', $actionButtons), ['type' => 'form_action']); - echo '
    '; enterprise_hook('close_meta_frame'); + +// This is an image generated for JS. $delete_image = html_print_input_image( 'del', 'images/cross.png', @@ -1889,7 +1844,7 @@ $delete_image = html_print_input_image( ] ); -if (!is_metaconsole()) { +if (is_metaconsole() === false) { ?> + $dialogContainer + .empty() + .append(message) + .append($button); + + var request; + + $button.click(function(e) { + e.preventDefault(); + + $dialogContainer.html($loadingSpinner); + + // Deactivate the double auth + request = $.ajax({ + url: "", + type: 'POST', + dataType: 'json', + data: { + page: 'include/ajax/double_auth.ajax', + id_user: userID, + FA_forced: 1, + deactivate_double_auth: 1 + }, + complete: function(xhr, textStatus) { + + }, + success: function(data, textStatus, xhr) { + if (data === -1) { + $dialogContainer.html("
    '.__('Authentication error').'
    '; ?>"); + } else if (data) { + $dialogContainer.html("
    '.__('The double autentication was deactivated successfully').'
    '; ?>"); + $("input#checkbox-double_auth").prop("checked", false); + } else { + $dialogContainer.html("
    '.__('There was an error deactivating the double autentication').'
    '; ?>"); + } + }, + error: function(xhr, textStatus, errorThrown) { + $dialogContainer.html("
    '.__('There was an error deactivating the double autentication').'
    '; ?>"); + } + }); + }); + + + $("div#dialog-double_auth").dialog({ + resizable: true, + draggable: true, + modal: true, + title: "", + overlay: { + opacity: 0.5, + background: "black" + }, + width: 300, + height: 150, + close: function(event, ui) { + // Abort the ajax request + if (typeof request != 'undefined') + request.abort(); + // Remove the contained html + $dialogContainer.empty(); + + } + }) + .show(); + } + + + /* ]]> */ + \ No newline at end of file diff --git a/pandora_console/godmode/users/user_management.php b/pandora_console/godmode/users/user_management.php index 206725a4b6..c7e4ab43ee 100644 --- a/pandora_console/godmode/users/user_management.php +++ b/pandora_console/godmode/users/user_management.php @@ -220,6 +220,9 @@ $userManagementTable->data['fields_phone'][0] = html_print_input_text_extended( true ); +$userManagementTable->rowclass['captions_fields_admin_user'] = 'field_half_width w50p'; +$userManagementTable->cellclass['captions_fields_admin_user'][0] = 'wrap'; +$userManagementTable->data['captions_fields_admin_user'][0] = $doubleAuthentication; if (users_is_admin() === true) { $globalProfileContent = []; $globalProfileContent[] = ''.__('Administrator user').''; @@ -230,8 +233,8 @@ if (users_is_admin() === true) { true ); - $userManagementTable->rowclass['captions_fields_admin_user'] = 'field_half_width'; - $userManagementTable->data['captions_fields_admin_user'][0] = html_print_div( + $userManagementTable->cellclass['captions_fields_admin_user'][1] = 'wrap'; + $userManagementTable->data['captions_fields_admin_user'][1] = html_print_div( [ 'class' => 'margin-top-10', 'style' => 'display: flex; flex-direction: row-reverse; align-items: center;', diff --git a/pandora_console/include/ajax/double_auth.ajax.php b/pandora_console/include/ajax/double_auth.ajax.php index 0f85c9c0f5..3a995ce43a 100644 --- a/pandora_console/include/ajax/double_auth.ajax.php +++ b/pandora_console/include/ajax/double_auth.ajax.php @@ -1,21 +1,39 @@ $id_user]; db_process_sql_delete('tuser_double_auth', $where); - // Insert the new value + // Insert the new value. $values = [ 'id_user' => $id_user, 'secret' => $secret, @@ -116,12 +134,12 @@ if ($save_double_auth_secret) { return; } -// Disable the double auth for the user +// Disable the double auth for the user. $deactivate_double_auth = (bool) get_parameter('deactivate_double_auth'); if ($deactivate_double_auth) { $result = false; - // Delete the actual value (if exists) + // Delete the actual value (if exists). $where = ['id_user' => $id_user]; $result = db_process_sql_delete('tuser_double_auth', $where); @@ -129,7 +147,7 @@ if ($deactivate_double_auth) { return; } -// Get the info page to the container dialog +// Get the info page to the container dialog. $get_double_auth_data_page = (bool) get_parameter('get_double_auth_data_page'); if ($get_double_auth_data_page) { $secret = db_get_value('secret', 'tuser_double_auth', 'id_user', $id_user); @@ -146,7 +164,7 @@ if ($get_double_auth_data_page) { $html .= '

    '; $html .= '
    '; $html .= '
    '; - $html .= __('Code').": $secret"; + $html .= __('Code').': '.$secret.''; $html .= '
    '; $html .= __('QR').':
    '; $html .= '
    '; @@ -161,7 +179,7 @@ if ($get_double_auth_data_page) { var secret = ""; var id_user_auth = ""; - // QR code with the secret to add it to the app + // QR code with the secret to add it to the app. paint_qrcode("otpauth://totp/"+id_user_auth+"?secret="+secret, $("div#qr-container").get(0), 200, 200); $("div#qr-container").attr("title", "").find("canvas").remove(); @@ -179,7 +197,7 @@ if ($get_double_auth_data_page) { return; } -// Get the info page to the container dialog +// Get the info page to the container dialog. $get_double_auth_info_page = (bool) get_parameter('get_double_auth_info_page'); if ($get_double_auth_info_page) { $container_id = (string) get_parameter('containerID'); @@ -209,14 +227,14 @@ if ($get_double_auth_info_page) { ob_clean(); ?> diff --git a/pandora_console/godmode/setup/setup_visuals.php b/pandora_console/godmode/setup/setup_visuals.php index 8f7654fa06..236378a301 100755 --- a/pandora_console/godmode/setup/setup_visuals.php +++ b/pandora_console/godmode/setup/setup_visuals.php @@ -449,8 +449,8 @@ if (enterprise_installed() === true) { 'custom_splash_login', $config['custom_splash_login'], '', - '', - '', + __('Default'), + 'default', true, false, true, @@ -663,6 +663,12 @@ if (enterprise_installed() === true) { $row++; } +if (enterprise_installed() === true) { + $table_styles->data[$row][0] = __('Background opacity % (login)'); + $table_styles->data[$row][1] = ""; + $row++; +} + if (enterprise_installed() === true) { $table_styles->data[$row][0] = __('Disable logo in graphs'); $table_styles->data[$row][1] = html_print_checkbox_switch( @@ -715,6 +721,16 @@ $table_styles->data[$row][1] = html_print_checkbox_switch( $config['visual_animation'], true ); +$row++; + +$table_styles->data[$row][0] = __('Random background (login)'); +$table_styles->data[$row][1] = html_print_checkbox_switch( + 'random_background', + 1, + $config['random_background'], + true +); +$row++; // ---------------------------------------------------------------------- @@ -1147,7 +1163,7 @@ $table_vc->data[$row][1] = html_print_select( $row++; $table_vc->data[$row][0] = __('Number of favorite visual consoles to show in the menu'); -$table_vc->data[$row][1] = ""; +$table_vc->data[$row][1] = ""; $row++; $table_vc->data[$row][0] = __('Default line thickness for the Visual Console'); @@ -1181,7 +1197,7 @@ $table_ser->size[0] = '50%'; $table_ser->data = []; $table_ser->data['number'][0] = __('Number of favorite services to show in the menu'); -$table_ser->data['number'][1] = ""; +$table_ser->data['number'][1] = ""; // ---------------------------------------------------------------------- // Reports @@ -1214,12 +1230,12 @@ $table_report->data[$row][1] = html_print_checkbox_switch( $row++; $table_report->data[$row][0] = __('PDF font size (px)'); -$table_report->data[$row][1] = ""; +$table_report->data[$row][1] = ""; $row++; $table_report->data[$row][0] = __('HTML font size for SLA (em)'); -$table_report->data[$row][1] = ""; +$table_report->data[$row][1] = ""; $row++; diff --git a/pandora_console/images/animated_login/line-1.svg b/pandora_console/images/animated_login/line-1.svg new file mode 100644 index 0000000000..abf8747c4d --- /dev/null +++ b/pandora_console/images/animated_login/line-1.svg @@ -0,0 +1,20 @@ + + + + C62A1795-794F-402A-9E97-F2BD4D8F847C + Created with sketchtool. + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pandora_console/images/animated_login/line-2.svg b/pandora_console/images/animated_login/line-2.svg new file mode 100644 index 0000000000..9c166ec688 --- /dev/null +++ b/pandora_console/images/animated_login/line-2.svg @@ -0,0 +1,20 @@ + + + + C3D4F6E9-4DEB-4120-925D-CC7B405F7455 + Created with sketchtool. + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pandora_console/images/animated_login/line-3.svg b/pandora_console/images/animated_login/line-3.svg new file mode 100644 index 0000000000..1db509a7b8 --- /dev/null +++ b/pandora_console/images/animated_login/line-3.svg @@ -0,0 +1,20 @@ + + + + 678B7C23-14BC-4AAB-804B-2042119A8C12 + Created with sketchtool. + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pandora_console/images/animated_login/static.svg b/pandora_console/images/animated_login/static.svg new file mode 100644 index 0000000000..dfa1936eec --- /dev/null +++ b/pandora_console/images/animated_login/static.svg @@ -0,0 +1,93 @@ + + + + Img + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pandora_console/images/backgrounds/random_backgrounds/Abstract_data.jpeg b/pandora_console/images/backgrounds/random_backgrounds/Abstract_data.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..190cc3a387357f37a9782bac3a2265d6afb268ca GIT binary patch literal 286268 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

    yXIJ!$f+@(-o-=C)qA!2((b_0fEGx4 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%0ALz26A#JPbuhGcp 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%0D5=QVKAY<-Sf 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

    '; -$filters = '
    '; -$table2->colspan[2][0] = 7; -$table2->cellstyle[2][0] = 'padding-left: 10px;'; -$table2->data[2][0] = ui_toggle( +// End Build SQL sentences. +// +// Start Build Search Form. +// +$table = new stdClass(); +$tableFilter = new StdClass(); +$tableFilter->width = '100%'; +$tableFilter->cellspacing = 0; +$tableFilter->cellpadding = 0; +$tableFilter->id = 'main_status_monitor_filter'; +$tableFilter->class = 'filter_table'; +$tableFilter->cellclass['inputs_second_line'][2] = 'flex flex_column wrap'; +// Defined styles. +$tableFilter->style[0] = 'padding-right: 10px'; +$tableFilter->style[1] = 'padding-right: 10px'; +$tableFilter->style[2] = 'padding-right: 10px'; +// Captions for first line. +$tableFilter->data['captions_first_line'][0] = __('Group'); +$tableFilter->data['captions_first_line'][1] = __('Module group'); +$tableFilter->data['captions_first_line'][2] = __('Recursion'); +$tableFilter->data['captions_first_line'][3] = __('Search'); +// Inputs for first line. +$tableFilter->data['inputs_first_line'][0] = html_print_select_groups( + $config['id_user'], + 'AR', + true, + 'ag_group', + $ag_group, + '', + '', + '0', + true, + false, + false, + '', + false, + '', + false, + false, + 'id_grupo', + false, + false, + false, + false, + false, + false, + $not_condition +); +$tableFilter->data['inputs_first_line'][1] = html_print_select( + $rows_select, + 'modulegroup', + $modulegroup, + '', + __($is_none), + -1, + true, + false, + true, + '', + false, + 'width: 100%;' +); +$tableFilter->data['inputs_first_line'][2] = html_print_checkbox_switch( + 'recursion', + 1, + ($recursion === true || $recursion === 'true' || $recursion === '1') ? 'checked' : false, + true +); +$tableFilter->data['inputs_first_line'][3] = html_print_input_text( + 'ag_freestring', + $ag_freestring, + '', + 40, + 30, + true +); +// Captions for second line. +$tableFilter->data['captions_second_line'][0] = __('Monitor status'); +$tableFilter->data['captions_second_line'][1] = __('Module name'); +$tableFilter->data['captions_second_line'][2] = __('Tags'); +// Inputs for second line. +$tableFilter->rowstyle['inputs_second_line'] = 'vertical-align: top;'; +$tableFilter->data['inputs_second_line'][0] = html_print_select( + $fields, + 'status', + $status, + '', + __($is_none), + -1, + true, + false, + true, + '', + false, + 'width: 150px;' +); + +$tableFilter->data['inputs_second_line'][1] = html_print_autocomplete_modules( + 'ag_modulename', + $ag_modulename, + false, + true, + '', + [], + true +); + +$tableFilter->data['inputs_second_line'][2] = $tagsElement; + +// Advanced filter. +$tableAdvancedFilter = new StdClass(); +$tableAdvancedFilter->width = '100%'; +$tableAdvancedFilter->class = 'filters'; +$tableAdvancedFilter->style = []; +// $tableAdvancedFilter->style[0] = 'font-weight: bold;'; +$tableAdvancedFilter->cellclass['fields_advancedField_1'][4] = 'flex flex_column wrap'; +$tableAdvancedFilter->rowstyle['fields_advancedField_1'] = 'vertical-align: top;'; +// $tableAdvancedFilter->style[1] = 'font-weight: bold;'; +$tableAdvancedFilter->data['captions_advancedField_1'][0] = ''.__('Server type').''; +$tableAdvancedFilter->data['captions_advancedField_1'][1] = ''.__('Show monitors...').''; +$tableAdvancedFilter->data['captions_advancedField_1'][2] = ''.__('Min. hours in current status').''; +$tableAdvancedFilter->data['captions_advancedField_1'][3] = ''.__('Data type').''; +$tableAdvancedFilter->data['captions_advancedField_1'][4] = ''.__('Not condition').''; + +$tableAdvancedFilter->data['fields_advancedField_1'][0] = html_print_select($typemodules, 'moduletype', $moduletype, '', __($is_none), '', true, false, true, '', false, 'width: 150px;'); +$tableAdvancedFilter->data['fields_advancedField_1'][1] = html_print_select($monitor_options, 'module_option', $module_option, '', '', '', true, false, true, '', false, 'width: 150px;'); +$tableAdvancedFilter->data['fields_advancedField_1'][2] = html_print_input_text('min_hours_status', $min_hours_val, '', 12, 20, true); +$tableAdvancedFilter->data['fields_advancedField_1'][3] = html_print_select_from_sql($sqlModuleType, 'datatype', '', '', __('All'), 0, true); +$tableAdvancedFilter->data['fields_advancedField_1'][4] = html_print_div( + [ + 'class' => 'w120px mrgn_5px mrgn_lft_0px mrgn_right_0px flex wrap', + 'content' => html_print_input( + [ + 'type' => 'switch', + 'name' => 'not_condition', + 'return' => false, + 'checked' => ($check_not_condition === true || $check_not_condition === 'true' || $check_not_condition === '1') ? 'checked' : false, + 'value' => 'NOT', + 'id' => 'not_condition_switch', + 'onclick' => 'changeNotConditionStatus(this)', + ] + ).ui_print_input_placeholder(__('If you check this option, those elements that do NOT meet any of the requirements will be shown'), true), + ], + true +); +/* + '
    '; + + $a = db_get_all_rows_sql($sql); + + $tableAdvancedFilter->data[1][1] .= ''; + $tableAdvancedFilter->data[1][1] .= '
    '; +*/ +$tableAdvancedFilter->colspan[2][0] = 7; +$tableAdvancedFilter->cellstyle[2][0] = 'padding-left: 10px;'; +$tableAdvancedFilter->data[2][0] = ui_toggle( $div_custom_fields, __('Agent custom fields'), '', @@ -905,14 +921,14 @@ $table2->data[2][0] = ui_toggle( 'white_table_graph' ); -$table->colspan[3][0] = 7; -$table->cellstyle[3][0] = 'padding-left: 10px;padding-bottom: 0px;'; -$table->data[3][0] = ui_toggle( +$tableFilter->colspan[3][0] = 7; +$tableFilter->cellstyle[3][0] = 'padding-left: 10px;padding-bottom: 0px;'; +$tableFilter->data[3][0] = ui_toggle( html_print_table( - $table2, + $tableAdvancedFilter, true ), - __('Advanced options'), + ''.__('Advanced options').'', '', '', true, @@ -922,45 +938,50 @@ $table->data[3][0] = ui_toggle( 'white_table_graph' ); -$table->colspan[4][0] = 2; -$table->cellstyle[4][0] = 'padding-top: 0px;'; -$table->data[4][0] = html_print_button( +// $tableFilter->colspan[4][0] = 2; +$tableFilter->cellstyle[4][0] = 'padding-top: 0px;'; +$tableFilter->data[4][0] = html_print_button( __('Load filter'), 'load-filter', false, '', - 'class="float-left margin-right-2 sub config"', + [ + 'icon' => 'wand', + 'mode' => 'mini secondary', + ], true ); -$table->cellstyle[4][0] .= 'padding-top: 0px;'; -$table->data[4][0] .= html_print_button( + +$tableFilter->data[4][1] = html_print_button( __('Save filter'), 'save-filter', false, '', - 'class="float-left margin-right-2 sub wand"', + [ + 'icon' => 'wand', + 'mode' => 'mini secondary', + ], true ); -$table->colspan[4][2] = 5; -$table->cellstyle[4][2] = 'padding-top: 0px;'; -$table->data[4][2] = html_print_submit_button( - __('Show'), +$tableFilter->colspan[4][2] = 5; +$tableFilter->cellstyle[4][2] = 'padding-top: 0px;'; +$tableFilter->data[4][2] = html_print_submit_button( + __('Filter'), 'uptbutton', false, - 'class="sub search mgn_tp_0 right"', + [ + 'icon' => 'next', + 'mode' => 'mini', + ], true ); -$filters .= html_print_table($table, true); +$filters = ''; +$filters .= html_print_table($tableFilter, true); $filters .= '
    '; - -if (is_metaconsole() === true) { - ui_toggle($filters, __('Show filters'), '', '', false); -} else { - echo $filters; -} +ui_toggle($filters, ''.__('Filters').''); unset($table); // End Build Search Form. @@ -1249,13 +1270,13 @@ switch ($sortField) { // We do not show the modules until the user searches with the filter. if ($autosearch) { - if (! defined('METACONSOLE')) { + if (is_metaconsole() === false) { $result = db_get_all_rows_sql($sql); if ($result === false) { $result = []; } else { - ui_pagination($count, false, $offset, 0, false, 'offset', true); + $tablePagination = ui_pagination($count, false, $offset, 0, true, 'offset', false); } } else { // For each server defined and not disabled. @@ -1272,7 +1293,7 @@ if ($autosearch) { $count_modules = 0; foreach ($servers as $server) { // If connection was good then retrieve all data server. - if (metaconsole_connect($server) == NOERR) { + if (metaconsole_connect($server) === NOERR) { $connection = true; } else { $connection = false; @@ -1280,7 +1301,7 @@ if ($autosearch) { $result_server = db_get_all_rows_sql($sql); - if (!empty($result_server)) { + if (empty($result_server) === false) { // Create HASH login info. $pwd = $server['auth_token']; $auth_serialized = json_decode($pwd, true); @@ -1321,7 +1342,7 @@ if ($autosearch) { } if ($count_modules > $config['block_size']) { - ui_pagination($count_modules, false, $offset); + $tablePagination = ui_pagination($count_modules, false, $offset, 0, true); } // Get number of elements of the pagination. @@ -1329,13 +1350,12 @@ if ($autosearch) { } } -if (($config['dbtype'] == 'oracle') && ($result !== false)) { - for ($i = 0; $i < count($result); $i++) { - unset($result[$i]['rnum']); - } -} - - +// Oracle legacy code. +// if (($config['dbtype'] == 'oracle') && ($result !== false)) { +// for ($i = 0; $i < count($result); $i++) { +// unset($result[$i]['rnum']); +// } +// } // Urls to sort the table. $url_agent_name = 'index.php?sec='.$section.'&sec2=operation/agentes/status_monitor'; $url_type = 'index.php?sec='.$section.'&sec2=operation/agentes/status_monitor'; @@ -1384,12 +1404,13 @@ if (($config['dbtype'] == 'oracle') && ($result !== false)) { $url_timestamp_down .= '&sort_field=timestamp&sort=down'; // Start Build List Result. -if (!empty($result)) { +if (empty($result) === false) { $table = new StdClass(); $table->cellpadding = 0; $table->cellspacing = 0; - $table->width = '100%'; - $table->class = 'info_table'; + $table->styleTable = 'margin: 0 10px; width: -webkit-fill-available; width: -moz-available'; + $table->class = 'info_table tactical_table'; + $table->id = 'monitors_view'; $table->head = []; $table->data = []; $table->size = []; @@ -1405,56 +1426,61 @@ if (!empty($result)) { } if (in_array('agent', $show_fields) || is_metaconsole()) { - $table->head[1] = __('Agent'); + $table->head[1] = ''.__('Agent').''; $table->head[1] .= ui_get_sorting_arrows($url_agent_name.'up', $url_agent_name.'down', $selectAgentNameUp, $selectAgentNameDown); } if (in_array('data_type', $show_fields) || is_metaconsole()) { - $table->head[2] = __('Data Type'); + $table->head[2] = ''.__('Data Type').''; $table->head[2] .= ui_get_sorting_arrows($url_type.'up', $url_type.'down', $selectDataTypeUp, $selectDataTypeDown); - $table->align[2] = 'left'; + $table->headstyle[2] = 'text-align: center'; + $table->align[2] = 'center'; } if (in_array('module_name', $show_fields) || is_metaconsole()) { - $table->head[3] = __('Module name'); + $table->head[3] = ''.__('Module name').''; $table->head[3] .= ui_get_sorting_arrows($url_module_name.'up', $url_module_name.'down', $selectModuleNameUp, $selectModuleNameDown); } if (in_array('server_type', $show_fields) || is_metaconsole()) { - $table->head[4] = __('Server type'); + $table->head[4] = ''.__('Server type').''; $table->head[4] .= ui_get_sorting_arrows($url_server_type.'up', $url_server_type.'down', $selectTypeUp, $selectTypeDown); + $table->headstyle[4] = 'text-align: center'; + $table->align[4] = 'center'; } if (in_array('interval', $show_fields) || is_metaconsole()) { - $table->head[5] = __('Interval'); + $table->head[5] = ''.__('Interval').''; $table->head[5] .= ui_get_sorting_arrows($url_interval.'up', $url_interval.'down', $selectIntervalUp, $selectIntervalDown); $table->align[5] = 'left'; } if (in_array('status', $show_fields) || is_metaconsole()) { - $table->head[6] = __('Status'); + $table->head[6] = ''.__('Status').''; $table->head[6] .= ui_get_sorting_arrows($url_status.'up', $url_status.'down', $selectStatusUp, $selectStatusDown); $table->align[6] = 'left'; } if (in_array('last_status_change', $show_fields)) { - $table->head[7] = __('Last status change'); + $table->head[7] = ''.__('Last status change').''; $table->head[7] .= ui_get_sorting_arrows($url_status.'up', $url_status.'down', $selectStatusUp, $selectStatusDown); - $table->align[7] = 'left'; + $table->headstyle[7] = 'text-align: center'; + $table->align[7] = 'center'; } if (in_array('graph', $show_fields) || is_metaconsole()) { - $table->head[8] = __('Graph'); - $table->align[8] = 'left'; + $table->head[8] = ''.__('Graph').''; + $table->headstyle[8] = 'text-align: center'; + $table->align[8] = 'center'; } if (in_array('warn', $show_fields) || is_metaconsole()) { - $table->head[9] = __('Warn'); + $table->head[9] = ''.__('W/C').''; $table->align[9] = 'left'; } if (in_array('data', $show_fields) || is_metaconsole()) { - $table->head[10] = __('Data'); + $table->head[10] = ''.__('Data').''; $table->align[10] = 'left'; if (is_metaconsole()) { $table->head[10] .= ui_get_sorting_arrows($url_data.'up', $url_data.'down', $selectDataUp, $selectDataDown); @@ -1462,7 +1488,7 @@ if (!empty($result)) { } if (in_array('timestamp', $show_fields) || is_metaconsole()) { - $table->head[11] = __('Timestamp'); + $table->head[11] = ''.__('Timestamp').''; $table->head[11] .= ui_get_sorting_arrows($url_timestamp_up, $url_timestamp_down, $selectTimestampUp, $selectTimestampDown); $table->align[11] = 'left'; } @@ -1476,7 +1502,7 @@ if (!empty($result)) { foreach ($result as $row) { // Avoid unset, null and false value. - if (empty($row['server_name'])) { + if (empty($row['server_name']) === true) { $row['server_name'] = ''; } @@ -1585,71 +1611,42 @@ if (!empty($result)) { } if (in_array('data_type', $show_fields) || is_metaconsole()) { - $data[2] = html_print_image('images/'.modules_show_icon_type($row['module_type']), true, ['class' => 'invert_filter']); + $data[2] = html_print_image('images/'.modules_show_icon_type($row['module_type']), true, ['class' => 'invert_filter main_menu_icon']); $agent_groups = is_metaconsole() ? $row['groups_in_server'] : agents_get_all_groups_agent($row['id_agent'], $row['id_group']); if (check_acl_one_of_groups($config['id_user'], $agent_groups, 'AW')) { $show_edit_icon = true; - if (defined('METACONSOLE')) { + if (is_metaconsole() === true) { if (!can_user_access_node()) { $show_edit_icon = false; } - $url_edit_module = $row['server_url'].'index.php?'.'sec=gagente&'.'sec2=godmode/agentes/configurar_agente&'.'id_agente='.$row['id_agent'].'&'.'tab=module&'.'id_agent_module='.$row['id_agente_modulo'].'&'.'edit_module=1'.'&loginhash=auto&loginhash_data='.$row['hashdata'].'&loginhash_user='.str_rot13($row['user']); + $url_edit_module = $row['server_url'].'index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&id_agente='.$row['id_agent'].'&'.'tab=module&'.'id_agent_module='.$row['id_agente_modulo'].'&'.'edit_module=1'.'&loginhash=auto&loginhash_data='.$row['hashdata'].'&loginhash_user='.str_rot13($row['user']); } else { $url_edit_module = 'index.php?'.'sec=gagente&'.'sec2=godmode/agentes/configurar_agente&'.'id_agente='.$row['id_agent'].'&'.'tab=module&'.'id_agent_module='.$row['id_agente_modulo'].'&'.'edit_module=1'; } - - if ($show_edit_icon) { - $table->cellclass[][2] = 'table_action_buttons'; - $data[2] .= ''.html_print_image( - 'images/config.png', - true, - [ - 'alt' => '0', - 'border' => '', - 'title' => __('Edit'), - ] - ).''; - } } } - if (in_array('module_name', $show_fields) || is_metaconsole()) { - $data[3] = ui_print_truncate_text($row['module_name'], 'module_small', false, true, true); - if ($row['extended_info'] != '') { + if (in_array('module_name', $show_fields) === true || is_metaconsole() === true) { + $data[3] = html_print_anchor( + [ + 'href' => ($url_edit_module ?? '#'), + 'content' => ui_print_truncate_text($row['module_name'], 'module_small', false, true, true), + ], + true + ); + + if (empty($row['extended_info']) === false) { $data[3] .= ui_print_help_tip($row['extended_info'], true, '/images/default_list.png'); } - if ($row['tags'] != '') { + if (empty($row['tags']) === false) { $data[3] .= html_print_image( - '/images/tag_red.png', + '/images/tag@svg.svg', true, [ 'title' => $row['tags'], - 'class' => 'tag_row', - ] - ); - } - } - - if (in_array('server_type', $show_fields) || is_metaconsole()) { - $data[4] = ui_print_servertype_icon((int) $row['id_modulo']); - } - - - if (in_array('module_name', $show_fields) || is_metaconsole()) { - $data[3] = ui_print_truncate_text($row['module_name'], 'module_small', false, true, true); - if ($row['extended_info'] != '') { - $data[3] .= ui_print_help_tip($row['extended_info'], true, '/images/default_list.png'); - } - - if ($row['tags'] != '') { - $data[3] .= html_print_image( - '/images/tag_red.png', - true, - [ - 'title' => $row['tags'], - 'class' => 'tag_row invert_filter', + 'class' => 'inverse_filter main_menu_icon', ] ); } @@ -1660,12 +1657,14 @@ if (!empty($result)) { } - if (in_array('interval', $show_fields) || is_metaconsole()) { - $data[5] = ($row['module_interval'] == 0) ? human_time_description_raw($row['agent_interval']) : human_time_description_raw($row['module_interval']); + if (in_array('interval', $show_fields) === true || is_metaconsole() === true) { + $data[5] = ((int) $row['module_interval'] === 0) ? human_time_description_raw($row['agent_interval']) : human_time_description_raw($row['module_interval']); } if (in_array('status', $show_fields) || is_metaconsole()) { - if ($row['utimestamp'] == 0 && (($row['module_type'] < 21 + hd($row['utimestamp'], true); + hd($row['module_type'], true); + if ($row['utimestamp'] === 0 && (($row['module_type'] < 21 || $row['module_type'] > 23) && $row['module_type'] != 100) ) { $data[6] = ui_print_status_image( @@ -1775,6 +1774,7 @@ if (!empty($result)) { $last_status = modules_get_agentmodule_last_status( $row['id_agente_modulo'] ); + hd('pues por aqui tambien', true); switch ($last_status) { case 0: if (is_numeric($row['datos'])) { @@ -1873,7 +1873,7 @@ if (!empty($result)) { $graph_params['histogram'] = 1; } - if (is_metaconsole() && isset($row['server_id'])) { + if (is_metaconsole() === true && isset($row['server_id']) === true) { // Set the server id. $graph_params['server'] = $row['server_id']; } @@ -1882,21 +1882,28 @@ if (!empty($result)) { $link = 'winopeng_var(\''.$url.'?'.$graph_params_str.'\',\''.$win_handle.'\', 800, 480)'; - $data[8] = get_module_realtime_link_graph($row); + $graphIconsContent = []; + $graphIconsContent[] = get_module_realtime_link_graph($row); if ($tresholds === true || $graph_type === 'boolean') { - $data[8] .= ''.html_print_image( - 'images/histograma.png', - true, + $graphIconsContent[] = html_print_anchor( [ - 'border' => '0', - 'alt' => '', - 'class' => 'invert_filter', - ] - ).''; + 'href' => 'javascript:'.$link, + 'content' => html_print_image( + 'images/event-history.svg', + true, + [ + 'border' => '0', + 'alt' => '', + 'class' => 'invert_filter main_menu_icon', + ] + ), + ], + true + ); } - if (!is_snapshot_data($row['datos'])) { + if (is_snapshot_data($row['datos']) === false) { if ($tresholds === true || $graph_type === 'boolean') { unset($graph_params['histogram']); } @@ -1904,21 +1911,41 @@ if (!empty($result)) { $graph_params_str = http_build_query($graph_params); $link = 'winopeng_var(\''.$url.'?'.$graph_params_str.'\',\''.$win_handle.'\', 800, 480)'; - $data[8] .= ''.html_print_image('images/chart.png', true, ['border' => '0', 'alt' => '', 'class' => 'invert_filter']).''; + $graphIconsContent[] = html_print_anchor( + [ + 'href' => 'javascript:'.$link, + 'content' => html_print_image('images/module-graph.svg', true, ['border' => '0', 'alt' => '', 'class' => 'invert_filter main_menu_icon']), + ], + true + ); } - $data[8] .= ''.html_print_image( - 'images/binary.png', - true, + $graphIconsContent[] = html_print_anchor( [ - 'border' => '0', - 'alt' => '', - 'class' => 'invert_filter', - ] - ).''; + 'href' => 'javascript: show_module_detail_dialog('.$row['id_agente_modulo'].', '.$row['id_agent'].', \''.$row['server_name'].'\', 0, '.SECONDS_1DAY.', \''.$row['module_name'].'\')', + 'content' => html_print_image( + 'images/simple-value.svg', + true, + [ + 'border' => '0', + 'alt' => '', + 'class' => 'invert_filter main_menu_icon', + ] + ), + ], + true + ); - $data[8] .= ''.$row['module_name'].''; + + $data[8] = html_print_div( + [ + 'class' => 'table_action_buttons', + 'content' => implode('', $graphIconsContent), + ], + true + ); } } @@ -2092,9 +2119,9 @@ if (!empty($result)) { html_print_table($table); - if ($count_modules > $config['block_size']) { - ui_pagination($count_modules, false, $offset, 0, false, 'offset', true, 'pagination-bottom'); + hd('patata'); + $tablePagination = ui_pagination($count_modules, false, $offset, 0, true, 'offset', false); } } else { if ($first_interaction) { @@ -2104,6 +2131,13 @@ if (!empty($result)) { } } +html_print_action_buttons( + html_print_div(['style' => 'float:left; height: 55px;'], true), + [ + 'type' => 'form_action', + 'right_content' => $tablePagination, + ] +); // End Build List Result. echo "
    "; From a1bf42c9f9f7d87c3e1ec76cdba8e4e2371c8dc4 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Fri, 17 Feb 2023 14:21:29 +0100 Subject: [PATCH 285/563] Ticket 10470 Agent improvements --- pandora_console/godmode/agentes/configurar_agente.php | 2 +- pandora_console/operation/agentes/estado_generalagente.php | 7 +++++-- pandora_console/operation/agentes/ver_agente.php | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/pandora_console/godmode/agentes/configurar_agente.php b/pandora_console/godmode/agentes/configurar_agente.php index 7023afd98e..27f3b7ea3a 100644 --- a/pandora_console/godmode/agentes/configurar_agente.php +++ b/pandora_console/godmode/agentes/configurar_agente.php @@ -813,7 +813,7 @@ if ($id_agente) { $pure = (int) get_parameter('pure'); if ($pure === 0) { ui_print_standard_header( - agents_get_alias($id_agente), + __('Agent setup view'), 'images/agent.png', false, $helper, diff --git a/pandora_console/operation/agentes/estado_generalagente.php b/pandora_console/operation/agentes/estado_generalagente.php index 50e80fd16c..2bdfc11690 100755 --- a/pandora_console/operation/agentes/estado_generalagente.php +++ b/pandora_console/operation/agentes/estado_generalagente.php @@ -80,7 +80,7 @@ $alive_animation = agents_get_starmap($id_agente, 200, 50); * START: TABLE AGENT BUILD. */ $agentCaptionAddedMessage = []; -$agentCaption = ''.__('Agent status').''; +$agentCaption = ''.ucfirst(agents_get_alias($agent['id_agente'])).''; $in_planned_downtime = (bool) db_get_sql( 'SELECT executed FROM tplanned_downtime INNER JOIN tplanned_downtime_agents @@ -209,7 +209,10 @@ $table_agent_graph .= '';*/ */ $table_status->data['agent_os'][0] = __('OS'); -$table_status->data['agent_os'][1] = (empty($agent['os_version']) === true) ? get_os_name((int) $agent['id_os']) : $agent['os_version']; +$agentOS = []; +$agentOS[] = html_print_div([ 'content' => (empty($agent['os_version']) === true) ? get_os_name((int) $agent['id_os']) : $agent['os_version']], true); +$agentOS[] = html_print_div([ 'style' => 'width: 32px', 'content' => ui_print_os_icon($agent['id_os'], false, true)], true); +$table_status->data['agent_os'][1] = html_print_div(['class' => 'agent_details_agent_data', 'content' => implode('', $agentOS)], true); // $table_agent_os .= (empty($agent['os_version']) === true) ? get_os_name((int) $agent['id_os']) : $agent['os_version'].'

    '; $addresses = agents_get_addresses($id_agente); diff --git a/pandora_console/operation/agentes/ver_agente.php b/pandora_console/operation/agentes/ver_agente.php index b5420643a2..2ba1eff6b2 100644 --- a/pandora_console/operation/agentes/ver_agente.php +++ b/pandora_console/operation/agentes/ver_agente.php @@ -1904,7 +1904,7 @@ switch ($tab) { if ((bool) $config['pure'] === false) { ui_print_standard_header( - agents_get_alias($id_agente), + __('Agent main view'), $icon, false, ($help_header ?? ''), From b0ee4a203abff01ba2dd02a9878eba03c14945b7 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Fri, 17 Feb 2023 14:26:41 +0100 Subject: [PATCH 286/563] Ticket 10470 Agent improvements bis --- pandora_console/operation/agentes/estado_generalagente.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/operation/agentes/estado_generalagente.php b/pandora_console/operation/agentes/estado_generalagente.php index 2bdfc11690..a66fd5063c 100755 --- a/pandora_console/operation/agentes/estado_generalagente.php +++ b/pandora_console/operation/agentes/estado_generalagente.php @@ -211,7 +211,7 @@ $table_agent_graph .= '';*/ $table_status->data['agent_os'][0] = __('OS'); $agentOS = []; $agentOS[] = html_print_div([ 'content' => (empty($agent['os_version']) === true) ? get_os_name((int) $agent['id_os']) : $agent['os_version']], true); -$agentOS[] = html_print_div([ 'style' => 'width: 32px', 'content' => ui_print_os_icon($agent['id_os'], false, true)], true); +$agentOS[] = html_print_div([ 'style' => 'width: 16px;padding-left: 5px', 'content' => ui_print_os_icon($agent['id_os'], false, true, true, false, false, false, ['width' => '16px'])], true); $table_status->data['agent_os'][1] = html_print_div(['class' => 'agent_details_agent_data', 'content' => implode('', $agentOS)], true); // $table_agent_os .= (empty($agent['os_version']) === true) ? get_os_name((int) $agent['id_os']) : $agent['os_version'].'

    '; From 69f08cc027d9d95989125365ce4b43bcd0bb2f5f Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Fri, 17 Feb 2023 14:44:26 +0100 Subject: [PATCH 287/563] Ticket 10460 Improve menu buttons --- pandora_console/include/functions_menu.php | 40 ++++++++++++++++++---- pandora_console/include/styles/pandora.css | 4 +++ 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/pandora_console/include/functions_menu.php b/pandora_console/include/functions_menu.php index 61940ea1b9..b9774ae800 100644 --- a/pandora_console/include/functions_menu.php +++ b/pandora_console/include/functions_menu.php @@ -875,12 +875,40 @@ if (is_ajax()) {

    '.__('Build').' '.$build_version.'

    '.__('Support expires').' 2023/04/26

    '; if ((bool) check_acl($config['id_user'], 0, 'PM') === true) { - $dialog .= ' -
    - - -
    - '; + $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 .= ' diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 82774a5aa5..e81f4d4c6d 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -10347,6 +10347,10 @@ button div.cog { contain; } +button div.info { + mask: url(../../images/info@svg.svg) no-repeat center / contain; + -webkit-mask: url(../../images/info@svg.svg) no-repeat center / contain; +} button div.signin { mask: url(../../images/signin.svg) no-repeat center / contain; -webkit-mask: url(../../images/signin.svg) no-repeat center / contain; From 8db5ef0789187be300839f98ec92245d2d0839e1 Mon Sep 17 00:00:00 2001 From: artica Date: Sat, 18 Feb 2023 01:01:14 +0100 Subject: [PATCH 288/563] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 5f29343d22..c6285e9055 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.769-230217 +Version: 7.0NG.769-230218 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index 07e42a8119..d98a0a0745 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.769-230217" +pandora_version="7.0NG.769-230218" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index 33f9b75177..7ecb45a3d7 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1023,7 +1023,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.769'; -use constant AGENT_BUILD => '230217'; +use constant AGENT_BUILD => '230218'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index 982080d877..e03f30f3a1 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_agent_linux %define version 7.0NG.769 -%define release 230217 +%define release 230218 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index bff8999226..c26329c1e8 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_agent_linux %define version 7.0NG.769 -%define release 230217 +%define release 230218 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index 0955293f59..e28c1a7b86 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.769" -PI_BUILD="230217" +PI_BUILD="230218" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 9d180788d6..8dc3194732 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{230217} +{230218} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index b6a69e5783..3737dad91a 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.769 Build 230217") +#define PANDORA_VERSION ("7.0NG.769 Build 230218") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 61bf76a879..1f650a737a 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.769(Build 230217))" + VALUE "ProductVersion", "(7.0NG.769(Build 230218))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 7eaf7524ea..8089e40024 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.769-230217 +Version: 7.0NG.769-230218 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index d6e24860e3..0e36ebcd8f 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.769-230217" +pandora_version="7.0NG.769-230218" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 6b8c7c25fa..3f9824106a 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC230217'; +$build_version = 'PC230218'; $pandora_version = 'v7.0NG.769'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 64d39e5054..b3495001ca 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -131,7 +131,7 @@
    [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 81140cd2e6..dfe72969d2 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.769 -%define release 230217 +%define release 230218 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index e834877aaa..4dd0423865 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.769 -%define release 230217 +%define release 230218 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index f81e4030b3..3e7a00c99e 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.769" -PI_BUILD="230217" +PI_BUILD="230218" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index ac725d1a10..1dee961de0 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -35,7 +35,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.769 Build 230217"; +my $version = "7.0NG.769 Build 230218"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index ea21a3610f..0c75ecd044 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.769 Build 230217"; +my $version = "7.0NG.769 Build 230218"; # save program name for logging my $progname = basename($0); From 5a56dc01213bafc03cedbc1aeed926f9407cee78 Mon Sep 17 00:00:00 2001 From: artica Date: Sun, 19 Feb 2023 01:02:04 +0100 Subject: [PATCH 289/563] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index c6285e9055..7259a4624f 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.769-230218 +Version: 7.0NG.769-230219 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index d98a0a0745..05a2fdd102 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.769-230218" +pandora_version="7.0NG.769-230219" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index 7ecb45a3d7..046ea7a7ea 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1023,7 +1023,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.769'; -use constant AGENT_BUILD => '230218'; +use constant AGENT_BUILD => '230219'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index e03f30f3a1..2efa397c6f 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_agent_linux %define version 7.0NG.769 -%define release 230218 +%define release 230219 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index c26329c1e8..62f7e0a23c 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_agent_linux %define version 7.0NG.769 -%define release 230218 +%define release 230219 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index e28c1a7b86..b37e0eedea 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.769" -PI_BUILD="230218" +PI_BUILD="230219" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 8dc3194732..7534dfdf45 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{230218} +{230219} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 3737dad91a..59c0e1f2e2 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.769 Build 230218") +#define PANDORA_VERSION ("7.0NG.769 Build 230219") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 1f650a737a..995a3d436e 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.769(Build 230218))" + VALUE "ProductVersion", "(7.0NG.769(Build 230219))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 8089e40024..7e8b4a29f0 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.769-230218 +Version: 7.0NG.769-230219 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index 0e36ebcd8f..d00729681d 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.769-230218" +pandora_version="7.0NG.769-230219" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 3f9824106a..4c14e2dd2b 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC230218'; +$build_version = 'PC230219'; $pandora_version = 'v7.0NG.769'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index b3495001ca..3544aaab85 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -131,7 +131,7 @@
    [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index dfe72969d2..88c7d7ba97 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.769 -%define release 230218 +%define release 230219 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 4dd0423865..964fab20b2 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.769 -%define release 230218 +%define release 230219 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 3e7a00c99e..5ed07b9a84 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.769" -PI_BUILD="230218" +PI_BUILD="230219" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 1dee961de0..8d2e18337b 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -35,7 +35,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.769 Build 230218"; +my $version = "7.0NG.769 Build 230219"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 0c75ecd044..f2353801cf 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.769 Build 230218"; +my $version = "7.0NG.769 Build 230219"; # save program name for logging my $progname = basename($0); From c24bf70cc2104484702538c38b8b3658c98ec451 Mon Sep 17 00:00:00 2001 From: artica Date: Mon, 20 Feb 2023 01:01:37 +0100 Subject: [PATCH 290/563] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 7259a4624f..bc6b5f0a61 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.769-230219 +Version: 7.0NG.769-230220 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index 05a2fdd102..dff687f821 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.769-230219" +pandora_version="7.0NG.769-230220" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index 046ea7a7ea..254bcd2bb7 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1023,7 +1023,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.769'; -use constant AGENT_BUILD => '230219'; +use constant AGENT_BUILD => '230220'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index 2efa397c6f..e79f2fbb48 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_agent_linux %define version 7.0NG.769 -%define release 230219 +%define release 230220 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 62f7e0a23c..3807bddd44 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_agent_linux %define version 7.0NG.769 -%define release 230219 +%define release 230220 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index b37e0eedea..24e9feb2ad 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.769" -PI_BUILD="230219" +PI_BUILD="230220" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 7534dfdf45..e18d90153f 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{230219} +{230220} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 59c0e1f2e2..354f282757 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.769 Build 230219") +#define PANDORA_VERSION ("7.0NG.769 Build 230220") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 995a3d436e..98564615ba 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.769(Build 230219))" + VALUE "ProductVersion", "(7.0NG.769(Build 230220))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 7e8b4a29f0..34e0cb2453 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.769-230219 +Version: 7.0NG.769-230220 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index d00729681d..654c9a5d97 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.769-230219" +pandora_version="7.0NG.769-230220" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 4c14e2dd2b..e0058687db 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC230219'; +$build_version = 'PC230220'; $pandora_version = 'v7.0NG.769'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 3544aaab85..9a64b90539 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -131,7 +131,7 @@
    [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 88c7d7ba97..6fbeb80a2f 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.769 -%define release 230219 +%define release 230220 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 964fab20b2..0395fe8616 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.769 -%define release 230219 +%define release 230220 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 5ed07b9a84..40b85fefa1 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.769" -PI_BUILD="230219" +PI_BUILD="230220" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 8d2e18337b..276c0f4d20 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -35,7 +35,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.769 Build 230219"; +my $version = "7.0NG.769 Build 230220"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index f2353801cf..d50993673a 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.769 Build 230219"; +my $version = "7.0NG.769 Build 230220"; # save program name for logging my $progname = basename($0); From 521f7ad0ce6cf8061f33cf1357585c5d1d506daf Mon Sep 17 00:00:00 2001 From: Jonathan Date: Mon, 20 Feb 2023 08:57:04 +0100 Subject: [PATCH 291/563] Menu go to images correction --- pandora_console/include/class/OrderInterpreter.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandora_console/include/class/OrderInterpreter.class.php b/pandora_console/include/class/OrderInterpreter.class.php index dab6c7d4fb..534eb6e45e 100644 --- a/pandora_console/include/class/OrderInterpreter.class.php +++ b/pandora_console/include/class/OrderInterpreter.class.php @@ -294,7 +294,7 @@ class OrderInterpreter extends Wizard [ 'name' => __('Task List'), 'icon' => ui_get_full_url( - 'images/menu/discovery.menu.png' + 'images/menu/discovery.svg' ), 'url' => ui_get_full_url( 'index.php?sec=discovery&sec2=godmode/servers/discovery&wiz=tasklist' @@ -338,7 +338,7 @@ class OrderInterpreter extends Wizard [ 'name' => __('Warp Update'), 'icon' => ui_get_full_url( - 'images/menu/um_messages.svg' + 'images/menu/warp_update.svg' ), 'url' => ui_get_full_url( 'index.php?sec=messages&sec2=godmode/update_manager/update_manager&tab=setup' From 4ee6cf7e2819bf37675cc6d104235593d840ce9d Mon Sep 17 00:00:00 2001 From: Pablo Aragon Date: Mon, 20 Feb 2023 09:54:48 +0100 Subject: [PATCH 292/563] 9662-Fix login meta --- pandora_console/general/login_page.php | 53 +++--- pandora_console/general/mysqlerr.php | 218 +++++++---------------- pandora_console/images/icono_support.png | Bin 750 -> 254 bytes pandora_console/include/styles/login.css | 33 +++- 4 files changed, 121 insertions(+), 183 deletions(-) diff --git a/pandora_console/general/login_page.php b/pandora_console/general/login_page.php index eb924227d0..bbdd8ba76c 100755 --- a/pandora_console/general/login_page.php +++ b/pandora_console/general/login_page.php @@ -171,11 +171,11 @@ if (isset($config['custom_support_url'])) { echo '
  • '.__('Support').'
  • '; } else { echo '
  • support
  • '; - echo '
  • '.__('Support').'
  • '; + echo '
  • '.__('Support').'
  • '; } } else if (!$custom_conf_enabled) { echo '
  • support
  • '; - echo '
  • '.__('Docs').'
  • '; + echo '
  • '.__('Support').'
  • '; } echo '
    '; @@ -370,17 +370,18 @@ if ($config['enterprise_installed']) { echo ''.__('Forgot your password?'); echo ''; - echo ''; echo '
    '; echo '
    '; } else if (isset($process_error_message) && !empty($process_error_message)) { - echo '
    '; + echo '
    '; echo '
    '; echo '
    '; - echo html_print_image('images/icono_stop.png', true, ['alt' => __('Password reset'), 'border' => 0]); + echo html_print_image('images/icono_stop.png', true, ['alt' => __('Forbidden'), 'border' => 0]); echo '
    '; echo '
    '; echo '
    '; echo '

    '.__('ERROR').'

    '; echo '

    '.$process_error_message.'

    '; + echo '
    '; echo '
    '; + echo '
    '; echo '
    '; - html_print_submit_button('Ok', 'reset_correct_button', false); + html_print_submit_button('Ok', 'reset_correct_button', false, ['class' => 'mini float-right']); echo '
    '; echo '
    '; echo '
    '; @@ -529,8 +533,9 @@ if (isset($correct_reset_pass_process)) { echo '

    '.__('SUCCESS').'

    '; echo '

    '.$correct_reset_pass_process.'

    '; echo '
    '; + echo '
    '; echo '
    '; - html_print_submit_button('Ok', 'final_process_correct_button', false); + html_print_submit_button('Ok', 'final_process_correct_button', false, ['class' => 'mini float-right']); echo '
    '; echo '
    '; echo ''; @@ -557,8 +562,9 @@ if (isset($login_failed)) { echo ''; } + echo '
    '; echo '
    '; - html_print_submit_button('Ok', 'hide-login-error', false, ['class' => ' mini']); + html_print_submit_button('Ok', 'hide-login-error', false, ['class' => ' mini float-right']); echo '
    '; echo ''; echo ''; @@ -581,8 +587,9 @@ if ($login_screen == 'logout') { } echo ''; + echo '
    '; echo '
    '; - html_print_submit_button('Ok', 'hide-login-logout', false, ['class' => ' mini']); + html_print_submit_button('Ok', 'hide-login-logout', false, ['class' => ' mini float-right']); echo '
    '; echo ''; echo ''; @@ -600,8 +607,9 @@ if ($login_screen === 'disabled_access_node') { echo '

    '.__('Centralized user in metaconsole').'

    '; echo '

    '.__('This user does not have access on node, please enable node access on this user from metaconsole.').'

    '; echo ''; + echo '
    '; echo '
    '; - html_print_submit_button('Ok', 'hide-login-logout', false); + html_print_submit_button('Ok', 'hide-login-logout', false, ['class' => 'mini float-right']); echo '
    '; echo ''; echo ''; @@ -708,8 +716,9 @@ if ($login_screen == 'error_authconfig' || $login_screen == 'error_emptyconfig' echo '

    '.$title.'

    '; echo '

    '.$message.''; echo ''; + echo '
    '; echo '

    '; - html_print_submit_button('Ok', 'hide-login-error', false); + html_print_submit_button('Ok', 'hide-login-error', false, ['class' => 'mini float-right']); echo '
    '; echo ''; echo ''; @@ -779,19 +788,23 @@ html_print_div(['id' => 'forced_title_layer', 'class' => 'forced_title_layer', ' resizable: true, draggable: true, modal: true, - height: 220, width: 528, clickOutside: true, overlay: { opacity: 0.5, background: "black" + }, + open: function (event, ui) { + $(".ui-widget-overlay").click(function () { + $('#login_logout').dialog('close'); + }); } }); }); $("#button-hide-login-logout").click (function () { - document.location = ""; - }); + $( "#login_logout" ).dialog( "close" ); + }); }); break; @@ -802,7 +815,6 @@ html_print_div(['id' => 'forced_title_layer', 'class' => 'forced_title_layer', ' resizable: true, draggable: true, modal: true, - height: 220, width: 528, clickOutside: true, overlay: { @@ -826,7 +838,6 @@ html_print_div(['id' => 'forced_title_layer', 'class' => 'forced_title_layer', ' resizable: true, draggable: true, modal: true, - height: 400, width: 700, overlay: { opacity: 0.5, @@ -844,7 +855,6 @@ html_print_div(['id' => 'forced_title_layer', 'class' => 'forced_title_layer', ' resizable: true, draggable: true, modal: true, - height: 220, width: 528, overlay: { opacity: 0.5, @@ -869,7 +879,6 @@ html_print_div(['id' => 'forced_title_layer', 'class' => 'forced_title_layer', ' resizable: true, draggable: true, modal: true, - height: 220, width: 528, clickOutside: true, overlay: { @@ -890,7 +899,6 @@ html_print_div(['id' => 'forced_title_layer', 'class' => 'forced_title_layer', ' resizable: true, draggable: true, modal: true, - height: 220, width: 528, clickOutside: true, overlay: { @@ -910,7 +918,6 @@ html_print_div(['id' => 'forced_title_layer', 'class' => 'forced_title_layer', ' resizable: true, draggable: true, modal: true, - height: 220, width: 528, overlay: { opacity: 0.5, diff --git a/pandora_console/general/mysqlerr.php b/pandora_console/general/mysqlerr.php index fe24117d3a..6368122da3 100644 --- a/pandora_console/general/mysqlerr.php +++ b/pandora_console/general/mysqlerr.php @@ -1,167 +1,77 @@ - - - - - - -
    - -
    - - - - /images/icono_cerrar.png'> -
    - -
    - /images/mysqlerr.png'> -
    - -
    -
    - $value) { - if (preg_match('/._alt/i', $key)) { - $custom_conf_enabled = true; - break; - } +$custom_conf_enabled = false; +foreach ($config as $key => $value) { + if (preg_match('/._alt/i', $key)) { + $custom_conf_enabled = true; + break; } +} - if (!$custom_conf_enabled || isset($config['custom_docs_url_alt'])) { - if (isset($config['custom_docs_url_alt'])) { - $docs_url = $config['custom_docs_url_alt']; - } else { - $docs_url = 'https://pandorafms.com/manual/en/documentation/02_installation/04_configuration'; - } - - echo ' - -
    - '.__('Documentation').' - -
    -
    - '; +if (empty($custom_conf_enabled) === true || isset($config['custom_docs_url_alt']) === true) { + if (isset($config['custom_docs_url_alt']) === true) { + $docs_url = $config['custom_docs_url_alt']; + } else { + $docs_url = 'https://pandorafms.com/manual/en/documentation/02_installation/04_configuration'; } +} + +echo '
    '; + echo '
    '; + echo '
    '; + echo html_print_image('images/mysqlerr.png', true, ['alt' => __('Mysql error'), 'border' => 0]); + echo '
    '; + echo '
    '; + echo '
    '; + echo '

    '.__('Database error').'

    '; + echo '

    '.$message.'

    '; + echo '
    '; + echo '
    '; + echo '
    '; + html_print_submit_button( + __('Documentation'), + 'mysqlerr_button', + false, + ['class' => 'mini float-right'] + ); + echo '
    '; + echo '
    '; + echo '
    '; + echo '
    '; + ?> - ?> - - - -
    - -
    - - - diff --git a/pandora_console/images/icono_support.png b/pandora_console/images/icono_support.png index 6db6d32b528d041ddbad081f2a80fc471eb68b8f..302e245ebcd20025a43c8aa45e132fc093504b6e 100644 GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAd3?%E9GuQzs#^NA%Cx&(BWL^R}x&b~Ru0XnR z;@ZXuYnvvnZ=SfmX(EuZ4vHqMYXYK4>zaXrlYp}8?yq}44XA;?B*-tAq2Yg7{nCoX z2lhAC)z(z2pDE`BN~L(ZIEHY{Oio~6R8&o6<46bz5^6A-J4Ixnj+p9F293#_XHuGt zLK~tM`lzzIsY(Rz`qmRr3G< literal 750 zcmVw9Lma1BmaV3%&;kAY_gK5dX*Lll}i8Ac28c08)(XLPi3L8-SEO zKmak21PHnbD5-!mI?xoZhna{=!F=SXB4jNLfP%n)kizr$;~E-YpyWeLki3Uk2@pWE zMbJ8#W5x1WbLj;i0&3WYF zhp3#3X3%-OMG~%J3RadO8;UE7AOj{e{zhnh^&gl#1fgOZi1rdbXOrrs|7hiSKP;K! zGl&sKeH;(v9)!~UAn$<;MDiw4u0k#n9H6cgAg3fufEofTPXA-AvWYYZgzrO3#rw$V zh}1Nc01e~>Xx1ynkK}RPu%!G`+id0pU{@12v~*C5yeaS4blLw5GMtr@gWN=>aB~{-{!?8PoNs zfyo0`7{*N2`8|q~YGgp&Y`%A;pk&70Y3&@ZHh!%8THtR+Hrstm7Gy zVe&AuoeM?|{y-17Lq~Mp$g)7}AojspmJ2(vw914<-Z#GdJ^Q=XtWTzksEWU`aj z+(9LqQIuusshU8=#hjVIsWWAi@}$Bvl{xehEAiYwi>%UMl_wo}Etf{cvll3N Date: Mon, 20 Feb 2023 10:07:10 +0100 Subject: [PATCH 293/563] #10459 activate Apply password policy to admin users default by default --- pandora_console/pandoradb_data.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/pandoradb_data.sql b/pandora_console/pandoradb_data.sql index db55df207d..21fd247902 100644 --- a/pandora_console/pandoradb_data.sql +++ b/pandora_console/pandoradb_data.sql @@ -97,7 +97,7 @@ INSERT INTO `tconfig` (`token`, `value`) VALUES ('first_login', 0), ('mins_fail_pass', 5), ('number_attempts', 5), -('enable_pass_policy_admin', 0), +('enable_pass_policy_admin', 1), ('enable_pass_history', 0), ('compare_pass', 3), ('meta_style', 'meta_pandora'), From bf307adb01a67acf6b056a1195a89cccc7f3b711 Mon Sep 17 00:00:00 2001 From: Pablo Aragon Date: Mon, 20 Feb 2023 10:47:00 +0100 Subject: [PATCH 294/563] 10483-Fixed csrf token on login after logout --- pandora_console/general/login_page.php | 4 ++++ pandora_console/index.php | 1 + 2 files changed, 5 insertions(+) diff --git a/pandora_console/general/login_page.php b/pandora_console/general/login_page.php index bb9fa19185..cd45f34f48 100755 --- a/pandora_console/general/login_page.php +++ b/pandora_console/general/login_page.php @@ -359,6 +359,10 @@ if ($config['enterprise_installed']) { } // CSRF validation. +if (isset($_SESSION['csrf_code']) === true) { + unset($_SESSION['csrf_code']); +} + html_print_csrf_hidden(); echo ''; diff --git a/pandora_console/index.php b/pandora_console/index.php index 1826dbe789..d7f124575b 100755 --- a/pandora_console/index.php +++ b/pandora_console/index.php @@ -1049,6 +1049,7 @@ if (isset($_GET['bye'])) { header_remove('Set-Cookie'); setcookie(session_name(), $_COOKIE[session_name()], (time() - 4800), '/'); + generate_csrf_code(); // Process logout. include 'general/logoff.php'; From fd77ee1a14c7e5bca460c6b4eec30ddc59185459 Mon Sep 17 00:00:00 2001 From: Pablo Aragon Date: Mon, 20 Feb 2023 11:16:07 +0100 Subject: [PATCH 295/563] 9662-Fix double authentication login --- pandora_console/general/login_page.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/general/login_page.php b/pandora_console/general/login_page.php index bbdd8ba76c..9f2f0aabf2 100755 --- a/pandora_console/general/login_page.php +++ b/pandora_console/general/login_page.php @@ -334,7 +334,7 @@ switch ($login_screen) { echo ''; From e95e6acd0c087645e38ec1377c52ecad7e823f6d Mon Sep 17 00:00:00 2001 From: Pablo Aragon Date: Mon, 20 Feb 2023 11:27:20 +0100 Subject: [PATCH 296/563] 9662-Fix double authentication login --- pandora_console/general/login_page.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/general/login_page.php b/pandora_console/general/login_page.php index 9f2f0aabf2..397c67755f 100755 --- a/pandora_console/general/login_page.php +++ b/pandora_console/general/login_page.php @@ -334,7 +334,7 @@ switch ($login_screen) { echo ''; From 333a93fad2071fb870cfbcd9670387f3c12b4309 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Mon, 20 Feb 2023 11:45:59 +0100 Subject: [PATCH 297/563] Added MR --- pandora_console/extras/mr/62.sql | 63 ++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 pandora_console/extras/mr/62.sql diff --git a/pandora_console/extras/mr/62.sql b/pandora_console/extras/mr/62.sql new file mode 100644 index 0000000000..30760cd6b6 --- /dev/null +++ b/pandora_console/extras/mr/62.sql @@ -0,0 +1,63 @@ +START TRANSACTION; + +UPDATE tconfig_os SET `icon_name` = 'linux@svg.svg' WHERE `id_os` = 1; +UPDATE tconfig_os SET `icon_name` = 'solaris@svg.svg' WHERE `id_os` = 2; +UPDATE tconfig_os SET `icon_name` = 'aix@svg.svg' WHERE `id_os` = 3; +UPDATE tconfig_os SET `icon_name` = 'freebsd@svg.svg' WHERE `id_os` = 4; +UPDATE tconfig_os SET `icon_name` = 'HP@svg.svg' WHERE `id_os` = 5; +UPDATE tconfig_os SET `icon_name` = 'cisco@svg.svg' WHERE `id_os` = 7; +UPDATE tconfig_os SET `icon_name` = 'apple@svg.svg' WHERE `id_os` = 8; +UPDATE tconfig_os SET `icon_name` = 'windows@svg.svg' WHERE `id_os` = 9; +UPDATE tconfig_os SET `icon_name` = 'other-OS@svg.svg' WHERE `id_os` = 10; +UPDATE tconfig_os SET `icon_name` = 'network-server@svg.svg' WHERE `id_os` = 11; +UPDATE tconfig_os SET `icon_name` = 'network-server@svg.svg' WHERE `id_os` = 12; +UPDATE tconfig_os SET `icon_name` = 'network-server@svg.svg' WHERE `id_os` = 13; +UPDATE tconfig_os SET `icon_name` = 'embedded@svg.svg' WHERE `id_os` = 14; +UPDATE tconfig_os SET `icon_name` = 'android@svg.svg' WHERE `id_os` = 15; +UPDATE tconfig_os SET `icon_name` = 'vmware@svg.svg' WHERE `id_os` = 16; +UPDATE tconfig_os SET `icon_name` = 'routers@svg.svg' WHERE `id_os` = 17; +UPDATE tconfig_os SET `icon_name` = 'switch@svg.svg' WHERE `id_os` = 18; +UPDATE tconfig_os SET `icon_name` = 'satellite@svg.svg' WHERE `id_os` = 19; +UPDATE tconfig_os SET `icon_name` = 'mainframe@svg.svg' WHERE `id_os` = 20; +UPDATE tconfig_os SET `icon_name` = 'cluster@svg.svg' WHERE `id_os` = 100; + +UPDATE tgrupo SET `icon` = 'servers@groups.svg' WHERE `id_grupo` = 2; +UPDATE tgrupo SET `icon` = 'firewall@groups.svg' WHERE `id_grupo` = 4; +UPDATE tgrupo SET `icon` = 'database@groups.svg' WHERE `id_grupo` = 8; +UPDATE tgrupo SET `icon` = 'network@groups.svg' WHERE `id_grupo` = 9; +UPDATE tgrupo SET `icon` = 'unknown@groups.svg' WHERE `id_grupo` = 10; +UPDATE tgrupo SET `icon` = 'workstation@groups.svg' WHERE `id_grupo` = 11; +UPDATE tgrupo SET `icon` = 'applications@groups.svg' WHERE `id_grupo` = 12; +UPDATE tgrupo SET `icon` = 'web@groups.svg' WHERE `id_grupo` = 13; + +UPDATE `ttipo_modulo` SET `icon` = 'data-server@svg.svg' WHERE `id_tipo` = 1; +UPDATE `ttipo_modulo` SET `icon` = 'generic-boolean@svg.svg' WHERE `id_tipo` = 2; +UPDATE `ttipo_modulo` SET `icon` = 'generic-string@svg.svg' WHERE `id_tipo` = 3; +UPDATE `ttipo_modulo` SET `icon` = 'data-server@svg.svg' WHERE `id_tipo` = 4; +UPDATE `ttipo_modulo` SET `icon` = 'data-server@svg.svg' WHERE `id_tipo` = 5; +UPDATE `ttipo_modulo` SET `icon` = 'ICMP-network-boolean-data@svg.svg' WHERE `id_tipo` = 6; +UPDATE `ttipo_modulo` SET `icon` = 'ICMP-network-latency@svg.svg' WHERE `id_tipo` = 7; +UPDATE `ttipo_modulo` SET `icon` = 'TCP-network-numeric-data@svg.svg' WHERE `id_tipo` = 8; +UPDATE `ttipo_modulo` SET `icon` = 'TCP-network-boolean-data@svg.svg' WHERE `id_tipo` = 9; +UPDATE `ttipo_modulo` SET `icon` = 'TCP-network-alphanumeric-data@svg.svg' WHERE `id_tipo` = 10; +UPDATE `ttipo_modulo` SET `icon` = 'TCP-network-incremental-data@svg.svg' WHERE `id_tipo` = 11; +UPDATE `ttipo_modulo` SET `icon` = 'SNMP-network-numeric-data@svg.svg' WHERE `id_tipo` = 15; +UPDATE `ttipo_modulo` SET `icon` = 'SNMP-network-incremental-data@svg.svg' WHERE `id_tipo` = 16; +UPDATE `ttipo_modulo` SET `icon` = 'SNMP-network-alphanumeric-data@svg.svg' WHERE `id_tipo` = 17; +UPDATE `ttipo_modulo` SET `icon` = 'SNMP-network-incremental-data@svg.svg' WHERE `id_tipo` = 18; +UPDATE `ttipo_modulo` SET `icon` = 'asynchronus-data@svg.svg' WHERE `id_tipo` = 21; +UPDATE `ttipo_modulo` SET `icon` = 'asynchronus-data@svg.svg' WHERE `id_tipo` = 22; +UPDATE `ttipo_modulo` SET `icon` = 'asynchronus-data@svg.svg' WHERE `id_tipo` = 23; +UPDATE `ttipo_modulo` SET `icon` = 'wux@svg.svg' WHERE `id_tipo` = 25; +UPDATE `ttipo_modulo` SET `icon` = 'server-web@svg.svg' WHERE `id_tipo` = 30; +UPDATE `ttipo_modulo` SET `icon` = 'web-analisys-data@svg.svg' WHERE `id_tipo` = 31; +UPDATE `ttipo_modulo` SET `icon` = 'server-web@svg.svg' WHERE `id_tipo` = 32; +UPDATE `ttipo_modulo` SET `icon` = 'server-web@svg.svg' WHERE `id_tipo` = 33; +UPDATE `ttipo_modulo` SET `icon` = 'remote-execution-numeric-data@svg.svg' WHERE `id_tipo` = 34; +UPDATE `ttipo_modulo` SET `icon` = 'remote-execution-boolean-data@svg.svg' WHERE `id_tipo` = 35; +UPDATE `ttipo_modulo` SET `icon` = 'remote-execution-alphanumeric-data@svg.svg' WHERE `id_tipo` = 36; +UPDATE `ttipo_modulo` SET `icon` = 'remote-execution-incremental-data@svg.svg' WHERE `id_tipo` = 37; +UPDATE `ttipo_modulo` SET `icon` = 'server-web@svg.svg' WHERE `id_tipo` = 38; +UPDATE `ttipo_modulo` SET `icon` = 'keepalive@svg.svg' WHERE `id_tipo` = 100; + +COMMIT; From 47c2b620292b50f63a20b56bacbe3e5b50916454 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Mon, 20 Feb 2023 11:47:56 +0100 Subject: [PATCH 298/563] Improve login page --- pandora_console/general/login_page.php | 13 ------------- pandora_console/include/styles/login.css | 1 - 2 files changed, 14 deletions(-) diff --git a/pandora_console/general/login_page.php b/pandora_console/general/login_page.php index eb924227d0..402dc7293f 100755 --- a/pandora_console/general/login_page.php +++ b/pandora_console/general/login_page.php @@ -309,7 +309,6 @@ switch ($login_screen) { false, true ); - echo '
    '; echo ''; echo ''; - if ($return) { + if ($return === true) { return $output; } else { echo $output; diff --git a/pandora_console/include/javascript/pandora.js b/pandora_console/include/javascript/pandora.js index 49afd629f6..03c7308faf 100644 --- a/pandora_console/include/javascript/pandora.js +++ b/pandora_console/include/javascript/pandora.js @@ -2340,3 +2340,15 @@ function autoclose_info_box(id, autoCloseTime) { close_info_box(id); }, autoCloseTime); } + +function show_hide_password(e, url) { + let inputPass = e.target.previousElementSibling; + + if (inputPass.type === "password") { + inputPass.type = "text"; + inputPass.style.backgroundImage = "url(" + url + "/images/disable.svg)"; + } else { + inputPass.type = "password"; + inputPass.style.backgroundImage = "url(" + url + "/images/enable.svg)"; + } +} diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index e81f4d4c6d..2745ca7f00 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -9908,9 +9908,9 @@ input, textarea, select { background-color: #f6f7fb; - height: 42px; - border: 1px solid #c0ccdc; - border-radius: 8px; + height: 38px; + border: 2px solid #c0ccdc; + border-radius: 6px; padding-left: 12px; font: normal normal normal 14px Pandora-Light; color: #2b3332; @@ -9937,7 +9937,7 @@ select:disabled, input:not([type="image"]):focus, textarea:focus, select:focus { - border: 1px solid #8a96a6; + border: 2px solid #8a96a6; } :focus { @@ -10424,15 +10424,15 @@ button.ui-button.ui-widget.submit-cancel:active { } .moduleIdBox { - height: 40px; - border-top-right-radius: 8px; - border-bottom-right-radius: 8px; + height: 36px; + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; margin-left: -56px; - border: 1px solid #c0ccdc; + border: 2px solid #c0ccdc; background-color: #f6f7fb; padding: 0 16px; z-index: 0; - line-height: 42px; + line-height: 40px; } /* Custom Checkbox Style */ @@ -10567,14 +10567,14 @@ tr.bring_next_field { vertical-align: middle; text-align: left; min-width: 150px !important; - z-index: 10002; + z-index: 60; } .select2-container .select2-selection--single, .select2-container .select2-selection--multiple { background-color: #f6f7fb !important; - border: 1px solid #c0ccdc !important; - border-radius: 8px !important; + border: 2px solid #c0ccdc !important; + border-radius: 6px !important; color: #2b3332 !important; -webkit-box-sizing: border-box !important; -moz-box-sizing: border-box !important; @@ -10584,7 +10584,7 @@ tr.bring_next_field { } .select2-container .select2-selection--single { - height: 42px !important; + height: 38px !important; padding-left: 4px !important; display: block; user-select: none; @@ -10592,7 +10592,7 @@ tr.bring_next_field { } .select2-container .select2-selection--multiple { - height: 42px !important; + height: 38px !important; padding-left: 0px !important; } @@ -10621,7 +10621,7 @@ tr.bring_next_field { border: 0 !important; height: 20px !important; margin-left: -8px !important; - margin-top: 10px !important; + margin-top: 8px !important; position: absolute !important; width: 20px !important; background: url(../../images/dropdown-down.svg) no-repeat content-box !important; @@ -10642,7 +10642,7 @@ tr.bring_next_field { text-overflow: ellipsis; white-space: nowrap; color: #444 !important; - line-height: 42px !important; + line-height: 36px !important; } .select2-container--default.select2-container--open.select2-container--below @@ -10808,7 +10808,7 @@ tr.bring_next_field { position: absolute; left: 0; top: 0; - height: 58px; + height: 62px; border: 1px solid #e5e9ed; background-color: #fff; /*z-index: 10000;*/ @@ -11214,3 +11214,22 @@ form#satellite_conf_edit > fieldset.full-column { .inputs_date_details > input { margin: 5px; } + +.show-hide-pass { + position: relative; + right: 38px; + top: 0px; + border: 0; + outline: none; + margin: 0; + height: 40px; + width: 40px; + cursor: pointer; +} + +.show-hide-pass-background { + background-position: center right 15px; + background-repeat: no-repeat; + background-size: 24px; + background-image: url("../../images/enable.svg"); +} From da58e4b9e0e123eca323b6ee1594e7757f763889 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Mon, 20 Feb 2023 13:02:24 +0100 Subject: [PATCH 300/563] Ticket 10484 Fixed List Operating Systems --- pandora_console/extras/mr/62.sql | 40 +++---- pandora_console/godmode/setup/os.builder.php | 100 ++++++++++++------ pandora_console/godmode/setup/os.list.php | 25 +++-- pandora_console/godmode/setup/os.php | 16 +-- .../images/{HP@svg.svg => HP@os.svg} | 0 .../images/{aix@svg.svg => aix@os.svg} | 0 .../{android@svg.svg => android@os.svg} | 0 .../images/{apple@svg.svg => apple@os.svg} | 0 .../images/{cisco@svg.svg => cisco@os.svg} | 0 .../{cluster@svg.svg => cluster@os.svg} | 0 .../{embedded@svg.svg => embedded@os.svg} | 0 pandora_console/images/example_qr.png | Bin 0 -> 2275 bytes .../{freebsd@svg.svg => freebsd@os.svg} | 0 .../images/{linux@svg.svg => linux@os.svg} | 0 .../{mainframe@svg.svg => mainframe@os.svg} | 0 ...k-server@svg.svg => network-server@os.svg} | 0 .../{other-OS@svg.svg => other-OS@os.svg} | 0 .../{routers@svg.svg => routers@os.svg} | 0 .../{satellite@svg.svg => satellite@os.svg} | 0 .../{solaris@svg.svg => solaris@os.svg} | 0 .../images/{switch@svg.svg => switch@os.svg} | 0 .../images/{vmware@svg.svg => vmware@os.svg} | 0 .../{windows@svg.svg => windows@os.svg} | 0 .../include/styles/agent_manager.css | 2 + .../operation/agentes/estado_agente.php | 2 +- pandora_console/pandoradb_data.sql | 40 +++---- 26 files changed, 136 insertions(+), 89 deletions(-) rename pandora_console/images/{HP@svg.svg => HP@os.svg} (100%) rename pandora_console/images/{aix@svg.svg => aix@os.svg} (100%) rename pandora_console/images/{android@svg.svg => android@os.svg} (100%) rename pandora_console/images/{apple@svg.svg => apple@os.svg} (100%) rename pandora_console/images/{cisco@svg.svg => cisco@os.svg} (100%) rename pandora_console/images/{cluster@svg.svg => cluster@os.svg} (100%) rename pandora_console/images/{embedded@svg.svg => embedded@os.svg} (100%) create mode 100644 pandora_console/images/example_qr.png rename pandora_console/images/{freebsd@svg.svg => freebsd@os.svg} (100%) rename pandora_console/images/{linux@svg.svg => linux@os.svg} (100%) rename pandora_console/images/{mainframe@svg.svg => mainframe@os.svg} (100%) rename pandora_console/images/{network-server@svg.svg => network-server@os.svg} (100%) rename pandora_console/images/{other-OS@svg.svg => other-OS@os.svg} (100%) rename pandora_console/images/{routers@svg.svg => routers@os.svg} (100%) rename pandora_console/images/{satellite@svg.svg => satellite@os.svg} (100%) rename pandora_console/images/{solaris@svg.svg => solaris@os.svg} (100%) rename pandora_console/images/{switch@svg.svg => switch@os.svg} (100%) rename pandora_console/images/{vmware@svg.svg => vmware@os.svg} (100%) rename pandora_console/images/{windows@svg.svg => windows@os.svg} (100%) diff --git a/pandora_console/extras/mr/62.sql b/pandora_console/extras/mr/62.sql index 30760cd6b6..4d21f9bb2a 100644 --- a/pandora_console/extras/mr/62.sql +++ b/pandora_console/extras/mr/62.sql @@ -1,25 +1,25 @@ START TRANSACTION; -UPDATE tconfig_os SET `icon_name` = 'linux@svg.svg' WHERE `id_os` = 1; -UPDATE tconfig_os SET `icon_name` = 'solaris@svg.svg' WHERE `id_os` = 2; -UPDATE tconfig_os SET `icon_name` = 'aix@svg.svg' WHERE `id_os` = 3; -UPDATE tconfig_os SET `icon_name` = 'freebsd@svg.svg' WHERE `id_os` = 4; -UPDATE tconfig_os SET `icon_name` = 'HP@svg.svg' WHERE `id_os` = 5; -UPDATE tconfig_os SET `icon_name` = 'cisco@svg.svg' WHERE `id_os` = 7; -UPDATE tconfig_os SET `icon_name` = 'apple@svg.svg' WHERE `id_os` = 8; -UPDATE tconfig_os SET `icon_name` = 'windows@svg.svg' WHERE `id_os` = 9; -UPDATE tconfig_os SET `icon_name` = 'other-OS@svg.svg' WHERE `id_os` = 10; -UPDATE tconfig_os SET `icon_name` = 'network-server@svg.svg' WHERE `id_os` = 11; -UPDATE tconfig_os SET `icon_name` = 'network-server@svg.svg' WHERE `id_os` = 12; -UPDATE tconfig_os SET `icon_name` = 'network-server@svg.svg' WHERE `id_os` = 13; -UPDATE tconfig_os SET `icon_name` = 'embedded@svg.svg' WHERE `id_os` = 14; -UPDATE tconfig_os SET `icon_name` = 'android@svg.svg' WHERE `id_os` = 15; -UPDATE tconfig_os SET `icon_name` = 'vmware@svg.svg' WHERE `id_os` = 16; -UPDATE tconfig_os SET `icon_name` = 'routers@svg.svg' WHERE `id_os` = 17; -UPDATE tconfig_os SET `icon_name` = 'switch@svg.svg' WHERE `id_os` = 18; -UPDATE tconfig_os SET `icon_name` = 'satellite@svg.svg' WHERE `id_os` = 19; -UPDATE tconfig_os SET `icon_name` = 'mainframe@svg.svg' WHERE `id_os` = 20; -UPDATE tconfig_os SET `icon_name` = 'cluster@svg.svg' WHERE `id_os` = 100; +UPDATE tconfig_os SET `icon_name` = 'linux@os.svg' WHERE `id_os` = 1; +UPDATE tconfig_os SET `icon_name` = 'solaris@os.svg' WHERE `id_os` = 2; +UPDATE tconfig_os SET `icon_name` = 'aix@os.svg' WHERE `id_os` = 3; +UPDATE tconfig_os SET `icon_name` = 'freebsd@os.svg' WHERE `id_os` = 4; +UPDATE tconfig_os SET `icon_name` = 'HP@os.svg' WHERE `id_os` = 5; +UPDATE tconfig_os SET `icon_name` = 'cisco@os.svg' WHERE `id_os` = 7; +UPDATE tconfig_os SET `icon_name` = 'apple@os.svg' WHERE `id_os` = 8; +UPDATE tconfig_os SET `icon_name` = 'windows@os.svg' WHERE `id_os` = 9; +UPDATE tconfig_os SET `icon_name` = 'other-OS@os.svg' WHERE `id_os` = 10; +UPDATE tconfig_os SET `icon_name` = 'network-server@os.svg' WHERE `id_os` = 11; +UPDATE tconfig_os SET `icon_name` = 'network-server@os.svg' WHERE `id_os` = 12; +UPDATE tconfig_os SET `icon_name` = 'network-server@os.svg' WHERE `id_os` = 13; +UPDATE tconfig_os SET `icon_name` = 'embedded@os.svg' WHERE `id_os` = 14; +UPDATE tconfig_os SET `icon_name` = 'android@os.svg' WHERE `id_os` = 15; +UPDATE tconfig_os SET `icon_name` = 'vmware@os.svg' WHERE `id_os` = 16; +UPDATE tconfig_os SET `icon_name` = 'routers@os.svg' WHERE `id_os` = 17; +UPDATE tconfig_os SET `icon_name` = 'switch@os.svg' WHERE `id_os` = 18; +UPDATE tconfig_os SET `icon_name` = 'satellite@os.svg' WHERE `id_os` = 19; +UPDATE tconfig_os SET `icon_name` = 'mainframe@os.svg' WHERE `id_os` = 20; +UPDATE tconfig_os SET `icon_name` = 'cluster@os.svg' WHERE `id_os` = 100; UPDATE tgrupo SET `icon` = 'servers@groups.svg' WHERE `id_grupo` = 2; UPDATE tgrupo SET `icon` = 'firewall@groups.svg' WHERE `id_grupo` = 4; diff --git a/pandora_console/godmode/setup/os.builder.php b/pandora_console/godmode/setup/os.builder.php index 83b79e95a4..ac2026d0e6 100644 --- a/pandora_console/godmode/setup/os.builder.php +++ b/pandora_console/godmode/setup/os.builder.php @@ -1,17 +1,32 @@ '; $table = new stdClass(); $table->width = '100%'; $table->class = 'databox filters'; -$table->style[0] = 'font-weight: bolder;'; +$table->style[0] = 'width: 15%'; $table->data[0][0] = __('Name:'); -$table->data[0][1] = html_print_input_text('name', $name, __('Name'), 20, 30, true); +$table->data[0][1] = html_print_input_text('name', $name, __('Name'), 20, 30, true, false, false, '', 'w250px'); $table->data[1][0] = __('Description'); -$table->data[1][1] = html_print_textarea('description', 5, 10, $description, '', true); -$icons = get_list_os_icons_dir(); +$table->data[1][1] = html_print_textarea('description', 5, 20, $description, '', true, 'w250px'); $table->data[2][0] = __('Icon'); -$table->data[2][1] = html_print_select($icons, 'icon', $icon, 'show_icon_OS();', __('None'), 0, true); -$table->data[2][1] .= ' '.ui_print_os_icon($idOS, false, true).''; + +$iconData = []; +$iconData[] = html_print_select( + $icons, + 'icon', + $icon, + 'show_icon_OS();', + __('None'), + 0, + true +); +$iconData[] = html_print_div( + [ + 'id' => 'icon_image', + 'class' => 'inverse_filter main_menu_icon', + 'style' => 'margin-left: 10px', + 'content' => ui_print_os_icon($idOS, false, true), + ], + true +); + +$table->data[2][1] = html_print_div( + [ + 'style' => 'display: flex;align-items: center;', + 'content' => implode('', $iconData), + ], + true +); html_print_table($table); @@ -47,9 +89,11 @@ html_print_table($table); html_print_input_hidden('id_os', $idOS); html_print_input_hidden('action', $actionHidden); -echo '
    '; -html_print_submit_button($textButton, 'update_button', false, $classButton); -echo '
    '; +html_print_action_buttons( + html_print_submit_button($textButton, 'update_button', false, $classButton, true), + ['type' => 'form_action'] +); + echo ''; @@ -59,18 +103,10 @@ function get_list_os_icons_dir() $return = []; - $items = scandir($config['homedir'].'/images/os_icons'); + $items = scandir($config['homedir'].'/images/'); foreach ($items as $item) { - if (strstr($item, '_small.png') || strstr($item, '_small.gif') - || strstr($item, '_small.jpg') - ) { - continue; - } - - if (strstr($item, '.png') || strstr($item, '.gif') - || strstr($item, '.jpg') - ) { + if (strstr($item, '@os.svg')) { $return[$item] = $item; } } @@ -86,7 +122,7 @@ function show_icon_OS() { var params = []; params.push("get_image_path=1"); - params.push('img_src=images/os_icons/' + $("#icon").val()); + params.push('img_src=images/' + $("#icon").val()); params.push("page=include/ajax/skins.ajax"); jQuery.ajax ({ data: params.join ("&"), diff --git a/pandora_console/godmode/setup/os.list.php b/pandora_console/godmode/setup/os.list.php index 48a8b9b534..f8ba6a865a 100644 --- a/pandora_console/godmode/setup/os.list.php +++ b/pandora_console/godmode/setup/os.list.php @@ -1,6 +1,6 @@ width = '100%'; +// $table->width = '100%'; +$table->styleTable = 'margin: 10px 10px 0'; $table->class = 'info_table'; $table->head[0] = ''; @@ -102,7 +103,7 @@ if ($osList === false) { $table->data = []; foreach ($osList as $os) { $data = []; - $data[] = ui_print_os_icon($os['id_os'], false, true); + $data[] = html_print_div(['class' => 'main_menu_icon', 'content' => ui_print_os_icon($os['id_os'], false, true)], true); $data[] = $os['id_os']; if ($is_management_allowed === true) { if (is_metaconsole() === true) { @@ -119,11 +120,20 @@ foreach ($osList as $os) { if ($is_management_allowed === true) { $table->cellclass[][4] = 'table_action_buttons'; if ($os['id_os'] > 16) { - if (is_metaconsole()) { - $data[] = ''.html_print_image('images/cross.png', true).''; + if (is_metaconsole() === true) { + $hrefDelete = 'index.php?sec=advanced&sec2=advanced/component_management&tab=os_manage&action=delete&tab2=list&id_os='.$os['id_os']; } else { - $data[] = ''.html_print_image('images/cross.png', true, ['class' => 'invert_filter']).''; + $hrefDelete = 'index.php?sec=gsetup&sec2=godmode/setup/os&action=delete&tab=list&id_os='.$os['id_os']; } + + $data[] = html_print_anchor( + [ + 'href' => $hrefDelete, + 'class' => 'inverse_filter main_menu_icon', + 'content' => html_print_image('images/delete.svg', true), + ], + true + ); } else { // The original icons of pandora don't delete. $data[] = ''; @@ -134,7 +144,6 @@ foreach ($osList as $os) { } if (isset($data) === true) { - ui_pagination($count_osList, ui_get_url_refresh(['message' => false]), $offset); html_print_table($table); ui_pagination($count_osList, ui_get_url_refresh(['message' => false]), $offset, 0, false, 'offset', true, 'pagination-bottom'); } else { diff --git a/pandora_console/godmode/setup/os.php b/pandora_console/godmode/setup/os.php index dafdfe0730..8ced483492 100644 --- a/pandora_console/godmode/setup/os.php +++ b/pandora_console/godmode/setup/os.php @@ -71,7 +71,7 @@ if ($is_management_allowed === true) { case 'edit': $actionHidden = 'update'; $textButton = __('Update'); - $classButton = 'class="sub upd"'; + $classButton = ['icon' => 'wand']; break; case 'save': @@ -93,7 +93,7 @@ if ($is_management_allowed === true) { $tab = 'builder'; $actionHidden = 'save'; $textButton = __('Create'); - $classButton = 'class="sub next"'; + $classButton = ['icon' => 'wand']; } else { $tab = 'list'; $message = 1; @@ -140,7 +140,7 @@ if ($is_management_allowed === true) { $actionHidden = 'update'; $textButton = __('Update'); - $classButton = 'class="sub upd"'; + $classButton = ['icon' => 'wand']; if (is_metaconsole() === true) { header('Location:'.$config['homeurl'].'index.php?sec=advanced&sec2=advanced/component_management&tab=os_manage&tab2='.$tab.'&message='.$message); } else { @@ -175,7 +175,7 @@ if ($is_management_allowed === true) { case 'new': $actionHidden = 'save'; $textButton = __('Create'); - $classButton = 'class="sub next"'; + $classButton = ['icon' => 'next']; break; } } @@ -184,11 +184,11 @@ $buttons = []; $buttons['list'] = [ 'active' => false, 'text' => ''.html_print_image( - 'images/list.png', + 'images/logs@svg.svg', true, [ 'title' => __('List OS'), - 'class' => 'invert_filter', + 'class' => 'invert_filter main_menu_icon', ] ).'', ]; @@ -196,11 +196,11 @@ if ($is_management_allowed === true) { $buttons['builder'] = [ 'active' => false, 'text' => ''.html_print_image( - 'images/builder.png', + 'images/edit.svg', true, [ 'title' => __('Builder OS'), - 'class' => 'invert_filter', + 'class' => 'invert_filter main_menu_icon', ] ).'', ]; diff --git a/pandora_console/images/HP@svg.svg b/pandora_console/images/HP@os.svg similarity index 100% rename from pandora_console/images/HP@svg.svg rename to pandora_console/images/HP@os.svg diff --git a/pandora_console/images/aix@svg.svg b/pandora_console/images/aix@os.svg similarity index 100% rename from pandora_console/images/aix@svg.svg rename to pandora_console/images/aix@os.svg diff --git a/pandora_console/images/android@svg.svg b/pandora_console/images/android@os.svg similarity index 100% rename from pandora_console/images/android@svg.svg rename to pandora_console/images/android@os.svg diff --git a/pandora_console/images/apple@svg.svg b/pandora_console/images/apple@os.svg similarity index 100% rename from pandora_console/images/apple@svg.svg rename to pandora_console/images/apple@os.svg diff --git a/pandora_console/images/cisco@svg.svg b/pandora_console/images/cisco@os.svg similarity index 100% rename from pandora_console/images/cisco@svg.svg rename to pandora_console/images/cisco@os.svg diff --git a/pandora_console/images/cluster@svg.svg b/pandora_console/images/cluster@os.svg similarity index 100% rename from pandora_console/images/cluster@svg.svg rename to pandora_console/images/cluster@os.svg diff --git a/pandora_console/images/embedded@svg.svg b/pandora_console/images/embedded@os.svg similarity index 100% rename from pandora_console/images/embedded@svg.svg rename to pandora_console/images/embedded@os.svg diff --git a/pandora_console/images/example_qr.png b/pandora_console/images/example_qr.png new file mode 100644 index 0000000000000000000000000000000000000000..e20000cb3c1a752d1acf5dc0c68596eaf7029f6e GIT binary patch literal 2275 zcmV<92pso`P)Px-ok>JNRCr$PooiO(N(_WyPs9Efz@oT^lQ7q`ZS_|bbuxkCZ`%EkN~Mzg;Pua+ zKOZj(|K8u<|IYsQ_IC41+xb2xtLCI@S95m#c6RV_|8&nc8}d5AYXI=_(&gl>Gsigt zfJwAcM27*WrP#P{3_wv^O|4KGU9Tf`Fmv>ca?e(!06M4Qp8%lG=ig?c&RP*L0l*@s zD$_na02JDFY0D8!3c4#NRBLzat9y>mbGsEnb=_$S2mmfnqmeuUGXS_+#En9QZokG> z`BZUGxAQtc6b1l@2mp?a^v|RK*FoE3QAU~JWwmah8e`li-B(wNzN-cZ050x!+t*Jo z0t0|w4gjTuI~(iv?YpSfjlx+<`uhDxr+@%p4ub$-Vxus?JdG%9cUKV@26!R{m~ZuX zgd+5|Gf-u$?29&Z+>(kmm%41?Hk2wm-}P>w%K+}d1Ax87M=%Be;)5!*5kbNk#!99O^BZq?Vp9a9k$H&t50%)m6ky{yEX@FGgIjL#P-}Kxa!j9VRXxwW6 zus2Hpa0{f0Yn6t}*)(B*Ugub?V8sdB?b4h%6Jpc^v=Kx*dUV}tzFDb9*+ZM0Iv2*3b+`8(!6pLiI%QA2G~{su1KTQq{R&z zOU^0DI~V0IsN@ z6zbA7o!^bLj``j6V5b0D4!P_wV+&>DWUNBH6&q2_LH0B&M_n=J1_HhtND-|VfgV)s3MXkdKZZ5xf+N#dx_B^UN0{{_C9f2S& z`FD5#;9BmWQ%3Xrk7t0hn?Wn`ry{)0M5h~pE6!7a!(HzNj2|+^48T?=P;q3H=PSh? z0QgW)z!v}rpKO`AgqF%Ki_O;m`aJ-6KuP$y~ryMgMyYZqrt}Os7PCFbmb`~ zH{H?5?l|l2c5nbtn?C@!+NUFLDXbC(*aLG31Dw4Xq$vGrV=i#c0HDlA8z%}dDP21N zrgI;SQ-t64`qP_10l+Qp;2)V*0IldNsz(BV$=ks$48j06YKNo%4SIG8SX~9sJiLP5 zs0q82zH?T}6tg~qlCr;PfB-=Iw{cZ&4FDz`I9Kqv^cDuVSO7l|LJj89b#7D(EuwuSx+< zD|j?erGC3pf|B28>Zr~${zm)puHJDf3HO|z*IAvw0AQ}J1Awaq!T@_H(56jCWi(?4 z{E;Y^=H0`(z&Sf`^y|LU zB0xV)3UIy>MjH}iJRU6?MK+8{b18IQ|8&bobypz&uN7 zN^0DW#Setg+EoFLV;IG$%Gj!L;~MwtI_I3TZf4h<0lSe$;j`;qo49PMq}p}{a1To6S-kRFznk^#WQ zQllLLfX3Iu!vK@8R;Vxxus0^PiIf7i4}?&fR1~#K(PxM4ssd&y=<9c7Jx80+eH_s@ zy|w}bZUj*cKtVJUR{_A@y$XZUzzYB-Vf5n}praG$*0~hXZtkOOw4$t~j7e#HHjds5 zDyx8sHmEUY8{PgM04Ua~#|8j5yyY7PH~^QD`;r2*lFhXjZL&#a;F$*KBd7mosz615 z>qg4f2t_Y+NGmh(6@7|7d*9!n9>F>ug0DU#g zWdN#9JEB$D;|j-8=AhM_Dwc z*DKNr-HR*ADtmRB_JQr8$wMlv^|+SM)q6P?Ymf?NC)U0RW(U*LkY}9RN&H zOjkW00Nn7HltQO&WzlgRO%DpFoM#xi+QKeq@uy;`pb7vkmb$l?3jjn~2m@RU76zDn zDKsenMAkj&PPuna>t9m8z~+N5@Su(%E_x>;V8s0d5`ZUKap7 zpbQKHT#W8&p}VF4H$ql)0;$0iwOyUBqe)byscL?@Hnqvvl^oBFUk#&x2mtn$Qh*r% z93YLNT`_bR;6MY=C|AbOyhWLVD({i{-0Q}(Qu?Mgx<`dj?d74*1X6HRB_W+7062z0 x0Pui!3aLP(EHY!eFu'.__('Filters').'', 'filter_form' ); diff --git a/pandora_console/pandoradb_data.sql b/pandora_console/pandoradb_data.sql index 7d13eb5379..bde4538077 100644 --- a/pandora_console/pandoradb_data.sql +++ b/pandora_console/pandoradb_data.sql @@ -155,26 +155,26 @@ UNLOCK TABLES; LOCK TABLES `tconfig_os` WRITE; INSERT INTO `tconfig_os` (`id_os`, `name`, `description`, `icon_name`, `previous_name`) VALUES -(1,'Linux','Linux: All versions','linux@svg.svg', ''), -(2,'Solaris','Sun Solaris','solaris@svg.svg', ''), -(3,'AIX','IBM AIX','aix@svg.svg', ''), -(4,'BSD','OpenBSD, FreeBSD and Others','freebsd@svg.svg', ''), -(5,'HP-UX','HP-UX Unix OS','HP@svg.svg', ''), -(7,'Cisco','CISCO IOS','cisco@svg.svg', ''), -(8,'MacOS','MAC OS','apple@svg.svg', ''), -(9,'Windows','Microsoft Windows OS','windows@svg.svg', ''), -(10,'Other','Other SO','other-OS@svg.svg', ''), -(11,'Network','Network Agent','network-server@svg.svg', ''), -(12,'Web Server','Web Server/Application','network-server@svg.svg', ''), -(13,'Sensor','Hardware Agent (Sensor)','network-server@svg.svg', ''), -(14,'Embedded','Embedded device running an agent','embedded@svg.svg', ''), -(15,'Android','Android agent','android@svg.svg', ''), -(16, 'VMware', 'VMware Architecture', 'vmware@svg.svg', ''), -(17, 'Router', 'Generic router', 'routers@svg.svg', ''), -(18, 'Switch', 'Generic switch', 'switch@svg.svg', ''), -(19, 'Satellite', 'Satellite agent', 'satellite@svg.svg', ''), -(20, 'Mainframe', 'Mainframe agent', 'mainframe@svg.svg', ''), -(100, 'Cluster', 'Cluster agent', 'cluster@svg.svg', ''); +(1,'Linux','Linux: All versions','linux@os.svg', ''), +(2,'Solaris','Sun Solaris','solaris@os.svg', ''), +(3,'AIX','IBM AIX','aix@os.svg', ''), +(4,'BSD','OpenBSD, FreeBSD and Others','freebsd@os.svg', ''), +(5,'HP-UX','HP-UX Unix OS','HP@os.svg', ''), +(7,'Cisco','CISCO IOS','cisco@os.svg', ''), +(8,'MacOS','MAC OS','apple@os.svg', ''), +(9,'Windows','Microsoft Windows OS','windows@os.svg', ''), +(10,'Other','Other SO','other-OS@os.svg', ''), +(11,'Network','Network Agent','network-server@os.svg', ''), +(12,'Web Server','Web Server/Application','network-server@os.svg', ''), +(13,'Sensor','Hardware Agent (Sensor)','network-server@os.svg', ''), +(14,'Embedded','Embedded device running an agent','embedded@os.svg', ''), +(15,'Android','Android agent','android@os.svg', ''), +(16, 'VMware', 'VMware Architecture', 'vmware@os.svg', ''), +(17, 'Router', 'Generic router', 'routers@os.svg', ''), +(18, 'Switch', 'Generic switch', 'switch@os.svg', ''), +(19, 'Satellite', 'Satellite agent', 'satellite@os.svg', ''), +(20, 'Mainframe', 'Mainframe agent', 'mainframe@os.svg', ''), +(100, 'Cluster', 'Cluster agent', 'cluster@os.svg', ''); UNLOCK TABLES; From f67bf4d084db8c2af4c343ec2d98af9009a75591 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Mon, 20 Feb 2023 13:10:00 +0100 Subject: [PATCH 301/563] #10416 added name agent in filter event --- pandora_console/operation/events/events.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pandora_console/operation/events/events.php b/pandora_console/operation/events/events.php index 6777ced4c3..7dffeeb9b6 100644 --- a/pandora_console/operation/events/events.php +++ b/pandora_console/operation/events/events.php @@ -239,6 +239,13 @@ $server_id = get_parameter( ($filter['server_id'] ?? '') ); +if (empty($id_agent) === true) { + $id_agent = get_parameter( + 'id_agent', + ($filter['id_agent'] ?? '') + ); +} + if (is_metaconsole() === true) { $servers = metaconsole_get_servers(); if (is_array($servers) === true) { From 4bbf750944b9d5e7960503dcaa9cddf73cdaaba8 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Mon, 20 Feb 2023 14:35:32 +0100 Subject: [PATCH 302/563] Monitor view meta fix --- .../operation/agentes/status_monitor.php | 37 +++++++++++++------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/pandora_console/operation/agentes/status_monitor.php b/pandora_console/operation/agentes/status_monitor.php index 839bd50846..cf8c322ee5 100644 --- a/pandora_console/operation/agentes/status_monitor.php +++ b/pandora_console/operation/agentes/status_monitor.php @@ -946,8 +946,9 @@ $tableFilter->data[4][0] = html_print_button( false, '', [ - 'icon' => 'wand', - 'mode' => 'mini secondary', + 'icon' => 'wand', + 'mode' => 'mini secondary', + 'class' => 'float-left margin-right-2 sub config', ], true ); @@ -959,8 +960,9 @@ $tableFilter->data[4][1] = html_print_button( false, '', [ - 'icon' => 'wand', - 'mode' => 'mini secondary', + 'icon' => 'wand', + 'mode' => 'mini secondary', + 'class' => 'float-left margin-right-2 sub wand', ], true ); @@ -1405,6 +1407,16 @@ if ($autosearch) { // Start Build List Result. if (empty($result) === false) { + if (is_metaconsole() === true) { + html_print_action_buttons( + html_print_div(['style' => 'float:left; height: 55px;', 'class' => 'mrgn_top_15px'], true), + [ + 'type' => 'form_action', + 'right_content' => $tablePagination, + ] + ); + } + $table = new StdClass(); $table->cellpadding = 0; $table->cellspacing = 0; @@ -2120,7 +2132,6 @@ if (empty($result) === false) { html_print_table($table); if ($count_modules > $config['block_size']) { - hd('patata'); $tablePagination = ui_pagination($count_modules, false, $offset, 0, true, 'offset', false); } } else { @@ -2131,13 +2142,15 @@ if (empty($result) === false) { } } -html_print_action_buttons( - html_print_div(['style' => 'float:left; height: 55px;'], true), - [ - 'type' => 'form_action', - 'right_content' => $tablePagination, - ] -); +if (is_metaconsole() !== true) { + html_print_action_buttons( + html_print_div(['style' => 'float:left; height: 55px;'], true), + [ + 'type' => 'form_action', + 'right_content' => $tablePagination, + ] + ); +} // End Build List Result. echo "
    "; From 8f212292468760af426adb978db2cfe23ac070b7 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Mon, 20 Feb 2023 14:50:17 +0100 Subject: [PATCH 303/563] Ticket 10467 Improve External Tools view --- .../include/class/ExternalTools.class.php | 38 ++++++++++--------- pandora_console/include/styles/pandora.css | 19 +++++++--- pandora_console/index.php | 6 +-- .../operation/agentes/external_tools.php | 2 +- 4 files changed, 38 insertions(+), 27 deletions(-) diff --git a/pandora_console/include/class/ExternalTools.class.php b/pandora_console/include/class/ExternalTools.class.php index 002642c5a9..67345a61f8 100644 --- a/pandora_console/include/class/ExternalTools.class.php +++ b/pandora_console/include/class/ExternalTools.class.php @@ -528,14 +528,16 @@ class ExternalTools extends HTML // Form table. $table = new StdClass(); - $table->class = 'databox filters w100p'; + $table->class = 'fixed_filter_bar'; $table->id = 'externalToolTable'; - + $table->cellstyle['captions'][0] = 'width: 0'; + $table->cellstyle['captions'][1] = 'width: 0'; + $table->cellstyle['captions'][2] = 'width: 0'; $table->data = []; - $table->data[0][0] = __('Operation'); + $table->data['captions'][0] = __('Operation'); - $table->data[0][1] = html_print_select( + $table->data['inputs'][0] = html_print_select( $commandList, 'operation', $this->operation, @@ -545,8 +547,8 @@ class ExternalTools extends HTML true ); - $table->data[0][2] = __('IP Adress'); - $table->data[0][3] = html_print_select( + $table->data['captions'][1] = __('IP Adress'); + $table->data['inputs'][1] = html_print_select( $ipsSelect, 'select_ips', $principal_ip, @@ -556,10 +558,10 @@ class ExternalTools extends HTML true ); - $table->cellclass[0][4] = 'snmpcolumn'; - $table->data[0][4] = __('SNMP Version'); - $table->data[0][4] .= ' '; - $table->data[0][4] .= html_print_select( + $table->cellclass['captions'][2] = 'snmpcolumn'; + $table->cellclass['inputs'][2] = 'snmpcolumn'; + $table->data['captions'][2] = __('SNMP Version'); + $table->data['inputs'][2] = html_print_select( [ '1' => 'v1', '2c' => 'v2c', @@ -572,10 +574,10 @@ class ExternalTools extends HTML true ); - $table->cellclass[0][5] = 'snmpcolumn'; - $table->data[0][5] = __('SNMP Community'); - $table->data[0][5] .= ' '; - $table->data[0][5] .= html_print_input_text( + $table->cellclass['captions'][3] = 'snmpcolumn'; + $table->cellclass['inputs'][3] = 'snmpcolumn'; + $table->data['captions'][3] = __('SNMP Community'); + $table->data['inputs'][3] = html_print_input_text( 'community', $this->community, '', @@ -584,7 +586,7 @@ class ExternalTools extends HTML true ); - $table->data[0][6] = html_print_div( + $table->data['inputs'][4] = html_print_div( [ 'class' => 'action-buttons', 'content' => html_print_submit_button( @@ -719,7 +721,7 @@ class ExternalTools extends HTML try { // If caption is not added, don't show anything. if (empty($caption) === false) { - $output .= sprintf('

    %s

    ', $caption); + $output .= sprintf('

    %s

    ', $caption); } $output .= '
    ';
    @@ -787,7 +789,7 @@ class ExternalTools extends HTML
                         'format'         => '-Oqn',
                     ];
     
    -                echo '

    '.__('SNMP information for ').$ip.'

    '; + echo '

    '.__('SNMP information for ').$ip.'

    '; $snmp_obj['base_oid'] = '.1.3.6.1.2.1.1.3.0'; $result = get_h_snmpwalk($snmp_obj); @@ -849,7 +851,7 @@ class ExternalTools extends HTML html_print_table($table); } else if ((int) $operation === COMMAND_DIGWHOIS) { - echo '

    '.__('Domain and IP information for ').$ip.'

    '; + echo '

    '.__('Domain and IP information for ').$ip.'

    '; // Dig execution. $dig = $this->whereIsTheCommand('dig'); diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 2745ca7f00..9a5bd7af27 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -153,7 +153,7 @@ html { } body { - background-color: #fbfbfb; + background-color: #f6f7fb; margin: 0 auto; display: flex; flex-direction: column; @@ -1080,14 +1080,14 @@ div#page { } body.pure { - background-color: #fbfbfb; + background-color: #f6f7fb; } div#container { margin: 0 auto; min-width: 960px; text-align: left; - background: #fbfbfb; + background: #f6f7fb; width: 100%; } @@ -1096,7 +1096,7 @@ div#main { /* width: 100%; */ /* margin-left: 3em; */ background-color: #f6f7fb; - margin-bottom: 3em; + padding-bottom: 3em; position: relative; /* margin-top: 8.8em; */ flex-direction: column; @@ -10818,18 +10818,23 @@ tr.bring_next_field { left: -95px !important; } +.external_tools_title { + padding: 0 10px; +} pre.external_tools_output { + padding: 0 10px; + /* border: 1px solid #e5e9ed; -moz-box-shadow: 0 3px 6px 0 rgb(0 0 0 / 13%); -webkit-box-shadow: 0 3px 6px 0 rgb(0 0 0 / 13%); box-shadow: 0 3px 6px 0 rgb(0 0 0 / 13%); border-radius: 8px; color: #cacaca; - padding: 10px; background-color: #000; background-image: radial-gradient(rgba(0, 150, 0, 0.75), #000 120%); font-size: 11pt; text-shadow: 0 0 5px #000; + */ } .dialog_table_form td:first-child { @@ -10919,6 +10924,10 @@ table.table_modal_alternate .select2-selection__arrow { top: -4px !important; } +.fixed_filter_bar .select2-selection__arrow b, +.filter_table .select2-selection__arrow b { + margin-top: 11px !important; +} .filter_table .select2-container .select2-selection--single diff --git a/pandora_console/index.php b/pandora_console/index.php index 39956244a9..5bf027ec61 100755 --- a/pandora_console/index.php +++ b/pandora_console/index.php @@ -1456,10 +1456,10 @@ if (__PAN_XHPROF__ === 1) { } if ($config['pure'] == 0) { - echo '
    '; + // echo '
    '; echo ''; // Main. - echo '
     
    '; + // echo '
     
    '; echo ''; // Page (id = page). } else { @@ -1488,7 +1488,7 @@ if ($config['pure'] == 0) { echo ''; // Container div. echo ''; - echo '
    '; + // echo '
    '; echo ''; } diff --git a/pandora_console/operation/agentes/external_tools.php b/pandora_console/operation/agentes/external_tools.php index 1d57c06f81..eb2fbd835b 100644 --- a/pandora_console/operation/agentes/external_tools.php +++ b/pandora_console/operation/agentes/external_tools.php @@ -14,7 +14,7 @@ * |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______| * * ============================================================================ - * Copyright (c) 2005-2021 Artica Soluciones Tecnologicas + * Copyright (c) 2005-2023 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 From 49fc725cdcc7f6e0b6c0ce9d4057d1afdbaeb7aa Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Mon, 20 Feb 2023 15:16:27 +0100 Subject: [PATCH 304/563] Cog animations --- pandora_console/include/styles/pandora.css | 13 +++++++++++++ pandora_console/index.php | 7 +++++++ 2 files changed, 20 insertions(+) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 9a5bd7af27..58a8cc6653 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -10361,6 +10361,19 @@ button div.fail { -webkit-mask: url(../../images/fail@svg.svg) no-repeat center / contain; } +button div.cog.rotation { + animation: rotation 4s infinite linear; +} + +@keyframes rotation { + from { + transform: rotate(0deg); + } + + to { + transform: rotate(359deg); + } +} .ui-dialog-buttonset { width: 100%; display: flex; diff --git a/pandora_console/index.php b/pandora_console/index.php index 5bf027ec61..4e69b273bc 100755 --- a/pandora_console/index.php +++ b/pandora_console/index.php @@ -1670,4 +1670,11 @@ require 'include/php_to_js_values.php'; } ); }); + + // Cog animations. + $(document).ready(function() { + $(".submitButton").click(function(){ + $("#"+this.id+" > .subIcon.cog").addClass("rotation"); + }); + }); From fc68e6ead103d39210c0774af70a216bef1f703e Mon Sep 17 00:00:00 2001 From: Jonathan Date: Mon, 20 Feb 2023 15:58:41 +0100 Subject: [PATCH 305/563] Monitor view meta fix status --- .../operation/agentes/status_monitor.php | 41 ++++++++++--------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/pandora_console/operation/agentes/status_monitor.php b/pandora_console/operation/agentes/status_monitor.php index cf8c322ee5..e2db157682 100644 --- a/pandora_console/operation/agentes/status_monitor.php +++ b/pandora_console/operation/agentes/status_monitor.php @@ -1674,25 +1674,24 @@ if (empty($result) === false) { } if (in_array('status', $show_fields) || is_metaconsole()) { - hd($row['utimestamp'], true); - hd($row['module_type'], true); + $data[6] = '
    '; if ($row['utimestamp'] === 0 && (($row['module_type'] < 21 || $row['module_type'] > 23) && $row['module_type'] != 100) ) { - $data[6] = ui_print_status_image( + $data[6] .= ui_print_status_image( STATUS_MODULE_NO_DATA, __('NOT INIT'), true ); } else if ($row['estado'] == 0) { if (is_numeric($row['datos'])) { - $data[6] = ui_print_status_image( + $data[6] .= ui_print_status_image( STATUS_MODULE_OK, __('NORMAL').': '.remove_right_zeros(number_format($row['datos'], $config['graph_precision'], $config['decimal_separator'], $config['thousand_separator'])), true ); } else { - $data[6] = ui_print_status_image( + $data[6] .= ui_print_status_image( STATUS_MODULE_OK, __('NORMAL').': '.htmlspecialchars($row['datos']), true @@ -1700,7 +1699,7 @@ if (empty($result) === false) { } } else if ($row['estado'] == 1) { if (is_numeric($row['datos'])) { - $data[6] = ui_print_status_image( + $data[6] .= ui_print_status_image( STATUS_MODULE_CRITICAL, __('CRITICAL').': '.remove_right_zeros( number_format( @@ -1713,7 +1712,7 @@ if (empty($result) === false) { true ); } else { - $data[6] = ui_print_status_image( + $data[6] .= ui_print_status_image( STATUS_MODULE_CRITICAL, __('CRITICAL').': '.htmlspecialchars($row['datos']), true @@ -1721,7 +1720,7 @@ if (empty($result) === false) { } } else if ($row['estado'] == 2) { if (is_numeric($row['datos'])) { - $data[6] = ui_print_status_image( + $data[6] .= ui_print_status_image( STATUS_MODULE_WARNING, __('WARNING').': '.remove_right_zeros( number_format( @@ -1734,7 +1733,7 @@ if (empty($result) === false) { true ); } else { - $data[6] = ui_print_status_image( + $data[6] .= ui_print_status_image( STATUS_MODULE_WARNING, __('WARNING').': '.htmlspecialchars($row['datos']), true @@ -1742,7 +1741,7 @@ if (empty($result) === false) { } } else if ($row['estado'] == 3) { if (is_numeric($row['datos'])) { - $data[6] = ui_print_status_image( + $data[6] .= ui_print_status_image( STATUS_MODULE_UNKNOWN, __('UNKNOWN').': '.remove_right_zeros( number_format( @@ -1755,7 +1754,7 @@ if (empty($result) === false) { true ); } else { - $data[6] = ui_print_status_image( + $data[6] .= ui_print_status_image( STATUS_MODULE_UNKNOWN, __('UNKNOWN').': '.htmlspecialchars($row['datos']), true @@ -1763,7 +1762,7 @@ if (empty($result) === false) { } } else if ($row['estado'] == 4) { if (is_numeric($row['datos'])) { - $data[6] = ui_print_status_image( + $data[6] .= ui_print_status_image( STATUS_MODULE_NO_DATA, __('NO DATA').': '.remove_right_zeros( number_format( @@ -1776,7 +1775,7 @@ if (empty($result) === false) { true ); } else { - $data[6] = ui_print_status_image( + $data[6] .= ui_print_status_image( STATUS_MODULE_NO_DATA, __('NO DATA').': '.htmlspecialchars($row['datos']), true @@ -1786,17 +1785,17 @@ if (empty($result) === false) { $last_status = modules_get_agentmodule_last_status( $row['id_agente_modulo'] ); - hd('pues por aqui tambien', true); + switch ($last_status) { case 0: if (is_numeric($row['datos'])) { - $data[6] = ui_print_status_image( + $data[6] .= ui_print_status_image( STATUS_MODULE_UNKNOWN, __('UNKNOWN').' - '.__('Last status').' '.__('NORMAL').': '.remove_right_zeros(number_format($row['datos'], $config['graph_precision'], $config['decimal_separator'], $config['thousand_separator'])), true ); } else { - $data[6] = ui_print_status_image( + $data[6] .= ui_print_status_image( STATUS_MODULE_UNKNOWN, __('UNKNOWN').' - '.__('Last status').' '.__('NORMAL').': '.htmlspecialchars($row['datos']), true @@ -1806,13 +1805,13 @@ if (empty($result) === false) { case 1: if (is_numeric($row['datos'])) { - $data[6] = ui_print_status_image( + $data[6] .= ui_print_status_image( STATUS_MODULE_UNKNOWN, __('UNKNOWN').' - '.__('Last status').' '.__('CRITICAL').': '.remove_right_zeros(number_format($row['datos'], $config['graph_precision'], $config['decimal_separator'], $config['thousand_separator'])), true ); } else { - $data[6] = ui_print_status_image( + $data[6] .= ui_print_status_image( STATUS_MODULE_UNKNOWN, __('UNKNOWN').' - '.__('Last status').' '.__('CRITICAL').': '.htmlspecialchars($row['datos']), true @@ -1822,13 +1821,13 @@ if (empty($result) === false) { case 2: if (is_numeric($row['datos'])) { - $data[6] = ui_print_status_image( + $data[6] .= ui_print_status_image( STATUS_MODULE_UNKNOWN, __('UNKNOWN').' - '.__('Last status').' '.__('WARNING').': '.remove_right_zeros(number_format($row['datos'], $config['graph_precision'], $config['decimal_separator'], $config['thousand_separator'])), true ); } else { - $data[6] = ui_print_status_image( + $data[6] .= ui_print_status_image( STATUS_MODULE_UNKNOWN, __('UNKNOWN').' - '.__('Last status').' '.__('WARNING').': '.htmlspecialchars($row['datos']), true @@ -1837,6 +1836,8 @@ if (empty($result) === false) { break; } } + + $data[6] .= '
    '; } if (in_array('last_status_change', $show_fields) || is_metaconsole()) { From c6e32e278be4447a8f22c953ec796bcbab24bfb4 Mon Sep 17 00:00:00 2001 From: Daniel Maya Date: Mon, 20 Feb 2023 16:41:54 +0100 Subject: [PATCH 306/563] #9662 fixed favourites --- pandora_console/general/main_menu.php | 2 +- pandora_console/include/functions_menu.php | 25 ++++++++++++++ pandora_console/include/styles/pandora.css | 2 +- pandora_console/operation/menu.php | 39 ++++++++++++++++------ 4 files changed, 56 insertions(+), 12 deletions(-) diff --git a/pandora_console/general/main_menu.php b/pandora_console/general/main_menu.php index af93f5f0b7..efa2fc5c96 100644 --- a/pandora_console/general/main_menu.php +++ b/pandora_console/general/main_menu.php @@ -444,7 +444,7 @@ echo ''; */ function menu_calculate_top(index, item_height) { const result = index * item_height; - return 140 + result; + return 136 + result; } }); diff --git a/pandora_console/include/functions_menu.php b/pandora_console/include/functions_menu.php index b9774ae800..af3071809d 100644 --- a/pandora_console/include/functions_menu.php +++ b/pandora_console/include/functions_menu.php @@ -79,6 +79,31 @@ function menu_print_menu(&$menu) } 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 { $sec2 = (string) get_parameter('sec2'); } diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 58a8cc6653..ec8b02fff0 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -9886,7 +9886,7 @@ div#err_msg_centralised { .inputFile { background-color: #f6f7fb; - height: 28px; + height: 16px; font: normal normal normal 13px Pandora-Light; padding: 5.5pt 20pt; cursor: pointer; diff --git a/pandora_console/operation/menu.php b/pandora_console/operation/menu.php index 4531432d6e..b89ca1d8f5 100644 --- a/pandora_console/operation/menu.php +++ b/pandora_console/operation/menu.php @@ -307,14 +307,21 @@ if ($access_console_node === true) { if (check_acl($config['id_user'], 0, 'VR') || check_acl($config['id_user'], 0, 'VW') || check_acl($config['id_user'], 0, 'VM')) { + $url_visual_console = ''; if (!isset($config['vc_favourite_view']) || $config['vc_favourite_view'] == 0) { // Visual console. $sub['godmode/reporting/map_builder']['text'] = __('Visual console'); $sub['godmode/reporting/map_builder']['id'] = 'Visual_console'; + $sub['godmode/reporting/map_builder']['type'] = 'direct'; + $sub['godmode/reporting/map_builder']['subtype'] = 'nolink'; + $url_visual_console = 'godmode/reporting/map_builder'; } else { // Visual console favorite. $sub['godmode/reporting/visual_console_favorite']['text'] = __('Visual console'); $sub['godmode/reporting/visual_console_favorite']['id'] = 'Visual_console'; + $sub['godmode/reporting/visual_console_favorite']['type'] = 'direct'; + $sub['godmode/reporting/visual_console_favorite']['subtype'] = 'nolink'; + $url_visual_console = 'godmode/reporting/visual_console_favorite'; } if ($config['vc_menu_items'] != 0) { @@ -341,6 +348,12 @@ if ($access_console_node === true) { $layouts = visual_map_get_user_layouts($config['id_user'], false, false, $returnAllGroups, true); $sub2 = []; + $sub2[$url_visual_console] = [ + 'text' => __('Visual console list'), + 'title' => __('Visual console list'), + 'refr' => 0, + ]; + if ($layouts === false) { $layouts = []; } else { @@ -364,15 +377,15 @@ if ($access_console_node === true) { $name = io_safe_output($layout['name']); - $sub2['operation/visual_console/render_view&id='.$layout['id']]['text'] = ui_print_truncate_text($name, MENU_SIZE_TEXT, false, true, false); - $sub2['operation/visual_console/render_view&id='.$layout['id']]['id'] = mb_substr($name, 0, 19); - $sub2['operation/visual_console/render_view&id='.$layout['id']]['title'] = $name; + $sub2['operation/visual_console/render_view&id='.$layout['id']]['text'] = ui_print_truncate_text($name, MENU_SIZE_TEXT, false, true, false); + $sub2['operation/visual_console/render_view&id='.$layout['id']]['id'] = mb_substr($name, 0, 19); + $sub2['operation/visual_console/render_view&id='.$layout['id']]['title'] = $name; if (!empty($config['vc_refr'])) { - $sub2['operation/visual_console/render_view&id='.$layout['id']]['refr'] = $config['vc_refr']; + $sub2['operation/visual_console/render_view&id='.$layout['id']]['refr'] = $config['vc_refr']; } else if (((int) get_parameter('refr', 0)) > 0) { - $sub2['operation/visual_console/render_view&id='.$layout['id']]['refr'] = (int) get_parameter('refr', 0); + $sub2['operation/visual_console/render_view&id='.$layout['id']]['refr'] = (int) get_parameter('refr', 0); } else { - $sub2['operation/visual_console/render_view&id='.$layout['id']]['refr'] = 0; + $sub2['operation/visual_console/render_view&id='.$layout['id']]['refr'] = 0; } } @@ -424,10 +437,10 @@ if ($access_console_node === true) { continue; } - $sub2['operation/gis_maps/render_view&map_id='.$gisMap['id_tgis_map']]['text'] = ui_print_truncate_text(io_safe_output($gisMap['map_name']), MENU_SIZE_TEXT, false, true, false); - $sub2['operation/gis_maps/render_view&map_id='.$gisMap['id_tgis_map']]['id'] = mb_substr(io_safe_output($gisMap['map_name']), 0, 15); - $sub2['operation/gis_maps/render_view&map_id='.$gisMap['id_tgis_map']]['title'] = io_safe_output($gisMap['map_name']); - $sub2['operation/gis_maps/render_view&map_id='.$gisMap['id_tgis_map']]['refr'] = 0; + $sub2['operation/gis_maps/render_view&map_id='.$gisMap['id_tgis_map']]['text'] = ui_print_truncate_text(io_safe_output($gisMap['map_name']), MENU_SIZE_TEXT, false, true, false); + $sub2['operation/gis_maps/render_view&map_id='.$gisMap['id_tgis_map']]['id'] = mb_substr(io_safe_output($gisMap['map_name']), 0, 15); + $sub2['operation/gis_maps/render_view&map_id='.$gisMap['id_tgis_map']]['title'] = io_safe_output($gisMap['map_name']); + $sub2['operation/gis_maps/render_view&map_id='.$gisMap['id_tgis_map']]['refr'] = 0; } $sub['gismaps']['sub2'] = $sub2; @@ -480,10 +493,16 @@ if ($access_console_node === true) { $sub['operation/dashboard/dashboard']['id'] = 'Dashboard'; $sub['operation/dashboard/dashboard']['refr'] = 0; $sub['operation/dashboard/dashboard']['subsecs'] = ['operation/dashboard/dashboard']; + $sub['operation/dashboard/dashboard']['type'] = 'direct'; + $sub['operation/dashboard/dashboard']['subtype'] = 'nolink'; $dashboards = Manager::getDashboards(-1, -1, true); $sub2 = []; + $sub2['operation/dashboard/dashboard'] = [ + 'text' => __('Dashboard list'), + 'title' => __('Dashboard list'), + ]; foreach ($dashboards as $dashboard) { $name = io_safe_output($dashboard['name']); From a615d2d98f490ae1ba6c7686173b6266d9d8a5f8 Mon Sep 17 00:00:00 2001 From: Daniel Maya Date: Mon, 20 Feb 2023 17:08:36 +0100 Subject: [PATCH 307/563] #9662 minor fixed --- pandora_console/general/main_menu.php | 2 +- pandora_console/include/functions_menu.php | 5 +++++ pandora_console/operation/menu.php | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/pandora_console/general/main_menu.php b/pandora_console/general/main_menu.php index efa2fc5c96..72fa391aa7 100644 --- a/pandora_console/general/main_menu.php +++ b/pandora_console/general/main_menu.php @@ -444,7 +444,7 @@ echo ''; */ function menu_calculate_top(index, item_height) { const result = index * item_height; - return 136 + result; + return 133 + result; } }); diff --git a/pandora_console/include/functions_menu.php b/pandora_console/include/functions_menu.php index af3071809d..d0baa614c8 100644 --- a/pandora_console/include/functions_menu.php +++ b/pandora_console/include/functions_menu.php @@ -104,6 +104,11 @@ function menu_print_menu(&$menu) 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'); } diff --git a/pandora_console/operation/menu.php b/pandora_console/operation/menu.php index b89ca1d8f5..cb9ce7321a 100644 --- a/pandora_console/operation/menu.php +++ b/pandora_console/operation/menu.php @@ -656,7 +656,7 @@ if ($access_console_node === true) { $sub['message_list']['subtype'] = 'nolink'; $sub2 = []; $sub2['operation/messages/message_list']['text'] = __('Messages List'); - $sub2['operation/messages/message_edit&new_msg=1']['text'] = __('New message'); + $sub2['operation/messages/message_edit&new_msg=1']['text'] = __('New message'); $sub['message_list']['sub2'] = $sub2; } From 91393d7ce530e8a71538965ad79fe1df3bfd96d0 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Mon, 20 Feb 2023 17:22:42 +0100 Subject: [PATCH 308/563] Ticket 10431 Header icons added --- pandora_console/general/header.php | 64 ++++++++++-------- pandora_console/images/Header icons v1.zip | Bin 0 -> 38450 bytes .../images/Header icons v1/Auto refresh.png | Bin 0 -> 825 bytes .../Header icons v1/Auto refresh@2x.png | Bin 0 -> 1838 bytes .../images/Header icons v1/Documentation.png | Bin 0 -> 466 bytes .../Header icons v1/Documentation@2x.png | Bin 0 -> 851 bytes .../images/Header icons v1/Edit User.png | Bin 0 -> 826 bytes .../images/Header icons v1/Edit User@2x.png | Bin 0 -> 1795 bytes .../Header discovery error.png | Bin 0 -> 544 bytes .../Header discovery error@2x.png | Bin 0 -> 1019 bytes .../Header icons v1/Header discovery ok.png | Bin 0 -> 558 bytes .../Header discovery ok@2x.png | Bin 0 -> 1022 bytes .../Header discovery warning.png | Bin 0 -> 524 bytes .../Header discovery warning@2x.png | Bin 0 -> 1006 bytes .../images/Header icons v1/Send feedbacks.png | Bin 0 -> 645 bytes .../Header icons v1/Send feedbacks@2x.png | Bin 0 -> 1310 bytes .../images/Header icons v1/Sign out.png | Bin 0 -> 646 bytes .../images/Header icons v1/Sign out@2x.png | Bin 0 -> 1202 bytes .../images/Header icons v1/Support.png | Bin 0 -> 869 bytes .../images/Header icons v1/Support@2x.png | Bin 0 -> 1920 bytes .../images/Header icons v1/Systems error.png | Bin 0 -> 521 bytes .../Header icons v1/Systems error@2x.png | Bin 0 -> 945 bytes .../images/Header icons v1/Systems ok.png | Bin 0 -> 543 bytes .../images/Header icons v1/Systems ok@2x.png | Bin 0 -> 982 bytes .../Header icons v1/Systems warning.png | Bin 0 -> 492 bytes .../Header icons v1/Systems warning@2x.png | Bin 0 -> 918 bytes .../images/auto_refresh@header.svg | 11 +++ .../images/discovery_error@header.svg | 9 +++ .../images/discovery_ok@header.svg | 9 +++ .../images/discovery_warning@header.svg | 9 +++ .../images/documentation@header.svg | 9 +++ pandora_console/images/edit_user@header.svg | 9 +++ .../images/send_feedback@header.svg | 9 +++ pandora_console/images/sign_out@header.svg | 9 +++ pandora_console/images/support@header.svg | 9 +++ .../images/system_error@header.svg | 9 +++ pandora_console/images/system_ok@header.svg | 9 +++ .../images/system_warning@header.svg | 9 +++ pandora_console/include/styles/pandora.css | 19 +++--- 39 files changed, 157 insertions(+), 36 deletions(-) create mode 100644 pandora_console/images/Header icons v1.zip create mode 100644 pandora_console/images/Header icons v1/Auto refresh.png create mode 100644 pandora_console/images/Header icons v1/Auto refresh@2x.png create mode 100644 pandora_console/images/Header icons v1/Documentation.png create mode 100644 pandora_console/images/Header icons v1/Documentation@2x.png create mode 100644 pandora_console/images/Header icons v1/Edit User.png create mode 100644 pandora_console/images/Header icons v1/Edit User@2x.png create mode 100644 pandora_console/images/Header icons v1/Header discovery error.png create mode 100644 pandora_console/images/Header icons v1/Header discovery error@2x.png create mode 100644 pandora_console/images/Header icons v1/Header discovery ok.png create mode 100644 pandora_console/images/Header icons v1/Header discovery ok@2x.png create mode 100644 pandora_console/images/Header icons v1/Header discovery warning.png create mode 100644 pandora_console/images/Header icons v1/Header discovery warning@2x.png create mode 100644 pandora_console/images/Header icons v1/Send feedbacks.png create mode 100644 pandora_console/images/Header icons v1/Send feedbacks@2x.png create mode 100644 pandora_console/images/Header icons v1/Sign out.png create mode 100644 pandora_console/images/Header icons v1/Sign out@2x.png create mode 100644 pandora_console/images/Header icons v1/Support.png create mode 100644 pandora_console/images/Header icons v1/Support@2x.png create mode 100644 pandora_console/images/Header icons v1/Systems error.png create mode 100644 pandora_console/images/Header icons v1/Systems error@2x.png create mode 100644 pandora_console/images/Header icons v1/Systems ok.png create mode 100644 pandora_console/images/Header icons v1/Systems ok@2x.png create mode 100644 pandora_console/images/Header icons v1/Systems warning.png create mode 100644 pandora_console/images/Header icons v1/Systems warning@2x.png create mode 100644 pandora_console/images/auto_refresh@header.svg create mode 100644 pandora_console/images/discovery_error@header.svg create mode 100644 pandora_console/images/discovery_ok@header.svg create mode 100644 pandora_console/images/discovery_warning@header.svg create mode 100644 pandora_console/images/documentation@header.svg create mode 100644 pandora_console/images/edit_user@header.svg create mode 100644 pandora_console/images/send_feedback@header.svg create mode 100644 pandora_console/images/sign_out@header.svg create mode 100644 pandora_console/images/support@header.svg create mode 100644 pandora_console/images/system_error@header.svg create mode 100644 pandora_console/images/system_ok@header.svg create mode 100644 pandora_console/images/system_warning@header.svg diff --git a/pandora_console/general/header.php b/pandora_console/general/header.php index fc666af8b0..d82f1a0be2 100644 --- a/pandora_console/general/header.php +++ b/pandora_console/general/header.php @@ -26,7 +26,7 @@ config_check(); echo sprintf('
    ', $menuTypeClass); ?> -
    +
    ', $menuTypeClass); // ======= Servers List =============================================== if ((bool) check_acl($config['id_user'], 0, 'AW') !== false) { - $servers_list = '
    '; $servers = []; $servers['all'] = (int) db_get_value('COUNT(id_server)', 'tserver'); if ($servers['all'] != 0) { @@ -45,22 +44,33 @@ echo sprintf('
    ', $menuTypeClass); $servers['down'] = ($servers['all'] - $servers['up']); if ($servers['up'] == 0) { // All Servers down or no servers at all. - $servers_check_img = html_print_image('images/header_down_gray.png', true, ['alt' => 'cross', 'class' => 'bot', 'title' => __('All systems').': '.__('Down')]); + $servers_check_img = html_print_image('images/system_error@header.svg', true, ['alt' => 'cross', 'class' => 'main_menu_icon bot', 'title' => __('All systems').': '.__('Down')]); } else if ($servers['down'] != 0) { // Some servers down. - $servers_check_img = html_print_image('images/header_warning_gray.png', true, ['alt' => 'error', 'class' => 'bot', 'title' => $servers['down'].' '.__('servers down')]); + $servers_check_img = html_print_image('images/system_warning@header.svg', true, ['alt' => 'error', 'class' => 'main_menu_icon bot', 'title' => $servers['down'].' '.__('servers down')]); } else { // All servers up. - $servers_check_img = html_print_image('images/header_ready_gray.png', true, ['alt' => 'ok', 'class' => 'bot', 'title' => __('All systems').': '.__('Ready')]); + $servers_check_img = html_print_image('images/system_ok@header.svg', true, ['alt' => 'ok', 'class' => 'main_menu_icon bot', 'title' => __('All systems').': '.__('Ready')]); } unset($servers); // Since this is the header, we don't like to trickle down variables. - $servers_check_img_link = ''; - $servers_check_img_link .= $servers_check_img; - $servers_check_img_link .= ''; + $servers_check_img_link = html_print_anchor( + [ + 'href' => 'index.php?sec=gservers&sec2=godmode/servers/modificar_server&refr=60', + 'content' => $servers_check_img, + ], + true + ); }; - $servers_list .= $servers_check_img_link.'
    '; + + $servers_list = html_print_div( + [ + 'id' => 'servers_list', + 'content' => $servers_check_img_link, + ], + true + ); } @@ -71,9 +81,9 @@ echo sprintf('
    ', $menuTypeClass); $check_minor_release_available = db_check_minor_relase_available(); - if ($check_minor_release_available) { + if ($check_minor_release_available === true) { if (users_is_admin($config['id_user'])) { - if ($config['language'] == 'es') { + if ($config['language'] === 'es') { set_pandora_error_for_header('Hay una o mas revisiones menores en espera para ser actualizadas. '.__('Sobre actualización de revisión menor').'', 'Revisión/es menor/es disponible/s'); } else { set_pandora_error_for_header('There are one or more minor releases waiting for update. '.__('About minor release update').'', 'minor release/s available'); @@ -227,10 +237,10 @@ echo sprintf('
    ', $menuTypeClass); if ($do_refresh) { $autorefresh_img = html_print_image( - 'images/header_refresh_gray.png', + 'images/auto_refresh@header.svg', true, [ - 'class' => 'bot', + 'class' => 'main_menu_icon bot', 'alt' => 'lightning', 'title' => __('Configure autorefresh'), ] @@ -293,10 +303,10 @@ echo sprintf('
    ', $menuTypeClass); $display_counter = 'display:block'; } else { $autorefresh_img = html_print_image( - 'images/header_refresh_disabled_gray.png', + 'images/auto_refresh@header.svg', true, [ - 'class' => 'bot autorefresh_disabled invert_filter', + 'class' => 'main_menu_icon bot autorefresh_disabled invert_filter', 'alt' => 'lightning', 'title' => __('Disabled autorefresh'), ] @@ -312,10 +322,10 @@ echo sprintf('
    ', $menuTypeClass); } } else { $autorefresh_img = html_print_image( - 'images/header_refresh_disabled_gray.png', + 'images/auto_refresh@header.svg', true, [ - 'class' => 'bot autorefresh_disabled invert_filter', + 'class' => 'main_menu_icon bot autorefresh_disabled invert_filter', 'alt' => 'lightning', 'title' => __('Disabled autorefresh'), ] @@ -350,9 +360,10 @@ echo sprintf('
    ', $menuTypeClass); $header_feedback .= ''; $header_feedback .= ''; $header_feedback .= html_print_image( - 'images/feedback-header.png', + 'images/send_feedback@header.svg', true, [ + 'class' => 'main_menu_icon', 'title' => __('Feedback'), 'id' => 'feedback-header', 'alt' => __('Feedback'), @@ -373,11 +384,11 @@ echo sprintf('
    ', $menuTypeClass); $header_support = '
    '; $header_support .= ''; $header_support .= html_print_image( - 'images/header_support.png', + 'images/support@header.svg', true, [ 'title' => __('Go to support'), - 'class' => 'bot invert_filter', + 'class' => 'main_menu_icon bot invert_filter', 'alt' => 'user', ] ); @@ -387,11 +398,11 @@ echo sprintf('
    ', $menuTypeClass); $header_docu = '
    '; $header_docu .= ''; $header_docu .= html_print_image( - 'images/header_docu.png', + 'images/documentation@header.svg', true, [ 'title' => __('Go to documentation'), - 'class' => 'bot invert_filter', + 'class' => 'main_menu_icon bot invert_filter', 'alt' => 'user', ] ); @@ -399,15 +410,14 @@ echo sprintf('
    ', $menuTypeClass); // User. - $headerUserImage = (is_user_admin($config['id_user']) === true) ? 'images/header_user_admin_green.png' : 'images/header_user_green.png'; - + // $headerUserImage = (is_user_admin($config['id_user']) === true) ? 'images/header_user_admin_green.png' : 'images/header_user_green.png'; $headerUser = []; $headerUser[] = html_print_image( - $headerUserImage, + 'images/edit_user@header.svg', true, [ 'title' => __('Edit my user'), - 'class' => 'bot', + 'class' => 'main_menu_icon bot', 'alt' => 'user', ] ); @@ -431,7 +441,7 @@ echo sprintf('
    ', $menuTypeClass); // Logout. $header_logout = '
    '; $header_logout .= html_print_image( - 'images/header_logout_gray.png', + 'images/sign_out@header.svg', true, [ 'alt' => __('Logout'), diff --git a/pandora_console/images/Header icons v1.zip b/pandora_console/images/Header icons v1.zip new file mode 100644 index 0000000000000000000000000000000000000000..22a9a12dfa2c2155b0f7aad869015fb753617c08 GIT binary patch literal 38450 zcmc$_18}9`wk;alHafO#c5K_WZ6_VuwrzE6Tb*=lJ9+7|&%5W`efrefRj=;3EA`h} ze^T|=s>&F1jxpx^Q~>_{MFI$5ixUP}a8Z}57{wSdM^iY{?$@`QINzi@ML;)K4vsAm1t}=g`DKX<*kVLeQQQ?T#&I;>2uTf!n1-+;fJu2>tCLWw2 zY1lyc7L&}^=_W!Un9i2@xvHBFNrVny{H0xWwf277{_lrRw8u~L*JRdJl6 zSa^0QSWDN8lR=o^YcsH?k7*1_QXKj}8b}$Z4_&Gu%SH|3;}@ zqL!{g#Tus{@Mo$jawq<12I{|gZVIYwP%*<;8l_GIPQ!mw`@b*Pz&9Z43Qh_ z5>zW1$_)w%yID}PMW<+3qKfI_FWlKO0FvL24X|_^%#3zLN<;m*l-T5u2L>CCqxP-s zSGABQET%k>UA`=lNDW~u2d>J=!32E2Y;6vt#8fTWd7DUU3L4zElcsnr5omDhFqCY` zn)xueHPs0S_!iYu1do7a2rB)?NKGTTL9Ad+)K?cu)CVHYbSIH(o1WCSoOL?U&&>@V zh8JJ!o>Z-L7oD&VfniB>?t}}i52$q)MbuFKeYY*%iq|KS3S*?0MZ2g3pl$c-s>T;^ zIZ1Gc{8;AqP#^$+KTwwYE6D3X007|sGsqd;XzgtNKQRti4k9yUQ3n9)>jD4($_4sgzah^B{*TXp{-{nXoc#4j5^-SxB{j%FH6AGx0Th$R+Kvc? z!a4r4b9nL}3;~2l=9Se6a8yuGR21jcj0_lwxy0!+*YoQc9RmS=E=p#2gM%_CSRYoGSXU@Y;BD|s%Fg^S0y9CqQn{D;NgiL81RO7{H#4ZUNR??P9I-c z7`M%;`DbQB&<6DG`rM>QucB8==;7huNTt5ZX-SyRp{&_z*8*$ZXi0uU0Q0b~RzoND zz99@9?<3bnCZ0rAmyl0gBZ$Z!RAAslXw~4SHk~xNP0xLKk3H3>V(n>ZdF)fg(P*$~ zdCiu%vXiBPr-(p6ekwH0DH8*p(n+KXBTokygG3b;)6mE#hk2-v4!cFHw@TQPT4rKm zf)@!NDtN0~`}p`^eWEodkC|O+%5Podo|`hTwx$6STt;`0A{fb5XN(*cr{lkxLbA|N z5!MK0KGcFZz}9z`t+m@5S)gquZ?ZXPegeSJL}365F?nIm z^jYK6txrL7F1{(3E?sLVcF(_#fD&{ zUp}oe^Ph=bys~&O(pvbwq~uLRRpyP0IsDNc&i@$rsNKMLJP|n6;8r~>g-t!!c>swE zmD+w?XTGO)Yfah$AdU}3{!;y&lsX>Zsu*4aGPXt?&5VR!GzHWmoAoMt!X3RWLvuiK<6D6?5UP@pS|0F=}f_i3Rr;}o2-q#tf z{Q}mpHG-3Yk+y~FYS`fH^mLDJPV$#Sf6ki5T7vB_m310efZ| z!~NSR*^5j7!aW8_L&-kMI!Jn3Jjx(CE@_chjoiD|8^=!FC{?Mf^=8%N7P0G9DyJzV zHDeWvr}xYBHcFs!E`}u~C2TR#(Ho)BySfoZ6vLbc3IqmH)OqiCCG!k#tr4&uZ)OU46x-IA8Ct~d|D@8q&_83Jp_tP{Tq9xFGHkWesI+r%3Vbs_pb~2f zisu4XN4=d!M$0C#%A&M3d##~7EzDo?hy76S0Km)P5<5Cg+^apIM9%iF8sg7A;>z=TGJPdrb`as+chUsV4p_1@RQ- z%JFbNe%C-xZ|DBb4iaeY8^J{1P;c*3g{&)U?9cd%qtlVz+Pa)q*>6;_wsBa$(hg3? zb3u(9>FJwI8EXO5qxh)@0f3~SQ+K|7gHA=Xiv2A-D>>}Hk&{guO^6myMY!Y>iVM>G zFs0MKWqwAlXr13blq(jkNy;#3{c(=TrDm+GorvZbH$`$?!gPImsg^^InT`GJ<|O>1Tmty4Ko_GycjeR-

    bR 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 DfCpVl literal 0 HcmV?d00001 diff --git a/pandora_console/images/Header icons v1/Auto refresh@2x.png b/pandora_console/images/Header icons v1/Auto refresh@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..73aec57365e65a0ef3c2860aa1aac8a848ad0925 GIT binary patch literal 1838 zcmV+}2hsS6P)pQ1f zwrtstW<;Kt#?MYuSeZijRu$)A+C+sJ@w_0pzP|pU6qRvRN=izGR9?Dtsa=>asWLG! zF;8V@XJ<(YkCkeqqM~AklzP&FrIE zn-Q$#&Lj3CauHP=F=7lVVFbtz!lfhbWT>H|9B^KQ^H+#xak$Td(4SH&+@t1sMoUXe zZ=G;907EioX#ckBHK}IM@Pp%UKG#hrnXj9Z*T9g zfa&@|a+$-{i^(fS5(~30VAiY%fP1D-pMLA^-Mfe52>7kVZ=3XN6b)bVm`?=IlqzA{ zMzO)ydGb*jTuDzZ?+bx(Qb5@OeVITpz86L(DZei(D|>C)fcA;)6v1p%9ynrZlL7=ZJUo1Ycc$zlyer8s zu1jRd$e#!351b9GmAP3P4^FBJ@Td$--nE{?EXlBH)rbPN*|X&pO8}~2;<{rX-*m`} z;u%x4-lGXA9pE|po9A1U=yC|CyGFoNH!dx!f=^>(<199b(zs(d%A70LvvvK2!yG`h zx2+=uTjBwn<1@Hc{W3B#Qo}2=+hEKuQjwBw_rvr?bI4bcsz>PE=e|!4pp4DU%`=CF zhK>Nd$agjwpf-RqR`<(9K;OZaVP8XCC*CT`JA7Lq84|~d`N7txqHv2qNMBfD02K^F2QkFVe|( z%gf8(o65Je1s5tyXsgS>INy%qZz^hF8JSs@LCON9yY8mTup^eRML6M1peGUkA*=R*|CWj>H&97Si8f z-%ExMv-cvWHEy%|qy)`Dr7ja}DK9eo zFHrT*Y~QUY8B$t!Z*%{9rpl?AGGDudNj`0G5`Po07*qoM6N<$g7JQ4YXATM literal 0 HcmV?d00001 diff --git a/pandora_console/images/Header icons v1/Documentation.png b/pandora_console/images/Header icons v1/Documentation.png new file mode 100644 index 0000000000000000000000000000000000000000..78bccad52a55abd56bd045beed0ad5438f280029 GIT binary patch literal 466 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc#=yY%t50_}ki(Mh=?zc(M!jHid{Wj978MwpHBAm zJ8U4(n#|4D$kH+UNjme2x1tfx`0lzoJ#rCIH1pIusI*(FJ8qHZuX&d{-(2z9>l(4j z_VLd&t9dh5aA@~EcFg{}Xl23I+W)3r&tp|RFYz5NSif_ow^d-k9hZeYSN$it)!xxR zv1{Gb={)@gM+HhAeT}~?A#e6ri1{AQKu6{1-oD!Mq)i~Ei0^ODD zdF;&D+1c5L?QWqpo6Qf?>GTEhrBdnPZDLqK{CGSbdL;?6sY-89uh(bN(vcvQyLTu#9^S+-DF*a09Nz^K7*0J(1g!c5*{Ca7^6#h%8olS&dM& zG%5=~W1=$5iX3Jn$Jn)s91i4IxdF@N@)HTD?qzvkN@EM3JHmL7;KYtj8T~kk5O9n= z$8qF$35-9LqtWOqF|SBEZa-;j(4%*Qk}gRvn%5(19(%gXcM z602WU24f6*A>8=g&0xS_)5U9 zcN)kI^+WibRjbvv?RJ~~+)!IqfD?FZvRAEE+e(szbbqyFZIVwil77GcvDIp&K8vL7 zD*52eFM;vuaQJ_-4f<5-*TJKF2Ke2ut6`@uF`VdK^o#<<8}1PD0r#002ovPDHLkV1o8(d2s*$ literal 0 HcmV?d00001 diff --git a/pandora_console/images/Header icons v1/Edit User.png b/pandora_console/images/Header icons v1/Edit User.png new file mode 100644 index 0000000000000000000000000000000000000000..ad2d1c5abb8e7bfd49c1cbf5f1771a039cd7548c GIT binary patch literal 826 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 literal 0 HcmV?d00001 diff --git a/pandora_console/images/Header icons v1/Header discovery error@2x.png b/pandora_console/images/Header icons v1/Header discovery error@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9f45175ea80e2efae483e5f9895cab1872f56910 GIT binary patch literal 1019 zcmV4s8Yf15DId z&)sorNq-W4sBQI#@$rm3N6r7Y;y zlcLc{XRbO)do!QDbVdZ2OWIVV!4p-=ka>6}ih2;P@b!a$i-C)41#=8s+f>kWc*XYF zEF!`qZ5cGG=2+a{j0kCP(8{l@y&xc){dc$%1*yrm7%>FYZ|1^26F1daZx=%{ zRycE7HM7={-(PfK;!Nm-26;HFCC0o9X_C`luu`_ zdj$75!H<~yKpNq7Lv!Qs(Xp|dmhS=-ft&z*pbQasJ)HZUNOX)4q^|v7@q7Lp-o#s5 zp5W-H%k!dV8*n++N~?qKhhYYMK_d` zo!x6y&fy#BQaqb|r~Dcw*H6CeR1ULcA=lf)OxCZb+Z9_xKL-ZdH-Bx60Kvtw;D{>< z;dXp_>Y=Gy1ZWC`mId7P!mvlw%V$ehsDrB%BxuggaAlfTh?7=RY{Wd|O4W-T%=h=V z(R$%7J9CX|WuysEx^U@y>lM;tY>M59kB={Fx$j`!wmZm!xhU=q8n~8G5)c}!ZplAn z=Pr0IysZUrzij0ft|Av7?AHRd;)-vIZy@Jt1==rr@$IjE2-R$)?qD@hGi~Y-G^0@s zU5{WjQ8R50Lj-Zv^!Q-WxXL#k96MM}?RX=;`L~&^AKj4N5&e6L9h*+fW^La=aYy>J zQ1IrW=nmAfJ^m%K2r<?zc(M!jHiWhpiIEGjVUJX6# z%@imwzq0O%?qrn}vnx5BUP?)NJvlCad1-h1g%d}e!(Zp0?C0Zhy>76mTd72YgZZu4 zG+*O9?R7JLH|gy?Ty6dN_u2PvXV0wdKA;@WYwu$F&-6_AAr(GJF2Ukw$_!#!vtKgu z@R<8QcdlT0sy$JSp;hO&c~*IcaH^5kM4|T^4_}MayLjTpH<2cuRK0JJ_dAcKRjs>T zSF@S>hAxYaw)&(Nfq<-6_sVQ92kBVPVDtGEVs^8@_-BI9h8&lQzN)|T60c=#o$>qA z-e`tJv3^gi6!t1S+{+Yd<8yC{3dh+iL8pRdZ2Q%;`m>jx39roeuebcmXDwegLG5Gv zp}zcV+y849iMaX;K8)bqeD3DbLJ5 zy}3=o9)m%&FAADVdAsaa8-=$^}pBmGS(fN&`>WR^5C@ff!^IFOFo7k$-VaQ0iWWX kT^?7r@8K4|bYa>V@d)mEJ+)s_CZI_3boFyt=akR{0KoLzb^rhX literal 0 HcmV?d00001 diff --git a/pandora_console/images/Header icons v1/Header discovery ok@2x.png b/pandora_console/images/Header icons v1/Header discovery ok@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1f8901c8b86508e47702743b98d7c57716bdd GIT binary patch literal 1022 zcmV-D+m-pclR6L z`*fD^bJE$q&r;Yu?0fU(z2CffJM+Hxy=83clSqcY_9w$LG=%$mxo+jY zNr8^qtLj3oQ#Rj>&RQos6o?cfo%4#!vg4=-7~YprydE8@%z$6_`2&qTm(m|e*XZ0D zfNrV)dkc7_mziKy#zuQ6axcMXE#m{RhhxR*!vUBs`s)F+b!;L_m=!{9@q#>1v*Yyl zry{qQB?d83SMRj|=Cq`bS9INLnf)bocL35vA{D7;7V88M&6v|d4B$8(uT^|H`~(KG zLcmmQ?97u+7%NC1NsEAklhJd9e2$)3K{;tc(aW*ESf*3z+JJb67x50ClES~C6u<7) z^mmR|?~Pk9azJKu<7btL*SP)Xp57F}#5GR=DbaWfh;bc^Jw67rX-{K_ zrS=_8X~$q?0~N^jw#~igl*6d}L<`HnN~=QUEmo*@J}qW!(!4*>aI9dhjbMI^X)P5Y z8ZI*qJ$FR05iDyYadjMs1G@(&9)ss zoT@vrk`n{Cc#qtQlMQQ#`H;K=18~pMJ}E+rfd!`Wh>5O?y#0NMLsqvO(@| zqVop>!G@ zASDmW5iB`m4ueAwL0~Hmrw`5$edG8_{_@~>wA~Z(&8}wXr5kI$%iE{_^9UPp@z{KO zu^yy8ZBFE;z32|O*&5b_O9AjVQ>jHbMF&+-YOq*^d^b9K73C#0SyUWDejS~9#eM!E z*%MXmv<|8YlBZVr=ZS?dv*0|omrmo62nk>zEOJjEUx|CI#O)%*54D`Aoeo6d2MCr$ sK8x+AMf}I(Lv731d0h+2wsm}M0Pf%mak8u|t^fc407*qoM6N<$g7u@p(EtDd literal 0 HcmV?d00001 diff --git a/pandora_console/images/Header icons v1/Header discovery warning.png b/pandora_console/images/Header icons v1/Header discovery warning.png new file mode 100644 index 0000000000000000000000000000000000000000..b329f4d755140c10467692f6013e5d2396d7ac86 GIT binary patch literal 524 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc#=yY%t50_}ki(Mh=?zc(M!jHit9aH978MwuZ9@< z9d;17W6Rz+MNO=)f+2H4z#-u#0U;ZO^9vR(R1$I#$$Tie%ugq9g1!nXZ>Gjt2}j}1 zL*ERu3xs5%Em?$;q}QiEPkUchljh{I?(dR0$IROET)7n%&RFqxqR_^&w~uF(EEk#h zPW5S|W|4M(M5uS;l3A>2M=xyseQ~X=>-lvJ@m0%ormA)O7f&c%zfI1!dHd0)r!A{@ zo}Jz);U+hu{p6KJdz{3A!(MMavc_+7>laz4eNW%4edxL5{p_U{5^;*w3eRLOi6k81 z7rSV>J?__`gNZpRzdYi)4ry6SyDfLSz47A8qnXN!a$fd#Bz0xJ=Kg9~x<8}sk<^{n zXXaMQ&7IJ9-k@vkBG*a_mYSrip|ihA-;;0YSzW?6@wCmSa>I`8t_Cd%c9ZA38y&eX zH2H1Ew3XV&ZvSU*l6Z3ChmCf}qNO1>Zyx>oJ*Wj+U}0u^V)E`uvtQ^v#xGTcUn^NEoIz3I>FVdQ&MBb@04$l# A@&Et; literal 0 HcmV?d00001 diff --git a/pandora_console/images/Header icons v1/Header discovery warning@2x.png b/pandora_console/images/Header icons v1/Header discovery warning@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..579c5fa6bb44d30db08dfea39df63b3eac8a5a6c GIT binary patch literal 1006 zcmV6#o5Z>8$Xo!mMG^qrW_yYtL zi!>%62nI!x%cTg|3Klk2ik1piHX>GnsHE`j45BEAV6+J+v9LEe1uG+W5)C2V?l`k% z!`}0GZ@qgl3EYEZc6VmK`F7sk?7k6V#d<}RpW_AVlxwn~;VI$#D}3)_}~ z6a%(XCsk?J8FKU!i`@rU0kuMibr#f-(E;xJ4+5LV;qthB$Y?IsxixTQtZ&!Aw*3t= z`6|$J)6R^OK_<+a#jp}FAL!zX`_vqwzeNG!PB2=z$U1%iA7}TfCH(li8~@*UO$v>j z>c1E}BS~%wM2=CTg^*I4IJ!o)LiPc@qr5wo)Fz;1DKq_$n}5f)#;fnkNdgxD&p;Kj z3n*}VqOqreOcRWKdT$6%f|~)5Uh|Caa(wK}wxOIlhbVe|CN#1MI-th@x<;xLo)ZXH zDgWs*O z!EJV+@y9qKoFKz~uY)TJ64Pfgl+>pI@QH+N6Ye1wHLoLxlf9u<->%S#&k{hY8zAa9 z+9x8KZiBaEu=6qum#bE92x2Mh(I}?UxI0+jRwQpgxfKR@{{fLZqO^F`3gBAJR zwYa`k4qC-!ZggK4hgt<%tNG0Bzy1)KSxB2;Gf{Krv?J(7qnUO)g3UzDowM;H2m-#l zj5ku7xk;){O>QJobzF#>xy|rLH(jxg*D2S#Lxs4^Xl2L{WG-B%)k`=<=U?A?aw9@> zvI7SBs>M833A&`Xz@oIe00K`D;eRZ$xJb!uBCw1C9tASEW^1DEtXP7sfo*fCT$HBv zYfy(N-uncVmxz2XEux!BOPyrbN#7JKNlhguQ%=W4a{h&!lqnQtipQ+P;H}6FzK<(G c@zm(^3&V8{Vl6Vo(*OVf07*qoM6N<$f`?zX3IG5A literal 0 HcmV?d00001 diff --git a/pandora_console/images/Header icons v1/Send feedbacks.png b/pandora_console/images/Header icons v1/Send feedbacks.png new file mode 100644 index 0000000000000000000000000000000000000000..858e790ddb2102fdd9912c5cc744be8df358e872 GIT binary patch literal 645 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc#=yY%t50_}ki(Mh=?zc(M!jHihp>zIEGjV&JD5k zW_A?V+pi(^uT3C8NayXFPZ!--r)vCQ{=`4&lv3+d&9_0Bf`YERinlm^zBqbm0<-7z zV?owCk9^mgS)BiV(S+vYwEMGX-mSIX-PWi-*N;D=mi@qyIgG;nGkIU}d=$7`?o`OI z#z(E#chU9Nm8~zT=$@}kl_Y~l*#6D^p^o9^E8S|rYqdv1ZRr^D5z%?nT6IPW|*g(th# zGnldVY+4zTHB)r{VvmD2M7Bn~ojqHVdqs3v`tG}R3UX2WrL8|g*JS(pha9(wI}CjKs|5mP?^U`4@Be<$v)XDF;d6Y{%vY4jKG-O*#YXAOk0nXF*58Y4 z-EH(!ETMEY*NzRRk997*!LG%^<+irqTo=>i#n(Evr?PKfDw!ZAFLUeg!wU!376v>{ z_-J)`y3qO~vhue@-~6q)n3N-F$9JiJ4`cKXW+^w(yRMP)4Km{h$t75MkFx@3Ca0= zn|qVJ*}2=zUVa9aH#6_O?|u8`?au7RD)OzhwRNz$xj8XAJNwDv942z2bR{jklkD4Q zU&Kn3W_Ph_YinDSz6Fr zFpT^d{u$o3l`p^2ogtdSHB7-G2rrjgFLP)qK;XL{|wGPhQ%1^zLw)S z_So3iny!d4#>!8-i_+EAb#Qrk`EL{u@nJ2ZgbusUN;aDv6h#ynkH>2XMql@F#%f*I z3J`Cts;cVj$jHco?xzY{S8&|k-hL0kE~0x9G6Ojoi^Y0IM@N59Z)!e3tmXk2&H;e3 zXah?Jx0%!p3IHQKF*$(70Iptc3J?YU3emdth+)P6wFT5&W#sB|R4@j_ovAvGaiX!Y z@hfE+&1!0Ds=%3Hf-la#GJupT7SZ9rxLY6}zAZ+1<~zvw5V~F7d6ZO(+Eu&?B)MR} z^6I3Iptq$j68mtkk)aqwkl&3ABLIm@z56W7NTex;rkshrNcc?|8Jcov%9#L(gv~qV z@FymY%49i`o0MHsQ*){u5b*^&cYn6i>GT{1^P(t2*3(yVs7}FA071w>-ZvN$0FO;e z6rj9M3Sdd`=YjW$47MtHgqI_T__7Xf$RMl)P#?D59+SO#!J3r%TxVxze06p8E>d&} z*9l!;YK%Nj<9btBS^3PgxfSybB*>RJ$UMhYR}3V|JS!E~9c1oxDSsou?(XjW3kwS` z;TUPlDiyGZE`_tl%~UFt)%8At5jJKWGx8W2<>Qw00w{tY#$(6Kb}ywjSeQPS9(FAS z?*$e=CV4j6);bGANVmyzn9Fn8coVLyth|S!&mS^X{2DW7rm*0}^iyEL0Kww)w zQG$Yo)yoOT{TRbX)Cc@dI|P!a!vgH29mFw|R2g;<| UtzpKMwEzGB07*qoM6N<$g6jN3S^xk5 literal 0 HcmV?d00001 diff --git a/pandora_console/images/Header icons v1/Sign out.png b/pandora_console/images/Header icons v1/Sign out.png new file mode 100644 index 0000000000000000000000000000000000000000..186cb46d3c4eec36fe5998f67883deebc9dc6e40 GIT binary patch literal 646 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc#=yY%t50_}ki(Mh=?zc(M!jHihp{#IEGjVwuV^y z9d;1d+B|m8ubx~T>F{i;r%4-Lc$Ath@-wl=d zZ*QJiWV$Bh{QI+K&YgS1))VaCy3nb%c&^`a z#i?R$ji+7SegAEpkmnuxvwzy@r_48MyA13mUb?GyYG>kC&Q(t&bIt{F~h&DNhC9Ck&`aFM%CL3IcDZN{EK}$KJZS^ zH1Aq8S?9Fg5ziG2m04>o`q&?T{1MnQ%V=w_8}otPb_SO%)q582TE@(DC!F2;BCDkD z)ijYpi}~m6S>Cv;ZfM&O6sD7KTQ6jHd)E7oNyRKDEE@0qsqDKX>X(+A)sV)MeoXwz zGBe9l^Ust=zii^TT)#?W&Kzdd=xZfvo|7KioIk(Nbko+PCjn1pu3yUac!SQYT(k0n z8+RPqkms(qX3fw23112gZm{Sl&hB?ue9_}cm|#TpEt6}yZ?+v)Trju!z_*i6Dt@nN zcWyd0p(DmQ{a%CJh8VBh$LqwpUBg6Wi22X6 adWPK2D|aUSU%v>H7(8A5T-G@yGywn|FA*sK literal 0 HcmV?d00001 diff --git a/pandora_console/images/Header icons v1/Sign out@2x.png b/pandora_console/images/Header icons v1/Sign out@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e666a1fbea0ade31e05e989ea149f607049e54ca GIT binary patch literal 1202 zcmV;j1Wo&iP) zf*}%Vtge#|D+&rLDebN@F&LDfB%09i)7zW7#Dai!R9Go@=l6~GmbY_ncV`#HN%rQ= z`}y9RnYS}?H-ZF+k8oXk|~_xm+6-)OEt(9wn# z#9;KncuXenj@hR$4-O6{Oh-^$N@>y*+HYO316=Z4OCk^kdU38;7bJc1A&1MsC|wgI z%@bKlQJC5wilW6*F**>qT0ksk&1UnOp!)rg>sqZgzqhyd!B-qwvu?Nho=Wg=Pb&{8 ziVzd{q-US0NCVDZlrM-VngGfP6+}o{TB0Zn_OgzM^AWOaljBU+Gcz*}MTy3v{IS~p z{{A-jE@>!_(bl!1xYaz;&SGtCEe1l@7jjG>$evj;i^oYXK=95IYF<`ET8A{}TnOeH zVRcWiaO23-F19GOZsxZ5032Hp0{EPVg9gq5+y%g04QwTemXjuM7NDz({>c7KftVq0#OfOvMKKP(6*zKlapiZcKfGh`ZSz=)jULVLyt9` zyb80kvvYDdhysCNd`re5eFDhy3z5D8$bBrqcNni?r?)~tw2lMB8~&o#>#b;k(2&*e zYW8GY)JN7-eIqNWeH|Ic{cq&o z)bXwjg`S$4dLndD?+)0!q%B+9xLxKHtVmg@mMN4NeR8MBRCt2pXj;d@-xQwJGXO-t zVwJ|0epOx)VBS4d1YUNTi}18O;%(gNbiNd=m^QL#t|)4d+pSjXmnE;ttJUlE*D!8W z1yFWlr>CbkkB*MqhmPW3iexFrI_6R!VoWTd{T`>&G5olS4SM|ASmK@J>-pmtMy2XZ zA3%@uu#l(AgTQ!|*YNN<=LhsqouDy;uP1GkN9UcAv>ODp!5{@EZ$+;>KnW@|(Ek=- zXrRFXVjG6)CUK(sylYA8h0yT%Ew}(d&a|*Cncqzz4$J5;FYzn~uV5&6(MzInLh>-Q zp3%6Mrb7Y~Cs!I^nZT|*Km?cEBy`RkLsxj4a0NSfQeT4@S8c>H8*Y*&%DC1*_!QUN zj;ZJ|8Q?0O(*JjPI5H%b*-$s`LNH+pbC@ySx-C|^IXXciVh}4xxrCBC2U!*K&l47& zC2XB4ZD{+iD(j@8)`1QFQhER$pF2qC>y+cL=HE-7@$BHsXXkGhr}W{s-=Po{UTO3T8z7a32B^} zKIiuCbKXPi!hQFg@A;k|_nh};0s&T6S659=Z5~?p3t*ILwK}epdM<`QcX#)7?QnBC z7!3Ad&L}b22qMeU>2&&*2sqzlFN^H1dbX-pVANngl-$2Up-|Fsnc>U|7^_q&BLc$G zwOZ|21Hvk0lm*0Npj945Xi^N1B_PcUoNa^z^h*CRWV8# zmL#Vcm<1r6v9kYEM7ay$5(b&OCyFIYbnTD?6Vj4^tQ+iAOQeN!8eq@?)*u~p8lH~F z<7S4~OSCX0eS9KB8r=!$wa5&hy-+C3i_Cf{5BIge^E-qkuy%F~$D@?BU`R^cX+SWS zfV3A`wpo_ss1I~37Tb+77KudmIiNX+_(-1b3GFM4X264V(GS&?lH& zzu1HFAlO-sE9|i7todXzS;pZLa>O8;5B$}B0*+D9kOQ|Q5{V!AeEx&HiISyllkb&q z&QbYoetnin(1f*tK*OA!UM6=|YR*piK28_>g#YNC&sBy-n=ZRO+{&3&tdOY1XIo)V v2Yi^TdVWb<)DgJCs2`(}zkd;agQNceqhK(Fm=&zF00000NkvXXu0mjf23UPI literal 0 HcmV?d00001 diff --git a/pandora_console/images/Header icons v1/Support@2x.png b/pandora_console/images/Header icons v1/Support@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f3c95c28530c6b5cec7e93752c000e61f972d833 GIT binary patch literal 1920 zcmV-`2Y>j9P)1i$6vuh5D`3Gwil_+~6fi6r zJ}4*>T9%-#vPm&fFbEpKCDGs)H$tu8^=e;VqPrkufm= z?1Nrz;1PjYSy{!9JP&McZayHerKM#yS<0>Gp*2nxtKuk(7>+#DQ^z6_=BfbD5|+h*~Ncn;A)0 zhHJi(26;N6OwuI@ZZz>!U;!z-AH*$-ATHV83(o79%gqR0DX%rzrRd%;dD5gw*K$3M zn(SqW!JlN3YhW0S$K#v0-(K(4tJm>{hK6a_ZwuN{qoJ8ZuSyk+Ah%UlSAQ)>7OmxW zJV>xs#9xBJBopUnzlJ!>1lW-M>#k1f^$dw7)BP>+HLc7#@hFe|z8WL=UDM{U{ zNx~s1m~7l5zC>lod3m{a&bhep zon@F5OiuLSJ?0!nI}6yshnCU`K1+ujg0zJv>iFj+0Ap-aK3_sz_7o&C3a1TrTmU)wy;9#L8-ZLPv zC0E~K!8kx?DVUVlE#NM>Iq|@A?ZwZ<=MKNI6DNyjWVcpHNlAWVW209a$GZi6Hrs!f zjF$*!t1~&yc6z*H*ntfRCYvl4FXMr_+;Qk{yw``EWy1_G3O3dF5IXMCrAq@1C)1~l zkCFOY0FN6W$`+PV;8n2mpdY$A@zgR4Tqk*fs{`*D4+fI~SQ!o(3P$izw9XLdBIdY6 zeZLF_lOOi`)rY&_?-1}$hZa-YMBeOOSY(B4y^F%$OB0UmZ0kN`uN@+S{mSz>7rQUa zhQwYF@Asi8T`@Z>z*X?yHsjQ(Qx6bx1$ehw!HIWRH;LXS);M4!t7Ws;bWLqyz=B;6fH$Zw5wj z9Ejs@CW}(B4Uqd?EEP|pXLt>|p|Y~_B!wvA`@&a2TMDp<0=(zqVdvl(*T8rxoAkgW zxqax;N=`AjD*ZWHwu{fs&i+m`WOP{DPml#m)k9S8;}AzJuu&g(q~pfg4Y?)EE()WH z<toy@&=>`<%pz&6Zw5^y_x^bPYg$ux7^Tn#po z_;aDNNi6bXOK>SZycByk301rf(e;6K|juLn5+j^yR#^<&`^ zsTRjcUwrd>vgvTlP|ZzLay*7x(XUtXZZQ4X=7@M6>?zc(M!jHifcSw978Mw*M{!( zV{#OjcaxcSVuVL)Z|kue(KjPGcOGu~!C=>7wy$gH*0~->%0DnZVBF#)Y&c6{=fl}k zTfY`rzHjmUmR44`Z|2;&cOQQ*+imt!=6mPUT_!)J?sItdwyf*vXfctt$!XbsrX-^2 zfltecA6jeb`*&Uw{~T>>)&5@9@U8Pll_TO^bI#j}8i&s4dYS&H;vwtK;*Ynt0$ zZwc_6c{b2{vGK|;*LOM@f8P6k%E{+WAuO{Oi~U;v`0}~4I$K_qMjVkh`#szGc+QMg zv+^gc-e&3F*QlLQyH)j~WbV&w<*rS$&fQdfd20I{o(*55uB*OzILCjQTM)xC_s0je zw5>Z?voAnF#mru0Vnv-|%{~Ezp78r-uNklIPcA;7vfEHi?v?G7MD~Mbinkr?Lp_&p zb?F@nKJvwIvGO0Yc^{|oeMsO*GWuJz)Mf^g-jx;$t7-jnK=I+}>gTe~DWM4f-Zt0j literal 0 HcmV?d00001 diff --git a/pandora_console/images/Header icons v1/Systems error@2x.png b/pandora_console/images/Header icons v1/Systems error@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fafe9217567aa5ca0a02ea09d2bdc7e0b2c6d145 GIT binary patch literal 945 zcmV;i15W&jP)1gh5T4nCI6p=ZKp;XQA*G-p z5|2QEl=zGzhliksk}i*cL=^;&0HledbaY5=oyJs=2+-g-$b#4g-!OAwkCpGvzO&cT zA+nOSb2Gc&&d!c!b_ao5vrsB~UT+H!x=KL_8>=pfz-)@8hbBX41q6#>Wx*c&;c3AjKmD47=%B2MolkW*{h)Z4B2R;zqBBpc+94kmoHJL`;{lT_C*Y5!_+HZ35zWhIx)>7dYi~fv6?%5rOI)f<7QP?;+>Bo8R6( z)+qmg4YjJadh4eg1P5{I+1)omX6F=L;e#lo)jZJ91QU>HHT@_pn2gW(DMws}M%m?L z=dcZnp8#mV#xjVi$fs-vOcavX8n})4p#)YDn6!MSX#t@4q4qtKP6H-mGwz41VX)=2 zTZ2U#3{Qi^HZkb+u} zl|FRDSy4>uai*ZQ#Hc;{esrVFO?6zYE+IL~J)mXuXqgbMA`zFBxU>W?$7QBGm!0zb zM40n=r!plaCmz@3UP|g*e!>=C;Tt@s!Mv}C#HA?w!jG&2z}^8&O&yq}C{v@~R}2*n TnPoGs00000NkvXXu0mjfh?zc(M!jHiYIxxIEGjVt_|Jm z$K)t5@22%dmn7%bUe;p~oX3u|oZ}L@c#8dl;+BmU4#~?MIu&u7Q%zy(+|G@Y*)Omk za8lm>c>8PJIKAng1w2mFeBONj&l{tH&D$e6z8vSCxa$k!I@c8rOZr6)n6=8=y`7TZ zU|yqi)7VY4iesH=Vb^5k^~Mq>pU*wDZ-Y$N39c{h_doO1`2Omu<6L!Ep~Ayv-rX4y zL0g2{bybb8`@cH>Msw?9ng7$wwkC3I$+Mh!BrSNh!s8Mn%?Y#je$85t8t#&x*x`ET zfRZt9!~Ftx{jMKjl{>Fh#Hugtx}DRTX7WtB-0f@5%9*z>I9FZ8kv|J=JMQ?os6xg`*!pj}@$}icb$t87 zJYNfK)JlA+lkBd~d6G%&pv|ObhI4FgO)L=Id)TZY>)IvlXV=`5YvT?7MWp?@@7OlG U{C-PMB`B6WUHx3vIVCg!0LQ@Gq5uE@ literal 0 HcmV?d00001 diff --git a/pandora_console/images/Header icons v1/Systems ok@2x.png b/pandora_console/images/Header icons v1/Systems ok@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c1484d1ddb317cf1d172ce1fa2d124c507bab3d5 GIT binary patch literal 982 zcmV;{11bE8P){|NDHPa7BZ|!t#p~vZ8sW1+n6m zzX)Pn90joETlD_{OHb!=xvm+lQs8fU(NV&+lGYeq@Ch8?&%k8GC|BLX&th zaaLk!i4lDtCFrqGHKHA2GbF=HjA#^gY7;NaPC$m=VLJG?y`CCf88_p(rHeh1p=O-4 zO?}Eq4JVf4nS5?s>*}k-8qEcZ$_GOX{Ui(an*)ToJ*meq^|Voky1Gv@t6R*p0RP?a z9FmMtnttQ=)M4jxU0t2c=W?3qlGge>fX<=qBjzk?I*L4XQQJ09=Srk`4RW7Z@%yYp z?_b>=1Al;pro3>yg-}bBQ zhio^q+aDdC&JTUXsqRb~=1>!^skFevA*ro?+IYnkg;f~AzKm@?A5ikp{XO2yJiON%da&K?#bwce6Y{m%q?(yYigdEI&zVV6Sqi z*Z#da6xLS`IdZRS$FoSW=3Ch3gRxZvaHkzAqKcoj(%LU!=5M$ox2bay1RQ=NWk%|t zdD-&Lnzd*(qPIGj(J~`147GbxMe3cokTs&W*u$uUEjDNiA6a5sfL6;NIJnmc*F7Tz z!L+`wX5YT-)ql47NvVGP<@>=ufj>1^kvD0b?ZKTmS$707*qoM6N<$ Eg53wY9smFU literal 0 HcmV?d00001 diff --git a/pandora_console/images/Header icons v1/Systems warning.png b/pandora_console/images/Header icons v1/Systems warning.png new file mode 100644 index 0000000000000000000000000000000000000000..f1cbc64f6faec500766f3e8c6d497b1135e5fef0 GIT binary patch literal 492 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc#=yY%t50_}ki(Mh=?zc(M!jHisL<9978Mw*M@HN zV>aaZ>fOiK6|gWkF+s!WjZcn`0^?i(V|hmI{fAC?U2QcwVE=(}FMosR$_p#SljqM` z>~T?*-K8t%X65<5+K-Lx(X!9&jvv`^mdkvv@-jZb`w~fZ3x6KUxggh&VK4mMvioYy z?svDder(iwzbMpG&vA#?vskq~5#8Enf*v}aTVQx%=Zwzl-dj|Q=fv(gEH$U{`1(}I zsF_^HmGzx-PFgm#OS7+guutTtz=L%q36mX!mG&5ZjJP4cCbM^vWV0#v(+IgMmtOG6 ze%N;8LdBPc6+S6*>f57UMEo}DT^ZYX)KAa9sBdG(z4O&7LbZLXPWw8PrW^0xbY-dL zd(mTGAM8+HobLXQ^ESgZmK&3Pt?Rm?Tf9fcReq8G3|IF3O%pd8?riN_{`3zw*Sn5` TYk3*Zfr8xA)z4*}Q$iB}*B-(n literal 0 HcmV?d00001 diff --git a/pandora_console/images/Header icons v1/Systems warning@2x.png b/pandora_console/images/Header icons v1/Systems warning@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..03e18ec79d0e79d247801bc0d38055f5879cc32d GIT binary patch literal 918 zcmV;H18Mw;P)1gh5T4mJLL!c^ArKJ~$&!mS zvBV=#(8MSbDDVo@P}1=Tk*E^E6WEDGL1^iaXq_fhmI%<`kSG+RE>Oo*{Q3#*myKroGKQcosMODr!nqP0<+ z9t$;OWgRU*`Ur)_hea$3cy<&fId zrbqNK^@uTolJArSV;|ZebLlYv;V#LQx%)8puu=NPwR?#0lEdbZ^Uq~?8fm@}@SHK; zYtWBI@+x)iJn((*A&|epIc%MUYFvQIoYxkm{BUl&;I>ad$4K~1q51-P@iRW{of*ad zfe($Td9}H(vP}*W)VO_WEBl~bJp`i7td?5~T`&RBh%d5&iTrG@a@=NUl35lz2EA7G z2meYdd8pxqd|ce31j&^Xt61vNSuG!lLlb)vlZMU;SlpDeT9PDhr<^2^m7hPL)@qY$ z!drfivs&ZGe?_HUX?=Ye>0tRTc!P$I-UbUah@ipX>m2MiodJcDQs{zOh0tYXT}Ao` zbg7$r)Z{&r+}C(+VBQ{>7SGmr0~D_HhVQnM9u8cLv~(l}dAGewAC?l!RbU*^URnjy z%FX^?tO1*|xEB$d#I|WyU_M^x)zW@LL literal 0 HcmV?d00001 diff --git a/pandora_console/images/auto_refresh@header.svg b/pandora_console/images/auto_refresh@header.svg new file mode 100644 index 0000000000..4c9de8f3aa --- /dev/null +++ b/pandora_console/images/auto_refresh@header.svg @@ -0,0 +1,11 @@ + + + + Dark / 20 / Auto refresh@svg + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/pandora_console/images/discovery_error@header.svg b/pandora_console/images/discovery_error@header.svg new file mode 100644 index 0000000000..cb323bfbb2 --- /dev/null +++ b/pandora_console/images/discovery_error@header.svg @@ -0,0 +1,9 @@ + + + + Dark / 20 / Header discovery error@svg + Created with Sketch. + + + + \ No newline at end of file diff --git a/pandora_console/images/discovery_ok@header.svg b/pandora_console/images/discovery_ok@header.svg new file mode 100644 index 0000000000..2b9ca237ac --- /dev/null +++ b/pandora_console/images/discovery_ok@header.svg @@ -0,0 +1,9 @@ + + + + Dark / 20 / Header discovery ok@svg + Created with Sketch. + + + + \ No newline at end of file diff --git a/pandora_console/images/discovery_warning@header.svg b/pandora_console/images/discovery_warning@header.svg new file mode 100644 index 0000000000..c85e425eec --- /dev/null +++ b/pandora_console/images/discovery_warning@header.svg @@ -0,0 +1,9 @@ + + + + Dark / 20 / Header discovery warning@svg + Created with Sketch. + + + + \ No newline at end of file diff --git a/pandora_console/images/documentation@header.svg b/pandora_console/images/documentation@header.svg new file mode 100644 index 0000000000..3e7cbb0889 --- /dev/null +++ b/pandora_console/images/documentation@header.svg @@ -0,0 +1,9 @@ + + + + Dark / 20 / Documentation@svg + Created with Sketch. + + + + \ No newline at end of file diff --git a/pandora_console/images/edit_user@header.svg b/pandora_console/images/edit_user@header.svg new file mode 100644 index 0000000000..f1cc04deb7 --- /dev/null +++ b/pandora_console/images/edit_user@header.svg @@ -0,0 +1,9 @@ + + + + Dark / 20 / Edit User@svg + Created with Sketch. + + + + \ No newline at end of file diff --git a/pandora_console/images/send_feedback@header.svg b/pandora_console/images/send_feedback@header.svg new file mode 100644 index 0000000000..cd4ef7e83b --- /dev/null +++ b/pandora_console/images/send_feedback@header.svg @@ -0,0 +1,9 @@ + + + + Dark / 20 / Send feedbacks@svg + Created with Sketch. + + + + \ No newline at end of file diff --git a/pandora_console/images/sign_out@header.svg b/pandora_console/images/sign_out@header.svg new file mode 100644 index 0000000000..7d23d328f1 --- /dev/null +++ b/pandora_console/images/sign_out@header.svg @@ -0,0 +1,9 @@ + + + + Dark / 20 / Sign out@svg + Created with Sketch. + + + + \ No newline at end of file diff --git a/pandora_console/images/support@header.svg b/pandora_console/images/support@header.svg new file mode 100644 index 0000000000..3b9cf3e31a --- /dev/null +++ b/pandora_console/images/support@header.svg @@ -0,0 +1,9 @@ + + + + Dark / 20 / Support@svg + Created with Sketch. + + + + \ No newline at end of file diff --git a/pandora_console/images/system_error@header.svg b/pandora_console/images/system_error@header.svg new file mode 100644 index 0000000000..d1318690cf --- /dev/null +++ b/pandora_console/images/system_error@header.svg @@ -0,0 +1,9 @@ + + + + Dark / 20 / Systems error@svg + Created with Sketch. + + + + \ No newline at end of file diff --git a/pandora_console/images/system_ok@header.svg b/pandora_console/images/system_ok@header.svg new file mode 100644 index 0000000000..cead9354b0 --- /dev/null +++ b/pandora_console/images/system_ok@header.svg @@ -0,0 +1,9 @@ + + + + Dark / 20 / Systems ok@svg + Created with Sketch. + + + + \ No newline at end of file diff --git a/pandora_console/images/system_warning@header.svg b/pandora_console/images/system_warning@header.svg new file mode 100644 index 0000000000..681915d0c6 --- /dev/null +++ b/pandora_console/images/system_warning@header.svg @@ -0,0 +1,9 @@ + + + + Dark / 20 / Systems warning@svg + Created with Sketch. + + + + \ No newline at end of file diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 58a8cc6653..4a5136ba52 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -2612,6 +2612,7 @@ div#header_autorefresh_counter { } .autorefresh_disabled { + opacity: 0.5; cursor: not-allowed; } @@ -4757,17 +4758,16 @@ div#dialog_messages table th:last-child { font-weight: bold; } -.notification-ball.notification-ball-new-messages:hover { - box-shadow: 0 0 3px #888; -} - .notification-ball-no-messages { - background-color: #82b92e; - cursor: pointer; + background-image: url(../../images/discovery_ok@header.svg); + background-repeat: no-repeat; + background-position: center; } .notification-ball-new-messages { - background-color: #e63c52; + background-image: url(../../images/discovery_error@header.svg); + background-repeat: no-repeat; + background-position: center; } #notification-wrapper { @@ -11239,14 +11239,15 @@ form#satellite_conf_edit > fieldset.full-column { .show-hide-pass { position: relative; - right: 38px; - top: 0px; + right: 48px; + top: 14px; border: 0; outline: none; margin: 0; height: 40px; width: 40px; cursor: pointer; + display: inline-block; } .show-hide-pass-background { From 82ab2af20a6e73ff435f164c0edbea8441de1ecd Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Mon, 20 Feb 2023 17:26:58 +0100 Subject: [PATCH 309/563] Fix header title and subtitle --- pandora_console/include/styles/pandora.css | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 10f219d81a..88eb27d931 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -2545,14 +2545,14 @@ div#pandora_logo_header { } .header_title { + font-size: 12px; + color: #161628; font-weight: 600; - font-size: 10.5pt; - color: #303030; } .header_subtitle { - font-size: 10pt; - color: #606060; + font-size: 15px; + color: #8a96a6; font-weight: 300; } From 3ba9b752fe514fab0b8549fb42b0ea0687711e5e Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Mon, 20 Feb 2023 17:43:42 +0100 Subject: [PATCH 310/563] Clean unused items --- pandora_console/images/Header icons v1.zip | Bin 38450 -> 0 bytes .../images/Header icons v1/Auto refresh.png | Bin 825 -> 0 bytes .../images/Header icons v1/Auto refresh@2x.png | Bin 1838 -> 0 bytes .../images/Header icons v1/Documentation.png | Bin 466 -> 0 bytes .../images/Header icons v1/Documentation@2x.png | Bin 851 -> 0 bytes .../images/Header icons v1/Edit User.png | Bin 826 -> 0 bytes .../images/Header icons v1/Edit User@2x.png | Bin 1795 -> 0 bytes .../Header icons v1/Header discovery error.png | Bin 544 -> 0 bytes .../Header discovery error@2x.png | Bin 1019 -> 0 bytes .../Header icons v1/Header discovery ok.png | Bin 558 -> 0 bytes .../Header icons v1/Header discovery ok@2x.png | Bin 1022 -> 0 bytes .../Header discovery warning.png | Bin 524 -> 0 bytes .../Header discovery warning@2x.png | Bin 1006 -> 0 bytes .../images/Header icons v1/Send feedbacks.png | Bin 645 -> 0 bytes .../Header icons v1/Send feedbacks@2x.png | Bin 1310 -> 0 bytes .../images/Header icons v1/Sign out.png | Bin 646 -> 0 bytes .../images/Header icons v1/Sign out@2x.png | Bin 1202 -> 0 bytes .../images/Header icons v1/Support.png | Bin 869 -> 0 bytes .../images/Header icons v1/Support@2x.png | Bin 1920 -> 0 bytes .../images/Header icons v1/Systems error.png | Bin 521 -> 0 bytes .../images/Header icons v1/Systems error@2x.png | Bin 945 -> 0 bytes .../images/Header icons v1/Systems ok.png | Bin 543 -> 0 bytes .../images/Header icons v1/Systems ok@2x.png | Bin 982 -> 0 bytes .../images/Header icons v1/Systems warning.png | Bin 492 -> 0 bytes .../Header icons v1/Systems warning@2x.png | Bin 918 -> 0 bytes pandora_console/images/svg/add.svg | 1 - pandora_console/images/svg/arrow.svg | 1 - pandora_console/images/svg/bell.svg | 1 - pandora_console/images/svg/bubble.svg | 1 - pandora_console/images/svg/device.svg | 1 - pandora_console/images/svg/display.svg | 1 - pandora_console/images/svg/down.svg | 1 - pandora_console/images/svg/dropdown-down.svg | 9 --------- pandora_console/images/svg/dropdown-up.svg | 9 --------- pandora_console/images/svg/duplicate.svg | 1 - pandora_console/images/svg/envelope.svg | 1 - pandora_console/images/svg/exit.svg | 1 - pandora_console/images/svg/eye.svg | 1 - pandora_console/images/svg/fail.svg | 1 - pandora_console/images/svg/file.svg | 1 - pandora_console/images/svg/house.svg | 1 - pandora_console/images/svg/iconos-27.svg | 1 - pandora_console/images/svg/info.svg | 1 - pandora_console/images/svg/left.svg | 1 - pandora_console/images/svg/menu_horizontal.svg | 1 - pandora_console/images/svg/menu_vertical.svg | 1 - pandora_console/images/svg/ok.svg | 1 - pandora_console/images/svg/picture.svg | 1 - pandora_console/images/svg/plus.svg | 1 - pandora_console/images/svg/protected.svg | 1 - pandora_console/images/svg/radial-disabled.svg | 11 ----------- pandora_console/images/svg/radial-off.svg | 11 ----------- pandora_console/images/svg/radial-on.svg | 13 ------------- pandora_console/images/svg/right.svg | 1 - pandora_console/images/svg/search.svg | 1 - pandora_console/images/svg/settings.svg | 1 - pandora_console/images/svg/sound.svg | 1 - pandora_console/images/svg/star.svg | 1 - pandora_console/images/svg/success.svg | 1 - pandora_console/images/svg/trash.svg | 1 - pandora_console/images/svg/up.svg | 1 - pandora_console/images/svg/user_a.svg | 1 - 62 files changed, 85 deletions(-) delete mode 100644 pandora_console/images/Header icons v1.zip delete mode 100644 pandora_console/images/Header icons v1/Auto refresh.png delete mode 100644 pandora_console/images/Header icons v1/Auto refresh@2x.png delete mode 100644 pandora_console/images/Header icons v1/Documentation.png delete mode 100644 pandora_console/images/Header icons v1/Documentation@2x.png delete mode 100644 pandora_console/images/Header icons v1/Edit User.png delete mode 100644 pandora_console/images/Header icons v1/Edit User@2x.png delete mode 100644 pandora_console/images/Header icons v1/Header discovery error.png delete mode 100644 pandora_console/images/Header icons v1/Header discovery error@2x.png delete mode 100644 pandora_console/images/Header icons v1/Header discovery ok.png delete mode 100644 pandora_console/images/Header icons v1/Header discovery ok@2x.png delete mode 100644 pandora_console/images/Header icons v1/Header discovery warning.png delete mode 100644 pandora_console/images/Header icons v1/Header discovery warning@2x.png delete mode 100644 pandora_console/images/Header icons v1/Send feedbacks.png delete mode 100644 pandora_console/images/Header icons v1/Send feedbacks@2x.png delete mode 100644 pandora_console/images/Header icons v1/Sign out.png delete mode 100644 pandora_console/images/Header icons v1/Sign out@2x.png delete mode 100644 pandora_console/images/Header icons v1/Support.png delete mode 100644 pandora_console/images/Header icons v1/Support@2x.png delete mode 100644 pandora_console/images/Header icons v1/Systems error.png delete mode 100644 pandora_console/images/Header icons v1/Systems error@2x.png delete mode 100644 pandora_console/images/Header icons v1/Systems ok.png delete mode 100644 pandora_console/images/Header icons v1/Systems ok@2x.png delete mode 100644 pandora_console/images/Header icons v1/Systems warning.png delete mode 100644 pandora_console/images/Header icons v1/Systems warning@2x.png delete mode 100644 pandora_console/images/svg/add.svg delete mode 100644 pandora_console/images/svg/arrow.svg delete mode 100644 pandora_console/images/svg/bell.svg delete mode 100644 pandora_console/images/svg/bubble.svg delete mode 100644 pandora_console/images/svg/device.svg delete mode 100644 pandora_console/images/svg/display.svg delete mode 100644 pandora_console/images/svg/down.svg delete mode 100644 pandora_console/images/svg/dropdown-down.svg delete mode 100644 pandora_console/images/svg/dropdown-up.svg delete mode 100644 pandora_console/images/svg/duplicate.svg delete mode 100644 pandora_console/images/svg/envelope.svg delete mode 100644 pandora_console/images/svg/exit.svg delete mode 100644 pandora_console/images/svg/eye.svg delete mode 100644 pandora_console/images/svg/fail.svg delete mode 100644 pandora_console/images/svg/file.svg delete mode 100644 pandora_console/images/svg/house.svg delete mode 100644 pandora_console/images/svg/iconos-27.svg delete mode 100644 pandora_console/images/svg/info.svg delete mode 100644 pandora_console/images/svg/left.svg delete mode 100644 pandora_console/images/svg/menu_horizontal.svg delete mode 100644 pandora_console/images/svg/menu_vertical.svg delete mode 100644 pandora_console/images/svg/ok.svg delete mode 100644 pandora_console/images/svg/picture.svg delete mode 100644 pandora_console/images/svg/plus.svg delete mode 100644 pandora_console/images/svg/protected.svg delete mode 100644 pandora_console/images/svg/radial-disabled.svg delete mode 100644 pandora_console/images/svg/radial-off.svg delete mode 100644 pandora_console/images/svg/radial-on.svg delete mode 100644 pandora_console/images/svg/right.svg delete mode 100644 pandora_console/images/svg/search.svg delete mode 100644 pandora_console/images/svg/settings.svg delete mode 100644 pandora_console/images/svg/sound.svg delete mode 100644 pandora_console/images/svg/star.svg delete mode 100644 pandora_console/images/svg/success.svg delete mode 100644 pandora_console/images/svg/trash.svg delete mode 100644 pandora_console/images/svg/up.svg delete mode 100644 pandora_console/images/svg/user_a.svg diff --git a/pandora_console/images/Header icons v1.zip b/pandora_console/images/Header icons v1.zip deleted file mode 100644 index 22a9a12dfa2c2155b0f7aad869015fb753617c08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38450 zcmc$_18}9`wk;alHafO#c5K_WZ6_VuwrzE6Tb*=lJ9+7|&%5W`efrefRj=;3EA`h} ze^T|=s>&F1jxpx^Q~>_{MFI$5ixUP}a8Z}57{wSdM^iY{?$@`QINzi@ML;)K4vsAm1t}=g`DKX<*kVLeQQQ?T#&I;>2uTf!n1-+;fJu2>tCLWw2 zY1lyc7L&}^=_W!Un9i2@xvHBFNrVny{H0xWwf277{_lrRw8u~L*JRdJl6 zSa^0QSWDN8lR=o^YcsH?k7*1_QXKj}8b}$Z4_&Gu%SH|3;}@ zqL!{g#Tus{@Mo$jawq<12I{|gZVIYwP%*<;8l_GIPQ!mw`@b*Pz&9Z43Qh_ z5>zW1$_)w%yID}PMW<+3qKfI_FWlKO0FvL24X|_^%#3zLN<;m*l-T5u2L>CCqxP-s zSGABQET%k>UA`=lNDW~u2d>J=!32E2Y;6vt#8fTWd7DUU3L4zElcsnr5omDhFqCY` zn)xueHPs0S_!iYu1do7a2rB)?NKGTTL9Ad+)K?cu)CVHYbSIH(o1WCSoOL?U&&>@V zh8JJ!o>Z-L7oD&VfniB>?t}}i52$q)MbuFKeYY*%iq|KS3S*?0MZ2g3pl$c-s>T;^ zIZ1Gc{8;AqP#^$+KTwwYE6D3X007|sGsqd;XzgtNKQRti4k9yUQ3n9)>jD4($_4sgzah^B{*TXp{-{nXoc#4j5^-SxB{j%FH6AGx0Th$R+Kvc? z!a4r4b9nL}3;~2l=9Se6a8yuGR21jcj0_lwxy0!+*YoQc9RmS=E=p#2gM%_CSRYoGSXU@Y;BD|s%Fg^S0y9CqQn{D;NgiL81RO7{H#4ZUNR??P9I-c z7`M%;`DbQB&<6DG`rM>QucB8==;7huNTt5ZX-SyRp{&_z*8*$ZXi0uU0Q0b~RzoND zz99@9?<3bnCZ0rAmyl0gBZ$Z!RAAslXw~4SHk~xNP0xLKk3H3>V(n>ZdF)fg(P*$~ zdCiu%vXiBPr-(p6ekwH0DH8*p(n+KXBTokygG3b;)6mE#hk2-v4!cFHw@TQPT4rKm zf)@!NDtN0~`}p`^eWEodkC|O+%5Podo|`hTwx$6STt;`0A{fb5XN(*cr{lkxLbA|N z5!MK0KGcFZz}9z`t+m@5S)gquZ?ZXPegeSJL}365F?nIm z^jYK6txrL7F1{(3E?sLVcF(_#fD&{ zUp}oe^Ph=bys~&O(pvbwq~uLRRpyP0IsDNc&i@$rsNKMLJP|n6;8r~>g-t!!c>swE zmD+w?XTGO)Yfah$AdU}3{!;y&lsX>Zsu*4aGPXt?&5VR!GzHWmoAoMt!X3RWLvuiK<6D6?5UP@pS|0F=}f_i3Rr;}o2-q#tf z{Q}mpHG-3Yk+y~FYS`fH^mLDJPV$#Sf6ki5T7vB_m310efZ| z!~NSR*^5j7!aW8_L&-kMI!Jn3Jjx(CE@_chjoiD|8^=!FC{?Mf^=8%N7P0G9DyJzV zHDeWvr}xYBHcFs!E`}u~C2TR#(Ho)BySfoZ6vLbc3IqmH)OqiCCG!k#tr4&uZ)OU46x-IA8Ct~d|D@8q&_83Jp_tP{Tq9xFGHkWesI+r%3Vbs_pb~2f zisu4XN4=d!M$0C#%A&M3d##~7EzDo?hy76S0Km)P5<5Cg+^apIM9%iF8sg7A;>z=TGJPdrb`as+chUsV4p_1@RQ- z%JFbNe%C-xZ|DBb4iaeY8^J{1P;c*3g{&)U?9cd%qtlVz+Pa)q*>6;_wsBa$(hg3? zb3u(9>FJwI8EXO5qxh)@0f3~SQ+K|7gHA=Xiv2A-D>>}Hk&{guO^6myMY!Y>iVM>G zFs0MKWqwAlXr13blq(jkNy;#3{c(=TrDm+GorvZbH$`$?!gPImsg^^InT`GJ<|O>1Tmty4Ko_GycjeR-

    bR z3_jdFli6r1u-8~Yf{%$emY`QRv+uhN6&S`LBZoYFDPL*BUyAlkSPHKT@sWG#Cnjzd z-kA1h=`z@9muryHm_pTAUNpkf4-1D`52xvvHyc@w#d{OdPE#CswsM)MmMhE5{^kz&YukN-};$gmDYMW3+dy*mG$5V38!mX#qR zeH3Od)3dDCLO4YAc+FX7vrHdXFkjr6L-YP{t*Gp;So}k_8ZyV+?Q>76q2yG($k4-9 z#~wF*s$|#Y&`~6?NqR5eIXXEc2B*EA%tXY8Hlw!v4SKkaehI1tbn8)-&fw#=GMljF zb}UQ$bD0i^1WZh5-rfD&KFy-47n-deR=?mXYG=>g!t;v@?G?{yol}V-_({z|;(2?je4;^L!oD5||Lu^V1ER^xV2B`^QcSWCd$Bnij&;MQ@1??+&FI@1IEF zY2ys(G}Zh*4e%m>eC5R_OG4|~Kc~G}xG#DW=B_B}T@RR0VxjI8%J2(L>bwK;Q=wq) z?Ml(Mmp1Xnh&zHVGd%oWyHC2q3f0|Z*vV|mKkVzy%J1c@2O{;^5X;p$LZ;L;OWAIz zlc>i83t-BO;v`IF;I%ty4%Fva7pW*oH3ti}?|)rkNnMIO9ullB)>*7gnw)qTx$8i8 zU2Py9Kv1aw!qzu&PzpmWfg!K<&5^Ti)e*|X`6bIYF!{Bql;VQ#srf0+axkaURML}G zjA%Ug>rs$XHk#wA1Qch;iK4+>id_OPzi0>4%rG87(dkl29#jpE0dh_6&kLH zlNf0O9azB(&XJtP*vCoD($Ut;dP^|^QPY^?Q;({`bS?J1?+EL&Q4sTiz0uAE7a05{ z!MCx=Wx_mBV#OY!!?Rd1=BBt-g%F8`MGJ63&E|>YUGb#X6c}!-Y9wEP4ev&FNuD-x z^2pH%z75i}*$NtB&?<~Zy_Y29mRzx$(#?U|)!*n!yNx^3*Yg?eIk#&*zAm3$&u$cx zX-Fl2LFfA`wvR|lL-D}^8RA<0D-~Z zp8hY1U@(_|7s098R!Sl$!yW6%g64#vkr5ILBfunJi37qv@){w`CA|CcZHL5y##%56 z!0@BC!xO^@Af&wrkPKOd2+CNk^XM$z!pxwK0#gZm3Tdp>H2EnseLqjL#y3_yJ33&G zh+CKrPkpB*GC7#m1AuyHv|6v!oSp9v@kaHU5L0S6a62azO#Dx##P z0L%ujf{xBsx&Bga%N@FXL>LzAX(*=X@n15to+2rl$K#p-?z)@E(Fj zZc*`wuC6ZMGPX%&=C>%`LULEppBa9HM?wq__xBW_G5vhT$8JJ&iYvjO#Qkj52rnSI zm_xx^0hTX_5+N*N81sT$fqnC0x{O#H4?XCpsGDo6tL_>v)rZg|BqXTk=jT5;0?cD{ zL>|R;eY+04U<}|&&Rt~ITWArucv8GPV%(<%m-3^WorN>@A)+%nV0qCay37Xo+;B{hF`>D6c>!ld-a}w1kfK z0n6o2WONz_tS;#B_aRl}7TT8lB+ZEf}VIslAAeNk*EHmiV3`IS34hE2cp182!LpQ7ZW4Yf;2ntA_ zavEdbil^Cl1uj>WTH97}A}-HhqQJl_2bNd@E`-$>XxmW0VAvlq_@XUI*dZRXQV*=W zG7s#N7HVXfet8IwXUQlazr^~tVt}gt0qrNeSH{^}%0!U{>@A2}*1>`UZm z2w7@rCk4TXSVLIBjW_{!@^wF~_JBajNRVJns0ri;mbj64Zm?n#)cB*8ME#1-*SRRi z2;d8XfP!o24p~VFj_VR}HU?bD!b-$;Y=%zlnGHP6%*@F5ua$bEroIC?aIzXcVIAwQ zQ`A-HF%#nF*UP~#=VdZRFCJ(3~;0K?xq28U2mgVMCMLW1+)Dt=7+AWJ0SWtZ3|_ zv95kQl~H|T!C5WVTY&XQWRBs)5~keE?%-lPTK=~)UHGU{Aav*JqG7x0?%<^Q-9sAk`pnV#M$8bXpSdg579VYb{hMUj!O|7rzl z1bhPsSTi1{9aaN8;bZaO^!TAbpX1>?Fk=(*=HVt=CowiCp^7K;SeO37atpOmV&DYz z8(T}$ODkA|tuF)Z5$98-eZ4!>(!!#84{9!neR~f3F;*|ePA~cEpLo2w&%)O_O^~>) zBUCfm!2;ocn|aQ=4RK%ZnFjKDmAPS%{>Dsr=fBA04CKFp_*yIYboSrT4{{HT% zUKaXe?sFDd4caFILIyhVSr4_Lx!HyDvT1Qb>hZj3SG!D<-*?B93qE)g93BtH=^cdX z2rB<*FcN*5@M;|(^T!*ScT~wQBgVbasKwJA*gi>tlB4OXcbH4?BYe!q--;d|fOXKF zhNiruo&W5r(B8P?AinzOpI-X+F3So06%+ku;rYMWs{gLVasm&&{iVhJ$yrhUEoXX( zrpfra`TvtMq5P+u>Cb}!;!x*?zoMwBKP{FWF)L}>Qc(b5_;yPYW>+?m_#0}xmQpEO zoDMN$xZs7Tl`UQsN>eUd9svZJcvskWI)lC^a3wLZ05Qp!-M&m1HS93+tM4+TlebLk zEt9+~JgrxZOxtPC7Z(#3qzHP2^T)E)ry6}ql)+BG$;NFm-{Q=6I^(5CwW%^Db#P$7 zVu-m3^jXEJ#st-sBd!g9GLpEECb*0D1|3De=_T%7KRI^4PntAP8aeLH2#q8~*O$S@ zHRs-Yyc6daeS50Af)TOcFJ$aosA;y|h6ols{blD?v3!~}=L@mBGBtOY#)&%v0p{J27h*uuEMo+R?`fN2Hdt9ptLZe!-h&g{~ zXw=Td4o@&$=PwSKXu?0Em?5Cv+eQHA=+^_-6O}m|`irR7oM~jH#(`aeQjT9jjzF=U ziMDS9x9m6bNE@9|fJWsrRxhIm{-GB!lDi6JQuB9;y(YoDoyPTZ^_vJgkhpolC*(bX z;T^L!tq+^xy$k}gxbavtEe-xNo=r8}jPd>GyVrNyfeRFQoR_&Hg0@2hY0LG*Pm7F9 ztnllmX{osiMuw`(eQe2*8#?}(MdFY%4_;ubvc9;J6o>zX~$)a-KHcJ;_%+} zA=FBFWiz_R@vyNigjSedg7OFuUyoseQ=n1+bq^cUG*g0oF?>o2FxTLN8q0lDU~J}~ z$EH=e2iIPYFAr)q-^69{@O*Msg>*}XJ&7(|=D9)BrZX_7^7UI&+eE8TeA(Thq5Mu% zbXg2j_i6j`Ydv?)^lntXc}r2eLNf7o$A&JPa@S`LQ4qqI)&4D)XwPwIzTUP0?z-}F z^|QUG zWocY+rMvSYo%b@h(7x0MkyjUjOScH;hSj^p!vr1GM4+sD+(w8kY+&S3G`(OL2#NG? zN*WEuoCC=9 zEUw7zcWN`p36*2f5=RS+&2EzS7`#lFlgx{)=I9rA z4tvR=j40gvKuXUW3%jXm%o|0!(^thkLd^+Tq&JrWi3nT61F1pTPKaCwtDk@0ryWYZ z5LI_5ckv7e!aiOQ@fL+nml(I}yl2t2+@VTsmp$wL@qkjlzT4z|dB8tN|2qd1zu1BD zUpVkD`anhC%D*+K|A}D;(9l18;JI3d%~z8$mfr;zfhvRm6ptICK|;+s?+=(M-jy$e z`s^*yk{6EH0p{;-6+eRtk6uDWVx_nNUJ-Sfs^q>tGr3q~Uls-0OgeKvn^^sNg`V5w zv1Clbe_1Nf>mr5YU)Ba{0&i~IcpfB>^<@&aay84Qb8~S7NnJYAWfv|*13gpYeXT9C zW@oiNfl0#ZqwT9!h+S9+*b)}3Fd<<529=;2erh=^2D?vQC5}IBS~`R}ZHT93h){ZkCE>@GWS=aIAp~r4F&HF^d3xV* z@>ASz3FEbcxbzB`%SEsN>WPZ)k%y>hMJA!GMQ8x3(xA?!ico59Ksj6FSv|=!@aJa6 zbWw@9arraC=MpYysMA0sE!43`uK>tmRmhW>n~b{NJfS?4`I{*h6(} zS3SgFahqQOydgb~aIaB?Ma9*$ra#WQUG7`!MDG&0O{ z0Z`OOo#WbXdQF=wv3vM9?po`**Nr-k{?$8Spw?_`H_I4@5je(caSP{Rlp2kJP0?Q zHYfFZ^_GMuF`4tK`br__Z51M6&@d-5{5wBHU_a3@B(|N?t3`O^QDt$&ELQ_wibb|1H#7(IY2GdmK`opjI9v;s!a|)NP-#KgTX!a>mKEpe znj1hJO=kfxFQ}UROId45@mC#JHzzTnM(z^bRhrhT&OF(DuG%uvxnhsg>e8b+E`Ya7 z7j1f`ZRca^EX_G^v~S7i_=_PSFZeg7-YXgj*Sl#8n_QW)l{9oYPo!4EJ?FF~V44Z8 zm7E=#eYY4{98*>rpRj0F%ZX;v5A5#0^3-Iu4yIwxkS_T)WLBE#mI(@@CSTqT*T)$z zy}5Hf-~0^pH$%%xGP}*5SWya{PDNCRNf_a}+W7@dFjtBmv;JaSwh-A!NUvNr5^?Lt2);J#inF zd@OsiuTQt)qk;jzc!(5Q#^OEup^~=l+ui##_@njbn}e@gr&jQ2&Bn*|_^*SH>j#JX zbzk4DyG2=5d|I9E%`X9yvA4NT`BHL8<=WEI)5Vp&<=wH}^YME1?y#TbD(|a$DD!j7 zesXVo|K!5W>!o$GySrPa#+;LT+os^rC-QZFWcU*PF-F(di9U*<`QiBFByjI=*EZwF ztMO;6?}ryRx35!9_eG5Eg%+%$)8|n^@||ppy~ABV3Hqzki^J2rHEU$x-utz_?|shn zwC<*gzU^j7Pj)uk^sq1D%%IDM8?Q%$@3TXb=aw(;g>C7;wN0B%`^wt)+cHg8U&pri zpOY@gJUwWkRF4i`yk48S)p+nRuk#&~3JNE;!|y+T9t(ACaev2G|@BKP38C|(> zdzskZxUn=-geF{^S?cS^+Io@qg6qsupx#`!f2fqHxUEq9b}TI;x>T9rubv*AYX=t`)^zPscdKHf()D6ODJv zxlopcL-jjTlv4R1Zpe&Ua3@GQhaGm;Q`VzQ#8CSW1FPWG73k!J9cwtKXXLpK<%fPyY(PtkkURO z==QLe+e}dEWDQ**;whGuHk*j5hNOtCtCQaE9UazCQEpV#k%!Feb;f+ z7&kNwV+GSyy^%gT@!I=NlCv@T>TuhwLrG?l&27f+ZCx~hAI;!$AKIE^6RK%4@a++a|skcDChuq=V}9Vt7Rw#1BLCtJvG zUG_CoOzKfOZkZnYU&Zox!Cib(`@8_B$?# z#$vo+{azNZji~2s(lTOg;Xi}Hf8OjwPPH&E5S6(N&=~v$()r7<3Y1EOvY_~EO0Il} zwoW@of9cPTvqMOG;IVpbW~FE@)d7PhVLfMMRZue@x%j~Ry8j2w@&D!f-QtXgv3aqI7ZxL z&`(wt?-xEr(P54$8>hvHL1a|6R-}HZ0zJQrCHm$|31_xNp*d*m^d@nQM6!atwTYS0 zs~+)2Qz%6y{bm=T%ZJMvFYYKskJ~Ea{1L!KJ)kZH>luJP0E~XZ=y*_UO))C)3=-Di z%vkOaQMD!K&qe7JK>)*x5L64~W0I~&uVygy1W94(K}#2pCxamuJ-E9GzOkyNoaI|= z8iOfZ*<@?zywUd&H-u5I5bxThY9qXq0x9JlKzWZyU@^eW>8(R2#xhru&S0f;Ax#r6EE}rzQ}|OS6V)ONbri9=jD*1El`k zrF|f$vJN!Ca!bOO4(F%wQ~_y}gOyqY;VTqycB&UQ?l-Uo8jdBGvuAN{i!_7GlN|wB z7i}8hWS8Cqbc$(9;+-x8^r??PHUtJ!0qY}Vqar4c8l8q@JHW%8djs?$Ow|lqK82B( z#?U88XtMj3V?2;i$}^Vk zt3i#g!UbT^089obxT36t!l*G<{HFmCtNzZzVA`Y9)49~z^&MzYUf?~-WY4U)DXOt> z7RDs*Bclk3N%c%nFK2|cS};GR*7#M_mN;G{-sYHqj4C_uBcm2Vmsa{!mV?8yj!ZKb z!8I)Neo7e7ki)tS!H@t~B8s1|xLP97pzuJqp9?6m?X#Cj0X~@#ofysMHKf&5p%n`m z1F$F(a|HLOVb96V=C|nyGM4W6%&4~rqLRGuIP^g7fHNoAgR(sMonIk7OrZdGB0 z8F-z0*?kd#xM45TsA`H4Lyh{eo{s^l)X(vWUh5#8%wnKOu9^7Q0_iYW*R>fn!-ge` zqu|PG;-aQ>ny{k|`Gr#0amabgktAwPOAiZu)$H!V8B>wcr>3fKde6}YAd4S{ShWGK zN{YA6K4^x}GYKK26gNN)twFZ+ZXxC3qEDM+Dvh?+^!bDFQ1tF0g-iXaLV?om4x~O6 z0Lapw#hf8@-JD4Ky8_UhCV)twg5{2NbKky;=JCudW3tc5LQDk|nQAQ|CIsNezCI@L6#2HlzBTgkxP9`xSMpUJJ{ngdg2V=S6t!!*~32KXqj9JwuZsO7P zergM~VdGIzQc~JjTE0$z8`Mp*u&~_PlM~Ht7V@n)@zCp-#R*%F^2Cl8S6ncx10R76k%_&&!P+`hHN@ zxhI@%>lf8}SM@bzNV+oA-k^hDwzadgJf;7pn(i+T3eg;#KD~EoL5Z1xDXtn~*&Pq&&Y34QM*?ZXe66GhNYRNuKodzoySfcM zb(%Up386z#!?Id*v_0FQau^=W?-P`8p&d#C*jT zdQH9{FHN{c0yT=DMOjtVm*zWK)xHb2Sgp!{Za^O~@}X%@2>S%cN*q0PiOl?9!;bh! z666LEwNk%e$AU+QruI7)l2tH;_-2K8KOse`)do?o7pZJEw_qpdwPz_=DkDF9!;6>; zJ$NUbqoj$+fwC2!)B092vfiKDvFfM-7lU498oUlmA=sAIbibrD_{pepHxQU zF@gqRpV23Ptl+G*VeFNz{^N#OqnZ%E;nwtJj8r(1c@;0l$t4SH(Jw4xZ)2BNt!{8Mz`nRzF~i4+qoQ? zY5Wt09*TAG34!xsu1FFXmTbNxDkknl6CehgU<@r;VMn?4HW$C0^Ll|1T8qrxzXJFY z6CNx9Pz@6f6H4?-zHtiS=-WZ7uy+p(SOWgT>tblf&LzT?Y$%%Iy71PSwwh6}Raa#H zmLziYxz#DJQ4Q|5fcLRm4)hMXiI4#ugv-Y~3ayie;$I*f{J=2`9AaHCfqIEjzm#ti z3&sH{#Ep7KXiB7jLEpKuAJ(vq4LQe{{TYjlEqO&dIt?9(+ZsE5fXp{HJ&AT?>8YX> z(Y0sk&5<0;9(EI0AX^hF^l7DJWW1UyD$aN5c~qQS`H<~Rf!WI>oH5Fz|KJ8Pu|vfh zD2Y8jU`WxN@@08I-7ugtXpMUI#h?q|UFn)j+zQvN})r0^hb&JH4-E_No5^wO(*wavP>P^Jiv;0Ws0qR|)bs>T++MYhDQ zM_ggSKvvtaW#fRuHKZ%X~w0=hrP0JQc)E*~n&-QDeQwJOSs!fe5n{Vm{+n!fne?uHhzWds* zDxe8f8wS*QxT}A-gSp)6MwxNfOWfvtG$$d$&`SBvq0t;UJvH?q!))ZFwk{hBD!C}6 zbh(G{ou*bE-?eaWXbrZFWP%o|AYy+`x7AMHJ~eBJ)P=|~``8)%v|@r8IG-Fk^Lr2G zYp8K(XYePn?z0KVauB6ay^r) zxa(z|a6z);^1g$;WgcaA+|Yt$jel~?YY?ZtF_g5U;O#{5WP?=hgxeZbEKSTFHSs zM02)A^~Q$&ef1#B4et!{j8RLQlDDpHd8S8#n+NS(pi^K#6Czg@)^nEcHtxOwMyTK!t*$K;3<8c|3@aR zEB~0Z1}9BRD#@b^A8y&3qzXV4G6ay9_~(jbh-LBHFO2aKgcBgVw%IQ-T2Tmepn=X_ zexsLDg-kGsY6zPUHk*fM#wpN<>hOm&&rIVze7JDj5<2boe$2dl&c=Vtd^7<9R8dt` zm6ox_(|Cl|OSEX>tWNZx4dHineRMvzbL7N;dC;FCXIO>!Ha>Uk^pXt0zHLMoc~CKG;=c}cwn*+i%0T(X4=L~ZRDeush`E4JjFsJl;dPat;hSvSv zU8DSOF2Ikv^7W;#d1lO)%7##KB7%Em1_{h$;u6eMP=c(w`cEa{Ht1hSU}+s>5hRjM z=dmEjbMbza*k{U;g~5(kdNY7a1h`IE+0ny$CLt@5jr1hmUf+bVHX)CjMqqNg3lf|3#3VM&`RP;q8qw98)sugh!aGr;t^Z&|3m1Oi$mIxo z5<8G7u1Rd!F$ZUn`N>Hr<@=LI7`gnye-Gtklv8X#73A8Gb`Yd6r-T1s<&xqQZ+rFd z$B!R~7micL9>FDA$5@#{oo?uDqMFQD){{nzmgOxiEvSK=Kh{+wSvhzxLtcW0mqZNiA|znmfhM%xz{0jF+n?Kql?({7 z;I3Ldz-}wV^GEV?fw(5W31^1f!e%^A&5)&P^{fQm5Ui+2Q=QcwRX!Urst^4_b{HVY zfPY)`0g9HNjRkHYMheG&_WB6y4396ePPk06o05OF_VG>@p9yO6=l_|Rr9pU30k$8=#j_#NS5W+MJEM676t8@vYzXw#GMf*Hk&*Kn4)+4*! zC4;(yIR0cIwXccY3X()FpnO^;;8A|4n^0Bu)*Q){Cv{ zj@hWKi0?I3-hPvS9s^u#-jz7K=Y;WKfBPzC=6j>8jbixeUDg6?o@)>@(!`%qoEBZ0 zfO@mQPE!eqCrvz=h+szKw4u&fACVs>Dv{_dClLsz5`e8Am9*;D)Nfuw1Ch@(msdv_ z6!$d8TUjM3Z%o@Cg{{QcKvDULENW90#Twn8uBp_YdoGDp_Puqtzf4IS0a2p7pfSEn zh$mdk-k8Rs>{okaDGy?BG|RGr$yi8irr~}pUNRM!iQTGVtTy~O6Zafg9D7*;AgY#d zz1DrB`K5S3kg;GNHz91L(K6{u5+0K{W1B~IktZpSX-)y66#c1yl3dBRbnHosa*<$X zqZ*37@qXcas{pw(x{WxYkf1i#cAU=fBk`^4soG>=^*NM6?uL(kUq0*Tx=fqP;XB^9 z6^FPWNlqWE(dZB9{>Sb&;6G`5ex^&l>enpw4?zD8UA%waC-^7m{);XX5A@f|Up9XJ zCx)pYasP0cUnk4VzD|}+U8La$nz=IQO^|?5NkR{P;}fLM59X7vtZYP}vSzs;`4Mm| zOq?Zx1&@M=M62i1C`Wi4kSiQUjvg;c%m5BK`s|(Inb5V`wmzxj1D4FjblG+3{d#ad zbv8tKQ`OYuT-(;h!NA4!I=YKP>X7e5LerUWwr-|7AdzU|TKBbishQXfn&J$j1up}1 z5kXgvEv7}TOmH0LU|`U%pvKvZp`N@S6%#`yIger~hAlRpZ9i*cHsCEncmuTs(Q#tJ ze)P3-+uYpD8iYNv1GdINHpw!v?|?Qp9`&LDn4itInLboUK*X76U~pp6TLIYV<2egr zG7J~B4NJx*AwFIRz7s=mFweTp&(%iaK`L+!&1g!5LgNY5Aq za4H62G_Fn@$O!WGegvh+0*W3+d4K=1u=fh9M7x(h>J8%qbE`Rtt`}392WH>hx>^qc z>ARh34-_fG&W(2?rCX$!DW07Tpj9DYLp)jBp% z2%sNOv+eg``a=LspbOf@zfT;L=)nfE$~dF#^Xuxasf;lvEi5d`d(-p-=%%_E{Sv9r zW`FgzY7*dg(}=nsaE&}8v}Y)Om{FFO9KcGn&djTA|s6+GvbKPNYqwTbS%d~xCZ5N z^=4{$-`ag!lG*h|=Eb2x7E^@YJj*c!jpG z;RCcCYLYssj?`;mM8K3-T1IiVo&0j&czk~O4n9`6UZp>j)b!5+0=rEUo#?C1{;9Qp zufoA!H5%!^2#9~h3j7}%jBnuo<1Cw_kX2V2F6hI9W!SqVG6ce$`|H8H2-{K_7GEmg zwJc}R0;lq=wOny-E>+DgO>_=jv`%{O8OOU??EMtc_Pq((VUI3z9tX$y*O@j~%PQ9v zmXqoGz3Eb8K07100=rMCEmdxOP}&qORL06{d8!9(r*~)L(@2YFNiC>{&F}b-3>SQC zgHeYM&6lH$co4(RkbAEbq}Yk+QsyF)ZhXof)dUt|8r>rOfadt%A?O(8V{!9gm%8 z;f}wvHFr*r?V8MQ`xV)yxM|Aao{&m3IJZxhh9h`RgMHPd?p73^HVf{l6TYOTdY8mu?jaJ{om{js)sDv0zqGa`~?CrqDRmt0$PA~n| zLDWv}eznO8&_eMwKaH7TS?&HH9Jbz_3X*o!og>`MK!L6XN9t=ljpoO6rZcUfBdHDiv5lvNv=KFWcc&gFbmqY*0Rp7t%`})+nf;4P&e1r4ts=u!(7%&EzS3^6Sw(%pZ^38gd&DWBabYE=kTKi=C zC&qiA`k1uSb08ItYwKrSSELo(<;qil(8;^4C`~c6Kf3MNC$I!`cC`=fX(m$o7ox!- z6!1nS0=_W(2giR$c5}}Y^T@g``6ZsjJ zyNJ4IyLM7V+&*XKi0H7b2PjHF2jMGR(1zBpebU8o97eQC9N+^C-x((N!RtPoEG|ys za$kD4Z26mTgibG+lXUZg0hWpsvQ{6QzM$4y0UV88>>O^ZPU1!IclaH)G~d?HWU5LB zBYBA!%;(FVwpe*}WYb~woVd~r3Y35nk%{mHF zSg?Dv)uu~~87@HDv_i;R2GcL~#m__Tz2^uKWSz3ZwC|y$j)?G)mSPn2(K=li@dZ#J zFuS$$GB@JNy4`F9F^89t?{$*cWcKX9v@?ghQzRS zZ`4MWJcCrzuc6-fU|HRVfX-fIG?dz%w!|U&L1jC6cm|MsA_hR~YLr72EU^aEFg-K_ ztse|&#p7WFiZjfb{J;IQoPOuqw3a$$M2Jy>s7Gi42V1~JN4+$HJh{2?2hnmi zuE?i80sjzW2Hn!T^NSpRXz+J}B!9WffAf(4M38?`i6;Y_|1A;vpHSk!kpEEP=W1Ox z$N~u2t1N=wqH75e5RpdXBbn<4h~#Dl$dSmepcdrjt|8(|k@}EV!bJqkj$_TTNR^Ty zW_Du9QR6N{(h^*oy73REx)Y*)C&+NIalKBSoo!59e7h1lUzhc|asj+jIG#g;(?E@f zdz24z+hq(=5pKlN55au!oT+x|R59LZqPh&itQm>m3UV-$9AY$NI7bMD5Vb5?l9-;B z(uon zk#xyV|HD#2mQ+TPnvNyENj?(~n#IUO2q)C&MS&< z(brP>+k#h#wPTKh#$efg?Al`S_dACBFouBm%S2E^{51l{V+Mdh_V|)5Itg?bFwEV_0m(hye>})!A znq~Qizhr3M3y{Y(6YqHz=HRD4{EssCrnZ`TX*i^XR&NWc*IaELko?KYWKC#odcfH* zy83|dH>(9ilaa=i^>Ai&G(hLaCO>p50W%s}(GfESn$1=9cy%7^$g~VDrt_&<-`$yCO42Pzep{D2p(+7Qt$U!QeBk2$T9}lg z8eEh4J36vvA@mM3=J;0G6W`wlSRWtdLm`NVH~GQMZMrLBx9;H?T>J`K3NI98{ht+} z#l@LX#uvf=ko@oTKLZ2+K>n}&@&B#_bo<9{WK$mYdn&AZx5p!c3n(>=jMR*s$6mr- zK`*;%uUdAT=Vu)+1}Xr5Y1#;(U>ZR+mbH4lb{o{eXY z9edwhGWQv`D>|cOueycfH~Vu!9cV{bj8>q1Th6*Q8eTWgEAg?Lw&hYU#+vKi`^n+!`GG87_(Gh!o zc&HA!;N8#P(w+Q2#k~bkUE8uQj0SfLuEE{iB|vc35ZocSYj6U=-QC^YT@x%=2=4Co z7U$f&OR{rb?UTRi-(wX8lUdchs%MWL-yEa+>-pLDR;|NQ8`)A48t}!#p2%&7X7>-7 zZ00SVALUC&WH<=)cBXr+)9ab-_d9u}70!xqukl+4k))cNWG$8pKexi?Z1*;?X{i-n zYoE=|KyZD*$ZL9BZ62}yxZa!ncDJ!~3;i(Seazc6zOEQ|&(GZ>{#+Wjv3&PkBj=^7 z-_*5xZPN)Z?apo0HlxSE{)MnQE`&a=0DR=hPk!$~$$+KhsWRjT!ZNV2vHB}vz<TqYyUMPMg7Q4(_5H4^;Xv1&<=50&Yg)ENOHphhDG}1v}ZzV_-t;hzM6Opyvc7F{=bcvE8oHCA$6UC$_0 z1rUwXe%r3uzmtS%HQCufnM_1?mv4KwI)Cmqaiz4$mM>O^9lY_Gi1u7fgPe^CS*MC< z6?FtCNkkRIV&;o0AF-0w^~BH%XSpK2^%Z(rf9L5t9-Ugg>%t{-|FZCyFsf{?8oY!g z`WG-8Ha+!dgD)_6$f7g-v*KWi3bMIHQ@;6!Al4{D>fuszq|h%ta)3=XgmtBJNqYxr zp6U6RGGOfqZc1Me*MlIfTEENc$dx1Z-cSzZVi=BQO4h4UHOHhPhObk!$x0cEhg!&H zc_SIt8y=9I!vxYaMAz|;-%P5n^P)J5_sVZ<`_J zDPekw{MMCB2-;a5bL~kv^R1d~J6IT0$XgTyf02ao)(*cc=3z2;T;_b zL8vU%J+n$40{;z&_sd~o>dtE@kOCw)B8ugx#*?{}=Br8+c6P=EcvimMv8^eDJPXjd z44kPMh#%{GlDxu1v&3WIziKaj151g@6t^^v_Ax@n_et|uEGgXYFbcW3N<2RHX?wg- z!n#fv&J(Hc>spmFKW>0S_<8NZC3Q*~P z3|o=>f~|bn`9u-<2?U7X~VsQ(ZIrivV*eh>|R@@^eRRG zpcQ++&+Ln3dfRv5F^8kARWp->m60{JOijz9qhUr45Z)S9vXrjcRxpT-5&}@zMYKWf z=D|4uq(a8vU?J}e`NTZ&OB$`hr-R$D%zENFL)2a)u(=qF17i+^cEjer{J`fbDn+L? zSCoDSJ7=8TR!xxVv>)#C(m>2R4DGCJclQf*9GzU=Z8SIaG2w!s5B%kA;E{`mSksU!Y){k}+)yoC-09#Y|fm zFIp&$dSgR>(GxB{D#QLN3i2Xp3!9+TMt0HY#>%YmK#QPx6KUaHhXu%YCx7QKBMkO+ zJMa8g$4K5gI6k}t?1zM#%}L8kywl{5UT`&qwJy7PIA9R(cjgw^1PnJ(wN`w|v!}Sn z$H7oOnXufG)5M34T~UZ>`isu3>u;9Bg`@!)cl0s_7WU_vL%czaoW-jDc$ERBj1*t( zmS+N-ewA^-6D18ws>gH?Q2efZy;>s#n-7>D0yTq);h;EVYIXDush z>AAE=DdHv)f{EWUAyqOHds=(X3jc-Z>rCQyPOIWvNHaIGWk^S&gPCzU!I@O+PxaAX}Ji=h6&}Oy?xYG3>&H- zt8e|-q-S=jM)sD?%tdp?zhpxIFGagCe2 zJNax(bbWg@YM8g6YlF;n|V9F7Nzeak}*N%zs$OV@UB12P4-IH@f(yDpsS zZ?Y|H)N9iyf{b0heYW`?Fr9ewkTTQFCx)$2)271WwtFYH9_Tcad|I2?o59qmoy%9~ zM8l;g@NIYU*=Q@ZAF9R(9-_rj|>9Pq-U{X7OF0`BI;W8$PmAWatArO-({awqs6Dr>XiQj;xzg z<4r@ct%Nbizd%{=LDV%cz=NK===c5=3s{lZ!iFE#qrJ+e&vT1wnNDtJE{7un zt{1C$ELJov8y7>ZU78VRuWg!kMGqBkPWAo_k==j#Uqm+c1Cd1m5ZTx>MCSJ^BD*fx zzcYh5e}J(8;4#s(mg9YwR^z+EQ*6|%c{sFF6QsDCVw&hAOsIIZi1)#U?ZZ1f-nC{s zEol*jrFUBfzUBFoX(!e%F}k?T9`NYr)7+G-Si2ni82iws`vhf%rC$1i+cxMfKpXgm zq@qa3bxjQUO)1LbWl39ii3F-seW-wsO_qLn_=p3tt=ac(95=6BnD&N2Amt^TLxwHc zEs~~p;QRXW37w|=2!30t-jtVygP5Zg>eRKNF-QR#lnoQ3M#Es1lUTX0`WAUEuOc|6 z!xDAi6T&7%#7M%3*Dw1i)h{;>#ek*f^*z8E1TuqrPC7!$TB0 z^{qebBQD`Sf%-sz97aT`3e9YyfL424h|0-Xtr%V>pewmN_6g4t{PRoPG1^8rUN+5`r>Tw+jl-RBoIL z7B(yGB{%w&BswQRUylgiL1**(j^&cjOt*DLN_eU@4x(x^Qx{T z6-x_~ZM7jMgeNk?Fu7XFeNY^ZEOs@)%~ErBr>Gli1UzIALJ0Pr1m+?M^g{zrK_C5j zwOl}BqYP7##&9*zL5+qZ#|e8`Nf;!QA$8 z^Q^L)64}mhHfd_dx5Yw-q++q2m|c(jupf&|Y6{9K-{O!IScSVCIbLkveFHJUsybh| zq=zIWSWHPss?{M{z9`xYFlVcp$Hz?_MR4yaICz7#A&XL4P~F~5SWx2e)u{)~Pw8bx zYp4Y;zU;~Pns&JrC~2idTEILR%e)Co)TQ3+n|}Yi*$f6!kI)vK5m5$mnEP;vf&thG z3XgJjr%3~&bcxFFE#T;4;641xG#nVpnnpToT=TLH2jB*I+3q4Om!few(i;Jnq9u$2V3K+AhMIv@Copr*{*zF8dhT% zfI1B?9%As0>ee#D<<`9^&)OUD0*|}(+YUZ&J}GpW*J|W=0=WIAp>?;> zF=S*%@6|7t>el88KzJ~$w6WQH<76i#*uOr4wPeS)ff{KkncQ2Gl|ZCr`gq)d-^Jns z>ydoZ{1vbr&D;&l17gEdeE5Cjzz4*Yf0aZ0-v#xbMQh^!J|#61y1ZfFfF5o#ai4fK z&`=Y1t_rqUK}@q*|A97D_c6WRVAW6P#3n#mWMM;5VV1Mbc2)lZW)C7cx{hz@L7h$7 z>c$9gD94hX$gu^@r!J+uF6- zcEwcJN6pYGb|jlDH_vhtxT9ztZxgF*HughCsc5oeSiE#GcJ$U)PdsP>Yf>EKm_Fy% zvnjlyf0#=M8BJhoU8f&`bZ=hO7&s-pcl_F-v5>~+qIf28SzkVuI2JK~h-0q4?dtDm zB9*jM2XV(_L|ZHkReh|$Y2GNgHs&)Q#^pg<_~|`z?L(3!w|lK6?(zfu*o+`{4RYEJ zNz<-vsy;H8G1GR!3Qm#+3XJe29;;b@ql5VE9Lwd}SEnvdB$KuSuG$gWw&h6$sNh#W zad5h!JUpNQT&j0lZro2>m(!aP@o_5%R z`9ReIy)5EP>jL%)_H)?4XjRME87*Hwx(9?S7Ap>6xt0E=lv+=UCV$_GY+PM{?Kwm%8XkU;hztz!rFtM%5t%>1 z!3P*&&2rCc7vhjg0^sx-1V=mChwV;}hQ$|}+OTl?Rj;s{XQtqcS3Yi=Od+JbY zhHJZZLZP&Np=*i38>Dt@JZcm)bF12^`Y<*wujE@G&qyIF9n)S;KJE!^r$j*SWTcT2 zxpZ+8J27QvcNDkXh|RuOaJ%@frgdvcd1_~X+J)8{E7~223$xr8QV6q4d{3}8+?ODd z$P0%My*ESg5*nl#{8(Vnn2aA9HjiV2QQsS~hc^+Z#zM|&R@$^ET1M?dihx}i(d?)E z1Z|o-r!{PYH_O!)n4Xbyy>Yt6R=mxggM54v0+kb2JVNK4dNci@E{@LknRh zC4hV(5;>FuISY->svH~(t;|ZK?315;bO4)49;j0dMP5TK2G$^fdH~@YT^7E&yK2IITy~Oz{+P1U z_L7TO+!9(iOfJjslYA0;qiBub1#nANGgs^v(sTm~ru$Dxo_)2wMTbM;AQ(Vn{AiUh zCFR;fzENj6Q{MQ-{X4~e?#F9`TEk}Q9x(IOKa`J3D#(o8!<_9G_jZ!C~7o# zr41UQq!vU?sT4{-deK>wZ2uaS-t;t3p&+{?zq>;@rpb55$`kQP@tbNTdQu&x#!I#J zu0;4$*X@ThS=c=2{vc8%et1djaU)yiT9dx=_imBZ(I$rSA2XuAH?LI#SbfD12nIhD zwZ`&un6KXyxRdtI9i6kjEJ<`TMJ{IP3~+UzYGD^}{Ho`$XBEkhzV*5ub*+$1Gl`R5 zrNhD@{kV^vD4C$kqs*5I8u_ykWAv9i;G>`q7AOaV7%XMPfl)0P%FCtW!DGn$h1di; z>|e=<5-ok}^vh2fVdILFtsr$N_9n=4C+oRXzbTVg@i(BoaC!ue;L5Canu7kOKC(`y zSx{5ostm8*1E8~dixHp>u3mIKyx;bKn5gzTNry?!cC(szOEfFNfy-w^cqFCjm>3eI zwJDTMKB+;xP+H28MBZLAFsWhWNQ_OZB5a0Yrb)=Je%RQcA5ouHGjB?gU1am^vWpF| zplv1Si|fK3Ze^&(?E3c1>P8?C8Kf0Y>dN}p0~SQ(p&)qRjP-_QnFqzHKBe9kwgsBe zxff=#0TfHOU@>ulZge!6NfMGN`ZMCosMO+8ugDan`$TLW{F0+7Pz{3nio3s+^ux7= zQwbb@**b;kvWL^9VeI+*E5?~=)KfVHM3AQ_^85G#3y3^8|Bv|c&mta|fA3Ef5&A!I zoFB|qvPsLK>=xx^pef9VFF||y87euwtaC7_phCG*uKskK zt!od2Fu_<7J%eQXe0%KkQruKFM?>*#ll~|})djbTrJo;@@?8pfb;aKPD(0&p5z_vQ}oyB^6bhED$FdCk3HO+QiJhX(|rWjKSOcx(|P$XuoqE0QAJkGXFhIUen z@*E}V2S$wfoDC-M$SS^-&uD}fAI~q`h)kO-e`YhoccFFWb1m=_PR^|9WSWyCf)cyx zp-r?5zqQ}e(G44<3$HH~QlFl*99p!rYOX&q&OOOYj=RSd*GedBXj6|p7&CSyvEMvT zXo#_~B|A%D+fr}pubK48A>B6J+AEv9T+?t-jysa#wm2wZLhifU zt8rrmwg+^rP(1v7mRBHP`P*a~`6PfgA90brx2F-O?{VhpjU4hDkOi%~%P9KHjBYMU zgrAU&5&+qF3~))TBpsZ~I&tBwG)%RceS_rK(zgN~bXT zjrCvway_;64ZgI6WczhTE$6G2{d1bkqN%NUtIzgq?>RrO$OO#YWV&i76`|O+*?Rlx z^pRCW0dob?M>8aM)9T-{LlRMd^vmhK!;!ErBWPDZ#Lo_O0LgA&XD(}iRU;6r2qzV= zko-dRRosGWT>QrYR&9YtZkON5{7pdf01Et%0h;&!18CG_UPlX{ zrm@|MA^K%DZlI&4I@G-Cki^=SKo*AJfz) z`NM<$S_0zt#$=Mg6cCMk)7PoC8)lK9;@d?Oi6?Fo)M>@P$5UNJPnrXt>WHcUyF7GOBGm`Lr2xgxKIO8iBnF4hbvd}Azv=V$u;BQ z77ly8y}Snf$P+h-FFv!ifaPUb2;>UmloOYrqtq+vN^V2fVNA0MS`nbvv)u(8PkXZq zTxD-gBpHt;XnE|zEnBsEc9}<17ys%7gPh7?4bVn)cDRb&qFKWID|<(vNns+i0weTY zFvOAg&w{Yu*zwAg+&J&RUQ`LTD_ZOgM@he=dQBi6;^iAPVe97>mZ~PeVInv&RMD!M ztFZIc%P9ck7(Oksvn>O)?O^)MF-+y~qXxYVzoFf#QB2TG{rzU@5^6^`iwrQugcD5Q zdkWA*oUldvL52k$-WOFSGI{|1LR@K+J{<#4wEm0Qk(SNquKYV;n4xxwBEfYU<$MQT z8bkBRX1)pQVx5wYIv$}WG-!lav`p|k?j;Fg!A@1G^5B$KbOh6l^dXw>1ep`L>lJVL zj%%5KnCfrL@D)Sz5jgTjYH|6J3%M#IQ9$cglk&H=fvstaF*U9fxJ#k=5BEdTJcgX- zJG=*Ou&Au0T;;f4>o}rT3LIEvo-VjAMM^*a13K)JT8;pCfB^&-m2 zNU7mg4z^kA(0tzGDJ1s$<5@S?3cPGy3+c7ImM!@DIjrdqlE6o73I!tUA`nWlrsb-B zZfu;cXzQ<7)D&@qJaAK7dfXof=TMaPtKkcwBlDE6H-r4>tG;p9#!0V6KtkydQrpN7 zybW?K>E0*mL8wX2Pk|R+fq;w^;SJf(6S?bK6|xwbbJl_xthINu06O>v^S-i}`Y)$$ zSQ7iXpn!s-r-1VNP(up{LQl!Se|e|2GW%z-jo-g_b5w-JT$sS2hs%naGP%?YdiErw z^Wx+qwPnJF-fDkc^jPVZ+dP`NCcC|^*DS-P-chEU_@?7Q#X2&>F5|iwx-8}5ilCz5 z`QUzWKR?H0)`URbclxzy_JN59#pAV~Or&J_RRW`L{PbR2C^z@U!&nNHYO1M>qMq>- zhh?hL5@E7wHjCWWeQ(zc(K&5u{jpSb5Sh}U#@hX8mWk4C>CBY*Mr+1UW>yJrfd~P? z?oZK{a7tPG;H8VRN^cnugKcLp59CJGtUz6e_hyn`sW zPm{LHeq1yZ`6Rd2z2-E>D`sGT>p?(P;9zi(0-Wv1;ePLmQ-C{ozjMX^E`9151lo)Q zKp>W;a*)W_>XCQ0rmov?-k|7UWuZ;xkM6^L%EHiswPJ_EOsgtkhjf6{@0k6XZRBn! zq4dVi=*A-Cv)dU*oXp!Z(t|NH*hV{hA22R0#4i#mHBF*MCH`d_kpwSbyRWiXqKS_z z8hHh3Z1X^Ky68W>lMF4%*9nyie=83kr|dW)7Q`J)#92Vz0{qyMM(>YbsKDyji}%ea zOH-~Z3YDVJ1fZ%mRSb$W1%!cKN z`s5r0CfDAh?R7?mxzCQk2Frdr^j@6_4{-pb7EVl{ShAbzt6VXcfgb9O1m=MVBvoMi zk?zJVjfVZjN>e4vF+$=Sx6#{;ov!^lv4*&}vRI#w8$;%*PY&(e#J91Z{9z;%yDb}l zf}WoG@BQHx5VUarvp@VzAan}~_KyJ}%O60fMFv$4G0hn}EIfS$-U9p{^vxI5amX0Q zItXZRRFYa!z{U<14NFBOL+@aBe#R#dSZlA3#zL7Bo!a~wEj&bEEB%0dovUw)6)P79 z=zdP~&CaLCuBV1Zn=MJ8SEuX+!*QB}sc{sX1xrT4OK3FFaxsi1Z9-aGog?NXUf!o4r&MS`FIrUu3Q4@6% zTVOI5Zm2FSheDcIj}Mj=w-68{t=9HpJ0->^H0QugZ0~XjfL|6Ff_;1_To=rO>#`En zh{i?$&+IlX`*>t_ddHq9(V)2T3K1@`*@hVu4Yi=Ob}mRJ6Pwa%$lH{|SIXAINSWPM zouz6zV)?C|&i6N4A0T(H34zuS0B1b=A0|#e_lnPj2#;g->d@has^Rjc7evb#mAZmm zvUh~X-|=Iu*bCXN9!*qKB*z|tpn4|*xuwG*Iq@Xlro6TbMa(X}*Ex25z**|n&`ABZ zl|OWvX@qUfG3PifWR)7ID}uF78kn`uq#&d|0$~@K0A5;3#!{6i_dPB?{wnwC)6g_D zDg0J2-c2#|Dodsd-gaE)F@7MbEVNX&*P~GlR1|#7)|a;uuO_~hP)+eozRVP1i;hlN zG*cQ~!QPhVPIAw?!y=uLY28zVuQDK4)E!3 z(mK&Lmw;QhnXhA%5@F!)&4AQ=54H-nBG@zq|4Qe2ykF)4Ic1)Gpu-}^WU+(9oFxaR z75=XacpTF@RLdT1 zWNyKKspNThRSC&3MXW;8G3PK27V{z`WJwBLyR?2l7sN09ng#u;%}WKn;I@&>G!dNB zn9^8XeSN41I}d8%^jil-Yo#NybqLf7JKcEaDLM&e!uME|!<2dH^4_>_hmh6Xr>`uf zXbDvDzp7*NLDZyo*PdO&A&H~lAgo;frFC7mZcWQmN6e>y^7~Lj00=_Aec}4o((}&( zp@APj=wHQu8%uU`Cw_-pE!a5XgO+hzsKK1``%13vHK~ch3##YK2J)951B*c|#lnuQ zzBSCYe6jz$%4ExTAeYcSc(*k^zv^1M8JFX!XBO&FF2qMYR>|?0teUr4obJC9LIgV! zF!-`=i{_I0Z4UYB!sUEN2K#iwYSNd8FiGt5O&CoSC+GF~ogA8nV7v|tvSyC?-HDrg z-43@V@i$~538h*L@zJN&=O`C%J<2p|G`Kc6Ig2k_8m6cujz=(Z!{sLpT&8s`TUc)# z9ZRCDID6+E$3%_8C;FU|ByBwM4u?4O%X2nFyE|{Hr;OA|#XapW&Ms=(=$zRG$!A2? z%32~-WM$sGAHFQ0wMAGy(@_XIZLZy@nvpSEyicRZXfvipJc!~8$v5W?L)5%NU+_zlz1yiJ} z-zL>_c}~?0MR}>uz(k^cqS>{{GJQk`_}7z<{oebk0faP98LeSiRYpE`y!w%T5 zhA~7Ic1qx_ztW)?js(AfMjlRtD~19vSMbFQ0lFyLe5oXCh%V^+e9din!fDo;GSJu@ zt<_tTa~hh@3n@C5JqJa=0!dIos{51sQMzZx2W{M{+uIMxd-UTK$7yI&7FYw zgSf8VoyS~iALV0y>k*rG>74Su-Xb?$R6Vys$fBGqk%xSI?B)1D?dA!s5XfOh0avY} z;n&n~Beu;dY#;p^@_KvTz3fjmX!(`oEsUwm@;;2B>#94Ob8SJX2k!Ff|3K9On9C^G-djZ)4 zHDsJ4p{9Y68p5h2zWRrzfsFK&#ZjXLTi!k!r6I_A5WzvAE`2iQy7~$N47?{nK?pIy z86g$Zp0e6ZyUVe+e9$@yiHjU&*&_p)y-6p0WFg}WkLB<02*T#ooW(1;bK~;OgBiu% zg+_7v6Creht$=h%Ob7u_vV6>!mF#VXlV_BORexEeH0Z3<0kKM4hM*qxSX~C+6xckC zwStL*Lk~*1k{tM%w?2KoL)}|Y64$~NqdbT$_>?u%7h*OZvj-|?h#!kG5{Y}P;qxH2 znOAU;FXS|1{>RKRBUyI3Xr<81FH7TaH9;7_;zIh|Use^9u5;7R@@{TT{U6zyQ#awZ zvC@t9RjfoW4P}ky%~>B>CDD7lwY%;zHSb}bKy4ngOmQ$^m3f-czn|;0fICmcML*5; zzX@e&AtwGYBFT(@L)o5q3*#7rmwk(KY84D9B_kQRRncm)_`w9PCt2Q?R1gdy2way` z@}i0#vhxU0+{jA21>2Sc$HYRNP4v%&0juB@o`f-8aZ9jGQa77dv#`B?a2z{#;u~{z z7)_wyIZD25EQ@=*Z!5b!=g9f&V|0D8j!&ano}OD&w9A#JUTZ!VZYZ1@-#aF)pqe0f zrHr=u?yImL=5aGYLu>0p25QWEB?$=$e?{#^y8^9vx&lT91_l`e0BM6bba;$uc4nro zf3(YFb3g@agZhzzE?W4ct?(iLBh;sl{g{KHr>Dt8_S^eXQAtR}>!ZXM#5PDuI1IY5 zl<&a$5jt~-5A^dhvT&@mKb)!r8ojR{^BGT*r(DR|a2A!6l(fpqn-UcZ+|m*x&dPaT z{tdv=I5%zfaYPtE9qEV3!WucXFgvRnzD;Z_uO5{lL}08F;?ggQu}Z1z#15d&PvssTWo7XK+V$kBm9?y>sSNuvIE`|F8SfW^62b-el?aT(p4QV zIPIW6oCTv%Sz_YiYRT}xsIoJC5A#S#bra{=ORHtdCzCb!;oQR$0l)>ag5v`$o_vp=&y1fJzh@ zrixByx){>SHCHChWA|XODPR@ys-(v%>C7Az?(J#34A^)y<-2*&ijEoQ6FDqRaT(e} z81MJ;{BywW3H%JL7@}kpZFE#rt`^I!?rj4Hd{?RBIr1{=0Irdi#^$oJG7K*XJ_1^l z=Ai4B7yQ?8GWvQ%Y}hR9FJ3h90C>oN2W^&muF6(NC_lwaLig9l7VlhqfYk%7Ot`B~ zRA`2EVc_qwj5Th=6oPng&InLbo@URe8ig(kXvl;bWBZL3w3fylT zw@I5C(OWi<`AwqjifptrMLsfmdaKl|L6h}*?1RZvGgbEYeqA{HHFYJ#;2Ph7lUJGQ zmG2oD8RfgEs^)cu>Et6KEib#yL~Z+3A`8W~7B^dE;L}4#Mn;$d{Qbj#n)@ADG1FPS z7?m%Fg!z{{;@-U#(jr@;9OQD-AjCxO3%ZTRo>y+Fc-1rRzX+v&K>PZWSD*C)$Q4@J zy|^%e8{R#N{-{>TFj+i;@<;f3lLW1q^UKS&v4)H6?P4%hg|?4X))0AB%B~%GIXO8` zt)MY=-)3ZC`Sts@wiFhcPL*mkJphD;T7Z$P5(8O>!MquIxW8RA%C~AlR!f7h^B}8; z@C|aH^<;X{zJdsWa{Y4c4sB8@_rPbiK~UJ|{17WU;|PWLEzUrGk4HSKk<7;C1$YED z4i2|>l&4*DN9)nFzBkkjJvMVZ(_6i$Wxv%pAQYvB6j==*)3jvPl7demnWSG9N*HE4 zQHI3}Ep-z=!;Vy)ku0RWOl>JHPR3<{dPmv#ZEz#(LqRu%Z$!+Xu5l7{d(8z}$14xw z1v1Zz-N(9OkrS@6riMV+)lwyDtq!r7d~?=YZUy0Gu$eV+rcL;Xc0nOBU#f^YwM9C; z4~8~0rz50qbrQKPV;#D&q zC?(f`#P`2pk0iXXPo^d0~D1pR;pu!bUBEYcl!+z`JyiqNQT^C8`vahaE2ThBg5-!9ao+`H&R*%DW6S-E(a zeA~)jrDLLSW?4sUXJ;qY5->gO7(<19Y^L8r40k9;WbTA@zkH28xvaA+=?~zLy)C~y z4J%g~>0wQ4x5qTtbd1 zukK`J`{du^>cX^|%(p;(E8Ef(7NsZUe`$-h%#(SV7RPl6MYYZU81!}uwcBbF#4g24&P z5|KAKGo$!lUOzlSb2nW|z;7_Mf4EcUbJjs;z#(A$_DUPv{z7?jCk(MUa4^#|(BZ@Igu6}ZT_rWs{1Co3x%$(IV zIx6P=y^D6i%x=@#sn_6wX$_vd!;5xD-BYhrNZ}rpMrf_WbHl0zi8iY#Ix@au(85=* z2W$vqx>tD89L%Z$eWhTir$5HMH^=lJPW&uUE{GjM{AgxtMBD|re=)Dj#-r{F>Q{mn zjrZw|B#v>H{UVdVrwWc^Ms6=4L> zgg1x-!D(Ic-ru=j3ua1^xR3@mMxG&muMg7lnsMF{&VJ-J?5U06VIn=t|nY z%%6rLeOfXxHIqU@4|5a-;!!!Z|5DEkYgp*^{p9%~k5?3TUypjpg&3o^kMQ?I|MSZE{i`sX?5C-ldW zB&}kVZaZc-`CeM2n!aQyE0$Z?a(S?i#Q8=W_h4|!9?Hf_@+E{0XmTr%H}VdzIe+p$iX2QtN5A=EunP z-pBq`#h=;dc|)e3A8sE0FB<;DM$a1@{Os~WgaEJn?|MA_YMtlg%1=cBKSs9qSIYkt z{%3Z1&ieX9&-`O#dp7}A`~Ugke`1m6oSaXDKR-scw+Aag@E=jg{%V-#jB`JGCI`n~ zbo`lpo>P83RXF|_+1_ouzpD5XGd*Waddd~}F|xfg1OW1XVM(%eFro$gC@I1LLHwA# zPrvP*V1R(Z&Vd0iSUv&J5rJl1N z{QR&%CI45!e|4VytDT+~QvV!=2&8{i@n=?gUP}9O7-EEI_&+ht^LmG;LYE&S+gn{5=&va{|0QwX zuZDV_{rprz@nd9rTj=~hwEdaco~OS)B~}38?e+psG z&tsnwJbsL9Z*iOdsO!&c_x$kf=Vw&y@SjxuiTR#y{Qn%48J&TC-t7Ow_3`;O#?NaP pp8GEv{>)U*-^G5${*@noR`B->1peabxsm`rqkwk@>AljY1Okbnas2`2&{#0 zJeC9Fvkf>>NOF8I7~FRpXDhNI#6SULWh4h~BodjD0UgxRXfzzR*X!kkP9zc$IYlnK zjbhxkIr&h2Dq5;S8(dS0p5>$~LhfXduzwH{J- z2Ecb>^MIZRM8#LS3SIB@X0y3Uzi-tqCqJwMswGItav_z(;XR*rYqN-hO$#j6jhAt3 z8HUW7(@L;H8;c|VYjbBK!wBv6+g3L{T7v_HtsayfkW5P)Xv1~gGeMBCIq@<)J2n_} zsxQD7{C>58|FZRY7mjlUXVL~Fb)VI0^@Vf~C__Z%BZvhqdZ%&xefdJ7OC)+Gh`N&W z65_atU4Ykl>OwpozpDWkC`iR((Pa$IQ&f8eGmII-Tvv56Y+~ z=F>UF%wECVEg$q|C^lbR?rmNWK8B}uWSPj9B%9+JuIYEAyMy;_o@y91udGqw=z9Kj zk{sYJm;Pn*IE*(oB-D#90Mh7)K9c+%yr|z_x7+P=iXE_C_Z;{sPPc&`XEJ_hgUCxb zG>5B33GEns2;R$P{SEa6f1|)V>@suuoH<>?_Z$5Lb6+My-B5V700000NkvXXu0mjf DfCpVl diff --git a/pandora_console/images/Header icons v1/Auto refresh@2x.png b/pandora_console/images/Header icons v1/Auto refresh@2x.png deleted file mode 100644 index 73aec57365e65a0ef3c2860aa1aac8a848ad0925..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1838 zcmV+}2hsS6P)pQ1f zwrtstW<;Kt#?MYuSeZijRu$)A+C+sJ@w_0pzP|pU6qRvRN=izGR9?Dtsa=>asWLG! zF;8V@XJ<(YkCkeqqM~AklzP&FrIE zn-Q$#&Lj3CauHP=F=7lVVFbtz!lfhbWT>H|9B^KQ^H+#xak$Td(4SH&+@t1sMoUXe zZ=G;907EioX#ckBHK}IM@Pp%UKG#hrnXj9Z*T9g zfa&@|a+$-{i^(fS5(~30VAiY%fP1D-pMLA^-Mfe52>7kVZ=3XN6b)bVm`?=IlqzA{ zMzO)ydGb*jTuDzZ?+bx(Qb5@OeVITpz86L(DZei(D|>C)fcA;)6v1p%9ynrZlL7=ZJUo1Ycc$zlyer8s zu1jRd$e#!351b9GmAP3P4^FBJ@Td$--nE{?EXlBH)rbPN*|X&pO8}~2;<{rX-*m`} z;u%x4-lGXA9pE|po9A1U=yC|CyGFoNH!dx!f=^>(<199b(zs(d%A70LvvvK2!yG`h zx2+=uTjBwn<1@Hc{W3B#Qo}2=+hEKuQjwBw_rvr?bI4bcsz>PE=e|!4pp4DU%`=CF zhK>Nd$agjwpf-RqR`<(9K;OZaVP8XCC*CT`JA7Lq84|~d`N7txqHv2qNMBfD02K^F2QkFVe|( z%gf8(o65Je1s5tyXsgS>INy%qZz^hF8JSs@LCON9yY8mTup^eRML6M1peGUkA*=R*|CWj>H&97Si8f z-%ExMv-cvWHEy%|qy)`Dr7ja}DK9eo zFHrT*Y~QUY8B$t!Z*%{9rpl?AGGDudNj`0G5`Po07*qoM6N<$g7JQ4YXATM diff --git a/pandora_console/images/Header icons v1/Documentation.png b/pandora_console/images/Header icons v1/Documentation.png deleted file mode 100644 index 78bccad52a55abd56bd045beed0ad5438f280029..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 466 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc#=yY%t50_}ki(Mh=?zc(M!jHid{Wj978MwpHBAm zJ8U4(n#|4D$kH+UNjme2x1tfx`0lzoJ#rCIH1pIusI*(FJ8qHZuX&d{-(2z9>l(4j z_VLd&t9dh5aA@~EcFg{}Xl23I+W)3r&tp|RFYz5NSif_ow^d-k9hZeYSN$it)!xxR zv1{Gb={)@gM+HhAeT}~?A#e6ri1{AQKu6{1-oD!Mq)i~Ei0^ODD zdF;&D+1c5L?QWqpo6Qf?>GTEhrBdnPZDLqK{CGSbdL;?6sY-89uh(bN(vcvQyLTu#9^S+-DF*a09Nz^K7*0J(1g!c5*{Ca7^6#h%8olS&dM& zG%5=~W1=$5iX3Jn$Jn)s91i4IxdF@N@)HTD?qzvkN@EM3JHmL7;KYtj8T~kk5O9n= z$8qF$35-9LqtWOqF|SBEZa-;j(4%*Qk}gRvn%5(19(%gXcM z602WU24f6*A>8=g&0xS_)5U9 zcN)kI^+WibRjbvv?RJ~~+)!IqfD?FZvRAEE+e(szbbqyFZIVwil77GcvDIp&K8vL7 zD*52eFM;vuaQJ_-4f<5-*TJKF2Ke2ut6`@uF`VdK^o#<<8}1PD0r#002ovPDHLkV1o8(d2s*$ diff --git a/pandora_console/images/Header icons v1/Edit User.png b/pandora_console/images/Header icons v1/Edit User.png deleted file mode 100644 index ad2d1c5abb8e7bfd49c1cbf5f1771a039cd7548c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 826 zcmV-A1I7G_P)35i1PMr>~$trWGOH=!U17D>H`M=xT*_y<%-NPAYnF1E6PGyRf_Rr!!jjyCX;zdz=Y_I{9u&g@%VGT{mo{xDr9rw&_l?Tj)~*CtJmwD#eZ`+99{=sl57`Bl_1Mx z*`Gb8F8FcLcjxvTQk_MuBaaz+z{c6j=ktdJgzX{r2h<;YMZxsYYb*e~(x53xY}9JC zGb#`!i&8#7W(YdZw?V*r$8n04O69F2+5{BYgp}h1&RfxF^bkAGpueDZuf2-w>_{@k z4FcyNTJ@C&aEk=BTNqEVwhbZpt2{bLoUC_Uq#mk=+At;EsQGNukm;~n1T9yq)fv<0 zV`REJI1eDtv4Kemlx9HCQ=36qz_}m}bAZ1Azl@yGhv6f@X*0;suW~p_Do{X5P#{yf zGcLi%9jW9r$hj|Mf?BNk8o)AoALo1|5_wiCm9|GIfsR6Ixo6F^n^!xp9#O@SP9QxAeAi3udO>5hf|7x3@ z8j10>&rH&*GBK_1mg0gGMcJzvg!jwlFb^ zdi^24ggJ>FL&lgnh8{w;kYA9S;PRKT0?9k6603!VMQMUOYj6&&bHgM~KUl$>iIClChSN z`D~u&+c1cDn;E-(5_jht8yhD{aQN`yO}NpDq;S2|R`wQS(V|7m)9Lj4w!j`U+k~fR zm>BHGU>ROg@b=>2IU`FDR}o8lK@8kJQeIx(no6Z6L#~0pMSLM<%vu7w;bopy!QNUK zb)r-wMRvEOwYBx{Lx&E12frY+JVr^1y}iAEsW;74H2jP{q$qbr!<&F1=tD8~_4O$Q zkHSA?>3BmgQ`m(CB*HhY5c&jP8ODX)f@}H_N`^H^7}G*KgTd2CUosjw_P-Yu72Vp| z*?C&}uICFSB_$Q@?d`)kf@zOlMfXWxf4$~>3}Oza?RHMvw=NJnJ(qlXk9p5R)}oAc zbwr!x2#%Y(4L(p$lrg+C`h~X40EYJ2Rv=-&uxV!;YZohEYUK_{Kr;QE0pScn3FgTD zJx(q&3oXC{d=0F@R@P;+^mTUW2AOu5=%_}NPcVzEuFOjt0Cr)VQL|m;Y_v8ul-M!= zTt&N?;mm9Rs;d(xPHbvxYYUEk2B1KcGIYxUuA{$!ekM~qL*GmPC0`o_X1{dZ768`Q z*H;V=4qgOB<%yGBh+aV1fO~bYAAGW=boU2jv&k)dMDqhfrY4J1kqhBjpa z-(x{y$AJ-r?zxpja*`RWU&YG15Z~He>i2>0#R`v8!M-As?czFu;I4?<;nyIP_tB6^vdE_tl()pBUfl zD~#C@(M?1>&Aemu)b{G3j@X!%xe50W&?;}2y|R-?cyE*3Y{Oba+9)t_gNiLe1%bEP z9+u!C(OKGW$TtGiYU_mnZGpyhb#*0Y&z`-Hb*f`S^zzPnak&^#G&A}Yeg|J$Wo6}u zdIU%5iI))|n|?nt-h-?n&ge?;3HmhODoX1IHhvHwiSrhMM{S`$PO*aT@a-epzA~vC zp_da&cjLgoz#U*|+aF{xrn-g%x*I=D;wLbeM4tSD;&h{kLO)mFlBnmb(Yc&G1!DpJ zKXqeZ`)BDKe~h5sa@b6wdQUow_n!<2w3%GD3-Ql{nwh8~2c4 zk8og?b#-;=+2u7qxX&Pz-(Ewn$-6ZOavhxQKHmuSvVWaV|HRO$UG_!*TFrOC-$3vE zXg5xftz)%!1lO9LLH+&xds(T6jne?zc(M!jHiYI%zIEGjVUJbGJ zW_A>qd(&mh7rvwSZg3RhvJSW%ImW+%=VJF# z*G-Sl%>B4WWdbYnqeE|x@7bPTmi~>cG5Wy{{jfaC=KOPFosP4D8mcdfFf<=3W89** z+_QX@qKtFjZwH6sSm%y!Qb#&2ZPcGHa82Olm2az;w)iW01Yex+=4`J=>!XSV^X(=v zofKudcEw;)&coGD*nj!Ga@B6_nCs}U-uLEKuPDVgUzk2hNtfwai@EjM=-=J7PQK|F zZ{Ix|p*=<)=WQ;@`JKKm=a9jcni~-d>(f@BX_+Mb)!EbA+y1`f-6*467m>gAN?t)d zF~u?8r@G8NeA9zXCC>BOn$KQ8t&QJ@e_f=e^D%m6XQrBQj>eM3C$GNYtcsJ4?%Tb( zk%8{@=F)w@g`@Ccb1& zufrO#%)bF$UgyuMIi$}$eO}4=@~1+{SwgqMHM2f#;q1y|44QuJ)TLINjDt&SnfAzopr0I*BhbpQYW diff --git a/pandora_console/images/Header icons v1/Header discovery error@2x.png b/pandora_console/images/Header icons v1/Header discovery error@2x.png deleted file mode 100644 index 9f45175ea80e2efae483e5f9895cab1872f56910..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1019 zcmV4s8Yf15DId z&)sorNq-W4sBQI#@$rm3N6r7Y;y zlcLc{XRbO)do!QDbVdZ2OWIVV!4p-=ka>6}ih2;P@b!a$i-C)41#=8s+f>kWc*XYF zEF!`qZ5cGG=2+a{j0kCP(8{l@y&xc){dc$%1*yrm7%>FYZ|1^26F1daZx=%{ zRycE7HM7={-(PfK;!Nm-26;HFCC0o9X_C`luu`_ zdj$75!H<~yKpNq7Lv!Qs(Xp|dmhS=-ft&z*pbQasJ)HZUNOX)4q^|v7@q7Lp-o#s5 zp5W-H%k!dV8*n++N~?qKhhYYMK_d` zo!x6y&fy#BQaqb|r~Dcw*H6CeR1ULcA=lf)OxCZb+Z9_xKL-ZdH-Bx60Kvtw;D{>< z;dXp_>Y=Gy1ZWC`mId7P!mvlw%V$ehsDrB%BxuggaAlfTh?7=RY{Wd|O4W-T%=h=V z(R$%7J9CX|WuysEx^U@y>lM;tY>M59kB={Fx$j`!wmZm!xhU=q8n~8G5)c}!ZplAn z=Pr0IysZUrzij0ft|Av7?AHRd;)-vIZy@Jt1==rr@$IjE2-R$)?qD@hGi~Y-G^0@s zU5{WjQ8R50Lj-Zv^!Q-WxXL#k96MM}?RX=;`L~&^AKj4N5&e6L9h*+fW^La=aYy>J zQ1IrW=nmAfJ^m%K2r<?zc(M!jHiWhpiIEGjVUJX6# z%@imwzq0O%?qrn}vnx5BUP?)NJvlCad1-h1g%d}e!(Zp0?C0Zhy>76mTd72YgZZu4 zG+*O9?R7JLH|gy?Ty6dN_u2PvXV0wdKA;@WYwu$F&-6_AAr(GJF2Ukw$_!#!vtKgu z@R<8QcdlT0sy$JSp;hO&c~*IcaH^5kM4|T^4_}MayLjTpH<2cuRK0JJ_dAcKRjs>T zSF@S>hAxYaw)&(Nfq<-6_sVQ92kBVPVDtGEVs^8@_-BI9h8&lQzN)|T60c=#o$>qA z-e`tJv3^gi6!t1S+{+Yd<8yC{3dh+iL8pRdZ2Q%;`m>jx39roeuebcmXDwegLG5Gv zp}zcV+y849iMaX;K8)bqeD3DbLJ5 zy}3=o9)m%&FAADVdAsaa8-=$^}pBmGS(fN&`>WR^5C@ff!^IFOFo7k$-VaQ0iWWX kT^?7r@8K4|bYa>V@d)mEJ+)s_CZI_3boFyt=akR{0KoLzb^rhX diff --git a/pandora_console/images/Header icons v1/Header discovery ok@2x.png b/pandora_console/images/Header icons v1/Header discovery ok@2x.png deleted file mode 100644 index d5f1f8901c8b86508e47702743b98d7c57716bdd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1022 zcmV-D+m-pclR6L z`*fD^bJE$q&r;Yu?0fU(z2CffJM+Hxy=83clSqcY_9w$LG=%$mxo+jY zNr8^qtLj3oQ#Rj>&RQos6o?cfo%4#!vg4=-7~YprydE8@%z$6_`2&qTm(m|e*XZ0D zfNrV)dkc7_mziKy#zuQ6axcMXE#m{RhhxR*!vUBs`s)F+b!;L_m=!{9@q#>1v*Yyl zry{qQB?d83SMRj|=Cq`bS9INLnf)bocL35vA{D7;7V88M&6v|d4B$8(uT^|H`~(KG zLcmmQ?97u+7%NC1NsEAklhJd9e2$)3K{;tc(aW*ESf*3z+JJb67x50ClES~C6u<7) z^mmR|?~Pk9azJKu<7btL*SP)Xp57F}#5GR=DbaWfh;bc^Jw67rX-{K_ zrS=_8X~$q?0~N^jw#~igl*6d}L<`HnN~=QUEmo*@J}qW!(!4*>aI9dhjbMI^X)P5Y z8ZI*qJ$FR05iDyYadjMs1G@(&9)ss zoT@vrk`n{Cc#qtQlMQQ#`H;K=18~pMJ}E+rfd!`Wh>5O?y#0NMLsqvO(@| zqVop>!G@ zASDmW5iB`m4ueAwL0~Hmrw`5$edG8_{_@~>wA~Z(&8}wXr5kI$%iE{_^9UPp@z{KO zu^yy8ZBFE;z32|O*&5b_O9AjVQ>jHbMF&+-YOq*^d^b9K73C#0SyUWDejS~9#eM!E z*%MXmv<|8YlBZVr=ZS?dv*0|omrmo62nk>zEOJjEUx|CI#O)%*54D`Aoeo6d2MCr$ sK8x+AMf}I(Lv731d0h+2wsm}M0Pf%mak8u|t^fc407*qoM6N<$g7u@p(EtDd diff --git a/pandora_console/images/Header icons v1/Header discovery warning.png b/pandora_console/images/Header icons v1/Header discovery warning.png deleted file mode 100644 index b329f4d755140c10467692f6013e5d2396d7ac86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 524 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc#=yY%t50_}ki(Mh=?zc(M!jHit9aH978MwuZ9@< z9d;17W6Rz+MNO=)f+2H4z#-u#0U;ZO^9vR(R1$I#$$Tie%ugq9g1!nXZ>Gjt2}j}1 zL*ERu3xs5%Em?$;q}QiEPkUchljh{I?(dR0$IROET)7n%&RFqxqR_^&w~uF(EEk#h zPW5S|W|4M(M5uS;l3A>2M=xyseQ~X=>-lvJ@m0%ormA)O7f&c%zfI1!dHd0)r!A{@ zo}Jz);U+hu{p6KJdz{3A!(MMavc_+7>laz4eNW%4edxL5{p_U{5^;*w3eRLOi6k81 z7rSV>J?__`gNZpRzdYi)4ry6SyDfLSz47A8qnXN!a$fd#Bz0xJ=Kg9~x<8}sk<^{n zXXaMQ&7IJ9-k@vkBG*a_mYSrip|ihA-;;0YSzW?6@wCmSa>I`8t_Cd%c9ZA38y&eX zH2H1Ew3XV&ZvSU*l6Z3ChmCf}qNO1>Zyx>oJ*Wj+U}0u^V)E`uvtQ^v#xGTcUn^NEoIz3I>FVdQ&MBb@04$l# A@&Et; diff --git a/pandora_console/images/Header icons v1/Header discovery warning@2x.png b/pandora_console/images/Header icons v1/Header discovery warning@2x.png deleted file mode 100644 index 579c5fa6bb44d30db08dfea39df63b3eac8a5a6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1006 zcmV6#o5Z>8$Xo!mMG^qrW_yYtL zi!>%62nI!x%cTg|3Klk2ik1piHX>GnsHE`j45BEAV6+J+v9LEe1uG+W5)C2V?l`k% z!`}0GZ@qgl3EYEZc6VmK`F7sk?7k6V#d<}RpW_AVlxwn~;VI$#D}3)_}~ z6a%(XCsk?J8FKU!i`@rU0kuMibr#f-(E;xJ4+5LV;qthB$Y?IsxixTQtZ&!Aw*3t= z`6|$J)6R^OK_<+a#jp}FAL!zX`_vqwzeNG!PB2=z$U1%iA7}TfCH(li8~@*UO$v>j z>c1E}BS~%wM2=CTg^*I4IJ!o)LiPc@qr5wo)Fz;1DKq_$n}5f)#;fnkNdgxD&p;Kj z3n*}VqOqreOcRWKdT$6%f|~)5Uh|Caa(wK}wxOIlhbVe|CN#1MI-th@x<;xLo)ZXH zDgWs*O z!EJV+@y9qKoFKz~uY)TJ64Pfgl+>pI@QH+N6Ye1wHLoLxlf9u<->%S#&k{hY8zAa9 z+9x8KZiBaEu=6qum#bE92x2Mh(I}?UxI0+jRwQpgxfKR@{{fLZqO^F`3gBAJR zwYa`k4qC-!ZggK4hgt<%tNG0Bzy1)KSxB2;Gf{Krv?J(7qnUO)g3UzDowM;H2m-#l zj5ku7xk;){O>QJobzF#>xy|rLH(jxg*D2S#Lxs4^Xl2L{WG-B%)k`=<=U?A?aw9@> zvI7SBs>M833A&`Xz@oIe00K`D;eRZ$xJb!uBCw1C9tASEW^1DEtXP7sfo*fCT$HBv zYfy(N-uncVmxz2XEux!BOPyrbN#7JKNlhguQ%=W4a{h&!lqnQtipQ+P;H}6FzK<(G c@zm(^3&V8{Vl6Vo(*OVf07*qoM6N<$f`?zX3IG5A diff --git a/pandora_console/images/Header icons v1/Send feedbacks.png b/pandora_console/images/Header icons v1/Send feedbacks.png deleted file mode 100644 index 858e790ddb2102fdd9912c5cc744be8df358e872..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 645 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc#=yY%t50_}ki(Mh=?zc(M!jHihp>zIEGjV&JD5k zW_A?V+pi(^uT3C8NayXFPZ!--r)vCQ{=`4&lv3+d&9_0Bf`YERinlm^zBqbm0<-7z zV?owCk9^mgS)BiV(S+vYwEMGX-mSIX-PWi-*N;D=mi@qyIgG;nGkIU}d=$7`?o`OI z#z(E#chU9Nm8~zT=$@}kl_Y~l*#6D^p^o9^E8S|rYqdv1ZRr^D5z%?nT6IPW|*g(th# zGnldVY+4zTHB)r{VvmD2M7Bn~ojqHVdqs3v`tG}R3UX2WrL8|g*JS(pha9(wI}CjKs|5mP?^U`4@Be<$v)XDF;d6Y{%vY4jKG-O*#YXAOk0nXF*58Y4 z-EH(!ETMEY*NzRRk997*!LG%^<+irqTo=>i#n(Evr?PKfDw!ZAFLUeg!wU!376v>{ z_-J)`y3qO~vhue@-~6q)n3N-F$9JiJ4`cKXW+^w(yRMP)4Km{h$t75MkFx@3Ca0= zn|qVJ*}2=zUVa9aH#6_O?|u8`?au7RD)OzhwRNz$xj8XAJNwDv942z2bR{jklkD4Q zU&Kn3W_Ph_YinDSz6Fr zFpT^d{u$o3l`p^2ogtdSHB7-G2rrjgFLP)qK;XL{|wGPhQ%1^zLw)S z_So3iny!d4#>!8-i_+EAb#Qrk`EL{u@nJ2ZgbusUN;aDv6h#ynkH>2XMql@F#%f*I z3J`Cts;cVj$jHco?xzY{S8&|k-hL0kE~0x9G6Ojoi^Y0IM@N59Z)!e3tmXk2&H;e3 zXah?Jx0%!p3IHQKF*$(70Iptc3J?YU3emdth+)P6wFT5&W#sB|R4@j_ovAvGaiX!Y z@hfE+&1!0Ds=%3Hf-la#GJupT7SZ9rxLY6}zAZ+1<~zvw5V~F7d6ZO(+Eu&?B)MR} z^6I3Iptq$j68mtkk)aqwkl&3ABLIm@z56W7NTex;rkshrNcc?|8Jcov%9#L(gv~qV z@FymY%49i`o0MHsQ*){u5b*^&cYn6i>GT{1^P(t2*3(yVs7}FA071w>-ZvN$0FO;e z6rj9M3Sdd`=YjW$47MtHgqI_T__7Xf$RMl)P#?D59+SO#!J3r%TxVxze06p8E>d&} z*9l!;YK%Nj<9btBS^3PgxfSybB*>RJ$UMhYR}3V|JS!E~9c1oxDSsou?(XjW3kwS` z;TUPlDiyGZE`_tl%~UFt)%8At5jJKWGx8W2<>Qw00w{tY#$(6Kb}ywjSeQPS9(FAS z?*$e=CV4j6);bGANVmyzn9Fn8coVLyth|S!&mS^X{2DW7rm*0}^iyEL0Kww)w zQG$Yo)yoOT{TRbX)Cc@dI|P!a!vgH29mFw|R2g;<| UtzpKMwEzGB07*qoM6N<$g6jN3S^xk5 diff --git a/pandora_console/images/Header icons v1/Sign out.png b/pandora_console/images/Header icons v1/Sign out.png deleted file mode 100644 index 186cb46d3c4eec36fe5998f67883deebc9dc6e40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 646 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc#=yY%t50_}ki(Mh=?zc(M!jHihp{#IEGjVwuV^y z9d;1d+B|m8ubx~T>F{i;r%4-Lc$Ath@-wl=d zZ*QJiWV$Bh{QI+K&YgS1))VaCy3nb%c&^`a z#i?R$ji+7SegAEpkmnuxvwzy@r_48MyA13mUb?GyYG>kC&Q(t&bIt{F~h&DNhC9Ck&`aFM%CL3IcDZN{EK}$KJZS^ zH1Aq8S?9Fg5ziG2m04>o`q&?T{1MnQ%V=w_8}otPb_SO%)q582TE@(DC!F2;BCDkD z)ijYpi}~m6S>Cv;ZfM&O6sD7KTQ6jHd)E7oNyRKDEE@0qsqDKX>X(+A)sV)MeoXwz zGBe9l^Ust=zii^TT)#?W&Kzdd=xZfvo|7KioIk(Nbko+PCjn1pu3yUac!SQYT(k0n z8+RPqkms(qX3fw23112gZm{Sl&hB?ue9_}cm|#TpEt6}yZ?+v)Trju!z_*i6Dt@nN zcWyd0p(DmQ{a%CJh8VBh$LqwpUBg6Wi22X6 adWPK2D|aUSU%v>H7(8A5T-G@yGywn|FA*sK diff --git a/pandora_console/images/Header icons v1/Sign out@2x.png b/pandora_console/images/Header icons v1/Sign out@2x.png deleted file mode 100644 index e666a1fbea0ade31e05e989ea149f607049e54ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1202 zcmV;j1Wo&iP) zf*}%Vtge#|D+&rLDebN@F&LDfB%09i)7zW7#Dai!R9Go@=l6~GmbY_ncV`#HN%rQ= z`}y9RnYS}?H-ZF+k8oXk|~_xm+6-)OEt(9wn# z#9;KncuXenj@hR$4-O6{Oh-^$N@>y*+HYO316=Z4OCk^kdU38;7bJc1A&1MsC|wgI z%@bKlQJC5wilW6*F**>qT0ksk&1UnOp!)rg>sqZgzqhyd!B-qwvu?Nho=Wg=Pb&{8 ziVzd{q-US0NCVDZlrM-VngGfP6+}o{TB0Zn_OgzM^AWOaljBU+Gcz*}MTy3v{IS~p z{{A-jE@>!_(bl!1xYaz;&SGtCEe1l@7jjG>$evj;i^oYXK=95IYF<`ET8A{}TnOeH zVRcWiaO23-F19GOZsxZ5032Hp0{EPVg9gq5+y%g04QwTemXjuM7NDz({>c7KftVq0#OfOvMKKP(6*zKlapiZcKfGh`ZSz=)jULVLyt9` zyb80kvvYDdhysCNd`re5eFDhy3z5D8$bBrqcNni?r?)~tw2lMB8~&o#>#b;k(2&*e zYW8GY)JN7-eIqNWeH|Ic{cq&o z)bXwjg`S$4dLndD?+)0!q%B+9xLxKHtVmg@mMN4NeR8MBRCt2pXj;d@-xQwJGXO-t zVwJ|0epOx)VBS4d1YUNTi}18O;%(gNbiNd=m^QL#t|)4d+pSjXmnE;ttJUlE*D!8W z1yFWlr>CbkkB*MqhmPW3iexFrI_6R!VoWTd{T`>&G5olS4SM|ASmK@J>-pmtMy2XZ zA3%@uu#l(AgTQ!|*YNN<=LhsqouDy;uP1GkN9UcAv>ODp!5{@EZ$+;>KnW@|(Ek=- zXrRFXVjG6)CUK(sylYA8h0yT%Ew}(d&a|*Cncqzz4$J5;FYzn~uV5&6(MzInLh>-Q zp3%6Mrb7Y~Cs!I^nZT|*Km?cEBy`RkLsxj4a0NSfQeT4@S8c>H8*Y*&%DC1*_!QUN zj;ZJ|8Q?0O(*JjPI5H%b*-$s`LNH+pbC@ySx-C|^IXXciVh}4xxrCBC2U!*K&l47& zC2XB4ZD{+iD(j@8)`1QFQhER$pF2qC>y+cL=HE-7@$BHsXXkGhr}W{s-=Po{UTO3T8z7a32B^} zKIiuCbKXPi!hQFg@A;k|_nh};0s&T6S659=Z5~?p3t*ILwK}epdM<`QcX#)7?QnBC z7!3Ad&L}b22qMeU>2&&*2sqzlFN^H1dbX-pVANngl-$2Up-|Fsnc>U|7^_q&BLc$G zwOZ|21Hvk0lm*0Npj945Xi^N1B_PcUoNa^z^h*CRWV8# zmL#Vcm<1r6v9kYEM7ay$5(b&OCyFIYbnTD?6Vj4^tQ+iAOQeN!8eq@?)*u~p8lH~F z<7S4~OSCX0eS9KB8r=!$wa5&hy-+C3i_Cf{5BIge^E-qkuy%F~$D@?BU`R^cX+SWS zfV3A`wpo_ss1I~37Tb+77KudmIiNX+_(-1b3GFM4X264V(GS&?lH& zzu1HFAlO-sE9|i7todXzS;pZLa>O8;5B$}B0*+D9kOQ|Q5{V!AeEx&HiISyllkb&q z&QbYoetnin(1f*tK*OA!UM6=|YR*piK28_>g#YNC&sBy-n=ZRO+{&3&tdOY1XIo)V v2Yi^TdVWb<)DgJCs2`(}zkd;agQNceqhK(Fm=&zF00000NkvXXu0mjf23UPI diff --git a/pandora_console/images/Header icons v1/Support@2x.png b/pandora_console/images/Header icons v1/Support@2x.png deleted file mode 100644 index f3c95c28530c6b5cec7e93752c000e61f972d833..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1920 zcmV-`2Y>j9P)1i$6vuh5D`3Gwil_+~6fi6r zJ}4*>T9%-#vPm&fFbEpKCDGs)H$tu8^=e;VqPrkufm= z?1Nrz;1PjYSy{!9JP&McZayHerKM#yS<0>Gp*2nxtKuk(7>+#DQ^z6_=BfbD5|+h*~Ncn;A)0 zhHJi(26;N6OwuI@ZZz>!U;!z-AH*$-ATHV83(o79%gqR0DX%rzrRd%;dD5gw*K$3M zn(SqW!JlN3YhW0S$K#v0-(K(4tJm>{hK6a_ZwuN{qoJ8ZuSyk+Ah%UlSAQ)>7OmxW zJV>xs#9xBJBopUnzlJ!>1lW-M>#k1f^$dw7)BP>+HLc7#@hFe|z8WL=UDM{U{ zNx~s1m~7l5zC>lod3m{a&bhep zon@F5OiuLSJ?0!nI}6yshnCU`K1+ujg0zJv>iFj+0Ap-aK3_sz_7o&C3a1TrTmU)wy;9#L8-ZLPv zC0E~K!8kx?DVUVlE#NM>Iq|@A?ZwZ<=MKNI6DNyjWVcpHNlAWVW209a$GZi6Hrs!f zjF$*!t1~&yc6z*H*ntfRCYvl4FXMr_+;Qk{yw``EWy1_G3O3dF5IXMCrAq@1C)1~l zkCFOY0FN6W$`+PV;8n2mpdY$A@zgR4Tqk*fs{`*D4+fI~SQ!o(3P$izw9XLdBIdY6 zeZLF_lOOi`)rY&_?-1}$hZa-YMBeOOSY(B4y^F%$OB0UmZ0kN`uN@+S{mSz>7rQUa zhQwYF@Asi8T`@Z>z*X?yHsjQ(Qx6bx1$ehw!HIWRH;LXS);M4!t7Ws;bWLqyz=B;6fH$Zw5wj z9Ejs@CW}(B4Uqd?EEP|pXLt>|p|Y~_B!wvA`@&a2TMDp<0=(zqVdvl(*T8rxoAkgW zxqax;N=`AjD*ZWHwu{fs&i+m`WOP{DPml#m)k9S8;}AzJuu&g(q~pfg4Y?)EE()WH z<toy@&=>`<%pz&6Zw5^y_x^bPYg$ux7^Tn#po z_;aDNNi6bXOK>SZycByk301rf(e;6K|juLn5+j^yR#^<&`^ zsTRjcUwrd>vgvTlP|ZzLay*7x(XUtXZZQ4X=7@M6>?zc(M!jHifcSw978Mw*M{!( zV{#OjcaxcSVuVL)Z|kue(KjPGcOGu~!C=>7wy$gH*0~->%0DnZVBF#)Y&c6{=fl}k zTfY`rzHjmUmR44`Z|2;&cOQQ*+imt!=6mPUT_!)J?sItdwyf*vXfctt$!XbsrX-^2 zfltecA6jeb`*&Uw{~T>>)&5@9@U8Pll_TO^bI#j}8i&s4dYS&H;vwtK;*Ynt0$ zZwc_6c{b2{vGK|;*LOM@f8P6k%E{+WAuO{Oi~U;v`0}~4I$K_qMjVkh`#szGc+QMg zv+^gc-e&3F*QlLQyH)j~WbV&w<*rS$&fQdfd20I{o(*55uB*OzILCjQTM)xC_s0je zw5>Z?voAnF#mru0Vnv-|%{~Ezp78r-uNklIPcA;7vfEHi?v?G7MD~Mbinkr?Lp_&p zb?F@nKJvwIvGO0Yc^{|oeMsO*GWuJz)Mf^g-jx;$t7-jnK=I+}>gTe~DWM4f-Zt0j diff --git a/pandora_console/images/Header icons v1/Systems error@2x.png b/pandora_console/images/Header icons v1/Systems error@2x.png deleted file mode 100644 index fafe9217567aa5ca0a02ea09d2bdc7e0b2c6d145..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 945 zcmV;i15W&jP)1gh5T4nCI6p=ZKp;XQA*G-p z5|2QEl=zGzhliksk}i*cL=^;&0HledbaY5=oyJs=2+-g-$b#4g-!OAwkCpGvzO&cT zA+nOSb2Gc&&d!c!b_ao5vrsB~UT+H!x=KL_8>=pfz-)@8hbBX41q6#>Wx*c&;c3AjKmD47=%B2MolkW*{h)Z4B2R;zqBBpc+94kmoHJL`;{lT_C*Y5!_+HZ35zWhIx)>7dYi~fv6?%5rOI)f<7QP?;+>Bo8R6( z)+qmg4YjJadh4eg1P5{I+1)omX6F=L;e#lo)jZJ91QU>HHT@_pn2gW(DMws}M%m?L z=dcZnp8#mV#xjVi$fs-vOcavX8n})4p#)YDn6!MSX#t@4q4qtKP6H-mGwz41VX)=2 zTZ2U#3{Qi^HZkb+u} zl|FRDSy4>uai*ZQ#Hc;{esrVFO?6zYE+IL~J)mXuXqgbMA`zFBxU>W?$7QBGm!0zb zM40n=r!plaCmz@3UP|g*e!>=C;Tt@s!Mv}C#HA?w!jG&2z}^8&O&yq}C{v@~R}2*n TnPoGs00000NkvXXu0mjfh?zc(M!jHiYIxxIEGjVt_|Jm z$K)t5@22%dmn7%bUe;p~oX3u|oZ}L@c#8dl;+BmU4#~?MIu&u7Q%zy(+|G@Y*)Omk za8lm>c>8PJIKAng1w2mFeBONj&l{tH&D$e6z8vSCxa$k!I@c8rOZr6)n6=8=y`7TZ zU|yqi)7VY4iesH=Vb^5k^~Mq>pU*wDZ-Y$N39c{h_doO1`2Omu<6L!Ep~Ayv-rX4y zL0g2{bybb8`@cH>Msw?9ng7$wwkC3I$+Mh!BrSNh!s8Mn%?Y#je$85t8t#&x*x`ET zfRZt9!~Ftx{jMKjl{>Fh#Hugtx}DRTX7WtB-0f@5%9*z>I9FZ8kv|J=JMQ?os6xg`*!pj}@$}icb$t87 zJYNfK)JlA+lkBd~d6G%&pv|ObhI4FgO)L=Id)TZY>)IvlXV=`5YvT?7MWp?@@7OlG U{C-PMB`B6WUHx3vIVCg!0LQ@Gq5uE@ diff --git a/pandora_console/images/Header icons v1/Systems ok@2x.png b/pandora_console/images/Header icons v1/Systems ok@2x.png deleted file mode 100644 index c1484d1ddb317cf1d172ce1fa2d124c507bab3d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 982 zcmV;{11bE8P){|NDHPa7BZ|!t#p~vZ8sW1+n6m zzX)Pn90joETlD_{OHb!=xvm+lQs8fU(NV&+lGYeq@Ch8?&%k8GC|BLX&th zaaLk!i4lDtCFrqGHKHA2GbF=HjA#^gY7;NaPC$m=VLJG?y`CCf88_p(rHeh1p=O-4 zO?}Eq4JVf4nS5?s>*}k-8qEcZ$_GOX{Ui(an*)ToJ*meq^|Voky1Gv@t6R*p0RP?a z9FmMtnttQ=)M4jxU0t2c=W?3qlGge>fX<=qBjzk?I*L4XQQJ09=Srk`4RW7Z@%yYp z?_b>=1Al;pro3>yg-}bBQ zhio^q+aDdC&JTUXsqRb~=1>!^skFevA*ro?+IYnkg;f~AzKm@?A5ikp{XO2yJiON%da&K?#bwce6Y{m%q?(yYigdEI&zVV6Sqi z*Z#da6xLS`IdZRS$FoSW=3Ch3gRxZvaHkzAqKcoj(%LU!=5M$ox2bay1RQ=NWk%|t zdD-&Lnzd*(qPIGj(J~`147GbxMe3cokTs&W*u$uUEjDNiA6a5sfL6;NIJnmc*F7Tz z!L+`wX5YT-)ql47NvVGP<@>=ufj>1^kvD0b?ZKTmS$707*qoM6N<$ Eg53wY9smFU diff --git a/pandora_console/images/Header icons v1/Systems warning.png b/pandora_console/images/Header icons v1/Systems warning.png deleted file mode 100644 index f1cbc64f6faec500766f3e8c6d497b1135e5fef0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 492 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc#=yY%t50_}ki(Mh=?zc(M!jHisL<9978Mw*M@HN zV>aaZ>fOiK6|gWkF+s!WjZcn`0^?i(V|hmI{fAC?U2QcwVE=(}FMosR$_p#SljqM` z>~T?*-K8t%X65<5+K-Lx(X!9&jvv`^mdkvv@-jZb`w~fZ3x6KUxggh&VK4mMvioYy z?svDder(iwzbMpG&vA#?vskq~5#8Enf*v}aTVQx%=Zwzl-dj|Q=fv(gEH$U{`1(}I zsF_^HmGzx-PFgm#OS7+guutTtz=L%q36mX!mG&5ZjJP4cCbM^vWV0#v(+IgMmtOG6 ze%N;8LdBPc6+S6*>f57UMEo}DT^ZYX)KAa9sBdG(z4O&7LbZLXPWw8PrW^0xbY-dL zd(mTGAM8+HobLXQ^ESgZmK&3Pt?Rm?Tf9fcReq8G3|IF3O%pd8?riN_{`3zw*Sn5` TYk3*Zfr8xA)z4*}Q$iB}*B-(n diff --git a/pandora_console/images/Header icons v1/Systems warning@2x.png b/pandora_console/images/Header icons v1/Systems warning@2x.png deleted file mode 100644 index 03e18ec79d0e79d247801bc0d38055f5879cc32d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 918 zcmV;H18Mw;P)1gh5T4mJLL!c^ArKJ~$&!mS zvBV=#(8MSbDDVo@P}1=Tk*E^E6WEDGL1^iaXq_fhmI%<`kSG+RE>Oo*{Q3#*myKroGKQcosMODr!nqP0<+ z9t$;OWgRU*`Ur)_hea$3cy<&fId zrbqNK^@uTolJArSV;|ZebLlYv;V#LQx%)8puu=NPwR?#0lEdbZ^Uq~?8fm@}@SHK; zYtWBI@+x)iJn((*A&|epIc%MUYFvQIoYxkm{BUl&;I>ad$4K~1q51-P@iRW{of*ad zfe($Td9}H(vP}*W)VO_WEBl~bJp`i7td?5~T`&RBh%d5&iTrG@a@=NUl35lz2EA7G z2meYdd8pxqd|ce31j&^Xt61vNSuG!lLlb)vlZMU;SlpDeT9PDhr<^2^m7hPL)@qY$ z!drfivs&ZGe?_HUX?=Ye>0tRTc!P$I-UbUah@ipX>m2MiodJcDQs{zOh0tYXT}Ao` zbg7$r)Z{&r+}C(+VBQ{>7SGmr0~D_HhVQnM9u8cLv~(l}dAGewAC?l!RbU*^URnjy z%FX^?tO1*|xEB$d#I|WyU_M^x)zW@LL diff --git a/pandora_console/images/svg/add.svg b/pandora_console/images/svg/add.svg deleted file mode 100644 index 3530cc8203..0000000000 --- a/pandora_console/images/svg/add.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/arrow.svg b/pandora_console/images/svg/arrow.svg deleted file mode 100644 index 7fb5d31ac4..0000000000 --- a/pandora_console/images/svg/arrow.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/bell.svg b/pandora_console/images/svg/bell.svg deleted file mode 100644 index eec47bd762..0000000000 --- a/pandora_console/images/svg/bell.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/bubble.svg b/pandora_console/images/svg/bubble.svg deleted file mode 100644 index 08bf0727fb..0000000000 --- a/pandora_console/images/svg/bubble.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/device.svg b/pandora_console/images/svg/device.svg deleted file mode 100644 index 46ea97ad8c..0000000000 --- a/pandora_console/images/svg/device.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/display.svg b/pandora_console/images/svg/display.svg deleted file mode 100644 index 38e3a84fa4..0000000000 --- a/pandora_console/images/svg/display.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/down.svg b/pandora_console/images/svg/down.svg deleted file mode 100644 index b515cd5102..0000000000 --- a/pandora_console/images/svg/down.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/dropdown-down.svg b/pandora_console/images/svg/dropdown-down.svg deleted file mode 100644 index 20da85c0d7..0000000000 --- a/pandora_console/images/svg/dropdown-down.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - Dark / 20 / dropdown-down - Created with Sketch. - - - - \ No newline at end of file diff --git a/pandora_console/images/svg/dropdown-up.svg b/pandora_console/images/svg/dropdown-up.svg deleted file mode 100644 index c8e9add524..0000000000 --- a/pandora_console/images/svg/dropdown-up.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - Dark / 20 / dropdown-up - Created with Sketch. - - - - \ No newline at end of file diff --git a/pandora_console/images/svg/duplicate.svg b/pandora_console/images/svg/duplicate.svg deleted file mode 100644 index 54b78c2aad..0000000000 --- a/pandora_console/images/svg/duplicate.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/envelope.svg b/pandora_console/images/svg/envelope.svg deleted file mode 100644 index b50e20e331..0000000000 --- a/pandora_console/images/svg/envelope.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/exit.svg b/pandora_console/images/svg/exit.svg deleted file mode 100644 index 16e0eae613..0000000000 --- a/pandora_console/images/svg/exit.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/eye.svg b/pandora_console/images/svg/eye.svg deleted file mode 100644 index 5f9c897222..0000000000 --- a/pandora_console/images/svg/eye.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/fail.svg b/pandora_console/images/svg/fail.svg deleted file mode 100644 index f6a60f9276..0000000000 --- a/pandora_console/images/svg/fail.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/file.svg b/pandora_console/images/svg/file.svg deleted file mode 100644 index 6ef321521c..0000000000 --- a/pandora_console/images/svg/file.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/house.svg b/pandora_console/images/svg/house.svg deleted file mode 100644 index 1361d98cdc..0000000000 --- a/pandora_console/images/svg/house.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/iconos-27.svg b/pandora_console/images/svg/iconos-27.svg deleted file mode 100644 index 9eb41e512d..0000000000 --- a/pandora_console/images/svg/iconos-27.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/info.svg b/pandora_console/images/svg/info.svg deleted file mode 100644 index a7b23d52d4..0000000000 --- a/pandora_console/images/svg/info.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/left.svg b/pandora_console/images/svg/left.svg deleted file mode 100644 index d74cf540b3..0000000000 --- a/pandora_console/images/svg/left.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/menu_horizontal.svg b/pandora_console/images/svg/menu_horizontal.svg deleted file mode 100644 index bcd2f124cb..0000000000 --- a/pandora_console/images/svg/menu_horizontal.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/menu_vertical.svg b/pandora_console/images/svg/menu_vertical.svg deleted file mode 100644 index 1b5e468eb1..0000000000 --- a/pandora_console/images/svg/menu_vertical.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/ok.svg b/pandora_console/images/svg/ok.svg deleted file mode 100644 index af6c3850cd..0000000000 --- a/pandora_console/images/svg/ok.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/picture.svg b/pandora_console/images/svg/picture.svg deleted file mode 100644 index 978557a383..0000000000 --- a/pandora_console/images/svg/picture.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/plus.svg b/pandora_console/images/svg/plus.svg deleted file mode 100644 index 18736fde28..0000000000 --- a/pandora_console/images/svg/plus.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/protected.svg b/pandora_console/images/svg/protected.svg deleted file mode 100644 index 39f9c69aa1..0000000000 --- a/pandora_console/images/svg/protected.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/radial-disabled.svg b/pandora_console/images/svg/radial-disabled.svg deleted file mode 100644 index 1b38fe43c0..0000000000 --- a/pandora_console/images/svg/radial-disabled.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - Dark / 20 / radial-disable@svg - Created with Sketch. - - - - - - \ No newline at end of file diff --git a/pandora_console/images/svg/radial-off.svg b/pandora_console/images/svg/radial-off.svg deleted file mode 100644 index 68d23663ca..0000000000 --- a/pandora_console/images/svg/radial-off.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - Dark / 20 / radial-off@svg - Created with Sketch. - - - - - - \ No newline at end of file diff --git a/pandora_console/images/svg/radial-on.svg b/pandora_console/images/svg/radial-on.svg deleted file mode 100644 index 7e17258abb..0000000000 --- a/pandora_console/images/svg/radial-on.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - Dark / 20 / radial-on@svg - Created with Sketch. - - - - - - - - \ No newline at end of file diff --git a/pandora_console/images/svg/right.svg b/pandora_console/images/svg/right.svg deleted file mode 100644 index e74f4abeb8..0000000000 --- a/pandora_console/images/svg/right.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/search.svg b/pandora_console/images/svg/search.svg deleted file mode 100644 index 14f8f5fd8e..0000000000 --- a/pandora_console/images/svg/search.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/settings.svg b/pandora_console/images/svg/settings.svg deleted file mode 100644 index 16858510e1..0000000000 --- a/pandora_console/images/svg/settings.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/sound.svg b/pandora_console/images/svg/sound.svg deleted file mode 100644 index 1ff57a311f..0000000000 --- a/pandora_console/images/svg/sound.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/star.svg b/pandora_console/images/svg/star.svg deleted file mode 100644 index 1ba2f60041..0000000000 --- a/pandora_console/images/svg/star.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/success.svg b/pandora_console/images/svg/success.svg deleted file mode 100644 index 26e83ff1f7..0000000000 --- a/pandora_console/images/svg/success.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/trash.svg b/pandora_console/images/svg/trash.svg deleted file mode 100644 index 0dc58d9e0f..0000000000 --- a/pandora_console/images/svg/trash.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/up.svg b/pandora_console/images/svg/up.svg deleted file mode 100644 index 88fe9cb5be..0000000000 --- a/pandora_console/images/svg/up.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/user_a.svg b/pandora_console/images/svg/user_a.svg deleted file mode 100644 index 797b4e04a0..0000000000 --- a/pandora_console/images/svg/user_a.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file From 13aa4e77f105da486d461f7669bb6c0e68f75f8b Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Mon, 20 Feb 2023 17:49:02 +0100 Subject: [PATCH 311/563] Fix minor issues --- .../godmode/agentes/module_manager_editor_common.php | 2 +- pandora_console/include/styles/js/jquery-ui_custom.css | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pandora_console/godmode/agentes/module_manager_editor_common.php b/pandora_console/godmode/agentes/module_manager_editor_common.php index c538bea600..e3d67c77c4 100644 --- a/pandora_console/godmode/agentes/module_manager_editor_common.php +++ b/pandora_console/godmode/agentes/module_manager_editor_common.php @@ -860,7 +860,7 @@ if (tags_has_user_acl_tags($config['id_user']) === false) { } $tagsAvailableData .= html_print_image( - 'images/svg/plus.svg', + 'images/plus.svg', true, [ 'id' => 'right', diff --git a/pandora_console/include/styles/js/jquery-ui_custom.css b/pandora_console/include/styles/js/jquery-ui_custom.css index 53f76eccf5..b0c0fce92e 100644 --- a/pandora_console/include/styles/js/jquery-ui_custom.css +++ b/pandora_console/include/styles/js/jquery-ui_custom.css @@ -187,8 +187,8 @@ .ui-button.ui-corner-all.ui-widget.ui-button-icon-only.ui-dialog-titlebar-close, .ui-button.ui-corner-all.ui-widget.ui-button-icon-only.ui-dialog-titlebar-close:hover { background-color: rgb(51, 51, 51); - mask: url(../../../images/svg/fail.svg) no-repeat right / contain; - -webkit-mask: url(../../../images/svg/fail.svg) no-repeat right / contain; + mask: url(../../../images/close@svg.svg) no-repeat right / contain; + -webkit-mask: url(../../../images/close@svg.svg) no-repeat right / contain; } .ui-dialog-title { From 03c40fe582d92f37686f28ce3c27737b41ea2683 Mon Sep 17 00:00:00 2001 From: rafael Date: Mon, 20 Feb 2023 18:52:35 +0100 Subject: [PATCH 312/563] 10435 adding features to online installers --- .../deploy-scripts/deploy_ext_database_el8.sh | 2 ++ .../deploy_ext_database_ubuntu_2204.sh | 4 +-- .../pandora_deploy_community_el8.sh | 15 +++++++- .../pandora_deploy_community_ubuntu_2204.sh | 34 ++++++++++++++++--- 4 files changed, 47 insertions(+), 8 deletions(-) diff --git a/extras/deploy-scripts/deploy_ext_database_el8.sh b/extras/deploy-scripts/deploy_ext_database_el8.sh index 422887b0e2..93dc1c561c 100644 --- a/extras/deploy-scripts/deploy_ext_database_el8.sh +++ b/extras/deploy-scripts/deploy_ext_database_el8.sh @@ -275,6 +275,8 @@ EO_CONFIG_F if [ "$MYVER" -eq '80' ] ; then sed -i -e "/query_cache.*/ s/^#*/#/g" /etc/my.cnf sed -i -e "s/#skip-log-bin/skip-log-bin/g" /etc/my.cnf + sed -i -e "s/character-set-server=utf8/character-set-server=utf8mb4/g" /etc/my.cnf + fi execute_cmd "systemctl restart mysqld" "Configuring database engine" diff --git a/extras/deploy-scripts/deploy_ext_database_ubuntu_2204.sh b/extras/deploy-scripts/deploy_ext_database_ubuntu_2204.sh index a82244c3b6..22349ea5ce 100644 --- a/extras/deploy-scripts/deploy_ext_database_ubuntu_2204.sh +++ b/extras/deploy-scripts/deploy_ext_database_ubuntu_2204.sh @@ -181,7 +181,7 @@ cat > /etc/mysql/my.cnf << EOF_DB [mysqld] datadir=/var/lib/mysql user=mysql -character-set-server=utf8 +character-set-server=utf8mb4 skip-character-set-client-handshake # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 @@ -196,7 +196,7 @@ innodb_flush_log_at_trx_commit = 0 innodb_flush_method = O_DIRECT innodb_log_file_size = 64M innodb_log_buffer_size = 16M -innodb_io_capacity = 100 +innodb_io_capacity = 300 thread_cache_size = 8 thread_stack = 256K max_connections = 100 diff --git a/extras/deploy-scripts/pandora_deploy_community_el8.sh b/extras/deploy-scripts/pandora_deploy_community_el8.sh index 13f90fcf85..4fa0814d59 100644 --- a/extras/deploy-scripts/pandora_deploy_community_el8.sh +++ b/extras/deploy-scripts/pandora_deploy_community_el8.sh @@ -107,6 +107,17 @@ check_root_permissions () { fi } +installing_docker () { + #Installing docker for debug + echo "Start installig docker" &>> "$LOGFILE" + dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo &>> "$LOGFILE" + dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin &>> "$LOGFILE" + systemctl disable --now docker &>> "$LOGFILE" + systemctl disable docker.socket --now &>> "$LOGFILE" + echo "End installig docker" &>> "$LOGFILE" +} + + ## Main echo "Starting PandoraFMS Community deployment EL8 ver. $S_VERSION" @@ -207,6 +218,7 @@ else execute_cmd "dnf config-manager --set-enabled powertools" "Configuring Powertools" fi +execute_cmd "installing_docker" "Installing Docker for debug" #Installing wget execute_cmd "dnf install -y wget" "Installing wget" @@ -454,7 +466,7 @@ innodb_flush_log_at_trx_commit = 0 innodb_flush_method = O_DIRECT innodb_log_file_size = 64M innodb_log_buffer_size = 16M -innodb_io_capacity = 100 +innodb_io_capacity = 300 thread_cache_size = 8 thread_stack = 256K max_connections = 100 @@ -483,6 +495,7 @@ EO_CONFIG_F if [ "$MYVER" -eq '80' ] ; then sed -i -e "/query_cache.*/ s/^#*/#/g" /etc/my.cnf sed -i -e "s/#skip-log-bin/skip-log-bin/g" /etc/my.cnf + sed -i -e "s/character-set-server=utf8/character-set-server=utf8mb4/g" /etc/my.cnf fi execute_cmd "systemctl restart mysqld" "Configuring database engine" diff --git a/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh b/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh index b22d5d163f..5ac47ca60b 100644 --- a/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh +++ b/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh @@ -106,6 +106,21 @@ check_root_permissions () { fi } +installing_docker () { + #Installing docker for debug + echo "Start installig docker" &>> "$LOGFILE" + mkdir -m 0755 -p /etc/apt/keyrings &>> "$LOGFILE" + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --yes --dearmor -o /etc/apt/keyrings/docker.gpg &>> "$LOGFILE" + echo \ + "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ + $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list &>> "$LOGFILE" + apt update -y &>> "$LOGFILE" + apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin &>> "$LOGFILE" + systemctl disable docker --now &>> "$LOGFILE" + systemctl disable docker.socket --now &>> "$LOGFILE" + echo "End installig docker" &>> "$LOGFILE" +} + ## Main echo "Starting PandoraFMS Community deployment Ubuntu 22.04 ver. $S_VERSION" @@ -173,7 +188,7 @@ execute_cmd "cd $WORKDIR" "Moving to workdir: $WORKDIR" ## Install utils execute_cmd "apt update" "Updating repos" -execute_cmd "apt install -y net-tools vim curl wget software-properties-common apt-transport-https" "Installing utils" +execute_cmd "apt install -y net-tools vim curl wget software-properties-common apt-transport-https ca-certificates gnupg lsb-release" "Installing utils" #Installing Apache and php-fpm [ -e "/etc/apt/sources.list.d/ondrej-ubuntu-php-jammy.list" ] || execute_cmd "add-apt-repository ppa:ondrej/php -y" "Enable ppa:ondrej/php repo" @@ -221,7 +236,8 @@ systemctl restart php$PHPVER-fpm &>> "$LOGFILE" php$PHPVER-xml \ php$PHPVER-yaml \ libnet-telnet-perl \ - whois" + whois \ + cron" execute_cmd "apt install -y $console_dependencies" "Installing Pandora FMS Console dependencies" # Server dependencies @@ -254,10 +270,13 @@ server_dependencies=" \ libnet-telnet-perl \ libjson-perl \ libencode-perl \ + cron \ libgeo-ip-perl \ openjdk-8-jdk " execute_cmd "apt install -y $server_dependencies" "Installing Pandora FMS Server dependencies" +execute_cmd "installing_docker" "Installing Docker for debug" + # wmic and pandorawmic execute_cmd "curl -O https://firefly.artica.es/pandorafms/utils/bin/wmic" "Downloading wmic" execute_cmd "curl -O https://firefly.artica.es/pandorafms/utils/bin/pandorawmic" "Downloading pandorawmic" @@ -393,7 +412,7 @@ cat > /etc/mysql/my.cnf << EOF_DB [mysqld] datadir=/var/lib/mysql user=mysql -character-set-server=utf8 +character-set-server=utf8mb4 skip-character-set-client-handshake # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 @@ -408,7 +427,7 @@ innodb_flush_log_at_trx_commit = 0 innodb_flush_method = O_DIRECT innodb_log_file_size = 64M innodb_log_buffer_size = 16M -innodb_io_capacity = 100 +innodb_io_capacity = 300 thread_cache_size = 8 thread_stack = 256K max_connections = 100 @@ -731,10 +750,15 @@ systemctl enable pandora_server &>> "$LOGFILE" execute_cmd "service tentacle_serverd start" "Starting Tentacle Server" systemctl enable tentacle_serverd &>> "$LOGFILE" -# Enabling condole cron +# Enabling console cron execute_cmd "echo \"* * * * * root wget -q -O - --no-check-certificate --load-cookies /tmp/cron-session-cookies --save-cookies /tmp/cron-session-cookies --keep-session-cookies http://127.0.0.1/pandora_console/enterprise/cron.php >> $PANDORA_CONSOLE/log/cron.log\" >> /etc/crontab" "Enabling Pandora FMS Console cron" echo "* * * * * root wget -q -O - --no-check-certificate --load-cookies /tmp/cron-session-cookies --save-cookies /tmp/cron-session-cookies --keep-session-cookies http://127.0.0.1/pandora_console/enterprise/cron.php >> $PANDORA_CONSOLE/log/cron.log" >> /etc/crontab +# Enabling pandoradb cron +execute_cmd "echo 'enabling pandoradb cron' >> $PANDORA_CONSOLE/log/cron.log\" >> /etc/crontab" "Enabling Pandora FMS pandoradb cron" +echo "@hourly root bash -c /etc/cron.hourly/pandora_db" >> /etc/crontab + + ## Enabling agent adn configuring Agente sed -i "s/^remote_config.*$/remote_config 1/g" $PANDORA_AGENT_CONF &>> "$LOGFILE" execute_cmd "/etc/init.d/pandora_agent_daemon start" "Starting PandoraFSM Agent" From 490d3db08625650f0ce6c4828b2633ca43e144ca Mon Sep 17 00:00:00 2001 From: artica Date: Tue, 21 Feb 2023 01:01:52 +0100 Subject: [PATCH 313/563] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index bc6b5f0a61..5a537cea8d 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.769-230220 +Version: 7.0NG.769-230221 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index dff687f821..3bdb964eb0 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.769-230220" +pandora_version="7.0NG.769-230221" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index 254bcd2bb7..cd0fdd0989 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1023,7 +1023,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.769'; -use constant AGENT_BUILD => '230220'; +use constant AGENT_BUILD => '230221'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index e79f2fbb48..1a82c15221 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_agent_linux %define version 7.0NG.769 -%define release 230220 +%define release 230221 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 3807bddd44..4015375532 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_agent_linux %define version 7.0NG.769 -%define release 230220 +%define release 230221 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index 24e9feb2ad..6d8458b318 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.769" -PI_BUILD="230220" +PI_BUILD="230221" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index e18d90153f..bd75795838 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{230220} +{230221} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 354f282757..f38933f5b9 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.769 Build 230220") +#define PANDORA_VERSION ("7.0NG.769 Build 230221") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 98564615ba..21f5675492 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.769(Build 230220))" + VALUE "ProductVersion", "(7.0NG.769(Build 230221))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 34e0cb2453..919f840961 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.769-230220 +Version: 7.0NG.769-230221 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index 654c9a5d97..524fd6c38c 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.769-230220" +pandora_version="7.0NG.769-230221" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index e0058687db..af73bd3842 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC230220'; +$build_version = 'PC230221'; $pandora_version = 'v7.0NG.769'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 9a64b90539..5976f2c24e 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -131,7 +131,7 @@

    [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 6fbeb80a2f..e972b323a3 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.769 -%define release 230220 +%define release 230221 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 0395fe8616..3412365986 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.769 -%define release 230220 +%define release 230221 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 40b85fefa1..cd73c5e77f 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.769" -PI_BUILD="230220" +PI_BUILD="230221" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 276c0f4d20..b54b653594 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -35,7 +35,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.769 Build 230220"; +my $version = "7.0NG.769 Build 230221"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index d50993673a..37b388fb73 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.769 Build 230220"; +my $version = "7.0NG.769 Build 230221"; # save program name for logging my $progname = basename($0); From 005fbd27c168972883092061f70af6c1e64a78e6 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Tue, 21 Feb 2023 11:20:17 +0100 Subject: [PATCH 314/563] Tree view meta fix --- .../javascript/tree/TreeControllerMeta.js | 1503 +++++++++++++++++ .../lib/Dashboard/Widgets/tree_view.php | 32 +- pandora_console/include/styles/tree_meta.css | 195 +++ pandora_console/operation/tree.php | 14 +- 4 files changed, 1735 insertions(+), 9 deletions(-) create mode 100644 pandora_console/include/javascript/tree/TreeControllerMeta.js create mode 100644 pandora_console/include/styles/tree_meta.css diff --git a/pandora_console/include/javascript/tree/TreeControllerMeta.js b/pandora_console/include/javascript/tree/TreeControllerMeta.js new file mode 100644 index 0000000000..ab56ab73f0 --- /dev/null +++ b/pandora_console/include/javascript/tree/TreeControllerMeta.js @@ -0,0 +1,1503 @@ +// Pandora FMS - http://pandorafms.com +// ================================================== +// 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 Lesser General Public License +// as published by the Free Software Foundation; 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. + +/*global $, _*/ + +var TreeController = { + controllers: [], + getController: function() { + var controller = { + index: -1, + recipient: "", + tree: [], + emptyMessage: "No data found.", + foundMessage: "Groups found", + errorMessage: "Error", + baseURL: "", + ajaxURL: "ajax.php", + ajaxPage: "include/ajax/tree.ajax", + detailRecipient: "", + filter: {}, + counterTitles: {}, + shouldHaveCounters: true, + reload: function() { + // Bad recipient + if ( + typeof this.recipient == "undefined" || + this.recipient.length == 0 + ) { + return; + } + + function _recursiveGroupsCount(elements, childGroupsLength) { + if (typeof childGroupsLength === "undefined") { + childGroupsLength = 0; + } + + _.each(elements, function(element) { + if (typeof element.children !== "undefined") { + childGroupsLength = _recursiveGroupsCount( + element.children, + childGroupsLength + ); + childGroupsLength += element.children.length; + } + }); + return childGroupsLength; + } + + // Load branch + function _processGroup(container, elements, rootGroup) { + var $group = $("
      "); + var childGroupsLength = _recursiveGroupsCount(elements); + + // First group. + if (typeof rootGroup != "undefined" && rootGroup == true) { + var messageLength = controller.tree.length; + if (childGroupsLength > 0) { + messageLength = childGroupsLength + controller.tree.length; + } + + group_message = controller.foundMessage + ": " + messageLength; + if (controller.foundMessage == "") { + group_message = ""; + } + $group + .addClass("tree-root") + .hide() + .prepend( + '
      ' + + '' + + "" + + (controller.tree.length > 0 ? group_message : "") + + "
      " + ); + } else { + // Normal group. + $group.addClass("tree-group").hide(); + } + + container.append($group); + + _.each(elements, function(element) { + element.jqObject = _processNode($group, element); + }); + + return $group; + } + + // Load leaf counters + function _processNodeCounters(container, counters, type) { + var hasCounters = false; + + if (typeof counters != "undefined") { + function _processNodeCounterTitle( + container, + elementType, + counterType + ) { + var defaultCounterTitles = { + total: { + agents: "Total agents", + modules: "Total modules", + none: "Total" + }, + alerts: { + agents: "Alerts fired", + modules: "Alerts fired", + none: "Alerts fired" + }, + critical: { + agents: "Critical agents", + modules: "Critical modules", + none: "Critical" + }, + warning: { + agents: "Warning agents", + modules: "Warning modules", + none: "Warning" + }, + unknown: { + agents: "Unknown agents", + modules: "Unknown modules", + none: "Unknown" + }, + not_init: { + agents: "Not init agents", + modules: "Not init modules", + none: "Not init" + }, + ok: { + agents: "Normal agents", + modules: "Normal modules", + none: "Normal" + } + }; + + var serviceCounterTitles = { + total_services: { + totals: "Services" + }, + total_agents: { + totals: "Agents" + }, + total_modules: { + totals: "Modules" + } + }; + + var IPAMSupernetCounterTitles = { + total_networks: { + totals: "Networks" + } + }; + + var IPAMNetworkCounterTitles = { + alive_ips: { + totals: "Alive IPs" + }, + total_ips: { + totals: "Total IPs" + } + }; + + try { + var title = ""; + + switch (elementType) { + case "group": + if ( + typeof controller.counterTitles != "undefined" && + typeof controller.counterTitles[counterType] != + "undefined" && + typeof controller.counterTitles[counterType].agents != + "undefined" + ) { + title = controller.counterTitles[counterType].agents; + } else { + title = defaultCounterTitles[counterType].agents; + } + break; + case "agent": + if ( + typeof controller.counterTitles != "undefined" && + typeof controller.counterTitles[counterType] != + "undefined" && + typeof controller.counterTitles[counterType].modules != + "undefined" + ) { + title = controller.counterTitles[counterType].modules; + } else { + title = defaultCounterTitles[counterType].modules; + } + break; + case "services": + title = serviceCounterTitles[counterType].totals; + break; + case "IPAM_supernets": + title = IPAMSupernetCounterTitles[counterType].totals; + break; + case "IPAM_networks": + title = IPAMNetworkCounterTitles[counterType].totals; + break; + default: + if ( + typeof controller.counterTitles != "undefined" && + typeof controller.counterTitles[counterType] != + "undefined" && + typeof controller.counterTitles[counterType].none != + "undefined" + ) { + title = controller.counterTitles[counterType].none; + } else { + title = defaultCounterTitles[counterType].none; + } + break; + } + if (title.length > 0) { + container + .data("title", title) + .addClass("forced_title") + .data("use_title_for_force_title", 1); // Trick to make easier the 'force title' output + } + } catch (error) { + // console.log(error); + } + } + + if (type == "services") { + var $counters = $("
      "); + $counters.addClass("tree-node-counters"); + + if ( + counters.total_services + + counters.total_agents + + counters.total_modules > + 0 + ) { + // Open the parentheses + $counters.append(" ("); + + if ( + typeof counters.total_services != "undefined" && + counters.total_services >= 0 + ) { + var $servicesCounter = $("
      "); + $servicesCounter + .addClass("tree-node-counter") + .addClass("total") + .html(counters.total_services); + + _processNodeCounterTitle( + $servicesCounter, + type, + "total_services" + ); + + $counters.append($servicesCounter); + } else { + var $servicesCounter = $("
      "); + $servicesCounter + .addClass("tree-node-counter") + .addClass("total") + .html("0"); + + _processNodeCounterTitle( + $servicesCounter, + type, + "total_services" + ); + + $counters.append($servicesCounter); + } + + if ( + typeof counters.total_agents != "undefined" && + counters.total_agents > 0 + ) { + var $agentsCounter = $("
      "); + $agentsCounter + .addClass("tree-node-counter") + .html(counters.total_agents); + + _processNodeCounterTitle( + $agentsCounter, + type, + "total_agents" + ); + + $counters.append(" : ").append($agentsCounter); + } else { + var $agentsCounter = $("
      "); + $agentsCounter + .addClass("tree-node-counter") + .addClass("total") + .html("0"); + + _processNodeCounterTitle( + $agentsCounter, + type, + "total_agents" + ); + + $counters.append(" : ").append($agentsCounter); + } + + if ( + typeof counters.total_modules != "undefined" && + counters.total_modules > 0 + ) { + var $modulesCounter = $("
      "); + $modulesCounter + .addClass("tree-node-counter") + .addClass("total") + .html(counters.total_modules); + + _processNodeCounterTitle( + $modulesCounter, + type, + "total_modules" + ); + + $counters.append(" : ").append($modulesCounter); + } else { + var $modulesCounter = $("
      "); + $modulesCounter + .addClass("tree-node-counter") + .addClass("total") + .html("0"); + + _processNodeCounterTitle( + $modulesCounter, + type, + "total_modules" + ); + + $counters.append(" : ").append($modulesCounter); + } + + // Close the parentheses + $counters.append(")"); + + hasCounters = true; + } + } else if (type == "IPAM_supernets") { + var $counters = $("
      "); + $counters.addClass("tree-node-counters"); + + if (counters.total_networks > 0) { + // Open the parentheses + $counters.append(" ("); + + if ( + typeof counters.total_networks !== "undefined" && + counters.total_networks >= 0 + ) { + var $networksCounter = $("
      "); + $networksCounter + .addClass("tree-node-counter") + .addClass("total") + .html(counters.total_networks); + + _processNodeCounterTitle( + $networksCounter, + type, + "total_networks" + ); + + $counters.append($networksCounter); + } else { + var $networksCounter = $("
      "); + $networksCounter + .addClass("tree-node-counter") + .addClass("total") + .html("0"); + + _processNodeCounterTitle( + $networksCounter, + type, + "total_networks" + ); + + $counters.append($networksCounter); + } + + // Close the parentheses + $counters.append(")"); + + hasCounters = true; + } + } else if (type == "IPAM_networks") { + var $counters = $("
      "); + $counters.addClass("tree-node-counters"); + + // Open the parentheses + $counters.append(" ("); + + if ( + typeof counters.alive_ips !== "undefined" && + counters.alive_ips >= 0 + ) { + var $aliveCounter = $("
      "); + $aliveCounter + .addClass("tree-node-counter") + .addClass("total") + .html(counters.alive_ips); + + _processNodeCounterTitle($aliveCounter, type, "alive_ips"); + + $counters.append($aliveCounter); + } else { + var $aliveCounter = $("
      "); + $aliveCounter + .addClass("tree-node-counter") + .addClass("total") + .html("0"); + + _processNodeCounterTitle($aliveCounter, type, "alive_ips"); + + $counters.append($aliveCounter); + } + + if ( + typeof counters.total_ips !== "undefined" && + counters.total_ips >= 0 + ) { + var $totalCounter = $("
      "); + $totalCounter + .addClass("tree-node-counter") + .addClass("total") + .html(counters.total_ips); + + _processNodeCounterTitle($totalCounter, type, "total_ips"); + + $counters.append(" : ").append($totalCounter); + } else { + var $totalCounter = $("
      "); + $totalCounter + .addClass("tree-node-counter") + .addClass("total") + .html("0"); + + _processNodeCounterTitle($totalCounter, type, "total_ips"); + + $counters.append(" : ").append($totalCounter); + } + + // Close the parentheses + $counters.append(")"); + + hasCounters = true; + } else { + var $counters = $("
      "); + $counters.addClass("tree-node-counters"); + + if (typeof counters.total != "undefined" && counters.total >= 0) { + var $totalCounter = $("
      "); + $totalCounter + .addClass("tree-node-counter") + .addClass("total") + .html(counters.total); + + _processNodeCounterTitle($totalCounter, type, "total"); + + // Open the parentheses + $counters.append("      [ "); + + $counters.append($totalCounter); + + if ( + typeof counters.alerts != "undefined" && + counters.alerts > 0 + ) { + var $firedCounter = $("
      "); + $firedCounter + .addClass("tree-node-counter") + .addClass("alerts") + .addClass("orange") + .html(counters.alerts); + + _processNodeCounterTitle($firedCounter, type, "alerts"); + + $counters.append(" : ").append($firedCounter); + } + if ( + typeof counters.critical != "undefined" && + counters.critical > 0 + ) { + var $criticalCounter = $("
      "); + $criticalCounter + .addClass("tree-node-counter") + .addClass("critical") + .addClass("red") + .html(counters.critical); + + _processNodeCounterTitle($criticalCounter, type, "critical"); + + $counters.append(" : ").append($criticalCounter); + } + if ( + typeof counters.warning != "undefined" && + counters.warning > 0 + ) { + var $warningCounter = $("
      "); + $warningCounter + .addClass("tree-node-counter") + .addClass("warning") + .addClass("yellow") + .html(counters.warning); + + _processNodeCounterTitle($warningCounter, type, "warning"); + + $counters.append(" : ").append($warningCounter); + } + if ( + typeof counters.unknown != "undefined" && + counters.unknown > 0 + ) { + var $unknownCounter = $("
      "); + $unknownCounter + .addClass("tree-node-counter") + .addClass("unknown") + .addClass("grey") + .html(counters.unknown); + + _processNodeCounterTitle($unknownCounter, type, "unknown"); + + $counters.append(" : ").append($unknownCounter); + } + if ( + typeof counters.not_init != "undefined" && + counters.not_init > 0 + ) { + var $notInitCounter = $("
      "); + $notInitCounter + .addClass("tree-node-counter") + .addClass("not_init") + .addClass("blue") + .html(counters.not_init); + + _processNodeCounterTitle($notInitCounter, type, "not_init"); + + $counters.append(" : ").append($notInitCounter); + } + if (typeof counters.ok != "undefined" && counters.ok > 0) { + var $okCounter = $("
      "); + $okCounter + .addClass("tree-node-counter") + .addClass("ok") + .addClass("green") + .html(counters.ok); + + _processNodeCounterTitle($okCounter, type, "ok"); + + $counters.append(" : ").append($okCounter); + } + } + + // Close the parentheses + $counters.append(" ]"); + + hasCounters = true; + } + + // Add the counters html to the container + container.append($counters); + } + + return hasCounters; + } + + // Load leaf + function _processNode(container, element) { + // type, [id], [serverID], callback + function _getTreeDetailData(type, id, serverID, callback) { + var lastParam = arguments[arguments.length - 1]; + var callback; + if (typeof lastParam === "function") callback = lastParam; + + var serverID; + if (arguments.length >= 4) serverID = arguments[2]; + var id; + if (arguments.length >= 3) id = arguments[1]; + var type; + if (arguments.length >= 2) type = arguments[0]; + + if (typeof type === "undefined") + throw new TypeError("Type required"); + if (typeof callback === "undefined") + throw new TypeError("Callback required"); + + var postData = { + page: controller.ajaxPage, + getDetail: 1, + type: type, + auth_class: controller.auth_class, + id_user: controller.id_user, + auth_hash: controller.auth_hash + }; + + if (typeof id !== "undefined") postData.id = id; + if (typeof serverID !== "undefined") postData.serverID = serverID; + + $.ajax({ + url: controller.ajaxURL, + type: "POST", + dataType: "html", + data: postData, + success: function(data, textStatus, xhr) { + callback(null, data); + }, + error: function(xhr, textStatus, errorThrown) { + callback(errorThrown); + } + }); + } + + var $node = $("
    • "); + var $leafIcon = $("
      "); + var $content = $("
      "); + + // Leaf icon + $leafIcon.addClass("leaf-icon invert_filter"); + + // Content + $content.addClass("node-content"); + var disabled = false; + if (element.disabled == true) { + disabled = true; + $content.addClass("disabled"); + } + switch (element.type) { + case "group": + if ( + typeof element.icon != "undefined" && + element.icon.length > 0 + ) { + $content.append( + ' ' + ); + } else if ( + typeof element.iconHTML != "undefined" && + element.iconHTML.length > 0 + ) { + $content.append(element.iconHTML + " "); + } + $content.append(element.name); + + if (typeof element.edit != "undefined") { + var url_edit = + controller.baseURL + + "index.php?sec=gagente&sec2=godmode/groups/configure_group&tab=tree&id_group=" + + element.id; + var $updateicon = $( + '' + ); + var $updatebtn = $('
      ').append( + $updateicon + ); + $content.append($updatebtn); + } + + if (typeof element.delete != "undefined") { + var url_delete = + controller.baseURL + + "index.php?sec=gagente&sec2=godmode/groups/group_list&tab=tree&delete_group=1&id_group=" + + element.id; + var $deleteBtn = $( + '' + ); + $deleteBtn.click(function(event) { + var ok_function = function() { + window.location.replace(url_delete); + }; + display_confirm_dialog( + element.delete.messages.messg, + element.delete.messages.confirm, + element.delete.messages.cancel, + ok_function + ); + }); + $content.append($deleteBtn); + } + + if (typeof element.alerts != "undefined") { + $content.append(element.alerts); + } + + break; + case "agent": + // Is quiet + + if ( + typeof element.quietImageHTML != "undefined" && + element.quietImageHTML.length > 0 + ) { + var $quietImage = $(element.quietImageHTML); + $quietImage.addClass("agent-quiet"); + + $content.append($quietImage); + } + // Status image + if ( + typeof element.statusImageHTML != "undefined" && + element.statusImageHTML.length > 0 + ) { + var $statusImage = $(element.statusImageHTML); + $statusImage.addClass("agent-status"); + + $content.append($statusImage); + } + + // Events by agent + if (element.showEventsBtn == 1) { + if (typeof element.eventAgent != "undefined") { + $content.append( + '' + ); + var $eventImage = $( + ' ' + ); + $eventImage.addClass("agent-alerts-fired"); + $eventImage + .click(function(e) { + e.preventDefault(); + + document + .getElementById( + "hiddenAgentsEventsForm-" + element.eventAgent + ) + .submit(); + }) + .css("cursor", "pointer"); + + $content.append($eventImage); + } + } + + $content.append(" " + element.alias); + break; + case "IPAM_supernets": + var IPAMSupernetDetailImage = $( + ' ' + ); + + if (typeof element.id !== "undefined") { + IPAMSupernetDetailImage.click(function(e) { + e.preventDefault(); + + var postData = { + page: "enterprise/include/ajax/ipam.ajax", + show_networkmap_statistics: 1, + "node_data[id_net]": element.id, + "node_data[type_net]": "supernet" + }; + + $.ajax({ + url: controller.ajaxURL, + type: "POST", + dataType: "html", + data: postData, + success: function(data, textStatus, xhr) { + controller.detailRecipient + .render("IPAMsupernets", data) + .open(); + } + }); + }).css("cursor", "pointer"); + + $content.append(IPAMSupernetDetailImage); + } + + if (element.name !== null) { + $content.append("   " + element.name); + } + + break; + case "IPAM_networks": + $content.addClass("ipam-network"); + + var IPAMNetworkDetailImage = $( + ' ' + ); + + if (typeof element.id !== "undefined") { + IPAMNetworkDetailImage.click(function(e) { + e.preventDefault(); + + //window.location.href = element.IPAMNetworkDetail; + var postData = { + page: "enterprise/include/ajax/ipam.ajax", + show_networkmap_statistics: 1, + "node_data[id_net]": element.id, + "node_data[type_net]": "network" + }; + + $.ajax({ + url: controller.ajaxURL, + type: "POST", + dataType: "html", + data: postData, + success: function(data, textStatus, xhr) { + controller.detailRecipient + .render("IPAMnetwork", data) + .open(); + } + }); + }).css("cursor", "pointer"); + + $content.append(IPAMNetworkDetailImage); + } + + if (element.name !== null) { + $content.append("   " + element.name); + } + + break; + case "services": + if ( + typeof element.statusImageHTML != "undefined" && + element.statusImageHTML.length > 0 + ) { + var $statusImage = $(element.statusImageHTML); + $statusImage.addClass("agent-status"); + + $content.append($statusImage); + } + var image_tooltip = + '' +
+                element.name +
+                ' '; + + var $serviceDetailImage = $( + ' ' + ); + + if ( + typeof element.serviceDetail != "undefined" && + element.name != null + ) { + $serviceDetailImage + .click(function(e) { + e.preventDefault(); + + window.location.href = element.serviceDetail; + }) + .css("cursor", "pointer"); + $content.append($serviceDetailImage); + $content.append(" " + image_tooltip); + + if ( + typeof element.elementDescription !== "undefined" && + element.elementDescription != "" + ) { + $content.append(" " + element.elementDescription); + } else if ( + typeof element.description !== "undefined" && + element.description != "" + ) { + $content.append(" " + element.description); + } else { + $content.append(" " + element.name); + } + } else { + $content.remove($node); + } + + break; + case "modules": + if ( + typeof element.statusImageHTML != "undefined" && + element.statusImageHTML.length > 0 + ) { + var $statusImage = $(element.statusImageHTML); + $statusImage.addClass("agent-status"); + + $content.append($statusImage); + } + + // Events by module + if (element.showEventsBtn == 1) { + if (typeof element.eventModule != "undefined") { + $content.append( + '' + ); + var $moduleImage = $( + ' ' + ); + $moduleImage + .click(function(e) { + e.preventDefault(); + + document + .getElementById( + "hiddenModulesEventsForm-" + element.eventModule + ) + .submit(); + }) + .css("cursor", "pointer"); + + $content.append($moduleImage); + } + } + + $content.append(" " + element.name); + break; + case "module": + $content.addClass("module"); + + // Status image + if ( + typeof element.statusImageHTML != "undefined" && + element.statusImageHTML.length > 0 + ) { + var $statusImage = $(element.statusImageHTML); + $statusImage.addClass("module-status"); + + $content.append($statusImage); + } + + element.name = htmlDecode(element.name); + // Name max 42 chars. + $content.append( + '' + + element.name.substring(0, 42) + + (element.name.length > 42 ? "..." : "") + + "" + ); + + // Avoiding 'undefined' text. + if (typeof element.value === "undefined") { + element.value = ""; + } + + // Value. + $content.append( + '' + element.value + "" + ); + + if ( + typeof element.showGraphs != "undefined" && + element.showGraphs != 0 + ) { + // Graph histogram pop-up + if (typeof element.histogramGraph != "undefined") { + var graphImageHistogram = $( + ' ' + ); + + graphImageHistogram + .addClass("module-graph") + .click(function(e) { + e.stopPropagation(); + try { + winopeng_var( + element.histogramGraph.url, + element.histogramGraph.handle, + 800, + 480 + ); + } catch (error) { + // console.log(error); + } + }); + + $content.append(graphImageHistogram); + } + + // Graph pop-up + if (typeof element.moduleGraph != "undefined") { + if (element.statusImageHTML.indexOf("data:image") != -1) { + var $graphImage = $( + ' ' + ); + } else { + var $graphImage = $( + ' ' + ); + } + + $graphImage.addClass("module-graph").click(function(e) { + e.stopPropagation(); + if (element.statusImageHTML.indexOf("data:image") != -1) { + try { + winopeng_var( + decodeURI(element.snapshot[0]), + element.snapshot[1], + element.snapshot[2], + element.snapshot[3] + ); + } catch (error) { + // console.log(error); + } + } else { + try { + winopeng_var( + element.moduleGraph.url, + element.moduleGraph.handle, + 800, + 480 + ); + } catch (error) { + // console.log(error); + } + } + }); + + $content.append($graphImage); + } + + // Data pop-up + if (typeof element.id != "undefined" && !isNaN(element.id)) { + if (isNaN(element.metaID)) { + var $dataImage = $( + ' ' + ); + $dataImage.addClass("module-data").click(function(e) { + e.stopPropagation(); + + try { + var serverName = + element.serverName.length > 0 + ? element.serverName + : ""; + if ($("#module_details_window").length > 0) + show_module_detail_dialog( + element.id, + "", + serverName, + 0, + 86400, + element.name.replace(/ /g, " ") + ); + } catch (error) { + // console.log(error); + } + }); + + $content.append($dataImage); + } + } + } + + // Alerts + if ( + typeof element.alertsImageHTML != "undefined" && + element.alertsImageHTML.length > 0 + ) { + var $alertsImage = $(element.alertsImageHTML); + + $alertsImage + .addClass("module-alerts") + .click(function(e) { + _getTreeDetailData( + "alert", + element.id, + element.serverID, + function(error, data) { + if (error) { + // console.error(error); + } else { + controller.detailRecipient + .render(element.name, data) + .open(); + } + } + ); + + // Avoid the execution of the module detail event + e.stopPropagation(); + }) + .css("cursor", "pointer"); + + $content.append($alertsImage); + } + + break; + case "os": + if ( + typeof element.icon != "undefined" && + element.icon.length > 0 + ) { + $content.append( + ' ' + ); + } + $content.append(element.name); + break; + case "tag": + if ( + typeof element.icon != "undefined" && + element.icon.length > 0 + ) { + $content.append( + ' ' + ); + } else { + $content.append( + ' ' + ); + } + $content.append(element.name); + break; + case "services": + // Status image + if ( + typeof element.statusImageHTML != "undefined" && + element.statusImageHTML.length > 0 + ) { + var $statusImage = $(element.statusImageHTML); + $statusImage.addClass("agent-status"); + + $content.append($statusImage); + } + $content.append(element.name); + break; + default: + $content.append(element.name); + break; + } + + // Load the status counters + var hasCounters = _processNodeCounters( + $content, + element.counters, + element.type + ); + //Don't show empty groups + if (element.type == "agent") { + if (!hasCounters) { + return; + } + } + // If detail container exists, show the data. + if ( + typeof controller.detailRecipient !== "undefined" || + disabled == false + ) { + if (element.type == "agent" || element.type == "module") { + if (typeof element.noAcl === "undefined") { + $content + .click(function(e) { + _getTreeDetailData( + element.type, + element.id, + element.serverID, + function(error, data) { + if (error) { + // console.error(error); + } else { + controller.detailRecipient + .render(element.name, data) + .open(); + } + } + ); + }) + .css("cursor", "pointer"); + } + } + } + + $node + .addClass("tree-node") + .append($leafIcon) + .append($content); + + container.append($node); + + $node.addClass("leaf-empty"); + + if ( + (typeof element.children != "undefined" && + element.children.length > 0) || + element.disabled == false + ) { + // Add children + var $children = _processGroup($node, element.children); + $node.data("children", $children); + + if ( + typeof element.searchChildren == "undefined" || + !element.searchChildren + ) { + $leafIcon.click(function(e) { + e.preventDefault(); + + if ($node.hasClass("leaf-open")) { + $node + .removeClass("leaf-open") + .addClass("leaf-closed") + .data("children") + .slideUp(); + } else { + $node + .removeClass("leaf-closed") + .addClass("leaf-open") + .data("children") + .slideDown(); + } + }); + } + } + + if ( + typeof element.searchChildren != "undefined" && + element.searchChildren + ) { + if ( + element.rootType == "group_edition" && + typeof element.children == "undefined" + ) { + $node.addClass("leaf-empty"); + } else { + $node.removeClass("leaf-empty").addClass("leaf-closed"); + $leafIcon.click(function(e) { + e.preventDefault(); + + if ( + !$node.hasClass("leaf-loading") && + !$node.hasClass("children-loaded") && + !$node.hasClass("leaf-empty") + ) { + $node + .removeClass("leaf-closed") + .removeClass("leaf-error") + .addClass("leaf-loading"); + + $.ajax({ + url: controller.ajaxURL, + type: "POST", + dataType: "json", + data: { + page: controller.ajaxPage, + getChildren: 1, + id: element.id, + type: element.type, + rootID: element.rootID, + serverID: element.serverID, + rootType: element.rootType, + metaID: element.metaID, + title: element.title, + filter: controller.filter, + auth_class: controller.auth_class, + id_user: controller.id_user, + auth_hash: controller.auth_hash + }, + complete: function(xhr, textStatus) { + $node.removeClass("leaf-loading"); + $node.addClass("children-loaded"); + }, + success: function(data, textStatus, xhr) { + if (data.success) { + var $group = $node.children("ul.tree-group"); + if ( + (typeof data.tree != "undefined" && + data.tree.length > 0) || + $group.length > 0 + ) { + $node.addClass("leaf-open"); + + if ($group.length <= 0) { + $group = $("
        "); + $group.addClass("tree-group").hide(); + $node.append($group); + } + + // Get the main values of the tree. + var rawTree = Object.values(data.tree); + // Sorting tree by description (services.treeview_services.php). + rawTree.sort(function(a, b) { + // Only the services are ordered since only they have the elementDescription property. + if (a.elementDescription && b.elementDescription) { + var x = a.elementDescription.toLowerCase(); + var y = b.elementDescription.toLowerCase(); + if (x < y) { + return -1; + } + if (x > y) { + return 1; + } + } + return 0; + }); + + _.each(rawTree, function(element) { + element.jqObject = _processNode($group, element); + }); + + $group.slideDown(); + + $node.data("children", $group); + + // Add again the hover event to the 'force_callback' elements + forced_title_callback(); + } else { + $node.addClass("leaf-empty"); + } + } else { + $node.addClass("leaf-error"); + } + }, + error: function(xhr, textStatus, errorThrown) { + $node.addClass("leaf-error"); + } + }); + } else if (!$node.hasClass("leaf-empty")) { + if ($node.hasClass("leaf-open")) { + $node + .removeClass("leaf-open") + .addClass("leaf-closed") + .data("children") + .slideUp(); + } else { + $node + .removeClass("leaf-closed") + .addClass("leaf-open") + .data("children") + .slideDown(); + } + } + }); + } + } + + return $node; + } + + if (controller.recipient.length == 0) { + return; + } else if (controller.tree.length == 0) { + controller.recipient.empty(); + controller.recipient.html( + "
        " + controller.emptyMessage + "
        " + ); + return; + } + + controller.recipient.empty(); + var $children = _processGroup(this.recipient, this.tree, true); + $children.show(); + + controller.recipient.data("children", $children); + + // Add again the hover event to the 'force_callback' elements + forced_title_callback(); + }, + load: function() { + this.reload(); + }, + changeTree: function(tree) { + this.tree = tree; + this.reload(); + }, + init: function(data) { + if ( + typeof data.recipient !== "undefined" && + data.recipient.length > 0 + ) { + this.recipient = data.recipient; + } + if (typeof data.detailRecipient !== "undefined") { + this.detailRecipient = data.detailRecipient; + } + if (typeof data.tree !== "undefined") { + this.tree = data.tree; + } + if ( + typeof data.emptyMessage !== "undefined" && + data.emptyMessage.length > 0 + ) { + this.emptyMessage = data.emptyMessage; + } + if ( + typeof data.foundMessage !== "undefined" && + data.foundMessage.length > 0 + ) { + this.foundMessage = data.foundMessage; + } + if ( + typeof data.errorMessage !== "undefined" && + data.errorMessage.length > 0 + ) { + this.errorMessage = data.errorMessage; + } + if (typeof data.baseURL !== "undefined" && data.baseURL.length > 0) { + this.baseURL = data.baseURL; + } + if (typeof data.ajaxURL !== "undefined" && data.ajaxURL.length > 0) { + this.ajaxURL = data.ajaxURL; + } + if (typeof data.ajaxPage !== "undefined" && data.ajaxPage.length > 0) { + this.ajaxPage = data.ajaxPage; + } + if (typeof data.filter !== "undefined") { + this.filter = data.filter; + } + + if (typeof data.auth_class !== "undefined") { + this.auth_class = data.auth_class; + } + if (typeof data.id_user !== "undefined") { + this.id_user = data.id_user; + } + if (typeof data.auth_hash !== "undefined") { + this.auth_hash = data.auth_hash; + } + if ( + typeof data.tree !== "undefined" && + Array.isArray(data.tree) && + data.tree.length > 0 && + data.tree[0]["rootType"] == "services" + ) { + this.foundMessage = ""; + } + this.load(); + }, + remove: function() { + if (typeof this.recipient != "undefined" && this.recipient.length > 0) { + this.recipient.empty(); + } + + if (this.index > -1) { + TreeController.controllers.splice(this.index, 1); + } + } + }; + controller.index = TreeController.controllers.push(controller) - 1; + + return controller; + } +}; diff --git a/pandora_console/include/lib/Dashboard/Widgets/tree_view.php b/pandora_console/include/lib/Dashboard/Widgets/tree_view.php index bdb30b16ce..373e70c1f6 100644 --- a/pandora_console/include/lib/Dashboard/Widgets/tree_view.php +++ b/pandora_console/include/lib/Dashboard/Widgets/tree_view.php @@ -134,7 +134,12 @@ class TreeViewWidget extends Widget ) { global $config; - ui_require_css_file('tree'); + if (is_metaconsole() === true) { + ui_require_css_file('tree_meta'); + } else { + ui_require_css_file('tree'); + } + ui_require_css_file('fixed-bottom-box'); // WARNING: Do not edit. This chunk must be in the constructor. @@ -544,7 +549,12 @@ class TreeViewWidget extends Widget $height = $size['height']; // Css Files. - \ui_require_css_file('tree', 'include/styles/', true); + if (is_metaconsole() === true) { + \ui_require_css_file('tree_meta', 'include/styles/', true); + } else { + \ui_require_css_file('tree', 'include/styles/', true); + } + if ($config['style'] == 'pandora_black' && !is_metaconsole()) { \ui_require_css_file('pandora_black', 'include/styles/', true); } @@ -556,11 +566,19 @@ class TreeViewWidget extends Widget 'include/javascript/i18n/' ); - \ui_require_javascript_file( - 'TreeController', - 'include/javascript/tree/', - true - ); + if (is_metaconsole() === true) { + \ui_require_javascript_file( + 'TreeControllerMeta', + 'include/javascript/tree/', + true + ); + } else { + \ui_require_javascript_file( + 'TreeController', + 'include/javascript/tree/', + true + ); + } \ui_require_javascript_file( 'fixed-bottom-box', diff --git a/pandora_console/include/styles/tree_meta.css b/pandora_console/include/styles/tree_meta.css new file mode 100644 index 0000000000..08b1d635ed --- /dev/null +++ b/pandora_console/include/styles/tree_meta.css @@ -0,0 +1,195 @@ +.tree-root { + margin-top: 0px; + margin-bottom: 0px; +} + +.tree-group { + margin-left: 24px; + padding-top: 1px; +} + +.tree-node { + white-space: nowrap; + + background-image: url(../../images/tree/branch.png); + background-position: 0px 0px; + background-repeat: repeat-y; + + min-height: 26px; +} + +div.tree-node { + background: 0 0; +} + +div.tree-node span { + font-size: 1.2em; +} + +.tree-node:last-child { + background: 0 0; +} +.node-content { + height: 26px; + font-size: 1.2em; + display: flex; + flex-direction: row; + flex-wrap: wrap; + align-items: center; +} + +.node-content > img { + position: relative; + top: -2px; +} + +.node-content:hover { + background-color: #fff; + + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} + +.leaf-icon { + width: 18px; + height: 20px; +} + +.node-content, +.leaf-icon { + display: inline-block; +} + +.node-content > img, +.node-content > div { + display: inline; +} + +.tree-node.leaf-open > .leaf-icon { + background-image: url(../../images/tree/last_expanded.png); + cursor: pointer; +} + +.tree-node.tree-first.leaf-open > .leaf-icon { + background-image: url(../../images/tree/first_expanded.png); + cursor: pointer; +} + +.tree-node.leaf-closed > .leaf-icon { + background-image: url(../../images/tree/last_closed.png); + cursor: pointer; +} + +.tree-node.tree-first.leaf-closed > .leaf-icon { + background-image: url(../../images/tree/first_closed.png); + cursor: pointer; +} + +.tree-node.leaf-loading > .leaf-icon { + background-image: url(../../images/tree/last_expanded.png); +} + +.tree-node.leaf-empty > .leaf-icon { + background-image: url(../../images/tree/last_leaf.png); +} + +.tree-node.tree-first.leaf-empty > .leaf-icon { + background-image: url(../../images/tree/first_leaf.png); +} + +.tree-node.leaf-error > .leaf-icon { + background-image: url(../../images/tree/last_leaf.png); +} + +.tree-node > .leaf-icon { + background-position: 0px 0px; + background-repeat: no-repeat; +} + +.tree-node > .node-content > img { + max-height: 20px; + /*max-width: 20px;*/ +} + +.tree-node > .node-content > img.module-data, +.tree-node > .node-content > img.module-graph { + cursor: pointer; + padding-right: 3px; +} + +.tree-node > .node-content > .agent-status.status_balls, +.tree-node > .node-content > .status_small_balls { + width: 0.6em; + height: 1.5em; + margin-bottom: -0.4em; + border-radius: 0; +} +.tree-node > .node-content > .module-status.status_small_balls { + width: 0.4em; +} + +.tree-node > .node-content > .module-name { + margin: 0 0 0 1em; + width: 250px; + display: inline-block; +} + +.tree-node > .node-content > .module-value { + width: 120px; + display: inline-block; + text-align: right; + margin: 0 1em; +} + +.tree-node > .node-content > img.module-server-type, +.tree-node > .node-content > img.agent-status, +.tree-node > .node-content > img.agent-alerts-fired, +.tree-node > .node-content > img.agent-quiet, +.tree-node > .node-content > img.module-status, +.tree-node > .node-content > img.module-alerts { + padding-right: 3px; +} + +.tree-node > .node-content > .tree-node-counters, +.tree-node > .node-content > .tree-node-counters > .tree-node-counter { + display: inline; +} + +.tree-node > .node-content > .tree-node-counters { + font-size: 1.2em; +} + +.tree-node > .node-content > img { + vertical-align: middle; +} + +.tree-node > .node-content > .tree-node-counters > .tree-node-counter { + font-weight: bold; + font-size: 0.9em; + cursor: default; +} + +div#tree-controller-recipient { + text-align: left; + width: 98%; + margin-top: 10px; +} + +.tree-controller-recipient { + text-align: left; + width: 98%; + margin-top: 10px; +} + +.tree-node > .node-content > div + div:not(.tree-node-counters) { + margin-left: 3px; +} + +.tree-node .disabled { + filter: opacity(0.3); +} + +.ipam-network { + font-size: 9pt; +} diff --git a/pandora_console/operation/tree.php b/pandora_console/operation/tree.php index 29d4c95b78..a662da4d99 100755 --- a/pandora_console/operation/tree.php +++ b/pandora_console/operation/tree.php @@ -27,7 +27,12 @@ */ // Begin. -ui_require_css_file('tree'); +if (is_metaconsole() === true) { + ui_require_css_file('tree_meta'); +} else { + ui_require_css_file('tree'); +} + ui_require_css_file('fixed-bottom-box'); global $config; @@ -309,7 +314,12 @@ html_print_input_hidden('tag-id', $tag_id); ui_include_time_picker(); ui_require_jquery_file('ui.datepicker-'.get_user_language(), 'include/javascript/i18n/'); -ui_require_javascript_file('TreeController', 'include/javascript/tree/'); +if (is_metaconsole() === true) { + ui_require_javascript_file('TreeControllerMeta', 'include/javascript/tree/'); +} else { + ui_require_javascript_file('TreeController', 'include/javascript/tree/'); +} + ui_print_spinner(__('Loading')); /* html_print_image( From 7ac794f5ffb1c11496110352a350d8dd685aa358 Mon Sep 17 00:00:00 2001 From: Pablo Aragon Date: Tue, 21 Feb 2023 11:28:26 +0100 Subject: [PATCH 315/563] 10469-Fix omnishell view --- pandora_console/include/functions_ui.php | 2 +- .../tiny_mce/plugins/table/css/table.css | 6 +- pandora_console/include/styles/omnishell.css | 195 +++++++++++------- pandora_console/include/styles/tables.css | 2 +- 4 files changed, 129 insertions(+), 76 deletions(-) diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index e0790db4e7..4675737c57 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -3559,7 +3559,7 @@ function ui_print_datatable(array $parameters) $filter .= $parameters['form']['html']; } - $filter .= '
          '; + $filter .= '
            '; foreach ($parameters['form']['inputs'] as $input) { $filter .= html_print_input(($input + ['return' => true]), 'li'); diff --git a/pandora_console/include/javascript/tiny_mce/plugins/table/css/table.css b/pandora_console/include/javascript/tiny_mce/plugins/table/css/table.css index d11c3f69cb..f11a6c13a1 100644 --- a/pandora_console/include/javascript/tiny_mce/plugins/table/css/table.css +++ b/pandora_console/include/javascript/tiny_mce/plugins/table/css/table.css @@ -1,13 +1,13 @@ /* CSS file for table dialog in the table plugin */ .panel_wrapper div.current { - height: 245px; + height: 245px; } .advfield { - width: 200px; + width: 200px; } #class { - width: 150px; + width: 150px; } diff --git a/pandora_console/include/styles/omnishell.css b/pandora_console/include/styles/omnishell.css index 803c790660..03810e9a89 100644 --- a/pandora_console/include/styles/omnishell.css +++ b/pandora_console/include/styles/omnishell.css @@ -180,7 +180,7 @@ ul.wizard { display: flex; } -.no-class.action-buttons.mw120px.textright.sorting_disabled, +.textright.sorting_disabled, .textright { text-align: right; padding-right: 2em; @@ -306,56 +306,8 @@ div.arrow_box:before { /* * Breadcrum */ - -#menu_tab_frame_view_bc { - display: flex; - justify-content: space-between; - border-bottom: 2px solid #82b92e; - max-height: 70px; - min-height: 55px; - width: 100%; - padding-right: 0px; - margin-left: 0px; - margin-bottom: 20px; - height: 55px; - box-sizing: border-box; - background-color: #fafafa; - border-top-right-radius: 7px; - border-top-left-radius: 7px; - box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.1); -} - -#menu_tab_frame_view_bc .breadcrumbs_container { - align-self: flex-start; -} - -.breadcrumbs_container { - padding-top: 4px; - text-indent: 0.25em; - padding-left: 2.5em; -} - -.breadcrumb_link { - color: #848484; - font-size: 10pt; - text-decoration: none; -} - -span.breadcrumb_link { - color: #d0d0d0; - font-size: 12pt; -} - -.breadcrumb_link.selected { - color: #95b750; -} - -.breadcrumb_link.selected:hover { - color: #95b750; -} - -.breadcrumb_link:hover { - color: #95b750; +#menu_tab_frame_view > #menu_tab_left { + margin-left: 20px; } /* @@ -398,26 +350,8 @@ label { width: 100%; } -li > input[type="text"], -li > input[type="email"], -li > input[type="password"], -li > input[type="email"], -.discovery_text_input > input[type="password"], -.discovery_text_input > input[type="text"], -#interval_manual > input[type="text"] { - background-color: transparent; - border: none; - border-radius: 0; - border-bottom: 1px solid #ccc; - padding: 0px 0px 2px 0px; - box-sizing: border-box; - margin-bottom: 4px; -} - -#interval_manual > input[type="text"] { - width: 50px; - margin-left: 10px; - margin-right: 10px; +li .select2 { + max-width: 400px !important; } .discovery_list_input { @@ -518,3 +452,122 @@ div.ui-tooltip.ui-corner-all.ui-widget-shadow.ui-widget.ui-widget-content.uitool bottom: -20px; top: auto; } + +form > .white_box { + padding: 20px; + margin: 20px; +} + +.white_box { + margin: 20px; +} + +button[type="submit"] { + margin-left: 20px; +} + +li > input[type="text"] { + max-width: 428px; +} + +div.edit_discovery_input > div { + margin-bottom: 8px !important; +} + +div.discovery_text_input > input { + width: 100% !important; +} + +li > .select2, +li > .selection, +li > .select2-selection { + min-width: 428px !important; +} + +.edit_discovery_info { + margin: 0px !important; + padding: 0px !important; +} + +.box-flat { + margin: 20px; +} + +.mrgn_20px { + margin: 20px !important; +} + +.omnishell_results_wrapper { + max-width: 100% !important; +} + +.no-text-imp { + padding: 0px !important; + margin: 0px !important; +} + +.candeleted { + margin: 0px 10px !important; +} + +.dataTables_length, +.dt-buttons { + margin-left: 20px; +} + +table { + max-width: calc(100% - 40px) !important; +} + +/* Filter */ +li > .action-buttons { + padding: 0px; +} + +ul.wizard > li, +ul.datatable_filter > li { + display: grid; +} + +ul.wizard > li > label, +ul.datatable_filter > li > label { + margin-bottom: 8px !important; +} + +ul.datatable_filter > li:has(div.action-buttons) { + margin-bottom: 0; +} + +ul.datatable_filter > li > div.action-buttons > button { + margin-bottom: 0px !important; +} + +#backgroundMaskId { + bottom: 0px !important; + height: auto !important; +} + +.action_buttons_right_content { + padding-left: 20px; +} + +#image-1, +#image-2 { + padding-left: 0px !important; +} + +.flex-column { + margin-bottom: 10px !important; +} + +.dataTables_length { + margin-bottom: 50px !important; +} + +.item_status_tree_view { + position: initial; +} + +.ui-dialog.ui-corner-all.ui-widget.ui-widget-content { + z-index: 10000 !important; +} diff --git a/pandora_console/include/styles/tables.css b/pandora_console/include/styles/tables.css index a726e6ecb9..04225827bf 100644 --- a/pandora_console/include/styles/tables.css +++ b/pandora_console/include/styles/tables.css @@ -461,7 +461,7 @@ a.pandora_pagination.current:hover { } .table_action_buttons a:hover { - background-color: #fff; + background-color: transparent; border-radius: 4px; } From 77f4f4a68001f534afd304f85870445f426dc08d Mon Sep 17 00:00:00 2001 From: rafael Date: Tue, 21 Feb 2023 12:34:11 +0100 Subject: [PATCH 316/563] 10435 set new version number --- extras/deploy-scripts/deploy_ext_database_el8.sh | 2 +- extras/deploy-scripts/deploy_ext_database_ubuntu_2204.sh | 2 +- extras/deploy-scripts/pandora_deploy_community_el8.sh | 2 +- extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/extras/deploy-scripts/deploy_ext_database_el8.sh b/extras/deploy-scripts/deploy_ext_database_el8.sh index 93dc1c561c..52bad444fe 100644 --- a/extras/deploy-scripts/deploy_ext_database_el8.sh +++ b/extras/deploy-scripts/deploy_ext_database_el8.sh @@ -9,7 +9,7 @@ # RedHat 8.5 #Constants -S_VERSION='202302081' +S_VERSION='202302201' LOGFILE="/tmp/deploy-ext-db-$(date +%F).log" diff --git a/extras/deploy-scripts/deploy_ext_database_ubuntu_2204.sh b/extras/deploy-scripts/deploy_ext_database_ubuntu_2204.sh index 22349ea5ce..dba6aa2773 100644 --- a/extras/deploy-scripts/deploy_ext_database_ubuntu_2204.sh +++ b/extras/deploy-scripts/deploy_ext_database_ubuntu_2204.sh @@ -16,7 +16,7 @@ PANDORA_AGENT_CONF=/etc/pandora/pandora_agent.conf WORKDIR=/opt/pandora/deploy -S_VERSION='202302081' +S_VERSION='202302201' LOGFILE="/tmp/deploy-ext-db-$(date +%F).log" rm -f $LOGFILE &> /dev/null # remove last log before start diff --git a/extras/deploy-scripts/pandora_deploy_community_el8.sh b/extras/deploy-scripts/pandora_deploy_community_el8.sh index 4fa0814d59..721d60ffb5 100644 --- a/extras/deploy-scripts/pandora_deploy_community_el8.sh +++ b/extras/deploy-scripts/pandora_deploy_community_el8.sh @@ -14,7 +14,7 @@ PANDORA_SERVER_CONF=/etc/pandora/pandora_server.conf PANDORA_AGENT_CONF=/etc/pandora/pandora_agent.conf -S_VERSION='202301251' +S_VERSION='202302201' LOGFILE="/tmp/pandora-deploy-community-$(date +%F).log" # define default variables diff --git a/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh b/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh index 5ac47ca60b..06f23804db 100644 --- a/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh +++ b/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh @@ -16,7 +16,7 @@ PANDORA_AGENT_CONF=/etc/pandora/pandora_agent.conf WORKDIR=/opt/pandora/deploy -S_VERSION='202301251' +S_VERSION='202302201' LOGFILE="/tmp/pandora-deploy-community-$(date +%F).log" rm -f $LOGFILE &> /dev/null # remove last log before start From 47bd0081ef72e14aeb90f25518b091112b583263 Mon Sep 17 00:00:00 2001 From: Calvo Date: Tue, 21 Feb 2023 12:56:26 +0100 Subject: [PATCH 317/563] Core: Fix and optimized lag calculaton. Console: optimized and unified queries with server --- pandora_console/include/functions_servers.php | 79 +++++++++++-------- pandora_server/lib/PandoraFMS/Core.pm | 67 +++++++++------- 2 files changed, 87 insertions(+), 59 deletions(-) diff --git a/pandora_console/include/functions_servers.php b/pandora_console/include/functions_servers.php index 3f9fe1a6b2..a1dfc32197 100644 --- a/pandora_console/include/functions_servers.php +++ b/pandora_console/include/functions_servers.php @@ -1,4 +1,5 @@ 0 - AND tagente.disabled = 0 - AND tagente.id_agente = tagente_estado.id_agente - AND tagente_modulo.disabled = 0 - AND tagente_modulo.id_agente_modulo = tagente_estado.id_agente_modulo - AND current_interval > 0 - AND running_by = '.$server['id_server'].' - AND (UNIX_TIMESTAMP() - utimestamp) < ( current_interval * 10) - AND (UNIX_TIMESTAMP() - utimestamp) > current_interval' + $sql = sprintf( + 'SELECT COUNT(tam.id_agente_modulo) AS module_lag, + AVG(UNIX_TIMESTAMP() - tae.last_execution_try - tae.current_interval) AS "lag" + FROM ( + SELECT tagente_estado.last_execution_try, tagente_estado.current_interval, tagente_estado.id_agente_modulo + FROM tagente_estado + WHERE tagente_estado.current_interval > 0 + AND tagente_estado.last_execution_try > 0 + AND tagente_estado.running_by = %d + ) tae + JOIN ( + SELECT tagente_modulo.id_agente_modulo + FROM tagente_modulo LEFT JOIN tagente + ON tagente_modulo.id_agente = tagente.id_agente + WHERE tagente.disabled = 0 + AND tagente_modulo.disabled = 0 + ) tam + ON tae.id_agente_modulo = tam.id_agente_modulo + WHERE (UNIX_TIMESTAMP() - tae.last_execution_try) > (tae.current_interval) + AND (UNIX_TIMESTAMP() - tae.last_execution_try) < ( tae.current_interval * 10)', + $server['id_server'] ); } else { // Local/Dataserver server LAG calculation. // MySQL 8.0 has function lag(). So, lag must be enclosed in quotations. - $result = db_get_row_sql( - 'SELECT COUNT(tagente_modulo.id_agente_modulo) AS module_lag, - AVG(UNIX_TIMESTAMP() - utimestamp - current_interval) AS "lag" - FROM tagente_estado, tagente_modulo, tagente - WHERE utimestamp > 0 - AND tagente.disabled = 0 - AND tagente.id_agente = tagente_estado.id_agente - AND tagente_modulo.disabled = 0 - AND tagente_modulo.id_tipo_modulo < 5 - AND tagente_modulo.id_agente_modulo = tagente_estado.id_agente_modulo - AND current_interval > 0 - AND (UNIX_TIMESTAMP() - utimestamp) < ( current_interval * 10) - AND running_by = '.$server['id_server'].' - AND (UNIX_TIMESTAMP() - utimestamp) > (current_interval * 1.1)' + $sql = sprintf( + 'SELECT COUNT(tam.id_agente_modulo) AS module_lag, + AVG(UNIX_TIMESTAMP() - tae.last_execution_try - tae.current_interval) AS "lag" + FROM ( + SELECT tagente_estado.last_execution_try, tagente_estado.current_interval, tagente_estado.id_agente_modulo + FROM tagente_estado + WHERE tagente_estado.current_interval > 0 + AND tagente_estado.last_execution_try > 0 + AND tagente_estado.running_by = %d + ) tae + JOIN ( + SELECT tagente_modulo.id_agente_modulo + FROM tagente_modulo LEFT JOIN tagente + ON tagente_modulo.id_agente = tagente.id_agente + WHERE tagente.disabled = 0 + AND tagente_modulo.disabled = 0 + AND tagente_modulo.id_tipo_modulo < 5 + ) tam + ON tae.id_agente_modulo = tam.id_agente_modulo + WHERE (UNIX_TIMESTAMP() - tae.last_execution_try) > (tae.current_interval * 1.1) + AND (UNIX_TIMESTAMP() - tae.last_execution_try) < ( tae.current_interval * 10)', + $server['id_server'] ); } + $result = db_get_row_sql($sql); // Lag over current_interval * 2 is not lag, // it's a timed out module. if (!empty($result['lag'])) { @@ -1137,11 +1154,11 @@ function servers_check_remote_config($server_name) $config['remote_config'] ).'/conf/'.$server_md5.'.srv.conf'; - if (! isset($filenames['conf'])) { + if (!isset($filenames['conf'])) { return false; } - if (! isset($filenames['md5'])) { + if (!isset($filenames['md5'])) { return false; } diff --git a/pandora_server/lib/PandoraFMS/Core.pm b/pandora_server/lib/PandoraFMS/Core.pm index 04fd172019..234229b5c1 100644 --- a/pandora_server/lib/PandoraFMS/Core.pm +++ b/pandora_server/lib/PandoraFMS/Core.pm @@ -5629,37 +5629,48 @@ sub pandora_server_statistics ($$) { if ($server->{"server_type"} != DATASERVER){ $lag_row = get_db_single_row ($dbh, - "SELECT COUNT(tam.id_agente_modulo) AS module_lag, AVG(UNIX_TIMESTAMP() - tae.last_execution_try - tae.current_interval) AS lag - FROM ( - SELECT tagente_estado.last_execution_try, tagente_estado.current_interval, tagente_estado.id_agente_modulo - FROM tagente_estado - WHERE tagente_estado.current_interval > 0 - AND tagente_estado.last_execution_try > 0 - AND tagente_estado.running_by = ? - ) tae - JOIN ( - SELECT tagente_modulo.id_agente_modulo, tagente_modulo.flag - FROM tagente_modulo LEFT JOIN tagente - ON tagente_modulo.id_agente = tagente.id_agente - WHERE tagente.disabled = 0 - AND tagente_modulo.disabled = 0 - AND tagente_modulo.id_tipo_modulo < 5 - ) tam - ON tae.id_agente_modulo = tam.id_agente_modulo - WHERE (UNIX_TIMESTAMP() - tae.last_execution_try) < ( tae.current_interval * 10) - AND (tam.flag = 1 OR (UNIX_TIMESTAMP() - tae.last_execution_try) > tae.current_interval)", $server->{"id_server"}); + "SELECT COUNT(tam.id_agente_modulo) AS module_lag, + AVG(UNIX_TIMESTAMP() - tae.last_execution_try - tae.current_interval) AS "lag" + FROM ( + SELECT tagente_estado.last_execution_try, tagente_estado.current_interval, tagente_estado.id_agente_modulo + FROM tagente_estado + WHERE tagente_estado.current_interval > 0 + AND tagente_estado.last_execution_try > 0 + AND tagente_estado.running_by = ? + ) tae + JOIN ( + SELECT tagente_modulo.id_agente_modulo + FROM tagente_modulo LEFT JOIN tagente + ON tagente_modulo.id_agente = tagente.id_agente + WHERE tagente.disabled = 0 + AND tagente_modulo.disabled = 0 + ) tam + ON tae.id_agente_modulo = tam.id_agente_modulo + WHERE (UNIX_TIMESTAMP() - tae.last_execution_try) > (tae.current_interval) + AND (UNIX_TIMESTAMP() - tae.last_execution_try) < ( tae.current_interval * 10)", $server->{"id_server"}); } # Dataserver LAG calculation: else { - $lag_row = get_db_single_row ($dbh, "SELECT COUNT(tagente_modulo.id_agente_modulo) AS module_lag, AVG(UNIX_TIMESTAMP() - utimestamp - current_interval) AS lag - FROM tagente_estado, tagente_modulo - WHERE utimestamp > 0 - AND tagente_modulo.disabled = 0 - AND tagente_modulo.id_agente_modulo = tagente_estado.id_agente_modulo - AND current_interval > 0 - AND running_by = ? - AND (UNIX_TIMESTAMP() - utimestamp) < ( current_interval * 10) - AND (UNIX_TIMESTAMP() - utimestamp) > current_interval", $server->{"id_server"}); + $lag_row = get_db_single_row ($dbh, "SELECT COUNT(tam.id_agente_modulo) AS module_lag, + AVG(UNIX_TIMESTAMP() - tae.last_execution_try - tae.current_interval) AS "lag" + FROM ( + SELECT tagente_estado.last_execution_try, tagente_estado.current_interval, tagente_estado.id_agente_modulo + FROM tagente_estado + WHERE tagente_estado.current_interval > 0 + AND tagente_estado.last_execution_try > 0 + AND tagente_estado.running_by = ? + ) tae + JOIN ( + SELECT tagente_modulo.id_agente_modulo + FROM tagente_modulo LEFT JOIN tagente + ON tagente_modulo.id_agente = tagente.id_agente + WHERE tagente.disabled = 0 + AND tagente_modulo.disabled = 0 + AND tagente_modulo.id_tipo_modulo < 5 + ) tam + ON tae.id_agente_modulo = tam.id_agente_modulo + WHERE (UNIX_TIMESTAMP() - tae.last_execution_try) > (tae.current_interval * 1.1) + AND (UNIX_TIMESTAMP() - tae.last_execution_try) < ( tae.current_interval * 10)", $server->{"id_server"}); } $server->{"module_lag"} = $lag_row->{'module_lag'}; From 80818d7b6eb6226e2061d12f1b6510be5b806add Mon Sep 17 00:00:00 2001 From: Pablo Aragon Date: Tue, 21 Feb 2023 13:18:44 +0100 Subject: [PATCH 318/563] 10489-Fix alerts edition and event response --- .../alerts/configure_alert_template.php | 29 +++++++++++-------- .../godmode/events/event_responses.editor.php | 3 +- pandora_console/include/styles/events.css | 5 ++++ 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/pandora_console/godmode/alerts/configure_alert_template.php b/pandora_console/godmode/alerts/configure_alert_template.php index 8838c5c458..670f48d939 100644 --- a/pandora_console/godmode/alerts/configure_alert_template.php +++ b/pandora_console/godmode/alerts/configure_alert_template.php @@ -938,7 +938,7 @@ if ($step == 2) { false, (!$is_management_allowed | $disabled), "removeTinyMCE('textarea_field".$i."')", - '', + 'style="height: 15px !important;"', true ); // Advanced. @@ -951,7 +951,7 @@ if ($step == 2) { true, (!$is_management_allowed | $disabled), "addTinyMCE('textarea_field".$i."')", - '', + 'style="height: 15px !important;"', true ); $table->data['field'.$i][1] .= '
        '; @@ -962,7 +962,7 @@ if ($step == 2) { 1, 1, isset($fields[$i]) ? $fields[$i] : '', - 'class="fields" min-height-40px', + 'class="fields w100p" style="min-height: 100px !important;"', true, '', (!$is_management_allowed | $disabled) @@ -979,7 +979,7 @@ if ($step == 2) { false, (!$is_management_allowed | $disabled), "removeTinyMCE('textarea_field".$i."_recovery')", - '', + 'style="height: 15px !important;"', true ); // Advanced. @@ -992,7 +992,7 @@ if ($step == 2) { true, (!$is_management_allowed | $disabled), "addTinyMCE('textarea_field".$i."_recovery')", - '', + 'style="height: 15px !important;"', true ); $table->data['field'.$i][2] .= '
        '; @@ -1003,7 +1003,7 @@ if ($step == 2) { 1, 1, isset($fields_recovery[$i]) ? $fields_recovery[$i] : '', - 'class="fields min-height-40px"', + 'class="fields w100p" style="min-height: 100px !important;"', true, '', (!$is_management_allowed | $disabled) @@ -1167,32 +1167,37 @@ if ($id) { if (!$disabled) { if ($is_management_allowed === true) { if ($step >= LAST_STEP) { - html_print_submit_button( + $actionButtons = html_print_submit_button( __('Finish'), 'finish', false, - 'class="sub upd"' + 'class="submitButton"', + true ); } else { html_print_input_hidden('step', ($step + 1)); if ($step == 2) { // Javascript onsubmit to avoid min = 0 and max = 0. - html_print_submit_button( + $actionButtons = html_print_submit_button( __('Next'), 'next', false, - 'class="sub next" onclick="return check_fields_step2();"' + 'class="submitButton" onclick="return check_fields_step2();"', + true ); } else { - html_print_submit_button( + $actionButtons = html_print_submit_button( __('Next'), 'next', false, - 'class="sub next"' + 'class="submitButton"', + true ); } } } + + html_print_action_buttons($actionButtons, ['type' => 'form_action']); } echo '
        '; diff --git a/pandora_console/godmode/events/event_responses.editor.php b/pandora_console/godmode/events/event_responses.editor.php index 1e85796740..5d802fbf49 100644 --- a/pandora_console/godmode/events/event_responses.editor.php +++ b/pandora_console/godmode/events/event_responses.editor.php @@ -84,6 +84,7 @@ if ($event_response_id > 0) { $table = new stdClass(); $table->styleTable = 'margin: 10px 10px 0'; $table->class = 'databox filters'; +$table->colspan[4][1] = 3; if (is_metaconsole()) { $table->head[0] = __('Edit event responses'); @@ -183,7 +184,7 @@ $data[1] = html_print_textarea( 3, 1, $event_response['target'], - 'class="mh_initial"', + 'class="mh_initial w100p"', true ); diff --git a/pandora_console/include/styles/events.css b/pandora_console/include/styles/events.css index 5ce82260d8..dc1f7415b7 100644 --- a/pandora_console/include/styles/events.css +++ b/pandora_console/include/styles/events.css @@ -483,3 +483,8 @@ div.multi-response-buttons { flex-direction: row-reverse; justify-content: flex-start; } + +td:has(div#server_to_exec_label), +td:has(div#server_to_exec_value) { + padding: 0px; +} From 2fd52eff484753415dfe2f0ae637ee9d5e5e50b6 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Tue, 21 Feb 2023 14:14:13 +0100 Subject: [PATCH 319/563] Sprint 2025Feb Improve UI-UX and Resources views --- pandora_console/extensions/insert_data.php | 134 +++++++++------ .../extensions/resource_registration.php | 160 ++++++++++-------- .../godmode/agentes/configure_field.php | 126 +++++++++----- .../godmode/agentes/fields_manager.php | 140 ++++++++++----- .../godmode/agentes/modificar_agente.php | 3 +- .../godmode/agentes/module_manager.php | 2 +- pandora_console/godmode/category/category.php | 157 ++++++++++------- .../godmode/category/edit_category.php | 151 ++++++++--------- .../godmode/groups/configure_modu_group.php | 62 +++++-- .../godmode/groups/modu_group_list.php | 49 +++--- .../godmode/modules/manage_nc_groups.php | 141 ++++++++++----- .../godmode/modules/manage_nc_groups_form.php | 103 ++++++----- .../godmode/modules/module_list.php | 111 +++++++----- pandora_console/godmode/setup/os.list.php | 26 ++- pandora_console/include/styles/pandora.css | 46 +++-- pandora_console/include/styles/tables.css | 25 +-- 16 files changed, 886 insertions(+), 550 deletions(-) diff --git a/pandora_console/extensions/insert_data.php b/pandora_console/extensions/insert_data.php index 034f97997b..6fa0672f84 100644 --- a/pandora_console/extensions/insert_data.php +++ b/pandora_console/extensions/insert_data.php @@ -1,16 +1,32 @@ '', + 'label' => __('Resources'), + ], + [ + 'link' => '', + 'label' => __('Insert Data'), + ], + ] + ); if (! check_acl($config['id_user'], 0, 'AW') && ! is_user_admin($config['id_user'])) { db_pandora_audit( @@ -84,6 +117,13 @@ function mainInsertData() $csv = false; } + ui_print_warning_message( + sprintf( + __('Please check that the directory "%s" is writeable by the apache user.

        The CSV file format is date;value<newline>date;value<newline>... The date in CSV is in format Y/m/d H:i:s.'), + $config['remote_config'] + ) + ); + if ($save) { if (!check_acl($config['id_user'], agents_get_agent_group($agent_id), 'AW')) { ui_print_error_message(__('You haven\'t privileges for insert data in the agent.')); @@ -140,27 +180,25 @@ function mainInsertData() } } - echo '
        '; - echo sprintf( - __('Please check that the directory "%s" is writeable by the apache user.

        The CSV file format is date;value<newline>date;value<newline>... The date in CSV is in format Y/m/d H:i:s.'), - $config['remote_config'] - ); - echo '
        '; + $modules = []; + if ($agent_id > 0) { + $modules = agents_get_modules($agent_id, false, ['delete_pending' => 0]); + } $table = new stdClass(); - $table->width = '100%'; - $table->class = 'databox filters'; + $table->class = 'databox m2020'; $table->style = []; - $table->style[0] = 'font-weight: bolder;'; - + $table->cellstyle[0][0] = 'width: 0'; + $table->cellstyle[0][1] = 'width: 0'; $table->data = []; - $table->data[0][0] = __('Agent'); + $table->data[0][1] = __('Module'); + $table->data[0][2] = __('Date'); $params = []; $params['return'] = true; $params['show_helptip'] = true; $params['input_name'] = 'agent_name'; - $params['value'] = $agent_name; + $params['value'] = ($save === true) ? '' : $agent_name; $params['javascript_is_function_select'] = true; $params['javascript_name_function_select'] = 'custom_select_function'; $params['javascript_code_function_select'] = ''; @@ -170,18 +208,12 @@ function mainInsertData() $params['hidden_input_idagent_name'] = 'agent_id'; $params['hidden_input_idagent_value'] = $agent_id; - $table->data[0][1] = ui_print_agent_autocomplete_input($params); - - $table->data[1][0] = __('Module'); - $modules = []; - if ($agent_id) { - $modules = agents_get_modules($agent_id, false, ['delete_pending' => 0]); - } + $table->data[1][0] = html_print_div(['class' => 'flex flex-items-center', 'content' => ui_print_agent_autocomplete_input($params)], true); $table->data[1][1] = html_print_select( $modules, 'id_agent_module', - $id_agent_module, + ($save === true) ? '' : $id_agent_module, true, __('Select'), 0, @@ -191,13 +223,14 @@ function mainInsertData() '', empty($agent_id) ); + $table->data[1][2] = html_print_input_text('data', ($save === true) ? date(DATE_FORMAT) : $data, __('Data'), 10, 60, true); + $table->data[1][2] .= ' '; + $table->data[1][2] .= html_print_input_text('time', ($save === true) ? date(TIME_FORMAT) : $time, '', 10, 7, true); + $table->data[2][0] = __('Data'); - $table->data[2][1] = html_print_input_text('data', $data, __('Data'), 40, 60, true); - $table->data[3][0] = __('Date'); - $table->data[3][1] = html_print_input_text('date', $date, '', 11, 11, true).' '; - $table->data[3][1] .= html_print_input_text('time', $time, '', 7, 7, true); - $table->data[4][0] = __('CSV'); - $table->data[4][1] = html_print_input_file('csv', true); + $table->data[2][1] = __('CSV'); + $table->data[3][0] = html_print_input_text('data', $data, __('Data'), 40, 60, true); + $table->data[3][1] = html_print_input_file('csv', true); echo "
        "; @@ -205,17 +238,16 @@ function mainInsertData() html_print_input_hidden('save', 1); - html_print_div( - [ - 'class' => 'action-buttons', - 'content' => html_print_submit_button( - __('Save'), - 'submit', - (empty($id_agent) === true), - [ 'icon' => 'next' ], - true - ), - ] + html_print_action_buttons( + html_print_submit_button( + __('Save'), + 'submit', + // (empty($id_agent) === true), + false, + [ 'icon' => 'next' ], + true + ), + ['type' => 'form_action'] ); echo '
        '; @@ -267,8 +299,8 @@ function mainInsertData() $('#id_agent_module').enable(); $('#id_agent_module').fadeIn ('normal'); - $('#submit-submit').enable(); - $('#submit-submit').fadeIn ('normal'); + $('button [name="submit"]').removeClass('disabled_action_button'); + $('button [name="submit"]').fadeIn ('normal'); } }); } diff --git a/pandora_console/extensions/resource_registration.php b/pandora_console/extensions/resource_registration.php index 732c0151ea..1473fcdc38 100755 --- a/pandora_console/extensions/resource_registration.php +++ b/pandora_console/extensions/resource_registration.php @@ -1,4 +1,5 @@ group)); break; - case 'event_report_module': - break; - - case 'alert_report_module': - break; - - case 'alert_report_agent': - break; - - case 'alert_report_group': - break; - case 'url': $values['external_source'] = io_safe_input($item['url']); break; @@ -426,9 +384,32 @@ function process_upload_xml_report($xml, $group_filter=0) $values['line_separator'] = io_safe_input($item['line_separator']); $values['column_separator'] = io_safe_input($item['column_separator']); break; + + case 1: + case 'simple_graph': + case 'simple_baseline_graph': + case 6: + case 'monitor_report': + case 7: + case 'avg_value': + case 8: + case 'max_value': + case 9: + case 'min_value': + case 10: + case 'sumatory': + case 'event_report_module': + case 'alert_report_module': + case 'alert_report_agent': + case 'alert_report_group': + case 'agent_detailed_event': + case 'event_report_agent': + default: + // Do nothing. + break; } - if (empty($agents_item)) { + if (empty($agents_item) === true) { $id_content = db_process_sql_insert('treport_content', $values); ui_print_result_message( $id_content, @@ -782,7 +763,7 @@ function process_upload_xml_visualmap($xml, $filter_group=0) function process_upload_xml_component($xml) { - // Extract components + // Extract components. $components = []; foreach ($xml->xpath('/component') as $componentElement) { $name = io_safe_input((string) $componentElement->name); @@ -838,7 +819,7 @@ function process_upload_xml_component($xml) $idComponent = false; switch ((int) $componentElement->module_source) { case 1: - // Local component + // Local component. $values = [ 'description' => $description, 'id_network_component_group' => $group, @@ -854,12 +835,12 @@ function process_upload_xml_component($xml) // Network component // for modules // 15 = remote_snmp, 16 = remote_snmp_inc, - // 17 = remote_snmp_string, 18 = remote_snmp_proc + // 17 = remote_snmp_string, 18 = remote_snmp_proc. $custom_string_1 = ''; $custom_string_2 = ''; $custom_string_3 = ''; if ($type >= 15 && $type <= 18) { - // New support for snmp v3 + // New support for snmp v3. $tcp_send = $snmp_version; $plugin_user = $auth_user; $plugin_pass = $auth_password; @@ -909,13 +890,13 @@ function process_upload_xml_component($xml) 'post_process' => $post_process, ] ); - if ((bool) $idComponent) { + if ((bool) $idComponent === true) { $components[] = $idComponent; } break; case 4: - // Plugin component + // Plugin component. $idComponent = network_components_create_network_component( $name, $type, @@ -956,17 +937,13 @@ function process_upload_xml_component($xml) 'post_process' => $post_process, ] ); - if ((bool) $idComponent) { + if ((bool) $idComponent === true) { $components[] = $idComponent; } break; - case 5: - // Prediction component - break; - case 6: - // WMI component + // WMI component. $idComponent = network_components_create_network_component( $name, $type, @@ -1013,13 +990,17 @@ function process_upload_xml_component($xml) 'post_process' => $post_process, ] ); - if ((bool) $idComponent) { + if ((bool) $idComponent === true) { $components[] = $idComponent; } break; + case 5: + // Prediction component. case 7: - // Web component + // Web component. + default: + // Do nothing. break; } @@ -1030,9 +1011,9 @@ function process_upload_xml_component($xml) ); } - // Extract the template + // Extract the template. $templateElement = $xml->xpath('//template'); - if (!empty($templateElement)) { + if (empty($templateElement) === false) { $templateElement = $templateElement[0]; $templateName = (string) $templateElement->name; @@ -1092,9 +1073,26 @@ function resource_registration_extension_main() include_once $config['homedir'].'/include/functions_db.php'; enterprise_include_once('include/functions_local_components.php'); - ui_print_page_header(__('Resource registration'), 'images/extensions.png', false, '', true, ''); + ui_print_standard_header( + __('Resource registration'), + 'images/extensions.png', + false, + '', + true, + [], + [ + [ + 'link' => '', + 'label' => __('Resources'), + ], + [ + 'link' => '', + 'label' => __('Resource registration'), + ], + ] + ); - if (!extension_loaded('libxml')) { + if (extension_loaded('libxml') === false) { ui_print_error_message(_('Error, please install the PHP libXML in the system.')); return; @@ -1119,15 +1117,36 @@ function resource_registration_extension_main() return; } - echo '
        '; - echo __('This extension makes registering resource templates easier.').' '.__('Here you can upload a resource template in .ptr format.').' '.__('Please refer to our documentation for more information on how to obtain and use %s resources.', get_product_name()).' '.'

        '.__('You can get more resurces in our Public Resource Library'); - echo '
        '; + ui_print_warning_message( + __('This extension makes registering resource templates easier.').'
        '.__('Here you can upload a resource template in .ptr format.').'
        '.__('Please refer to our documentation for more information on how to obtain and use %s resources.', get_product_name()).' '.'

        '.__('You can get more resurces in our Public Resource Library') + ); - echo '

        '; + $table = new stdClass(); + $table->class = 'databox m2020'; + $table->id = 'resource_registration_table'; + + $table->data = []; + $table->data[0][0] = __('File to upload'); + $table->data[0][1] = __('Group filter'); + $table->data[1][0] = html_print_input_file('resource_upload', true); + $table->data[1][1] = html_print_select_groups(false, 'AW', true, 'group', '', '', __('All'), 0, true); // Upload form. - echo "
        "; - echo ''; + echo ''; + html_print_table($table); + html_print_action_buttons( + html_print_submit_button( + __('Upload'), + 'upload', + false, + [ 'icon' => 'wand' ], + true + ), + ['type' => 'form_action'] + ); + echo ''; + /* + echo '
        '; echo ''; echo "'; @@ -1136,8 +1155,7 @@ function resource_registration_extension_main() echo ''; echo "'; - echo '
        "; echo ''.__('Group filter: ').'"; echo '
        '; - echo ''; + echo '';*/ if (isset($_FILES['resource_upload']['tmp_name']) === false) { return; diff --git a/pandora_console/godmode/agentes/configure_field.php b/pandora_console/godmode/agentes/configure_field.php index f7c80c832c..ca518d5056 100755 --- a/pandora_console/godmode/agentes/configure_field.php +++ b/pandora_console/godmode/agentes/configure_field.php @@ -1,16 +1,32 @@ width = '100%'; -$table->class = 'databox filters'; +$table->class = 'databox m2020'; $table->id = 'configure_field'; -$table->style[0] = 'font-weight: bold'; -$table->style[2] = 'font-weight: bold'; -$table->style[4] = 'font-weight: bold'; -$table->style[6] = 'font-weight: bold'; echo "'; $table->data = []; $table->data[0][0] = __('Name'); -$table->data[0][1] = html_print_input_text( +$table->data[1][0] = html_print_input_text( 'name', $name, '', @@ -84,30 +95,39 @@ $table->data[0][1] = html_print_input_text( true ); -$table->data[1][0] = __('Pass type').ui_print_help_tip( +$table->data[2][0] = __('Pass type').ui_print_help_tip( __('The fields with pass type enabled will be displayed like html input type pass in html'), true ); -$table->data[1][1] = html_print_checkbox_switch( +$table->data[2][1] = __('Display on front').ui_print_help_tip( + __('The fields with display on front enabled will be displayed into the agent details'), + true +); +$table->data[2][2] = __('Link type'); + +$table->data[3][0] = html_print_checkbox_switch( 'is_password_type', 1, $is_password_type, true ); - -$table->data[2][0] = __('Display on front').ui_print_help_tip( - __('The fields with display on front enabled will be displayed into the agent details'), - true -); -$table->data[2][1] = html_print_checkbox_switch( +$table->data[3][1] = html_print_checkbox_switch( 'display_on_front', 1, $display_on_front, true ); - -$table->data[3][0] = __('Enabled combo'); -$table->data[3][1] = html_print_checkbox_switch_extended( +$table->data[3][2] = html_print_checkbox_switch_extended( + 'is_link_enabled', + 1, + $is_link_enabled, + false, + '', + '', + true +); +$table->data[4][0] = __('Enabled combo'); +$table->data[5][0] = html_print_checkbox_switch_extended( 'is_combo_enable', 0, $config['is_combo_enable'], @@ -117,12 +137,15 @@ $table->data[3][1] = html_print_checkbox_switch_extended( true ); -$table->rowstyle[4] = 'display: none;'; -$table->data[4][0] = __('Combo values').ui_print_help_tip( + +$table->cellstyle[4][1] = 'display: none;'; +$table->cellstyle[5][1] = 'display: none;'; + +$table->data[4][1] = __('Combo values').ui_print_help_tip( __('Set values separated by comma'), true ); -$table->data[4][1] = html_print_textarea( +$table->data[5][1] = html_print_textarea( 'combo_values', 3, 65, @@ -131,31 +154,40 @@ $table->data[4][1] = html_print_textarea( true ); -$table->data[5][0] = __('Link type'); -$table->data[5][1] = html_print_checkbox_switch_extended( - 'is_link_enabled', - 1, - $is_link_enabled, - false, - '', - '', - true -); echo '
        '; html_print_table($table); -echo '
        '; -if ($id_field) { +if ($id_field > 0) { html_print_input_hidden('update_field', 1); html_print_input_hidden('id_field', $id_field); - html_print_submit_button(__('Update'), 'updbutton', false, 'class="sub upd"'); + $buttonCaption = __('Update'); + $buttonName = 'updbutton'; } else { html_print_input_hidden('create_field', 1); - html_print_submit_button(__('Create'), 'crtbutton', false, 'class="sub wand"'); + $buttonCaption = __('Create'); + $buttonName = 'crtbutton'; } -echo '
        '; +$actionButtons = []; +$actionButtons[] = html_print_submit_button( + $buttonCaption, + $buttonName, + false, + [ 'icon' => 'wand' ], + true +); +$actionButtons[] = html_print_go_back_button( + 'index.php?sec=gagente&sec2=godmode/agentes/fields_manager', + ['button_class' => ''], + true +); + +html_print_action_buttons( + implode('', $actionButtons), + ['type' => 'form_action'], +); + echo '
        '; ?> diff --git a/pandora_console/godmode/agentes/fields_manager.php b/pandora_console/godmode/agentes/fields_manager.php index f7f61c4af4..49f6661c81 100644 --- a/pandora_console/godmode/agentes/fields_manager.php +++ b/pandora_console/godmode/agentes/fields_manager.php @@ -1,22 +1,37 @@ '', + 'label' => __('Resources'), + ], + [ + 'link' => '', + 'label' => __('Custom fields'), + ], + ] +); $create_field = (bool) get_parameter('create_field'); $update_field = (bool) get_parameter('update_field'); @@ -114,8 +146,7 @@ $fields = db_get_all_rows_filter( ); $table = new stdClass(); -$table->width = '100%'; -$table->class = 'info_table'; +$table->class = 'info_table m2020'; if ($fields) { $table->head = []; $table->head[0] = __('ID'); @@ -140,43 +171,66 @@ if ($fields === false) { foreach ($fields as $field) { $data[0] = $field['id_field']; + $data[1] = $field['name']; - $data[1] = ''.$field['name'].''; - - if ($field['display_on_front']) { - $data[2] = html_print_image('images/tick.png', true, ['class' => 'invert_filter']); - } else { - $data[2] = html_print_image( - 'images/icono_stop.png', - true, - ['style' => 'width:21px;height:21px;'] - ); - } + $data[2] = html_print_image( + ((bool) $field['display_on_front'] === true) ? 'images/validate.svg' : 'images/icono_stop.png', + true, + ['class' => 'main_menu_icon invert_filter'] + ); $table->cellclass[][3] = 'table_action_buttons'; - $data[3] = ''.html_print_image('images/config.png', true, ['alt' => __('Edit'), 'title' => __('Edit'), 'border' => '0', 'class' => 'invert_filter']).''; - $data[3] .= ''.html_print_image('images/cross.png', true, ['alt' => __('Delete'), 'title' => __('Delete'), 'border' => '0', 'class' => 'invert_filter']).''; + $tableActionButtons = []; + $tableActionButtons[] = html_print_anchor( + [ + 'href' => 'index.php?sec=gagente&sec2=godmode/agentes/configure_field&id_field='.$field['id_field'], + 'content' => html_print_image( + 'images/edit.svg', + true, + [ + 'title' => __('Edit'), + 'class' => 'main_menu_icon invert_filter', + ] + ), + ], + true + ); + + $tableActionButtons[] = html_print_anchor( + [ + 'href' => 'index.php?sec=gagente&sec2=godmode/agentes/fields_manager&delete_field=1&id_field='.$field['id_field'], + 'content' => html_print_image( + 'images/delete.svg', + true, + [ + 'title' => __('Delete'), + 'class' => 'main_menu_icon invert_filter', + ] + ), + 'onClick' => 'if (!confirm(\' '.__('Are you sure?').'\')) return false;', + ], + true + ); + + $data[3] = implode('', $tableActionButtons); array_push($table->data, $data); } if ($fields) { - ui_pagination($count_fields, false, $offset); html_print_table($table); - ui_pagination($count_fields, false, $offset, 0, false, 'offset', true, 'pagination-bottom'); + $tablePagination = ui_pagination($count_fields, false, $offset, 0, true, 'offset', false); } -echo '
        '; -html_print_div( - [ - 'class' => 'action-buttons', - 'content' => html_print_submit_button( - __('Create field'), - 'crt', - false, - [ 'icon' => 'next' ], - true - ), - ] +echo ''; +html_print_action_buttons( + html_print_submit_button( + __('Create field'), + 'crt', + false, + [ 'icon' => 'next' ], + true + ), + ['type' => 'form_action'] ); echo '
        '; diff --git a/pandora_console/godmode/agentes/modificar_agente.php b/pandora_console/godmode/agentes/modificar_agente.php index ce58dc58a9..e854a9ee23 100644 --- a/pandora_console/godmode/agentes/modificar_agente.php +++ b/pandora_console/godmode/agentes/modificar_agente.php @@ -654,8 +654,7 @@ if ($agents !== false) { $tableAgents = new stdClass(); $tableAgents->id = 'agent_list'; - $tableAgents->class = 'info_table tactical_table'; - $tableAgents->styleTable = 'margin: 0 10px'; + $tableAgents->class = 'info_table tactical_table m2020'; $tableAgents->head = []; $tableAgents->data = []; // Header. diff --git a/pandora_console/godmode/agentes/module_manager.php b/pandora_console/godmode/agentes/module_manager.php index 102bea4ba4..317346749e 100644 --- a/pandora_console/godmode/agentes/module_manager.php +++ b/pandora_console/godmode/agentes/module_manager.php @@ -1168,7 +1168,7 @@ if ($modules !== false) { [ 'href' => 'index.php?sec=gmodules&sec2=godmode/modules/manage_network_components&create_network_from_module=1&id_agente='.$id_agente.'&create_module_from='.$module['id_agente_modulo'], 'onClick' => "if (!confirm(\' '.__('Are you sure?').'\')) return false;", - 'image' => 'images/cluster@svg.svg', + 'image' => 'images/cluster@os.svg', 'title' => __('Create network component'), 'disabled' => ((is_user_admin($config['id_user']) === true) && (int) $module['id_modulo'] === MODULE_NETWORK) === false, 'disabled_title' => ' ('.__('Disabled').')', diff --git a/pandora_console/godmode/category/category.php b/pandora_console/godmode/category/category.php index b20bbc85b5..2a4f7d29af 100755 --- a/pandora_console/godmode/category/category.php +++ b/pandora_console/godmode/category/category.php @@ -14,7 +14,7 @@ * |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______| * * ============================================================================ - * Copyright (c) 2005-2022 Artica Soluciones Tecnologicas + * Copyright (c) 2005-2023 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 @@ -52,35 +52,21 @@ $search = (int) get_parameter('search_category', 0); $category_name = (string) get_parameter('category_name', ''); $tab = (string) get_parameter('tab', 'list'); -if (is_metaconsole() === true) { - $buttons = [ - 'list' => [ - 'active' => false, - 'text' => ''.html_print_image( - 'images/list.png', - true, - [ - 'title' => __('List categories'), - 'class' => 'invert_filter', - ] - ).'', - ], - ]; -} else { - $buttons = [ - 'list' => [ - 'active' => false, - 'text' => ''.html_print_image( - 'images/list.png', - true, - [ - 'title' => __('List categories'), - 'class' => 'invert_filter', - ] - ).'', - ], - ]; -} +$sec = (is_metaconsole() === true) ? 'advanced' : 'galertas'; + +$buttons = [ + 'list' => [ + 'active' => false, + 'text' => ''.html_print_image( + 'images/logs@svg.svg', + true, + [ + 'title' => __('List categories'), + 'class' => 'main_menu_icon invert_filter', + ] + ).'', + ], +]; $buttons[$tab]['active'] = true; @@ -88,7 +74,24 @@ $buttons[$tab]['active'] = true; if (is_metaconsole() === true) { ui_meta_print_header(__('Categories configuration'), __('List'), $buttons); } else { - ui_print_page_header(__('Categories configuration'), 'images/gm_modules.png', false, '', true, $buttons); + ui_print_standard_header( + __('Categories configuration'), + 'images/gm_modules.png', + false, + '', + true, + $buttons, + [ + [ + 'link' => '', + 'label' => __('Resources'), + ], + [ + 'link' => '', + 'label' => __('Module categories'), + ], + ] + ); } @@ -152,12 +155,8 @@ $rowPair = true; $iterator = 0; if (empty($result) === false) { - // Prepare pagination. - ui_pagination($total_categories, $url); - $table = new stdClass(); - $table->width = '100%'; - $table->class = 'info_table'; + $table->class = 'info_table m2020'; $table->data = []; $table->head = []; @@ -185,14 +184,20 @@ if (empty($result) === false) { if (is_metaconsole() === true) { $data[0] = "".$category['name'].''; $data[1] = "".html_print_image( - 'images/config.png', + 'images/edit.svg', true, - ['title' => 'Edit'] + [ + 'title' => __('Edit'), + 'class' => 'main_menu_icon', + ] ).'  '; $data[1] .= ''.html_print_image( - 'images/cross.png', + 'images/delet.svg', true, - ['title' => 'Delete'] + [ + 'title' => __('Delete'), + 'class' => 'main_menu_icon', + ] ).''; } else { if ($is_management_allowed === true) { @@ -203,16 +208,39 @@ if (empty($result) === false) { if ($is_management_allowed === true) { $table->cellclass[][1] = 'table_action_buttons'; - $data[1] = "".html_print_image( - 'images/config.png', - true, - ['title' => 'Edit'] - ).''; - $data[1] .= ''.html_print_image( - 'images/cross.png', - true, - ['title' => 'Delete'] - ).''; + $tableActionButtonsContent = []; + $tableActionButtonsContent[] = html_print_anchor( + [ + 'href' => 'index.php?sec=gmodules&sec2=godmode/category/edit_category&action=update&id_category='.$category['id'].'&pure='.(int) $config['pure'], + 'content' => html_print_image( + 'images/edit.svg', + true, + [ + 'title' => __('Edit'), + 'class' => 'main_menu_icon', + ] + ), + ], + true + ); + + $tableActionButtonsContent[] = html_print_anchor( + [ + 'href' => 'index.php?sec=gmodules&sec2=godmode/category/category&delete_category='.$category['id'].'&pure='.(int) $config['pure'], + 'onClick' => 'if (! confirm (\''.__('Are you sure?').'\')) return false', + 'content' => html_print_image( + 'images/delete.svg', + true, + [ + 'title' => __('Delete'), + 'class' => 'main_menu_icon', + ] + ), + ], + true + ); + + $data[1] = implode('', $tableActionButtonsContent); } } @@ -220,7 +248,7 @@ if (empty($result) === false) { } html_print_table($table); - ui_pagination($total_categories, $url, $offset, 0, false, 'offset', true, 'pagination-bottom'); + $tablePagination = ui_pagination($total_categories, $url, $offset, 0, true, 'offset', false); } else { // No categories available or selected. ui_print_info_message(['no_close' => true, 'message' => __('No categories found') ]); @@ -228,24 +256,23 @@ if (empty($result) === false) { if ($is_management_allowed === true) { // Form to add new categories or search categories. - if (is_metaconsole() === true) { - echo '
        '; - } else { - echo ''; - } + $sec = (is_metaconsole() === true) ? 'advanced' : 'gmodules'; + + echo ''; html_print_input_hidden('create_category', '1', true); - html_print_div( + html_print_action_buttons( + html_print_submit_button( + __('Create category'), + 'create_button', + false, + [ 'icon' => 'next' ], + true + ), [ - 'class' => 'action-buttons', - 'content' => html_print_submit_button( - __('Create category'), - 'create_button', - false, - [ 'icon' => 'next' ], - true - ), + 'type' => 'form_action', + 'right_content' => $tablePagination, ] ); diff --git a/pandora_console/godmode/category/edit_category.php b/pandora_console/godmode/category/edit_category.php index 64b4a193c2..b042f23526 100755 --- a/pandora_console/godmode/category/edit_category.php +++ b/pandora_console/godmode/category/edit_category.php @@ -50,36 +50,29 @@ $update_category = (int) get_parameter('update_category', 0); $create_category = (int) get_parameter('create_category', 0); $name_category = (string) get_parameter('name_category', ''); $tab = (string) get_parameter('tab', 'list'); +// Main URL. +$mainUrl = 'index.php?sec=gagente&sec2=godmode/category/category'; +$sec = (is_metaconsole() === true) ? 'advanced' : 'gmodules'; -if (is_metaconsole() === true) { - $buttons = [ - 'list' => [ - 'active' => false, - 'text' => ''.html_print_image( - 'images/list.png', - true, - [ - 'title' => __('List categories'), - 'class' => 'invert_filter', - ] - ).'', - ], - ]; -} else { - $buttons = [ - 'list' => [ - 'active' => false, - 'text' => ''.html_print_image( - 'images/list.png', - true, - [ - 'title' => __('List categories'), - 'class' => 'invert_filter', - ] - ).'', - ], - ]; -} +$buttons = [ + 'list' => [ + 'active' => false, + 'text' => html_print_anchor( + [ + 'href' => 'index.php?sec='.$sec.'&sec2=godmode/category/category&tab=list&pure='.(int) $config['pure'], + 'content' => html_print_image( + 'images/logs@svg.svg', + true, + [ + 'title' => __('List categories'), + 'class' => 'main_menu_icon invert_filter', + ] + ), + ], + true + ), + ], +]; $buttons[$tab]['active'] = false; @@ -87,7 +80,25 @@ $buttons[$tab]['active'] = false; if (is_metaconsole() === true) { ui_meta_print_header(__('Categories configuration'), __('Editor'), $buttons); } else { - ui_print_page_header(__('Categories configuration'), 'images/gm_modules.png', false, '', true, $buttons); + // Header. + ui_print_standard_header( + __('Manage category'), + 'images/gm_modules.png', + false, + '', + true, + $buttons, + [ + [ + 'link' => '', + 'label' => __('Resources'), + ], + [ + 'link' => $mainUrl, + 'label' => __('Module categories'), + ], + ] + ); } @@ -151,7 +162,7 @@ if ($create_category) { // Form fields are filled here // Get results when update action is performed. -if ($action == 'update' && $id_category != 0) { +if ($action === 'update' && $id_category != 0) { $result_category = db_get_row_filter('tcategory', ['id' => $id_category]); $name_category = $result_category['name']; } //end if @@ -159,47 +170,28 @@ else { $name_category = ''; } +// Create/Update category form. +echo ''; -// Create/Update category form -echo ''; +$table = new stdClass(); +$table->id = 'edit_catagory_table'; +$table->class = 'databox m2020'; -if (!defined('METACONSOLE')) { - echo '
        '; -} else { - echo '
        '; -} - -echo ""; - -if (defined('METACONSOLE')) { - if ($action == 'update') { - echo ' - - - - '; - } - - if ($action == 'new') { - echo ' - - - - '; +$table->head = []; +if (is_metaconsole() === true) { + if ($action === 'update') { + $table->head[0] = __('Update category'); + } else if ($action === 'new') { + $table->head[0] = __('Create category'); } } - echo ''; - echo "'; - echo ''; - echo ''; +$table->data[0][0] = __('Name'); +$table->data[1][0] = html_print_input_text('name_category', $name_category, '', 50, 255, true); -echo '
        '.__('Update category').'
        '.__('Create category').'
        "; +$table->data = []; - html_print_label(__('Name'), 'name'); - echo ''; - html_print_input_text('name_category', $name_category); - echo '
        '; +html_print_table($table); if ($action === 'update') { html_print_input_hidden('update_category', 1); @@ -213,20 +205,25 @@ if ($action === 'update') { $buttonIcon = 'next'; } -html_print_div( - [ - 'class' => 'action-buttons', - 'content' => html_print_submit_button( - $buttonCaption, - $buttonName, - false, - [ 'icon' => $buttonIcon ], - true - ), - ] +$actionButtons = []; +$actionButtons[] = html_print_submit_button( + $buttonCaption, + $buttonName, + false, + [ 'icon' => $buttonIcon ], + true +); +$actionButtons[] = html_print_go_back_button( + $mainUrl, + ['button_class' => ''], + true +); + +html_print_action_buttons( + implode('', $actionButtons), + [ 'type' => 'form_action' ] ); -echo '
        '; echo ''; enterprise_hook('close_meta_frame'); diff --git a/pandora_console/godmode/groups/configure_modu_group.php b/pandora_console/godmode/groups/configure_modu_group.php index 548f711f6f..ef93882d14 100644 --- a/pandora_console/godmode/groups/configure_modu_group.php +++ b/pandora_console/godmode/groups/configure_modu_group.php @@ -26,9 +26,26 @@ if (! check_acl($config['id_user'], 0, 'PM')) { return; } -if (!is_metaconsole()) { +if (is_metaconsole() === false) { // Header - ui_print_page_header(__('Module group management'), 'images/module_group.png', false, '', true, ''); + ui_print_standard_header( + __('Module group management'), + 'images/module_group.png', + false, + '', + true, + [], + [ + [ + 'link' => '', + 'label' => __('Resources'), + ], + [ + 'link' => '', + 'label' => __('Module groups'), + ], + ] + ); } // Init vars @@ -60,33 +77,54 @@ if ($id_group) { } $table = new stdClass(); -$table->width = '100%'; -$table->class = 'databox filters'; +$table->class = 'databox m2020'; $table->style[0] = 'font-weight: bold'; $table->data = []; $table->data[0][0] = __('Name'); -$table->data[0][1] = html_print_input_text('name', $name, '', 35, 100, true); +$table->data[1][0] = html_print_input_text('name', $name, '', 35, 100, true); echo ''; -if (is_metaconsole()) { - echo '
        '; +if (is_metaconsole() === true) { + $formUrl = 'index.php?sec=advanced&sec2=advanced/component_management&tab=module_group'; } else { - echo ''; + $formUrl = 'index.php?sec=gmodules&sec2=godmode/groups/modu_group_list'; } +echo ''; html_print_table($table); -echo '
        '; + if ($id_group) { html_print_input_hidden('update_group', 1); html_print_input_hidden('id_group', $id_group); - html_print_submit_button(__('Update'), 'updbutton', false, 'class="sub upd"'); + $actionButtonTitle = __('Update'); + $actionButtonName = 'updbutton'; } else { + $actionButtonTitle = __('Create'); + $actionButtonName = 'crtbutton'; html_print_input_hidden('create_group', 1); - html_print_submit_button(__('Create'), 'crtbutton', false, 'class="sub wand"'); } -echo '
        '; +$actionButtons = []; + +$actionButtons[] = html_print_submit_button( + $actionButtonTitle, + $actionButtonName, + false, + ['icon' => 'wand'], + true +); + +$actionButtons[] = html_print_go_back_button( + ui_get_full_url('index.php?sec=gmodules&sec2=godmode/groups/modu_group_list'), + ['button_class' => ''], + true +); + +html_print_action_buttons( + implode('', $actionButtons), + ['type' => 'form_action'] +); echo '
        '; enterprise_hook('close_meta_frame'); diff --git a/pandora_console/godmode/groups/modu_group_list.php b/pandora_console/godmode/groups/modu_group_list.php index cbd9a4c0d5..876dedad72 100644 --- a/pandora_console/godmode/groups/modu_group_list.php +++ b/pandora_console/godmode/groups/modu_group_list.php @@ -14,7 +14,7 @@ * |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______| * * ============================================================================ - * Copyright (c) 2005-2022 Artica Soluciones Tecnologicas + * Copyright (c) 2005-2023 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 @@ -66,13 +66,23 @@ if (is_ajax() === true) { if (is_metaconsole() === false) { // Header. - ui_print_page_header( - __('Module groups defined in %s', get_product_name()), + ui_print_standard_header( + __('Module groups list'), 'images/module_group.png', false, '', true, - '' + [], + [ + [ + 'link' => '', + 'label' => __('Resources'), + ], + [ + 'link' => '', + 'label' => __('Module groups'), + ], + ] ); } @@ -243,8 +253,7 @@ $sql = 'SELECT * $groups = db_get_all_rows_sql($sql); $table = new stdClass(); -$table->width = '100%'; -$table->class = 'info_table'; +$table->class = 'info_table m2020'; if (empty($groups) === false) { $table->head = []; @@ -254,6 +263,8 @@ if (empty($groups) === false) { $table->head[2] = __('Delete'); } + $table->size[0] = '5%'; + $table->align = []; $table->align[1] = 'left'; if ($is_management_allowed === true) { @@ -270,10 +281,10 @@ if (empty($groups) === false) { if ($is_management_allowed === true) { $data[1] = ''.ui_print_truncate_text($id_group['name'], GENERIC_SIZE_TEXT).''; if (is_metaconsole() === true) { - $data[2] = ''.html_print_image('images/cross.png', true, ['border' => '0']).''; + $data[2] = ''.html_print_image('images/delete.svg', true, ['class' => 'main_menu_icon']).''; } else { $table->cellclass[][2] = 'table_action_buttons'; - $data[2] = ''.html_print_image('images/cross.png', true, ['border' => '0']).''; + $data[2] = ''.html_print_image('images/delete.svg', true, ['class' => 'main_menu_icon']).''; } } else { $data[1] = ''; @@ -284,9 +295,8 @@ if (empty($groups) === false) { array_push($table->data, $data); } - ui_pagination($total_groups, $url, $offset); html_print_table($table); - ui_pagination($total_groups, $url, $offset, 0, false, 'offset', true, 'pagination-bottom'); + $tablePagination = ui_pagination($total_groups, $url, $offset, 0, true, 'offset', false); } else { ui_print_info_message( [ @@ -298,16 +308,17 @@ if (empty($groups) === false) { if ($is_management_allowed === true) { echo '
        '; - html_print_div( + html_print_action_buttons( + html_print_submit_button( + __('Create module group'), + 'crt', + false, + [ 'icon' => 'next' ], + true + ), [ - 'class' => 'action-buttons', - 'content' => html_print_submit_button( - __('Create module group'), - 'crt', - false, - [ 'icon' => 'next' ], - true - ), + 'type' => 'form_action', + 'right_content' => $tablePagination, ] ); echo '
        '; diff --git a/pandora_console/godmode/modules/manage_nc_groups.php b/pandora_console/godmode/modules/manage_nc_groups.php index 60d72aea79..fc25be5cd1 100644 --- a/pandora_console/godmode/modules/manage_nc_groups.php +++ b/pandora_console/godmode/modules/manage_nc_groups.php @@ -1,17 +1,32 @@ '', + 'label' => __('Resources'), + ], + [ + 'link' => '', + 'label' => __('Component groups'), + ], + ] ); $sec = 'gmodules'; } @@ -234,12 +260,11 @@ foreach ($groups as $group_key => $group_val) { $groups = component_groups_get_groups_tree_recursive($groups_clean, 0, 0); $table = new stdClass(); -$table->width = '100%'; -$table->class = 'info_table'; +$table->class = 'info_table m2020'; $table->head = []; $table->head['checkbox'] = html_print_checkbox('all_delete', 0, false, true, false); $table->head[0] = __('Name'); -if (is_management_allowed() === true || is_metaconsole()) { +if (is_management_allowed() === true || is_metaconsole() === true) { $table->head[1] = __('Action'); } @@ -272,8 +297,14 @@ foreach ($groups as $group) { $table->cellclass[][1] = 'table_action_buttons'; if (is_management_allowed() === true || is_metaconsole()) { - $data[1] = "".html_print_image('images/cross.png', true, ['title' => __('Delete')]).''; + $data[1] = html_print_anchor( + [ + 'onClick' => 'if(confirm(\"'.__('Are you sure?').'\")) return true; else return false;', + 'href' => 'index.php?sec='.$sec.'&sec2=godmode/modules/manage_nc_groups&delete=1&id='.$group['id_sg'].'&offset=0', + 'content' => html_print_image('images/delete.svg', true, ['title' => __('Delete'), 'class' => 'main_menu_icon']), + ], + true + ); } array_push($table->data, $data); @@ -296,35 +327,63 @@ if (is_management_allowed() === false && is_metaconsole() === false) { ); } -if (isset($data)) { - echo "
        "; - html_print_input_hidden('multiple_delete', 1); +$actionButtons = []; +if (isset($data) === true) { + echo ''; html_print_table($table); - if (is_management_allowed() === true || is_metaconsole()) { - echo "
        "; - html_print_submit_button(__('Delete'), 'delete_btn', false, 'class="sub delete"'); - echo '
        '; - } - echo '
        '; } else { ui_print_info_message(['no_close' => true, 'message' => __('There are no defined component groups') ]); } if (is_management_allowed() === true || is_metaconsole()) { - echo '
        '; - echo '
        '; - html_print_input_hidden('new', 1); - html_print_submit_button(__('Create'), 'crt', false, 'class="sub next"'); - echo '
        '; + // Create form. + echo ''; + html_print_input_hidden('new', 1); echo '
        '; + // Create action button. + $actionButtons[] = html_print_submit_button( + __('Create'), + 'crt', + false, + [ + 'icon' => 'wand', + 'form' => 'create_form', + ], + true + ); + // Delete action button. + if (isset($data) === true) { + $actionButtons[] = html_print_input_hidden( + 'multiple_delete', + 1, + false, + false, + 'form="multiple_delete_form"' + ); + $actionButtons[] = html_print_submit_button( + __('Delete'), + 'delete_btn', + false, + [ + 'icon' => 'delete', + 'mode' => 'secondary', + 'form' => 'multiple_delete_form', + ], + true + ); + } } +html_print_action_buttons( + implode('', $actionButtons), + ['type' => 'form_action'] +); + enterprise_hook('close_meta_frame'); ?> diff --git a/pandora_console/godmode/modules/manage_nc_groups_form.php b/pandora_console/godmode/modules/manage_nc_groups_form.php index 01beca52ed..3342c06e03 100644 --- a/pandora_console/godmode/modules/manage_nc_groups_form.php +++ b/pandora_console/godmode/modules/manage_nc_groups_form.php @@ -1,17 +1,32 @@ width = '100%'; -$table->class = 'databox filters'; +$table->class = 'databox m2020'; -if (defined('METACONSOLE')) { +if (is_metaconsole() === true) { $table->class = 'databox data'; - if ($id) { - $table->head[0] = __('Update Group Component'); - } else { - $table->head[0] = __('Create Group Component'); - } - + $table->head[0] = ($id) ? __('Update Group Component') : __('Create Group Component'); $table->head_colspan[0] = 4; $table->headstyle[0] = 'text-align: center'; } $table->style = []; -$table->style[0] = 'font-weight: bold'; -$table->style[2] = 'font-weight: bold'; +$table->style[0] = 'width: 0'; +$table->style[1] = 'width: 0'; + $table->data = []; - $table->data[0][0] = __('Name'); -$table->data[0][1] = html_print_input_text('name', $name, '', 15, 255, true); - -$table->data[0][2] = __('Parent'); -$table->data[0][3] = html_print_select( +$table->data[0][1] = __('Parent'); +$table->data[1][0] = html_print_input_text('name', $name, '', 0, 255, true, false, false, '', 'w100p'); +$table->data[1][1] = html_print_select( network_components_get_groups(), 'parent', $parent, @@ -81,17 +84,39 @@ $table->data[0][3] = html_print_select( false ); -echo '
        '; +$manageNcGroupsUrl = 'index.php?sec='.$sec.'&sec2=godmode/modules/manage_nc_groups'; + +echo ''; html_print_table($table); -echo '
        '; + if ($id) { html_print_input_hidden('update', 1); html_print_input_hidden('id', $id); - html_print_submit_button(__('Update'), 'crt', false, 'class="sub upd"'); + $actionButtonTitle = __('Update'); } else { html_print_input_hidden('create', 1); - html_print_submit_button(__('Create'), 'crt', false, 'class="sub wand"'); + $actionButtonTitle = __('Create'); } -echo '
        '; +$actionButtons = []; + +$actionButtons[] = html_print_submit_button( + $actionButtonTitle, + 'crt', + false, + ['icon' => 'wand'], + true +); + +$actionButtons[] = html_print_go_back_button( + $manageNcGroupsUrl, + ['button_class' => ''], + true +); + +html_print_action_buttons( + implode('', $actionButtons), + [ 'type' => 'form_action'] +); + echo '
        '; diff --git a/pandora_console/godmode/modules/module_list.php b/pandora_console/godmode/modules/module_list.php index f8c07d7848..9372d3c8c7 100644 --- a/pandora_console/godmode/modules/module_list.php +++ b/pandora_console/godmode/modules/module_list.php @@ -1,17 +1,32 @@ '', + 'label' => __('Resources'), + ], + [ + 'link' => '', + 'label' => __('Module types'), + ], + ] +); + $update_module = (bool) get_parameter_post('update_module'); // Update -if ($update_module) { +if ($update_module === true) { $name = get_parameter_post('name'); $id_type = get_parameter_post('id_type'); $description = get_parameter_post('description'); @@ -54,43 +87,33 @@ if ($update_module) { } } +$table = new stdClass(); +$table->id = 'module_type_list'; +$table->class = 'info_table m2020'; +$table->size = []; +$table->size[0] = '5%'; +$table->size[1] = '5%'; +$table->head = []; +$table->head[0] = __('ID'); +$table->head[1] = __('Icon'); +$table->head[2] = __('Name'); +$table->head[3] = __('Description'); -echo ""; -echo ''; -echo ''; -echo ''; -echo ''; -echo ''; -echo 'data = []; -$rows = db_get_all_rows_sql('SELECT * FROM ttipo_modulo ORDER BY nombre'); +$rows = db_get_all_rows_sql('SELECT * FROM ttipo_modulo ORDER BY id_tipo'); if ($rows === false) { $rows = []; } -$color = 0; foreach ($rows as $row) { - if ($color == 1) { - $tdcolor = 'datos'; - $color = 0; - } else { - $tdcolor = 'datos2'; - $color = 1; - } + $data[0] = $row['id_tipo']; + $data[1] = html_print_image('images/'.$row['icon'], true, ['class' => 'main_menu_icon invert_filter']); + $data[2] = $row['nombre']; + $data[3] = $row['descripcion']; - echo " - - - - - - '; + array_push($table->data, $data); } -echo '
        '.__('Icon').''.__('ID').''.__('Name').''.__('Description').'
        ".html_print_image('images/'.$row['icon'], true, ['border' => '0', 'class' => 'invert_filter'])." - ".$row['id_tipo']." - - ".$row['nombre']." - - ".$row['descripcion'].' -
        '; +html_print_table($table); +// $tablePagination = ui_pagination($total_groups, $url, $offset, 0, true, 'offset', false); diff --git a/pandora_console/godmode/setup/os.list.php b/pandora_console/godmode/setup/os.list.php index f8ba6a865a..1fd8b57348 100644 --- a/pandora_console/godmode/setup/os.list.php +++ b/pandora_console/godmode/setup/os.list.php @@ -62,23 +62,23 @@ if (is_management_allowed() === false) { $table = new stdClass(); // $table->width = '100%'; -$table->styleTable = 'margin: 10px 10px 0'; -$table->class = 'info_table'; +// $table->styleTable = 'margin: 10px 10px 0'; +$table->class = 'info_table m2020'; -$table->head[0] = ''; -$table->head[1] = __('ID'); +$table->head[0] = __('ID'); +$table->head[1] = __('Icon'); $table->head[2] = __('Name'); $table->head[3] = __('Description'); if ($is_management_allowed === true) { $table->head[4] = ''; } -$table->align[0] = 'center'; +$table->align[1] = 'center'; if ($is_management_allowed === true) { $table->align[4] = 'center'; } -$table->size[0] = '20px'; +$table->size[0] = '5%'; if ($is_management_allowed === true) { $table->size[4] = '20px'; } @@ -103,14 +103,22 @@ if ($osList === false) { $table->data = []; foreach ($osList as $os) { $data = []; - $data[] = html_print_div(['class' => 'main_menu_icon', 'content' => ui_print_os_icon($os['id_os'], false, true)], true); $data[] = $os['id_os']; + $data[] = html_print_div(['class' => 'main_menu_icon', 'content' => ui_print_os_icon($os['id_os'], false, true)], true); if ($is_management_allowed === true) { if (is_metaconsole() === true) { - $data[] = ''.io_safe_output($os['name']).''; + $osNameUrl = 'index.php?sec=advanced&sec2=advanced/component_management&tab=os_manage&action=edit&tab2=builder&id_os='.$os['id_os']; } else { - $data[] = ''.io_safe_output($os['name']).''; + $osNameUrl = 'index.php?sec=gsetup&sec2=godmode/setup/os&action=edit&tab=builder&id_os='.$os['id_os']; } + + $data[] = html_print_anchor( + [ + 'href' => $osNameUrl, + 'content' => io_safe_output($os['name']), + ], + true + ); } else { $data[] = io_safe_output($os['name']); } diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 88eb27d931..54d271ff5a 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -1982,15 +1982,17 @@ div#agent_wizard_subtabs { } table.databox { - background-color: #f9faf9; + background-color: #fff; border-spacing: 0px; - -moz-box-shadow: 0 3px 6px 0 rgb(0 0 0 / 13%); - -webkit-box-shadow: 0 3px 6px 0 rgb(0 0 0 / 13%); - box-shadow: 0 3px 6px 0 rgb(0 0 0 / 13%); - border-radius: 4px; - border: 1px solid #e2e2e2; + border-radius: 6px; + /*-moz-box-shadow: 0 3px 6px 0 rgb(0 0 0 / 13%);*/ + /* -webkit-box-shadow: 0 3px 6px 0 rgb(0 0 0 / 13%); */ + /* box-shadow: 0 3px 6px 0 rgb(0 0 0 / 13%); */ + border: 2px solid #c0ccdc; padding: 20px; margin-bottom: 20px; + width: -webkit-fill-available; + width: -moz-available; } .databox > tbody > tr > td { @@ -3717,7 +3719,7 @@ table#policy_modules td * { } .tactical_table > thead > tr span { - line-height: 26px; + /*line-height: 26px;*/ } .info_table thead th .sort_arrow, @@ -6746,10 +6748,6 @@ div.graph div.legend table { margin: 0px; } -.mrgn_5px_a0 { - margin: 5px auto 0; -} - .mrgn_10px { margin: 10px; } @@ -7022,6 +7020,17 @@ div.graph div.legend table { margin-bottom: 80px; } +.m1010 { + margin: 10px; +} + +.m1020 { + margin: 10px 20px; +} + +.m2020 { + margin: 20px; +} .snmp_view_div { float: left; padding-left: 30px; @@ -9887,7 +9896,8 @@ div#err_msg_centralised { .inputFile { background-color: #f6f7fb; height: 16px; - font: normal normal normal 13px Pandora-Light; + font-family: "Pandora-Regular"; + font-size: 12px; padding: 5.5pt 20pt; cursor: pointer; color: #14524f; @@ -9908,12 +9918,13 @@ input, textarea, select { background-color: #f6f7fb; - height: 38px; border: 2px solid #c0ccdc; border-radius: 6px; + height: 38px; + font-family: "Pandora-Regular"; + font-size: 12px; + color: #333333; padding-left: 12px; - font: normal normal normal 14px Pandora-Light; - color: #2b3332; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; @@ -10593,7 +10604,8 @@ tr.bring_next_field { -moz-box-sizing: border-box !important; box-sizing: border-box !important; cursor: pointer; - font: normal normal normal 12px Pandora-Light !important; + font-family: "Pandora-Regular" !important; + font-size: 12px !important; } .select2-container .select2-selection--single { @@ -10891,7 +10903,7 @@ pre.external_tools_output { .fixed_filter_bar { position: sticky; top: 114px; - margin-bottom: 10px; + /*margin-bottom: 10px;*/ border: 1px solid #e5e9ed; background-color: #fff; z-index: 1; diff --git a/pandora_console/include/styles/tables.css b/pandora_console/include/styles/tables.css index a726e6ecb9..ed0d219d12 100644 --- a/pandora_console/include/styles/tables.css +++ b/pandora_console/include/styles/tables.css @@ -91,11 +91,13 @@ .info_table, .filter_table { background-color: #fff; - /* margin-bottom: 10px; */ border-spacing: 0; - border-collapse: collapse; overflow: hidden; - border-radius: 5px; + border-radius: 6px; + border: 2px solid #c0ccdc; + width: -webkit-fill-available; + width: -moz-available; + margin-bottom: 50px !important; } .info_table > tbody > tr:nth-child(even) { @@ -111,20 +113,20 @@ }*/ .info_table > tbody > tr > th, .info_table > thead > tr > th { - border-top: 1px solid #c0ccdc; + /*border-top: 1px solid #c0ccdc;*/ } .info_table tr > td:first-child, .info_table tr > th:first-child { /*padding-left: 5px;*/ padding-left: 10px; - border-left: 1px solid #c0ccdc; + /*border-left: 1px solid #c0ccdc;*/ } .info_table tr > td:last-child, .info_table tr > th:last-child { /*padding-right: 5px;*/ padding-right: 10px; - border-right: 1px solid #c0ccdc; + /*border-right: 1px solid #c0ccdc;*/ } .info_table tr:first-child > th { @@ -155,8 +157,9 @@ } .info_table > thead > tr * { - font-size: 10pt; - font-family: "Pandora-Regular"; + font-size: 12px; + font-family: "Pandora-Bold"; + line-height: 23px; } /* Radius top */ @@ -186,12 +189,14 @@ /*margin-left: 0.5em;*/ } -.info_table > tbody > tr { +.info_table > tbody > tr:last-child { /*border-bottom: 1px solid #e2e2e2;*/ border-top: 0; - border-bottom: 1px solid #c0ccdc; + /*border-bottom: 1px solid #c0ccdc;*/ + /* border-left: 1px solid #c0ccdc; border-right: 1px solid #c0ccdc; + */ } .info_table > tbody > tr > th, .info_table > thead > tr > th, From 7a2cb912b2311eca151acde1bec0ea6ff6dbfc10 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Tue, 21 Feb 2023 14:16:37 +0100 Subject: [PATCH 320/563] Workaround for Status icon --- pandora_console/include/functions_ui.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index 4675737c57..9b3060d1f8 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -2891,7 +2891,7 @@ function ui_print_status_image( if ($image_with_css === true) { $shape_status = get_shape_status_set($type); - $shape_status['is_tree_view'] = true; + // $shape_status['is_tree_view'] = true; return ui_print_status_sets($type, $title, $return, $shape_status, $extra_info); } else { $imagepath .= '/'.$type; From 9d3f253dd4304deadaf81c7b7b4b260d83005429 Mon Sep 17 00:00:00 2001 From: Rafael Date: Tue, 21 Feb 2023 15:36:37 +0100 Subject: [PATCH 321/563] 10435 fixing os description for ssh banner --- extras/deploy-scripts/pandora_deploy_community_el8.sh | 2 +- extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/extras/deploy-scripts/pandora_deploy_community_el8.sh b/extras/deploy-scripts/pandora_deploy_community_el8.sh index 721d60ffb5..fe00f81571 100644 --- a/extras/deploy-scripts/pandora_deploy_community_el8.sh +++ b/extras/deploy-scripts/pandora_deploy_community_el8.sh @@ -756,7 +756,7 @@ execute_cmd "systemctl start pandora_agent_daemon" "Starting Pandora FMS Agent" cat > /etc/issue.net << EOF_banner -Welcome to Pandora FMS appliance on CentOS +Welcome to Pandora FMS appliance on RHEL/Rocky Linux 8 ------------------------------------------ Go to Public http://$ipplublic/pandora_console$to to login web console $(ip addr | grep -w "inet" | grep -v "127.0.0.1" | grep -v "172.17.0.1" | awk '{print $2}' | awk -F '/' '{print "Go to Local http://"$1"/pandora_console to login web console"}') diff --git a/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh b/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh index 06f23804db..8bd8bcfaff 100644 --- a/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh +++ b/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh @@ -772,7 +772,7 @@ sed --follow-symlinks -i -e "s/^openssl_conf = openssl_init/#openssl_conf = open cat > /etc/issue.net << EOF_banner -Welcome to Pandora FMS appliance on CentOS +Welcome to Pandora FMS appliance on Ubuntu ------------------------------------------ Go to Public http://$ipplublic/pandora_console$to to login web console $(ip addr | grep -w "inet" | grep -v "127.0.0.1" | grep -v "172.17.0.1" | awk '{print $2}' | awk -F '/' '{print "Go to Local http://"$1"/pandora_console to login web console"}') From 2b185b5754c1d16793531ff8ed703ea4a22173c3 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Tue, 21 Feb 2023 15:44:41 +0100 Subject: [PATCH 322/563] #10493 fixed pagination in alerts --- pandora_console/godmode/alerts/alert_actions.php | 4 ++-- pandora_console/godmode/alerts/alert_commands.php | 6 +++--- pandora_console/godmode/alerts/alert_templates.php | 5 +++-- pandora_console/godmode/alerts/configure_alert_action.php | 3 ++- pandora_console/godmode/alerts/configure_alert_template.php | 3 ++- 5 files changed, 12 insertions(+), 9 deletions(-) diff --git a/pandora_console/godmode/alerts/alert_actions.php b/pandora_console/godmode/alerts/alert_actions.php index 873d91598c..2089dc5900 100644 --- a/pandora_console/godmode/alerts/alert_actions.php +++ b/pandora_console/godmode/alerts/alert_actions.php @@ -391,7 +391,7 @@ foreach ($actions as $action) { $data = []; - $data[0] = ''.$action['name'].''; + $data[0] = ''.$action['name'].''; if ($action['id_group'] == 0 && $can_edit_all == false) { $data[0] .= ui_print_help_tip(__('You cannot edit this action, You don\'t have the permission to edit All group.'), true); } @@ -467,7 +467,7 @@ if (isset($data)) { if (is_management_allowed() === true) { echo '
        '; - echo '
        '; + echo ''; html_print_submit_button(__('Create'), 'create', false, 'class="sub next"'); html_print_input_hidden('create_alert', 1); echo '
        '; diff --git a/pandora_console/godmode/alerts/alert_commands.php b/pandora_console/godmode/alerts/alert_commands.php index 24d07a392f..2090461050 100644 --- a/pandora_console/godmode/alerts/alert_commands.php +++ b/pandora_console/godmode/alerts/alert_commands.php @@ -795,15 +795,15 @@ foreach ($commands as $command) { ); $data['action'] = ''; $table->cellclass[]['action'] = 'action_buttons'; - + $offset_delete = ($offset >= ($total_commands - 1)) ? ($offset - $limit) : $offset; // (IMPORTANT, DO NOT CHANGE!) only users with permissions over "All" group have access to edition of commands belonging to "All" group. if ($is_management_allowed === true && !$command['internal'] && check_acl_restricted_all($config['id_user'], $command['id_group'], 'LM')) { if (is_user_admin($config['id_user']) === true) { $data['action'] = ''; - $data['action'] .= ''.html_print_image('images/copy.png', true, ['class' => 'invert_filter']).''; - $data['action'] .= ''.html_print_image('images/cross.png', true, ['class' => 'invert_filter']).''; $data['action'] .= ''; } diff --git a/pandora_console/godmode/alerts/alert_templates.php b/pandora_console/godmode/alerts/alert_templates.php index c0374c210b..cd49f7ee7c 100644 --- a/pandora_console/godmode/alerts/alert_templates.php +++ b/pandora_console/godmode/alerts/alert_templates.php @@ -352,7 +352,8 @@ if ($search_string) { $filter[] = "(name LIKE '%".$search_string."%' OR description LIKE '%".$search_string."%' OR value LIKE '%".$search_string."%')"; } -$filter['offset'] = (int) get_parameter('offset'); +$offset = (int) get_parameter('offset'); +$filter['offset'] = $offset; $filter['limit'] = (int) $config['block_size']; if (!is_user_admin($config['id_user'])) { $filter['id_group'] = array_keys(users_get_groups(false, 'LM')); @@ -420,7 +421,7 @@ foreach ($templates as $template) { && check_acl($config['id_user'], $template['id_group'], 'LM') ) { $table->cellclass[][4] = 'action_buttons'; - $data[4] = '
        '; + $data[4] = ''; $data[4] .= html_print_input_hidden('duplicate_template', 1, true); $data[4] .= html_print_input_hidden('source_id', $template['id'], true); $data[4] .= html_print_input_image( diff --git a/pandora_console/godmode/alerts/configure_alert_action.php b/pandora_console/godmode/alerts/configure_alert_action.php index 068026c953..240fa26fc3 100644 --- a/pandora_console/godmode/alerts/configure_alert_action.php +++ b/pandora_console/godmode/alerts/configure_alert_action.php @@ -372,8 +372,9 @@ for ($i = 1; $i <= $config['max_macro_fields']; $i++) { ); } +$offset = (int) get_parameter('offset', 0); -echo ''; +echo ''; $table_html = html_print_table($table, true); echo $table_html; diff --git a/pandora_console/godmode/alerts/configure_alert_template.php b/pandora_console/godmode/alerts/configure_alert_template.php index 8838c5c458..0269d94573 100644 --- a/pandora_console/godmode/alerts/configure_alert_template.php +++ b/pandora_console/godmode/alerts/configure_alert_template.php @@ -1147,9 +1147,10 @@ if ($step == 2) { echo ui_get_using_system_timezone_warning(); } +$offset = (int) get_parameter('offset'); // If it's the last step it will redirect to template lists. if ($step >= LAST_STEP) { - echo ''; + echo ''; } else { echo ''; } From f9c3524be887ff07169ca028e55c79899a07c07f Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Tue, 21 Feb 2023 16:05:24 +0100 Subject: [PATCH 323/563] #10493 fixed pagination in profiles --- pandora_console/godmode/users/user_list.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pandora_console/godmode/users/user_list.php b/pandora_console/godmode/users/user_list.php index 85e713bed0..11ecc02f11 100644 --- a/pandora_console/godmode/users/user_list.php +++ b/pandora_console/godmode/users/user_list.php @@ -816,7 +816,7 @@ foreach ($info as $user_id => $user_info) { $toDoClass = 'filter_none'; } - $data[6] = ''; + $data[6] = ''; $data[6] .= html_print_input_hidden( 'id', $user_info['id_user'], @@ -874,7 +874,8 @@ foreach ($info as $user_id => $user_info) { && $user_info['id_user'] != $config['id_user'] && isset($user_info['not_delete']) === false ) { - $data[6] .= ''; + $offset_delete = ($offset >= count($info) - 1) ? ($offset - $config['block_size']) : $offset; + $data[6] .= ''; $data[6] .= html_print_input_hidden( 'delete_user', $user_info['id_user'], From dfadbb0f80cc57d61bc1f1ccbb77163acf1ab6db Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Tue, 21 Feb 2023 16:51:05 +0100 Subject: [PATCH 324/563] #10493 added pagination in group module --- pandora_console/godmode/groups/configure_modu_group.php | 5 +++-- pandora_console/godmode/groups/modu_group_list.php | 8 ++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/pandora_console/godmode/groups/configure_modu_group.php b/pandora_console/godmode/groups/configure_modu_group.php index 9330aa1320..282bd81d18 100644 --- a/pandora_console/godmode/groups/configure_modu_group.php +++ b/pandora_console/godmode/groups/configure_modu_group.php @@ -40,6 +40,7 @@ $custom_id = ''; $create_group = (bool) get_parameter('create_group'); $id_group = (int) get_parameter('id_group'); +$offset = (int) get_parameter('offset', 0); if ($id_group) { $group = db_get_row('tmodule_group', 'id_mg', $id_group); @@ -70,9 +71,9 @@ $table->data[0][1] = html_print_input_text('name', $name, '', 35, 100, true); echo ''; if (is_metaconsole()) { - echo ''; + echo ''; } else { - echo ''; + echo ''; } html_print_table($table); diff --git a/pandora_console/godmode/groups/modu_group_list.php b/pandora_console/godmode/groups/modu_group_list.php index 84dc35ada8..ea74c92cf5 100644 --- a/pandora_console/godmode/groups/modu_group_list.php +++ b/pandora_console/godmode/groups/modu_group_list.php @@ -262,18 +262,18 @@ if (empty($groups) === false) { } $table->data = []; - + $offset_delete = ($offset >= $total_groups - 1) ? ($offset - $config['block_size']) : $offset; foreach ($groups as $id_group) { $data = []; $data[0] = $id_group['id_mg']; if ($is_management_allowed === true) { - $data[1] = ''.ui_print_truncate_text($id_group['name'], GENERIC_SIZE_TEXT).''; + $data[1] = ''.ui_print_truncate_text($id_group['name'], GENERIC_SIZE_TEXT).''; if (is_metaconsole() === true) { - $data[2] = ''.html_print_image('images/cross.png', true, ['border' => '0']).''; + $data[2] = ''.html_print_image('images/cross.png', true, ['border' => '0']).''; } else { $table->cellclass[][2] = 'action_buttons'; - $data[2] = ''.html_print_image('images/cross.png', true, ['border' => '0']).''; + $data[2] = ''.html_print_image('images/cross.png', true, ['border' => '0']).''; } } else { $data[1] = ''; From 05c2232daa2135eca7be5c8c97764fe8d41dd95a Mon Sep 17 00:00:00 2001 From: Jonathan Date: Tue, 21 Feb 2023 17:07:03 +0100 Subject: [PATCH 325/563] Modals dashboard view fix --- pandora_console/include/javascript/pandora_dashboards.js | 1 - pandora_console/include/styles/pandora.css | 5 ++++- pandora_console/views/dashboard/list.php | 4 ++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/pandora_console/include/javascript/pandora_dashboards.js b/pandora_console/include/javascript/pandora_dashboards.js index 02b8e47c08..d8bd2af733 100644 --- a/pandora_console/include/javascript/pandora_dashboards.js +++ b/pandora_console/include/javascript/pandora_dashboards.js @@ -412,7 +412,6 @@ function initialiceLayout(data) { widgetId: widgetId }, width: size.width, - maxHeight: size.height, minHeight: size.height }, onsubmit: { diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 54d271ff5a..b6b23b4eff 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -10591,7 +10591,7 @@ tr.bring_next_field { vertical-align: middle; text-align: left; min-width: 150px !important; - z-index: 60; + z-index: 1115; } .select2-container .select2-selection--single, @@ -11268,3 +11268,6 @@ form#satellite_conf_edit > fieldset.full-column { background-size: 24px; background-image: url("../../images/enable.svg"); } +div[role="dialog"] { + z-index: 1115; +} diff --git a/pandora_console/views/dashboard/list.php b/pandora_console/views/dashboard/list.php index 46b1cd68cc..b67fd88beb 100644 --- a/pandora_console/views/dashboard/list.php +++ b/pandora_console/views/dashboard/list.php @@ -217,7 +217,7 @@ if ($writeDashboards === 1) { $text = __('Create a new dashboard'); // Button for display modal options dashboard. - $output = ' $text, @@ -236,7 +236,7 @@ if ($writeDashboards === 1) { 'class="sub next"', true ); - $output .= ''; + $output .= '
        '; echo $output; From 53ca82277949056c7f3c64001f4ac9d7e2317dfe Mon Sep 17 00:00:00 2001 From: artica Date: Wed, 22 Feb 2023 01:02:03 +0100 Subject: [PATCH 326/563] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 5a537cea8d..c34db5f894 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.769-230221 +Version: 7.0NG.769-230222 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index 3bdb964eb0..72b549f170 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.769-230221" +pandora_version="7.0NG.769-230222" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index cd0fdd0989..c82ed15205 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1023,7 +1023,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.769'; -use constant AGENT_BUILD => '230221'; +use constant AGENT_BUILD => '230222'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index 1a82c15221..fe2362d995 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_agent_linux %define version 7.0NG.769 -%define release 230221 +%define release 230222 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 4015375532..81c0006686 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_agent_linux %define version 7.0NG.769 -%define release 230221 +%define release 230222 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index 6d8458b318..dbba71464e 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.769" -PI_BUILD="230221" +PI_BUILD="230222" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index bd75795838..9cd2f1ce9b 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{230221} +{230222} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index f38933f5b9..8ea729b765 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.769 Build 230221") +#define PANDORA_VERSION ("7.0NG.769 Build 230222") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 21f5675492..16401cb766 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.769(Build 230221))" + VALUE "ProductVersion", "(7.0NG.769(Build 230222))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 919f840961..2574c3509a 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.769-230221 +Version: 7.0NG.769-230222 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index 524fd6c38c..c60d8d2f48 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.769-230221" +pandora_version="7.0NG.769-230222" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index af73bd3842..779168d363 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC230221'; +$build_version = 'PC230222'; $pandora_version = 'v7.0NG.769'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 5976f2c24e..c5e562f2cc 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -131,7 +131,7 @@
        [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index e972b323a3..11f52f0cc9 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.769 -%define release 230221 +%define release 230222 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 3412365986..e97a126961 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.769 -%define release 230221 +%define release 230222 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index cd73c5e77f..a2864c992f 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.769" -PI_BUILD="230221" +PI_BUILD="230222" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index b54b653594..cd6b6075aa 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -35,7 +35,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.769 Build 230221"; +my $version = "7.0NG.769 Build 230222"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 37b388fb73..2aa01fdd62 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.769 Build 230221"; +my $version = "7.0NG.769 Build 230222"; # save program name for logging my $progname = basename($0); From fe0bfbe9d6e243c93ee52c259487d20d5c4b0141 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Wed, 22 Feb 2023 08:08:11 +0100 Subject: [PATCH 327/563] Close mesage image fix --- pandora_console/include/functions_ui.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index 9b3060d1f8..b97b828979 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -343,7 +343,7 @@ function ui_print_message($message, $class='', $attributes='', $return=false, $t [ 'href' => 'javascript: close_info_box(\''.$id.'\')', 'content' => html_print_image( - 'images/svg/fail.svg', + 'images/close@svg.svg', true, false, false, From 28d964651fa51d0ae05463ec4ca7c832273f4350 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Wed, 22 Feb 2023 08:12:45 +0100 Subject: [PATCH 328/563] Modal report issue change email input style --- pandora_console/include/styles/pandora.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index b6b23b4eff..b154462933 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -6503,7 +6503,7 @@ form#modal_form_feedback label { font-size: 10pt; } -form#modal_form_feedback input[type="email"] { +/*form#modal_form_feedback input[type="email"] { background-color: transparent; border: none; border-radius: 0; @@ -6511,7 +6511,7 @@ form#modal_form_feedback input[type="email"] { padding: 0px 0px 2px 0px; box-sizing: border-box; margin-bottom: 4px; -} +}*/ form#modal_form_feedback ul.wizard li { padding-bottom: 10px; From 4d5891cd02a69a37c4a485d271d22986bcbfbd2c Mon Sep 17 00:00:00 2001 From: Jonathan Date: Wed, 22 Feb 2023 08:56:37 +0100 Subject: [PATCH 329/563] Select2 z-index for dialogs --- pandora_console/include/styles/pandora.css | 1 - pandora_console/include/styles/select2.min.css | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index b154462933..20c0884d93 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -10591,7 +10591,6 @@ tr.bring_next_field { vertical-align: middle; text-align: left; min-width: 150px !important; - z-index: 1115; } .select2-container .select2-selection--single, diff --git a/pandora_console/include/styles/select2.min.css b/pandora_console/include/styles/select2.min.css index ba24d67270..5e0b002480 100644 --- a/pandora_console/include/styles/select2.min.css +++ b/pandora_console/include/styles/select2.min.css @@ -71,7 +71,7 @@ position: absolute; left: -100000px; width: 100%; - z-index: 999; + z-index: 1115; } .select2-results { display: block; @@ -265,8 +265,8 @@ cursor: default; float: left; margin-right: 3px; - margin-top: 2px; - height: 17px; + margin-top: 2px; + height: 17px; padding: 0 5px; } .select2-container--default From 2f1060af56bb340d873b39c011e2b7c5e713ce16 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Wed, 22 Feb 2023 09:05:27 +0100 Subject: [PATCH 330/563] #10493 fixed pagination in collection --- .../modules/manage_network_components.php | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/pandora_console/godmode/modules/manage_network_components.php b/pandora_console/godmode/modules/manage_network_components.php index bdec795443..8a27800ec2 100644 --- a/pandora_console/godmode/modules/manage_network_components.php +++ b/pandora_console/godmode/modules/manage_network_components.php @@ -597,9 +597,10 @@ if ((bool) $id !== false || $new_component $search_id_group = (int) get_parameter('search_id_group'); $search_string = (string) get_parameter('search_string'); +$offset = (int) get_parameter('offset'); $url = ui_get_url_refresh( [ - 'offset' => false, + 'offset' => $offset, 'search_string' => $search_string, 'search_id_group' => $search_id_group, 'id' => $id, @@ -607,7 +608,7 @@ $url = ui_get_url_refresh( true, false ); - +$name_url = 'index.php?sec=templates&sec2=godmode/modules/manage_network_components'; $table = new stdClass(); $table->width = '100%'; $table->class = 'databox filters'; @@ -712,8 +713,9 @@ $total_components = network_components_get_network_components( 'COUNT(*) AS total' ); $total_components = $total_components[0]['total']; -ui_pagination($total_components, $url); -$filter['offset'] = (int) get_parameter('offset'); +$offset_delete = ($offset >= ($total_components - 1)) ? ($offset - $config['block_size']) : $offset; +ui_pagination($total_components, $name_url); +$filter['offset'] = $offset; $filter['limit'] = (int) $config['block_size']; $components = network_components_get_network_components( false, @@ -791,7 +793,7 @@ foreach ($components as $component) { true ); - $data[0] = ''; + $data[0] = ''; $data[0] .= io_safe_output($component['name']); $data[0] .= ''; } else { @@ -855,7 +857,7 @@ foreach ($components as $component) { if ($is_management_allowed === true) { $table->cellclass[][6] = 'action_buttons'; - $data[6] = ''.html_print_image( + $data[6] = ''.html_print_image( 'images/copy.png', true, [ @@ -864,7 +866,7 @@ foreach ($components as $component) { 'class' => 'invert_filter', ] ).''; - $data[6] .= ''.html_print_image( + $data[6] .= ''.html_print_image( 'images/cross.png', true, [ @@ -887,7 +889,7 @@ if (isset($data) === true) { html_print_table($table); ui_pagination( $total_components, - $url, + $name_url, 0, 0, false, From 2b7b49db2072c43a4682e2b1ed714ed8a7822a55 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Wed, 22 Feb 2023 09:29:55 +0100 Subject: [PATCH 331/563] #10493 fixed pagination in tags --- pandora_console/godmode/tag/tag.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pandora_console/godmode/tag/tag.php b/pandora_console/godmode/tag/tag.php index b808edde9b..6474abd437 100644 --- a/pandora_console/godmode/tag/tag.php +++ b/pandora_console/godmode/tag/tag.php @@ -207,14 +207,14 @@ if (empty($tag_name) === false) { // If the user has filtered the view. $filter_performed = !empty($filter); - -$filter['offset'] = (int) get_parameter('offset'); +$offset = (int) get_parameter('offset'); +$filter['offset'] = $offset; $filter['limit'] = (int) $config['block_size']; // Statements for pagination. -$url = ui_get_url_refresh(); +$url = 'index.php?sec=gusuarios&sec2=godmode/tag/tag'; $total_tags = tags_get_tag_count($filter); - +$offset_delete = ($offset >= ($total_tags - 1)) ? ($offset - $config['block_size']) : $offset; $result = tags_search_tag(false, $filter); // Filter form. @@ -392,7 +392,7 @@ if (empty($result) === false) { ] ); $data[6] .= ''; - $data[6] .= ''.html_print_image( + $data[6] .= ''.html_print_image( 'images/cross.png', true, [ From 8df0c8a66d2426cfe0149d0d59b65e962fc42db2 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Wed, 22 Feb 2023 09:39:13 +0100 Subject: [PATCH 332/563] Fonts changed at Sancho request --- pandora_console/include/styles/menu.css | 8 ++-- pandora_console/include/styles/pandora.css | 53 +++++++++++++--------- pandora_console/include/styles/tables.css | 11 +++-- 3 files changed, 41 insertions(+), 31 deletions(-) diff --git a/pandora_console/include/styles/menu.css b/pandora_console/include/styles/menu.css index beaecb1615..db1eebb9da 100644 --- a/pandora_console/include/styles/menu.css +++ b/pandora_console/include/styles/menu.css @@ -458,7 +458,7 @@ ul li { top: 0; left: 0; background-color: #ffffff; - border-right: 1px solid #c1ccdc; + border-right: 1px solid #eee; } .button_collapse { @@ -482,7 +482,7 @@ ul li { .menu_full_classic, .button_classic { - width: 280px; + width: 250px; } .menu_full_collapsed, @@ -551,7 +551,7 @@ ul li { * --------------------------------------------------------------------- */ .page_classic { - padding-left: 280px; + padding-left: 250px; } .page_collapsed { @@ -559,7 +559,7 @@ ul li { } .header_table_classic { - padding-left: 300px; + padding-left: 270px; /* 280 + 35 */ } diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 54d271ff5a..5ed8d43ef9 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -153,17 +153,20 @@ html { } body { - background-color: #f6f7fb; + background-color: #fbfbfb; margin: 0 auto; display: flex; flex-direction: column; min-height: 100%; - font-weight: 400; - font-family: "Pandora-Regular"; - -webkit-font-smoothing: antialiased; + color: #333; + font-family: "lato"; + -webkit-font-smoothing: initial; text-rendering: optimizeLegibility; } +body * { + font-family: "lato"; +} body.body-report { display: block; } @@ -1386,7 +1389,7 @@ div#head { height: 60px; padding-top: 0px; margin: 0 auto; - border-bottom: 1px solid #c1ccdc; + border-bottom: 1px solid #eee; min-width: 882px; background-color: #fff; color: #000; @@ -1747,7 +1750,7 @@ div.title_line { display: flex; align-items: flex-end; justify-content: space-between; - border-bottom: 1px solid #c1ccdc; + border-bottom: 1px solid #eee; /* width: calc(100% + 3em); */ width: -webkit-fill-available; width: -moz-available; @@ -1756,7 +1759,7 @@ div.title_line { height: 53px; box-sizing: border-box; background-color: #fff; - /* margin-left: -3em;*/ + /* margin-left: -3em; */ } /* Breadcrum */ @@ -1945,7 +1948,7 @@ div#agent_wizard_subtabs { #menu_tab_left li span { color: #161628; font-size: 15px; - font-family: Pandora-Bold; + /*font-family: 'Lato';*/ } /* New styles for data box */ @@ -1991,8 +1994,12 @@ table.databox { border: 2px solid #c0ccdc; padding: 20px; margin-bottom: 20px; + width: calc(100% - 40px); + width: -webkit-fill-available; + /* width: -webkit-fill-available; width: -moz-available; + */ } .databox > tbody > tr > td { @@ -2547,13 +2554,13 @@ div#pandora_logo_header { } .header_title { - font-size: 12px; - color: #161628; + font-size: 11pt; + color: #444; font-weight: 600; } .header_subtitle { - font-size: 15px; + font-size: 10pt; color: #8a96a6; font-weight: 300; } @@ -2745,7 +2752,8 @@ td.cellBig { .info_box .title * { font-size: 14pt; - font-family: "Pandora-Bold"; + /*font-family: "lato";*/ + font-weight: bold; } .info_box .icon { @@ -2906,7 +2914,7 @@ input#text-id_parent.ac_input { -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; - font-family: inherit; + /*font-family: inherit;*/ } /* plugins */ @@ -6483,7 +6491,7 @@ table.table_modal_alternate tr td:first-child { .bars-graph-rotate .flot-text .flot-x-axis div .break_word { word-break: break-word; - font-family: "lato" !important; + /*font-family: "lato" !important;*/ } .flot-text .flot-x-axis div { @@ -9896,7 +9904,7 @@ div#err_msg_centralised { .inputFile { background-color: #f6f7fb; height: 16px; - font-family: "Pandora-Regular"; + /*font-family: "lato";*/ font-size: 12px; padding: 5.5pt 20pt; cursor: pointer; @@ -9921,7 +9929,7 @@ select { border: 2px solid #c0ccdc; border-radius: 6px; height: 38px; - font-family: "Pandora-Regular"; + /*font-family: "lato";*/ font-size: 12px; color: #333333; padding-left: 12px; @@ -9975,7 +9983,7 @@ input[type="submit"] { box-shadow: 0px 3px 6px #c7c7c7; letter-spacing: 0px; color: #ffffff; - font-family: Pandora-Regular; + /*font-family: "lato";*/ font-size: 16px; margin-left: 1em; cursor: pointer; @@ -10025,7 +10033,7 @@ button.submitButton { min-width: 110px; height: 42px; font-size: 14px; - font-family: "Pandora-Regular"; + /*font-family: "lato";*/ align-items: center; line-height: 24px; box-shadow: 0px 3px 6px #c7c7c7; @@ -10604,7 +10612,7 @@ tr.bring_next_field { -moz-box-sizing: border-box !important; box-sizing: border-box !important; cursor: pointer; - font-family: "Pandora-Regular" !important; + /*font-family: "lato" !important;*/ font-size: 12px !important; } @@ -10762,7 +10770,8 @@ tr.bring_next_field { .floating_form td { font-size: 13px; min-height: 32px; - font-family: "Pandora-Bold"; + /*font-family: "lato";*/ + font-weight: bold; } .floating_form td.subinput { @@ -11067,7 +11076,7 @@ span.subsection_header_title { height: 18px; } .regular_font { - font-family: "Pandora-Regular" !important; + font-family: "lato" !important; } .width_available { @@ -11214,7 +11223,7 @@ form#satellite_conf_edit > fieldset.full-column { .input_sub_placeholder { font-size: 8pt; color: #8a96a6; - font-family: "Pandora-Regular"; + /*font-family: "lato";*/ } #principal_action_buttons input, diff --git a/pandora_console/include/styles/tables.css b/pandora_console/include/styles/tables.css index 4568627976..d774123f9d 100644 --- a/pandora_console/include/styles/tables.css +++ b/pandora_console/include/styles/tables.css @@ -93,11 +93,12 @@ background-color: #fff; border-spacing: 0; overflow: hidden; - border-radius: 6px; - border: 2px solid #c0ccdc; + border-radius: 5px; + border: 1px solid #c0ccdc; width: -webkit-fill-available; width: -moz-available; - margin-bottom: 50px !important; + margin-bottom: 50px; + margin: 15px; } .info_table > tbody > tr:nth-child(even) { @@ -158,7 +159,7 @@ .info_table > thead > tr * { font-size: 12px; - font-family: "Pandora-Bold"; + font-weight: bold; line-height: 23px; } @@ -483,7 +484,7 @@ a.pandora_pagination.current:hover { flex: 0 1 auto; font-size: 15px; color: #14524f; - font-family: "Pandora-Bold"; + font-weight: bold; margin: 4px 0 7px; } From 2a9494b48d15082942403030ec19e6938ff56ab8 Mon Sep 17 00:00:00 2001 From: "alejandro.campos@artica.es" Date: Wed, 22 Feb 2023 10:10:59 +0100 Subject: [PATCH 333/563] fix conflicts --- pandora_console/extras/mr/62.sql | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 pandora_console/extras/mr/62.sql diff --git a/pandora_console/extras/mr/62.sql b/pandora_console/extras/mr/62.sql new file mode 100644 index 0000000000..794d0a4c94 --- /dev/null +++ b/pandora_console/extras/mr/62.sql @@ -0,0 +1,18 @@ +START TRANSACTION; + +CREATE TABLE IF NOT EXISTS `tagent_filter` ( + `id_filter` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `id_name` VARCHAR(600) NOT NULL, + `id_group_filter` INT NOT NULL DEFAULT 0, + `group_id` INT NOT NULL DEFAULT 0, + `recursion` TEXT, + `status` INT NOT NULL DEFAULT -1, + `search` TEXT, + `id_os` INT NOT NULL DEFAULT 0, + `policies` TEXT, + `search_custom` TEXT, + `ag_custom_fields` TEXT, + PRIMARY KEY (`id_filter`) +) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; + +COMMIT; From 95fb797a7e0522d02dcf12d2e161da5352c4aba9 Mon Sep 17 00:00:00 2001 From: Pablo Aragon Date: Wed, 22 Feb 2023 10:33:45 +0100 Subject: [PATCH 334/563] 10488-Fix views reports --- .../reporting_builder.item_editor.php | 30 ++++++++++++------- .../reporting_builder.list_items.php | 6 ++-- .../reporting/reporting_builder.main.php | 29 +++++------------- pandora_console/include/functions_html.php | 8 ++--- pandora_console/include/functions_reports.php | 2 +- pandora_console/include/functions_ui.php | 9 ++++++ pandora_console/include/javascript/pandora.js | 8 ++--- .../include/styles/js/jquery-ui_custom.css | 18 +++++++++++ pandora_console/include/styles/pandora.css | 10 +++++++ 9 files changed, 76 insertions(+), 44 deletions(-) diff --git a/pandora_console/godmode/reporting/reporting_builder.item_editor.php b/pandora_console/godmode/reporting/reporting_builder.item_editor.php index 80e72e65cf..d48a4735a0 100755 --- a/pandora_console/godmode/reporting/reporting_builder.item_editor.php +++ b/pandora_console/godmode/reporting/reporting_builder.item_editor.php @@ -1100,7 +1100,7 @@ $class = 'databox filters'; false, false, '', - 'fullwidth' + '' ); } else { html_print_input_text( @@ -1113,7 +1113,7 @@ $class = 'databox filters'; false, false, '', - 'fullwidth' + '' ); } ?> @@ -1160,7 +1160,7 @@ $class = 'databox filters'; @@ -1276,13 +1276,13 @@ $class = 'databox filters'; 'label', $label, '', - 50, + 80, 255, true, false, false, '', - 'fullwidth' + '' ); ?> @@ -3920,21 +3920,25 @@ print_SLA_list('100%', $action, $idItem); print_General_list('100%', $action, $idItem, $type); echo '
        '; if ($action == 'new') { - html_print_submit_button( + $actionButtons = html_print_submit_button( __('Create item'), 'create_item', false, - 'class="sub wand"' + ['icon' => 'next'], + true ); } else { - html_print_submit_button( + $actionButtons = html_print_submit_button( __('Update item'), 'edit_item', false, - 'class="sub upd"' + ['icon' => 'next'], + true ); } +html_print_action_buttons($actionButtons, ['type' => 'form_action']); + echo '
        '; echo ''; @@ -3980,7 +3984,7 @@ function print_SLA_list($width, $action, $idItem=null) $idItem ); ?> - +
        - diff --git a/pandora_console/include/ajax/module.php b/pandora_console/include/ajax/module.php index 086741d052..052f105eda 100755 --- a/pandora_console/include/ajax/module.php +++ b/pandora_console/include/ajax/module.php @@ -1283,7 +1283,7 @@ if (check_login()) { $linkCaption, 'additional_action_for_'.$idAgenteModulo, false, - 'window.location.assign(\'index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente='.$id_agente.'&id_agente_modulo='.$module['id_agente_modulo'].'&refr=60'.$addedLinkParams.'\')', + 'window.location.assign("index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente='.$id_agente.'&id_agente_modulo='.$module['id_agente_modulo'].'&refr=60'.$addedLinkParams.'")', [ 'mode' => 'link', 'style' => 'justify-content: flex-end;', @@ -1300,7 +1300,7 @@ if (check_login()) { __('Edit'), 'edit_module_'.$idAgenteModulo, false, - 'window.location.assign(\'index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&id_agente='.$id_agente.'&tab=module&id_agent_module='.$module['id_agente_modulo'].'&edit_module='.$module['id_modulo'].'\')', + 'window.location.assign("index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&id_agente='.$id_agente.'&tab=module&id_agent_module='.$module['id_agente_modulo'].'&edit_module='.$module['id_modulo'].'")', [ 'mode' => 'link', 'style' => 'justify-content: flex-end;', diff --git a/pandora_console/include/class/CredentialStore.class.php b/pandora_console/include/class/CredentialStore.class.php index 8bdc200299..befc213a8c 100644 --- a/pandora_console/include/class/CredentialStore.class.php +++ b/pandora_console/include/class/CredentialStore.class.php @@ -103,42 +103,16 @@ class CredentialStore extends Wizard */ private function ajaxMsg($type, $msg, $delete=false) { - $msg_err = 'Failed while saving: %s'; - $msg_ok = 'Successfully saved into keystore '; - - if ($delete) { - $msg_err = 'Failed while removing: %s'; - $msg_ok = 'Successfully deleted '; - } - - if ($type == 'error') { - echo json_encode( - [ - $type => ui_print_error_message( - __( - $msg_err, - $msg - ), - '', - true - ), - ] - ); + if ($type === 'error') { + $msg_title = ($delete === true) ? 'Failed while removing' : 'Failed while saving'; } else { - echo json_encode( - [ - $type => ui_print_success_message( - __( - $msg_ok, - $msg - ), - '', - true - ), - ] - ); + $msg_title = ($delete === true) ? 'Successfully deleted' : 'Successfully saved into keystore'; } + echo json_encode( + [ $type => __($msg_title).':
        '.$msg ] + ); + exit; } diff --git a/pandora_console/include/class/ModuleTemplates.class.php b/pandora_console/include/class/ModuleTemplates.class.php index fb1a496246..2e777bdf4c 100644 --- a/pandora_console/include/class/ModuleTemplates.class.php +++ b/pandora_console/include/class/ModuleTemplates.class.php @@ -14,7 +14,7 @@ * |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______| * * ============================================================================ - * Copyright (c) 2005-2021 Artica Soluciones Tecnologicas + * Copyright (c) 2005-2023 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 @@ -264,27 +264,11 @@ class ModuleTemplates extends HTML */ private function ajaxMsg($type, $msg) { - if ($type == 'error') { - echo json_encode( - [ - $type => ui_print_error_message( - __($msg), - '', - true - ), - ] - ); - } else { - echo json_encode( - [ - $type => ui_print_success_message( - __($msg), - '', - true - ), - ] - ); - } + echo json_encode( + [ + $type => __($msg), + ] + ); exit; } @@ -708,7 +692,7 @@ class ModuleTemplates extends HTML 'action' => $this->baseUrl, 'id' => 'add_module_form', 'method' => 'POST', - 'class' => 'modal', + 'class' => 'modal filter-list-adv', 'extra' => '', ]; @@ -846,10 +830,10 @@ class ModuleTemplates extends HTML false ); // Create the table with Module Block list. - $table = new StdClasS(); + $table = new stdClass(); $table->class = 'databox data '; $table->width = '75%'; - $table->styleTable = 'margin: 2em auto 0;border: 1px solid #ddd;'; + $table->styleTable = 'border: 1px solid #ddd;'; $table->rowid = []; $table->data = []; @@ -893,7 +877,7 @@ class ModuleTemplates extends HTML ); $data[3] .= html_print_input_image( 'export_profile', - 'images/csv.png', + 'images/file-csv.svg', $row['id_np'], '', true, @@ -914,7 +898,7 @@ class ModuleTemplates extends HTML $data[3] .= ''; $data[3] .= ''; $data[3] .= html_print_image( - 'images/csv.png', + 'images/file-csv.svg', true, [ 'title' => __('Export to CSV'), @@ -1165,7 +1149,7 @@ class ModuleTemplates extends HTML $blockComponentList = chop($blockComponentList, ','); // Title of Block. - $blockTitle = '
        '; + $blockTitle = '
        '; $blockTitle .= $blockTable['name']; $blockTitle .= '
        '; $blockTitle .= html_print_input_image( @@ -1186,7 +1170,7 @@ class ModuleTemplates extends HTML $table = new StdClasS(); $table->class = 'databox data border_bt'; $table->width = '75%'; - $table->styleTable = 'margin: 2em auto 0;border: 1px solid #ddd;'; + $table->styleTable = 'margin: 0; border: 1px solid #ddd;'; $table->rowid = []; $table->data = []; @@ -1220,7 +1204,7 @@ class ModuleTemplates extends HTML switch ($module['id_format']) { case MODULE_NETWORK: $formatInfo = html_print_image( - 'images/network.png', + 'images/network-server@os.svg', true, [ 'title' => __('Network module'), @@ -1231,7 +1215,7 @@ class ModuleTemplates extends HTML case MODULE_WMI: $formatInfo = html_print_image( - 'images/wmi.png', + 'images/WMI@svg.svg', true, [ 'title' => __('WMI module'), @@ -1242,7 +1226,7 @@ class ModuleTemplates extends HTML case MODULE_PLUGIN: $formatInfo = html_print_image( - 'images/plugin.png', + 'images/plugins@svg.svg', true, [ 'title' => __('Plug-in module'), diff --git a/pandora_console/include/class/NetworkMap.class.php b/pandora_console/include/class/NetworkMap.class.php index b1c5e84763..701eb4ecfb 100644 --- a/pandora_console/include/class/NetworkMap.class.php +++ b/pandora_console/include/class/NetworkMap.class.php @@ -3601,7 +3601,7 @@ class NetworkMap url_background_grid: url_background_grid, refresh_time: '.$this->mapOptions['refresh_time'].', font_size: '.$this->mapOptions['font_size'].', - method: '.$this->map['generation_method'].', + method: '.($this->map['generation_method'] ?? 3).', base_url_homedir: "'.ui_get_full_url(false).'" }); init_drag_and_drop(); diff --git a/pandora_console/include/class/SatelliteAgent.class.php b/pandora_console/include/class/SatelliteAgent.class.php index 0d9111a24b..aa86f25e81 100644 --- a/pandora_console/include/class/SatelliteAgent.class.php +++ b/pandora_console/include/class/SatelliteAgent.class.php @@ -959,41 +959,28 @@ class SatelliteAgent extends HTML */ private function ajaxMsg($type, $msg, $delete=false, $disable=false) { - $msg_err = 'Failed while saving: %s'; - $msg_ok = 'Successfully saved agent '; - - if ($delete === true) { - $msg_err = 'Failed while removing: %s'; - $msg_ok = 'Successfully deleted '; - } - - if ($disable === true) { - $msg_err = 'Failed while disabling: %s'; - $msg_ok = 'Successfully disabled'; - } - - if ($type == 'error') { - echo json_encode( - [ - $type => ui_print_error_message( - __($msg), - '', - true - ), - ] - ); + if ($type === 'error') { + if ($delete === true) { + $msg_title = 'Failed while removing'; + } else if ($disable === true) { + $msg_title = 'Failed while disabling'; + } else { + $msg_title = 'Failed while saving'; + } } else { - echo json_encode( - [ - $type => ui_print_success_message( - __($msg), - '', - true - ), - ] - ); + if ($delete === true) { + $msg_title = 'Successfully deleted'; + } else if ($disable === true) { + $msg_title = 'Successfully disabled'; + } else { + $msg_title = 'Successfully saved agent'; + } } + echo json_encode( + [ $type => __($msg_title).':
        '.$msg ] + ); + exit; } diff --git a/pandora_console/include/class/SatelliteCollection.class.php b/pandora_console/include/class/SatelliteCollection.class.php index aae0cb6780..6ef72c40c4 100644 --- a/pandora_console/include/class/SatelliteCollection.class.php +++ b/pandora_console/include/class/SatelliteCollection.class.php @@ -475,27 +475,11 @@ class SatelliteCollection extends HTML */ private function ajaxMsg(string $type, string $msg) { - if ($type === 'error') { - echo json_encode( - [ - $type => ui_print_error_message( - __($msg), - '', - true - ), - ] - ); - } else { - echo json_encode( - [ - $type => ui_print_success_message( - __($msg), - '', - true - ), - ] - ); - } + echo json_encode( + [ + $type => __($msg), + ] + ); exit; } diff --git a/pandora_console/include/functions_container.php b/pandora_console/include/functions_container.php index 502db2b4ad..e9d034f431 100644 --- a/pandora_console/include/functions_container.php +++ b/pandora_console/include/functions_container.php @@ -316,13 +316,13 @@ function ui_toggle_container($code, $name, $title='', $hidden_default=true, $ret $data[0] = '
        '.html_print_image($original, true, ['title' => $title, 'id' => 'image_'.$uniqid, 'class' => 'invert_filter']).'  '.$name.''; $data[1] = ui_print_group_icon($group, true); if ($report_r && $report_w) { - $data[2] = ''.html_print_image('images/config.png', true, ['class' => 'invert_filter']).''; + $data[2] = ''.html_print_image('images/edit.svg', true, ['class' => 'invert_filter main_menu_icon']).''; } if ($report_r && $report_w && $report_m) { if ($id_container !== '1') { $data[2] .= '    '.''.html_print_image('images/cross.png', true, ['alt' => __('Delete'), 'title' => __('Delete'), 'class' => 'invert_filter']).''; + return false;">'.html_print_image('images/delete.svg', true, ['alt' => __('Delete'), 'title' => __('Delete'), 'class' => 'invert_filter main_menu_icon']).''; } } diff --git a/pandora_console/include/functions_graph.php b/pandora_console/include/functions_graph.php index 0f6d03fee7..977076824b 100644 --- a/pandora_console/include/functions_graph.php +++ b/pandora_console/include/functions_graph.php @@ -5339,3 +5339,199 @@ function get_baseline_data( $result['agent_alias'] = $array_data[0]['sum0']['agent_alias']; return ['sum0' => $result]; } + + +/** + * Draw graph SO agents by group. + * + * @param [type] $id_group + * @param integer $width + * @param integer $height + * @param boolean $recursive + * @param boolean $noWaterMark + * @return string Graph + */ +function graph_so_by_group($id_group, $width=300, $height=200, $recursive=true, $noWaterMark=true) +{ + global $config; + + $id_groups = [$id_group]; + + if ($recursive == true) { + $groups = groups_get_children($id_group); + if (count($groups) > 0) { + $id_groups = []; + foreach ($groups as $key => $value) { + $id_groups[] = $value['id_grupo']; + } + } + } + + $sql = sprintf( + 'SELECT COUNT(id_agente) AS count, + os.name + FROM tagente a + LEFT JOIN tconfig_os os ON a.id_os = os.id_os + WHERE a.id_grupo IN (%s) + GROUP BY os.id_os', + implode(',', $id_groups) + ); + + $result = db_get_all_rows_sql($sql, false, false); + if ($result === false) { + $result = []; + } + + $labels = []; + $data = []; + foreach ($result as $key => $row) { + $labels[] = $row['name']; + $data[] = $row['count']; + } + + if ($noWaterMark === true) { + $water_mark = [ + 'file' => $config['homedir'].'/images/logo_vertical_water.png', + 'url' => ui_get_full_url('images/logo_vertical_water.png', false, false, false), + ]; + } else { + $water_mark = []; + } + + $options = [ + 'width' => $width, + 'height' => $height, + 'waterMark' => $water_mark, + 'legend' => [ + 'display' => true, + 'position' => 'right', + 'align' => 'center', + ], + 'labels' => $labels, + ]; + + return pie_graph( + $data, + $options + ); + +} + + +/** + * Draw graph events by group + * + * @param [type] $id_group + * @param integer $width + * @param integer $height + * @param boolean $noWaterMark + * @param boolean $time_limit + * @param boolean $recursive + * @return string Graph + */ +function graph_events_agent_by_group($id_group, $width=300, $height=200, $noWaterMark=true, $time_limit=false, $recursive=true) +{ + global $config; + + $data = []; + $labels = []; + $loop = 0; + define('NUM_PIECES_PIE_2', 6); + + // Add tags condition to filter. + $tags_condition = ''; + if ($time_limit && $config['event_view_hr']) { + $tags_condition .= ' AND utimestamp > (UNIX_TIMESTAMP(NOW()) - '.($config['event_view_hr'] * SECONDS_1HOUR).')'; + } + + $id_groups = [$id_group]; + if ($recursive === true) { + $groups = groups_get_children($id_group); + if (count($groups) > 0) { + $id_groups = []; + foreach ($groups as $key => $value) { + $id_groups[] = $value['id_grupo']; + } + } + } + + $filter_groups = ' AND te.id_grupo IN ('.implode(',', $id_groups).') '; + + // This will give the distinct id_agente, give the id_grupo that goes + // with it and then the number of times it occured. GROUP BY statement + // is required if both DISTINCT() and COUNT() are in the statement. + $sql = sprintf( + 'SELECT DISTINCT(id_agente) AS id_agente, + COUNT(id_agente) AS count + FROM tevento te + WHERE 1=1 AND estado = 0 + %s %s + GROUP BY id_agente + ORDER BY count DESC LIMIT 8', + $tags_condition, + $filter_groups + ); + $result = db_get_all_rows_sql($sql, false, false); + if ($result === false) { + $result = []; + } + + $system_events = 0; + $other_events = 0; + + foreach ($result as $row) { + $row['id_grupo'] = agents_get_agent_group($row['id_agente']); + if (!check_acl($config['id_user'], $row['id_grupo'], 'ER') == 1) { + continue; + } + + if ($loop >= NUM_PIECES_PIE_2) { + $other_events += $row['count']; + } else { + if ($row['id_agente'] == 0) { + $system_events += $row['count']; + } else { + $alias = agents_get_alias($row['id_agente']); + $name = mb_substr($alias, 0, 25).' #'.$row['id_agente'].' ('.$row['count'].')'; + $labels[] = io_safe_output($name); + $data[] = $row['count']; + } + } + + $loop++; + } + + if ($system_events > 0) { + $name = __('SYSTEM').' ('.$system_events.')'; + $labels[] = io_safe_output($name); + $data[] = $system_events; + } + + // Sort the data. + arsort($data); + if ($noWaterMark === true) { + $water_mark = [ + 'file' => $config['homedir'].'/images/logo_vertical_water.png', + 'url' => ui_get_full_url('images/logo_vertical_water.png', false, false, false), + ]; + } else { + $water_mark = []; + } + + $options = [ + 'width' => $width, + 'height' => $height, + 'waterMark' => $water_mark, + 'legend' => [ + 'display' => true, + 'position' => 'right', + 'align' => 'center', + ], + 'labels' => $labels, + ]; + + return pie_graph( + $data, + $options + ); +} diff --git a/pandora_console/include/functions_groups.php b/pandora_console/include/functions_groups.php index 6eb91b7afd..02d0f434bb 100644 --- a/pandora_console/include/functions_groups.php +++ b/pandora_console/include/functions_groups.php @@ -1276,7 +1276,7 @@ function groups_get_not_init_agents($group, $agent_filter=[], $module_filter=[], * * @return integer Number of monitors. */ -function groups_get_monitors_counter($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false) +function groups_get_monitors_counter($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false, $secondary_group=true) { if (empty($group)) { return 0; @@ -1291,7 +1291,11 @@ function groups_get_monitors_counter($group, $agent_filter=[], $module_filter=[] } $group_str = implode(',', $groups); - $groups_clause = "AND (ta.id_grupo IN ($group_str) OR tasg.id_group IN ($group_str))"; + if ($secondary_group === true) { + $groups_clause = "AND (ta.id_grupo IN ($group_str) OR tasg.id_group IN ($group_str))"; + } else { + $groups_clause = "AND (ta.id_grupo IN ($group_str))"; + } $tags_clause = ''; @@ -1401,10 +1405,12 @@ function groups_get_monitors_counter($group, $agent_filter=[], $module_filter=[] ON tam.id_agente_modulo = tae.id_agente_modulo $modules_clause INNER JOIN tagente ta - ON tam.id_agente = ta.id_agente - LEFT JOIN tagent_secondary_group tasg - ON ta.id_agente = tasg.id_agent - AND ta.disabled = 0 + ON tam.id_agente = ta.id_agente"; + if ($secondary_group === true) { + $sql .= ' LEFT JOIN tagent_secondary_group tasg ON ta.id_agente = tasg.id_agent'; + } + + $sql .= "AND ta.disabled = 0 $agent_name_filter $agents_clause WHERE tam.disabled = 0 @@ -1450,8 +1456,9 @@ function groups_get_monitors_counter($group, $agent_filter=[], $module_filter=[] } $status_columns_str = implode(',', $status_columns_array); + $status_columns_str_sum = implode('+', $status_columns_array); - $sql = "SELECT SUM($status_columns_str) FROM + $sql = "SELECT SUM($status_columns_str_sum) FROM (SELECT DISTINCT(ta.id_agente), $status_columns_str FROM tagente ta LEFT JOIN tagent_secondary_group tasg ON ta.id_agente = tasg.id_agent @@ -1486,11 +1493,11 @@ function groups_get_monitors_counter($group, $agent_filter=[], $module_filter=[] * * @return integer Number of monitors. */ -function groups_get_total_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false) +function groups_get_total_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false, $secondary_group=true) { // Always modify the module status filter $module_filter['status'] = AGENT_MODULE_STATUS_ALL; - return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime); + return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime, $secondary_group); } @@ -1511,11 +1518,11 @@ function groups_get_total_monitors($group, $agent_filter=[], $module_filter=[], * * @return integer Number of monitors. */ -function groups_get_normal_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false) +function groups_get_normal_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false, $secondary_group=true) { // Always modify the module status filter $module_filter['status'] = AGENT_MODULE_STATUS_NORMAL; - return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime); + return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime, $secondary_group); } @@ -1536,11 +1543,11 @@ function groups_get_normal_monitors($group, $agent_filter=[], $module_filter=[], * * @return integer Number of monitors. */ -function groups_get_critical_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false) +function groups_get_critical_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false, $secondary_group=true) { // Always modify the module status filter $module_filter['status'] = AGENT_MODULE_STATUS_CRITICAL_BAD; - return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime); + return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime, $secondary_group); } @@ -1561,11 +1568,11 @@ function groups_get_critical_monitors($group, $agent_filter=[], $module_filter=[ * * @return integer Number of monitors. */ -function groups_get_warning_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false) +function groups_get_warning_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false, $secondary_group=true) { // Always modify the module status filter $module_filter['status'] = AGENT_MODULE_STATUS_WARNING; - return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime); + return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime, $secondary_group); } @@ -1586,11 +1593,11 @@ function groups_get_warning_monitors($group, $agent_filter=[], $module_filter=[] * * @return integer Number of monitors. */ -function groups_get_unknown_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false) +function groups_get_unknown_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false, $secondary_group=true) { // Always modify the module status filter $module_filter['status'] = AGENT_MODULE_STATUS_UNKNOWN; - return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime); + return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime, $secondary_group); } @@ -1611,11 +1618,11 @@ function groups_get_unknown_monitors($group, $agent_filter=[], $module_filter=[] * * @return integer Number of monitors. */ -function groups_get_not_init_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false) +function groups_get_not_init_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false, $secondary_group=true) { // Always modify the module status filter $module_filter['status'] = AGENT_MODULE_STATUS_NOT_INIT; - return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime); + return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime, $secondary_group); } @@ -1635,7 +1642,7 @@ function groups_monitor_fired_alerts($group_array) } -function groups_monitor_alerts_total_counters($group_array) +function groups_monitor_alerts_total_counters($group_array, $secondary_group=true) { // If there are not groups to query, we jump to nextone $default_total = [ @@ -1649,26 +1656,32 @@ function groups_monitor_alerts_total_counters($group_array) } $group_clause = implode(',', $group_array); - $group_clause = "(tasg.id_group IN ($group_clause) OR ta.id_grupo IN ($group_clause))"; + if ($secondary_group === true) { + $group_clause = "(tasg.id_group IN ($group_clause) OR ta.id_grupo IN ($group_clause))"; + } else { + $group_clause = "(ta.id_grupo IN ($group_clause))"; + } - $alerts = db_get_row_sql( - "SELECT - COUNT(tatm.id) AS total, - SUM(IF(tatm.times_fired > 0, 1, 0)) AS fired - FROM talert_template_modules tatm - INNER JOIN tagente_modulo tam - ON tatm.id_agent_module = tam.id_agente_modulo - INNER JOIN tagente ta - ON ta.id_agente = tam.id_agente - WHERE ta.id_agente IN ( - SELECT ta.id_agente - FROM tagente ta - LEFT JOIN tagent_secondary_group tasg - ON ta.id_agente = tasg.id_agent - WHERE ta.disabled = 0 - AND $group_clause - ) AND tam.disabled = 0" - ); + $sql = 'SELECT + COUNT(tatm.id) AS total, + SUM(IF(tatm.times_fired > 0, 1, 0)) AS fired + FROM talert_template_modules tatm + INNER JOIN tagente_modulo tam + ON tatm.id_agent_module = tam.id_agente_modulo + INNER JOIN tagente ta + ON ta.id_agente = tam.id_agente + WHERE ta.id_agente IN ( + SELECT ta.id_agente + FROM tagente ta'; + if ($secondary_group === true) { + $sql .= ' LEFT JOIN tagent_secondary_group tasg ON ta.id_agente = tasg.id_agent'; + } + + $sql .= " WHERE ta.disabled = 0 + AND $group_clause + ) AND tam.disabled = 0"; + + $alerts = db_get_row_sql($sql); return ($alerts === false) ? $default_total : $alerts; } @@ -1746,7 +1759,7 @@ function groups_monitor_total_counters($group_array, $search_in_testado=false) } -function groups_agents_total_counters($group_array) +function groups_agents_total_counters($group_array, $secondary_groups=true) { $default_total = [ 'ok' => 0, @@ -1763,30 +1776,36 @@ function groups_agents_total_counters($group_array) } $group_clause = implode(',', $group_array); - $group_clause = "(tasg.id_group IN ($group_clause) OR ta.id_grupo IN ($group_clause))"; + if ($secondary_groups === true) { + $group_clause = "(tasg.id_group IN ($group_clause) OR ta.id_grupo IN ($group_clause))"; + } else { + $group_clause = "(ta.id_grupo IN ($group_clause))"; + } $condition_critical = agents_get_status_clause(AGENT_STATUS_CRITICAL); $condition_warning = agents_get_status_clause(AGENT_STATUS_WARNING); $condition_unknown = agents_get_status_clause(AGENT_STATUS_UNKNOWN); $condition_not_init = agents_get_status_clause(AGENT_STATUS_NOT_INIT); $condition_normal = agents_get_status_clause(AGENT_STATUS_NORMAL); + $sql = "SELECT SUM(IF($condition_normal, 1, 0)) AS ok, SUM(IF($condition_critical, 1, 0)) AS critical, SUM(IF($condition_warning, 1, 0)) AS warning, SUM(IF($condition_unknown, 1, 0)) AS unknown, SUM(IF($condition_not_init, 1, 0)) AS not_init, COUNT(ta.id_agente) AS total - FROM tagente ta - WHERE ta.disabled = 0 + FROM tagente ta + WHERE ta.disabled = 0 AND ta.id_agente IN ( - SELECT ta.id_agente FROM tagente ta - LEFT JOIN tagent_secondary_group tasg - ON ta.id_agente = tasg.id_agent - WHERE ta.disabled = 0 - AND $group_clause - GROUP BY ta.id_agente - ) - "; + SELECT ta.id_agente FROM tagente ta"; + if ($secondary_groups === true) { + $sql .= ' LEFT JOIN tagent_secondary_group tasg ON ta.id_agente = tasg.id_agent'; + } + + $sql .= " WHERE ta.disabled = 0 + AND $group_clause + GROUP BY ta.id_agente + )"; $agents = db_get_row_sql($sql); @@ -2438,3 +2457,390 @@ function groups_get_group_deep($id_group) return $deep; } + + +/** + * Heat map from agents by group + * + * @param array $id_group + * @param integer $width + * @param integer $height + * + * @return string Html Graph. + */ +function groups_get_heat_map_agents(array $id_group, float $width=0, float $height=0) +{ + ui_require_css_file('heatmap'); + + if (is_array($id_group) === false) { + $id_group = [$id_group]; + } + + $sql = 'SELECT * FROM tagente WHERE id_grupo IN('.implode(',', $id_group).')'; + + $all_agents = db_get_all_rows_sql($sql); + if (empty($all_agents)) { + return null; + } + + $total_agents = count($all_agents); + + // Best square. + $high = (float) max($width, $height); + $low = 0.0; + + while (abs($high - $low) > 0.000001) { + $mid = (($high + $low) / 2.0); + $midval = (floor($width / $mid) * floor($height / $mid)); + if ($midval >= $total_agents) { + $low = $mid; + } else { + $high = $mid; + } + } + + $square_length = min(($width / floor($width / $low)), ($height / floor($height / $low))); + + // Print starmap. + $html = sprintf( + '', + $id_group, + $width, + $height + ); + + $html .= ''; + $row = 0; + $column = 0; + $x = 0; + $y = 0; + $cont = 1; + + foreach ($all_agents as $key => $value) { + // Colour by status. + $status = agents_get_status_from_counts($value); + + switch ($status) { + case 5: + // Not init status. + $status = 'notinit'; + break; + + case 1: + // Critical status. + $status = 'critical'; + break; + + case 2: + // Warning status. + $status = 'warning'; + break; + + case 0: + // Normal status. + $status = 'normal'; + break; + + case 3: + case -1: + default: + // Unknown status. + $status = 'unknown'; + break; + } + + $html .= sprintf( + '', + 'rect_'.$cont, + $x, + $y, + $row, + $column, + $square_length, + $square_length, + $status, + random_int(1, 10) + ); + + $y += $square_length; + $row++; + if ((int) ($y + $square_length) > (int) $height) { + $y = 0; + $x += $square_length; + $row = 0; + $column++; + } + + if ((int) ($x + $square_length) > (int) $width) { + $x = 0; + $y += $square_length; + $column = 0; + $row++; + } + + $cont++; + } + ?> + + '; + $html .= ''; + + return $html; +} + + +/** + * Return html count from agents and monitoring by group. + * + * @param [type] $id_groups + * + * @return string Html + */ +function tactical_groups_get_agents_and_monitoring($id_groups) +{ + global $config; + + $data = [ + 'total_agents' => groups_agents_total_counters($id_groups, false)['total'], + 'monitor_total' => groups_get_total_monitors($id_groups, [], [], false, false, false, false), + ]; + + // Link URLS + $urls = []; + $urls['total_agents'] = $config['homeurl'].'index.php?sec=estado&sec2=operation/agentes/estado_agente&refr=60&group_id='.$id_groups[0].'&recursion=1'; + $urls['monitor_total'] = $config['homeurl'].'index.php?sec=view&sec2=operation/agentes/status_monitor&refr=60&status=-1&ag_group='.$id_groups[0].'&recursion=1'; + + $table_am = html_get_predefined_table(); + $tdata = []; + $tdata[0] = html_print_image('images/agent.png', true, ['title' => __('Total agents'), 'class' => 'invert_filter'], false, false, false, true); + $tdata[1] = $data['total_agents'] <= 0 ? '-' : $data['total_agents']; + $tdata[1] = ''.$tdata[1].''; + + if ($data['total_agents'] > 500 && !enterprise_installed()) { + $tdata[2] = "
        "; + } + + $tdata[3] = html_print_image('images/module.png', true, ['title' => __('Monitor checks'), 'class' => 'invert_filter'], false, false, false, true); + $tdata[4] = $data['monitor_total'] <= 0 ? '-' : $data['monitor_total']; + $tdata[4] = ''.$tdata[4].''; + + /* + Hello there! :) + We added some of what seems to be "buggy" messages to the openSource version recently. This is not to force open-source users to move to the enterprise version, this is just to inform people using Pandora FMS open source that it requires skilled people to maintain and keep it running smoothly without professional support. This does not imply open-source version is limited in any way. If you check the recently added code, it contains only warnings and messages, no limitations except one: we removed the option to add custom logo in header. In the Update Manager section, it warns about the 'danger’ of applying automated updates without a proper backup, remembering in the process that the Enterprise version comes with a human-tested package. Maintaining an OpenSource version with more than 500 agents is not so easy, that's why someone using a Pandora with 8000 agents should consider asking for support. It's not a joke, we know of many setups with a huge number of agents, and we hate to hear that “its becoming unstable and slow” :( + You can of course remove the warnings, that's why we include the source and do not use any kind of trick. And that's why we added here this comment, to let you know this does not reflect any change in our opensource mentality of does the last 14 years. + */ + if ($data['total_agents']) { + if (($data['monitor_total'] / $data['total_agents'] > 100) && !enterprise_installed()) { + $tdata[5] = "
        "; + } + } + + $table_am->rowclass[] = ''; + $table_am->data[] = $tdata; + + $output = '
        + '.__('Total agents and monitors').''.html_print_table($table_am, true).'
        '; + + return $output; +} + + +/** + * Return html count from stats alerts by group. + * + * @param [type] $id_groups + * @return string Html. + */ +function tactical_groups_get_stats_alerts($id_groups) +{ + global $config; + + $alerts = groups_monitor_alerts_total_counters($id_groups, false); + $data = [ + 'monitor_alerts' => $alerts['total'], + 'monitor_alerts_fired' => $alerts['fired'], + + ]; + + $urls = []; + $urls['monitor_alerts'] = $config['homeurl'].'index.php?sec=estado&sec2=operation/agentes/alerts_status&refr=60&ag_group='.$id_groups[0]; + $urls['monitor_alerts_fired'] = $config['homeurl'].'index.php?sec=estado&sec2=operation/agentes/alerts_status&refr=60&disabled=fired&ag_group='.$id_groups[0]; + + // Alerts table. + $table_al = html_get_predefined_table(); + + $tdata = []; + $tdata[0] = html_print_image('images/bell.png', true, ['title' => __('Defined alerts'), 'class' => 'invert_filter'], false, false, false, true); + $tdata[1] = $data['monitor_alerts'] <= 0 ? '-' : $data['monitor_alerts']; + $tdata[1] = ''.$tdata[1].''; + + /* + Hello there! :) + We added some of what seems to be "buggy" messages to the openSource version recently. This is not to force open-source users to move to the enterprise version, this is just to inform people using Pandora FMS open source that it requires skilled people to maintain and keep it running smoothly without professional support. This does not imply open-source version is limited in any way. If you check the recently added code, it contains only warnings and messages, no limitations except one: we removed the option to add custom logo in header. In the Update Manager section, it warns about the 'danger’ of applying automated updates without a proper backup, remembering in the process that the Enterprise version comes with a human-tested package. Maintaining an OpenSource version with more than 500 agents is not so easy, that's why someone using a Pandora with 8000 agents should consider asking for support. It's not a joke, we know of many setups with a huge number of agents, and we hate to hear that “its becoming unstable and slow” :( + You can of course remove the warnings, that's why we include the source and do not use any kind of trick. And that's why we added here this comment, to let you know this does not reflect any change in our opensource mentality of does the last 14 years. + */ + + if ($data['monitor_alerts'] > $data['total_agents'] && !enterprise_installed()) { + $tdata[2] = "
        "; + } + + $tdata[3] = html_print_image( + 'images/bell_error.png', + true, + [ + 'title' => __('Fired alerts'), + 'class' => 'invert_filter', + ], + false, + false, + false, + true + ); + $tdata[4] = $data['monitor_alerts_fired'] <= 0 ? '-' : $data['monitor_alerts_fired']; + $tdata[4] = ''.$tdata[4].''; + $table_al->rowclass[] = ''; + $table_al->data[] = $tdata; + + if (!is_metaconsole()) { + $output = '
        + '.__('Defined and fired alerts').''.html_print_table($table_al, true).'
        '; + } else { + // Remove the defined alerts cause with the new cache table is difficult to retrieve them. + unset($table_al->data[0][0], $table_al->data[0][1]); + + $table_al->class = 'tactical_view'; + $table_al->style = []; + $output = '
        + '.__('Fired alerts').''.html_print_table($table_al, true).'
        '; + } + + return $output; +} + + +/** + * Return html count from stats modules by group. + * + * @param [type] $id_groups + * @param integer $graph_width + * @param integer $graph_height + * @param boolean $links + * @param boolean $data_agents + * @return void + */ +function groups_get_stats_modules_status($id_groups, $graph_width=250, $graph_height=150, $links=false, $data_agents=false) +{ + global $config; + + $data = [ + 'monitor_critical' => groups_get_critical_monitors($id_groups, [], [], false, false, false, false), + 'monitor_warning' => groups_get_warning_monitors($id_groups, [], [], false, false, false, false), + 'monitor_ok' => groups_get_normal_monitors($id_groups, [], [], false, false, false, false), + 'monitor_unknown' => groups_get_unknown_monitors($id_groups, [], [], false, false, false, false), + 'monitor_not_init' => groups_get_not_init_monitors($id_groups, [], [], false, false, false, false), + ]; + + // Link URLS. + if ($links === false) { + $urls = []; + $urls['monitor_critical'] = $config['homeurl'].'index.php?'.'sec=view&sec2=operation/agentes/status_monitor&'.'refr=60&status='.AGENT_MODULE_STATUS_CRITICAL_BAD.'&pure='.$config['pure'].'&recursion=1&ag_group='.$id_groups[0]; + $urls['monitor_warning'] = $config['homeurl'].'index.php?'.'sec=view&sec2=operation/agentes/status_monitor&'.'refr=60&status='.AGENT_MODULE_STATUS_WARNING.'&pure='.$config['pure'].'&recursion=1&ag_group='.$id_groups[0]; + $urls['monitor_ok'] = $config['homeurl'].'index.php?'.'sec=view&sec2=operation/agentes/status_monitor&'.'refr=60&status='.AGENT_MODULE_STATUS_NORMAL.'&pure='.$config['pure'].'&recursion=1&ag_group='.$id_groups[0]; + $urls['monitor_unknown'] = $config['homeurl'].'index.php?'.'sec=view&sec2=operation/agentes/status_monitor&'.'refr=60&status='.AGENT_MODULE_STATUS_UNKNOWN.'&pure='.$config['pure'].'&recursion=1&ag_group='.$id_groups[0]; + $urls['monitor_not_init'] = $config['homeurl'].'index.php?'.'sec=view&sec2=operation/agentes/status_monitor&'.'refr=60&status='.AGENT_MODULE_STATUS_NOT_INIT.'&pure='.$config['pure'].'&recursion=1&ag_group='.$id_groups[0]; + } else { + $urls = []; + $urls['monitor_critical'] = $links['monitor_critical']; + $urls['monitor_warning'] = $links['monitor_warning']; + $urls['monitor_ok'] = $links['monitor_ok']; + $urls['monitor_unknown'] = $links['monitor_unknown']; + $urls['monitor_not_init'] = $links['monitor_not_init']; + } + + // Fixed width non interactive charts + $status_chart_width = $graph_width; + + // Modules by status table + $table_mbs = html_get_predefined_table(); + + $tdata = []; + $tdata[0] = html_print_image('images/module_critical.png', true, ['title' => __('Monitor critical')], false, false, false, true); + $tdata[1] = $data['monitor_critical'] <= 0 ? '-' : $data['monitor_critical']; + $tdata[1] = ''.$tdata[1].''; + + $tdata[2] = html_print_image('images/module_warning.png', true, ['title' => __('Monitor warning')], false, false, false, true); + $tdata[3] = $data['monitor_warning'] <= 0 ? '-' : $data['monitor_warning']; + $tdata[3] = ''.$tdata[3].''; + $table_mbs->rowclass[] = ''; + $table_mbs->data[] = $tdata; + + $tdata = []; + $tdata[0] = html_print_image('images/module_ok.png', true, ['title' => __('Monitor normal')], false, false, false, true); + $tdata[1] = $data['monitor_ok'] <= 0 ? '-' : $data['monitor_ok']; + $tdata[1] = ''.$tdata[1].''; + + $tdata[2] = html_print_image('images/module_unknown.png', true, ['title' => __('Monitor unknown')], false, false, false, true); + $tdata[3] = $data['monitor_unknown'] <= 0 ? '-' : $data['monitor_unknown']; + $tdata[3] = ''.$tdata[3].''; + $table_mbs->rowclass[] = ''; + $table_mbs->data[] = $tdata; + + $tdata = []; + $tdata[0] = html_print_image('images/module_notinit.png', true, ['title' => __('Monitor not init')], false, false, false, true); + $tdata[1] = $data['monitor_not_init'] <= 0 ? '-' : $data['monitor_not_init']; + $tdata[1] = ''.$tdata[1].''; + + $tdata[2] = $tdata[3] = ''; + $table_mbs->rowclass[] = ''; + $table_mbs->data[] = $tdata; + + if ($data['monitor_checks'] > 0) { + $tdata = []; + $table_mbs->colspan[count($table_mbs->data)][0] = 4; + $table_mbs->cellstyle[count($table_mbs->data)][0] = 'text-align: center;'; + $tdata[0] = '
        '.'
        '.graph_agent_status(false, $graph_width, $graph_height, true, true, $data_agents).'
        '; + $table_mbs->rowclass[] = ''; + $table_mbs->data[] = $tdata; + } + + if (!is_metaconsole()) { + $output = ' +
        + '.__('Monitors by status').''.html_print_table($table_mbs, true).'
        '; + } else { + $table_mbs->class = 'tactical_view'; + $table_mbs->style = []; + $output = ' +
        + '.__('Monitors by status').''.html_print_table($table_mbs, true).'
        '; + } + + return $output; +} \ No newline at end of file diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index 693a14adb7..e9e60f3418 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -1361,29 +1361,27 @@ function html_print_select_multiple_filtered( $output .= '
        '; - $output .= html_print_input( + $output .= html_print_image( + 'images/plus.svg', + true, [ - 'type' => 'image', - 'src' => 'images/darrowright.png', - 'return' => true, - 'options' => [ - 'title' => $texts['title-add'], - 'onclick' => $add, - 'class' => 'invert_filter', - ], + 'id' => 'right_autorefreshlist', + 'style' => 'width: 24px; margin: 10px 10px 0;', + 'alt' => __('Push selected pages into autorefresh list'), + 'title' => __('Push selected pages into autorefresh list'), + 'onclick' => $add, ] ); - $output .= html_print_input( + $output .= html_print_image( + 'images/minus.svg', + true, [ - 'type' => 'image', - 'src' => 'images/darrowleft.png', - 'return' => true, - 'options' => [ - 'title' => $texts['title-del'], - 'onclick' => $del, - 'class' => 'invert_filter', - ], + 'id' => 'left_autorefreshlist', + 'style' => 'width: 24px; margin: 10px 10px 0;', + 'alt' => __('Pop selected pages out of autorefresh list'), + 'title' => __('Pop selected pages out of autorefresh list'), + 'onclick' => $del, ] ); diff --git a/pandora_console/include/functions_reporting.php b/pandora_console/include/functions_reporting.php index 710bae4c82..ea3f7de46f 100755 --- a/pandora_console/include/functions_reporting.php +++ b/pandora_console/include/functions_reporting.php @@ -7488,7 +7488,7 @@ function reporting_sql($report, $content) foreach ($results as $id_node => $items) { foreach ($items['result']['data'] as $key => $item) { - $items['result']['data'][$key] = ['node_id' => $id_node] + $items['result']['data'][$key]; + $items['result']['data'][$key] = (['node_id' => $id_node] + $items['result']['data'][$key]); } if ((int) $items['result']['correct'] !== 1) { @@ -7537,7 +7537,8 @@ function reporting_sql($report, $content) * * @return array */ -function reporting_sql_auxiliary($report, $content) { +function reporting_sql_auxiliary($report, $content) +{ if ($content['treport_custom_sql_id'] != 0) { $sql = io_safe_output( db_get_value_filter( diff --git a/pandora_console/include/functions_treeview.php b/pandora_console/include/functions_treeview.php index b43d6bba95..e86c728fa7 100755 --- a/pandora_console/include/functions_treeview.php +++ b/pandora_console/include/functions_treeview.php @@ -467,7 +467,7 @@ function treeview_printAlertsTable($id_module, $server_data=[], $no_head=false) __('Go to alerts edition'), 'upd_button', false, - 'window.location.assign(\''.$console_url.'index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&tab=alert&search=1&module_name='.$module_name.'&id_agente='.$agent_id.$url_hash.'\')', + 'window.location.assign("'.$console_url.'index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&tab=alert&search=1&module_name='.$module_name.'&id_agente='.$agent_id.$url_hash.'")', ['icon' => 'alert'], true ), diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index 1e4556965b..e30ea78923 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -693,7 +693,7 @@ function ui_print_tags_warning($return=false) * * @return string HTML code if return parameter is true. */ -function ui_print_group_icon($id_group, $return=false, $path='', $style='', $link=true, $force_show_image=false, $show_as_image=false, $class='') +function ui_print_group_icon($id_group, $return=false, $path='', $style='', $link=true, $force_show_image=false, $show_as_image=false, $class='', $tactical_view=false) { global $config; @@ -707,7 +707,11 @@ function ui_print_group_icon($id_group, $return=false, $path='', $style='', $lin } if ($link === true) { - $output = ''; + if ($tactical_view === true) { + $output = ''; + } else { + $output = ''; + } } if ((bool) $config['show_group_name'] === true) { @@ -904,11 +908,11 @@ function ui_print_type_agent_icon( if ((int) $id_os === SATELLITE_OS_ID) { // Satellite. $options['title'] = __('Satellite'); - $output = html_print_image('images/satellite@svg.svg', true, ['class' => 'main_menu_icon invert_filter'], false, false, false, true); + $output = html_print_image('images/satellite@os.svg', true, ['class' => 'main_menu_icon invert_filter'], false, false, false, true); } else if ($remote_contact === $contact && $remote === 0 && empty($version) === true) { // Network. $options['title'] = __('Network'); - $output = html_print_image('images/network-server@svg.svg', true, ['class' => 'main_menu_icon invert_filter'], false, false, false, true); + $output = html_print_image('images/network-server@os.svg', true, ['class' => 'main_menu_icon invert_filter'], false, false, false, true); } else { // Software. $options['title'] = __('Software'); @@ -1210,7 +1214,7 @@ function ui_format_alert_row( $forceTitle, 'force_execution_'.$alert['id'], false, - 'window.location.assign(\''.$url.'&id_alert='.$alert['id'].'&refr=60'.$additionUrl.'\');', + 'window.location.assign("'.$url.'&id_alert='.$alert['id'].'&refr=60'.$additionUrl.'");', [ 'mode' => 'link' ], true ); @@ -1496,6 +1500,7 @@ function ui_print_alert_template_example($id_alert_template, $return=false, $pri * @param string $image Image path. * @param boolean $is_relative Route is relative or not. * @param string $id Target id. + * @param string $isHeader If true, the view is header. * * @return string The help tip */ @@ -1505,10 +1510,17 @@ function ui_print_help_icon( $home_url='', $image='images/info@svg.svg', $is_relative=false, - $id='' + $id='', + $isHeader=false ) { global $config; + if (empty($image) === true) { + $image = 'images/info@svg.svg'; + } + + $iconClass = ($isHeader === true) ? 'header_help_icon' : 'main_menu_icon'; + // Do not display the help icon if help is disabled. if ((bool) $config['disable_help'] === true) { return ''; @@ -1533,7 +1545,7 @@ function ui_print_help_icon( $image, true, [ - 'class' => 'img_help main_menu_icon', + 'class' => 'img_help '.$iconClass, 'title' => __('Help'), 'onclick' => "open_help ('".ui_get_full_url($help_handler)."')", 'id' => $id, @@ -5053,7 +5065,7 @@ function ui_print_page_header( if (is_metaconsole() === false) { if ($help != '') { - $buffer .= "
        ".ui_print_help_icon($help, true, '', 'images/help_g.png').'
        '; + $buffer .= "
        ".ui_print_help_icon($help, true, '', '', false, '', true).'
        '; } } @@ -7154,7 +7166,7 @@ function ui_print_servertype_icon(int $id) case MODULE_NETWORK: $title = __('Network server'); - $image = 'images/network-server@svg.svg'; + $image = 'images/network-server@os.svg'; break; case MODULE_PLUGIN: diff --git a/pandora_console/include/javascript/tactical_groups.js b/pandora_console/include/javascript/tactical_groups.js new file mode 100644 index 0000000000..08bca2f02e --- /dev/null +++ b/pandora_console/include/javascript/tactical_groups.js @@ -0,0 +1,18 @@ +/* global $, load_modal */ +function showInfoAgent(id_agent) { + load_modal({ + target: $("#modal-info-agent"), + url: "ajax.php", + modal: { + title: "Info agent", + cancel: "close" + }, + onshow: { + page: "include/ajax/group", + method: "loadInfoAgent", + extradata: { + idAgent: id_agent + } + } + }); +} diff --git a/pandora_console/include/lib/Group.php b/pandora_console/include/lib/Group.php index 1f34f941fd..9e386d8dd0 100644 --- a/pandora_console/include/lib/Group.php +++ b/pandora_console/include/lib/Group.php @@ -43,7 +43,13 @@ class Group extends Entity * * @var array */ - private static $ajaxMethods = ['getGroupsForSelect']; + private static $ajaxMethods = [ + 'getGroupsForSelect', + 'distributionBySoGraph', + 'groupEventsByAgent', + 'loadInfoAgent', + 'getAgentsByGroup', + ]; /** @@ -473,4 +479,271 @@ class Group extends Entity } + /** + * Draw a graph distribution so by group. + * + * @return void + */ + public static function distributionBySoGraph() + { + global $config; + $id_group = get_parameter('id_group', ''); + include_once $config['homedir'].'/include/functions_graph.php'; + + $out = '
        '; + $out .= graph_so_by_group($id_group, 300, 200, false, false); + $out .= '
        '; + echo $out; + return; + } + + + /** + * Draw a graph events agent by group. + * + * @return void + */ + public static function groupEventsByAgent() + { + global $config; + $id_group = get_parameter('id_group', ''); + include_once $config['homedir'].'/include/functions_graph.php'; + + $out = '
        '; + $out .= graph_events_agent_by_group($id_group, 300, 200, false, true, true); + $out .= '
        '; + echo $out; + return; + } + + + /** + * Draw in modal a agent info + * + * @return void + */ + public static function loadInfoAgent() + { + $extradata = get_parameter('extradata', ''); + echo '
        '; + + if (empty($extradata) === false) { + $extradata = json_decode(io_safe_output($extradata), true); + $agent = agents_get_agent($extradata['idAgent']); + + if (is_array($agent)) { + $status_img = agents_tree_view_status_img( + $agent['critical_count'], + $agent['warning_count'], + $agent['unknown_count'], + $agent['total_count'], + $agent['notinit_count'] + ); + $table = new \stdClass(); + $table->class = 'table_modal_alternate'; + $table->data = [ + [ + __('Id'), + $agent['id_agente'], + ], + [ + __('Agent name'), + ''.$agent['nombre'].'', + ], + [ + __('Alias'), + $agent['alias'], + ], + [ + __('Ip Address'), + $agent['direccion'], + ], + [ + __('Status'), + $status_img, + ], + [ + __('Group'), + groups_get_name($agent['id_grupo']), + ], + [ + __('Interval'), + $agent['intervalo'], + ], + [ + __('Operative system'), + get_os_name($agent['id_os']), + ], + [ + __('Server name'), + $agent['server_name'], + ], + [ + __('Description'), + $agent['comentarios'], + ], + ]; + + html_print_table($table); + } + } + + echo '
        '; + } + + + /** + * Get agents by group for datatable. + * + * @return void + */ + public static function getAgentsByGroup() + { + global $config; + + $data = []; + $id_group = get_parameter('id_group', ''); + $id_groups = [$id_group]; + $groups = groups_get_children($id_group); + + if (count($groups) > 0) { + $id_groups = []; + foreach ($groups as $key => $value) { + $id_groups[] = $value['id_grupo']; + } + } + + $start = get_parameter('start', 0); + $length = get_parameter('length', $config['block_size']); + $orderDatatable = get_datatable_order(true); + $pagination = ''; + $order = ''; + + try { + ob_start(); + if (isset($orderDatatable)) { + switch ($orderDatatable['field']) { + case 'alerts': + $orderDatatable['field'] = 'fired_count'; + break; + + case 'status': + $orderDatatable['field'] = 'total_count'; + + default: + $orderDatatable['field'] = $orderDatatable['field']; + break; + } + + $order = sprintf( + ' ORDER BY %s %s', + $orderDatatable['field'], + $orderDatatable['direction'] + ); + } + + if (isset($length) && $length > 0 + && isset($start) && $start >= 0 + ) { + $pagination = sprintf( + ' LIMIT %d OFFSET %d ', + $length, + $start + ); + } + + $sql = sprintf( + 'SELECT id_agente, + alias, + critical_count, + warning_count, + unknown_count, + total_count, + notinit_count, + ultimo_contacto_remoto, + fired_count + FROM tagente t + WHERE disabled = 0 AND + total_count <> notinit_count AND + id_grupo IN (%s) + %s %s', + implode(',', $id_groups), + $order, + $pagination + ); + + $data = db_get_all_rows_sql($sql); + + $sql = sprintf( + 'SELECT + id_agente, + alias, + critical_count, + warning_count, + unknown_count, + total_count, + notinit_count, + ultimo_contacto_remoto, + fired_count + FROM tagente t + WHERE disabled = 0 AND + total_count <> notinit_count AND + id_grupo IN (%s) + %s', + implode(',', $id_groups), + $order, + ); + + $count_agents = db_get_num_rows($sql); + + foreach ($data as $key => $agent) { + $status_img = agents_tree_view_status_img( + $agent['critical_count'], + $agent['warning_count'], + $agent['unknown_count'], + $agent['total_count'], + $agent['notinit_count'] + ); + $data[$key]['alias'] = ''.$agent['alias'].''; + $data[$key]['status'] = $status_img; + $data[$key]['alerts'] = agents_tree_view_alert_img($agent['fired_count']); + } + + if (empty($data) === true) { + $total = 0; + $data = []; + } else { + $total = $count_agents; + } + + echo json_encode( + [ + 'data' => $data, + 'recordsTotal' => $total, + 'recordsFiltered' => $total, + ] + ); + // Capture output. + $response = ob_get_clean(); + } catch (\Exception $e) { + echo json_encode(['error' => $e->getMessage()]); + exit; + } + + json_decode($response); + if (json_last_error() === JSON_ERROR_NONE) { + echo $response; + } else { + echo json_encode( + [ + 'success' => false, + 'error' => $response, + ] + ); + } + + exit; + } + + } diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index d819230098..63ad0d2e52 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -647,6 +647,10 @@ select:-internal-list-box { width: 20%; } +.w21p { + width: 21%; +} + .w22p { width: 22%; } @@ -5811,10 +5815,10 @@ div.label_select_child_left > span { overflow: hidden; } -.switch_radio_button label { +div.switch_radio_button label { background-color: #fff; color: rgba(0, 0, 0, 0.6); - line-height: 9pt; + line-height: 6px !important; text-align: center; padding: 14px 10px; margin-right: -1px; @@ -5822,14 +5826,14 @@ div.label_select_child_left > span { transition: all 0.1s ease-in-out; } -.switch_radio_button label:first { - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; +div.switch_radio_button label:first-of-type { + border-top-left-radius: 4px !important; + border-bottom-left-radius: 4px !important; } -.switch_radio_button label:last-child { - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; +div.switch_radio_button label:last-of-type { + border-top-right-radius: 4px !important; + border-bottom-right-radius: 4px !important; margin-right: 0px; } @@ -11014,14 +11018,14 @@ pre.external_tools_output { .tag-editor .tag-editor-tag { padding: 5px !important; color: #fff !important; - background: #82b92e !important; + background: var(--primary-color) !important; border-radius: 0 2px 2px 0 !important; } .tag-editor .tag-editor-delete { padding: 5px !important; line-height: 16px !important; - background: #82b92e !important; + background: var(--primary-color) !important; border-radius: 2px 0 0 2px !important; } @@ -11195,6 +11199,10 @@ table.table_modal_alternate height: 20px; } +.header_help_icon { + width: 16px; + height: 16px; +} .main_menu_icon.arrow_up { transform: rotate(90deg); } @@ -11509,6 +11517,15 @@ div[role="dialog"] { /* font-weight: bold; */ } +.font-title-font { + font-size: 13px; + line-height: 16px; + color: #161628; + text-align: left; + margin-bottom: 10px; + font-weight: bold; +} + .preimage_container span { font-size: 11pt; line-height: 28px; @@ -11545,6 +11562,20 @@ table.alert-template-fields > tbody > tr > td[id^="template-label_fields"] { text-align: center; } +ul.tag-editor { + list-style-type: none; + padding: 0.5em !important; + margin: 0; + overflow: hidden; + border: 2px solid #c0ccdc; + border-radius: 6px; + cursor: text; + font: normal 14px sans-serif; + color: #333333; + background: #f6f7fb; + line-height: 20px; +} + .max-width-100p { max-width: 100% !important; } diff --git a/pandora_console/include/styles/tactical_groups.css b/pandora_console/include/styles/tactical_groups.css new file mode 100644 index 0000000000..383e9ef37f --- /dev/null +++ b/pandora_console/include/styles/tactical_groups.css @@ -0,0 +1,31 @@ +.tactical_group_left_column { + vertical-align: top; + min-width: 30em; + width: 30%; + padding-top: 0px; +} +.tactical_group_right_column { + width: 40%; + vertical-align: top; + min-width: 30em; + padding-top: 0px; +} +rect { + cursor: pointer; +} +.info-agent { + width: 100%; + max-height: 400px; +} +.info-agent table { + width: 100%; +} +#modal-info-agent { + display: none; +} +#list_agents_tactical_wrapper { + max-height: 600px; +} +.graph-distribution-so { + margin-top: 55px; +} diff --git a/pandora_console/include/styles/wizard.css b/pandora_console/include/styles/wizard.css index 92d40ccc33..c7c37a8143 100644 --- a/pandora_console/include/styles/wizard.css +++ b/pandora_console/include/styles/wizard.css @@ -129,6 +129,12 @@ ul.wizard li > textarea { background: #e63c52; } +.wizard .tag-editor li, +.wizard .tag-editor li:focus, +.wizard .tag-editor li:hover { + border: 0; + padding: 0; +} .wizard .time_selection_container { display: flex; align-items: baseline; diff --git a/pandora_console/operation/agentes/estado_generalagente.php b/pandora_console/operation/agentes/estado_generalagente.php index 3e5584fe42..8aaa7ed60a 100755 --- a/pandora_console/operation/agentes/estado_generalagente.php +++ b/pandora_console/operation/agentes/estado_generalagente.php @@ -106,7 +106,12 @@ $agentIconGroup = ((bool) $config['show_group_name'] === false) ? ui_print_group $agent['id_grupo'], true, '', - 'padding-right: 6px;' + 'padding-right: 6px;', + true, + false, + false, + '', + true ) : ''; $agentIconStatus = agents_detail_view_status_img( @@ -396,7 +401,7 @@ $buttonsRefreshAgent = html_print_button( __('Refresh data'), 'refresh_data', false, - 'window.location.assign(\'index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente='.$id_agente.'&refr=60\')', + 'window.location.assign("index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente='.$id_agente.'&refr=60")', [ 'mode' => 'link' ], true ); @@ -406,7 +411,7 @@ if (check_acl_one_of_groups($config['id_user'], $all_groups, 'AW') === true) { __('Force checks'), 'force_checks', false, - 'window.location.assign(\'index.php?sec=estado&sec2=operation/agentes/ver_agente&flag_agent=1&id_agente='.$id_agente.'\')', + 'window.location.assign("index.php?sec=estado&sec2=operation/agentes/ver_agente&flag_agent=1&id_agente='.$id_agente.'")', [ 'mode' => 'link' ], true ); @@ -488,7 +493,7 @@ $data = []; $data[0] = ''.__('Group').''; $data[1] = html_print_anchor( [ - 'href' => 'index.php?sec=estado&sec2=operation/agentes/estado_agente&refr=60&group_id='.$agent['id_grupo'], + 'href' => 'index.php?sec=gagente&sec2=godmode/groups/tactical&id_group='.$agent['id_grupo'], 'content' => groups_get_name($agent['id_grupo']), ], true diff --git a/pandora_console/operation/reporting/reporting_viewer.php b/pandora_console/operation/reporting/reporting_viewer.php index 5c3ce7a73b..26e16c7f37 100755 --- a/pandora_console/operation/reporting/reporting_viewer.php +++ b/pandora_console/operation/reporting/reporting_viewer.php @@ -226,77 +226,52 @@ ui_print_standard_header( // ------------------- END HEADER --------------------------------------- // ------------------------ INIT FORM ----------------------------------- -$table = new stdClass(); -$table->id = 'controls_table'; -$table->width = '100%'; -$table->class = 'filter-table-adv'; +$table2 = new stdClass(); +$table2->id = 'controls_table'; +$table2->size[2] = '50%'; +$table2->size[3] = '50%'; +$table2->style[0] = 'text-align:center'; +$table2->style[1] = 'text-align:center'; +$table2->styleTable = 'border:none'; + if (defined('METACONSOLE')) { - $table->width = '100%'; - $table->class = 'databox filters'; + $table2->width = '100%'; + $table2->class = 'databox filters'; - $table->head[0] = __('View Report'); - $table->head_colspan[0] = 5; - $table->headstyle[0] = 'text-align: center'; + $table2->head[0] = __('View Report'); + $table2->head_colspan[0] = 5; + $table2->headstyle[0] = 'text-align: center'; } -$table->style = []; -$table->style[0] = 'vertical-align: middle'; -$table->rowspan[0][0] = 2; - // Set initial conditions for these controls, later will be modified by javascript if (!$enable_init_date) { - $table->style[1] = 'display: none'; - $table->style[2] = 'display: flex;align-items: baseline;'; $display_to = 'none'; $display_item = ''; } else { - $table->style[1] = 'display: "block"'; - $table->style[2] = 'display: flex;align-items: baseline;'; $display_to = ''; $display_item = 'none'; } -$table->size = []; -$table->colspan[0][1] = 2; -$table->data = []; -$table->data[0][0] = html_print_image( - 'images/reporting32.png', - true, - [ - 'width' => '32', - 'height' => '32', - ] -); - -if (reporting_get_description($id_report)) { - $table->data[0][1] = '
        '.reporting_get_description($id_report).'
        '; -} else { - $table->data[0][1] = '
        '.reporting_get_name($id_report).'
        '; -} - -$table->data[0][1] .= '
        '.__('Set initial date').html_print_checkbox('enable_init_date', 1, $enable_init_date, true).'
        '; - $html_menu_export = enterprise_hook('reporting_print_button_export'); if ($html_menu_export === ENTERPRISE_NOT_HOOK) { $html_menu_export = ''; } -$table->data[0][1] .= '
        '; -$table->data[0][1] .= $html_menu_export; +$table2->data[0][2] = '
        '.__('Set initial date').'
        '.html_print_checkbox_switch('enable_init_date', 1, $enable_init_date, true).'

        '; +$table2->data[0][2] .= '
        '.__('From').':
        '; +$table2->data[0][2] .= html_print_input_text('date_init', $date_init, '', 12, 10, true).' '; +$table2->data[0][2] .= html_print_input_text('time_init', $time_init, '', 10, 7, true).' '; +$table2->data[0][2] .= '
        '.__('Items period before').':
        '; +$table2->data[0][2] .= '
        '.__('to').':
        '; +$table2->data[0][2] .= html_print_input_text('date', $date, '', 12, 10, true).' '; +$table2->data[0][2] .= html_print_input_text('time', $time, '', 10, 7, true).' '; +$table2->data[0][3] = $html_menu_export; -$table->data[1][1] = '
        '.__('From').':
        '; -$table->data[1][1] .= html_print_input_text('date_init', $date_init, '', 12, 10, true).' '; -$table->data[1][1] .= html_print_input_text('time_init', $time_init, '', 10, 7, true).' '; -$table->data[1][2] = '
        '.__('Items period before').':
        '; -$table->data[1][2] .= '
        '.__('to').':
        '; -$table->data[1][2] .= html_print_input_text('date', $date, '', 12, 10, true).' '; -$table->data[1][2] .= html_print_input_text('time', $time, '', 10, 7, true).' '; - $searchForm = '
        '; -$searchForm .= html_print_table($table, true); +$searchForm .= html_print_table($table2, true); $searchForm .= html_print_input_hidden('id_report', $id_report, true); $Actionbuttons .= html_print_submit_button( @@ -354,10 +329,6 @@ for ($i = 0; $i < count($report['contents']); $i++) { reporting_html_print_report($report, false, $config['custom_report_info']); -// ---------------------------------------------------------------------- -// The rowspan of the first row is only 2 in controls table. Why is used the same code here and in the items?? -$table->rowspan[0][0] = 1; - echo '
        '; echo html_print_image('images/wait.gif', true, ['border' => '0']); echo ''.__('Loading').'...'; @@ -387,16 +358,15 @@ $(document).ready (function () { secondText: '', currentText: '', closeText: ''}); - + $.datepicker.setDefaults($.datepicker.regional[ ""]); - + $("#text-date").datepicker({ dateFormat: "", changeMonth: true, changeYear: true, showAnim: "slideDown"}); - - + $('[id^=text-time_init]').timepicker({ showSecond: true, timeFormat: '', @@ -407,29 +377,23 @@ $(document).ready (function () { secondText: '', currentText: '', closeText: ''}); - + $('[id^=text-date_init]').datepicker ({ dateFormat: "", changeMonth: true, changeYear: true, showAnim: "slideDown"}); - - - $("*", "#controls_table-0").css("display", ""); //Re-show the first row of form. - + /* Show/hide begin date reports controls */ $("#checkbox-enable_init_date").click(function() { flag = $("#checkbox-enable_init_date").is(':checked'); if (flag == true) { - $("#controls_table-1-1").css("display", ""); - $("#controls_table-1-2").css("display", ""); $("#string_to").show(); + $('#string_from').show(); $("#string_items").hide(); - } - else { - $("#controls_table-1-1").css("display", "none"); - $("#controls_table-1-2").css("display", ""); + } else { $("#string_to").hide(); + $('#string_from').hide(); $("#string_items").show(); } }); From 1ba420a9ce1a8ebf9d657875efecd136a24a50bc Mon Sep 17 00:00:00 2001 From: daniel Date: Tue, 7 Mar 2023 16:22:13 +0100 Subject: [PATCH 521/563] fixed styles --- pandora_console/include/javascript/pandora.js | 7 +++++++ pandora_console/index.php | 15 --------------- 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/pandora_console/include/javascript/pandora.js b/pandora_console/include/javascript/pandora.js index 30da9745eb..8bfdee500c 100644 --- a/pandora_console/include/javascript/pandora.js +++ b/pandora_console/include/javascript/pandora.js @@ -2400,3 +2400,10 @@ function topFunction() { 500 ); } + +function menuActionButtonResizing() { + $(".action_buttons_right_content").attr( + "style", + "left: " + $("#menu_full").width() + "px;" + ); +} diff --git a/pandora_console/index.php b/pandora_console/index.php index 78de0734b4..a78d97d926 100755 --- a/pandora_console/index.php +++ b/pandora_console/index.php @@ -1524,17 +1524,6 @@ require 'include/php_to_js_values.php'; } } - //$('.button_collapse').on('click', menuActionButtonResizing()); - - // Cursor change for show a spinner. Experimental. - /* - $('.buttonButton').not('.dialog_opener').on('click', function(){ - $('*').css('cursor', 'wait'); - }); - $('.submitButton').not('.dialog_opener').on('click', function(){ - $('*').css('cursor', 'wait'); - }); -*/ // When the user scrolls down 400px from the top of the document, show the // button. window.onscroll = function() { @@ -1545,10 +1534,6 @@ require 'include/php_to_js_values.php'; scrollFunction() }; - function menuActionButtonResizing() { - $('.action_buttons_right_content').attr('style', 'left: '+($('#menu_full').width())+'px;'); - } - function first_time_identification() { jQuery.post("ajax.php", { "page": "general/register", From 7e5dee5418c47bd1951ad83d053b394b46b40471 Mon Sep 17 00:00:00 2001 From: "alejandro.campos@artica.es" Date: Tue, 7 Mar 2023 16:27:14 +0100 Subject: [PATCH 522/563] fixed license check --- pandora_console/include/class/SatelliteCollection.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/include/class/SatelliteCollection.class.php b/pandora_console/include/class/SatelliteCollection.class.php index 769ec5c6f4..40b0ed3112 100644 --- a/pandora_console/include/class/SatelliteCollection.class.php +++ b/pandora_console/include/class/SatelliteCollection.class.php @@ -84,7 +84,7 @@ class SatelliteCollection extends HTML return; } - if ((int) $config['license_nms'] === 0) { + if ((int) $config['license_nms'] === 1) { db_pandora_audit( AUDIT_LOG_NMS_VIOLATION, 'Trying to access satellite collections' From 2dbc2e801f210e1b7f224add470c5cf2565265dd Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Tue, 7 Mar 2023 17:24:36 +0100 Subject: [PATCH 523/563] Minor icon fixes --- .../godmode/reporting/reporting_builder.php | 4 ++-- pandora_console/godmode/servers/plugin.php | 18 ++++++++++++----- .../include/class/SnmpConsole.class.php | 20 +++++++++---------- .../include/functions_filemanager.php | 11 +++++----- pandora_console/include/styles/tables.css | 6 ++++-- .../operation/snmpconsole/snmp_browser.php | 8 ++++---- .../operation/snmpconsole/snmp_statistics.php | 16 +++++++-------- .../operation/snmpconsole/snmp_view.php | 2 +- 8 files changed, 47 insertions(+), 38 deletions(-) diff --git a/pandora_console/godmode/reporting/reporting_builder.php b/pandora_console/godmode/reporting/reporting_builder.php index 9fd9c02f7e..12d5266f34 100755 --- a/pandora_console/godmode/reporting/reporting_builder.php +++ b/pandora_console/godmode/reporting/reporting_builder.php @@ -509,11 +509,11 @@ switch ($action) { 'list_reports' => [ 'active' => false, 'text' => ''.html_print_image( - 'images/report_list.png', + 'images/logs@svg.svg', true, [ 'title' => __('Reports list'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ).'', ], diff --git a/pandora_console/godmode/servers/plugin.php b/pandora_console/godmode/servers/plugin.php index 43fad7d3be..688e898c9d 100644 --- a/pandora_console/godmode/servers/plugin.php +++ b/pandora_console/godmode/servers/plugin.php @@ -632,7 +632,7 @@ if (empty($create) === false || empty($view) === false) { $delete_macro_style = 'display:none;'; } - $datam[2] = ''; + $datam[2] = ''; $table->colspan['plugin_action'][0] = 2; $table->colspan['plugin_action'][2] = 2; @@ -665,8 +665,10 @@ if (empty($create) === false || empty($view) === false) { echo '
        @@ -4496,7 +4500,7 @@ function print_General_list($width, $action, $idItem=null, $type='general') include_once $config['homedir'].'/include/functions_html.php'; ?> - +
        diff --git a/pandora_console/godmode/reporting/reporting_builder.list_items.php b/pandora_console/godmode/reporting/reporting_builder.list_items.php index ae2d92bfbc..71190bbe99 100755 --- a/pandora_console/godmode/reporting/reporting_builder.list_items.php +++ b/pandora_console/godmode/reporting/reporting_builder.list_items.php @@ -204,7 +204,7 @@ $urlFilter = '&agent_filter='.$agentFilter.'&module_filter='.$moduleFilter.'&typ if (!defined('METACONSOLE')) { $table = new stdClass(); $table->width = '100%'; - $table->class = 'databox filters'; + $table->class = 'databox filters mrgn_btn_0'; $table->data[0][0] = __('Agents'); $table->data[0][0] .= html_print_select($agents, 'agent_filter', $agentFilter, '', __('All'), 0, true); $table->data[0][1] = __('Modules'); @@ -349,7 +349,7 @@ $table->style[0] = 'text-align: right;'; if ($items) { - $table->width = '98%'; + $table->width = '100%'; if (defined('METACONSOLE')) { $table->width = '100%'; $table->class = 'databox data'; @@ -687,7 +687,7 @@ if (defined('METACONSOLE')) { echo "
        "; html_print_input_hidden('ids_items_to_delete', ''); - html_print_submit_button(__('Delete'), 'delete_btn', false, 'class="sub delete right mrgn_btn_15px"'); + html_print_submit_button(__('Delete'), 'delete_btn', false, 'class="sub delete right mrgn_btn_15px mrgn_right_20px"'); echo '
        '; echo ''; } diff --git a/pandora_console/godmode/reporting/reporting_builder.main.php b/pandora_console/godmode/reporting/reporting_builder.main.php index 177c84d68d..e52634a065 100755 --- a/pandora_console/godmode/reporting/reporting_builder.main.php +++ b/pandora_console/godmode/reporting/reporting_builder.main.php @@ -41,22 +41,22 @@ $groups = users_get_groups(); switch ($action) { default: case 'new': - $actionButtonHtml = html_print_submit_button( + $actionButtons = html_print_submit_button( __('Save'), 'add', false, - 'class="sub wand"', + [ 'icon' => 'next' ], true ); $hiddenFieldAction = 'save'; break; case 'update': case 'edit': - $actionButtonHtml = html_print_submit_button( + $actionButtons = html_print_submit_button( __('Update'), 'edit', false, - 'class="sub upd"', + [ 'icon' => 'next' ], true ); $hiddenFieldAction = 'update'; @@ -191,22 +191,9 @@ if ($enterpriseEnable) { } $table->data['interactive_report'][0] = __('Non interactive report'); - $table->data['interactive_report'][1] = __('Yes'); - $table->data['interactive_report'][1] .= '   '; - $table->data['interactive_report'][1] .= html_print_radio_button( + $table->data['interactive_report'][1] .= html_print_checkbox_switch( 'non_interactive', 1, - '', - $non_interactive_check, - true - ); - $table->data['interactive_report'][1] .= '  '; - $table->data['interactive_report'][1] .= __('No'); - $table->data['interactive_report'][1] .= '   '; - $table->data['interactive_report'][1] .= html_print_radio_button( - 'non_interactive', - 0, - '', $non_interactive_check, true ); @@ -215,8 +202,8 @@ if ($enterpriseEnable) { $table->data['description'][0] = __('Description'); $table->data['description'][1] = html_print_textarea( 'description', - 5, - 15, + 2, + 80, $description, '', true @@ -244,7 +231,7 @@ echo ''; html_print_table($table); echo '
        '; -echo $actionButtonHtml; +html_print_action_buttons($actionButtons, ['type' => 'form_action']); html_print_input_hidden('action', $hiddenFieldAction); html_print_input_hidden('id_report', $idReport); echo '
        '; diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index ff02de3639..bf5e53a3b6 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -2150,7 +2150,7 @@ function html_print_extended_select_for_time( 'class' => $uniq_name.'_toggler '.$class.' invert_filter', 'alt' => __('Custom'), 'title' => __('Custom'), - 'style' => 'width: 18px; margin-bottom: -5px; margin-left: 10px'.$style_icon, + 'style' => 'width: 18px; margin-bottom: -5px; margin-left: 10px; padding-top: 10px;'.$style_icon, ], false, false, @@ -2162,7 +2162,7 @@ function html_print_extended_select_for_time( echo ''; - echo '
        '; + echo '
        '; html_print_input_text($uniq_name.'_text', $selected, '', $size, 255, false, $readonly, false, '', $class); html_print_input_hidden($name, $selected, false, $uniq_name); @@ -2178,7 +2178,7 @@ function html_print_extended_select_for_time( false, $class, $readonly, - 'padding: 0px 5px; height: 42px; margin: -6px 0 0 6px; width: 140px;'.$select_style, + ' margin-left: 5px; width: 140px;'.$select_style, false, false, false, @@ -2196,7 +2196,7 @@ function html_print_extended_select_for_time( 'class' => $uniq_name.'_toggler invert_filter', 'alt' => __('List'), 'title' => __('List'), - 'style' => 'width: 18px;margin-bottom: -5px;'.$style_icon, + 'style' => 'width: 18px;margin-bottom: -5px; padding-top: 10px;'.$style_icon, ] ).''; echo '
        '; diff --git a/pandora_console/include/functions_reports.php b/pandora_console/include/functions_reports.php index 0d39f5b916..41356e9455 100755 --- a/pandora_console/include/functions_reports.php +++ b/pandora_console/include/functions_reports.php @@ -1059,7 +1059,7 @@ function get_table_custom_macros_report($data) $table = new StdClass(); $table->data = []; $table->width = '100%'; - $table->class = 'databox data fullwidth'; + $table->class = 'info_table'; $table->id = 'table-macros-definition'; $table->rowclass = []; diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index 9b3060d1f8..d1deaca26d 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -5841,6 +5841,15 @@ function ui_print_agent_autocomplete_input($parameters) .attr("style", "background-image: url(\'"+image+"\'); background-repeat: no-repeat; background-position: 97% center; background-size: 20px; '.$inputStyles.'"); } + $(document).ready(function () { + $("#'.$input_id.'").focusout(function (e) { + setTimeout(() => { + let iconImage = "'.$icon_image.'"; + $("#'.$input_id.'").attr("style", "background-image: url(\'"+iconImage+"\'); background-repeat: no-repeat; background-position: 97% center; background-size: 20px; '.$inputStyles.'"); + }, 100); + }); + }); + function set_functions_change_autocomplete_'.$input_name.'() { var cache_'.$input_name.' = {}; diff --git a/pandora_console/include/javascript/pandora.js b/pandora_console/include/javascript/pandora.js index 03c7308faf..661ed78545 100644 --- a/pandora_console/include/javascript/pandora.js +++ b/pandora_console/include/javascript/pandora.js @@ -894,7 +894,7 @@ function post_process_select_events(name) { function period_select_init(name, allow_zero) { // Manual mode is hidden by default $("#" + name + "_manual").css("display", "none"); - $("#" + name + "_default").css("display", "inline"); + $("#" + name + "_default").css("display", "flex"); // If the text input is empty, we put on it 5 minutes by default if ($("#text-" + name + "_text").val() == "") { $("#text-" + name + "_text").val(300); @@ -907,7 +907,7 @@ function period_select_init(name, allow_zero) { } } else if ($("#text-" + name + "_text").val() == 0 && allow_zero == 1) { $("#" + name + "_units option:last").prop("selected", false); - $("#" + name + "_manual").css("display", "inline"); + $("#" + name + "_manual").css("display", "flex"); $("#" + name + "_default").css("display", "none"); } } @@ -996,13 +996,13 @@ function selectFirst(name) { */ function toggleBoth(name) { if ($("#" + name + "_default").css("display") == "none") { - $("#" + name + "_default").css("display", "inline"); + $("#" + name + "_default").css("display", "flex"); } else { $("#" + name + "_default").css("display", "none"); } if ($("#" + name + "_manual").css("display") == "none") { - $("#" + name + "_manual").css("display", "inline"); + $("#" + name + "_manual").css("display", "flex"); } else { $("#" + name + "_manual").css("display", "none"); } diff --git a/pandora_console/include/styles/js/jquery-ui_custom.css b/pandora_console/include/styles/js/jquery-ui_custom.css index b0c0fce92e..d9adde2a0f 100644 --- a/pandora_console/include/styles/js/jquery-ui_custom.css +++ b/pandora_console/include/styles/js/jquery-ui_custom.css @@ -144,6 +144,7 @@ .ui_tpicker_second, .ui-slider-handle { border: 1px solid #aaaaaa; + background-color: #dadada !important; } .ui-timepicker-div dd { margin: 0px 15px 0px 15px; @@ -219,6 +220,23 @@ a.ui-button:active, border-bottom: 4px solid #82b92e; } +.ui-priority-secondary:hover { + content: ""; + position: absolute; + bottom: -5px; + width: 100%; + border-bottom: 5px solid #82b92e; +} + +.ui-priority-primary:hover { + content: ""; + position: absolute; + right: 5px; + bottom: -5px; + width: 100%; + border-bottom: 5px solid #82b92e; +} + .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 54d271ff5a..b4a31852de 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -11268,3 +11268,13 @@ form#satellite_conf_edit > fieldset.full-column { background-size: 24px; background-image: url("../../images/enable.svg"); } + +.orientation-report { + margin-right: 10px; +} + +#textarea_header_tbl, +#textarea_firstpage_tbl, +#textarea_footer_tbl { + width: 80% !important; +} From df86a428b7b9bcd45ff78f4f6a1e2266ee987fbd Mon Sep 17 00:00:00 2001 From: rafael Date: Wed, 22 Feb 2023 10:38:14 +0100 Subject: [PATCH 335/563] 10435 change gotty to be downloaded from firefly --- extras/deploy-scripts/deploy_ext_database_ubuntu_2204.sh | 1 + extras/deploy-scripts/pandora_deploy_community.sh | 2 +- extras/deploy-scripts/pandora_deploy_community_el8.sh | 4 ++-- extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh | 3 ++- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/extras/deploy-scripts/deploy_ext_database_ubuntu_2204.sh b/extras/deploy-scripts/deploy_ext_database_ubuntu_2204.sh index dba6aa2773..45a99783ab 100644 --- a/extras/deploy-scripts/deploy_ext_database_ubuntu_2204.sh +++ b/extras/deploy-scripts/deploy_ext_database_ubuntu_2204.sh @@ -4,6 +4,7 @@ ############################################################################################################## ## Tested versions ## # Ubuntu 22.04.1 +# Ubuntu 22.04.2 #avoid promps export DEBIAN_FRONTEND=noninteractive diff --git a/extras/deploy-scripts/pandora_deploy_community.sh b/extras/deploy-scripts/pandora_deploy_community.sh index 78f1ef0e41..9386d55647 100644 --- a/extras/deploy-scripts/pandora_deploy_community.sh +++ b/extras/deploy-scripts/pandora_deploy_community.sh @@ -431,7 +431,7 @@ execute_cmd "curl -LSs --output pandorafms_agent_linux-7.0NG.noarch.rpm ${PANDOR execute_cmd "yum install -y $HOME/pandora_deploy_tmp/pandorafms*.rpm" "installing PandoraFMS packages" # Copy gotty utility -execute_cmd "wget https://pandorafms.com/library/wp-content/uploads/2019/11/gotty_linux_amd64.tar.gz" 'Dowloading gotty util' +execute_cmd "wget https://firefly.pandorafms.com/pandorafms/utils/gotty_linux_amd64.tar.gz" 'Dowloading gotty util' tar xvzf gotty_linux_amd64.tar.gz &>> $LOGFILE execute_cmd "mv gotty /usr/bin/" 'Installing gotty util' diff --git a/extras/deploy-scripts/pandora_deploy_community_el8.sh b/extras/deploy-scripts/pandora_deploy_community_el8.sh index fe00f81571..cc14ad1ffa 100644 --- a/extras/deploy-scripts/pandora_deploy_community_el8.sh +++ b/extras/deploy-scripts/pandora_deploy_community_el8.sh @@ -5,7 +5,7 @@ ## Tested versions ## # Centos 8.4, 8.5 # Rocky 8.4, 8.5, 8.6, 8.7 -# Almalinuz 8.4, 8.5 +# Almalinux 8.4, 8.5 # RedHat 8.5 #Constants @@ -530,7 +530,7 @@ execute_cmd "curl -LSs --output pandorafms_agent_linux-7.0NG.noarch.rpm ${PANDOR execute_cmd "dnf install -y $HOME/pandora_deploy_tmp/pandorafms*.rpm" "Installing Pandora FMS packages" # Copy gotty utility -execute_cmd "wget https://pandorafms.com/library/wp-content/uploads/2019/11/gotty_linux_amd64.tar.gz" 'Dowloading gotty util' +execute_cmd "wget https://firefly.pandorafms.com/pandorafms/utils/gotty_linux_amd64.tar.gz" 'Dowloading gotty util' tar xvzf gotty_linux_amd64.tar.gz &>> $LOGFILE execute_cmd "mv gotty /usr/bin/" 'Installing gotty util' diff --git a/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh b/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh index 8bd8bcfaff..1446abfab3 100644 --- a/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh +++ b/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh @@ -4,6 +4,7 @@ ############################################################################################################## ## Tested versions ## # Ubuntu 22.04.1 +# Ubuntu 22.04.2 #avoid promps export DEBIAN_FRONTEND=noninteractive @@ -496,7 +497,7 @@ check_cmd_status "Error installing PandoraFMS Agent" # Copy gotty utility cd $WORKDIR &>> "$LOGFILE" -execute_cmd "wget https://pandorafms.com/library/wp-content/uploads/2019/11/gotty_linux_amd64.tar.gz" 'Dowloading gotty util' +execute_cmd "wget https://firefly.pandorafms.com/pandorafms/utils/gotty_linux_amd64.tar.gz" 'Dowloading gotty util' tar xvzf gotty_linux_amd64.tar.gz &>> $LOGFILE execute_cmd "mv gotty /usr/bin/" 'Installing gotty util' From 3d5458ae4623d332d7cb38cd4ec9650e31fcfd56 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Wed, 22 Feb 2023 11:36:09 +0100 Subject: [PATCH 336/563] #10302 fixed ack date --- pandora_console/operation/events/events.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/operation/events/events.php b/pandora_console/operation/events/events.php index c7c8be45ce..251d95200d 100644 --- a/pandora_console/operation/events/events.php +++ b/pandora_console/operation/events/events.php @@ -521,7 +521,7 @@ if (is_ajax() === true) { $tmp->agent_name = io_safe_output($tmp->agent_name); - $tmp->ack_utimestamp_raw = strtotime($tmp->ack_utimestamp); + $tmp->ack_utimestamp_raw = $tmp->ack_utimestamp; $tmp->ack_utimestamp = ui_print_timestamp( (empty($tmp->ack_utimestamp) === true) ? 0 : $tmp->ack_utimestamp, From bbde3e418152a2ed7043eb2c35b5296ff8c23c22 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Wed, 22 Feb 2023 12:15:17 +0100 Subject: [PATCH 337/563] Minor fixes --- .../extensions/resource_exportation.php | 145 ++++++++++-------- .../godmode/servers/modificar_server.php | 37 +++-- .../godmode/servers/servers.build_table.php | 37 ++--- pandora_console/include/ajax/module.php | 3 +- pandora_console/include/functions_ui.php | 2 +- 5 files changed, 123 insertions(+), 101 deletions(-) diff --git a/pandora_console/extensions/resource_exportation.php b/pandora_console/extensions/resource_exportation.php index b6e594c744..ba9f6e5480 100755 --- a/pandora_console/extensions/resource_exportation.php +++ b/pandora_console/extensions/resource_exportation.php @@ -1,16 +1,32 @@ \n"; break; @@ -224,18 +209,6 @@ function output_xml_report($id) echo '\n"; break; - case 'event_report_module': - break; - - case 'alert_report_module': - break; - - case 'alert_report_agent': - break; - - case 'alert_report_group': - break; - case 'url': echo ''; break; @@ -245,6 +218,29 @@ function output_xml_report($id) echo ''; echo ''; break; + + case 1: + case 'simple_graph': + case 'simple_baseline_graph': + case 6: + case 'monitor_report': + case 7: + case 'avg_value': + case 8: + case 'max_value': + case 9: + case 'min_value': + case 10: + case 'sumatory': + case 'agent_detailed_event': + case 'event_report_agent': + case 'event_report_module': + case 'alert_report_module': + case 'alert_report_agent': + case 'alert_report_group': + default: + // Do nothing. + break; } echo "\n"; @@ -417,25 +413,42 @@ function resource_exportation_extension_main() $hook_enterprise = enterprise_include('extensions/resource_exportation/functions.php'); - ui_print_page_header(__('Resource exportation'), 'images/extensions.png', false, '', true, ''); + ui_print_standard_header( + __('Resource exportation'), + 'images/extensions.png', + false, + '', + true, + [], + [ + [ + 'link' => '', + 'label' => __('Resources'), + ], + [ + 'link' => '', + 'label' => __('Resource exporting'), + ], + ] + ); - echo '
        '; - echo __('This extension makes exportation of resource template more easy.').' '.__('You can export resource templates in .ptr format.'); - echo '
        '; - - echo '

        '; + ui_print_warning_message( + __('This extension makes exportation of resource template more easy.').'
        '.__('You can export resource templates in .ptr format.') + ); $table = new stdClass(); - $table->width = '100%'; - $table->style[0] = 'width: 30%;'; - $table->style[1] = 'width: 10%;'; - $table->class = 'databox filters'; + $table->class = 'databox m2020'; + $table->id = 'resource_exportation_table'; + $table->style = []; + $table->style[0] = 'width: 0'; + $table->style[1] = 'width: 0'; + $table->data = []; $table->data[0][0] = __('Report'); $table->data[0][1] = html_print_select_from_sql('SELECT id_report, name FROM treport', 'report', '', '', '', 0, true); - $table->data[0][2] = html_print_button(__('Export'), '', false, 'export_to_ptr(\'report\');', 'class="sub config"', true); + $table->data[0][2] = html_print_button(__('Export'), '', false, 'export_to_ptr(\'report\');', ['icon' => 'cog', 'mode' => 'secondary mini'], true); $table->data[1][0] = __('Visual console'); $table->data[1][1] = html_print_select_from_sql('SELECT id, name FROM tlayout', 'visual_console', '', '', '', 0, true); - $table->data[1][2] = html_print_button(__('Export'), '', false, 'export_to_ptr(\'visual_console\');', 'class="sub config"', true); + $table->data[1][2] = html_print_button(__('Export'), '', false, 'export_to_ptr(\'visual_console\');', ['icon' => 'cog', 'mode' => 'secondary mini'], true); if ($hook_enterprise === true) { add_rows_for_enterprise($table->data); diff --git a/pandora_console/godmode/servers/modificar_server.php b/pandora_console/godmode/servers/modificar_server.php index 0ab1377747..7d09120ca8 100644 --- a/pandora_console/godmode/servers/modificar_server.php +++ b/pandora_console/godmode/servers/modificar_server.php @@ -84,8 +84,8 @@ if (isset($_GET['server']) === true) { $table->cellpadding = 4; $table->cellspacing = 4; - $table->width = '100%'; - $table->class = 'databox filters'; + $table->class = 'databox m2020'; + $table->id = 'server_update_form'; $table->data[] = [ __('Name'), @@ -129,17 +129,24 @@ if (isset($_GET['server']) === true) { html_print_table($table); - html_print_div( - [ - 'class' => 'action-buttons w100p', - 'content' => html_print_submit_button( - __('Update'), - '', - false, - [ 'icon' => 'update' ], - true - ), - ] + $actionButtons = []; + $actionButtons[] = html_print_submit_button( + __('Update'), + '', + false, + [ 'icon' => 'update' ], + true + ); + + $actionButtons[] = html_print_go_back_button( + 'index.php?sec=gservers&sec2=godmode/servers/modificar_server', + ['button_class' => ''], + true + ); + + html_print_action_buttons( + implode('', $actionButtons), + ['type' => 'form_action'], ); echo ''; @@ -250,6 +257,10 @@ if (isset($_GET['server']) === true) { 'link' => '', 'label' => __('Servers'), ], + [ + 'link' => '', + 'label' => __('Manage Servers'), + ], ] ); diff --git a/pandora_console/godmode/servers/servers.build_table.php b/pandora_console/godmode/servers/servers.build_table.php index eb6943eccc..5940bcd5fd 100644 --- a/pandora_console/godmode/servers/servers.build_table.php +++ b/pandora_console/godmode/servers/servers.build_table.php @@ -14,7 +14,7 @@ * |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______| * * ============================================================================ - * Copyright (c) 2005-2022 Artica Soluciones Tecnologicas + * Copyright (c) 2005-2023 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 @@ -54,15 +54,13 @@ if ($servers === false) { } $table = new StdClass(); -$table->width = '100%'; -$table->class = 'info_table'; +$table->class = 'info_table m2020'; $table->cellpadding = 0; $table->cellspacing = 0; $table->size = []; $table->style = []; -$table->style[0] = 'font-weight: bold'; - +// $table->style[0] = 'font-weight: bold'; $table->align = []; $table->align[1] = 'center'; $table->align[3] = 'center'; @@ -196,12 +194,11 @@ foreach ($servers as $server) { if ($server['type'] === 'recon') { $data[8] .= ''; $data[8] .= html_print_image( - 'images/first_task/icono_grande_reconserver.png', + 'images/snmp-trap@svg.svg', true, [ 'title' => __('Manage Discovery tasks'), - 'style' => 'width:21px;height:21px;', - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ); @@ -211,22 +208,22 @@ foreach ($servers as $server) { if ($server['type'] === 'data') { $data[8] .= ''; $data[8] .= html_print_image( - 'images/target.png', + 'images/change-active.svg', true, [ 'title' => __('Reset module status and fired alert counts'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ); $data[8] .= ''; } else if ($server['type'] === 'enterprise snmp') { $data[8] .= ''; $data[8] .= html_print_image( - 'images/target.png', + 'images/change-active.svg', true, [ 'title' => __('Claim back SNMP modules'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ); $data[8] .= ''; @@ -234,11 +231,11 @@ foreach ($servers as $server) { $data[8] .= ''; $data[8] .= html_print_image( - 'images/config.png', + 'images/edit.svg', true, [ 'title' => __('Edit'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ); $data[8] .= ''; @@ -246,22 +243,22 @@ foreach ($servers as $server) { if (($names_servers[$safe_server_name] === true) && ($server['type'] === 'data' || $server['type'] === 'enterprise satellite')) { $data[8] .= ''; $data[8] .= html_print_image( - 'images/agent.png', + 'images/agents@svg.svg', true, [ 'title' => __('Manage satellite hosts'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ); $data[8] .= ''; $data[8] .= ''; $data[8] .= html_print_image( - 'images/remote_configuration.png', + 'images/remote_configuration@svg.svg', true, [ 'title' => __('Remote configuration'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ); $data[8] .= ''; @@ -270,12 +267,12 @@ foreach ($servers as $server) { $data[8] .= ''; $data[8] .= html_print_image( - 'images/cross.png', + 'images/delete.svg', true, [ 'title' => __('Delete'), 'onclick' => "if (! confirm ('".__('Modules run by this server will stop working. Do you want to continue?')."')) return false", - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ); $data[8] .= ''; diff --git a/pandora_console/include/ajax/module.php b/pandora_console/include/ajax/module.php index 9913438275..7efb4d832b 100755 --- a/pandora_console/include/ajax/module.php +++ b/pandora_console/include/ajax/module.php @@ -1149,7 +1149,7 @@ if (check_login()) { $last_status_change_text = __('Time elapsed since last status change: '); $last_status_change_text .= (empty($module['last_status_change']) === false) ? human_time_comparation($module['last_status_change']) : __('N/A'); - $data[4] .= ui_print_status_image($status, htmlspecialchars($title), true, false, false, false, $last_status_change_text); + $data[4] .= ui_print_status_image($status, htmlspecialchars($title), true, false, false, true, $last_status_change_text); if ($show_context_help_first_time === false) { $show_context_help_first_time = true; @@ -1158,6 +1158,7 @@ if (check_login()) { } } + hd($data[4], true); // Module thresholds. $data[5] = ''; if ((int) $module['id_tipo_modulo'] !== 25) { diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index 9b3060d1f8..b97b828979 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -343,7 +343,7 @@ function ui_print_message($message, $class='', $attributes='', $return=false, $t [ 'href' => 'javascript: close_info_box(\''.$id.'\')', 'content' => html_print_image( - 'images/svg/fail.svg', + 'images/close@svg.svg', true, false, false, From fd0c1818203c8769bd9f8d2f607d2124f20ae7ed Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Wed, 22 Feb 2023 12:16:04 +0100 Subject: [PATCH 338/563] Margin reversed --- pandora_console/include/functions_html.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index ff02de3639..fb55ed5593 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -3474,7 +3474,8 @@ function html_print_button($label='OK', $name='', $disabled=false, $script='', $ $classes = ''; $fixedId = ''; $iconStyle = ''; - $spanStyle = 'margin-top: 4px;'; + // $spanStyle = 'margin-top: 4px;'; + $spanStyle = ''; if (empty($name) === true) { $name = 'unnamed'; } From 2081459556a5edc1a67ea0f6ca01fd6a47a1ac96 Mon Sep 17 00:00:00 2001 From: Pablo Aragon Date: Wed, 22 Feb 2023 13:08:15 +0100 Subject: [PATCH 339/563] 10454-Fix event view --- pandora_console/include/styles/events.css | 21 +++++++++++++++---- pandora_console/operation/events/events.php | 23 +++++++++++---------- 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/pandora_console/include/styles/events.css b/pandora_console/include/styles/events.css index dc1f7415b7..12502a5cc7 100644 --- a/pandora_console/include/styles/events.css +++ b/pandora_console/include/styles/events.css @@ -1,11 +1,11 @@ div.criticity { - width: 150px; - height: 2em; + width: 100px; + height: 15px; color: #fff; text-align: center; border-radius: 5px; - font-size: 0.8em; - padding: 5px; + font-size: 0.7em; + padding: 2px; margin: 0; display: table-cell; vertical-align: middle; @@ -82,6 +82,19 @@ table.dataTable tbody td { padding: 8px 10px; } +th:last-child { + padding-top: 0px !important; + padding-bottom: 0px !important; +} + +td { + padding: 0px !important; +} + +td > input[id^="checkbox-multi"] { + margin: 0px !important; +} + .info_table.events tr > th { padding-left: 1em; font-size: 8pt; diff --git a/pandora_console/operation/events/events.php b/pandora_console/operation/events/events.php index 009b0dd4bd..829ba01044 100644 --- a/pandora_console/operation/events/events.php +++ b/pandora_console/operation/events/events.php @@ -626,8 +626,8 @@ if (is_ajax() === true) { $tmp->mini_severity .= $output; $tmp->mini_severity .= '
        '; - $criticity = '
        '.$text.'
        '; + $criticity = '
        '.$text.'
        '; $tmp->criticity = $criticity; // Add event severity to end of text. @@ -695,8 +695,8 @@ if (is_ajax() === true) { break; } - $event_type = '
        '.$text.'
        '; + $event_type = '
         
        '; $tmp->event_type = $event_type; // Module status. @@ -735,8 +735,8 @@ if (is_ajax() === true) { break; } - $module_status = '
        '.$text.'
        '; + $module_status = '
         
        '; $tmp->module_status = $module_status; // Status. @@ -772,7 +772,7 @@ if (is_ajax() === true) { true, [ 'title' => __('Event in process'), - 'class' => 'forced-title invert_filter', + 'class' => 'forced-title invert_filter height_20px', ] ); break; @@ -790,7 +790,7 @@ if (is_ajax() === true) { break; } - $draw_state = '
        '; + $draw_state = '
        '; $draw_state .= ''; @@ -1812,7 +1812,7 @@ $in .= '
        '; $inputs[] = $in; // Trick view in table. -$inputs[] = '
        '; +$inputs[] = '
        '; $buttons = []; @@ -2211,7 +2211,8 @@ $filter .= ui_toggle( true, true, 'white_box white_box_opened', - 'no-border flex-row' + 'no-border flex-row', + 'box-flat white_table_graph w100p' ); try { @@ -2394,7 +2395,7 @@ try { [ 'id' => $table_id, 'class' => 'info_table events', - 'style' => 'width: 100%;', + 'style' => 'width: 99%;', 'ajax_url' => 'operation/events/events', 'ajax_data' => [ 'get_events' => 1, From ec58cb459372cc104f4dc1ddc3d11816e654b050 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Wed, 22 Feb 2023 14:19:57 +0100 Subject: [PATCH 340/563] Plugins view --- pandora_console/godmode/servers/plugin.php | 481 +++++++++++-------- pandora_console/include/class/Tree.class.php | 6 +- pandora_console/include/functions_html.php | 2 +- 3 files changed, 290 insertions(+), 199 deletions(-) diff --git a/pandora_console/godmode/servers/plugin.php b/pandora_console/godmode/servers/plugin.php index 7b0a34efa7..a31b3e587b 100644 --- a/pandora_console/godmode/servers/plugin.php +++ b/pandora_console/godmode/servers/plugin.php @@ -14,7 +14,7 @@ * |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______| * * ============================================================================ - * Copyright (c) 2005-2021 Artica Soluciones Tecnologicas + * Copyright (c) 2005-2023 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 @@ -71,15 +71,13 @@ if (is_ajax()) { $table = new stdClass(); $table->width = '100%'; $table->head[0] = __('Network Components'); - $table->data = []; + // $table->data = []; foreach ($network_components as $net_comp) { $table->data[] = [$net_comp['name']]; } - if (!empty($table->data)) { + if (empty($table->data) === false) { html_print_table($table); - - echo '
        '; } $table = new stdClass(); @@ -236,22 +234,22 @@ if ($filemanager) { $tabs = [ 'list' => [ 'text' => ''.html_print_image( - 'images/eye_show.png', + 'images/see-details@svg.svg', true, [ 'title' => __('Plugins'), - 'class' => 'invert_filter', + 'class' => 'invert_filter main_menu_icon', ] ).'', 'active' => (bool) ($tab != 'Attachments'), ], 'options' => [ 'text' => ''.html_print_image( - 'images/collection.png', + 'images/file-collection@svg.svg', true, [ 'title' => __('Attachments'), - 'class' => 'invert_filter', + 'class' => 'invert_filter main_menu_icon', ] ).'', 'active' => (bool) ($tab == 'Attachments'), @@ -333,35 +331,37 @@ if ($filemanager) { // ===================================================================== $sec = 'gservers'; -if (($create != '') || ($view != '')) { +if (empty($create) === false || empty($view) === false) { enterprise_hook('open_meta_frame'); $management_allowed = is_management_allowed(); - if (defined('METACONSOLE')) { + if (is_metaconsole() === true) { components_meta_print_header(); $sec = 'advanced'; if ($management_allowed === false) { ui_print_warning_message(__('To manage plugin you must activate centralized management')); } } else { - if ($create != '') { - ui_print_page_header( - __('Plugin registration'), - 'images/gm_servers.png', - false, - '', - true - ); - } else { - ui_print_page_header( - __('Plugin update'), - 'images/gm_servers.png', - false, - '', - true - ); - } + // Header. + ui_print_standard_header( + (empty($create) === false) ? __('Plugin registration') : __('Plugin update'), + 'images/gm_servers.png', + false, + '', + true, + [], + [ + [ + 'link' => '', + 'label' => __('Servers'), + ], + [ + 'link' => 'index.php?sec=gservers&sec2=godmode/servers/plugin', + 'label' => __('Plugins'), + ], + ] + ); if ($management_allowed === false) { ui_print_warning_message( @@ -373,66 +373,7 @@ if (($create != '') || ($view != '')) { } } - - if ($create == '') { - $plugin_id = get_parameter('view', ''); - echo "
        "; - } else { - echo ""; - } - - $table = new stdClass(); - $table->width = '100%'; - $table->id = 'table-form'; - $table->class = 'databox filters'; - $table->style = []; - $table->style[0] = 'font-weight: bold'; - $table->style[2] = 'font-weight: bold'; - $table->data = []; - - $data = []; - $data[0] = __('Name'); - $data[1] = ''; - $table->colspan['plugin_name'][1] = 3; - $table->data['plugin_name'] = $data; - - $data = []; - $data[0] = __('Plugin type'); - $fields[0] = __('Standard'); - $fields[1] = __('Nagios'); - $data[1] = html_print_select($fields, 'form_plugin_type', $form_plugin_type, '', '', 0, true); - $table->data['plugin_type'] = $data; - $table->colspan['plugin_type'][1] = 3; - - $data[0] = __('Max. timeout').ui_print_help_tip(__('This value only will be applied if is minor than the server general configuration plugin timeout').'.

        '.__('If you set a 0 seconds timeout, the server plugin timeout will be used'), true); - $data[1] = html_print_extended_select_for_time('form_max_timeout', $form_max_timeout, '', '', '0', false, true); - - $table->data['plugin_timeout'] = $data; - - $data = []; - $data[0] = __('Description'); - $data[1] = ''; - $table->colspan['plugin_desc'][1] = 3; - $table->data['plugin_desc'] = $data; - - $table->width = '100%'; - $table->class = 'databox filters'; - - if (defined('METACONSOLE')) { - $table->head[0] = __('General'); - $table->head_colspan[0] = 4; - $table->headstyle[0] = 'text-align: center'; - html_print_table($table); - } else { - echo '
        '.__('General').''; - html_print_table($table); - echo '
        '; - } - - $table->data = []; - - $plugin_id = get_parameter('view', 0); - + $plugin_id = (int) get_parameter('view'); $locked = true; // If we have plugin id (update mode) and this plugin used by any module or component @@ -447,46 +388,170 @@ if (($create != '') || ($view != '')) { $locked = false; } - $disabled = ''; - if ($locked) { - $disabled = 'readonly="readonly"'; + $disabled = ($locked === true) ? 'readonly="readonly"' : ''; + + if (empty($create) === true) { + $formAction = 'index.php?sec=gservers&sec2=godmode/servers/plugin&tab=$tab&update_plugin=$plugin_id&pure='.$config['pure']; + } else { + $formAction = 'index.php?sec=gservers&sec2=godmode/servers/plugin&tab=$tab&create_plugin=1&pure='.$config['pure']; } + $formPluginType = [ + 0 => __('Standard'), + 1 => __('Nagios'), + ]; + + echo ''; + + $table = new stdClass(); + $table->id = 'table-form'; + $table->class = 'floating_form'; + $table->style = []; + $table->data['plugin_name_captions'] = $data; + $table->style[0] = 'vertical-align: top'; + $table->style[1] = 'vertical-align: top'; + + $table->data = []; + // General title. + $generalTitleContent = []; + $generalTitleContent[] = html_print_div([ 'style' => 'width: 10px; flex: 0 0 auto; margin-right: 5px;}', 'class' => 'section_table_title_line' ], true); + $generalTitleContent[] = html_print_div([ 'class' => 'section_table_title', 'content' => __('General')], true); + $data[0] = html_print_div(['class' => 'flex-row-center', 'content' => implode('', $generalTitleContent) ], true); + $table->data['general_title'] = $data; + + $data = []; + $data[0] = __('Name'); + $table->data['plugin_name_captions'] = $data; + + $data = []; + $data[0] = html_print_input_text('form_name', $form_name, '', 100, 255, true, false, false, '', 'w100p'); + $table->data['plugin_name_inputs'] = $data; + $table->colspan['plugin_name_inputs'][0] = 3; + + + $data = []; + $data[0] = __('Plugin type'); + $data[1] = __('Max. timeout'); + $table->data['plugin_type_timeout_captions'] = $data; + // $table->colspan['plugin_type'][1] = 3; + $data = []; + $data[0] = html_print_select($formPluginType, 'form_plugin_type', $form_plugin_type, '', '', 0, true); + $timeoutContent = []; + $timeoutContent[] = '
        '.html_print_extended_select_for_time('form_max_timeout', $form_max_timeout, '', '', '0', false, true).'
        '; + $timeoutContent[] = ui_print_input_placeholder(__('This value only will be applied if is minor than the server general configuration plugin timeout').'
        '.__('If you set a 0 seconds timeout, the server plugin timeout will be used'), true); + $data[1] = html_print_div( + [ + 'class' => 'flex flex_column', + 'content' => implode('', $timeoutContent), + ], + true + ); + $table->data['plugin_type_timeout_inputs'] = $data; + + $data = []; + $data[0] = __('Description'); + $table->data['plugin_desc_captions'] = $data; + + $data = []; + $data[0] = html_print_textarea('form_description', 4, 50, $form_description, '', true, 'w100p'); + $table->colspan['plugin_desc_inputs'][0] = 3; + $table->data['plugin_desc_inputs'] = $data; + /* + if (is_metaconsole() === true) { + $table->head[0] = __('General'); + $table->head_colspan[0] = 4; + $table->headstyle[0] = 'text-align: center'; + html_print_table($table); + } else { + echo '
        '.__('General').''; + html_print_table($table); + echo '
        '; + } + + html_print_table($table); + + $table->data = []; + */ + + // Command title. + $commandTitleContent = []; + $commandTitleContent[] = html_print_div([ 'style' => 'width: 10px; flex: 0 0 auto; margin-right: 5px;}', 'class' => 'section_table_title_line' ], true); + $commandTitleContent[] = html_print_div([ 'class' => 'section_table_title', 'content' => __('Command')], true); + $data = []; + $data[0] = html_print_div(['class' => 'flex-row-center', 'content' => implode('', $commandTitleContent) ], true); + $table->data['command_title'] = $data; + $data = []; $data[0] = __('Plugin command').ui_print_help_tip(__('Specify interpreter and plugin path. The server needs permissions to run it.'), true); - $data[1] = ''; + $table->data['plugin_command_caption'] = $data; - $data[1] .= ' '; - $data[1] .= html_print_image('images/file.png', true, ['class' => 'invert_filter'], false, true); - $data[1] .= ''; - $table->data['plugin_command'] = $data; + $data = []; + $formExecuteContent = []; + $formExecuteContent[] = html_print_input_text('form_execute', $form_execute, '', 50, 255, true, false, false, '', 'command_component command_advanced_conf w100p'); + $formExecuteContent[] = html_print_anchor( + [ + 'title' => __('Save changes'), + 'href' => 'index.php?sec=gservers&sec2=godmode/servers/plugin&filemanager=1&tab=Attachments&id_plugin='.$form_id, + 'class' => 'mrgn_lft_5px', + 'content' => html_print_image('images/validate.svg', true, ['class' => 'main_menu_icon invert_filter'], false, true), + ], + true + ); + + $data[0] = html_print_div(['class' => 'flex-row-center', 'content' => implode('', $formExecuteContent)], true); + $table->data['plugin_command_inputs'] = $data; + $table->colspan['plugin_command_inputs'][0] = 2; $data = []; $data[0] = __('Plug-in parameters'); - $data[1] = ''; - $table->data['plugin_parameters'] = $data; + $table->data['plugin_parameters_caption'] = $data; + + $data = []; + $data[0] = html_print_input_text( + 'form_parameters', + $parameters, + '', + 100, + 255, + true, + false, + false, + '', + 'command_component command_advanced_conf text_input w100p' + ); + $table->data['plugin_parameters_inputs'] = $data; + $table->colspan['plugin_parameters_inputs'][0] = 2; $data = []; $data[0] = __('Command preview'); - $data[1] = '
        '; - $table->data['plugin_preview'] = $data; + $table->data['plugin_preview_captions'] = $data; + $data = []; - $table->width = '100%'; - $table->class = 'databox filters'; - if (defined('METACONSOLE')) { + $data[0] = html_print_div(['id' => 'command_preview', 'class' => 'mono'], true); + $table->data['plugin_preview_inputs'] = $data; + $table->colspan['plugin_preview_inputs'][0] = 2; + /* + $table->width = '100%'; + $table->class = 'databox filters'; + if (is_metaconsole() === true) { $table->head[0] = __('Command'); $table->head_colspan[0] = 4; $table->headstyle[0] = 'text-align: center'; html_print_table($table); - } else { + } else { echo '
        '.__('Command').''; html_print_table($table); echo '
        '; - } + } + */ + // Parameters macros title. + $macrosTitleContent = []; + $macrosTitleContent[] = html_print_div([ 'style' => 'width: 10px; flex: 0 0 auto; margin-right: 5px;}', 'class' => 'section_table_title_line' ], true); + $macrosTitleContent[] = html_print_div([ 'class' => 'section_table_title', 'content' => __('Parameters macros')], true); $data = []; - - $table->data = []; + $data[0] = html_print_div(['class' => 'flex-row-center', 'content' => implode('', $macrosTitleContent) ], true); + $table->data['parameters_macros_title'] = $data; $macros = json_decode($macros, true); @@ -494,8 +559,8 @@ if (($create != '') || ($view != '')) { $next_name_number = 9; $i = 1; while (1) { - // Always print at least one macro - if ((!isset($macros[$i]) || $macros[$i]['desc'] == '') && $i > 1) { + // Always print at least one macro. + if ((isset($macros[$i]) === false || $macros[$i]['desc'] == '') && $i > 1) { break; } @@ -617,9 +682,15 @@ if (($create != '') || ($view != '')) { $table->headstyle[0] = 'text-align: center'; html_print_table($table); } else { - echo '
        '.''.__('Parameters macros').''; - html_print_table($table); - echo '
        '; + // echo '
        '.''.__('Parameters macros').''; + html_print_div( + [ + 'class' => 'info_table', + 'content' => html_print_table($table, true), + ] + ); + + // echo '
        '; } echo '
        '; @@ -658,22 +729,22 @@ if (($create != '') || ($view != '')) { $tabs = [ 'list' => [ 'text' => ''.html_print_image( - 'images/eye_show.png', + 'images/see-details@svg.svg', true, [ 'title' => __('Plugins'), - 'class' => 'invert_filter', + 'class' => 'invert_filter main_menu_icon', ] ).'', 'active' => (bool) ($tab != 'Attachments'), ], 'options' => [ 'text' => ''.html_print_image( - 'images/collection.png', + 'images/file-collection@svg.svg', true, [ 'title' => __('Attachments'), - 'class' => 'invert_filter', + 'class' => 'invert_filter main_menu_icon', ] ).'', 'active' => (bool) ($tab == 'Attachments'), @@ -884,55 +955,32 @@ if (($create != '') || ($view != '')) { $rows = db_get_all_rows_sql('SELECT * FROM tplugin ORDER BY name'); if ($rows !== false) { - if (defined('METACONSOLE')) { - echo '
        '; - } else { - echo '
        '; + $pluginTable = new stdClass(); + $pluginTable->id = 'plugin_table'; + $pluginTable->class = (is_metaconsole() === true) ? 'databox data' : 'info_table m2020'; + + $pluginTable->head = []; + $pluginTable->head[0] = __('Name'); + $pluginTable->head[1] = __('Type'); + $pluginTable->head[2] = __('Command'); + if ($management_allowed === true) { + $pluginTable->head[3] = ''.__('Op.').''; } - echo ''; - echo ''; - echo ''; - echo ''; - if ($management_allowed) { - echo "'; - } + $pluginTable->data = []; - echo ''; + foreach ($rows as $k => $row) { + if ($management_allowed === true) { + $tableActionButtons = []; + $pluginNameContent = html_print_anchor( + [ + 'href' => 'index.php?sec=$sec&sec2=godmode/servers/plugin&view='.$row['id'].'&tab=plugins&pure='.$config['pure'], + 'content' => $row['name'], + ], + true + ); - $color = 0; - - foreach ($rows as $row) { - if ($color == 1) { - $tdcolor = 'datos'; - $color = 0; - } else { - $tdcolor = 'datos2'; - $color = 1; - } - - echo ''; - echo "'; - echo "'; - if ($management_allowed) { - echo "'; + $tableActionButtons[] = html_print_anchor( + [ + 'href' => 'index.php?sec=$sec&sec2=godmode/servers/plugin&tab=$tab&view='.$row['id'].'&tab=plugins&pure='.$config['pure'], + 'content' => html_print_image( + 'images/edit.svg', + true, + [ + 'title' => __('Edit'), + 'class' => 'invert_filter main_menu_icon ', + ] + ), + ], + true + ); + + if ((bool) $row['no_delete'] === false) { + $tableActionButtons[] = html_print_anchor( + [ + 'href' => 'index.php?sec=$sec&sec2=godmode/servers/plugin&tab=$tab&kill_plugin='.$row['id'].'&tab=plugins&pure='.$config['pure'], + 'onClick' => 'javascript: if (!confirm(\''.__('All the modules that are using this plugin will be deleted').'. '.__('Are you sure?').'\')) return false;', + 'content' => html_print_image( + 'images/delete.svg', + true, + [ + 'title' => __('Delete'), + 'class' => 'invert_filter main_menu_icon', + ] + ), + ], + true + ); + } + } else { + $pluginNameContent = $row['name']; } - echo ''; + $pluginTable->data[$k][0] = $pluginNameContent; + $pluginTable->data[$k][1] = ((int) $row['plugin_type'] === 0) ? __('Standard') : __('Nagios'); + $pluginTable->data[$k][2] = $row['execute']; + + if ($management_allowed === true) { + $pluginTable->data[$k][3] = html_print_div( + [ + 'class' => 'table_action_buttons', + 'content' => implode('', $tableActionButtons), + ], + true + ); + } } - echo '
        '.__('Name').''.__('Type').''.__('Command').'".''.__('Op.').''.'
        "; - if ($management_allowed) { - echo ""; - } - - echo $row['name']; - echo '"; - if ($row['plugin_type'] == 0) { - echo __('Standard'); - } else { - echo __('Nagios'); - } - - echo ""; - echo $row['execute']; - echo '"; - - // Show it is locket + // Show it is locket. $modules_using_plugin = db_get_value_filter( 'count(*)', 'tagente_modulo', @@ -947,49 +995,93 @@ if (($create != '') || ($view != '')) { ['id_plugin' => $row['id']] ); if (($components_using_plugin + $modules_using_plugin) > 0) { - echo ''; - html_print_image('images/lock_mc.png', false, ['class' => 'invert_filter']); - echo ''; - } - - echo "".html_print_image( - 'images/config.png', - true, - [ - 'title' => __('Edit'), - 'class' => 'invert_filter', - ] - ).'  '; - if ((bool) $row['no_delete'] === false) { - echo "".html_print_image( - 'images/cross.png', - true, + $tableActionButtons[] = html_print_anchor( [ - 'border' => '0', - 'class' => 'invert_filter', - ] - ).''; + 'href' => 'javascript: show_locked_dialog('.$row['id'].', \''.$row['name'].'\');', + 'content' => html_print_image( + 'images/policy@svg.svg', + true, + [ + 'title' => __('Lock'), + 'class' => 'main_menu_icon invert_filter', + ] + ), + ], + true + ); } - echo '
        '; + html_print_table($pluginTable); } else { ui_print_info_message(['no_close' => true, 'message' => __('There are no plugins in the system') ]); } - if ($management_allowed) { - echo ""; + if ($management_allowed === true) { + echo ''; - echo '
        '; - echo ""; - echo ""; - echo '
        '; - echo '
        + 'link', + 'style' => 'display:none', + ]; + } else { + $style_create = [ 'mode' => 'link' ]; + } + + if (!empty($style_button_edit_custom_graph)) { + $style_edit = [ + 'mode' => 'link', + 'style' => 'display:none', + ]; + } else { + $style_edit = [ 'mode' => 'link' ]; + } + html_print_button( __('Create'), 'create_graph', false, - 'create_custom_graph();', - 'class="sub add" '.$style_button_create_custom_graph + 'create_custom_graph()', + $style_create ); html_print_button( __('Edit'), 'edit_graph', false, - 'edit_custom_graph();', - 'class="sub config" '.$style_button_edit_custom_graph + 'edit_custom_graph()', + $style_edit ); ?>
        '; - if ($create != '') { - $button = html_print_submit_button( + $buttons = ''; + + if (empty($create) === false) { + $buttons .= html_print_submit_button( __('Create'), 'crtbutton', false, @@ -674,7 +676,7 @@ if (empty($create) === false || empty($view) === false) { true ); } else { - $button = html_print_submit_button( + $buttons .= html_print_submit_button( __('Update'), 'uptbutton', false, @@ -683,8 +685,14 @@ if (empty($create) === false || empty($view) === false) { ); } + $buttons .= html_print_go_back_button( + 'index.php?sec=gservers&sec2=godmode/servers/plugin', + ['button_class' => ''], + true + ); + html_print_action_buttons( - $button + $buttons ); echo '
        '; diff --git a/pandora_console/include/class/SnmpConsole.class.php b/pandora_console/include/class/SnmpConsole.class.php index c84775d4ed..5999479c64 100644 --- a/pandora_console/include/class/SnmpConsole.class.php +++ b/pandora_console/include/class/SnmpConsole.class.php @@ -183,29 +183,29 @@ class SnmpConsole extends HTML if (!isset($config['pure']) || $config['pure'] === false) { $statistics['text'] = ''.html_print_image( - 'images/op_reporting.png', + 'images/logs@svg.svg', true, [ 'title' => __('Statistics'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ).''; $list['text'] = ''.html_print_image( - 'images/op_snmp.png', + 'images/SNMP-network-numeric-data@svg.svg', true, [ 'title' => __('List'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ).''; $list['active'] = true; $screen['text'] = ''.html_print_image( - 'images/full_screen.png', + 'images/fullscreen@svg.svg', true, [ - 'title' => __('List'), - 'class' => 'invert_filter', + 'title' => __('View in full screen'), + 'class' => 'main_menu_icon invert_filter', ] ).''; @@ -242,11 +242,11 @@ class SnmpConsole extends HTML echo ''; echo html_print_image( - 'images/normal_screen.png', + 'images/exit_fullscreen@svg.svg', true, [ 'title' => __('Exit fullscreen'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ); echo ''; @@ -844,7 +844,7 @@ class SnmpConsole extends HTML $tmp->snmp_agent .= ''.$tmp->source.''; } else { $tmp->snmp_agent .= ''; } diff --git a/pandora_console/include/functions_filemanager.php b/pandora_console/include/functions_filemanager.php index 1f1f57c832..0012804398 100644 --- a/pandora_console/include/functions_filemanager.php +++ b/pandora_console/include/functions_filemanager.php @@ -744,8 +744,7 @@ function filemanager_file_explorer( // Actions buttons // Delete button. - $data[4] = ''; - $data[4] .= ''; + $data[4] = '
        '; $typefile = array_pop(explode('.', $fileinfo['name'])); if (is_writable($fileinfo['realpath']) === true && (is_dir($fileinfo['realpath']) === false || count(scandir($fileinfo['realpath'])) < 3) @@ -774,7 +773,7 @@ function filemanager_file_explorer( && ($typefile !== 'iso') && ($typefile !== 'docx') && ($typefile !== 'doc') && ($fileinfo['mime'] != MIME_DIR) ) { $hash = md5($fileinfo['realpath'].$config['server_unique_identifier']); - $data[4] .= "".html_print_image('images/edit.png', true, ['style' => 'margin-top: 2px;', 'title' => __('Edit file'), 'class' => 'invert_filter']).''; + $data[4] .= "".html_print_image('images/edit.svg', true, ['style' => 'margin-top: 2px;', 'title' => __('Edit file'), 'class' => 'main_menu_icon invert_filter']).''; } } } @@ -794,7 +793,7 @@ function filemanager_file_explorer( $data[4] .= ''.html_print_image('images/enable.svg', true, ['style' => 'margin-top: 2px;', 'title' => __('Real path'), 'class' => 'invert_filter main_menu_icon']).''; } - $data[4] .= ''; + $data[4] .= '
        '; array_push($table->data, $data); } @@ -983,7 +982,7 @@ function filemanager_file_explorer(
        "; if (isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] == 'on' || $_SERVER['SERVER_NAME'] == 'localhost' || $_SERVER['SERVER_NAME'] == '127.0.0.1') { - $modal_real_path .= "
        ".html_print_submit_button(__('Copy'), 'submit', false, 'class="sub next"', true).'
        '; + $modal_real_path .= "
        ".html_print_submit_button(__('Copy'), 'submit', false, ['icon' => 'wand', 'mode' => 'mini'], true).'
        '; } html_print_div( @@ -997,7 +996,7 @@ function filemanager_file_explorer( echo '
        '; } else { echo "
        "; - echo "".__('The directory is read-only'); + echo "".__('The directory is read-only'); echo '
        '; } } diff --git a/pandora_console/include/styles/tables.css b/pandora_console/include/styles/tables.css index 7fbf593d16..4383e02ea5 100644 --- a/pandora_console/include/styles/tables.css +++ b/pandora_console/include/styles/tables.css @@ -235,7 +235,8 @@ .table_action_buttons > a, .table_action_buttons > img, -.table_action_buttons > button { +.table_action_buttons > button, +.table_action_buttons > form { visibility: hidden; } .info_table > tbody > tr:hover { @@ -246,7 +247,8 @@ .info_table > tbody > tr:hover .table_action_buttons > a, .info_table > tbody > tr:hover .table_action_buttons > img, -.info_table > tbody > tr:hover .table_action_buttons > button { +.info_table > tbody > tr:hover .table_action_buttons > button, +.info_table > tbody > tr:hover .table_action_buttons > form { visibility: visible; } diff --git a/pandora_console/operation/snmpconsole/snmp_browser.php b/pandora_console/operation/snmpconsole/snmp_browser.php index 3bcb2be975..9831d7ba64 100644 --- a/pandora_console/operation/snmpconsole/snmp_browser.php +++ b/pandora_console/operation/snmpconsole/snmp_browser.php @@ -50,11 +50,11 @@ if ($config['pure']) { // Windowed. $link['text'] = ''; $link['text'] .= html_print_image( - 'images/normal_screen.png', + 'images/exit_fullscreen@svg.svg', true, [ 'title' => __('Normal screen'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ); $link['text'] .= ''; @@ -62,11 +62,11 @@ if ($config['pure']) { // Fullscreen. $link['text'] = ''; $link['text'] .= html_print_image( - 'images/full_screen.png', + 'images/fullscreen@svg.svg', true, [ 'title' => __('Full screen'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ); $link['text'] .= ''; diff --git a/pandora_console/operation/snmpconsole/snmp_statistics.php b/pandora_console/operation/snmpconsole/snmp_statistics.php index 56109aa04c..0ebc548496 100755 --- a/pandora_console/operation/snmpconsole/snmp_statistics.php +++ b/pandora_console/operation/snmpconsole/snmp_statistics.php @@ -39,20 +39,20 @@ $refr = (int) get_parameter('refr', 0); $fullscreen = []; if ($config['pure']) { $fullscreen['text'] = ''.html_print_image( - 'images/normal_screen.png', + 'images/exit_fullscreen@svg.svg', true, [ 'title' => __('Normal screen'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ).''; } else { $fullscreen['text'] = ''.html_print_image( - 'images/full_screen.png', + 'images/fullscreen@svg.svg', true, [ 'title' => __('Full screen'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ).''; } @@ -60,11 +60,11 @@ if ($config['pure']) { // List $list = []; $list['text'] = ''.html_print_image( - 'images/op_snmp.png', + 'images/SNMP-network-numeric-data@svg.svg', true, [ 'title' => __('List'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ).''; @@ -72,11 +72,11 @@ $list['text'] = ''.html_print_image( - 'images/op_reporting.png', + 'images/logs@svg.svg', true, [ 'title' => __('Statistics'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ).''; diff --git a/pandora_console/operation/snmpconsole/snmp_view.php b/pandora_console/operation/snmpconsole/snmp_view.php index 9f0f9e44f8..f5c967972c 100755 --- a/pandora_console/operation/snmpconsole/snmp_view.php +++ b/pandora_console/operation/snmpconsole/snmp_view.php @@ -14,7 +14,7 @@ * |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______| * * ============================================================================ - * Copyright (c) 2005-2022 Artica Soluciones Tecnologicas + * Copyright (c) 2005-2023 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 From b13892ecdbb2bd3e59700f31de1243ea6e8c1e66 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Tue, 7 Mar 2023 17:37:01 +0100 Subject: [PATCH 524/563] Users connected view --- .../extensions/users_connected.php | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/pandora_console/extensions/users_connected.php b/pandora_console/extensions/users_connected.php index 40b17f4903..21c319065b 100644 --- a/pandora_console/extensions/users_connected.php +++ b/pandora_console/extensions/users_connected.php @@ -34,7 +34,24 @@ function users_extension_main_god($god=true) } // Header. - ui_print_page_header(__('Users connected'), $image, false, '', $god); + ui_print_standard_header( + __('List of users connected'), + $image, + false, + '', + $god, + [], + [ + [ + 'link' => '', + 'label' => __('Workspace'), + ], + [ + 'link' => '', + 'label' => __('Users connected'), + ], + ] + ); $check_profile = db_get_row('tusuario_perfil', 'id_usuario', $config['id_user'], 'id_up'); if ($check_profile === false && !users_is_admin()) { From 651469b562b4bf271a6406b303433fb79eb35b20 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Tue, 7 Mar 2023 17:37:33 +0100 Subject: [PATCH 525/563] Users connected view --- .../extensions/users_connected.php | 39 +++++++++++++------ 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/pandora_console/extensions/users_connected.php b/pandora_console/extensions/users_connected.php index 21c319065b..ad6282c598 100644 --- a/pandora_console/extensions/users_connected.php +++ b/pandora_console/extensions/users_connected.php @@ -1,16 +1,33 @@ Date: Tue, 7 Mar 2023 17:50:03 +0100 Subject: [PATCH 526/563] User edit notifications --- pandora_console/operation/users/user_edit_header.php | 12 ++++++------ .../operation/users/user_edit_notifications.php | 9 +++++---- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/pandora_console/operation/users/user_edit_header.php b/pandora_console/operation/users/user_edit_header.php index ea698e1355..50cb5c52fc 100644 --- a/pandora_console/operation/users/user_edit_header.php +++ b/pandora_console/operation/users/user_edit_header.php @@ -77,28 +77,28 @@ if (is_metaconsole()) { user_meta_print_header(); $urls['main'] = 'index.php?sec=advanced&sec2=advanced/users_setup&tab=user_edit'; } else { - $urls['main'] = 'index.php?sec=workspace&sec2=operation/users/user_edit'; + $urls['main'] = 'index.php?sec=gusuarios&sec2=godmode/users/user_list'; $urls['notifications'] = 'index.php?sec=workspace&sec2=operation/users/user_edit_notifications'; $buttons = [ 'main' => [ - 'active' => $_GET['sec2'] === 'operation/users/user_edit', + 'active' => $_GET['sec2'] === 'godmode/users/user_list&tab=user&pure=0', 'text' => "".html_print_image( - 'images/user.png', + 'images/user.svg', true, [ 'title' => __('User management'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ).'', ], 'notifications' => [ 'active' => $_GET['sec2'] === 'operation/users/user_edit_notifications', 'text' => "".html_print_image( - 'images/alerts_template.png', + 'images/alert@svg.svg', true, [ 'title' => __('User notifications'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ).'', ], diff --git a/pandora_console/operation/users/user_edit_notifications.php b/pandora_console/operation/users/user_edit_notifications.php index 4228c16543..e511eb0b92 100644 --- a/pandora_console/operation/users/user_edit_notifications.php +++ b/pandora_console/operation/users/user_edit_notifications.php @@ -15,7 +15,7 @@ * |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______| * * ============================================================================ - * Copyright (c) 2005-2021 Artica Soluciones Tecnologicas + * Copyright (c) 2005-2023 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 @@ -58,7 +58,7 @@ if (get_parameter('change_label', 0)) { } -echo '
        +echo '
        '.__('Enable').'
        @@ -91,8 +91,9 @@ foreach ($sources as $source) { } if ((bool) $disabled_flag === true) { - $s = __('Controls have been disabled by the system administrator'); - echo ''.$s.''; + ui_print_warning_message( + __('Controls have been disabled by the system administrator') + ); } echo '
        '; From 4af67db415e2528ced9ab3bb6e1cf41726f102f2 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Tue, 7 Mar 2023 18:10:07 +0100 Subject: [PATCH 527/563] Export data view --- .../operation/agentes/exportdata.php | 312 +++++++++++------- 1 file changed, 185 insertions(+), 127 deletions(-) diff --git a/pandora_console/operation/agentes/exportdata.php b/pandora_console/operation/agentes/exportdata.php index 604131d888..910a46acb2 100644 --- a/pandora_console/operation/agentes/exportdata.php +++ b/pandora_console/operation/agentes/exportdata.php @@ -1,10 +1,10 @@ '', + 'label' => __('Tools'), + ], + [ + 'link' => '', + 'label' => __('Export data'), + ], + ] +); $group = get_parameter_post('group', 0); $agentName = get_parameter_post('agent', 0); @@ -220,48 +242,10 @@ if (!empty($export_btn) && !empty($module)) { } if (empty($export_btn) || $show_form) { - echo '
        '; - - $table = new stdClass(); - $table->width = '100%'; - $table->border = 0; - $table->cellspacing = 3; - $table->cellpadding = 5; - $table->class = 'databox filters'; - $table->style[0] = 'vertical-align: top;'; - - $table->data = []; - - // Group selector - $table->data[0][0] = ''.__('Group').''; - $groups = users_get_groups($config['id_user'], 'RR', users_can_manage_group_all()); - $table->data[0][1] = '
        '.html_print_select_groups( - $config['id_user'], - 'RR', - true, - 'group', - $group, - '', - '', - 0, - true, - false, - true, - '', - false - ).'
        '; - - // Agent selector. - $table->data[1][0] = ''.__('Source agent').''; - $filter = []; - if ($group > 0) { - $filter['id_grupo'] = (array) $group; - } else { - $filter['id_grupo'] = array_keys($groups); - } + $filter['id_grupo'] = ($group > 0) ? (array) $group : array_keys($groups); $agents = []; $rows = agents_get_agents($filter, false, 'RR'); @@ -286,11 +270,6 @@ if (empty($export_btn) || $show_form) { $params['add_none_module'] = false; $params['size'] = 38; $params['selectbox_id'] = 'module_arr'; - $table->data[1][1] = ui_print_agent_autocomplete_input($params); - - // Module selector. - $table->data[2][0] = ''.__('Modules').''; - $table->data[2][0] .= ui_print_help_tip(__('No modules of type string. You can not calculate their average'), true); if ($agent > 0) { $modules = agents_get_modules($agent); @@ -325,91 +304,170 @@ if (empty($export_btn) || $show_form) { $disabled_export_button = true; } - $table->data[2][1] = html_print_select($modules, 'module_arr[]', array_keys($modules), '', '', 0, true, true, true, 'w250px', false); - - // Start date selector. - $table->data[3][0] = ''.__('Begin date').''; - - $table->data[3][1] = html_print_input_text( - 'start_date', - date('Y-m-d', (get_system_time() - SECONDS_1DAY)), - false, - 13, - 10, - true - ); - $table->data[3][1] .= html_print_image( - 'images/calendar_view_day.png', - true, - [ - 'alt' => 'calendar', - 'onclick' => "scwShow(scwID('text-start_date'),this);", - 'class' => 'invert_filter', - ] - ); - $table->data[3][1] .= html_print_input_text( - 'start_time', - date('H:i:s', (get_system_time() - SECONDS_1DAY)), - false, - 10, - 9, - true - ); - - // End date selector. - $table->data[4][0] = ''.__('End date').''; - $table->data[4][1] = html_print_input_text( - 'end_date', - date('Y-m-d', get_system_time()), - false, - 13, - 10, - true - ); - $table->data[4][1] .= html_print_image( - 'images/calendar_view_day.png', - true, - [ - 'alt' => 'calendar', - 'onclick' => "scwShow(scwID('text-end_date'),this);", - 'class' => 'invert_filter', - ] - ); - $table->data[4][1] .= html_print_input_text( - 'end_time', - date('H:i:s', get_system_time()), - false, - 10, - 9, - true - ); - - // Export type. - $table->data[5][0] = ''.__('Export type').''; - $export_types = []; $export_types['data'] = __('Data table'); $export_types['csv'] = __('CSV'); $export_types['excel'] = __('MS Excel'); $export_types['avg'] = __('Average per hour/day'); - $table->data[5][1] = html_print_select($export_types, 'export_type', $export_type, '', '', 0, true, false, true, 'w250px', false); + + echo ''; + + $table = new stdClass(); + $table->width = '100%'; + $table->border = 0; + $table->cellspacing = 3; + $table->cellpadding = 5; + $table->class = 'databox filter-table-adv'; + $table->style[0] = 'vertical-align: top;'; + + $table->data = []; + + // Group selector. + $table->data[0][] = html_print_label_input_block( + __('Group'), + html_print_select_groups( + $config['id_user'], + 'RR', + true, + 'group', + $group, + '', + '', + 0, + true, + false, + true, + '', + false + ) + ); + + // Agent selector. + $table->data[0][] = html_print_label_input_block( + __('Source agent'), + ui_print_agent_autocomplete_input($params) + ); + + // Module selector. + $table->data[1][] = html_print_label_input_block( + __('Modules'), + html_print_select( + $modules, + 'module_arr[]', + array_keys($modules), + '', + '', + 0, + true, + true, + true, + 'w100p', + false + ).ui_print_input_placeholder( + __('No modules of type string. You can not calculate their average'), + true + ) + ); + + // Export type. + $table->data[1][] = html_print_label_input_block( + __('Export type'), + html_print_select( + $export_types, + 'export_type', + $export_type, + '', + '', + 0, + true, + false, + true, + 'w100p', + false + ) + ); + + // Start date selector. + $table->data[2][] = html_print_label_input_block( + __('Begin date'), + html_print_div( + [ + 'class' => 'flex-content', + 'content' => html_print_input_text( + 'start_date', + date('Y-m-d', (get_system_time() - SECONDS_1DAY)), + false, + 13, + 10, + true + ).html_print_image( + 'images/calendar_view_day.png', + true, + [ + 'alt' => 'calendar', + 'onclick' => "scwShow(scwID('text-start_date'),this);", + 'class' => 'main_menu_icon invert_filter', + ] + ).html_print_input_text( + 'start_time', + date('H:i:s', (get_system_time() - SECONDS_1DAY)), + false, + 10, + 9, + true + ), + ], + true + ) + ); + + // End date selector. + $table->data[2][] = html_print_label_input_block( + __('End date'), + html_print_div( + [ + 'class' => 'flex-content', + 'content' => html_print_input_text( + 'end_date', + date('Y-m-d', get_system_time()), + false, + 13, + 10, + true + ).html_print_image( + 'images/calendar_view_day.png', + true, + [ + 'alt' => 'calendar', + 'onclick' => "scwShow(scwID('text-end_date'),this);", + 'class' => 'main_menu_icon invert_filter', + ] + ).html_print_input_text( + 'end_time', + date('H:i:s', get_system_time()), + false, + 10, + 9, + true + ), + ], + true + ), + ); html_print_table($table); // Submit button. - html_print_div( - [ - 'class' => 'action-buttons', - 'content' => html_print_button( - __('Export'), - 'export_btn', - false, - 'change_action()', - ['icon' => 'wand'], - true - ), - ] + html_print_action_buttons( + html_print_button( + __('Export'), + 'export_btn', + false, + 'change_action()', + ['icon' => 'wand'], + true + ) ); echo '
        '; From 5017878701e736b1dd028811ba607cbd6f7920b1 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Tue, 7 Mar 2023 22:05:06 +0100 Subject: [PATCH 528/563] Messages view --- .../operation/messages/message_edit.php | 149 ++++++++++-------- .../operation/messages/message_list.php | 86 ++++++---- 2 files changed, 141 insertions(+), 94 deletions(-) diff --git a/pandora_console/operation/messages/message_edit.php b/pandora_console/operation/messages/message_edit.php index 105a9560de..0e232788e7 100644 --- a/pandora_console/operation/messages/message_edit.php +++ b/pandora_console/operation/messages/message_edit.php @@ -14,7 +14,7 @@ * |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______| * * ============================================================================ - * Copyright (c) 2005-2022 Artica Soluciones Tecnologicas + * Copyright (c) 2005-2023 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 @@ -52,7 +52,7 @@ $buttons['message_list'] = [ true, [ 'title' => __('Received messages'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ).'', ]; @@ -64,7 +64,7 @@ $buttons['sent_messages'] = [ true, [ 'title' => __('Sent messages'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ).'', ]; @@ -76,7 +76,7 @@ $buttons['create_message'] = [ true, [ 'title' => __('Create message'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ).'', ]; @@ -218,11 +218,8 @@ if ($read_message) { true ); - html_print_div( - [ - 'class' => 'action-buttons', - 'content' => $outputButtons, - ], + html_print_action_buttons( + $outputButtons ); return; @@ -264,18 +261,6 @@ if ($send_mes === true) { // User info. $own_info = get_user_info($config['id_user']); -$table = new stdClass(); -$table->width = '100%'; -$table->class = 'databox filters'; - -$table->data = []; - -$table->data[0][0] = __('Sender'); - -$table->data[0][1] = (empty($own_info['fullname']) === false) ? $own_info['fullname'] : $config['id_user']; - -$table->data[1][0] = __('Destination'); - $is_admin = (bool) db_get_value( 'is_admin', 'tusuario', @@ -305,15 +290,29 @@ foreach ($users_full as $user_id => $user_info) { $users[$user_info['id_user']] = (empty($user_info['fullname']) === true) ? $user_info['id_user'] : $user_info['fullname']; } +$table = new stdClass(); +$table->id = 'send_message_table'; +$table->width = '100%'; +$table->class = 'databox max_floating_element_size filter-table-adv'; +$table->style = []; +$table->style[0] = 'width: 30%'; +$table->style[1] = 'width: 70%'; +$table->data = []; + +$table->data[0][] = html_print_label_input_block( + __('Sender'), + ''.((empty($own_info['fullname']) === false) ? $own_info['fullname'] : $config['id_user']).'' +); + // Check if the user to reply is in the list, if not add reply user. if ($reply === true) { - $table->data[1][1] = (array_key_exists($dst_user, $users) === true) ? $users[$dst_user] : $dst_user; - $table->data[1][1] .= html_print_input_hidden( + $destinationInputs = (array_key_exists($dst_user, $users) === true) ? $users[$dst_user] : $dst_user; + $destinationInputs .= html_print_input_hidden( 'dst_user', $dst_user, true ); - $table->data[1][1] .= html_print_input_hidden( + $destinationInputs .= html_print_input_hidden( 'replied', '1', true @@ -324,21 +323,27 @@ if ($reply === true) { $groups = users_get_groups($config['id_user'], 'AR'); // Get a list of all groups. - $table->data[1][1] = html_print_select( - $users, - 'dst_user', - $dst_user, - 'changeStatusOtherSelect(\'dst_user\', \'dst_group\')', - __('Select user'), - false, - true, - false, - '' - ); - $table->data[1][1] .= '  '.__('OR').'  '; - $table->data[1][1] .= html_print_div( + $destinationInputs = html_print_div( [ - 'class' => 'w250px inline', + 'class' => 'select_users mrgn_right_5px', + 'content' => html_print_select( + $users, + 'dst_user', + $dst_user, + 'changeStatusOtherSelect(\'dst_user\', \'dst_group\')', + __('Select user'), + false, + true, + false, + '' + ), + ], + true + ); + $destinationInputs .= __('OR'); + $destinationInputs .= html_print_div( + [ + 'class' => 'mrgn_lft_5px', 'content' => html_print_select_groups( $config['id_user'], 'AR', @@ -355,24 +360,41 @@ if ($reply === true) { ); } -$table->data[2][0] = __('Subject'); -$table->data[2][1] = html_print_input_text( - 'subject', - $subject, - '', - 50, - 70, - true +$table->data[0][] = html_print_label_input_block( + __('Destination'), + html_print_div( + [ + 'class' => 'flex-content-left', + 'content' => $destinationInputs, + ], + true + ) ); -$table->data[3][0] = __('Message'); -$table->data[3][1] = html_print_textarea( - 'message', - 15, - 255, - $message, - '', - true +$table->colspan[1][] = 2; +$table->data[1][] = html_print_label_input_block( + __('Subject'), + html_print_input_text( + 'subject', + $subject, + '', + 50, + 70, + true + ) +); + +$table->colspan[2][] = 2; +$table->data[2][] = html_print_label_input_block( + __('Message'), + html_print_textarea( + 'message', + 15, + 50, + $message, + '', + true + ) ); $jsOutput = ''; @@ -396,17 +418,14 @@ echo '
        '; - $data[0] .= html_print_image('images/email_inbox.png', true, ['border' => 0, 'title' => __('Click to read'), 'class' => 'invert_filter']); - $data[0] .= ''; + $pathRead = 'index.php?sec=message_list&sec2=operation/messages/message_edit&read_message=1&show_sent=1&id_message='.$message_id; + $titleRead = __('Click to read'); } else { - $data[0] .= ''; - $data[0] .= html_print_image('images/email_inbox.png', true, ['border' => 0, 'title' => __('Mark as unread'), 'class' => 'invert_filter']); - $data[0] .= ''; + $pathRead = 'index.php?sec=message_list&sec2=operation/messages/message_list&mark_unread=1&id_message='.$message_id; + $titleRead = __('Mark as unread'); } } else { if ($show_sent === true) { - $data[0] .= ''; - $data[0] .= html_print_image('images/email_inbox.png', true, ['border' => 0, 'title' => __('Message unread - click to read'), 'class' => 'invert_filter']); - $data[0] .= ''; + $pathRead = 'index.php?sec=message_list&sec2=operation/messages/message_edit&read_message=1&show_sent=1&id_message='.$message_id; + $titleRead = __('Message unread - click to read'); } else { - $data[0] .= ''; - $data[0] .= html_print_image('images/email_inbox.png', true, ['border' => 0, 'title' => __('Message unread - click to read'), 'class' => 'invert_filter']); - $data[0] .= ''; + $pathRead = 'index.php?sec=message_list&sec2=operation/messages/message_edit&read_message=1&id_message='.$message_id; + $titleRead = __('Message unread - click to read'); } } + $data[0] = html_print_anchor( + [ + 'href' => $pathRead, + 'content' => html_print_image( + 'images/email_inbox.png', + true, + [ + 'title' => $titleRead, + 'class' => 'main_menu_icon invert_filter', + ], + ), + ], + true + ); + if ($show_sent === true) { $dest_user = get_user_fullname($message['dest']); if (!$dest_user) { @@ -243,18 +254,24 @@ if (empty($messages) === true) { } if ($show_sent === true) { - $data[2] = ''; + $pathSubject = 'index.php?sec=message_list&sec2=operation/messages/message_edit&read_message=1&show_sent=1&id_message='.$message_id; } else { - $data[2] = ''; + $pathSubject = 'index.php?sec=message_list&sec2=operation/messages/message_edit&read_message=1&id_message='.$message_id; } - if ($message['subject'] == '') { - $data[2] .= __('No Subject'); - } else { - $data[2] .= $message['subject']; + $contentSubject = (empty($message['subject']) === true) ? __('No Subject') : $message['subject']; + + if ((int) $message['read'] !== 1) { + $contentSubject = ''.$contentSubject.''; } - $data[2] .= ''; + $data[2] .= html_print_anchor( + [ + 'href' => $pathSubject, + 'content' => $contentSubject, + ], + true + ); $data[3] = ui_print_timestamp( $message['timestamp'], @@ -264,13 +281,27 @@ if (empty($messages) === true) { $table->cellclass[][4] = 'table_action_buttons'; if ($show_sent === true) { - $data[4] = ''.html_print_image('images/cross.png', true, ['title' => __('Delete'), 'class' => 'invert_filter']).''; + $pathDelete = 'index.php?sec=message_list&sec2=operation/messages/message_list&show_sent=1&delete_message=1&id='.$message_id; } else { - $data[4] = ''.html_print_image('images/cross.png', true, ['title' => __('Delete'), 'class' => 'invert_filter']).''; + $pathDelete = 'index.php?sec=message_list&sec2=operation/messages/message_list&delete_message=1&id='.$message_id; } + $data[4] = html_print_anchor( + [ + 'href' => $pathDelete, + 'content' => html_print_image( + 'images/delete.svg', + true, + [ + 'title' => __('Delete'), + 'class' => 'main_menu_icon invert_filter', + ] + ), + 'onClick' => 'javascript:if (!confirm(\''.__('Are you sure?').'\')) return false;', + ], + true + ); + array_push($table->data, $data); } } @@ -312,11 +343,8 @@ if (empty($messages) === false) { echo '
        '; - html_print_div( - [ - 'class' => 'action-buttons', - 'content' => $outputButton, - ] + html_print_action_buttons( + $outputButton ); ?> From eefb62e520fab8c2b199a2e702ff3ff108642cea Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Tue, 7 Mar 2023 22:45:48 +0100 Subject: [PATCH 529/563] Input improve --- pandora_console/include/functions_html.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index e9e60f3418..be9ed5d1a8 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -4903,7 +4903,8 @@ function html_print_autocomplete_modules( $filter=[], $return=false, $id_agent_module=0, - $size='30' + $size='30', + $underInputTip=false ) { global $config; @@ -4960,7 +4961,11 @@ function html_print_autocomplete_modules( html_print_input_hidden($name.'_hidden', $id_agent_module); if (is_metaconsole() === false) { - ui_print_help_tip(__('Type at least two characters to search the module.'), false); + if ($underInputTip === true) { + ui_print_input_placeholder(__('Type at least two characters to search the module.'), false); + } else { + ui_print_help_tip(__('Type at least two characters to search the module.'), false); + } } $javascript_ajax_page = ui_get_full_url('ajax.php', false, false, false); From 27357b16b632a40bd58c771c6f8e6a85f86feb7e Mon Sep 17 00:00:00 2001 From: artica Date: Wed, 8 Mar 2023 01:00:21 +0100 Subject: [PATCH 530/563] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index d48173512f..7d9cee8f9c 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.769-230307 +Version: 7.0NG.769-230308 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index cb6b963504..53c9f200aa 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.769-230307" +pandora_version="7.0NG.769-230308" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index 012a228cd2..492ec37320 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1023,7 +1023,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.769'; -use constant AGENT_BUILD => '230307'; +use constant AGENT_BUILD => '230308'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index 26931473af..77859b1dde 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_agent_linux %define version 7.0NG.769 -%define release 230307 +%define release 230308 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 329768dfa7..857f141c94 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_agent_linux %define version 7.0NG.769 -%define release 230307 +%define release 230308 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index 1a32864bd8..79cc3133b3 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.769" -PI_BUILD="230307" +PI_BUILD="230308" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 48912e2ff3..a78a35121f 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{230307} +{230308} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 11a3383389..d7ef085547 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.769 Build 230307") +#define PANDORA_VERSION ("7.0NG.769 Build 230308") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 3c842ed958..76b5c3540e 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.769(Build 230307))" + VALUE "ProductVersion", "(7.0NG.769(Build 230308))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index d71a8ffb94..b3ce245f17 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.769-230307 +Version: 7.0NG.769-230308 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index ecb6a40251..0a19d7c0e3 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.769-230307" +pandora_version="7.0NG.769-230308" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 75b110fd90..e4b91d9635 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC230307'; +$build_version = 'PC230308'; $pandora_version = 'v7.0NG.769'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 2a7bde9bb0..68d69a23d6 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -131,7 +131,7 @@
        [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 205a8ef850..a4738c6552 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.769 -%define release 230307 +%define release 230308 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 2cc1e07821..b108390a3d 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.769 -%define release 230307 +%define release 230308 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 6479a6943a..2a76611dde 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.769" -PI_BUILD="230307" +PI_BUILD="230308" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 3ddb47ab77..ce08881710 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -35,7 +35,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.769 Build 230307"; +my $version = "7.0NG.769 Build 230308"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index e5eec498f7..0b193ab6c6 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.769 Build 230307"; +my $version = "7.0NG.769 Build 230308"; # save program name for logging my $progname = basename($0); From bc501ec5524c0abddb35b59a05b45a008d84e896 Mon Sep 17 00:00:00 2001 From: daniel Date: Wed, 8 Mar 2023 08:28:48 +0100 Subject: [PATCH 531/563] fixed styles --- pandora_console/include/styles/pandora.css | 37 ---------------------- 1 file changed, 37 deletions(-) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 63ad0d2e52..b426f2f4d2 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -86,43 +86,6 @@ font-weight: 900; } -/* -@font-face { - font-family: "lato-italic"; - src: url("../fonts/Lato-Italic.woff") format("woff"); - font-weight: 400; - font-style: italic; -} - -@font-face { - font-family: "lato"; - src: url("../fonts/Lato-LightItalic.woff") format("woff"); - font-weight: 300; - font-style: italic; -} - -@font-face { - font-family: "lato"; - src: url("../fonts/Lato-ThinItalic.woff") format("woff"); - font-weight: 100; - font-style: italic; -} - -@font-face { - font-family: "lato"; - src: url("../fonts/Lato-BoldItalic.woff") format("woff"); - font-weight: 700; - font-style: italic; -} - -@font-face { - font-family: "lato"; - src: url("../fonts/Lato-BlackItalic.woff") format("woff"); - font-weight: 900; - font-style: italic; -} -*/ - @font-face { font-family: "source-code"; src: url("../fonts/SourceCodePro.woff") format("woff"); From 1a7e063c6095e1e402a156f73285fd2120deac14 Mon Sep 17 00:00:00 2001 From: Pablo Aragon Date: Wed, 8 Mar 2023 13:36:36 +0100 Subject: [PATCH 532/563] Alerts --- .../godmode/alerts/alert_commands.php | 16 +- .../godmode/snmpconsole/snmp_alert.php | 1292 +++++++++++++---- pandora_console/include/styles/pandora.css | 12 +- pandora_console/include/styles/wizard.css | 4 + 4 files changed, 1007 insertions(+), 317 deletions(-) diff --git a/pandora_console/godmode/alerts/alert_commands.php b/pandora_console/godmode/alerts/alert_commands.php index 5369864105..696882e133 100644 --- a/pandora_console/godmode/alerts/alert_commands.php +++ b/pandora_console/godmode/alerts/alert_commands.php @@ -174,7 +174,7 @@ if (is_ajax()) { 5, 1, '', - 'class="fields"', + 'class="fields w100p"', true, '', $is_management_allowed @@ -307,7 +307,8 @@ if (is_ajax()) { false, false, 'fields', - $is_management_allowed + $is_management_allowed, + 'width: 100%;' ); $rfield .= html_print_select( @@ -321,7 +322,8 @@ if (is_ajax()) { false, false, 'fields', - $is_management_allowed + $is_management_allowed, + 'width: 100%;' ); $ffield .= html_print_input_text('field'.$i.'_value[]', '', '', 10, 10, true, false, false, '', 'datepicker'); @@ -487,7 +489,7 @@ if (is_ajax()) { 5, 1, $fv[0], - 'style="'.$style.'" class="fields min-height-40px"', + 'style="'.$style.'" class="fields min-height-40px w100p"', true, '', $is_management_allowed @@ -497,7 +499,7 @@ if (is_ajax()) { 5, 1, $fv[0], - 'style="'.$style.'" class="fields_recovery min-height-40px', + 'style="'.$style.'" class="fields_recovery min-height-40px w100p', true, '', $is_management_allowed @@ -510,7 +512,7 @@ if (is_ajax()) { 5, 1, '', - 'style="'.$style.'" class="fields min-height-40px"', + 'style="'.$style.'" class="fields min-height-40px w100p"', true, '', $is_management_allowed @@ -520,7 +522,7 @@ if (is_ajax()) { 5, 1, '', - 'style="'.$style.'" class="fields_recovery min-height-40px"', + 'style="'.$style.'" class="fields_recovery min-height-40px w100p"', true, '', $is_management_allowed diff --git a/pandora_console/godmode/snmpconsole/snmp_alert.php b/pandora_console/godmode/snmpconsole/snmp_alert.php index 6ac7252512..6ad576198f 100755 --- a/pandora_console/godmode/snmpconsole/snmp_alert.php +++ b/pandora_console/godmode/snmpconsole/snmp_alert.php @@ -746,7 +746,8 @@ foreach ($user_groups as $id => $name) { // Alert form. if ($create_alert || $update_alert) { // The update_alert means the form should be displayed. If update_alert > 1 then an existing alert is updated. - echo '
        '; + echo ''; html_print_input_hidden('id_alert_snmp', $id_as); @@ -759,36 +760,67 @@ if ($create_alert || $update_alert) { } // SNMP alert filters. - echo ''; + echo '
        '; - // Description. + // 1. echo ''; - echo ''; - echo ''; + + echo ''; echo ''; - // OID. - echo ''; - echo ''; - echo ''; + echo ''; - echo ''; - // Custom. - echo ''; - echo ''; - - // SNMP Agent. - echo ''; echo ''; @@ -798,242 +830,669 @@ if ($create_alert || $update_alert) { $return_all_group = true; } - // Group. - echo ''; + echo ''; + + echo ''; echo ''; - // Trap type. - echo ''; + echo ''; + echo ''; echo ''; - // Single value. - echo ''; + echo ''; + echo ''; echo ''; - // Variable bindings/Data #1. - echo ''; - echo ''; - echo ''; + echo ''; + echo ''; echo ''; - // Variable bindings/Data #2. - echo ''; - echo ''; - echo ''; + echo ''; + echo ''; echo ''; - // Variable bindings/Data #3. - echo ''; - echo ''; - echo ''; + echo ''; + echo ''; echo ''; - // Variable bindings/Data #4. - echo ''; - echo ''; - echo ''; + echo ''; + echo ''; echo ''; - // Variable bindings/Data #5. - echo ''; - echo ''; - echo ''; + echo ''; + echo ''; echo ''; - // Variable bindings/Data #6. - echo ''; - echo ''; - echo ''; + echo ''; + echo ''; echo ''; - // Variable bindings/Data #7. - echo ''; - echo ''; - echo ''; + echo ''; + echo ''; echo ''; - // Variable bindings/Data #8. - echo ''; - echo ''; - echo ''; + echo ''; + echo ''; echo ''; - // Variable bindings/Data #9. - echo ''; - echo ''; - echo ''; + echo ''; - echo ''; - - // Variable bindings/Data #10. - echo ''; - echo ''; - echo ''; - echo ''; - - // Variable bindings/Data #11. - echo ''; - echo ''; - echo ''; - echo ''; - - // Variable bindings/Data #12. - echo ''; - echo ''; - echo ''; - echo ''; - - // Variable bindings/Data #13. - echo ''; - echo ''; - echo ''; - echo ''; - - // Variable bindings/Data #14. - echo ''; - echo ''; - echo ''; - echo ''; - - // Variable bindings/Data #15. - echo ''; - echo ''; - echo ''; - echo ''; - - // Variable bindings/Data #16. - echo ''; - echo ''; - echo ''; - echo ''; - - // Variable bindings/Data #17. - echo ''; - echo ''; - echo ''; - echo ''; - - // Variable bindings/Data #18. - echo ''; - echo ''; - echo ''; - echo ''; - - // Variable bindings/Data #19. - echo ''; - echo ''; - echo ''; - echo ''; - - // Variable bindings/Data #20. - echo ''; - echo ''; - echo ''; echo ''; @@ -1071,16 +1530,43 @@ if ($create_alert || $update_alert) { echo ''; } - // Max / Min alerts. - echo ''; - - // Time Threshold. - echo ''; + echo ''; + echo ''; + echo ''; $fields = []; $fields[$time_threshold] = human_time_description_raw($time_threshold); @@ -1096,54 +1582,144 @@ if ($create_alert || $update_alert) { $fields[SECONDS_1WEEK] = human_time_description_raw(SECONDS_1WEEK); $fields[-1] = __('Other value'); - html_print_select($fields, 'time_threshold', $time_threshold, '', '', '0', false, false, false, '" class="mrgn_right_60px'); - echo ''; - - // Priority. - echo ''; - - // Alert type (e-mail, event etc.). - echo ''; + echo ''; + echo ''; + echo ''; - echo ''; - echo ''; + echo ''; + echo ''; + echo ''; - html_print_input_text('position', $position, '', 3); - echo ''; - echo ''; + // Disable event, . + echo ''; + echo ''; + echo ''; + echo ''; echo '
        '.__('Description').''; - html_print_textarea('description', 3, 2, $description, 'class="w400px"'); + echo ''; + echo html_print_label_input_block( + __('Description'), + html_print_textarea( + 'description', + 2, + 2, + $description, + 'class="w100p"', + true + ) + ); + echo ''; + echo html_print_label_input_block( + __('Custom Value/OID'), + html_print_textarea( + 'custom_value', + 2, + 2, + $custom_value, + 'class="w100p"', + true + ) + ); echo '
        '.__('Enterprise String').ui_print_help_tip(__('Matches substrings. End the string with $ for exact matches.'), true).''; - html_print_input_text('oid', $oid, '', 50, 255); + // 2. + echo '
        '; + echo html_print_label_input_block( + __('Enterprise String').ui_print_help_tip(__('Matches substrings. End the string with $ for exact matches.'), true), + html_print_input_text( + 'oid', + $oid, + '', + 50, + 255, + true + ) + ); echo '
        '.__('Custom Value/OID'); - - echo ''; - html_print_textarea('custom_value', 2, 2, $custom_value, 'class="w400px"'); - - echo '
        '.__('SNMP Agent').' (IP)'; - html_print_input_text('source_ip', $source_ip, '', 20); + echo ''; + echo html_print_label_input_block( + __('SNMP Agent').' (IP)', + html_print_input_text( + 'source_ip', + $source_ip, + '', + 20, + 255, + true + ) + ); echo '
        '.__('Group').''; - echo '
        '; - html_print_select_groups( - $config['id_user'], - 'AR', - $return_all_group, - 'group', - $group, - '', - '', - 0, - false, - false, - false, - '', - false, - false, - false, - false, - 'id_grupo', - false + // 3. + echo '
        '; + echo html_print_label_input_block( + __('Group'), + html_print_select_groups( + $config['id_user'], + 'AR', + $return_all_group, + 'group', + $group, + '', + '', + 0, + true, + false, + false, + '', + false, + false, + false, + false, + 'id_grupo', + false + ) + ); + echo ''; + echo html_print_label_input_block( + __('Trap type'), + html_print_select( + $trap_types, + 'trap_type', + $trap_type, + '', + '', + '', + true, + false, + false, + 'w100p' + ) ); - echo ''; echo '
        '.__('Trap type').''; - echo html_print_select($trap_types, 'trap_type', $trap_type, '', '', '', false, false, false); + // 4. + echo '
        '; + echo html_print_label_input_block( + __('Single value'), + html_print_input_text( + 'single_value', + $single_value, + '', + 20, + 255, + true + ) + ); + echo ''; echo '
        '.__('Single value').''; - html_print_input_text('single_value', $single_value, '', 20); + // #1 #2. + echo '
        '; + echo html_print_label_input_block( + __('Variable bindings/Data'), + '
        #'.html_print_input_text( + 'order_1', + $order_1, + '', + 4, + 255, + true, + false, + false, + '', + 'w10p' + ).html_print_input_text( + 'custom_oid_data_1', + $custom_oid_data_1, + '', + 60, + 255, + true, + false, + false, + '', + 'w88p' + ).'
        ' + ); + echo '
        '; + echo html_print_label_input_block( + __('Variable bindings/Data'), + '
        #'.html_print_input_text( + 'order_2', + $order_2, + '', + 4, + 255, + true, + false, + false, + '', + 'w10p' + ).html_print_input_text( + 'custom_oid_data_2', + $custom_oid_data_2, + '', + 60, + 255, + true, + false, + false, + '', + 'w88p' + ).'
        ' + ); echo '
        '.__('Variable bindings/Data').''; - echo '#'; - html_print_input_text('order_1', $order_1, '', 4); - html_print_input_text('custom_oid_data_1', $custom_oid_data_1, '', 60); + // #3 #4. + echo '
        '; + echo html_print_label_input_block( + __('Variable bindings/Data'), + '
        #'.html_print_input_text( + 'order_3', + $order_3, + '', + 4, + 255, + true, + false, + false, + '', + 'w10p' + ).html_print_input_text( + 'custom_oid_data_3', + $custom_oid_data_3, + '', + 60, + 255, + true, + false, + false, + '', + 'w88p' + ).'
        ' + ); + echo '
        '; + echo html_print_label_input_block( + __('Variable bindings/Data'), + '
        #'.html_print_input_text( + 'order_4', + $order_4, + '', + 4, + 255, + true, + false, + false, + '', + 'w10p' + ).html_print_input_text( + 'custom_oid_data_4', + $custom_oid_data_4, + '', + 60, + 255, + true, + false, + false, + '', + 'w88p' + ).'
        ' + ); echo '
        '.__('Variable bindings/Data').''; - echo '#'; - html_print_input_text('order_2', $order_2, '', 4); - html_print_input_text('custom_oid_data_2', $custom_oid_data_2, '', 60); + // #5 #6. + echo '
        '; + echo html_print_label_input_block( + __('Variable bindings/Data'), + '
        #'.html_print_input_text( + 'order_5', + $order_5, + '', + 4, + 255, + true, + false, + false, + '', + 'w10p' + ).html_print_input_text( + 'custom_oid_data_5', + $custom_oid_data_5, + '', + 60, + 255, + true, + false, + false, + '', + 'w88p' + ).'
        ' + ); + echo '
        '; + echo html_print_label_input_block( + __('Variable bindings/Data'), + '
        #'.html_print_input_text( + 'order_6', + $order_6, + '', + 4, + 255, + true, + false, + false, + '', + 'w10p' + ).html_print_input_text( + 'custom_oid_data_6', + $custom_oid_data_6, + '', + 60, + 255, + true, + false, + false, + '', + 'w88p' + ).'
        ' + ); echo '
        '.__('Variable bindings/Data').''; - echo '#'; - html_print_input_text('order_3', $order_3, '', 4); - html_print_input_text('custom_oid_data_3', $custom_oid_data_3, '', 60); + // #7 #8. + echo '
        '; + echo html_print_label_input_block( + __('Variable bindings/Data'), + '
        #'.html_print_input_text( + 'order_7', + $order_7, + '', + 4, + 255, + true, + false, + false, + '', + 'w10p' + ).html_print_input_text( + 'custom_oid_data_7', + $custom_oid_data_7, + '', + 60, + 255, + true, + false, + false, + '', + 'w88p' + ).'
        ' + ); + echo '
        '; + echo html_print_label_input_block( + __('Variable bindings/Data'), + '
        #'.html_print_input_text( + 'order_8', + $order_8, + '', + 4, + 255, + true, + false, + false, + '', + 'w10p' + ).html_print_input_text( + 'custom_oid_data_8', + $custom_oid_data_8, + '', + 60, + 255, + true, + false, + false, + '', + 'w88p' + ).'
        ' + ); echo '
        '.__('Variable bindings/Data').''; - echo '#'; - html_print_input_text('order_4', $order_4, '', 4); - html_print_input_text('custom_oid_data_4', $custom_oid_data_4, '', 60); + // #9 #10. + echo '
        '; + echo html_print_label_input_block( + __('Variable bindings/Data'), + '
        #'.html_print_input_text( + 'order_9', + $order_9, + '', + 4, + 255, + true, + false, + false, + '', + 'w10p' + ).html_print_input_text( + 'custom_oid_data_9', + $custom_oid_data_9, + '', + 60, + 255, + true, + false, + false, + '', + 'w88p' + ).'
        ' + ); + echo '
        '; + echo html_print_label_input_block( + __('Variable bindings/Data'), + '
        #'.html_print_input_text( + 'order_10', + $order_10, + '', + 4, + 255, + true, + false, + false, + '', + 'w10p' + ).html_print_input_text( + 'custom_oid_data_10', + $custom_oid_data_10, + '', + 60, + 255, + true, + false, + false, + '', + 'w88p' + ).'
        ' + ); echo '
        '.__('Variable bindings/Data').''; - echo '#'; - html_print_input_text('order_5', $order_5, '', 4); - html_print_input_text('custom_oid_data_5', $custom_oid_data_5, '', 60); + // #11 #12. + echo '
        '; + echo html_print_label_input_block( + __('Variable bindings/Data'), + '
        #'.html_print_input_text( + 'order_11', + $order_11, + '', + 4, + 255, + true, + false, + false, + '', + 'w10p' + ).html_print_input_text( + 'custom_oid_data_11', + $custom_oid_data_11, + '', + 60, + 255, + true, + false, + false, + '', + 'w88p' + ).'
        ' + ); + echo '
        '; + echo html_print_label_input_block( + __('Variable bindings/Data'), + '
        #'.html_print_input_text( + 'order_12', + $order_12, + '', + 4, + 255, + true, + false, + false, + '', + 'w10p' + ).html_print_input_text( + 'custom_oid_data_12', + $custom_oid_data_12, + '', + 60, + 255, + true, + false, + false, + '', + 'w88p' + ).'
        ' + ); echo '
        '.__('Variable bindings/Data').''; - echo '#'; - html_print_input_text('order_6', $order_6, '', 4); - html_print_input_text('custom_oid_data_6', $custom_oid_data_6, '', 60); + // #13 #14. + echo '
        '; + echo html_print_label_input_block( + __('Variable bindings/Data'), + '
        #'.html_print_input_text( + 'order_13', + $order_13, + '', + 4, + 255, + true, + false, + false, + '', + 'w10p' + ).html_print_input_text( + 'custom_oid_data_13', + $custom_oid_data_13, + '', + 60, + 255, + true, + false, + false, + '', + 'w88p' + ).'
        ' + ); + echo '
        '; + echo html_print_label_input_block( + __('Variable bindings/Data'), + '
        #'.html_print_input_text( + 'order_14', + $order_14, + '', + 4, + 255, + true, + false, + false, + '', + 'w10p' + ).html_print_input_text( + 'custom_oid_data_14', + $custom_oid_data_14, + '', + 60, + 255, + true, + false, + false, + '', + 'w88p' + ).'
        ' + ); echo '
        '.__('Variable bindings/Data').''; - echo '#'; - html_print_input_text('order_7', $order_7, '', 4); - html_print_input_text('custom_oid_data_7', $custom_oid_data_7, '', 60); + // #15 #16. + echo '
        '; + echo html_print_label_input_block( + __('Variable bindings/Data'), + '
        #'.html_print_input_text( + 'order_15', + $order_15, + '', + 4, + 255, + true, + false, + false, + '', + 'w10p' + ).html_print_input_text( + 'custom_oid_data_15', + $custom_oid_data_15, + '', + 60, + 255, + true, + false, + false, + '', + 'w88p' + ).'
        ' + ); + echo '
        '; + echo html_print_label_input_block( + __('Variable bindings/Data'), + '
        #'.html_print_input_text( + 'order_16', + $order_16, + '', + 4, + 255, + true, + false, + false, + '', + 'w10p' + ).html_print_input_text( + 'custom_oid_data_16', + $custom_oid_data_16, + '', + 60, + 255, + true, + false, + false, + '', + 'w88p' + ).'
        ' + ); echo '
        '.__('Variable bindings/Data').''; - echo '#'; - html_print_input_text('order_8', $order_8, '', 4); - html_print_input_text('custom_oid_data_8', $custom_oid_data_8, '', 60); + // #17 #18. + echo '
        '; + echo html_print_label_input_block( + __('Variable bindings/Data'), + '
        #'.html_print_input_text( + 'order_17', + $order_17, + '', + 4, + 255, + true, + false, + false, + '', + 'w10p' + ).html_print_input_text( + 'custom_oid_data_17', + $custom_oid_data_17, + '', + 60, + 255, + true, + false, + false, + '', + 'w88p' + ).'
        ' + ); + echo '
        '; + echo html_print_label_input_block( + __('Variable bindings/Data'), + '
        #'.html_print_input_text( + 'order_18', + $order_18, + '', + 4, + 255, + true, + false, + false, + '', + 'w10p' + ).html_print_input_text( + 'custom_oid_data_18', + $custom_oid_data_18, + '', + 60, + 255, + true, + false, + false, + '', + 'w88p' + ).'
        ' + ); echo '
        '.__('Variable bindings/Data').''; - echo '#'; - html_print_input_text('order_9', $order_9, '', 4); - html_print_input_text('custom_oid_data_9', $custom_oid_data_9, '', 60); + // #19 #20. + echo '
        '; + echo html_print_label_input_block( + __('Variable bindings/Data'), + '
        #'.html_print_input_text( + 'order_19', + $order_19, + '', + 4, + 255, + true, + false, + false, + '', + 'w10p' + ).html_print_input_text( + 'custom_oid_data_19', + $custom_oid_data_19, + '', + 60, + 255, + true, + false, + false, + '', + 'w88p' + ).'
        ' + ); echo '
        '.__('Variable bindings/Data').''; - echo '#'; - html_print_input_text('order_10', $order_10, '', 4); - html_print_input_text('custom_oid_data_10', $custom_oid_data_10, '', 60); - echo '
        '.__('Variable bindings/Data').''; - echo '#'; - html_print_input_text('order_11', $order_11, '', 4); - html_print_input_text('custom_oid_data_11', $custom_oid_data_11, '', 60); - echo '
        '.__('Variable bindings/Data').''; - echo '#'; - html_print_input_text('order_12', $order_12, '', 4); - html_print_input_text('custom_oid_data_12', $custom_oid_data_12, '', 60); - echo '
        '.__('Variable bindings/Data').''; - echo '#'; - html_print_input_text('order_13', $order_13, '', 4); - html_print_input_text('custom_oid_data_13', $custom_oid_data_13, '', 60); - echo '
        '.__('Variable bindings/Data').''; - echo '#'; - html_print_input_text('order_14', $order_14, '', 4); - html_print_input_text('custom_oid_data_14', $custom_oid_data_14, '', 60); - echo '
        '.__('Variable bindings/Data').''; - echo '#'; - html_print_input_text('order_15', $order_15, '', 4); - html_print_input_text('custom_oid_data_15', $custom_oid_data_15, '', 60); - echo '
        '.__('Variable bindings/Data').''; - echo '#'; - html_print_input_text('order_16', $order_16, '', 4); - html_print_input_text('custom_oid_data_16', $custom_oid_data_16, '', 60); - echo '
        '.__('Variable bindings/Data').''; - echo '#'; - html_print_input_text('order_17', $order_17, '', 4); - html_print_input_text('custom_oid_data_17', $custom_oid_data_17, '', 60); - echo '
        '.__('Variable bindings/Data').''; - echo '#'; - html_print_input_text('order_18', $order_18, '', 4); - html_print_input_text('custom_oid_data_18', $custom_oid_data_18, '', 60); - echo '
        '.__('Variable bindings/Data').''; - echo '#'; - html_print_input_text('order_19', $order_19, '', 4); - html_print_input_text('custom_oid_data_19', $custom_oid_data_19, '', 60); - echo '
        '.__('Variable bindings/Data').''; - echo '#'; - html_print_input_text('order_20', $order_20, '', 4); - html_print_input_text('custom_oid_data_20', $custom_oid_data_20, '', 60); + echo ''; + echo html_print_label_input_block( + __('Variable bindings/Data'), + '
        #'.html_print_input_text( + 'order_20', + $order_20, + '', + 4, + 255, + true, + false, + false, + '', + 'w10p' + ).html_print_input_text( + 'custom_oid_data_20', + $custom_oid_data_20, + '', + 60, + 255, + true, + false, + false, + '', + 'w88p' + ).'
        ' + ); echo '
        '.__('Min. number of alerts').''; - html_print_input_text('min_alerts', $min_alerts, '', 3); - - echo '
        '.__('Max. number of alerts').''; - html_print_input_text('max_alerts', $max_alerts, '', 3); - echo '
        '.__('Time threshold').''; + // Max, Min. + echo '
        '; + echo html_print_label_input_block( + __('Min. number of alerts'), + html_print_input_text( + 'min_alerts', + $min_alerts, + '', + 3, + 255, + true, + false, + false, + '', + 'w100p' + ) + ); + echo ''; + echo html_print_label_input_block( + __('Max. number of alerts'), + html_print_input_text( + 'max_alerts', + $max_alerts, + '', + 3, + 255, + true, + false, + false, + '', + 'w100p' + ) + ); + echo '
        '.__('Priority').''; - echo html_print_select(get_priorities(), 'priority', $priority, '', '', '0', false, false, false); - echo '
        '.__('Alert action').''; - html_print_select_from_sql( - 'SELECT id, name - FROM talert_actions - ORDER BY name', - 'alert_type', - $alert_type, - '', - '', - 0, - false, - false, - false + // Time Threshold, Priority. + echo '
        '; + echo html_print_label_input_block( + __('Time threshold'), + html_print_select( + $fields, + 'time_threshold', + $time_threshold, + '', + '', + '0', + true, + false, + false, + '" class="mrgn_right_60px' + ).'' ); + echo ''; + echo html_print_label_input_block( + __('Priority'), + html_print_select( + get_priorities(), + 'priority', + $priority, + '', + '', + '0', + true, + false, + false + ) + ); + echo '
        '.__('Position').''; + // Alert type (e-mail, event etc.), Position. + echo '
        '; + echo html_print_label_input_block( + __('Alert action'), + html_print_select_from_sql( + 'SELECT id, name + FROM talert_actions + ORDER BY name', + 'alert_type', + $alert_type, + '', + '', + 0, + true, + false, + false + ) + ); + echo ''; + echo html_print_label_input_block( + __('Position'), + html_print_input_text( + 'position', + $position, + '', + 3, + 255, + true, + false, + false, + '', + 'w100p' + ) + ); + echo '
        '.__('Disable event').''; - - html_print_checkbox('disable_event', 1, $disable_event, false); - echo '
        '; + echo html_print_label_input_block( + __('Disable event'), + html_print_checkbox( + 'disable_event', + 1, + $disable_event, + true + ) + ); + echo ''; + echo '
        '; - echo ""; - echo '
        '; - html_print_button(__('Back'), 'button_back', false, '', 'class="sub cancel margin-right-05"'); + + $back_button = html_print_button( + __('Back'), + 'button_back', + false, + '', + [ + 'class' => 'secondary', + 'icon' => 'back', + ], + true + ); if ($id_as > 0) { - html_print_submit_button(__('Update'), 'submit', false, 'class="sub upd"'); + $submit_button = html_print_submit_button( + __('Update'), + 'submit', + false, + [ + 'class' => '', + 'icon' => 'wand', + ], + true + ); } else { - html_print_submit_button(__('Create'), 'submit', false, 'class="sub wand"'); + $submit_button = html_print_submit_button( + __('Create'), + 'submit', + false, + [ + 'class' => '', + 'icon' => 'wand', + ], + true + ); } - echo '
        '; - echo ''; + html_print_action_buttons($submit_button.$back_button); echo '
        '; } else { include_once 'include/functions_alerts.php'; @@ -1156,28 +1732,91 @@ if ($create_alert || $update_alert) { $table_filter = new stdClass(); $table_filter->width = '100%'; - $table_filter->class = 'databox filters'; + $table_filter->class = 'databox filters filter-table-adv'; $table_filter->data = []; - $table_filter->data[0][0] = __('Free search').ui_print_help_tip( - __('Search by these fields description, OID, Custom Value, SNMP Agent (IP), Single value, each Variable bindings/Datas.'), - true + $table_filter->size[0] = '33%'; + $table_filter->size[1] = '33%'; + $table_filter->size[2] = '33%'; + + $table_filter->data[0][0] = html_print_label_input_block( + __('Free search').ui_print_help_tip( + __('Search by these fields description, OID, Custom Value, SNMP Agent (IP), Single value, each Variable bindings/Datas.'), + true + ), + html_print_input_text( + 'free_search', + $free_search, + '', + 30, + 100, + true + ) + ); + + $table_filter->data[0][1] = html_print_label_input_block( + __('Trap type'), + html_print_select( + $trap_types, + 'trap_type_filter', + $trap_type_filter, + '', + '', + '', + true, + false, + false, + 'w100p', + false, + 'width: 100%;' + ) + ); + + $table_filter->data[0][2] = html_print_label_input_block( + __('Priority'), + html_print_select( + get_priorities(), + 'priority_filter', + $priority_filter, + '', + __('None'), + '-1', + true, + false, + false, + 'w100p', + false, + 'width: 100%;' + ) ); - $table_filter->data[0][1] = html_print_input_text('free_search', $free_search, '', 30, 100, true); - $table_filter->data[0][2] = __('Trap type'); - $table_filter->data[0][3] = html_print_select($trap_types, 'trap_type_filter', $trap_type_filter, '', '', '', true, false, false); - $table_filter->data[0][4] = __('Priority'); - $table_filter->data[0][5] = html_print_select(get_priorities(), 'priority_filter', $priority_filter, '', __('None'), '-1', true, false, false); - ; $form_filter = '
        '; $form_filter .= html_print_input_hidden('filter', 1, true); $form_filter .= html_print_table($table_filter, true); - $form_filter .= '
        '; - $form_filter .= html_print_submit_button(__('Filter'), 'filter_button', false, 'class="sub filter"', true); + $form_filter .= '
        '; + $form_filter .= html_print_submit_button( + __('Filter'), + 'filter_button', + false, + [ + 'class' => 'mini', + 'icon' => 'search', + ], + true + ); $form_filter .= '
        '; $form_filter .= ''; - ui_toggle($form_filter, __('Alert SNMP control filter'), __('Toggle filter(s)')); + ui_toggle( + $form_filter, + ''.__('Alert SNMP control filter').'', + __('Toggle filter(s)'), + 'filter', + true, + false, + '', + 'white-box-content no_border', + 'filter-datatable-main box-flat white_table_graph fixed_filter_bar' + ); $filter = []; $offset = (int) get_parameter('offset'); @@ -1231,8 +1870,6 @@ if ($create_alert || $update_alert) { $result = []; ui_print_info_message(['no_close' => true, 'message' => __('There are no SNMP alerts') ]); } else { - ui_pagination($count, $url_pagination); - $where_sql .= ' LIMIT '.$limit.' OFFSET '.$offset; $result = db_get_all_rows_sql( 'SELECT * @@ -1491,37 +2128,76 @@ if ($create_alert || $update_alert) { echo ''; html_print_input_hidden('add_alert', 1); - echo html_print_submit_button(__('Add'), 'addbutton', false, ['class' => 'sub next', 'style' => 'float:right'], true); + echo html_print_submit_button( + __('Add'), + 'addbutton', + false, + [ + 'class' => 'mini', + 'icon' => 'wand', + 'style' => 'float:right', + ], + true + ); echo ''; echo '
        '; // END DIALOG ADD MORE ACTIONS. - if (empty($table->data) === false) { - echo '
        '; - html_print_table($table); + $pagination = ''; + $deleteButton = ''; + if (empty($table->data) === false) { + echo ''; + html_print_table($table); - ui_pagination($count, $url_pagination); + $pagination = ui_pagination($count, $url_pagination, 0, 0, true, 'offset', false); - echo '
        '; - html_print_input_hidden('multiple_delete', 1); - html_print_button(__('Delete selected'), 'delete_button', false, 'delete_selected_snmp_alerts()', 'class="sub delete mrgn_btn_10px"'); - echo '
        '; - echo '
        '; - } + echo '
        '; + html_print_input_hidden('multiple_delete', 1); + $deleteButton = html_print_button( + __('Delete selected'), + 'delete_button', + false, + 'delete_selected_snmp_alerts()', + [ + 'class' => 'secondary', + 'icon' => 'delete', + ], + true + ); + echo '
        '; + echo ''; + } echo '
        '; echo '
        '; html_print_input_hidden('create_alert', 1); - html_print_submit_button(__('Create'), 'alert', false, 'class="sub next"'); + $submitButton = html_print_submit_button( + __('Create'), + 'alert', + false, + ['icon' => 'wand'], + true + ); + html_print_action_buttons($submitButton.$deleteButton, ['right_content' => $pagination]); echo '
        '; - echo '
        '; - echo '

        '.__('Legend').'

        '; - foreach (get_priorities() as $num => $name) { - echo ''.$name.''; - echo '
        '; - } + $legend = ''; + + ui_toggle($legend, __('Legend')); unset($table); } diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 63ad0d2e52..ee4a24d5f5 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -719,6 +719,10 @@ select:-internal-list-box { width: 80%; } +.w88p { + width: 88%; +} + .w90p { width: 90%; } @@ -2414,7 +2418,7 @@ ol.steps li.visited span { } ol.steps li.current { - border-left: 5px solid #778866; + border-left: 5px solid var(--primary-color); margin-left: 0; font-weight: bold; background-color: #e9f3d2; @@ -7885,6 +7889,10 @@ div.graph div.legend table { height: 10px; } +.height_15px { + height: 15px; +} + .height_20px { height: 20px; } @@ -11577,5 +11585,5 @@ ul.tag-editor { } .max-width-100p { - max-width: 100% !important; + max-width: 100%; } diff --git a/pandora_console/include/styles/wizard.css b/pandora_console/include/styles/wizard.css index c7c37a8143..af3b1c3359 100644 --- a/pandora_console/include/styles/wizard.css +++ b/pandora_console/include/styles/wizard.css @@ -236,3 +236,7 @@ form.alert-correlation > div > ul > li.flex-flex-end > input { form.alert-correlation > div > ul > li.flex-flex-end > label { width: 50px !important; } + +form.alert-correlation > div > ul > li.display-grid > textarea { + width: 100% !important; +} From 91a708dfb8a38a93c2129e13b8750b88a8773285 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Wed, 8 Mar 2023 13:41:00 +0100 Subject: [PATCH 533/563] SNMP Browser and agent module SNMP walk --- .../agentes/module_manager_editor_common.php | 2 +- .../agentes/module_manager_editor_network.php | 1 + .../include/functions_snmp_browser.php | 123 ++++++++++++++---- .../javascript/pandora_snmp_browser.js | 6 +- .../operation/snmpconsole/snmp_browser.php | 4 +- 5 files changed, 108 insertions(+), 28 deletions(-) diff --git a/pandora_console/godmode/agentes/module_manager_editor_common.php b/pandora_console/godmode/agentes/module_manager_editor_common.php index 8f951565c2..aba3daf8f4 100644 --- a/pandora_console/godmode/agentes/module_manager_editor_common.php +++ b/pandora_console/godmode/agentes/module_manager_editor_common.php @@ -325,7 +325,7 @@ if ($edit === false) { $table_simple->data['module_n_type'][1] = ''.modules_get_moduletype_description($id_module_type).' ('.$type_names_hash[$id_module_type].')'; } else { - $idModuleType = (isset($id_module_type) === true) ? $idModuleType : ''; + $idModuleType = (isset($id_module_type) === true) ? $id_module_type : ''; // Removed web analysis and log4x from select. $tipe_not_in = '24, 25'; if (is_metaconsole() === true) { diff --git a/pandora_console/godmode/agentes/module_manager_editor_network.php b/pandora_console/godmode/agentes/module_manager_editor_network.php index be63ddfeef..f9c1117377 100644 --- a/pandora_console/godmode/agentes/module_manager_editor_network.php +++ b/pandora_console/godmode/agentes/module_manager_editor_network.php @@ -128,6 +128,7 @@ if ($page === 'enterprise/godmode/policies/policy_modules') { // In ICMP modules, port is not configurable. if ($id_module_type !== 6 && $id_module_type !== 7) { + $tcp_port = (empty($tcp_port) === false) ? $tcp_port : get_parameter('tcp_port'); $data[1] = html_print_input_text( 'tcp_port', $tcp_port, diff --git a/pandora_console/include/functions_snmp_browser.php b/pandora_console/include/functions_snmp_browser.php index be9ac48424..a43150c94e 100644 --- a/pandora_console/include/functions_snmp_browser.php +++ b/pandora_console/include/functions_snmp_browser.php @@ -612,8 +612,8 @@ function snmp_browser_print_oid( $table->head[1] = __('OID Information'); $output .= html_print_table($table, true); - $url = 'index.php?'.'sec=gmodules&'.'sec2=godmode/modules/manage_network_components'; - $output .= '
        '; + $url = 'index.php?sec=gmodules&sec2=godmode/modules/manage_network_components'; + $output .= ''; $output .= html_print_input_hidden('create_network_from_snmp_browser', 1, true); $output .= html_print_input_hidden('id_component_type', 2, true); $output .= html_print_input_hidden('type', 17, true); @@ -638,19 +638,21 @@ function snmp_browser_print_oid( __('Create network component'), 'create_network_component', false, - 'class="sub add float-left mrgn_right_20px"', + 'class="buttonButton mrgn_right_20px"', true ); - // Hidden by default. - $output .= html_print_button( - __('Create agent module'), - 'create_module_agent_single', - false, - 'show_add_module()', - 'class="sub add invisible"', - true - ); + if (isset($_POST['print_create_agent_module'])) { + // Hidden by default. + $output .= html_print_button( + __('Create agent module'), + 'create_module_agent_single', + false, + 'show_add_module()', + 'class="sub add invisible"', + true + ); + } // Select agent modal. $output .= snmp_browser_print_create_modules(true); @@ -685,7 +687,8 @@ function snmp_browser_print_container( $width='100%', $height='60%', $display='', - $show_massive_buttons=false + $show_massive_buttons=false, + $toggle=false ) { global $config; @@ -948,8 +951,22 @@ function snmp_browser_print_container( ); $table->data[2] .= ''; + if ($toggle == true) { + $print_create_agent_module = 1; + } else { + $print_create_agent_module = 0; + } + $searchForm = ''; $searchForm .= html_print_table($table, true); + $searchForm .= html_print_input_hidden( + 'print_create_agent_module', + $print_create_agent_module, + true, + false, + false, + 'print_create_agent_module' + ); $searchForm .= html_print_div( [ 'class' => 'action-buttons', @@ -969,17 +986,19 @@ function snmp_browser_print_container( $searchForm .= ''; - ui_toggle( - $searchForm, - ''.__('Filters').'', - 'filter_form', - '', - false, - false, - '', - 'white-box-content', - 'box-flat white_table_graph fixed_filter_bar' - ); + if ($toggle == true) { + ui_toggle( + $searchForm, + ''.__('Filters').'', + 'filter_form', + '', + false, + false, + '', + 'white-box-content', + 'box-flat white_table_graph fixed_filter_bar' + ); + } // Search tools. $table2 = new stdClass(); @@ -1101,6 +1120,62 @@ function snmp_browser_print_container( ); $output .= ''; + if ($toggle === false) { + // This extra div that can be handled by jquery's dialog. + $output .= '
        '; + $legend .= '
        '; + $priorities = get_priorities(); + $half = (count($priorities) / 2); + $count = 0; + foreach ($priorities as $num => $name) { + if ($count == $half) { + $legend .= '
        '; + } - echo '
        '; + $legend .= ''.$name.''; + $legend .= '
        '; + $count++; + } + + $legend .= '
        - - - - - - - - -
        ".__('From:').''.html_print_input_text('once_date_from', $once_date_from, '', 10, 10, true, $disabled_in_execution).html_print_input_text('once_time_from', $once_time_from, '', 9, 9, true, $disabled_in_execution).'
        '.__('To:').''.html_print_input_text('once_date_to', $once_date_to, '', 10, 10, true).html_print_input_text('once_time_to', $once_time_to, '', 9, 9, true)."
        -
        - - '; - -if ($id_downtime > 0) { - echo "
        "; -} else { - echo ''; -} - -// Editor form. -html_print_table($table); - -echo ""; $filter_group = (int) get_parameter('filter_group', 0); @@ -1074,39 +864,439 @@ if (empty($agents) || $disabled_in_execution) { $disabled_add_button = true; } -// Show available agents to include into downtime + $table = new StdClass(); -$table->class = 'databox filters'; +$table->class = 'databox filter-table-adv'; +$table->id = 'principal_table_scheduled'; $table->width = '100%'; +$table->size = []; +$table->size[0] = '50%'; +$table->size[1] = '50%'; $table->data = []; -$table->size[0] = '25%'; - -$table->data[0][0] = __('Group filter'); -$table->data[0][1] = html_print_select_groups( - false, - $access, - $return_all_group, - 'filter_group', - $filter_group, - '', - '', - '', - true, - false, - true, - '', - false, - 'min-width:180px;margin-right:15px;' +$table->data['first_title'][] = html_print_div( + [ + 'class' => 'section_table_title', + 'content' => __('Editor'), + ], + true +); +$table->data[0][] = html_print_label_input_block( + __('Name'), + html_print_input_text( + 'name', + $name, + '', + 25, + 40, + true, + $disabled_in_execution + ) ); -$table->data[0][2] = __('Recursion').'  '.html_print_checkbox('recursion', 1, $recursion, true, false, ''); -$table->data[1][0] = __('Available agents'); -$table->data[1][1] = html_print_select($agents, 'id_agents[]', -1, '', _('Any'), -2, true, true, true, '', false, 'min-width: 250px;width: 70%;'); +$table->data[0][] = html_print_label_input_block( + __('Group'), + html_print_select_groups( + false, + $access, + $return_all_group, + 'id_group', + $id_group, + '', + '', + 0, + true, + false, + true, + '', + $disabled_in_execution + ) +); +$table->data[1][] = html_print_label_input_block( + __('Description'), + html_print_textarea( + 'description', + 3, + 35, + $description, + '', + true + ) +); -$table->rowid[2] = 'available_modules_selection_mode'; +$table->data[1][] = html_print_label_input_block( + __('Type'), + html_print_select( + [ + 'quiet' => __('Quiet'), + 'disable_agents' => __('Disabled Agents'), + 'disable_agent_modules' => __('Disable Modules'), + 'disable_agents_alerts' => __('Disabled only Alerts'), + ], + 'type_downtime', + $type_downtime, + 'change_type_downtime()', + '', + 0, + true, + false, + true, + '', + $disabled_in_execution + ).ui_print_input_placeholder( + __('Quiet: Modules will not generate events or fire alerts.').'
        '.__('Disable Agents: Disables the selected agents.').'
        '.__('Disable Alerts: Disable alerts for the selected agents.'), + true + ) +); -$table->data[2][1] = html_print_select( +$table->data[2][] = html_print_label_input_block( + __('Execution'), + html_print_select( + [ + 'once' => __('Once'), + 'periodically' => __('Periodically'), + 'cron' => __('Cron from/to'), + ], + 'type_execution', + $type_execution, + 'change_type_execution();', + '', + 0, + true, + false, + true, + '', + $disabled_in_execution + ) +); + +$timeInputs = []; + +$timeInputs[] = html_print_div( + [ + 'id' => 'once_time', + 'style' => 'display: none', + 'content' => html_print_div( + [ + 'class' => '', + 'content' => html_print_input_text( + 'once_date_from', + $once_date_from, + '', + 10, + 10, + true, + $disabled_in_execution + ).html_print_input_text( + 'once_time_from', + $once_time_from, + '', + 9, + 9, + true, + $disabled_in_execution + ).''.__( + 'To' + ).''.html_print_input_text( + 'once_date_to', + $once_date_to, + '', + 10, + 10, + true + ).html_print_input_text( + 'once_time_to', + $once_time_to, + '', + 9, + 9, + true + ), + ], + true + ), + ], + true +); + +$timeInputs[] = html_print_div( + [ + 'id' => 'periodically_time', + 'style' => 'display: none', + 'content' => html_print_div( + [ + 'class' => 'filter-table-adv-manual w50p', + 'content' => html_print_label_input_block( + __('Type Periodicity'), + html_print_select( + [ + 'weekly' => __('Weekly'), + 'monthly' => __('Monthly'), + ], + 'type_periodicity', + $type_periodicity, + 'change_type_periodicity();', + '', + 0, + true, + false, + true, + '', + $disabled_in_execution + ) + ), + ], + true + ).html_print_div( + [ + 'id' => 'weekly_item', + 'class' => '', + 'content' => '
          +
        • '.__('Mon').html_print_checkbox('monday', 1, $monday, true, $disabled_in_execution, '', false, ['label_style' => 'margin: 0 5px;' ]).'
        • +
        • '.__('Tue').html_print_checkbox('tuesday', 1, $tuesday, true, $disabled_in_execution, '', false, ['label_style' => 'margin: 0 5px;' ]).'
        • +
        • '.__('Wed').html_print_checkbox('wednesday', 1, $wednesday, true, $disabled_in_execution, '', false, ['label_style' => 'margin: 0 5px;' ]).'
        • +
        • '.__('Thu').html_print_checkbox('thursday', 1, $thursday, true, $disabled_in_execution, '', false, ['label_style' => 'margin: 0 5px;' ]).'
        • +
        • '.__('Fri').html_print_checkbox('friday', 1, $friday, true, $disabled_in_execution, '', false, ['label_style' => 'margin: 0 5px;' ]).'
        • +
        • '.__('Sat').html_print_checkbox('saturday', 1, $saturday, true, $disabled_in_execution, '', false, ['label_style' => 'margin: 0 5px;' ]).'
        • +
        • '.__('Sun').html_print_checkbox('sunday', 1, $sunday, true, $disabled_in_execution, '', false, ['label_style' => 'margin: 0 5px;' ]).'
        • +
        ', + ], + true + ).html_print_div( + [ + 'id' => 'monthly_item', + 'style' => 'margin-top: 12px;', + 'class' => 'filter-table-adv-manual flex-row-start w50p', + 'content' => html_print_label_input_block( + __('From day'), + html_print_select( + $days, + 'periodically_day_from', + $periodically_day_from, + '', + '', + 0, + true, + false, + true, + '', + $disabled_in_execution + ), + [ 'div_style' => 'flex: 50; margin-right: 5px;' ] + ).html_print_label_input_block( + __('To day'), + html_print_select( + $days, + 'periodically_day_to', + $periodically_day_to, + '', + '', + 0, + true, + false, + true, + '', + $disabled_in_execution + ).ui_print_input_placeholder( + __('The end day must be higher than the start day'), + true + ), + [ 'div_style' => 'flex: 50; margin-left: 5px;' ] + ), + ], + true + ).html_print_div( + [ + 'class' => 'filter-table-adv-manual flex-row-start w50p', + 'content' => html_print_label_input_block( + __('From hour'), + html_print_input_text( + 'periodically_time_from', + $periodically_time_from, + '', + 7, + 7, + true, + $disabled_in_execution + ).ui_print_input_placeholder( + __('The start time must be lower than the end time'), + true + ), + [ 'div_style' => 'flex: 50; margin-right: 5px;' ] + ).html_print_label_input_block( + __('To hour'), + html_print_input_text( + 'periodically_time_to', + $periodically_time_to, + '', + 7, + 7, + true, + $disabled_in_execution + ).ui_print_input_placeholder( + __('The end time must be higher than the start time'), + true + ), + [ 'div_style' => 'flex: 50; margin-left: 5px;' ] + ), + ], + true + ).ui_get_using_system_timezone_warning(), + ], + true +); + +$timeInputs[] = html_print_div( + [ + 'id' => 'cron_time', + 'style' => 'display: none', + 'content' => html_print_label_input_block( + __('Cron from'), + html_print_extended_select_for_cron($hour_from, $minute_from, $mday_from, $month_from, $wday_from, true, false, false, true, 'from') + ).html_print_label_input_block( + __('Cron to'), + html_print_extended_select_for_cron($hour_to, $minute_to, $mday_to, $month_to, $wday_to, true, false, true, true, 'to') + ), + ], + true +); + +$table->colspan[3][0] = 2; +$table->data[3][0] = html_print_label_input_block( + __('Configure the time'), + implode('', $timeInputs) +); + +$table->data[4][] = html_print_div( + [ + 'class' => 'section_table_title', + 'content' => __('Filtering'), + ], + true +); + +$table->data[5][] = html_print_label_input_block( + __('Group filter'), + html_print_select_groups( + false, + $access, + $return_all_group, + 'filter_group', + $filter_group, + '', + '', + '', + true, + false, + true, + '', + false, + 'min-width:180px;margin-right:15px;' + ) +); + +$table->data[5][] = html_print_label_input_block( + __('Recursion'), + html_print_checkbox_switch( + 'recursion', + 1, + $recursion, + true, + false, + '' + ) +); + +$table->colspan[6][0] = 2; +$availableModules = html_print_label_input_block( + __('Available agents'), + html_print_select( + $agents, + 'id_agents[]', + -1, + '', + __('Any'), + -2, + true, + true, + true, + '', + false, + 'min-width: 250px;width: 70%;' + ), + [ + 'div_class' => 'flex-column', + 'div_style' => 'flex: 33', + ] +); + +$availableModules .= html_print_label_input_block( + __('Selection mode'), + html_print_select( + [ + 'common' => __('Show common modules'), + 'all' => __('Show all modules'), + ], + 'modules_selection_mode', + 'common', + false, + '', + '', + true, + false, + true, + '', + false, + 'min-width:180px;' + ), + [ + 'div_class' => 'available_modules_selection_mode flex-column', + 'div_style' => 'flex: 33', + ] +); + +$availableModules .= html_print_label_input_block( + __('Available modules'), + html_print_select( + [], + 'module[]', + '', + '', + '', + 0, + true, + true, + true, + '', + false, + 'min-width: 250px;width: 70%;' + ).ui_print_input_placeholder( + __('Only for type Quiet for downtimes.'), + true + ), + [ + 'div_class' => 'available_modules flex-column', + 'div_style' => 'flex: 33', + ] +); + +$table->data[6][0] = html_print_div( + [ + 'style' => 'flex-direction: row;align-items: flex-start;', + 'content' => $availableModules, + ], + true +); + +// $table->data[0][2] = __('Recursion').'  '.html_print_checkbox('recursion', 1, $recursion, true, false, ''); +/* + $table->data[1][0] = __('Available agents'); + $table->data[1][1] = html_print_select($agents, 'id_agents[]', -1, '', _('Any'), -2, true, true, true, '', false, 'min-width: 250px;width: 70%;'); +*/ +/* + $table->rowid[2] = 'available_modules_selection_mode'; + + $table->data[2][1] = html_print_select( [ 'common' => __('Show common modules'), 'all' => __('Show all modules'), @@ -1122,16 +1312,16 @@ $table->data[2][1] = html_print_select( '', false, 'min-width:180px;' -); + ); -$table->rowid[3] = 'available_modules'; -$table->data[3][0] = __('Available modules:').ui_print_help_tip( + $table->rowid[3] = 'available_modules'; + $table->data[3][0] = __('Available modules:').ui_print_help_tip( __('Only for type Quiet for downtimes.'), true -); + ); -$table->data[3][1] = html_print_select( + $table->data[3][1] = html_print_select( [], 'module[]', '', @@ -1144,35 +1334,45 @@ $table->data[3][1] = html_print_select( '', false, 'min-width: 250px;width: 70%;' -); - + ); +*/ // Print agent table. +if ($id_downtime > 0) { + echo ""; +} else { + echo ''; +} + html_print_table($table); -echo '


        '; - +$buttons = ''; html_print_input_hidden('id_agent', $id_agent); -echo '
        '; + if ($id_downtime > 0) { html_print_input_hidden('update_downtime', 1); html_print_input_hidden('id_downtime', $id_downtime); - html_print_submit_button( + $buttons .= html_print_submit_button( __('Update'), 'updbutton', false, - 'class="sub upd"' + ['icon' => 'update'], + true ); } else { html_print_input_hidden('create_downtime', 1); - html_print_submit_button( + $buttons .= html_print_submit_button( __('Add'), 'crtbutton', false, - 'class="sub wand"' + ['icon' => 'wand'], + true ); } -echo '
        '; +html_print_action_buttons( + $buttons +); + html_print_input_hidden('all_common_modules', ''); echo '
        '; @@ -1208,11 +1408,17 @@ if (empty($downtimes_agents)) { $table->head[2] = __('OS'); $table->head[3] = __('Last contact'); $table->head['count_modules'] = __('Modules'); + $table->align = []; + $table->align[0] = 'center'; + $table->align[1] = 'center'; + $table->align[2] = 'center'; + $table->align[3] = 'center'; + $table->align[4] = 'center'; if (!$running) { $table->head[5] = __('Actions'); - $table->align[5] = 'center'; - $table->size[5] = '5%'; + $table->align[5] = 'right'; + $table->size[5] = '10%'; } foreach ($downtimes_agents as $downtime_agent) { @@ -1232,7 +1438,13 @@ if (empty($downtimes_agents)) { WHERE id_grupo = '.$downtime_agent['id_grupo'] ); - $data[2] = ui_print_os_icon($downtime_agent['id_os'], true, true); + $data[2] = html_print_div( + [ + 'class' => 'main_menu_icon invert_filter', + 'content' => ui_print_os_icon($downtime_agent['id_os'], false, true), + ], + true + ); $data[3] = $downtime_agent['ultimo_contacto']; @@ -1251,10 +1463,10 @@ if (empty($downtimes_agents)) { if (!$running) { $data[5] = ''; if ($type_downtime !== 'disable_agents') { - $data[5] = ''.html_print_image('images/config.png', true, ['border' => '0', 'alt' => __('Delete'), 'class' => 'invert_filter']).''; + $data[5] = ''.html_print_image('images/edit.svg', true, ['alt' => __('Edit'), 'class' => 'main_menu_icon invert_filter']).''; } - $data[5] .= ''.html_print_image('images/cross.png', true, ['border' => '0', 'alt' => __('Delete'), 'class' => 'invert_filter']).''; + $data[5] .= ''.html_print_image('images/delete.svg', true, ['alt' => __('Delete'), 'class' => 'main_menu_icon invert_filter']).''; } $table->data['agent_'.$downtime_agent['id_agente']] = $data; @@ -1263,17 +1475,7 @@ if (empty($downtimes_agents)) { html_print_table($table); } -$table = new stdClass(); -$table->id = 'loading'; -$table->width = '100%'; -$table->colspan['loading'][0] = '6'; -$table->style[0] = 'text-align: center;'; -$table->data = []; -$table->data['loading'] = []; -$table->data['loading'][0] = html_print_image('images/spinner.gif', true); -echo "'; +ui_print_spinner('Loading'); $table = new stdClass(); $table->id = 'editor'; diff --git a/pandora_console/godmode/agentes/planned_downtime.list.php b/pandora_console/godmode/agentes/planned_downtime.list.php index 0eda511a48..da860c1bbc 100755 --- a/pandora_console/godmode/agentes/planned_downtime.list.php +++ b/pandora_console/godmode/agentes/planned_downtime.list.php @@ -14,7 +14,7 @@ * |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______| * * ============================================================================ - * Copyright (c) 2005-2022 Artica Soluciones Tecnologicas + * Copyright (c) 2005-2023 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 @@ -89,7 +89,7 @@ if (is_ajax() === true) { [ 'id' => 'agent_modules_affected_planned_downtime', 'class' => 'info_table', - 'style' => 'width: 100%', + 'style' => 'width: 99%', 'columns' => $columns, 'column_names' => $column_names, 'ajax_url' => 'godmode/agentes/planned_downtime.list', @@ -103,6 +103,7 @@ if (is_ajax() === true) { ], 'search_button_class' => 'sub filter float-right', 'form' => [ + 'class' => 'filter-table-adv', 'inputs' => [ [ 'label' => __('Agents'), @@ -207,13 +208,23 @@ if ($migrate_malformed === true) { } // Header. -ui_print_page_header( +ui_print_standard_header( __('Scheduled Downtime'), 'images/gm_monitoring.png', false, '', true, - '' + [], + [ + [ + 'link' => '', + 'label' => __('Tools'), + ], + [ + 'link' => '', + 'label' => __('Scheduled Downtime'), + ], + ], ); $id_downtime = (int) get_parameter('id_downtime', 0); @@ -308,34 +319,8 @@ $filter_params['module_name'] = $module_name; $filter_params_str = http_build_query($filter_params); -// Table filter. -$table_form = new StdClass(); -$table_form->class = 'databox filters'; -$table_form->width = '100%'; -$table_form->rowstyle = []; -$table_form->cellstyle[0] = ['width: 100px;']; -$table_form->cellstyle[1] = ['width: 100px;']; -$table_form->cellstyle[1][2] = 'display: flex; align-items: center;'; -$table_form->cellstyle[2] = ['width: 100px;']; -$table_form->cellstyle[3] = ['text-align: right;']; -$table_form->colspan[3][0] = 3; -$table_form->data = []; - -$row = []; - -// Search text. -$row[] = __('Search'); - -$row[] = html_print_input_text( - 'search_text', - $search_text, - '', - 50, - 250, - true -); -// Dates. -$date_inputs = __('From').' '.html_print_input_text( +// From/To inputs. +$date_inputs = html_print_input_text( 'date_from', $date_from, '', @@ -343,8 +328,8 @@ $date_inputs = __('From').' '.html_print_input_text( 10, true ); -$date_inputs .= '  '; -$date_inputs .= __('To').' '.html_print_input_text( +$date_inputs .= ' '.__('To').' '; +$date_inputs .= html_print_input_text( 'date_to', $date_to, '', @@ -352,11 +337,6 @@ $date_inputs .= __('To').' '.html_print_input_text( 10, true ); -$row[] = $date_inputs; - -$table_form->data[] = $row; - -$row = []; // Execution type. $execution_type_fields = [ @@ -364,29 +344,6 @@ $execution_type_fields = [ 'periodically' => __('Periodically'), 'cron' => __('Cron'), ]; -$row[] = __('Execution type'); -$row[] = html_print_select( - $execution_type_fields, - 'execution_type', - $execution_type, - '', - __('Any'), - '', - true, - false, - false -); -// Show past downtimes. -$row[] = __('Show past downtimes').'    '.html_print_switch( - [ - 'name' => 'archived', - 'value' => $show_archived, - ] -); - -$table_form->data[] = $row; - -$row = []; // Agent. $params = []; @@ -397,36 +354,89 @@ $params['return'] = true; $params['print_hidden_input_idagent'] = true; $params['hidden_input_idagent_name'] = 'agent_id'; $params['hidden_input_idagent_value'] = $agent_id; -$row[] = __('Agent'); -$row[] = ui_print_agent_autocomplete_input($params); -// Module. -$row[] = __('Module').' '.html_print_autocomplete_modules( - 'module_name', - $module_name, - false, - true, - '', - [], - true -); - -$table_form->data[] = $row; - -$row = []; - -$row[] = html_print_submit_button( +// Table filter. +$table_form = new stdClass(); +$table_form->class = 'filter-table-adv'; +$table_form->id = 'filter_scheduled_downtime'; +$table_form->width = '100%'; +$table_form->rowstyle = []; +$table_form->cellstyle[0] = ['width: 100px;']; +$table_form->cellstyle[1] = ['width: 100px;']; +$table_form->cellstyle[1][2] = 'display: flex; align-items: center;'; +$table_form->cellstyle[2] = ['width: 100px;']; +$table_form->cellstyle[3] = ['text-align: right;']; +$table_form->data = []; +// Search text. +$table_form->data[0][] = html_print_label_input_block( __('Search'), - 'search', - false, - [ - 'icon' => 'search', - 'mode' => 'mini', - ], - true + html_print_input_text( + 'search_text', + $search_text, + '', + 50, + 250, + true + ) +); +// From / To. +$table_form->data[0][] = html_print_label_input_block( + __('Between dates'), + html_print_div( + [ + 'class' => 'flex-content-left', + 'content' => $date_inputs, + ], + true + ) +); +// Show past downtimes. +$table_form->data[0][] = html_print_label_input_block( + __('Show past downtimes'), + html_print_switch( + [ + 'name' => 'archived', + 'value' => $show_archived, + ] + ) +); +// Execution type. +$table_form->data[1][] = html_print_label_input_block( + __('Execution type'), + html_print_select( + $execution_type_fields, + 'execution_type', + $execution_type, + '', + __('Any'), + '', + true, + false, + false + ) +); + +$table_form->data[1][] = html_print_label_input_block( + __('Agent'), + ui_print_agent_autocomplete_input($params) +); + +$table_form->data[1][] = html_print_label_input_block( + __('Module'), + html_print_autocomplete_modules( + 'module_name', + $module_name, + false, + true, + '', + [], + true, + 0, + 30, + true + ) ); -$table_form->data[] = $row; // End of table filter. // Useful to know if the user has done a form filtering. $filter_performed = false; @@ -629,41 +639,86 @@ if ($downtimes === false && $filter_performed === false) { // No downtimes cause the user performed a search. // Filter form. echo '
        '; - html_print_table($table_form); + $outputTable = html_print_table($table_form, true); + $outputTable .= html_print_div( + [ + 'class' => 'action-buttons-right-forced', + 'content' => html_print_submit_button( + __('Filter'), + 'search', + false, + [ + 'icon' => 'search', + 'mode' => 'mini', + ], + true + ), + ], + true + ); + ui_toggle( + $outputTable, + ''.__('Filters').'', + __('Filters'), + '', + true, + false, + '', + 'white-box-content', + 'box-flat white_table_graph fixed_filter_bar' + ); echo '
        '; // Info message. - echo '
        '.__('No scheduled downtime').'
        '; + ui_print_info_message(__('No scheduled downtime')); // Create button. if ($write_permisson === true) { echo '
        '; - html_print_div( - [ - 'class' => 'action-buttons', - 'content' => html_print_submit_button( - __('Create'), - 'create', - false, - ['icon' => 'next'], - true - ), - ] + html_print_action_buttons( + html_print_submit_button( + __('Create'), + 'create', + false, + ['icon' => 'next'], + true + ) ); echo '
        '; } } else { // Has downtimes. echo '
        '; - html_print_table($table_form); + $outputTable = html_print_table($table_form, true); + $outputTable .= html_print_div( + [ + 'class' => 'action-buttons-right-forced', + 'content' => html_print_submit_button( + __('Search'), + 'search', + false, + [ + 'icon' => 'search', + 'mode' => 'mini', + ], + true + ), + ], + true + ); + ui_toggle( + $outputTable, + ''.__('Filters').'', + __('Filters'), + '', + true, + false, + '', + 'white-box-content', + 'box-flat white_table_graph fixed_filter_bar' + ); echo '
        '; - ui_pagination( - $downtimes_number, - $url_list.'&'.$filter_params_str, - $offset - ); - // User groups with AR, AD or AW permission. $groupsAD = users_get_groups($config['id_user'], $access); $groupsAD = array_keys($groupsAD); @@ -762,17 +817,17 @@ if ($downtimes === false && $filter_performed === false) { $settings = [ 'url' => ui_get_full_url('ajax.php', false, false, false), 'loadingText' => __('Loading, this operation might take several minutes...'), - 'title' => __('Agents / Modules affected'), + 'title' => __('Elements affected'), 'id' => $downtime['id'], ]; $data['agents_modules'] = ''; $data['agents_modules'] .= html_print_image( - 'images/search_big.png', + 'images/details.svg', true, [ 'title' => __('Agents and modules affected'), - 'style' => 'width:22px; height: 22px;', + 'class' => 'main_menu_icon invert_filter', ] ); $data['agents_modules'] .= ''; @@ -789,15 +844,21 @@ if ($downtimes === false && $filter_performed === false) { $url_list_params = $url_list.'&stop_downtime=1&id_downtime='.$downtime['id'].'&'.$filter_params_str; $data['stop'] = ''; $data['stop'] .= html_print_image( - 'images/cancel.png', + 'images/fail@svg.svg', true, - ['title' => __('Stop downtime')] + [ + 'title' => __('Stop downtime'), + 'class' => 'main_menu_icon invert_filter', + ] ); } else { $data['stop'] = html_print_image( - 'images/cancel.png', + 'images/fail@svg.svg', true, - ['title' => __('Stop downtime')] + [ + 'title' => __('Stop downtime'), + 'class' => 'main_menu_icon invert_filter', + ] ); } } else { @@ -812,11 +873,11 @@ if ($downtimes === false && $filter_performed === false) { // Copy. $data['copy'] = ''; $data['copy'] .= html_print_image( - 'images/copy.png', + 'images/copy.svg', true, [ 'title' => __('Copy'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ); $data['copy'] .= ''; @@ -824,11 +885,11 @@ if ($downtimes === false && $filter_performed === false) { // Edit. $data['edit'] = ''; $data['edit'] .= html_print_image( - 'images/config.png', + 'images/configuration@svg.svg', true, [ 'title' => __('Update'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ); $data['edit'] .= ''; @@ -837,11 +898,11 @@ if ($downtimes === false && $filter_performed === false) { $url_delete = $url_list.'&delete_downtime=1&id_downtime='.$downtime['id'].'&'.$filter_params_str; $data['delete'] = ''; $data['delete'] .= html_print_image( - 'images/cross.png', + 'images/delete.svg', true, [ 'title' => __('Delete'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ); $data['delete'] .= ''; @@ -858,22 +919,22 @@ if ($downtimes === false && $filter_performed === false) { // Copy. $data['copy'] = ''; $data['copy'] .= html_print_image( - 'images/copy.png', + 'images/copy.svg', true, [ 'title' => __('Copy'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ); $data['copy'] .= ''; // Edit. $data['edit'] = ''; $data['edit'] .= html_print_image( - 'images/config.png', + 'images/configuration@svg.svg', true, [ 'title' => __('Update'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ); $data['edit'] .= ''; @@ -910,44 +971,47 @@ if ($downtimes === false && $filter_performed === false) { } html_print_table($table); - ui_pagination( + $tablePagination = ui_pagination( $downtimes_number, $url_list.'&'.$filter_params_str, $offset, 0, - false, - 'offset', true, - 'pagination-bottom' + 'offset', + false ); - echo '
        '; - - // CSV export button. - echo '
        '; - html_print_button( - __('Export to CSV'), - 'csv_export', - false, - 'blockResubmit($(this)); location.href=\'godmode/agentes/planned_downtime.export_csv.php?'.$filter_params_str.'\'', - 'class="sub next"' - ); - echo '
        '; - + $actionsButtons = ''; // Create button. if ($write_permisson === true) { - echo ' '; - echo '
        '; - html_print_submit_button( + $actionsButtons .= ''; + $actionsButtons .= html_print_submit_button( __('Create'), 'create', false, - 'class="sub next"' + ['icon' => 'next'], + true ); - echo '
        '; + $actionsButtons .= ''; } - echo '
        '; + // CSV export button. + $actionsButtons .= html_print_button( + __('Export to CSV'), + 'csv_export', + false, + 'blockResubmit($(this)); location.href="godmode/agentes/planned_downtime.export_csv.php?'.$filter_params_str.'"', + [ + 'icon' => 'load', + 'mode' => 'secondary', + ], + true + ); + + html_print_action_buttons( + $actionsButtons, + [ 'right_content' => $tablePagination ] + ); } ui_require_jquery_file( From f5daa72c6b603f3f622dfeae10532ed2b7b2ec3c Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Wed, 8 Mar 2023 15:04:07 +0100 Subject: [PATCH 536/563] Scheduled downtime --- .../agentes/planned_downtime.editor.php | 58 ++----------------- 1 file changed, 4 insertions(+), 54 deletions(-) diff --git a/pandora_console/godmode/agentes/planned_downtime.editor.php b/pandora_console/godmode/agentes/planned_downtime.editor.php index b0925a787a..32fdcac6be 100644 --- a/pandora_console/godmode/agentes/planned_downtime.editor.php +++ b/pandora_console/godmode/agentes/planned_downtime.editor.php @@ -29,8 +29,6 @@ global $config; - - check_login(); $agent_d = check_acl($config['id_user'], 0, 'AD'); @@ -1288,54 +1286,6 @@ $table->data[6][0] = html_print_div( true ); -// $table->data[0][2] = __('Recursion').'  '.html_print_checkbox('recursion', 1, $recursion, true, false, ''); -/* - $table->data[1][0] = __('Available agents'); - $table->data[1][1] = html_print_select($agents, 'id_agents[]', -1, '', _('Any'), -2, true, true, true, '', false, 'min-width: 250px;width: 70%;'); -*/ -/* - $table->rowid[2] = 'available_modules_selection_mode'; - - $table->data[2][1] = html_print_select( - [ - 'common' => __('Show common modules'), - 'all' => __('Show all modules'), - ], - 'modules_selection_mode', - 'common', - false, - '', - '', - true, - false, - true, - '', - false, - 'min-width:180px;' - ); - - - $table->rowid[3] = 'available_modules'; - $table->data[3][0] = __('Available modules:').ui_print_help_tip( - __('Only for type Quiet for downtimes.'), - true - ); - - $table->data[3][1] = html_print_select( - [], - 'module[]', - '', - '', - '', - 0, - true, - true, - true, - '', - false, - 'min-width: 250px;width: 70%;' - ); -*/ // Print agent table. if ($id_downtime > 0) { echo "
        "; @@ -1779,13 +1729,13 @@ function insert_downtime_agent($id_downtime, $user_groups_ad) switch ($("#type_downtime").val()) { case 'disable_agents_alerts': case 'disable_agents': - $("#available_modules").hide(); - $("#available_modules_selection_mode").hide(); + $(".available_modules").hide(); + $(".available_modules_selection_mode").hide(); break; case 'quiet': case 'disable_agent_modules': - $("#available_modules_selection_mode").show(); - $("#available_modules").show(); + $(".available_modules_selection_mode").show(); + $(".available_modules").show(); break; } } From 0304c1f18e4d7e910699803df86f01b496e1cf75 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Wed, 8 Mar 2023 15:23:42 +0100 Subject: [PATCH 537/563] Calendar CSS styles --- pandora_console/include/styles/js/calendar.css | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/pandora_console/include/styles/js/calendar.css b/pandora_console/include/styles/js/calendar.css index 73315cf0e3..c5473e3199 100644 --- a/pandora_console/include/styles/js/calendar.css +++ b/pandora_console/include/styles/js/calendar.css @@ -6,7 +6,7 @@ /* Calendar background */ table.scw { - background-color: #82b92e; + background-color: var(--secondary-color); border: 0 !important; border-radius: 4px; } @@ -65,3 +65,19 @@ td.scwFoot { color: #3c3c3c !important; border: 0 !important; } + +.scwHead input { + line-height: 6px; + padding-left: 5px; + background-color: #000; + color: #cccccc; +} + +.scwHead input:hover { + background-color: #cccccc; + color: #000; +} + +table.scw { + border: 2px solid #c0ccdc; +} From 87e82c04105e6ff33589f1bd985a7b49c21dc82e Mon Sep 17 00:00:00 2001 From: Pablo Aragon Date: Wed, 8 Mar 2023 15:30:48 +0100 Subject: [PATCH 538/563] 10457-Audit log, save/load filters --- pandora_console/include/ajax/audit_log.php | 41 ++++++++++++------- .../include/class/AuditLog.class.php | 4 +- pandora_console/include/styles/pandora.css | 37 +++++++++++++++++ pandora_console/include/styles/tables.css | 4 -- 4 files changed, 66 insertions(+), 20 deletions(-) diff --git a/pandora_console/include/ajax/audit_log.php b/pandora_console/include/ajax/audit_log.php index 3bf5e09d24..4d92704852 100644 --- a/pandora_console/include/ajax/audit_log.php +++ b/pandora_console/include/ajax/audit_log.php @@ -135,18 +135,15 @@ if ($load_filter_modal) { $table->width = '100%'; $table->cellspacing = 4; $table->cellpadding = 4; - $table->class = 'databox'; + $table->class = 'databox no_border'; if (is_metaconsole()) { $table->cellspacing = 0; $table->cellpadding = 0; - $table->class = 'databox filters'; + $table->class = 'databox filters no_border'; } $table->styleTable = 'font-weight: bold; color: #555; text-align:left;'; - $filter_id_width = '200px'; - if (is_metaconsole()) { - $filter_id_width = '150px'; - } + $filter_id_width = 'w100p'; $data = []; $table->rowid[3] = 'update_filter_row1'; @@ -165,11 +162,17 @@ if ($load_filter_modal) { false, 'margin-left:5px; width:'.$filter_id_width.';' ); + + $table->rowclass[] = 'display-grid'; $data[1] = html_print_submit_button( __('Load filter'), 'load_filter', false, - 'class="sub upd" onclick="load_filter_values()"', + [ + 'class' => 'mini w25p', + 'style' => 'margin-left: 73%', + 'onclick' => 'load_filter_values();', + ], true ); $data[1] .= html_print_input_hidden('load_filter', 1, true); @@ -186,7 +189,7 @@ function show_filter() { draggable: true, modal: false, closeOnEscape: true, - width: 450 + width: 500 }); } @@ -238,7 +241,7 @@ $(document).ready (function() { if ($save_filter_modal) { - echo '
        '; + echo '
        '; if (check_acl($config['id_user'], 0, 'EW') === 1 || check_acl($config['id_user'], 0, 'EM') === 1) { echo '
        '; @@ -247,9 +250,9 @@ if ($save_filter_modal) { $table->width = '100%'; $table->cellspacing = 4; $table->cellpadding = 4; - $table->class = 'databox'; + $table->class = 'databox no_border'; if (is_metaconsole()) { - $table->class = 'databox filters'; + $table->class = 'databox filters no_border'; $table->cellspacing = 0; $table->cellpadding = 0; } @@ -289,7 +292,11 @@ if ($save_filter_modal) { __('Save filter'), 'save_filter', false, - 'class="sub wand" onclick="save_new_filter();"', + [ + 'class' => 'mini w25p', + 'style' => 'margin-left: 56%', + 'onclick' => 'save_new_filter();', + ], true ); @@ -317,11 +324,16 @@ if ($save_filter_modal) { 0, true ); + $table->rowclass[] = 'display-grid'; $data[1] = html_print_submit_button( __('Update filter'), 'update_filter', false, - 'class="sub upd" onclick="save_update_filter();"', + [ + 'class' => 'mini w25p', + 'style' => 'margin-left: 56%', + 'onclick' => 'save_update_filter();', + ], true ); @@ -359,7 +371,8 @@ function show_save_filter() { resizable: true, draggable: true, modal: false, - closeOnEscape: true + closeOnEscape: true, + width: 380 }); } diff --git a/pandora_console/include/class/AuditLog.class.php b/pandora_console/include/class/AuditLog.class.php index 31120b7014..93f391ee73 100644 --- a/pandora_console/include/class/AuditLog.class.php +++ b/pandora_console/include/class/AuditLog.class.php @@ -437,7 +437,7 @@ class AuditLog extends HTML $('#audit_logs').css('width','95% !important'); }); - $('#save-filter').click(function() { + $('#button-save-filter').click(function() { if ($('#save-filter-select').length) { $('#save-filter-select').dialog({ width: "20%", @@ -495,7 +495,7 @@ class AuditLog extends HTML }); /* Filter management */ - $('#load-filter').click(function (){ + $('#button-load-filter').click(function (){ if($('#load-filter-select').length) { $('#load-filter-select').dialog({width: "20%", maxWidth: "25%", diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 4837f18d08..ee4a24d5f5 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -86,6 +86,43 @@ font-weight: 900; } +/* +@font-face { + font-family: "lato-italic"; + src: url("../fonts/Lato-Italic.woff") format("woff"); + font-weight: 400; + font-style: italic; +} + +@font-face { + font-family: "lato"; + src: url("../fonts/Lato-LightItalic.woff") format("woff"); + font-weight: 300; + font-style: italic; +} + +@font-face { + font-family: "lato"; + src: url("../fonts/Lato-ThinItalic.woff") format("woff"); + font-weight: 100; + font-style: italic; +} + +@font-face { + font-family: "lato"; + src: url("../fonts/Lato-BoldItalic.woff") format("woff"); + font-weight: 700; + font-style: italic; +} + +@font-face { + font-family: "lato"; + src: url("../fonts/Lato-BlackItalic.woff") format("woff"); + font-weight: 900; + font-style: italic; +} +*/ + @font-face { font-family: "source-code"; src: url("../fonts/SourceCodePro.woff") format("woff"); diff --git a/pandora_console/include/styles/tables.css b/pandora_console/include/styles/tables.css index 4383e02ea5..4ff2775884 100644 --- a/pandora_console/include/styles/tables.css +++ b/pandora_console/include/styles/tables.css @@ -648,10 +648,6 @@ td#save_filter_form-1-0 > b { line-height: 16px; } -tr#save_filter_row1 { - display: flex !important; -} - td#save_filter_form-0-0, td#save_filter_form-0-1, td#save_filter_form-1-0 > input#text-id_name, From 63ecb7eb0be6fd088d5ad2ab194d1294e273a3d8 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Wed, 8 Mar 2023 15:45:18 +0100 Subject: [PATCH 539/563] Tree view metaconsole view like nodo --- .../include/functions_treeview.php | 2 +- .../include/graphs/functions_flot.php | 2 +- pandora_console/operation/tree.php | 22 +++---------------- pandora_console/pandoradb.sql | 14 ++++++++++++ 4 files changed, 19 insertions(+), 21 deletions(-) diff --git a/pandora_console/include/functions_treeview.php b/pandora_console/include/functions_treeview.php index e86c728fa7..e93910ec15 100755 --- a/pandora_console/include/functions_treeview.php +++ b/pandora_console/include/functions_treeview.php @@ -588,7 +588,7 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) $hashdata = md5($hashdata); if ((bool) $grants_on_node === true && (bool) $user_access_node !== false) { - $urlAgent = 'sendHash(\''.$server_data['server_url'].'/index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente='.$agent['id_agente'].'\')'; + $urlAgent = $server_data['server_url'].'/index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente='.$agent['id_agente']; } else { $urlAgent = ''; } diff --git a/pandora_console/include/graphs/functions_flot.php b/pandora_console/include/graphs/functions_flot.php index 4c5811b746..dc32be4b9b 100644 --- a/pandora_console/include/graphs/functions_flot.php +++ b/pandora_console/include/graphs/functions_flot.php @@ -855,7 +855,7 @@ function flot_slicesbar_graph( $full_legend_date = false; } - if (!$date_to) { + if (!$date_to || $date_to === '1') { $date_to = get_system_time(); } diff --git a/pandora_console/operation/tree.php b/pandora_console/operation/tree.php index 0054361e07..25b696a69e 100755 --- a/pandora_console/operation/tree.php +++ b/pandora_console/operation/tree.php @@ -27,11 +27,7 @@ */ // Begin. -if (is_metaconsole() === true) { - ui_require_css_file('tree_meta'); -} else { - ui_require_css_file('tree'); -} +ui_require_css_file('tree'); ui_require_css_file('fixed-bottom-box'); @@ -168,10 +164,6 @@ switch ($tab) { break; } -if (is_metaconsole() === true) { - $tabs = []; -} - if (!$strict_acl) { $header_title = $header_title.' » '.$header_sub_title; } @@ -373,11 +365,7 @@ html_print_input_hidden('tag-id', $tag_id); ui_include_time_picker(); ui_require_jquery_file('ui.datepicker-'.get_user_language(), 'include/javascript/i18n/'); -if (is_metaconsole() === true) { - ui_require_javascript_file('TreeControllerMeta', 'include/javascript/tree/'); -} else { - ui_require_javascript_file('TreeController', 'include/javascript/tree/'); -} +ui_require_javascript_file('TreeController', 'include/javascript/tree/'); ui_print_spinner(__('Loading')); @@ -388,10 +376,6 @@ html_print_div( ] ); -if (is_metaconsole() === true) { - echo '
        '; -} - $infoHeadTitle = 'Sombra oscura'; ?> @@ -505,7 +489,7 @@ $infoHeadTitle = 'Sombra oscura'; emptyMessage: "", foundMessage: foundMessage, tree: data.tree, - baseURL: "", + baseURL: "", ajaxURL: "", filter: parameters['filter'], counterTitles: { diff --git a/pandora_console/pandoradb.sql b/pandora_console/pandoradb.sql index 33bec21130..bfcb4d1582 100644 --- a/pandora_console/pandoradb.sql +++ b/pandora_console/pandoradb.sql @@ -4206,3 +4206,17 @@ CREATE TABLE `tevent_sound` ( `sound` TEXT NULL, `active` TINYINT NOT NULL DEFAULT '1', PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- --------------------------------------------------------------------- +-- Table `tsesion_filter` +-- --------------------------------------------------------------------- +CREATE TABLE IF NOT EXISTS `tsesion_filter` ( + `id_filter` INT NOT NULL AUTO_INCREMENT, + `id_name` TEXT NULL, + `text` TEXT NULL, + `period` TEXT NULL, + `ip` TEXT NULL, + `type` TEXT NULL, + `user` TEXT NULL, + PRIMARY KEY (`id_filter`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file From 434aa1dbc38147c47af2fd49d2383787449bf0fe Mon Sep 17 00:00:00 2001 From: Jonathan Date: Wed, 8 Mar 2023 15:57:55 +0100 Subject: [PATCH 540/563] z-index fix on buttons and mesage --- pandora_console/include/functions_html.php | 2 +- pandora_console/include/styles/pandora.css | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index b120b4d128..5d6f413573 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -3477,7 +3477,7 @@ function html_print_action_buttons(mixed $content, array $parameters=[], bool $r 'id' => ($parameters['id'] ?? 'principal_action_buttons'), 'class' => 'action-buttons '.$typeClass.' '.($parameters['class'] ?? ''), 'content' => $content, - 'style' => 'z-index: 1', + 'style' => 'z-index: 6', ], $return ); diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 8c2768f356..f694d788c6 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -2109,6 +2109,10 @@ table.rounded_cells td { z-index: 5; } +#principal_action_buttons { + z-index: 6; +} + .action-buttons > button { margin-left: 16px; } @@ -2790,7 +2794,7 @@ td.cellBig { } .info_box_container:not(.info_box_information) { - z-index: 2; + z-index: 6; } .info_box_container.info_box_information { From 72990ab177c008d424b738022cf91873865a735a Mon Sep 17 00:00:00 2001 From: Daniel Maya Date: Wed, 8 Mar 2023 16:41:26 +0100 Subject: [PATCH 541/563] #9662 Fixed pandora black --- pandora_console/include/styles/menu.css | 4 +- .../include/styles/pandora_black.css | 87 +++++++++++++++++-- 2 files changed, 80 insertions(+), 11 deletions(-) diff --git a/pandora_console/include/styles/menu.css b/pandora_console/include/styles/menu.css index db1eebb9da..b8085838bb 100644 --- a/pandora_console/include/styles/menu.css +++ b/pandora_console/include/styles/menu.css @@ -598,7 +598,7 @@ ul li { display: flex; align-items: center; justify-content: space-evenly; - min-height: 53px; + min-height: 50px; } .tabs_li { @@ -637,7 +637,7 @@ ul li { } .tabs_collapsed { - height: 53px; + height: 50px; display: flex; justify-content: center; align-items: center; diff --git a/pandora_console/include/styles/pandora_black.css b/pandora_console/include/styles/pandora_black.css index b09d441686..da9f58a9de 100644 --- a/pandora_console/include/styles/pandora_black.css +++ b/pandora_console/include/styles/pandora_black.css @@ -67,11 +67,22 @@ table.agent_info_table tr { color: #fff !important; } -div#head, -#menu_tabs { +div#head { border-bottom: 1px solid #1a1a1a; } +.menu_full_classic #menu_tabs { + height: 49px; + border-bottom: 1px solid #82b92e; + padding-bottom: 2px; +} + +.menu_full_collapsed #menu_tabs { + height: 49px; + border-bottom: 1px solid #82b92e; + padding-bottom: 1px; +} + #menu_full { border-right: 1px solid #111; } @@ -248,13 +259,10 @@ ol.steps li a { /* Tabs icons change color */ /* menu.css */ -.operation { - background-color: #252525; -} - +.operation, .godmode, #menu_full { - background-color: #1a1a1a; + background-color: #222; } .button_collapse { @@ -264,11 +272,72 @@ ol.steps li a { .operation .selected, .godmode .selected, .menu_icon:hover { - background-color: #080808; + background-color: #191919; +} + +.submenu_text, +.span_has_menu_text, +.title_menu_classic span { + font-size: 14px; + font-weight: normal; + letter-spacing: -0.3px; + height: 18px; + color: #fff; +} + +.head_tab_selected span { + color: #fff; +} + +.tabs_selected { + background-color: #1d7874; +} + +.operation .menu_icon ul.submenu > li, +.godmode .menu_icon ul.submenu > li { + background-color: #222; + padding-left: 24px !important; +} + +.submenu_not_selected:hover { + background-color: #171717 !important; + color: #fff !important; +} + +.submenu_selected { + margin-bottom: 0px; + background-color: #171717 !important; +} + +.submenu_selected_no_submenu { + background-color: #111 !important; + color: #ffffff !important; } .sub_subMenu { - background-color: #343434; + font-weight: normal; + background-color: #171717; + padding-left: 1.5em; + color: #fff !important; +} + +.sub_subMenu.selected { + font-weight: 600; + background-color: #111 !important; +} + +.sub_subMenu:hover { + background-color: #141414; +} + +.sub_subMenu.selected a { + color: #fff !important; +} + +.span_has_menu_text { + font-weight: normal; + font-size: 9.4pt; + color: #fff; } /* footer */ From 54e6a99cc3c0ca65593a71a7e1b1aa0c6fab1749 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Wed, 8 Mar 2023 17:09:42 +0100 Subject: [PATCH 542/563] Dashboard pagination visual position --- pandora_console/include/styles/pandora.css | 3 +++ pandora_console/views/dashboard/listWidgets.php | 6 ++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index f694d788c6..43e66868bd 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -7535,6 +7535,9 @@ div.graph div.legend table { .pdd_t_0px { padding-top: 0px; } +.pdd_t_0px_important { + padding-top: 0px !important; +} .pdd_t_3px { padding-top: 3px; diff --git a/pandora_console/views/dashboard/listWidgets.php b/pandora_console/views/dashboard/listWidgets.php index c7cac752f0..5ce90af8c7 100644 --- a/pandora_console/views/dashboard/listWidgets.php +++ b/pandora_console/views/dashboard/listWidgets.php @@ -48,6 +48,7 @@ $inputs = [ 'class' => 'search_input', 'autofocus' => true, ], + 'class' => 'pdd_t_0px_important', ], ]; @@ -58,9 +59,8 @@ HTML::printForm( ] ); -ui_pagination($total, '#', $offset, 9); -$output = '
        '; +$output = '
        '; foreach ($widgets as $widget) { $urlWidgets = $config['homedir']; @@ -97,3 +97,5 @@ foreach ($widgets as $widget) { $output .= '
        '; echo $output; + +ui_pagination($total, '#', $offset, 9, false, 'offset', false, 'center mrgn_top_10px'); From bb1d9c323d4772ba05cd5e51a281ab578453569a Mon Sep 17 00:00:00 2001 From: Pablo Aragon Date: Wed, 8 Mar 2023 17:12:15 +0100 Subject: [PATCH 543/563] Admin tools --- pandora_console/godmode/setup/links.php | 98 +++++++++++++------ .../include/class/Diagnostics.class.php | 14 ++- .../include/styles/diagnostics.css | 4 +- pandora_console/include/styles/omnishell.css | 16 --- 4 files changed, 78 insertions(+), 54 deletions(-) diff --git a/pandora_console/godmode/setup/links.php b/pandora_console/godmode/setup/links.php index f1a5e9fca2..7bd589fe27 100644 --- a/pandora_console/godmode/setup/links.php +++ b/pandora_console/godmode/setup/links.php @@ -25,7 +25,20 @@ if (! check_acl($config['id_user'], 0, 'PM') && ! is_user_admin($config['id_user } // Header -ui_print_page_header(__('Link management'), 'images/extensions.png', false, '', true, ''); +ui_print_standard_header( + __('Admin tools'), + 'images/extensions.png', + false, + '', + true, + [], + [ + [ + 'link' => '', + 'label' => __('Link management'), + ], + ] +); if (isset($_POST['create'])) { @@ -98,7 +111,7 @@ if ((isset($_GET['form_add'])) or (isset($_GET['form_edit']))) { $link = ''; } - echo ''; + echo '
        '; echo ''; if ($creation_mode == 1) { echo ""; @@ -112,17 +125,42 @@ if ((isset($_GET['form_add'])) or (isset($_GET['form_edit']))) { } echo "'>"; - echo ' - - '; - echo ' - - '; - echo ''; + echo ''; + echo ''; + echo ''; echo '
        '.__('Link name').'
        '.__('Link').' -
        '; + echo html_print_label_input_block( + __('Link name'), + html_print_input_text( + 'name', + $nombre, + '', + 50, + 255, + true, + false, + true, + '', + 'text_input' + ) + ); + echo ''; + echo html_print_label_input_block( + __('Link'), + html_print_input_text( + 'link', + $link, + '', + 50, + 255, + true, + false, + true, + '', + 'text_input' + ) + ); + echo '
        '; - echo ""; - echo "
        "; if (isset($_GET['form_add']) === true) { $actionForPerform = __('Create'); $iconForPerform = 'wand'; @@ -131,16 +169,14 @@ if ((isset($_GET['form_add'])) or (isset($_GET['form_edit']))) { $iconForPerform = 'update'; } - html_print_div( - [ - 'class' => 'action-buttons', - 'content' => html_print_submit_button( - $actionForPerform, - 'crtbutton', - false, - [ 'icon' => $iconForPerform ] - ), - ], + html_print_action_buttons( + html_print_submit_button( + $actionForPerform, + 'crtbutton', + false, + [ 'icon' => $iconForPerform ], + true + ) ); echo '
        '; @@ -185,16 +221,14 @@ if ((isset($_GET['form_add'])) or (isset($_GET['form_edit']))) { echo ""; echo "
        "; - html_print_div( - [ - 'class' => 'action-buttons', - 'content' => html_print_submit_button( - __('Add'), - 'form_add', - false, - [ 'icon' => 'wand' ] - ), - ], + html_print_action_buttons( + html_print_submit_button( + __('Add'), + 'form_add', + false, + [ 'icon' => 'wand' ], + true + ) ); echo '
        '; diff --git a/pandora_console/include/class/Diagnostics.class.php b/pandora_console/include/class/Diagnostics.class.php index 02bec5060d..f7a660f2c4 100644 --- a/pandora_console/include/class/Diagnostics.class.php +++ b/pandora_console/include/class/Diagnostics.class.php @@ -155,13 +155,19 @@ class Diagnostics extends Wizard ]; // Header. - ui_print_page_header( - __('%s Diagnostic tool', $this->product_name), + ui_print_standard_header( + __('Admin tools'), 'images/gm_massive_operations.png', false, '', true, - $header_buttons + $header_buttons, + [ + [ + 'link' => '', + 'label' => __('%s Diagnostic tool', $this->product_name), + ], + ] ); // Print all Methods Diagnostic Info. @@ -1569,7 +1575,7 @@ class Diagnostics extends Wizard [ 'id' => $tableId, 'class' => 'info_table caption_table', - 'style' => 'width: 100%', + 'style' => 'width: 99%', 'columns' => $columns, 'column_names' => $columnNames, 'ajax_data' => [ diff --git a/pandora_console/include/styles/diagnostics.css b/pandora_console/include/styles/diagnostics.css index 6591adabff..706038cbd0 100644 --- a/pandora_console/include/styles/diagnostics.css +++ b/pandora_console/include/styles/diagnostics.css @@ -8,8 +8,8 @@ text-align: center; font-size: 1.5em; font-weight: bolder; - color: #fff; - background: #282828; + color: #000; + background: var(--secondary-color); padding: 8px; } diff --git a/pandora_console/include/styles/omnishell.css b/pandora_console/include/styles/omnishell.css index 03810e9a89..7d97fdd866 100644 --- a/pandora_console/include/styles/omnishell.css +++ b/pandora_console/include/styles/omnishell.css @@ -489,14 +489,6 @@ li > .select2-selection { padding: 0px !important; } -.box-flat { - margin: 20px; -} - -.mrgn_20px { - margin: 20px !important; -} - .omnishell_results_wrapper { max-width: 100% !important; } @@ -547,10 +539,6 @@ ul.datatable_filter > li > div.action-buttons > button { height: auto !important; } -.action_buttons_right_content { - padding-left: 20px; -} - #image-1, #image-2 { padding-left: 0px !important; @@ -560,10 +548,6 @@ ul.datatable_filter > li > div.action-buttons > button { margin-bottom: 10px !important; } -.dataTables_length { - margin-bottom: 50px !important; -} - .item_status_tree_view { position: initial; } From e21d9968e818e2015fb6088f5fd3511b503402b7 Mon Sep 17 00:00:00 2001 From: daniel Date: Wed, 8 Mar 2023 19:25:25 +0100 Subject: [PATCH 544/563] fixed styles --- pandora_console/general/header.php | 4 - .../godmode/agentes/module_manager.php | 216 ------------------ .../agentes/module_manager_editor_common.php | 8 +- pandora_console/include/class/HTML.class.php | 2 +- pandora_console/include/functions_ui.php | 4 +- pandora_console/include/styles/pandora.css | 3 +- pandora_console/index.php | 4 + 7 files changed, 13 insertions(+), 228 deletions(-) diff --git a/pandora_console/general/header.php b/pandora_console/general/header.php index c4915e366d..81526eb129 100644 --- a/pandora_console/general/header.php +++ b/pandora_console/general/header.php @@ -471,10 +471,6 @@ echo sprintf('
        ', $menuTypeClass);
        - - - - diff --git a/pandora_console/godmode/agentes/module_manager.php b/pandora_console/godmode/agentes/module_manager.php index 1c6cd62be4..fe27bf4bb1 100644 --- a/pandora_console/godmode/agentes/module_manager.php +++ b/pandora_console/godmode/agentes/module_manager.php @@ -34,7 +34,6 @@ $url = sprintf( $url_id_agente ); -enterprise_include('godmode/agentes/module_manager.php'); $isFunctionPolicies = enterprise_include_once('include/functions_policies.php'); require_once $config['homedir'].'/include/functions_modules.php'; require_once $config['homedir'].'/include/functions_agents.php'; @@ -51,196 +50,10 @@ if (isset($policy_page) === false) { $checked = (bool) get_parameter('checked'); $sec2 = (string) get_parameter('sec2'); -// Table for filter bar. -$filterTable = new stdClass(); -$filterTable->class = 'fixed_filter_bar'; -$filterTable->data = []; -$filterTable->cellstyle[0][0] = 'width:0'; -$filterTable->data[0][0] = __('Search'); -$filterTable->data[1][0] .= html_print_input_text( - 'search_string', - $search_string, - '', - 30, - 255, - true, - false, - false, - '', - '' -); -$filterTable->data[0][0] .= html_print_input_hidden('search', 1, true); - -if ((bool) $policy_page === false) { - $filterTable->data[0][1] = __('Show in hierachy mode'); - $filterTable->data[1][1] = html_print_checkbox_switch( - 'status_hierachy_mode', - '', - ((string) $checked === 'true'), - true, - false, - 'onChange=change_mod_filter();' - ); -} - -$filterTable->data[1][2] = html_print_submit_button( - __('Filter'), - 'filter', - false, - [ - 'icon' => 'search', - 'class' => 'float-right', - 'mode' => 'secondary mini', - ], - true -); - -// Print filter table. -echo '
        '; -html_print_table($filterTable); -echo '
        '; -// Check if there is at least one server of each type available to assign that -// kind of modules. If not, do not show server type in combo. -$network_available = db_get_sql( - 'SELECT count(*) - FROM tserver - WHERE server_type = '.SERVER_TYPE_NETWORK -); -// POSTGRESQL AND ORACLE COMPATIBLE. -$wmi_available = db_get_sql( - 'SELECT count(*) - FROM tserver - WHERE server_type = '.SERVER_TYPE_WMI -); -// POSTGRESQL AND ORACLE COMPATIBLE. -$plugin_available = db_get_sql( - 'SELECT count(*) - FROM tserver - WHERE server_type = '.SERVER_TYPE_PLUGIN -); -// POSTGRESQL AND ORACLE COMPATIBLE. -$prediction_available = db_get_sql( - 'SELECT count(*) - FROM tserver - WHERE server_type = '.SERVER_TYPE_PREDICTION -); -// POSTGRESQL AND ORACLE COMPATIBLE. -$web_available = db_get_sql( - 'SELECT count(*) -FROM tserver -WHERE server_type = '.SERVER_TYPE_WEB -); -// POSTGRESQL AND ORACLE COMPATIBLE. -// Development mode to use all servers. -if ($develop_bypass || is_metaconsole()) { - $network_available = 1; - $wmi_available = 1; - $plugin_available = 1; - // FIXME when prediction predictions server modules can be configured. - // on metaconsole. - $prediction_available = (is_metaconsole() === true) ? 0 : 1; -} - -$modules = []; -$modules['dataserver'] = __('Create a new data server module'); -if ($network_available) { - $modules['networkserver'] = __('Create a new network server module'); -} - -if ($plugin_available) { - $modules['pluginserver'] = __('Create a new plugin server module'); -} - -if ($wmi_available) { - $modules['wmiserver'] = __('Create a new WMI server module'); -} - -if ($prediction_available) { - $modules['predictionserver'] = __('Create a new prediction server module'); -} - -if (is_metaconsole() === true || $web_available >= '1') { - $modules['webserver'] = __('Create a new web Server module'); -} - -if (enterprise_installed() === true) { - set_enterprise_module_types($modules); -} - -if (strstr($sec2, 'enterprise/godmode/policies/policies') !== false) { - // It is unset because the policies haven't a table tmodule_synth and the - // some part of code to apply this kind of modules in policy agents. - // But in the future maybe will be good to make this feature, but remember - // the modules to show in syntetic module policy form must be the policy - // modules from the same policy. - unset($modules['predictionserver']); - if (enterprise_installed() === true) { - unset($modules['webux']); - } -} - -if (($policy_page === true) || (isset($agent) === true)) { - if ($policy_page === true) { - $show_creation = is_management_allowed(); - } else { - if (isset($all_groups) === false) { - $all_groups = agents_get_all_groups_agent( - $agent['id_agente'], - $agent['id_grupo'] - ); - } - - $show_creation = check_acl_one_of_groups($config['id_user'], $all_groups, 'AW') === true; - } -} else { - $show_creation = false; -} - -if ($show_creation === true) { - // Create module/type combo. - $tableCreateModule = new stdClass(); - $tableCreateModule->id = 'create'; - $tableCreateModule->class = 'create_module_dialog'; - $tableCreateModule->width = '100%'; - $tableCreateModule->data = []; - $tableCreateModule->style = []; - - $tableCreateModule->data['caption_type'] = html_print_input_hidden('edit_module', 1); - $tableCreateModule->data['caption_type'] .= __('Type'); - $tableCreateModule->data['type'] = html_print_select( - $modules, - 'moduletype', - '', - '', - '', - '', - true, - false, - false, - '', - false, - 'width:380px;' - ); - - // Link for get more modules. - if ((bool) $config['disable_help'] === false) { - $tableCreateModule->data['get_more_modules'] = html_print_anchor( - [ - 'href' => 'https://pandorafms.com/Library/Library/', - 'target' => '_blank', - 'class' => 'color-black-grey', - 'content' => __('Get more modules on Monitoring Library'), - ], - true - ); - } -} - if (isset($id_agente) === false) { return; } - $module_action = (string) get_parameter('module_action'); if ($module_action === 'delete') { @@ -1256,35 +1069,6 @@ if ((bool) check_acl_one_of_groups($config['id_user'], $all_groups, 'AW') === tr [ 'type' => 'data_table' ] ); echo ''; - - - $modalCreateModule = '
        '; - $modalCreateModule .= html_print_table($tableCreateModule, true); - $modalCreateModule .= html_print_div( - [ - 'class' => 'action-buttons', - 'content' => html_print_submit_button( - __('Create'), - 'create_module', - false, - [ - 'icon' => 'next', - 'mode' => 'mini secondary', - ], - true - ), - ], - true - ); - $modalCreateModule .= '
        '; - - html_print_div( - [ - 'id' => 'modal', - 'style' => 'display: none', - 'content' => $modalCreateModule, - ] - ); } ?> diff --git a/pandora_console/godmode/agentes/module_manager_editor_common.php b/pandora_console/godmode/agentes/module_manager_editor_common.php index aba3daf8f4..085afcb455 100644 --- a/pandora_console/godmode/agentes/module_manager_editor_common.php +++ b/pandora_console/godmode/agentes/module_manager_editor_common.php @@ -444,7 +444,7 @@ $tableBasicThresholds->data = []; $tableBasicThresholds->rowclass['caption_warning_threshold'] = 'field_half_width pdd_t_10px'; $tableBasicThresholds->rowclass['warning_threshold'] = 'field_half_width'; $tableBasicThresholds->data['caption_warning_threshold'][0] .= __('Warning threshold').' '; -if ($edit_module === false || (isset($stringTypeModule) === true && $stringTypeModule === false)) { +if ($edit_module === false && (isset($stringTypeModule) === false || $stringTypeModule === false)) { $tableBasicThresholds->data['caption_warning_threshold'][0] .= '('.__('Min / Max').')'; $tableBasicThresholds->data['warning_threshold'][0] .= html_print_input_text( 'min_warning', @@ -482,7 +482,7 @@ if ($edit_module === false || (isset($stringTypeModule) === true && $stringTypeM ); } -if ($edit_module === false || (isset($stringTypeModule) === true && $stringTypeModule === true)) { +if ($edit_module === false && isset($stringTypeModule) === true && $stringTypeModule === true) { $basicThresholdsIntervalWarning = []; $basicThresholdsIntervalWarning[] = ''.__('Inverse interval').''; $basicThresholdsIntervalWarning[] = html_print_checkbox_switch( @@ -531,7 +531,7 @@ $tableBasicThresholds->data['switch_warning_threshold'][0] .= html_print_div( $tableBasicThresholds->rowclass['caption_critical_threshold'] = 'field_half_width pdd_t_10px'; $tableBasicThresholds->rowclass['critical_threshold'] = 'field_half_width'; $tableBasicThresholds->data['caption_critical_threshold'][0] .= __('Critical threshold').' '; -if ($edit_module === false || (isset($stringTypeModule) === true && $stringTypeModule === false)) { +if ($edit_module === false && (isset($stringTypeModule) === false || $stringTypeModule === false)) { $tableBasicThresholds->data['caption_critical_threshold'][0] .= '('.__('Min / Max').')'; $tableBasicThresholds->data['critical_threshold'][0] .= html_print_input_text( 'min_critical', @@ -569,7 +569,7 @@ if ($edit_module === false || (isset($stringTypeModule) === true && $stringTypeM ); } -if ($edit_module === false || (isset($stringTypeModule) === true && $stringTypeModule === true)) { +if ($edit_module === false && isset($stringTypeModule) === true && $stringTypeModule === true) { $basicThresholdsIntervalCritical = []; $basicThresholdsIntervalCritical[] = ''.__('Inverse interval').''; $basicThresholdsIntervalCritical[] = html_print_checkbox_switch( diff --git a/pandora_console/include/class/HTML.class.php b/pandora_console/include/class/HTML.class.php index a8f7c54985..ca74f7dc46 100644 --- a/pandora_console/include/class/HTML.class.php +++ b/pandora_console/include/class/HTML.class.php @@ -544,7 +544,7 @@ class HTML 'container_class' => $input['toggle_container_class'], 'img_a' => $input['toggle_img_a'], 'img_b' => $input['toggle_img_b'], - 'clean' => (isset($input['toggle_clean']) ? $input['toggle_clean'] : true), + 'clean' => (isset($input['toggle_clean']) ? $input['toggle_clean'] : false), ] ); } else { diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index ae8fbb4a84..166166518f 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -4519,8 +4519,8 @@ function ui_print_toggle($data) (isset($data['toggle_class']) === true) ? $data['toggle_class'] : '', (isset($data['container_class']) === true) ? $data['container_class'] : 'white-box-content', (isset($data['main_class']) === true) ? $data['main_class'] : 'box-flat white_table_graph', - (isset($data['img_a']) === true) ? $data['img_a'] : 'images/arrow_down_green.png', - (isset($data['img_b']) === true) ? $data['img_b'] : 'images/arrow_right_green.png', + (isset($data['img_a']) === true) ? $data['img_a'] : 'images/arrow@svg.svg', + (isset($data['img_b']) === true) ? $data['img_b'] : 'images/arrow@svg.svg', (isset($data['clean']) === true) ? $data['clean'] : false, (isset($data['reverseImg']) === true) ? $data['reverseImg'] : false, (isset($data['switch']) === true) ? $data['switch'] : false, diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 43e66868bd..e2afb9534a 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -297,6 +297,7 @@ td input[type="checkbox"] { padding: 10px; margin-top: 2px; display: table-cell; + height: 15px; } input[type="image"] { @@ -4816,7 +4817,7 @@ div#dialog_messages table th:last-child { z-index: 900000; position: absolute; width: 550px; - margin-top: -5px; + margin-top: 55px; border-radius: 5px; } diff --git a/pandora_console/index.php b/pandora_console/index.php index a78d97d926..ccf64a9841 100755 --- a/pandora_console/index.php +++ b/pandora_console/index.php @@ -1169,6 +1169,10 @@ if ($config['pure'] == 0) { $menuTypeClass = ($menuCollapsed === true) ? 'collapsed' : 'classic'; // Container. echo '
        '; + + // Notifications content wrapper + echo ''; + // Header. echo '