Merge branch 'develop' into 'ent-12857-tickets-vmware-776'

# Conflicts:
#   pandora_console/extras/discovery/DiscoveryApplicationsMigrateCodes.ini
This commit is contained in:
Alejandro Sánchez 2024-02-20 09:22:40 +00:00
commit a24f70ca14
94 changed files with 6439 additions and 2054 deletions

View File

@ -467,7 +467,7 @@ fi
# Script banner at start # Script banner at start
echo " " echo " "
echo "Pandora FMS Agent UNIX Installer $PI_VERSION $PI_BUILD (c) 2008-2015 ArticaST" echo "Pandora FMS Agent UNIX Installer $PI_VERSION $PI_BUILD (c) 2008-2024 PandoraFMS"
echo "This program is licensed under GPL2 Terms. http://pandorafms.com" echo "This program is licensed under GPL2 Terms. http://pandorafms.com"
echo " " echo " "

View File

@ -1,5 +1,5 @@
package: pandorafms-agent-unix package: pandorafms-agent-unix
Version: 7.0NG.775-240212 Version: 7.0NG.775-240220
Architecture: all Architecture: all
Priority: optional Priority: optional
Section: admin Section: admin

View File

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

View File

@ -1039,7 +1039,7 @@ my $Sem = undef;
my $ThreadSem = undef; my $ThreadSem = undef;
use constant AGENT_VERSION => '7.0NG.775'; use constant AGENT_VERSION => '7.0NG.775';
use constant AGENT_BUILD => '240212'; use constant AGENT_BUILD => '240220';
# Agent log default file size maximum and instances # Agent log default file size maximum and instances
use constant DEFAULT_MAX_LOG_SIZE => 600000; use constant DEFAULT_MAX_LOG_SIZE => 600000;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -10,7 +10,7 @@
# ********************************************************************** # **********************************************************************
PI_VERSION="7.0NG.775" PI_VERSION="7.0NG.775"
PI_BUILD="240212" PI_BUILD="240220"
OS_NAME=`uname -s` OS_NAME=`uname -s`
FORCE=0 FORCE=0
@ -579,7 +579,7 @@ fi
# Script banner at start # Script banner at start
echo " " echo " "
echo "Pandora FMS Agent UNIX Installer $PI_VERSION $PI_BUILD (c) 2008-2015 ArticaST" echo "Pandora FMS Agent UNIX Installer $PI_VERSION $PI_BUILD (c) 2008-2024 PandoraFMS"
echo "This program is licensed under GPL2 Terms. http://pandorafms.com" echo "This program is licensed under GPL2 Terms. http://pandorafms.com"
echo " " echo " "

View File

@ -186,7 +186,7 @@ UpgradeApplicationID
{} {}
Version Version
{240212} {240220}
ViewReadme ViewReadme
{Yes} {Yes}

View File

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

View File

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

View File

@ -1,5 +1,5 @@
package: pandorafms-console package: pandorafms-console
Version: 7.0NG.775-240212 Version: 7.0NG.775-240220
Architecture: all Architecture: all
Priority: optional Priority: optional
Section: admin Section: admin

View File

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

View File

@ -394,7 +394,7 @@ function quickShellSettings()
__('Address'), __('Address'),
html_print_input_text( html_print_input_text(
'gotty_addr', 'gotty_addr',
$config['gotty_addr'], ($config['gotty_addr'] ?? ''),
'', '',
30, 30,
100, 100,
@ -443,9 +443,8 @@ function quickShellSettings()
html_print_checkbox_switch( html_print_checkbox_switch(
'gotty_ssh_use_ssl', 'gotty_ssh_use_ssl',
1, 1,
$config['gotty_ssh_use_ssl'], ($config['gotty_ssh_use_ssl'] ?? false),
true, true
$disable_agentaccess
) )
); );
@ -497,7 +496,7 @@ function quickShellSettings()
html_print_checkbox_switch( html_print_checkbox_switch(
'gotty_telnet_use_ssl', 'gotty_telnet_use_ssl',
1, 1,
$config['gotty_telnet_use_ssl'], ($config['gotty_telnet_use_ssl'] ?? false),
true true
) )
); );

View File

@ -1,497 +0,0 @@
<?php
/**
* Resources exportation view.
*
* @category Extensions.
* @package Pandora FMS
* @subpackage Community
* @version 1.0.0
* @license See below
*
* ______ ___ _______ _______ ________
* | __ \.-----.--.--.--| |.-----.----.-----. | ___| | | __|
* | __/| _ | | _ || _ | _| _ | | ___| |__ |
* |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______|
*
* ============================================================================
* Copyright (c) 2005-2023 Pandora FMS
* Please see https://pandorafms.com/community/ for full contribution list
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation for version 2.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* ============================================================================
*/
// Load global vars.
if (isset($_GET['get_ptr'])) {
if ($_GET['get_ptr'] == 1) {
$ownDir = dirname(__FILE__).'/';
$ownDir = str_replace('\\', '/', $ownDir);
// Don't start a session before this import.
// The session is configured and started inside the config process.
include_once $ownDir.'../include/config.php';
// Login check
if (!isset($_SESSION['id_usuario'])) {
$config['id_user'] = null;
} else {
$config['id_user'] = $_SESSION['id_usuario'];
}
if (! check_acl($config['id_user'], 0, 'PM') && ! is_user_admin($config['id_user'])) {
db_pandora_audit(
AUDIT_LOG_ACL_VIOLATION,
'Trying to access Setup Management'
);
include 'general/noaccess.php';
return;
}
$hook_enterprise = enterprise_include('extensions/resource_exportation/functions.php');
header('Content-type: binary');
header('Content-Disposition: attachment; filename="'.get_name_xml_resource($hook_enterprise)).'"';
header('Pragma: no-cache');
header('Expires: 0');
output_xml_resource($hook_enterprise);
}
} else {
extensions_add_godmode_menu_option(__('Resource exportation'), 'PM', 'gagente', '', 'v1r1');
extensions_add_godmode_function('resource_exportation_extension_main');
}
function output_xml_resource($hook_enterprise)
{
global $config;
$type = get_parameter('type');
$id = (int) get_parameter('id');
switch ($type) {
case 'report':
output_xml_report($id);
break;
case 'visual_console':
output_xml_visual_console($id);
break;
default:
if ($hook_enterprise === true) {
$include_agents = get_parameter('include_agents', 0);
return enterprise_output_xml_resource($type, $id, $include_agents);
}
break;
}
}
function output_xml_report($id)
{
global $config;
include_once $config['homedir'].'/include/functions_agents.php';
$report = db_get_row('treport', 'id_report', $id);
echo '<?xml version="1.0" encoding="UTF-8" ?>'."\n";
echo "<report>\n";
echo '<name><![CDATA['.io_safe_output($report['name'])."]]></name>\n";
if (isset($report['description'])) {
echo '<description><![CDATA['.io_safe_output($report['description'])."]]></description>\n";
}
$group = db_get_value('nombre', 'tgrupo', 'id_grupo', $report['id_group']);
echo '<group><![CDATA['.io_safe_output($group)."]]></group>\n";
$items = db_get_all_rows_field_filter(
'treport_content',
'id_report',
$report['id_report']
);
foreach ($items as $item) {
echo "<item>\n";
echo '<type>'.io_safe_output($item['type'])."</type>\n";
echo '<description>'.io_safe_output($item['description'])."</description>\n";
echo '<period>'.io_safe_output($item['period'])."</period>\n";
if ($item['id_agent'] != 0) {
$agent = db_get_value('alias', 'tagente', 'id_agente', $item['id_agent']);
}
if ($item['id_agent_module'] != 0) {
$module = db_get_value('nombre', 'tagente_modulo', 'id_agente_modulo', $item['id_agent_module']);
$id_agent = db_get_value('id_agente', 'tagente_modulo', 'id_agente_modulo', $item['id_agent_module']);
$agent = db_get_value('alias', 'tagente', 'id_agente', $item['id_agent']);
echo '<module><![CDATA['.io_safe_output($module)."]]></module>\n";
}
if (isset($agent)) {
echo '<agent><![CDATA['.$agent."]]></agent>\n";
}
$agent = null;
switch (io_safe_output($item['type'])) {
case 2:
case 'custom_graph':
case 'automatic_custom_graph':
$graph = db_get_value('name', 'tgraph', 'id_graph', $item['id_gs']);
echo '<graph><![CDATA['.io_safe_output($graph)."]]></graph>\n";
break;
case 3:
case 'SLA':
echo '<only_display_wrong>'.$item['only_display_wrong']."</only_display_wrong>\n";
echo '<monday>'.$item['monday']."</monday>\n";
echo '<tuesday>'.$item['tuesday']."</tuesday>\n";
echo '<wednesday>'.$item['wednesday']."</wednesday>\n";
echo '<thursday>'.$item['thursday']."</thursday>\n";
echo '<friday>'.$item['friday']."</friday>\n";
echo '<saturday>'.$item['saturday']."</saturday>\n";
echo '<sunday>'.$item['sunday']."</sunday>\n";
echo '<time_from>'.$item['time_from']."</time_from>\n";
echo '<time_to>'.$item['time_to']."</time_to>\n";
$slas = db_get_all_rows_field_filter('treport_content_sla_combined', 'id_report_content', $item['id_rc']);
if ($slas === false) {
$slas = [];
}
foreach ($slas as $sla) {
$module = db_get_value('nombre', 'tagente_modulo', 'id_agente_modulo', $sla['id_agent_module']);
$id_agent = db_get_value('id_agente', 'tagente_modulo', 'id_agente_modulo', $sla['id_agent_module']);
$agent = db_get_value('alias', 'tagente', 'id_agente', $item['id_agent']);
echo '<sla>';
echo '<agent><![CDATA['.$agent."]]></agent>\n";
echo '<module><![CDATA['.io_safe_output($module)."]]></module>\n";
echo '<sla_max>'.$sla['sla_max']."</sla_max>\n";
echo '<sla_min>'.$sla['sla_min']."</sla_min>\n";
echo '<sla_limit>'.$sla['sla_limit']."</sla_limit>\n";
echo '</sla>';
}
break;
case 'text':
echo '<text><![CDATA['.io_safe_output($item['text'])."]]></text>\n";
break;
case 'sql':
echo '<header_definition><![CDATA['.io_safe_output($item['header_definition'])."]]></header_definition>\n";
if (!empty($item['external_source'])) {
echo '<sql><![CDATA['.io_safe_output($item['external_source'])."]]></sql>\n";
} else {
$sql = db_get_value('sql', 'treport_custom_sql', 'id', $item['treport_custom_sql_id']);
echo '<sql>'.io_safe_output($sql)."</sql>\n";
}
break;
case 'sql_graph_pie':
case 'sql_graph_vbar':
case 'sql_graph_hbar':
echo '<header_definition>'.io_safe_output($item['header_definition'])."</header_definition>\n";
if (!empty($item['external_source'])) {
echo '<sql>'.io_safe_output($item['external_source'])."</sql>\n";
} else {
$sql = db_get_value('sql', 'treport_custom_sql', 'id', $item['treport_custom_sql_id']);
echo '<sql>'.io_safe_output($sql)."</sql>\n";
}
break;
case 'event_report_group':
$group = db_get_value('nombre', 'tgrupo', 'id_grupo', $item['id_agent']);
echo '<group><![CDATA['.io_safe_output($group)."]]></group>\n";
break;
case 'url':
echo '<url><![CDATA['.io_safe_output($values['external_source']).']]></url>';
break;
case 'database_serialized':
echo '<header_definition><![CDATA['.io_safe_output($item['header_definition']).']]></header_definition>';
echo '<line_separator><![CDATA['.io_safe_output($item['line_separator']).']]></line_separator>';
echo '<column_separator><![CDATA['.io_safe_output($item['header_definition']).']]></column_separator>';
break;
case 1:
case 'simple_graph':
case 'simple_baseline_graph':
case 6:
case 'monitor_report':
case 7:
case 'avg_value':
case 8:
case 'max_value':
case 9:
case 'min_value':
case 10:
case 'sumatory':
case 'agent_detailed_event':
case 'event_report_agent':
case 'event_report_module':
case 'alert_report_module':
case 'alert_report_agent':
case 'alert_report_group':
default:
// Do nothing.
break;
}
echo "</item>\n";
}
echo "</report>\n";
}
function output_xml_visual_console($id)
{
$visual_map = db_get_row('tlayout', 'id', $id);
echo '<?xml version="1.0" encoding="UTF-8" ?>'."\n";
echo "<visual_map>\n";
echo '<name><![CDATA['.io_safe_output($visual_map['name'])."]]></name>\n";
if ($visual_map['id_group'] != 0) {
$group = db_get_value('nombre', 'tgrupo', 'id_grupo', $visual_map['id_group']);
echo '<group><![CDATA['.io_safe_output($group)."]]></group>\n";
}
echo '<background><![CDATA['.io_safe_output($visual_map['background'])."]]></background>\n";
echo '<height>'.io_safe_output($visual_map['height'])."</height>\n";
echo '<width>'.io_safe_output($visual_map['width'])."</width>\n";
$items = db_get_all_rows_field_filter('tlayout_data', 'id_layout', $visual_map['id']);
if ($items === false) {
$items = [];
}
foreach ($items as $item) {
echo "<item>\n";
echo '<other_id>'.$item['id']."</other_id>\n";
// OLD ID USE FOR parent item
$agent = '';
if ($item['id_agent'] != 0) {
$agent = db_get_value('nombre', 'tagente', 'id_agente', $item['id_agent']);
}
if (!empty($item['label'])) {
echo '<label><![CDATA['.io_safe_output($item['label'])."]]></label>\n";
}
echo '<x>'.$item['pos_x']."</x>\n";
echo '<y>'.$item['pos_y']."</y>\n";
echo '<type>'.$item['type']."</type>\n";
if ($item['width'] != 0) {
echo '<width>'.$item['width']."</width>\n";
}
if ($item['height'] != 0) {
echo '<height>'.$item['height']."</height>\n";
}
if (!empty($item['image'])) {
echo '<image>'.$item['image']."</image>\n";
}
if ($item['period'] != 0) {
echo '<period>'.$item['period']."</period>\n";
}
if (isset($item['id_agente_modulo'])) {
if ($item['id_agente_modulo'] != 0) {
$module = db_get_value('nombre', 'tagente_modulo', 'id_agente_modulo', $item['id_agente_modulo']);
$id_agent = db_get_value('id_agente', 'tagente_modulo', 'id_agente_modulo', $item['id_agente_modulo']);
$agent = db_get_value('nombre', 'tagente', 'id_agente', $id_agent);
echo '<module><![CDATA['.io_safe_output($module)."]]></module>\n";
}
}
if (!empty($agent)) {
echo '<agent><![CDATA['.$agent."]]></agent>\n";
}
if ($item['id_layout_linked'] != 0) {
echo '<id_layout_linked>'.$item['id_layout_linked']."</id_layout_linked>\n";
}
if ($item['parent_item'] != 0) {
echo '<parent_item>'.$item['parent_item']."</parent_item>\n";
}
if (!empty($item['clock_animation'])) {
echo '<clock_animation>'.$item['clock_animation']."</clock_animation>\n";
}
if (!empty($item['fill_color'])) {
echo '<fill_color>'.$item['fill_color']."</fill_color>\n";
}
if (!empty($item['type_graph'])) {
echo '<type_graph>'.$item['type_graph']."</type_graph>\n";
}
if (!empty($item['time_format'])) {
echo '<time_format>'.$item['time_format']."</time_format>\n";
}
if (!empty($item['timezone'])) {
echo '<timezone>'.$item['timezone']."</timezone>\n";
}
if (!empty($item['border_width'])) {
echo '<border_width>'.$item['border_width']."</border_width>\n";
}
if (!empty($item['border_color'])) {
echo '<border_color>'.$item['border_color']."</border_color>\n";
}
echo "</item>\n";
}
echo "</visual_map>\n";
}
function get_name_xml_resource($hook_enterprise)
{
global $config;
$type = get_parameter('type');
$id = (int) get_parameter('id');
switch ($type) {
case 'report':
$name = db_get_value('name', 'treport', 'id_report', $id);
break;
case 'visual_console':
$name = db_get_value('name', 'tlayout', 'id', $id);
break;
default:
if ($hook_enterprise === true) {
return enterprise_get_name_xml_resource($type, $id);
}
break;
}
$file = io_safe_output($name).'.ptr';
return $file;
}
function get_xml_resource()
{
global $config;
$hook_enterprise = enterprise_include('extensions/resource_exportation/functions.php');
}
function resource_exportation_extension_main()
{
global $config;
check_login();
if (! check_acl($config['id_user'], 0, 'PM') && ! is_user_admin($config['id_user'])) {
db_pandora_audit(
AUDIT_LOG_ACL_VIOLATION,
'Trying to access Setup Management'
);
include 'general/noaccess.php';
return;
}
$hook_enterprise = enterprise_include('extensions/resource_exportation/functions.php');
ui_print_standard_header(
__('Resource exportation'),
'images/extensions.png',
false,
'',
true,
[],
[
[
'link' => '',
'label' => __('Resources'),
],
[
'link' => '',
'label' => __('Resource exporting'),
],
]
);
ui_print_warning_message(
__('This extension makes exportation of resource template more easy.').'<br>'.__('You can export resource templates in .ptr format.')
);
$table = new stdClass();
$table->class = 'databox filter-table-adv';
$table->id = 'resource_exportation_table';
$table->style = [];
$table->style[0] = 'width: 30%';
$table->style[1] = 'vertical-align: bottom;';
$table->data = [];
$table->data[0][] = html_print_label_input_block(
__('Report'),
html_print_div(
[
'class' => 'flex-content-left',
'content' => html_print_select_from_sql('SELECT id_report, name FROM treport', 'report', '', '', '', 0, true),
],
true
)
);
$table->data[0][] = html_print_button(__('Export'), '', false, 'export_to_ptr("report");', '', true);
$table->data[1][] = html_print_label_input_block(
__('Visual console'),
html_print_div(
[
'class' => 'flex-content-left',
'content' => html_print_select_from_sql('SELECT id, name FROM tlayout', 'visual_console', '', '', '', 0, true),
],
true
)
);
$table->data[1][] = html_print_button(__('Export'), '', false, 'export_to_ptr("visual_console");', '', true);
if ($hook_enterprise === true) {
add_rows_for_enterprise($table->data);
}
html_print_table($table);
?>
<script type="text/javascript">
function export_to_ptr(type) {
id = $("select#" + type + " option:selected").val();
url = location.href.split('index');
if (type == "policy") {
var include_agents = $("#checkbox-export_agents").prop("checked")
url = url[0] + 'extensions/resource_exportation.php?get_ptr=1&type=' + type
+ '&id=' + id + '&include_agents=' + include_agents;
}
else {
url = url[0] + 'extensions/resource_exportation.php?get_ptr=1&type=' + type
+ '&id=' + id;
}
location.href=url;
}
</script>
<?php
}

File diff suppressed because it is too large Load Diff

View File

@ -1736,3 +1736,5 @@ extensions/files_repo/sql/files_repo.oracle.sql
extensions/files_repo/sql/files_repo.postgreSQL.sql extensions/files_repo/sql/files_repo.postgreSQL.sql
extensions/files_repo/sql/files_repo.sql extensions/files_repo/sql/files_repo.sql
extensions/files_repo extensions/files_repo
extensions/resource_exportation.php
extensions/resource_registration.php

View File

@ -1,5 +1,7 @@
pandorafms.vmware=6aa8d44c42d81ba2ddf1c52f6cf36a0b pandorafms.vmware=6aa8d44c42d81ba2ddf1c52f6cf36a0b
pandorafms.mysql=fadb4750d18285c0eca34f47c6aa3cfe pandorafms.mysql=fadb4750d18285c0eca34f47c6aa3cfe
pandorafms.vmware=248788e0fb2cd4e11623e4a52ee7d05b
pandorafms.mysql=ca7dd8b80a1a03a25eb0fb077818ad63
pandorafms.mssql=1cc215409741d19080269ffba112810e pandorafms.mssql=1cc215409741d19080269ffba112810e
pandorafms.oracle=abdfd7280f76276f696115cabdac731e pandorafms.oracle=abdfd7280f76276f696115cabdac731e
pandorafms.db2=122f2abff0ec1d668c35ee0911483021 pandorafms.db2=122f2abff0ec1d668c35ee0911483021

View File

