diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control
index e6a6d98175..a3be5ce30c 100644
--- a/pandora_agents/unix/DEBIAN/control
+++ b/pandora_agents/unix/DEBIAN/control
@@ -1,5 +1,5 @@
package: pandorafms-agent-unix
-Version: 7.0NG.757-210927
+Version: 7.0NG.757-210929
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 acf593ceeb..3581699a48 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.757-210927"
+pandora_version="7.0NG.757-210929"
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 38fb364524..45dc1ff702 100755
--- a/pandora_agents/unix/pandora_agent
+++ b/pandora_agents/unix/pandora_agent
@@ -1015,7 +1015,7 @@ my $Sem = undef;
my $ThreadSem = undef;
use constant AGENT_VERSION => '7.0NG.757';
-use constant AGENT_BUILD => '210927';
+use constant AGENT_BUILD => '210929';
# 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 c1d5a5368b..15d1e5bfd3 100644
--- a/pandora_agents/unix/pandora_agent.redhat.spec
+++ b/pandora_agents/unix/pandora_agent.redhat.spec
@@ -3,7 +3,7 @@
#
%define name pandorafms_agent_unix
%define version 7.0NG.757
-%define release 210927
+%define release 210929
Summary: Pandora FMS Linux agent, PERL version
Name: %{name}
diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec
index 5bdac1f020..56eb1c4da8 100644
--- a/pandora_agents/unix/pandora_agent.spec
+++ b/pandora_agents/unix/pandora_agent.spec
@@ -3,7 +3,7 @@
#
%define name pandorafms_agent_unix
%define version 7.0NG.757
-%define release 210927
+%define release 210929
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 edd674d18e..34df6c9122 100755
--- a/pandora_agents/unix/pandora_agent_installer
+++ b/pandora_agents/unix/pandora_agent_installer
@@ -10,7 +10,7 @@
# **********************************************************************
PI_VERSION="7.0NG.757"
-PI_BUILD="210927"
+PI_BUILD="210929"
OS_NAME=`uname -s`
FORCE=0
diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi
index 938000f0a2..e795dda6c6 100644
--- a/pandora_agents/win32/installer/pandora.mpi
+++ b/pandora_agents/win32/installer/pandora.mpi
@@ -186,7 +186,7 @@ UpgradeApplicationID
{}
Version
-{210927}
+{210929}
ViewReadme
{Yes}
diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc
index 6adada1f0c..1336b2b22b 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.757 Build 210927")
+#define PANDORA_VERSION ("7.0NG.757 Build 210929")
string pandora_path;
string pandora_dir;
diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc
index ef7ec55cb8..041b633c85 100644
--- a/pandora_agents/win32/versioninfo.rc
+++ b/pandora_agents/win32/versioninfo.rc
@@ -11,7 +11,7 @@ BEGIN
VALUE "LegalCopyright", "Artica ST"
VALUE "OriginalFilename", "PandoraAgent.exe"
VALUE "ProductName", "Pandora FMS Windows Agent"
- VALUE "ProductVersion", "(7.0NG.757(Build 210927))"
+ VALUE "ProductVersion", "(7.0NG.757(Build 210929))"
VALUE "FileVersion", "1.0.0.0"
END
END
diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control
index 2fb60f4c68..b6daadb2d3 100644
--- a/pandora_console/DEBIAN/control
+++ b/pandora_console/DEBIAN/control
@@ -1,5 +1,5 @@
package: pandorafms-console
-Version: 7.0NG.757-210927
+Version: 7.0NG.757-210929
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 a5235823f0..3eab055198 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.757-210927"
+pandora_version="7.0NG.757-210929"
package_pear=0
package_pandora=1
diff --git a/pandora_console/extras/mr/50.sql b/pandora_console/extras/mr/50.sql
index aa14a62917..11c4d12cfc 100644
--- a/pandora_console/extras/mr/50.sql
+++ b/pandora_console/extras/mr/50.sql
@@ -1,8 +1,14 @@
START TRANSACTION;
+ALTER TABLE `treport_content` ADD COLUMN `ipam_network_filter` int(10) UNSIGNED DEFAULT 0;
+ALTER TABLE `treport_content` ADD COLUMN `ipam_alive_ips` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0;
+ALTER TABLE `treport_content` ADD COLUMN `ipam_ip_not_assigned_to_agent` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0;
+ALTER TABLE `treport_content_template` ADD COLUMN `ipam_network_filter` int(10) UNSIGNED DEFAULT 0;
+ALTER TABLE `treport_content_template` ADD COLUMN `ipam_alive_ips` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0;
+ALTER TABLE `treport_content_template` ADD COLUMN `ipam_ip_not_assigned_to_agent` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0;
ALTER TABLE `tevent_alert` ADD COLUMN `id_template_conditions` int(10) unsigned NOT NULL default 0;
ALTER TABLE `tevent_alert` ADD COLUMN `id_template_fields` int(10) unsigned NOT NULL default 0;
ALTER TABLE `tevent_filter` ADD COLUMN `time_from` TIME NULL;
ALTER TABLE `tevent_filter` ADD COLUMN `time_to` TIME NULL;
-COMMIT;
\ No newline at end of file
+COMMIT;
diff --git a/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql b/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql
index d9ab65de2c..219da5d59a 100644
--- a/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql
+++ b/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql
@@ -898,6 +898,9 @@ ALTER TABLE `treport_content_template` ADD COLUMN `landscape` tinyint(1) UNSIGNE
ALTER TABLE `treport_content_template` ADD COLUMN `pagebreak` tinyint(1) UNSIGNED NOT NULL default 0;
ALTER TABLE `treport_content_template` ADD COLUMN `compare_work_time` tinyint(1) UNSIGNED NOT NULL default 0;
ALTER TABLE `treport_content_template` ADD COLUMN `graph_render` tinyint(1) UNSIGNED NOT NULL default 0;
+ALTER TABLE `treport_content_template` ADD COLUMN `ipam_network_filter` int(10) UNSIGNED DEFAULT 0;
+ALTER TABLE `treport_content_template` ADD COLUMN `ipam_alive_ips` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0;
+ALTER TABLE `treport_content_template` ADD COLUMN `ipam_ip_not_assigned_to_agent` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0;
-- ----------------------------------------------------------------------
-- Table `tnews`
@@ -1776,6 +1779,9 @@ ALTER TABLE `treport_content` ADD COLUMN `pagebreak` tinyint(1) UNSIGNED NOT NUL
ALTER TABLE `treport_content` ADD COLUMN `compare_work_time` tinyint(1) UNSIGNED NOT NULL default 0;
ALTER TABLE `treport_content` ADD COLUMN `graph_render` tinyint(1) UNSIGNED NOT NULL default 0;
ALTER TABLE `treport_content` MODIFY `external_source` MEDIUMTEXT;
+ALTER TABLE `treport_content` ADD COLUMN `ipam_network_filter` int(10) UNSIGNED DEFAULT 0;
+ALTER TABLE `treport_content` ADD COLUMN `ipam_alive_ips` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0;
+ALTER TABLE `treport_content` ADD COLUMN `ipam_ip_not_assigned_to_agent` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0;
-- ---------------------------------------------------------------------
-- Table `tmodule_relationship`
diff --git a/pandora_console/godmode/alerts/alert_list.list.php b/pandora_console/godmode/alerts/alert_list.list.php
index a9de8608e7..8e2e01aa2d 100644
--- a/pandora_console/godmode/alerts/alert_list.list.php
+++ b/pandora_console/godmode/alerts/alert_list.list.php
@@ -861,10 +861,16 @@ foreach ($simple_alerts as $alert) {
if (check_acl_one_of_groups($config['id_user'], $all_groups, 'AW')) {
if ($isFunctionPolicies !== ENTERPRISE_NOT_HOOK) {
$policyInfo = policies_is_alert_in_policy2($alert['id'], false);
- if ($policyInfo === false) {
- $data[1] .= '';
+ $module_linked = policies_is_module_linked($alert['id_agent_module']);
+ if (is_array($policyInfo) === false && $module_linked === false) {
+ $data[$index['policy']] = '';
} else {
- $img = 'images/policies_mc.png';
+ $module_linked = policies_is_module_linked($alert['id_agent_module']);
+ if ($module_linked === '0') {
+ $img = 'images/unlinkpolicy.png';
+ } else {
+ $img = 'images/policies_mc.png';
+ }
$data[1] .= ' '.html_print_image($img, true, ['title' => $policyInfo['name']]).'';
}
@@ -886,7 +892,7 @@ foreach ($simple_alerts as $alert) {
]
);
} else {
- if ((int) $alert['id_policy_alerts'] === 0) {
+ if ((int) $alert['id_policy_alerts'] === 0 || $module_linked === '0') {
$data[4] .= '';
$data[4] .= html_print_image('images/add.png', true, ['title' => __('Add action'), 'class' => 'invert_filter']);
$data[4] .= '';
diff --git a/pandora_console/godmode/reporting/reporting_builder.item_editor.php b/pandora_console/godmode/reporting/reporting_builder.item_editor.php
index e5b47dd219..2fd42028e6 100755
--- a/pandora_console/godmode/reporting/reporting_builder.item_editor.php
+++ b/pandora_console/godmode/reporting/reporting_builder.item_editor.php
@@ -399,6 +399,12 @@ switch ($action) {
$sla_sorted_by = $item['top_n'];
break;
+ case 'IPAM_network':
+ $network_filter = $item['ipam_network_filter'];
+ $alive_ip = $item['ipam_alive_ips'];
+ $agent_not_assigned_to_ip = $item['ipam_ip_not_assigned_to_agent'];
+ break;
+
case 'monitor_report':
$description = $item['description'];
$idAgentModule = $item['id_agent_module'];
@@ -1068,6 +1074,51 @@ $class = 'databox filters';
+
data[0][2] = html_print_checkbox(
+ 'group_recursion',
+ 0,
+ false,
+ true,
+ false,
+ 'choose_group_for_show_agents()'
+ ).__('Recursion');
+
$table->data[1][0] = __('Agents');
$table->data[1][1] = html_print_select(
[-1 => __('None')],
diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php
index 892a61f4cf..7e9708066f 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 = 'PC210927';
+$build_version = 'PC210929';
$pandora_version = 'v7.0NG.757';
// Do not overwrite default timezone set if defined.
diff --git a/pandora_console/include/functions_agents.php b/pandora_console/include/functions_agents.php
index 9f0512fa09..fd121a28e2 100644
--- a/pandora_console/include/functions_agents.php
+++ b/pandora_console/include/functions_agents.php
@@ -3072,7 +3072,7 @@ function agents_get_network_interfaces($agents=false, $agents_filter=false)
$ni_by_agents = [];
foreach ($agents as $agent) {
- $agent_id = $agent['id_agente'];
+ $agent_id = (isset($agent['id_agente'])) ? $agent['id_agente'] : $agent;
$agent_group_id = $agent['id_grupo'];
$agent_name = $agent['alias'];
$agent_interfaces = [];
diff --git a/pandora_console/include/functions_networkmap.php b/pandora_console/include/functions_networkmap.php
index 805f8853bb..ed99ee7781 100644
--- a/pandora_console/include/functions_networkmap.php
+++ b/pandora_console/include/functions_networkmap.php
@@ -4062,7 +4062,7 @@ function networkmap_get_new_nodes_and_links($networkmap, $x, $y)
true
);
} else {
- if ($map_filter['dont_show_subgroups'] == 'true') {
+ if ($map_filter['dont_show_subgroups'] == 'true' && $map_filter['dont_show_subgroups'] !== 0) {
// Show only current selected group.
$filter['id_grupo'] = $networkmap['id_group'];
} else {
diff --git a/pandora_console/include/functions_reporting.php b/pandora_console/include/functions_reporting.php
index 5773908386..e206a93aaa 100755
--- a/pandora_console/include/functions_reporting.php
+++ b/pandora_console/include/functions_reporting.php
@@ -757,6 +757,13 @@ function reporting_make_reporting_data(
);
break;
+ case 'IPAM_network':
+ $report['contents'][] = reporting_ipam(
+ $report,
+ $content
+ );
+ break;
+
case 'agent_detailed_event':
case 'event_report_agent':
$report_control = io_safe_output(
diff --git a/pandora_console/include/functions_reporting_html.php b/pandora_console/include/functions_reporting_html.php
index fa8eb25031..1524c8f9a5 100644
--- a/pandora_console/include/functions_reporting_html.php
+++ b/pandora_console/include/functions_reporting_html.php
@@ -389,6 +389,10 @@ function reporting_html_print_report($report, $mini=false, $report_info=1)
reporting_html_inventory_changes($table, $item);
break;
+ case 'IPAM_network':
+ reporting_enterprise_html_ipam($table, $item, $mini);
+ break;
+
case 'agent_detailed_event':
case 'event_report_agent':
reporting_html_event_report_agent($table, $item);
diff --git a/pandora_console/include/functions_reports.php b/pandora_console/include/functions_reports.php
index 3ce827d7fa..f640bb34e9 100755
--- a/pandora_console/include/functions_reports.php
+++ b/pandora_console/include/functions_reports.php
@@ -686,6 +686,13 @@ function reports_get_report_types($template=false, $not_editor=false)
'name' => __('Module Histogram graph'),
];
+ if ($config['enterprise_installed'] && is_metaconsole() === false) {
+ $types['IPAM_network'] = [
+ 'optgroup' => __('IPAM'),
+ 'name' => __('IPAM networks'),
+ ];
+ }
+
$types['SLA'] = [
'optgroup' => __('SLA'),
'name' => __('S.L.A.'),
diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php
index ed6f55824e..a02fd3baf7 100755
--- a/pandora_console/include/functions_ui.php
+++ b/pandora_console/include/functions_ui.php
@@ -1117,10 +1117,17 @@ function ui_format_alert_row(
}
$policyInfo = policies_is_alert_in_policy2($alert['id'], false);
- if ($policyInfo === false) {
+ $module_linked = policies_is_module_linked($alert['id_agent_module']);
+ if (is_array($policyInfo) === false && $module_linked === false) {
$data[$index['policy']] = '';
} else {
- $img = 'images/policies_mc.png';
+ $module_linked = policies_is_module_linked($alert['id_agent_module']);
+ if ($module_linked === '0') {
+ $img = 'images/unlinkpolicy.png';
+ } else {
+ $img = 'images/policies_mc.png';
+ }
+
if (is_metaconsole() === false) {
$data[$index['policy']] = ''.html_print_image($img, true, ['title' => $policyInfo['name']]).'';
} else {
diff --git a/pandora_console/include/javascript/functions_pandora_networkmap.js b/pandora_console/include/javascript/functions_pandora_networkmap.js
index ad99c6001b..6c52a164e2 100644
--- a/pandora_console/include/javascript/functions_pandora_networkmap.js
+++ b/pandora_console/include/javascript/functions_pandora_networkmap.js
@@ -3891,6 +3891,8 @@ function get_node_name_ov(data) {
function choose_group_for_show_agents() {
var group = $("#group_for_show_agents option:selected").val();
+ var group_recursion =
+ $("#checkbox-group_recursion").prop("checked") === true ? 1 : 0;
$("#agents_filter_group").attr("disabled", true);
$("#spinner_group").css("display", "");
@@ -3906,6 +3908,7 @@ function choose_group_for_show_agents() {
params.push("get_agents_in_group=1");
params.push("id=" + networkmap_id);
params.push("group=" + group);
+ params.push("group_recursion=" + group_recursion);
params.push("page=operation/agentes/pandora_networkmap.view");
jQuery.ajax({
data: params.join("&"),
diff --git a/pandora_console/include/javascript/pandora_modules.js b/pandora_console/include/javascript/pandora_modules.js
index 1a0f2c00a8..d1b4df6ea5 100644
--- a/pandora_console/include/javascript/pandora_modules.js
+++ b/pandora_console/include/javascript/pandora_modules.js
@@ -1327,12 +1327,23 @@ function filterByText(selectbox, textbox, textNoData) {
function manageComponentFields(action, type) {
var fieldLines = $("tr[id*=network_component-" + type + "]").length;
var protocol = $("#module_protocol").val();
+ let textForAdd = "";
+
if (action === "add") {
let lineNumber = fieldLines + 1;
- let textForAdd =
- type === "oid-list-pluginRow-snmpRow"
- ? "_oid_" + lineNumber + "_"
- : lineNumber;
+
+ switch (type) {
+ case "oid-list-pluginRow-snmpRow":
+ textForAdd = "_oid_" + lineNumber + "_";
+ break;
+
+ case "oid-list-wmiRow":
+ textForAdd = "_field_wmi_" + lineNumber + "_";
+ break;
+
+ default:
+ textForAdd = lineNumber;
+ }
$("#network_component-manage-" + type).before(
$("#network_component-" + type + "-row-1")
diff --git a/pandora_console/include/javascript/tree/TreeController.js b/pandora_console/include/javascript/tree/TreeController.js
index 898f389891..bc30d87f8c 100644
--- a/pandora_console/include/javascript/tree/TreeController.js
+++ b/pandora_console/include/javascript/tree/TreeController.js
@@ -159,6 +159,21 @@ var TreeController = {
}
};
+ var IPAMSupernetCounterTitles = {
+ total_networks: {
+ totals: "Networks"
+ }
+ };
+
+ var IPAMNetworkCounterTitles = {
+ alive_ips: {
+ totals: "Alive IPs"
+ },
+ total_ips: {
+ totals: "Total IPs"
+ }
+ };
+
try {
var title = "";
@@ -192,6 +207,12 @@ var TreeController = {
case "services":
title = serviceCounterTitles[counterType].totals;
break;
+ case "IPAM_supernets":
+ title = IPAMSupernetCounterTitles[counterType].totals;
+ break;
+ case "IPAM_networks":
+ title = IPAMNetworkCounterTitles[counterType].totals;
+ break;
default:
if (
typeof controller.counterTitles != "undefined" &&
@@ -333,6 +354,113 @@ var TreeController = {
hasCounters = true;
}
+ } else if (type == "IPAM_supernets") {
+ var $counters = $("");
+ $counters.addClass("tree-node-counters");
+
+ if (counters.total_networks > 0) {
+ // Open the parentheses
+ $counters.append(" (");
+
+ if (
+ typeof counters.total_networks !== "undefined" &&
+ counters.total_networks >= 0
+ ) {
+ var $networksCounter = $("");
+ $networksCounter
+ .addClass("tree-node-counter")
+ .addClass("total")
+ .html(counters.total_networks);
+
+ _processNodeCounterTitle(
+ $networksCounter,
+ type,
+ "total_networks"
+ );
+
+ $counters.append($networksCounter);
+ } else {
+ var $networksCounter = $("");
+ $networksCounter
+ .addClass("tree-node-counter")
+ .addClass("total")
+ .html("0");
+
+ _processNodeCounterTitle(
+ $networksCounter,
+ type,
+ "total_networks"
+ );
+
+ $counters.append($networksCounter);
+ }
+
+ // Close the parentheses
+ $counters.append(")");
+
+ hasCounters = true;
+ }
+ } else if (type == "IPAM_networks") {
+ var $counters = $("");
+ $counters.addClass("tree-node-counters");
+
+ // Open the parentheses
+ $counters.append(" (");
+
+ if (
+ typeof counters.alive_ips !== "undefined" &&
+ counters.alive_ips >= 0
+ ) {
+ var $aliveCounter = $("");
+ $aliveCounter
+ .addClass("tree-node-counter")
+ .addClass("total")
+ .html(counters.alive_ips);
+
+ _processNodeCounterTitle($aliveCounter, type, "alive_ips");
+
+ $counters.append($aliveCounter);
+ } else {
+ var $aliveCounter = $("");
+ $aliveCounter
+ .addClass("tree-node-counter")
+ .addClass("total")
+ .html("0");
+
+ _processNodeCounterTitle($aliveCounter, type, "alive_ips");
+
+ $counters.append($aliveCounter);
+ }
+
+ if (
+ typeof counters.total_ips !== "undefined" &&
+ counters.total_ips >= 0
+ ) {
+ var $totalCounter = $("");
+ $totalCounter
+ .addClass("tree-node-counter")
+ .addClass("total")
+ .html(counters.total_ips);
+
+ _processNodeCounterTitle($totalCounter, type, "total_ips");
+
+ $counters.append(" : ").append($totalCounter);
+ } else {
+ var $totalCounter = $("");
+ $totalCounter
+ .addClass("tree-node-counter")
+ .addClass("total")
+ .html("0");
+
+ _processNodeCounterTitle($totalCounter, type, "total_ips");
+
+ $counters.append(" : ").append($totalCounter);
+ }
+
+ // Close the parentheses
+ $counters.append(")");
+
+ hasCounters = true;
} else {
var $counters = $("");
$counters.addClass("tree-node-counters");
@@ -637,6 +765,87 @@ var TreeController = {
}
$content.append(" " + element.alias);
+ break;
+ case "IPAM_supernets":
+ var IPAMSupernetDetailImage = $(
+ ' '
+ );
+
+ if (typeof element.id !== "undefined") {
+ IPAMSupernetDetailImage.click(function(e) {
+ e.preventDefault();
+
+ var postData = {
+ page: "enterprise/include/ajax/ipam.ajax",
+ show_networkmap_statistics: 1,
+ "node_data[id_net]": element.id,
+ "node_data[type_net]": "supernet"
+ };
+
+ $.ajax({
+ url: controller.ajaxURL,
+ type: "POST",
+ dataType: "html",
+ data: postData,
+ success: function(data, textStatus, xhr) {
+ controller.detailRecipient
+ .render("IPAMsupernets", data)
+ .open();
+ }
+ });
+ }).css("cursor", "pointer");
+
+ $content.append(IPAMSupernetDetailImage);
+ }
+
+ if (element.name !== null) {
+ $content.append(" " + element.name);
+ }
+
+ break;
+ case "IPAM_networks":
+ $content.addClass("ipam-network");
+
+ var IPAMNetworkDetailImage = $(
+ ' '
+ );
+
+ if (typeof element.id !== "undefined") {
+ IPAMNetworkDetailImage.click(function(e) {
+ e.preventDefault();
+
+ //window.location.href = element.IPAMNetworkDetail;
+ var postData = {
+ page: "enterprise/include/ajax/ipam.ajax",
+ show_networkmap_statistics: 1,
+ "node_data[id_net]": element.id,
+ "node_data[type_net]": "network"
+ };
+
+ $.ajax({
+ url: controller.ajaxURL,
+ type: "POST",
+ dataType: "html",
+ data: postData,
+ success: function(data, textStatus, xhr) {
+ controller.detailRecipient
+ .render("IPAMnetwork", data)
+ .open();
+ }
+ });
+ }).css("cursor", "pointer");
+
+ $content.append(IPAMNetworkDetailImage);
+ }
+
+ if (element.name !== null) {
+ $content.append(" " + element.name);
+ }
+
break;
case "services":
if (
@@ -960,7 +1169,7 @@ var TreeController = {
return;
}
}
- // If exist the detail container, show the data
+ // If detail container exists, show the data.
if (
typeof controller.detailRecipient !== "undefined" ||
disabled == false
diff --git a/pandora_console/include/lib/Entity.php b/pandora_console/include/lib/Entity.php
index d7f55ed780..98b9aa8600 100644
--- a/pandora_console/include/lib/Entity.php
+++ b/pandora_console/include/lib/Entity.php
@@ -153,6 +153,17 @@ abstract class Entity
/**
* Dynamically call methods in this object.
*
+ * To dynamically switch between community methods and prioritize
+ * enterprise ones, define method visibility as 'protected' in both
+ * classes.
+ *
+ * For instance, in following situation:
+ * protected PandoraFMS\Agent::test()
+ * protected PandoraFMS\Enterprise\Agent::test()
+ *
+ * If enterprise is available, then PandoraFMS\Enterprise\Agent::test()
+ * will be executed, community method otherwise.
+ *
* @param string $methodName Name of target method or attribute.
* @param array $params Arguments for target method.
*
@@ -161,41 +172,38 @@ abstract class Entity
*/
public function __call(string $methodName, ?array $params=null)
{
- // Prioritize written methods over dynamic ones.
- if (method_exists($this, $methodName) === true) {
- return call_user_func_array(
- $this->{$methodName},
- $params
- );
- }
-
// Enterprise capabilities.
+ // Prioritize enterprise written methods over dynamic fields.
if (\enterprise_installed() === true
&& $this->enterprise !== null
&& method_exists($this->enterprise, $methodName) === true
) {
- return call_user_func_array(
- [
- $this->enterprise,
- $methodName,
- ],
- $params
+ return $this->enterprise->$methodName(...$params);
+ }
+
+ if (method_exists($this, $methodName) === false) {
+ if (array_key_exists($methodName, $this->fields) === true) {
+ if (empty($params) === true) {
+ return $this->fields[$methodName];
+ } else {
+ $this->fields[$methodName] = $params[0];
+ }
+
+ return null;
+ }
+
+ throw new \Exception(
+ get_class($this).' error, method '.$methodName.' does not exist'
);
}
- if (array_key_exists($methodName, $this->fields) === true) {
- if (empty($params) === true) {
- return $this->fields[$methodName];
- } else {
- $this->fields[$methodName] = $params[0];
- }
-
- return null;
- }
-
- throw new \Exception(
- get_class($this).' error, method '.$methodName.' does not exist'
- );
+ // Do not return nor throw exceptions after this point, allow php
+ // default __call behaviour to continue working with object method
+ // defined.
+ // If you're receiving NULL as result of the method invocation, ensure
+ // it is not private, take in mind this method will mask any access
+ // level error or notification since it is public and has limited access
+ // to the object (public|protected).
}
diff --git a/pandora_console/include/styles/tree.css b/pandora_console/include/styles/tree.css
index c4cdf7d276..08b1d635ed 100644
--- a/pandora_console/include/styles/tree.css
+++ b/pandora_console/include/styles/tree.css
@@ -189,3 +189,7 @@ div#tree-controller-recipient {
.tree-node .disabled {
filter: opacity(0.3);
}
+
+.ipam-network {
+ font-size: 9pt;
+}
diff --git a/pandora_console/install.php b/pandora_console/install.php
index 82f5d13b13..850db93e0d 100644
--- a/pandora_console/install.php
+++ b/pandora_console/install.php
@@ -129,7 +129,7 @@
$id,
+ 'deleted' => 0,
+ ]
+ );
+ if ($agents_in_networkmap !== false) {
+ $ids = [];
+ foreach ($agents_in_networkmap as $agent) {
+ if ($agent['type'] == 0) {
+ $ids[] = $agent['source_data'];
+ }
+ }
+
+ if (empty($ids) === false) {
+ $where_id_agente = 'id_agente NOT IN ('.implode(',', $ids).')';
+ }
+ }
+
+ if ($group_recursion !== 0) {
+ $group_tree = groups_get_children_ids($group);
+ $group = implode(',', $group_tree);
+ }
+
+ $sql = 'SELECT id_agente, alias
+ FROM tagente
+ WHERE id_grupo IN ('.$group.') AND '.$where_id_agente.'
+ ORDER BY alias ASC';
+
+ $agents = db_get_all_rows_sql($sql);
+
+ if ($agents !== false) {
+ $return['agents'] = [];
+ foreach ($agents as $agent) {
+ $return['agents'][$agent['id_agente']] = $agent['alias'];
+ }
+
+ $return['correct'] = true;
+ }
+ }
+
+ echo json_encode($return);
+
+ return;
+ }
+
if ($module_get_status) {
$id = (int) get_parameter('id', 0);
diff --git a/pandora_console/operation/users/user_edit.php b/pandora_console/operation/users/user_edit.php
index ee6f9377bc..40b898fae2 100644
--- a/pandora_console/operation/users/user_edit.php
+++ b/pandora_console/operation/users/user_edit.php
@@ -445,30 +445,29 @@ if (check_acl($config['id_user'], 0, 'ER')) {
$autorefresh_list_out = [];
-if (is_metaconsole()) {
- $autorefresh_list_out['monitoring/tactical'] = 'Tactical view';
- $autorefresh_list_out['monitoring/group_view'] = 'Group view';
-} else {
- $autorefresh_list_out['operation/agentes/tactical'] = 'Tactical view';
- $autorefresh_list_out['operation/agentes/group_view'] = 'Group view';
+if (is_metaconsole() === false || is_centrallised() === true) {
+ $autorefresh_list_out['operation/agentes/estado_agente'] = 'Agent detail';
+ $autorefresh_list_out['operation/agentes/alerts_status'] = 'Alert detail';
+ $autorefresh_list_out['enterprise/operation/cluster/cluster'] = 'Cluster view';
+ $autorefresh_list_out['operation/gis_maps/render_view'] = 'Gis Map';
+ $autorefresh_list_out['operation/reporting/graph_viewer'] = 'Graph Viewer';
+ $autorefresh_list_out['operation/snmpconsole/snmp_view'] = 'SNMP console';
+
+ if (enterprise_installed()) {
+ $autorefresh_list_out['general/sap_view'] = 'SAP view';
+ }
}
-$autorefresh_list_out['operation/agentes/estado_agente'] = 'Agent detail';
-$autorefresh_list_out['operation/agentes/alerts_status'] = 'Alert detail';
+$autorefresh_list_out['operation/agentes/tactical'] = 'Tactical view';
+$autorefresh_list_out['operation/agentes/group_view'] = 'Group view';
$autorefresh_list_out['operation/agentes/status_monitor'] = 'Monitor detail';
-$autorefresh_list_out['operation/operation/services/services'] = 'Services';
+$autorefresh_list_out['enterprise/operation/services/services'] = 'Services';
$autorefresh_list_out['operation/dashboard/dashboard'] = 'Dashboard';
-$autorefresh_list_out['operation/reporting/graph_viewer'] = 'Graph Viewer';
-$autorefresh_list_out['operation/gis_maps/render_view'] = 'Gis Map';
-$autorefresh_list_out['operation/snmpconsole/snmp_view'] = 'SNMP console';
$autorefresh_list_out['operation/agentes/pandora_networkmap'] = 'Network map';
$autorefresh_list_out['operation/visual_console/render_view'] = 'Visual console';
$autorefresh_list_out['operation/events/events'] = 'Events';
-$autorefresh_list_out['enterprise/operation/cluster/cluster'] = 'Cluster view';
-if (enterprise_installed()) {
- $autorefresh_list_out['general/sap_view'] = 'SAP view';
-}
+
if (!isset($autorefresh_list)) {
$select = db_process_sql("SELECT autorefresh_white_list FROM tusuario WHERE id_user = '".$config['id_user']."'");
diff --git a/pandora_console/pandora_console.redhat.spec b/pandora_console/pandora_console.redhat.spec
index 5c5388d852..9e37d081fd 100644
--- a/pandora_console/pandora_console.redhat.spec
+++ b/pandora_console/pandora_console.redhat.spec
@@ -3,7 +3,7 @@
#
%define name pandorafms_console
%define version 7.0NG.757
-%define release 210927
+%define release 210929
# User and Group under which Apache is running
%define httpd_name httpd
diff --git a/pandora_console/pandora_console.rhel7.spec b/pandora_console/pandora_console.rhel7.spec
index d0d2fbf41c..8503bef375 100644
--- a/pandora_console/pandora_console.rhel7.spec
+++ b/pandora_console/pandora_console.rhel7.spec
@@ -3,7 +3,7 @@
#
%define name pandorafms_console
%define version 7.0NG.757
-%define release 210927
+%define release 210929
# User and Group under which Apache is running
%define httpd_name httpd
diff --git a/pandora_console/pandora_console.spec b/pandora_console/pandora_console.spec
index 9cbdd8ebe0..3abc882afc 100644
--- a/pandora_console/pandora_console.spec
+++ b/pandora_console/pandora_console.spec
@@ -3,7 +3,7 @@
#
%define name pandorafms_console
%define version 7.0NG.757
-%define release 210927
+%define release 210929
%define httpd_name httpd
# User and Group under which Apache is running
%define httpd_name apache2
diff --git a/pandora_console/pandoradb.sql b/pandora_console/pandoradb.sql
index 3ba4421e98..a4a2575046 100644
--- a/pandora_console/pandoradb.sql
+++ b/pandora_console/pandoradb.sql
@@ -1580,6 +1580,9 @@ CREATE TABLE IF NOT EXISTS `treport_content` (
`pagebreak` tinyint(1) UNSIGNED NOT NULL default 0,
`compare_work_time` tinyint(1) UNSIGNED NOT NULL default 0,
`graph_render` tinyint(1) UNSIGNED NOT NULL default 0,
+ `ipam_network_filter` int(10) UNSIGNED DEFAULT 0,
+ `ipam_alive_ips` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,
+ `ipam_ip_not_assigned_to_agent` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY(`id_rc`),
FOREIGN KEY (`id_report`) REFERENCES treport(`id_report`)
ON UPDATE CASCADE ON DELETE CASCADE
@@ -3195,6 +3198,9 @@ CREATE TABLE IF NOT EXISTS `treport_content_template` (
`pagebreak` tinyint(1) UNSIGNED NOT NULL default 0,
`compare_work_time` tinyint(1) UNSIGNED NOT NULL default 0,
`graph_render` tinyint(1) UNSIGNED NOT NULL default 0,
+ `ipam_network_filter` int(10) UNSIGNED DEFAULT 0,
+ `ipam_alive_ips` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,
+ `ipam_ip_not_assigned_to_agent` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY(`id_rc`)
) ENGINE = InnoDB DEFAULT CHARSET=utf8;
diff --git a/pandora_console/tools/merged_policies_conf_fixer.php b/pandora_console/tools/merged_policies_conf_fixer.php
new file mode 100644
index 0000000000..3198b663d7
--- /dev/null
+++ b/pandora_console/tools/merged_policies_conf_fixer.php
@@ -0,0 +1,62 @@
+hasRemoteCapabilities() === true) {
+ $agent_policies = $agent->getConfPolicies();
+
+ $oldIds = [];
+ $newIds = [];
+ foreach ($agent_policies as $oldId => $name) {
+ $oldIds[] = $oldId;
+ $newIds[] = $policies[io_safe_input($name)];
+ }
+
+ $res_update_con_policy = $agent->updatePolicyIds(
+ $oldIds,
+ $newIds
+ );
+ if ($res_update_con_policy === false) {
+ echo 'Failed ['.$agent->name()."]\n";
+ } else {
+ echo 'Agent '.io_safe_output($agent->alias())." updated successfully\n";
+ }
+ } else {
+ echo 'Agent '.io_safe_output($agent->alias())." skipped\n";
+ }
+ } catch (Exception $e) {
+ echo $e->getMessage()."\n";
+ }
+}
diff --git a/pandora_server/DEBIAN/control b/pandora_server/DEBIAN/control
index 8c88f9877c..c23c2a03a8 100644
--- a/pandora_server/DEBIAN/control
+++ b/pandora_server/DEBIAN/control
@@ -1,5 +1,5 @@
package: pandorafms-server
-Version: 7.0NG.757-210927
+Version: 7.0NG.757-210929
Architecture: all
Priority: optional
Section: admin
diff --git a/pandora_server/DEBIAN/make_deb_package.sh b/pandora_server/DEBIAN/make_deb_package.sh
index f5dc313567..9cdb11b281 100644
--- a/pandora_server/DEBIAN/make_deb_package.sh
+++ b/pandora_server/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.757-210927"
+pandora_version="7.0NG.757-210929"
package_cpan=0
package_pandora=1
diff --git a/pandora_server/conf/pandora_server.conf.new b/pandora_server/conf/pandora_server.conf.new
index 9f6e105ef5..91c86c0325 100644
--- a/pandora_server/conf/pandora_server.conf.new
+++ b/pandora_server/conf/pandora_server.conf.new
@@ -702,3 +702,15 @@ alertserver_threads 4
# Generate an hourly warning event if alert execution is being delayed more than alertserver_warn seconds.
alertserver_warn 180
+# Pandora FMS HA MySQL cluster splitbrain auto-recovery (PANDORA FMS ENTERPRISE ONLY)
+# IMPORTANT! Please understand and configure all settings from pandora_console/index.php?sec=gservers&sec2=enterprise/godmode/servers/HA_cluster&tab=setup
+# before enable this feature.
+#splitbrain_autofix 0
+
+# Pandora FMS HA MySQL cluster splitbrain auto-recovery settings (PANDORA FMS ENTERPRISE ONLY)
+# Maximum number of retries
+#ha_max_splitbrain_retries 2
+# Maximum number of retries to verify resync status.
+#ha_max_resync_wait_retries 3
+# Maximum number of seconds waiting while verifying resync status.
+#ha_resync_sleep 10
diff --git a/pandora_server/lib/PandoraFMS/Config.pm b/pandora_server/lib/PandoraFMS/Config.pm
index 84b1591aff..c5b6645727 100644
--- a/pandora_server/lib/PandoraFMS/Config.pm
+++ b/pandora_server/lib/PandoraFMS/Config.pm
@@ -46,7 +46,7 @@ our @EXPORT = qw(
# version: Defines actual version of Pandora Server for this module only
my $pandora_version = "7.0NG.757";
-my $pandora_build = "210927";
+my $pandora_build = "210929";
our $VERSION = $pandora_version." ".$pandora_build;
# Setup hash
@@ -1289,6 +1289,18 @@ sub pandora_load_config {
elsif ($parametro =~ m/^pandora_service_cmd\s(.*)/i) {
$pa_config->{'pandora_service_cmd'} = clean_blank($1);
}
+ elsif ($parametro =~ m/^splitbrain_autofix\s+([0-9]*)/i) {
+ $pa_config->{'splitbrain_autofix'} = clean_blank($1);
+ }
+ elsif ($parametro =~ m/^ha_max_resync_wait_retries\s+([0-9]*)/i) {
+ $pa_config->{'ha_max_resync_wait_retries'} = clean_blank($1);
+ }
+ elsif ($parametro =~ m/^ha_resync_sleep\s+([0-9]*)/i) {
+ $pa_config->{'ha_resync_sleep'} = clean_blank($1);
+ }
+ elsif ($parametro =~ m/^ha_max_splitbrain_retries\s+([0-9]*)/i) {
+ $pa_config->{'ha_max_splitbrain_retries'} = clean_blank($1);
+ }
} # end of loop for parameter #
diff --git a/pandora_server/lib/PandoraFMS/DiscoveryServer.pm b/pandora_server/lib/PandoraFMS/DiscoveryServer.pm
index 286d5633ce..559da0151c 100644
--- a/pandora_server/lib/PandoraFMS/DiscoveryServer.pm
+++ b/pandora_server/lib/PandoraFMS/DiscoveryServer.pm
@@ -29,6 +29,8 @@ use POSIX qw(strftime ceil);
use JSON;
use Encode qw(encode_utf8);
use MIME::Base64;
+use File::Basename qw(dirname);
+use File::Copy;
# Default lib dir for RPM and DEB packages
use lib '/usr/lib/perl5';
@@ -378,7 +380,8 @@ sub exec_recon_script ($$$) {
}
if (-x $command) {
- my $exec_output = `$command $args`;
+ my $exec_output = `$command $args 2>&1`;
+ log_execution($pa_config, $task->{'id_rt'}, "$command $args", $exec_output);
logger($pa_config, "Execution output: \n". $exec_output, 10);
} else {
logger($pa_config, "Cannot execute recon task command $command.", 10);
@@ -1778,5 +1781,54 @@ sub PandoraFMS::Recon::Base::update_progress ($$) {
}
}
+################################################################################
+# Store a log with execution details.
+################################################################################
+sub log_execution($$$$) {
+ my ($pa_config, $task_id, $cmd, $output) = @_;
+
+ return unless $pa_config->{'verbosity'} eq 10;
+
+ my $discovery_log_path = dirname($pa_config->{'log_file'}).'/discovery/';
+ mkdir($discovery_log_path) unless -d $discovery_log_path;
+
+ eval {
+ local $SIG{__DIE__};
+
+ open (my $f, ">", $discovery_log_path.'task.'.$task_id.'.cmd');
+ print $f $cmd;
+ close ($f);
+
+ open ($f, ">", $discovery_log_path.'task.'.$task_id.'.out');
+ print $f $output;
+ close ($f);
+
+ };
+
+}
+
+################################################################################
+# Store configuration files.
+################################################################################
+sub log_conf_files($$@) {
+ my $pa_config = shift;
+ my $task_id = shift;
+ my @files = @_;
+
+ return unless $pa_config->{'verbosity'} eq 10;
+
+ my $discovery_log_path = dirname($pa_config->{'log_file'}).'/discovery/';
+ mkdir($discovery_log_path) unless -d $discovery_log_path;
+
+ eval {
+ local $SIG{__DIE__};
+
+ foreach my $f (@files) {
+ copy($f, $discovery_log_path);
+ }
+ };
+
+}
+
1;
__END__
diff --git a/pandora_server/lib/PandoraFMS/Omnishell.pm b/pandora_server/lib/PandoraFMS/Omnishell.pm
index 5d9dd1db0c..5bfaf561a4 100644
--- a/pandora_server/lib/PandoraFMS/Omnishell.pm
+++ b/pandora_server/lib/PandoraFMS/Omnishell.pm
@@ -9,6 +9,7 @@ use strict;
use warnings;
use File::Copy;
+use File::Basename qw(dirname basename);
use Scalar::Util qw(looks_like_number);
use lib '/usr/lib/perl5';
use PandoraFMS::PluginTools qw/init read_configuration read_file empty trim/;
diff --git a/pandora_server/lib/PandoraFMS/PluginTools.pm b/pandora_server/lib/PandoraFMS/PluginTools.pm
index 7de1a4db92..2edff5089d 100644
--- a/pandora_server/lib/PandoraFMS/PluginTools.pm
+++ b/pandora_server/lib/PandoraFMS/PluginTools.pm
@@ -34,7 +34,7 @@ our @ISA = qw(Exporter);
# version: Defines actual version of Pandora Server for this module only
my $pandora_version = "7.0NG.757";
-my $pandora_build = "210927";
+my $pandora_build = "210929";
our $VERSION = $pandora_version." ".$pandora_build;
our %EXPORT_TAGS = ( 'all' => [ qw() ] );
diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec
index 7c58162e86..b9bb62f13e 100644
--- a/pandora_server/pandora_server.redhat.spec
+++ b/pandora_server/pandora_server.redhat.spec
@@ -3,7 +3,7 @@
#
%define name pandorafms_server
%define version 7.0NG.757
-%define release 210927
+%define release 210929
Summary: Pandora FMS Server
Name: %{name}
diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec
index 02a7e09a60..6f2b04122e 100644
--- a/pandora_server/pandora_server.spec
+++ b/pandora_server/pandora_server.spec
@@ -3,7 +3,7 @@
#
%define name pandorafms_server
%define version 7.0NG.757
-%define release 210927
+%define release 210929
Summary: Pandora FMS Server
Name: %{name}
diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer
index 61cbbf9757..a90dc1b9a1 100755
--- a/pandora_server/pandora_server_installer
+++ b/pandora_server/pandora_server_installer
@@ -9,7 +9,7 @@
# **********************************************************************
PI_VERSION="7.0NG.757"
-PI_BUILD="210927"
+PI_BUILD="210929"
MODE=$1
if [ $# -gt 1 ]; then
diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl
index 7ad97b271d..71484020b6 100755
--- a/pandora_server/util/pandora_db.pl
+++ b/pandora_server/util/pandora_db.pl
@@ -35,7 +35,7 @@ use PandoraFMS::Config;
use PandoraFMS::DB;
# version: define current version
-my $version = "7.0NG.757 Build 210927";
+my $version = "7.0NG.757 Build 210929";
# Pandora server configuration
my %conf;
diff --git a/pandora_server/util/pandora_ha.pl b/pandora_server/util/pandora_ha.pl
index ac8774972c..a9d07ca66a 100755
--- a/pandora_server/util/pandora_ha.pl
+++ b/pandora_server/util/pandora_ha.pl
@@ -49,11 +49,14 @@ my $Running = 0;
########################################################################
# Print the given message with a preceding timestamp.
########################################################################
-sub log_message($$$) {
- my ($conf, $source, $message) = @_;
+sub log_message($$$;$) {
+ my ($conf, $source, $message, $verbosity_level) = @_;
+
+ my $level = $verbosity_level;
+ $level = 5 unless defined($level);
if (ref($conf) eq "HASH") {
- logger($conf, 'HA (' . $source . ') ' . "$message", 5);
+ logger($conf, 'HA (' . $source . ') ' . "$message", $level);
}
if ($source eq '') {
@@ -403,19 +406,6 @@ END {
stop();
}
-###############################################################################
-# Aux. get module id
-###############################################################################
-my %module_id;
-sub __get_module_id {
- my ($dbh, $module_type) = @_;
-
- if (!defined($module_id{$module_type})) {
- $module_id{$module_type} = get_module_id($dbh, $module_type);
- }
-
- return $module_id{$module_type}
-}
$SIG{INT} = \&stop;
$SIG{TERM} = \&stop;
diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl
index 06deb91173..8dabf8ce22 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.757 Build 210927";
+my $version = "7.0NG.757 Build 210929";
# save program name for logging
my $progname = basename($0);
|