From 9c9467c2da9961f32606cabe098839eb437caa94 Mon Sep 17 00:00:00 2001 From: alejandro Date: Mon, 14 Aug 2023 13:57:14 +0200 Subject: [PATCH 001/170] fix in plugin output --- pandora_server/util/plugin/wizard_wmi_module.pl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pandora_server/util/plugin/wizard_wmi_module.pl b/pandora_server/util/plugin/wizard_wmi_module.pl index 23e49a7f83..d9c1b3d1aa 100755 --- a/pandora_server/util/plugin/wizard_wmi_module.pl +++ b/pandora_server/util/plugin/wizard_wmi_module.pl @@ -172,5 +172,6 @@ foreach my $k (keys %{$fields_values}){ # Get operation result my $result = eval $operation; if (defined($result)){ - print $result . "\n"; + + print $result, "\n"; } From 682494f51fa15479cdefacbf6347838e3423fa19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20S=C3=A1nchez?= Date: Mon, 14 Aug 2023 11:59:41 +0000 Subject: [PATCH 002/170] remove clear line --- pandora_server/util/plugin/wizard_wmi_module.pl | 1 - 1 file changed, 1 deletion(-) diff --git a/pandora_server/util/plugin/wizard_wmi_module.pl b/pandora_server/util/plugin/wizard_wmi_module.pl index d9c1b3d1aa..fa25c26d0b 100755 --- a/pandora_server/util/plugin/wizard_wmi_module.pl +++ b/pandora_server/util/plugin/wizard_wmi_module.pl @@ -172,6 +172,5 @@ foreach my $k (keys %{$fields_values}){ # Get operation result my $result = eval $operation; if (defined($result)){ - print $result, "\n"; } From 5d41cf7d04e95c59ee6bab6e1143c964e8d87e05 Mon Sep 17 00:00:00 2001 From: miguel angel rasteu Date: Wed, 27 Sep 2023 15:47:44 +0200 Subject: [PATCH 003/170] #12139 Fix new_agent api request --- pandora_console/include/functions_api.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandora_console/include/functions_api.php b/pandora_console/include/functions_api.php index 7e22befbee..068c5409f6 100644 --- a/pandora_console/include/functions_api.php +++ b/pandora_console/include/functions_api.php @@ -2014,7 +2014,7 @@ function api_set_new_agent($id_node, $thrash2, $other, $trhash3, $return=false, } returnError('No agent alias specified'); - } else if (agents_get_agent_id($nombre_agente)) { + } else if (agents_get_agent_id($agent->nombre())) { if ($message === true) { return 'The agent name already exists in DB.'; } @@ -2062,7 +2062,7 @@ function api_set_new_agent($id_node, $thrash2, $other, $trhash3, $return=false, } } - if ($return === false) { + if ($return !== true) { returnData( 'string', [ From 9a57cc550ec99fbe9b063124dbecdc46e7ec1233 Mon Sep 17 00:00:00 2001 From: miguel angel rasteu Date: Wed, 11 Oct 2023 16:31:48 +0200 Subject: [PATCH 004/170] #12192 Fix pandora itsm url --- pandora_console/godmode/setup/setup_ITSM.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pandora_console/godmode/setup/setup_ITSM.php b/pandora_console/godmode/setup/setup_ITSM.php index 3196ef677c..50aee8631e 100644 --- a/pandora_console/godmode/setup/setup_ITSM.php +++ b/pandora_console/godmode/setup/setup_ITSM.php @@ -558,7 +558,7 @@ $table_cr_settings->data[4][0] = html_print_label_input_block( // Print. echo ''; From d389f9c3d19c688f1ada55714891717db5498fb0 Mon Sep 17 00:00:00 2001 From: Jorge Rincon Date: Thu, 16 Nov 2023 11:15:01 +0100 Subject: [PATCH 005/170] #12439 Added Quiet icon to agent finder --- .../operation/search_agents.getdata.php | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/pandora_console/operation/search_agents.getdata.php b/pandora_console/operation/search_agents.getdata.php index bdeea391a1..f4c1fe0d76 100644 --- a/pandora_console/operation/search_agents.getdata.php +++ b/pandora_console/operation/search_agents.getdata.php @@ -169,12 +169,26 @@ if ($searchAgents) { } foreach ($agents as $key => $agent) { + $agent_quiet = ''; + if ((bool) $agent['quiet'] === true) { + $agent_quiet = html_print_image( + 'images/dot_blue.png', + true, + [ + 'border' => '0', + 'title' => __('Quiet'), + 'alt' => '', + 'class' => 'mrgn_lft_5px', + ] + ); + } + if ($agent['disabled']) { $agents[$key]['agent'] = ''.ucfirst(strtolower($agent['alias'])).''.ui_print_help_tip(__('Disabled'), true).''; + title="'.$agent['id_agente'].'">'.ucfirst(strtolower($agent['alias'])).''.ui_print_help_tip(__('Disabled'), true).''.$agent_quiet; } else { $agents[$key]['agent'] = ''.ucfirst(strtolower($agent['alias'])).''; + title='.$agent['nombre'].'>'.ucfirst(strtolower($agent['alias'])).''.$agent_quiet; } $agents[$key]['os'] = ui_print_os_icon($agent['id_os'], false, true); From b6582b7f7ea10588862856e007b63d81d5373cf2 Mon Sep 17 00:00:00 2001 From: Jorge Rincon Date: Wed, 22 Nov 2023 13:30:44 +0100 Subject: [PATCH 006/170] #12202 added Asteroids game --- pandora_console/include/ajax/events.php | 13 + pandora_console/include/asteroids/LICENSE.txt | 25 + pandora_console/include/asteroids/README.rst | 46 + .../include/asteroids/asteroids.js | 840 ++++++++++++++++++ pandora_console/include/asteroids/index.html | 14 + pandora_console/include/asteroids/style.css | 46 + .../include/javascript/pandora_events.js | 45 + pandora_console/include/styles/asteroids.css | 65 ++ pandora_console/operation/menu.php | 1 + 9 files changed, 1095 insertions(+) create mode 100644 pandora_console/include/asteroids/LICENSE.txt create mode 100644 pandora_console/include/asteroids/README.rst create mode 100644 pandora_console/include/asteroids/asteroids.js create mode 100644 pandora_console/include/asteroids/index.html create mode 100644 pandora_console/include/asteroids/style.css create mode 100644 pandora_console/include/styles/asteroids.css diff --git a/pandora_console/include/ajax/events.php b/pandora_console/include/ajax/events.php index 7e8341c4a1..88e063b581 100644 --- a/pandora_console/include/ajax/events.php +++ b/pandora_console/include/ajax/events.php @@ -95,6 +95,8 @@ $parameters_modal = get_parameter('parameters', 0); // User private filter. $current_filter = get_parameter('current_filter', 0); $private_filter_event = get_parameter('private_filter_event', 0); +// Asteroids. +$playAsteroids = (bool) get_parameter('playAsteroids', false); if ($get_comments === true) { global $config; @@ -2751,3 +2753,14 @@ if ($draw_row_response_info === true) { echo $output; return; } + +// Asteroids. +if ($playAsteroids === true) { + echo ui_require_css_file('asteroids', 'include/styles/', true); + echo ui_require_javascript_file('asteroids', 'include/asteroids/', true); + + $output = '
Asteroids game goes here!
'; + + echo $output; + return; +} diff --git a/pandora_console/include/asteroids/LICENSE.txt b/pandora_console/include/asteroids/LICENSE.txt new file mode 100644 index 0000000000..0dc661d166 --- /dev/null +++ b/pandora_console/include/asteroids/LICENSE.txt @@ -0,0 +1,25 @@ +Copyright (c) 2023, James Socol +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + diff --git a/pandora_console/include/asteroids/README.rst b/pandora_console/include/asteroids/README.rst new file mode 100644 index 0000000000..c7465358c2 --- /dev/null +++ b/pandora_console/include/asteroids/README.rst @@ -0,0 +1,46 @@ +========= +ASTEROIDS +========= + +Last week, at work, we joked about creating an Asteroids clone where every +asteroid had a bug number in it, as a bit of a joke. (Ha ha, every bug you +kill spawns two more!) + +I was bored this afternoon, so here's a port of Asteroids to JS/Canvas. + +Now all I need to do is hook in the bug numbers. + + +Gameplay +======== + +You're the triangle in the middle. You want to destroy the circles. You have +a gun (spacebar), some thrusters to turn (left and right arrow keys) and an +engine (up arrow key). + +Remember, it's kill or be killed out there. + + +Rights +====== + +The name *Asteroids* is, as far as I know, still property of Atari. I mean no +ill-will towards Atari by releasing this code. Frankly, it's a poor +substitute for anything resembling a real game. I just wanted to see if I +could do it. + +If anyone from Atari asks, I will gladly rename and/or remove this code. But +since there are so many *Asteroids* clones as it is, and the original was +released in 1979, and it was kind of a copy of *Spacewar!*, I doubt they'll +mind too much. + + +Strikes me as funny... +====================== + +The original *Spacewar!*, one of the earliest (if not the original) computer +games, took `200 hours to code `_. + +This probably took me 6. + +I am so glad we've moved past the PDP-1. diff --git a/pandora_console/include/asteroids/asteroids.js b/pandora_console/include/asteroids/asteroids.js new file mode 100644 index 0000000000..d6e9a460f4 --- /dev/null +++ b/pandora_console/include/asteroids/asteroids.js @@ -0,0 +1,840 @@ +// Asteroids.js +// Copyright (c) 2010–2023 James Socol +// See LICENSE.txt for license terms. + +// Game settings +GAME_HEIGHT = 480; +GAME_WIDTH = 640; +FRAME_PERIOD = 60; // 1 frame / x frames/sec +LEVEL_TIMEOUT = 2000; // How long to wait after clearing a level. + +// Player settings +ROTATE_SPEED = Math.PI / 10; // How fast do players turn? (radians) +MAX_SPEED = 15; // Maximum player speed +THRUST_ACCEL = 1; +DEATH_TIMEOUT = 2000; // milliseconds +INVINCIBLE_TIMEOUT = 1500; // How long to stay invincible after resurrecting? +PLAYER_LIVES = 3; +POINTS_PER_SHOT = 1; // How many points does a shot cost? (Should be >= 0.) +POINTS_TO_EXTRA_LIFE = 1000; // How many points to get a 1-up? + +// Bullet settings +BULLET_SPEED = 20; +MAX_BULLETS = 3; +MAX_BULLET_AGE = 25; + +// Asteroid settings +ASTEROID_COUNT = 2; // This + current level = number of asteroids. +ASTEROID_GENERATIONS = 3; // How many times to they split before dying? +ASTEROID_CHILDREN = 2; // How many does each death create? +ASTEROID_SPEED = 3; +ASTEROID_SCORE = 10; // How many points is each one worth? + +var Asteroids = function(home) { + // Constructor + // Order matters. + + // Set up logging. + this.log_level = Asteroids.LOG_DEBUG; + this.log = Asteroids.logger(this); + + // Create the info pane, player, and playfield. + home.innerHTML = ""; + this.info = Asteroids.infoPane(this, home); + this.playfield = Asteroids.playfield(this, home); + this.player = Asteroids.player(this); + + // Set up the event listeners. + this.keyState = Asteroids.keyState(this); + this.listen = Asteroids.listen(this); + + // Useful functions. + this.asteroids = Asteroids.asteroids(this); + this.overlays = Asteroids.overlays(this); + this.highScores = Asteroids.highScores(this); + this.level = Asteroids.level(this); + this.gameOver = Asteroids.gameOver(this); + + // Play the game. + Asteroids.play(this); + return this; +}; + +Asteroids.infoPane = function(game, home) { + var pane = document.createElement("div"); + pane.innerHTML = "ASTEROIDS"; + + var lives = document.createElement("span"); + lives.className = "lives"; + lives.innerHTML = "LIVES: " + PLAYER_LIVES; + + var score = document.createElement("span"); + score.className = "score"; + score.innerHTML = "SCORE: 0"; + + var level = document.createElement("span"); + level.className = "level"; + level.innerHTML = "LEVEL: 1"; + + pane.appendChild(lives); + pane.appendChild(score); + pane.appendChild(level); + home.appendChild(pane); + + return { + setLives: function(game, l) { + lives.innerHTML = "LIVES: " + l; + }, + setScore: function(game, s) { + score.innerHTML = "SCORE: " + s; + }, + setLevel: function(game, _level) { + level.innerHTML = "LEVEL: " + _level; + }, + getPane: function() { + return pane; + } + }; +}; + +Asteroids.playfield = function(game, home) { + var canvas = document.createElement("canvas"); + canvas.width = GAME_WIDTH; + canvas.height = GAME_HEIGHT; + home.appendChild(canvas); + return canvas; +}; + +Asteroids.logger = function(game) { + if (typeof console != "undefined" && typeof console.log != "undefined") { + return { + info: function(msg) { + if (game.log_level <= Asteroids.LOG_INFO) console.log(msg); + }, + debug: function(msg) { + if (game.log_level <= Asteroids.LOG_DEBUG) console.log(msg); + }, + warning: function(msg) { + if (game.log_level <= Asteroids.LOG_WARNING) console.log(msg); + }, + error: function(msg) { + if (game.log_level <= Asteroids.LOG_ERROR) console.log(msg); + }, + critical: function(msg) { + if (game.log_level <= Asteroids.LOG_CRITICAL) console.log(msg); + } + }; + } else { + return { + info: function(msg) {}, + debug: function(msg) {}, + warning: function(msg) {}, + error: function(msg) {}, + critical: function(msg) {} + }; + } +}; + +Asteroids.asteroids = function(game) { + var asteroids = []; + + return { + push: function(obj) { + return asteroids.push(obj); + }, + pop: function() { + return asteroids.pop(); + }, + splice: function(i, j) { + return asteroids.splice(i, j); + }, + get length() { + return asteroids.length; + }, + getIterator: function() { + return asteroids; + }, + generationCount: function(_gen) { + var total = 0; + for (var i = 0; i < asteroids.length; i++) { + if (asteroids[i].getGeneration() == _gen) total++; + } + game.log.debug("Found " + total + " asteroids in generation " + _gen); + return total; + } + }; +}; + +/** + * Creates an overlays controller. + */ +Asteroids.overlays = function(game) { + var overlays = []; + + return { + draw: function(ctx) { + for (var i = 0; i < overlays.length; i++) { + overlays[i].draw(ctx); + } + }, + add: function(obj) { + if (-1 == overlays.indexOf(obj) && typeof obj.draw != "undefined") { + overlays.push(obj); + return true; + } + return false; + }, + remove: function(obj) { + var i = overlays.indexOf(obj); + if (-1 != i) { + overlays.splice(i, 1); + return true; + } + return false; + } + }; +}; + +/** + * Creates a player object. + */ +Asteroids.player = function(game) { + // implements IScreenObject + var position = [GAME_WIDTH / 2, GAME_HEIGHT / 2], + velocity = [0, 0], + direction = -Math.PI / 2, + dead = false, + invincible = false, + lastRez = null, + lives = PLAYER_LIVES, + score = 0, + radius = 3, + path = [ + [10, 0], + [-5, 5], + [-5, -5], + [10, 0] + ]; + + return { + getPosition: function() { + return position; + }, + getVelocity: function() { + return velocity; + }, + getSpeed: function() { + return Math.sqrt(Math.pow(velocity[0], 2) + Math.pow(velocity[1], 2)); + }, + getDirection: function() { + return direction; + }, + getRadius: function() { + return radius; + }, + getScore: function() { + return score; + }, + addScore: function(pts) { + score += pts; + }, + lowerScore: function(pts) { + score -= pts; + if (score < 0) { + score = 0; + } + }, + getLives: function() { + return lives; + }, + rotate: function(rad) { + if (!dead) { + direction += rad; + game.log.info(direction); + } + }, + thrust: function(force) { + if (!dead) { + velocity[0] += force * Math.cos(direction); + velocity[1] += force * Math.sin(direction); + + if (this.getSpeed() > MAX_SPEED) { + velocity[0] = MAX_SPEED * Math.cos(direction); + velocity[1] = MAX_SPEED * Math.sin(direction); + } + + game.log.info(velocity); + } + }, + move: function() { + Asteroids.move(position, velocity); + }, + draw: function(ctx) { + let color = "#fff"; + if (invincible) { + const dt = (new Date() - lastRez) / 200; + const c = Math.floor(Math.cos(dt) * 16).toString(16); + color = `#${c}${c}${c}`; + } + Asteroids.drawPath(ctx, position, direction, 1, path, color); + }, + isDead: function() { + return dead; + }, + isInvincible: function() { + return invincible; + }, + extraLife: function(game) { + game.log.debug("Woo, extra life!"); + lives++; + }, + die: function(game) { + if (!dead) { + game.log.info("You died!"); + dead = true; + invincible = true; + lives--; + position = [GAME_WIDTH / 2, GAME_HEIGHT / 2]; + velocity = [0, 0]; + direction = -Math.PI / 2; + if (lives > 0) { + setTimeout( + (function(player, _game) { + return function() { + player.resurrect(_game); + }; + })(this, game), + DEATH_TIMEOUT + ); + } else { + game.gameOver(); + } + } + }, + resurrect: function(game) { + if (dead) { + dead = false; + invincible = true; + lastRez = new Date(); + setTimeout(function() { + invincible = false; + game.log.debug("No longer invincible!"); + }, INVINCIBLE_TIMEOUT); + game.log.debug("You ressurrected!"); + } + }, + fire: function(game) { + if (!dead) { + game.log.debug("You fired!"); + var _pos = [position[0], position[1]], + _dir = direction; + + this.lowerScore(POINTS_PER_SHOT); + + return Asteroids.bullet(game, _pos, _dir); + } + } + }; +}; + +Asteroids.bullet = function(game, _pos, _dir) { + // implements IScreenObject + var position = [_pos[0], _pos[1]], + velocity = [0, 0], + direction = _dir, + age = 0, + radius = 1, + path = [ + [0, 0], + [-4, 0] + ]; + + velocity[0] = BULLET_SPEED * Math.cos(_dir); + velocity[1] = BULLET_SPEED * Math.sin(_dir); + + return { + getPosition: function() { + return position; + }, + getVelocity: function() { + return velocity; + }, + getSpeed: function() { + return Math.sqrt(Math.pow(velocity[0], 2) + Math.pow(velocity[1], 2)); + }, + getRadius: function() { + return radius; + }, + getAge: function() { + return age; + }, + birthday: function() { + age++; + }, + move: function() { + Asteroids.move(position, velocity); + }, + draw: function(ctx) { + Asteroids.drawPath(ctx, position, direction, 1, path); + } + }; +}; + +Asteroids.keyState = function(_) { + var state = { + [Asteroids.LEFT]: false, + [Asteroids.UP]: false, + [Asteroids.RIGHT]: false, + [Asteroids.DOWN]: false, + [Asteroids.FIRE]: false + }; + + return { + on: function(key) { + state[key] = true; + }, + off: function(key) { + state[key] = false; + }, + getState: function(key) { + if (typeof state[key] != "undefined") return state[key]; + return false; + } + }; +}; + +Asteroids.listen = function(game) { + const keyMap = { + ArrowLeft: Asteroids.LEFT, + KeyA: Asteroids.LEFT, + ArrowRight: Asteroids.RIGHT, + KeyD: Asteroids.RIGHT, + ArrowUp: Asteroids.UP, + KeyW: Asteroids.UP, + Space: Asteroids.FIRE + }; + + window.addEventListener( + "keydown", + function(e) { + const state = keyMap[e.code]; + if (state) { + e.preventDefault(); + e.stopPropagation(); + game.keyState.on(state); + return false; + } + return true; + }, + true + ); + + window.addEventListener( + "keyup", + function(e) { + const state = keyMap[e.code]; + if (state) { + e.preventDefault(); + e.stopPropagation(); + game.keyState.off(state); + return false; + } + return true; + }, + true + ); +}; + +Asteroids.asteroid = function(game, _gen) { + // implements IScreenObject + var position = [0, 0], + velocity = [0, 0], + direction = 0, + generation = _gen, + radius = 7, + path = [ + [1, 7], + [5, 5], + [7, 1], + [5, -3], + [7, -7], + [3, -9], + [-1, -5], + [-4, -2], + [-8, -1], + [-9, 3], + [-5, 5], + [-1, 3], + [1, 7] + ]; + + return { + getPosition: function() { + return position; + }, + setPosition: function(pos) { + position = pos; + }, + getVelocity: function() { + return velocity; + }, + setVelocity: function(vel) { + velocity = vel; + direction = Math.atan2(vel[1], vel[0]); + }, + getSpeed: function() { + return Math.sqrt(Math.pow(velocity[0], 2) + Math.pow(velocity[1], 2)); + }, + getRadius: function() { + return radius * generation; + }, + getGeneration: function() { + return generation; + }, + move: function() { + Asteroids.move(position, velocity); + }, + draw: function(ctx) { + Asteroids.drawPath(ctx, position, direction, generation, path); + // ctx.setTransform(1, 0, 0, 1, position[0], position[1]); + // ctx.beginPath(); + // ctx.arc(0, 0, radius*generation, 0, Math.PI*2, false); + // ctx.stroke(); + // ctx.closePath(); + } + }; +}; + +Asteroids.collision = function(a, b) { + // if a.getPosition() inside b.getBounds? + var a_pos = a.getPosition(), + b_pos = b.getPosition(); + + function sq(x) { + return Math.pow(x, 2); + } + + var distance = Math.sqrt(sq(a_pos[0] - b_pos[0]) + sq(a_pos[1] - b_pos[1])); + + if (distance <= a.getRadius() + b.getRadius()) return true; + return false; +}; + +Asteroids.level = function(game) { + var level = 0, + speed = ASTEROID_SPEED, + hspeed = ASTEROID_SPEED / 2; + + return { + getLevel: function() { + return level; + }, + levelUp: function(game) { + level++; + game.log.debug("Congrats! On to level " + level); + while ( + game.asteroids.generationCount(ASTEROID_GENERATIONS) < + level + ASTEROID_COUNT + ) { + var a = Asteroids.asteroid(game, ASTEROID_GENERATIONS); + a.setPosition([ + Math.random() * GAME_WIDTH, + Math.random() * GAME_HEIGHT + ]); + a.setVelocity([ + Math.random() * speed - hspeed, + Math.random() * speed - hspeed + ]); + game.asteroids.push(a); + } + } + }; +}; + +Asteroids.gameOver = function(game) { + return function() { + game.log.debug("Game over!"); + + if (game.player.getScore() > 0) { + game.highScores.addScore("Player", game.player.getScore()); + } + + game.overlays.add({ + // implements IOverlay + draw: function(ctx) { + ctx.font = "30px System, monospace"; + ctx.textAlign = "center"; + ctx.textBaseline = "middle"; + ctx.setTransform(1, 0, 0, 1, 0, 0); + ctx.fillText("GAME OVER", GAME_WIDTH / 2, GAME_HEIGHT / 2); + + var scores = game.highScores.getScores(); + ctx.font = "12px System, monospace"; + for (var i = 0; i < scores.length; i++) { + ctx.fillText( + scores[i].name + " " + scores[i].score, + GAME_WIDTH / 2, + GAME_HEIGHT / 2 + 20 + 14 * i + ); + } + } + }); + }; +}; + +Asteroids.highScores = function(game) { + var scores = []; + + if ((t = localStorage.getItem("high-scores"))) { + scores = JSON.parse(t); + } + + return { + getScores: function() { + return scores; + }, + addScore: function(_name, _score) { + scores.push({ name: _name, score: _score }); + scores.sort(function(a, b) { + return b.score - a.score; + }); + if (scores.length > 10) { + scores.length = 10; + } + game.log.debug("Saving high scores."); + var str = JSON.stringify(scores); + localStorage.setItem("high-scores", str); + } + }; +}; + +Asteroids.drawPath = function(ctx, position, direction, scale, path, color) { + if (!color) { + color = "#fff"; + } + ctx.strokeStyle = color; + ctx.setTransform( + Math.cos(direction) * scale, + Math.sin(direction) * scale, + -Math.sin(direction) * scale, + Math.cos(direction) * scale, + position[0], + position[1] + ); + + ctx.beginPath(); + ctx.moveTo(path[0][0], path[0][1]); + for (i = 1; i < path.length; i++) { + ctx.lineTo(path[i][0], path[i][1]); + } + ctx.stroke(); + ctx.closePath(); + ctx.strokeStyle = "#fff"; +}; + +Asteroids.move = function(position, velocity) { + position[0] += velocity[0]; + if (position[0] < 0) position[0] = GAME_WIDTH + position[0]; + else if (position[0] > GAME_WIDTH) position[0] -= GAME_WIDTH; + + position[1] += velocity[1]; + if (position[1] < 0) position[1] = GAME_HEIGHT + position[1]; + else if (position[1] > GAME_HEIGHT) position[1] -= GAME_HEIGHT; +}; + +Asteroids.stars = function() { + var stars = []; + for (var i = 0; i < 50; i++) { + stars.push([Math.random() * GAME_WIDTH, Math.random() * GAME_HEIGHT]); + } + + return { + draw: function(ctx) { + var ii = stars.length; + for (var i = 0; i < ii; i++) { + ctx.fillRect(stars[i][0], stars[i][1], 1, 1); + } + } + }; +}; + +Asteroids.play = function(game) { + var ctx = game.playfield.getContext("2d"); + ctx.fillStyle = "white"; + ctx.strokeStyle = "white"; + + var speed = ASTEROID_SPEED, + hspeed = ASTEROID_SPEED / 2; + + game.level.levelUp(game); + + var bullets = [], + last_fire_state = false, + last_asteroid_count = 0; + + var extra_lives = 0; + + // Add a star field. + game.overlays.add(Asteroids.stars()); + + game.pulse = setInterval(function() { + var kill_asteroids = [], + new_asteroids = [], + kill_bullets = []; + + ctx.save(); + ctx.clearRect(0, 0, GAME_WIDTH, GAME_HEIGHT); + + // Be nice and award extra lives first. + var t_extra_lives = game.player.getScore() / POINTS_TO_EXTRA_LIFE; + t_extra_lives = Math.floor(t_extra_lives); + if (t_extra_lives > extra_lives) { + game.player.extraLife(game); + } + extra_lives = t_extra_lives; + + if (game.keyState.getState(Asteroids.UP)) { + game.player.thrust(THRUST_ACCEL); + } + + if (game.keyState.getState(Asteroids.LEFT)) { + game.player.rotate(-ROTATE_SPEED); + } + + if (game.keyState.getState(Asteroids.RIGHT)) { + game.player.rotate(ROTATE_SPEED); + } + + var fire_state = game.keyState.getState(Asteroids.FIRE); + if ( + fire_state && + fire_state != last_fire_state && + bullets.length < MAX_BULLETS + ) { + var b = game.player.fire(game); + bullets.push(b); + } + last_fire_state = fire_state; + + if (!game.player.isDead()) { + game.player.move(); + game.player.draw(ctx); + } + + for (var k = 0; k < bullets.length; k++) { + if (!bullets[k]) continue; + + if (bullets[k].getAge() > MAX_BULLET_AGE) { + kill_bullets.push(k); + continue; + } + bullets[k].birthday(); + bullets[k].move(); + bullets[k].draw(ctx); + } + + for (var r = kill_bullets.length - 1; r >= 0; r--) { + bullets.splice(r, 1); + } + + var asteroids = game.asteroids.getIterator(); + for (var i = 0; i < game.asteroids.length; i++) { + var killit = false; + asteroids[i].move(); + asteroids[i].draw(ctx); + + // Destroy the asteroid + for (var j = 0; j < bullets.length; j++) { + if (!bullets[j]) continue; + if (Asteroids.collision(bullets[j], asteroids[i])) { + game.log.debug("You shot an asteroid!"); + // Destroy the bullet. + bullets.splice(j, 1); + killit = true; // JS doesn't have "continue 2;" + continue; + } + } + + // Kill the asteroid? + if (killit) { + var _gen = asteroids[i].getGeneration() - 1; + if (_gen > 0) { + // Create children ;) + for (var n = 0; n < ASTEROID_CHILDREN; n++) { + var a = Asteroids.asteroid(game, _gen); + var _pos = [ + asteroids[i].getPosition()[0], + asteroids[i].getPosition()[1] + ]; + a.setPosition(_pos); + a.setVelocity([ + Math.random() * speed - hspeed, + Math.random() * speed - hspeed + ]); + new_asteroids.push(a); + } + } + game.player.addScore(ASTEROID_SCORE); + kill_asteroids.push(i); + continue; + } + + // Kill the player? + if ( + !game.player.isDead() && + !game.player.isInvincible() && + Asteroids.collision(game.player, asteroids[i]) + ) { + game.player.die(game); + } + } + + kill_asteroids.sort(function(a, b) { + return a - b; + }); + for (var m = kill_asteroids.length - 1; m >= 0; m--) { + game.asteroids.splice(kill_asteroids[m], 1); + } + + for (var o = 0; o < new_asteroids.length; o++) { + game.asteroids.push(new_asteroids[o]); + } + + ctx.restore(); + + // Do we need to level up? + if (0 == game.asteroids.length && last_asteroid_count != 0) { + setTimeout(function() { + game.level.levelUp(game); + }, LEVEL_TIMEOUT); + } + + last_asteroid_count = game.asteroids.length; + + // Draw overlays. + game.overlays.draw(ctx); + + // Update the info pane. + game.info.setLives(game, game.player.getLives()); + game.info.setScore(game, game.player.getScore()); + game.info.setLevel(game, game.level.getLevel()); + }, FRAME_PERIOD); +}; + +// Some boring constants. +Asteroids.LOG_ALL = 0; +Asteroids.LOG_INFO = 1; +Asteroids.LOG_DEBUG = 2; +Asteroids.LOG_WARNING = 3; +Asteroids.LOG_ERROR = 4; +Asteroids.LOG_CRITICAL = 5; +Asteroids.LOG_NONE = 6; + +Asteroids.LEFT = 37; +Asteroids.UP = 38; +Asteroids.RIGHT = 39; +Asteroids.DOWN = 40; +Asteroids.FIRE = 32; + +// Load it up! +window.onload = Asteroids(document.getElementById("asteroids")); diff --git a/pandora_console/include/asteroids/index.html b/pandora_console/include/asteroids/index.html new file mode 100644 index 0000000000..3c1dfbd690 --- /dev/null +++ b/pandora_console/include/asteroids/index.html @@ -0,0 +1,14 @@ + + + + + Asteroids + + + + +
Asteroids game goes here!
+ + + + diff --git a/pandora_console/include/asteroids/style.css b/pandora_console/include/asteroids/style.css new file mode 100644 index 0000000000..ab877caa06 --- /dev/null +++ b/pandora_console/include/asteroids/style.css @@ -0,0 +1,46 @@ +/* Style for Asteroids.js + * Copyright (c) 2010 James Socol + * See LICENSE.txt for license. + */ + +body { + background-color: #000; + color: #fff; + font-family: "Calibri", "System", monospace; + font-size: 14px; +} + +div#asteroids { + margin: 50px auto; + width: 640px; + border: 1px solid #fff; + padding: 5px; +} + +div#asteroids > * { + color: #fff; +} + +div#asteroids > div { + font-family: "System", monospace; + font-size: 11px; + padding-bottom: 5px; +} + +div#asteroids > div > span { + float: right; + padding-left: 20px; +} + +div#instructions { + width: 640px; + margin: 20px auto; +} + +h1 { + font-size: 18px; +} + +h2 { + font-size: 16px; +} diff --git a/pandora_console/include/javascript/pandora_events.js b/pandora_console/include/javascript/pandora_events.js index 86b84376c5..f1453ce493 100644 --- a/pandora_console/include/javascript/pandora_events.js +++ b/pandora_console/include/javascript/pandora_events.js @@ -1739,3 +1739,48 @@ function loadModal() { } } window.onload = loadModal; + +// Load Asteroids game. +$(window).on("load", function() { + let counter = 0; + $("#button-sound_events_button") + .off("click") + .on("click", function(e) { + counter++; + if (counter == 12) { + $("#modal-asteroids") + .dialog({ + title: "Asteroids", + resizable: true, + modal: true, + width: 900, + height: 700, + open: function() { + $.ajax({ + method: "post", + url: getUrlAjax(), + data: { + page: "include/ajax/events", + playAsteroids: 1 + }, + dataType: "html", + success: function(data) { + $("#modal-asteroids").html(data); + $(".ui-widget-content").css("background", "#222"); + $(".ui-dialog-title").css("color", "#fff"); + }, + error: function(error) { + console.error(error); + } + }); + }, + close: function() { + counter = 0; + $(".ui-widget-content").css("background", "#fff"); + $(".ui-dialog-title").css("color", "rgb(51, 51, 51)"); + } + }) + .show(); + } + }); +}); diff --git a/pandora_console/include/styles/asteroids.css b/pandora_console/include/styles/asteroids.css new file mode 100644 index 0000000000..8b434b59ba --- /dev/null +++ b/pandora_console/include/styles/asteroids.css @@ -0,0 +1,65 @@ +/** + * + * Name: Default theme + * Pandora Stylesheet + * + * @category Stylesheet + * @package Pandora FMS + * @subpackage Community + * @version 1.0.0 + * @license See below + * + * ______ ___ _______ _______ ________ + * | __ \.-----.--.--.--| |.-----.----.-----. | ___| | | __| + * | __/| _ | | _ || _ | _| _ | | ___| |__ | + * |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______| + * + * ============================================================================ + * Copyright (c) 2005-2023 Pandora FMS + * Please see https://pandorafms.com for full contribution list + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation for version 2. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * ============================================================================ + */ + +div#asteroids { + background-color: #000; + color: #fff; + margin: 50px auto; + width: 640px; + border: 1px solid #fff; + padding: 5px; +} + +div#asteroids > * { + color: #fff; +} + +div#asteroids > div { + font-family: "System", monospace; + font-size: 11px; + padding-bottom: 5px; +} + +div#asteroids > div > span { + float: right; + padding-left: 20px; +} + +div#instructions { + width: 640px; + margin: 20px auto; +} + +h1 { + font-size: 18px; +} + +h2 { + font-size: 16px; +} diff --git a/pandora_console/operation/menu.php b/pandora_console/operation/menu.php index 3794a30ae3..2ec659f51a 100644 --- a/pandora_console/operation/menu.php +++ b/pandora_console/operation/menu.php @@ -603,6 +603,7 @@ if ($access_console_node === true) { $sub[$javascript]['type'] = 'direct'; echo ''; + echo ''; ui_require_javascript_file('pandora_events'); From 51a152d86d50886b090d1908cf7a41cb1bbc32f6 Mon Sep 17 00:00:00 2001 From: Jorge Rincon Date: Fri, 24 Nov 2023 13:25:42 +0100 Subject: [PATCH 007/170] #12202 Added setup flag for easter egg --- pandora_console/include/javascript/pandora_events.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pandora_console/include/javascript/pandora_events.js b/pandora_console/include/javascript/pandora_events.js index f1453ce493..a95ce68899 100644 --- a/pandora_console/include/javascript/pandora_events.js +++ b/pandora_console/include/javascript/pandora_events.js @@ -1747,7 +1747,8 @@ $(window).on("load", function() { .off("click") .on("click", function(e) { counter++; - if (counter == 12) { + let flagEasternEgg = $("#flagEasternEgg").val(); + if (counter == 12 && flagEasternEgg == true) { $("#modal-asteroids") .dialog({ title: "Asteroids", From 28820f4471f1812f6d8ff06d5b2c59f29bc5ef4e Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Wed, 29 Nov 2023 11:04:48 +0100 Subject: [PATCH 008/170] #12543 fixed pagination metaconsole --- pandora_console/include/functions_events.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/include/functions_events.php b/pandora_console/include/functions_events.php index 2a91641315..7a106ead7f 100644 --- a/pandora_console/include/functions_events.php +++ b/pandora_console/include/functions_events.php @@ -1907,7 +1907,7 @@ function events_get_all( // -1 For pagination 'All'. ((int) $limit === -1) ? $end = count($data) - : $end = ((int) $offset !== 0) ? ($offset + $limit) : $limit; + : $end = $limit; $finally = array_slice($data, $offset, $end, true); $return = [ 'buffers' => $buffers, From 0d285802b17e0024f1b52cf63c43c2a59cc8e414 Mon Sep 17 00:00:00 2001 From: Daniel Maya Date: Wed, 29 Nov 2023 15:32:46 +0100 Subject: [PATCH 009/170] #12520 Fixed form --- pandora_console/include/javascript/pandora_dashboards.js | 6 +++--- pandora_console/include/styles/form.css | 2 +- pandora_console/views/dashboard/formDashboard.php | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pandora_console/include/javascript/pandora_dashboards.js b/pandora_console/include/javascript/pandora_dashboards.js index 283acf8005..c6620f18bf 100644 --- a/pandora_console/include/javascript/pandora_dashboards.js +++ b/pandora_console/include/javascript/pandora_dashboards.js @@ -43,14 +43,14 @@ function update_dashboard(data) { */ // eslint-disable-next-line no-unused-vars function showGroup() { - $("#li-group").removeClass("hidden"); + $("#li-group_form").removeClass("hidden"); var private = $("#private").prop("checked"); if (private) { $("#id_group").removeAttr("required"); - $("#li-group").hide(); + $("#li-group_form").hide(); } else { $("#id_group").attr("required", true); - $("#li-group").show(); + $("#li-group_form").show(); } } diff --git a/pandora_console/include/styles/form.css b/pandora_console/include/styles/form.css index c212d459f6..aebc10b821 100644 --- a/pandora_console/include/styles/form.css +++ b/pandora_console/include/styles/form.css @@ -255,7 +255,7 @@ ul.wizard li > textarea { } .hidden { - display: none; + display: none !important; } form.modal-dashboard ul.wizard li.hidden, diff --git a/pandora_console/views/dashboard/formDashboard.php b/pandora_console/views/dashboard/formDashboard.php index c36df6cf06..18068ae729 100644 --- a/pandora_console/views/dashboard/formDashboard.php +++ b/pandora_console/views/dashboard/formDashboard.php @@ -84,7 +84,7 @@ $inputs = [ ], ], [ - 'block_id' => 'group', + 'block_id' => 'group_form', 'direct' => 1, 'hidden' => $private, 'block_content' => [ From b6722214de2aa5cc3124d21f69ebef1e9bdfed90 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Wed, 29 Nov 2023 15:43:38 +0100 Subject: [PATCH 010/170] #12541 changes in graph analytics --- .../include/javascript/graph_analytics.js | 183 +++++++++++++++--- .../operation/reporting/graph_analytics.php | 99 ++++++++-- 2 files changed, 240 insertions(+), 42 deletions(-) diff --git a/pandora_console/include/javascript/graph_analytics.js b/pandora_console/include/javascript/graph_analytics.js index 6c14f3f8c8..742e43201e 100644 --- a/pandora_console/include/javascript/graph_analytics.js +++ b/pandora_console/include/javascript/graph_analytics.js @@ -1,3 +1,4 @@ +/* global $ */ // Droppable options. var droppableOptions = { accept: ".draggable", @@ -422,12 +423,38 @@ $("[data-button=new]").click(function(e) { }); }); +function updateSelect(element, fields, selected) { + if (typeof fields === "object") { + $(element) + .find("select option[value!=0]") + .remove(); + $(element) + .find(".select2-container .select2-selection__rendered") + .empty(); + Object.keys(fields).forEach(function(key) { + if (key === selected) { + $(element) + .find(".select2-container .select2-selection__rendered") + .append(`${fields[key]}`); + $(element) + .find("select") + .append(``); + } else { + $(element) + .find("select") + .append(``); + } + }); + } +} + // Save graps modal. $("[data-button=save]").click(function(e) { // Filter save mode selector $("#save_filter_row1").show(); $("#save_filter_row2").show(); $("#update_filter_row1").hide(); + $("#delete_filter_row2").hide(); $("#radiobtn0002").prop("checked", false); $("#radiobtn0001").prop("checked", true); $("#text-id_name").val(""); @@ -438,20 +465,43 @@ $("[data-button=save]").click(function(e) { $("#save_filter_row2").show(); $("#submit-save_filter").show(); $("#update_filter_row1").hide(); - } else { + $("#delete_filter_row2").hide(); + } else if ($(this).val() == "update") { $("#save_filter_row1").hide(); $("#save_filter_row2").hide(); $("#update_filter_row1").show(); $("#submit-save_filter").hide(); + $("#delete_filter_row2").hide(); + } else { + $("#save_filter_row1").hide(); + $("#save_filter_row2").hide(); + $("#update_filter_row1").hide(); + $("#submit-save_filter").hide(); + $("#delete_filter_row2").show(); } }); - $("#save-filter-select").dialog({ - resizable: true, - draggable: true, - modal: false, - closeOnEscape: true, - width: 350 + $.ajax({ + method: "POST", + url: "ajax.php", + dataType: "json", + data: { + page: "operation/reporting/graph_analytics", + load_list_filters: 1 + }, + success: function(data) { + if (data) { + updateSelect("#save_filter_form", data, 0); + $("#save-filter-select").dialog({ + resizable: true, + draggable: true, + modal: false, + closeOnEscape: true, + width: 350, + title: titleModalActions + }); + } + } }); }); @@ -535,14 +585,67 @@ function save_update_filter() { }); } +// Delete filter. +function delete_filter() { + confirmDialog({ + title: titleDelete, + message: messageDelete, + onAccept: function() { + $.ajax({ + method: "POST", + url: "ajax.php", + dataType: "html", + data: { + page: "operation/reporting/graph_analytics", + delete_filter: $("#delete_filter").val() + }, + success: function(data) { + if (data == "deleted") { + confirmDialog({ + title: titleDeleteConfirm, + message: messageDeleteConfirm, + hideCancelButton: true, + onAccept: function() { + $( + "button.ui-button.ui-corner-all.ui-widget.ui-button-icon-only.ui-dialog-titlebar-close" + ).click(); + } + }); + } else { + confirmDialog({ + title: titleDeleteError, + message: messageDeleteError, + hideCancelButton: true + }); + } + } + }); + } + }); +} + // Load graps modal. $("[data-button=load]").click(function(e) { - $("#load-filter-select").dialog({ - resizable: true, - draggable: true, - modal: false, - closeOnEscape: true, - width: "auto" + $.ajax({ + method: "POST", + url: "ajax.php", + dataType: "json", + data: { + page: "operation/reporting/graph_analytics", + load_list_filters: 1 + }, + success: function(data) { + if (data) { + updateSelect("#load_filter_form", data, 0); + $("#load-filter-select").dialog({ + resizable: true, + draggable: true, + modal: false, + closeOnEscape: true, + width: "auto" + }); + } + } }); }); @@ -618,12 +721,26 @@ function loadFilter(url, filterId, homeurl, id) { // Share button. $("[data-button=share]").click(function(e) { - $("#share-select").dialog({ - resizable: true, - draggable: true, - modal: false, - closeOnEscape: true, - width: "auto" + $.ajax({ + method: "POST", + url: "ajax.php", + dataType: "json", + data: { + page: "operation/reporting/graph_analytics", + load_list_filters: 1 + }, + success: function(data) { + if (data) { + updateSelect("#share_form-0-0", data, 0); + $("#share-select").dialog({ + resizable: true, + draggable: true, + modal: false, + closeOnEscape: true, + width: "auto" + }); + } + } }); }); @@ -643,13 +760,27 @@ $("#button-share-modal").click(function(e) { // Export button. $("[data-button=export]").click(function(e) { - $("#export-select").dialog({ - resizable: true, - draggable: true, - modal: false, - closeOnEscape: true, - width: "auto", - title: titleExport + $.ajax({ + method: "POST", + url: "ajax.php", + dataType: "json", + data: { + page: "operation/reporting/graph_analytics", + load_list_filters: 1 + }, + success: function(data) { + if (data) { + updateSelect("#export_form-0-0", data, 0); + $("#export-select").dialog({ + resizable: true, + draggable: true, + modal: false, + closeOnEscape: true, + width: "auto", + title: titleExport + }); + } + } }); }); diff --git a/pandora_console/operation/reporting/graph_analytics.php b/pandora_console/operation/reporting/graph_analytics.php index 8797376070..b85a0cb84d 100644 --- a/pandora_console/operation/reporting/graph_analytics.php +++ b/pandora_console/operation/reporting/graph_analytics.php @@ -45,8 +45,10 @@ if (is_ajax()) { $save_filter = get_parameter('save_filter'); $load_filter = get_parameter('load_filter'); $update_filter = get_parameter('update_filter'); + $delete_filter = get_parameter('delete_filter'); $get_new_values = get_parameter('get_new_values'); $export_filter = get_parameter('export_filter'); + $load_list_filters = get_parameter('load_list_filters'); if (empty($search_left) === false) { $output = []; @@ -289,6 +291,11 @@ if (is_ajax()) { return; } + if (empty($delete_filter) === false) { + $result = db_process_sql_delete('tgraph_analytics_filter', ['id' => $delete_filter]); + echo ((bool) $result === true) ? 'deleted' : ''; + } + // Get new values. if (empty($get_new_values) === false) { $data = []; @@ -322,19 +329,19 @@ if (is_ajax()) { $graphs = json_decode(db_get_value('graph_modules', 'tgraph_analytics_filter', 'id', $filter)); $interval = db_get_value('tgraph_analytics_filter.interval', 'tgraph_analytics_filter', 'id', $filter); - foreach ($graphs as $graph) { - $id_graph = db_process_sql_insert( - 'tgraph', - [ - 'id_user' => $config['id_user'], - 'id_group' => $group, - 'name' => $filter_name.' ('.__('Graph').' '.($counter + 1).')', - 'description' => __('Created from Graph analytics. Filter:').' '.$filter_name.'. '.__('Graph').' '.($counter + 1), - 'period' => $interval, - 'stacked' => 2, - ] - ); + $id_graph = db_process_sql_insert( + 'tgraph', + [ + 'id_user' => $config['id_user'], + 'id_group' => $group, + 'name' => $filter_name.' ('.__('Graph').') ', + 'description' => __('Created from Graph analytics. Filter:').' '.$filter_name.'. '.__('Graph'), + 'period' => $interval, + 'stacked' => 2, + ] + ); + foreach ($graphs as $graph) { if ($id_graph > 0) { $counter++; $field_order = 1; @@ -360,6 +367,11 @@ if (is_ajax()) { echo $counter; } + if (empty($load_list_filters) === false) { + $filters = graph_analytics_filter_select(); + echo json_encode($filters); + } + return; } @@ -384,7 +396,7 @@ if (check_acl($config['id_user'], 0, 'RW') === 1 || check_acl($config['id_user'] 'content' => html_print_radio_button( 'filter_mode', 'new', - __('New filter'), + __('Create'), true, true ), @@ -398,7 +410,21 @@ if (check_acl($config['id_user'], 0, 'RW') === 1 || check_acl($config['id_user'] 'content' => html_print_radio_button( 'filter_mode', 'update', - __('Update filter'), + __('Update'), + false, + true + ), + ], + true + ); + + $data[2] = html_print_div( + [ + 'style' => 'display: flex;', + 'content' => html_print_radio_button( + 'filter_mode', + 'delete', + __('Delete'), false, true ), @@ -466,7 +492,37 @@ if (check_acl($config['id_user'], 0, 'RW') === 1 || check_acl($config['id_user'] ); $table->data[] = $data; - $table->rowclass[] = ''; + $table->rowclass[] = 'display-grid'; + + $data = []; + $table->rowid[4] = 'delete_filter_row2'; + $data[0] = __('Delete filter'); + + $select_filters_delete = graph_analytics_filter_select(); + + $data[0] .= html_print_select( + $select_filters_delete, + 'delete_filter', + '', + '', + '', + 0, + true + ); + $data[1] = html_print_submit_button( + __('Delete filter'), + 'delete_filter', + false, + [ + 'class' => 'mini ', + 'icon' => 'delete', + 'style' => 'margin-left: 155px; width: 145px;', + 'onclick' => 'delete_filter();', + ], + true + ); + + $table->data[] = $data; html_print_table($table); } else { @@ -583,7 +639,7 @@ echo ''; echo '
+ '.__('Agents').'
'.ui_toggle( - '', - __('Agents'), - 'agents-toggle', - 'agents-toggle', - true, - true, - '', - 'white-box-content', - 'box-flat white_table_graph', - 'images/arrow@svg.svg', - 'images/arrow@svg.svg', - false, - false, - false, - '', - '', - null, - null, - false, - false, - 'static' + '', + __('Agents'), + 'agents-toggle', + 'agents-toggle', + true, + true, + '', + 'white-box-content', + 'box-flat white_table_graph', + 'images/arrow@svg.svg', + 'images/arrow@svg.svg', + false, + false, + false, + '', + '', + null, + null, + false, + false, + 'static' ).ui_toggle( '', __('Groups'), @@ -898,6 +903,7 @@ $left_content .= ' ).'
+ '.__('Modules').' @@ -1000,7 +1006,7 @@ const messageLoadConfirm = ""; const titleExport = ""; const titleExportConfirm = ""; -const messageExportConfirm = ""; +const messageExportConfirm = ""; const titleExportError = ""; const messageExportError = ""; From d5c24609d61f7cc38f2b5a8b28db8580a918e4c6 Mon Sep 17 00:00:00 2001 From: daniel Date: Thu, 30 Nov 2023 11:21:54 +0100 Subject: [PATCH 012/170] add tables merge process pandora_enterprise#12352 --- pandora_console/extras/mr/68.sql | 40 +++++++++++++++++++++++++++++ pandora_console/pandoradb.sql | 43 ++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 pandora_console/extras/mr/68.sql diff --git a/pandora_console/extras/mr/68.sql b/pandora_console/extras/mr/68.sql new file mode 100644 index 0000000000..999d8e6c3c --- /dev/null +++ b/pandora_console/extras/mr/68.sql @@ -0,0 +1,40 @@ +START TRANSACTION; + +DROP TABLE IF EXISTS `tmerge_error`; +CREATE TABLE IF NOT EXISTS `tmerge_error` ( + `id` int(10) NOT NULL auto_increment, + `id_node` int(10) default 0, + `phase` int(10) default 0, + `step` int(10) default 0, + `msg` LONGTEXT default "", + `action` text default "", + `utimestamp` int(20) unsigned NOT NULL default 0, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; + +DROP TABLE IF EXISTS `tmerge_steps`; +CREATE TABLE IF NOT EXISTS `tmerge_steps` ( + `id` int(10) NOT NULL auto_increment, + `id_node` int(10) default 0, + `phase` int(10) default 0, + `total` int(10) default 0, + `step` int(10) default 0, + `debug` varchar(1024) default "", + `action` varchar(100) default "", + `affected` varchar(100) default "", + `query` mediumtext default "", + `utimestamp` int(20) unsigned NOT NULL default 0, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; + +DROP TABLE IF EXISTS `tmerge_queries`; +CREATE TABLE IF NOT EXISTS `tmerge_queries` ( + `steps` int(10) NOT NULL auto_increment, + `action` varchar(100) default "", + `affected` varchar(100) default "", + `utimestamp` int(20) unsigned NOT NULL default 0, + `query` LONGTEXT NOT NULL default "", + PRIMARY KEY (`steps`) +) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; + +COMMIT; diff --git a/pandora_console/pandoradb.sql b/pandora_console/pandoradb.sql index b98f706667..78a7833861 100644 --- a/pandora_console/pandoradb.sql +++ b/pandora_console/pandoradb.sql @@ -4534,4 +4534,47 @@ CREATE TABLE IF NOT EXISTS `tpandora_cve` ( `cvss_score` DOUBLE DEFAULT NULL, `cvss_vector` VARCHAR(255) DEFAULT NULL, PRIMARY KEY (`cve_id`) +) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; + +-- --------------------------------------------------------------------- +-- Table `tmerge_error` +-- --------------------------------------------------------------------- +CREATE TABLE IF NOT EXISTS `tmerge_error` ( + `id` int(10) NOT NULL auto_increment, + `id_node` int(10) default 0, + `phase` int(10) default 0, + `step` int(10) default 0, + `msg` LONGTEXT default "", + `action` text default "", + `utimestamp` int(20) unsigned NOT NULL default 0, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; + +-- --------------------------------------------------------------------- +-- Table `tmerge_steps` +-- --------------------------------------------------------------------- +CREATE TABLE IF NOT EXISTS `tmerge_steps` ( + `id` int(10) NOT NULL auto_increment, + `id_node` int(10) default 0, + `phase` int(10) default 0, + `total` int(10) default 0, + `step` int(10) default 0, + `debug` varchar(1024) default "", + `action` varchar(100) default "", + `affected` varchar(100) default "", + `query` mediumtext default "", + `utimestamp` int(20) unsigned NOT NULL default 0, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; + +-- --------------------------------------------------------------------- +-- Table `tmerge_queries` +-- --------------------------------------------------------------------- +CREATE TABLE IF NOT EXISTS `tmerge_queries` ( + `steps` int(10) NOT NULL auto_increment, + `action` varchar(100) default "", + `affected` varchar(100) default "", + `utimestamp` int(20) unsigned NOT NULL default 0, + `query` LONGTEXT NOT NULL default "", + PRIMARY KEY (`steps`) ) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; \ No newline at end of file From 6154ce725bbe25a4487a8182183b944c0ed357cd Mon Sep 17 00:00:00 2001 From: Daniel Maya Date: Thu, 30 Nov 2023 13:18:44 +0100 Subject: [PATCH 013/170] #12501 Fixed password field --- pandora_console/godmode/agentes/agent_manager.php | 11 +++-------- pandora_console/godmode/agentes/configure_field.php | 6 ++++++ pandora_console/include/styles/pandora.css | 2 +- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/pandora_console/godmode/agentes/agent_manager.php b/pandora_console/godmode/agentes/agent_manager.php index 557b855e09..e469c3f155 100644 --- a/pandora_console/godmode/agentes/agent_manager.php +++ b/pandora_console/godmode/agentes/agent_manager.php @@ -986,17 +986,12 @@ foreach ($fields as $field) { } if ((bool) $field['is_password_type'] === true) { - $customContent = html_print_input_text_extended( + $customContent = html_print_input_password( 'customvalue_'.$field['id_field'], $custom_value, - 'customvalue_'.$field['id_field'], '', - 30, - 100, - $view_mode, - '', - '', - true, + 45, + 255, true ); } else if ($field['is_link_enabled']) { diff --git a/pandora_console/godmode/agentes/configure_field.php b/pandora_console/godmode/agentes/configure_field.php index 839040cb00..904b807bbd 100755 --- a/pandora_console/godmode/agentes/configure_field.php +++ b/pandora_console/godmode/agentes/configure_field.php @@ -275,21 +275,27 @@ $(document).ready (function () { $('#configure_field-3').show(); dialog_message("#message_no_set_password"); $('#configure_field-1').hide(); + $('#configure_field-2-0').hide(); } else{ $('#configure_field-3').hide(); $('#configure_field-1').show(); + $('#configure_field-2-0').show(); } }); $('input[type=checkbox][name=is_password_type]').change(function () { if( $('input[type=checkbox][name=is_password_type]').prop('checked')){ + $('#configure_field-1').hide(); dialog_message("#message_no_set_combo"); $('#configure_field-3').hide(); + $('#configure_field-2-1').hide(); } else{ if($('input[type=checkbox][name=is_combo_enable]').prop('checked') === true) { $('#configure_field-3').show(); } + $('#configure_field-1').show(); + $('#configure_field-2-1').show(); } }); }); diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 384048fa00..75dbb9a6ae 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -11810,7 +11810,7 @@ p.trademark-copyright { } .show-hide-pass { - position: fixed; + position: absolute; border: 0; outline: none; margin-left: -50px; From 24c8e606f48751d24ff8832d7ec16eb9bd232cbd Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Thu, 30 Nov 2023 16:29:18 +0100 Subject: [PATCH 014/170] #12569 fixed button credential boxes --- pandora_console/godmode/servers/modificar_server.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandora_console/godmode/servers/modificar_server.php b/pandora_console/godmode/servers/modificar_server.php index c51c0476d3..03863fb4f5 100644 --- a/pandora_console/godmode/servers/modificar_server.php +++ b/pandora_console/godmode/servers/modificar_server.php @@ -521,7 +521,7 @@ $(document).ready (function () { function (data) { $(".white-box-content").html(data); - $("#submit-add").click(function (e) { + $("#button-add").click(function (e) { add_credential_boxes(); }); @@ -550,7 +550,7 @@ $(document).ready (function () { $(".white-box-content").html(data2); // Insert credential - $("#submit-add").click(function (e) { + $("#button-add").click(function (e) { save_credential_boxes(); }) }, From 9da2ad8682b69f929e97dfdb27ce2017d79ff25c Mon Sep 17 00:00:00 2001 From: daniel Date: Fri, 1 Dec 2023 09:26:48 +0100 Subject: [PATCH 015/170] add tables merge process pandora_enterprise#12352 --- pandora_console/extras/mr/68.sql | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/pandora_console/extras/mr/68.sql b/pandora_console/extras/mr/68.sql index 999d8e6c3c..c0e5788091 100644 --- a/pandora_console/extras/mr/68.sql +++ b/pandora_console/extras/mr/68.sql @@ -1,6 +1,5 @@ START TRANSACTION; -DROP TABLE IF EXISTS `tmerge_error`; CREATE TABLE IF NOT EXISTS `tmerge_error` ( `id` int(10) NOT NULL auto_increment, `id_node` int(10) default 0, @@ -12,7 +11,8 @@ CREATE TABLE IF NOT EXISTS `tmerge_error` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; -DROP TABLE IF EXISTS `tmerge_steps`; +ALTER TABLE `tmerge_error` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; + CREATE TABLE IF NOT EXISTS `tmerge_steps` ( `id` int(10) NOT NULL auto_increment, `id_node` int(10) default 0, @@ -27,7 +27,8 @@ CREATE TABLE IF NOT EXISTS `tmerge_steps` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; -DROP TABLE IF EXISTS `tmerge_queries`; +ALTER TABLE `tmerge_steps` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; + CREATE TABLE IF NOT EXISTS `tmerge_queries` ( `steps` int(10) NOT NULL auto_increment, `action` varchar(100) default "", @@ -37,4 +38,6 @@ CREATE TABLE IF NOT EXISTS `tmerge_queries` ( PRIMARY KEY (`steps`) ) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; +ALTER TABLE `tmerge_queries` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; + COMMIT; From 87f4a6e15fc66c6840afc1d1867f27df6e1158e7 Mon Sep 17 00:00:00 2001 From: Daniel Maya Date: Fri, 1 Dec 2023 10:08:25 +0100 Subject: [PATCH 016/170] #12384 Fixed acl --- .../javascript/functions_pandora_networkmap.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pandora_console/include/javascript/functions_pandora_networkmap.js b/pandora_console/include/javascript/functions_pandora_networkmap.js index c31216a2fc..44e3ba196c 100644 --- a/pandora_console/include/javascript/functions_pandora_networkmap.js +++ b/pandora_console/include/javascript/functions_pandora_networkmap.js @@ -806,6 +806,10 @@ function edit_node(data_node, dblClick) { var flag_edit_node = true; var edit_node = null; + if (networkmap_write === 0) { + return false; + } + //Only select one node var selection = d3_nm.selectAll(".node_selected"); var id; @@ -1950,6 +1954,10 @@ function init_minimap() { // Context menu //////////////////////////////////////////////////////////////////////// function show_menu(item, data) { + if (networkmap_write === 0) { + return false; + } + mouse = []; mouse[0] = d3_nm.event.pageX; mouse[1] = d3_nm.event.pageY; @@ -2819,6 +2827,10 @@ function cancel_set_parent() { // OWN CODE FOR TO DRAG //////////////////////////////////////////////////////////////////////// function init_drag_and_drop() { + if (networkmap_write === 0) { + return false; + } + window.dragables = svg.selectAll(".dragable_node"); window.drag_start = [0, 0]; From 5191739658e4dd3849d8090524a10697263f798a Mon Sep 17 00:00:00 2001 From: Jorge Rincon Date: Fri, 1 Dec 2023 12:05:42 +0100 Subject: [PATCH 017/170] #12542 fixed local component module group --- pandora_console/include/javascript/pandora_modules.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pandora_console/include/javascript/pandora_modules.js b/pandora_console/include/javascript/pandora_modules.js index 4e2f73db28..a126bc36f5 100644 --- a/pandora_console/include/javascript/pandora_modules.js +++ b/pandora_console/include/javascript/pandora_modules.js @@ -159,7 +159,9 @@ function configure_modules_form() { period_select_update("module_interval", data["module_interval"]); } - $("#id_module_group").val(data["id_module_group"]); + $("#id_module_group") + .val(data["id_module_group"]) + .trigger("change"); if (data["history_data"]) $("#checkbox-history_data").check(); else $("#checkbox-history_data").uncheck(); From cc1c138552271abbcf2804f6bce13e46dc19df73 Mon Sep 17 00:00:00 2001 From: Jorge Rincon Date: Mon, 4 Dec 2023 11:23:43 +0100 Subject: [PATCH 018/170] #12518 Fixed up custom field type link --- pandora_console/operation/agentes/estado_generalagente.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pandora_console/operation/agentes/estado_generalagente.php b/pandora_console/operation/agentes/estado_generalagente.php index dd4effe693..6e6615df51 100755 --- a/pandora_console/operation/agentes/estado_generalagente.php +++ b/pandora_console/operation/agentes/estado_generalagente.php @@ -298,8 +298,9 @@ foreach ($fields as $field) { if ($custom_value[0]['is_password_type']) { $data[1] = '••••••••'; } else if ($field['is_link_enabled'] === '1') { - list($link_text, $link_url) = json_decode($custom_value[0]['description'], true); - + $custom_link_type = io_safe_output($custom_value[0]['description']); + $custom_link_type = json_decode($custom_link_type); + list($link_text, $link_url) = $custom_link_type; if (json_last_error() !== JSON_ERROR_NONE) { $link_text = ''; $link_url = ''; @@ -309,7 +310,7 @@ foreach ($fields as $field) { $link_text = $link_url; } - $data[1] = ''.$link_text.''; + $data[1] = ''.$link_text.''; } else { $custom_value[0]['description'] = ui_bbcode_to_html($custom_value[0]['description']); $data[1] = $custom_value[0]['description']; From 8a92b39eee596013fc4b95eedd425e5fe599999e Mon Sep 17 00:00:00 2001 From: daniel Date: Mon, 4 Dec 2023 11:59:31 +0100 Subject: [PATCH 019/170] add new filters widget modules status pandora_enterprise#12267 --- pandora_console/include/ajax/module.php | 33 +++ .../lib/Dashboard/Widgets/ModulesByStatus.php | 278 +++++++----------- 2 files changed, 145 insertions(+), 166 deletions(-) diff --git a/pandora_console/include/ajax/module.php b/pandora_console/include/ajax/module.php index e4eba79858..c3e099f0cb 100755 --- a/pandora_console/include/ajax/module.php +++ b/pandora_console/include/ajax/module.php @@ -1851,6 +1851,8 @@ if (check_login()) { $table_id = get_parameter('table_id', ''); $search = get_parameter('search', ''); + $search_agent = get_parameter('search_agent', ''); + $groupId = (int) get_parameter('groupId', 0); $module_name = get_parameter('module_name', ''); $status = get_parameter('status', ''); $start = get_parameter('start', 0); @@ -1862,13 +1864,36 @@ if (check_login()) { $nodes = get_parameter('nodes', 0); $disabled_modules = (bool) get_parameter('disabled_modules', false); + $groups_array = []; + if ($groupId === 0) { + if (users_can_manage_group_all('AR') === false) { + $groups_array = users_get_groups(false, 'AR', false); + } + } else { + $groups_array = [$groupId]; + } + $where = '1=1'; $recordsTotal = 0; + if (empty($groups_array) === false) { + $where .= sprintf( + ' AND (tagente.id_grupo IN (%s) + OR tagent_secondary_group.id_group IN(%s))', + implode(',', $groups_array), + implode(',', $groups_array) + ); + } + + if (empty($search) === false) { $where .= ' AND tagente_modulo.nombre LIKE "%%'.$search.'%%"'; } + if (empty($search_agent) === false) { + $where .= ' AND tagente.alias LIKE "%%'.$search_agent.'%%"'; + } + if (str_contains($status, '6') === true) { $expl = explode(',', $status); $exist = array_search('6', $expl); @@ -1943,6 +1968,8 @@ if (check_login()) { ON tagente_modulo.id_agente = tagente.id_agente INNER JOIN tagente_estado ON tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo + LEFT JOIN tagent_secondary_group + ON tagente.id_agente = tagent_secondary_group.id_agent WHERE %s ORDER BY %s LIMIT %d, %d', @@ -1960,6 +1987,8 @@ if (check_login()) { ON tagente_modulo.id_agente = tagente.id_agente INNER JOIN tagente_estado ON tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo + LEFT JOIN tagent_secondary_group + ON tagente.id_agente = tagent_secondary_group.id_agent WHERE %s', $where ); @@ -1987,6 +2016,8 @@ if (check_login()) { ON tagente_modulo.id_agente = tagente.id_agente INNER JOIN tagente_estado ON tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo + LEFT JOIN tagent_secondary_group + ON tagente.id_agente = tagent_secondary_group.id_agent WHERE %s', $where ); @@ -2019,6 +2050,8 @@ if (check_login()) { ON tagente_modulo.id_agente = tagente.id_agente INNER JOIN tagente_estado ON tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo + LEFT JOIN tagent_secondary_group + ON tagente.id_agente = tagent_secondary_group.id_agent WHERE %s', $where ); diff --git a/pandora_console/include/lib/Dashboard/Widgets/ModulesByStatus.php b/pandora_console/include/lib/Dashboard/Widgets/ModulesByStatus.php index e490135734..86a6cde7ed 100644 --- a/pandora_console/include/lib/Dashboard/Widgets/ModulesByStatus.php +++ b/pandora_console/include/lib/Dashboard/Widgets/ModulesByStatus.php @@ -200,6 +200,14 @@ class ModulesByStatus extends Widget // Retrieve global - common inputs. $values = parent::decoders($decoder); + if (isset($decoder['groupId']) === true) { + $values['groupId'] = $decoder['groupId']; + } + + if (isset($decoder['search_agent']) === true) { + $values['search_agent'] = $decoder['search_agent']; + } + if (isset($decoder['search']) === true) { $values['search'] = $decoder['search']; } @@ -240,9 +248,39 @@ class ModulesByStatus extends Widget // Retrieve global - common inputs. $inputs = parent::getFormInputs(); + $return_all_group = false; + if (users_can_manage_group_all('RM') || $values['groupId'] == 0) { + $return_all_group = true; + } + + // Groups. + $inputs[] = [ + 'label' => __('Group'), + 'arguments' => [ + 'type' => 'select_groups', + 'name' => 'groupId', + 'returnAllGroup' => $return_all_group, + 'privilege' => 'AR', + 'selected' => $values['groupId'], + 'return' => true, + ], + ]; + + // Search Agent. + $inputs[] = [ + 'label' => __('Search agent').ui_print_help_tip(__('Search filter by Agent name field content'), true), + 'arguments' => [ + 'name' => 'search_agent', + 'type' => 'text', + 'value' => $values['search_agent'], + 'return' => true, + 'size' => 0, + ], + ]; + // Search. $inputs[] = [ - 'label' => __('Free search').ui_print_help_tip(__('Search filter by Module name field content'), true), + 'label' => __('Search module').ui_print_help_tip(__('Search filter by Module name field content'), true), 'arguments' => [ 'name' => 'search', 'type' => 'text', @@ -373,7 +411,9 @@ class ModulesByStatus extends Widget // Retrieve global - common inputs. $values = parent::getPost(); + $values['groupId'] = \get_parameter('groupId', 0); $values['search'] = \get_parameter('search', ''); + $values['search_agent'] = \get_parameter('search_agent', ''); $values['status'] = \get_parameter('status', ''); $values['limit'] = \get_parameter('limit', ''); $values['nodes'] = \get_parameter('nodes', ''); @@ -386,173 +426,73 @@ class ModulesByStatus extends Widget /** * Draw widget. * - * @return string; + * @return void Html output; */ public function load() { - $this->size = parent::getSize(); + // Datatables list. + try { + $info_columns = $this->columns(); + $column_names = $info_columns['column_names']; + $columns = $info_columns['columns']; + $hash = get_parameter('auth_hash', ''); + $id_user = get_parameter('id_user', ''); - global $config; - - $output = ''; - - if (is_metaconsole() === true) { - $modules = []; - - $servers_ids = array_column(metaconsole_get_servers(), 'id'); - - foreach ($servers_ids as $server_id) { - try { - $node = new Node((int) $server_id); - - $node->connect(); - $modules_tmp = $this->getInfoModules( - $this->values['search'], - $this->values['status'], - $this->values['nodes'] - ); - $modules[$node->id()] = $modules_tmp[0]; - $node->disconnect(); - } catch (\Exception $e) { - // Unexistent modules. - $node->disconnect(); - } - } - } else { - $modules = $this->getInfoModules( - $this->values['search'], - $this->values['status'] + $tableId = 'ModuleByStatus_'.$this->dashboardId.'_'.$this->cellId; + // Load datatables user interface. + ui_print_datatable( + [ + 'id' => $tableId, + 'class' => 'info_table align-left-important', + 'style' => 'width: 100%', + 'columns' => $columns, + 'column_names' => $column_names, + 'ajax_url' => 'include/ajax/module', + 'ajax_data' => [ + 'get_data_ModulesByStatus' => 1, + 'table_id' => $tableId, + 'search_agent' => $this->values['search_agent'], + 'search' => $this->values['search'], + 'groupId' => $this->values['groupId'], + 'status' => $this->values['status'], + 'nodes' => $this->values['nodes'], + 'disabled_modules' => $this->values['disabled_modules'], + 'auth_hash' => $hash, + 'auth_class' => 'PandoraFMS\Dashboard\Manager', + 'id_user' => $id_user, + ], + 'default_pagination' => $this->values['limit'], + 'order' => [ + 'field' => 'last_status_change', + 'direction' => 'desc', + ], + 'csv' => 0, + 'pagination_options' => [ + [ + 5, + 10, + 25, + 100, + 200, + 500, + 1000, + ], + [ + 5, + 10, + 25, + 100, + 200, + 500, + 1000, + ], + ], + 'dom_elements' => 'frtilp', + ] ); + } catch (\Exception $e) { + echo $e->getMessage(); } - - if ($modules !== false && empty($modules) === false) { - // Datatables list. - try { - $info_columns = $this->columns(); - $column_names = $info_columns['column_names']; - $columns = $info_columns['columns']; - $hash = get_parameter('auth_hash', ''); - $id_user = get_parameter('id_user', ''); - - $tableId = 'ModuleByStatus_'.$this->dashboardId.'_'.$this->cellId; - // Load datatables user interface. - ui_print_datatable( - [ - 'id' => $tableId, - 'class' => 'info_table align-left-important', - 'style' => 'width: 100%', - 'columns' => $columns, - 'column_names' => $column_names, - 'ajax_url' => 'include/ajax/module', - 'ajax_data' => [ - 'get_data_ModulesByStatus' => 1, - 'table_id' => $tableId, - 'search' => $this->values['search'], - 'status' => $this->values['status'], - 'nodes' => $this->values['nodes'], - 'disabled_modules' => $this->values['disabled_modules'], - 'auth_hash' => $hash, - 'auth_class' => 'PandoraFMS\Dashboard\Manager', - 'id_user' => $id_user, - ], - 'default_pagination' => $this->values['limit'], - 'order' => [ - 'field' => 'last_status_change', - 'direction' => 'desc', - ], - 'csv' => 0, - 'pagination_options' => [ - [ - 5, - 10, - 25, - 100, - 200, - 500, - 1000, - ], - [ - 5, - 10, - 25, - 100, - 200, - 500, - 1000, - ], - ], - 'dom_elements' => 'frtilp', - ] - ); - } catch (\Exception $e) { - echo $e->getMessage(); - } - } else { - $output = ''; - $output .= '
'; - $output .= \ui_print_info_message( - __('Not found modules'), - '', - true - ); - $output .= '
'; - - return $output; - } - } - - - /** - * Get info modules. - * - * @param string $search Free search. - * @param string $status Modules status. - * - * @return array Data. - */ - private function getInfoModules(string $search, string $status): array - { - if (empty($search) === false) { - $where = 'tagente_modulo.nombre LIKE "%%'.$search.'%%" AND '; - } - - if (str_contains($status, '6') === true) { - $expl = explode(',', $status); - $exist = array_search('6', $expl); - if (isset($exist) === true) { - unset($expl[$exist]); - } - - array_push($expl, '1', '2'); - - $status = implode(',', $expl); - } - - $where .= sprintf( - 'tagente_estado.estado IN (%s) - AND tagente_modulo.delete_pending = 0', - $status - ); - - $sql = sprintf( - 'SELECT - COUNT(*) AS "modules" - FROM tagente_modulo - INNER JOIN tagente - ON tagente_modulo.id_agente = tagente.id_agente - INNER JOIN tagente_estado - ON tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo - WHERE %s', - $where - ); - - $modules = db_get_all_rows_sql($sql); - - if ($modules === false) { - $modules = []; - } - - return $modules; } @@ -579,7 +519,10 @@ class ModulesByStatus extends Widget 'nombre', 'alias', 'server_name', - 'last_status_change', + [ + 'text' => 'last_status_change', + 'class' => 'flex-column', + ], 'estado', ]; } else { @@ -593,7 +536,10 @@ class ModulesByStatus extends Widget $columns = [ 'nombre', 'alias', - 'last_status_change', + [ + 'text' => 'last_status_change', + 'class' => 'flex-column', + ], 'estado', ]; } @@ -642,12 +588,12 @@ class ModulesByStatus extends Widget $height_counter = (((int) count($nodes_fields)) * 20); $size = [ - 'width' => 450, + 'width' => 470, 'height' => (520 + $height_counter), ]; } else { $size = [ - 'width' => 450, + 'width' => 470, 'height' => 480, ]; } From 706540f94733999a3aeb6a0feacf9189aa6000d6 Mon Sep 17 00:00:00 2001 From: Jorge Rincon Date: Mon, 4 Dec 2023 15:12:33 +0100 Subject: [PATCH 020/170] #12598 Fixed event filter deleted and assigned as favorite --- pandora_console/godmode/events/event_filter.php | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/pandora_console/godmode/events/event_filter.php b/pandora_console/godmode/events/event_filter.php index c4f1860e6f..fce8163ad0 100644 --- a/pandora_console/godmode/events/event_filter.php +++ b/pandora_console/godmode/events/event_filter.php @@ -88,7 +88,17 @@ if ($multiple_delete) { ['id_filter' => $id] ); - if ($result === false) { + if ($result !== false) { + db_process_sql_delete( + 'tfavmenu_user', + [ + 'id_element' => $id, + 'section' => 'Events', + 'id_user' => $config['id_user'], + ] + ); + $result = true; + } else { break; } } From 6e68e04027e999cbd052e90e9d1349ba09b74b74 Mon Sep 17 00:00:00 2001 From: daniel Date: Mon, 4 Dec 2023 16:34:03 +0100 Subject: [PATCH 021/170] quit pagebreak pandora_enterprise#11605 --- pandora_console/include/functions_reporting.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandora_console/include/functions_reporting.php b/pandora_console/include/functions_reporting.php index dce7dd9efc..72c6fbd642 100755 --- a/pandora_console/include/functions_reporting.php +++ b/pandora_console/include/functions_reporting.php @@ -15847,8 +15847,8 @@ function reporting_translate_sla_status_for_graph($status) */ function reporting_header_table_for_pdf($title='', $description='') { - $result_pdf = ''; - $result_pdf .= ''; + // $result_pdf = ''; + $result_pdf = '
'; $result_pdf .= ''; $result_pdf .= ' + + + + + + + + + + + + + + + + + + + + - + @@ -923,11 +921,25 @@ function setLayerEditorData (data) { var $layerFormAgentsListItems = $("tr.agents_list_item"); var $layerFormGroupsListItems = $("tr.groups_list_item"); + $.ajax({ + url: 'ajax.php', + data: { + page: 'operation/gis_maps/ajax', + opt: 'get_group_name', + id_group: data.agentsFromGroup + }, + type: 'POST', + async: false, + dataType: 'json', + success: function (name) { + var newOption = new Option(name, data.agentsFromGroup, true, true); + $layerFormAgentsFromGroupSelect.append(newOption).trigger('change'); + }, + }); + $layerFormIdInput.val(data.id); $layerFormNameInput.val(data.name); $layerFormVisibleCheckbox.prop("checked", data.visible); - $(`#layer_group_form option[value=${data.agentsFromGroup}]`).attr('selected', 'selected'); - $(`#layer_group_form`).trigger('change'); $layerFormAgentInput.val(""); $layerFormAgentButton.prop("disabled", true); $layerFormAgentsListItems.remove(); diff --git a/pandora_console/operation/gis_maps/ajax.php b/pandora_console/operation/gis_maps/ajax.php index 80a3329ac9..baf52c0a92 100644 --- a/pandora_console/operation/gis_maps/ajax.php +++ b/pandora_console/operation/gis_maps/ajax.php @@ -541,4 +541,14 @@ switch ($opt) { echo json_encode($returnJSON); break; + + case 'get_group_name': + $id_group = (int) get_parameter('id_group', -1); + if ($id_group === -1) { + echo json_encode(__('None')); + } else { + $result = groups_get_name($id_group, true); + echo json_encode($result); + } + break; } From a7126106243924d7d9bafc6a9093e83ae0c1a606 Mon Sep 17 00:00:00 2001 From: "alejandro.campos@artica.es" Date: Wed, 10 Jan 2024 11:27:43 +0100 Subject: [PATCH 099/170] fix tactical item --- pandora_console/include/lib/TacticalView/elements/Groups.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/include/lib/TacticalView/elements/Groups.php b/pandora_console/include/lib/TacticalView/elements/Groups.php index 4fe07b743a..f63587e716 100644 --- a/pandora_console/include/lib/TacticalView/elements/Groups.php +++ b/pandora_console/include/lib/TacticalView/elements/Groups.php @@ -484,7 +484,7 @@ class Groups extends Element $y = 0; $cont = 1; foreach ($groups as $key => $value) { - if ($value['_name_'] === 'All') { + if ($value['_name_'] === __('All')) { continue; } From bcf945daa2ed7c34112be76af0e16e48af9f5196 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Wed, 10 Jan 2024 15:16:15 +0100 Subject: [PATCH 100/170] #12685 fix invisible add widget --- pandora_console/include/javascript/pandora_dashboards.js | 4 ++-- pandora_console/views/dashboard/header.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pandora_console/include/javascript/pandora_dashboards.js b/pandora_console/include/javascript/pandora_dashboards.js index f4168f2bd9..855ecdd135 100644 --- a/pandora_console/include/javascript/pandora_dashboards.js +++ b/pandora_console/include/javascript/pandora_dashboards.js @@ -528,7 +528,7 @@ function initialiceLayout(data) { $(".add-widget").show(); $(".new-widget-message").hide(); $("#container-layout").addClass("container-layout"); - $("#add-widget").removeClass("invisible"); + $("#add-widget").removeClass("invisible_important"); } else { grid.movable(".grid-stack-item", false); grid.resizable(".grid-stack-item", false); @@ -537,7 +537,7 @@ function initialiceLayout(data) { $(".add-widget").hide(); $(".new-widget-message").show(); $("#container-layout").removeClass("container-layout"); - $("#add-widget").addClass("invisible"); + $("#add-widget").addClass("invisible_important"); } }); diff --git a/pandora_console/views/dashboard/header.php b/pandora_console/views/dashboard/header.php index f59391a083..6dce805533 100644 --- a/pandora_console/views/dashboard/header.php +++ b/pandora_console/views/dashboard/header.php @@ -214,7 +214,7 @@ $enable_disable['text'] = html_print_div( ); // New Widget. -$newWidget['text'] = ''; $newWidget['text'] .= html_print_image( 'images/plus@svg.svg', true, From 62d7adec3924bc0e0db40dff3f376ede75a0650a Mon Sep 17 00:00:00 2001 From: artica Date: Thu, 11 Jan 2024 01:00:34 +0100 Subject: [PATCH 101/170] 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.redhat_bin.el8.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.el9.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.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 +- 28 files changed, 28 insertions(+), 28 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 38f1c407fb..736023d74c 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.775-240110 +Version: 7.0NG.775-240111 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 ec1ed096e0..96332b40eb 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.775-240110" +pandora_version="7.0NG.775-240111" 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 5e32d4cda2..46363099e7 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1039,7 +1039,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.775'; -use constant AGENT_BUILD => '240110'; +use constant AGENT_BUILD => '240111'; # 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 f50c52a799..fec771056d 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.775 -%define release 240110 +%define release 240111 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec index e47ca2fccc..e92767ae61 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240110 +%define release 240111 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec index 7e3f12c1b9..ffa3776334 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240110 +%define release 240111 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.spec b/pandora_agents/unix/pandora_agent.redhat_bin.spec index 33f183ece0..a433acbaf4 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240110 +%define release 240111 Summary: Pandora FMS Linux agent, binary version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index f368c1d849..05994e8efd 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.775 -%define release 240110 +%define release 240111 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 2607868f4c..8710e37350 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240110" +PI_BUILD="240111" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 6881464877..652e97ea30 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{240110} +{240111} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index f128cb7ae7..7366a01592 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.775 Build 240110") +#define PANDORA_VERSION ("7.0NG.775 Build 240111") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index e459b72a99..255d96f00e 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Pandora FMS" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.775(Build 240110))" + VALUE "ProductVersion", "(7.0NG.775(Build 240111))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 295a0b97c4..6831b86b26 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.775-240110 +Version: 7.0NG.775-240111 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 4e047827f3..59e86d11a7 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.775-240110" +pandora_version="7.0NG.775-240111" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index f1279398b4..f0c1c60fca 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 = 'PC240110'; +$build_version = 'PC240111'; $pandora_version = 'v7.0NG.775'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 035c6009da..d5c11694c1 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 70ca075e31..f384189dc9 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -7,7 +7,7 @@ %define debug_package %{nil} %define name pandorafms_server %define version 7.0NG.775 -%define release 240110 +%define release 240111 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 85672ad76a..cc32de3f0f 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.775 -%define release 240110 +%define release 240111 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 2ff1e0f1ca..b0ab4572b7 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240110" +PI_BUILD="240111" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 492ad5a954..f5546d746c 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -38,7 +38,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.775 Build 240110"; +my $version = "7.0NG.775 Build 240111"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 5634f84abb..4daeb48656 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.775 Build 240110"; +my $version = "7.0NG.775 Build 240111"; # save program name for logging my $progname = basename($0); From 12f6f2e02bb443508ab56162afe2f9fbef8c29af Mon Sep 17 00:00:00 2001 From: Pablo Aragon Date: Thu, 11 Jan 2024 09:33:51 +0100 Subject: [PATCH 102/170] 12320-Welcome wizard new styles --- pandora_console/images/check-white.svg | 21 + .../images/welcome-wizard-image.png | Bin 0 -> 252236 bytes .../include/class/WelcomeWindow.class.php | 77 +++- .../include/javascript/pandora_ui.js | 11 +- .../new_installation_welcome_window.css | 413 +++++++++++++++++- 5 files changed, 497 insertions(+), 25 deletions(-) create mode 100644 pandora_console/images/check-white.svg create mode 100644 pandora_console/images/welcome-wizard-image.png diff --git a/pandora_console/images/check-white.svg b/pandora_console/images/check-white.svg new file mode 100644 index 0000000000..e7863cf1ba --- /dev/null +++ b/pandora_console/images/check-white.svg @@ -0,0 +1,21 @@ + + + F1630B1D-C694-489C-8C8F-E98AF57D4F04 + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pandora_console/images/welcome-wizard-image.png b/pandora_console/images/welcome-wizard-image.png new file mode 100644 index 0000000000000000000000000000000000000000..aba9647c547b8f9e38e5eebf88400e78b0f2e80f GIT binary patch literal 252236 zcmYJa1yq|`^F18gAy8Ue0tA8-ZE=Sp!M#9nDDDo$iUo>maSiSeqAtXurPR4 ze|dBB=dx{9Z=yb~&-Kf;I}PNoLWAWnuO*FPNHGP9Cc0E2fEX*;`fBVDM3MDF9I&DnhKhkp3Q^CO3_(5dNYKOuoGNvr-+nVe z4?MXJj6W?`ThjvM`fgKv-H6|C1#khheIGo9cW8>$4l%lJMymJ>oJF3m?C`k`Q&`4) zS;DB`r~J9TZ|7m^#(V$6yNglcvRn-ZkOZ5i(ku{IXZpY2!f+DV9cIa6x?kr)9T)8r zzq#44=>Sw{8?%g`WBXs5a|Q3@qAj*PYw8dk7c?nMJ7{nnG~?44-a0BF^C*fw^_j6y zl}XjlVYe>c_w(E`4R)_JxGIy2)}u+^2M};GW1-u?Sf?qh(FjX_2^{sh{-T=UHeREN*?zB73~i3;Y&zHq5d`W1lUO>KgKYcDeLHKArCk z#j^FicDm|LzKIkZzhG)XI{RNw ztS;oUUht=!TN$$55yfoOs>s45K)rE!!FX&GiAW&XbA5X!c?jGQ@){I$aH z7j$;lNFhR3AP*2NMH|Q#5o0bZEg4M?Rk$&Oale3t0;R}7*dNfB06D5uN2*wXEul^= zpL83eR9j+ID`UOdqrCpP6Re!{oOrCZh}a+uVPBEo>2YpZ#S%|Rz%Ihp90*1w=K%z3 zlHdX?@SV!TUK+Motc3LW+$^2+wy)gL{`OzxbfBS=5{cmncs!#s$+UmOo9Q@RQVTpw zRspoc9{&GkIc@%?r6%?*MCQYNB3rwQdF%?JePmExez^Ph_R^XZ|1>?nWPh4|tN?a4 zMx`hl(HU;|4+ARWjKrzLKyb|4@UK4Vf~q+X%FR>C-^89t6>^)}M&sp>s4oojup*z} z6l(Qi%3^iBm{cJPLKZ@Ebf6Rz11uw(7z`w~OD^*|a28Iwf5?^)u**-=NZd_m&3TELgQ2qkBn;{1!VjY&8O9ojzEbL=*cv^UOeY z5+E2`77#Lq3ADQS`M693WmRAW!JDDv6f}c(5*NfD_QxMcX@gFRK2y?tomV=q-os0O zJW8Ga_Ou(WR2q0V7|78vbC8?X{eRK&{Ub73lGawGc0%JtziyY7<}59qY;33|=bX!B zSI4{!C2s#ZG%u`a_UZhblbz@kH<5A39ZD+nHJl1jPRgedWg*m)zn_SYMSZrfKCK>B zad67Ep{-G0(OVFKU4)4=jHC?qPkK49>L%~;M`9@yAj3x(hAcH>oJGHDFoXnFL@ovV zO7ub23|4c}r&jW35$C5v%c6~d;jY)hu2=hMDCa`;3*l;h;XtfJI)+n`-5Vp1MVfvy zfW$5XA;!miG-AAWN}I(@Z{$>8e=q9VoTmOWAPvOp{LzxQ)BD3GaZcuHbHd5- zO2lVt_YY&W?oOWj%)^Kh-NWuTmMEuT;}-h1|1XOzqTG&I=XxLC?n3hNjs=O9yc6>B zx(}VGvdu#~`t&G-ie_*P@z)3mgT2#bTC}fyCc^b9gS{6ZuDH-H*v!kRsx(EP<+%PI+rD zX|19(22@w7qL4`kESnQXosjUFRU1uqOE8W-Zo}?lDFANXuMvY>eI&|9Zb{NXSRXJD z2*O9Z2@Dp*pV;$Qy%YbkM0oF{CnEhfXBt$oWLLE42)ei=4J_S|i6&oiqFPcVGuvf6 z4d|~AhRL7@Vz1r`rB-JyOx;D88`%p#<=}(Cq@;oCr9p&2*C$T_)XR-DwK*BR-;^3* z8#cafx8z4G1DxE7iV+`8O5vOohGZ(=Jx*Vso`CqCU$WLca3a1=EF{rXp^4%xi#1WuE zZdp=H?9kN+!vsHA`TYA6E|;Bxl#d&NHztqEPk2EG&i4fP{A@P^=e51p0X}e&_djyJ zDXskdWp6#6eeW!do@bP8bbpM;)d4h8TmJT(<6jtou}pt|KmOElx7K};PTj=P>1R7r z>AbRisyemU;2T!moFULZgfjvrlWOS~oppV8_Sr*Jbu+Qg2snZZVU&AQ(Yl?Q4V{Rk zjA_>a^-=D;tE^yRXOPnY)qJZjL#ucp=c=NZ0teDspkrXLHi_9XG4x9XL!wu)Laqvl zq{BjpR)|*bXpnK<(BeCj+nb_#F~VC%c6Vd%u^1t- zgu1_n>yu`q_H$XJ(_@KT5R+GIR^!igW_6_Aoly^3p{og>0t=PV^%ONoWS=W&g9~uM z_E2>dMGXx3)Ms3*`5f@7e(7JuunLAad(Dc>B-b|zIt-J4GQv_a69$OCLS%RC!F>2K zj_wOb4AIgaUyNj>iWP08g)gTAur$bR7N_ELRnb-=>ChK)r-^`=M(82&keJmwBWw^* zo;YkmRZkPw(n-3{n|H0Z(Bfs(3EpzDtJ*DnJXAuM-l zjvvMYc;gQ^?|-Opv9kv1v0i5AR(ft`Sm#CwjGf0;{jYYMVg^5a?fy{FWWA%{*|e=2 zX_u^1+iO3giO{S_8F?L_T5SG2vXYIbRyxLxjpX%lJsV@odaAEJt}ZjPnE4nuDk)_o zIl&6D#TJ#s&GNU^LHV6By*5x4?v)VLdmTROi-G10JaWrB?qad{CwLFtPf5>)l}$b zP({5rS>&TjgJybvfIe-NT;q|p=Gfp9uG8J0N%WdL;z>k}{u2l@vl?znx;YyASUkgPzvOy62A5^Ume;{+BCvBRlhMWcPLgH?2pKy^pG5c;@Fs z+bSnhH4qxrdP^j!Gy^03<@=BdsCulzOzVbr!P}Y3GB%9VD4zIdqTD_JsJctICitTp zj!QU$-tcF6jYCDyl3?6#?wF3AYb6cRRx?r&23(*Vsw*i&w1vl_!NWyB^#?EErG8`W z0LcW4wW_pl@Arr`ZZv06@~;SjUV<-$P;0pLWRM*7z=D-8MY%<&ahmeR81$r3^lQR zo4C)+D-;&1zphX*mT`d6t3#Ds8~yX{KG&UC8r3>=&A-rhI8%~LV=V4++qnh&De%&{ zLfpF|MSe&?(ntB?B_3}+b(Y{^48Qy*NqW;iPMY{N+@BJ4);0&-X@956suJq8>(rzv zPgAPe=5A4jRnQ7O=WbymCJ^4#d0vh(;F}tZ%cJ{IHcH4Pf0ZqYghx=CjR@LS3>)P2 z3MUnf3oo)fY%;WW0?Mh9-a3&FIPH4-lFDOCJL)YQHF;o{g~i+kVoA-)mrg~j9NESD zt;m-aStLi8!31MGe9E~eaLY+yeEf1P0+g1++u&8hrC;@M9LfD7@jxrYDZ;q*nXjKmYgHP_=%Kq^gE#C{QKtWOUO z`5)$r-%%A~?v>zU?Y2Jln!d_{1Om;nXGKy-bRgoC!BYW&#PhkONaF;{1hc2Q!6{vf zVejO!Fu(Knh*Z@7+*j@7QKlKFxub-@-Tr2-%*sfse5r(=v~<$9Vl1=LGxTeOZOF&b$1%hZ z;;&9_v8!u_kfUkg61sCEtVB3-L_W=IffZPLDDLtYemtH28Kg6*`~Ctq$?%_);SJ2Y zoz}Wvix;T$?mob(ka4x|p>diX?11)>H5}{cBi6M?kWCq+;tla@YH1^B0-hiH=+opD zRuDE;=_q1B*49MWJKzqqKUdqd-ZU=dBbG)_F;^?_Yg8dj-gOh5X5~*`56(U3@Y}*g z$D*kthKqI^?}gpw#l42YKzX(E7Lk`>Qe;cb@!XSy8Vu9#0j^c0`$d8gB&hWyz{Id5 z9&=XEIyO`R8&1DY4poGd)2D`!k{Gb6C>TnshS08OIKFKm0+0iK7i;=e?#80Kh@sCG z^XxgX*uKL%pPEfRkHai%AKG1{{uZ^q8rtCN$H?YdBoA%<8%{6C<+3X+`YIyUJ%)*7^I>m_DI1_8q){GP~hQ-BECh=m04Bw9L|L$=8tiN(JOnFw6{ngSr3Hual1y~PFbl~A)9a% zIH_!vBNVO;dsAF`0*5w7rKGU3Hl73wX%GD6XNJG0vS@O;GbC=#v~L-f3u_E&|LIBN zFJ{Gx+&Sp1;O(9FKQAnNvO^?IEyYp3VPDG8$S_*8dOUK3r34!@+!WQPU=h*?d+ZG* zGJ@0-ej{;rM?jCnxqOgz(x`F3VDC~aXpqLH-X>qQN`uBpTPXG5d3uG5Pbyx;Hzs-P z3X}-|<1(NemywMxvb{KkrPza_2gSTTfl#XcEw;QuZ*ff7)DJwKUYJJr>!LLvWEu`=_mdXHP&kp2R6J7BK_y*OS|YdPN-A zTdC-wH!-eI*92 zjRL6dO9SpoygF^!M;^?9SHn8$2?@dGOA_E0Z(f+Z)iBQHD+VE)uz&q)(; zL;)eo%n^MIgKSqkWYQIC#ewX=-m(q}V&>0iq$)SgkCbWi5)gx*ndANzT$`UDuAnb% zdH!(ddZb1rP&xKu8w&#$!0_wpHmY8X6mTpYOiHgvFNXvZp{`^a)F0pC;G<)FNFolv z>_G+S{O4NMKNnLYQ5CgI62hYQjBz^wLu(G!@wq)pB%70zIP`$dXJ|;P0#JB6wsNZ#Uu@bL~u73M@4or7cZn~OKmmVKPCdT z*yHv*xm5gUiW})moH;L&7L705A?^Bw20&zJ0pLv*<;HsPtAf-q#3>BHq{XD<)U+W; zSA-K&9|yN_3R-w$NO9w=;s>|>o4|eeLLOI%;%4j@H?Pw>8lRAjBb{)-w)Wr4Sz}Mt zjz_i}VOM;-#`E1KU1B+nFUOqwxzfSM^%L2FVx)I72^&-vjqEerK^^_we zrHOYTF9C0+TkAAF`)Bdqs1NJx*LOKY)$)2v%Xd41gw%sl<=Utg_+2OVgR}I(!1dvi27>!2s1N5iA@pwpm@$-jFa@kxEOR{a>6e-A$zlyy75{C$XM zz$yLv)&o#KfE&hr&O~6@?)0$jhKQ!VVEFSCm-N zc%44F^~yxX%_QJb=e`};%AU@T2fjG+x=UM(BQ7u~@AIS%)4(@J|3L#JE>1BuRagE9 zLqjfySPnE&ku4jQm<1a`!5wTw=9v#f$Y4|x`J{0f_%rr#Cb5XC<4)pfAjl=Y`zndH znr!L`V_9}rr)}Bht3L4eV!S~ZXkF%P9Kf&mYgBZ zqO}GOpjE9q`T#e%1+ytQA;%S6EI#|?jLWXG^Qrz(oOuB3bkwzHup;C;Y^SDei$)yLL6fIJ8+$4YpKu z&UAOn#-BF%2Gu3S(+L{M1BaEf2R5%Lk+|=lD-|lxN$t^nyT~-d4;~tG=66wRRUKj~ zF4zzxCnxVQc{&K9QImLh6-O=PcFqv4xk@-VF@z1nKJvnfQCQsMMP)@P-1KAaH-e%N zKU){Xw5A4N;(`B};jZwBUQTP}@-^S1;Wd7G+P@Ck5oif`7|kmcjGm0t4MBB&|GOrf z+KFr#AN|^IOrVBE<>W$SN3_(3a;DMSpzFF_MZsuR1*aSYm!m+Ws@;t%k1yVR_m)v` zo^?n*vN!!oaD}Ji&G;7wL?8CHbe#=8aT%b%DkWQ%GDH zEaW3Fl8PG<8TqIGncC`fxt2inHX9(@-C@3gV3S(`)I&pvfsypZG@BK|4FMC&69*S} z)d#zQVK60D9LT>8S~mS>MIEo2k2cb|jBj?j&$GI_j{aJAt1`slorj@1Q(n~AcvW}J z$Cq_dz;@(XDgSn4ng_g2od&AOy!!6!FTBiLdgYb8oS->=t|@J|7`+fANAo&trkIDn zB%+Km^}_3!=F$r`9cll?h(ujW9m+d{?JFfPy(Kyvo&0(=AMP3Fi`JR<&&arpqy?}w+^7%dJE^ub zam+}2-Dzk>sc_MyNv$hv$-|-?xzxskE^ZWG8NPg{{}zB|=3q&_*z6d3@TJAFVbzb8 zS-?3Y8XT5Xmcq6g1AeI(JW1@@$1P172D3nsLUpB<8X_syWUb`-&qnGg0!JTK;OBf# zH!V*awMRF{ExB;PxUShZZ0e>oPGN^eM{^=Nae-G!v+lHC z&CiQJe(uy3U^Lj5=D3KQhOR?UYiD}NXYuv`0M=l^4-&yZGs*`Iu4YC_5|D*5%D*VG zhYD8O^;jK>*Vy=U+AVgOchz~3k{}8>#Z^GzTgkx)amADukFe-BnX5MrN@p9ex=yu84W>=$lTMk;K;$jQ8>S6IyEOK zHz>C%oT-T@dh=oH=80@dX+;jQ;PaH5H&`SRh@0J1*fAmesW#{Dwas7mw@1dkE}m4) z1WRa=CMOx6(p~n)^dWCr-OMmWydC7>?^LC2SUFzSu1@dqkyBDjm(EBvE~zTiICbk* zhT`#&)mz+o2|9TN2AEi-AIZe;u!sV7=4;yv zOppb3MP!a?WRB(Pu7miqt-lPE0E8HR&n5LbFCuJVPYF))4w;SMpn?bo%FF4wjLenJ zD|o~-bM8({^#eZW$Z@=d51AL8$Z~3kj(5qcH(j`)V;GWxji=O{)m_m!Me*h}p47BD z$yO~miP)fmI*S{rrciKeN7(mJtlo?)xzr5tAQYLtzTgBKZ;?|`E^G0kVrj&?-pNT` ze&^i&{yB1pP*CMkNDAr<^!c-mB8V?P&n0mr%DcfgMH-Q$JmhGFf&-F85$z*7Kr~Fs z*V-d+k8guDborWYQu)*OU)_zAV`9x_YjVixXhL>;KRY8__9nsot{={iM#=e|=R@o| z30JO@{loUSw{@p!BIsWcdl!P?a-gl4Aqd7|j>$Z2sWERuQ z)|K$iuqJJ`rC-hdEF_a6;oQh9W#l3^_o|J~>dt_8?QH*GwF5mp9RRPhJ*5}4{nklU zv%Wqu`qn1zo4GyZVkBMI=%`yBcN&Q zY7T%D&9W3Rh}9w)J3bM?+E01fNm&U{x)kuA+R-BG*0y1~Sd-(@7P_U16?YJv5EfDg z<0LL<`+_TRddUDZ-2+Gxf0r)5Aq)CLrX%HsM+$KnNHL*Owk z%C}EfN6{j06k-F)KxuMEO;Oe-+MPK+AQ{YpUGpnS{IQJ5^G+q#{;8Vhi$AWt5Jpl8 zD;@L*sy>AP5o~I7$su5f&Bx@>hQ%HQM=G`- z07(OkxDE0RMn-z`&zaPNU1I*47{;tUuGGH~)&k6fgOcd@M1)(%wIO~qxf={IMX%gG z&hH2j64G^0z4w$~vNODJ2>f)nrW+QpK^M#r{%3(!d&vy4>tCUf+2im1$YK6G zxG#K=J*xa8KY?k?T1|kzi}yP9T&)QYa{NJL>xtN*-OesDu7!8I-=Sc;o?kUkNj-Z4 zma67_-QVATxuwIF?z*}vhP^?~TOKb(*^$bj(CkE?*-!!?vwx!n7Ys%1Vn+1Jx6LTTy{>U)4P1f59Ey>cN5c% zsf~>dd)S{IP5A8D?U}-Vs{*<^=rMu*0=amAGBC83W8NjKh2s*_$mEyjly2^ zI+jKl$h0p->?N$%`dR0;4xMRz8Y5Po-?~O^h_D>tjdKm(<*FjfJA8Kd2 zKt-K@R2&)X24y;zj=V%H5??@0RlgyIc6IU!J1t*nWX5)~6?<_c<0hz=7iA>jk_janb1=rb+iwph^q1%N3zla^W1mN~# zE4jPdv=}Bx7i+M7Cgkz@a^U-tY5Kp`w3X3k|G^h5s-jwWR6`*$RN1%^*~jSQ1a$d5`*y!QQ1vfz!bqqFRNfk;1* z@V;tdapD#9p&ksdNL^UVJOqm!z25fkR_-XXKs7q8+(*?g-!5BT z9fMgA7A9S7@NrZq4EQ) z`bvU!Dp2#`)v9p)-$py>5fV>NQ7Wc0`v!?YbE%kyBi;78&AG6}k6P*}Byn4`e-Vy%^2Ou$esx4;Zk;mnQ(q*}#s=M!;BngyEmA5|gzVS&%MCCtHBlFo zL{T;a7ej85y^jIPyL8P3wZE?x$%!+U_(y8cEU-^U*yT^dxkO__u}%hVZn)#y*wKR7*J3Q zPoXp~FWu4tYqJh9@jGx)yq4AGm4*sMO-ejS`4RC1aG*_czZ(*SqlQ2-_D}R8i_>to zDJE9D(nyt3=I?vIg!wjPDuElne&)4GF??dM5_|RxJTsk5?7=84alH=t`o}^Z7~aw> zdw0{%9HXL4e~77=rMYivU8v>q`uRl_l_=gm>9UhkI^}ED6wWxY znAJM1jA&!v{&sR0lWBZgKRYR(8W)tBpiCpKq+lV3*6H^=fvs2*q5wwt;WAwn4QcS< zNM`P$b62ncB2r!vC+aFb+amcL7_q5TgWWblNup|7aX6K*rtNC!>sGE^Zk;J}I~8WKaA(0&Vp=hKG}g zm9Y+h3HJ8Ou@FGPikY;Q0M*R1Iut&`&pbd`mZn56H!Pxs{3RnYsQk4g?@1oa1*R}+TQ^I1?@$pombi2#y<#QoaR zkpm6cpHo0p&}X_#S{KatAq)rp4ZT2JUQILUdvf=rR2PJB1w=zZziWadmZUTuWXPAS^&RBC`Fe$^6PFc|RXAR{ThwH{#g9-nx-&){QCxU9*Tn@~QsgJ+)OuEd z!PeDQC)1{TiNo$%c@Ul=_1)_a_#Xj-@tuJ)3D&crV%|#xv+h5Q&X6;qGkj%IM|j?N zHV+5Kn3jt=pB$BHl~`;Q=Mt-cvc?|LQZ@3n2D$7xjMDRM-`(7F{J zIvD69awR%)I+RNn(N}RZb>1CIbof`_r(^kA(4uAW$V;Pk*7fh1RaJGhnWZJVd_3*9 z%}u6}EnZ{4Ju8P55p;YmdJ-B3TEUp`U;3@86w)`RZ>X@C#lw0>-oNv#NWuP|7LTWw z)}I zXz66y4vkETUiipMQZU#}|Lo^cEHOT#_^S;lRwy~P;;mCUQsi5dmwE0VYD9rLfZ|xE zh@K|MW5osuY2?V^#S~S{tUA!jEdNgPoYYihr__T>u{6o2+_yS;l6R;3z?{urhHJFt z`ZDx;;9bMy0XY}b{iz>qWO?2UW|RP@o%5SRlx{?p1I|0U@I`S34f{rdC>5v48d+R) zOb8AL{9@a>o?9Zw9?b<_cU^-PjJhr;jnKtl6kFFAc*mfzo=!$KVfz{-^(CRknW)P^ zoC52j7bEGvkgMf+R_8$fdF6NSJaN}1j?K&XLkh-2alvr4`?>bhn@)+SzrXbR8D#mg zdoME1Z(>cJ9I3@WV1IxA3^}?->eqVZ#m|VdMZ5`1)$#^@|E3my{1b2C<@Mqp?<{xv z*Sqhie)v0T@@w4wg}KJe>1z9N$e_I-@0~A)H>Y{i7Xlq;e2Yt?(`-zK>J|youaJQe zJFJ=LNa%d%j_WHC5cQ8WVS^k;ga`mzZ##_}VT%q{d!_|`E{v2pq__x5DTG6Z`+l$U z8XR#B3`P*k^Ark3XakU~N(ki_DeUK!+0{lNEicZN&v6;*u~H3QsEiqt(z`3ANDs>n zj}U8EX|#>KWM%Zqq~*22V*b%&t3uMj2ud|5IGEXi)U#qRN#aLr!O>n_P%_nx#ice; zmT~MQYYN+8JJ?NTWKXQ?gvoYJiC{PLy^w^Se1~yv;biNOC9^O}mWxN*_?gvsE=@A; z3e}Z@ZnxagHu+!9&J0yUwb#2e>l;QATEgk4ykFU)gO7U84$0b}BQzqB?k_ra{xfXRJKvlWJ?koxl^lTxEM*LkA|R%X&YK z!%7#;-Sx@fC$28oc+lfHa?nXmMb+2ek6uz*`bY0^#H6?O>9*Fw)s=W^YRc#7ZYBQd z!mvBGzMS&-Y0e)Qg(MJ8i})j;S?aEl#QpZLH`oy0@9Bw}JwxgQMAQo*@R=7#`D(Un z=cMZTw4ChjEsC!0!fpggT&`ezVgaV0wT*W`RaKLV>57-fJyJ0WaCRWaQ>uJx;AHMo z7veN4FMz!kNsPI#^U6^Ci&U^~d#K7YM%H=A1RdK$`l8zscXJ>>lcAz`%pArhBbS({ z1y254?65< zp>K|{N1}!E-I&sXt7srkzD9L_X~Cu1!QYeJ&0S6)W;x~`V$a{PK+;bzi^V!W{FR1( z&#I^{c~H(%SeRx@-ouskf>)XG?_~sA48}2Zg{S^V(VXjW6p@n~1fq+#BI@u%=s~?O z$^HqamI(vHH`MajeL(5{)eh8kYEBFJ_tw^iUd#VYza0CJPMX?Ma_5WG)k_<-uVfeS zINVHA{IL6nXl-*{uYOKAGFl`|w<);(Y^l{}jpWy_U+R^!{{#R&0l`}5NdQ;Z6{6P6 z#s-^=^Igy5!`+%7q4>j|+D15z( zs4ml%!r?wjtpMkKEfig?wE;=>82kO_Cn$v-943X25%qmbLohD)zLUpj_j{x$&Joyo z=vl-?sX@BrP7zKLcbsC>7e>n$_!0=TRNjnSz4?Z+a<+=e5-T>wq6qZ&aTl2>yg+h3 zbov4-<|<6SQf;v?CN)u3`QwK4FCZ=7Pf81?>EDe$mlIs(B~HACdyHgiauxL-_CPa? zFrhc>p_&m**Jkl;tWMDG?G%&L1U=qEo@AE{D7H`Ga>jr_QySRL%{T>7z3i@jv) zpU-Cz5z-$nj&Z%eIcRCZ4%5UH@jjAkd)I4F8I`059qUp~!3zkF;_>*E`PN830;!!P zIaqY3fkEs(p3heswnS@{s=|HA{!8QpjE27xmE^OCazxxqn4BlH*Onu%%v5sZ1wQvJ zM-c_1?1r(=@%oat(^7ql6u%%ARK(_%jKsQY%e!my^u5#)f~U;2J3CiQ=q!QkoeR;I z@)xiyPm;N#Js^$!TW=M^4XQu-RigsUW}8|2r56dE7ey0O6ua@MF4J)Qm+nH8j2eC3gb7vci@|ZSiK14$@iawF$TXSlOt*c}R&&QOM25KXf^&3(W}ePU+n($u;#ZA%0$Y z{(ZMWG3ovUNzE{S_e^g%({HjE?ZmQH3>#J3kBIy+^Rn-dY40J45<3eeN{m@+*GpK? zeSfpM+M|T@imn4I6-uErssx#V>K_`)*#`Z5Z~C$+OXc$^Nz7jBcK_T#_W6u;t}n9y zKgYjRfD;v}E)DLNB`i)O!JT0$pIxE2Px7>WWbZRqq_o~iEm6rJUcm;v?yZz#4>9^~ z6AYl`RA<|WsqGaq0aYhQAn_L|{2$mgqnb&H+u6#FS)V&5dF7O6#4XYDTa>B(x?Lne z?^;HJ_E?qDTuW-KY_$s`CY56geCwr*FS?6C@$AClyLgR~??*_^!^ScJxv+nbRttF}3VfOEE!`8=oUA z-!b0(sEC(Oo?!N$Y>sgnxnUN%zrEp z|1|?0u~E$vN~b`O;eclN6ZPTc@s2f~%p=p1sU>QJ##9OWge^K_x zdQHU>OacyLl=wX3%p)$KP!2PR?olf$%yH{Q@A zmGCpE&yi}S_azBDn6vI{KpKLS|483s{J@j8osrSe^T-!uJ7V2aogn%6@^V&(r4E8c ze&=s%FX_gSh!i*tfQu0{yHxYb23 zcJn!3jPYIDOI&0RSQb^qQsw+OJlHy6RCHKwc#ak-gFKAm(i)eNZ=G`SzzAC7#>(-+bJydv_5aO;8@l65FUd0~#1piq z*)H((pFE?v$F@SQbgAv>>jj0{?;e?Wn9EAQb-_E%H96_HPJMcKSPaugRTyj!V~IlJ zI6R^2ZBja}+GjR3MVl9xQLcnrWy;@`O)1EV4bSc_nv75I4BgibcRjA+{m$#HN@8v< z1O9HuK^bu0)(%n6AK2EuBdBuU)U9pox>VLS{96{*pDD`voiD(brC$Rqq_2xfkq8#C zhAO&l%g)$WF5E3KjIkm{>5@x#Qc?}|!`e#&ZQJJ-b>5d}<_;^%Q2FbUi;U-{smXi* zKfDBSWlqCu#C-j)!Y+7$#c>2B<2BlHuOnfYJSy8Fh7cj>*1v#LmQOsaJhwO3yLwy&h8>6 zaAX*>7xGLApIi9o#fzP7`Y>e$PNZ%I8E4JsFXgpiuL=jvY z5FCDY+)f17+#^gq{1JkUZGl1-W-yFlA!o!}XKPFsHF3+PwZ%q9h{GLe`BMfZ>%t(0 z@L>gRi_L5k&ZcJH$h&x3*^pYx6jFTIX5GZeZY$C7{yFGxPRr}>&x9Afrp0A+p;lHl zXIK!OyQ-Gg9N&3oAFm|8LIQ0A93$&5c$uvPIm_18F?6JmduM9{|DuR~E-gT*ug6p@L3xt{i@J|Z0Yt=vCr<)v9Ym#s`ePvnl=ok zac<|EYGi9I51eppuCL?%Bp62zUq1Gw6||O5)np$RJy$-l`d`T=(%se@WF&Sp`P_N< zduT);+x@ruxR|qI5*{#2{r20}!`T6yDp=|RJe{;AZ+pBlcw|IcU%oO$^dh$;QtQAG zNAch#yl`1S*h*Emlj-$fM1z4AXDVFiYOeL_7mwQbuO~f4+K0H;@|3w&vusrKmcEzS z94}4AnFEYJ(Pf+(|Mi+;dG$qa1jDnWjf65)Ys;K}FS%rDUti_+HBSS1%hiwK>f|Y6 z4%7-qT{llYXccqVaNDmLiIwPPH^PI=l76097v>e^Kd*o7Q-svlC>yjiErLNk7v3}> zprZZ(?LqvDv1lVUTMPK%4T0DUPfniSJ~WuH&CD~O_G^Yvy}s`<{W)R~^}yTm?$>jv z%ljV^)VzgRgy^^QV$KZG3Gl|O9~LG*a@|T)N}GhHFXpF^)BV=Ood7QC*>69L{F7{O z=c5w`_iGI`Uu9E=s#L?X8qYmLk?f_6{9Ua6;Gl*NuZF6@#0gpE|L&VLY}dnuGjSL;ei|nW_G|>%ZaO z?Fy4VINaGh>sJ9+css%5ZC_5Q+lDEp{%U;Q{LJRPdT2529)=2~Bzu0t&cYS1sFv5} z&y$h^EcY(Y9Pa?*0|mc4_XTFm`2^njZ!HJ;4vl%@EI&}mH}w(Krwdz9<%T#~e;PBF zbM_oXRvuygs6WGs=u-KN6TlGnn(xF(d~6uVlSgp)8;?atY!JOH{_Oec7i#FwdT#vL zTb-K!vWwMk0dZq7gv<70hWk`*YsiEdl$Bc42Z%6u>5O;tB1GTqHQfW?He4zVH~QZD zvrS=?@Mkwtj03on@%no|L;d|^&tOm0J9{~~!z14>1XV2K#Z}s3zNjzO5GC>MEU(dj zF64HW3BlSD7^FF*9ow_sl8kSmXUB2`vhL>6CSGQd)*EX zcyrc-JpNPXk>@yF-Y&Zgv@#NNx84)8Pg4MW@-iJVc|3y@|CC5d4A;c*MZ`~GG-n#8 z4_!zUZ}K>cqtWX`+zke*oGIegIn~w2g=*BCd@j-%|C16Y?%=<*jB}MuWtfJxH3fK2 zZ|abv)7AC2UY3q|L5n5%*Ky|XrLp(P0{YxS3PW3NdFGP6y;*C!Z^BkFMsgA&9T*et9>CN8pb=7O-(z$K(b@;pB%Z)7!la&#z7R z1FR6R<=!Iq^SPKt+zsmAYp{>p*T?*A!f~ORZRqQSvZM^B50jCkhI!*??`y zHdNU-p$)B@f=X|g2@+=dt}@j| zGp!qKU-LdTE&r?_yEWf|3Fyz#tA$p-3c&Oh`weDq=SAnYxGAxkJj6G6b07~wKy+u>%SG3_KJnr zqCI=VAoLo7SD0E;_I`oc^Vf)Kwnvsj38PL{HS-YhGJ#L!ylS0-Z>=x(R{YVhnEspE z9om+_%!BbH82dqj*03XxH1y?yL6~rRNx6*mq)8#92gwS>(4Wrc9S9c`_pjX@%fodC zN6vUhQln{alA;h*j2tfM6Sg&L>*4MRnn(wVlxVVs1~&pYuib^w{>LW-D=D!TX|%L^ z240c0(ACW{w8zvlHGI9~D)kqsQw6u_`pM+FVG$z*_{9LmX3p{7N;TJqwl>_D&rFS; zjB9tdhS-!#GK&R=?QC3u%wh0ZF#>=ZtnTn74TuCam{6o7Uymuv@LkXSJ?e3nKbH?t zfg3f}&JUBGDHHz}WSrxxOYt3e@#6RN`v_ceiwQRIUQcQW>bCXHsejO^#3@1rcKF6}+hQolw24lX@!}ePo6fti%e^_P+ z4q6>KAUdK@Q9hYozq0Xq0o^aEDtQ}Za@B0=?5rpuV7LE{qI$&(amex7y%97{dwot}fqrW;b@Z*l+g2p|jA44c+}=YjLpoR{EJ|~)z}gFI zs;)uJtY-dyJiTRDRB!*iJ@n8+ND0y{NJ)1ygfvLQ5F*{(Eh*C7h?I19NlSN2Nq57u z{eAD}{~nGx7_PmqPpoyWq@5i|B(G5M0q=T@Qy^#kB_Nu;@hPZ`)id~KX7Dgfe1aV*{f+GW(22_jD&L6Q4a}lS&unB1|;VjJJftd?Os6O9KMEp7fWLq$f+D=?7>Ne%6}|kVc?hD#;?9IaqicaO+V&TN*h~;aUL8y| zA8A+gPRDEsk~WtxkwF7OEkSI5*c^6$nn&&B2n?JaD4BkbN;}^7a@#$1yVGDGO4{e? z)r~Y%$Mn3=anBW#Er@i?`yG=DG5|mB^Uwl};m{j&Le$Qc$;qUAK7nip5q2@gg>MAM zvO2&6EL$SaJ13jB`<&qg-G|*A_`B;BVac(i10y4ElQeZxn%t4lFql##ocCiX3nDoT zdk|l+pc6<8#0cxMiPl@z@R7Q7N1ufgp9XN%;)03N1*=6uo%gw_!E+kV_>`P5*|Ch7xDj+7WkFKSaxGc)rC6Alm2sy}l0O zl<0mCFE@EaSR6t6o2xiD$%m!LO);u8YMXj#*7DicRgM zBMz(qW;kf(p)-H!-j*{mKJ=fU*%oK4FLJw)`dG+s;}COU3(Dwlx-JGxXbTGx!QoT^ z^2x0En&rly+}W<`kw9xVRgH~NU%yhSGnvVvem}s_l9mK_gGV*}&5O|il_i_HAd1Rc z94U69-Mv}_E)uh{dI1KnH#zuenIHk4*scqXU0$R%66}N2_NXl)=21H2*Di0z-sS7C z<{Ol5l#Y8N+>p-41_Z!y3D`Uy_+2pHE_7U~5q;OB_-3g-)`XQRfe~{c4u+d^fk?5d zzg7961sPz^>y#;=@qLMXhKO93kV}{7(Mk|Y&(KoLjH5O#axcC;E%=ZbQr zLrgn|AS*URH12cY@wk`$WGr|wD$=*PiTlQDoZ9_Zcbq!P8&RKJx51{1-0yn$R1Zbu zo;tfTx8-JI`A&Ym#*4oFB}_P=^P+4Dx4h~)6YFij2f6AmMoHpUql1G;(!B6^gEKxryiZ@L{%_+=T zyV#NNZHI~OiOX0;^}76C^F#lf^(6`u=`?UFe7! zhx-*=HTySDlUWQ^v==vny)h$5pg;nT7G4ftK3JvfND+@WCWz3$m-t=lEtT+9z8`YO zW$ZJm@cjmM0AmQ}uEptT&`mzK^1wnWy8Cls@@ew0NOVlpIs}EfJMoSW<2?zunNmqH zyXV&_WGq7{tmR}e@@zuoarWiP&|&X49BHG~yOiC{4;@z=1cd3gdpAB1aaqBOXp6H` zgfNG3p|G>kmkpjOn+MIPn5fMKktc3~B*L>?>~?azE!cY0M(@7m;d~SExbKC4wyxD? z_Z|9o^&wur4cyh2fSYx<=V8Brht&t$va<5-4J=^n7N&@|1-ScRuzVsiGO;$5{)YCe zVqm>SE&=HWevRt+wkCVP=Vk?+lJ@Tv(;J_g9tx9Bm7`rpt-#8+ax)MyK#NB#aeyO? zmgX_EoL*(8MN#-c1yKUaF|0g2Z?t&k55)jhwYnCc)+#93QL;YSm$C1BkmW>BB0nKf zaW%e^DvS?in#f7d9;{1?0FoF<80=xAC}A{fRwTY+{a~kBoxGSwHy82I2ABxdOWM0u z=&>jwIY~es)XeS*(luC}6BFO&_wB>ugAxp|2$-_1(mv?aKe{L_0h)js-u9vI`9)Do z=u^_J$Ood9YaE&&ZsX$!mE^$f3W;&Yme&;275tbr{9kSECZ^avzAm_`lKD8qWFP-d zjo0Fzk_&uT2{i=>S zB`vLY`4QNuPsDEC?RG@>+^j~v+-Cct_}%zD8AAHugMu_j1%G0X3qHID7!6NvlV&wf zuPi!(m@gu42Rlv~rbmnJiy}suoC0PupI(OS} zN7!Sn$C+cY_u%_@&Re6Xq%n5sCha_lXo}P4>)I&y=9&OHttsFsC4Eo^F_TPEEj~B( zKO_x!lj^RYEkCG3@{yXwJ0@<4vckH0p>(HElIUQR2DiVsBvq9$wMI^ZfQ092YJ6I? zlnEpnI{L%9SOuNafxCsFBq(3??z*0d!dN_LpCdlgE>EL~-J$$KwckXMnbxN}PWD?w z1e_I9y4@S<@}hpRh$DMf5A|6Ca}0k;yaox|d3`v#pvPBgvwq)-O9%_M<)0n@tPS~l z@)-4SB}o4r!>;$t9Gc_`HQc>#Of1aQ_)L%wnA0MycT~iL32W3^QInuf37T?4lK~moEt+>u9cyK$rvyR?cSA?eVb8>2GT6u2OZC zis@5w-=hY$X(Gu5W@A@h9DwmasgTVZxzR=GEKdd|hLunCDVK-V*`gTU56zvaE3tc1y8T^X29-g$8Kx1aua{ZVC8QrJow{+-$8Nvt}rt*SFuDqmAQ3AO>yA@Z$;;oMufj? zQn&0~wYCb;;pFbLY^gy4WR9!9BCt@IF1HWE_U{oi7V>CG?@wf;61?J# zoC7%n=;^l~1%KU46zm-Km#+@n`1c+A>v7sQA`fJl0*E;$4ttB>W(`XVDv4k5&-Giz zFbUX_IUGGux8pSHK!>Z9W*pq9(eUV|3qB6eIX z*WB*Rb;QJazhJMgJ{$-2=+)|a@)f%*#)7{(6% z)486E{kKm*8?>#%t_+94{n!2Mj+)p0)|P?tZ0%+5;&wm#-XTNKhX7m99eed+zULOZ z;~vSMz=i28p0hUk=YhlYi&J0ce%0-uA^K~v>1Z2lV^OQ#&m^>9A0s>-@-`=iF;auZo>`wfowv6Ern%k|9*Wxd@}VAyd7VR6y; zy2#71-vG9^A7QM}J@|RF;|1gTWF>@N_!h30{dA_%7eVBO(+@6Ee%Sq{2RjGve!jyC z8&H}aw_B0B9xn$-7e=|Y0Y}?rB~W#+C#ggZkj`&aK0khdnbk!E1n_^JVS1i;d47?m zF_~u8Aj|D?5(9B7Mv0Z+1RvT_eD)FfOdYnNPRB`A0(66~xSyVnGHXZm#jF&}tjzZd ze>L_ZOF9S5dB*a8#uv2m%R)3x?4lvH`h?p<{x@i)-YDUfmIrNLVF@Bp|*g=m&)b(da>F#J~W*muWY8e84^Wc zWgQT`Sh*Aw?>-*k5(ZzkXIvtY$mmkBrakweOOSpNq5MPocAD%6H|JQz_bP$05WHZO zJkH_$!~0!6U0=|g*I!`-Nc9(^8t>B9{an*fIkcwbk^X83vR~%$`70^+<)C38QFU|G>qM%}VEn6MCuGbw!0>!33lxXc(4d9Y zash~a09$E>MI;r?c6edu@+6h-VW+P%zm4GKZ%Xeygp(egtS98>sgp<6)t5al2jd-F z-{W1ZE%N8{-SvkTtl0JgvBwQ^-#1VO!LtqQJXNNR^#J`-y^x2Krq?Hahi$jOWvJ#( zi=7Yav2O|^e|#qI92z32Kba5R*g$^cGu|^_?|~MCfZ)CvbRt74hk-S#a!x8L6i_Mn zgn78qf{qYP;=5t@f(Ze~9BdAVT=f8qmODhjImI5wsz0=>iHPi>gH<>XeBijiOuR{> z#L~?fa&$@n=PJ#N)~D&u6q9rFPNlMPnW~FPw(jJuxk942=rvkjCrv{S74J^?UaJ?V z%^qNItEK;rLb_(fkLzd9L`_wlWw*pRJZamLOZJ{`?fz~`d?IIQV5h{#0ZXppDO8kE z(5BzwGDqZ*aJ30ci~X61iK|M5Rd8MYbCFs~M-*zY=(JN_&z#VtkU*BA^NQh9AIFD- zqo_%1B8-)>V|z263Mv{ng|altHm)YxglOVm%dTL|or(~Rj7xWA0*_mW^>cN3O}-npjI{`A`0&sNC`06PnzW8sS{tZP_u}S6Rx}? zqR!y;z(0Dew=fxs53jaV53@EQbs!4hJo^0|e?4({ueN#5S->cR8Vo<8-xSDzMp@_| zk89h6Q3Q_J%Gk-^aY8x~`%g?awI^*r`=#fB)qvM9{=C1a;<)8Rc>3V#kJgJtf;#Tk zQ=CDN%CZ!LZulma_(Vt?92K#sEIC5r==?G-MzU5p%;gdxm&Ua0f&&VQ`-&|sdjD4* zf04+u#DKQ^vOt26FA5?b^8K~(@9n{1MRB+|j{e&{@bloiC%gGNCjrg5H22F188$xd z(3cDH7YXNP8wCZ0O#mp;GhKxGxLEo4qRi;Qkj#Ah8)Xf9jE{6oG~=}WrX8ghfAs~Z zH1U4=tqC)fXkdUNWR5#N478h}6%h3wzm|)TD9@-xFp~%S9d3Q_$DznkK5xC$7$*+6 zsP+xpHfyjB&@3{1^(BF>5v01*cWD-LiBu}5kX2!JosasEdnNgS-gIG@ZzZX%lk-(# znX+MM%3^$`%X5P0&oXaiSuHBgKVclj#nJBNP}xYS;&{QDe2n5>;aZc@!B@S)gKuSo z4~KKgl=ZIJKU(datIdk!#~nCb#}5h;bD0g}cta!OmW*~0C+9SOl&P19FVwWw@yTB7 z9tz&+)p+g>Ssbgj+%c3^Dy2_PQSEswT7Mfa=qOleDCW^IQ&UzpP3EL*-xnPk;^CRE zE=|0G6Nr5t7oH+#p~~2OZo>MuIFm*;lrSi)p{kkK_b_TWFyc-3dg)T{TQEb1@1=`# z3(tvj5y*O}9q+0iw0J~7G#As*OT79t|1fdn>TnW-9mE;9c4TxtiIJdg2^Jc^qDa(> zqh4T`EuMcLEv;dH2eau z=!f++94@t0Aw1}7eXLpUdK^kWDcg_ELR=ybqcX(gAM5JyubrzHBzX0@UOBcQZs6E%p!(f(OGIU+1$ zYAf1K?^vhw?St?Wn?|UaE6d2VuWzbFVAGE;)$Q3cxy4_(Y0B^LKXx3Fon8i(eYrXu z6e{*yte6DE8lrYv~~1meTgNN zRZZO85k<~Lp4>U|WljaiM#jg*zwk!rvTh^_+8<}xlj=34O%ea+?Odku-3DN@aFs&N z4m;L-%>h@#fRwJyix4?XT7_A0J)+G|zBK5MKOPD-p(F-I3|+}c@R6#|oAxzo29UTo z9lF{jbCM#X;%)Zf`;?Nmi>|-FbMMf`98U2UI^YkD<*3qAJ%pfC8#L|npME6HDTq-l z1>v!+`MTg?bQJamQ&QHKXz>q!<{oo>_+z+0JoxLax|eFTpwGc5^Y)eH zJVUj*WNFFwhLPrYkHB;h84>Zdfe$PL=&CW(H9kJ0QM9Jm`|o4ahB$_Na5iURr{##fqJT0ePtA{l0BlG#zP+&cLbTPj-I-~T^dgq*e4CaUY>!CL#t z<3bG}4r1E7ZM=awdLtst1dLR;_7L`t3Mri6U!r}2XWd#iM-x^VJ?D=72`*iw%5{84 z4}S^lz`bO87MX()VT)7CaR8xE43RC&@&_Xv18V=rA7C`8II7Ssdk8zQM%}K%`a8q% zqY$^~-I&SLJov{9E-TC1TusIvCoogP}c*64gIFJGYPAQxgIFR4+47Fdrvw+Jp28Eh*02+v`n z9X2y0Vn7t&6xbNjTjy(?^&Kh#GDcA4soL5ze#QA{bMA#&SJ)|b#<7`U4ppy|M96Va z$rdl-eZ#LIwXdsdXcT&&~EN2Jj`?f?fupskW9ooPmjXJ!}V z4joifgNXa{VUS{|G73HwzT5nBmJi%o?&}+2aI_P8`V#980H7cSi74n};`yJ=%}sd! z(su9vwr1(wA(cwWU4JAvcZ=k!=@Ulk-uQ=MlLJMf=&I8lOQ1FbqH$EU72jH%I6b&( z(K`RIi6L2^jg2=eNNGT(=}-&}NdycEQ+9wFMNw>m(J;hFyEd?h;8gGt3Y3`=?aho) zvkn3TFtFGYBL~qWM^~v<0ewBprkMGr*1T#n0Dd%AGl)ibB*&ri?=5_x0Co z01!`$E0ALybe4|DNT)~&wy0PP@%V1pwxYz><{f{|5lgeb&&YRquI|s`%o+?$v*>0{ zuLN%Y(%<=R8lWEY>Bce0HzSuPdWW6(;}|lF&{d&}%=VA?$WMSon1c}ey_MRirHxx- z0c*Vz*Xf99Dc;&^2Bc}qT0P~xBgF4^uCU`s14{1WW@ni8Rq+S`_v$|e; z9x=WiyA{@dwHqd!63@rYkqR6_5-s6N^`{O1M(fd8ESX5C>%)#*1q4^X^|?>-6Vxr1)>)P zQxLG%+oX0rI^u~DZ8$pN=<+D$5X&$;uqJ7ygFtgv_71LZWk|rx8Md5J$of=)*6pJ}t7m8Ly#-IkR zvAhwi`a4H@-6;e2(ZkVe)Xj_hFyAPn|Gd7RX-?$OH#zC8TpUx@>}YvU%tFUE8#(e{ zng})bq#qaJd_lvuF=(9p7ij*}0L2ahZO<5lsYFR%y zdP9b?0(6TOm>C`J|HwJ>^NCw4+a?X3Jv8TF zYiJvI2vT?lW48QpMwtqCfVXiaUx@bqv67bA5>zkk{Ej+=?eC`#wkb|8?6{010-1w5 zixkt@_?qOFU?o@B7hJKvciTMItpwHYJm8mF6t~whdEntq%Y^m|%c;HwhQktsQ1JJo z%VT15DI+Mr$|af*^Z@C$K;9$}KC~iC8>~J=OY!A5L-NFT&8pd>PuM2oQbbaKEIr7n zGa%?|7aRk;-awaqK5{Pp=R^*QSER>A_ST@pFU3dpd_BtL$TU-484eI|)Ini1BPG)} z7&QbMNH3;HYbvhCVAE*D7{Q&o*YLs5+&L(!yizJ_mP|1ex_5;8kw>kGGwm1Apm7_O z<_W2NT9_0lo~6n56V8yjMZU02Zk*xFuyy@09MwaCEJ^?|+#vZV(RTQhXAP)E2vyQ* zX7mllpV!n?HawpV;tOqD<8fq5%cB)t3@teD!e*&f_i5{7Egd;pG6#h_>DF9*>Bu?b z_C}|uOt_sspuGFJ(p#3Rl(kD=tlDH}YC}!2n=-ScKgg6_Lj4ZzuOUUX0CbaSd?7T01c^b9hq~P8m#~N;-#xBT|@e({e{{;?wmANs@5I$J>^@9hP2Jt(Cqx&iHv_(J2y}tB5z!^||1q-sce*aZX zr7RltO>H_}(B7D=o%F>`8iMXWW0r6-v)hHGw__T9fzeN#dJ`+cOMnYTk zkPy%N(+mPr2VvSUr?fH*uz}4y((!PD<0%SlJR3CVK&s&(y+sqbG~xVgg443%1#)CF zxi?Z3AfyOw(~hfRO*bS-Ruh#S?|f!kDps?*)W#nl)3+;f6!i|#L9iXMCiK=U1`B6n z>MzM*E>(`pMo$xMJD`s-jG0G~zBH@07G8cLQrs4?nXYA5`;+aq$s@MA?R_Vsy1NN0 z^3(Jlo3bfRfkQRq)yyd^{MU(tc$S>tLlGBS=6Mf}bpE344`w!dJZ0~LLWH%V6V7zG z=mP?WzR4V@OCKpDJ|vV;6Dxn(T#)BJYQABV{E)ny;%q?O=OSv1;Io13`1=Ka*cT5J zh7*&`8!$7Y>%{LQPiwu>ju&(A*Hup2w{#&e0T%`Pjrdz6idQNa+kz2hNF5Lz(YesL<&!hC5J}WS>&O} zp2x*qu37uGkL$)vXk=JqcRmyL<`=#}A`TyQ@1NK@QlofS0em-u^x(D;n;Jkt43IYQ z6)PD0R41*hYCOVxP-xYrfC(*0;8?4^kj34N=1|JP*HSuEZqre7yU zt&^CPx+$-9eYbTyy6p?!cD114w34bG`?heXGsnOubVZu{OwYX19B7R{lhd&3)3Hi1 z9r|NG9aEJNoa-$48gw1<2dk&#+rWhNdpmwVO2i^=o37hGG@HEeaEt12!IeJS!`dJ9 z`~NMd*|@lZWqVVy+X8JH5K`Xm6IS#1!wxV zlm%nQz&1_tBY`{QZhjqm6V2(HMMrGmxcss7zI0wV=Dr zey3{tgOB?2L0h8@hi$oKqCv55^h9>x;#C_zcLHj;jZkS`$raSt9Q}uAL`d;WRMY;c zo=5pXcHhWPPlW9yM5c&eaH4c)1hwZ`kQHHSzAew%iXEXjc}lg3*@mwB(UQDWjFjqg zbIP{3iQ;L%<18S~jY|2v&!&xk~Ca zl>aPrm@s?mKc^#?sh$l}&Br(25^#GYB#1~z`nMOD8=dbsT#x4igj!t1(7G@0F6){lr_a44GQ)v9rTPu- zI-O{MFu&GBTuM(>|C-NC9Pm_KWWF$~jpFF(d&GI2@lNK_xb(+soYiOI?FSiYc#ZMr zDCDI9qF2*2dk$SxR{k&?!RpNUPfvUx__HhHo@%9~Z-)1Bv!PtY8Rx05-_FO#&iU|I zXmof~FWelk1h6AB@(|n*P2mV6yk)R8q=C642?>KhK-ovpeR;_T99v!fzOhU%pwJFy zi0LG2TSt(+xtjfqS8k4nCQ2%m(&mUN{>2#wJmAntR?HYtF}#oQ9}dnI-mLPnb787@ zxT@}Nv=G?}wgc%FaK!@tbD#H+dkY=Ym8f*Tt8MfHEk&p zO{%BX4X024h>b2Qae+3d_HkCu+Hs{+Y0c{tb6l}CCUmRLwwsP6YECK1zlMlCKrg3@ zlNGM{ixxVrY-MvHq5R0z>Sz@Qofpf`uU5keR?+r*-y=t^QA1QrzQpr-UqjR{MsUP) zR*rKFDz~p|xUk;mE?85>ApJ<>AZ^GIX;U6@Jgsf!w!i@RYevQna6Fqq6WB|xhmwUl zedp(Bf^$ghNB9rFyjH{de{27Bo;|LuV)G(qQgMLmbm8UQMd$cJP&x4bzH`z7|C?-K z-&!iqB-hqiu2~77XZCE1S-3-jz)|<~tY_r^@o?XiAeSsYfSGv^CqiEV45;~b*z3?x zWR-GFhq?APK&QYA&}dfUB`rEVtA7kv!Bt7c^prht4ak)!mp1ZsQy@Bjs)$dYU!h|$ zo>1ky`hd3RK&=t!70$G8x#to^GZ6i4fB*9Ps@)yAmXqmUsa5ml?8(I!HLu0=2&crP z>IT7PvQaJp$L#B2PP=m>8`-B*YpHnE50~vjw7=crVB~SsF9(y?Mf=&iE+v^fV%(_+ z!NwSne=2c)9wC-TS2 mE(Uq^2pp=N(RO%w>4HS63jhf{7~K)97M{%&H=)XQw-tj zGwfXTbBGjW0b<%{5uKgtdiuEU>xbjTNH1*iTLY~lMU<`Dv@r?orwoUffBb8C`AD7> z`oaX@F6;)x>b08{_>Eh8Ey*~-XF(!?ClAVm27^Hmc0fSzkKTlX4rc7)3p+^ct!kIIfCi1OI7TE+R%wdXx*xpg&!R8I-DB6bcv5XrE{B(PCfAeCe=rjE7tYl`%j~ zl=aPb{ef1tWtf|M=zP4dgLbrSgJ02(VP6@gkYQ|$x8i2gM1Az&?$J(!+ZVT@u`mkz z`m>Q<0n{jVg%8<1yTUh8hx1iruq_y`;~!pRA+aP+TQ#zO(E+pqsA(bXN( zf<{Crrn7Sk$FO|?eUjlYAsrWbz*J|}AZ^`!!@vm8Ggu8X#PE?Ja;8XQe0l?LMCoqf zv-X)=zc!(S0Q57IO;Ff*eB|;{v|+~N8sX$Kwn!m9fLQ&v6|~OEn5+lV0n$s}1wJcz zs*|HDX3=sKYA-F~FeO&kM;>jb9#}uBo51RQnTUVkh5IUfk}cv@TavM25?--bf)!a5 zx$J#=JW%eCGQ zORSw*jAiueI2{q3Yt2`~Q2yD;k>Pk@_IiZA#nHtbr+of=DJjdrXM?D{4pDc^gp|Pw zBd=(f%&>bIXc*rG?lmJ^{f8pr3HGdWUAx@Jn_)n6A-y>;A`}M$dnrQTUoL8bMM3EZ zcY-;2Tb9s-XZ9n9FULYPwd_O)&E&_<;t$xn?yx00Au6wZ)ApmJ(-0R)Fa->;J?n67>pz0e%9@*F)+|3 z9GI8Tz2deOJviv#Zo8?1o`c=fwm4pD*A{fbQivbO7P{*gr=pkW3ZbHM&-&($Y8aw< zotovx+{Fvpw;U}EEB=!~9kW#$j|$|2g;JQD3c~!-FsxPsdbPl*!N8E`)QtkLQ|y&l$pLsDVF6elO=#QP6v|I-HAK8|+W?W^MV0a|l{R^ImG zT@29rdKW?p5qa1FKU-;38}ZjPO6@TTRYt@B(YC|x7*Hosr#^Dn4YtpfE8H$=rV`;m zOjc*_A6{Vlo1p8ROKAA8ICr`pgq=I_{bt4PP|?t1+a)Rr!(<>P(_SBo60v!ORd5_( z_fbh>R}q!bWslA#{+#<*fd^EG-#;)g^^1j?I`!O6xO4`3-!}34K_)aTCqcaAPhpK> z#lcR@g8`Ktt#h4~O?uFk_q99Ebxh=lFD(5XUb^mgQ?c_);xgP<$(_Wy$+11efL1R$ zF>&Vg4_E~O)Y#q~@mqRv?H!S&1-CRtmR5K6OKP@6@k)PEd3tU_@8%?Y^AWcRB}58G z^fz-Rd;Q+Sa|Gbh|Br9iKrTT3MzFDwjc3t7-*}Prdhs1bAwEE`aXng&@NB~ZTrZM8 zFw*9e_P^*4x_&JftVd{j7rgY;O-1GW1c}-YYv1KB`TQE4GqWt(u+EMsz~Q-mhbD@> zc8N^zX7mJjcXGO~2LM7rZGHU^t@GcOZUEzf-RGJ#j{%u68 z{#RsHyw0Eb>SgdSb;AAl8Vr6jzStovyBE;WKe@m!*LmRyCin2h z;p}gRMwm?vN_r;N|AUxLP3_w69DW3(v;QWswVREmoxx(_~=G#{F5~UEadq^`Y&L%WiAN z-cJYPCN4IZFXJ6I4Qzsfk13BH;Y*a8Z(uE^|nSwn(!cUtyrKo5{iWq8p6MKDZ--gJSbAcDsrTUZ3mbD9_ zp+t^N2B;=Kp0cVT^_)u=-v#h$$lBGPgIXZ}*HpO#rCgkjggDi)q3wIhTtOKRmm08v zDYE~r=cy05L=b{K8457O!2#eSb|&LlD=Dc>;e~x>V8*k*r84Xsf>D|+(QRI?o11;Z zMj0?;V;l>m53r?rmfK!>k*LAJvn5RtN*Y(&*9dTn&q>Y&!4wet%vN}D#NqneqiD7$ zHZL={Ok2X;B8&A#ELT8vKAgM@355exa&J6u;k4m3^TN?7`_D|9M6^_l7^`Iv%~L_Vz~jYW_nFcP22Aj|NHu>qk0gu%vm+1 z@V7_ME2P|SfJXsnVmCGmnE`RBWWE8)E~!??dzA<#B#B-ZUSmAWbP{L%SC=IvI{YqLkiMN0RG@{MR zZR7033j+|+Wx5h(?HV1_v$#K=4g9vQFg7v*Q&R`sZoh231VIZE77wIVq8ytL88v<+ zIgEAj^~8`ZiAHVYhP?rOt$)yf>d(yH9HG$`(&;o9|DG;GAjBFhm>z^ z9z41&gG422KbG59cS zncAB9RL8}4$}nK28FOSRB$c-orO)8R<7YXbQlwhcg$nO07qGpb<| zPw9;KX3nLP&oClyFADNs?os2@?WKjU+xTPmvZRwu>eA}f+?Ut`UM$y>Rm@5~cpPO% zeP!`apDtH$m(GjX;>}+B>Kn@xq^Tq>G7;o{$+pTpKO_T=z zFKwVg1Pd+ncxjCf$`}G90LYO0@J4Py6L7yqL{wcq{Q4EghX%@3XR=ALTXeO9p>U=% z>%J8) zJt)1X9dB`OWlFNIVJJg5Py;>@6v?r2TLka#*EHaN6oW>1!a(1?rBj%o=F&iyfg$XY z+i~}GX3KigFi>G2;{Xsnv)UyVK$?w2Q~Khu9#d0WUG4Y?y4*n| z1OWI-wM?*mR1Tm2^ZJMNlSTtih5qcF%aYtT6cRo@LfTr{Asr)te~hE;PjkS%Yy+AH*TyP2dYw+ z+q>t7@702jM%K$e`0z`D6fM&IN4wYb1I;kHB4kngD*7 z+3M4@)v2JCh+X0;D;3Y$L zo+xj>VhtGA)yI3pUyOR~ea%TOE}S5n1X)XxL}UO=haJ#j1Gy+MJr0L^DvvvUw>R#4 zK)!64@HHyeXG}>k|6xu-XW1II;K2Gd7gCEvIC?v-YWV+DA9^VL1K3J$S>7pByk)IE zxT=1yB;De6(!aO2mrezKz?6W?RsPO4lpvb8z_~~n<%!iI9KcEG!zib)C`*EUCj8m5 zxs1&dT&(h5BYWT3iz#y!Pbo9Fdi|Tva0T}70|Qg;rY5tPhYcpB58T0V_N2&T^Gn_7 z<3QFZ8pcPW=2hW*n&VFeF|YOcQ$1zK2kT~CFBWd1W8UwhEt3+#Qd+A0FOqkE1IsX< zB^pi5G{6@omZJqebZuE*7ArUC+EYfb8f8T$(a_7%6)ncgo5BQkB%lQGe1iZ88ekaB zRb@1Gc88?XOLsLH+=~4wK)7DcjdB7s?Z{3SK>4*i{ayo_`^RIx*6cNDSl10KLEa3q zrEQQh@b@oAOzSnt>c#2}U?YRMxV!>rWZ`)fM>1G|m9S;ers0F{!_pdS!oS?3WnT@pf ztpIiYZqVD}ddvrqWuefKF;ZUJ(uafF z$xW;q18jLD8(!zE?29w4*o7h=Xwx8#@rIJPFaT%q6)!NQn}wh&S~G8Rr1azjgLZ>i z()(3dTZqU=MzS239Qdh`gfz^uEYPBG0B&DZBb(opi;8L${Nkp($QDx_ z3DiJpEjuEy7jVXa5y+t>rZ`{##vbUuty~ zhs1}YzS~<~;7SA@t{&>1?@7bp9&m=0RGw-{pi?Nrmv4l{P=ge9C@r=)n0GAGR~=`E zFfBX}49iDgNWQ!a4&V5B1-JB`P)+WZdJ-`O!*8@`sxn4El;7#@JLV`;RNk$506Uy< zM4~t(ID88XG@VOns1KVfOIvo#*X(_5e z@=*8vOU72`doJWs4S%9H%PoXkJrXJH9FZG3m;&53;)UwKCM>6R(F(gFPqx$*DhE)W zuy*6*FcwBsIMrSXr)%i`<+I=vr~@4{ub(e6Cug$5?J1mk>8o&FWH(Yk{{^#jcqQOw zGdElW&yXxst4rp+FF&3$^Vev6HS<&uoA8}M@8tseZ5R0?qEZHL1al2KAm9vBsZ7QR z!xfLH9RYqovSmfAP_>6TR?xqsWKdvr$BsvqvC3r_5rh=x0HFqi;r_DkTF@C36l1zm zCYV5YFo}}N&K)ed_%EI8U&Y#HU z9Jv2fwHaK7x`XN$ucg1w+_P9D$-0uFh=Y3_%H$F!r{e3YZIdS$Ch5jla;Ob^BM=6U z=wm$Pc3}fb-8U^MDJh^`(twkEbymv|83sVKW8kq3?v~9_cT_H!h9C1iwH)S+0cd=3dhOoC%*-~{3xW~Q!Y|srM!jrJmZT1(620*HYbew)i8HSNZ2lRJ7Ah?*GiT(S3=Z3-e<>m#lq6FkJV2-=6b+E;jD5`1e>GZF6f&wWz z>yLD+ET<%mo9%;st3BG@lZo<2*4i#?{vrD66>}-57N4D$9U=Fb%1pbW3UgOmSGQ-I zIT?c3rD!No2n?3ltyiiL#Q(mUA%ew;i_3J8FD6>4eEvd|$;z&3cxa*K%7*qs6{J2z;9x@zY zdfd9L!rM22s6rdD22yJ{zt1td-xX53pTJ_*?{*FQWkl|MQZh0cYZ7TfBp!-7`L+?q z*l<6oXFf`-DxiO>&*pRuzZOU4Hcn7Au_+JnY(oZuaLEhdx8Bko6Q?HF>+_7BaH}gU z-HwjtH_b}6O^D_j4BVk}g8Vl&#HOuWf`JUNsoiMUQ+LD`5kTH+uYA>4H$y-~&-M3x zV^(BWSJzTKM`|2yltP(OcOr8Q5I+v&9?L+a7?Ov=^B^mxi`Ovn2a10BejrP^01;s5 z7V1bfm1Wuhk8@CAp&5{Sgj%O_g-NXgWmJdK3jTC^2fS@$K`Wgy`Kn#NJ1P35r6&(C zkbdRk|^o=NZ-ha)U=g` zf-Ol<0)Y7R`e|`97P!7jv&x{x!uU%4b8Py;Hb=kx#v>o#st^M^Ox@wZh~5x)-QFT@ z%K8I4P159dhW#a5^gkae+U9F5(V~c&eF@QPk}p9@V4L<{BEdNus(5;0*#F-E6a`_E z37`FyhaH(m4jy>lLK&|j?H^nZS87mp0m|s{(Goj1KfI{1i3z?{Y5H%XPe!|AN8lb% z#Q|lMi9(FkjO*@LrnZ5Be9_BEnSP{UNl*V%*r>9SjAYVy-YUfd(M@&&1gj5e>L5#9CIQoyt*7FsOkWZ01Kp zp{-;v@ULxsJU@t2i9#Xw0KIFw1afwo1L?DFK?xasC2AJ-HvvA4-j-OUR;5P0>uxRc zT<=57TMB!g^jd+Gws?limeX~KFgxGy%~!z$>a7=oop#OHgxSC3y!I#Bh@f9Z0l@72(tuFFU3bV`NEw=|!wMTu zV)1-c(krb)SHIX@b_x>xN{o^ETrlGdD9L>ult@Kf2@rx@qGF?AzQ#C(@hFT)p`oFa zg}p!%{rl5&Rcm!<#F>isVg85ph23ZTXlb&F;j{Iin;gyZt%)1K!13p^Wc#(J8>6*$ zAm8R6;X2o#638UjI7WD2=X4^brsiK8P3QTyR}(t%Kul)U2VP(O^ul+>0Og|lf>fPJ zW7+3MSeG|bi!d}pgER<;fOJWhbW44g&;5RXfJ2m#*?V7Wow3$=v>AX*nWU(0eDk{GY2Vgp zZujj%mlB>`5v_a?cQL|Fx(M29-H1Nwy5dFGda}56d@XkW#s|3i0-yV@;#vM8)iThM zDq9S}7nEV&A_K!_TuZ2G{kh(oOC(% z7pr>PEQ%|Sjbs|Y&hY|X$e^(zbY};IP_%r&BqAg0+1}-d(Vdm5k#A?*8goL`)tVh|A% z2d*{#(|WpYsr9D22L`Y+M(FWr5w^3KoFM8iiZP}NT<4!h*ueAz3C>%|n>QCtQ0ys2 zAuhtd_%j<04mr%{v7hx$KBTBlxixuVpAV||(cbwj`-VEjL?N1bNeK`?1WT}yIhp-y zblEGBVo)^TNQ1uORhn@_H5q9{ohr9YVkpa(0R2U6Y`h0oQBuC>{hs{eWck2EF7qC}3PovCe;unFf%_yVx zcqR?R=PH}s-26x9;a?(4UWe=P$32dyRKadPX~DbnPQC(r4D(}VLehWkq%vw5ABTh0 zjl7CwsyRwi4Gyqy_P-s~KnwRY_?yqm{Ds{2GX)V%(om6}C7d7E54+P9uY_lh*nU-w zFVnV8S060V_~7S-@84E>lw zO+aWC`U#U4;&Qa$cdb1+_KqCU4wC2#k{XX7D5GAZ!y}OU#qay_pZpnG zZ2zyt9WBTsYc57-l|hVFuXrj1GM@&AcC=%T0T zB~QQ#`9qzwTzHR>$08~r5;(#F0g5v$_?R|bii`?uNWj(2s(o%Q9r6jz2PV&-k zT@>imlwt3fUxOn&XixBJroa8U{3DPK`8(@(Gdsd|=#PHcB>Kf-{Zk_%ai-7E(hozM zN@1U{GQ0n#DK7}{K7z`FMgKEIt;W{YQ1ACBM*^W+aLrBT_qHkTl(X7C3dvfJ7()=! z5ssYRW#R}Oh@qd7^CIUjsZ_3agA);UMd{FlH2jegQ4&^6p-)uRfbD#9|_5^x}EC{6mS46utGqW!-r81h9W z>cD@0I}&fd{=IpMX)D2hyX&-4J7l)&LO_D5v%D^=Ol-_}JTu~lL z`=?JW=aVh64JR~!Du=MXn{mAV8V;!lo&TaodV{_{Mn|AQ6`LKB){YwC`*V{^AXXTO z)E>X2hlew!zV`Y`y=^3b#U*EBmy^9Kp#SGvl$@n9v*PmT` z@YqZ;R9~~Pso_aQ89}(^m2&>#a%AH&>B`mdgP6BJfyr!2uDfwZ{e{COmGZEf%n#?K z%u9_IWf8s93e?i^b(ZOp3Mpm~w(~cn8gDE=Q{0Yo_*4h@abe~?)2%XtU}N%r37Lea zFvjC+XQ_YPsX0hG%_2S}vsjwY@ze4?bXGQ%GM54YjUp6rp2{F-cjeC={NeBY^25u> zNEX0H@0+ic-i_l8{x~2YCC#i9mNc&0z%s#8Q!k?d-^IrrLRe0b)@862msnKUlD?2} znX|ocLqOiF-BKH4h%@aYpexzQ$;n2v?qO6R9;b2I?3Kdad~=q+HdHCb%sqU9Pq#)p z-p^O^KN`Cx8A|9 z?BRR%=Lc#t>Cbyjv2PDS6#0ay*wN%tGm_?=O|2hq{Qp+QGi*)B9a=<7+21sMUM6KH zuHNr}R99%ASXag@&A(BOqDi>XvFRFNTep1Sy@EQ!r>NMI9z|fO_GIo%&ue;~b}n8+ z$Xnm<;dYl}>9fGmb7%6Hi6q**A3iF|hODk~_c8vuf)#&5_$Yx`G zJwhx?nEA(Nni|xwsV(G1?zN}Wj!gIN&tEoP{4j&f@3hRdIe*Yj$j;X1Gk6nQR!?s@ zz$4c2abJ-4QpeP|V~gVM_vqEO1;t5O$1%Tv|1mXUt*WglVEF)BI*+OeLN?UpW?H+5 z+ib5)^-HTrTy6Om-V!GM^riRx(f#yJl(bNHv(u*HXAh7k1eV%*w;8As&JF^4B zwGOX2Y30A$^YPuRR2xJ^$@VVf=8>*IwtWIYn#3Ej&#O<&z{nv zgfj7(jPxdj>XVTXTCliW_=!mHT0RQJ;xTs0D@rB^Ki@kQ!f-)yDg3}E^N8v`nP=hB zc%nX0H%mgriE(jMG$Eo@Oo5$PF$uhU`szTpHjE3s^tpFu>g2>_!LkdR49NgFGMz#3D+F6jOR-21ljVY8Bo zwTxq@{9&Q{;({PEGqX~{>BY5VcoQDOaD6yFcRNRpsMj~RikPvTQNS$TsrvU9IU;^h zTQ@S(6}(UgY+9P7o=U2!-$wXt=>Hxb0qln>iibqSvN7T6mbPRrv`4ar?mn=r?{d+x zb_=F;d|ku8Xs`8R>g$zqL_NP34G}WpqsuWJ3Fj)8bc3x<0TkRq{BOW-<>j^8gxg|I zBHuaUJ<9l^HY=^PSM4!52W6(?)4_Dema zzXeNeCJTn*tBgM#3r{_cyJ@KDuaU!cT}|0@Lsnc%-dqMfSIy>=Oh@HRAIdAhjvr-+ zelx?DuilfB)Ail_=ukx5Q&fZO?wQ?kw~j!7u<}!hv+|t;B&R?~Z}D7lS*tofIX@kO zEK+R3>6;9^EIx#?M@sGdkd?lqxF#dL_@*TB$Pq_Y7th$5_Qj6Z+%V5H5Ob|^|3n5e z>?_KvM+Ttad?b{>e#BSme)i*s@?6ui?l?vIAlrH1R23ejNgV7E{Xstm@~drZY}Cu% z1M`E4i3wm4-!bC9lgB}Q1Tg$O-?YSk6K6V_92538H|e4BAXMVUR56z$7`q&9&-waw zz_B4rl&aN@{Z?pI3&+>xsc2_mFPATmeJO0C^0oDKdQMyV zv?XlF6jrrT2(5gl9kVoJR=eWXvABA$Lw~n)_*@Ue`!9?4T7;$?&l=MeLqN#h_YGVd z-FcWDj2l||ZeUB>K-~wrrQ%0x7oRs(-c_!()Dg&ncL&2=1eTBx4JUP>nJG@K$Dd)P5R! zd1Zj@ynxm6&$aj6(}mgEatR84&lYkAlOpQPqZ=D$I&cC>h;p`IGJ*?&%$<%2mES!V z#K6D+_x5jr;<~!M=DK-X!R#Mf$}XR<%PYzgM@$E{oaGb>-3?k%B_S6VZk{JsR1yw# z7WY&_1v;cg=J%+oM18&Xtna9nZx1-A$Wz^yd}Af6#fea16_vP89?56grR)hbR?OE2 zH&VfFlFu9euXq^^%n%Y#h>+R;+5cWp9K%!umh9*?yM!~2m$Ozn8T-Y+`id405*&G= ze#y+tEELYdkj%FooQ#DpRE0-ZYt58%vJ~KbOZ0`C<%L=qY^7kk0O7F-jeB9P4V*sQr5JVe!Qff9rUFDw?}xJ zTNbkmbDMLMk?T&^G&_n)uji-#4D{d{p!x+Oah(nJ%z!>@Ubr@k-` zPRFTXd}<~whq#x7UgaG3B{Yu>!r}<-WyQLi9I%Wi4qs(p&a%L(Z$frn{e-efX4A5K z_Zt&HHnAv4^z@a2p5ds#6Sqsn6R?fqaW`L{M>UM8#MEDBs(VrXg*e30mYkp%OE@Yz zjEvIFzF9c9Iy-#+*B0xbw0iYl(Dfil0RwJVPBx85?)Z=4EK>yAxEGV8= zRO|sKcleqBs)Ts8R-rm`5e)`hBT_O?9IgSJ4m3ryxubZfkCtziF277#1MVPhbgRkx zl09e3@$Z=xJp;p2W}K8EGd#yA>cS*YUFY`sG%NIsV6dp!+1UVyWrE9J&o}a&(V5^r z{)-xu+1N+R@3){IpU}1_@>0}Cj;Nia;n!T;uj6AT=45XD(S8IQuIJEB?N(Y&PG1c< zS-+9HMQHZEQa+_rFYYTQTiDR9OY`FVh`BS-Ah~fE)sk=*WpitFJNKA%eR+ZP3)}?n z^WFD=A8PWrXLaV8Sa<46*!?q`C>3vRXP4pB6qZDQur-<2P`sdab8}-NP{+JK{(Z3N*?R`l>1C2oI&yVAX8?u<0T`HP5b|4E? z>@)JR4uLX-Vh6e}x5-qe(L_i(HQic_OT2ZhRms6wXh)IwIIvYsusNvbPe_IlKlpJk ze@i7Us_2HoFYqS%5+`Pnram-#_5Q|y=}#$|Apaq@uvgek{hn4qy@@PHTj%!SocP6>_4PJQ!d*?UAF>d3j?w_kiM@VXX>X5_%GCay z?zz%5a0S2eh!q)lq%c3+`F6 zQwEh40b-J90w{?^dg$|)<92*n0=^mLYm`MFT+JR=F49LO{@^taR>Bx##z*J(J1d}g z_Vxh#4d$`=@%$~~jOO9j(hueK2|Ef;k+nhVgdcsfHos)PYB?6NdE(6S0p6FgNZ`mU zZp2)yAN83;%ifwG*3?JWG(I!`PsPN%S};3K-5bFUzmvl%(m&N(-nR#}V(Sy2Rog6O zQRjJ)va4W8W%-H}AA`=^qNMTiH%_vAxFWp*duGY3^@=CCd@nI|5#%;3Uj8-wBqd2+ z%OfnvEl~7%# z)QQyAKP|;Ndr5LYrNOx&iXZ8;>k*X;$3m{6mDF*heTDp}%kA9={Ytd%2i?ZQj>sx< zslHb~o~BGjcA-nuH3jIySC?CZe0PLvj(pDU<>C^C8#;{UvWL!zcDZ6Sd-LC;4YV^N zDv>3-wt~Lv^r$Wv^t>-z=exd3tF#K{r|-I>6}ZD5jAk2$*ifqyX>o@Ch-lxo8>dxF z(mtzaN)`{h-zS02%LY7B>cl~*po>`peq~80q^C{|Gj6QT)pz3bx^sLwJV@e!`>n-w zmGY_IVyT%nSWt+PDze?=^7Bqq>zOiHn((FP@B6kJpVQ1knxgP>k~1$+o$jeAf>F?0 zZ}8c`2MHCxN~|YEFN}yl9|#Hjc=*uSv39>GbZZZEq>n6zdfoBtWkaJ!KBL?40?2%g zBMo`?pNO=O-u9ZhWwVdO6Xw? z7ZD0QX%?^;{SZC*`|}TRlA_50C*t}R6azw=LN}Px+&uk&Z_ln4HvOPNiPyr*=D9s- z0~09Is-;zjsYLM!CMgCBeG=~94NOK!csR23`cubob-DFW)EpI};Hw;!cCA8gzL+(0 z9LKDBFcZdPq-2Uw`X`_>%#k|#XGm{}sRlLn&XdHj+T!2i52xJDm$MH04>`Zh#>Va~ z?eV3pBxi==%H6Y+=ZxmxhQXl`py&BlVDh_ipXP(L^p-q;iOk*<#7sE0Yv^7bH~uQ- z_rekmU=wTBYgznsDTyIBU}Uc&b)C}C05sbApKIqCMEBe{cTTFh;Di?98-kVMiZ*qq z%?T$A^-Y3M5B3}3(7Cg#YnA(>pwhnw6|Px|*Pwmd7)lkpeEN6K=qEkXU>6Qg8y0pUy1OpkR&Qz!M>_l0pYPp^z)Vy2!f?KiGYLhhrCfb#z$QvFxq~f}Sepbz)V}X!lhi&(NRzNPM1f{&tMwFC-d?Hyx;rF(N! zRPy!B!-#+Hx%~rKe2R!9Sxj*GAM&Qd z8{W*3M_a*uE%5uXAP`}hFuGN$&dkcrPGVbPR^8en9${X^(r}GUXLB@*B+j4E{XxmCEO21KMO+pTzPy^5rnb9Ydu6B;~lzY*^^l=-~TPQFqr*<4kQ(^@oHA{pg z)0=)1FQkdl`y|&aC`%Z+xXDh%hFs&4)O}gZ&SOZ_EpK=@dbrkPWzXpV#}hFvtYR3# z_giD`jF!$X8TyHaQ}Hb)oAy$7x$`bMS5`y8-fpYkj#Zr1)6%_)kN`WqeC+$hGpa)| zk*Rgm{=g|M8XB$T`^`*|*-E4$Ole+{eFJ>mf@26YfvIR@YWK;*^uy*uUqQ=gT*|R| zO3Ei_gd9^jtreR{AuX=;{qA8Vy&d^ywS4j?IO$n<%hL(>-Xeodiq0GpkcvO^2-BZq zc@{F0H$!oY?d{Z$6)>aJui8g*AFgw2tE=PbZP_?D`nME7tZaH3=kzT=%AgknS&Oqv zOZ2Hj)m2sB?rtuLiHRS{p`EU-Qt!KE+BGPEi2^ztm0Z!HF-u_b_xAP%cpNl{qd6jL zf6w>+;TF%A(K28-(UAa5lCVYsF*0G$6zJaT-Ot4o2W_xXt$tk$CNj9RmOdk;$1wrUo50BW@i7Wvsd>piBV4GuU?iDZQ1CYMk|xHG#yH`alhaZ}o7k*m;|l zC>j-Qq3-%In_KOTm$9VYmOGTeK`iJ#_P1pIhwC@2_|{Kx7e+}0p{7ehojqa?q1(mJ zb*P+(rP%4?D`6@Z=6T6oBow5kX7(tRo*WmDNrx8FQNwR_~|CO-EzB1y^c|#PM@0|0EiVfM%q}wOGQ_hh_HUfJT4`O z3NM|`T(~-;$0$)zBQL`#741-GGwBW%#Wi)|uf{_;>w0hm(HAmr$U382f+Mb4FA*v3 z=i*6Ir>#j+F;P)*gQhb}OU1J=AlEB_^DA)>z=7GtMKcQv2DZMcni|lrff0e@`$t?WP96^gs$D=m>TE=Lp6}@xa(_A)}gLb;hI_2n6)GDLM1<*U;ErU zt4Q9QP3ZdU?@cQe@jMDI9~7r~{O91n;o<&HVCDS9=U20OF`p(Z9Q9HiDr5EqWYAYU z`#O!CxL;=DuySyWTfI_BfU&*+WxsAJ8ph}S5Gr=N!uh`%(W;%Kte2*5sGGSwzgQjk zO^o|>6>H?+;9L4)de6VGcu+Cq>Jvz!Y~WS47;2BB&m=Oo)x=oRo>r(d>=odw*Y>fA zf8buuj^g1A6pP!(%3>cq^}p^DTYYO2d2W|jzTt%6m7q(ME!)PBa8R?1c7RE-g_rj$ zt~)a{3f4z)`|sX48z#%P`;4N@i+C{f^&vP=OV@(AlH>HHGs<3JAM;`T6ZiUx_N zf3-G#XFoUAUMlz6)1nIiZFvO@%x~d*TQVRQI|4PF=rM46 z`=lqz2Y!sxlB6!=T9-v{h7(L+I7dYh-?cijCvvIo?*xv0{#3Zt&Y6aqnk8ux&Bv(3 zi7F7Yi7YA6xf6NS7j6!&HhyGplDawO7{Gq4=dJMRJ>cHP89ikrh_r+^d7U$Zc|FiF zgCG|`$CY+RPGwA#sFX<4;dgGBZiF zE`Q(jV_zFrUyYlIu?Tx3hX2Lvp3&7_#A>8}H6_i=1ZPRB(?>~^Cdr({k{{Ss(uI=T zDe?GsV~2M_N#j0yLd!*bI&UCao_|p*=O3{}S@8XCwkxdnBSV!{eBz1r--%E3ZT)Qf zI`@9|xrG~|fz4OWYW(h}P9gxjE<4~vOVzzRaNZx6ww^?9KXl&ufg+fVwYF9O76)uS z2IlU3Ime4XZ)Id{a*4-YbZtveaM1P@Yb`aI-s4w5h`9LHe84@E*VB?KM^twmOv$h>_-hG%$2 zpW(uFKV>GEDYu`%*lnSV$(FpjK1ZGX5LAT8iaB?d09T|L@tz13U4@CsEJ2KI1a_J+ zDggqlSs^r1sB`Fa8fe6d*#p?A>Gr%bo<;MSXDnNvm)E?6ZN)(%eWB0GaYj3py11-A zzNnfQ*cs&oYo>}&i{FZA(k^j zi?@12e@p08r|+co5`4)SWLF}Qs8E5u@R|D8WM6i?LAjLAlXl097yZ8Hg*-~4hNdgO ztO}~5qdFW~Cf7G*DNfc0@ro@hh)SbBVgt?$REO~VZ>)RGjffZ4aIp*F!}`P@ALN`u ziHyU1s|K@XwG7i2=I3A6sM_Lgfbmgkd8V3l*liBpuf1o0DQ02WgV`Vc{K9X=o1xe0 zk|N~((rKk@c2s@pa}s^-(9!+-wd{=6p+L?qMB!WWW!d=)ew6~H$*(l4mZm2}W-F1SA=Ykf^F3 zLxkRE9L)ENKJlJ;L{WF8>JTMUALKsgR$r5{1SqVgMQbVUuXf7lng5(qm-vy3`TL&hj*xBAOQ&~T) zCce9E;N>pPUCUuMSJj!AFP^$V)QCZ6F5Pbp$yi7QDuTZp$oeNFV2h}zbu-b0V_x?b zo1%yEiWodDs}y1hjJ&#^h!r)pJ;r(15c@0kTlMpS1phnU z=7{*#Pir$C0V+h&U*skXmEa5l+o?2|ek$cXxX~5y9=icT8nmiizsOBEcQC)53Ik(I zuQAtT1N|q8!ldf+bgE1=D%*OUkH-^FKs>L_ zRde(AKYw6KlWSYbma zC~&cBFq|6V^oc5jXmw=O-T%^^ry<8q(ca#6R{wBYbU_j#BP$C~0e;2a@8yW0knUP_1O#|07TN-A7FSEA=gSoh^7D#D-X!VD-0{@tW> zIZ=S}*_$HtiGX3v($JAk;mIq_n;LPOk@1TsYa8f(M7Y6J*Lqmf2qhPJ8#T;NjV5oh zdS)2>kJZHsyBjCW1T|C{D07E!LL&AN{aytMQ`G}41b7>*$C6<}vZ|)6-K<8(>nr;A zCChheKXUw2Sq{~;^x$hrwUlfcyDuq(ZI7loV)F{vbEbQlh@oE+NEw)>S#mh8=UbBQ z4BBOSS;lW(-Tyfh&tS`^kyuhX@W!*%H#FSZ9LWTQG9D-a4f91>tl-@T*4+gw6wK55w=~N>)(@E921t5YGz@(#hiS6A$!fj zK38$p_1_N;*g=&#-Bbb)nh75r5ZZ8!?o;6$5$`_GW`m;-8Mq|nG2Z*kI&A&$ZNF?g z{4L<-bAMCuo>g;ZadBg%`=;`JW0#}8a+Y9t62am(n$*FMoMY=9=k5OtYf1$y)m55 zv+ne|rdrlc@)m0x;k!a9F8vWcLA8b&V{4>4SoZg-@Z>6(dv;>%h`wR0C!Z9lzgHi{emL%`n@&+oLo@%8i7F?j*=;Sf|)W~$6f z})5oAk_$i~_vcl=I#J5vdqq zB!LaOXGi^1(C`clKmejPx3P%?4m~iGFlY`Yx?TW*vB_2@RYnvOr?!SvP8oCa;UZ@q61?sNXcjbA%F^s-#)TApg94$ec3?~{gJ zB;GR8k(RM|WLNC`lJ0Zuan&!XZ=c?GTMkoy^xxIm4%#r6nbu4#0nHD54ZGM!bhO@P z+Cl#kBhkT;Oe&raM~^LP4=1j5@DnF0#sgUs~mK^Rr9dpAYFa|k=IIX zi}_2|YAngx02=PiNO`eGw_5Y2$eG+Cxg04TKS2!-3MhcVn9%Bqld6eXG~$ubi3#iI z)p6Rl@Pctt%yfNFFK?nq$KNtS;M8rEcart5m!Oh7yUeGLHF@bK_6PnUy* z*M&)dl>ismVl;=2X$d>TNZ#QQ*k+Q`@MC7QesF4&Z&oqIn2RFylsp(a zP@`-l=td^in~b^xNY(VLF;(Lc_hR~sQTsVu#GNoGN z>ljr|=0h2|UvqcO&R8=?M2-347Qc`zu4m`XsJKAmYPJs$myKx6mN1c5v~OruR6oJz z!Ln2;#BaAht4ohkD4YGgQc!Yx#E{F$2VLJ4I;@$PHOUgzb_|47a9e8Aqjn(|CC9%m z%;v-q5=RnD;VfKTz4BIcs8^1F^oQ&Hl=XW{)A&|O3(3>_sKIQW57?O37Mh$#v!@Hm zD$TS}3R$jw&vl*YP74?T-ux|~Y%P%@WppD{JlJa5yw@!IH=7;{%a9&I)#$j!SL-~{ zXqS>BU#xPDb!;De_!?TTjIX*p|J#th{Y_Cam~lr5rki zx52)pMz3>g>lJ6Rvg}b3YOKm)c6G_0`%i%3#B5@M&brDtJ#g%~-A~K9L390!-Dj*; z)%EpYK8OfFim@@~>=@aWMPnE&D^{#sf<1L5bJ-`>xcaP!Y?o}cx5_rtu+fX{2dTQ^ zw2Tr%$taijhXaZU3q{-?m@B91VI`7bXzb|f4EgGefltJu04@!*iQhK%U5>>Q1l-ut z=6$!>OEJH$Pqi3&jZVownH(=S57mg=nXWXe|Fp-HU=UJVy z!qF|I+bbqn=i;}M4{gZ1KE!?!HMsZ~Rs<{>%-75ZnalopT!gs^{zy|8^79vrg z3LbJ%VYj;Gj>MHlcEXC*H|(h<&dx)v7A>54b-*_qcJE%p0=K~QDXURCnE`19{M)gLwSwn&BM0bx_l z5Sn6^S9jchdn>OiiO+n?$=zOp$Tn{z-9jaoo%lP=HJRJ2pPR{l*ei49`BK#5`>!+F zTtBZwJO*>LH@!165M5m%mzI~w^679m`HvitLFeL@H@8Jy;;ZWtmxyh;@N>D4bfXCI zvtlbaS_@87HJK!OM8%t>dPi0vH+#sKyyMN3QVwfHb=yR->hk8I&6a@k3iWs9yn540 z-&DPAHMSht?@KlY5Q&C~{IQu%_OzO>s`$7eII7sVpKy$bJ_m+zqN_4X(GjS`Q+;H7 zjPpgVsF#7Pe{;3|l887{f+aa8bbY#z=1IbjZ`=A5Vt&JbH=9^}w(mwddJ0MtN-z)A zmpeBDsC*ZvVm2P`KHPTRs<$RQ91Xyp6tn7NOc{^A@goI!kmz@G$8KqRKu8r`ClzMKv_Wvx7xL}D0)!;~ z+No|5rf>acUy#GFIaHCpd$LS3J_XnZ#$bGB`)?o;wQJ4~$0YUE0oUmyAIdumDPw+PAxb+$d(X~LdyPAPndfGMsCDOy;kVq{ zPnn{XGPYcCBu}=-)YuJ0`xh2iKS|yzTpE+DKBJCtv1W^_A-u-5oSUPl%2LxYc}##X zp+OZupi+h1ek|IsSnxcG%FgDCmWkXbD#;RjJ;d+7vqhBqy3=@KwM1oJFL!jMHq4Uc zYa&B@{`4R&B#`s>Jwt|W2BnQrhH=z7YS|@`hWc5b0VsG4%*W+^09hg@@m5LwT($>+*|4*_VU3c>YYpQ>H zic0)et4ON0AN$htKT%-{xN!Yf1VEDLZ3ba-dawd=oi(m~liw9weIU=#+ z%oPx{Oq((goa|BvDS$Ac#;jT9^_H|Bc2qO6{|EVS3Um(@U7E8eqGh^qd^6ywRH;M2 zYe4LG+Zj4M`h!d8l>}9;g|l;{a>-D~bwh`WNo4>5CpUCu+W$^7EjQP*<*74L-IOU0 z-|2+Ox)Wk-8C?QIs1^1ga1B4LKmHl1Zd%Ju$ez_3?MsnJ^&w2#g2marip3~UQJ+4H|6ERBvn{*ulBn_pNw@~nB`l;0SlYf0UWe!Y-JMSc9T zhz=6SK6v-k$jyR5!i%Bd#z({n-9k zP0I#kl6hSagVpPk+~bEi>}XLwBgpoeLA7Uhmly}!SYBaKtB2dr>#4UFZ>(&;_meAAmQ(qo_4aRCDZ z1sY}5)zuQUv!>vl0uSQM4AF)Y@jT*RJ1Zn41ZJC4z=2GDl=>Jd4~|R4B6Zr#k;3j^qIYv zzM$dUuA7(oe#NUGyE?mh#|Ljk`cC`kJj+I?agMCD0^WsQ7wEQ%FlIZoD8<&@m5`5fx zs@2t1;~ma-=cPA9lu0dBDfJ~np@40zMl7Q_oi6F+zQL`%=(IOq+frTPWs~u)uxe5x@N+?xqk-&_6fBtat z^maDa=VKz1vBKIE7=6I+mjneLPOg2J0{|TCMf{uWGr}!e z-2uZ*;3)Vf#Svr(Y+wGB?!SBb+;i*i`>&Jnya7|6r@0PY1Q%K^SLH3*EV7BNgaYbp z0X@K(4H@mOj@tCJ@Xma=x;qR?%6jdd(sZ53oB3?ldtQd10ACWFtiQ8{l{{pH0l?mF zx&OQvT-^Spf42wQhHQpdl!;!7bZf{Dc6A|RoSuSu#3{-bk|cAf!AJmXa;PQBY&~;= z7*w<=bWamRL~Z`WdWFPyRp;2pj_p~$WQBu#tk{nJjl|m9DUSBhS_YLyAS}eJVTVv< zD?f$5YRaNIRK=$XmMdd_%XD?0yR@}@d!uq4-Qkv=ZY9BI!u?Gs8|#AsZ;BaUv4Qaa z>Xn(nS17Kqe&J1G2c`FluuU&nLyjn2;s}&I_1HIeZ@SX|iG^*L=BF5zjs461{auK3 zFm);DRp+U$S3iVG+eGgR{Gz8PPJagzp4Obao>a;`q|QqpD-UR0O@VIk~B}9lUVM1~W^n z^TpiU^2HssFIt$T(4FiIyGTOT4O%_8lx}xb_!MGZJA!vD5+&FgHY`=bk}TislW>$# zJ|BBm6oB!m>l*?%#Hv_rJ}f88n|M8) z#8^{A+~W^%gk5##Dt>N}{x@3`PHt|2{joXNpG0$gPSB9RK}CfMF!Mr(zZm?B3up!b zkY3xDvs=(v8B1idE_m&RNCk^$xBgjt+Yf=r0I;>Wn_EhDHaRepr|0A-&*Q)=X@b8A za>=?nCFtl8GlxUZJAQ{=`Cv;kCl{W*L1IRv)Y66tps6C+nkD>*>P?Zdiax@h<>IMZ zcwiaR!GrOt?qg-DT+Ha$Cm0eLbx-5h1loPszREa;hV-+H9*N|}k2yoQ(p)xOTYfb( zd{M&JHZYKse?!YQRHq=HK8KVd--knctyGd*?IR;U81yuDX6dWREMJk+rzjxFEcpJw zXhO+)kq~AhhULXa#yc0U#GO7Zlhkqgl>e;f9?s>W>?jwvYWh>z?W(4#k6DuE69d(KiHZ?J2eH;p_1;E z)sZM|JO2RFBJgv(525^NE>HfmP9U{Ncn=@Cuvb=A2yPdMnZV{Zv)!X?hb6{hI8GEK zAxA+-!QbS~o`x@#%X%nWlP!B*Qg?XVaZAhAHdRYhYxOvifgT-r4S|vd_&+t9{IRjI zq$8>L)zl96oXR%-{-%jUh*3&rR+b{gi4hTC#>S1teswWM4EXH(E|h6vUkk^qIkf31 z^9Bjz2mCUoD!AH9U8bAQxR zesq3Mgmmdw?MCEnl$SnZ(J*7cPv24gHx5eU>HWZ~;HkR*>HdptVDLh5yk7t2*$xk5 zw#x-(z)N`aiTlI7*tbhxnf|`8Bx7gWWH1(3w<}LmL}{`_o{N;t?~CqSNv_n#yc23_ zDDiL|_=O&-{gM4h6VF=lTyhd*r8u6EC@QMZ=1ey8#8XN%caD4C@X+;0+qyuk%s1U= z9KyO9bux++s)t_WvMWc4U22v+g{~s~rRS4)5Ef;?vgtw5EmvEiK;u3-Ok}?c!rXV{OwK#wp9rz~ z-S0lavjuy7u$XH8Op)TBdI}P-a#W6=Bg^zVuge!T%4hJ|#*Qld=)}I|cP{Qo+KvtO zn+lUO6OIkIds_n}@vR@^J`cT32B9LE3G37GV`yN;;MiwbnD8cI<5!=|$XztkT5D5v z%<}%{wVGebS)WNmR^XJ7r7tfDpO|s~o6^z5e%QTP=CHSg8|vyBIL4kv#X~^}9Z^^O z+YZAP#}1JZV)T-^LP{`@)c)c6B?U}yKo`r8XI|0rUoSn_ixuM22Sj(~{k-FdLdnKW z_;u?$)W%*n<&$!_IBIQ3pZCtExcsX>{s({EpN_6o>aiH@F-P_C8|XTaz!+Js)Hg_Z zITv03B?C4OA{dehWAPx2xs$2S-=4fCaB=ukT*#eV>ty1vd``>*KhULnKQT*)@X& z(s}ZrI&Y>P-3(oNcobaewRI*R(0JWBu?8G^gZA;X=&c2Z*CvE1U03U~I`hQ7OBMN3 zCioTcoby+}OSjZ3)wYL1i=A@oSh*{L>R7X27u{`bZ3m=+XZZg+F$^8?v!PA%2L?WW zxAO|}3lv@yCh2wf-HF>SralSJ3p~KXHKtZU<29eD+qg+9wq}qq1)~b=CsB=DUp=={sn zu4D6A?nl6$pnmhs-ibbcMdIyk35Nt>|7=XhMAnHv6!V(^vtmgs|8ByU-se+a2wf^| z%i+y`)4UdjQaMh4ALE@|lWi&IcGj3?6Z^QZ3hsU_{)rzzY^Ac{t2pxJV?yt=*{(d=}kS~h5QmTo@pPA&9 zsxVA+aQ3YT%vGE>d;FEKLwKiBA4Mk*s*({iMETrmq*}ux#v_0Qq-mkHS$BSRC8)(c zz5IQX%PK8#zXW<`uQNtz|L&)W(`qceaqIfog@spt7o1+C$B~9bN~g83Boddq@bw%Y z&5dTb+;vJ~%QH<)X@I&da^!iMzojQOThA8Bv&BvsOp8gQHbBd+AFZ+DOZmyvhG%L` zCPGe{o}#N2??9euuk{n-e}tYUi4JW4Za&?uOl^K?F0P+x&vKrRklmmsA%PQW39n+! z+}|g^-;TYffr1qngn+0AL_ZX+F|dVkl_NWSN?fV|JnnrXjag#;DX@!u>EOL+Eccgi zM{^@GRb}S8V0wA;p|sx_TV+Y3iNglJPWQ2nZ4#~hKd2wo_D~fZ%J!W`U@TJ1?BqIM z@#SQaKX19P2OHNSj5fu{Lnw=me+xVCKmDU-r8cI}Z)TIsy&;o`TOVIK6&ztw%WUqb zQ!qr=GcXXaB~CZ^s=AMK)te&%^1i%jQl=%-o#!*E(x{1=`l>z6|+iySsQ#tm1_~|VC z?r7!X+E1M|b0;7#V!@SE@t8~x8`9WIAa6$c=13MbFrv9ff6bV^VLGo)s&W4C#t`qn zbH(Vk*8ie1Qs}&mWzS})VtSu!&y1UouTRbvbM$h|;M?kVW`?aTKz@WDlK@UHv_yq~ zIG4x*j0*y>B_%aAoOBF3qX~95J^0WG4 zGS}B|(y*T>Vv=P@t=Qxt+nnN0siYp|QBb{ys7kfs)v8L9X}{+xjs7VZ`0h=TkLETb z_nwsbYdDQmp*O82i!(tI)4{u2Z-3JEYv-!Nms2{=qUPv@nSbKsKpA;0*Zi>EM6B(= zX5hsN+3Gl>%Go@UM zdEDGD1^lfE6y)E0`?S9E9rt0e+uH+N1 zekvTDf}+opucKo~N{0HSo|J`F&Q6sS_8uk@>x<0o((OpLa zduUXRP8%Q~W6ArHoR6P>(A?R|#njj-%l{~PPuSxq7&c`FgC)rn4668BJ74@^>g%_u zo7eX{<@Zmvt|!AAXb8O=0A3OwI@>_m`byn^(cbvQz2_ z?_kZ5GT!1cS=6m+J;>7&tQ zvW6>PBz!j&ts0M({i?&RkuetgFF$Nd>rx_&LN+L;6I&|a4Q>do1ksCU5uDu8d{wvd zd5K10-y(PwGLN&2l}z$g@xK4UfpZ$jGD#K=@oPxhJSRS2n7QFddSiq(T-op{YGbDV z7t+gwJO*Tfgm3lLS1AT#Z9%n!Zd=!X(WpA;&l>jIL#5dxv$ADKjn<3SKULxcdM(DF zLwpF7vfjRcAsr`k1%0a6oZRu+&<}03NM(dtJxwo@8mYGO{+j-5qXvtOL$c)OB2pV= zYTdl8m+Z5zyzcCMJv_x%8-Wz@E~G)9-W%5JTl+a*P+eS{Q!)|#n0*t9P+?EQnyJ9v zH@i&ydp+|)M|a-H*bluAW?kPb;&+QFu&!F6QKBJh0{uSeg2(i0KJdN)z*YotWgOQGi%sFQ6kQvq;;?o>t2wN zt!cKGDRvSyx>VAPU`%upV)+>ZC_()%*(4Cz`q!aw-K~P1P0Yp6?3*7BU<6k>T~8sx z%+uGNa#g(|F5wo^m162S+tosl@&O^WETP7K`n3OQ6l!g4l6w6j+-KI#Z5Gx|dq`YacXim$JY zlNEkBZ~yd^H`BwS&6dy#4jQm}sebb#M#ZAD2L>uLq-_B(3aUL;7@iyi0sHe%Q&sOf zoF^0fWb`!7p^#7O-Cak_M)uoOTJ3(p@oOGem-(^t4sLU5Iz9wP*&hBeu>x8;E&iEr zWblJ2^XUpDmo*Tkil`U zINAJ;>uaI5!y1s2JwNAf)Q_>_AM6UnF3~K_67fs`Z#1A@fPWJd^vX4nh8U;T`(o46 z)4yu7R##OWbq2gJDeVzTfvb^x+-3m<@%a*(`daSgX2BBnGTXX>rQNkis$mM{fE!(}}!?EF8=^XLa z=2qh~?D95DnEeS@=?pE`7(#M3V$?65Z@SZIHpHiRPeqAJgG_JTiL*!>(d=)9y|a(? zu+@HJDPk}WQHk5~w*HldQ`A+4#+5`}N1X^QkbZ#x`vFjRyyb*(y$GFF3yf^0ju!Af zhRD#hPfvC%qf?hi_%r0keeaNq(oowjD640&P0Z%7>)i`8bG}mcVsSGEBXck^|V)7WDE6s zhRv?#8S06JJ)*Nrakbf3(#3n^YzG&kB>zUzIZqr!D|BNrK{-WV4~#ej>h~5JIR2>7 zW5})KPmrzesSKo&{CYo8_P6kt*XX*B>z z7;Zkk;F*m5eR~iQ_%^!>y177=1^z^z6F|(H0OJP4KBlJd6_|j5OhiUzZebAul#qpe zcin11Okl^D=++jhGOl_W=q_Av;6;7^YviPX&jid|NX@*^zZuc*`jV*qSCOgF&%|~V ze=5l-(o!FY*x5Tw*zh56sa`Kum%V}xv?9H_e)gZpc0|xa@o+?8xzjwXsF(T5p?*p1 zr37>8AW-tp6|YTjkmEhCbVdKh?KoZZQB$y{C!{9kPZQdv+?{&DE4kCx9{nApcCR7tITjTzzwM zo6q_DoDW}mv}kTq>RX@;#n;)!~TM_(x@DIFl5jaJIk<8(EHr(`c7}< zdd8(+9Rwi-v8HX@R@`{t?5Ts>j1!BC`rn`54+d;Kb&oS9`mo*`EtNQeRfDw)s+*6k zl|>OXeCopP>bL1u1)REz8kUvw+IodLE1=K`m=>aa_SA(AvT9R)>V2&g{~J5h_N1>Q zaV}?bMEv5=42_=o;Q+EEgf4u|kN9h%@tuSa^TukV4%2YoMNUCvD`Qjq5KsC-Xfr1S z*;6?77IEH#z?nTgD%|19?@i6`)_KI^N(2NYd2FT}MNeTN-Y|VEHCD=E`i>Jd@5*g$ zTDG$7aKc@u!e_>X-J_9f)HqJXh#>nB>|$9}8@+#vI*aSG`^s?Bd*w#Pxsg=j+ZvTY z0s>0n^udA|Y0csAzGwg?QBpbM+d&N6lwoZDODUWD{5?+ut+p#N);_8zrLQ4gPe9h& z@x*dag-MUSP!hpf$5oV~&pqmticB=lRW!Cw<)zd6P@gsklY0t|@AOg_Wg?H-9&&gj z5DcZ6f_Iy&^R&eql}K@tpd3nDJGm>lANfC$VYRh^1dfc_cQj>)R{Ke(1l&{2dzn9` zh66#`mn_&f<0%MdZ=SPtatbC5wb>c!vRDu*bAydJhgU^3DIy}t<5_|6yx>yj;*m;; zx;8HQ*?e9Q7MOIb*=pd(6ZIdD!SO{57P`c&zsJ%1r0LbVO?e~GryKRzecznpwTw!c zdJ|pKB(?@sG_=Z!q_N6VYi)(jWW*kddmC#=+rAY`rP>tSa3OAL8+E9WAtLv|3c}IY z%c~l{LY!J3*X7~UG4}cnA+i$687&sj9Pj&)=v}&xq`W}3H=DP#&_MA~?7lD8=nr~G zaN9F8s!-ArGUj(;ZvDK zI2uV?FsYvKbXowdfcF46k@gWv#4m;5}>Vn}0H_FK*=&xCO+ zgv!Nb^Kv8|V+j9P(0z1BJW4Vv4HEjb(~Zt=c5}STaxO*6vp}*+JDg5DyeBhWz>GB7 z{0y%&YULYk2nHA5hygscJanZg1RN9E9vS zo%1!6Zyt_vVm7$#&ir&DztFA?0qK8`#VZjY=_P!x5EO&AYyx4j;wRzFa6@kOj9I76 zP8XKI!Ti7INY8?S@6?5`C2VG9e_d>~!k{%`W&zU!!J(|mwoX@j0+4_Y<-3N3aq~^jCqQg;)ragSbwI_!nx`2W}TUzQ6P~V7ToYe8sy! z9*>G8;!sFHP#-jP{N-ZQ68rg?EFnd&wr= ziI!%X6fSHZ0KpCV>z9=B1^%3fq7;f2X`Q6SbmC}NHgFZ}2~Li%Vmb|3v}Q7D0uuxY ze5$%H+j_UzrH5mCu0PoN;*yv9rEINWdQq_&*8Dr5F#`Gk(>shY`vrFZ9!?WPKgpm4 zjKjTo(8J^h))9cZ;>qCVY=UeCQ|jOx%w7T8n;g8BVE+lo5Tq;7*PSmcEad64gV6(& zvZ+Ac)Wp*>9iU1$#l=T~p{$1Qv^&EFe8tb}g8$`H0qz+@?yh`t;Ps9t(T+Yyh4{cK zMgSyD3-FEe^E%|BUP&*+X5HrD@OHVC z4;VhtgTVs6mO`4>qzWvsb6qepx2UrDk?ezvf z#j=nF0ri~G8Hd2(R{H%Ixq_*$rjAeuy5>Qo#0Rby(RF7+gDgVIag#`Xg^q43a&s~g z(o<$QT1#GT)Re5dZ|?S*@gZZ{n4;xQ6#amwz@W1qxX|lR5H@DT7FB~s zzg9%uGqS)h1Wg)v4V;$nq+Sey`6!vfIB;xQ+BQc&A=OJ56w;o^TRO6;YyJjF-+g%_ zqL=a|j>TmDB@o1Dx4i6bdr)}AFPRoDK)_3psUX0;x#zO-mf6G=ogud`yj9sg-OA_b zW1!6@oguc~njfyg%qQE&02)yyzExB*=zTBdZW5Re7aO~T4_mq(&xVwgl)3r&4!8H< z2@ov#8N|u!;cw5HKvouFjr#CkbOC$`sQ)O+AAoqQ_|5$2W7U_Py}GS!q`MpWF%|nU z2O!j$L9WagP%Uig6q=WMPg-gdu^v0wDt^ZR*RiRiqXP)X3ChJ%B^sU8tTVH-pv^OJ zaxrDes3nM{0WCAjRYDlL^L*%d4`#0w-aFDN-+3oADjh-30a^uF+?eUfz*j_hET1%M zBx=Sv`_qmXGj=V06f{^fooO;>)BSI1MmO0w-M&4~?rZ<>aGq`V@e}c-v8sa8p8*0J zntTyG-LI<5AIyD7)g^{ZeN7{s>xSegmcUX&PG~u&ze!4X_)+~wUKA;G3HDtanG8w( z%(f5FDy1f4;@sny=MT@tFHhNxT?IRynns^}^bC}<0JIIfp+FGcIxDI-#OwlI7%E#ldV zsXu+&PKxTB_#tIoFEIEGWiCthUs;ibz6MgOb+~&?U|hgt@!t=msgzM$UI>)c+RYe$ou^ z>4;n0AOvbsHWsjP!Ik`fab2ha=rw4wQWr8|EN{Dl3ZYG1#sCT!V8ERmWHgf!KtCDe zU{-Gb3QSsoBMP9wK*ApC890-{i3x0cFqMOh9B8;%pEjs6g45;WVe18m!}$PyX_pge zCucXz-onBHG{px0U^UG2O>Ujz^`{cVe|(3^`7$s7DMwEz#^3>YMpSJ`zsG^r_nA^GpYSviiHIUd1Qky0)KTx9vQ2h^b!nvoQ%yM=x zu$DOF#2t|gZMivUW@W34>o>RJ)$M(S3phW3y8feCogsHrjU5iCJHP%^=SG@Iph^^` z=1bUZ0;d#|5W{6S|*-K>on|Z zKtpGW@}1*Netvz8QSMsx)iX9!x&EOj=&kN07YkobHCdt=uV+z!!Sm(!%fvlK~zL%wJr?z4`+J? zbzZhsbK_WreEwk~uFdqEsg4$6jZOji987?xHeR2lWW!gSzH$`)r4JR)aJ8Fpj(b-9 zbe}`)b0;^gmR4yfeKs98*|^8KNFl0gg6ND2>}hFiE)|X-Y&bkvhqRAc!=gmLxA#P< zHe_7ka|L1CV1wCva2E;oc?PeJ;(Y^AmlbSNrumbw-Oxj#Cy*&OBTE?(2aBHlrhd)R z4!IC`czMuxf*dRw)Um* zi`?QP$#o_JgvLJ?@VJbeeo|LlbEPaSfbVm2ap797U;MI6*Z||s#7NK)otXYyUJ^JV zdAPXZv8D+lW%3vmilad^52sxkC2QkV3u<5b%7du&&8u+q$ou%9&0K3;7Kh~q865H) zyO#E?Em#G8ba~G1j|tTF}u1sZ9O{Fy9UI}UKlBr*jXVef4u!(LiOPfwbJDJm)Y@{f8U zrt<6YB<+;JbX9C=WFio|O*b;LAB^#ud~=KHOej3Jctcp5s{ZLPO%KTr_lTpfL>`^(@s>CLKwdG+b!ZX&0nl*Zd}q^CmePr|}YSAySG zZnHe=LOH}(;~wQmt8^XJq1<+L)sX(ir8XL*Z~M8HRg;`8k2-iC^4G%h2dj&tQfzV+ zTmKw{yf(ZcH~p0q`sek9+6?;{0gq^X2`1U^=6{R8ogM?%^2Y^xT)BL{X2=@$u-ygOYPEb^5~nXJu#Gs_MFWPB3ao+)}h=5F{F*J;NJs<>}+9p;f}(QoR{^YkF7l$tVbI6+0f<2AQ_k?M=3$~;Mr>RKF< z*42Hz-n8M8&YO{be_kuQz@Mkv5i7~9`-Pjm+|i$KbHR%Yk#)4 zN?JA<&H5bc!CqCfdf)I%VzS)My7E&}hG0Z{gp_P74ay+U2tvfv=vIgIjAbfZDwm*@3s z`O<0dKuPR3gJOUtHSkXso7^733Rr?Hmu*%31DhutbXATw=@)r10appP47r)@wY9%S zM$SJyg_qV|oX)#6I6NcZ`*8vzCd8{UlQ9)ihrKPHH1TkmgqUftCUVX0$>Ynwfi|KE zX7i4!3xAFOP0l@Ic7DUp^RstVaz$LF9=7fqbZr5xt_O^2FnbECtYz{2$WD829LA?= zW_iyG3VqgXpf{+BL`?U+94(=AY*LyzG>Lfvw7%UjlGt9W&7RxsKgHjG0(~tZj_e7w zFeGI>bA{qcj2X-OH*<1aOT7gXYXy z75^G;IKm3Pc>fVyJiL98KdGK{+*n&K-#6+8_zK?AC0T`4(Idk$I+Yf~lafSv)u^x*fTe3))gBmY$uBzbnuymnwX$d8<95Vr*< zMc;oQ$;bN?J~{~9KXNp{G?JE{ZVakm?#;vCg#)|is4=C0#}J-}y7GwFFb3s7@LCt2 zo8)Xhk``RRB?>eJp$cHy1qECc5ZZp5-yng*$;H*Nv9a-aVKML@f8vAzEnV1DL*BwS*9=lxzg&L3LK?csBZNG$eeL;a|i4; zfihvy^=j8Y*|R#ipP#0ls4_=5mfvMtOdd74?Y@-A)i4&H7mcWB;1?PI{0u*wv|sJ` zaXZ7qp=02kCJcx3?w)DK+7_tC>{9<8Szg}NH1mA@Uv8|;q~V<*hm5hSo3Hu2sB*(Q zTXkgW+|l-)nO0Fo`&$|N;)kc^IlU-yYBCvPXYNPDo)h$aN9lV}fg7J3pDLt}gxI$) zWuH;6BF?5*Tb59eye;TZJ{t(xbJxJXSwF|sN0!uP74?zEwO;ijG*8! zczY{SVe5yMtiNXMq@>TW87x+H8(2IneO|7W7w(l_>Mr63Ng0KJ8GmI&?tWUwGF9JeTGJWMe_>NxGfFL1__H9^v%}6F9Ve8yGCZ{)$n@>uBfZ$v--Jy>}RUs z?{od%FxTm5%hvVK*Dg3Y2WL3|`M-QIjYO1H(3?>&%{9ALJMv8Wsg$QE`39dkfRTDv z(0Zmh{EOJ=jZ(l6+_6|0{_jdl%v&ADsVKQNXSTb|nzmm8nvS~RlqDGhb`Sz&4=AqU zAO{&kKxtLC97|ug`~{!G3Lil)g}@leR~gbqfz4lTWHW@bVImap&y9^b1?HfdGLFh! zVH)AWD8rxGQP-TL_?o*yhKTw6JmdD}@F6Ytq4%8y1H;_H^7_TYCByAZ#{qaZ`hUX^X)643)tE1QQAeu$8(Xw-?}yQ zl61#;&GPpW8u`hA0?WmUzj*Z4W6YT@L4F*i&uPLXU0VJ|p6DlV-kxDGc#`X+BoAO; zr>gjA>Dqpuwox$QNgw*8F1hw&OvT_P_g%P{wr#coNsI}Bdz^P?95k5N4Dd zvk~w-K1Gu-B);e(r7#Fm-(&~!B#;`-c!=Y;L1`o2$k>^nshr-HWstF4RV~Za;i1D#g98S@EvrRBYZU5IgoO1lL8g4bbsmYQG{zNI+?j zEkT{-ichLlr;tN)ufJeSiL5G2BbqzU44N6UbNfJ+scLKO?O3rcMh7Y5Du^lAd%gEL@Tz6`GtK?{ za=?Mp_JQ&0-NjQ7ga`Va&-HdOFs>haji7v7VM|@q|5}-O>&ye$w-8lc&|jr%-^0g! zwjN|sziSq1zLK#WK0hZ%>^I1lFI}R`blUdv%er%1#O1|3a}RYcf$*!}qVvMQ=>ZNPr~-JEVzS1ZNomvf0eiTxkggypOV}d@Dl&D;e}3lOe&Nkn z2;9X#ci@BZ`?%7JJQxQIj3AWoYx5*Yp|DR)`e*Ml(W z=r6Czi8uETEWBjcq}N%R`_o%~!@KYv<^d>|S8Zn1U8DK-0QeScRJ;tf$BkLl_0RFE zm)5fZ%SZrVEx)-xskbrv;d!1XO z7+$;*5G$P4+TJt&s2r2emu{ERhhW4R`mm-yD^bkY4n&43B_oiO74$_2I&HPuv4ob_38az%HY+Fa3?dn zcS!V|xUvKI6my$#(+>gFtdU@;Xb>0>fa~`Q%yKT>+iz3ka>i&|m1})!#Pe-Zb)do_{Y4i~TN@m62iM z?9Bb1;Yw+CRu(&bp(Z^+UH1DE(M=38hFrA%oy1~kU8>-olEf3i7*O@r^L`#cDNW5t z;B5BZa&->)*A8A;{Z)o>^LeZO$z8l=(QftSBYEzy*dWnru({;1Qm9)Fs1{+Ho=PezNMMG7PGmq( z0w@7 z;8CaR#fp+Mi4?XrnDTn7iOgJw#$V{;69v@%eYn68Ak6mJhe9L5w~4_=4z&}5OqMcrO=OWb=}PN9gEJRP+A^=2E2bx%aQtDg_wa`Dgz) zoz))dH_P%He$i)43yT3b+Me_phS$CppWT}iuirQI?!6jx{$)m*1RdfS0?S{3*I>dm zI>`_@G&0=cjDI1+u~#O1X%$H=BY@gp&{bq1s1mlB&k02MV{V^U;}T4ClarIERN&s= zWgA1FYYS!>psxek7B*&MTeNTTp!vX`V?7Y417SQ1L!ZMIdA1GXO^5a(wSpPL5Ifi8 z-q^L@rrETcpZ4ci#r+h+4{6|D?|zx(V=R6-8|gAhpHMpF%!(e9WzzdE5f}ionu80Nz6| z2I0rkEnGnVAFKvTrhfNEzXIF`8&7M5$W_#U(>_wAd1 ze2p9P2c0zQutcL9WO)EfqR+w9|CKUpR-Q%$fEcFOQw3Kw@U*Q|E$gF-teCp^CKt@b z;UM;L$=kr}S3sMwoFTj8Kd`^nv-T6=cAC_k`

U6`o}-a#sZ=(6vg-&Rp-DpA@W! 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

}36E-ZExB&^XNX}YwjbQ)Koq6L2;fU# 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 Vm*rpXUm)", cancel: '', - ok: '' + ok: '', + overlay: true, + overlayExtraClass: 'welcome-overlay', }, onshow: { page: 'ajaxController; ?>', method: 'loadWelcomeWindow', + width: 1000, }, oncancel: { page: 'ajaxController; ?>', @@ -178,6 +181,34 @@ class WelcomeWindow extends Wizard } }) } + }, + onload: () => { + $(document).ready(function () { + var buttonpane = $("div[aria-describedby='welcome_modal_window'] .ui-dialog-buttonpane.ui-widget-content.ui-helper-clearfix"); + $(buttonpane).append(` +

+ + +
+ `); + + var closeWizard = $("button.close-wizard-button"); + + $(closeWizard).click(function (e) { + var close = $("div[aria-describedby='welcome_modal_window'] button.sub.ok.submit-next.ui-button"); + var cancel = $("div[aria-describedby='welcome_modal_window'] button.sub.upd.submit-cancel.ui-button"); + var checkbox = $("div[aria-describedby='welcome_modal_window'] .welcome-wizard-do-not-show:checked").length; + + if (checkbox === 1) { + $(cancel).click(); + } else { + $(close).click() + } + }); + }); } }); @@ -412,11 +443,11 @@ class WelcomeWindow extends Wizard $inputs[] = [ 'wrapper' => 'div', 'block_id' => 'div_diagnosis', - 'class' => 'flex-row flex-items-center w98p ', + 'class' => 'flex-row flex-items-center ', 'direct' => 1, 'block_content' => [ [ - 'label' => __('Post-installation status diagnostic'), + 'label' => __('This is your post-installation status diagnostic:'), 'arguments' => [ 'class' => 'first_lbl', 'name' => 'lbl_diagnosis', @@ -434,7 +465,7 @@ class WelcomeWindow extends Wizard 'direct' => 1, 'block_content' => [ [ - 'label' => __('Warp Update registration'), + 'label' => ''.__('Warp Update registration'), 'arguments' => [ 'class' => 'first_lbl', 'name' => 'lbl_update_manager', @@ -443,7 +474,7 @@ class WelcomeWindow extends Wizard ], [ 'arguments' => [ - 'label' => '', + 'label' => __('Cancel'), 'type' => 'button', 'attributes' => [ 'class' => (empty($btn_update_manager_class) === false) ? $btn_update_manager_class : 'invisible_important', @@ -462,7 +493,7 @@ class WelcomeWindow extends Wizard 'direct' => 1, 'block_content' => [ [ - 'label' => __('Default mail to send alerts'), + 'label' => ''.__('Default mail to send alerts'), 'arguments' => [ 'class' => 'first_lbl', 'name' => 'lbl_create_agent', @@ -471,7 +502,7 @@ class WelcomeWindow extends Wizard ], [ 'arguments' => [ - 'label' => '', + 'label' => __('Cancel'), 'type' => 'button', 'attributes' => [ 'class' => (empty($btn_configure_mail_class) === false) ? $btn_configure_mail_class : 'invisible_important', @@ -490,7 +521,7 @@ class WelcomeWindow extends Wizard 'direct' => 1, 'block_content' => [ [ - 'label' => __('All servers running'), + 'label' => ''.__('All servers running'), 'arguments' => [ 'class' => 'first_lbl', 'name' => 'lbl_servers_up', @@ -499,7 +530,7 @@ class WelcomeWindow extends Wizard ], [ 'arguments' => [ - 'label' => '', + 'label' => __('Cancel'), 'type' => 'button', 'attributes' => [ 'class' => (empty($btn_servers_up_class) === false) ? $btn_servers_up_class : 'invisible_important', @@ -518,7 +549,7 @@ class WelcomeWindow extends Wizard 'direct' => 1, 'block_content' => [ [ - 'label' => __('Enterprise licence valid'), + 'label' => ''.__('Enterprise licence valid'), 'arguments' => [ 'class' => 'first_lbl', 'name' => 'lbl_license_valid', @@ -527,7 +558,7 @@ class WelcomeWindow extends Wizard ], [ 'arguments' => [ - 'label' => '', + 'label' => __('Cancel'), 'type' => 'button', 'attributes' => [ 'class' => (empty($btn_license_valid_class) === false) ? $btn_license_valid_class : 'invisible_important', @@ -567,7 +598,7 @@ class WelcomeWindow extends Wizard $inputs[] = [ 'wrapper' => 'div', 'block_id' => 'div_task_todo', - 'class' => 'flex-row flex-items-center w98p', + 'class' => 'flex-row flex-items-center', 'direct' => 1, 'block_content' => [ [ @@ -591,7 +622,7 @@ class WelcomeWindow extends Wizard $inputs[] = [ 'wrapper' => 'div', 'block_id' => 'div_wizard_agent', - 'class' => 'flex space-between w98p', + 'class' => 'flex space-between', 'direct' => 1, 'block_content' => [ [ @@ -599,7 +630,7 @@ class WelcomeWindow extends Wizard 'type' => 'select', 'fields' => $fields, 'name' => 'task_to_perform', - 'selected' => '', + 'selected' => 'check_net', 'return' => true, 'nothing' => \__('Please select one'), 'nothing_value' => '', @@ -630,6 +661,24 @@ class WelcomeWindow extends Wizard $output .= $this->loadJS($flag_task); echo $output; + + echo ' +
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
+ +
+ '; ?> "); + var extraClass = ""; + if (typeof settings.modal.overlayExtraClass !== "undefined") { + extraClass = " " + settings.modal.overlayExtraClass; + } + + $("body").append( + "" + ); } if (settings.beforeClose == undefined) { diff --git a/pandora_console/include/styles/new_installation_welcome_window.css b/pandora_console/include/styles/new_installation_welcome_window.css index 6d354b0c33..e4c16ca29c 100644 --- a/pandora_console/include/styles/new_installation_welcome_window.css +++ b/pandora_console/include/styles/new_installation_welcome_window.css @@ -80,7 +80,7 @@ } #welcome_form li.hole { - margin-bottom: 0.8em; + margin-bottom: 10px; } #welcome_form li.extra { @@ -98,17 +98,410 @@ font-weight: bold; } -button.buttonButton.onlyIcon.fail, -button.submitButton.onlyIcon.fail { - mask: url(../../images/fail@svg.svg) no-repeat center / contain; - -webkit-mask: url(../../images/fail@svg.svg) no-repeat center / contain; -} - .select2-container .select2-container--default .select2-container--open { z-index: 2000; } -#div_wizard_agent > .select2 { - width: 75% !important; - max-width: 75% !important; +.ui-widget-overlay.welcome-overlay { + background-color: rgba(19, 23, 39, 0.8) !important; + opacity: 1 !important; +} + +div.ui-widget.ui-widget-content[aria-describedby="welcome_modal_window"] { + background-color: #131727; + border-radius: 8px !important; + border: 0; +} + +div.ui-widget.ui-widget-content[aria-describedby="welcome_modal_window"] * { + color: #fff; +} + +div.ui-widget.ui-widget-content[aria-describedby="welcome_modal_window"] + .ui-dialog-titlebar { + margin: 0; + padding-top: 25px; + padding-bottom: 0px; + padding-left: 20px; +} + +div.ui-widget.ui-widget-content[aria-describedby="welcome_modal_window"] + .ui-dialog-title { + font-size: 40px; + line-height: 48px; + margin: 0; +} + +div.ui-widget.ui-widget-content[aria-describedby="welcome_modal_window"] + .ui-dialog-titlebar-close { + background-color: #95a3bf !important; + right: 20px !important; +} + +div#welcome_modal_window { + padding: 0px 0px 0px 20px; + display: flex !important; + flex-direction: row; + flex-wrap: nowrap; + align-items: flex-end; + justify-content: space-between; +} + +div#welcome_modal_window[style=""] { + display: none !important; +} + +div#welcome_modal_window .wizard * { + font-weight: bold; +} + +div#welcome_modal_window .wizard li#li-div_diagnosis, +div#welcome_modal_window .wizard li#li-div_task_todo, +div#welcome_modal_window .wizard li#li-div_wizard_agent { + padding-left: 0; +} + +div#welcome_modal_window .wizard li#li-div_diagnosis label { + font-size: 17px; + line-height: 20px; + color: #c1ccdc; + padding: 20px 0px; + font-weight: normal; +} + +div#welcome_modal_window + .wizard + li:not(:nth-child(1)):not(:nth-last-child(1)):not(:nth-last-child(2)) { + padding: 14px 15px; + box-sizing: border-box; + background-color: rgba(0, 0, 0, 0.2); + border: 1px solid #c1ccdc; + border-radius: 6px; + width: 480px; + height: 50px; +} + +div#welcome_modal_window + .wizard + li:not(:nth-child(1)):not(:nth-last-child(1)):not(:nth-last-child(2)) + label { + font-size: 17px; + line-height: 20px; + display: flex; + flex-direction: row; + flex-wrap: nowrap; + align-items: center; +} + +div#welcome_modal_window + .wizard + li:not(:nth-child(1)):not(:nth-last-child(1)):not(:nth-last-child(2)) + label { + font-size: 17px; + line-height: 20px; + font-weight: normal; +} + +div#welcome_modal_window .wizard .status { + background-color: #c1ccdc; + opacity: 0.2; + display: block; + width: 20px; + height: 20px; + margin-right: 15px; + border-radius: 14px / 7px; +} + +div#welcome_modal_window .wizard li.row_green .status { + background-color: #82b92e; + opacity: 1; +} + +div#welcome_modal_window .wizard .fail.onlyIcon.buttonButton { + background-color: unset; + width: unset !important; +} + +div#welcome_modal_window .wizard .fail.onlyIcon.buttonButton span { + color: #26b1b5; + font-size: 15px; + line-height: 20px; +} + +div#welcome_modal_window .wizard .fail.onlyIcon.buttonButton:hover span { + color: #3bdce1; +} + +div#welcome_modal_window .wizard #li-div_task_todo { + padding-bottom: 2px; +} + +div#welcome_modal_window .wizard #li-div_task_todo label { + font-size: 13px; + line-height: 16px; + color: #c1ccdc; +} + +div#welcome_modal_window .wizard #li-div_wizard_agent { + width: 480px; +} + +div#welcome_modal_window .wizard #li-div_wizard_agent > div { + width: 100%; +} + +div#welcome_modal_window .wizard #li-div_wizard_agent .select2-selection { + background-color: #f6f7fb !important; + border: 1px solid #c0ccdc !important; + border-radius: 6px !important; + width: 290px; + height: 42px !important; + font-weight: normal !important; +} + +div#welcome_modal_window .wizard #li-div_wizard_agent .select2 { + width: 290px !important; +} + +div#welcome_modal_window + .wizard + #li-div_wizard_agent + .select2-selection + .select2-selection__rendered { + font-weight: normal !important; + line-height: 38px !important; +} + +div#welcome_modal_window .wizard #button-go_wizard { + background-color: #82b92e; + border: 0; + border-radius: 8px; + padding-top: 11px; + padding-bottom: 11px; + padding-left: 38px; + height: 42px; + width: 175px; +} + +div#welcome_modal_window .wizard #button-go_wizard:hover { + background-color: #8ac531; +} + +div#welcome_modal_window .wizard #button-go_wizard span { + font-size: 15px; + line-height: 20px; + text-wrap: nowrap; +} + +div#welcome_modal_window .wizard #button-go_wizard div.next { + mask: url(../../images/check-white.svg) no-repeat center / contain; + -webkit-mask: url(../../images/check-white.svg) no-repeat center / contain; + background-color: #fff !important; + height: 12px; + margin-left: 12px; + margin-right: 20px; +} + +div.ui-widget.ui-widget-content[aria-describedby="welcome_modal_window"] + .ui-dialog-buttonpane.ui-widget-content { + background-color: #131727; + padding: 10px 10px 10px 20px !important; + margin: 0; + border-top: 1px solid #8190ad; + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +div.ui-widget.ui-widget-content[aria-describedby="welcome_modal_window"] + .ui-dialog-buttonpane.ui-widget-content + .ui-dialog-buttonset { + justify-content: space-between; + display: none; +} + +div.ui-widget.ui-widget-content[aria-describedby="welcome_modal_window"] + .welcome-wizard-buttons, +div.ui-widget.ui-widget-content[aria-describedby="welcome_modal_window"] + .welcome-wizard-buttons + label { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + flex-wrap: nowrap; +} + +div.ui-widget.ui-widget-content[aria-describedby="welcome_modal_window"] + .welcome-wizard-buttons + label { + font-size: 15px; + line-height: 18px; + cursor: pointer; + font-weight: normal; +} + +div.ui-widget.ui-widget-content[aria-describedby="welcome_modal_window"] + .welcome-wizard-buttons + label + input[type="checkbox"] { + margin-right: 10px; + width: 20px; +} + +div.ui-widget.ui-widget-content[aria-describedby="welcome_modal_window"] + .ui-dialog-buttonpane.ui-widget-content + .ui-dialog-buttonset { + justify-content: space-between; + display: none; +} + +div.ui-widget.ui-widget-content[aria-describedby="welcome_modal_window"] + .ui-dialog-buttonpane.ui-widget-content + button { + background-color: #313b62; + box-shadow: none; + border: 0; + border-radius: 8px; + height: 42px; + width: unset; + padding: 10px 20px; + font-size: 15px; + line-height: 20px; + font-weight: bold; + margin: 0; +} + +div.ui-widget.ui-widget-content[aria-describedby="welcome_modal_window"] + .ui-dialog-buttonpane.ui-widget-content + button:hover { + background-color: #384372; +} + +.welcome-wizard-right-content { + background-image: linear-gradient(225deg, #731dd8 0%, #2eb9b8 100%); + border-radius: 100px 0 0; + width: 432px; + height: 375px; + margin-bottom: 8px; +} + +.welcome-wizard-right-content img { + width: 348px; + height: 260px; + position: absolute; + right: 43px; + bottom: 65px; + filter: drop-shadow(0 0 10px #0000005b); +} + +/* Background bubbles */ +.welcome-circles { + overflow: hidden; + position: absolute; + right: 0; + position: absolute; + bottom: 8px; + width: 430px; + height: 373px; + overflow: hidden; + border-top-left-radius: 100px; +} + +.welcome-circles li { + position: absolute; + display: block; + list-style: none; + width: 20px; + height: 20px; + background: rgba(255, 255, 255, 0.2); + animation: animate 10s linear infinite; + bottom: -150px; +} + +.welcome-circles li:nth-child(1) { + left: 25%; + width: 10px; + height: 10px; + animation-delay: 0s; +} + +.welcome-circles li:nth-child(2) { + left: 10%; + width: 20px; + height: 20px; + animation-delay: 2s; + animation-duration: 12s; +} + +.welcome-circles li:nth-child(3) { + left: 70%; + width: 15px; + height: 15px; + animation-delay: 4s; +} + +.welcome-circles li:nth-child(4) { + left: 40%; + width: 60px; + height: 60px; + animation-delay: 3s; + animation-duration: 6s; +} + +.welcome-circles li:nth-child(5) { + left: 65%; + width: 15px; + height: 15px; + animation-delay: 0s; +} + +.welcome-circles li:nth-child(6) { + left: 75%; + width: 30px; + height: 30px; + animation-delay: 3s; +} + +.welcome-circles li:nth-child(7) { + left: 35%; + width: 50px; + height: 50px; + animation-delay: 7s; +} + +.welcome-circles li:nth-child(8) { + left: 50%; + width: 25px; + height: 25px; + animation-delay: 15s; + animation-duration: 45s; +} + +.welcome-circles li:nth-child(9) { + left: 20%; + width: 15px; + height: 15px; + animation-delay: 2s; + animation-duration: 35s; +} + +.welcome-circles li:nth-child(10) { + left: 85%; + width: 50px; + height: 50px; + animation-delay: 0s; + animation-duration: 11s; +} + +@keyframes animate { + 0% { + transform: translateY(0) rotate(0deg); + opacity: 1; + border-radius: 0; + } + 100% { + transform: translateY(-1000px) rotate(720deg); + opacity: 0; + border-radius: 50%; + } } From 40d1efac1127a110dec31160ad8b5d774b5a66ec Mon Sep 17 00:00:00 2001 From: Pablo Aragon Date: Thu, 11 Jan 2024 11:39:14 +0100 Subject: [PATCH 103/170] 12320-Welcome wizard new styles, fix in Configuration->Configuration Wizard --- pandora_console/godmode/menu.php | 33 +++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/pandora_console/godmode/menu.php b/pandora_console/godmode/menu.php index 2c6661c1f6..a77e63b95b 100644 --- a/pandora_console/godmode/menu.php +++ b/pandora_console/godmode/menu.php @@ -770,11 +770,14 @@ $("#conf_wizard").click(function() { modal: { title: "", cancel: '', - ok: '' + ok: '', + overlay: true, + overlayExtraClass: 'welcome-overlay', }, onshow: { page: 'include/ajax/welcome_window', method: 'loadWelcomeWindow', + width: 1000, }, oncancel: { page: 'include/ajax/welcome_window', @@ -792,6 +795,34 @@ $("#conf_wizard").click(function() { } }) } + }, + onload: () => { + $(document).ready(function () { + var buttonpane = $("div[aria-describedby='welcome_modal_window'] .ui-dialog-buttonpane.ui-widget-content.ui-helper-clearfix"); + $(buttonpane).append(` +
+ + +
+ `); + + var closeWizard = $("button.close-wizard-button"); + + $(closeWizard).click(function (e) { + var close = $("div[aria-describedby='welcome_modal_window'] button.sub.ok.submit-next.ui-button"); + var cancel = $("div[aria-describedby='welcome_modal_window'] button.sub.upd.submit-cancel.ui-button"); + var checkbox = $("div[aria-describedby='welcome_modal_window'] .welcome-wizard-do-not-show:checked").length; + + if (checkbox === 1) { + $(cancel).click(); + } else { + $(close).click() + } + }); + }); } }); }); From cca1392000b367ce059efeaba3d05c04a3b43448 Mon Sep 17 00:00:00 2001 From: Enrique Martin Date: Thu, 11 Jan 2024 12:01:51 +0100 Subject: [PATCH 104/170] Updated some discovery apps logos --- .../images/discovery/pandorafms.mongodb.png | Bin 7782 -> 6821 bytes .../images/discovery/pandorafms.ovh.png | Bin 4361 -> 3723 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/pandora_console/images/discovery/pandorafms.mongodb.png b/pandora_console/images/discovery/pandorafms.mongodb.png index 1042463eda83f83c1bcb63cd99946d7554fabe0f..37f3b2d542e9e022691f469ce298e9059ddfe4b1 100644 GIT binary patch literal 6821 zcmV;W8d~LvP)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H18Zt>l zK~#90?VWj)Tvv7OfBW2ftGc_YXSLKCT2c?1r?v#fvatbU8;rqe0g4k7%&;CaFHT}$ zK^P1Pi3iLe16dCUNpQegu7Y zdZ?~yN#^nODlM&ZZ=HMY{px&Y?|t??N7~xj_&qKhxaYe8Q=#=nFA!K!TJCFUji8Hs z-`1iM7Na3lt5hV6Ql{Xgzayxk5=R)um_B^lFQP*V17dBrb%Uo6uZNKX!;xK8$@6)C zQ$fym4{5!**L8zy7bSgvopJ3}^-U9^7a=S`DF>|pk>XrUl3@E#8A5nk;Yop~9A%&J zf*l{b_$xg-cI?pNTx*UkJlBNWci(;Tx4(H$eKO%+gOyhx@-kFcbH014GKBCX@CzgI zkZ($MM{Ymbf3BNx&IoD!=z?Y9a|6l_gzbPiCl{V0L>N-#L6Gm2g`?l!bL+s+Il1n9 z64Kh*YUHZtU!!8)FYp>B=>3Ze+K=)tDtsmKxibgn^GfqVh=(b{w z0XAu|aUVZ!QQx8pDCvJd1OYIDaRd`^aDonEiZld4LWF3RCrV;4PGT@la>PfI7VBHo0_YeQV-OIL zaZ)@7x6CCF4&apsD6K1{w62Vj+EPM`L%1OiqifQg;A9tNN9XXwNriNOSF&yAsDTtlEDK)9iTipEN+R#y{V z8pe3e>?#m>LVW+my`S$XT5l;DA+5L6U1f|upfK&-#0TPZKie)>BEm+Snfce zB0%-pTIw!ZNcFl}oWKm^2q#rzTOywu=qkqbi(+an{KP^}qW1GslA+Mo*~{@?JWu!j z)7XS9#%0GKMvB&};{9<>J#vCmkDS0O4^V&cVwPO7jMBQY++R@Yk&;is!2c}9^^4L& zF8Wa2wTS*G*RlS?eH{K_2fZC zYh0QmySlmyy;gCYF{5wIeAsH0&hI_L@!dyJfBwb<;~JW--ayp#8QOPxUaq0O<;0%j zoZi>PsvFj_=%w|UXH*!^wgG=%=(P%V&bEK3rX1y}%<|r6&T{Ob=jWFU$FT0rTd7@9 zNBPBzFs1YB>?em49Qy84B!&_>8Y6#DjB6B3NDR{o)Mb{Rdi2D+Nfdw+blCLHOIWtO z1w?Se0m7HpL(yE0+(-;1==p87GO6nJ?H{TsFSP!G2~i_2&n&Y^OYbvh3$1!eI01)^ z@3@!+>lUM$b_$_%T@9h_i{|aRY4kjCCaX+DYGUfHFSPDr#FH+{EQpL7mu7X?qN4xVzAURw6|tgO&mvzGL`ds>tp?3*L|bT(e9C)KR6M#7Fu^=n|RltJG;*qZ5 zf~uVgHJcZ*@X{4yy(0aW=0jD-KH=73A>F zqi2dgek{4R2~*~xDX|)pDpiYBi!rH4@5GN2@(90b$-G!z(ViUlsJh^e-@Ln`ka`Ou zM3Ke0%9BI!LaNO|xVeh(x|#`+lp4V8gq|W3p1Mx>1Xh$2Tr;a!XI@AQ=Df#Hawu{B z2oWQtnPoQacDZQw+Xl(+B_r-D* z8Q=J4ryoyEA{7NjsJf&+^;mUu^qAN?Cdk%Q!$f+Z4{oYKiWpi+4Cm}2 z7|$!nTQ6)35wc>^>Zdfm7zivZCD;&}Y*mfPR))331S@O8XS7vFz)-TGcw@;_F*?C! zsYX61tcQrqYvxF3a}Amv8?sDYJ6b-`G1MtODFoJ4BW@8*t{j~BNhzos7ARRdZ_|C^ z3MH#6ClD|$TUIAamsQP5qsY};Ou2{K5H4aPvx|&FZY`T73beAwa>>Ot6rfVZ26NwI&qud?{rnLUh$Z_F1~bb`7Z&ylG}VFeUXeip8L~AVCYc#y zy(Z`&p~8A`S?+s$p>0Q7L2hwDgv6buK2`cM%S&nt8#GOLqFhautubqBQjf7Sx`vbF z3&j*@Y3060d9I*JDUguJu1HdZCo;>+8w!d*!>F80CS{^*F>dru=pj>$89C)EF!x&z zlm~K3mI(XjTiG+!=H6BjMjVV>DfQ-s12svJ}thC@<)`AJK0XkJV znOR=FcJ667b~qKYoULq)k0mo&yknSaVzxL!WlMFg8Xx=FhmYo*waNzt6B7As*D#XZ zRjXE4&pCu*yW^7v>X~F~)@E<|e5+`5Zqv-+h6)0e*0ZTLw=fB5-1N) zK1bQI0}1fceIq~F%ACf{B27VKJ~}wJnSid0SgBqcfs|$+=B43oN)OJ9k*&uuUv|I{yl@Q4~Ucd#wM6Le_hB zbz2wZ|3W2zLh|TvUb2<#0ZxtN$+=}#hL@EST9O@@ROR0zyCOxItSbs3iF*@1@P9JP zgH=IlHq0&CBiWgX$moP8Jgscy7)Nx9KmUcf%^}rqUy>zPqxjc3RhR=sn-f=S|AidC z&!ty1%&ETQbHiggKW0fWjcn!k8*AGHtII}x{FC_;;+DG9Uz{^9@DP_RE7<=?qiBRg zKHqZ~crdfPYHbbShWs;QG+~K9*+1!*Kb>q@o7?Qo>^S!5Fgk}szWPg-;+Ex{CH!V& zN2F+pXhqH%v0uv^+(m?y*EY>5zcwD}owbwb`!hU~QFao~WW_>fgj?#;@ah#=R;xX+FfyNBcUbvC#uDM(?jz3$ds~$Dx#AKfC-jW+!Fuq)3fqXCZhh5CDd-ndO-}} zv||4@?;Du~<|P%>ziin9R`@|?xm)70=En8;OP5uK|MLaxh@V5Y6h{pP2dj*IQavVh zPU5jM*#7(y3QHH3(e%buQy3%i*O9w=UdZnzW`}tpB(fu75%(5^p3GwvO_i*?F8^2Y z?AbWOKYAgR%*{mEf&d;K4%wpy_=g8bKAoRsC5~a;+cx6mFmqA%XjSjm^1gvtV&0Oa zBX^v97RyI+9b10&N)~L%KhBjnG{Epfr?O+bxdN}%OUtEZat z7*^}QJM!_ua<8Vtyk@WKWy}5%vZV`wwKr`bv~&*R$zx|2`Q_uPD)xn`=%{^;Pb-mm1>*!(f?D}z3I zd-o~S-UMWMWMvD>*!b=(`DZ$glG1noF>KsYDIpe@Eo4h|3$}BB_)*L4 zcXEbs#B+G(Xb^Q?aZZ+M-FH{d&qeqcLY971G*+_Ve{9Ze>(7Ab<7XNA-f^lZ$8$Ye zhU3yxaGumN5)V}4>+q+NY-M~5EoUNT}w=cU}HTQZ_)oW{0q|708 zXzn?JafU@qxYd^PgEy`SsJ%B-0$oHIfqJ0g~N@@9dY zE6>$zSiq+Dwc_UaVy0T<%;__@u1DY5{1yleFDs|@&$dmKrwc|tx$lnC-^r`e0&z}P zmyYb}jap~qk5TsII$pJ=hAn@(EoUHaI-Ke1!E*!H-O0q1#{hBasz}{TP%U4v;`e!d8v~2csC_@87cwTUJNs9vYFI&RK_vRim zQqXT`{Ln{>InOa$oR{_2BfGk~Vn#M?JDR^+Cp&N_Yb+`6ALS& zG5c+S*H3j$UuQ2*-Sb;UPEQ>^udc0OcxaedGunUYiW7os_EW)91-DNd++SN+a5SaYn)Gm^G*oB$)8!jet69T+C0!D@M?0bCv03p z?S=(Zt*U15Xg~3RY2te#)LpcQ4e#DU^_rS#HfNCIV)XjGcb@r=;@nB$xF84tIC=7< zp8WOjqxF}U?J>%$Ajg9Kl6p6z{*onlhhlkbUq@l5u5ujd)(eNdkYtvC0&5^Q-7%5CIW*Kr~egK?bT ztQIUdgxYuSyQ`-tiP7_c3w9r<$gZm7zB{|Ws-jy3`LF5D^}>M}$dIH6Un)_%^+F~C zE?`2^h}?PRkiB&2wIb#%+&h0$uEoZSijXu~Z?0NN!1=HsHvyURz{i0vsx$J9$n8Vt zd>_I>@uDOojn)q>TrOh&RD?fK<*bN))ta(<&c}w3#lnl4kThC9v9N6YwzIK&cbwm_ zM=|g_LCEhCE_f^J|2O=ekP8eK?0)L!8keuMe<#AFj3tSy1L6ZgRaFt5S1~^p4Saj| zk;GVv>=li=L(z{LQY#h7=#N}fJkVZi_-QcceEGpAbyi`T-}jJFgoDA4sqp8d;%8fd zTfts$jlS72=CeRhRKFy|9>1c|e?|Ix%PIr^X&v3EshILM;5)8scKWJ+p(4Yg+!~Mi z4_wjc&1&(N-xD&5`=3tq4OI015>m^AIKDoy`-pq|SDnsN4;_|&?XTQ+4e%*osfgV7 z@&;WGaBn0L-*d=0qN%;u5o0=k)gJXVu*ybY*% z<#0H5S73Z1d4~7&NTNx5Lewv);(twL5)JHeRWQ*Q-)5$g?8y&t*-U@}3K^)_%zt z*#W%zvKCpm=a8oNz;yw{SWW-VuU_JXW5iYik)$*7FxgAxXJJM{5}kXieF=PBlDdd**V!7Ts4@_t5JG_q9|EmNtD00a5!U#VkX)RnZR&bw2)% zQ1h05%ZCs@D342m0f9;n+X&JHpsFGwsL1uNXwv0aTN*d^4JbXXYu>!Oqik0DK+Pyw zUh~$o4<0=HhoC~xc;LvD;pQ!E7P$fNtnl`99kGK4 zD=>T)_;q>9=G#ImH|+^GZT^f1A5~>TTNTM1I#l6>tn>SyVjJaEZ z=T)`s)oWAhJ`En)w@%9zn0|?dS*tSd;8YRV_!-@>I2ceYe1Ffw1F6M>i=nn*c`)W6LtAFHZtkm671a zjj_R_`zsN>0g=6BP20zQq2-O6pAq4QK#j!Y%Go@FG&Y1zdjbJc=5dbAi0!?(TnFPgTb;HxamINYkLC5MgmK6XNos{ns z+_g6hw11F(m+BFsG0=J7BZ}N2DmPZF*zz2J zaU=@Fu&hawHddXcNs`I08H}Fgx;E#eyut2734nfc_mRZNczJF_OE(Ot(2t^`GGjJm z9%iq2fJCFwv4%SMS!o>u0|P>8Ny@PtC$;V#Ag;)pPMvye%t7)xIs&A&-ur3Qs#Svk ze$04)ppr8$)Unn8w6(RVBSUXTxL<_<5$)7u;Hpr|ru)+8R<7whBf>$1=BqZhO!5Q7 zNHa=*KoSp)m)04^44v!^&t9>TR#p8l@ZSkf?wWYan$%`sqRymjyo$cPO(^v$Jl$K} z|4goXnuu8u(%aDyR&*&4T+B#)dwaX|_V&8Im_`6pmv|i=f%f)xsg3p4ld|usd!LO| zwYRs+g9kgF0{tgoUD-hJ?t!PCs_l(LN_r&vUIgn{^KpRQ-d-0+8wCs^3t|TkRsaki zemI0BB`wM-ucIRXU^Vn@lO@n!e5&Y;FJBs8aYdt7^YRt`OM!0zClGFoM5<<7*JH-;yM6M> z^5H=IyCAir4yOj-c}1gr8}Ml$ zEZ}IWr&yp5IHRh+F*x7pt7_dHiHv8(U(u*Hf_?_51UypTOOi6zj{`q|;5R46zX~Fx z*l2BUH^17}RGutfK2%jzScZB3p#wXN=$j4tH6JG-Y8PXq4b`^_+#hP*{JM$f4WHvoYWkxB0$ zcwW1sDcLFNI#%Zj7hEdoY!UD2PJq5uT>tWDPuB^1ri)nLiPf?0>c3Xx@#?jQcUimk zyl1oLix+JV2{&*20m2O^)}Y_;jXof1ZV@r}{Pe)#k0ugrFUo|67ws7GyNdq@9fX5G T9*i;?00000NkvXXu0mjfC7W5_ literal 7782 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 WFRR^F*Zw_@0ctAR%1w&4G5-h2UO5~9 diff --git a/pandora_console/images/discovery/pandorafms.ovh.png b/pandora_console/images/discovery/pandorafms.ovh.png index 69eddb9a31610ff374fb5e76e8e3ac5d9c8267d6..37910c38aafd220a989f5687f216599cab04f9f3 100644 GIT binary patch literal 3723 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 AP5=M^ literal 4361 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 CT5|XR From bd808d72f39447e04c95f5a611a9d984f588901e Mon Sep 17 00:00:00 2001 From: Pablo Aragon Date: Thu, 11 Jan 2024 12:52:23 +0100 Subject: [PATCH 105/170] 12320-Welcome wizard new styles. Fix all complete li --- .../styles/new_installation_welcome_window.css | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/pandora_console/include/styles/new_installation_welcome_window.css b/pandora_console/include/styles/new_installation_welcome_window.css index e4c16ca29c..64a8d44266 100644 --- a/pandora_console/include/styles/new_installation_welcome_window.css +++ b/pandora_console/include/styles/new_installation_welcome_window.css @@ -161,6 +161,11 @@ div#welcome_modal_window .wizard li#li-div_wizard_agent { padding-left: 0; } +/* div#welcome_modal_window .wizard li#li-div_diagnosis { + top: 0; + position: absolute; +} */ + div#welcome_modal_window .wizard li#li-div_diagnosis label { font-size: 17px; line-height: 20px; @@ -232,6 +237,15 @@ div#welcome_modal_window .wizard .fail.onlyIcon.buttonButton:hover span { color: #3bdce1; } +div#welcome_modal_window .wizard #li-div_all_correct { + height: 100%; + margin-bottom: 145px; +} + +div#welcome_modal_window .wizard #li-div_all_correct * { + font-size: 10pt; +} + div#welcome_modal_window .wizard #li-div_task_todo { padding-bottom: 2px; } From 5cf9d70c6f57ccc00ef383e5b36a00de3be7d2cd Mon Sep 17 00:00:00 2001 From: "felix.suarez" Date: Thu, 11 Jan 2024 09:58:06 -0600 Subject: [PATCH 106/170] Add config token for mail_subject_encoding --- pandora_server/conf/pandora_server.conf.new | 2 ++ pandora_server/lib/PandoraFMS/Config.pm | 5 +++++ pandora_server/lib/PandoraFMS/Tools.pm | 3 ++- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/pandora_server/conf/pandora_server.conf.new b/pandora_server/conf/pandora_server.conf.new index bddb11a293..1945cbd08f 100644 --- a/pandora_server/conf/pandora_server.conf.new +++ b/pandora_server/conf/pandora_server.conf.new @@ -816,3 +816,5 @@ madeserver_autofit 7d # Model sensitivity. A lower value triggers less anomalies (PANDORA FMS ENTERPRISE ONLY). madeserver_sensitivity 0.1 +# Encoding to use on mail subject (MIME-Header by default) +# mail_subject_encoding MIME-Header-ISO_2022_JP \ No newline at end of file diff --git a/pandora_server/lib/PandoraFMS/Config.pm b/pandora_server/lib/PandoraFMS/Config.pm index 4f45c28b19..4b7a6c142a 100644 --- a/pandora_server/lib/PandoraFMS/Config.pm +++ b/pandora_server/lib/PandoraFMS/Config.pm @@ -589,6 +589,8 @@ sub pandora_load_config { $pa_config->{"madeserver"} = 0; # 774. + $pa_config->{"mail_subject_encoding"} = 'MIME-Header'; # 776. + # Check for UID0 if ($pa_config->{"quiet"} != 0){ if ($> == 0){ @@ -691,6 +693,9 @@ sub pandora_load_config { elsif ($parametro =~ m/^mail_in_separate\s+([0-9]*)/i) { $pa_config->{'mail_in_separate'}= clean_blank($1); } + elsif ($parametro =~ m/^mail_subject_encoding\s(.*)/i) { + $pa_config->{'mail_subject_encoding'}= clean_blank($1); + } elsif ($parametro =~ m/^snmp_logfile\s(.*)/i) { $pa_config->{'snmp_logfile'}= clean_blank($1); } diff --git a/pandora_server/lib/PandoraFMS/Tools.pm b/pandora_server/lib/PandoraFMS/Tools.pm index 580344542c..543ea45556 100755 --- a/pandora_server/lib/PandoraFMS/Tools.pm +++ b/pandora_server/lib/PandoraFMS/Tools.pm @@ -748,6 +748,7 @@ sub pandora_sendmail { my $subject = $_[2]; my $message = $_[3]; my $content_type = $_[4]; + my $encoding = $pa_config->{"mail_subject_encoding"} || 'MIME-Header'; $subject = decode_entities ($subject); @@ -758,7 +759,7 @@ sub pandora_sendmail { my %mail = ( To => $to_address, Message => $message, - Subject => encode('MIME-Header', $subject), + Subject => encode($encoding, $subject), 'X-Mailer' => $pa_config->{"rb_product_name"}, Smtp => $pa_config->{"mta_address"}, Port => $pa_config->{"mta_port"}, From 3a509b94151d23ef8e8db8e8ed57a7e1e6a2cd50 Mon Sep 17 00:00:00 2001 From: artica Date: Fri, 12 Jan 2024 01:02:06 +0100 Subject: [PATCH 107/170] 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.redhat_bin.el8.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.el9.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.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 +- 28 files changed, 28 insertions(+), 28 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 736023d74c..8ab7ed2464 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.775-240111 +Version: 7.0NG.775-240112 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 96332b40eb..de56e36492 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.775-240111" +pandora_version="7.0NG.775-240112" 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 46363099e7..44f466714e 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1039,7 +1039,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.775'; -use constant AGENT_BUILD => '240111'; +use constant AGENT_BUILD => '240112'; # 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 fec771056d..d87249cc31 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.775 -%define release 240111 +%define release 240112 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec index e92767ae61..4bf5bb42d9 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240111 +%define release 240112 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec index ffa3776334..9470be01b5 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240111 +%define release 240112 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.spec b/pandora_agents/unix/pandora_agent.redhat_bin.spec index a433acbaf4..cd42cc9d21 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240111 +%define release 240112 Summary: Pandora FMS Linux agent, binary version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 05994e8efd..59adc646e9 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.775 -%define release 240111 +%define release 240112 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 8710e37350..cddd5afa5f 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240111" +PI_BUILD="240112" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 652e97ea30..48be618d30 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{240111} +{240112} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 7366a01592..bc28a306f8 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.775 Build 240111") +#define PANDORA_VERSION ("7.0NG.775 Build 240112") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 255d96f00e..3dfd32e864 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Pandora FMS" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.775(Build 240111))" + VALUE "ProductVersion", "(7.0NG.775(Build 240112))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 6831b86b26..412b9f14a2 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.775-240111 +Version: 7.0NG.775-240112 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 59e86d11a7..01b0eb0de2 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.775-240111" +pandora_version="7.0NG.775-240112" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index f0c1c60fca..0162b3c26e 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 = 'PC240111'; +$build_version = 'PC240112'; $pandora_version = 'v7.0NG.775'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index d5c11694c1..a2fa1810f1 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 f384189dc9..1b7d2f53dd 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -7,7 +7,7 @@ %define debug_package %{nil} %define name pandorafms_server %define version 7.0NG.775 -%define release 240111 +%define release 240112 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index cc32de3f0f..977cca174d 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.775 -%define release 240111 +%define release 240112 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index b0ab4572b7..47539c4ee9 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240111" +PI_BUILD="240112" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index f5546d746c..90a6defdcc 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -38,7 +38,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.775 Build 240111"; +my $version = "7.0NG.775 Build 240112"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 4daeb48656..1d36d15f9c 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.775 Build 240111"; +my $version = "7.0NG.775 Build 240112"; # save program name for logging my $progname = basename($0); From e2b837186c31bea29f7016c3ce14f550010b30c5 Mon Sep 17 00:00:00 2001 From: artica Date: Sat, 13 Jan 2024 01:00:46 +0100 Subject: [PATCH 108/170] 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.redhat_bin.el8.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.el9.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.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 +- 28 files changed, 28 insertions(+), 28 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 8ab7ed2464..237b46fdb2 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.775-240112 +Version: 7.0NG.775-240113 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 de56e36492..ddaf6da5ac 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.775-240112" +pandora_version="7.0NG.775-240113" 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 44f466714e..6fceed9524 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1039,7 +1039,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.775'; -use constant AGENT_BUILD => '240112'; +use constant AGENT_BUILD => '240113'; # 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 d87249cc31..f803674d68 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.775 -%define release 240112 +%define release 240113 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec index 4bf5bb42d9..08ccec8f26 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240112 +%define release 240113 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec index 9470be01b5..c2efe9b516 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240112 +%define release 240113 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.spec b/pandora_agents/unix/pandora_agent.redhat_bin.spec index cd42cc9d21..a3f30db28a 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240112 +%define release 240113 Summary: Pandora FMS Linux agent, binary version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 59adc646e9..e43308e6a4 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.775 -%define release 240112 +%define release 240113 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 cddd5afa5f..f38ed3fcc9 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240112" +PI_BUILD="240113" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 48be618d30..096676f9c3 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{240112} +{240113} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index bc28a306f8..7bfa67fbfb 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.775 Build 240112") +#define PANDORA_VERSION ("7.0NG.775 Build 240113") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 3dfd32e864..72cbf73de4 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Pandora FMS" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.775(Build 240112))" + VALUE "ProductVersion", "(7.0NG.775(Build 240113))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 412b9f14a2..6e3edf5eda 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.775-240112 +Version: 7.0NG.775-240113 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 01b0eb0de2..bd7a7c19e6 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.775-240112" +pandora_version="7.0NG.775-240113" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 0162b3c26e..52026317cf 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 = 'PC240112'; +$build_version = 'PC240113'; $pandora_version = 'v7.0NG.775'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index a2fa1810f1..9e3bad5621 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 1b7d2f53dd..d4be42c1a4 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -7,7 +7,7 @@ %define debug_package %{nil} %define name pandorafms_server %define version 7.0NG.775 -%define release 240112 +%define release 240113 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 977cca174d..c71d131026 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.775 -%define release 240112 +%define release 240113 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 47539c4ee9..13bedfb49d 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240112" +PI_BUILD="240113" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 90a6defdcc..5e791704c9 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -38,7 +38,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.775 Build 240112"; +my $version = "7.0NG.775 Build 240113"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 1d36d15f9c..871c363124 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.775 Build 240112"; +my $version = "7.0NG.775 Build 240113"; # save program name for logging my $progname = basename($0); From 2e45362944a522535d9e84e2c734ff5437c46faf Mon Sep 17 00:00:00 2001 From: artica Date: Sun, 14 Jan 2024 01:01:50 +0100 Subject: [PATCH 109/170] 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.redhat_bin.el8.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.el9.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.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 +- 28 files changed, 28 insertions(+), 28 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 237b46fdb2..76d63f03cb 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.775-240113 +Version: 7.0NG.775-240114 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 ddaf6da5ac..67b43b5a3d 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.775-240113" +pandora_version="7.0NG.775-240114" 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 6fceed9524..76507d6318 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1039,7 +1039,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.775'; -use constant AGENT_BUILD => '240113'; +use constant AGENT_BUILD => '240114'; # 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 f803674d68..964d3c4c6b 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.775 -%define release 240113 +%define release 240114 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec index 08ccec8f26..997439bc0d 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240113 +%define release 240114 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec index c2efe9b516..c1a62f08d3 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240113 +%define release 240114 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.spec b/pandora_agents/unix/pandora_agent.redhat_bin.spec index a3f30db28a..143a10ca11 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240113 +%define release 240114 Summary: Pandora FMS Linux agent, binary version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index e43308e6a4..480dc0270e 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.775 -%define release 240113 +%define release 240114 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 f38ed3fcc9..53ec5d4ea2 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240113" +PI_BUILD="240114" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 096676f9c3..dcc7438e3c 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{240113} +{240114} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 7bfa67fbfb..8d43843685 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.775 Build 240113") +#define PANDORA_VERSION ("7.0NG.775 Build 240114") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 72cbf73de4..93ec170364 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Pandora FMS" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.775(Build 240113))" + VALUE "ProductVersion", "(7.0NG.775(Build 240114))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 6e3edf5eda..b342b75837 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.775-240113 +Version: 7.0NG.775-240114 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 bd7a7c19e6..8d50e381db 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.775-240113" +pandora_version="7.0NG.775-240114" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 52026317cf..263269ff54 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 = 'PC240113'; +$build_version = 'PC240114'; $pandora_version = 'v7.0NG.775'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 9e3bad5621..f4b000af8f 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 d4be42c1a4..bfc425deac 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -7,7 +7,7 @@ %define debug_package %{nil} %define name pandorafms_server %define version 7.0NG.775 -%define release 240113 +%define release 240114 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index c71d131026..6a06291b07 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.775 -%define release 240113 +%define release 240114 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 13bedfb49d..10028244f5 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240113" +PI_BUILD="240114" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 5e791704c9..1a99a07347 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -38,7 +38,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.775 Build 240113"; +my $version = "7.0NG.775 Build 240114"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 871c363124..acea515547 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.775 Build 240113"; +my $version = "7.0NG.775 Build 240114"; # save program name for logging my $progname = basename($0); From 616af6450bb22ea5ef6ebe5f450a4264ce6fd8b2 Mon Sep 17 00:00:00 2001 From: artica Date: Mon, 15 Jan 2024 01:00:21 +0100 Subject: [PATCH 110/170] 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.redhat_bin.el8.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.el9.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.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 +- 28 files changed, 28 insertions(+), 28 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 76d63f03cb..b4d349663e 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.775-240114 +Version: 7.0NG.775-240115 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 67b43b5a3d..d692106e65 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.775-240114" +pandora_version="7.0NG.775-240115" 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 76507d6318..1129b081d8 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1039,7 +1039,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.775'; -use constant AGENT_BUILD => '240114'; +use constant AGENT_BUILD => '240115'; # 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 964d3c4c6b..a0106b1960 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.775 -%define release 240114 +%define release 240115 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec index 997439bc0d..d7f30e9b26 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240114 +%define release 240115 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec index c1a62f08d3..5249f61928 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240114 +%define release 240115 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.spec b/pandora_agents/unix/pandora_agent.redhat_bin.spec index 143a10ca11..9a2de6bd96 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240114 +%define release 240115 Summary: Pandora FMS Linux agent, binary version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 480dc0270e..4c014cff15 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.775 -%define release 240114 +%define release 240115 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 53ec5d4ea2..a2a0c0fe46 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240114" +PI_BUILD="240115" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index dcc7438e3c..82074313de 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{240114} +{240115} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 8d43843685..aeded4b511 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.775 Build 240114") +#define PANDORA_VERSION ("7.0NG.775 Build 240115") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 93ec170364..a60563005e 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Pandora FMS" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.775(Build 240114))" + VALUE "ProductVersion", "(7.0NG.775(Build 240115))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index b342b75837..5542578ce4 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.775-240114 +Version: 7.0NG.775-240115 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 8d50e381db..b47333a6ce 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.775-240114" +pandora_version="7.0NG.775-240115" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 263269ff54..2bd0f41438 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 = 'PC240114'; +$build_version = 'PC240115'; $pandora_version = 'v7.0NG.775'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index f4b000af8f..eaf5c72df9 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 bfc425deac..ff30f62af7 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -7,7 +7,7 @@ %define debug_package %{nil} %define name pandorafms_server %define version 7.0NG.775 -%define release 240114 +%define release 240115 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 6a06291b07..9837a79873 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.775 -%define release 240114 +%define release 240115 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 10028244f5..35a8e340a1 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240114" +PI_BUILD="240115" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 1a99a07347..3a0c624602 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -38,7 +38,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.775 Build 240114"; +my $version = "7.0NG.775 Build 240115"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index acea515547..44d8cd6d1e 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.775 Build 240114"; +my $version = "7.0NG.775 Build 240115"; # save program name for logging my $progname = basename($0); From 0b18397095782751b4162bf3c79e3bcd4c188d28 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Mon, 15 Jan 2024 09:19:37 +0100 Subject: [PATCH 111/170] #12503 fixed empty all_ip in create agent --- pandora_console/godmode/agentes/agent_manager.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/godmode/agentes/agent_manager.php b/pandora_console/godmode/agentes/agent_manager.php index 09c6ea3939..d0c255e25e 100644 --- a/pandora_console/godmode/agentes/agent_manager.php +++ b/pandora_console/godmode/agentes/agent_manager.php @@ -1513,7 +1513,7 @@ ui_require_jquery_file('bgiframe'); function check_unique_ip() { const direccion = $('#text-direccion').val(); let ip_all = ; - if (!ip_all) { + if (ip_all) { ip_all = Object.keys(ip_all); } $.ajax({ From ed165423fd6f115172f01a2c3b9527d85c17b32a Mon Sep 17 00:00:00 2001 From: Jonathan Date: Mon, 15 Jan 2024 09:38:29 +0100 Subject: [PATCH 112/170] #12725 add quiet agent tree view --- pandora_console/include/class/Tree.class.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pandora_console/include/class/Tree.class.php b/pandora_console/include/class/Tree.class.php index 99b4f5b039..ed515dee87 100644 --- a/pandora_console/include/class/Tree.class.php +++ b/pandora_console/include/class/Tree.class.php @@ -995,6 +995,11 @@ class Tree } } } + + // Quiet name on agent. + if (isset($agent['quiet']) && $agent['quiet']) { + $agent['alias'] .= ' '.__('(Quiet)'); + } } From 43b8db9c8419ec6e6fa9dac94a03ffddde0fe270 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Mon, 15 Jan 2024 10:15:46 +0100 Subject: [PATCH 113/170] #12156 also mail added notification on create --- .../include/functions_notifications.php | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/pandora_console/include/functions_notifications.php b/pandora_console/include/functions_notifications.php index 9e7db33bae..78b5facde4 100644 --- a/pandora_console/include/functions_notifications.php +++ b/pandora_console/include/functions_notifications.php @@ -684,18 +684,20 @@ function notifications_set_user_label_status($source, $user, $label, $value) 'id_user' => $user, 'id_source' => $source, 'enabled' => '1', + 'also_mail' => '1', + ] + ); + return true; + } else { + return (bool) db_process_sql_update( + 'tnotification_source_user', + [$label => $value], + [ + 'id_user' => $user, + 'id_source' => $source, ] ); } - - return (bool) db_process_sql_update( - 'tnotification_source_user', - [$label => $value], - [ - 'id_user' => $user, - 'id_source' => $source, - ] - ); } From 31acb0964a8a42ebf7b32d9b635818bc88cd6b7e Mon Sep 17 00:00:00 2001 From: Daniel Maya Date: Mon, 15 Jan 2024 11:18:31 +0100 Subject: [PATCH 114/170] #12026 Fixed configuration --- pandora_console/include/lib/Dashboard/Widgets/inventory.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/pandora_console/include/lib/Dashboard/Widgets/inventory.php b/pandora_console/include/lib/Dashboard/Widgets/inventory.php index 8424d6cfbf..657e67828e 100644 --- a/pandora_console/include/lib/Dashboard/Widgets/inventory.php +++ b/pandora_console/include/lib/Dashboard/Widgets/inventory.php @@ -177,10 +177,7 @@ class InventoryWidget extends Widget // Must be configured before using. $this->configurationRequired = false; - if (isset($this->values['inventoryModuleId']) - && $this->values['inventoryModuleId'] === 'basic' - && $this->values['agentId'] === 0 - ) { + if (isset($this->values['idGroup']) === false) { $this->configurationRequired = true; } } From 87e17be08484bfaa1fd74a28bd6232ee9243c5ee Mon Sep 17 00:00:00 2001 From: Jonathan Date: Mon, 15 Jan 2024 12:38:42 +0100 Subject: [PATCH 115/170] #12156 fix error on update when empty db values --- pandora_console/include/functions_notifications.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pandora_console/include/functions_notifications.php b/pandora_console/include/functions_notifications.php index 78b5facde4..89027fbf81 100644 --- a/pandora_console/include/functions_notifications.php +++ b/pandora_console/include/functions_notifications.php @@ -677,6 +677,12 @@ function notifications_set_user_label_status($source, $user, $label, $value) } $eixsts = db_get_row('tnotification_source_user', 'id_user', $user); + if (empty($eixsts['enabled']) && empty($eixsts['also_mail'])) { + $sql = sprintf('DELETE FROM tnotification_source_user WHERE id_user = "%s" AND id_source = "%s"', $user, $source); + db_process_sql($sql); + $eixsts = false; + } + if ($eixsts === false) { db_process_sql_insert( 'tnotification_source_user', From d34bd3f22334d7bd761555b63f769a3edeb11534 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Mon, 15 Jan 2024 13:26:28 +0100 Subject: [PATCH 116/170] #12156 fix sql error check exists --- pandora_console/include/functions_notifications.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pandora_console/include/functions_notifications.php b/pandora_console/include/functions_notifications.php index 89027fbf81..e59208f8ef 100644 --- a/pandora_console/include/functions_notifications.php +++ b/pandora_console/include/functions_notifications.php @@ -676,14 +676,14 @@ function notifications_set_user_label_status($source, $user, $label, $value) return false; } - $eixsts = db_get_row('tnotification_source_user', 'id_user', $user); - if (empty($eixsts['enabled']) && empty($eixsts['also_mail'])) { + $exists = db_process_sql(sprintf('SELECT * FROM tnotification_source_user WHERE id_user = "%s" AND id_source = "%s"', $user, $source)); + if (empty($exists['enabled']) && empty($exists['also_mail'])) { $sql = sprintf('DELETE FROM tnotification_source_user WHERE id_user = "%s" AND id_source = "%s"', $user, $source); db_process_sql($sql); - $eixsts = false; + $exists = false; } - if ($eixsts === false) { + if ($exists === false) { db_process_sql_insert( 'tnotification_source_user', [ From 234f4d2df1626b0762b46721a33771fb99c2b6c2 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Mon, 15 Jan 2024 14:32:52 +0100 Subject: [PATCH 117/170] #12579 add title on images --- pandora_console/include/class/SatelliteAgent.class.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pandora_console/include/class/SatelliteAgent.class.php b/pandora_console/include/class/SatelliteAgent.class.php index 09b023958d..a40b3ecc7a 100644 --- a/pandora_console/include/class/SatelliteAgent.class.php +++ b/pandora_console/include/class/SatelliteAgent.class.php @@ -395,6 +395,7 @@ class SatelliteAgent extends HTML ($disable === true) ? 'images/lightbulb_off.png' : 'images/lightbulb.png', true, [ + 'title' => ($disable === true) ? __('Enable') : __('Disable'), 'border' => '0', 'class' => 'main_menu_icon mrgn_lft_05em invert_filter', 'onclick' => 'disable_agent(\''.$tmp->address.'\',\''.strip_tags($tmp->name).'\',\''.(int) $disable.'\',\''.$id_agente.'\')', @@ -413,6 +414,7 @@ class SatelliteAgent extends HTML ($delete === true) ? 'images/add.png' : 'images/delete.svg', true, [ + 'title' => ($delete === true) ? __('Add') : __('Delete'), 'border' => '0', 'class' => 'main_menu_icon mrgn_lft_05em invert_filter', 'onclick' => 'delete_agent(\''.$tmp->address.'\',\''.strip_tags($tmp->name).'\',\''.(int) $delete.'\',\''.$id_agente.'\')', From f52700f3927f0cc156eeba17565549184cc81eac Mon Sep 17 00:00:00 2001 From: "alejandro.campos@artica.es" Date: Mon, 15 Jan 2024 17:42:41 +0100 Subject: [PATCH 118/170] fix home screen --- pandora_console/godmode/users/configure_user.php | 5 +++++ pandora_console/include/auth/mysql.php | 2 -- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/pandora_console/godmode/users/configure_user.php b/pandora_console/godmode/users/configure_user.php index 83e54f24c5..62dc8cba5f 100644 --- a/pandora_console/godmode/users/configure_user.php +++ b/pandora_console/godmode/users/configure_user.php @@ -430,6 +430,11 @@ if ($create_user === true) { $values['data_section'] = get_parameter('data_section_external'); } + if (is_metaconsole() === true) { + $values['metaconsole_section'] = $values['section']; + $values['metaconsole_data_section'] = $values['data_section']; + } + // $values['section'] = $homeScreenValues[$values['section']]; if (enterprise_installed() === true) { $values['force_change_pass'] = 1; diff --git a/pandora_console/include/auth/mysql.php b/pandora_console/include/auth/mysql.php index 76a6458f32..3141272352 100644 --- a/pandora_console/include/auth/mysql.php +++ b/pandora_console/include/auth/mysql.php @@ -816,8 +816,6 @@ function update_user(string $id_user, array $values) $values['metaconsole_data_section'] = $values['data_section']; $values['metaconsole_default_event_filter'] = $values['default_event_filter']; unset($values['id_skin']); - unset($values['section']); - unset($values['data_section']); unset($values['default_event_filter']); } } From a16fa51922b0d9c89b61b49d4cb982e7562b61c7 Mon Sep 17 00:00:00 2001 From: artica Date: Tue, 16 Jan 2024 01:01:13 +0100 Subject: [PATCH 119/170] 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.redhat_bin.el8.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.el9.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.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 +- 28 files changed, 28 insertions(+), 28 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index b4d349663e..21b762f14f 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.775-240115 +Version: 7.0NG.775-240116 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 d692106e65..c4ae8cf158 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.775-240115" +pandora_version="7.0NG.775-240116" 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 1129b081d8..7ad9d405f0 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1039,7 +1039,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.775'; -use constant AGENT_BUILD => '240115'; +use constant AGENT_BUILD => '240116'; # 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 a0106b1960..0857f1abf3 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.775 -%define release 240115 +%define release 240116 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec index d7f30e9b26..cda7476a10 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240115 +%define release 240116 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec index 5249f61928..d2ac511e4f 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240115 +%define release 240116 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.spec b/pandora_agents/unix/pandora_agent.redhat_bin.spec index 9a2de6bd96..c587d0a009 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240115 +%define release 240116 Summary: Pandora FMS Linux agent, binary version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 4c014cff15..30d7832d37 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.775 -%define release 240115 +%define release 240116 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 a2a0c0fe46..ce325c1588 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240115" +PI_BUILD="240116" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 82074313de..d9e6614b68 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{240115} +{240116} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index aeded4b511..8474536663 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.775 Build 240115") +#define PANDORA_VERSION ("7.0NG.775 Build 240116") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index a60563005e..86e2ef3cb2 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Pandora FMS" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.775(Build 240115))" + VALUE "ProductVersion", "(7.0NG.775(Build 240116))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 5542578ce4..2cf46772c3 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.775-240115 +Version: 7.0NG.775-240116 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 b47333a6ce..8f50fbf6bc 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.775-240115" +pandora_version="7.0NG.775-240116" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 2bd0f41438..beb1ea821d 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 = 'PC240115'; +$build_version = 'PC240116'; $pandora_version = 'v7.0NG.775'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index eaf5c72df9..5fd2baf89f 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 ff30f62af7..ea6e695513 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -7,7 +7,7 @@ %define debug_package %{nil} %define name pandorafms_server %define version 7.0NG.775 -%define release 240115 +%define release 240116 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 9837a79873..7761c0355a 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.775 -%define release 240115 +%define release 240116 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 35a8e340a1..4cf0df4e2d 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240115" +PI_BUILD="240116" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 3a0c624602..5dfd0ea207 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -38,7 +38,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.775 Build 240115"; +my $version = "7.0NG.775 Build 240116"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 44d8cd6d1e..c5eff8d892 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.775 Build 240115"; +my $version = "7.0NG.775 Build 240116"; # save program name for logging my $progname = basename($0); From c8a73f59f5026e5ab89f10296e2961108e64fce0 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Tue, 16 Jan 2024 11:53:11 +0100 Subject: [PATCH 120/170] #12569 added audit in discovery and task console --- pandora_console/include/constants.php | 1 + pandora_console/include/functions_cron_task.php | 8 ++++++++ pandora_server/lib/PandoraFMS/DiscoveryServer.pm | 1 + 3 files changed, 10 insertions(+) diff --git a/pandora_console/include/constants.php b/pandora_console/include/constants.php index b2ce8d88b4..d68bba9c22 100644 --- a/pandora_console/include/constants.php +++ b/pandora_console/include/constants.php @@ -819,6 +819,7 @@ define('AUDIT_LOG_INCIDENT_MANAGEMENT', 'Incident management'); define('AUDIT_LOG_UMC', 'Warp Manager'); define('AUDIT_LOG_NMS_VIOLATION', 'NMS Violation'); define('AUDIT_LOG_ENTERPRISE_VIOLATION', 'Enterprise Violation'); +define('AUDIT_LOG_CRON_TASK', 'Cron task'); // MIMEs. define( diff --git a/pandora_console/include/functions_cron_task.php b/pandora_console/include/functions_cron_task.php index 40a6e159cc..c00fd441d8 100644 --- a/pandora_console/include/functions_cron_task.php +++ b/pandora_console/include/functions_cron_task.php @@ -419,6 +419,14 @@ function cron_task_run( WHERE id=".$id_user_task; } + db_pandora_audit( + AUDIT_LOG_CRON_TASK, + 'Executed cron task: '.$task['name'].' #'.$task['id'], + false, + false, + '' + ); + db_process_sql($sql); db_process_sql($sql2); } diff --git a/pandora_server/lib/PandoraFMS/DiscoveryServer.pm b/pandora_server/lib/PandoraFMS/DiscoveryServer.pm index 6c2927f2a6..2df6dd31d0 100644 --- a/pandora_server/lib/PandoraFMS/DiscoveryServer.pm +++ b/pandora_server/lib/PandoraFMS/DiscoveryServer.pm @@ -524,6 +524,7 @@ sub exec_recon_app ($$$) { logger($pa_config, 'Invalid summary for recon app ID ' . $task->{'id_app'}, 10); } else { db_do($dbh, "UPDATE trecon_task SET summary=? WHERE id_rt=?", $summary_json, $task->{'id_rt'}); + pandora_audit ($pa_config, 'Discovery task' . ' Executed task '.$task->{'name'}.'#'.$task->{'id_app'}, 'SYSTEM', 'Discovery task', $dbh); } update_recon_task($dbh, $task->{'id_rt'}, $status); From ce00c4b9e5d9713204da617e0ccd8fbf8adde30d Mon Sep 17 00:00:00 2001 From: Jonathan Date: Tue, 16 Jan 2024 17:17:07 +0100 Subject: [PATCH 121/170] #12696 fix tactical view error 500 and schedule by group --- .../include/lib/TacticalView/elements/Agents.php | 14 +++++++++----- .../include/lib/TacticalView/elements/Groups.php | 3 ++- .../TacticalView/elements/ScheduledDowntime.php | 4 +++- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/pandora_console/include/lib/TacticalView/elements/Agents.php b/pandora_console/include/lib/TacticalView/elements/Agents.php index a0e14313e0..659b9c31d0 100644 --- a/pandora_console/include/lib/TacticalView/elements/Agents.php +++ b/pandora_console/include/lib/TacticalView/elements/Agents.php @@ -436,12 +436,16 @@ class Agents extends Element $percentages = []; $total = array_sum($data); foreach ($data as $key => $value) { - $percentage = (($value / $total) * 100); - if ($percentage < 1 && $percentage > 0) { - $percentage = 1; - } + if ($total > 0) { + $percentage = (($value / $total) * 100); + if ($percentage < 1 && $percentage > 0) { + $percentage = 1; + } - $percentages[$key] = format_numeric($percentage, 0); + $percentages[$key] = format_numeric($percentage, 0); + } else { + $percentages[$key] = '0%'; + } } $data = $percentages; diff --git a/pandora_console/include/lib/TacticalView/elements/Groups.php b/pandora_console/include/lib/TacticalView/elements/Groups.php index 4fe07b743a..c314381b59 100644 --- a/pandora_console/include/lib/TacticalView/elements/Groups.php +++ b/pandora_console/include/lib/TacticalView/elements/Groups.php @@ -113,8 +113,9 @@ class Groups extends Element $id_groups = implode(',', $id_groups); $modules = modules_get_modules_in_group($id_groups); - $total_groups = count($modules); + $total_groups = ($modules !== false) ? count($modules) : 0; if ($total_groups === 0) { + include_once $config['homedir'].'/include/functions_graph.php'; return graph_nodata_image(['width' => '400']); } diff --git a/pandora_console/include/lib/TacticalView/elements/ScheduledDowntime.php b/pandora_console/include/lib/TacticalView/elements/ScheduledDowntime.php index 9e94e17275..563e59b0f2 100644 --- a/pandora_console/include/lib/TacticalView/elements/ScheduledDowntime.php +++ b/pandora_console/include/lib/TacticalView/elements/ScheduledDowntime.php @@ -156,13 +156,15 @@ class ScheduledDowntime extends Element 'cron_interval_from', 'cron_interval_to', ]; - + $groups = implode(',', array_keys(users_get_groups($config['user']))); $columns_str = implode(',', $columns); $sql = sprintf( 'SELECT %s FROM tplanned_downtime + WHERE id_group IN (%s) %s %s', $columns_str, + $groups, $order, $pagination, ); From f33865542ceaca0f3f8b1fd4d50e67a183587b8a Mon Sep 17 00:00:00 2001 From: artica Date: Wed, 17 Jan 2024 01:01:47 +0100 Subject: [PATCH 122/170] 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.redhat_bin.el8.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.el9.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.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 +- 28 files changed, 28 insertions(+), 28 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 21b762f14f..dd03c476be 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.775-240116 +Version: 7.0NG.775-240117 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 c4ae8cf158..cdc539a810 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.775-240116" +pandora_version="7.0NG.775-240117" 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 7ad9d405f0..dec33aa8fc 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1039,7 +1039,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.775'; -use constant AGENT_BUILD => '240116'; +use constant AGENT_BUILD => '240117'; # 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 0857f1abf3..fe4cf2f3c1 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.775 -%define release 240116 +%define release 240117 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec index cda7476a10..5af1c4ece1 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240116 +%define release 240117 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec index d2ac511e4f..7921ccdebb 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240116 +%define release 240117 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.spec b/pandora_agents/unix/pandora_agent.redhat_bin.spec index c587d0a009..22653a0605 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240116 +%define release 240117 Summary: Pandora FMS Linux agent, binary version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 30d7832d37..bedceaaea9 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.775 -%define release 240116 +%define release 240117 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 ce325c1588..83de892a8c 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240116" +PI_BUILD="240117" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index d9e6614b68..b16cef6aab 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{240116} +{240117} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 8474536663..0a285f6560 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.775 Build 240116") +#define PANDORA_VERSION ("7.0NG.775 Build 240117") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 86e2ef3cb2..d3ebaf59be 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Pandora FMS" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.775(Build 240116))" + VALUE "ProductVersion", "(7.0NG.775(Build 240117))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 2cf46772c3..b898706e72 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.775-240116 +Version: 7.0NG.775-240117 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 8f50fbf6bc..d13917196a 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.775-240116" +pandora_version="7.0NG.775-240117" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index beb1ea821d..225c32d614 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 = 'PC240116'; +$build_version = 'PC240117'; $pandora_version = 'v7.0NG.775'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 5fd2baf89f..900e2bef57 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 ea6e695513..6461867d48 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -7,7 +7,7 @@ %define debug_package %{nil} %define name pandorafms_server %define version 7.0NG.775 -%define release 240116 +%define release 240117 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 7761c0355a..c07fdbd3db 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.775 -%define release 240116 +%define release 240117 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 4cf0df4e2d..50ba633f64 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240116" +PI_BUILD="240117" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 5dfd0ea207..0ffa9fb970 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -38,7 +38,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.775 Build 240116"; +my $version = "7.0NG.775 Build 240117"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index c5eff8d892..1a4bf702df 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.775 Build 240116"; +my $version = "7.0NG.775 Build 240117"; # save program name for logging my $progname = basename($0); From d3ca5862b41a17bb09c1acfec48e12887ffead36 Mon Sep 17 00:00:00 2001 From: Calvo Date: Wed, 17 Jan 2024 11:01:25 +0100 Subject: [PATCH 123/170] #12222 Fix timezone offset when modules has timezone data --- pandora_server/lib/PandoraFMS/DataServer.pm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pandora_server/lib/PandoraFMS/DataServer.pm b/pandora_server/lib/PandoraFMS/DataServer.pm index 80e8bb4bd3..7dfee63af3 100644 --- a/pandora_server/lib/PandoraFMS/DataServer.pm +++ b/pandora_server/lib/PandoraFMS/DataServer.pm @@ -627,6 +627,11 @@ sub process_xml_data ($$$$$) { my $module_type = get_tag_value ($module_data, 'type', 'generic_data'); + # Apply timezone offset to module if timestamp is set. + if (defined($module_data->{'timestamp'} && $module_data->{'timestamp'} ne '')) { + $module_data->{'timestamp'} = strftime ("%Y-%m-%d %H:%M:%S", localtime($module_data->{'timestamp'} + ($timezone_offset * 3600))); + } + # Single data if (! defined ($module_data->{'datalist'})) { my $data_timestamp = get_tag_value ($module_data, 'timestamp', $timestamp); From 6e820ab58c2cb759aeaca68259aab6b10912ddcd Mon Sep 17 00:00:00 2001 From: Daniel Maya Date: Wed, 17 Jan 2024 12:07:33 +0100 Subject: [PATCH 124/170] #12364 Added filter css --- pandora_console/include/styles/pandora.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 94d337bdbe..ce3d14c10a 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -767,6 +767,10 @@ select:-internal-list-box { width: 80%; } +.w85p { + width: 85%; +} + .w88p { width: 88%; } From 0efe0041227b49766b1ba4da0d47397d8110b303 Mon Sep 17 00:00:00 2001 From: Daniel Maya Date: Wed, 17 Jan 2024 13:29:21 +0100 Subject: [PATCH 125/170] #12767 Fixed password --- pandora_console/include/styles/pandora.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 94d337bdbe..7c188058f3 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -12076,6 +12076,10 @@ div.relative > div > div#ui-datepicker-div { width: 400px; } +.container-div-input-password { + display: inline !important; +} + #message_dialog_connection { height: auto !important; } From c973d8b2573de5630085d2c4cc829d3bca5f47df Mon Sep 17 00:00:00 2001 From: Jonathan Date: Wed, 17 Jan 2024 14:04:27 +0100 Subject: [PATCH 126/170] #12542 trigger module change --- pandora_console/include/javascript/pandora_modules.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pandora_console/include/javascript/pandora_modules.js b/pandora_console/include/javascript/pandora_modules.js index a126bc36f5..b4445e0877 100644 --- a/pandora_console/include/javascript/pandora_modules.js +++ b/pandora_console/include/javascript/pandora_modules.js @@ -159,9 +159,8 @@ function configure_modules_form() { period_select_update("module_interval", data["module_interval"]); } - $("#id_module_group") - .val(data["id_module_group"]) - .trigger("change"); + $("#id_module_group").val(data["id_module_group"]); + $("#id_module_group").trigger("change"); if (data["history_data"]) $("#checkbox-history_data").check(); else $("#checkbox-history_data").uncheck(); From 0ceb5787170bf28d951d7b161ccb966d1353bdb5 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Wed, 17 Jan 2024 16:48:38 +0100 Subject: [PATCH 127/170] #12522 fixed audit log in setup --- pandora_console/include/functions_config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/include/functions_config.php b/pandora_console/include/functions_config.php index 9eb19be28d..9f4c38aa68 100644 --- a/pandora_console/include/functions_config.php +++ b/pandora_console/include/functions_config.php @@ -117,7 +117,7 @@ function config_update_value($token, $value, $noticed=false, $password=false) return true; } else { // Something in setup changes. - if ($noticed === false) { + if ($noticed === true) { db_pandora_audit( AUDIT_LOG_SETUP, 'Setup has changed', From c7711273714a77494f8e637a5f31e0f4ed659f62 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Wed, 17 Jan 2024 17:45:59 +0100 Subject: [PATCH 128/170] #12745 add id_agent_data ncm MR --- pandora_console/extras/mr/68.sql | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 pandora_console/extras/mr/68.sql diff --git a/pandora_console/extras/mr/68.sql b/pandora_console/extras/mr/68.sql new file mode 100644 index 0000000000..6a3f67b2ab --- /dev/null +++ b/pandora_console/extras/mr/68.sql @@ -0,0 +1,6 @@ +START TRANSACTION; + +ALTER TABLE `tncm_agent_data` +ADD COLUMN `id_agent_data` int not null default 0 AFTER `script_type`; + +COMMIT; \ No newline at end of file From 49f15c354cd42959d64a53079de686288b88a133 Mon Sep 17 00:00:00 2001 From: artica Date: Thu, 18 Jan 2024 01:01:27 +0100 Subject: [PATCH 129/170] 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.redhat_bin.el8.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.el9.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.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 +- 28 files changed, 28 insertions(+), 28 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index dd03c476be..79e7ac2d75 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.775-240117 +Version: 7.0NG.775-240118 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 cdc539a810..c1029f651b 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.775-240117" +pandora_version="7.0NG.775-240118" 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 dec33aa8fc..c4b788fe46 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1039,7 +1039,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.775'; -use constant AGENT_BUILD => '240117'; +use constant AGENT_BUILD => '240118'; # 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 fe4cf2f3c1..03bec971e3 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.775 -%define release 240117 +%define release 240118 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec index 5af1c4ece1..bfcb50e59f 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240117 +%define release 240118 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec index 7921ccdebb..1cf8be22e9 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240117 +%define release 240118 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.spec b/pandora_agents/unix/pandora_agent.redhat_bin.spec index 22653a0605..f16c07fc1e 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240117 +%define release 240118 Summary: Pandora FMS Linux agent, binary version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index bedceaaea9..f6d4e075f5 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.775 -%define release 240117 +%define release 240118 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 83de892a8c..e91df83438 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240117" +PI_BUILD="240118" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index b16cef6aab..a278d97f8d 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{240117} +{240118} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 0a285f6560..34a6dd3be8 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.775 Build 240117") +#define PANDORA_VERSION ("7.0NG.775 Build 240118") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index d3ebaf59be..7763dcb321 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Pandora FMS" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.775(Build 240117))" + VALUE "ProductVersion", "(7.0NG.775(Build 240118))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index b898706e72..bd76e0003c 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.775-240117 +Version: 7.0NG.775-240118 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 d13917196a..81f525de04 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.775-240117" +pandora_version="7.0NG.775-240118" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 225c32d614..d9022d917c 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 = 'PC240117'; +$build_version = 'PC240118'; $pandora_version = 'v7.0NG.775'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 900e2bef57..a085a8636a 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 6461867d48..b41ea2d0a3 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -7,7 +7,7 @@ %define debug_package %{nil} %define name pandorafms_server %define version 7.0NG.775 -%define release 240117 +%define release 240118 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index c07fdbd3db..9a4ede27c7 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.775 -%define release 240117 +%define release 240118 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 50ba633f64..b3d52e02f6 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240117" +PI_BUILD="240118" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 0ffa9fb970..40cf3b54be 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -38,7 +38,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.775 Build 240117"; +my $version = "7.0NG.775 Build 240118"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 1a4bf702df..9f5877ca23 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.775 Build 240117"; +my $version = "7.0NG.775 Build 240118"; # save program name for logging my $progname = basename($0); From ae3c9bc2f52fbe496a5c2ebf98fe0904f49af7ed Mon Sep 17 00:00:00 2001 From: Daniel Maya Date: Thu, 18 Jan 2024 10:28:57 +0100 Subject: [PATCH 130/170] #12754 Fixed status --- pandora_console/include/ajax/module.php | 29 ++++++++++++++----- .../lib/Dashboard/Widgets/ModulesByStatus.php | 14 ++++++++- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/pandora_console/include/ajax/module.php b/pandora_console/include/ajax/module.php index bddf72a217..2a9580a000 100755 --- a/pandora_console/include/ajax/module.php +++ b/pandora_console/include/ajax/module.php @@ -1900,12 +1900,24 @@ if (check_login()) { unset($expl[$exist]); } - array_push($expl, '1', '2'); + array_push($expl, '1', '2', '3', '4', '5'); $status = implode(',', $expl); } - if (empty($status) === false) { + if (str_contains($status, '5') === true) { + $expl = explode(',', $status); + $exist = array_search('5', $expl); + if (isset($exist) === true) { + unset($expl[$exist]); + } + + array_push($expl, '4', '5'); + + $status = implode(',', $expl); + } + + if (empty($status) === false || $status === '0') { $where .= sprintf( ' AND tagente_estado.estado IN (%s) AND tagente_modulo.delete_pending = 0', @@ -2148,24 +2160,25 @@ if (check_login()) { ); switch ((int) $row['estado']) { - case 0: + case AGENT_MODULE_STATUS_NORMAL: $status_img = ui_print_status_image(STATUS_MODULE_OK, __('Normal'), true); break; - case 1: - case 6: + case AGENT_MODULE_STATUS_CRITICAL_BAD: + case AGENT_MODULE_STATUS_NOT_NORMAL: $status_img = ui_print_status_image(STATUS_MODULE_CRITICAL, __('Critical'), true); break; - case 2: + case AGENT_MODULE_STATUS_WARNING: $status_img = ui_print_status_image(STATUS_MODULE_WARNING, __('Warning'), true); break; - case 3: + case AGENT_MODULE_STATUS_UNKNOWN: $status_img = ui_print_status_image(STATUS_MODULE_UNKNOWN, __('Unknown'), true); break; - case 5: + case AGENT_MODULE_STATUS_NO_DATA: + case AGENT_MODULE_STATUS_NOT_INIT: $status_img = ui_print_status_image(STATUS_MODULE_NO_DATA, __('Not init'), true); break; diff --git a/pandora_console/include/lib/Dashboard/Widgets/ModulesByStatus.php b/pandora_console/include/lib/Dashboard/Widgets/ModulesByStatus.php index e490135734..866c14494a 100644 --- a/pandora_console/include/lib/Dashboard/Widgets/ModulesByStatus.php +++ b/pandora_console/include/lib/Dashboard/Widgets/ModulesByStatus.php @@ -523,7 +523,19 @@ class ModulesByStatus extends Widget unset($expl[$exist]); } - array_push($expl, '1', '2'); + array_push($expl, '1', '2', '3', '4', '5'); + + $status = implode(',', $expl); + } + + if (str_contains($status, '5') === true) { + $expl = explode(',', $status); + $exist = array_search('5', $expl); + if (isset($exist) === true) { + unset($expl[$exist]); + } + + array_push($expl, '4', '5'); $status = implode(',', $expl); } From 4ce970eab1d69cf342d189e28f4069923b13faf1 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Thu, 18 Jan 2024 11:26:38 +0100 Subject: [PATCH 131/170] #12539 fix dialog --- pandora_console/include/styles/pandora.css | 4 ++++ pandora_console/operation/agentes/alerts_status.php | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 94d337bdbe..13301116dd 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -979,6 +979,10 @@ select:-internal-list-box { display: flex; } +.flex_important { + display: flex !important; +} + .flex-row-important { display: flex !important; flex-direction: row !important; diff --git a/pandora_console/operation/agentes/alerts_status.php b/pandora_console/operation/agentes/alerts_status.php index 36cf0d8404..a4f7c7d81c 100755 --- a/pandora_console/operation/agentes/alerts_status.php +++ b/pandora_console/operation/agentes/alerts_status.php @@ -548,7 +548,7 @@ if (is_array($modules_agent)) { } } -echo ''; +echo '
'.__('Your system has a much higher rate of modules per agent than recommended (200 modules per agent). This implies performance problems in the system, please consider reducing the number of modules in this agent.').'
'; ?> @@ -644,7 +644,7 @@ $('table.alert-status-filter #ag_group').change (function () { closeOnEscape: false, open: function(event, ui) { $(".ui-dialog-titlebar-close").hide(); - $("#system_higher").removeClass('invisible'); + $("#system_higher").removeClass('invisible_important'); setTimeout(() => { $(".ui-dialog-buttonset").find('button').removeClass('invisible_important'); }, 4000); From f34b9c2a7e6d67b529a5a8ca0460120bd41b6292 Mon Sep 17 00:00:00 2001 From: alejandro Date: Thu, 18 Jan 2024 14:01:15 +0100 Subject: [PATCH 132/170] mr changes --- pandora_console/extras/mr/68.sql | 7 +++++++ pandora_console/pandoradb_data.sql | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 pandora_console/extras/mr/68.sql diff --git a/pandora_console/extras/mr/68.sql b/pandora_console/extras/mr/68.sql new file mode 100644 index 0000000000..cbd84a03cb --- /dev/null +++ b/pandora_console/extras/mr/68.sql @@ -0,0 +1,7 @@ +START TRANSACTION; + +-- Update version for plugin oracle +UPDATE `tdiscovery_apps` SET `version` = '1.2' WHERE `short_name` = 'pandorafms.oracle'; + +COMMIT; + diff --git a/pandora_console/pandoradb_data.sql b/pandora_console/pandoradb_data.sql index 19e3c16aa9..8fc17246d5 100644 --- a/pandora_console/pandoradb_data.sql +++ b/pandora_console/pandoradb_data.sql @@ -2913,7 +2913,7 @@ SET @short_name = 'pandorafms.oracle'; SET @name = 'Oracle'; SET @section = 'app'; SET @description = 'Monitor Oracle databases'; -SET @version = '1.1'; +SET @version = '1.2'; INSERT IGNORE INTO `tdiscovery_apps` (`id_app`, `short_name`, `name`, `section`, `description`, `version`) VALUES ('', @short_name, @name, @section, @description, @version); SELECT @id_app := `id_app` FROM `tdiscovery_apps` WHERE `short_name` = @short_name; From 3839de6f6d2f53d4276bd5166c1215b87cb32218 Mon Sep 17 00:00:00 2001 From: alejandro Date: Thu, 18 Jan 2024 14:18:09 +0100 Subject: [PATCH 133/170] update hash oracle in migratecodes.ini --- .../extras/discovery/DiscoveryApplicationsMigrateCodes.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandora_console/extras/discovery/DiscoveryApplicationsMigrateCodes.ini b/pandora_console/extras/discovery/DiscoveryApplicationsMigrateCodes.ini index c0cee7d03f..d05611a6b5 100644 --- a/pandora_console/extras/discovery/DiscoveryApplicationsMigrateCodes.ini +++ b/pandora_console/extras/discovery/DiscoveryApplicationsMigrateCodes.ini @@ -1,11 +1,11 @@ pandorafms.vmware=248788e0fb2cd4e11623e4a52ee7d05b pandorafms.mysql=fadb4750d18285c0eca34f47c6aa3cfe pandorafms.mssql=1cc215409741d19080269ffba112810e -pandorafms.oracle=2d9320a514d1e48a0b2804e1653c31c6 +pandorafms.oracle=abdfd7280f76276f696115cabdac731e pandorafms.db2=122f2abff0ec1d668c35ee0911483021 pandorafms.sap.deset=9bb72b7f7497a8b543f25cd71f96878f pandorafms.gcp.ce=6743d39452f8e1ad85d0d56a30843973 pandorafms.aws.ec2=07416081f11d92a7d5d9441dabb5c5cb pandorafms.aws.s3=eff053a212ea112e2a37efd9debbe6a0 pandorafms.aws.rds=47d7b02019329e1698f96db4959f9516 -pandorafms.azure.mc=04a1072d1ece8583645ad88204fbeed3 \ No newline at end of file +pandorafms.azure.mc=04a1072d1ece8583645ad88204fbeed3 From 01049303d998530a03dc71ce8ec2150648541053 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Thu, 18 Jan 2024 16:22:44 +0100 Subject: [PATCH 134/170] #12202 remove loadModal not defined function --- pandora_console/include/javascript/pandora_events.js | 1 - 1 file changed, 1 deletion(-) diff --git a/pandora_console/include/javascript/pandora_events.js b/pandora_console/include/javascript/pandora_events.js index bd6f255a85..936c4a0cfb 100644 --- a/pandora_console/include/javascript/pandora_events.js +++ b/pandora_console/include/javascript/pandora_events.js @@ -1783,7 +1783,6 @@ function openEvents(severity) { $('input[name="filter[severity]"]').val(severity); $("#event_redirect").submit(); } -window.onload = loadModal; // Load Asteroids game. $(window).on("load", function() { From 2400c110b11b70c403174a4bf5c1ebbfd05f5148 Mon Sep 17 00:00:00 2001 From: artica Date: Fri, 19 Jan 2024 01:01:35 +0100 Subject: [PATCH 135/170] 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.redhat_bin.el8.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.el9.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.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 | 4 ++-- 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 +- 28 files changed, 29 insertions(+), 29 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 79e7ac2d75..29054e9598 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.775-240118 +Version: 7.0NG.775-240119 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 c1029f651b..5c84c36bc8 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.775-240118" +pandora_version="7.0NG.775-240119" 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 c4b788fe46..e14d1810ae 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1039,7 +1039,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.775'; -use constant AGENT_BUILD => '240118'; +use constant AGENT_BUILD => '240119'; # 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 03bec971e3..1876217583 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.775 -%define release 240118 +%define release 240119 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec index bfcb50e59f..cf03ff4fc1 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240118 +%define release 240119 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec index 1cf8be22e9..02ccbcb2f2 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240118 +%define release 240119 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.spec b/pandora_agents/unix/pandora_agent.redhat_bin.spec index f16c07fc1e..0ec826977e 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240118 +%define release 240119 Summary: Pandora FMS Linux agent, binary version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index f6d4e075f5..e71e28d915 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.775 -%define release 240118 +%define release 240119 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 e91df83438..fa69febd2f 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240118" +PI_BUILD="240119" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index a278d97f8d..b7e5685ffd 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{240118} +{240119} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 34a6dd3be8..ad5dd5bc83 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.775 Build 240118") +#define PANDORA_VERSION ("7.0NG.775 Build 240119") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 7763dcb321..11e08a1b22 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Pandora FMS" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.775(Build 240118))" + VALUE "ProductVersion", "(7.0NG.775(Build 240119))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index bd76e0003c..c91dd82f91 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.775-240118 +Version: 7.0NG.775-240119 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 81f525de04..509defd0a7 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.775-240118" +pandora_version="7.0NG.775-240119" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index d9022d917c..32c20bf48c 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 = 'PC240118'; +$build_version = 'PC240119'; $pandora_version = 'v7.0NG.775'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 91de00f8a8..0dc5fe233f 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -130,8 +130,8 @@
[ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index b41ea2d0a3..aaa11cd9d1 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -7,7 +7,7 @@ %define debug_package %{nil} %define name pandorafms_server %define version 7.0NG.775 -%define release 240118 +%define release 240119 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 9a4ede27c7..cc280a9d3c 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.775 -%define release 240118 +%define release 240119 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index b3d52e02f6..dcb9bf7a41 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240118" +PI_BUILD="240119" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 40cf3b54be..662d00deac 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -38,7 +38,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.775 Build 240118"; +my $version = "7.0NG.775 Build 240119"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 9f5877ca23..93f1070cc2 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.775 Build 240118"; +my $version = "7.0NG.775 Build 240119"; # save program name for logging my $progname = basename($0); From ae9b786dd5552a26efc6c4fd754fd74c847acdd0 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Fri, 19 Jan 2024 09:21:57 +0100 Subject: [PATCH 136/170] #12752 fixed sql injection --- pandora_console/extensions/grafana/index.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pandora_console/extensions/grafana/index.php b/pandora_console/extensions/grafana/index.php index e925e56233..b9686ff3bd 100644 --- a/pandora_console/extensions/grafana/index.php +++ b/pandora_console/extensions/grafana/index.php @@ -23,7 +23,10 @@ if ($headers['X-DS-Authorization']) { list($user, $password) = explode(':', base64_decode($headers['X-DS-Authorization'])); - // Check user login + // Prevent sql injection. + $user = mysqli_real_escape_string($config['dbconnection'], $user); + + // Check user login. $user_in_db = process_user_login($user, $password, true); if ($user_in_db !== false) { From a41d2214e6343e6d44081e35213b724356be689e Mon Sep 17 00:00:00 2001 From: Daniel Maya Date: Fri, 19 Jan 2024 09:33:53 +0100 Subject: [PATCH 137/170] #12767 Fixed password 2 --- 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 7c188058f3..526a6b73f8 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -11843,7 +11843,7 @@ p.trademark-copyright { } .show-hide-pass { - position: fixed; + position: absolute; border: 0; outline: none; margin-left: -50px; @@ -12077,7 +12077,7 @@ div.relative > div > div#ui-datepicker-div { } .container-div-input-password { - display: inline !important; + display: block !important; } #message_dialog_connection { From d36ec9a8c059f230108380862b6b40f8e4980ae7 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Fri, 19 Jan 2024 10:18:38 +0100 Subject: [PATCH 138/170] #12693 add filter id_agente --- pandora_console/godmode/agentes/inventory_manager.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/pandora_console/godmode/agentes/inventory_manager.php b/pandora_console/godmode/agentes/inventory_manager.php index 3f27c3a6b3..d989b7d560 100644 --- a/pandora_console/godmode/agentes/inventory_manager.php +++ b/pandora_console/godmode/agentes/inventory_manager.php @@ -131,9 +131,13 @@ if ($add_inventory_module) { } } -// Load inventory module data for updating +// Load inventory module data for updating. if ($load_inventory_module) { - $sql = 'SELECT * FROM tagent_module_inventory WHERE id_module_inventory = '.$load_inventory_module; + $sql = sprintf( + 'SELECT * FROM tagent_module_inventory WHERE id_module_inventory = %s AND id_agente = %d', + $load_inventory_module, + $id_agente + ); $row = db_get_row_sql($sql); if (!empty($row)) { From 5ece13fc9f6498537c624f5da33cfe937356c183 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Fri, 19 Jan 2024 14:05:20 +0100 Subject: [PATCH 139/170] #11086 fixed acl in extensions view --- pandora_console/godmode/extensions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/godmode/extensions.php b/pandora_console/godmode/extensions.php index 5ec67b09a7..3ff09273c6 100644 --- a/pandora_console/godmode/extensions.php +++ b/pandora_console/godmode/extensions.php @@ -15,7 +15,7 @@ check_login(); global $config; -if (! check_acl($config['id_user'], 0, 'PM')) { +if (users_is_admin($config['id_user']) === false) { db_pandora_audit( AUDIT_LOG_ACL_VIOLATION, 'Trying to access extensions list' From f67c9185f85cca7ad35255cfff6dbe78347926f9 Mon Sep 17 00:00:00 2001 From: artica Date: Sat, 20 Jan 2024 01:00:29 +0100 Subject: [PATCH 140/170] 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.redhat_bin.el8.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.el9.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.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 +- 28 files changed, 28 insertions(+), 28 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 29054e9598..f74f69aefc 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.775-240119 +Version: 7.0NG.775-240120 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 5c84c36bc8..fcd7dc31ce 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.775-240119" +pandora_version="7.0NG.775-240120" 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 e14d1810ae..ec7e9e8549 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1039,7 +1039,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.775'; -use constant AGENT_BUILD => '240119'; +use constant AGENT_BUILD => '240120'; # 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 1876217583..279a77050c 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.775 -%define release 240119 +%define release 240120 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec index cf03ff4fc1..b17787c24c 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240119 +%define release 240120 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec index 02ccbcb2f2..39178ce6e6 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240119 +%define release 240120 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.spec b/pandora_agents/unix/pandora_agent.redhat_bin.spec index 0ec826977e..d592bcee1c 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240119 +%define release 240120 Summary: Pandora FMS Linux agent, binary version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index e71e28d915..2a27478197 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.775 -%define release 240119 +%define release 240120 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 fa69febd2f..711f6bd311 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240119" +PI_BUILD="240120" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index b7e5685ffd..790042c937 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{240119} +{240120} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index ad5dd5bc83..ef7ee2a347 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.775 Build 240119") +#define PANDORA_VERSION ("7.0NG.775 Build 240120") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 11e08a1b22..8edb5e8ba4 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Pandora FMS" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.775(Build 240119))" + VALUE "ProductVersion", "(7.0NG.775(Build 240120))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index c91dd82f91..c2719503f0 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.775-240119 +Version: 7.0NG.775-240120 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 509defd0a7..0043624546 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.775-240119" +pandora_version="7.0NG.775-240120" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 32c20bf48c..90814f1315 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 = 'PC240119'; +$build_version = 'PC240120'; $pandora_version = 'v7.0NG.775'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 0dc5fe233f..e99a43cc9e 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 aaa11cd9d1..7c88c2dd94 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -7,7 +7,7 @@ %define debug_package %{nil} %define name pandorafms_server %define version 7.0NG.775 -%define release 240119 +%define release 240120 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index cc280a9d3c..dd26e03e12 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.775 -%define release 240119 +%define release 240120 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index dcb9bf7a41..118ad7eb87 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240119" +PI_BUILD="240120" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 662d00deac..dee61061c0 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -38,7 +38,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.775 Build 240119"; +my $version = "7.0NG.775 Build 240120"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index dfa6b177fc..077a00c5e5 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.775 Build 240119"; +my $version = "7.0NG.775 Build 240120"; # save program name for logging my $progname = basename($0); From 91e072e3841955547f31828f130dc4c3ac9f385f Mon Sep 17 00:00:00 2001 From: artica Date: Sun, 21 Jan 2024 01:00:15 +0100 Subject: [PATCH 141/170] 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.redhat_bin.el8.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.el9.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.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 +- 28 files changed, 28 insertions(+), 28 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index f74f69aefc..1ea69b853f 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.775-240120 +Version: 7.0NG.775-240121 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 fcd7dc31ce..7fbb790c17 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.775-240120" +pandora_version="7.0NG.775-240121" 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 ec7e9e8549..34f55f521d 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1039,7 +1039,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.775'; -use constant AGENT_BUILD => '240120'; +use constant AGENT_BUILD => '240121'; # 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 279a77050c..b9130fcb57 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.775 -%define release 240120 +%define release 240121 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec index b17787c24c..31c58c7e85 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240120 +%define release 240121 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec index 39178ce6e6..2a47bd5bb8 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240120 +%define release 240121 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.spec b/pandora_agents/unix/pandora_agent.redhat_bin.spec index d592bcee1c..41cb7a0bd5 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240120 +%define release 240121 Summary: Pandora FMS Linux agent, binary version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 2a27478197..fdae7477de 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.775 -%define release 240120 +%define release 240121 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 711f6bd311..548e9b4569 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240120" +PI_BUILD="240121" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 790042c937..08d8b1c84d 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{240120} +{240121} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index ef7ee2a347..91e241d0a6 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.775 Build 240120") +#define PANDORA_VERSION ("7.0NG.775 Build 240121") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 8edb5e8ba4..8d9f2013bd 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Pandora FMS" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.775(Build 240120))" + VALUE "ProductVersion", "(7.0NG.775(Build 240121))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index c2719503f0..178417add9 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.775-240120 +Version: 7.0NG.775-240121 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 0043624546..e5ca9bb30c 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.775-240120" +pandora_version="7.0NG.775-240121" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 90814f1315..8d2d151608 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 = 'PC240120'; +$build_version = 'PC240121'; $pandora_version = 'v7.0NG.775'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index e99a43cc9e..b8644e99b7 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 7c88c2dd94..b186288101 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -7,7 +7,7 @@ %define debug_package %{nil} %define name pandorafms_server %define version 7.0NG.775 -%define release 240120 +%define release 240121 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index dd26e03e12..25f0973f84 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.775 -%define release 240120 +%define release 240121 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 118ad7eb87..827ad11c13 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240120" +PI_BUILD="240121" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index dee61061c0..f5e30b7321 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -38,7 +38,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.775 Build 240120"; +my $version = "7.0NG.775 Build 240121"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 077a00c5e5..e58604914d 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.775 Build 240120"; +my $version = "7.0NG.775 Build 240121"; # save program name for logging my $progname = basename($0); From 895684238e01f386547cb622604aadd47fd905b9 Mon Sep 17 00:00:00 2001 From: artica Date: Mon, 22 Jan 2024 01:00:15 +0100 Subject: [PATCH 142/170] 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.redhat_bin.el8.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.el9.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.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 +- 28 files changed, 28 insertions(+), 28 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 1ea69b853f..4fd5136eee 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.775-240121 +Version: 7.0NG.775-240122 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 7fbb790c17..a84d1c1048 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.775-240121" +pandora_version="7.0NG.775-240122" 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 34f55f521d..1bdfa2c98d 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1039,7 +1039,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.775'; -use constant AGENT_BUILD => '240121'; +use constant AGENT_BUILD => '240122'; # 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 b9130fcb57..9d6bcf8f51 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.775 -%define release 240121 +%define release 240122 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec index 31c58c7e85..5b9e48578d 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240121 +%define release 240122 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec index 2a47bd5bb8..8ed84f4eb2 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240121 +%define release 240122 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.spec b/pandora_agents/unix/pandora_agent.redhat_bin.spec index 41cb7a0bd5..e1ac0c3dd6 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240121 +%define release 240122 Summary: Pandora FMS Linux agent, binary version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index fdae7477de..710699686d 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.775 -%define release 240121 +%define release 240122 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 548e9b4569..54a64fa46d 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240121" +PI_BUILD="240122" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 08d8b1c84d..efc085bfe6 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{240121} +{240122} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 91e241d0a6..2a05f4e9ce 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.775 Build 240121") +#define PANDORA_VERSION ("7.0NG.775 Build 240122") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 8d9f2013bd..7600b129ae 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Pandora FMS" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.775(Build 240121))" + VALUE "ProductVersion", "(7.0NG.775(Build 240122))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 178417add9..6ba70f63f8 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.775-240121 +Version: 7.0NG.775-240122 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 e5ca9bb30c..69659ab510 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.775-240121" +pandora_version="7.0NG.775-240122" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 8d2d151608..68a52be97d 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 = 'PC240121'; +$build_version = 'PC240122'; $pandora_version = 'v7.0NG.775'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index b8644e99b7..a5765f9bb2 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 b186288101..c74934e734 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -7,7 +7,7 @@ %define debug_package %{nil} %define name pandorafms_server %define version 7.0NG.775 -%define release 240121 +%define release 240122 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 25f0973f84..dc859972e9 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.775 -%define release 240121 +%define release 240122 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 827ad11c13..18312cc95f 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240121" +PI_BUILD="240122" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index f5e30b7321..9c9ad0d5a0 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -38,7 +38,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.775 Build 240121"; +my $version = "7.0NG.775 Build 240122"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index e58604914d..63b39f7771 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.775 Build 240121"; +my $version = "7.0NG.775 Build 240122"; # save program name for logging my $progname = basename($0); From f43279acc35e6ff075586e0ef261b79f1bbbcbb6 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Mon, 22 Jan 2024 09:27:02 +0100 Subject: [PATCH 143/170] #12777 qr name remove entities --- pandora_console/godmode/users/user_management.php | 2 +- pandora_console/include/javascript/qrcode.js | 15 ++------------- 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/pandora_console/godmode/users/user_management.php b/pandora_console/godmode/users/user_management.php index 7a5abb8503..4fa30a253e 100644 --- a/pandora_console/godmode/users/user_management.php +++ b/pandora_console/godmode/users/user_management.php @@ -985,7 +985,7 @@ html_print_table($userManagementTable); $vcard_data = []; $vcard_data['version'] = '3.0'; -$vcard_data['firstName'] = $user_info['fullname']; +$vcard_data['firstName'] = io_safe_output($user_info['fullname']); $vcard_data['lastName'] = ''; $vcard_data['middleName'] = ''; $vcard_data['workPhone'] = $user_info['phone']; diff --git a/pandora_console/include/javascript/qrcode.js b/pandora_console/include/javascript/qrcode.js index 4f664b4659..33f38e1b6f 100644 --- a/pandora_console/include/javascript/qrcode.js +++ b/pandora_console/include/javascript/qrcode.js @@ -2413,22 +2413,11 @@ date: 2018-05-14 15:05:04 }); } + console.log(vCard); formattedVCardString += "FN" + encodingPrefix + ":" + e(formattedName) + nl(); formattedVCardString += - "N" + - encodingPrefix + - ":" + - e(vCard.lastName) + - ";" + - e(vCard.firstName) + - ";" + - e(vCard.middleName) + - ";" + - e(vCard.namePrefix) + - ";" + - e(vCard.nameSuffix) + - nl(); + "N" + encodingPrefix + ":" + e(vCard.firstName) + nl(); if (vCard.nickname && majorVersion >= 3) { formattedVCardString += From 740c0adc9cb6bb38cf256845b226fd9f3b9659f7 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Mon, 22 Jan 2024 10:15:31 +0100 Subject: [PATCH 144/170] #12778 add sections hack --- pandora_console/include/functions_menu.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pandora_console/include/functions_menu.php b/pandora_console/include/functions_menu.php index 4e99e858fb..ca67825da1 100644 --- a/pandora_console/include/functions_menu.php +++ b/pandora_console/include/functions_menu.php @@ -153,6 +153,12 @@ function menu_print_menu(&$menu) if (empty($operation) === false) { $sec2 = $sec2.'&operation='.$operation; } + } else if ($sec2 === 'godmode/users/configure_user') { + $sec2 = 'godmode/users/user_list'; + } else if ($sec2 === 'godmode/groups/configure_group') { + $sec2 = 'godmode/groups/group_list'; + } else if ($sec2 === 'godmode/users/configure_profile') { + $sec2 = 'godmode/users/profile_list'; } else { $sec2 = (string) get_parameter('sec2'); } From d85a488cb077bdae561cfe746f51cd2c5e6b6e06 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Mon, 22 Jan 2024 10:37:03 +0100 Subject: [PATCH 145/170] #12538 new notifications in console supervisor --- .../include/class/ConsoleSupervisor.php | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/pandora_console/include/class/ConsoleSupervisor.php b/pandora_console/include/class/ConsoleSupervisor.php index 1b1d06d8b9..668ace85c5 100644 --- a/pandora_console/include/class/ConsoleSupervisor.php +++ b/pandora_console/include/class/ConsoleSupervisor.php @@ -301,6 +301,18 @@ class ConsoleSupervisor */ $this->checkLogAlerts(); + + /* + * Check total modules in system + */ + + $this->checkTotalModules(); + + /* + * Check total modules by agent + */ + + $this->checkTotalModulesByAgent(); } @@ -591,8 +603,21 @@ class ConsoleSupervisor * Check MYSQL Support Version * */ + $this->checkMYSQLSettings(); + /* + * Check total modules in system + */ + + $this->checkTotalModules(); + + /* + * Check total modules by agent + */ + + $this->checkTotalModulesByAgent(); + } @@ -3199,4 +3224,63 @@ class ConsoleSupervisor } + /** + * Check if the total number of modules in Pandora is greater than 80000. + * + * @return void + */ + public function checkTotalModules() + { + $total_modules = db_get_num_rows('select * from tagente_modulo'); + if ($total_modules > 80000) { + $this->notify( + [ + 'type' => 'NOTIF.MODULES.ALERT', + 'title' => __('Your system has a total of %s modules', $total_modules), + 'message' => __('This is higher than the recommended maximum 80,000 modules per node. This may result in poor performance of your system.'), + 'icon_notification' => self::ICON_HEADSUP, + ] + ); + } else { + $this->cleanNotifications('NOTIF.MODULES.ALERT'); + } + } + + + /** + * Check if the total number of modules by agent is greater than 200 + * + * @return void + */ + public function checkTotalModulesByAgent() + { + $modules_by_agent = db_process_sql( + 'SELECT count(*) AS modules_by_agent + FROM tagente a + LEFT JOIN tagente_modulo m ON a.id_agente = m.id_agente + GROUP BY m.id_agente' + ); + + $show_warning = false; + foreach ($modules_by_agent as $key => $total_modules) { + if ($total_modules['modules_by_agent'] > 200) { + $this->notify( + [ + 'type' => 'NOTIF.MODULES_AGENT.ALERT', + 'title' => __('Your system has an average of %s modules per agent', $total_modules['modules_by_agent']), + 'message' => __('This is higher than the recommended maximum (200). This may result in poor performance of your system.'), + 'icon_notification' => self::ICON_HEADSUP, + ] + ); + $show_warning = true; + break; + } + } + + if ($show_warning === false) { + $this->cleanNotifications('NOTIF.MODULES_AGENT.ALERT'); + } + } + + } From a9c16e1f69d0938874d29cc7a01d062467658788 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Mon, 22 Jan 2024 10:55:37 +0100 Subject: [PATCH 146/170] #12538 added url in new notificacions --- pandora_console/include/class/ConsoleSupervisor.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pandora_console/include/class/ConsoleSupervisor.php b/pandora_console/include/class/ConsoleSupervisor.php index 668ace85c5..9ae7b09921 100644 --- a/pandora_console/include/class/ConsoleSupervisor.php +++ b/pandora_console/include/class/ConsoleSupervisor.php @@ -3239,6 +3239,7 @@ class ConsoleSupervisor 'title' => __('Your system has a total of %s modules', $total_modules), 'message' => __('This is higher than the recommended maximum 80,000 modules per node. This may result in poor performance of your system.'), 'icon_notification' => self::ICON_HEADSUP, + 'url' => '__url__index.php?sec=gagente&sec2=godmode/agentes/modificar_agente', ] ); } else { @@ -3270,6 +3271,7 @@ class ConsoleSupervisor 'title' => __('Your system has an average of %s modules per agent', $total_modules['modules_by_agent']), 'message' => __('This is higher than the recommended maximum (200). This may result in poor performance of your system.'), 'icon_notification' => self::ICON_HEADSUP, + 'url' => '__url__index.php?sec=gagente&sec2=godmode/agentes/modificar_agente', ] ); $show_warning = true; From 5d5bfc654dfaad238c62540ba0819fef810e8f86 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Mon, 22 Jan 2024 12:39:43 +0100 Subject: [PATCH 147/170] #12753 fixed os command injection --- pandora_console/include/ajax/events.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pandora_console/include/ajax/events.php b/pandora_console/include/ajax/events.php index 007ba77d89..851a22040b 100644 --- a/pandora_console/include/ajax/events.php +++ b/pandora_console/include/ajax/events.php @@ -1335,6 +1335,15 @@ if ($perform_event_response === true) { } $command = $event_response['target']; + + // Prevent OS command injection. + $prev_command = get_events_get_response_target($event_id, $event_response, $server_id); + + if ($command !== $prev_command) { + echo __('unauthorized'); + return; + } + $command_timeout = ($event_response !== false) ? $event_response['command_timeout'] : 90; if (enterprise_installed() === true) { if ($event_response !== false From 82c8d519b47a50a69bd65b77345a8035ebf828f6 Mon Sep 17 00:00:00 2001 From: alejandro Date: Mon, 22 Jan 2024 13:25:43 +0100 Subject: [PATCH 148/170] update grafana extension --- pandora_console/extensions/grafana/index.php | 2 +- pandora_console/extensions/grafana/query.php | 4 ++-- pandora_console/extensions/grafana/search.php | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pandora_console/extensions/grafana/index.php b/pandora_console/extensions/grafana/index.php index e925e56233..d46b60d59c 100644 --- a/pandora_console/extensions/grafana/index.php +++ b/pandora_console/extensions/grafana/index.php @@ -3,7 +3,7 @@ // Allow Grafana proxy header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: GET, POST, OPTIONS'); -header('Access-Control-Allow-Headers: Origin, Content-Type, Accept, X-Grafana-Org-Id, X-Grafana-NoCache, X-DS-Authorization'); +header('Access-Control-Allow-Headers: Origin, Content-Type, Accept, X-Grafana-Org-Id, X-Grafana-NoCache, X-DS-Authorization, Authorization'); // Get all request headers $headers = apache_request_headers(); diff --git a/pandora_console/extensions/grafana/query.php b/pandora_console/extensions/grafana/query.php index c5812a32c9..3c7a843542 100644 --- a/pandora_console/extensions/grafana/query.php +++ b/pandora_console/extensions/grafana/query.php @@ -2,7 +2,7 @@ // Allow Grafana proxy. header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: GET, POST, OPTIONS'); -header('Access-Control-Allow-Headers: Origin, Content-Type, Accept, X-Grafana-Org-Id, X-Grafana-NoCache, X-DS-Authorization'); +header('Access-Control-Allow-Headers: Origin, Content-Type, Accept, X-Grafana-Org-Id, X-Grafana-NoCache, X-DS-Authorization, Authorization'); // Get all request headers. $headers = apache_request_headers(); @@ -38,7 +38,7 @@ if ($headers['Authorization']) { $result_data = []; // Decode target data sent by datasource plugin in Grafana - $target_data = json_decode($target['target'], true); + $target_data = $target['target']; if ($target_data['module']) { // Get module name as target if not defined in Grafana. diff --git a/pandora_console/extensions/grafana/search.php b/pandora_console/extensions/grafana/search.php index 48a4f819a9..9193dd290e 100644 --- a/pandora_console/extensions/grafana/search.php +++ b/pandora_console/extensions/grafana/search.php @@ -3,7 +3,7 @@ // Allow Grafana proxy header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: GET, POST, OPTIONS'); -header('Access-Control-Allow-Headers: Origin, Content-Type, Accept, X-Grafana-Org-Id, X-Grafana-NoCache, X-DS-Authorization'); +header('Access-Control-Allow-Headers: Origin, Content-Type, Accept, X-Grafana-Org-Id, X-Grafana-NoCache, X-DS-Authorization, Authorization'); // Get all request headers $headers = apache_request_headers(); From 54e3f94d62cd0dfdeaa84ee5c6c3edb790c59268 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Mon, 22 Jan 2024 15:07:25 +0100 Subject: [PATCH 149/170] #12782 fixed button sound events style in events --- pandora_console/include/styles/events.css | 16 ++++++++++++++++ pandora_console/operation/events/events.php | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/pandora_console/include/styles/events.css b/pandora_console/include/styles/events.css index 9a69ea8c56..4e3da3194c 100644 --- a/pandora_console/include/styles/events.css +++ b/pandora_console/include/styles/events.css @@ -569,3 +569,19 @@ div.container-filter-buttons { .ui-dialog.modal-sound .ui-widget-header { display: flex !important; } + +.responsive_button_sound_events { + margin-right: 25% !important; +} + +@media (max-width: 1640px) { + .responsive_button_sound_events { + margin-right: 10% !important; + } +} + +@media (max-width: 1420px) { + .responsive_button_sound_events { + margin-right: 10px !important; + } +} diff --git a/pandora_console/operation/events/events.php b/pandora_console/operation/events/events.php index 79fe087a52..31d4336928 100644 --- a/pandora_console/operation/events/events.php +++ b/pandora_console/operation/events/events.php @@ -2951,8 +2951,8 @@ if (check_acl( false, 'openSoundEventsDialog("'.$data_sound.'")', [ + 'class' => 'responsive_button_sound_events', 'icon' => 'sound', - 'style' => 'margin-right: 25% !important', 'minimize-arrow' => true, 'span_style' => 'width: 100%', ], From 6948306d820c48a090dabb4ea47ad75a4f920692 Mon Sep 17 00:00:00 2001 From: Daniel Maya Date: Mon, 22 Jan 2024 17:29:51 +0100 Subject: [PATCH 150/170] #12767 Fixed password 3 --- pandora_console/include/functions_html.php | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index 06ab07598d..7052450b5f 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -2728,8 +2728,8 @@ function html_print_input_text_extended( if ($hide_div_eye !== false) { echo ""; @@ -2746,9 +2746,11 @@ function html_print_input_text_extended( ]; foreach ($attrs as $attribute => $default) { - if (array_key_exists($attribute, $attributes)) { + if (array_key_exists($attribute, $attributes) + || ($password === true && $attribute === 'value') + ) { continue; - } //end if + } /* * Remember, this next code have a $$ that for example there is a var as @@ -2758,7 +2760,7 @@ function html_print_input_text_extended( * */ - // Exact operator because we want to show "0" on the value + // Exact operator because we want to show "0" on the value. if ($attribute !== '') { $output .= $attribute.'="'.$$attribute.'" '; } else if ($default != '') { @@ -2789,6 +2791,12 @@ function html_print_input_text_extended( ], true ); + + echo "'; } if (!$return) { From d4c5d2f31637451339d191d720d325e00ccc68e2 Mon Sep 17 00:00:00 2001 From: artica Date: Tue, 23 Jan 2024 01:00:29 +0100 Subject: [PATCH 151/170] 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.redhat_bin.el8.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.el9.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.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 +- 28 files changed, 28 insertions(+), 28 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 4fd5136eee..e7c241251a 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.775-240122 +Version: 7.0NG.775-240123 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 a84d1c1048..00e1bec872 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.775-240122" +pandora_version="7.0NG.775-240123" 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 1bdfa2c98d..40317705f1 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1039,7 +1039,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.775'; -use constant AGENT_BUILD => '240122'; +use constant AGENT_BUILD => '240123'; # 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 9d6bcf8f51..8ed67cacd8 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.775 -%define release 240122 +%define release 240123 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec index 5b9e48578d..e073b7a1b6 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240122 +%define release 240123 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec index 8ed84f4eb2..ca44c46126 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240122 +%define release 240123 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.spec b/pandora_agents/unix/pandora_agent.redhat_bin.spec index e1ac0c3dd6..857491d509 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240122 +%define release 240123 Summary: Pandora FMS Linux agent, binary version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 710699686d..1491df0b07 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.775 -%define release 240122 +%define release 240123 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 54a64fa46d..0232a6bf8c 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240122" +PI_BUILD="240123" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index efc085bfe6..74ffb7b496 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{240122} +{240123} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 2a05f4e9ce..8e094eedae 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.775 Build 240122") +#define PANDORA_VERSION ("7.0NG.775 Build 240123") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 7600b129ae..b7d17d6756 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Pandora FMS" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.775(Build 240122))" + VALUE "ProductVersion", "(7.0NG.775(Build 240123))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 6ba70f63f8..4d832ca478 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.775-240122 +Version: 7.0NG.775-240123 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 69659ab510..95ee569569 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.775-240122" +pandora_version="7.0NG.775-240123" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 68a52be97d..6c993cc7ca 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 = 'PC240122'; +$build_version = 'PC240123'; $pandora_version = 'v7.0NG.775'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index a5765f9bb2..6d491a85cb 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 c74934e734..251e09b74e 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -7,7 +7,7 @@ %define debug_package %{nil} %define name pandorafms_server %define version 7.0NG.775 -%define release 240122 +%define release 240123 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index dc859972e9..6c05f78ac2 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.775 -%define release 240122 +%define release 240123 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 18312cc95f..d9a71e864f 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240122" +PI_BUILD="240123" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 9c9ad0d5a0..29545f538f 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -38,7 +38,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.775 Build 240122"; +my $version = "7.0NG.775 Build 240123"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 2d010312d9..2d1eec0b82 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.775 Build 240122"; +my $version = "7.0NG.775 Build 240123"; # save program name for logging my $progname = basename($0); From cd27935b4c762621ec855471023020fc1f95bd9a Mon Sep 17 00:00:00 2001 From: Jonathan Date: Tue, 23 Jan 2024 11:26:15 +0100 Subject: [PATCH 152/170] #12623 fix menu inventory modules --- pandora_console/include/functions_menu.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pandora_console/include/functions_menu.php b/pandora_console/include/functions_menu.php index ca67825da1..37d4e11c38 100644 --- a/pandora_console/include/functions_menu.php +++ b/pandora_console/include/functions_menu.php @@ -155,6 +155,8 @@ function menu_print_menu(&$menu) } } else if ($sec2 === 'godmode/users/configure_user') { $sec2 = 'godmode/users/user_list'; + } else if ($sec2 === 'godmode/modules/manage_inventory_modules_form') { + $sec2 = 'godmode/modules/manage_inventory_modules'; } else if ($sec2 === 'godmode/groups/configure_group') { $sec2 = 'godmode/groups/group_list'; } else if ($sec2 === 'godmode/users/configure_profile') { From fc08e9b9b657df8c3b3e2454c1cb10f0f311c281 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Tue, 23 Jan 2024 11:27:15 +0100 Subject: [PATCH 153/170] #12792 fix 500 change agent inventory --- pandora_console/include/ajax/inventory.ajax.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pandora_console/include/ajax/inventory.ajax.php b/pandora_console/include/ajax/inventory.ajax.php index 71fac8d0ec..207adde03d 100644 --- a/pandora_console/include/ajax/inventory.ajax.php +++ b/pandora_console/include/ajax/inventory.ajax.php @@ -26,7 +26,8 @@ * ============================================================================ */ - check_login(); +require_once $config['homedir'].'/include/functions_inventory.php'; +check_login(); if (is_ajax() === true) { $id_agent = get_parameter('id_agent', '0'); From 3026c9d50dc47aac8932b859f7b6fb8a2e6e0ff4 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Tue, 23 Jan 2024 16:27:07 +0100 Subject: [PATCH 154/170] #12786 fix wizard open out of index --- pandora_console/general/register.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/general/register.php b/pandora_console/general/register.php index 759e319dbd..ed583c7ed4 100644 --- a/pandora_console/general/register.php +++ b/pandora_console/general/register.php @@ -100,7 +100,7 @@ if ($initial && users_is_admin()) { ); } -if (check_acl($config['id_user'], 0, 'AW')) { +if (check_acl($config['id_user'], 0, 'AW') && empty($sec2)) { $welcome = !$initial; try { $welcome_window = new WelcomeWindow($welcome); From 538177c3e5b34df01527948183722236b2dac274 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Tue, 23 Jan 2024 17:08:06 +0100 Subject: [PATCH 155/170] #12753 fixed vul command in ajax --- pandora_console/include/functions_events.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/include/functions_events.php b/pandora_console/include/functions_events.php index cd22b55f1b..e328f4cd91 100644 --- a/pandora_console/include/functions_events.php +++ b/pandora_console/include/functions_events.php @@ -3804,7 +3804,7 @@ function events_get_response_target( } $event = db_get_row('tevento', 'id_evento', $event_id); - $target = io_safe_output($event_response['target']); + $target = io_safe_output(db_get_value('target', 'tevent_response', 'id', $event_response['id'])); // Replace parameters response. if (isset($response_parameters) === true From dd252daaf2072a2435b67e788117bbe9d3c4f18f Mon Sep 17 00:00:00 2001 From: artica Date: Wed, 24 Jan 2024 01:00:32 +0100 Subject: [PATCH 156/170] 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.redhat_bin.el8.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.el9.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.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 +- 28 files changed, 28 insertions(+), 28 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index e7c241251a..da5db137f5 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.775-240123 +Version: 7.0NG.775-240124 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 00e1bec872..4617d8e745 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.775-240123" +pandora_version="7.0NG.775-240124" 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 40317705f1..4ec522db43 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1039,7 +1039,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.775'; -use constant AGENT_BUILD => '240123'; +use constant AGENT_BUILD => '240124'; # 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 8ed67cacd8..2786cafe56 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.775 -%define release 240123 +%define release 240124 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec index e073b7a1b6..92cb781d5a 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240123 +%define release 240124 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec index ca44c46126..56dc5c9c0c 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240123 +%define release 240124 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.spec b/pandora_agents/unix/pandora_agent.redhat_bin.spec index 857491d509..858147650c 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240123 +%define release 240124 Summary: Pandora FMS Linux agent, binary version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 1491df0b07..deff8bc50f 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.775 -%define release 240123 +%define release 240124 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 0232a6bf8c..9a94ff4cb4 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240123" +PI_BUILD="240124" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 74ffb7b496..dd51dcf708 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{240123} +{240124} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 8e094eedae..22f49347f0 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.775 Build 240123") +#define PANDORA_VERSION ("7.0NG.775 Build 240124") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index b7d17d6756..cf88101947 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Pandora FMS" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.775(Build 240123))" + VALUE "ProductVersion", "(7.0NG.775(Build 240124))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 4d832ca478..d23840e972 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.775-240123 +Version: 7.0NG.775-240124 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 95ee569569..4c11ce1bce 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.775-240123" +pandora_version="7.0NG.775-240124" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 6c993cc7ca..60dd8bf9a1 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 = 'PC240123'; +$build_version = 'PC240124'; $pandora_version = 'v7.0NG.775'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 6d491a85cb..ab50a8ec91 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 251e09b74e..d76f4f73f5 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -7,7 +7,7 @@ %define debug_package %{nil} %define name pandorafms_server %define version 7.0NG.775 -%define release 240123 +%define release 240124 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 6c05f78ac2..fdafb2797e 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.775 -%define release 240123 +%define release 240124 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index effa474fba..2202c82563 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240123" +PI_BUILD="240124" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 2ab5d89b6a..47f6f469ab 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -38,7 +38,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.775 Build 240123"; +my $version = "7.0NG.775 Build 240124"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 2d1eec0b82..7801143234 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.775 Build 240123"; +my $version = "7.0NG.775 Build 240124"; # save program name for logging my $progname = basename($0); From 4fc3013cc3b15ef4981a1b5fdcc6688da65585b9 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Wed, 24 Jan 2024 09:15:32 +0100 Subject: [PATCH 157/170] #12522 fixed multiple audit when update setup --- pandora_console/include/functions_config.php | 21 +++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/pandora_console/include/functions_config.php b/pandora_console/include/functions_config.php index 9f4c38aa68..0f552ac519 100644 --- a/pandora_console/include/functions_config.php +++ b/pandora_console/include/functions_config.php @@ -104,6 +104,7 @@ function config_update_value($token, $value, $noticed=false, $password=false) return true; } + $prev_value = $config[$token]; $config[$token] = $value; $value = io_safe_output($value); @@ -117,13 +118,24 @@ function config_update_value($token, $value, $noticed=false, $password=false) return true; } else { // Something in setup changes. - if ($noticed === true) { + $value_token = (empty($config[$token]) === true) ? 0 : $config[$token]; + $prev_value = (empty($prev_value) === true) ? 0 : $prev_value; + if (is_array($prev_value) === true) { + $prev_value = implode(';', $prev_value); + } + + if ($noticed === true && $prev_value !== $value_token) { db_pandora_audit( AUDIT_LOG_SETUP, 'Setup has changed', false, false, - sprintf('Token << %s >> updated.', $token) + sprintf( + 'Token << %s >> updated %s -> %s', + $token, + $prev_value, + $value_token + ) ); } @@ -2090,11 +2102,6 @@ function config_update_config() } else { $config['error_config_update_config'] = []; $config['error_config_update_config']['correct'] = true; - - db_pandora_audit( - AUDIT_LOG_SETUP, - 'Setup has changed' - ); } if (count($errors) > 0) { From 4e523e94cce55b4c3c025a2b430aaf3ac1198907 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Wed, 24 Jan 2024 09:51:35 +0100 Subject: [PATCH 158/170] #12574 fix datepicker and give style --- pandora_console/extensions/insert_data.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/pandora_console/extensions/insert_data.php b/pandora_console/extensions/insert_data.php index 6f09d889f7..d06ff90118 100644 --- a/pandora_console/extensions/insert_data.php +++ b/pandora_console/extensions/insert_data.php @@ -283,8 +283,14 @@ function mainInsertData() secondText: '', currentText: '', closeText: ''}); - - $("#text-date").datepicker({dateFormat: ""}); + + $('#text-data').datepicker ({ + dateFormat: '', + changeMonth: true, + changeYear: true, + showAnim: 'slideDown', + firstDay: "", + }); $.datepicker.setDefaults($.datepicker.regional[ ""]); }); From bfb34d1c75dd02138c4aa7fd9c6ad98e46b634b6 Mon Sep 17 00:00:00 2001 From: Calvo Date: Wed, 24 Jan 2024 11:56:58 +0100 Subject: [PATCH 159/170] #12719. Fix creating duplicated agents on tagente --- pandora_server/lib/PandoraFMS/DataServer.pm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pandora_server/lib/PandoraFMS/DataServer.pm b/pandora_server/lib/PandoraFMS/DataServer.pm index 80e8bb4bd3..9db3f0f7ce 100644 --- a/pandora_server/lib/PandoraFMS/DataServer.pm +++ b/pandora_server/lib/PandoraFMS/DataServer.pm @@ -418,8 +418,10 @@ sub process_xml_data ($$$$$) { # A module with No-learn mode (modo = 0) creates its modules on database only when it is created my $new_agent = 0; - # Get agent id - my $agent_id = get_agent_id ($dbh, $agent_name); + # Get agent id from tagente. + my $agent_id = get_db_value ($dbh, "SELECT id_agente FROM tagente WHERE nombre = ?", safe_input($agent_name)); + $agent_id = -1 unless defined($agent_id); + my $group_id = 0; if ($agent_id < 1) { if ($pa_config->{'autocreate'} == 0) { From 8bbfa2803f86b3282d55183f0233eeba0891160a Mon Sep 17 00:00:00 2001 From: artica Date: Thu, 25 Jan 2024 01:00:29 +0100 Subject: [PATCH 160/170] 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.redhat_bin.el8.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.el9.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.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 +- 28 files changed, 28 insertions(+), 28 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index da5db137f5..b57934fc50 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.775-240124 +Version: 7.0NG.775-240125 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 4617d8e745..cc3cf84853 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.775-240124" +pandora_version="7.0NG.775-240125" 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 4ec522db43..b0f1c9f54c 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1039,7 +1039,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.775'; -use constant AGENT_BUILD => '240124'; +use constant AGENT_BUILD => '240125'; # 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 2786cafe56..516ef3ec99 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.775 -%define release 240124 +%define release 240125 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec index 92cb781d5a..c0ff5e3f44 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240124 +%define release 240125 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec index 56dc5c9c0c..14870a78ed 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240124 +%define release 240125 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.spec b/pandora_agents/unix/pandora_agent.redhat_bin.spec index 858147650c..1e88ca4c7e 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240124 +%define release 240125 Summary: Pandora FMS Linux agent, binary version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index deff8bc50f..515dc4ea4d 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.775 -%define release 240124 +%define release 240125 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 9a94ff4cb4..20f63af782 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240124" +PI_BUILD="240125" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index dd51dcf708..81661ca1bf 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{240124} +{240125} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 22f49347f0..91adc36bc7 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.775 Build 240124") +#define PANDORA_VERSION ("7.0NG.775 Build 240125") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index cf88101947..5ac5a2e47f 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Pandora FMS" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.775(Build 240124))" + VALUE "ProductVersion", "(7.0NG.775(Build 240125))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index d23840e972..971ba8b024 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.775-240124 +Version: 7.0NG.775-240125 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 4c11ce1bce..6e7853f74f 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.775-240124" +pandora_version="7.0NG.775-240125" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 60dd8bf9a1..0cbf1c15e8 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 = 'PC240124'; +$build_version = 'PC240125'; $pandora_version = 'v7.0NG.775'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index ab50a8ec91..1e2252fbae 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 d76f4f73f5..829d5ae091 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -7,7 +7,7 @@ %define debug_package %{nil} %define name pandorafms_server %define version 7.0NG.775 -%define release 240124 +%define release 240125 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index fdafb2797e..c697aa9c8f 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.775 -%define release 240124 +%define release 240125 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 2202c82563..03fa6a84d0 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240124" +PI_BUILD="240125" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 47f6f469ab..66e75586cb 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -38,7 +38,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.775 Build 240124"; +my $version = "7.0NG.775 Build 240125"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 7801143234..b154b38ada 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.775 Build 240124"; +my $version = "7.0NG.775 Build 240125"; # save program name for logging my $progname = basename($0); From 874bd04aa82c4c9b25ef9358b4fa3f7183329f89 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Thu, 25 Jan 2024 15:23:48 +0100 Subject: [PATCH 161/170] #11799 hide interval for broker agents --- pandora_agents/pc/pandora_agent | 2 +- pandora_agents/unix/pandora_agent | 2 +- .../godmode/agentes/agent_manager.php | 45 ++++++++++++------- 3 files changed, 32 insertions(+), 17 deletions(-) diff --git a/pandora_agents/pc/pandora_agent b/pandora_agents/pc/pandora_agent index 88f78e31ac..50e901f0ce 100644 --- a/pandora_agents/pc/pandora_agent +++ b/pandora_agents/pc/pandora_agent @@ -585,7 +585,7 @@ sub write_broker_conf($){ # Change the agent name if ($line =~ m/^\s*#*\s*agent_name\s+/) { - $line = "agent_name $broker_agent\n"; + $line = "agent_name $broker_agent\n#broker active\n"; } # Change the logfile elsif ($line =~ m/^\s*logfile\s+(.*)/) { diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index b0f1c9f54c..62aa2e5040 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1860,7 +1860,7 @@ sub write_broker_conf($){ # Change the agent name if ($line =~ m/^\s*#*\s*agent_name\s+/) { - $line = "agent_name $broker_agent\n"; + $line = "agent_name $broker_agent\n#broker active\n"; } # Change the logfile elsif ($line =~ m/^\s*logfile\s+(.*)/) { diff --git a/pandora_console/godmode/agentes/agent_manager.php b/pandora_console/godmode/agentes/agent_manager.php index 4e62337547..28b8da32d3 100644 --- a/pandora_console/godmode/agentes/agent_manager.php +++ b/pandora_console/godmode/agentes/agent_manager.php @@ -499,22 +499,37 @@ $tableAgent->data['primary_group'][0] .= ui_print_group_icon( 'after_input_icon' ); $tableAgent->data['primary_group'][0] .= ''; +// CHECK BROKER FOR SHOW INTERVAL. +enterprise_include('include/functions_config_agents.php'); +// Read configuration file. +$files = config_agents_get_agent_config_filenames($id_agente); +$file_name = $files['conf']; +$agent_config = file_get_contents($file_name); +$encoding = 'UTF-8'; +$agent_config_utf8 = mb_convert_encoding($agent_config, 'UTF-8', $encoding); +if ($agent_config_utf8 !== false) { + $agent_config = $agent_config_utf8; +} -$tableAgent->data['caption_interval'][0] = __('Interval'); -// $tableAgent->rowstyle['interval'] = 'width: 260px'; -$tableAgent->rowclass['interval'] = 'w540px'; -$tableAgent->data['interval'][0] = html_print_extended_select_for_time( - 'intervalo', - $intervalo, - '', - '', - '0', - 10, - true, - false, - true, - 'w33p' -); +$broker = str_contains($agent_config, '#broker active'); + +if ($broker === false) { + $tableAgent->data['caption_interval'][0] = __('Interval'); + // $tableAgent->rowstyle['interval'] = 'width: 260px'; + $tableAgent->rowclass['interval'] = 'w540px'; + $tableAgent->data['interval'][0] = html_print_extended_select_for_time( + 'intervalo', + $intervalo, + '', + '', + '0', + 10, + true, + false, + true, + 'w33p' + ); +} if ($intervalo < SECONDS_5MINUTES) { $tableAgent->data['interval'][0] .= clippy_context_help('interval_agent_min'); From cdd9af51080abfaec2be7b6c32a6e446a1203721 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Thu, 25 Jan 2024 15:25:08 +0100 Subject: [PATCH 162/170] #11799 hide interval for broker agents --- .../godmode/agentes/agent_manager.php | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/pandora_console/godmode/agentes/agent_manager.php b/pandora_console/godmode/agentes/agent_manager.php index 28b8da32d3..80a480dd12 100644 --- a/pandora_console/godmode/agentes/agent_manager.php +++ b/pandora_console/godmode/agentes/agent_manager.php @@ -499,19 +499,23 @@ $tableAgent->data['primary_group'][0] .= ui_print_group_icon( 'after_input_icon' ); $tableAgent->data['primary_group'][0] .= ''; -// CHECK BROKER FOR SHOW INTERVAL. -enterprise_include('include/functions_config_agents.php'); -// Read configuration file. -$files = config_agents_get_agent_config_filenames($id_agente); -$file_name = $files['conf']; -$agent_config = file_get_contents($file_name); -$encoding = 'UTF-8'; -$agent_config_utf8 = mb_convert_encoding($agent_config, 'UTF-8', $encoding); -if ($agent_config_utf8 !== false) { - $agent_config = $agent_config_utf8; -} -$broker = str_contains($agent_config, '#broker active'); +$broker = false; +if (enterprise_installed()) { + // CHECK BROKER FOR SHOW INTERVAL. + enterprise_include('include/functions_config_agents.php'); + // Read configuration file. + $files = config_agents_get_agent_config_filenames($id_agente); + $file_name = $files['conf']; + $agent_config = file_get_contents($file_name); + $encoding = 'UTF-8'; + $agent_config_utf8 = mb_convert_encoding($agent_config, 'UTF-8', $encoding); + if ($agent_config_utf8 !== false) { + $agent_config = $agent_config_utf8; + } + + $broker = str_contains($agent_config, '#broker active'); +} if ($broker === false) { $tableAgent->data['caption_interval'][0] = __('Interval'); From 18cb14bec6c45dd897cb5ca5598628b780d488b0 Mon Sep 17 00:00:00 2001 From: "alejandro.campos@artica.es" Date: Thu, 25 Jan 2024 16:03:48 +0100 Subject: [PATCH 163/170] minor fixes --- pandora_console/include/functions_netflow.php | 25 +++++++++++++++---- .../include/functions_reporting.php | 14 +++++++---- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/pandora_console/include/functions_netflow.php b/pandora_console/include/functions_netflow.php index 770314f507..5fc9e6b32f 100644 --- a/pandora_console/include/functions_netflow.php +++ b/pandora_console/include/functions_netflow.php @@ -1553,8 +1553,7 @@ function netflow_draw_item( if ($output === 'HTML' || $output === 'PDF') { $html = '
'; $result_pdf .= $title; From c22525febc900abd3bc54ed291b03ebf6e735a19 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Mon, 4 Dec 2023 16:54:14 +0100 Subject: [PATCH 022/170] #12569 fixed actions credential boxes --- pandora_console/godmode/servers/modificar_server.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/godmode/servers/modificar_server.php b/pandora_console/godmode/servers/modificar_server.php index 03863fb4f5..8a78de9592 100644 --- a/pandora_console/godmode/servers/modificar_server.php +++ b/pandora_console/godmode/servers/modificar_server.php @@ -609,7 +609,7 @@ $(document).ready (function () { function (data) { $(".white-box-content").html(data); - $("#submit-update").click(function (e) { + $("#button-update").click(function (e) { update_credential_boxes(datas); }); }, From abfa08b6e0d7b6e699154f994bfd9b526f58b746 Mon Sep 17 00:00:00 2001 From: Jorge Rincon Date: Thu, 7 Dec 2023 10:25:11 +0100 Subject: [PATCH 023/170] #12577 fixed visual error of the dynamic threshold ff threshold and cron from module containers --- .../agentes/module_manager_editor_common.php | 13 +++++++++---- pandora_console/include/styles/pandora.css | 8 ++++++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/pandora_console/godmode/agentes/module_manager_editor_common.php b/pandora_console/godmode/agentes/module_manager_editor_common.php index c396634f67..2cf295aabf 100644 --- a/pandora_console/godmode/agentes/module_manager_editor_common.php +++ b/pandora_console/godmode/agentes/module_manager_editor_common.php @@ -1122,13 +1122,13 @@ if (isset($id_agente) === true && (int) $moduletype === MODULE_DATA) { $tableCron->data['cron_to_select'][0] = html_print_extended_select_for_cron($hour_to, $minute_to, $mday_to, $month_to, $wday_to, true, $disabledBecauseInPolicy, true); } -$table_advanced->rowclass['cron_section'] = 'table_section full_section'; +$table_advanced->rowclass['cron_section'] = 'table_section full_section mrgn_top_mod_0px'; $table_advanced->data['cron_section'] = html_print_table($tableCron, true); $table_advanced->data['title_3'] = html_print_subtitle_table(__('Thresholds and state changes')); $table_advanced->rowclass['caption_min_max_values'] = 'w50p pdd_t_10px'; -$table_advanced->rowclass['min_max_values'] = 'w50p'; +$table_advanced->rowclass['min_max_values'] = 'w50p pdd_b_10px'; $table_advanced->data['caption_min_max_values'][0] = __('Min. Value'); $table_advanced->data['caption_min_max_values'][1] = __('Max. Value'); @@ -1205,7 +1205,7 @@ $tableDynamicThreshold->data['adv_dynamic_threshold_twotailed'][0] = html_print_ $disabledBecauseInPolicy ); -$table_advanced->rowclass['dynamic_threshold_table'] = 'table_section full_section'; +$table_advanced->rowclass['dynamic_threshold_table'] = 'table_section full_section mrgn_top_mod_0px'; $table_advanced->data['dynamic_threshold_table'] = html_print_table($tableDynamicThreshold, true); $tableFFThreshold = new stdClass(); @@ -1295,10 +1295,15 @@ $tableFFThreshold->data['ff_thresholds_each'][2] = html_print_input_text( $classdisabledBecauseInPolicy ); +$table_advanced->rowclass['gap_flipflop'] = 'mrgn_top_btn_10px_imp'; +$table_advanced->data['gap_flipflop'] = html_print_input_hidden('gap_flipflop', 0); -$table_advanced->rowclass['flipflop_thresholds_table'] = 'table_section full_section'; +$table_advanced->rowclass['flipflop_thresholds_table'] = 'table_section full_section mrgn_top_mod_0px'; $table_advanced->data['flipflop_thresholds_table'] = html_print_table($tableFFThreshold, true); +$table_advanced->rowclass['gap_ff'] = 'mrgn_top_btn_10px_imp'; +$table_advanced->data['gap_ff'] = html_print_input_hidden('gap_ff', 0); + $table_advanced->rowclass['caption_ff_interval_timeout'] = 'w50p'; $table_advanced->rowclass['ff_interval_timeout'] = 'w50p'; $table_advanced->cellclass['caption_ff_interval_timeout'][0] = 'w50p'; diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index d8f7dd9416..3215aefabf 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -7056,6 +7056,10 @@ div.graph div.legend table { margin: 0 1em 0 2em; } +.mrgn_top_btn_10px_imp { + margin: 10px 0 10px 0 !important; +} + /* * MARGIN LEFT */ @@ -7217,6 +7221,10 @@ div.graph div.legend table { margin-top: 0px; } +.mrgn_top_mod_0px { + margin-top: 0px !important; +} + .mrgn_top_5px { margin-top: 5px; } From 8d4e3e78a30369be7b834a5ac8f0934e4a720eb1 Mon Sep 17 00:00:00 2001 From: Jorge Rincon Date: Thu, 7 Dec 2023 16:00:42 +0100 Subject: [PATCH 024/170] #12579 fixed icons as buttons in action on satellite server agents --- .../include/class/SatelliteAgent.class.php | 40 ++++++++++++------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/pandora_console/include/class/SatelliteAgent.class.php b/pandora_console/include/class/SatelliteAgent.class.php index 29fa2e3b77..09b023958d 100644 --- a/pandora_console/include/class/SatelliteAgent.class.php +++ b/pandora_console/include/class/SatelliteAgent.class.php @@ -388,26 +388,38 @@ class SatelliteAgent extends HTML $tmp->actions = ''; if ($delete === false) { - $tmp->actions .= html_print_image( - ($disable === true) ? 'images/lightbulb_off.png' : 'images/lightbulb.png', - true, + $tmp->actions .= html_print_anchor( [ - 'border' => '0', - 'class' => 'main_menu_icon mrgn_lft_05em invert_filter', - 'onclick' => 'disable_agent(\''.$tmp->address.'\',\''.strip_tags($tmp->name).'\',\''.(int) $disable.'\',\''.$id_agente.'\')', - ] + 'href' => '#', + 'content' => html_print_image( + ($disable === true) ? 'images/lightbulb_off.png' : 'images/lightbulb.png', + true, + [ + 'border' => '0', + 'class' => 'main_menu_icon mrgn_lft_05em invert_filter', + 'onclick' => 'disable_agent(\''.$tmp->address.'\',\''.strip_tags($tmp->name).'\',\''.(int) $disable.'\',\''.$id_agente.'\')', + ] + ), + ], + true ); } if ($disable === false) { - $tmp->actions .= html_print_image( - ($delete === true) ? 'images/add.png' : 'images/delete.svg', - true, + $tmp->actions .= html_print_anchor( [ - 'border' => '0', - 'class' => 'main_menu_icon mrgn_lft_05em invert_filter', - 'onclick' => 'delete_agent(\''.$tmp->address.'\',\''.strip_tags($tmp->name).'\',\''.(int) $delete.'\',\''.$id_agente.'\')', - ] + 'href' => '#', + 'content' => html_print_image( + ($delete === true) ? 'images/add.png' : 'images/delete.svg', + true, + [ + 'border' => '0', + 'class' => 'main_menu_icon mrgn_lft_05em invert_filter', + 'onclick' => 'delete_agent(\''.$tmp->address.'\',\''.strip_tags($tmp->name).'\',\''.(int) $delete.'\',\''.$id_agente.'\')', + ] + ), + ], + true ); } From 7258188491d814791015a663c1396e7353d88417 Mon Sep 17 00:00:00 2001 From: daniel Date: Mon, 11 Dec 2023 11:01:53 +0100 Subject: [PATCH 025/170] remove agents bulk operation pandora_enterprise#12299 --- .../godmode/massive/massive_delete_agents.php | 16 ++++++++++------ pandora_console/include/functions_api.php | 10 +++++++++- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/pandora_console/godmode/massive/massive_delete_agents.php b/pandora_console/godmode/massive/massive_delete_agents.php index 1dc6397cc6..88d7e54ccb 100755 --- a/pandora_console/godmode/massive/massive_delete_agents.php +++ b/pandora_console/godmode/massive/massive_delete_agents.php @@ -46,6 +46,7 @@ require_once $config['homedir'].'/include/functions_alerts.php'; require_once $config['homedir'].'/include/functions_modules.php'; require_once $config['homedir'].'/include/functions_users.php'; require_once $config['homedir'].'/include/functions_massive_operations.php'; +enterprise_include_once('include/functions_agents.php'); /** @@ -71,12 +72,15 @@ function process_manage_delete($id_agents) $array_id = explode('|', $id_agent); try { $node = new Node((int) $array_id[0]); - $node->connect(); - - $agent = new Agent((int) $array_id[1]); - $success = $agent->delete(); - - $node->disconnect(); + $api_call_delete = $node->callApi( + 'delete_agent', + 'set', + (int) $array_id[1], + null, + ['2'], + null, + true + ); $success = agent_delete_from_metaconsole( $array_id[1], diff --git a/pandora_console/include/functions_api.php b/pandora_console/include/functions_api.php index 8f5fb66f54..7a06156fb4 100644 --- a/pandora_console/include/functions_api.php +++ b/pandora_console/include/functions_api.php @@ -2266,9 +2266,12 @@ function api_set_delete_agent($id, $thrash1, $other, $returnType) } $agent_by_alias = false; + $agent_by_id = false; if ($other['data'][0] === '1') { $agent_by_alias = true; + } else if ($other['data'][0] === '2') { + $agent_by_id = true; } if (is_metaconsole()) { @@ -2331,7 +2334,12 @@ function api_set_delete_agent($id, $thrash1, $other, $returnType) } } } else { - $idAgent = agents_get_agent_id($id, false); + if ($agent_by_id === true) { + $idAgent = $id; + } else { + $idAgent = agents_get_agent_id($id, false); + } + if (!util_api_check_agent_and_print_error($idAgent, 'string', 'AD')) { return; } From 812e47603e5e08c492ed9b43c1af0150d2b07d4a Mon Sep 17 00:00:00 2001 From: "alejandro.campos@artica.es" Date: Mon, 11 Dec 2023 18:05:58 +0100 Subject: [PATCH 026/170] some changes in audit view --- pandora_console/include/class/AuditLog.class.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pandora_console/include/class/AuditLog.class.php b/pandora_console/include/class/AuditLog.class.php index 261ffac531..ceb98875a1 100644 --- a/pandora_console/include/class/AuditLog.class.php +++ b/pandora_console/include/class/AuditLog.class.php @@ -123,7 +123,7 @@ class AuditLog extends HTML ], [ 'text' => 'action', - 'class' => 'w80px table_action_buttons show_extended_info', + 'class' => 'w80px show_extended_info', ] ); @@ -187,7 +187,7 @@ class AuditLog extends HTML 'no_sortable_columns' => [-1], 'order' => [ 'field' => 'date', - 'direction' => 'asc', + 'direction' => 'desc', ], 'search_button_class' => 'sub filter float-right', 'form' => [ @@ -441,7 +441,7 @@ class AuditLog extends HTML $(document).ready(function() { // Add event listener for opening and closing details - $('#audit_logs tbody').on('click', 'td.show_extended_info', function() { + $(document).on('click', '#audit_logs tbody tr:has(td.show_extended_info)', function() { var tr = $(this).closest('tr'); var table = $("#tableId; ?>").DataTable(); var row = table.row(tr); From 276cf73e49a113fbd3a80c5591c929c96f5695be Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Tue, 12 Dec 2023 10:23:47 +0100 Subject: [PATCH 027/170] #12575 fixed order columns in dashboard --- pandora_console/include/ajax/dashboard.ajax.php | 17 +++++++++++++++-- pandora_console/views/dashboard/list.php | 6 +++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/pandora_console/include/ajax/dashboard.ajax.php b/pandora_console/include/ajax/dashboard.ajax.php index 50a0e0b7a1..40497a2ebc 100644 --- a/pandora_console/include/ajax/dashboard.ajax.php +++ b/pandora_console/include/ajax/dashboard.ajax.php @@ -41,7 +41,20 @@ if ($method === 'draw') { $length = get_parameter('length', $config['block_size']); $orderBy = get_datatable_order(true); - $sort_field = $orderBy['field']; + switch ($orderBy['field']) { + case 'groups': + $sort_field = 'nombre'; + break; + + case 'favorite': + $sort_field = 'active'; + break; + + default: + $sort_field = $orderBy['field']; + break; + } + $order = $orderBy['direction']; $pagination = ''; @@ -121,7 +134,7 @@ if ($method === 'draw') { ); } - $sql = 'SELECT * FROM tdashboard '.$where.' ORDER BY id '.$pagination; + $sql = 'SELECT * FROM tdashboard LEFT JOIN tgrupo ON tgrupo.id_grupo = tdashboard.id_group '.$where.' ORDER BY '.$sort_field.' '.$order.$pagination; $dashboards = db_get_all_rows_sql($sql); $count = db_get_value_sql('SELECT COUNT(*) FROM tdashboard '.$where); foreach ($dashboards as $dashboard) { diff --git a/pandora_console/views/dashboard/list.php b/pandora_console/views/dashboard/list.php index aae6778f6d..aaf675e64a 100644 --- a/pandora_console/views/dashboard/list.php +++ b/pandora_console/views/dashboard/list.php @@ -112,7 +112,11 @@ if (empty($dashboards) === true) { 'manageDashboards' => $manageDashboards, ], 'default_pagination' => $config['block_size'], - 'no_sortable_columns' => [], + 'no_sortable_columns' => [ + 4, + 5, + 6, + ], 'order' => [ 'field' => 'name', 'direction' => 'desc', From e3fc6c13f5c143111aad2239caf94ebab69c2d6b Mon Sep 17 00:00:00 2001 From: "felix.suarez" Date: Tue, 12 Dec 2023 22:29:47 -0600 Subject: [PATCH 028/170] Change api_call to manage_api_call --- pandora_server/util/pandora_manage.pl | 56 +++++++++++++-------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index afcf8b9199..997e254737 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -264,7 +264,7 @@ sub help_screen{ ######################################################################## # ######################################################################## -sub api_call($$$;$$$$) { +sub manage_api_call($$$;$$$$) { my ($pa_config, $op, $op2, $id, $id2, $other, $return_type) = @_; my $content = undef; @@ -400,7 +400,7 @@ sub pandora_disable_group ($$$) { foreach my $id_agent (@agents_bd) { # Call the API. - $result += api_call( + $result += manage_api_call( $conf, 'set', 'disabled_and_standby', $id_agent->{'id_agente'}, $server, '1|1' ); } @@ -2253,7 +2253,7 @@ sub cli_module_group_synch() { if ($return_type eq '') { $return_type = 'csv'; } - my $result = api_call(\%conf,'set', 'module_group_synch', undef, undef, "$other", $return_type); + my $result = manage_api_call(\%conf,'set', 'module_group_synch', undef, undef, "$other", $return_type); print "$result \n\n "; } @@ -2321,7 +2321,7 @@ sub cli_create_network_component() { my $other2 = join('|', @todo2); # Call the API. - my $result = api_call( $conf, 'set', 'new_network_component', $c_name, undef, "$c_type|$other|$c_group|$other2"); + my $result = manage_api_call( $conf, 'set', 'new_network_component', $c_name, undef, "$c_type|$other|$c_group|$other2"); print "$result \n\n "; } @@ -4322,7 +4322,7 @@ sub cli_get_alert_actions() { if ($return_type eq '') { $return_type = 'csv'; } - my $result = api_call(\%conf,'get', 'alert_actions', undef, undef, "$action_name|$separator",$return_type); + my $result = manage_api_call(\%conf,'get', 'alert_actions', undef, undef, "$action_name|$separator",$return_type); print "$result \n\n "; } @@ -4337,7 +4337,7 @@ sub cli_get_alert_actions_meta() { $return_type = 'csv'; } - my $result = api_call(\%conf,'get', 'alert_actions_meta', undef, undef, "$server_name|$action_name|$separator",$return_type); + my $result = manage_api_call(\%conf,'get', 'alert_actions_meta', undef, undef, "$server_name|$action_name|$separator",$return_type); print "$result \n\n "; } @@ -4557,7 +4557,7 @@ sub cli_create_event() { sub cli_update_event_custom_id() { my ($id_event, $event_custom_id) = @ARGV[2..3]; - my $result = api_call(\%conf, 'set', 'event_custom_id', $id_event, $event_custom_id); + my $result = manage_api_call(\%conf, 'set', 'event_custom_id', $id_event, $event_custom_id); print "\n$result\n"; } @@ -4849,7 +4849,7 @@ sub cli_apply_policy() { my ($id_policy, $id_agent, $name, $id_server) = @ARGV[2..5]; # Call the API. - my $result = api_call(\%conf, 'set', 'apply_policy', $id_policy, $id_agent, "$name|$id_server"); + my $result = manage_api_call(\%conf, 'set', 'apply_policy', $id_policy, $id_agent, "$name|$id_server"); print "\n$result\n"; } @@ -6022,7 +6022,7 @@ sub cli_policy_add_agent() { sub cli_policy_delete_agent() { my ($policy_id, $agent_id) = @ARGV[2..3]; - my $result = api_call(\%conf,'set', 'remove_agent_from_policy', $policy_id, $agent_id); + my $result = manage_api_call(\%conf,'set', 'remove_agent_from_policy', $policy_id, $agent_id); print "$result \n\n "; } @@ -6032,7 +6032,7 @@ sub cli_create_planned_downtime() { my @todo = @ARGV[3..21]; my $other = join('|', @todo); - my $result = api_call(\%conf,'set', 'planned_downtimes_created', $name, undef, "$other"); + my $result = manage_api_call(\%conf,'set', 'planned_downtimes_created', $name, undef, "$other"); print "$result \n\n "; } @@ -6046,7 +6046,7 @@ sub cli_add_item_planned_downtime() { my $other_modules = join(';', @modules); my $other = $other_agents . "|" . $other_modules; - my $result = api_call(\%conf,'set', 'planned_downtimes_additem', $id, undef, "$other"); + my $result = manage_api_call(\%conf,'set', 'planned_downtimes_additem', $id, undef, "$other"); print_log "$result \n\n"; } @@ -8645,7 +8645,7 @@ sub cli_create_tag() { my ($tag_name, $tag_description, $tag_url, $tag_email) = @ARGV[2..5]; # Call the API. - my $result = api_call(\%conf, 'set', 'create_tag', undef, undef, "$tag_name|$tag_description|$tag_url|$tag_email"); + my $result = manage_api_call(\%conf, 'set', 'create_tag', undef, undef, "$tag_name|$tag_description|$tag_url|$tag_email"); print "\n$result\n"; } @@ -8682,7 +8682,7 @@ sub cli_add_tag_to_user_profile() { exist_check($user_profile_id, 'given profile and group combination for user', $user_id); # Call the API. - my $result = api_call(\%conf, 'set', 'tag_user_profile', $user_id, $tag_id, "$group_id|$profile_id"); + my $result = manage_api_call(\%conf, 'set', 'tag_user_profile', $user_id, $tag_id, "$group_id|$profile_id"); print "\n$result\n"; } @@ -8706,7 +8706,7 @@ sub cli_add_tag_to_module() { exist_check($module_id, 'module name', $module_name); # Call the API. - my $result = api_call(\%conf, 'set', 'add_tag_module', $module_id, $tag_id); + my $result = manage_api_call(\%conf, 'set', 'add_tag_module', $module_id, $tag_id); print "\n$result\n"; } @@ -8725,7 +8725,7 @@ sub cli_migration_agent_queue() { } # Call the API. - my $result = api_call( $conf, 'set', 'migrate_agent', $id_agent, 0, "$source_name|$target_name|$only_db" ); + my $result = manage_api_call( $conf, 'set', 'migrate_agent', $id_agent, 0, "$source_name|$target_name|$only_db" ); print "\n$result\n"; } @@ -8740,7 +8740,7 @@ sub cli_migration_agent() { } # Call the API. - my $result = api_call( $conf, 'get', 'migrate_agent', $id_agent); + my $result = manage_api_call( $conf, 'get', 'migrate_agent', $id_agent); if( defined($result) && "$result" ne "" ){ print "\n1\n"; @@ -8849,7 +8849,7 @@ sub cli_new_cluster() { my ($cluster_name,$cluster_type,$description,$group_id) = @ARGV[2..5]; # Call the API. - my $result = api_call( $conf, 'set', 'new_cluster', undef, undef, "$cluster_name|$cluster_type|$description|$group_id"); + my $result = manage_api_call( $conf, 'set', 'new_cluster', undef, undef, "$cluster_name|$cluster_type|$description|$group_id"); if( defined($result) && "$result" ne "" ){ print "\n1\n"; @@ -8867,7 +8867,7 @@ sub cli_add_cluster_agent() { my ($other) = @ARGV[2..2]; # Call the API. - my $result = api_call( $conf, 'set', 'add_cluster_agent', undef, undef, $other); + my $result = manage_api_call( $conf, 'set', 'add_cluster_agent', undef, undef, $other); if( defined($result) && "$result" ne "" ){ print "\n1\n"; @@ -8885,7 +8885,7 @@ sub cli_add_cluster_item() { my ($other) = @ARGV[2..2]; # Call the API. - my $result = api_call( $conf, 'set', 'add_cluster_item', undef, undef, $other); + my $result = manage_api_call( $conf, 'set', 'add_cluster_item', undef, undef, $other); if( defined($result) && "$result" ne "" ){ print "\n1\n"; @@ -8903,7 +8903,7 @@ sub cli_delete_cluster() { my ($id) = @ARGV[2..2]; # Call the API. - my $result = api_call( $conf, 'set', 'delete_cluster', $id); + my $result = manage_api_call( $conf, 'set', 'delete_cluster', $id); if( defined($result) && "$result" ne "" ){ print "\n1\n"; @@ -8921,7 +8921,7 @@ sub cli_delete_cluster_agent() { my ($id_agent,$id_cluster) = @ARGV[2..3]; # Call the API. - my $result = api_call( $conf, 'set', 'delete_cluster_agent', undef, undef, "$id_agent|$id_cluster"); + my $result = manage_api_call( $conf, 'set', 'delete_cluster_agent', undef, undef, "$id_agent|$id_cluster"); if( defined($result) && "$result" ne "" ){ print "\n1\n"; @@ -8939,7 +8939,7 @@ sub cli_delete_cluster_item() { my ($id) = @ARGV[2..2]; # Call the API. - my $result = api_call( $conf, 'set', 'delete_cluster_item', $id); + my $result = manage_api_call( $conf, 'set', 'delete_cluster_item', $id); if( defined($result) && "$result" ne "" ){ print "\n1\n"; @@ -8958,7 +8958,7 @@ sub cli_get_cluster_status() { my ($id) = @ARGV[2..2]; # Call the API. - my $result = api_call( $conf, 'get', 'cluster_status', $id); + my $result = manage_api_call( $conf, 'get', 'cluster_status', $id); if( defined($result) && "$result" ne "" ){ print "\n1\n"; @@ -8979,7 +8979,7 @@ sub cli_set_disabled_and_standby() { $value = 1 unless defined($value); #Set to disabled by default # Call the API. - my $result = api_call( + my $result = manage_api_call( $conf, 'set', 'disabled_and_standby', $id, $id_node, $value ); @@ -8995,7 +8995,7 @@ sub cli_set_disabled_and_standby() { sub cli_reset_agent_counts() { my $agent_id = @ARGV[2]; - my $result = api_call(\%conf,'set', 'reset_agent_counts', $agent_id); + my $result = manage_api_call(\%conf,'set', 'reset_agent_counts', $agent_id); print "$result \n\n "; } @@ -9010,7 +9010,7 @@ sub cli_event_in_progress() { my $event_id = @ARGV[2]; # Call the API. - my $result = api_call( + my $result = manage_api_call( $conf, 'set', 'event_in_progress', $event_id ); @@ -9080,7 +9080,7 @@ sub cli_get_gis_agent(){ my $agent_id = @ARGV[2]; - my $result = api_call(\%conf,'get', 'gis_agent', $agent_id); + my $result = manage_api_call(\%conf,'get', 'gis_agent', $agent_id); print "$result \n\n "; } @@ -9096,7 +9096,7 @@ sub cli_insert_gis_data(){ my @position = @ARGV[3..5]; my $other = join('|', @position); - my $result = api_call(\%conf,'set', 'gis_agent_only_position', $agent_id, undef, "$other"); + my $result = manage_api_call(\%conf,'set', 'gis_agent_only_position', $agent_id, undef, "$other"); print "$result \n\n "; } From 160514cfbe5acd41941de26f0ca5e31d2fa10a09 Mon Sep 17 00:00:00 2001 From: "alejandro.campos@artica.es" Date: Wed, 13 Dec 2023 10:08:13 +0100 Subject: [PATCH 029/170] fix filter bug --- pandora_console/include/functions_events.php | 7 ++++++- pandora_console/operation/events/events.php | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/pandora_console/include/functions_events.php b/pandora_console/include/functions_events.php index 747e5154ce..852d00f270 100644 --- a/pandora_console/include/functions_events.php +++ b/pandora_console/include/functions_events.php @@ -6472,7 +6472,12 @@ function event_print_graph( $color[] = '#82b92f'; } } else { - $interval_length = (int) ($period / $num_intervals); + $interval_length = 0; + + if ($num_intervals > 0) { + $interval_length = (int) ($period / $num_intervals); + } + $intervals = []; $intervals[0] = $start_utimestamp; for ($i = 0; $i < $num_intervals; $i++) { diff --git a/pandora_console/operation/events/events.php b/pandora_console/operation/events/events.php index be5f6047e3..f47fc71f55 100644 --- a/pandora_console/operation/events/events.php +++ b/pandora_console/operation/events/events.php @@ -1234,7 +1234,7 @@ if (is_ajax() === true) { $data = array_values( array_filter( - $data, + ($data ?? []), function ($item) { return (bool) (array) $item; } From 7b6c14974d1bfee2a230b729f92998b1861a3147 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Wed, 13 Dec 2023 10:34:46 +0100 Subject: [PATCH 030/170] #12573 fixed number of cells in list dashboard --- pandora_console/include/lib/Dashboard/Manager.php | 9 +++++++++ pandora_console/pandoradb_data.sql | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/pandora_console/include/lib/Dashboard/Manager.php b/pandora_console/include/lib/Dashboard/Manager.php index 4430bfa253..bee64b7ba1 100644 --- a/pandora_console/include/lib/Dashboard/Manager.php +++ b/pandora_console/include/lib/Dashboard/Manager.php @@ -1056,6 +1056,7 @@ class Manager implements PublicLogin 'name' => $name, 'id_user' => $id_user, 'id_group' => $id_group, + 'cells' => 1, 'cells_slideshow' => $slideshow, 'active' => $favourite, 'date_range' => $dateRange, @@ -1367,6 +1368,7 @@ class Manager implements PublicLogin global $config; $items = \get_parameter('items', []); + $totalCells = 0; // Class Dashboard. if (empty($items) === false) { @@ -1398,8 +1400,15 @@ class Manager implements PublicLogin return false; } } + + if (is_array($items) === true) { + $totalCells = count($items); + } } + $values = ['cells' => $totalCells]; + $this->put($values); + echo json_encode($result); } diff --git a/pandora_console/pandoradb_data.sql b/pandora_console/pandoradb_data.sql index 70f9451932..a3f28d816a 100644 --- a/pandora_console/pandoradb_data.sql +++ b/pandora_console/pandoradb_data.sql @@ -2704,8 +2704,8 @@ INSERT INTO `treport_content` (`id_rc`,`id_report`,`id_gs`,`id_agent_module`,`ty (2,1,0,0,'top_n',28800,0,2,'Top CPU per agent','',0,'<p>This type of report implies loading a lot of data. Therefore it is recommended for scheduled reports, not real-time view.</p>',NULL,0,'','','','00:00:00','00:00:00',1,1,1,1,1,1,1,0,3,10,0,10,0,1,1,0,'{"show_in_same_row":0,"hide_notinit_agents":0,"priority_mode":"1","dyn_height":"250","text_agent":"Lio=","text_agent_module":"Y3B1Lio="}',0,0,'',0,0,300,0,0,NULL,NULL,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,NULL,NULL,1,0,0,NULL), (3,1,0,0,'event_report_group',21600,0,3,'General event report','This is a sample of not normal events for any agent available in the last 6 hours',0,'<p>This type of report implies loading a lot of data. Therefore it is recommended for scheduled reports, not real-time view.</p>',NULL,0,'','','','00:00:00','00:00:00',1,1,1,1,1,1,1,0,0,10,0,10,0,0,0,0,'{"show_in_same_row":0,"hide_notinit_agents":0,"priority_mode":"1","dyn_height":"250","server_multiple":"\"\"","show_summary_group":0,"filter_event_severity":"[\"20\"]","filter_event_type":"[\"all\"]","filter_event_status":"[\"-1\"]","event_graph_by_agent":"1","event_graph_by_user_validator":"1","event_graph_by_criticity":"1","event_graph_validated_vs_unvalidated":0,"event_filter_search":"","event_filter_exclude":"","custom_data_events":"1","label":""}',0,0,'',0,0,300,0,0,NULL,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,NULL,NULL,1,0,0,NULL); INSERT INTO `tdashboard` (`id`,`name`,`id_user`,`id_group`,`active`,`cells`,`cells_slideshow`) VALUES - (1,'Sample Dashboard #1','',0,0,0,0), - (2,'Sample Dashboard #2','',0,0,0,0); + (1,'Sample Dashboard #1','',0,0,7,0), + (2,'Sample Dashboard #2','',0,0,10,0); INSERT INTO `twidget_dashboard` (`id`,`position`,`options`,`order`,`id_dashboard`,`id_widget`,`prop_width`,`prop_height`) VALUES (1,'{\"x\":\"0\",\"y\":\"0\",\"width\":\"4\",\"height\":\"4\"}','{\"title\":\"Agents hive\",\"background\":\"#ffffff\",\"groups\":[\"12,8,4,9,2,10,13,11\"]}',0,1,1,0.32,0.32), (2,'{\"x\":\"4\",\"y\":\"0\",\"width\":\"3\",\"height\":\"4\"}','{\"title\":\"Clock\",\"background\":\"#ffffff\",\"clockType\":\"analogic\"}',1,1,12,0.32,0.32), From 6e246d5d2980dd83c5f300ae0ebc0892d0c449bf Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Wed, 13 Dec 2023 12:04:00 +0100 Subject: [PATCH 031/170] #12509 fixed status agents disabled --- pandora_console/include/functions_graph.php | 12 +- pandora_console/include/functions_groups.php | 3 +- .../lib/TacticalView/elements/Agents.php | 17 +- .../lib/TacticalView/elements/Groups.php | 204 +++++++++--------- 4 files changed, 124 insertions(+), 112 deletions(-) diff --git a/pandora_console/include/functions_graph.php b/pandora_console/include/functions_graph.php index 58ed138259..de60bd8f7b 100644 --- a/pandora_console/include/functions_graph.php +++ b/pandora_console/include/functions_graph.php @@ -5115,7 +5115,8 @@ function graph_so_by_group($id_group, $width=300, $height=200, $recursive=true, FROM tagente a LEFT JOIN tagent_secondary_group g ON g.id_agent = a.id_agente LEFT JOIN tconfig_os os ON a.id_os = os.id_os - WHERE a.id_grupo IN (%s) OR g.id_group IN (%s) + WHERE (a.id_grupo IN (%s) OR g.id_group IN (%s)) + AND a.disabled = 0 GROUP BY os.id_os', implode(',', $id_groups), implode(',', $id_groups) @@ -5205,13 +5206,14 @@ function graph_events_agent_by_group($id_group, $width=300, $height=200, $noWate // 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 + 'SELECT DISTINCT(te.id_agente) AS id_agente, + COUNT(te.id_agente) AS count FROM tevento te + LEFT JOIN tagente a ON a.id_agente = te.id_agente LEFT JOIN tagent_secondary_group g ON g.id_agent = te.id_agente WHERE 1=1 AND estado = 0 - %s %s - GROUP BY id_agente + %s %s AND a.disabled = 0 + GROUP BY te.id_agente ORDER BY count DESC LIMIT 8', $tags_condition, $filter_groups diff --git a/pandora_console/include/functions_groups.php b/pandora_console/include/functions_groups.php index 78b0804c30..a09baf5d9f 100644 --- a/pandora_console/include/functions_groups.php +++ b/pandora_console/include/functions_groups.php @@ -2503,7 +2503,8 @@ function groups_get_heat_map_agents(array $id_group, float $width=0, float $heig $sql = 'SELECT * FROM tagente a LEFT JOIN tagent_secondary_group g ON g.id_agent = a.id_agente - WHERE a.id_grupo IN ('.implode(',', $id_group).') OR g.id_group IN ('.implode(',', $id_group).')'; + WHERE (a.id_grupo IN ('.implode(',', $id_group).') OR g.id_group IN ('.implode(',', $id_group).')) + AND a.disabled = 0'; $all_agents = db_get_all_rows_sql($sql); if (empty($all_agents)) { diff --git a/pandora_console/include/lib/TacticalView/elements/Agents.php b/pandora_console/include/lib/TacticalView/elements/Agents.php index a0e14313e0..d0349f26d3 100644 --- a/pandora_console/include/lib/TacticalView/elements/Agents.php +++ b/pandora_console/include/lib/TacticalView/elements/Agents.php @@ -352,6 +352,7 @@ class Agents extends Element */ public function getStatusGraph():string { + $data = []; $agents = agents_get_agents( false, [ @@ -435,13 +436,17 @@ class Agents extends Element // To avoid that if a value is too small it is not seen. $percentages = []; $total = array_sum($data); - foreach ($data as $key => $value) { - $percentage = (($value / $total) * 100); - if ($percentage < 1 && $percentage > 0) { - $percentage = 1; - } + if ($total > 0) { + foreach ($data as $key => $value) { + $percentage = (($value / $total) * 100); + if ($percentage < 1 && $percentage > 0) { + $percentage = 1; + } - $percentages[$key] = format_numeric($percentage, 0); + $percentages[$key] = format_numeric($percentage, 0); + } + } else { + $percentages = []; } $data = $percentages; diff --git a/pandora_console/include/lib/TacticalView/elements/Groups.php b/pandora_console/include/lib/TacticalView/elements/Groups.php index 4fe07b743a..a86b8465a4 100644 --- a/pandora_console/include/lib/TacticalView/elements/Groups.php +++ b/pandora_console/include/lib/TacticalView/elements/Groups.php @@ -113,116 +113,119 @@ class Groups extends Element $id_groups = implode(',', $id_groups); $modules = modules_get_modules_in_group($id_groups); - $total_groups = count($modules); - if ($total_groups === 0) { - return graph_nodata_image(['width' => '400']); - } - - // 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_groups) { - $low = $mid; - } else { - $high = $mid; - } - } - - $square_length = min(($width / floor($width / $low)), ($height / floor($height / $low))); - // Print starmap. - $heatmap = sprintf( - '', - $width, - $height - ); - - $heatmap .= ''; - $row = 0; - $column = 0; - $x = 0; - $y = 0; - $cont = 1; - foreach ($modules as $key => $value) { - $module_id = $value['id_agente_modulo']; - $module_status = db_get_row( - 'tagente_estado', - 'id_agente_modulo', - $module_id, - ); - - $module_value = modules_get_last_value($module_id); - $status = ''; - $title = ''; - modules_get_status($module_id, $module_status['estado'], $module_value, $status, $title); - switch ($status) { - case STATUS_MODULE_NO_DATA: - // Not init status. - $status = 'notinit'; - break; - - case STATUS_MODULE_CRITICAL: - // Critical status. - $status = 'critical'; - break; - - case STATUS_MODULE_WARNING: - // Warning status. - $status = 'warning'; - break; - - case STATUS_MODULE_OK: - // Normal status. - $status = 'normal'; - break; - - case 3: - case -1: - default: - // Unknown status. - $status = 'unknown'; - break; + $heatmap = ''; + if (is_array($modules) === true) { + $total_groups = count($modules); + if ($total_groups === 0) { + return graph_nodata_image(['width' => '400']); } - $redirect = ''; - if (check_acl($config['id_user'], 0, 'AW')) { - $redirect = 'onclick="redirectHeatmap(\'module\', '.$module_id.', '.$value['id_agente'].')"'; + // 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_groups) { + $low = $mid; + } else { + $high = $mid; + } } + $square_length = min(($width / floor($width / $low)), ($height / floor($height / $low))); + // Print starmap. $heatmap .= sprintf( - '', - 'rect_'.$cont, - $x, - $value['nombre'], - $y, - $row, - $column, - $square_length, - $square_length, - $status, - random_int(1, 10) + '', + $width, + $height ); - $y += $square_length; - $row++; - if ((int) ($y + $square_length) > (int) $height) { - $y = 0; - $x += $square_length; - $row = 0; - $column++; - } + $heatmap .= ''; + $row = 0; + $column = 0; + $x = 0; + $y = 0; + $cont = 1; + foreach ($modules as $key => $value) { + $module_id = $value['id_agente_modulo']; + $module_status = db_get_row( + 'tagente_estado', + 'id_agente_modulo', + $module_id, + ); + + $module_value = modules_get_last_value($module_id); + $status = ''; + $title = ''; + modules_get_status($module_id, $module_status['estado'], $module_value, $status, $title); + switch ($status) { + case STATUS_MODULE_NO_DATA: + // Not init status. + $status = 'notinit'; + break; + + case STATUS_MODULE_CRITICAL: + // Critical status. + $status = 'critical'; + break; + + case STATUS_MODULE_WARNING: + // Warning status. + $status = 'warning'; + break; + + case STATUS_MODULE_OK: + // Normal status. + $status = 'normal'; + break; + + case 3: + case -1: + default: + // Unknown status. + $status = 'unknown'; + break; + } + + $redirect = ''; + if (check_acl($config['id_user'], 0, 'AW')) { + $redirect = 'onclick="redirectHeatmap(\'module\', '.$module_id.', '.$value['id_agente'].')"'; + } + + $heatmap .= sprintf( + '', + 'rect_'.$cont, + $x, + $value['nombre'], + $y, + $row, + $column, + $square_length, + $square_length, + $status, + random_int(1, 10) + ); - if ((int) ($x + $square_length) > (int) $width) { - $x = 0; $y += $square_length; - $column = 0; $row++; - } + if ((int) ($y + $square_length) > (int) $height) { + $y = 0; + $x += $square_length; + $row = 0; + $column++; + } - $cont++; + if ((int) ($x + $square_length) > (int) $width) { + $x = 0; + $y += $square_length; + $column = 0; + $row++; + } + + $cont++; + } } $heatmap .= '', - '
- - logo + + logo diff --git a/pandora_console/include/javascript/pandora.js b/pandora_console/include/javascript/pandora.js index 247a0a8eda..8d7bf3a1b2 100644 --- a/pandora_console/include/javascript/pandora.js +++ b/pandora_console/include/javascript/pandora.js @@ -2366,7 +2366,7 @@ $(document).ready(function() { // Hidden tips modal. $(".window").css("display", "none"); - var type_about = "about_operation"; + var type_about = "about"; if ($(this).attr("id") === "icon_about") { type_about = "about"; } From 64b0bb55a8ee771d8c6b295349ee3325d155619b Mon Sep 17 00:00:00 2001 From: Daniel Maya Date: Mon, 8 Jan 2024 16:10:07 +0100 Subject: [PATCH 086/170] #12729 Fixed weekly task --- pandora_console/include/functions_cron_task.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pandora_console/include/functions_cron_task.php b/pandora_console/include/functions_cron_task.php index 40a6e159cc..042d79dad7 100644 --- a/pandora_console/include/functions_cron_task.php +++ b/pandora_console/include/functions_cron_task.php @@ -383,6 +383,13 @@ function cron_task_run( $nameday = strtolower($datetime->format('l')); } } + } else if (empty($old_args['first_execution']) === false) { + $datetime = new DateTime(); + $datetime->setTimestamp($old_args['first_execution']); + $datetime->modify('+7 day'); + $weekly_date = $datetime->format('Y-m-d'); + $weekly_time = $datetime->format('H:i:s'); + $old_args['first_execution'] = strtotime($weekly_date.' '.$weekly_time); } } else { // Add it to next execution. From b220cc1eb45f9f972cb741a740f8fbbc8fcbb484 Mon Sep 17 00:00:00 2001 From: Daniel Maya Date: Mon, 8 Jan 2024 16:19:37 +0100 Subject: [PATCH 087/170] #12624 Added close_dialog.svg --- pandora_console/images/close_dialog.svg | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 pandora_console/images/close_dialog.svg diff --git a/pandora_console/images/close_dialog.svg b/pandora_console/images/close_dialog.svg new file mode 100644 index 0000000000..79938dacf8 --- /dev/null +++ b/pandora_console/images/close_dialog.svg @@ -0,0 +1,14 @@ + + + F911E81E-C05E-4E17-B88A-07CFEEBD0229 + + + + + + + + + + + \ No newline at end of file From d8a5f1a521bff115a2ab435e5ea1ec91e738ac41 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Mon, 8 Jan 2024 16:35:37 +0100 Subject: [PATCH 088/170] #12560 fix type --- pandora_console/include/class/ConsoleSupervisor.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/include/class/ConsoleSupervisor.php b/pandora_console/include/class/ConsoleSupervisor.php index ae12f37772..b41cd23cb9 100644 --- a/pandora_console/include/class/ConsoleSupervisor.php +++ b/pandora_console/include/class/ConsoleSupervisor.php @@ -928,7 +928,7 @@ class ConsoleSupervisor false ); - if ($data['type'] === 'NOTIF.UPDATEMANAGER.REGISTRATION' && $prev !== false) { + if ($data['type'] === 'NOTIF.LOG.ALERT' && $prev !== false) { return; } else if ($prev !== false && (time() - $prev['timestamp']) > $max_age From 9a7ef16f9cabf17def8db87cf3adcc7dbd029740 Mon Sep 17 00:00:00 2001 From: "alejandro.campos@artica.es" Date: Mon, 8 Jan 2024 17:31:52 +0100 Subject: [PATCH 089/170] implement several changes in top-n connection report item --- .../reporting_builder.item_editor.php | 83 ++++++++- .../godmode/reporting/reporting_builder.php | 13 ++ pandora_console/include/functions_netflow.php | 170 ++++++++++++++---- .../include/functions_reporting.php | 23 ++- pandora_console/include/styles/pandora.css | 4 + 5 files changed, 253 insertions(+), 40 deletions(-) diff --git a/pandora_console/godmode/reporting/reporting_builder.item_editor.php b/pandora_console/godmode/reporting/reporting_builder.item_editor.php index 7199c5e15b..49a8419aa6 100755 --- a/pandora_console/godmode/reporting/reporting_builder.item_editor.php +++ b/pandora_console/godmode/reporting/reporting_builder.item_editor.php @@ -1042,7 +1042,11 @@ switch ($action) { $resolution = $item['top_n']; // Interval resolution. $max_values = $item['top_n_value']; - // Max values. + $es = json_decode($item['external_source'], true); + $top_n_type = $es['top_n_type']; + $display_graph = $es['display_graph']; + $display_summary = $es['display_summary']; + $display_data_table = $es['display_data_table']; break; case 'permissions_report': @@ -1687,6 +1691,75 @@ if (is_metaconsole() === true) {
+ __('Show aggregate by destination port'), + 1 => __('Show InBound/Outbound traffic per SrcIP/DestIP'), + ]; + html_print_select( + $types, + 'top_n_type', + $top_n_type, + '' + ); + ?> +
+ + + +
+ + + +
+ + + +
data = []; $table->head = []; - $table->head[0] = ''.__('Source IP').''; - $table->head[1] = ''.__('Destination IP').''; - $table->head[2] = ''.__('Bytes').''; - $table->head[3] = ''.__('% Traffic').''; - $table->head[4] = ''.__('Avg. Throughput').''; - $table->style[0] = 'padding: 4px'; + if ($show_extended === false) { + $table->head[0] = ''.__('Source IP').''; + $table->head[1] = ''.__('Destination IP').''; + $table->head[2] = ''.__('Bytes').''; + $table->head[3] = ''.__('% Traffic').''; + $table->head[4] = ''.__('Avg. Throughput').''; + $table->style[0] = 'padding: 4px'; + } else { + $table->head[0] = ''.__('Source IP').''; + $table->head[1] = ''.__('Destination IP').''; + $table->head[2] = ''.__('Ingress bytes').''; + $table->head[3] = ''.__('Egress bytes').''; + $table->head[4] = ''.__('Ingress packets').''; + $table->head[5] = ''.__('Egress packets').''; + $table->head[6] = ''.__('% Traffic').''; + $table->head[7] = ''.__('Avg. Throughput').''; + $table->style[0] = 'padding: 4px'; + } $i = 0; foreach ($data as $value) { $table->data[$i][0] = $value['ip_src']; $table->data[$i][1] = $value['ip_dst']; - $table->data[$i][2] = network_format_bytes($value['bytes']); - $traffic = '-'; - - if ($total_bytes > 0) { - $traffic = sprintf( - '%.2f', - (($value['bytes'] / $total_bytes) * 100) - ); + if ($show_extended === true) { + $table->data[$i][2] = network_format_bytes($value['ibytes']); + $table->data[$i][3] = network_format_bytes($value['obytes']); + $table->data[$i][4] = network_format_bytes($value['ipackages']); + $table->data[$i][5] = network_format_bytes($value['opackages']); + $table->data[$i][6] = $value['traffic'].' %'; + } else { + $table->data[$i][2] = network_format_bytes($value['bytes']); + $table->data[$i][3] = $value['traffic'].' %'; } - $table->data[$i][3] = $traffic.' %'; - $units = [ 'bps', 'Kbps', @@ -382,7 +394,11 @@ function netflow_top_n_table(array $data, int $total_bytes) $value['bps'] /= pow(1024, $pow); - $table->data[$i][4] = round($value['bps'], 2).' '.$units[$pow]; + if ($show_extended === true) { + $table->data[$i][7] = round($value['bps'], 2).' '.$units[$pow]; + } else { + $table->data[$i][4] = round($value['bps'], 2).' '.$units[$pow]; + } $i++; } @@ -481,7 +497,9 @@ function netflow_get_top_N( string $end_date, array $filter, int $max, - string $connection_name='' + string $connection_name='', + bool $extended_info=false, + int $total_bytes=0 ) { global $nfdump_date_format; @@ -496,7 +514,8 @@ function netflow_get_top_N( return json_decode($data, true); } - $options = '-o "fmt:%sap,%dap,%ibyt,%bps" -q -n '.$max.' -s record/bytes -t '.date($nfdump_date_format, $start_date).'-'.date($nfdump_date_format, $end_date); + $opts = ($extended_info === true) ? 'fmt:%sap,%dap,%ibyt,%obyt,%ipkt,%opkt,%bps' : 'fmt:%sap,%dap,%ibyt,%ipkt,%bps'; + $options = '-o "'.$opts.'" -q -n '.$max.' -s record/bytes -t '.date($nfdump_date_format, $start_date).'-'.date($nfdump_date_format, $end_date); $command = netflow_get_command($options, $filter, $start_date, $end_date); @@ -516,8 +535,29 @@ function netflow_get_top_N( $values[$i]['ip_src'] = $parsed_line[0]; $values[$i]['ip_dst'] = $parsed_line[1]; - $values[$i]['bytes'] = $parsed_line[2]; - $values[$i]['bps'] = $parsed_line[3]; + + $traffic = '-'; + if ($total_bytes > 0) { + $conn_bytes = $parsed_line[2]; + + $traffic = sprintf( + '%.2f', + (($conn_bytes / $total_bytes) * 100) + ); + } + + $values[$i]['traffic'] = $traffic; + + if ($extended_info === true) { + $values[$i]['ibytes'] = $parsed_line[2]; + $values[$i]['obytes'] = $parsed_line[3]; + $values[$i]['ipackets'] = $parsed_line[4]; + $values[$i]['opackets'] = $parsed_line[5]; + $values[$i]['bps'] = $parsed_line[6]; + } else { + $values[$i]['bytes'] = $parsed_line[2]; + $values[$i]['bps'] = $parsed_line[3]; + } $i++; } @@ -1341,7 +1381,11 @@ function netflow_draw_item( $output='HTML', $address_resolution=false, $width_content=false, - $height_content=false + $height_content=false, + $extended=false, + $show_graph=true, + $show_summary=true, + $show_table=true ) { $aggregate = $filter['aggregate']; $interval = ($end_date - $start_date); @@ -1496,7 +1540,9 @@ function netflow_draw_item( $end_date, $filter, $max_aggregates, - $connection_name + $connection_name, + $extended, + $data_summary['totalbytes'] ); if (empty($data_top_n) === true) { @@ -1505,16 +1551,61 @@ function netflow_draw_item( if ($output === 'HTML' || $output === 'PDF') { $html = ''; - $html .= ''; - $html .= "'; - $html .= ''; - $html .= ''; - $html .= "'; - $html .= ''; + + if ($show_graph === true && $max_aggregates <= 10) { + $labels = array_map( + function ($conn) { + return __('% Traffic').' '.$conn['ip_src'].' - '.$conn['ip_dst']; + }, + $data_top_n + ); + + $pie_data = array_map( + function ($conn) { + return $conn['traffic']; + }, + $data_top_n + ); + + $graph_output = pie_graph( + $pie_data, + [ + 'legend' => [ + 'display' => true, + 'position' => 'right', + 'align' => 'center', + ], + 'labels' => $labels, + ] + ); + + $html .= ''; + $html .= "'; + $html .= ''; + } + + if ($show_summary === true) { + $html .= ''; + $html .= "'; + $html .= ''; + } + + if ($show_table === true) { + $html .= ''; + $html .= "'; + $html .= ''; + } + $html .= '
"; - $html .= netflow_summary_table($data_summary); - $html .= '
"; - $html .= netflow_top_n_table($data_top_n, $data_summary['totalbytes']); - $html .= '
"; + $html .= $graph_output; + $html .= '
"; + $html .= netflow_summary_table($data_summary); + $html .= '
"; + $html .= netflow_top_n_table( + $data_top_n, + $data_summary['totalbytes'], + $extended + ); + $html .= '
'; return $html; @@ -1638,7 +1729,8 @@ function netflow_get_item_data( string $type_netflow, array $filter, int $max_aggregates, - string $connection_name + string $connection_name, + bool $extended=false ) { $data = []; @@ -1656,7 +1748,9 @@ function netflow_get_item_data( $end_date, $filter, $max_aggregates, - $connection_name + $connection_name, + $extended, + $data_summary['totalbytes'] ); $data = [ diff --git a/pandora_console/include/functions_reporting.php b/pandora_console/include/functions_reporting.php index bccada9cb8..2b8a0f01ef 100755 --- a/pandora_console/include/functions_reporting.php +++ b/pandora_console/include/functions_reporting.php @@ -6981,6 +6981,20 @@ function reporting_netflow( $filter['aggregate'] = 'dstport'; } + $es = json_decode($content['external_source'], true); + + $extended = false; + $show_graph = false; + $show_summary = false; + $show_table = false; + + if (empty($es) === false) { + $extended = ((int) $es['top_n_type'] === 1); + $show_graph = ((int) $es['display_graph'] === 1); + $show_summary = ((int) $es['display_summary'] === 1); + $show_table = ((int) $es['display_data_table'] === 1); + } + switch ($type) { case 'dinamic': case 'static': @@ -6992,7 +7006,14 @@ function reporting_netflow( $filter, $content['top_n_value'], $content['server_name'], - (($pdf === true) ? 'PDF' : 'HTML') + (($pdf === true) ? 'PDF' : 'HTML'), + false, + false, + false, + $extended, + $show_graph, + $show_summary, + $show_table ); break; diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 71118e529a..835c964758 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -1017,6 +1017,10 @@ select:-internal-list-box { padding-bottom: 5px; } +.padding-bottom-25px { + padding-bottom: 25px; +} + .padding-right-2 { padding-right: 2em; } From f6ee798603d5e4d939a6f6f1555c3dd8f06d1084 Mon Sep 17 00:00:00 2001 From: "alejandro.campos@artica.es" Date: Mon, 8 Jan 2024 17:59:23 +0100 Subject: [PATCH 090/170] implement several changes in top-n connection report item --- pandora_console/include/functions_netflow.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/pandora_console/include/functions_netflow.php b/pandora_console/include/functions_netflow.php index c4d6b4dfe0..51b74c59b0 100644 --- a/pandora_console/include/functions_netflow.php +++ b/pandora_console/include/functions_netflow.php @@ -349,8 +349,9 @@ function netflow_top_n_table(array $data, int $total_bytes, bool $show_extended= $table->head[0] = ''.__('Source IP').''; $table->head[1] = ''.__('Destination IP').''; $table->head[2] = ''.__('Bytes').''; - $table->head[3] = ''.__('% Traffic').''; - $table->head[4] = ''.__('Avg. Throughput').''; + $table->head[3] = ''.__('Packets').''; + $table->head[4] = ''.__('% Traffic').''; + $table->head[5] = ''.__('Avg. Throughput').''; $table->style[0] = 'padding: 4px'; } else { $table->head[0] = ''.__('Source IP').''; @@ -378,7 +379,8 @@ function netflow_top_n_table(array $data, int $total_bytes, bool $show_extended= $table->data[$i][6] = $value['traffic'].' %'; } else { $table->data[$i][2] = network_format_bytes($value['bytes']); - $table->data[$i][3] = $value['traffic'].' %'; + $table->data[$i][3] = network_format_bytes($value['ipackages']); + $table->data[$i][4] = $value['traffic'].' %'; } $units = [ @@ -397,7 +399,7 @@ function netflow_top_n_table(array $data, int $total_bytes, bool $show_extended= if ($show_extended === true) { $table->data[$i][7] = round($value['bps'], 2).' '.$units[$pow]; } else { - $table->data[$i][4] = round($value['bps'], 2).' '.$units[$pow]; + $table->data[$i][5] = round($value['bps'], 2).' '.$units[$pow]; } $i++; From 19024e63d304a6d854e1f8f05e324813a813f450 Mon Sep 17 00:00:00 2001 From: "alejandro.campos@artica.es" Date: Mon, 8 Jan 2024 18:05:29 +0100 Subject: [PATCH 091/170] implement several changes in top-n connection report item --- pandora_console/include/functions_netflow.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pandora_console/include/functions_netflow.php b/pandora_console/include/functions_netflow.php index 51b74c59b0..770314f507 100644 --- a/pandora_console/include/functions_netflow.php +++ b/pandora_console/include/functions_netflow.php @@ -374,12 +374,12 @@ function netflow_top_n_table(array $data, int $total_bytes, bool $show_extended= if ($show_extended === true) { $table->data[$i][2] = network_format_bytes($value['ibytes']); $table->data[$i][3] = network_format_bytes($value['obytes']); - $table->data[$i][4] = network_format_bytes($value['ipackages']); - $table->data[$i][5] = network_format_bytes($value['opackages']); + $table->data[$i][4] = (empty($value['ipackages']) === true) ? 0 : $value['ipackages']; + $table->data[$i][5] = (empty($value['opackages']) === true) ? 0 : $value['opackages']; $table->data[$i][6] = $value['traffic'].' %'; } else { $table->data[$i][2] = network_format_bytes($value['bytes']); - $table->data[$i][3] = network_format_bytes($value['ipackages']); + $table->data[$i][3] = (empty($value['ipackages']) === true) ? 0 : $value['ipackages']; $table->data[$i][4] = $value['traffic'].' %'; } From 600797d531a2ba9e51db042f17a8fc3055c933fe Mon Sep 17 00:00:00 2001 From: "felix.suarez" Date: Mon, 8 Jan 2024 14:50:11 -0600 Subject: [PATCH 092/170] Previous installation verification --- pandora_server/pandora_server_installer | 31 ++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index ca831fb1e5..f77a2c294d 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -191,7 +191,36 @@ install () { esac shift done - + + # Alternative destdir has been selected + if [ ! -z "$DESTDIR" ] + then + # Files from previous installation were found + if [ -d "/usr/lib/perl5/PandoraFMS" ] + then + GREEN='\033[01;32m' + NONE='\033[0m' + + echo -e -n "Files from a previous installation were found in ${GREEN}/usr/lib/perl5/PandoraFMS/${NONE}. " + read -p "That directory will be deleted in order to preserve integrity. Do you wish to proceed? (y/N): " USERAPPROVAL + + if [ "${USERAPPROVAL,,}" = "y" ]; then + rm -rf "/usr/lib/perl5/PandoraFMS" + echo -e "Previous PandoraFMS directory deleted successfully" + else + echo -e -n "Files in ${GREEN}/usr/lib/perl5/PandoraFMS/${NONE} will not be deleted. This may cause issues. " + read -p "Do you want to proceed with the installation anyway? (y/N): " USERAPPROVAL + + if [ "${USERAPPROVAL,,}" = "y" ]; then + echo "Proceeding with the installation anyway. This may cause problems in the future due to the existence of files from previous installations." + else + echo "Installation aborted. You chose not to proceed." + exit 1 + fi + fi + fi + fi + if [ "$LINUX" = YES ] then echo "$DISTRO distribution detected" From 6930631c666716c6dee01e16d7e3bcfe121268b5 Mon Sep 17 00:00:00 2001 From: artica Date: Tue, 9 Jan 2024 01:00:36 +0100 Subject: [PATCH 093/170] 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.redhat_bin.el8.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.el9.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.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 +- 28 files changed, 28 insertions(+), 28 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 6dbde75c14..f4cf6d6873 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.775-240108 +Version: 7.0NG.775-240109 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 e5fb421ee7..0d7bf85256 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.775-240108" +pandora_version="7.0NG.775-240109" 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 329b7cd4eb..65e217abf7 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1039,7 +1039,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.775'; -use constant AGENT_BUILD => '240108'; +use constant AGENT_BUILD => '240109'; # 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 78227f9722..25a839e06d 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.775 -%define release 240108 +%define release 240109 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec index 223f7ddd3a..71642c1bea 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240108 +%define release 240109 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec index 985dc94ee3..bbd4bddda3 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240108 +%define release 240109 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.spec b/pandora_agents/unix/pandora_agent.redhat_bin.spec index c012e57986..bea5350cf4 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240108 +%define release 240109 Summary: Pandora FMS Linux agent, binary version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index a2fd40c6b9..77a2f924c5 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.775 -%define release 240108 +%define release 240109 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 549b940b16..5d28ca2209 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240108" +PI_BUILD="240109" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 010569a44e..47edea04b1 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{240108} +{240109} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index c0a23b2b3c..d2b31d56fb 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.775 Build 240108") +#define PANDORA_VERSION ("7.0NG.775 Build 240109") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 41b4047b80..ace88b3231 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Pandora FMS" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.775(Build 240108))" + VALUE "ProductVersion", "(7.0NG.775(Build 240109))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 44718a8689..bad60d688e 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.775-240108 +Version: 7.0NG.775-240109 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 ea868b70ae..58da53bd56 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.775-240108" +pandora_version="7.0NG.775-240109" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index cb8a22ff48..3b0e78ab45 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 = 'PC240108'; +$build_version = 'PC240109'; $pandora_version = 'v7.0NG.775'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 4da14ce00f..87409ba611 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 fca43bc163..5f3e73dae5 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -7,7 +7,7 @@ %define debug_package %{nil} %define name pandorafms_server %define version 7.0NG.775 -%define release 240108 +%define release 240109 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index dc04885acb..459e088489 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.775 -%define release 240108 +%define release 240109 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index ca831fb1e5..6dfbc64015 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240108" +PI_BUILD="240109" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 2c8eb34e52..982fd78c47 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -38,7 +38,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.775 Build 240108"; +my $version = "7.0NG.775 Build 240109"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 9c7a310564..501b3cf072 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.775 Build 240108"; +my $version = "7.0NG.775 Build 240109"; # save program name for logging my $progname = basename($0); From 2ace34425cd1fc001b8c05ee3f9ebb69421f6dc7 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Tue, 9 Jan 2024 16:04:28 +0100 Subject: [PATCH 094/170] #12143 fix datepicker --- .../include/javascript/pandora_dashboards.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/pandora_console/include/javascript/pandora_dashboards.js b/pandora_console/include/javascript/pandora_dashboards.js index 1adc27eec9..3b2824a89e 100644 --- a/pandora_console/include/javascript/pandora_dashboards.js +++ b/pandora_console/include/javascript/pandora_dashboards.js @@ -8,7 +8,8 @@ function show_option_dialog(settings) { modal: { title: settings.title, cancel: settings.btn_cancel, - ok: settings.btn_text + ok: settings.btn_text, + overlay: true }, onshow: { page: settings.url, @@ -25,6 +26,9 @@ function show_option_dialog(settings) { oncancel: { reload: true }, + onclose: { + reload: true + }, ajax_callback: update_dashboard }); } @@ -462,8 +466,10 @@ function initialiceLayout(data) { function configurationWidget(cellId, widgetId, size) { var reload = 0; + var overlay = false; if (widgetId == 46) { reload = 1; + overlay = true; } title = $("#hidden-widget_name_" + cellId).val(); load_modal({ @@ -473,7 +479,8 @@ function initialiceLayout(data) { modal: { title: "Configure widget " + title, cancel: "Cancel", - ok: "Ok" + ok: "Ok", + overlay: overlay }, onshow: { page: data.page, From 6bb619fb62580f413094aa942d1e1f888e1b0c53 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Tue, 9 Jan 2024 16:47:53 +0100 Subject: [PATCH 095/170] #12733 fix delete button --- pandora_console/godmode/events/event_filter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/godmode/events/event_filter.php b/pandora_console/godmode/events/event_filter.php index c4f1860e6f..617fa3da73 100644 --- a/pandora_console/godmode/events/event_filter.php +++ b/pandora_console/godmode/events/event_filter.php @@ -210,7 +210,7 @@ foreach ($filters as $filter) { true, [ 'title' => __('Delete'), - 'class' => 'invert_filter', + 'class' => 'invert_filter main_menu_icon', ] ).''; } From 353c7e1fa14d9b527c430664165c43247443adc5 Mon Sep 17 00:00:00 2001 From: artica Date: Wed, 10 Jan 2024 01:00:40 +0100 Subject: [PATCH 096/170] 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.redhat_bin.el8.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.el9.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.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 +- 28 files changed, 28 insertions(+), 28 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index f4cf6d6873..38f1c407fb 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.775-240109 +Version: 7.0NG.775-240110 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 0d7bf85256..ec1ed096e0 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.775-240109" +pandora_version="7.0NG.775-240110" 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 65e217abf7..5e32d4cda2 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1039,7 +1039,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.775'; -use constant AGENT_BUILD => '240109'; +use constant AGENT_BUILD => '240110'; # 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 25a839e06d..f50c52a799 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.775 -%define release 240109 +%define release 240110 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec index 71642c1bea..e47ca2fccc 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240109 +%define release 240110 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec index bbd4bddda3..7e3f12c1b9 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240109 +%define release 240110 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.spec b/pandora_agents/unix/pandora_agent.redhat_bin.spec index bea5350cf4..33f183ece0 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240109 +%define release 240110 Summary: Pandora FMS Linux agent, binary version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 77a2f924c5..f368c1d849 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.775 -%define release 240109 +%define release 240110 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 5d28ca2209..2607868f4c 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240109" +PI_BUILD="240110" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 47edea04b1..6881464877 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{240109} +{240110} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index d2b31d56fb..f128cb7ae7 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.775 Build 240109") +#define PANDORA_VERSION ("7.0NG.775 Build 240110") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index ace88b3231..e459b72a99 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Pandora FMS" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.775(Build 240109))" + VALUE "ProductVersion", "(7.0NG.775(Build 240110))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index bad60d688e..295a0b97c4 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.775-240109 +Version: 7.0NG.775-240110 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 58da53bd56..4e047827f3 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.775-240109" +pandora_version="7.0NG.775-240110" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 3b0e78ab45..f1279398b4 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 = 'PC240109'; +$build_version = 'PC240110'; $pandora_version = 'v7.0NG.775'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 87409ba611..035c6009da 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 5f3e73dae5..70ca075e31 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -7,7 +7,7 @@ %define debug_package %{nil} %define name pandorafms_server %define version 7.0NG.775 -%define release 240109 +%define release 240110 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 459e088489..85672ad76a 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.775 -%define release 240109 +%define release 240110 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 6dfbc64015..2ff1e0f1ca 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240109" +PI_BUILD="240110" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 982fd78c47..492ad5a954 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -38,7 +38,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.775 Build 240109"; +my $version = "7.0NG.775 Build 240110"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 501b3cf072..5634f84abb 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.775 Build 240109"; +my $version = "7.0NG.775 Build 240110"; # save program name for logging my $progname = basename($0); From f42a0de0edebd4891bcf3d7b253b8ec9b6a31198 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Wed, 10 Jan 2024 08:53:49 +0100 Subject: [PATCH 097/170] #12727 fix search agents --- pandora_console/operation/search_results.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandora_console/operation/search_results.php b/pandora_console/operation/search_results.php index 76638e3525..3903ddca19 100644 --- a/pandora_console/operation/search_results.php +++ b/pandora_console/operation/search_results.php @@ -33,7 +33,7 @@ foreach ($arrayKeywords as $keyword) { array_push($temp, '%'.$keyword.'%'); } -$stringSearchSQL = implode(' ', $temp); +$stringSearchSQL = implode('', $temp); $stringSearchSQL = str_replace('_', '\_', $stringSearchSQL); $_SESSION['stringSearchSQL'] = $stringSearchSQL; @@ -206,7 +206,7 @@ ui_print_standard_header( ); $only_count = false; - +hd(io_safe_input($_SESSION['stringSearchSQL']), true); switch ($searchTab) { case 'main': $only_count = true; From 034b9805cc1cee6d171e673920e83fc29ecb6e46 Mon Sep 17 00:00:00 2001 From: Daniel Maya Date: Wed, 10 Jan 2024 11:17:46 +0100 Subject: [PATCH 098/170] #12734 Fixed visible --- .../godmode/gis_maps/configure_gis_map.php | 24 ++++++++++++++----- pandora_console/operation/gis_maps/ajax.php | 10 ++++++++ 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/pandora_console/godmode/gis_maps/configure_gis_map.php b/pandora_console/godmode/gis_maps/configure_gis_map.php index cc9ed5d5f0..7a0e4b61e1 100644 --- a/pandora_console/godmode/gis_maps/configure_gis_map.php +++ b/pandora_console/godmode/gis_maps/configure_gis_map.php @@ -68,7 +68,7 @@ foreach ($layer_ids as $layer_id) { $layer_list[] = [ 'id' => (strpos($layer_id, 'new_') === false) ? (int) $layer_id : null, 'layer_name' => $trimmed_name, - 'layer_visible' => ($layers[$layer_id]['visible'] === 'true'), + 'layer_visible' => ($layers[$layer_id]['visible'] == 'true' || $layers[$layer_id]['visible'] === '1'), 'layer_group' => (int) $layers[$layer_id]['agents_from_group'], 'layer_agent_list' => $layers[$layer_id]['agents'], 'layer_group_list' => $layers[$layer_id]['groups'], @@ -562,8 +562,6 @@ $table->data[9][1] = html_print_input_text('map_default_altitude', $map_default_ html_print_table($table); -$user_groups = users_get_groups($config['user'], 'AR', false); - echo '
'.__('Layers').''; $table->width = '100%'; @@ -589,7 +587,7 @@ $table->data[1][0] = '
'.__('Show agents from group').':'.html_print_select($user_groups, 'layer_group_form', '-1', '', __('none'), '-1', true).''.html_print_select_groups($config['id_user'], 'AR', true, 'layer_group_form', '', '', __('none'), '-1', true).'

'; - - if ($show_graph === true && $max_aggregates <= 10) { + if ($show_graph === true) { $labels = array_map( function ($conn) { return __('% Traffic').' '.$conn['ip_src'].' - '.$conn['ip_dst']; @@ -1572,18 +1571,34 @@ function netflow_draw_item( $graph_output = pie_graph( $pie_data, [ - 'legend' => [ + 'width' => 200, + 'height' => 200, + 'ttl' => ($output === 'PDF') ? 2 : 1, + 'dataLabel' => ['display' => 'auto'], + 'layout' => [ + 'padding' => [ + 'top' => 15, + 'bottom' => 15, + ], + ], + 'legend' => [ 'display' => true, 'position' => 'right', 'align' => 'center', ], - 'labels' => $labels, + 'labels' => $labels, ] ); $html .= ''; $html .= "'; $html .= ''; } diff --git a/pandora_console/include/functions_reporting.php b/pandora_console/include/functions_reporting.php index 2b8a0f01ef..8cc539879c 100755 --- a/pandora_console/include/functions_reporting.php +++ b/pandora_console/include/functions_reporting.php @@ -7036,11 +7036,15 @@ function reporting_netflow( break; } - $return['subtitle'] = netflow_generate_subtitle_report( - $filter['aggregate'], - $content['top_n'], - $type_netflow - ); + if ($extended === true) { + $return['subtitle'] = __('InBound/Outbound traffic per SrcIP/DestIP'); + } else { + $return['subtitle'] = netflow_generate_subtitle_report( + $filter['aggregate'], + $content['top_n'], + $type_netflow + ); + } return reporting_check_structure_content($return); } From 1c094cd2193b8ba1aebc9929c14f4cd410e47f54 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Thu, 25 Jan 2024 16:58:21 +0100 Subject: [PATCH 164/170] #12802 fix date error --- pandora_console/extensions/insert_data.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandora_console/extensions/insert_data.php b/pandora_console/extensions/insert_data.php index d06ff90118..98e8886733 100644 --- a/pandora_console/extensions/insert_data.php +++ b/pandora_console/extensions/insert_data.php @@ -223,7 +223,7 @@ 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] = html_print_input_text('date', ($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); @@ -284,7 +284,7 @@ function mainInsertData() currentText: '', closeText: ''}); - $('#text-data').datepicker ({ + $('#text-date').datepicker ({ dateFormat: '', changeMonth: true, changeYear: true, From 31312eaa53083e9c7dac7a9803ed071f914a73c3 Mon Sep 17 00:00:00 2001 From: "alejandro.campos@artica.es" Date: Thu, 25 Jan 2024 17:19:05 +0100 Subject: [PATCH 165/170] visual fix --- pandora_console/godmode/events/event_responses.editor.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pandora_console/godmode/events/event_responses.editor.php b/pandora_console/godmode/events/event_responses.editor.php index 477aa70e85..52d5a48ad1 100644 --- a/pandora_console/godmode/events/event_responses.editor.php +++ b/pandora_console/godmode/events/event_responses.editor.php @@ -292,7 +292,12 @@ $data[0] = html_print_label_input_block( '', '', '', - true + true, + false, + true, + 'w100p', + false, + 'width: 100%' ).'' ); From 823e2b93aea8ef2f52cd6a480631c91d9aabbf24 Mon Sep 17 00:00:00 2001 From: "felix.suarez" Date: Thu, 25 Jan 2024 14:10:59 -0600 Subject: [PATCH 166/170] Add Powershell module --- pandora_agents/win32/Makefile.am | 4 +- .../win32/modules/pandora_module.cc | 2 + pandora_agents/win32/modules/pandora_module.h | 40 ++++---- .../modules/pandora_module_exec_powershell.cc | 91 +++++++++++++++++++ .../modules/pandora_module_exec_powershell.h | 43 +++++++++ .../win32/modules/pandora_module_factory.cc | 18 +++- .../win32/modules/pandora_module_list.cc | 7 ++ 7 files changed, 183 insertions(+), 22 deletions(-) create mode 100644 pandora_agents/win32/modules/pandora_module_exec_powershell.cc create mode 100644 pandora_agents/win32/modules/pandora_module_exec_powershell.h diff --git a/pandora_agents/win32/Makefile.am b/pandora_agents/win32/Makefile.am index 4641081570..94e77312c4 100644 --- a/pandora_agents/win32/Makefile.am +++ b/pandora_agents/win32/Makefile.am @@ -1,9 +1,9 @@ bin_PROGRAMS = PandoraAgent if DEBUG -PandoraAgent_SOURCES = misc/cron.cc misc/pandora_file.cc modules/pandora_data.cc modules/pandora_module_factory.cc modules/pandora_module.cc modules/pandora_module_list.cc modules/pandora_module_plugin.cc modules/pandora_module_inventory.cc modules/pandora_module_freememory.cc modules/pandora_module_exec.cc modules/pandora_module_perfcounter.cc modules/pandora_module_proc.cc modules/pandora_module_tcpcheck.cc modules/pandora_module_freememory_percent.cc modules/pandora_module_freedisk.cc modules/pandora_module_freedisk_percent.cc modules/pandora_module_logevent.cc modules/pandora_module_service.cc modules/pandora_module_cpuusage.cc modules/pandora_module_wmiquery.cc modules/pandora_module_regexp.cc modules/pandora_module_ping.cc modules/pandora_module_snmpget.cc udp_server/udp_server.cc main.cc pandora_strutils.cc pandora.cc windows_service.cc pandora_agent_conf.cc windows/pandora_windows_info.cc windows/pandora_wmi.cc pandora_windows_service.cc misc/md5.c misc/sha256.cc windows/wmi/disphelper.c ssh/libssh2/channel.c ssh/libssh2/mac.c ssh/libssh2/session.c ssh/libssh2/comp.c ssh/libssh2/misc.c ssh/libssh2/sftp.c ssh/libssh2/crypt.c ssh/libssh2/packet.c ssh/libssh2/userauth.c ssh/libssh2/hostkey.c ssh/libssh2/publickey.c ssh/libssh2/kex.c ssh/libssh2/scp.c ssh/pandora_ssh_client.cc ssh/pandora_ssh_test.cc ftp/pandora_ftp_client.cc ftp/pandora_ftp_test.cc debug_new.cpp +PandoraAgent_SOURCES = misc/cron.cc misc/pandora_file.cc modules/pandora_data.cc modules/pandora_module_factory.cc modules/pandora_module.cc modules/pandora_module_list.cc modules/pandora_module_plugin.cc modules/pandora_module_inventory.cc modules/pandora_module_freememory.cc modules/pandora_module_exec.cc modules/pandora_module_exec_powershell.cc modules/pandora_module_perfcounter.cc modules/pandora_module_proc.cc modules/pandora_module_tcpcheck.cc modules/pandora_module_freememory_percent.cc modules/pandora_module_freedisk.cc modules/pandora_module_freedisk_percent.cc modules/pandora_module_logevent.cc modules/pandora_module_service.cc modules/pandora_module_cpuusage.cc modules/pandora_module_wmiquery.cc modules/pandora_module_regexp.cc modules/pandora_module_ping.cc modules/pandora_module_snmpget.cc udp_server/udp_server.cc main.cc pandora_strutils.cc pandora.cc windows_service.cc pandora_agent_conf.cc windows/pandora_windows_info.cc windows/pandora_wmi.cc pandora_windows_service.cc misc/md5.c misc/sha256.cc windows/wmi/disphelper.c ssh/libssh2/channel.c ssh/libssh2/mac.c ssh/libssh2/session.c ssh/libssh2/comp.c ssh/libssh2/misc.c ssh/libssh2/sftp.c ssh/libssh2/crypt.c ssh/libssh2/packet.c ssh/libssh2/userauth.c ssh/libssh2/hostkey.c ssh/libssh2/publickey.c ssh/libssh2/kex.c ssh/libssh2/scp.c ssh/pandora_ssh_client.cc ssh/pandora_ssh_test.cc ftp/pandora_ftp_client.cc ftp/pandora_ftp_test.cc debug_new.cpp PandoraAgent_CXXFLAGS=-g -O0 else -PandoraAgent_SOURCES = misc/cron.cc misc/pandora_file.cc modules/pandora_data.cc modules/pandora_module_factory.cc modules/pandora_module.cc modules/pandora_module_list.cc modules/pandora_module_plugin.cc modules/pandora_module_inventory.cc modules/pandora_module_freememory.cc modules/pandora_module_exec.cc modules/pandora_module_perfcounter.cc modules/pandora_module_proc.cc modules/pandora_module_tcpcheck.cc modules/pandora_module_freememory_percent.cc modules/pandora_module_freedisk.cc modules/pandora_module_freedisk_percent.cc modules/pandora_module_logevent.cc modules/pandora_module_logchannel.cc modules/pandora_module_service.cc modules/pandora_module_cpuusage.cc modules/pandora_module_wmiquery.cc modules/pandora_module_regexp.cc modules/pandora_module_ping.cc modules/pandora_module_snmpget.cc udp_server/udp_server.cc main.cc pandora_strutils.cc pandora.cc windows_service.cc pandora_agent_conf.cc windows/pandora_windows_info.cc windows/pandora_wmi.cc pandora_windows_service.cc misc/md5.c misc/sha256.cc windows/wmi/disphelper.c ssh/libssh2/channel.c ssh/libssh2/mac.c ssh/libssh2/session.c ssh/libssh2/comp.c ssh/libssh2/misc.c ssh/libssh2/sftp.c ssh/libssh2/crypt.c ssh/libssh2/packet.c ssh/libssh2/userauth.c ssh/libssh2/hostkey.c ssh/libssh2/publickey.c ssh/libssh2/kex.c ssh/libssh2/scp.c ssh/pandora_ssh_client.cc ssh/pandora_ssh_test.cc ftp/pandora_ftp_client.cc ftp/pandora_ftp_test.cc +PandoraAgent_SOURCES = misc/cron.cc misc/pandora_file.cc modules/pandora_data.cc modules/pandora_module_factory.cc modules/pandora_module.cc modules/pandora_module_list.cc modules/pandora_module_plugin.cc modules/pandora_module_inventory.cc modules/pandora_module_freememory.cc modules/pandora_module_exec.cc modules/pandora_module_exec_powershell.cc modules/pandora_module_perfcounter.cc modules/pandora_module_proc.cc modules/pandora_module_tcpcheck.cc modules/pandora_module_freememory_percent.cc modules/pandora_module_freedisk.cc modules/pandora_module_freedisk_percent.cc modules/pandora_module_logevent.cc modules/pandora_module_logchannel.cc modules/pandora_module_service.cc modules/pandora_module_cpuusage.cc modules/pandora_module_wmiquery.cc modules/pandora_module_regexp.cc modules/pandora_module_ping.cc modules/pandora_module_snmpget.cc udp_server/udp_server.cc main.cc pandora_strutils.cc pandora.cc windows_service.cc pandora_agent_conf.cc windows/pandora_windows_info.cc windows/pandora_wmi.cc pandora_windows_service.cc misc/md5.c misc/sha256.cc windows/wmi/disphelper.c ssh/libssh2/channel.c ssh/libssh2/mac.c ssh/libssh2/session.c ssh/libssh2/comp.c ssh/libssh2/misc.c ssh/libssh2/sftp.c ssh/libssh2/crypt.c ssh/libssh2/packet.c ssh/libssh2/userauth.c ssh/libssh2/hostkey.c ssh/libssh2/publickey.c ssh/libssh2/kex.c ssh/libssh2/scp.c ssh/pandora_ssh_client.cc ssh/pandora_ssh_test.cc ftp/pandora_ftp_client.cc ftp/pandora_ftp_test.cc PandoraAgent_CXXFLAGS=-O2 endif diff --git a/pandora_agents/win32/modules/pandora_module.cc b/pandora_agents/win32/modules/pandora_module.cc index 2df46ad9d5..69a801e96b 100644 --- a/pandora_agents/win32/modules/pandora_module.cc +++ b/pandora_agents/win32/modules/pandora_module.cc @@ -236,6 +236,8 @@ Module_Kind Pandora_Module::parseModuleKindFromString (string kind) { if (kind == module_exec_str) { return MODULE_EXEC; + } else if (kind == module_exec_powershell_str) { + return MODULE_EXEC_POWERSHELL; } else if (kind == module_proc_str) { return MODULE_PROC; } else if (kind == module_service_str) { diff --git a/pandora_agents/win32/modules/pandora_module.h b/pandora_agents/win32/modules/pandora_module.h index 111fc79c79..bb19b266b2 100644 --- a/pandora_agents/win32/modules/pandora_module.h +++ b/pandora_agents/win32/modules/pandora_module.h @@ -94,7 +94,8 @@ namespace Pandora_Modules { MODULE_REGEXP, /**< The module searches a file for matches of a regular expression */ MODULE_PLUGIN, /**< Plugin */ MODULE_PING, /**< Ping module */ - MODULE_SNMPGET /**< SNMP get module */ + MODULE_SNMPGET, /**< SNMP get module */ + MODULE_EXEC_POWERSHELL /**< The module run a custom powershell command */ } Module_Kind; /** @@ -109,24 +110,25 @@ namespace Pandora_Modules { regex_t regexp; } Condition; - const string module_exec_str = "module_exec"; - const string module_proc_str = "module_proc"; - const string module_service_str = "module_service"; - const string module_freedisk_str = "module_freedisk"; - const string module_freedisk_percent_str = "module_freedisk_percent"; - const string module_freememory_str = "module_freememory"; - const string module_freememory_percent_str = "module_freememory_percent"; - const string module_cpuusage_str = "module_cpuusage"; - const string module_inventory_str = "module_inventory"; - const string module_logevent_str = "module_logevent"; - const string module_logchannel_str = "module_logchannel"; - const string module_wmiquery_str = "module_wmiquery"; - const string module_perfcounter_str = "module_perfcounter"; - const string module_tcpcheck_str = "module_tcpcheck"; - const string module_regexp_str = "module_regexp"; - const string module_plugin_str = "module_plugin"; - const string module_ping_str = "module_ping"; - const string module_snmpget_str = "module_snmpget"; + const string module_exec_str = "module_exec"; + const string module_proc_str = "module_proc"; + const string module_service_str = "module_service"; + const string module_freedisk_str = "module_freedisk"; + const string module_freedisk_percent_str = "module_freedisk_percent"; + const string module_freememory_str = "module_freememory"; + const string module_freememory_percent_str = "module_freememory_percent"; + const string module_cpuusage_str = "module_cpuusage"; + const string module_inventory_str = "module_inventory"; + const string module_logevent_str = "module_logevent"; + const string module_logchannel_str = "module_logchannel"; + const string module_wmiquery_str = "module_wmiquery"; + const string module_perfcounter_str = "module_perfcounter"; + const string module_tcpcheck_str = "module_tcpcheck"; + const string module_regexp_str = "module_regexp"; + const string module_plugin_str = "module_plugin"; + const string module_ping_str = "module_ping"; + const string module_snmpget_str = "module_snmpget"; + const string module_exec_powershell_str = "module_exec_powershell"; /** * Pandora module super-class exception. diff --git a/pandora_agents/win32/modules/pandora_module_exec_powershell.cc b/pandora_agents/win32/modules/pandora_module_exec_powershell.cc new file mode 100644 index 0000000000..99d37b7822 --- /dev/null +++ b/pandora_agents/win32/modules/pandora_module_exec_powershell.cc @@ -0,0 +1,91 @@ +/* Pandora exec module. These modules exec a powershell command. + + Copyright (c) 2006-2023 Pandora FMS. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "pandora_module_exec_powershell.h" +#include "../pandora_strutils.h" + +#include +#include +#include +#include +#include +#include + +#define EXEC_OK 0 +#define EXEC_ERR -1 +#define BUFSIZE 4096 + +using namespace Pandora; +using namespace Pandora_Strutils; +using namespace Pandora_Modules; + +/** + * Creates a Pandora_Module_Exec_Powershell object. + * + * @param name Module name + * @param exec Command to be executed. + */ +Pandora_Module_Exec_Powershell::Pandora_Module_Exec_Powershell(string name, string exec) + : Pandora_Module (name) { + + string escaped_exec; + + for (char c : exec) { + if (c == '"' || c == '\\') { + escaped_exec += '\\'; + } + escaped_exec += c; + } + + this->module_exec = "powershell -C \"" + escaped_exec + "\""; + + this->setKind (module_exec_powershell_str); +} + +void Pandora_Module_Exec_Powershell::run() { + string output_result; + + this->has_output = false; + + FILE* pipe = popen(this->module_exec.c_str(), "r"); + if (!pipe) { + pandoraLog ("Error while executing command.", GetLastError ()); + return; + } + + char buffer[BUFSIZE]; + while (fgets(buffer, BUFSIZE, pipe) != NULL) { + output_result += buffer; + } + + int result = pclose(pipe); + + if (result == EXEC_ERR) { + pandoraLog ("Error while closing command process.", GetLastError ()); + return; + } + + if (result != EXEC_OK) { + pandoraLog ("Error invalid powershell command.", GetLastError ()); + return; + } + + this->has_output = true; + this->setOutput (output_result); +} \ No newline at end of file diff --git a/pandora_agents/win32/modules/pandora_module_exec_powershell.h b/pandora_agents/win32/modules/pandora_module_exec_powershell.h new file mode 100644 index 0000000000..d3c9785c29 --- /dev/null +++ b/pandora_agents/win32/modules/pandora_module_exec_powershell.h @@ -0,0 +1,43 @@ +/* Pandora exec module. These modules exec a powershell command + + Copyright (c) 2006-2023 Pandora FMS. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#ifndef __PANDORA_MODULE_EXEC_POWERWSHELL_H__ +#define __PANDORA_MODULE_EXEC_POWERWSHELL_H__ + +#include "pandora_module.h" + +namespace Pandora_Modules { + /** + * Module to execute a powershell command. + * + * Any custom order that want to be executed can be put in + * the util directory into the Pandora agent path. + */ + class Pandora_Module_Exec_Powershell : public Pandora_Module { + + private: + string module_exec; + + public: + Pandora_Module_Exec_Powershell (string name, string exec); + void run (); + }; +} + +#endif diff --git a/pandora_agents/win32/modules/pandora_module_factory.cc b/pandora_agents/win32/modules/pandora_module_factory.cc index de149293ff..dd71dc2dd8 100644 --- a/pandora_agents/win32/modules/pandora_module_factory.cc +++ b/pandora_agents/win32/modules/pandora_module_factory.cc @@ -22,6 +22,7 @@ #include "pandora_module_factory.h" #include "pandora_module.h" #include "pandora_module_exec.h" +#include "pandora_module_exec_powershell.h" #include "pandora_module_proc.h" #include "pandora_module_service.h" #include "pandora_module_freedisk.h" @@ -129,6 +130,7 @@ using namespace Pandora_Strutils; #define TOKEN_ALERT_TEMPLATE ("module_alert_template") #define TOKEN_USER_SESSION ("module_user_session ") #define TOKEN_WAIT_TIMEOUT ("module_wait_timeout ") +#define TOKEN_EXEC_POWERSHELL ("module_exec_powershell ") string parseLine (string line, string token) { @@ -158,7 +160,7 @@ Pandora_Module * Pandora_Module_Factory::getModuleFromDefinition (string definition) { list tokens; list::iterator iter; - string module_name, module_type, module_exec; + string module_name, module_type, module_exec, module_exec_powershell; string module_min, module_max, module_description; string module_interval, module_absoluteinterval; string module_proc, module_service; @@ -268,6 +270,7 @@ Pandora_Module_Factory::getModuleFromDefinition (string definition) { module_user_session = ""; macro = ""; module_wait_timeout = ""; + module_exec_powershell = ""; stringtok (tokens, definition, "\n"); @@ -302,6 +305,9 @@ Pandora_Module_Factory::getModuleFromDefinition (string definition) { if (module_exec == "") { module_exec = parseLine (line, TOKEN_EXEC); } + if (module_exec_powershell == "") { + module_exec_powershell = parseLine (line, TOKEN_EXEC_POWERSHELL); + } if (module_wait_timeout == "") { module_wait_timeout = parseLine (line, TOKEN_WAIT_TIMEOUT); } @@ -626,6 +632,13 @@ Pandora_Module_Factory::getModuleFromDefinition (string definition) { } } + if (module_exec_powershell != "") { + pos_macro = module_exec_powershell.find(macro_name); + if (pos_macro != string::npos){ + module_exec_powershell.replace(pos_macro, macro_name.size(), macro_value); + } + } + if (module_proc != "") { pos_macro = module_proc.find(macro_name); if (pos_macro != string::npos){ @@ -1155,6 +1168,9 @@ Pandora_Module_Factory::getModuleFromDefinition (string definition) { module->setWaitTimeout (atoi (module_wait_timeout.c_str ())); } + } else if (module_exec_powershell != "") { + module = new Pandora_Module_Exec_Powershell (module_name, module_exec_powershell); + } else if (module_proc != "") { module = new Pandora_Module_Proc (module_name, module_proc); diff --git a/pandora_agents/win32/modules/pandora_module_list.cc b/pandora_agents/win32/modules/pandora_module_list.cc index be5cc32d45..b0612902a3 100644 --- a/pandora_agents/win32/modules/pandora_module_list.cc +++ b/pandora_agents/win32/modules/pandora_module_list.cc @@ -21,6 +21,7 @@ #include "pandora_module_factory.h" #include "pandora_module_list.h" #include "pandora_module_exec.h" +#include "pandora_module_exec_powershell.h" #include "pandora_module_proc.h" #include "pandora_module_service.h" #include "pandora_module_freedisk.h" @@ -235,6 +236,7 @@ Pandora_Modules::Pandora_Module_List::parseModuleDefinition (string definition) Pandora_Module_Plugin *module_plugin; Pandora_Module_Ping *module_ping; Pandora_Module_SNMPGet *module_snmpget; + Pandora_Module_Exec_Powershell *module_exec_powershell; module = Pandora_Module_Factory::getModuleFromDefinition (definition); @@ -244,6 +246,11 @@ Pandora_Modules::Pandora_Module_List::parseModuleDefinition (string definition) module_exec = (Pandora_Module_Exec *) module; modules->push_back (module_exec); + break; + case MODULE_EXEC_POWERSHELL: + module_exec_powershell = (Pandora_Module_Exec_Powershell *) module; + modules->push_back (module_exec_powershell); + break; case MODULE_PROC: module_proc = (Pandora_Module_Proc *) module; From c5cefb3c13e7f90b95b9f03755dfec0f88cd7941 Mon Sep 17 00:00:00 2001 From: artica Date: Fri, 26 Jan 2024 01:00:30 +0100 Subject: [PATCH 167/170] 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.redhat_bin.el8.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.el9.spec | 2 +- pandora_agents/unix/pandora_agent.redhat_bin.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 +- 28 files changed, 28 insertions(+), 28 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index b57934fc50..c8ee8180a7 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.775-240125 +Version: 7.0NG.775-240126 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 cc3cf84853..fa783cc923 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.775-240125" +pandora_version="7.0NG.775-240126" 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 b0f1c9f54c..e0f3e5bdc3 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1039,7 +1039,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.775'; -use constant AGENT_BUILD => '240125'; +use constant AGENT_BUILD => '240126'; # 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 516ef3ec99..5c05e6110e 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.775 -%define release 240125 +%define release 240126 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec index c0ff5e3f44..78383784e9 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el8.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240125 +%define release 240126 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec index 14870a78ed..b21d106a96 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.el9.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240125 +%define release 240126 %define debug_package %{nil} Summary: Pandora FMS Linux agent, binary version diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.spec b/pandora_agents/unix/pandora_agent.redhat_bin.spec index 1e88ca4c7e..7a15966693 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.775 -%define release 240125 +%define release 240126 Summary: Pandora FMS Linux agent, binary version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 515dc4ea4d..337a0ec5f3 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.775 -%define release 240125 +%define release 240126 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 20f63af782..2f6e9c4d3d 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240125" +PI_BUILD="240126" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 81661ca1bf..95fa0dd4a3 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{240125} +{240126} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 91adc36bc7..f3961807fe 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.775 Build 240125") +#define PANDORA_VERSION ("7.0NG.775 Build 240126") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 5ac5a2e47f..1bb160a879 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Pandora FMS" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.775(Build 240125))" + VALUE "ProductVersion", "(7.0NG.775(Build 240126))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 971ba8b024..466722a50b 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.775-240125 +Version: 7.0NG.775-240126 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 6e7853f74f..a47efa89c2 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.775-240125" +pandora_version="7.0NG.775-240126" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 0cbf1c15e8..a721e82c12 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 = 'PC240125'; +$build_version = 'PC240126'; $pandora_version = 'v7.0NG.775'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 1e2252fbae..c6329db34e 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 829d5ae091..e7e972a801 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -7,7 +7,7 @@ %define debug_package %{nil} %define name pandorafms_server %define version 7.0NG.775 -%define release 240125 +%define release 240126 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index c697aa9c8f..f443bc4b03 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.775 -%define release 240125 +%define release 240126 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 03fa6a84d0..bc5676b742 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.775" -PI_BUILD="240125" +PI_BUILD="240126" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 66e75586cb..f079a42194 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -38,7 +38,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.775 Build 240125"; +my $version = "7.0NG.775 Build 240126"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index b154b38ada..e7921bff4a 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.775 Build 240125"; +my $version = "7.0NG.775 Build 240126"; # save program name for logging my $progname = basename($0); From c07ecff571a86fff706c65290698912beb2fdac7 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Fri, 26 Jan 2024 08:13:10 +0100 Subject: [PATCH 168/170] #12807 check id_agent for alert view --- .../operation/agentes/alerts_status.php | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/pandora_console/operation/agentes/alerts_status.php b/pandora_console/operation/agentes/alerts_status.php index a4f7c7d81c..68988900bc 100755 --- a/pandora_console/operation/agentes/alerts_status.php +++ b/pandora_console/operation/agentes/alerts_status.php @@ -536,19 +536,21 @@ echo '
'; ui_require_css_file('cluetip', 'include/styles/js/'); ui_require_jquery_file('cluetip'); -$system_higher = false; -$modules_agent = db_get_all_rows_sql(sprintf('SELECT id_agente FROM tagente_modulo WHERE id_agente = %s', $id_agente)); -if (is_array($modules_agent)) { - $all_modules = db_get_all_rows_sql('SELECT id_agente FROM tagente_modulo'); - $all_agents = db_get_all_rows_sql('SELECT id_agente FROM tagente'); - if (is_array($all_modules) && is_array($all_agents)) { - if ((count($all_modules) / count($all_agents)) >= 200) { - $system_higher = true; +if (isset($id_agente)) { + $system_higher = false; + $modules_agent = db_get_all_rows_sql(sprintf('SELECT id_agente FROM tagente_modulo WHERE id_agente = %s', $id_agente)); + if (is_array($modules_agent)) { + $all_modules = db_get_all_rows_sql('SELECT id_agente FROM tagente_modulo'); + $all_agents = db_get_all_rows_sql('SELECT id_agente FROM tagente'); + if (is_array($all_modules) && is_array($all_agents)) { + if ((count($all_modules) / count($all_agents)) >= 200) { + $system_higher = true; + } } } -} -echo '
'.__('Your system has a much higher rate of modules per agent than recommended (200 modules per agent). This implies performance problems in the system, please consider reducing the number of modules in this agent.').'
'; + echo '
'.__('Your system has a much higher rate of modules per agent than recommended (200 modules per agent). This implies performance problems in the system, please consider reducing the number of modules in this agent.').'
'; +} ?> From 65385f36c18eb24ac62613350ffdc19304e712b4 Mon Sep 17 00:00:00 2001 From: daniel Date: Fri, 26 Jan 2024 09:18:47 +0100 Subject: [PATCH 169/170] fix visual errors in widgets dashboard pandora_enterprise#12267 --- pandora_console/include/functions_ui.php | 6 +++--- .../lib/Dashboard/Widgets/ModulesByStatus.php | 4 ++-- pandora_console/include/styles/dashboards.css | 16 ++++++++++++++++ 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index d6078c56a7..0062b52e70 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -4257,15 +4257,15 @@ function ui_print_datatable(array $parameters) // * END JAVASCRIPT. $info_msg_arr = []; $info_msg_arr['message'] = $emptyTable; - $info_msg_arr['div_class'] = 'info_box_container invisible_important datatable-msg-info-'.$table_id; + $info_msg_arr['div_class'] = 'info_box_container invisible_important datatable-info-massage datatable-msg-info-'.$table_id; $info_msg_arr_filter = []; $info_msg_arr_filter['message'] = __('Please apply a filter to display the data.'); - $info_msg_arr_filter['div_class'] = 'info_box_container invisible_important datatable-msg-info-filter-'.$table_id; + $info_msg_arr_filter['div_class'] = 'info_box_container invisible_important datatable-info-massage datatable-msg-info-filter-'.$table_id; $spinner = ''; - $info_msg = '
'.ui_print_info_message($info_msg_arr, '', true).'
'; + $info_msg = '
'.ui_print_info_message($info_msg_arr, '', true).'
'; $info_msg_filter = '
'.ui_print_info_message($info_msg_arr_filter, true).'
'; diff --git a/pandora_console/include/lib/Dashboard/Widgets/ModulesByStatus.php b/pandora_console/include/lib/Dashboard/Widgets/ModulesByStatus.php index 86a6cde7ed..69c0a36f44 100644 --- a/pandora_console/include/lib/Dashboard/Widgets/ModulesByStatus.php +++ b/pandora_console/include/lib/Dashboard/Widgets/ModulesByStatus.php @@ -521,7 +521,7 @@ class ModulesByStatus extends Widget 'server_name', [ 'text' => 'last_status_change', - 'class' => 'flex-column', + 'class' => '', ], 'estado', ]; @@ -538,7 +538,7 @@ class ModulesByStatus extends Widget 'alias', [ 'text' => 'last_status_change', - 'class' => 'flex-column', + 'class' => '', ], 'estado', ]; diff --git a/pandora_console/include/styles/dashboards.css b/pandora_console/include/styles/dashboards.css index 8786faa843..00a780be6d 100644 --- a/pandora_console/include/styles/dashboards.css +++ b/pandora_console/include/styles/dashboards.css @@ -977,3 +977,19 @@ input.resize_button { .event-cardboard-widget td { cursor: pointer; } + +.datatable-container-info-massage:not(:has(.invisible_important)) { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 100%; + width: 100%; +} + +.info_box_information.datatable-info-massage.info_box_container + .info_box.info.textodialogo { + display: flex; + width: 100%; + justify-content: center; +} From bba32495a4f8518f92e8e1fa7f4d69f5120ede03 Mon Sep 17 00:00:00 2001 From: daniel Date: Fri, 26 Jan 2024 10:15:01 +0100 Subject: [PATCH 170/170] fix visual errors in msg umc offline pandora_enterprise#12399 --- .../resources/javascript/umc_offline.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/pandora_console/update_manager_client/resources/javascript/umc_offline.js b/pandora_console/update_manager_client/resources/javascript/umc_offline.js index ad2432a306..11e397d996 100644 --- a/pandora_console/update_manager_client/resources/javascript/umc_offline.js +++ b/pandora_console/update_manager_client/resources/javascript/umc_offline.js @@ -428,11 +428,14 @@ function install_package(url, auth, packageId, version, serverUpdate) { var response = d.result; document.getElementById("log_zone").innerText = response.result; - $("#input-progress") - .val(100) - .change(); + if (response.error == undefined || response.error == "") { + $("#input-progress") + .val(100) + .change(); + + $("#result li").removeClass("error"); + } - $("#result li").removeClass("error"); $("#result li") .find("p") .text(response.result);
"; - $html .= $graph_output; + + if ($output === 'PDF') { + $html .= ''; + } else { + $html .= $graph_output; + } + $html .= '