@ -63,9 +63,43 @@ UPDATE `tncm_agent_data_template` SET `vendors` = CONCAT('["', TRIM(BOTH '"' FRO
-- Update version for plugin oracle -- Update version for plugin oracle
UPDATE `tdiscovery_apps` SET `version` = '1.2' WHERE `short_name` = 'pandorafms.oracle'; UPDATE `tdiscovery_apps` SET `version` = '1.2' WHERE `short_name` = 'pandorafms.oracle';
-- Update version for plugin mysql
UPDATE `tdiscovery_apps` SET `version` = '1.1' WHERE `short_name` = 'pandorafms.mysql';
SET @widget_id = NULL; SET @widget_id = NULL;
SELECT @widget_id := `id` FROM `twidget` WHERE `unique_name` = 'GisMap'; SELECT @widget_id := `id` FROM `twidget` WHERE `unique_name` = 'GisMap';
INSERT IGNORE INTO `twidget` (`id`,`class_name`,`unique_name`,`description`,`options`,`page`) VALUES (@widget_id,'GisMap','GisMap','Gis map','','GisMap.php'); INSERT IGNORE INTO `twidget` (`id`,`class_name`,`unique_name`,`description`,`options`,`page`) VALUES (@widget_id,'GisMap','GisMap','Gis map','','GisMap.php');
SET @class_name = 'ITSMIncidences';
SET @unique_name = 'ITSMIncidences';
SET @description = 'Pandora ITSM tickets';
SET @page = 'ITSMIncidences.php';
SET @widget_id = NULL;
SELECT @widget_id := `id` FROM `twidget` WHERE `unique_name` = @unique_name;
INSERT IGNORE INTO `twidget` (`id`,`class_name`,`unique_name`,`description`,`options`,`page`) VALUES (@widget_id,@class_name,@unique_name,@description,'',@page);
-- Create SNMPv3 credentials for recon tasks and update them
SET @creds_name = 'Recon-SNMP-creds-';
INSERT IGNORE INTO `tcredential_store` (`identifier`, `id_group`, `product`, `extra_1`)
SELECT
CONCAT(@creds_name,`id_rt`) AS `identifier`,
`id_group`,
'SNMP' AS `product`,
CONCAT(
'{',
'"community":"',`snmp_community`,'",',
'"version":"',`snmp_version`,'",',
'"securityLevelV3":"',`snmp_security_level`,'",',
'"authUserV3":"',`snmp_auth_user`,'",',
'"authMethodV3":"',`snmp_auth_method`,'",',
'"authPassV3":"',`snmp_auth_pass`,'",',
'"privacyMethodV3":"',`snmp_privacy_method`,'",',
'"privacyPassV3":"',`snmp_privacy_pass`,'"',
'}'
) AS `extra1`
FROM `trecon_task` WHERE `snmp_version` = 3 AND `snmp_enabled` = 1
;
UPDATE `trecon_task` SET `auth_strings` = IF(`auth_strings` = '',CONCAT(@creds_name,`id_rt`),CONCAT(@creds_name,`id_rt`,',',`auth_strings`)) WHERE `snmp_version` = 3 AND `snmp_enabled` = 1;
COMMIT; COMMIT;

View File

@ -54,7 +54,7 @@ echo sprintf('<div id="header_table" class="header_table_%s">', $menuTypeClass);
// ======= Servers List =============================================== // ======= Servers List ===============================================
if ((bool) check_acl($config['id_user'], 0, 'AW') !== false) { if ((bool) check_acl($config['id_user'], 0, 'AW') !== false) {
$servers = []; $servers = [];
$servers['all'] = (int) db_get_value('COUNT(id_server)', 'tserver'); $servers['all'] = (int) count((servers_get_info() ?? []));
if ($servers['all'] != 0) { if ($servers['all'] != 0) {
$servers['up'] = (int) servers_check_status(); $servers['up'] = (int) servers_check_status();
$servers['down'] = ($servers['all'] - $servers['up']); $servers['down'] = ($servers['all'] - $servers['up']);

View File

@ -357,7 +357,18 @@ if ($new_agent === false) {
$tableAgent->data['caption_name'][0] = __('Agent name'); $tableAgent->data['caption_name'][0] = __('Agent name');
$tableAgent->rowclass['name'] = 'w540px'; $tableAgent->rowclass['name'] = 'w540px';
$tableAgent->cellstyle['name'][0] = 'width: 100%;'; $tableAgent->cellstyle['name'][0] = 'width: 100%;';
$tableAgent->data['name'][0] = html_print_input_text('agente', $nombre_agente, '', 76, 100, true, false, false, '', 'w100p'); $tableAgent->data['name'][0] = html_print_input_text(
'agente',
$nombre_agente,
'',
76,
100,
true,
true,
false,
'',
'w100p'
);
$tableAgent->data['name'][0] .= html_print_div( $tableAgent->data['name'][0] .= html_print_div(
[ [
'class' => 'moduleIdBox', 'class' => 'moduleIdBox',
@ -365,6 +376,29 @@ if ($new_agent === false) {
], ],
true true
); );
// Other than Linux, Solaris, AIX, BSD, HPUX, MacOs, and Windows.
if ($id_os !== LINUX && $id_os !== SOLARIS && $id_os !== AIX
&& $id_os !== BSD && $id_os !== HPUX && $id_os !== MACOS
&& $id_os !== WINDOWS
) {
$tableAgent->data['name'][0] .= html_print_anchor(
[
'content' => html_print_image(
'images/edit.svg',
true,
[
'border' => 0,
'title' => __('Edit agent name'),
'class' => 'main_menu_icon invert_filter after_input_icon forced_title clickable',
'onclick' => 'editAgent()',
]
),
],
true
);
}
// Agent options for QR code. // Agent options for QR code.
$agent_options_update = 'agent_options_update'; $agent_options_update = 'agent_options_update';
} }
@ -674,6 +708,19 @@ if (enterprise_installed()) {
} }
} }
if ($id_os === '1') {
$modules = $agent_plugin->getModules();
foreach ($modules as $key => $row) {
if (preg_match('/Syslog/', $row['raw']) === 1) {
if ($row['disabled'] === 1) {
$enable_log_collector = 0;
} else {
$enable_log_collector = 1;
}
}
}
}
if ($id_os === '9') { if ($id_os === '9') {
$modules = $agent_plugin->getModules(); $modules = $agent_plugin->getModules();
foreach ($modules as $key => $row) { foreach ($modules as $key => $row) {
@ -1478,7 +1525,6 @@ ui_require_jquery_file('bgiframe');
128 128
); );
} }
$("#text-agente").prop('readonly', true);
$("#text-direccion").on('change',function(e){ $("#text-direccion").on('change',function(e){
@ -1525,6 +1571,39 @@ ui_require_jquery_file('bgiframe');
} }
} }
function editAgent() {
$(`#text-agente`).attr(`readonly`, false);
const title = '<?php echo __('Warning'); ?>';
const text = '<?php echo __('Change the internal name of the agent may cause duplicity and malfunction'); ?>';
const id = uniqId();
$("body").append('<div title="' + title + '" id="' + id + '"></div>');
$("#" + id).empty();
$("#" + id).append(text);
$("#" + id).dialog({
height: 150,
width: 528,
opacity: 1,
modal: true,
position: {
my: "center",
at: "center",
of: window,
collision: "fit"
},
title: title,
closeOnEscape: true,
buttons: [{
text: "OK",
click: function() {
$(this).dialog("close");
}
}],
open: function(event, ui) {
$(".ui-dialog-titlebar-close").hide();
},
}).show();
}
function check_unique_ip() { function check_unique_ip() {
const direccion = $('#text-direccion').val(); const direccion = $('#text-direccion').val();

View File

@ -949,6 +949,13 @@ if ($update_agent) {
$mssg_warning = 0; $mssg_warning = 0;
$id_agente = (int) get_parameter_post('id_agente'); $id_agente = (int) get_parameter_post('id_agente');
$nombre_agente = str_replace('`', '&lsquo;', (string) get_parameter_post('agente', '')); $nombre_agente = str_replace('`', '&lsquo;', (string) get_parameter_post('agente', ''));
$repeated_name = db_get_row_sql(
sprintf(
'SELECT nombre FROM tagente WHERE id_agente <> %s AND nombre like "%s"',
$id_agente,
$nombre_agente
)
);
$alias_safe_output = strip_tags(io_safe_output(get_parameter('alias', ''))); $alias_safe_output = strip_tags(io_safe_output(get_parameter('alias', '')));
$alias = io_safe_input(trim(preg_replace('/[\/\\\|%#&$]/', '', $alias_safe_output))); $alias = io_safe_input(trim(preg_replace('/[\/\\\|%#&$]/', '', $alias_safe_output)));
$alias_as_name = (int) get_parameter_post('alias_as_name', 0); $alias_as_name = (int) get_parameter_post('alias_as_name', 0);
@ -1077,14 +1084,17 @@ if ($update_agent) {
} }
} }
// Verify if there is another agent with the same name but different ID.
if (empty($repeated_name) === false) {
ui_print_error_message(__('Agent with repeated name'));
}
if ($mssg_warning) { if ($mssg_warning) {
ui_print_warning_message(__('The ip or dns name entered cannot be resolved')); ui_print_warning_message(__('The ip or dns name entered cannot be resolved'));
} }
// Verify if there is another agent with the same name but different ID.
if ($alias == '') { if ($alias == '') {
ui_print_error_message(__('No agent alias specified')); ui_print_error_message(__('No agent alias specified'));
// If there is an agent with the same name, but a different ID.
} }
$old_group = agents_get_agent_group($id_agente); $old_group = agents_get_agent_group($id_agente);
@ -1139,13 +1149,16 @@ if ($update_agent) {
'ignore_unknown' => $ignore_unknown, 'ignore_unknown' => $ignore_unknown,
]; ];
if (empty($repeated_name) === true) {
$values['nombre'] = $nombre_agente;
}
if ($config['metaconsole_agent_cache'] == 1) { if ($config['metaconsole_agent_cache'] == 1) {
$values['update_module_count'] = 1; $values['update_module_count'] = 1;
// Force an update of the agent cache. // Force an update of the agent cache.
} }
$result = db_process_sql_update('tagente', $values, ['id_agente' => $id_agente]); $result = (bool) db_process_sql_update('tagente', $values, ['id_agente' => $id_agente]);
if ($result === false && $update_custom_result == false) { if ($result === false && $update_custom_result == false) {
ui_print_error_message( ui_print_error_message(
__('There was a problem updating the agent') __('There was a problem updating the agent')
@ -1299,8 +1312,11 @@ if ($update_agent) {
} }
$modules = $agent->getModules(); $modules = $agent->getModules();
foreach ($modules as $key => $row) { foreach ($modules as $key => $row) {
if (preg_match('/PandoraAgent_log/', $row['raw']) === 1) { if (preg_match('/PandoraAgent_log/', $row['raw']) === 1
|| ($id_os === 1 && preg_match('/Syslog/', $row['raw']) === 1)
) {
if ($enable_log_collector === 1) { if ($enable_log_collector === 1) {
if ($row['disabled'] === 1) { if ($row['disabled'] === 1) {
$agent->enableModule($row['module_name'], $row); $agent->enableModule($row['module_name'], $row);

View File

@ -697,7 +697,7 @@ if ($agents !== false) {
$tableAgents->head = []; $tableAgents->head = [];
$tableAgents->data = []; $tableAgents->data = [];
// Header. // Header.
$tableAgents->head[0] = '<span>'.__('Agent name').'</span>'; $tableAgents->head[0] = '<span>'.__('Agent alias').'</span>';
$tableAgents->head[0] .= ui_get_sorting_arrows($url_up_agente, $url_down_agente, $selectNameUp, $selectNameDown); $tableAgents->head[0] .= ui_get_sorting_arrows($url_up_agente, $url_down_agente, $selectNameUp, $selectNameDown);
$tableAgents->head[1] = '<span title=\''.__('Remote agent configuration').'\'>'.__('R').'</span>'; $tableAgents->head[1] = '<span title=\''.__('Remote agent configuration').'\'>'.__('R').'</span>';
$tableAgents->head[1] .= ui_get_sorting_arrows($url_up_remote, $url_down_remote, $selectRemoteUp, $selectRemoteDown); $tableAgents->head[1] .= ui_get_sorting_arrows($url_up_remote, $url_down_remote, $selectRemoteUp, $selectRemoteDown);

View File

@ -560,13 +560,13 @@ if ($is_management_allowed === true && $update_group === true) {
} }
} }
$id_group = (int) get_parameter('id_group');
// Delete group. // Delete group.
if ($is_management_allowed === true if ($is_management_allowed === true
&& $delete_group === true && $delete_group === true
&& ((bool) check_acl($config['id_user'], 0, 'PM') === true) && ((bool) check_acl($config['id_user'], $id_group, 'PM') === true)
) { ) {
$id_group = (int) get_parameter('id_group');
$usedGroup = groups_check_used($id_group); $usedGroup = groups_check_used($id_group);
if (!$usedGroup['return']) { if (!$usedGroup['return']) {
@ -880,6 +880,28 @@ if ($tab == 'tree') {
echo "<div id='tree-controller-recipient'></div>"; echo "<div id='tree-controller-recipient'></div>";
if (users_can_manage_group_all('AR') === false) {
$user_groups_acl = users_get_groups(false, 'AR');
$groups_acl = implode('","', $user_groups_acl);
if (empty($groups_acl) === true) {
$is_management_allowed = false;
}
}
html_print_div(
[
'content' => ui_print_info_message(
[
'no_close' => true,
'message' => __('There are no defined groups'),
],
'',
true
),
'class' => 'invisible',
'id' => 'message-tree-info',
]
);
} else { } else {
/* /*
* Group list view. * Group list view.
@ -1246,7 +1268,7 @@ $tab = 'group_edition';
treeController.init({ treeController.init({
recipient: $("div#tree-controller-recipient"), recipient: $("div#tree-controller-recipient"),
page: parameters['page'], page: parameters['page'],
emptyMessage: "<?php echo __('No data found'); ?>", emptyMessage: $("#message-tree-info").html(),
foundMessage: "<?php echo __('Found groups'); ?>", foundMessage: "<?php echo __('Found groups'); ?>",
tree: data.tree, tree: data.tree,
baseURL: "<?php echo ui_get_full_url(false, false, false, is_metaconsole()); ?>", baseURL: "<?php echo ui_get_full_url(false, false, false, is_metaconsole()); ?>",

View File

@ -208,6 +208,9 @@ if ($access_console_node === true) {
$sub['godmode/setup/os']['text'] = __('Operating systems'); $sub['godmode/setup/os']['text'] = __('Operating systems');
$sub['godmode/setup/os']['id'] = 'edit_OS'; $sub['godmode/setup/os']['id'] = 'edit_OS';
$sub['godmode/resources/resources_export_import']['text'] = __('Resources export/import');
$sub['godmode/resources/resources_export_import']['id'] = 'resources_export_import';
} }
if ((bool) check_acl($config['id_user'], 0, 'AW') === true) { if ((bool) check_acl($config['id_user'], 0, 'AW') === true) {

View File

@ -5941,6 +5941,7 @@ ui_require_javascript_file('pandora');
?> ?>
<script type="text/javascript"> <script type="text/javascript">
const ACTION = '<?php echo $actionParameter; ?>';
$(document).ready (function () { $(document).ready (function () {
chooseType(); chooseType();
chooseSQLquery(); chooseSQLquery();
@ -7601,6 +7602,12 @@ function chooseType() {
$("#row_ncm_group").hide(); $("#row_ncm_group").hide();
$("#row_ncm_agent").hide(); $("#row_ncm_agent").hide();
if (ACTION !== 'update') {
// Set default period value, this value will be change for each report.
period_set_value($("#hidden-period").attr('class'), 300);
$("#row_period").find('select').val('300').trigger('change');
}
switch (type) { switch (type) {
case 'event_report_group': case 'event_report_group':
$("#row_description").show(); $("#row_description").show();
@ -7763,8 +7770,10 @@ function chooseType() {
$("#row_agent").show(); $("#row_agent").show();
$("#row_module").show(); $("#row_module").show();
$("#row_historical_db_check").hide(); $("#row_historical_db_check").hide();
period_set_value($("#hidden-period").attr('class'), 3600); if (ACTION !== 'update') {
$("#row_period").find('select').val('3600').trigger('change'); period_set_value($("#hidden-period").attr('class'), 3600);
$("#row_period").find('select').val('3600').trigger('change');
}
break; break;
case 'SLA_monthly': case 'SLA_monthly':

View File

@ -0,0 +1,404 @@
<?php
/**
* Server list view.
*
* @category Server
* @package Pandora FMS
* @subpackage Community
* @version 1.0.0
* @license See below
*
* ______ ___ _______ _______ ________
* | __ \.-----.--.--.--| |.-----.----.-----. | ___| | | __|
* | __/| _ | | _ || _ | _| _ | | ___| |__ |
* |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______|
*
* ============================================================================
* Copyright (c) 2005-2024 Pandora FMS
* Please see https://pandorafms.com/community/ for full contribution list
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation for version 2.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* ============================================================================
*/
// Load global vars.
global $config;
check_login();
if (check_acl($config['id_user'], 0, 'PM') === false) {
db_pandora_audit(
AUDIT_LOG_ACL_VIOLATION,
'Trying to access resources exportation and importation'
);
include 'general/noaccess.php';
exit;
}
require_once $config['homedir'].'/include/class/Prd.class.php';
// Instance of the prd class.
$prd = new Prd();
$msg = '';
if (isset($_FILES['resource_import']) === true) {
if (empty($_FILES['resource_import']['tmp_name']) === false) {
$data = parse_ini_file($_FILES['resource_import']['tmp_name'], true);
if ($data !== false) {
if (isset($data['prd_data']['name']) === true
&& isset($data['prd_data']['type']) === true
) {
$name = $data['prd_data']['name'];
$type = $data['prd_data']['type'];
}
$msg = $prd->importPrd($data);
} else {
$msg = [
'status' => false,
'items' => [],
'errors' => ['Unexpected error: Unable to parse PRD file.'],
];
}
} else {
$msg = [
'status' => false,
'items' => [],
'errors' => ['No files have selected'],
];
}
}
$msg = json_encode($msg);
echo '<div class="div-import-export">';
// Import section.
$label_import = html_print_label(
__('Import resources to').' '.get_product_name(),
'label_import',
true,
['style' => 'font-size: 13px; line-height: 16px'],
);
$div_label_import = html_print_div(
[
'style' => 'padding-bottom: 20px;',
'content' => $label_import,
],
true
);
$input_file = '<input class="input-file-style" style="padding-top: 1px; width: 100%;" type="file" value name="resource_import" id="file-resource_import" >';
$div_input_file = html_print_div(
[
'style' => 'padding-top: 20px;display: flex; justify-content: left;width:100%; height: 60px;',
'content' => $input_file,
],
true
);
$button_import = html_print_submit_button(
__('Import'),
'upload',
false,
[
'icon' => 'import',
'class' => 'disabled',
'disabled' => '',
],
true
);
$div_button_import = html_print_div(
[
'style' => 'padding-bottom: 20px',
'content' => $button_import,
],
true
);
$div_import = html_print_div(
[
'style' => 'width: 80%',
'content' => $div_label_import.$div_input_file.$div_button_import,
],
true
);
$img_import = html_print_image(
'images/import_to.svg',
true,
[
'border' => '0',
'width' => '100%',
]
);
$div_img_import = html_print_div(
[
'style' => 'margin-left: 40px; margin-right: 20px',
'content' => $img_import,
],
true
);
echo '<form class="form-import" name="submit_import" method="POST" enctype="multipart/form-data">';
echo html_print_div(
[
'class' => 'div-import',
'content' => $div_import.$div_img_import,
],
true
);
echo '</form>';
// Export section.
$label_export = html_print_label(
__('Export resources from').' '.get_product_name(),
'label_export',
true,
['style' => 'font-size: 13px; line-height: 16px'],
);
$div_label_export = html_print_div(
[
'style' => 'padding-bottom: 20px',
'content' => $label_export,
],
true
);
$export_type = $prd->getTypesPrd();
$select_export_type = html_print_label_input_block(
__('Export type'),
html_print_select(
$export_type,
'export_type',
'',
'',
__('None'),
0,
true,
false,
true,
'w90p'
),
['div_style' => 'display: flex; flex-direction: column; width: 50%'],
);
$div_select_export = html_print_div(
[
'id' => 'div_select_export',
'style' => 'padding-bottom: 20px;display: flex; flex-direction: row; height: 60px',
'content' => $select_export_type,
],
true
);
$button_export = html_print_button(
__('Export'),
'export_button',
false,
'',
[
'class' => 'flex_justify disabled',
'icon' => 'export',
'disabled' => '',
],
true
);
$div_button_export = html_print_div(
[
'style' => '',
'content' => $button_export,
],
true
);
$div_export = html_print_div(
[
'style' => 'padding-bottom: 20px; width: 80%',
'content' => $div_label_export.$div_select_export.$div_button_export,
],
true
);
$img_export = html_print_image(
'images/export_to.svg',
true,
[
'border' => '0',
'width' => '100%',
]
);
$div_img_export = html_print_div(
[
'style' => 'margin-left: 40px; margin-right: 20px',
'content' => $img_export,
],
true
);
echo html_print_div(
[
'class' => 'div-export',
'content' => $div_export.$div_img_export,
],
true
);
echo '</div>';
?>
<script type="text/javascript">
let msg = <?php echo $msg; ?>;
if (typeof msg === 'object' && Object.keys(msg).length > 0) {
let title = "";
let message = "";
if (msg.status === true) {
title = "<?php echo __('Importation successfully completed'); ?>";
message = "<?php echo __('PRD import successfull:'); ?>";
const name = "<?php echo $name; ?>";
const type = "<?php echo $type; ?>";
message += ` ${type} - ${name}`;
} else {
title = "<?php echo __('Import failure'); ?>";
Object.entries(msg.errors).forEach(([key, value]) => {
message += value + "<br>";
});
}
if (typeof msg.info === 'object' && Object.keys(msg.info).length > 0) {
message += "<br><br>";
Object.entries(msg.info).forEach(([key, value]) => {
message += value + "<br>";
});
}
confirmDialog({
title: title,
message: message,
hideCancelButton: true
},
"ResultDialog"
);
}
$('input[type="file"]').change(function() {
console.log($(this).val());
if ($(this).val() === '') {
$("#button-upload").addClass("disabled");
$('#button-upload').prop('disabled', true);
} else {
$("#button-upload").removeClass("disabled");
$('#button-upload').prop('disabled', false);
}
});
$("#export_type").change(function(e) {
if ($(this).val() === '0') {
$("#resource_type").remove();
$("#button-export_button").addClass("disabled");
$('#button-export_button').prop('disabled', true);
} else {
$.ajax({
type: "GET",
url: "ajax.php",
dataType: "html",
data: {
page: 'include/ajax/resources.ajax',
getResource: 1,
type: $(this).val(),
},
success: function(data) {
$("#resource_type").remove();
$("#div_select_export").append(`${data}`);
$('#select_value').select2();
$("#button-export_button").removeClass("disabled");
$('#button-export_button').prop('disabled', false);
},
error: function(data) {
console.error("Fatal error in AJAX call to interpreter order", data)
}
});
}
});
$("#button-export_button").click(function(e) {
const value = $("#select_value").val();
if (value !== '0') {
//Show dialog.
confirmDialog({
title: "<?php echo __('Exporting resource'); ?>",
message: "<?php echo __('Exporting resource and downloading, please wait'); ?>",
hideCancelButton: true
},
"downloadDialog"
);
const filename = '<?php echo uniqid().'.prd'; ?>';
$.ajax({
type: "GET",
url: "ajax.php",
dataType: 'json',
data: {
page: 'include/ajax/resources.ajax',
exportPrd: 1,
type: $("#export_type").val(),
value: value,
name: $("#select_value option:selected").text(),
filename: filename
},
success: function(data) {
if (data.error === -1 || data.error === -2) {
console.error("Failed to create file");
$("#confirm_downloadDialog").dialog("close");
} else {
let a = document.createElement('a');
const url = '<?php echo $config['homeurl'].'/attachment/'; ?>' + filename;
a.href = url;
a.download = data.name_download;
a.click();
setTimeout(() => {
$.ajax({
type: "DELETE",
url: "ajax.php",
data: {
page: 'include/ajax/resources.ajax',
deleteFile: 1,
filename: filename,
},
});
$("#confirm_downloadDialog").dialog("close");
}, 3000);
}
},
error: function(data) {
console.error("Fatal error in AJAX call to interpreter order", data);
$.ajax({
type: "DELETE",
url: "ajax.php",
data: {
page: 'include/ajax/resources.ajax',
deleteFile: 1,
filename: filename,
},
});
$("#confirm_downloadDialog").dialog("close");
}
});
}
});
</script>

View File

@ -1425,7 +1425,7 @@ class DiscoveryTaskList extends HTML
$table = new StdClasS(); $table = new StdClasS();
$table->class = 'databox data'; $table->class = 'databox data';
$table->width = '75%'; $table->width = '75%';
$table->styleTable = 'margin: 2em auto 0;border: 1px solid #ddd;background: white;'; $table->styleTable = 'margin: 2em auto 0;border: 1px solid #ddd;background: white; overflow-wrap: anywhere';
$table->rowid = []; $table->rowid = [];
$table->data = []; $table->data = [];
@ -1433,7 +1433,7 @@ class DiscoveryTaskList extends HTML
$tableErrors = new StdClasS(); $tableErrors = new StdClasS();
$tableErrors->class = 'databox data'; $tableErrors->class = 'databox data';
$tableErrors->width = '75%'; $tableErrors->width = '75%';
$tableErrors->styleTable = 'margin: 2em auto 0;border: 1px solid #ddd;background: white;'; $tableErrors->styleTable = 'margin: 2em auto 0;border: 1px solid #ddd;background: white; overflow-wrap: anywhere';
$tableErrors->rowid = []; $tableErrors->rowid = [];
$tableErrors->data = []; $tableErrors->data = [];

View File

@ -450,6 +450,35 @@ class HostDevices extends Wizard
if (isset($this->task['id_rt']) === false) { if (isset($this->task['id_rt']) === false) {
// Create. // Create.
$default_templates = [
io_safe_input('Linux System'),
io_safe_input('Windows System'),
io_safe_input('Windows Hardware'),
io_safe_input('Network Management'),
];
$default_templates_ids = db_get_all_rows_sql(
'SELECT id_np
FROM tnetwork_profile
WHERE name IN ('.implode(
',',
array_map(
function ($template) {
return "'".$template."'";
},
$default_templates
)
).')
ORDER BY name'
);
if ($default_templates_ids !== false) {
$this->task['id_network_profile'] = implode(
',',
array_column($default_templates_ids, 'id_np'),
);
}
$this->task['id_rt'] = db_process_sql_insert( $this->task['id_rt'] = db_process_sql_insert(
'trecon_task', 'trecon_task',
$this->task $this->task
@ -1100,12 +1129,9 @@ class HostDevices extends Wizard
'arguments' => [ 'arguments' => [
'name' => 'id_network_profile[]', 'name' => 'id_network_profile[]',
'type' => 'select_from_sql', 'type' => 'select_from_sql',
'sql' => 'SELECT tn.id_np, tn.name 'sql' => 'SELECT id_np, name
FROM tnetwork_profile tn FROM tnetwork_profile
LEFT JOIN `tnetwork_profile_pen` tp ORDER BY name',
ON tp.id_np = tn.id_np
WHERE tp.id_np IS NULL
ORDER BY tn.name',
'return' => true, 'return' => true,
'selected' => explode( 'selected' => explode(
',', ',',
@ -1273,114 +1299,86 @@ class HostDevices extends Wizard
], ],
]; ];
// SNMP Options pack v3. $show_snmp_auth = false;
$form['inputs'][] = [ if (isset($this->task['snmp_enabled']) && $this->task['snmp_enabled'] > 0
'hidden' => 1, && isset($this->task['snmp_version']) && $this->task['snmp_version'] == 3
'block_id' => 'snmp_options_v3', ) {
'class' => 'indented', $show_snmp_auth = true;
'block_content' => [ }
[
'label' => '<b>'.__('Context').'</b>',
'arguments' => [
'name' => 'snmp_context',
'type' => 'text',
'value' => $this->task['snmp_community'],
'size' => 15,
'return' => true,
], include_once $config['homedir'].'/include/class/CredentialStore.class.php';
], $all_snmp_keys = CredentialStore::getAll(
[ [
'label' => '<b>'.__('Auth user').'</b>', 'cs.*',
'arguments' => [ 'tg.nombre as `group`',
'name' => 'snmp_auth_user',
'type' => 'text',
'value' => $this->task['snmp_auth_user'],
'size' => 15,
'return' => true,
],
],
[
'label' => '<b>'.__('Security level').'</b>',
'arguments' => [
'name' => 'snmp_security_level',
'type' => 'select',
'fields' => [
'noAuthNoPriv' => __('Not auth and not privacy method'),
'authNoPriv' => __('Auth and not privacy method'),
'authPriv' => __('Auth and privacy method'),
],
'selected' => $this->task['snmp_security_level'],
'size' => 15,
'return' => true,
],
],
[
'label' => '<b>'.__('Auth method').'</b>',
'arguments' => [
'name' => 'snmp_auth_method',
'type' => 'select',
'fields' => [
'MD5' => __('MD5'),
'SHA' => __('SHA'),
],
'selected' => $this->task['snmp_auth_method'],
'size' => 15,
'return' => true,
],
],
[
'label' => '<b>'.__('Auth password').'</b>'.ui_print_help_tip(
__(
'The pass length must be eight character minimum.'
),
true
),
'arguments' => [
'name' => 'snmp_auth_pass',
'type' => 'password',
'value' => $this->task['snmp_auth_pass'],
'size' => 15,
'return' => true,
],
],
[
'label' => '<b>'.__('Privacy method').'</b>',
'arguments' => [
'name' => 'snmp_privacy_method',
'type' => 'select',
'fields' => [
'DES' => __('DES'),
'AES' => __('AES'),
],
'selected' => $this->task['snmp_privacy_method'],
'size' => 15,
'return' => true,
],
],
[
'label' => '<b>'.__('Privacy pass').'</b>'.ui_print_help_tip(
__(
'The pass length must be eight character minimum.'
),
true
),
'arguments' => [
'name' => 'snmp_privacy_pass',
'type' => 'password',
'value' => $this->task['snmp_privacy_pass'],
'size' => 15,
'return' => true,
],
],
], ],
]; ['product' => 'SNMP']
);
if (is_array($all_snmp_keys) === true) {
// Improve usage and decode output.
$snmp_available_keys = array_reduce(
$all_snmp_keys,
function ($carry, $item) {
$item['extra_1'] = io_output_password($item['extra_1']);
$extra1 = json_decode($item['extra_1'], true);
if ($extra1 !== null && $extra1['version'] == 3) {
$carry[$item['identifier']] = $item['identifier'];
}
return $carry;
},
[]
);
}
if (check_acl($config['id_user'], 0, 'UM')) {
$link_to_cs = '<a class="ext_link" href="'.ui_get_full_url(
'index.php?sec=gmodules&sec2=godmode/groups/group_list&tab=credbox'
).'" >';
$link_to_cs .= __('No credentials available').', ';
$link_to_cs .= strtolower(__('Manage credentials')).'</a>';
} else {
$link_to_cs = __('No credentials available');
}
if (count($snmp_available_keys) > 0) {
$form['inputs'][] = [
'block_id' => 'auth_block_snmp',
'class' => 'indented',
'hidden' => !$show_snmp_auth,
'block_content' => [
[
'label' => __('Credentials to try with'),
'arguments' => [
'type' => 'select',
'name' => 'auth_strings[]',
'fields' => $snmp_available_keys,
'selected' => explode(
',',
$this->task['auth_strings']
),
'multiple' => true,
'class' => 'select_multiple',
],
],
],
];
} else {
$form['inputs'][] = [
'block_id' => 'auth_block_snmp',
'class' => 'indented',
'hidden' => !$show_snmp_auth,
'block_content' => [
[
'label' => __('Credentials to try with'),
'extra' => $link_to_cs,
],
],
];
}
// Input: Enforce os detection. // Input: Enforce os detection.
$form['inputs'][] = [ $form['inputs'][] = [
@ -1453,14 +1451,12 @@ class HostDevices extends Wizard
// AUTH CONFIGURATION. // AUTH CONFIGURATION.
$show_auth = false; $show_auth = false;
if ((isset($this->task['wmi_enabled']) && $this->task['wmi_enabled'] > 0) if (isset($this->task['wmi_enabled']) && $this->task['wmi_enabled'] > 0) {
|| (isset($this->task['rcmd_enabled']) && $this->task['rcmd_enabled'] > 0)
) {
$show_auth = true; $show_auth = true;
} }
include_once $config['homedir'].'/include/class/CredentialStore.class.php'; include_once $config['homedir'].'/include/class/CredentialStore.class.php';
$available_keys = CredentialStore::getKeys('WMI'); $wmi_available_keys = CredentialStore::getKeys('WMI');
if (check_acl($config['id_user'], 0, 'UM')) { if (check_acl($config['id_user'], 0, 'UM')) {
$link_to_cs = '<a class="ext_link" href="'.ui_get_full_url( $link_to_cs = '<a class="ext_link" href="'.ui_get_full_url(
'index.php?sec=gmodules&sec2=godmode/groups/group_list&tab=credbox' 'index.php?sec=gmodules&sec2=godmode/groups/group_list&tab=credbox'
@ -1471,9 +1467,9 @@ class HostDevices extends Wizard
$link_to_cs = __('No credentials available'); $link_to_cs = __('No credentials available');
} }
if (count($available_keys) > 0) { if (count($wmi_available_keys) > 0) {
$form['inputs'][] = [ $form['inputs'][] = [
'block_id' => 'auth_block', 'block_id' => 'auth_block_wmi',
'class' => 'indented', 'class' => 'indented',
'hidden' => !$show_auth, 'hidden' => !$show_auth,
'block_content' => [ 'block_content' => [
@ -1482,7 +1478,7 @@ class HostDevices extends Wizard
'arguments' => [ 'arguments' => [
'type' => 'select', 'type' => 'select',
'name' => 'auth_strings[]', 'name' => 'auth_strings[]',
'fields' => CredentialStore::getKeys('WMI'), 'fields' => $wmi_available_keys,
'selected' => explode( 'selected' => explode(
',', ',',
$this->task['auth_strings'] $this->task['auth_strings']
@ -1496,12 +1492,12 @@ class HostDevices extends Wizard
]; ];
} else { } else {
$form['inputs'][] = [ $form['inputs'][] = [
'block_id' => 'auth_block', 'block_id' => 'auth_block_wmi',
'class' => 'indented', 'class' => 'indented',
'hidden' => !$show_auth, 'hidden' => !$show_auth,
'block_content' => [ 'block_content' => [
[ [
'label' => __('Credentials'), 'label' => __('Credentials to try with'),
'extra' => $link_to_cs, 'extra' => $link_to_cs,
], ],
], ],
@ -1520,11 +1516,11 @@ class HostDevices extends Wizard
function SNMPExtraShow(target) { function SNMPExtraShow(target) {
$("#snmp_options_basic").hide(); $("#snmp_options_basic").hide();
$("#snmp_options_skip_non_enabled_ifs").hide(); $("#snmp_options_skip_non_enabled_ifs").hide();
$("#snmp_options_v3").hide(); $("#auth_block_snmp").hide();
if (document.getElementsByName("snmp_enabled")[0].checked) { if (document.getElementsByName("snmp_enabled")[0].checked) {
$("#snmp_extra").show(); $("#snmp_extra").show();
if (target == 3) { if (target == 3) {
$("#snmp_options_v3").show(); $("#auth_block_snmp").show();
} else { } else {
$("#snmp_options_basic").show(); $("#snmp_options_basic").show();
$("#snmp_options_skip_non_enabled_ifs").show(); $("#snmp_options_skip_non_enabled_ifs").show();
@ -1554,7 +1550,7 @@ class HostDevices extends Wizard
$("#snmp_extra").hide(); $("#snmp_extra").hide();
$("#snmp_options_basic").hide(); $("#snmp_options_basic").hide();
$("#snmp_options_skip_non_enabled_ifs").hide(); $("#snmp_options_skip_non_enabled_ifs").hide();
$("#snmp_options_v3").hide(); $("#auth_block_snmp").hide();
// Disable snmp dependant checks // Disable snmp dependant checks
if (document.getElementsByName("parent_recursion")[0].checked) if (document.getElementsByName("parent_recursion")[0].checked)
@ -1572,13 +1568,17 @@ class HostDevices extends Wizard
} }
function toggleAuth() { function toggleAuth() {
if (document.getElementsByName("wmi_enabled")[0].checked if (document.getElementsByName("wmi_enabled")[0].checked) {
|| (typeof document.getElementsByName("rcmd_enabled")[0] != "undefined" $("#auth_block_wmi").show();
&& document.getElementsByName("rcmd_enabled")[0].checked)
) {
$("#auth_block").show();
} else { } else {
$("#auth_block").hide(); $("#auth_block_wmi").hide();
}
if (typeof document.getElementsByName("rcmd_enabled")[0] != "undefined"
&& document.getElementsByName("rcmd_enabled")[0].checked) {
$("#auth_block_rcmd").show();
} else {
$("#auth_block_rcmd").hide();
} }
} }

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>E1DA0B54-BDFA-427E-9BFB-1315DFA5936F</title>
<g id="Import-/-Export" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Mockup---Import-&amp;-Export-expandido-1300" transform="translate(-406, -540)" fill="#FFFFFF" fill-rule="nonzero">
<g id="Right" transform="translate(310, 380)">
<g id="Group" transform="translate(20, 63)">
<g id="Acciones" transform="translate(0, 83)">
<g id="Export-Copy" transform="translate(76, 13.999)">
<path d="M13,7.00200086 C13.5522847,7.00200086 14,7.44971619 14,8.00200086 L14,13.0020009 C14,13.5542875 13.5522847,14.0020009 13,14.0020009 L1,14.0020009 C0.44771525,14.0020009 0,13.5542875 0,13.0020009 L0,8.00201259 C0,7.44972773 0.44771525,7.00200086 1,7.00200086 C1.55228475,7.00200086 2,7.44973046 2,8.00201532 L2,12.0020009 L12,12.0020009 L12,8.00200086 C12,7.48917088 12.3860402,7.06649675 12.8833789,7.00873163 L13,7.00200086 Z" id="Path-2"></path>
<path d="M7.42761656,0.098000218 L7.4722276,0.120228468 C7.48541492,0.127297151 7.4984771,0.134682814 7.51140295,0.142385459 C7.6034078,0.196864662 7.68458638,0.263207322 7.75402558,0.34146022 L8.64094412,1.22873471 C8.69800231,1.28579287 8.75962403,1.34741457 8.82669975,1.41449025 L10.1954614,2.78325124 C10.4003199,2.98810964 10.6267161,3.21450572 10.8776552,3.46544474 L11.4849524,4.07274159 L11.7071068,4.29489588 C12.0976311,4.68541998 12.0976311,5.31858465 11.7071068,5.70910875 C11.3165825,6.09963285 10.6834175,6.09963285 10.2928932,5.70910875 L10.1805423,5.59675789 L9.46344168,4.87965762 C9.21250254,4.62871859 8.98610634,4.40232251 8.78124784,4.19746411 L8,3.416 L8,10.0020035 C8,10.5542882 7.55228475,11.0020034 7,11.0020034 C6.44771525,11.0020034 6,10.5542882 6,10.0020035 L6,3.41600434 L3.70710678,5.70911084 C3.34662282,6.06959476 2.77939176,6.09732429 2.38710056,5.79229943 L2.29289322,5.70911084 C1.90236893,5.31858659 1.90236893,4.68542169 2.29289322,4.29489745 L6.29289322,0.294897937 C6.54710458,0.0406866046 6.87413362,-0.0382890141 7.1738163,0.0164817894 C7.17680504,0.0176633808 7.18016721,0.0182701476 7.18352681,0.0188942086 C7.21466801,0.0243205099 7.24513844,0.0316757505 7.2751983,0.0403969286 C7.28707112,0.0438108231 7.29913038,0.0474948538 7.31113021,0.0514117815 C7.32967787,0.0576595805 7.3480221,0.0642976796 7.3661634,0.0714484962 C7.37897252,0.0762161528 7.39150205,0.0814382808 7.40394259,0.0869264154 L7.42761656,0.098000218 Z" id="Path-4-Copy" transform="translate(7, 5.501) scale(1, -1) translate(-7, -5.501)"></path>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="111px" height="111px" viewBox="0 0 111 111" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>868E520D-AB8E-4FB9-B511-A43C58B7C144</title>
<g id="Import-/-Export" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Mockup---Import-&amp;-Export-expandido-1300" transform="translate(-1140, -400)">
<g id="Right" transform="translate(310, 380)">
<g id="Export-to-PFMS" transform="translate(830, 21)">
<g id="Carpeta" transform="translate(50, 0)" fill="#FFFFFF" stroke="#C1CCDC" stroke-linejoin="round">
<path d="M30.24,10.8 C30.24,13.5952941 27.9846,15.8823529 25.2,15.8823529 L12.6,15.8823529 L5.04,15.8823529 C2.256408,15.8823529 0,18.1694118 0,20.9647059 L0,41.2941176 L0,48.9176471 C0,51.7129412 2.2564836,54 5.04,54 L55.44,54 C58.2246,54 60.48,51.7129412 60.48,48.9176471 L60.48,41.2941176 L60.48,15.8823529 C60.48,13.0870588 58.2246,10.8 55.44,10.8 L30.24,10.8 Z" id="Path"></path>
<path d="M5.04,0 C2.256408,0 0,2.28327 0,5.1 L0,17.85 L25.2,17.85 L25.2,20.4 L60.48,20.4 L60.48,7.65 C60.48,4.83327 58.2246,2.55 55.44,2.55 L29.53188,2.55 C28.65996,1.027905 27.0648,0 25.2,0 L5.04,0 Z" id="Path"></path>
<path d="M30.2012804,7.8 C30.2012804,10.4702795 27.9487682,12.6550537 25.1677337,12.6550537 L12.5838668,12.6550537 L5.03354673,12.6550537 C2.25351887,12.6550537 0,14.8398278 0,17.5101073 L0,36.9303219 L0,45.5682628 C0,48.2385423 2.33103356,50.4 5.11098592,50.4 L55.4464533,50.4 C58.2274878,50.4 60.48,48.2152259 60.48,45.5449463 L60.4025608,36.9303219 L60.4025608,12.6550537 C60.4025608,9.98477414 58.1500487,7.8 55.3690141,7.8 L30.2012804,7.8 Z" id="Path"></path>
</g>
<circle id="Oval" fill="#FFFFFF" cx="35" cy="74" r="32"></circle>
<path d="M54.3088808,87.6772425 C52.1910624,89.4538282 49.4009606,90.9797575 46.396587,91.7689771 C43.0303728,92.6582798 39.2495496,92.9008577 35.650332,92.4338784 C28.8630793,91.5566934 22.7682123,87.3527581 18.6666667,83.4113724 C19.1347294,82.3207818 19.2699628,81.9265086 19.7510463,80.8496064 C20.5585631,81.6760766 21.9897067,82.7738481 22.625669,83.2060452 C27.0292053,86.2139212 32.7855321,88.809123 40.4090843,88.3753552 C44.2696313,88.1675595 47.8530869,86.8543627 50.393738,84.850234 C52.8530663,82.9143234 54.9142328,80.131522 54.8683175,76.2630667 C54.8198893,72.1672929 52.7706013,68.8241613 50.5442764,66.5873284 C49.7769642,65.8178561 48.9509442,64.9958739 48.116929,64.389317 C46.7936066,63.4302255 45.3272841,62.687457 43.8481692,61.9841831 C42.3478099,61.2611618 40.8054186,60.5323062 39.0151756,60.1555363 C41.9656386,58.3102838 49.8973493,56.0487668 50.8341601,56.578354 C51.4180393,56.9050824 52.052631,57.4290596 52.5433088,57.8181716 C54.161312,59.093669 55.5481392,60.8882068 56.7296036,62.5510209 C58.4280159,64.9498716 59.8616722,67.7277362 60.3861584,70.8529741 C61.6553417,78.5710349 58.4405798,84.2228078 54.3088808,87.6772425 M7,75.782883 L7,75.7734567 C10.537516,70.0360569 14.6286486,64.8419341 19.4789374,60.4347927 C22.8258824,57.3887174 26.7653177,54.6679645 31.1310245,52.6946485 C31.8627009,52.3539221 32.5749405,51.9357161 33.365151,51.6710899 C34.1446378,51.4069235 34.9625515,51.1418375 35.8012426,50.8588185 C38.9895647,49.7768629 43.3820809,49.228298 46.9044049,49.6333991 C49.5377698,49.9403288 52.1590705,50.7197231 53.9097321,52.1203337 C54.5006586,52.5884301 55.2108874,53.1004393 55.5942636,53.6611894 C55.8138782,53.9853622 56.1228579,54.7344085 55.9490429,55.1808933 C55.7312155,55.7193421 54.9289407,55.7726812 54.2656285,55.7563576 C52.0051392,55.7126748 49.9296356,55.4641422 47.7422023,55.7393443 C44.6354259,56.1313406 42.0677443,57.0238505 39.8503736,57.9830343 C35.16474,59.9869283 31.143759,63.2941812 27.9737568,66.629713 C24.7778387,69.9861665 21.8236532,74.214668 19.4755862,78.5558254 C16.8565196,83.3878402 14.8822219,88.484941 13.2481818,93.8333333 C9.50624318,88.8098036 7.19012417,82.5918924 7,75.782883 M34.9998875,39 C15.6689898,39 0,54.666808 0,73.9997751 C0,93.3298184 15.6689898,109 34.9998875,109 C54.3319099,109 70,93.3298184 70,73.9997751 C70,54.666808 54.3319099,39 34.9998875,39" id="Fill-694" fill="#82B92E"></path>
<g id="Group-2" transform="translate(11, 8.5)" stroke="#C1CCDC" stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
<g id="Group-4">
<polygon id="Triangle" fill="#C1CCDC" transform="translate(31, 5) rotate(90) translate(-31, -5)" points="31 2.5 36 7.5 26 7.5"></polygon>
<path d="M0,39.5 C0,36.5833333 0,33.6666667 0,30.75 C-1.75851975e-15,16.3905965 11.6405965,4.75 26,4.75 L26,4.75 L26,4.75" id="Path-3" stroke-dasharray="2,4"></path>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.9 KiB

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>6AE8E7E7-D5F8-4670-BCBD-08A30E381B8F</title>
<g id="Import-/-Export" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Mockup---Import-&amp;-Export-expandido-1300" transform="translate(-408, -309)" fill="#FFFFFF" fill-rule="nonzero">
<g id="Left" transform="translate(310, 150)">
<g id="Group" transform="translate(20, 63)">
<g id="Acciones" transform="translate(0, 83)">
<g id="Import" transform="translate(78, 12.998)">
<path d="M13,7.00200171 C13.5522847,7.00200171 14,7.4497171 14,8.00200171 L14,13.0020017 C14,13.5542892 13.5522847,14.0020017 13,14.0020017 L1,14.0020017 C0.44771525,14.0020017 0,13.5542892 0,13.0020017 L0,8.00201357 C0,7.44972864 0.44771525,7.00200171 1,7.00200171 C1.55228475,7.00200171 2,7.44973137 2,8.00201629 L2,12.0020017 L12,12.0020017 L12,8.00200171 C12,7.4891718 12.3860402,7.06649761 12.8833789,7.00873249 L13,7.00200171 Z" id="Path-2"></path>
<path d="M7.42761656,0.09800023 L7.4722276,0.120228483 C7.48541492,0.127297166 7.4984771,0.134682831 7.51140295,0.142385477 C7.6034078,0.196864686 7.68458638,0.263207354 7.75402558,0.341460261 L8.64094412,1.22873487 C8.69800231,1.28579303 8.75962403,1.34741473 8.82669975,1.41449043 L10.1954614,2.78325158 C10.4003199,2.98811 10.6267161,3.21450611 10.8776552,3.46544517 L11.4849524,4.07274209 L11.7071068,4.2948964 C12.0976311,4.68542055 12.0976311,5.3185853 11.7071068,5.70910945 C11.3165825,6.0996336 10.6834175,6.0996336 10.2928932,5.70910945 L10.1805423,5.59675858 L9.46344168,4.87965821 C9.21250254,4.62871916 8.98610634,4.40232305 8.78124784,4.19746462 L8,3.416 L8,10.0020048 C8,10.5542895 7.55228475,11.0020048 7,11.0020048 C6.44771525,11.0020048 6,10.5542895 6,10.0020048 L6,3.41600475 L3.70710678,5.70911154 C3.34662282,6.0695955 2.77939176,6.09732503 2.38710056,5.79230014 L2.29289322,5.70911154 C1.90236893,5.31858724 1.90236893,4.68542227 2.29289322,4.29489797 L6.29289322,0.294897973 C6.54710458,0.0406866095 6.87413362,-0.0382890188 7.1738163,0.0164817914 C7.17680504,0.017663383 7.18016721,0.0182701498 7.18352681,0.0188942109 C7.21466801,0.0243205129 7.24513844,0.0316757544 7.2751983,0.0403969336 C7.28707112,0.0438108284 7.29913038,0.0474948597 7.31113021,0.0514117877 C7.32967787,0.0576595875 7.3480221,0.0642976875 7.3661634,0.0714485049 C7.37897252,0.0762161621 7.39150205,0.0814382908 7.40394259,0.086926426 L7.42761656,0.09800023 Z" id="Path-4-Copy"></path>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="111px" height="110px" viewBox="0 0 111 110" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>A981FD90-8ED5-4170-8C6A-8F4DFD0DCCD4</title>
<g id="Import-/-Export" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Mockup---Import-&amp;-Export-expandido-1300" transform="translate(-1139, -171)">
<g id="Left" transform="translate(310, 150)">
<g id="Import-to-PFMS" transform="translate(830, 21)">
<path d="M96.5504693,41.7233507 C94.7351964,43.2461384 92.3436805,44.5540779 89.7685032,45.2305518 C86.8831767,45.9928112 83.6424711,46.2007351 80.5574274,45.8004672 C74.7397823,45.0485944 69.5156105,41.4452213 66,38.0668907 C66.4011967,37.1320987 66.517111,36.7941502 66.9294683,35.8710912 C67.6216255,36.5794943 68.84832,37.5204413 69.3934306,37.8908959 C73.1678902,40.4690753 78.1018846,42.693534 84.636358,42.321733 C87.9453982,42.1436224 91.0169316,41.0180252 93.1946325,39.3002006 C95.3026282,37.6408486 97.0693424,35.2555903 97.0299864,31.9397715 C96.9884765,28.4291082 95.231944,25.5635668 93.3236655,23.6462815 C92.6659693,22.9867338 91.9579522,22.2821776 91.243082,21.7622717 C90.1088057,20.9401933 88.8519578,20.3035345 87.584145,19.7007283 C86.2981227,19.0809959 84.9760731,18.4562624 83.4415791,18.1333168 C85.9705473,16.5516718 92.7691565,14.6132287 93.5721372,15.0671606 C94.0726051,15.3472135 94.6165408,15.7963368 95.0371218,16.1298614 C96.4239817,17.2231448 97.6126908,18.7613201 98.6253745,20.1865894 C100.081156,22.2427471 101.310005,24.6237739 101.759564,27.3025492 C102.847436,33.9180299 100.091926,38.7624067 96.5504693,41.7233507 M56,31.5281854 L56,31.5201057 C59.0321566,26.6023345 62.5388416,22.1502293 66.696232,18.3726794 C69.565042,15.7617578 72.9417009,13.4296839 76.6837353,11.7382701 C77.3108865,11.446219 77.9213775,11.0877567 78.5987009,10.8609342 C79.2668324,10.6345059 79.9679013,10.4072893 80.6867794,10.1647016 C83.4196269,9.23731103 87.1846408,8.76711259 90.2037756,9.11434212 C92.4609456,9.37742465 94.7077748,10.0454769 96.2083418,11.2460003 C96.7148502,11.6472258 97.3236178,12.0860908 97.6522259,12.5667338 C97.840467,12.8445962 98.1053068,13.4866358 97.9563224,13.8693371 C97.7696133,14.3308647 97.0819491,14.3765839 96.5133958,14.3625923 C94.5758336,14.3251498 92.7968305,14.1121219 90.9218877,14.3480094 C88.2589365,14.6840062 86.0580665,15.4490147 84.1574631,16.2711723 C80.1412057,17.9887957 76.6946506,20.8235839 73.9775058,23.6826111 C71.2381475,26.5595713 68.7059884,30.1840012 66.6933596,33.9049932 C64.4484454,38.0467202 62.7561902,42.4156638 61.3555844,47 C58.1482084,42.6941174 56.1629636,37.3644792 56,31.5281854 M79.9999036,0 C63.4305627,0 50,13.4286926 50,29.9998072 C50,46.5684158 63.4305627,60 79.9999036,60 C96.5702085,60 110,46.5684158 110,29.9998072 C110,13.4286926 96.5702085,0 79.9999036,0" id="Fill-694" fill="#82B92E"></path>
<g id="Carpeta" transform="translate(0, 39)" fill="#FFFFFF" stroke="#C1CCDC" stroke-linejoin="round">
<path d="M39,14 C39,17.6235294 36.09125,20.5882353 32.5,20.5882353 L16.25,20.5882353 L6.5,20.5882353 C2.91005,20.5882353 0,23.5529412 0,27.1764706 L0,53.5294118 L0,63.4117647 C0,67.0352941 2.9101475,70 6.5,70 L71.5,70 C75.09125,70 78,67.0352941 78,63.4117647 L78,53.5294118 L78,20.5882353 C78,16.9647059 75.09125,14 71.5,14 L39,14 Z" id="Path"></path>
<path d="M6.5,0 C2.91005,0 0,2.95979444 0,6.61111111 L0,23.1388889 L32.5,23.1388889 L32.5,26.4444444 L78,26.4444444 L78,9.91666667 C78,6.26535 75.09125,3.30555556 71.5,3.30555556 L38.08675,3.30555556 C36.96225,1.33246944 34.905,0 32.5,0 L6.5,0 Z" id="Path"></path>
<path d="M38.950064,10.1111111 C38.950064,13.5725845 36.0450384,16.4046992 32.4583867,16.4046992 L16.2291933,16.4046992 L6.49167734,16.4046992 C2.90632394,16.4046992 0,19.2368138 0,22.6982872 L0,47.8726395 L0,59.0699703 C0,62.5314438 3.00629328,65.3333333 6.5915493,65.3333333 L71.5083227,65.3333333 C75.0949744,65.3333333 78,62.5012187 78,59.0397453 L77.900128,47.8726395 L77.900128,16.4046992 C77.900128,12.9432257 74.9951024,10.1111111 71.4084507,10.1111111 L38.950064,10.1111111 Z" id="Path"></path>
</g>
<g id="Group-2" transform="translate(11, 8.5)" stroke="#C1CCDC" stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
<g id="Group-4">
<polygon id="Triangle" fill="#C1CCDC" transform="translate(31, 5) rotate(90) translate(-31, -5)" points="31 2.5 36 7.5 26 7.5"></polygon>
<path d="M0,39.5 C0,36.5833333 0,33.6666667 0,30.75 C-1.75851975e-15,16.3905965 11.6405965,4.75 26,4.75 L26,4.75 L26,4.75" id="Path-3" stroke-dasharray="2,4"></path>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.9 KiB

View File

@ -117,12 +117,25 @@ if ($method === 'draw') {
$where_name = 'name LIKE "%'.$filter['free_search'].'%"'; $where_name = 'name LIKE "%'.$filter['free_search'].'%"';
} }
if (is_user_admin($config['id_user']) === false) {
$group_list = \users_get_groups(
$config['id_ser'],
'RR',
true
);
}
$where_group = ''; $where_group = '';
if (empty($filter['group']) === false && $filter['group'] !== '0') { if (empty($filter['group']) === false && $filter['group'] !== '0') {
$where_group = sprintf('id_group = %s', $filter['group']); $where_group = sprintf('id_group = %s', $filter['group']);
if (empty($where_name) === false) { if (empty($where_name) === false) {
$where_group = 'AND '.$where_group; $where_group = 'AND '.$where_group;
} }
} else if (empty($group_list) === false) {
$where_group = sprintf('id_group IN (%s)', implode(',', array_keys($group_list)));
if (empty($where_name) === false) {
$where_group = 'AND '.$where_group;
}
} }
$where = ''; $where = '';

View File

@ -2049,7 +2049,9 @@ if ($get_extended_event) {
$js .= '});'; $js .= '});';
$js .= '$("#link_comments").click(get_table_events_tabs(\''.base64_encode(json_encode($event)).'\',\''.base64_encode(json_encode($filter)).'\'));'; $js .= '$("#link_comments").on("click", () => {
get_table_events_tabs(\''.base64_encode(json_encode($event)).'\',\''.base64_encode(json_encode($filter)).'\')
});';
if (events_has_extended_info($event['id_evento']) === true) { if (events_has_extended_info($event['id_evento']) === true) {
$js .= ' $js .= '

View File

@ -0,0 +1,115 @@
<?php
/**
* Pandora FMS- https://pandorafms.com.
* ==================================================
* Copyright (c) 2005-2023 Pandora FMS
* Please see https://pandorafms.com/community/ for full contribution list
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; version 2
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
global $config;
if ((bool) is_ajax() === true) {
include_once $config['homedir'].'/include/class/Prd.class.php';
$getResource = (bool) get_parameter('getResource', false);
$exportPrd = (bool) get_parameter('exportPrd', false);
$deleteFile = (bool) get_parameter('deleteFile', false);
$prd = new Prd();
if ($getResource === true) {
$type = (string) get_parameter('type', '');
$result = false;
$data = $prd->getOnePrdData($type);
if (empty($data) === false) {
$sql = sprintf(
'SELECT %s FROM %s',
reset($data['items']['value']).', '.reset($data['items']['show']),
$data['items']['table']
);
$result = html_print_label_input_block(
$data['label'],
io_safe_output(
html_print_select_from_sql(
$sql,
'select_value',
'',
'',
'',
0,
true,
false,
true,
false,
false,
false,
GENERIC_SIZE_TEXT,
'w90p',
),
),
[
'div_style' => 'display: flex; flex-direction: column; width: 50%',
'div_id' => 'resource_type',
],
);
}
echo $result;
return;
}
if ($exportPrd === true) {
$type = (string) get_parameter('type', '');
$value = (int) get_parameter('value', 0);
$name = (string) get_parameter('name', '');
$filename = (string) get_parameter('filename', '');
try {
$data = $prd->exportPrd($type, $value, $name);
} catch (\Exception $e) {
$data = '';
}
$return = [];
if (empty($data) === false) {
$filename_download = date('YmdHis').'-'.$type.'-'.$name.'.prd';
$file = $config['attachment_store'].'/'.$filename;
$file_pointer = fopen($file, 'a');
if ($file_pointer !== false) {
$write = fwrite($file_pointer, $data);
if ($write === false) {
$return['error'] = -2;
unlink($config['attachment_store'].'/'.$filename);
} else {
$return['name'] = $filename;
$return['name_download'] = $filename_download;
}
fclose($file_pointer);
} else {
$return['error'] = -1;
}
}
echo json_encode($return);
return;
}
if ($deleteFile === true) {
$filename = (string) get_parameter('filename', '');
unlink($config['attachment_store'].'/'.$filename);
}
}

View File

@ -129,7 +129,12 @@ if ($check_connectivity) {
if ($create_net_scan) { if ($create_net_scan) {
$ip_target = get_parameter('ip_target', '192.168.10.0/24'); $ip_target = get_parameter('ip_target', '192.168.10.0/24');
$id_net_scan = create_net_scan($ip_target); $snmp_version = get_parameter('snmp_version', '1');
$snmp_communities = get_parameter('snmp_communities', 'public');
$wmi_credentials = get_parameter('wmi_credentials', []);
$rcmd_credentials = get_parameter('rcmd_credentials', []);
$id_net_scan = create_net_scan($ip_target, $snmp_version, $snmp_communities, $wmi_credentials, $rcmd_credentials);
if ($id_net_scan > 0) { if ($id_net_scan > 0) {
$id_recon_server = db_get_row_filter('tserver', ['server_type' => SERVER_TYPE_DISCOVERY], 'id_server')['id_server']; $id_recon_server = db_get_row_filter('tserver', ['server_type' => SERVER_TYPE_DISCOVERY], 'id_server')['id_server'];
ui_print_success_message(__('Basic net created and scan in progress. <a href='.ui_get_full_url('index.php?sec=gservers&sec2=godmode/servers/discovery&wiz=tasklist&server_id='.$id_recon_server.'&force='.$id_net_scan).'>Click here to view the data</a>. Please note that it may take a few seconds to see data if your server is busy')); ui_print_success_message(__('Basic net created and scan in progress. <a href='.ui_get_full_url('index.php?sec=gservers&sec2=godmode/servers/discovery&wiz=tasklist&server_id='.$id_recon_server.'&force='.$id_net_scan).'>Click here to view the data</a>. Please note that it may take a few seconds to see data if your server is busy'));

View File

@ -172,12 +172,12 @@ function process_user_login_local($login, $pass, $api=false, $passAlreadyEncrypt
$credentials_check = $pass === $row['password']; $credentials_check = $pass === $row['password'];
} else { } else {
// Perform password check whether it is MD5-hashed (old hashing) or Bcrypt-hashed. // Perform password check whether it is MD5-hashed (old hashing) or Bcrypt-hashed.
if (strlen($row['password']) === 32) { if (strlen(($row['password'] ?? '')) === 32) {
// MD5. // MD5.
$credentials_check = $row !== false && $row['password'] !== md5('') && $row['password'] == md5($pass); $credentials_check = $row !== false && $row['password'] !== md5('') && $row['password'] == md5($pass);
} else { } else {
// Bcrypt. // Bcrypt.
$credentials_check = password_verify($pass, $row['password']); $credentials_check = password_verify($pass, ($row['password'] ?? ''));
} }
} }

View File

@ -1510,17 +1510,42 @@ class ConsoleSupervisor
{ {
global $config; global $config;
$types_sql = sprintf(
' AND (
`server_type` != %d AND
`server_type` != %d
)',
SERVER_TYPE_AUTOPROVISION,
SERVER_TYPE_MIGRATION
);
if (is_metaconsole() === true && isset($config['ndbh']) === false) {
$types_sql = sprintf(
' AND (
`server_type` = %d OR
`server_type` = %d OR
`server_type` = %d OR
`server_type` = %d
)',
SERVER_TYPE_AUTOPROVISION,
SERVER_TYPE_EVENT,
SERVER_TYPE_MIGRATION,
SERVER_TYPE_PREDICTION
);
}
$servers = db_get_all_rows_sql( $servers = db_get_all_rows_sql(
'SELECT sprintf(
id_server, 'SELECT id_server,
name, `name`,
server_type, server_type,
server_keepalive, server_keepalive,
status, `status`,
unix_timestamp() - unix_timestamp(keepalive) as downtime unix_timestamp() - unix_timestamp(keepalive) as downtime
FROM tserver FROM tserver
WHERE WHERE unix_timestamp() - unix_timestamp(keepalive) > server_keepalive
unix_timestamp() - unix_timestamp(keepalive) > server_keepalive' %s',
$types_sql
)
); );
if ($servers === false) { if ($servers === false) {

File diff suppressed because it is too large Load Diff

View File

@ -107,7 +107,7 @@ class Tree
$userGroupsACL = users_get_groups(false, $this->access); $userGroupsACL = users_get_groups(false, $this->access);
$this->userGroupsACL = empty($userGroupsACL) ? false : $userGroupsACL; $this->userGroupsACL = empty($userGroupsACL) ? [0] : $userGroupsACL;
$this->userGroups = $this->userGroupsACL; $this->userGroups = $this->userGroupsACL;
$this->userGroupsArray = array_keys($this->userGroups); $this->userGroupsArray = array_keys($this->userGroups);

View File

@ -848,13 +848,22 @@ class WelcomeWindow extends Wizard
</div> </div>
<div id="dialog_basic_net" class="invisible"> <div id="dialog_basic_net" class="invisible">
<?php <?php
$serverIP = $_SERVER['SERVER_ADDR'];
$ipParts = explode('.', $serverIP);
if (count($ipParts) === 4) {
$ipParts[3] = '0/24';
$network = implode('.', $ipParts);
} else {
$network = '192.168.10.0/24';
}
echo html_print_input_hidden('create_net_scan', 1); echo html_print_input_hidden('create_net_scan', 1);
echo html_print_label_input_block( echo html_print_label_input_block(
__('Ip target'), __('Ip target'),
html_print_input_text( html_print_input_text(
'ip_target_discovery', 'ip_target_discovery',
'192.168.10.0/24', $network,
'192.168.10.0/24', $network,
false, false,
18, 18,
true, true,
@ -874,8 +883,320 @@ class WelcomeWindow extends Wizard
) )
); );
echo html_print_div(
[
'class' => '',
'content' => '<br>To detect and find systems on your network we will need access credentials. The SNMP community for network devices, and at least one set of credentials for Linux and Windows environments (they do not need to be super administrators, but they do need to be able to connect remotely). Without the credentials, we will only be able to detect if the devices are connected to the network.<br><br>',
],
true
);
// SNMP Communities
echo html_print_label_input_block(
__('SNMP communities to try with').ui_print_help_tip(
__(
'You can specify several values, separated by commas, for example: public,mysecret,1234'
),
true
),
html_print_input(
[
'name' => 'community',
'type' => 'text',
'value' => 'public',
'size' => 25,
'return' => true,
],
'div',
true
),
['div_id' => 'snmp-communities-div']
);
ui_require_jquery_file('tag-editor.min', 'include/javascript/', true);
ui_require_jquery_file('caret.min', 'include/javascript/', true);
ui_require_css_file('jquery.tag-editor', 'include/styles/', true);
echo '<br>';
$spacing = '';
for ($i = 0; $i < 12; $i++) {
$spacing .= '&nbsp;';
}
// WMI Credentials
echo '<fieldset style="padding: 10px; padding-top: 0px">';
echo '<legend>'.__('WMI credentials').'</legend>';
echo html_print_div(
[
'id' => 'wmi-creds',
'content' => '',
],
true
);
echo html_print_div(
[
'id' => 'wmi-cred-form',
'hidden' => true,
'style' => 'margin: 10px; display: flex; align-items: center;',
'content' => html_print_div(
[
'id' => 'wmi-cred-user-div',
'style' => 'width: 260px;',
'content' => html_print_label_input_block(
__('User').'&nbsp;',
html_print_input_text(
'wmi-cred-user',
'',
'',
false,
50,
// Max length
true,
false,
true,
'',
'w100p',
'',
'off',
false,
'',
'',
'',
false,
'',
'Username'
),
['div_style' => 'display: flex; align-items: center;']
),
],
true
).html_print_div(
[
'id' => 'wmi-cred-pass-div',
'style' => 'width: 260px;',
'content' => html_print_label_input_block(
$spacing.__('Password').'&nbsp;',
html_print_input_password(
'wmi-cred-pass',
'',
'',
false,
50,
// Max length
true,
false,
true,
'w100p',
'off',
false,
''
),
['div_style' => 'display: flex; align-items: center;']
),
],
true
).html_print_div(
[
'id' => 'wmi-cred-namespace-div',
'style' => 'width: 260px;',
'content' => html_print_label_input_block(
$spacing.__('Namespace').'&nbsp;',
html_print_input_text(
'wmi-cred-namespace',
'',
'',
false,
50,
// Max length
true,
false,
true,
'',
'w100p',
'',
'off',
false,
'',
'',
'',
false,
'',
'Namespace'
),
['div_style' => 'display: flex; align-items: center;']
),
],
true
).'<a onClick="delete_discovery_credential(this);">'.html_print_image(
'images/delete.svg',
true,
[
'title' => __('Delete'),
'style' => 'cursor: pointer;',
'class' => 'main_menu_icon invert_filter',
]
).'</a>',
],
true
);
echo '<div style="height: 10px;"></div>';
echo html_print_button(
__('Add'),
'add-wmi-cred',
false,
'add_discovery_credential("wmi-cred-form","wmi-creds");',
[
'icon' => 'plus',
'mode' => 'secondary',
'class' => 'mini',
],
true,
false,
false,
''
);
echo '</fieldset>';
echo '<br>';
// RCM Credentials
echo '<fieldset style="padding: 10px; padding-top: 0px">';
echo '<legend>'.__('Remote commands credentials').'</legend>';
echo html_print_div(
[
'id' => 'rcmd-creds',
'content' => '',
],
true
);
echo html_print_div(
[
'id' => 'rcmd-cred-form',
'hidden' => true,
'style' => 'margin: 10px; display: flex; align-items: center;',
'content' => html_print_div(
[
'id' => 'rcmd-cred-user-div',
'style' => 'width: 260px;',
'content' => html_print_label_input_block(
__('User').'&nbsp;',
html_print_input_text(
'rcmd-cred-user',
'',
'',
false,
50,
// Max length
true,
false,
true,
'',
'w100p',
'',
'off',
false,
'',
'',
'',
false,
'',
'Username'
),
['div_style' => 'display: flex; align-items: center;']
),
],
true
).html_print_div(
[
'id' => 'rcmd-cred-pass-div',
'style' => 'width: 260px;',
'content' => html_print_label_input_block(
$spacing.__('Password').'&nbsp;',
html_print_input_password(
'rcmd-cred-pass',
'',
'',
false,
50,
// Max length
true,
false,
true,
'w100p',
'off',
false,
''
),
['div_style' => 'display: flex; align-items: center;']
),
],
true
).'<a onClick="delete_discovery_credential(this);">'.html_print_image(
'images/delete.svg',
true,
[
'title' => __('Delete'),
'style' => 'cursor: pointer;',
'class' => 'main_menu_icon invert_filter',
]
).'</a>',
],
true
);
echo '<div style="height: 10px;"></div>';
echo html_print_button(
__('Add'),
'add-rcmd-cred',
false,
'add_discovery_credential("rcmd-cred-form","rcmd-creds");',
[
'icon' => 'plus',
'mode' => 'secondary',
'class' => 'mini',
],
true,
false,
false,
''
);
echo '</fieldset>';
echo html_print_submit_button(__('Create'), 'basic_net', false, ['icon' => 'next', 'style' => 'margin-top:15px; float:right;']); echo html_print_submit_button(__('Create'), 'basic_net', false, ['icon' => 'next', 'style' => 'margin-top:15px; float:right;']);
?> ?>
<script type="text/javascript">
$(document).ready(function() {
$('#snmp-communities-div .tag-editor').remove();
$('#text-community').tagEditor({
forceLowercase: false
});
});
var credentialCounters = {};
function add_discovery_credential(sourceFormId, targetDivId) {
// Increment the counter for this type of credential
credentialCounters[targetDivId] = (credentialCounters[targetDivId] || 0) + 1;
// Clone the source form
var newCredential = $("#" + sourceFormId).clone();
// Generate a unique ID for the new credential
var uniqueId = targetDivId + "-" + credentialCounters[targetDivId];
// Set a new ID for the cloned form
newCredential.attr("id", uniqueId);
// Append the cloned form to the target div
$("#" + targetDivId).append(newCredential);
// Ensure the cloned div is visible
newCredential.show().css("display", "flex");
}
function delete_discovery_credential(clickedElement) {
$(clickedElement).parent().remove();
}
</script>
</div> </div>
<div id="dialog_alert_mail" class="invisible"> <div id="dialog_alert_mail" class="invisible">
<?php <?php
@ -1308,8 +1629,8 @@ class WelcomeWindow extends Wizard
draggable: true, draggable: true,
modal: true, modal: true,
close: false, close: false,
height: 200, height: 590,
width: 480, width: 925,
overlay: { overlay: {
opacity: 0.5, opacity: 0.5,
background: "black" background: "black"
@ -1407,6 +1728,35 @@ class WelcomeWindow extends Wizard
}); });
$('#button-basic_net').click(function(){ $('#button-basic_net').click(function(){
var wmi_credentials = [];
$("#wmi-creds [id^='wmi-creds-']").each(function() {
var credentialId = $(this).attr("id");
var credentialValues = {
user: $(this).find('[name="wmi-cred-user"]').val(),
pass: $(this).find('[name="wmi-cred-pass"]').val(),
namespace: $(this).find('[name="wmi-cred-namespace"]').val()
};
wmi_credentials.push({
id: credentialId,
credential: credentialValues
});
});
var rcmd_credentials = [];
$("#rcmd-creds [id^='rcmd-creds-']").each(function() {
var credentialId = $(this).attr("id");
var credentialValues = {
user: $(this).find('[name="rcmd-cred-user"]').val(),
pass: $(this).find('[name="rcmd-cred-pass"]').val()
};
rcmd_credentials.push({
id: credentialId,
credential: credentialValues
});
});
$.ajax({ $.ajax({
async: false, async: false,
type: "POST", type: "POST",
@ -1414,6 +1764,10 @@ class WelcomeWindow extends Wizard
data: { data: {
create_net_scan: 1, create_net_scan: 1,
ip_target: $('#text-ip_target_discovery').val(), ip_target: $('#text-ip_target_discovery').val(),
snmp_version: 1,
snmp_communities: $('#text-community').val(),
wmi_credentials: wmi_credentials,
rcmd_credentials: rcmd_credentials
}, },
success: function(data) { success: function(data) {
if (data !== 0) { if (data !== 0) {

View File

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

View File

@ -907,3 +907,16 @@ define('DEMO_SERVICE', 6);
define('DEMO_DASHBOARD', 7); define('DEMO_DASHBOARD', 7);
define('DEMO_VISUAL_CONSOLE', 8); define('DEMO_VISUAL_CONSOLE', 8);
define('DEMO_PLUGIN', 9); define('DEMO_PLUGIN', 9);
// Export resources.
define('LINE_BREAK', "\n");
// OS.
define('LINUX', '1');
define('SOLARIS', '2');
define('AIX', '3');
define('BSD', '4');
define('HPUX', '5');
define('CISCO', '7');
define('MACOS', '8');
define('WINDOWS', '9');

View File

@ -4945,6 +4945,8 @@ function get_resume_agent_concat($id_agente, $all_groups, $agent)
// Optional data // Optional data
// Position Information. // Position Information.
if ((bool) $config['activate_gis'] === true) { if ((bool) $config['activate_gis'] === true) {
include_once $config['homedir'].'/include/functions_gis.php';
$data = []; $data = [];
$dataPositionAgent = gis_get_data_last_position_agent( $dataPositionAgent = gis_get_data_last_position_agent(

View File

@ -504,7 +504,7 @@ function cron_task_start_gotty(bool $restart_mode=true)
} }
} }
if ($start_proc === true) { if ($start_proc === true && file_exists('/usr/bin/pandora_gotty') === true) {
$logFilePath = $config['homedir'].'/log/gotty_cron_tmp.log'; $logFilePath = $config['homedir'].'/log/gotty_cron_tmp.log';
shell_exec('touch '.$logFilePath); shell_exec('touch '.$logFilePath);
@ -527,7 +527,7 @@ function cron_task_start_gotty(bool $restart_mode=true)
while ((time() - $startTime) < $maxWaitTime) { while ((time() - $startTime) < $maxWaitTime) {
if ($start_proc === true) { if ($start_proc === true) {
// Read command output. // Read command output.
$log_content = file_get_contents($logFilePath); $log_content = @file_get_contents($logFilePath);
} }
if ($start_proc === true if ($start_proc === true

View File

@ -1177,14 +1177,18 @@ function events_get_all(
$array_search[] = 'lower(ta.alias)'; $array_search[] = 'lower(ta.alias)';
} }
// Disregard repeated whitespaces in search string.
$collapsed_spaces_search = preg_replace('/(&#x20;)+/', '&#x20;', $filter['search']);
$sql_search = ' AND ('; $sql_search = ' AND (';
foreach ($array_search as $key => $field) { foreach ($array_search as $key => $field) {
// Disregard repeated whitespaces in query searched string.
$sql_search .= sprintf( $sql_search .= sprintf(
'%s %s %s like lower("%%%s%%")', '%s REGEXP_REPLACE(%s, "(&#x20;\\s*)+", "&#x20;") %s like lower("%%%s%%")',
($key === 0) ? '' : $nexo, ($key === 0) ? '' : $nexo,
$field, $field,
$not_search, $not_search,
$filter['search'] $collapsed_spaces_search
); );
$sql_search .= ' '; $sql_search .= ' ';
} }

View File

@ -12546,7 +12546,7 @@ function reporting_get_stats_indicators($data, $width=280, $height=20, $html=tru
$table_ind = html_get_predefined_table(); $table_ind = html_get_predefined_table();
$servers = []; $servers = [];
$servers['all'] = (int) db_get_value('COUNT(id_server)', 'tserver'); $servers['all'] = (int) count((servers_get_info() ?? []));
$servers['up'] = (int) servers_check_status(); $servers['up'] = (int) servers_check_status();
$servers['down'] = ($servers['all'] - $servers['up']); $servers['down'] = ($servers['all'] - $servers['up']);
if ($servers['all'] == 0) { if ($servers['all'] == 0) {
@ -12607,7 +12607,7 @@ function reporting_get_stats_indicators_mobile($data, $width=280, $height=20, $h
$table_ind = html_get_predefined_table(); $table_ind = html_get_predefined_table();
$servers = []; $servers = [];
$servers['all'] = (int) db_get_value('COUNT(id_server)', 'tserver'); $servers['all'] = (int) count((servers_get_info() ?? []));
$servers['up'] = (int) servers_check_status(); $servers['up'] = (int) servers_check_status();
$servers['down'] = ($servers['all'] - $servers['up']); $servers['down'] = ($servers['all'] - $servers['up']);
if ($servers['all'] == 0) { if ($servers['all'] == 0) {
@ -16206,7 +16206,8 @@ function reporting_module_histogram_graph($report, $content, $pdf=0)
// Si viene de no iniciado busco el primer dato del modulo y si es de histórico. // Si viene de no iniciado busco el primer dato del modulo y si es de histórico.
$first_utimestamp = false; $first_utimestamp = false;
$search_historydb = false; $search_historydb = false;
$extract_first_data = modules_get_first_date($content['id_agent_module'], 0); // Limitamos el primer dato al rango de tiempo seleccionado por el usuario.
$extract_first_data = modules_get_first_date($content['id_agent_module'], $date_start);
if (empty($extract_first_data) === false) { if (empty($extract_first_data) === false) {
$first_utimestamp = $extract_first_data['first_utimestamp']; $first_utimestamp = $extract_first_data['first_utimestamp'];
$search_historydb = (isset($extract_first_data['search_historydb']) === true) ? $extract_first_data['search_historydb'] : false; $search_historydb = (isset($extract_first_data['search_historydb']) === true) ? $extract_first_data['search_historydb'] : false;
@ -16311,7 +16312,8 @@ function reporting_module_histogram_graph($report, $content, $pdf=0)
$return['data_ok'] = $check_ok; $return['data_ok'] = $check_ok;
$return['data_total'] = $check_total; $return['data_total'] = $check_total;
if ($check_total > 0) { if ($check_total > 0) {
$return['percent_ok'] = (($time_ok * 100) / $content['period']); $percent_ok = (($time_ok * 100) / $content['period']);
$return['percent_ok'] = ($percent_ok > 100) ? 100 : $percent_ok;
} else { } else {
$return['percent_ok'] = 0; $return['percent_ok'] = 0;
} }

View File

@ -615,7 +615,7 @@ function servers_get_rate($avg_interval, $num_modules)
* This function will get all the server information in an array * This function will get all the server information in an array
* or a specific server. * or a specific server.
* *
* @param integer $id_server An optional integer or array of integers * @param integer|array $id_server An optional integer or array of integers
* to select specific servers. * to select specific servers.
* *
* @return mixed False in case the server doesn't exist or an array with info. * @return mixed False in case the server doesn't exist or an array with info.
@ -624,28 +624,63 @@ function servers_get_info($id_server=-1, $sql_limit=-1)
{ {
global $config; global $config;
if (is_array($id_server)) { $select_id = '';
$select_id = ' WHERE id_server IN ('.implode(',', $id_server).')'; if (is_array($id_server) === true) {
$select_id = ' AND id_server IN ('.implode(',', $id_server).')';
} else if ($id_server > 0) { } else if ($id_server > 0) {
$select_id = ' WHERE id_server IN ('.(int) $id_server.')'; $select_id = ' AND id_server IN ('.(int) $id_server.')';
} else {
$select_id = '';
} }
$sql = ' $types_sql = sprintf(
SELECT * ' AND (
FROM tserver '.$select_id.' `server_type` != %d AND
ORDER BY server_type'; `server_type` != %d
)',
SERVER_TYPE_AUTOPROVISION,
SERVER_TYPE_MIGRATION
);
if (is_metaconsole() === true && isset($config['ndbh']) === false) {
$types_sql = sprintf(
' AND (
`server_type` = %d OR
`server_type` = %d OR
`server_type` = %d OR
`server_type` = %d
)',
SERVER_TYPE_AUTOPROVISION,
SERVER_TYPE_EVENT,
SERVER_TYPE_MIGRATION,
SERVER_TYPE_PREDICTION
);
}
$sql = sprintf(
'SELECT *
FROM tserver
WHERE 1=1
%s
%s
ORDER BY server_type',
$select_id,
$types_sql
);
if ($sql_limit !== -1) { if ($sql_limit !== -1) {
$sql = ' $sql = sprintf(
SELECT * 'SELECT *
FROM tserver '.$select_id.' FROM tserver
ORDER BY server_type'.$sql_limit; WHERE 1=1
%s
%s
ORDER BY server_type
%s',
$select_id,
$types_sql,
$sql_limit
);
} }
$result = db_get_all_rows_sql($sql); $result = db_get_all_rows_sql($sql);
$time = get_system_time();
if (empty($result)) { if (empty($result)) {
return false; return false;
@ -1445,6 +1480,12 @@ function servers_get_server_string_name(int $server)
case SERVER_TYPE_NCM: case SERVER_TYPE_NCM:
return __('NCM server'); return __('NCM server');
case SERVER_TYPE_AUTOPROVISION:
return __('Autoprovision server');
case SERVER_TYPE_MIGRATION:
return __('Migration server');
default: default:
return __('N/A'); return __('N/A');
} }

View File

@ -472,14 +472,124 @@ function create_module_packet_lost($id_agent, $id_group, $ip_target)
/** /**
* Create module packet lost and return module id. * Create module packet lost and return module id.
* *
* @param string $ip_target Ip and red mask. * @param string $ip_target Ip and red mask.
* @param string $snmp_communities SNMP Communities to use in recon task.
* @param array $wmi_credentials WMI Credentials to use in recon task.
* @param array $rcmd_credentials RCMD Credentials to use in recon task.
* *
* @return interger Module id. * @return interger Module id.
*/ */
function create_net_scan($ip_target) function create_net_scan($ip_target, $snmp_version, $snmp_communities, $wmi_credentials, $rcmd_credentials)
{ {
global $config; global $config;
include_once $config['homedir'].'/godmode/wizards/HostDevices.class.php'; include_once $config['homedir'].'/godmode/wizards/HostDevices.class.php';
include_once $config['homedir'].'/include/functions_groups.php';
$group_name = 'AutoDiscovery';
$id_group = db_get_value('id_grupo', 'tgrupo', 'nombre', io_safe_input($group_name));
if (!($id_group > 0)) {
$id_group = groups_create_group(
io_safe_input($group_name),
[
'icon' => 'applications.png',
'description' => '',
'contact' => '',
'other' => '',
]
);
if (!($id_group > 0)) {
$id_group = 10;
}
}
$auth_strings = [];
$default_templates = [
io_safe_input('Linux System'),
io_safe_input('Windows System'),
io_safe_input('Windows Hardware'),
io_safe_input('Network Management'),
];
$default_templates_ids = db_get_all_rows_sql(
'SELECT id_np
FROM tnetwork_profile
WHERE name IN ('.implode(
',',
array_map(
function ($template) {
return "'".$template."'";
},
$default_templates
)
).')
ORDER BY name'
);
$id_base = 'autoDiscovery-WMI-';
$id = 0;
foreach ($wmi_credentials as $wmi) {
$id++;
$identifier = $id_base.$id;
while (db_get_value_sql(
sprintf(
'SELECT COUNT(*) AS count FROM tcredential_store WHERE identifier = "%s"',
$identifier
)
) > 0) {
$id++;
$identifier = $id_base.$id;
}
$storeKey = db_process_sql_insert(
'tcredential_store',
[
'identifier' => $identifier,
'id_group' => $id_group,
'product' => 'WMI',
'username' => $wmi['credential']['user'],
'password' => $wmi['credential']['pass'],
'extra_1' => $wmi['credential']['namespace'],
]
);
if ($storeKey !== false) {
$auth_strings[] = $identifier;
}
}
$id_base = 'autoDiscovery-RCMD-';
$id = 0;
foreach ($rcmd_credentials as $rcmd) {
$id++;
$identifier = $id_base.$id;
while (db_get_value_sql(
sprintf(
'SELECT COUNT(*) AS count FROM tcredential_store WHERE identifier = "%s"',
$identifier
)
) > 0) {
$id++;
$identifier = $id_base.$id;
}
$storeKey = db_process_sql_insert(
'tcredential_store',
[
'identifier' => $identifier,
'id_group' => $id_group,
'product' => 'CUSTOM',
'username' => $rcmd['credential']['user'],
'password' => $rcmd['credential']['pass'],
]
);
if ($storeKey !== false) {
$auth_strings[] = $identifier;
}
}
$HostDevices = new HostDevices(1); $HostDevices = new HostDevices(1);
$id_recon_server = db_get_row_filter('tserver', ['server_type' => SERVER_TYPE_DISCOVERY], 'id_server')['id_server']; $id_recon_server = db_get_row_filter('tserver', ['server_type' => SERVER_TYPE_DISCOVERY], 'id_server')['id_server'];
@ -493,7 +603,7 @@ function create_net_scan($ip_target)
'taskname' => __('Basic network'), 'taskname' => __('Basic network'),
'id_recon_server' => $id_recon_server, 'id_recon_server' => $id_recon_server,
'network' => $ip_target, 'network' => $ip_target,
'id_group' => '8', 'id_group' => $id_group,
'comment' => __('Created on welcome'), 'comment' => __('Created on welcome'),
]; ];
$task_created = $HostDevices->parseNetScan(); $task_created = $HostDevices->parseNetScan();
@ -504,13 +614,13 @@ function create_net_scan($ip_target)
'page' => '2', 'page' => '2',
'recon_ports' => '', 'recon_ports' => '',
'auto_monitor' => 'on', 'auto_monitor' => 'on',
'id_network_profile' => ['0' => '2'], 'id_network_profile' => array_column($default_templates_ids, 'id_np'),
'review_results' => 'on', 'review_results' => 'on',
'review_limited' => '0', 'review_limited' => '0',
'snmp_enabled' => 'on', 'snmp_enabled' => 'on',
'snmp_version' => '1', 'snmp_version' => $snmp_version,
'snmp_skip_non_enabled_ifs' => 'on', 'snmp_skip_non_enabled_ifs' => 'on',
'community' => '', 'community' => $snmp_communities,
'snmp_context' => '', 'snmp_context' => '',
'snmp_auth_user' => '', 'snmp_auth_user' => '',
'snmp_security_level' => 'authNoPriv', 'snmp_security_level' => 'authNoPriv',
@ -523,6 +633,9 @@ function create_net_scan($ip_target)
'parent_detection' => 'on', 'parent_detection' => 'on',
'parent_recursion' => 'on', 'parent_recursion' => 'on',
'vlan_enabled' => 'on', 'vlan_enabled' => 'on',
'wmi_enabled' => 'on',
'rcmd_enabled' => 'on',
'auth_strings' => $auth_strings,
]; ];
$task_final_created = $HostDevicesFinal->parseNetScan(); $task_final_created = $HostDevicesFinal->parseNetScan();

View File

@ -253,30 +253,35 @@ function createDroppableZones(
) )
); );
// Create remove button.
if ( if (
graphDiv $("#hidden-section").val() ===
.children() "operation/reporting/graph_analytics"
.children()
.hasClass("parent_graph") === true
) { ) {
graphDiv // Create remove button.
.children() if (
.children() graphDiv
.children(":first-child") .children()
.prepend( .children()
$( .hasClass("parent_graph") === true
'<img src="images/delete.svg" class="remove-graph-analytics" onclick="removeGraph(this);">' ) {
) graphDiv
); .children()
} else { .children()
graphDiv .children(":first-child")
.children() .prepend(
.append( $(
$( '<img src="images/delete.svg" class="remove-graph-analytics" onclick="removeGraph(this);">'
'<img src="images/delete.svg" class="remove-graph-analytics" onclick="removeGraph(this);">' )
) );
); } else {
graphDiv
.children()
.append(
$(
'<img src="images/delete.svg" class="remove-graph-analytics" onclick="removeGraph(this);">'
)
);
}
} }
} }
} }
@ -753,7 +758,7 @@ $("#button-share-modal").click(function(e) {
window.open( window.open(
configHomeurl + configHomeurl +
"/operation/reporting/graph_analytics_public.php?" + "operation/reporting/graph_analytics_public.php?" +
queryParams queryParams
); );
}); });

View File

@ -1266,16 +1266,18 @@ class Manager implements PublicLogin
} }
if (empty($cells) === false) { if (empty($cells) === false) {
$result = array_reduce( $result = array_values(
$cells, array_reduce(
function ($carry, $item) { $cells,
$carry[$item['order']]['id'] = $item['id']; function ($carry, $item) {
$carry[$item['order']]['position'] = $item['position']; $carry[$item['order']]['id'] = $item['id'];
$carry[$item['order']]['widgetId'] = $item['id_widget']; $carry[$item['order']]['position'] = $item['position'];
$carry[$item['order']]['widgetId'] = $item['id_widget'];
return $carry; return $carry;
}, },
[] []
)
); );
} }

View File

@ -108,9 +108,7 @@
cursor: default; cursor: default;
font-size: 14px; font-size: 14px;
} }
.ui-front {
z-index: 9999;
}
.ui-menu { .ui-menu {
list-style: none; list-style: none;
padding: 1px; padding: 1px;

View File

@ -1945,7 +1945,7 @@ div.title_line {
#menu_tab_frame_view_bc { #menu_tab_frame_view_bc {
position: sticky; position: sticky;
top: 61px; top: 61px;
z-index: 2; z-index: 3;
display: flex; display: flex;
align-items: flex-end; align-items: flex-end;
justify-content: space-between; justify-content: space-between;
@ -10954,6 +10954,18 @@ div.status_dot {
-webkit-mask: url(../../images/status_dot.svg) no-repeat center / contain; -webkit-mask: url(../../images/status_dot.svg) no-repeat center / contain;
} }
button div.import {
mask: url(../../images/import.svg) no-repeat center / contain;
-webkit-mask: url(../../images/import.svg) no-repeat center / contain;
height: 1.5rem;
}
button div.export {
mask: url(../../images/export.svg) no-repeat center / contain;
-webkit-mask: url(../../images/export.svg) no-repeat center / contain;
height: 1.5rem;
}
.status_dot.ok { .status_dot.ok {
background-color: #82b92e; background-color: #82b92e;
} }
@ -13504,3 +13516,79 @@ tr.shown td.details-control {
mask: url(../../images/minimizar.svg) no-repeat right / contain; mask: url(../../images/minimizar.svg) no-repeat right / contain;
-webkit-mask: url(../../images/minimizar.svg) no-repeat right / contain; -webkit-mask: url(../../images/minimizar.svg) no-repeat right / contain;
} }
#modules-toggle > .modules > .white-box-content div {
z-index: 1 !important;
}
/* Import/export */
.div-import-export {
display: flex;
flex-direction: row;
}
.form-import {
width: 48%;
height: auto;
margin-right: 40px;
}
.div-import {
background-color: #ffffff;
border: 1px solid #e5e9ed;
border-radius: 8px;
width: 100%;
height: 180px;
display: flex;
flex-direction: row;
align-items: normal;
padding-top: 20px;
padding-left: 20px;
margin-bottom: 20px;
}
.div-export {
background-color: #ffffff;
border: 1px solid #e5e9ed;
border-radius: 8px;
width: 48%;
height: 180px;
display: flex;
flex-direction: row;
align-items: normal;
padding-top: 20px;
padding-left: 20px;
margin-bottom: 20px;
}
@media (max-width: 1300px) {
.div-import-export {
display: flex;
flex-direction: column;
}
.div-export {
width: calc(100% - 20px);
}
.form-import {
width: calc(100% - 20px);
}
}
.input-file-style::file-selector-button {
background-color: #ffffff;
border: 1px solid #979797;
border-radius: 4px;
width: 120px;
height: 32px;
}
button.disabled {
background: #c0ccdc !important;
border: 0px;
}
.ui-draggable-handle {
z-index: 2 !important;
}

View File

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

View File

@ -116,9 +116,14 @@ if (empty($agent['os_version']) !== true) {
$agent['os_version'] = io_safe_output($agent['os_version']); $agent['os_version'] = io_safe_output($agent['os_version']);
if (strpos($agent['os_version'], '(') !== false) { if (strpos($agent['os_version'], '(') !== false) {
$os_name = preg_split('/[0-9]|[\(]/', $agent['os_version'])[0]; $os_name = preg_split('/[0-9]|[\(]/', $agent['os_version'])[0];
$os_version = explode($os_name, explode('(', $agent['os_version'])[0])[1]; if (strlen($os_name) === 0) {
$os_version_name = preg_split('/[\(]|[\)]/', $agent['os_version']); $os_name = get_os_name((int) $agent['id_os']);
$os_agent_text = $os_version.' ('.$os_version_name[1].')'; $os_agent_text = $agent['os_version'];
} else {
$os_version = explode($os_name, explode('(', $agent['os_version'])[0])[1];
$os_version_name = preg_split('/[\(]|[\)]/', $agent['os_version']);
$os_agent_text = $os_version.' ('.$os_version_name[1].')';
}
} else { } else {
$os_name = preg_split('/[0-9]/', $agent['os_version'])[0]; $os_name = preg_split('/[0-9]/', $agent['os_version'])[0];
$os_agent_text = $agent['os_version']; $os_agent_text = $agent['os_version'];

View File

@ -811,6 +811,7 @@ ui_print_standard_header(
$tab_new, $tab_new,
$tab_pause_realtime, $tab_pause_realtime,
$tab_start_realtime, $tab_start_realtime,
html_print_input_hidden('section', get_parameter('sec2'), true),
], ],
[ [
[ [
@ -885,7 +886,7 @@ $left_content .= '
'modules-toggle', 'modules-toggle',
true, true,
true, true,
'', 'modules',
'white-box-content', 'white-box-content',
'box-flat white_table_graph', 'box-flat white_table_graph',
'images/arrow@svg.svg', 'images/arrow@svg.svg',

View File

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

View File

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

View File

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

View File

@ -239,7 +239,7 @@ help () {
# Script banner at start # Script banner at start
echo " " echo " "
echo "Pandora FMS Console Installer $PI_VERSION $PI_BUILD (c) 2008-2015 ArticaST" echo "Pandora FMS Console Installer $PI_VERSION $PI_BUILD (c) 2008-2024 PandoraFMS"
echo "This program is licensed under GPL2 Terms. http://pandorafms.com" echo "This program is licensed under GPL2 Terms. http://pandorafms.com"
echo " " echo " "

View File

@ -2833,7 +2833,8 @@ INSERT INTO `twidget` (`id`,`class_name`,`unique_name`,`description`,`options`,`
(45,'WuxStatsWidget','wux_transaction_stats','WUX transaction stats','','wux_transaction_stats.php'), (45,'WuxStatsWidget','wux_transaction_stats','WUX transaction stats','','wux_transaction_stats.php'),
(46,'SecurityHardening','security_hardening','Security Hardening','','security_hardening.php'), (46,'SecurityHardening','security_hardening','Security Hardening','','security_hardening.php'),
(47,'ServiceLevelWidget','service_level','Service Level','','service_level.php'), (47,'ServiceLevelWidget','service_level','Service Level','','service_level.php'),
(48,'GisMap','GisMap','Gis map','','GisMap.php'); (48,'GisMap','GisMap','Gis map','','GisMap.php'),
(49,'ITSMIncidences','ITSMIncidences','Pandora ITSM tickets','','ITSMIncidences.php');
INSERT INTO `tmap` (`id`,`id_group`,`id_user`,`type`,`subtype`,`name`,`description`,`height`,`width`,`center_x`,`center_y`,`background`,`background_options`,`source_period`,`source`,`source_data`,`generation_method`,`generated`,`filter`,`id_group_map`,`refresh_time`) VALUES (1,'0','admin',0,0,'Sample&#x20;dynamic&#x20;map','This&#x20;is&#x20;a&#x20;sample&#x20;dynamic&#x20;map.',900,900,0,0,'',0,60,0,'0',6,0,'{\"dont_show_subgroups\":0,\"node_radius\":40,\"x_offs\":\"0\",\"y_offs\":\"0\",\"z_dash\":\"1\",\"node_sep\":\"0.25\",\"rank_sep\":\"0.5\",\"mindist\":\"1\",\"kval\":\"0.3\"}',0,300); INSERT INTO `tmap` (`id`,`id_group`,`id_user`,`type`,`subtype`,`name`,`description`,`height`,`width`,`center_x`,`center_y`,`background`,`background_options`,`source_period`,`source`,`source_data`,`generation_method`,`generated`,`filter`,`id_group_map`,`refresh_time`) VALUES (1,'0','admin',0,0,'Sample&#x20;dynamic&#x20;map','This&#x20;is&#x20;a&#x20;sample&#x20;dynamic&#x20;map.',900,900,0,0,'',0,60,0,'0',6,0,'{\"dont_show_subgroups\":0,\"node_radius\":40,\"x_offs\":\"0\",\"y_offs\":\"0\",\"z_dash\":\"1\",\"node_sep\":\"0.25\",\"rank_sep\":\"0.5\",\"mindist\":\"1\",\"kval\":\"0.3\"}',0,300);
INSERT INTO `treport` (`id_report`,`id_user`,`name`,`description`,`private`,`id_group`,`custom_logo`,`header`,`first_page`,`footer`,`custom_font`,`id_template`,`id_group_edit`,`metaconsole`,`non_interactive`,`hidden`,`orientation`,`cover_page_render`,`index_render`) VALUES (1,'admin','Sample&#x20;report&#x20;#1','This&#x20;is&#x20;a&#x20;sample&#x20;report,&#x20;just&#x20;to&#x20;show&#x20;you&#x20;some&#x20;general&#x20;report&#x20;items.',0,0,NULL,NULL,'&lt;p&#x20;style=&quot;text-align:&#x20;center;&quot;&gt;&amp;nbsp;&lt;/p&gt;&#x0d;&#x0a;&lt;p&#x20;style=&quot;text-align:&#x20;center;&quot;&gt;&amp;nbsp;&lt;/p&gt;&#x0d;&#x0a;&lt;p&#x20;style=&quot;text-align:&#x20;center;&quot;&gt;&amp;nbsp;&lt;/p&gt;&#x0d;&#x0a;&lt;p&#x20;style=&quot;text-align:&#x20;center;&quot;&gt;&amp;nbsp;&lt;/p&gt;&#x0d;&#x0a;&lt;p&#x20;style=&quot;text-align:&#x20;center;&quot;&gt;&amp;nbsp;&lt;/p&gt;&#x0d;&#x0a;&lt;p&#x20;style=&quot;text-align:&#x20;center;&quot;&gt;&amp;nbsp;&lt;/p&gt;&#x0d;&#x0a;&lt;p&#x20;style=&quot;text-align:&#x20;center;&quot;&gt;&amp;nbsp;&lt;/p&gt;&#x0d;&#x0a;&lt;p&#x20;style=&quot;text-align:&#x20;center;&quot;&gt;&lt;img&#x20;src=&quot;http://localhost/pandora_console//images/pandora_report_logo.png&quot;&#x20;alt=&quot;&quot;&#x20;width=&quot;800&quot;&#x20;/&gt;&lt;/p&gt;&#x0d;&#x0a;&lt;p&#x20;style=&quot;text-align:&#x20;center;&quot;&gt;&amp;nbsp;&lt;/p&gt;&#x0d;&#x0a;&lt;p&#x20;style=&quot;text-align:&#x20;center;&quot;&gt;&lt;span&#x20;style=&quot;font-size:&#x20;xx-large;&quot;&gt;&#40;_REPORT_NAME_&#41;&lt;/span&gt;&lt;/p&gt;&#x0d;&#x0a;&lt;p&#x20;style=&quot;text-align:&#x20;center;&quot;&gt;&lt;span&#x20;style=&quot;font-size:&#x20;large;&quot;&gt;&#40;_DATETIME_&#41;&lt;/span&gt;&lt;/p&gt;',NULL,'Lato-Regular.ttf',0,0,0,0,0,'vertical',1,1); INSERT INTO `treport` (`id_report`,`id_user`,`name`,`description`,`private`,`id_group`,`custom_logo`,`header`,`first_page`,`footer`,`custom_font`,`id_template`,`id_group_edit`,`metaconsole`,`non_interactive`,`hidden`,`orientation`,`cover_page_render`,`index_render`) VALUES (1,'admin','Sample&#x20;report&#x20;#1','This&#x20;is&#x20;a&#x20;sample&#x20;report,&#x20;just&#x20;to&#x20;show&#x20;you&#x20;some&#x20;general&#x20;report&#x20;items.',0,0,NULL,NULL,'&lt;p&#x20;style=&quot;text-align:&#x20;center;&quot;&gt;&amp;nbsp;&lt;/p&gt;&#x0d;&#x0a;&lt;p&#x20;style=&quot;text-align:&#x20;center;&quot;&gt;&amp;nbsp;&lt;/p&gt;&#x0d;&#x0a;&lt;p&#x20;style=&quot;text-align:&#x20;center;&quot;&gt;&amp;nbsp;&lt;/p&gt;&#x0d;&#x0a;&lt;p&#x20;style=&quot;text-align:&#x20;center;&quot;&gt;&amp;nbsp;&lt;/p&gt;&#x0d;&#x0a;&lt;p&#x20;style=&quot;text-align:&#x20;center;&quot;&gt;&amp;nbsp;&lt;/p&gt;&#x0d;&#x0a;&lt;p&#x20;style=&quot;text-align:&#x20;center;&quot;&gt;&amp;nbsp;&lt;/p&gt;&#x0d;&#x0a;&lt;p&#x20;style=&quot;text-align:&#x20;center;&quot;&gt;&amp;nbsp;&lt;/p&gt;&#x0d;&#x0a;&lt;p&#x20;style=&quot;text-align:&#x20;center;&quot;&gt;&lt;img&#x20;src=&quot;http://localhost/pandora_console//images/pandora_report_logo.png&quot;&#x20;alt=&quot;&quot;&#x20;width=&quot;800&quot;&#x20;/&gt;&lt;/p&gt;&#x0d;&#x0a;&lt;p&#x20;style=&quot;text-align:&#x20;center;&quot;&gt;&amp;nbsp;&lt;/p&gt;&#x0d;&#x0a;&lt;p&#x20;style=&quot;text-align:&#x20;center;&quot;&gt;&lt;span&#x20;style=&quot;font-size:&#x20;xx-large;&quot;&gt;&#40;_REPORT_NAME_&#41;&lt;/span&gt;&lt;/p&gt;&#x0d;&#x0a;&lt;p&#x20;style=&quot;text-align:&#x20;center;&quot;&gt;&lt;span&#x20;style=&quot;font-size:&#x20;large;&quot;&gt;&#40;_DATETIME_&#41;&lt;/span&gt;&lt;/p&gt;',NULL,'Lato-Regular.ttf',0,0,0,0,0,'vertical',1,1);
@ -2884,7 +2885,7 @@ SET @short_name = 'pandorafms.mysql';
SET @name = 'MySQL'; SET @name = 'MySQL';
SET @section = 'app'; SET @section = 'app';
SET @description = 'Monitor&#x20;MySQL&#x20;databases'; SET @description = 'Monitor&#x20;MySQL&#x20;databases';
SET @version = '1.0'; SET @version = '1.1';
INSERT IGNORE INTO `tdiscovery_apps` (`id_app`, `short_name`, `name`, `section`, `description`, `version`) VALUES ('', @short_name, @name, @section, @description, @version); 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; SELECT @id_app := `id_app` FROM `tdiscovery_apps` WHERE `short_name` = @short_name;

View File

@ -132,6 +132,15 @@ $product_name = get_product_name(); ?>
<script type="text/javascript"> <script type="text/javascript">
var clientMode = '<?php echo $mode; ?>'; var clientMode = '<?php echo $mode; ?>';
var ajaxPage = '<?php echo $ajaxPage; ?>'; var ajaxPage = '<?php echo $ajaxPage; ?>';
function notDefaultEmails(email) {
if (email.toLowerCase() === 'pandora@pandorafms.com' || email.toLowerCase() === 'admin@example.com') {
return false;
}
return true;
}
$(document).ready(function() { $(document).ready(function() {
$("#registration_wizard").dialog({ $("#registration_wizard").dialog({
resizable: true, resizable: true,
@ -188,7 +197,7 @@ $("#submit-cancel_registration").click(function(e) {
}); });
$("#submit-register").click(function() { $("#submit-register").click(function() {
if (validateEmail($('#registration-email').val())) { if (validateEmail($('#registration-email').val()) && notDefaultEmails($('#registration-email').val())) {
// All fields are required. // All fields are required.
ajax({ ajax({
url: "<?php echo $ajax; ?>", url: "<?php echo $ajax; ?>",

View File

@ -2,7 +2,7 @@
namespace Artica\PHPChartJS; namespace Artica\PHPChartJS;
use Halfpastfour\Collection\CollectionInterface; use Artica\PHPChartJS\Collection\CollectionInterface;
/** /**
* Interface ChartInterface * Interface ChartInterface

View File

@ -0,0 +1,123 @@
<?php
namespace Artica\PHPChartJS\Collection;
use Artica\PHPChartJS\Collection\Collection;
/**
* Class ArrayAccess
* @package Artica\PHPChartJS\Collection\Collection
*/
class ArrayAccess extends Collection implements ArrayAccessInterface
{
/**
* Check if the given offset exists in the set of data.
*
* @param mixed $offset The offset to check.
*
* @return bool
*/
public function offsetExists( $offset )
{
// Can not retrieve a key based on a value other than a string, integer or boolean
if( !is_string( $offset ) && !is_int( $offset ) && !is_bool( $offset ) ) {
return false;
}
return array_key_exists( $offset, $this->data );
}
/**
* Get a value from the given offset.
*
* @param mixed $offset The offset to get the value from.
*
* @return mixed
*/
public function offsetGet( $offset )
{
if( $this->offsetExists( $offset ) ) {
return $this->data[ $offset ];
}
return null;
}
/**
* Set a value at the given offset.
*
* @param mixed $offset The offset to set the value at.
* @param mixed $value The value to set.
*
* @return $this
*/
public function offsetSet( $offset, $value )
{
$this->data[ $offset ] = $value;
return $this;
}
/**
* Unset a value at the given offset. Does nothing if the offset is not found.
*
* @param mixed $offset The offset to unset the value from.
*
* @return $this
*/
public function offsetUnset( $offset )
{
if( $this->offsetExists( $offset ) ) {
unset( $this->data[ $offset ] );
}
return $this;
}
/**
* Provide a callback to use for sorting the data.
*
* @param \Closure $callback The callback to be used.
*
* @return $this
*/
public function usort( \Closure $callback )
{
usort( $this->data, $callback );
reset( $this->data );
return $this;
}
/**
* Sort the data by key.
*
* @param int $sortFlags Optional flags to provide to ksort.
*
* @return $this
*/
public function ksort( $sortFlags = null )
{
ksort( $this->data, $sortFlags );
return $this;
}
/**
* Count the rows of data the collection contains.
*
* @return int
*/
public function count()
{
return count( $this->data );
}
/**
* @return ArrayIterator
*/
public function getIterator()
{
return new ArrayIterator( $this );
}
}

View File

@ -0,0 +1,42 @@
<?php
namespace Artica\PHPChartJS\Collection;
/**
* Interface ArrayAccessInterface
* @package Artica\PHPChartJS\Collection\Collection
*/
interface ArrayAccessInterface
{
/**
* Should set the data for the collection and return the previous set of data.
*
* @param array $data
*
* @return array
*/
public function exchangeArray( array $data );
/**
* Should perform the php function usort on the dataset.
*
* @param \Closure $callback
*
* @return $this
*/
public function usort( \Closure $callback );
/**
* Should perform the php function ksort on the dataset.
*
* @return $this
*/
public function ksort();
/**
* Count the rows of data the collection contains.
*
* @return int
*/
public function count();
}

View File

@ -0,0 +1,17 @@
<?php
namespace Artica\PHPChartJS\Collection;
/**
* Interface ArraySerializableInterface
* @package Artica\PHPChartJS\Collection
*/
interface ArraySerializableInterface
{
/**
* Should return an array containing all values.
*
* @return array
*/
public function getArrayCopy();
}

View File

@ -0,0 +1,114 @@
<?php
namespace Artica\PHPChartJS\Collection;
/**
* Class Collection
* @package Artica\PHPChartJS\Collection
*/
abstract class Collection implements CollectionInterface, ArraySerializableInterface
{
/**
* The internal set of data.
*
* @var array
*/
protected $data = [];
/**
* Collection constructor.
*
* @param array|null $data
*/
public function __construct( array $data = null )
{
if( !is_null( $data ) ) {
$this->data = $data;
}
}
/**
* Add a value to the beginning of the set of data. This will change existing keys.
*
* @param mixed $value The value to prepend.
*
* @return $this
*/
public function prepend( $value )
{
array_unshift( $this->data, $value );
return $this;
}
/**
* Add a value to the end of the set of data.
*
* @param mixed $value The value to append.
*
* @return $this
*/
public function append( $value )
{
array_push( $this->data, $value );
return $this;
}
/**
* Shift an element off of the left of the collection.
*
* @return mixed
*/
public function trimLeft()
{
return array_shift( $this->data );
}
/**
* Pop an element off of the right of the collection.
*
* @return mixed
*/
public function trimRight()
{
return array_pop( $this->data );
}
/**
* Should return an array containing all values.
*
* @return array
*/
public function getArrayCopy()
{
return $this->data;
}
/**
* Should set the data for the collection and return the previous set of data.
*
* @param array $data
*
* @return array
*/
public function exchangeArray( array $data )
{
// Gather return data
$returnArray = $this->getArrayCopy();
// Set the new data
$this->data = $data;
return $returnArray;
}
/**
* Get (and create if not exists) an iterator.
*
* @return \ArrayIterator
*/
public function getIterator()
{
return new \ArrayIterator( $this->data );
}
}

View File

@ -0,0 +1,23 @@
<?php
namespace Artica\PHPChartJS\Collection;
/**
* Interface CollectionInterface
*/
interface CollectionInterface
{
/**
* @param mixed $value
*
* @return $this
*/
public function append( $value );
/**
* @param mixed $value
*
* @return $this
*/
public function prepend( $value );
}

View File

@ -2,7 +2,7 @@
namespace Artica\PHPChartJS\Collection; namespace Artica\PHPChartJS\Collection;
use Halfpastfour\Collection\Collection\ArrayAccess; use Artica\PHPChartJS\Collection\ArrayAccess;
use Artica\PHPChartJS\Delegate; use Artica\PHPChartJS\Delegate;
use JsonSerializable as JsonSerializableInterface; use JsonSerializable as JsonSerializableInterface;

View File

@ -2,7 +2,7 @@
namespace Artica\PHPChartJS; namespace Artica\PHPChartJS;
use Halfpastfour\Collection\Collection\ArrayAccess; use Artica\PHPChartJS\Collection\ArrayAccess;
use JsonSerializable; use JsonSerializable;
/** /**

View File

@ -2,7 +2,7 @@
namespace Artica\PHPChartJS; namespace Artica\PHPChartJS;
use Halfpastfour\Collection\Collection\ArrayAccess; use Artica\PHPChartJS\Collection\ArrayAccess;
use JsonSerializable; use JsonSerializable;
/** /**

View File

@ -2,7 +2,7 @@
namespace Artica\PHPChartJS\Options\Scales; namespace Artica\PHPChartJS\Options\Scales;
use Halfpastfour\Collection\Collection\ArrayAccess; use Artica\PHPChartJS\Collection\ArrayAccess;
use Artica\PHPChartJS\ArraySerializableInterface; use Artica\PHPChartJS\ArraySerializableInterface;
use JsonSerializable; use JsonSerializable;

View File

@ -2,7 +2,7 @@
namespace Artica\PHPChartJS\Options\Scales; namespace Artica\PHPChartJS\Options\Scales;
use Halfpastfour\Collection\Collection\ArrayAccess; use Artica\PHPChartJS\Collection\ArrayAccess;
use Artica\PHPChartJS\ArraySerializableInterface; use Artica\PHPChartJS\ArraySerializableInterface;
use JsonSerializable; use JsonSerializable;

View File

@ -2,7 +2,7 @@
namespace Artica\PHPChartJS\Options\Scales; namespace Artica\PHPChartJS\Options\Scales;
use Halfpastfour\Collection\Collection\ArrayAccess; use Artica\PHPChartJS\Collection\ArrayAccess;
use Artica\PHPChartJS\ArraySerializableInterface; use Artica\PHPChartJS\ArraySerializableInterface;
use JsonSerializable; use JsonSerializable;

View File

@ -2,7 +2,7 @@
namespace Artica\PHPChartJS; namespace Artica\PHPChartJS;
use Halfpastfour\Collection\Collection\ArrayAccess; use Artica\PHPChartJS\Collection\ArrayAccess;
use JsonSerializable; use JsonSerializable;
/** /**

View File

@ -2,7 +2,7 @@
namespace Test; namespace Test;
use Halfpastfour\Collection\Collection\ArrayAccess; use Artica\PHPChartJS\Collection\ArrayAccess;
use Artica\PHPChartJS\ArraySerializableInterface; use Artica\PHPChartJS\ArraySerializableInterface;
use Artica\PHPChartJS\Chart\Bar; use Artica\PHPChartJS\Chart\Bar;
use Artica\PHPChartJS\ChartInterface; use Artica\PHPChartJS\ChartInterface;

View File

@ -0,0 +1,400 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
EXCHANGE MAIL PLUGIN
Author: Alejandro Sanchez Carrion
Copyright: Copyright 2024, PandoraFMS
Maintainer: Operations Department
Status: Production
Version: 1.0
"""
from exchangelib import Credentials,Configuration, Account, DELEGATE, OAUTH2, IMPERSONATION,Message, Mailbox
from exchangelib import OAuth2Credentials
from exchangelib.version import Version, EXCHANGE_O365
from exchangelib.protocol import BaseProtocol, NoVerifyHTTPAdapter
BaseProtocol.HTTP_ADAPTER_CLS = NoVerifyHTTPAdapter
import urllib3
urllib3.disable_warnings()
import pandoraPlugintools as ppt
import argparse,sys,re,json,os,traceback
from datetime import datetime,timedelta,timezone
__author__ = "Alejandro Sánchez Carrion"
__copyright__ = "Copyright 2022, PandoraFMS"
__maintainer__ = "Operations department"
__status__ = "Production"
__version__= '1.0'
info = f"""
Pandora FMS Exchange Mail
Version = 1.0
Description = This plugin can search for matches in your mail and find the number of matches, as well as list them.
Manual execution
./exchange_mail \
--auth <oauth> \
--server <server> \
--smtp_address <smtp_address> \
--client_id <client_id> \
--tenant_id <tenant_id> \
--secret <secret> \
[--user <user>] \
[--password <password>] \
[--subject <subject>] \
[--sender <sender>] \
[--date_start <date_start>] \
[--date_end <date_end>] \
[--mail_list <mail_list>] \
[--module_prefix <module_prefix>] \
[--agent_prefix <agent_prefix>] \
[--group <group>] \
[--interval <interval>] \
[--temporal <temporal>] \
[--data_dir <data_dir>] \
[--transfer_mode <transfer_mode>] \
[--tentacle_client <tentacle_client>] \
[--tentacle_opts <tentacle_opts>] \
[--tentacle_port <tentacle_port>] \
[--tentacle_address <tentacle_address>] \
[--log_file <log_file>]
there are three parameters with which to filter the mails
subject
email
date
You can use only one and filter from that or use the following combinations:
subject
subject + sender
subject + sender + date
"""
parser = argparse.ArgumentParser(description= info, formatter_class=argparse.RawTextHelpFormatter)
parser.add_argument('--server' , help="Server name" , default = "outlook.office365.com" , type=str)
parser.add_argument('--smtp_address' , help="SMTP address" , required = True , type=str)
parser.add_argument('--user' , help="User name" , default="" , type=str)
parser.add_argument('--password' , help="Password" , default="" , type=str)
parser.add_argument('--client_id' , help="Client_id" , default="" , type=str)
parser.add_argument('--tenant_id' , help="Tenant_id" , default="" , type=str)
parser.add_argument('--secret' , help="Secret" , default="" , type=str)
parser.add_argument('--subject' , help="Select match in subjects" , default=None , type=str)
parser.add_argument('--sender' , help="Select coincidences from email" , default=None , type=str)
parser.add_argument('--date_start' , help="Search for matches from a certain date,Each date must be separated by a hyphen and in quotation marks, with the following format: 'year-month-day-hour-minute'. example: '2021-1-12-0-0'", default=None, type=str)
parser.add_argument('--date_end' , help="Search for matches from a certain date,Each date must be separated by a hyphen and in quotation marks, with the following format: 'year-month-day-hour-minute'. example: '2021-6-12-0-0'", default=None, type=str)
parser.add_argument('--mail_list' , help='List mail coincidences' , default=0 ,type=int )
parser.add_argument('--module_prefix' , help='Prefix for the modules. Example : meraki.' , default="" , type=str )
parser.add_argument('--agent_prefix' , help='Prefix for the agents. Example : meraki.' , default="" , type=str )
parser.add_argument('--group' , help='PandoraFMS destination group (default exchange)' , default='' , type=str )
parser.add_argument('--interval' , help='Agent monitoring interval' , default=300 , type=int )
parser.add_argument('--temporal' , help='PandoraFMS temporal dir' , default='/tmp' , type=str )
parser.add_argument('--data_dir' , help='PandoraFMS data dir ' , default='/var/spool/pandora/data_in/' , type=str )
parser.add_argument('--transfer_mode' , help='Data transfer mode, local or tentacle' , default="tentacle" , type=str )
parser.add_argument('--tentacle_client' , help='Tentacle client path, by default tentacle_client' , default="tentacle_client" , type=str )
parser.add_argument('--tentacle_opts' , help='Additional tentacle options' , default="" , type=str )
parser.add_argument('--tentacle_port' , help='Tentacle port' , default=41121 , type=int )
parser.add_argument('--tentacle_address' , help='Tentacle adress' , default="127.0.0.1" , type=str )
parser.add_argument('--log_file' , help='Log file path' , default='/tmp/exchangemail_logfile.txt' , type=str )
parser.add_argument('--auth', choices=['basic', 'oauth'], help='Auth type', required=True)
args = parser.parse_args()
###############
## VARIABLES ##
###############
server = args.server
smtp_address = args.smtp_address
user = args.user
password = args.password
client_id = args.client_id
tenant_id = args.tenant_id
secret = args.secret
subject = args.subject
sender = args.sender
date_start = args.date_start
date_end = args.date_end
mail_list = args.mail_list
module_prefix = args.module_prefix
agent_prefix = args.agent_prefix
temporal = args.temporal
group = args.group
interval = args.interval
data_dir = args.data_dir
transfer_mode = args.transfer_mode
tentacle_address = args.tentacle_address
tentacle_port = args.tentacle_port
tentacle_client = args.tentacle_client
tentacle_opts = args.tentacle_opts
log_file = args.log_file
###############
## FUNCTIONS ##
###############
def Oauth_session(credentials):
"""
Creates an OAuth session with an Exchange server using the provided credentials.
Args:
credentials (Credentials): Credentials object containing information for OAuth authentication.
Returns:
Account: An Account object representing the OAuth session with the Exchange server.
"""
try:
config = Configuration(server=server,credentials=credentials, auth_type=OAUTH2,version=Version(build=EXCHANGE_O365),)
account = Account(
smtp_address,
credentials=credentials,
config=config,
autodiscover=False,
access_type=IMPERSONATION)
return account
except Exception as e:
print(0)
write_to_log(f"{type(e).__name__}: {e}", log_file)
sys.exit()
def basic_session(credentials):
"""
Creates a basic session with an Exchange server using the provided credentials.
Args:
credentials (Credentials): Credentials object containing information for authentication.
Returns:
Account: An Account object representing the basic session with the Exchange server.
"""
try:
config = Configuration(server=server, credentials=credentials)
account = Account(
primary_smtp_address=args.smtp_address,
autodiscover=False,
config=config,
access_type=DELEGATE
)
return account
except Exception as e:
print(0)
write_to_log(f"{type(e).__name__}: {e}", log_file)
sys.exit()
def create_module(name, module_type, description, value, unit=""):
"""
Creates a generic module based on a template.
Args:
module_prefix (str): The prefix for the module name.
name_suffix (str): The suffix to be appended to the module name.
module_type (str): The type of the module.
description (str): The description of the module.
value: The value of the module.
unit (str, optional): The unit of measurement for the module. Defaults to "".
Returns:
dict: A dictionary representing the generic module.
"""
return {
"name": f'{module_prefix}{name}',
"type": module_type,
"desc": description,
"value": value,
"unit": unit
}
def create_agent(count,list_mail = None):
"""
Creates an agent with specified parameters and transfers it to a target address.
Args:
count (int): Number of mails matching the filter used in the run.
list_mail (str, optional): List of mails matching the filter used in the run. Default is None.
Returns:
None
"""
modules = []
modules.append(create_module(f"{module_prefix}.Coincidences_count", "generic_data", "Number of mails matching the filter used in the run", count))
if list_mail is not None :
modules.append(create_module(f"{module_prefix}.Coincidences_list", "generic_data_string", "List of mails matching the filter used in the run", list_mail))
agent = {
"agent_name" : ppt.generate_md5(agent_prefix + smtp_address),
"agent_alias" : agent_prefix + smtp_address,
"parent_agent_name" : "",
"description" : "",
"version" : "",
"os_name" : "",
"os_version" : "",
"timestamp" : now(),
"address" : server,
"group" : group,
"interval" : interval,
"agent_mode" : "1"
}
xml_content = ppt.print_agent(agent, modules)
xml_file = ppt.write_xml(xml_content, agent["agent_name"])
ppt.transfer_xml(
xml_file,
transfer_mode=transfer_mode,
tentacle_ip=tentacle_address,
tentacle_port=tentacle_port
)
write_to_log("Agent: " + agent_prefix + smtp_address + " getting mail data.", log_file)
def parse_result(list_email,sep="")-> list:
"""
Parses a list of email elements and converts them into a list of dictionaries.
Args:
list_email (list): List of email elements to be parsed.
sep (str): Separator to join elements into a string. Default is an empty string.
Returns:
list: A list of dictionaries, where each dictionary has a single key "value" containing the joined string.
"""
result=[]
for line in list_email:
str_line=sep.join(str(elem) for elem in line)
str_dict={"value":str_line}
result.append(str_dict)
return result
def now(
utimestamp: bool = False
):
"""
Get the current time in the specified format or as a Unix timestamp.
Args:
utimestamp (bool): Set to True to get the Unix timestamp (epoch time).
print_flag (bool): Set to True to print the time to standard output.
Returns:
str: The current time in the desired format or as a Unix timestamp.
"""
today = datetime.today()
if utimestamp:
time = datetime.timestamp(today)
else:
time = today.strftime('%Y/%m/%d %H:%M:%S')
return time
def write_to_log(variable_content, log_file_path):
"""
Writes the content of a variable to a log file with timestamp.
Args:
variable_content: Content of the variable to be logged.
log_file_path (str): Path to the log file.
"""
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
log_entry = f"{timestamp} - {variable_content}\n"
try:
with open(log_file_path, 'a') as log_file:
log_file.write(log_entry)
except IOError as e:
print(f"Error writing to log file: {e}")
if args.auth == 'basic':
credentials = Credentials(username=user, password=password)
account = basic_session(credentials)
elif args.auth == 'oauth':
credentials = OAuth2Credentials(client_id=client_id, client_secret=secret, tenant_id=tenant_id)
account = Oauth_session(credentials)
else:
print(0)
write_to_log(f"{type(e).__name__}: {e}", log_file)
sys.exit()
try:
## Only one parameter
if subject and sender==None and date_start==None and date_end == None:
filtered_items = account.inbox.filter(subject__contains=args.subject)
if subject==None and sender and date_start==None and date_end == None:
filtered_items = account.inbox.filter(sender__icontains=sender)
if subject==None and sender==None and date_start and date_end :
date_start=date_start.split("-")
date_end=date_end.split("-")
filtered_items = account.inbox.filter(datetime_received__range=(datetime(int(date_start[0].strip()), int(date_start[1].strip()), int(date_start[2].strip()), int(date_start[3].strip()), int(date_start[4].strip())).replace(tzinfo=timezone.utc),datetime(int(date_end[0].strip()), int(date_end[1].strip()), int(date_end[2].strip()), int(date_end[3].strip()), int(date_end[4].strip())).replace(tzinfo=timezone.utc)))
## Subject + sender
if subject and sender and date_start==None and date_end==None :
filtered_items = account.inbox.filter(sender__icontains=sender,subject__contains=subject)
## All parameters
if subject and sender and date_start and date_end :
date_start=date_start.split("-")
date_end=date_end.split("-")
filtered_items = account.inbox.filter(datetime_received__range=(datetime(int(date_start[0].strip()), int(date_start[1].strip()), int(date_start[2].strip()), int(date_start[3].strip()), int(date_start[4].strip())).replace(tzinfo=timezone.utc),datetime(int(date_end[0].strip()), int(date_end[1].strip()), int(date_end[2].strip()), int(date_end[3].strip()), int(date_end[4].strip())).replace(tzinfo=timezone.utc)),sender__icontains=args.sender,subject__contains=args.subject)
# List Number email coincidences
list_mail=[]
# Count number messages coincidences
count=0
for item in filtered_items:
count=count+1
if mail_list != 0:
list_mail.append("("+str(item.datetime_received) + ") - "+str(item.subject)+" - "+str(item.sender))
#print(item.subject, item.sender, item.datetime_received)
if mail_list!= 0:
list_mail = parse_result(list_mail)
create_agent(count,list_mail)
else:
create_agent(count)
except Exception as e:
print(0)
write_to_log(f"{type(e).__name__}: {e}", log_file)
sys.exit()
print(1)

View File

@ -1,5 +1,5 @@
package: pandorafms-server package: pandorafms-server
Version: 7.0NG.775-240212 Version: 7.0NG.775-240220
Architecture: all Architecture: all
Priority: optional Priority: optional
Section: admin Section: admin

View File

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

View File

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

View File

@ -2428,7 +2428,7 @@ sub pandora_process_module ($$$$$$$$$;$) {
} }
# Active ff interval # Active ff interval
if ($module->{'module_ff_interval'} != 0) { if ($module->{'module_ff_interval'} != 0 && $min_ff_event > 0 && $last_known_status != $status) {
$current_interval = $module->{'module_ff_interval'}; $current_interval = $module->{'module_ff_interval'};
} }
} }

View File

@ -477,7 +477,7 @@ sub exec_recon_app ($$$) {
# No output message. # No output message.
if (!defined($output_json)) { if (!defined($output_json)) {
push(@summary, "The execution returned no output."); push(@summary, "The execution returned no output. Is the server out of memory?");
next; next;
} }
@ -1118,6 +1118,30 @@ sub PandoraFMS::Recon::Base::create_interface_modules($$) {
return unless ($self->is_snmp_discovered($device)); return unless ($self->is_snmp_discovered($device));
my $community = $self->get_community($device); my $community = $self->get_community($device);
my $snmp3_creds = undef;
if(defined($self->{'snmp3_auth_key'}{$device})) {
$snmp3_creds = $self->snmp3_credentials($self->{'snmp3_auth_key'}{$device});
}
my $snmp3_params = {
'custom_string_1' => '',
'custom_string_2' => '',
'custom_string_3' => '',
'plugin_parameter' => '',
'plugin_user' => '',
'plugin_pass' => ''
};
if(defined($snmp3_creds)) {
$community = $snmp3_creds->{'community'};
$snmp3_params = {
'custom_string_1' => $snmp3_creds->{'snmp_privacy_method'},
'custom_string_2' => $snmp3_creds->{'snmp_privacy_pass'},
'custom_string_3' => $snmp3_creds->{'snmp_security_level'},
'plugin_parameter' => $snmp3_creds->{'snmp_auth_method'},
'plugin_user' => $snmp3_creds->{'snmp_auth_user'},
'plugin_pass' => $snmp3_creds->{'snmp_auth_pass'}
};
}
my @output = $self->snmp_get_value_array($device, $PandoraFMS::Recon::Base::IFINDEX); my @output = $self->snmp_get_value_array($device, $PandoraFMS::Recon::Base::IFINDEX);
foreach my $if_index (@output) { foreach my $if_index (@output) {
next unless ($if_index =~ /^[0-9]+$/); next unless ($if_index =~ /^[0-9]+$/);
@ -1153,12 +1177,12 @@ sub PandoraFMS::Recon::Base::create_interface_modules($$) {
), ),
'ip_target' => $device, 'ip_target' => $device,
'tcp_send' => $self->{'task_data'}{'snmp_version'}, 'tcp_send' => $self->{'task_data'}{'snmp_version'},
'custom_string_1' => $self->{'task_data'}{'snmp_privacy_method'}, 'custom_string_1' => $snmp3_params->{'snmp_privacy_method'},
'custom_string_2' => $self->{'task_data'}{'snmp_privacy_pass'}, 'custom_string_2' => $snmp3_params->{'snmp_privacy_pass'},
'custom_string_3' => $self->{'task_data'}{'snmp_security_level'}, 'custom_string_3' => $snmp3_params->{'snmp_security_level'},
'plugin_parameter' => $self->{'task_data'}{'snmp_auth_method'}, 'plugin_parameter' => $snmp3_params->{'snmp_auth_method'},
'plugin_user' => $self->{'task_data'}{'snmp_auth_user'}, 'plugin_user' => $snmp3_params->{'snmp_auth_user'},
'plugin_pass' => $self->{'task_data'}{'snmp_auth_pass'}, 'plugin_pass' => $snmp3_params->{'snmp_auth_pass'},
'snmp_community' => $community, 'snmp_community' => $community,
'snmp_oid' => "$PandoraFMS::Recon::Base::IFOPERSTATUS.$if_index", 'snmp_oid' => "$PandoraFMS::Recon::Base::IFOPERSTATUS.$if_index",
'unit' => '' 'unit' => ''
@ -1183,12 +1207,12 @@ sub PandoraFMS::Recon::Base::create_interface_modules($$) {
), ),
'ip_target' => $device, 'ip_target' => $device,
'tcp_send' => $self->{'task_data'}{'snmp_version'}, 'tcp_send' => $self->{'task_data'}{'snmp_version'},
'custom_string_1' => $self->{'task_data'}{'snmp_privacy_method'}, 'custom_string_1' => $snmp3_params->{'snmp_privacy_method'},
'custom_string_2' => $self->{'task_data'}{'snmp_privacy_pass'}, 'custom_string_2' => $snmp3_params->{'snmp_privacy_pass'},
'custom_string_3' => $self->{'task_data'}{'snmp_security_level'}, 'custom_string_3' => $snmp3_params->{'snmp_security_level'},
'plugin_parameter' => $self->{'task_data'}{'snmp_auth_method'}, 'plugin_parameter' => $snmp3_params->{'snmp_auth_method'},
'plugin_user' => $self->{'task_data'}{'snmp_auth_user'}, 'plugin_user' => $snmp3_params->{'snmp_auth_user'},
'plugin_pass' => $self->{'task_data'}{'snmp_auth_pass'}, 'plugin_pass' => $snmp3_params->{'snmp_auth_pass'},
'snmp_community' => $community, 'snmp_community' => $community,
'snmp_oid' => "$PandoraFMS::Recon::Base::IFHCINOCTECTS.$if_index", 'snmp_oid' => "$PandoraFMS::Recon::Base::IFHCINOCTECTS.$if_index",
'unit' => safe_input('bytes/s') 'unit' => safe_input('bytes/s')
@ -1210,12 +1234,12 @@ sub PandoraFMS::Recon::Base::create_interface_modules($$) {
), ),
'ip_target' => $device, 'ip_target' => $device,
'tcp_send' => $self->{'task_data'}{'snmp_version'}, 'tcp_send' => $self->{'task_data'}{'snmp_version'},
'custom_string_1' => $self->{'task_data'}{'snmp_privacy_method'}, 'custom_string_1' => $snmp3_params->{'snmp_privacy_method'},
'custom_string_2' => $self->{'task_data'}{'snmp_privacy_pass'}, 'custom_string_2' => $snmp3_params->{'snmp_privacy_pass'},
'custom_string_3' => $self->{'task_data'}{'snmp_security_level'}, 'custom_string_3' => $snmp3_params->{'snmp_security_level'},
'plugin_parameter' => $self->{'task_data'}{'snmp_auth_method'}, 'plugin_parameter' => $snmp3_params->{'snmp_auth_method'},
'plugin_user' => $self->{'task_data'}{'snmp_auth_user'}, 'plugin_user' => $snmp3_params->{'snmp_auth_user'},
'plugin_pass' => $self->{'task_data'}{'snmp_auth_pass'}, 'plugin_pass' => $snmp3_params->{'snmp_auth_pass'},
'snmp_community' => $community, 'snmp_community' => $community,
'snmp_oid' => "$PandoraFMS::Recon::Base::IFINOCTECTS.$if_index", 'snmp_oid' => "$PandoraFMS::Recon::Base::IFINOCTECTS.$if_index",
'unit' => safe_input('bytes/s') 'unit' => safe_input('bytes/s')
@ -1241,12 +1265,12 @@ sub PandoraFMS::Recon::Base::create_interface_modules($$) {
), ),
'ip_target' => $device, 'ip_target' => $device,
'tcp_send' => $self->{'task_data'}{'snmp_version'}, 'tcp_send' => $self->{'task_data'}{'snmp_version'},
'custom_string_1' => $self->{'task_data'}{'snmp_privacy_method'}, 'custom_string_1' => $snmp3_params->{'snmp_privacy_method'},
'custom_string_2' => $self->{'task_data'}{'snmp_privacy_pass'}, 'custom_string_2' => $snmp3_params->{'snmp_privacy_pass'},
'custom_string_3' => $self->{'task_data'}{'snmp_security_level'}, 'custom_string_3' => $snmp3_params->{'snmp_security_level'},
'plugin_parameter' => $self->{'task_data'}{'snmp_auth_method'}, 'plugin_parameter' => $snmp3_params->{'snmp_auth_method'},
'plugin_user' => $self->{'task_data'}{'snmp_auth_user'}, 'plugin_user' => $snmp3_params->{'snmp_auth_user'},
'plugin_pass' => $self->{'task_data'}{'snmp_auth_pass'}, 'plugin_pass' => $snmp3_params->{'snmp_auth_pass'},
'snmp_community' => $community, 'snmp_community' => $community,
'snmp_oid' => "$PandoraFMS::Recon::Base::IFHCOUTOCTECTS.$if_index", 'snmp_oid' => "$PandoraFMS::Recon::Base::IFHCOUTOCTECTS.$if_index",
'unit' => safe_input('bytes/s') 'unit' => safe_input('bytes/s')
@ -1268,12 +1292,12 @@ sub PandoraFMS::Recon::Base::create_interface_modules($$) {
), ),
'ip_target' => $device, 'ip_target' => $device,
'tcp_send' => $self->{'task_data'}{'snmp_version'}, 'tcp_send' => $self->{'task_data'}{'snmp_version'},
'custom_string_1' => $self->{'task_data'}{'snmp_privacy_method'}, 'custom_string_1' => $snmp3_params->{'snmp_privacy_method'},
'custom_string_2' => $self->{'task_data'}{'snmp_privacy_pass'}, 'custom_string_2' => $snmp3_params->{'snmp_privacy_pass'},
'custom_string_3' => $self->{'task_data'}{'snmp_security_level'}, 'custom_string_3' => $snmp3_params->{'snmp_security_level'},
'plugin_parameter' => $self->{'task_data'}{'snmp_auth_method'}, 'plugin_parameter' => $snmp3_params->{'snmp_auth_method'},
'plugin_user' => $self->{'task_data'}{'snmp_auth_user'}, 'plugin_user' => $snmp3_params->{'snmp_auth_user'},
'plugin_pass' => $self->{'task_data'}{'snmp_auth_pass'}, 'plugin_pass' => $snmp3_params->{'snmp_auth_pass'},
'snmp_community' => $community, 'snmp_community' => $community,
'snmp_oid' => "$PandoraFMS::Recon::Base::IFOUTOCTECTS.$if_index", 'snmp_oid' => "$PandoraFMS::Recon::Base::IFOUTOCTECTS.$if_index",
'unit' => safe_input('bytes/s') 'unit' => safe_input('bytes/s')
@ -1305,19 +1329,19 @@ sub PandoraFMS::Recon::Base::create_interface_modules($$) {
# Interface index filter. # Interface index filter.
$macros->{'5'}->{'value'} = $if_index; $macros->{'5'}->{'value'} = $if_index;
# SecurityName. # SecurityName.
$macros->{'6'}->{'value'} = $self->{'task_data'}->{'snmp_auth_user'}; $macros->{'6'}->{'value'} = $snmp3_params->{'snmp_auth_user'};
# SecurityContext. # SecurityContext.
$macros->{'7'}->{'value'} = $community; $macros->{'7'}->{'value'} = $community;
# SecurityLevel. # SecurityLevel.
$macros->{'8'}->{'value'} = $self->{'task_data'}->{'snmp_security_level'}; $macros->{'8'}->{'value'} = $snmp3_params->{'snmp_security_level'};
# AuthProtocol. # AuthProtocol.
$macros->{'9'}->{'value'} = $self->{'task_data'}->{'snmp_auth_method'}; $macros->{'9'}->{'value'} = $snmp3_params->{'snmp_auth_method'};
# AuthKey. # AuthKey.
$macros->{'10'}->{'value'} = $self->{'task_data'}->{'snmp_auth_pass'}; $macros->{'10'}->{'value'} = $snmp3_params->{'snmp_auth_pass'};
# PrivProtocol. # PrivProtocol.
$macros->{'11'}->{'value'} = $self->{'task_data'}->{'snmp_privacy_method'}; $macros->{'11'}->{'value'} = $snmp3_params->{'snmp_privacy_method'};
# PrivKey. # PrivKey.
$macros->{'12'}->{'value'} = $self->{'task_data'}->{'snmp_privacy_pass'}; $macros->{'12'}->{'value'} = $snmp3_params->{'snmp_privacy_pass'};
# Hash identifier. # Hash identifier.
$macros->{'13'}->{'value'} = PandoraFMS::Tools::generate_agent_name_hash($if_name, $device); $macros->{'13'}->{'value'} = PandoraFMS::Tools::generate_agent_name_hash($if_name, $device);
# Get input usage. # Get input usage.
@ -1429,6 +1453,7 @@ sub PandoraFMS::Recon::Base::create_wmi_modules {
{ {
'ip_target' => $target, 'ip_target' => $target,
'snmp_oid' => "SELECT LoadPercentage FROM Win32_Processor WHERE DeviceId=\'$cpu\'", 'snmp_oid' => "SELECT LoadPercentage FROM Win32_Processor WHERE DeviceId=\'$cpu\'",
'tcp_send' => $creds->{'extra_1'},
'plugin_user' => $creds->{'username'}, 'plugin_user' => $creds->{'username'},
'plugin_pass' => $creds->{'password'}, 'plugin_pass' => $creds->{'password'},
'tcp_port' => 1, 'tcp_port' => 1,
@ -1449,6 +1474,7 @@ sub PandoraFMS::Recon::Base::create_wmi_modules {
{ {
'ip_target' => $target, 'ip_target' => $target,
'snmp_oid' => "SELECT FreePhysicalMemory, TotalVisibleMemorySize FROM Win32_OperatingSystem", 'snmp_oid' => "SELECT FreePhysicalMemory, TotalVisibleMemorySize FROM Win32_OperatingSystem",
'tcp_send' => $creds->{'extra_1'},
'plugin_user' => $creds->{'username'}, 'plugin_user' => $creds->{'username'},
'plugin_pass' => $creds->{'password'}, 'plugin_pass' => $creds->{'password'},
'tcp_port' => 0, 'tcp_port' => 0,
@ -1469,6 +1495,7 @@ sub PandoraFMS::Recon::Base::create_wmi_modules {
{ {
'ip_target' => $target, 'ip_target' => $target,
'snmp_oid' => "SELECT FreeSpace FROM Win32_LogicalDisk WHERE DeviceID='$unit'", 'snmp_oid' => "SELECT FreeSpace FROM Win32_LogicalDisk WHERE DeviceID='$unit'",
'tcp_send' => $creds->{'extra_1'},
'plugin_user' => $creds->{'username'}, 'plugin_user' => $creds->{'username'},
'plugin_pass' => $creds->{'password'}, 'plugin_pass' => $creds->{'password'},
'tcp_port' => 1, 'tcp_port' => 1,
@ -1510,14 +1537,7 @@ sub PandoraFMS::Recon::Base::create_network_profile_modules($$) {
# 1. Retrieve template info. # 1. Retrieve template info.
my $template = get_nc_profile_advanced($self->{'dbh'}, $t_id); my $template = get_nc_profile_advanced($self->{'dbh'}, $t_id);
# 2. Verify Private Enterprise Number matches (PEN) # 2. Retrieve module list from target template.
if (defined($template->{'pen'})) {
my @pens = split(',', $template->{'pen'});
next unless (is_in_array(\@pens, $self->get_pen($device)));
}
# 3. Retrieve module list from target template.
my @np_components = get_db_rows( my @np_components = get_db_rows(
$self->{'dbh'}, $self->{'dbh'},
'SELECT * FROM tnetwork_profile_component WHERE id_np = ?', 'SELECT * FROM tnetwork_profile_component WHERE id_np = ?',
@ -1525,7 +1545,7 @@ sub PandoraFMS::Recon::Base::create_network_profile_modules($$) {
); );
foreach my $np_component (@np_components) { foreach my $np_component (@np_components) {
# 4. Register each module (candidate). 'add_module' will test them. # 3. Register each module (candidate). 'add_module' will test them.
my $component = get_db_single_row( my $component = get_db_single_row(
$self->{'dbh'}, $self->{'dbh'},
'SELECT * FROM tnetwork_component WHERE id_nc = ?', 'SELECT * FROM tnetwork_component WHERE id_nc = ?',
@ -1543,18 +1563,45 @@ sub PandoraFMS::Recon::Base::create_network_profile_modules($$) {
} }
$component->{'name'} = safe_output($component->{'name'}); $component->{'name'} = safe_output($component->{'name'});
if ($component->{'type'} >= 15 && $component->{'type'} <= 18) { # SNMP Modules
$component->{'snmp_community'} = safe_output($self->get_community($device)); if ($self->is_snmp_discovered($device) && $component->{'type'} >= 15 && $component->{'type'} <= 18) {
my $snmp3_creds = undef;
my $community = safe_output($self->get_community($device));
if(defined($self->{'snmp3_auth_key'}{$device})) {
$snmp3_creds = $self->snmp3_credentials($self->{'snmp3_auth_key'}{$device});
}
my $snmp3_params = {
'custom_string_1' => '',
'custom_string_2' => '',
'custom_string_3' => '',
'plugin_parameter' => '',
'plugin_user' => '',
'plugin_pass' => ''
};
if(defined($snmp3_creds)) {
$community = $snmp3_creds->{'community'};
$snmp3_params = {
'custom_string_1' => $snmp3_creds->{'snmp_privacy_method'},
'custom_string_2' => $snmp3_creds->{'snmp_privacy_pass'},
'custom_string_3' => $snmp3_creds->{'snmp_security_level'},
'plugin_parameter' => $snmp3_creds->{'snmp_auth_method'},
'plugin_user' => $snmp3_creds->{'snmp_auth_user'},
'plugin_pass' => $snmp3_creds->{'snmp_auth_pass'}
};
}
$component->{'snmp_community'} = $community;
$component->{'tcp_send'} = $self->{'snmp_version'}; $component->{'tcp_send'} = $self->{'snmp_version'};
$component->{'custom_string_1'} = $self->{'snmp_privacy_method'}; $component->{'custom_string_1'} = $snmp3_params->{'snmp_privacy_method'};
$component->{'custom_string_2'} = $self->{'snmp_privacy_pass'}; $component->{'custom_string_2'} = $snmp3_params->{'snmp_privacy_pass'};
$component->{'custom_string_3'} = $self->{'snmp_security_level'}; $component->{'custom_string_3'} = $snmp3_params->{'snmp_security_level'};
$component->{'plugin_parameter'} = $self->{'snmp_auth_method'}; $component->{'plugin_parameter'} = $snmp3_params->{'snmp_auth_method'};
$component->{'plugin_user'} = $self->{'snmp_auth_user'}; $component->{'plugin_user'} = $snmp3_params->{'snmp_auth_user'};
$component->{'plugin_pass'} = $self->{'snmp_auth_pass'}; $component->{'plugin_pass'} = $snmp3_params->{'snmp_auth_pass'};
} }
if ($component->{'type'} >= 34 && $component->{'type'} <= 37) { # RCMD Modules
if ($self->rcmd_responds($device) && $component->{'type'} >= 34 && $component->{'type'} <= 37) {
# Update module credentials. # Update module credentials.
$component->{'custom_string_1'} = $self->rcmd_credentials_key($device); $component->{'custom_string_1'} = $self->rcmd_credentials_key($device);
$component->{'custom_string_2'} = pandora_get_os_by_id( $component->{'custom_string_2'} = pandora_get_os_by_id(
@ -1563,9 +1610,18 @@ sub PandoraFMS::Recon::Base::create_network_profile_modules($$) {
); );
} }
# WMI Modules
if ($self->wmi_responds($device) && $component->{'id_modulo'} == 6) {
my $key = $self->wmi_credentials_key($device);
my $creds = $self->call('get_credentials', $key);
$component->{'tcp_send'} = $creds->{'extra_1'};
$component->{'plugin_user'} = $creds->{'username'};
$component->{'plugin_pass'} = $creds->{'password'};
}
$component->{'__module_component'} = 1; $component->{'__module_component'} = 1;
# 3. Try to register module into monitoring list. # 4. Try to register module into monitoring list.
$self->call('add_module', $device, $component); $self->call('add_module', $device, $component);
} }
} }
@ -1576,13 +1632,23 @@ sub PandoraFMS::Recon::Base::create_network_profile_modules($$) {
# Retrieve a key from credential store. # Retrieve a key from credential store.
################################################################################ ################################################################################
sub PandoraFMS::Recon::Base::get_credentials { sub PandoraFMS::Recon::Base::get_credentials {
my ($self, $key_index) = @_; my ($self, $key_index, $product) = @_;
return credential_store_get_key( my $cred = credential_store_get_key(
$self->{'pa_config'}, $self->{'pa_config'},
$self->{'dbh'}, $self->{'dbh'},
$key_index $key_index
); );
if(defined($product)) {
if($product eq $cred->{'product'}) {
return $cred;
} else {
return undef;
}
}
return $cred;
} }
################################################################################ ################################################################################

View File

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

View File

@ -1352,10 +1352,9 @@ sub snmp_responds_v122c($$) {
sub snmp_responds_v3($$) { sub snmp_responds_v3($$) {
my ($self, $device) = @_; my ($self, $device) = @_;
my $command = $self->snmp_get_command($device, ".0"); $self->snmp3_credentials_calculation($device);
`$command`;
if ($? == 0) { if ($self->snmp3_credentials_calculation($device)) {
$self->mark_discovered($device); $self->mark_discovered($device);
return 1; return 1;
} }
@ -1363,6 +1362,81 @@ sub snmp_responds_v3($$) {
return 0; return 0;
} }
################################################################################
# Get SNMP3 credentials info in HASH
################################################################################
sub snmp3_credentials {
my ($self, $key) = @_;
my $cred = $self->call('get_credentials', $key, 'SNMP');
return undef if !defined($cred);
return undef if ref($cred) ne 'HASH';
my $extra1 = {};
eval {
local $SIG{__DIE__};
$extra1 = p_decode_json($self->{'pa_config'}, $cred->{'extra_1'});
};
if ($@) {
$self->call('message', "[".$key."] Credentials ERROR JSON: $@", 10);
return undef;
}
return undef if $extra1->{'version'} ne '3';
return {
'snmp_security_level' => $extra1->{'securityLevelV3'},
'snmp_privacy_method' => $extra1->{'privacyMethodV3'},
'snmp_privacy_pass' => $extra1->{'privacyPassV3'},
'snmp_auth_method' => $extra1->{'authMethodV3'},
'snmp_auth_user' => $extra1->{'authUserV3'},
'snmp_auth_pass' => $extra1->{'authPassV3'},
'community' => $extra1->{'community'}
};
}
################################################################################
# Calculate WMI credentials for target, 1 if calculated, undef if cannot
# connect to target. Credentials could be empty (-N)
################################################################################
sub snmp3_credentials_calculation {
my ($self, $target) = @_;
# Test all credentials selected.
foreach my $key_index (@{$self->{'auth_strings_array'}}) {
my $cred = snmp3_credentials($key_index);
next if !defined($cred);
next if ref($cred) ne 'HASH';
my $auth = '';
if ($cred->{'community'}) { # Context
$auth .= " -N \'$cred->{'community'}\' ";
}
$auth .= " -l$cred->{'snmp_security_level'} ";
if ($cred->{'snmp_security_level'} ne "noAuthNoPriv") {
$auth .= " -u$cred->{'snmp_auth_user'} -a $cred->{'snmp_auth_method'} -A \'$cred->{'snmp_auth_pass'}\' ";
}
if ($cred->{'snmp_security_level'} eq "authPriv") {
$auth .= " -x$cred->{'snmp_privacy_method'} -X \'$cred->{'snmp_privacy_pass'}\' ";
}
$self->{'snmp3_auth'}{$target} = $auth;
$self->{'snmp3_auth_key'}{$target} = $key_index;
my $command = $self->snmp_get_command($target, ".0");
`$command`;
if ($? == 0) {
return 1;
}
}
delete($self->{'snmp3_auth'}{$target});
delete($self->{'snmp3_auth_key'}{$target});
return 0;
}
################################################################################ ################################################################################
# Parse the local ARP cache. # Parse the local ARP cache.
################################################################################ ################################################################################
@ -2198,16 +2272,7 @@ sub snmp_get_command {
my $command = "snmpwalk -M$DEVNULL -r$self->{'snmp_checks'} -t$self->{'snmp_timeout'} -v$self->{'snmp_version'} -On -Oe "; my $command = "snmpwalk -M$DEVNULL -r$self->{'snmp_checks'} -t$self->{'snmp_timeout'} -v$self->{'snmp_version'} -On -Oe ";
if ($self->{'snmp_version'} eq "3") { if ($self->{'snmp_version'} eq "3") {
if ($self->{'community'}) { # Context $command .= " $self->{'snmp3_auth'}{$device} ";
$command .= " -N \'$self->{'community'}\' ";
}
$command .= " -l$self->{'snmp_security_level'} ";
if ($self->{'snmp_security_level'} ne "noAuthNoPriv") {
$command .= " -u$self->{'snmp_auth_user'} -a $self->{'snmp_auth_method'} -A \'$self->{'snmp_auth_pass'}\' ";
}
if ($self->{'snmp_security_level'} eq "authPriv") {
$command .= " -x$self->{'snmp_privacy_method'} -X \'$self->{'snmp_privacy_pass'}\' ";
}
} else { } else {
$command .= " -c\'$community\'$vlan "; $command .= " -c\'$community\'$vlan ";
} }
@ -2353,7 +2418,8 @@ sub wmi_credentials_calculation {
# Test all credentials selected. # Test all credentials selected.
foreach my $key_index (@{$self->{'auth_strings_array'}}) { foreach my $key_index (@{$self->{'auth_strings_array'}}) {
my $cred = $self->call('get_credentials', $key_index); my $cred = $self->call('get_credentials', $key_index, 'WMI');
next if !defined($cred);
next if ref($cred) ne 'HASH'; next if ref($cred) ne 'HASH';
my $auth = $cred->{'username'}.'%'.$cred->{'password'}; my $auth = $cred->{'username'}.'%'.$cred->{'password'};
@ -2431,7 +2497,8 @@ sub rcmd_credentials_calculation {
# Test all credentials selected. # Test all credentials selected.
foreach my $key_index (@{$self->{'auth_strings_array'}}) { foreach my $key_index (@{$self->{'auth_strings_array'}}) {
my $cred = $self->call('get_credentials', $key_index); my $cred = $self->call('get_credentials', $key_index, 'CUSTOM');
next if !defined($cred);
next if ref($cred) ne 'HASH'; next if ref($cred) ne 'HASH';
$rcmd->clean_ssh_lib(); $rcmd->clean_ssh_lib();

View File

@ -716,19 +716,23 @@ sub credential_store_get_key($$$) {
my $sql = 'SELECT * FROM tcredential_store WHERE identifier = ?'; my $sql = 'SELECT * FROM tcredential_store WHERE identifier = ?';
my $key = PandoraFMS::DB::get_db_single_row($dbh, $sql, $identifier); my $key = PandoraFMS::DB::get_db_single_row($dbh, $sql, $identifier);
return { if(defined($key)) {
'username' => PandoraFMS::Core::pandora_output_password( return {
$pa_config, 'product' => $key->{'product'},
$key->{'username'} 'username' => PandoraFMS::Core::pandora_output_password(
), $pa_config,
'password' => PandoraFMS::Core::pandora_output_password( $key->{'username'}
$pa_config, ),
$key->{'password'} 'password' => PandoraFMS::Core::pandora_output_password(
), $pa_config,
'extra_1' => $key->{'extra_1'}, $key->{'password'}
'extra_2' => $key->{'extra_2'}, ),
}; 'extra_1' => $key->{'extra_1'},
'extra_2' => $key->{'extra_2'},
};
}
return undef;
} }
################################################################################ ################################################################################

View File

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

View File

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

View File

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

View File

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

View File

@ -58,6 +58,9 @@ my $Restart = 0;
# Controlled exit # Controlled exit
my $Running = 0; my $Running = 0;
# License
my $License;
######################################################################## ########################################################################
# Print the given message with a preceding timestamp. # Print the given message with a preceding timestamp.
######################################################################## ########################################################################
@ -359,6 +362,27 @@ sub ha_update_server($$) {
} }
###############################################################################
# Restart pandora server on demand.
###############################################################################
sub ha_restart_server($$) {
my ($config, $dbh) = @_;
my $OSNAME = $^O;
my $current_license;
if (!defined($License)) {
$License = get_db_value($dbh, 'SELECT `value` FROM `tupdate_settings` WHERE `key` = "customer_key"');
$current_license = $License;
} else {
$current_license = get_db_value($dbh, 'SELECT `value` FROM `tupdate_settings` WHERE `key` = "customer_key"');
}
if($License ne $current_license) {
ha_restart_pandora($config);
$License = $current_license;
}
}
################################################################################ ################################################################################
# Dump the list of known databases to disk. # Dump the list of known databases to disk.
################################################################################ ################################################################################
@ -691,6 +715,9 @@ sub ha_main_pandora($) {
# Check if there are updates pending. # Check if there are updates pending.
ha_update_server($conf, $dbh); ha_update_server($conf, $dbh);
# Check restart server on demand.
ha_restart_server($conf, $dbh);
# Keep pandora running # Keep pandora running
ha_keep_pandora_running($conf, $dbh); ha_keep_pandora_running($conf, $dbh);

View File

@ -36,7 +36,7 @@ use Encode::Locale;
Encode::Locale::decode_argv; Encode::Locale::decode_argv;
# version: define current version # version: define current version
my $version = "7.0NG.775 Build 240212"; my $version = "7.0NG.775 Build 240220";
# save program name for logging # save program name for logging
my $progname = basename($0); my $progname = basename($0);
@ -5398,7 +5398,7 @@ sub cli_get_agent_status() {
############################################################################## ##############################################################################
sub cli_get_agents_id_name_by_alias() { sub cli_get_agents_id_name_by_alias() {
my $agent_alias = @ARGV[2]; my $agent_alias = safe_input(@ARGV[2]);
my $strict = @ARGV[3]; my $strict = @ARGV[3];
my @agents; my @agents;
my $where_value; my $where_value;
@ -5418,14 +5418,13 @@ sub cli_get_agents_id_name_by_alias() {
print "[ERROR] No agents retrieved.\n\n"; print "[ERROR] No agents retrieved.\n\n";
} else { } else {
if(is_metaconsole($conf) == 1) { if(is_metaconsole($conf) == 1) {
print "alias, id_agente, id_tagente, id_server, server_name\n"; print "id_agente, alias, id_tagente, id_server, server_name\n";
foreach my $agent (@agents) { foreach my $agent (@agents) {
print $agent->{'id_agente'}.", ".safe_output($agent->{'alias'}).", ".$agent->{'id_tagente'}.", ".$agent->{'id_server'}.", ".$agent->{'server_name'}."\n";
print safe_output($agent->{'alias'}).", ".$agent->{'id_agente'}.", ".$agent->{'id_tagente'}.", ".$agent->{'id_server'}.", ".$agent->{'server_name'}."\n";
} }
} else { } else {
print "alias, id_agente\n"; print "id_agente, alias\n";
foreach my $agent (@agents) { foreach my $agent (@agents) {
print $agent->{'id_agente'}.",".safe_output($agent->{'alias'})."\n"; print $agent->{'id_agente'}.",".safe_output($agent->{'alias'})."\n";