Merge remote-tracking branch 'origin/develop' into ent-9640-agrupacion-de-graficas-en-periodos-de-tiempo

Conflicts:
	pandora_console/include/styles/pandora.css
This commit is contained in:
daniel 2023-12-13 10:39:48 +01:00
commit cc12c77008
77 changed files with 666 additions and 228 deletions

View File

@ -1,6 +1,6 @@
# Base config file for Pandora FMS Windows Agent
# (c) 2006-2023 Pandora FMS
# Version 7.0NG.774
# Version 7.0NG.774
# This program is Free Software, you can redistribute it and/or modify it
# under the terms of the GNU General Public Licence as published by the Free Software
# Foundation; either version 2 of the Licence or any later version

View File

@ -2179,16 +2179,7 @@ sub configure ($) {
#Launch tentacle server in proxy mode if configured
if ($Conf{'proxy_mode'}) {
#Check if user is root
if ($> != 0) {
if (launch_tentacle_proxy() != 0) {
return 1;
}
} else {
error ('Proxy mode can not be launched as root');
return 1;
}
return 1 if (launch_tentacle_proxy() != 0);
}
# Add the plugins directory to the PATH

View File

@ -1,5 +1,5 @@
package: pandorafms-agent-unix
Version: 7.0NG.774-231211
Version: 7.0NG.774-231213
Architecture: all
Priority: optional
Section: admin

View File

@ -14,7 +14,7 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
pandora_version="7.0NG.774-231211"
pandora_version="7.0NG.774-231213"
echo "Test if you has the tools for to make the packages."
whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null

View File

@ -1039,7 +1039,7 @@ my $Sem = undef;
my $ThreadSem = undef;
use constant AGENT_VERSION => '7.0NG.774';
use constant AGENT_BUILD => '231211';
use constant AGENT_BUILD => '231213';
# Agent log default file size maximum and instances
use constant DEFAULT_MAX_LOG_SIZE => 600000;
@ -4436,14 +4436,7 @@ my $PID = $$;
#Launch tentacle server in proxy mode if configured
if ($Conf{'proxy_mode'}) {
#Check if user is root
if ($> != 0) {
launch_tentacle_proxy();
} else {
log_message ('error', 'Proxy mode can not be launched as root');
exit 1;
}
launch_tentacle_proxy();
}
# Advice if YAML::Tiny is allowed in this system

View File

@ -4,7 +4,7 @@
%global __os_install_post %{nil}
%define name pandorafms_agent_linux
%define version 7.0NG.774
%define release 231211
%define release 231213
Summary: Pandora FMS Linux agent, PERL version
Name: %{name}

View File

@ -5,7 +5,7 @@
%define name pandorafms_agent_linux_bin
%define source_name pandorafms_agent_linux
%define version 7.0NG.774
%define release 231211
%define release 231213
%define debug_package %{nil}
Summary: Pandora FMS Linux agent, binary version

View File

@ -5,7 +5,7 @@
%define name pandorafms_agent_linux_bin
%define source_name pandorafms_agent_linux
%define version 7.0NG.774
%define release 231211
%define release 231213
%define debug_package %{nil}
Summary: Pandora FMS Linux agent, binary version

View File

@ -5,7 +5,7 @@
%define name pandorafms_agent_linux_bin
%define source_name pandorafms_agent_linux
%define version 7.0NG.774
%define release 231211
%define release 231213
Summary: Pandora FMS Linux agent, binary version
Name: %{name}

View File

@ -4,7 +4,7 @@
%global __os_install_post %{nil}
%define name pandorafms_agent_linux
%define version 7.0NG.774
%define release 231211
%define release 231213
Summary: Pandora FMS Linux agent, PERL version
Name: %{name}

View File

@ -10,7 +10,7 @@
# **********************************************************************
PI_VERSION="7.0NG.774"
PI_BUILD="231211"
PI_BUILD="231213"
OS_NAME=`uname -s`
FORCE=0

View File

@ -186,7 +186,7 @@ UpgradeApplicationID
{}
Version
{231211}
{231213}
ViewReadme
{Yes}

View File

@ -30,7 +30,7 @@ using namespace Pandora;
using namespace Pandora_Strutils;
#define PATH_SIZE _MAX_PATH+1
#define PANDORA_VERSION ("7.0NG.774 Build 231211")
#define PANDORA_VERSION ("7.0NG.774 Build 231213")
string pandora_path;
string pandora_dir;

View File

@ -11,7 +11,7 @@ BEGIN
VALUE "LegalCopyright", "Pandora FMS"
VALUE "OriginalFilename", "PandoraAgent.exe"
VALUE "ProductName", "Pandora FMS Windows Agent"
VALUE "ProductVersion", "(7.0NG.774(Build 231211))"
VALUE "ProductVersion", "(7.0NG.774(Build 231213))"
VALUE "FileVersion", "1.0.0.0"
END
END

View File

@ -1,5 +1,5 @@
package: pandorafms-console
Version: 7.0NG.774-231211
Version: 7.0NG.774-231213
Architecture: all
Priority: optional
Section: admin

View File

@ -14,7 +14,7 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
pandora_version="7.0NG.774-231211"
pandora_version="7.0NG.774-231213"
package_pear=0
package_pandora=1

View File

@ -34,11 +34,11 @@ if ((bool) $config['metaconsole']) {
include_once $config['homedir'].'/include/functions_modules.php';
include_once $config['homedir'].'/include/functions_users.php';
} else {
include_once '../include/config.php';
include_once '../include/functions_agents.php';
include_once '../include/functions_reporting.php';
include_once '../include/functions_modules.php';
include_once '../include/functions_users.php';
include_once __DIR__.'/../include/config.php';
include_once __DIR__.'/../include/functions_agents.php';
include_once __DIR__.'/../include/functions_reporting.php';
include_once __DIR__.'/../include/functions_modules.php';
include_once __DIR__.'/../include/functions_users.php';
}

View File

@ -31,7 +31,7 @@ function view_logfile($file_name, $toggle=false)
} else {
$file_size = filesize($file_name);
if ($memory_limit < $file_size) {
if ($memory_limit < $file_size && $memory_limit !== '-1') {
$code .= '<pre><h2>'.$file_name.' ('.__('File is too large than PHP memory allocated in the system.').')</h2>';
$code .= '<h2>'.__('The preview file is imposible.').'</h2>';
} else if ($file_size > ($config['max_log_size'] * 1000)) {
@ -117,6 +117,7 @@ function pandoralogs_extension_main()
view_logfile($config['homedir'].'/log/console.log', true);
}
view_logfile('/var/log/php-fpm/www-error.log', true);
view_logfile($logs_directory.'/pandora_server.log', true);
view_logfile($logs_directory.'/pandora_server.error', true);

View File

@ -1,4 +1,4 @@
pandorafms.vmware=9959cc3e5cc6bfcfadd6d05b56d4a11b
pandorafms.vmware=248788e0fb2cd4e11623e4a52ee7d05b
pandorafms.mysql=fadb4750d18285c0eca34f47c6aa3cfe
pandorafms.mssql=1cc215409741d19080269ffba112810e
pandorafms.oracle=2d9320a514d1e48a0b2804e1653c31c6

View File

@ -52,4 +52,6 @@ UPDATE `tagente_modulo` INNER JOIN `tservice` ON `tagente_modulo`.`custom_intege
UPDATE talert_actions SET field2='[PANDORA] Alert FIRED on _agent_ / _module_ / _timestamp_ / _data_' WHERE id=9;
UPDATE talert_actions SET field2='[PANDORA] Alert FIRED on _agent_ / _module_ / _timestamp_ / _data_' WHERE id=11;
UPDATE `tdiscovery_apps` SET `version` = '1.2' WHERE `short_name` = 'pandorafms.vmware';
COMMIT;

View File

@ -455,19 +455,28 @@ echo sprintf('<div id="header_table" class="header_table_%s">', $menuTypeClass);
);
$header_logout .= '</a></div>';
if (enterprise_installed()) {
$subtitle_header = $config['custom_subtitle_header'];
$class_header = '';
} else {
$subtitle_header = __('the Flexible Monitoring System (OpenSource version)');
echo '<div id="dialog_why_enterprise" class="invisible"></div>';
$class_header = 'underline-hover modal_module_list';
}
if (is_reporting_console_node() === true) {
echo '<div class="header_left">';
echo '<div class="header_left '.$class_header.'">';
echo '<span class="header_title">';
echo $config['custom_title_header'];
echo '</span>';
echo '<span class="header_subtitle">';
echo $config['custom_subtitle_header'];
echo $subtitle_header;
echo '</span>';
echo '</div>';
echo '<div class="header_center"></div>';
echo '<div class="header_right">'.$modal_help, $header_user, $header_logout.'</div>';
} else {
echo '<div class="header_left"><span class="header_title">'.$config['custom_title_header'].'</span><span class="header_subtitle">'.$config['custom_subtitle_header'].'</span></div>
echo '<div class="header_left '.$class_header.'"><span class="header_title">'.$config['custom_title_header'].'</span><span class="header_subtitle">'.$subtitle_header.'</span></div>
<div class="header_center">'.$header_searchbar.'</div>
<div class="header_right">'.$header_autorefresh, $header_autorefresh_counter, $header_discovery, $header_welcome, $servers_list, $modal_help, $header_setup, $header_user, $header_logout.'</div>';
}
@ -916,6 +925,46 @@ echo sprintf('<div id="header_table" class="header_table_%s">', $menuTypeClass);
$(document).ready (function () {
<?php if (enterprise_installed() === false) { ?>
$('.header_left').on('click', function(){
// Hidden tips modal.
$(".window").css("display", "none");
jQuery.post(
"ajax.php",
{
page: "include/functions_menu",
'why_enterprise': "true"
},
function(data) {
if (data) {
$("#dialog_why_enterprise").html(data);
// Open dialog
$("#dialog_why_enterprise").dialog({
resizable: false,
draggable: false,
modal: true,
show: {
effect: "fade",
duration: 200
},
hide: {
effect: "fade",
duration: 200
},
closeOnEscape: true,
width: 700,
height: 450,
close: function(){
$('#dialog_why_enterprise').html('');
}
});
}
},
"html"
);
});
<?php } ?>
// Check new notifications on a periodic way
setInterval(check_new_notifications, 60000);

View File

@ -566,10 +566,10 @@ if ($search != '') {
if ($id != '') {
$aux = $id[0]['id_agent'];
$search_sql = sprintf(
' AND ( nombre LIKE "%%%s%%"
OR alias LIKE "%%%s%%"
OR comentarios LIKE "%%%s%%"
OR EXISTS (SELECT * FROM tagent_custom_data WHERE id_agent = id_agente AND description LIKE "%%%s%%")
' AND ( REPLACE(nombre, "&#x20;", " ") LIKE "%%%s%%"
OR REPLACE(alias, "&#x20;", " ") LIKE "%%%s%%"
OR REPLACE(comentarios, "&#x20;", " ") LIKE "%%%s%%"
OR EXISTS (SELECT * FROM tagent_custom_data WHERE id_agent = id_agente AND REPLACE(description, "&#x20;", " ") LIKE "%%%s%%")
OR tagente.id_agente = %d',
$search,
$search,
@ -591,10 +591,10 @@ if ($search != '') {
$search_sql .= ')';
} else {
$search_sql = sprintf(
' AND ( nombre
LIKE "%%%s%%" OR alias
LIKE "%%%s%%" OR comentarios LIKE "%%%s%%"
OR EXISTS (SELECT * FROM tagent_custom_data WHERE id_agent = id_agente AND description LIKE "%%%s%%"))',
' AND ( REPLACE(nombre, "&#x20;", " ")
LIKE "%%%s%%" OR REPLACE(alias, "&#x20;", " ")
LIKE "%%%s%%" OR REPLACE(comentarios, "&#x20;", " ") LIKE "%%%s%%"
OR EXISTS (SELECT * FROM tagent_custom_data WHERE id_agent = id_agente AND REPLACE(description, "&#x20;", " ") LIKE "%%%s%%"))',
$search,
$search,
$search,

View File

@ -575,7 +575,7 @@ $where = sprintf('delete_pending = 0 AND id_agente = %s', $id_agente);
$search_string_entities = io_safe_input($search_string);
$basic_where = sprintf(
"(nombre LIKE '%%%s%%' OR nombre LIKE '%%%s%%' OR descripcion LIKE '%%%s%%' OR descripcion LIKE '%%%s%%') AND",
"(REPLACE(nombre, '&#x20;', ' ') LIKE '%%%s%%' OR REPLACE(nombre, '&#x20;', ' ') LIKE '%%%s%%' OR REPLACE(descripcion, '&#x20;', ' ') LIKE '%%%s%%' OR REPLACE(descripcion, '&#x20;', ' ') LIKE '%%%s%%') AND",
$search_string,
$search_string_entities,
$search_string,

View File

@ -575,12 +575,13 @@ if ($access_console_node === true) {
continue;
}
$extmenu = [];
if ($extension['godmode_menu']['name'] !== __('DB Schema check') && $extension['godmode_menu']['name'] !== __('DB interface')) {
$extmenu = $extension['godmode_menu'];
}
// Check the ACL for this user.
if ((bool) check_acl($config['id_user'], 0, $extmenu['acl']) === false) {
if ((bool) check_acl($config['id_user'], 0, ($extmenu['acl'] ?? '')) === false) {
continue;
}

View File

@ -729,7 +729,7 @@ if ($search_id_group) {
}
if ($search_string != '') {
$filter[] = '(name LIKE '."'%".$search_string."%'".'OR description LIKE '."'%".$search_string."%'".'OR tcp_send LIKE '."'%".$search_string."%'".'OR tcp_rcv LIKE '."'%".$search_string."%'".')';
$filter[] = '(REPLACE(name, "&#x20;", " ") LIKE '."'%".$search_string."%'".' OR REPLACE(REPLACE(description, "&#x20;", " "), "&#x20", " ")LIKE '."'%".$search_string."%'".' OR REPLACE(tcp_send, "&#x20;", " ") LIKE '."'%".$search_string."%'".'OR REPLACE(tcp_rcv, "&#x20;", " ") LIKE '."'%".$search_string."%'".')';
}
$total_components = network_components_get_network_components(

View File

@ -1658,7 +1658,7 @@ if (is_metaconsole() === true) {
10,
false,
false,
true,
false,
'',
false,
false,
@ -1692,7 +1692,7 @@ if (is_metaconsole() === true) {
10,
false,
false,
true,
false,
'',
false,
false,
@ -1746,7 +1746,7 @@ if (is_metaconsole() === true) {
10,
false,
false,
true,
false,
'',
false,
false,
@ -1771,7 +1771,7 @@ if (is_metaconsole() === true) {
<td >
<?php
html_print_extended_select_for_time(
'period',
'period3',
(string) $period,
'onselect=loadLogAgents();',
'',
@ -1809,7 +1809,7 @@ if (is_metaconsole() === true) {
10,
false,
false,
true,
false,
'',
false,
false,
@ -7167,7 +7167,7 @@ function loadLogAgents() {
params["get_agent_source"] = 1;
params["log_alert"] = 1;
params["page"] = "enterprise/include/ajax/log_viewer.ajax";
params["date"] = $('#period_select').val();
params["date"] = $('#period3_select').val();
jQuery.ajax({
data: params,
dataType: "json",

View File

@ -1643,7 +1643,7 @@ switch ($action) {
$es['log_number'] = $log_number;
$values['external_source'] = json_encode($es);
$values['period'] = get_parameter('period');
$values['period'] = get_parameter('period3');
$good_format = true;
break;
@ -1661,7 +1661,7 @@ switch ($action) {
$es['log_number'] = $log_number;
$values['external_source'] = json_encode($es);
$values['period'] = get_parameter('period');
$values['period'] = get_parameter('period3');
$values['period_range'] = get_parameter('period_range');
$values['show_graph'] = get_parameter('combo_graph_options');
$values['group_by_agent'] = get_parameter('checkbox_row_group_by_agent');
@ -2764,7 +2764,7 @@ switch ($action) {
$es['log_number'] = $log_number;
$values['external_source'] = json_encode($es);
$values['period'] = get_parameter('period');
$values['period'] = get_parameter('period3');
$good_format = true;
break;
@ -2782,7 +2782,7 @@ switch ($action) {
$es['log_number'] = $log_number;
$values['external_source'] = json_encode($es);
$values['period'] = get_parameter('period');
$values['period'] = get_parameter('period3');
$values['period_range'] = get_parameter('period_range');
$values['show_graph'] = get_parameter('combo_graph_options');
$values['group_by_agent'] = get_parameter('checkbox_row_group_by_agent');

View File

@ -539,6 +539,7 @@ foreach ($layoutDatas as $layoutData) {
$table->data[($i + 1)][5] .= html_print_checkbox('multiple_delete_items', $idLayoutData, false, true);
$table->data[($i + 1)][5] .= '<a href="'.$url_delete.'"onclick="javascript: if (!confirm(\''.__('Are you sure?').'\')) return false;">'.html_print_image('images/delete.svg', true, ['class' => 'main_menu_icon invert_filter']).'</a>';
$table->data[($i + 1)][5] .= html_print_input_hidden('updated_'.$idLayoutData, '0', true);
$table->data[($i + 1)][5] .= html_print_input_hidden('rowtype_'.$idLayoutData, $layoutData['type'], true);
// Second row
$table->data[($i + 2)]['icon'] = '';
@ -789,14 +790,6 @@ if ($x > ini_get('max_input_vars')) {
$pure = get_parameter('pure', 0);
if (is_metaconsole() === false) {
echo '<form id="vc_elem_form" method="post" action="index.php?sec=network&sec2=godmode/reporting/visual_console_builder&tab='.$activeTab.'&id_visual_console='.$visualConsole['id'].'">';
html_print_input_hidden('action', 'update');
} else {
echo "<form id='vc_elem_form' method='post' action='index.php?operation=edit_visualmap&sec=screen&sec2=screens/screens&action=visualmap&pure=0&tab=list_elements&id_visual_console=".$idVisualConsole."'>";
html_print_input_hidden('action2', 'update');
}
html_print_table($table);
// Form for multiple delete.
@ -806,15 +799,14 @@ if (is_metaconsole() === false) {
$url_multiple_delete = 'index.php?sec=screen&sec2=screens/screens&action=visualmap&tab='.$activeTab.'&id_visual_console='.$visualConsole['id'];
}
echo '</form>';
$buttons = html_print_submit_button(
__('Update'),
'go',
false,
[
'icon' => 'next',
'form' => 'vc_elem_form',
'icon' => 'next',
'form' => 'vc_elem_form',
'onclick' => 'submit_update_json()',
],
true
);
@ -976,4 +968,76 @@ ui_require_javascript_file('tinymce', 'vendor/tinymce/tinymce/');
return false;
}
function submit_update_json() {
var array_update = [];
$('input[id^=hidden-updated_]').each(function(){
var id = $(this).attr('id').split('_')[1];
var label = $('#hidden-label_'+id).val();
var image = $('#image_'+id).val();
var width = $('#text-width_'+id).val();
var height = $('#text-height_'+id).val();
var pos_x = $('#text-left_'+id).val();
var pos_y = $('#text-top_'+id).val();
var parent = $('#parent_'+id).val();
var agent = $('#hidden-agent_'+id).val();
var module = $('#module_'+id).val();
var period = $('#hidden-period_'+id).val();
var map_linked = $('#map_linked_'+id).val();
var id_server = $('#id_server_id_'+id).val();
var rowtype = $('rowtype_'+id).val();
var custom_graph = $('#custom_graph_'+id).val();
array_update.push({
'id': id,
'label': label,
'image': image,
'width': width,
'height': height,
'pos_x': pos_x,
'pos_y': pos_y,
'parent': parent,
'agent': agent,
'module': module,
'period': period,
'map_linked': map_linked,
'rowtype': rowtype,
'custom_graph': custom_graph,
'id_server': id_server,
});
});
var background_width = $('#text-width').val();
var background_height = $('#text-height').val();
if (background_height > 0 && background_width > 0){
$.ajax({
type: "POST",
url: "ajax.php",
data: {
page: "godmode/reporting/visual_console_builder",
action: "update_json",
tab: "list_elements",
array_update: JSON.stringify(array_update),
id_visual_console: "<?php echo (is_metaconsole() === true) ? $idVisualConsole : $visualConsole['id']; ?>",
background: $('#background').val(),
background_width: $('#text-width').val(),
background_height: $('#text-height').val(),
},
dataType: "json",
complete: function (data) {
location.reload();
}
});
} else {
confirmDialog({
title: "<?php echo __('Error.'); ?>",
message: "<?php echo __('The width and height property is required and should greater than 0'); ?>",
strOKButton: "<?php echo __('Close'); ?>",
hideCancelButton: true,
size: 300,
});
}
}
</script>

View File

@ -78,6 +78,7 @@ $action = get_parameterBetweenListValues(
'update',
'delete',
'multiple_delete',
'update_json',
],
'new'
);
@ -526,6 +527,110 @@ switch ($activeTab) {
}
break;
case 'update_json':
// Update background.
$background = get_parameter('background');
$width = get_parameter('background_width');
$height = get_parameter('background_height');
if ($width == 0 && $height == 0) {
$sizeBackground = getimagesize(
$config['homedir'].'/images/console/background/'.$background
);
$width = $sizeBackground[0];
$height = $sizeBackground[1];
}
db_process_sql_update(
'tlayout',
[
'background' => $background,
'width' => $width,
'height' => $height,
],
['id' => $idVisualConsole]
);
// Return the updated visual console.
$visualConsole = db_get_row_filter(
'tlayout',
['id' => $idVisualConsole]
);
// Update elements in visual map.
$idsElements = db_get_all_rows_filter(
'tlayout_data',
['id_layout' => $idVisualConsole],
[
'id',
'type',
]
);
$array_update = json_decode(io_safe_output(get_parameter('array_update')), true);
if (count($array_update)) {
foreach ($array_update as $row) {
$id = $row['id'];
$values = [];
$values['label'] = $row['label'];
$values['image'] = $row['image'];
$values['width'] = $row['width'];
$values['height'] = $row['height'];
$values['pos_x'] = $row['pos_x'];
$values['pos_y'] = $row['pos_y'];
switch ($row['rowtype']) {
case NETWORK_LINK:
case LINE_ITEM:
continue 2;
break;
case SIMPLE_VALUE_MAX:
case SIMPLE_VALUE_MIN:
case SIMPLE_VALUE_AVG:
$values['period'] = $row['period'];
break;
case MODULE_GRAPH:
$values['period'] = $row['period'];
unset($values['image']);
break;
case GROUP_ITEM:
$values['id_group'] = $row['group'];
break;
case CIRCULAR_PROGRESS_BAR:
case CIRCULAR_INTERIOR_PROGRESS_BAR:
case PERCENTILE_BUBBLE:
case PERCENTILE_BAR:
unset($values['height']);
break;
}
if (defined('METACONSOLE')) {
$values['id_metaconsole'] = $row['id_server'];
}
$values['id_agent'] = $row['agent'];
$values['id_agente_modulo'] = $row['module'];
$values['id_custom_graph'] = $row['custom_graph'];
$values['parent_item'] = $row['parent'];
$values['id_layout_linked'] = $row['map_linked'];
if (enterprise_installed()) {
enterprise_visual_map_update_action_from_list_elements($row['rowtype'], $values, $id);
}
db_process_sql_update('tlayout_data', $values, ['id' => $id]);
}
return true;
}
break;
case 'delete':
$id_element = get_parameter('id_element');
$result = db_process_sql_delete('tlayout_data', ['id' => $id_element]);

View File

@ -1113,9 +1113,9 @@ $(document).ready (function () {
id_imodule = $(value).attr('value');
$("select[name='inventory_changes_blacklist[]']")
.append(
$("<option></option>")
$("<option selected='selected'></option>")
.val(id_imodule)
.html('<i>' + imodule_name + '</i>')
.text(imodule_name)
);
$("#inventory_changes_blacklist_out")
.find("option[value='" + id_imodule + "']").remove();
@ -1141,7 +1141,7 @@ $(document).ready (function () {
.append(
$("<option></option>")
.val(id_imodule)
.html('<i>' + imodule_name + '</i>')
.text(imodule_name)
);
$("#inventory_changes_blacklist")
.find("option[value='" + id_imodule + "']").remove();
@ -1157,12 +1157,15 @@ $(document).ready (function () {
}
}
});
$("#inventory_changes_blacklist > option").each(function(key, value) {
$(value).prop('selected',true).trigger('change');
});
});
$("#submit-update_button").click(function () {
$('#inventory_changes_blacklist option').map(function(){
$(this).prop('selected', true);
});
$("#inventory_changes_blacklist > option").each(function(key, value) {
$(value).prop('selected',true).trigger('change');
});
});
</script>

View File

@ -652,30 +652,30 @@ if ($get_agent_alerts_datatable === true) {
if (is_metaconsole() === true) {
include_once $config['homedir'].'/enterprise/meta/include/functions_alerts_meta.php';
if ($idAgent !== 0) {
$alerts['alerts_simple'] = alerts_meta_get_alerts($agents, $filter_alert, false, $whereAlertSimple, false, false, $idGroup, false, $strict_user, $tag_filter, $action_filter);
$alerts['alerts_simple'] = alerts_meta_get_alerts($agents, $filter_alert, false, $whereAlertSimple, false, false, $idGroup, false, false, $tag_filter, $action_filter);
$countAlertsSimple = alerts_meta_get_alerts($agents, $filter_alert, false, $whereAlertSimple, false, false, $idGroup, true, $strict_user, $tag_filter, $action_filter);
$countAlertsSimple = alerts_meta_get_alerts($agents, $filter_alert, false, $whereAlertSimple, false, false, $idGroup, true, false, $tag_filter, $action_filter);
} else {
$id_groups = array_keys(
users_get_groups($config['id_user'], 'AR', false)
);
$alerts['alerts_simple'] = alerts_meta_get_group_alerts($id_groups, $filter_alert, false, $whereAlertSimple, false, false, $idGroup, false, $strict_user, $tag_filter, $action_filter, $search_sg);
$alerts['alerts_simple'] = alerts_meta_get_group_alerts($id_groups, $filter_alert, false, $whereAlertSimple, false, false, $idGroup, false, false, $tag_filter, $action_filter, $search_sg);
$countAlertsSimple = alerts_meta_get_group_alerts($id_groups, $filter_alert, false, $whereAlertSimple, false, false, $idGroup, true, $strict_user, $tag_filter, $action_filter, $search_sg);
$countAlertsSimple = alerts_meta_get_group_alerts($id_groups, $filter_alert, false, $whereAlertSimple, false, false, $idGroup, true, false, $tag_filter, $action_filter, $search_sg);
}
} else {
if ($idAgent !== 0) {
$alerts['alerts_simple'] = agents_get_alerts_simple($idAgent, $filter_alert, $options_simple, $whereAlertSimple, false, false, $idGroup, false, $strict_user, $tag_filter);
$alerts['alerts_simple'] = agents_get_alerts_simple($idAgent, $filter_alert, $options_simple, $whereAlertSimple, false, false, $idGroup, false, false, $tag_filter);
$countAlertsSimple = agents_get_alerts_simple($idAgent, $filter_alert, false, $whereAlertSimple, false, false, $idGroup, true, $strict_user, $tag_filter);
$countAlertsSimple = agents_get_alerts_simple($idAgent, $filter_alert, false, $whereAlertSimple, false, false, $idGroup, true, false, $tag_filter);
} else {
$id_groups = array_keys(
users_get_groups($config['id_user'], $access, false)
);
$alerts['alerts_simple'] = get_group_alerts($id_groups, $filter_alert, $options_simple, $whereAlertSimple, false, false, $idGroup, false, $strict_user, $tag_filter, $action_filter, false, $search_sg);
$alerts['alerts_simple'] = get_group_alerts($id_groups, $filter_alert, $options_simple, $whereAlertSimple, false, false, $idGroup, false, false, $tag_filter, $action_filter, false, $search_sg);
$countAlertsSimple = get_group_alerts($id_groups, $filter_alert, false, $whereAlertSimple, false, false, $idGroup, true, $strict_user, $tag_filter, $action_filter, false, $search_sg);
$countAlertsSimple = get_group_alerts($id_groups, $filter_alert, false, $whereAlertSimple, false, false, $idGroup, true, false, $tag_filter, $action_filter, false, $search_sg);
}
}

View File

@ -756,6 +756,7 @@ if (check_login()) {
$access = ($agent_a === true) ? 'AR' : (($agent_w === true) ? 'AW' : 'AR');
$id_agent = (int) get_parameter('id_agente');
$id_agente = $id_agent;
$id_grupo = agents_get_agent_group($id_agent);
$show_notinit = (bool) get_parameter('show_notinit');
$cluster_list = (int) get_parameter('cluster_list');
$sortField = (string) get_parameter('sort_field');

View File

@ -118,7 +118,7 @@ class ConfigPEN extends HTML
if (is_array($filter)) {
if (!empty($filter['free_search'])) {
$sql_filters[] = vsprintf(
' AND (lower(`manufacturer`) like lower("%%%s%%")
' AND (lower(REPLACE(manufacturer, "&#x20;", " ")) like lower("%%%s%%")
OR pen = "%s") ',
array_fill(0, 2, $filter['free_search'])
);

View File

@ -701,6 +701,10 @@ class Diagnostics extends Wizard
{
global $config;
// Get version comment DB.
$sql_version_comment = 'select @@version_comment as version_comment';
$version_comment = db_get_sql($sql_version_comment);
$result = [
'error' => false,
'data' => [
@ -716,6 +720,14 @@ class Diagnostics extends Wizard
'name' => __('DB Schema Build'),
'value' => $config['db_scheme_build'],
],
'dbVersion' => [
'name' => __('Engine version'),
'value' => $config['dbconnection']->server_info,
],
'dbVersionComment' => [
'name' => __('Version comment'),
'value' => $version_comment,
],
],
];

View File

@ -333,6 +333,7 @@ class TreeService extends Tree
$services[$service['id']]['id'] = $service['id'];
$services[$service['id']]['description'] = $service['description'];
$services[$service['id']]['serviceDetail'] = 'index.php?sec=network&sec2=enterprise/operation/services/services&tab=service_map&id_service='.(int) $service['id'];
$services[$service['id']]['title'] = services_get_parents_title((int) $service['id']);
}
return $services;
@ -627,6 +628,7 @@ class TreeService extends Tree
$tmp['type'] = 'services';
$tmp['rootType'] = 'services';
$tmp['children'] = [];
$tmp['servicesChildren'] = services_get_services_children($item->service()->id());
$tmp['serviceDetail'] = ui_get_full_url(
'index.php?sec=network&sec2=enterprise/operation/services/services&tab=service_map&id_service='.$item->service()->id()
);
@ -731,7 +733,10 @@ class TreeService extends Tree
if (isset($this->filter['searchService']) === true
&& empty($this->filter['searchService']) === false
) {
return " AND (ts.name LIKE '%".$this->filter['searchService']."%' OR ts.description LIKE '%".$this->filter['searchService']."%')";
$whereAncestors = ' AND ts.name LIKE "%'.$this->filter['searchService'].'%"
OR ts.description LIKE "%'.$this->filter['searchService'].'%"';
return $whereAncestors;
}
return '';

View File

@ -606,7 +606,7 @@ class WelcomeWindow extends Wizard
],
[
'arguments' => [
'label' => __("Let's do it!"),
'label' => __('Let&apos;s do it!'),
'type' => 'button',
'attributes' => [
'class' => 'secondary',

View File

@ -20,7 +20,7 @@
/**
* Pandora build version and version
*/
$build_version = 'PC231211';
$build_version = 'PC231213';
$pandora_version = 'v7.0NG.774';
// Do not overwrite default timezone set if defined.

View File

@ -10301,8 +10301,7 @@ function api_set_module_data($id, $thrash2, $other, $trash1)
modules_get_type_name($agentModule['id_tipo_modulo']),
$data
);
if (false === @file_put_contents($config['remote_config'].'/'.io_safe_output($agent['nombre']).'.'.$time.'.data', $xml)) {
if (false === @file_put_contents($config['remote_config'].'/'.io_safe_output($agent['nombre']).'.'.$idAgentModule.'.'.$time.'.data', $xml)) {
returnError(sprintf('XML file could not be generated in path: %s', $config['remote_config']));
} else {
echo __('XML file was generated successfully in path: ').$config['remote_config'];

View File

@ -194,11 +194,11 @@ function custom_graphs_get_user($id_user=0, $only_names=false, $returnAllGroup=t
function custom_graphs_search($id_group, $search)
{
if ($id_group != '' && $search != '') {
$all_graphs = db_get_all_rows_sql('select * from tgraph where id_group = '.$id_group.' AND (name LIKE "%'.$search.'%" OR description LIKE "'.$search.'")');
$all_graphs = db_get_all_rows_sql('select * from tgraph where id_group = '.$id_group.' AND (REPLACE(name, "&#x20;", " ") LIKE "%'.$search.'%" OR REPLACE(description, "&#x20;", " ") LIKE "'.$search.'")');
} else if ($id_group != '') {
$all_graphs = db_get_all_rows_sql('select * from tgraph where id_group = '.$id_group.'');
} else {
$all_graphs = db_get_all_rows_sql('select * from tgraph where name LIKE "%'.$search.'%" OR description LIKE "'.$search.'"');
$all_graphs = db_get_all_rows_sql('select * from tgraph where REPLACE(name, "&#x20;", " ") LIKE "%'.$search.'%" OR REPLACE(description, "&#x20;", " ") LIKE "'.$search.'"');
}
if ($all_graphs === false) {

View File

@ -128,19 +128,18 @@ function upload_file($upload_file_or_zip, $default_real_directory, $destination_
$extension = pathinfo($filename, PATHINFO_EXTENSION);
$umask = io_safe_output((string) get_parameter('umask'));
$parse_all_queries = explode('&', parse_url($_SERVER['HTTP_REFERER'], PHP_URL_QUERY));
$parse_sec2_query = explode('=', $parse_all_queries[1]);
$check_extension = true;
if ($parse_sec2_query[1] === 'operation/snmpconsole/snmp_mib_uploader') {
if ((strtolower($extension) !== 'mib' && strtolower($extension) !== 'zip')) {
$check_extension = false;
} else {
$check_extension = true;
}
}
// $parse_all_queries = explode('&', parse_url($_SERVER['HTTP_REFERER'], PHP_URL_QUERY));
// $parse_sec2_query = explode('=', $parse_all_queries[1]);
// $check_extension = true;
// if ($parse_sec2_query[1] === 'operation/snmpconsole/snmp_mib_uploader') {
// if ((strtolower($extension) !== 'mib' && strtolower($extension) !== 'zip')) {
// $check_extension = false;
// } else {
// $check_extension = true;
// }
// }
// (strtolower($extension) !== 'mib' && strtolower($extension) !== 'zip')
if (strpos($real_directory, $default_real_directory) !== 0 || $check_extension === false) {
if (strpos($real_directory, $default_real_directory) !== 0) {
// Perform security check to determine whether received upload
// directory is part of the default path for caller uploader and
// user is not trying to access an external path (avoid
@ -152,12 +151,12 @@ function upload_file($upload_file_or_zip, $default_real_directory, $destination_
// Copy file to directory and change name.
$nombre_archivo = sprintf('%s/%s', $real_directory, $filename);
try {
$mimeContentType = mime_content_type($_FILES['file']['tmp_name']);
if (empty($filterFilesType) === true || in_array($mimeContentType, $filterFilesType) === true) {
$ext = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION));
if (empty($filterFilesType) === true || in_array($ext, $filterFilesType) === true) {
$result = copy($_FILES['file']['tmp_name'], $nombre_archivo);
} else {
$error_message = 'The uploaded file is not allowed. Only gif, png or jpg files can be uploaded.';
$types_allowed = implode(', ', $filterFilesType);
$error_message = 'The uploaded file is not allowed. Only '.$types_allowed.' files can be uploaded.';
throw new Exception(__($error_message));
}
} catch (Exception $ex) {
@ -199,19 +198,29 @@ function upload_file($upload_file_or_zip, $default_real_directory, $destination_
$filepath = $_FILES['file']['tmp_name'];
$real_directory = filemanager_safe_directory($destination_directory);
$secure = true;
if ($parse_sec2_query[1] === 'operation/snmpconsole/snmp_mib_uploader') {
// Security control structure.
$zip = new \ZipArchive;
if ($zip->open($filepath) === true) {
for ($i = 0; $i < $zip->numFiles; $i++) {
$unzip_filename = $zip->getNameIndex($i);
$extension = pathinfo($unzip_filename, PATHINFO_EXTENSION);
if (strtolower($extension) !== 'mib') {
$secure = false;
break;
try {
$ext = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION));
if (empty($filterFilesType) === true || in_array($ext, $filterFilesType) === true) {
// Security control structure.
$zip = new \ZipArchive;
if ($zip->open($filepath) === true) {
for ($i = 0; $i < $zip->numFiles; $i++) {
$unzip_filename = $zip->getNameIndex($i);
$extension = pathinfo($unzip_filename, PATHINFO_EXTENSION);
if (in_array(strtolower($extension), $filterFilesType) === false) {
$error_message = 'The uploaded file is not allowed. Only '.$types_allowed.' files can be uploaded.';
$secure = false;
throw new Exception(__($error_message));
}
}
}
}
} catch (Exception $ex) {
db_pandora_audit(
AUDIT_LOG_FILE_MANAGER,
'Error Uploading files: '.$ex->getMessage()
);
$config['filemanager']['message'] = ui_print_error_message(__('Upload error').': '.$ex->getMessage());
}
if (strpos($real_directory, $default_real_directory) !== 0 || $secure === false) {

View File

@ -77,7 +77,7 @@ function inventory_get_data(
}
if ($inventory_search_string != '') {
array_push($where, "tagent_module_inventory.data LIKE '%".$inventory_search_string."%'");
array_push($where, "REPLACE(tagent_module_inventory.data, '&#x20;', ' ') LIKE '%".$inventory_search_string."%'");
}
$offset = (int) get_parameter('offset');
@ -746,7 +746,7 @@ function inventory_get_datatable(
}
if ($inventory_search_string != '') {
array_push($where, "tagent_module_inventory.data LIKE '%".$inventory_search_string."%'");
array_push($where, "REPLACE(tagente_datos_inventory.data, '&#x20;', ' ') LIKE '%".$inventory_search_string."%'");
}
if ($utimestamp > 0) {
@ -786,7 +786,6 @@ function inventory_get_datatable(
}
$rows = db_get_all_rows_sql($sql);
if ($order_by_agent === false) {
$modules = [];
foreach ($rows as $row) {
@ -796,7 +795,13 @@ function inventory_get_datatable(
$data_rows = explode(PHP_EOL, $row['data_inventory']);
foreach ($data_rows as $data_key => $data_value) {
if (empty($data_value) === false) {
if (empty($inventory_search_string) !== true) {
$search_check = strpos(str_replace('&#x20;', ' ', $data_value), $inventory_search_string);
} else {
$search_check = true;
}
if (empty($data_value) === false && $search_check !== false) {
$row['data'] = $data_value;
$modules[$row['name']][$row['name_agent'].'-'.$data_key.'-'.$data_value] = $row;
}
@ -889,7 +894,7 @@ function get_data_basic_info_sql($params, $count=false)
if ($params['search'] > 0) {
$where .= sprintf(
' AND ( alias LIKE "%%%s%%" )',
' AND ( REPLACE(alias, "&#x20;", " ") LIKE "%%%s%%" )',
$params['search']
);
}

View File

@ -330,7 +330,7 @@ function menu_print_menu(&$menu)
if (isset($sub['type']) && $sub['type'] == 'direct') {
// This is an external link.
$submenu_output .= '<li title="'.$sub['id'].'" id="'.str_replace(' ', '_', $sub['id']).'" class="'.$class.'">';
$submenu_output .= '<li title="'.$sub['text'].'" id="'.str_replace(' ', '_', $sub['id']).'" class="'.$class.'">';
if (isset($sub['subtype']) && $sub['subtype'] == 'nolink') {
$submenu_output .= '<div class=" SubNoLink '.$sub_tree_class.'"><span class="w70p span_has_menu_text">'.$sub['text'].'</span><div class="w21p arrow_menu_down"></div></div>';
@ -875,6 +875,7 @@ function menu_pepare_acl_select_data($pages, $sec)
if (is_ajax()) {
$about = (bool) get_parameter('about');
$about_operation = (bool) get_parameter('about_operation');
$why_enterprise = (bool) get_parameter('why_enterprise');
if ($about) {
global $config;
global $pandora_version;
@ -1107,10 +1108,10 @@ if (is_ajax()) {
</tr>
<tr class="about-last-tr">
<th style="width: 50%;">
<p class="about-last-p"><span>'.$db_info->data->dbSize->name.'</span></p>
<p class="about-last-p"><span>'.$db_info->data->dbVersion->name.'</span></p>
</th>
<th style="width: 50%;">
<p class="about-last-p" style="font-size: 10pt;">'.$db_info->data->dbSize->value.'</p>
<p class="about-last-p" style="font-size: 10pt;">'.$db_info->data->dbVersion->value.'</p>
</th>
</tr>
@ -1370,4 +1371,50 @@ if (is_ajax()) {
echo $dialog;
}
if ($why_enterprise) {
global $config;
global $pandora_version;
$product_name = io_safe_output(get_product_name());
$lts_name = '';
if (empty($config['lts_name']) === false) {
$lts_name = ' <i>'.$config['lts_name'].'</i>';
}
$image_about = ui_get_full_url('/images/custom_logo/logo-default-pandorafms-collapsed.svg', false, false, false);
$url_why_enterprise = 'https://pandorafms.com/en/why-enterprise/';
$lang = users_get_user_by_id($config['id_user'])['language'];
if ($lang === 'es') {
$url_why_enterprise = 'https://pandorafms.com/es/por-que-pandora-fms-enterprise/';
}
$dialog = '
<div id="about-tabs" class="overflow-hidden">
<div id="tab-general-view">
<table class="table-about">
<tbody>
<tr>
<th style="width: 40%; border: 0px;">
<a href="https://pandorafms.com/" target="_blank">
<img src="'.$image_about.'" alt="logo" width="50%">
</a>
</th>
<th style="width: 60%; text-align: left; border: 0px;">
<h1>'.$product_name.'</h1>
<p><span>'.__('Version').' '.$pandora_version.$lts_name.' - '.(enterprise_installed() ? 'Enterprise' : 'Community').'</span></p>
<p>'.__('You are using the free, OpenSource version of Pandora FMS.').'</p>
<p>'.__('This version has no official support or warranty, you can purchase the Enterprise version, which offers support, warranty and additional features to the Opensource version.').'</p>
<p><span><a href="'.$url_why_enterprise.'">'.__('Click on this link for more information.').'</a></span></p>
</th>
</tr>
</tbody>
</table>
<p class="trademark-copyright">Trademark and copyright 2004 - '.date('Y').' <a href="https://pandorafms.com/" target="_blank">Pandora FMS</a>. All rights reserved</p>
</div>
</div>
';
echo $dialog;
}
}

View File

@ -2624,12 +2624,26 @@ function modules_get_agentmodule_data_for_humans($module)
$salida = human_milliseconds_to_string($module['datos']);
}
} else {
$salida = remove_right_zeros(number_format($module['datos'], $config['graph_precision'], $config['decimal_separator'], $config['thousand_separator']));
$salida = remove_right_zeros(
number_format(
$module['datos'],
$config['graph_precision'],
$config['decimal_separator'],
($config['thousand_separator'] ?? null)
)
);
}
break;
default:
$salida = remove_right_zeros(number_format($module['datos'], $config['graph_precision'], $config['decimal_separator'], $config['thousand_separator']));
$salida = remove_right_zeros(
number_format(
$module['datos'],
$config['graph_precision'],
$config['decimal_separator'],
($config['thousand_separator'] ?? null)
)
);
break;
}
break;
@ -2648,12 +2662,26 @@ function modules_get_agentmodule_data_for_humans($module)
$salida = human_milliseconds_to_string($module['datos']);
}
} else {
$salida = remove_right_zeros(number_format($module['datos'], $config['graph_precision'], $config['decimal_separator'], $config['thousand_separator']));
$salida = remove_right_zeros(
number_format(
$module['datos'],
$config['graph_precision'],
$config['decimal_separator'],
($config['thousand_separator'] ?? null)
)
);
}
break;
default:
$salida = remove_right_zeros(number_format($module['datos'], $config['graph_precision'], $config['decimal_separator'], $config['thousand_separator']));
$salida = remove_right_zeros(
number_format(
$module['datos'],
$config['graph_precision'],
$config['decimal_separator'],
($config['thousand_separator'] ?? null)
)
);
break;
}
}
@ -2935,7 +2963,14 @@ function modules_get_status($id_agent_module, $db_status, $data, &$status, &$tit
}
if (is_numeric($data)) {
$title .= ': '.remove_right_zeros(number_format($data, $config['graph_precision'], $config['decimal_separator'], $config['thousand_separator']));
$title .= ': '.remove_right_zeros(
number_format(
$data,
$config['graph_precision'],
$config['decimal_separator'],
($config['thousand_separator'] ?? null)
)
);
} else {
$text = io_safe_output($data);

View File

@ -1275,7 +1275,7 @@ function reporting_html_SLA($table, $item, $mini, $pdf=0)
$table3->headstyle[5] = 'text-align: right';
foreach ($item['data'] as $sla) {
if (isset($sla) === true) {
if (isset($sla) === true && empty($sla['agent']) === false) {
// First_table.
$row = [];
$row[] = $sla['agent'];

View File

@ -1486,6 +1486,11 @@ var TreeController = {
return 0;
});
//Search service criterion
const searchFilter = controller.filter.searchService;
if (searchFilter && controller.finded !== 1) {
rawTree = _filterItems(rawTree, searchFilter);
}
_.each(rawTree, function(element) {
element.jqObject = _processNode($group, element);
});
@ -1551,6 +1556,67 @@ var TreeController = {
// Add again the hover event to the 'force_callback' elements
forced_title_callback();
/**
* Filter the tree based on a search criterion
*/
function _filterItems(rawTree, searched) {
const ancestors = [];
const father = [];
const newTree = [];
const tmpTree = [];
rawTree.map((raw, index) => {
if (raw.type === "services") {
if (raw.servicesChildren.length !== 0) {
// search at parent level
let descr = raw.description.toLowerCase();
let sear = searched.toLowerCase();
let findedPadre = descr.indexOf(sear);
if (findedPadre === -1) {
father.push(raw.id);
} else if (findedPadre >= 0) {
ancestors.push(raw.id);
} else {
//we mark the father as found
controller.finded = 1;
}
} else {
let finded = raw.description.indexOf(searched);
if (finded === -1) {
delete rawTree[index];
}
}
}
});
if (ancestors.length >= 1) {
ancestors.map(ancestor => {
newTree.push(
rawTree.filter(item => item.id === parseInt(ancestor))
);
});
return newTree[0];
}
if (father.length >= 1) {
let filterfather = [...new Set(father)];
filterfather.map(father => {
tmpTree.push(rawTree.filter(raw => raw.id == father));
});
let tree = [...new Set(tmpTree)];
tree.map(item => {
let tmpItem = item[0];
newTree.push(tmpItem);
});
return newTree;
}
return rawTree.filter(item => item);
}
},
load: function() {
this.reload();

View File

@ -8764,6 +8764,10 @@ div.graph div.legend table {
text-decoration: underline;
}
.underline-hover:hover {
text-decoration: underline;
}
.w105px {
width: 105px;
}
@ -10266,6 +10270,14 @@ div#err_msg_centralised {
align-items: flex-start;
}
.div-col-4 {
width: 25%;
display: flex;
flex-direction: column;
align-items: flex-start;
margin-top: 10px;
}
.div-span {
width: 100%;
color: #161628;
@ -12903,6 +12915,14 @@ tr.shown td.details-control {
background-color: transparent;
}
.span_as_label {
font-size: 13px;
line-height: 16px;
color: #161628;
font-weight: bold;
margin-bottom: 10px;
}
.basic-options-disabled tr > td,
.basic-options-disabled tr > td > div > label {
color: gray;

View File

@ -743,6 +743,9 @@ p {
margin-block-end: 1em;
}
strong {
font-size: inherit;
}
/* Styles for the solid icons */
.fa {

File diff suppressed because one or more lines are too long

View File

@ -131,7 +131,7 @@
<div style='padding-bottom: 50px'>
<?php
$version = '7.0NG.774';
$build = '231211';
$build = '231213';
$banner = "v$version Build $build";
error_reporting(0);

View File

@ -320,6 +320,7 @@ $table->size[0] = '50%';
$table->size[1] = '50%';
$table->class = 'filter-table-adv';
$table->cellstyle['group'][0] = 'display: flex;width: 95% !important;';
$table->data['group'][0] = html_print_label_input_block(
__('Group'),
html_print_select_groups(
@ -336,7 +337,8 @@ $table->data['group'][0] = html_print_label_input_block(
true,
'',
false
)
),
['div_class' => 'w100p']
);
$table->data['group'][0] .= html_print_label_input_block(
@ -346,11 +348,7 @@ $table->data['group'][0] .= html_print_label_input_block(
1,
$recursion,
true
),
[
'div_class' => 'add-input-reverse',
'label_class' => 'label-thin',
]
)
);
$table->data['group'][1] = html_print_label_input_block(
@ -405,7 +403,7 @@ foreach ($pre_fields as $key => $value) {
$table->data[1][0] = html_print_label_input_block(
__('Operating System'),
html_print_select($fields, 'os', $os, '', 'All', 0, true)
html_print_select($fields, 'os', $os, '', 'All', 0, true, false, true, 'w100p', false, 'width:100%')
);
$table->data[1][1] = html_print_label_input_block(
@ -428,9 +426,22 @@ if (function_exists('policies_get_policies') === true) {
}
}
$table->data[2][0] = html_print_label_input_block(
$table->data[2][1] = html_print_label_input_block(
__('Policies'),
html_print_select($fields, 'policies[]', $policies, '', 'All', 0, true, true)
html_print_select(
$fields,
'policies',
$policies,
'this.form.submit()',
__('All'),
0,
true,
false,
true,
'w100p',
false,
'width: 100%'
)
);
$custom_fields = db_get_all_fields_in_table('tagent_custom_fields');
@ -438,7 +449,7 @@ if ($custom_fields === false) {
$custom_fields = [];
}
$div_custom_fields = '<div class="flex-row">';
$div_custom_fields = '<div class="flex-row w100p" style="justify-content: unset;">';
foreach ($custom_fields as $custom_field) {
$custom_field_value = '';
if (empty($ag_custom_fields) === false) {
@ -448,10 +459,10 @@ foreach ($custom_fields as $custom_field) {
}
}
$div_custom_fields .= '<div class="div-col">';
$div_custom_fields .= '<div class="div-col-4">';
$div_custom_fields .= '<div class="div-span">';
$div_custom_fields .= '<span >'.$custom_field['name'].'</span>';
$div_custom_fields .= '<span class="span_as_label">'.$custom_field['name'].'</span>';
$div_custom_fields .= '</div>';
$div_custom_fields .= '<div class="div-input">';
@ -890,7 +901,11 @@ if ($group_id > 0) {
$groups = array_keys($user_groups);
}
$all_policies = in_array(0, ($policies ?? []));
if (is_array($policies)) {
$all_policies = in_array(0, ($policies ?? []));
} else {
$all_policies = [];
}
$id_os_sql = '';
$policies_sql = '';

View File

@ -121,8 +121,11 @@ if (empty($agent['os_version']) !== true) {
$os_agent_text = $os_version.' ('.$os_version_name[1].')';
} else {
$os_name = preg_split('/[0-9]/', $agent['os_version'])[0];
$os_version = explode($os_name, explode('(', $agent['os_version'])[0])[1];
$os_agent_text = $os_version;
$os_agent_text = $agent['os_version'];
if (empty($os_name) === false) {
$os_version = explode($os_name, explode('(', $agent['os_version'])[0])[1];
$os_agent_text = $os_version;
}
}
}

View File

@ -1289,6 +1289,10 @@ if ($inventory_module !== 'basic') {
$style = 'width: 100%';
$ordering = true;
$searching = false;
$search = [];
if (strlen($inventory_search_string) > 0) {
$search['value'] = $inventory_search_string;
}
$columns = [
'alias',
@ -1338,6 +1342,7 @@ if ($inventory_module !== 'basic') {
'get_data_basic_info' => 1,
'id_agent' => $id_agente,
'id_group' => $inventory_id_group,
'search' => $search,
],
'zeroRecords' => __('Agent info not found'),
'emptyTable' => __('Agent info not found'),

View File

@ -76,15 +76,15 @@ if ($searchAgents) {
$sql = "SELECT DISTINCT taddress_agent.id_agent FROM taddress
INNER JOIN taddress_agent ON
taddress.id_a = taddress_agent.id_a
WHERE taddress.ip LIKE '$stringSearchSQL'";
WHERE LOWER(REPLACE(taddress.ip, '&#x20;', ' ')) LIKE LOWER('$stringSearchSQL')";
$id = db_get_all_rows_sql($sql);
if ($id != '') {
$aux = $id[0]['id_agent'];
$search_sql = " t1.nombre LIKE '".$stringSearchSQL."' OR
t2.nombre LIKE '".$stringSearchSQL."' OR
t1.alias LIKE '".$stringSearchSQL."' OR
t1.comentarios LIKE '".$stringSearchSQL."' OR
$search_sql = " LOWER(REPLACE(t1.nombre, '&#x20;', ' ')) LIKE LOWER('".$stringSearchSQL."') OR
LOWER(REPLACE(t2.nombre, '&#x20;', ' ')) LIKE LOWER('".$stringSearchSQL."') OR
LOWER(REPLACE(t1.alias, '&#x20;', ' ')) LIKE LOWER('".$stringSearchSQL."') OR
LOWER(REPLACE(t1.comentarios, '&#x20;', ' ')) LIKE LOWER('".$stringSearchSQL."') OR
t1.id_agente =".$aux;
$idCount = count($id);
@ -96,16 +96,16 @@ if ($searchAgents) {
}
}
} else {
$search_sql = " t1.nombre LIKE '".$stringSearchSQL."' OR
t2.nombre LIKE '".$stringSearchSQL."' OR
t1.direccion LIKE '".$stringSearchSQL."' OR
t1.comentarios LIKE '".$stringSearchSQL."' OR
t1.alias LIKE '".$stringSearchSQL."'";
$search_sql = " LOWER(REPLACE(t1.nombre, '&#x20;', ' ')) LIKE LOWER('".$stringSearchSQL."') OR
LOWER(REPLACE(t2.nombre, '&#x20;', ' ')) LIKE LOWER('".$stringSearchSQL."') OR
LOWER(REPLACE(t1.direccion, '&#x20;', ' ')) LIKE LOWER('".$stringSearchSQL."') OR
LOWER(REPLACE(t1.comentarios, '&#x20;', ' ')) LIKE LOWER('".$stringSearchSQL."') OR
LOWER(REPLACE(t1.alias, '&#x20;', ' ')) LIKE LOWER('".$stringSearchSQL."')";
}
if ($has_secondary === true) {
$search_sql .= " OR (tasg.id_group IS NOT NULL AND
tasg.id_group IN (SELECT id_grupo FROM tgrupo WHERE nombre LIKE '".$stringSearchSQL."'))";
tasg.id_group IN (SELECT id_grupo FROM tgrupo WHERE LOWER(REPLACE(nombre, '&#x20;', ' ')) LIKE LOWER('".$stringSearchSQL."')))";
}
$sql = "

View File

@ -139,64 +139,64 @@ if ($searchAlerts) {
switch ($config['dbtype']) {
case 'mysql':
$whereAlerts = 'AND (
id_alert_template IN (SELECT id FROM talert_templates WHERE name LIKE "%'.$stringSearchSQL.'%") OR
id_alert_template IN (SELECT id FROM talert_templates WHERE REPLACE(name, "&#x20;", " ") LIKE "%'.$stringSearchSQL.'%") OR
id_alert_template IN (
SELECT id
FROM talert_templates
WHERE id_alert_action IN (
SELECT id
FROM talert_actions
WHERE name LIKE "%'.$stringSearchSQL.'%")) OR
WHERE REPLACE(name, "&#x20;", " ") LIKE "%'.$stringSearchSQL.'%")) OR
talert_template_modules.id IN (
SELECT id_alert_template_module
FROM talert_template_module_actions
WHERE id_alert_action IN (
SELECT id
FROM talert_actions
WHERE name LIKE "%'.$stringSearchSQL.'%")) OR
WHERE REPLACE(name, "&#x20;", " ") LIKE "%'.$stringSearchSQL.'%")) OR
id_agent_module IN (
SELECT id_agente_modulo
FROM tagente_modulo
WHERE nombre LIKE "%'.$stringSearchSQL.'%") OR
WHERE REPLACE(nombre, "&#x20;", " ") LIKE "%'.$stringSearchSQL.'%") OR
id_agent_module IN (
SELECT id_agente_modulo
FROM tagente_modulo
WHERE id_agente IN (
SELECT id_agente
FROM tagente
WHERE nombre LIKE "%'.$stringSearchSQL.'%" '.$extra_sql.'))
WHERE REPLACE(nombre, "&#x20;", " ") LIKE "%'.$stringSearchSQL.'%" '.$extra_sql.'))
)';
break;
case 'postgresql':
case 'oracle':
$whereAlerts = 'AND (
id_alert_template IN (SELECT id FROM talert_templates WHERE upper(name) LIKE \'%'.strtolower($stringSearchSQL).'%\') OR
id_alert_template IN (SELECT id FROM talert_templates WHERE upper(REPLACE(name, "&#x20;", " ")) LIKE \'%'.strtolower($stringSearchSQL).'%\') OR
id_alert_template IN (
SELECT id
FROM talert_templates
WHERE id_alert_action IN (
SELECT id
FROM talert_actions
WHERE upper(name) LIKE \'%'.strtolower($stringSearchSQL).'%\')) OR
WHERE upper(REPLACE(name, "&#x20;", " ")) LIKE \'%'.strtolower($stringSearchSQL).'%\')) OR
talert_template_modules.id IN (
SELECT id_alert_template_module
FROM talert_template_module_actions
WHERE id_alert_action IN (
SELECT id
FROM talert_actions
WHERE upper(name) LIKE \'%'.strtolower($stringSearchSQL).'%\')) OR
WHERE upper(REPLACE(name, "&#x20;", " ")) LIKE \'%'.strtolower($stringSearchSQL).'%\')) OR
id_agent_module IN (
SELECT id_agente_modulo
FROM tagente_modulo
WHERE upper(nombre) LIKE \'%'.strtolower($stringSearchSQL).'%\') OR
WHERE upper(REPLACE(nombre, "&#x20;", " ")) LIKE \'%'.strtolower($stringSearchSQL).'%\') OR
id_agent_module IN (
SELECT id_agente_modulo
FROM tagente_modulo
WHERE id_agente IN (
SELECT id_agente
FROM tagente
WHERE upper(nombre) LIKE \'%'.strtolower($stringSearchSQL).'%\' '.$extra_sql.'))
WHERE upper(REPLACE(nombre, "&#x20;", " ")) LIKE \'%'.strtolower($stringSearchSQL).'%\' '.$extra_sql.'))
)';
$agents = false;
break;

View File

@ -31,7 +31,7 @@ if ($searchGraphs) {
}
$filter = [];
$filter[] = "(upper(name) LIKE '%".strtolower($stringSearchSQL)."%' OR upper(description) LIKE '%$".strtolower($stringSearchSQL)."%')";
$filter[] = "(upper(REPLACE(name, '&#x20;', ' ')) LIKE '%".strtolower($stringSearchSQL)."%' OR upper(REPLACE(description, '&#x20;', ' ')) LIKE '%$".strtolower($stringSearchSQL)."%')";
$filter['id_graph'] = $usergraphs_id;
$columns = [

View File

@ -62,10 +62,10 @@ $sql = "SELECT DISTINCT taddress_agent.id_agent FROM taddress
$id = db_get_all_rows_sql($sql);
if ($id != '') {
$aux = $id[0]['id_agent'];
$search_sql = " t1.nombre LIKE '".$stringSearchSQL."' OR
t2.nombre LIKE '".$stringSearchSQL."' OR
t1.alias LIKE '".$stringSearchSQL."' OR
t1.comentarios LIKE '".$stringSearchSQL."' OR
$search_sql = " REPLACE(t1.nombre, '&#x20;', ' ') LIKE '".$stringSearchSQL."' OR
REPLACE(t2.nombre, '&#x20;', ' ') LIKE '".$stringSearchSQL."' OR
REPLACE(t1.alias, '&#x20;', ' ') LIKE '".$stringSearchSQL."' OR
REPLACE(t1.comentarios, '&#x20;', ' ') LIKE '".$stringSearchSQL."' OR
t1.id_agente =".$aux;
$idCount = count($id);
@ -77,16 +77,16 @@ if ($id != '') {
}
}
} else {
$search_sql = " t1.nombre LIKE '".$stringSearchSQL."' OR
t2.nombre LIKE '".$stringSearchSQL."' OR
t1.direccion LIKE '".$stringSearchSQL."' OR
t1.comentarios LIKE '".$stringSearchSQL."' OR
t1.alias LIKE '".$stringSearchSQL."'";
$search_sql = " REPLACE(t1.nombre, '&#x20;', ' ') LIKE '".$stringSearchSQL."' OR
REPLACE(t2.nombre, '&#x20;', ' ') LIKE '".$stringSearchSQL."' OR
REPLACE(t1.direccion, '&#x20;', ' ') LIKE '".$stringSearchSQL."' OR
REPLACE(t1.comentarios, '&#x20;', ' ') LIKE '".$stringSearchSQL."' OR
REPLACE(t1.alias, '&#x20;', ' ') LIKE '".$stringSearchSQL."'";
}
if ($has_secondary === true) {
$search_sql .= " OR (tasg.id_group IS NOT NULL AND
tasg.id_group IN (SELECT id_grupo FROM tgrupo WHERE nombre LIKE '".$stringSearchSQL."'))";
tasg.id_group IN (SELECT id_grupo FROM tgrupo WHERE REPLACE(nombre, '&#x20;', ' ') LIKE '".$stringSearchSQL."'))";
}
$sql = "

View File

@ -32,7 +32,7 @@ if ((bool) $searchMaps === true) {
FROM tlayout tl
LEFT JOIN tlayout_data tld
ON tl.id = tld.id_layout
WHERE tl.name LIKE "%%%s%%"
WHERE REPLACE(tl.name, "&#x20;", " ") LIKE "%%%s%%"
AND tl.id_group IN (%s)
GROUP BY tl.id, tl.name, tl.id_group',
$stringSearchSQL,

View File

@ -142,8 +142,8 @@ if ($searchModules) {
)
)
AND
(t1.nombre LIKE "%'.$stringSearchSQL.'%" OR
t3.nombre LIKE "%'.$stringSearchSQL.'%")
(REPLACE(t1.nombre, "&#x20;", " ") LIKE "%'.$stringSearchSQL.'%" OR
REPLACE(t3.nombre, "&#x20;", " ") LIKE "%'.$stringSearchSQL.'%")
AND t1.disabled = 0';
break;
@ -172,8 +172,8 @@ if ($searchModules) {
)
)
) AND
(t1.nombre LIKE \'%'.$stringSearchSQL.'%\' OR
t3.nombre LIKE \'%'.$stringSearchSQL.'%\')';
(REPLACE(t1.nombre, "&#x20;", " ") LIKE \'%'.$stringSearchSQL.'%\' OR
REPLACE(t3.nombre, "&#x20;", " ") LIKE \'%'.$stringSearchSQL.'%\')';
break;
case 'oracle':
@ -201,8 +201,8 @@ if ($searchModules) {
)
)
) AND
(LOWER(t1.nombre) LIKE \'%'.strtolower($stringSearchSQL).'%\' OR
LOWER(t3.nombre) LIKE \'%'.strtolower($stringSearchSQL).'%\')';
(LOWER(REPLACE(t1.nombre, "&#x20;", " ")) LIKE \'%'.strtolower($stringSearchSQL).'%\' OR
LOWER(REPLACE(t3.nombre, "&#x20;", " ")) LIKE \'%'.strtolower($stringSearchSQL).'%\')';
break;
}

View File

@ -207,7 +207,7 @@ if ($searchpolicies === true) {
$sql = "SELECT id, name, description, id_group, status
FROM tpolicies
WHERE name LIKE '$stringSearchSQL'
WHERE REPLACE(name, '&#x20;', ' ') LIKE '$stringSearchSQL'
AND id_group IN ($id_user_groups_str)
";
}

View File

@ -46,13 +46,13 @@ if ($searchReports) {
case 'postgresql':
$sql = "SELECT id_report, name, description
FROM treport
WHERE (name LIKE '%".$stringSearchSQL."%' OR description LIKE '%".$stringSearchSQL."%')".$reports_condition;
WHERE (REPLACE(name, '&#x20;', ' ') LIKE '%".$stringSearchSQL."%' OR REPLACE(description, '&#x20;', ' ') LIKE '%".$stringSearchSQL."%')".$reports_condition;
break;
case 'oracle':
$sql = "SELECT id_report, name, description
FROM treport
WHERE (upper(name) LIKE '%".strtolower($stringSearchSQL)."%' OR description LIKE '%".strtolower($stringSearchSQL)."%')".$reports_condition;
WHERE (upper(REPLACE(name, '&#x20;', ' ') ) LIKE '%".strtolower($stringSearchSQL)."%' OR REPLACE(description, '&#x20;', ' ') LIKE '%".strtolower($stringSearchSQL)."%')".$reports_condition;
break;
}
@ -77,13 +77,13 @@ if ($searchReports) {
case 'postgresql':
$sql_count = "SELECT COUNT(id_report) AS count
FROM treport
WHERE (name LIKE '%".$stringSearchSQL."%' OR description LIKE '%".$stringSearchSQL."%')".$reports_condition;
WHERE (REPLACE(name, '&#x20;', ' ') LIKE '%".$stringSearchSQL."%' OR REPLACE(description, '&#x20;', ' ') LIKE '%".$stringSearchSQL."%')".$reports_condition;
break;
case 'oracle':
$sql_count = "SELECT COUNT(id_report) AS count
FROM treport
WHERE (upper(name) LIKE '%".strtolower($stringSearchSQL)."%' OR upper(description) LIKE '%".strtolower($stringSearchSQL)."%')".$reports_condition;
WHERE (upper(REPLACE(name, '&#x20;', ' ') ) LIKE '%".strtolower($stringSearchSQL)."%' OR upper(REPLACE(description, '&#x20;', ' ') ) LIKE '%".strtolower($stringSearchSQL)."%')".$reports_condition;
break;
}

View File

@ -179,23 +179,23 @@ if ($searchUsers) {
case 'mysql':
case 'postgresql':
$sql = "SELECT id_user, fullname, firstname, lastname, middlename, email, last_connect, is_admin, comments FROM tusuario
WHERE fullname LIKE '%".$stringSearchSQL."%' OR
id_user LIKE '%".$stringSearchSQL."%' OR
firstname LIKE '%".$stringSearchSQL."%' OR
lastname LIKE '%".$stringSearchSQL."%' OR
middlename LIKE '%".$stringSearchSQL."%' OR
email LIKE '%".$stringSearchSQL."%'
WHERE REPLACE(fullname, '&#x20;', ' ') LIKE '%".$stringSearchSQL."%' OR
REPLACE(id_user, '&#x20;', ' ') LIKE '%".$stringSearchSQL."%' OR
REPLACE(firstname, '&#x20;', ' ') LIKE '%".$stringSearchSQL."%' OR
REPLACE(lastname, '&#x20;', ' ') LIKE '%".$stringSearchSQL."%' OR
REPLACE(middlename, '&#x20;', ' ') LIKE '%".$stringSearchSQL."%' OR
REPLACE(email, '&#x20;', ' ') LIKE '%".$stringSearchSQL."%'
ORDER BY ".$order['field'].' '.$order['order'];
break;
case 'oracle':
$sql = "SELECT id_user, fullname, firstname, lastname, middlename, email, last_connect, is_admin, comments FROM tusuario
WHERE upper(fullname) LIKE '%".strtolower($stringSearchSQL)."%' OR
upper(id_user) LIKE '%".strtolower($stringSearchSQL)."%' OR
upper(firstname) LIKE '%".strtolower($stringSearchSQL)."%' OR
upper(lastname) LIKE '%".strtolower($stringSearchSQL)."%' OR
upper(middlename) LIKE '%".strtolower($stringSearchSQL)."%' OR
upper(email) LIKE '%".strtolower($stringSearchSQL)."%'
WHERE upper(REPLACE(fullname, '&#x20;', ' ') ) LIKE '%".strtolower($stringSearchSQL)."%' OR
upper(REPLACE(id_user, '&#x20;', ' ') ) LIKE '%".strtolower($stringSearchSQL)."%' OR
upper(REPLACE(firstname, '&#x20;', ' ') ) LIKE '%".strtolower($stringSearchSQL)."%' OR
upper(REPLACE(lastname, '&#x20;', ' ') ) LIKE '%".strtolower($stringSearchSQL)."%' OR
upper(REPLACE(middlename, '&#x20;', ' ') ) LIKE '%".strtolower($stringSearchSQL)."%' OR
upper(REPLACE(email, '&#x20;', ' ') ) LIKE '%".strtolower($stringSearchSQL)."%'
ORDER BY ".$order['field'].' '.$order['order'];
break;
}

View File

@ -91,7 +91,7 @@ $create_text_file = (bool) get_parameter('create_text_file');
$default_real_directory = realpath($config['homedir'].'/'.$fallback_directory);
if ($upload_file_or_zip === true) {
upload_file($upload_file_or_zip, $default_real_directory, $real_directory);
upload_file($upload_file_or_zip, $default_real_directory, $real_directory, ['mib', 'zip']);
}
if ($create_text_file === true) {

View File

@ -6,7 +6,7 @@
%define debug_package %{nil}
%define name pandorafms_console
%define version 7.0NG.774
%define release 231211
%define release 231213
# User and Group under which Apache is running
%define httpd_name httpd

View File

@ -6,7 +6,7 @@
%define debug_package %{nil}
%define name pandorafms_console
%define version 7.0NG.774
%define release 231211
%define release 231213
# User and Group under which Apache is running
%define httpd_name httpd

View File

@ -3,7 +3,7 @@
#
%define name pandorafms_console
%define version 7.0NG.774
%define release 231211
%define release 231213
%define httpd_name httpd
# User and Group under which Apache is running
%define httpd_name apache2

View File

@ -2730,7 +2730,7 @@ SET @short_name = 'pandorafms.vmware';
SET @name = 'VMware';
SET @section = 'app';
SET @description = 'Monitor&#x20;ESXi&#x20;hosts,&#x20;datastores&#x20;and&#x20;VMs&#x20;from&#x20;a&#x20;specific&#x20;datacenter';
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;

View File

@ -1,5 +1,5 @@
package: pandorafms-server
Version: 7.0NG.774-231211
Version: 7.0NG.774-231213
Architecture: all
Priority: optional
Section: admin

View File

@ -14,7 +14,7 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
pandora_version="7.0NG.774-231211"
pandora_version="7.0NG.774-231213"
package_cpan=0
package_pandora=1

View File

@ -46,7 +46,7 @@ our @EXPORT = qw(
# version: Defines actual version of Pandora Server for this module only
my $pandora_version = "7.0NG.774";
my $pandora_build = "231211";
my $pandora_build = "231213";
our $VERSION = $pandora_version." ".$pandora_build;
# Setup hash

View File

@ -5786,9 +5786,9 @@ sub pandora_inhibit_alerts {
sub pandora_cps_enabled($$) {
my ($agent, $module) = @_;
return 1 if ($agent->{'cps'} > 0);
return 1 if ($agent->{'cps'} >= 0);
return 1 if ($module->{'cps'} > 0);
return 1 if ($module->{'cps'} >= 0);
return 0;
}

View File

@ -34,7 +34,7 @@ our @ISA = qw(Exporter);
# version: Defines actual version of Pandora Server for this module only
my $pandora_version = "7.0NG.774";
my $pandora_build = "231211";
my $pandora_build = "231213";
our $VERSION = $pandora_version." ".$pandora_build;
our %EXPORT_TAGS = ( 'all' => [ qw() ] );

View File

@ -7,7 +7,7 @@
%define debug_package %{nil}
%define name pandorafms_server
%define version 7.0NG.774
%define release 231211
%define release 231213
Summary: Pandora FMS Server
Name: %{name}

View File

@ -4,7 +4,7 @@
%global __os_install_post %{nil}
%define name pandorafms_server
%define version 7.0NG.774
%define release 231211
%define release 231213
Summary: Pandora FMS Server
Name: %{name}

View File

@ -9,7 +9,7 @@
# **********************************************************************
PI_VERSION="7.0NG.774"
PI_BUILD="231211"
PI_BUILD="231213"
MODE=$1
if [ $# -gt 1 ]; then

View File

@ -38,7 +38,7 @@ use PandoraFMS::Config;
use PandoraFMS::DB;
# version: define current version
my $version = "7.0NG.774 Build 231211";
my $version = "7.0NG.774 Build 231213";
# Pandora server configuration
my %conf;

View File

@ -36,7 +36,7 @@ use Encode::Locale;
Encode::Locale::decode_argv;
# version: define current version
my $version = "7.0NG.774 Build 231211";
my $version = "7.0NG.774 Build 231213";
# save program name for logging
my $progname = basename($0);

View File

@ -742,3 +742,7 @@ p {
margin-block-start: 1em;
margin-block-end: 1em;
}
strong {
font-size: inherit;
}