2009-11-13 Ramon Novoa <rnovoa@artica.es>

* conf/pandora_server.conf: Updated configuration tokens.

        * lib/PandoraFMS/SNMPServer.pm, lib/PandoraFMS/Config.pm,
          lib/PandoraFMS/PluginServer.pm, lib/PandoraFMS/PredictionServer.pm,
          lib/PandoraFMS/Core.pm, lib/PandoraFMS/ReconServer.pm,
          lib/PandoraFMS/DataServer.pm, lib/PandoraFMS/NetworkServer.pm,
          lib/PandoraFMS/Tools.pm, lib/PandoraFMS/WMIServer.pm,
          bin/pandora_server: Standardized and improved logging.




git-svn-id: https://svn.code.sf.net/p/pandora/code/trunk@2108 c3f86ba8-e40f-0410-aaad-9ba5e7f4b01f
This commit is contained in:
ramonn 2009-11-13 13:52:48 +00:00
parent eee26aad4e
commit 6586957f8d
13 changed files with 258 additions and 163 deletions

View File

@ -1,3 +1,14 @@
2009-11-13 Ramon Novoa <rnovoa@artica.es>
* conf/pandora_server.conf: Updated configuration tokens.
* lib/PandoraFMS/SNMPServer.pm, lib/PandoraFMS/Config.pm,
lib/PandoraFMS/PluginServer.pm, lib/PandoraFMS/PredictionServer.pm,
lib/PandoraFMS/Core.pm, lib/PandoraFMS/ReconServer.pm,
lib/PandoraFMS/DataServer.pm, lib/PandoraFMS/NetworkServer.pm,
lib/PandoraFMS/Tools.pm, lib/PandoraFMS/WMIServer.pm,
bin/pandora_server: Standardized and improved logging.
2009-11-10 Ramon Novoa <rnovoa@artica.es> 2009-11-10 Ramon Novoa <rnovoa@artica.es>
* lib/PandoraFMS/Core.pm: Fixed forced alert execution. Substitute alert * lib/PandoraFMS/Core.pm: Fixed forced alert execution. Substitute alert

View File

@ -43,7 +43,7 @@ my $DBH;
# Server shutdown. Handler to do a controlled shutdown. # Server shutdown. Handler to do a controlled shutdown.
######################################################################################## ########################################################################################
sub pandora_shutdown () { sub pandora_shutdown () {
logger (\%Config, 'Pandora FMS Server \'' . $Config{'servername'} . '\' Shutdown by signal ', 0); logger (\%Config, 'Pandora FMS Server \'' . $Config{'servername'} . '\' Shutdown by signal ', 1);
# Stop servers # Stop servers
foreach my $server (@Servers) { foreach my $server (@Servers) {
@ -51,7 +51,7 @@ sub pandora_shutdown () {
$server->stop (); $server->stop ();
} }
print_message (\%Config, ' [*] Shutting down ' . $Config{'servername'} . "(received signal)...\n", 0); print_message (\%Config, ' [*] Shutting down ' . $Config{'servername'} . "(received signal)...\n", 1);
db_disconnect ($DBH); db_disconnect ($DBH);
exit (0); exit (0);
} }
@ -119,13 +119,12 @@ sub pandora_restart () {
######################################################################################## ########################################################################################
sub pandora_crash () { sub pandora_crash () {
logger (\%Config, 'Pandora FMS Server \'' . $Config{'servername'} . '\' unhandled error', 0); logger (\%Config, 'Pandora FMS Server \'' . $Config{'servername'} . '\' unhandled error.', 1);
print_message (\%Config, '[E] Unhandled error in "' . $Config{'servername'} . "\". See more information in logfiles at '/var/log/pandora' \n", 0); #print_message (\%Config, '[E] Unhandled error in "' . $Config{'servername'} . "\". See more information in logfiles at '/var/log/pandora' \n", 0);
my(@array) = @_;
foreach my $error_line (@array) { foreach my $error_line (@_) {
logger (\%Config, '[E] \'' . $Config{'servername'} . "': $error_line", 0); logger (\%Config, '[E] \'' . $Config{'servername'} . "': $error_line", 1);
print_message (\%Config, "[E] $error_line \n", 0); #print_message (\%Config, "[E] $error_line \n", 0);
} }
} }
@ -133,7 +132,7 @@ $SIG{'TERM'} = 'pandora_shutdown';
$SIG{'INT'} = 'pandora_shutdown'; $SIG{'INT'} = 'pandora_shutdown';
# Error handler needs to be reviewed, Enterprise not found errors are too nasty :( # Error handler needs to be reviewed, Enterprise not found errors are too nasty :(
#$SIG{__DIE__} = 'pandora_crash'; $SIG{__DIE__} = 'pandora_crash';
# Prevent alarm from bombing the main thread when called within a thread # Prevent alarm from bombing the main thread when called within a thread
$SIG{'ALRM'} = 'IGNORE'; $SIG{'ALRM'} = 'IGNORE';
@ -143,15 +142,15 @@ pandora_init(\%Config, 'Pandora FMS Server');
pandora_load_config (\%Config); pandora_load_config (\%Config);
# Load enterprise module # Load enterprise module
if (enterprise_load () == 0) { if (enterprise_load (\%Config) == 0) {
print " [*] Pandora FMS Enterprise module not available.\n"; print_message (\%Config, " [*] Pandora FMS Enterprise module not available.", 1);
} else { } else {
print " [*] Pandora FMS Enterprise module loaded.\n"; print_message (\%Config, " [*] Pandora FMS Enterprise module loaded.", 1);
} }
# Daemonize and put in background # Daemonize and put in background
if ($Config{'daemon'} == 1) { if ($Config{'daemon'} == 1) {
print_message (\%Config, " [*] Backgrounding Pandora FMS Server process.\n\n", 0); print_message (\%Config, " [*] Backgrounding Pandora FMS Server process.\n", 1);
pandora_daemonize (\%Config); pandora_daemonize (\%Config);
} }
@ -195,12 +194,17 @@ while (1) {
# Restart on error or auto restart # Restart on error or auto restart
if ($@) { if ($@) {
if ($Config{'restart'} eq '0') {
print_message (\%Config, $@, 1);
pandora_shutdown ();
}
# Generate 'restarting' events # Generate 'restarting' events
foreach my $server (@Servers) { foreach my $server (@Servers) {
$server->restartEvent ($@); $server->restartEvent ($@);
} }
logger (\%Config, 'Pandora FMS Server restarting (' . $@ . ') in ' . $Config{'restart_delay'} . ' seconds.', 0); logger (\%Config, 'Pandora FMS Server restarting (' . $@ . ') in ' . $Config{'restart_delay'} . ' seconds.', 1);
pandora_restart (); pandora_restart ();
} elsif (($Config{'auto_restart'} > 0) && (time () - $time_ref > $Config{'auto_restart'})) { } elsif (($Config{'auto_restart'} > 0) && (time () - $time_ref > $Config{'auto_restart'})) {
$time_ref = time (); $time_ref = time ();

View File

@ -226,4 +226,10 @@ max_queue_files 250
# Pandora FMS will autorestart itself each XXX seconds, use this if you experience problems with # Pandora FMS will autorestart itself each XXX seconds, use this if you experience problems with
# shutting down threads, or other stability problems. # shutting down threads, or other stability problems.
# auto_restart 86400 # auto_restart 86400
# Pandora FMS will restart after restart_delay seconds on critical errors.
# restart 0
# restart_delay 60

View File

@ -50,15 +50,15 @@ my %pa_config;
########################################################################## ##########################################################################
sub help_screen { sub help_screen {
printf "\nSyntax: \n\n pandora_server [ options ] < fullpathname to configuration file (pandora_server.conf) > \n\n"; print "\nSyntax: \n\n pandora_server [ options ] < fullpathname to configuration file (pandora_server.conf) > \n\n";
printf "Following options are optional : \n"; print "Following options are optional : \n";
printf " -v : Verbose mode activated. Writes more information in the logfile \n"; print " -v : Verbose mode activated. Writes more information in the logfile \n";
printf " -d : Debug mode activated. Writes extensive information in the logfile \n"; print " -d : Debug mode activated. Writes extensive information in the logfile \n";
printf " -D : Daemon mode (runs in background)\n"; print " -D : Daemon mode (runs in background)\n";
printf " -P <file> : Store PID to file.\n"; print " -P <file> : Store PID to file.\n";
printf " -q : Quiet startup \n"; print " -q : Quiet startup \n";
printf " -h : This screen. Shows a little help screen \n"; print " -h : This screen. Shows a little help screen \n";
printf " \n"; print " \n";
exit; exit;
} }
@ -70,9 +70,9 @@ sub help_screen {
sub pandora_init { sub pandora_init {
my $pa_config = $_[0]; my $pa_config = $_[0];
my $init_string = $_[1]; my $init_string = $_[1];
printf "\n$init_string $pandora_version Build $pandora_build Copyright (c) 2004-2009 ArticaST\n"; print "\n$init_string $pandora_version Build $pandora_build Copyright (c) 2004-2009 ArticaST\n";
printf "This program is OpenSource, licensed under the terms of GPL License version 2.\n"; print "This program is OpenSource, licensed under the terms of GPL License version 2.\n";
printf "You can download latest versions and documentation at http://www.pandorafms.org \n\n"; print "You can download latest versions and documentation at http://www.pandorafms.org \n\n";
# Load config file from command line # Load config file from command line
if ($#ARGV == -1 ){ if ($#ARGV == -1 ){
@ -233,6 +233,9 @@ sub pandora_load_config {
# Auto restart every x seconds # Auto restart every x seconds
$pa_config->{'auto_restart'} = 0; $pa_config->{'auto_restart'} = 0;
# Restart server on error
$pa_config->{'restart'} = 0;
# Check for UID0 # Check for UID0
if ($pa_config->{"quiet"} != 0){ if ($pa_config->{"quiet"} != 0){
if ($> == 0){ if ($> == 0){
@ -504,6 +507,9 @@ sub pandora_load_config {
elsif ($parametro =~ m/^auto_restart\s+(\d+)/i) { elsif ($parametro =~ m/^auto_restart\s+(\d+)/i) {
$pa_config->{'auto_restart'} = clean_blank($1); $pa_config->{'auto_restart'} = clean_blank($1);
} }
elsif ($parametro =~ m/^restart\s+([0-1])/i) {
$pa_config->{'restart'} = clean_blank($1);
}
} # end of loop for parameter # } # end of loop for parameter #
@ -533,7 +539,7 @@ sub pandora_load_config {
} }
} }
logger ($pa_config, "Launching $pa_config->{'version'} $pa_config->{'build'}", 0); logger ($pa_config, "Launching $pa_config->{'version'} $pa_config->{'build'}", 1);
my $config_options = "Logfile at ".$pa_config->{"logfile"}.", Basepath is ".$pa_config->{"basepath"}.", Checksum is ".$pa_config->{"pandora_check"}.", Master is ".$pa_config->{"pandora_master"}.", SNMP Console is ".$pa_config->{"snmpconsole"}.", Server Threshold at ".$pa_config->{"server_threshold"}." sec, verbosity at ".$pa_config->{"verbosity"}.", Alert Threshold at $pa_config->{'alert_threshold'}, ServerName is '".$pa_config->{'servername'}.$pa_config->{"servermode"}."'"; my $config_options = "Logfile at ".$pa_config->{"logfile"}.", Basepath is ".$pa_config->{"basepath"}.", Checksum is ".$pa_config->{"pandora_check"}.", Master is ".$pa_config->{"pandora_master"}.", SNMP Console is ".$pa_config->{"snmpconsole"}.", Server Threshold at ".$pa_config->{"server_threshold"}." sec, verbosity at ".$pa_config->{"verbosity"}.", Alert Threshold at $pa_config->{'alert_threshold'}, ServerName is '".$pa_config->{'servername'}.$pa_config->{"servermode"}."'";
logger ($pa_config, "Config options: $config_options", 1); logger ($pa_config, "Config options: $config_options", 1);
} }
@ -544,7 +550,7 @@ sub pandora_start_log ($){
# Dump all errors to errorlog # Dump all errors to errorlog
open (STDERR, ">> " . $pa_config->{'errorlogfile'}) or die " [ERROR] Pandora FMS can't write to Errorlog. Aborting : \n $! \n"; open (STDERR, ">> " . $pa_config->{'errorlogfile'}) or die " [ERROR] Pandora FMS can't write to Errorlog. Aborting : \n $! \n";
print STDERR strftime ("%Y-%m-%d %H:%M:%S", localtime()) . ' - ' . $pa_config->{'servername'} . $pa_config->{'servermode'} . " Starting Pandora FMS Server. Error logging activated \n"; print STDERR strftime ("%Y-%m-%d %H:%M:%S", localtime()) . ' - ' . $pa_config->{'servername'} . $pa_config->{'servermode'} . " Starting Pandora FMS Server. Error logging activated.\n";
} }
# End of function declaration # End of function declaration

View File

@ -68,6 +68,7 @@ our @EXPORT = qw(
# Some global variables # Some global variables
our @DayNames = qw(monday tuesday wednesday thursday friday saturday sunday); our @DayNames = qw(monday tuesday wednesday thursday friday saturday sunday);
our @ServerTypes = qw (dataserver networkserver snmpconsole reconserver pluginserver predictionserver wmiserver exportserver inventoryserver webserver); our @ServerTypes = qw (dataserver networkserver snmpconsole reconserver pluginserver predictionserver wmiserver exportserver inventoryserver webserver);
our @AlertStatus = ('Execute the alert', 'Do not execute the alert', 'Do not execute the alert, but increment its internal counter', 'Cease the alert', 'Recover the alert', 'Reset internal counter');
########################################################################## ##########################################################################
# Generate alerts for a given module. # Generate alerts for a given module.
@ -88,7 +89,7 @@ sub pandora_generate_alerts ($$$$$$$) {
AND id_agent_module = ? AND disabled = 0', $module->{'id_agente_modulo'}); AND id_agent_module = ? AND disabled = 0', $module->{'id_agente_modulo'});
foreach my $alert (@alerts) { foreach my $alert (@alerts) {
my $rc = pandora_evaluate_alert($pa_config, $data, $status, $alert, my $rc = pandora_evaluate_alert($pa_config, $agent, $data, $status, $alert,
$utimestamp, $dbh); $utimestamp, $dbh);
pandora_process_alert ($pa_config, $data, $agent, $module, pandora_process_alert ($pa_config, $data, $agent, $module,
@ -110,8 +111,10 @@ sub pandora_generate_alerts ($$$$$$$) {
# 4 Recover the alert. # 4 Recover the alert.
# 5 Reset internal counter (alert not fired, interval elapsed). # 5 Reset internal counter (alert not fired, interval elapsed).
########################################################################## ##########################################################################
sub pandora_evaluate_alert ($$$$$$) { sub pandora_evaluate_alert ($$$$$$$) {
my ($pa_config, $data, $last_status, $alert, $utimestamp, $dbh) = @_; my ($pa_config, $agent, $data, $last_status, $alert, $utimestamp, $dbh) = @_;
logger ($pa_config, "Evaluating alert '" . $alert->{'name'} . "' for agent '" . $agent->{'nombre'} . "'.", 10);
# Value returned on valid data # Value returned on valid data
my $status = 1; my $status = 1;
@ -179,7 +182,7 @@ sub pandora_evaluate_alert ($$$$$$) {
return $status if ($last_status != 2 && $alert->{'type'} eq 'warning'); return $status if ($last_status != 2 && $alert->{'type'} eq 'warning');
} }
# Compound alert # Compound alert
elsif (pandora_evaluate_compound_alert($pa_config, $alert->{'id'}, $dbh) == 0) { elsif (pandora_evaluate_compound_alert($pa_config, $alert->{'id'}, $alert->{'name'}, $dbh) == 0) {
return $status return $status
} }
@ -196,6 +199,8 @@ sub pandora_evaluate_alert ($$$$$$) {
sub pandora_process_alert ($$$$$$$) { sub pandora_process_alert ($$$$$$$) {
my ($pa_config, $data, $agent, $module, $alert, $rc, $dbh) = @_; my ($pa_config, $data, $agent, $module, $alert, $rc, $dbh) = @_;
logger ($pa_config, "Processing alert '" . $alert->{'name'} . "' for agent '" . $agent->{'nombre'} . "': " . (defined ($AlertStatus[$rc]) ? $AlertStatus[$rc] : 'Unknown status') . ".", 10);
# Simple or compound alert? # Simple or compound alert?
my $id = defined ($alert->{'id_template_module'}) ? $alert->{'id_template_module'} : $alert->{'id'}; my $id = defined ($alert->{'id_template_module'}) ? $alert->{'id_template_module'} : $alert->{'id'};
my $table = defined ($alert->{'id_template_module'}) ? 'talert_template_modules' : 'talert_compound'; my $table = defined ($alert->{'id_template_module'}) ? 'talert_template_modules' : 'talert_compound';
@ -276,8 +281,10 @@ sub pandora_process_alert ($$$$$$$) {
# Evaluate the given compound alert. Returns 1 if the alert should be # Evaluate the given compound alert. Returns 1 if the alert should be
# fired, 0 if not. # fired, 0 if not.
########################################################################## ##########################################################################
sub pandora_evaluate_compound_alert ($$$) { sub pandora_evaluate_compound_alert ($$$$) {
my ($pa_config, $id, $dbh) = @_; my ($pa_config, $id, $name, $dbh) = @_;
logger ($pa_config, "Evaluating compound alert '$name'.", 10);
# Return value # Return value
my $status = 0; my $status = 0;
@ -318,6 +325,8 @@ sub pandora_evaluate_compound_alert ($$$) {
} }
elsif ($operation eq "NOP") { elsif ($operation eq "NOP") {
$status = $fired; $status = $fired;
} else {
logger ($pa_config, "Unknown operation: $operation.", 3);
} }
} }
@ -342,7 +351,7 @@ sub pandora_generate_compound_alerts ($$$$$$$$) {
next unless defined ($compound_alert); next unless defined ($compound_alert);
# Evaluate the alert # Evaluate the alert
my $rc = pandora_evaluate_alert ($pa_config, $data, $status, $compound_alert, my $rc = pandora_evaluate_alert ($pa_config, $agent, $data, $status, $compound_alert,
$utimestamp, $dbh); $utimestamp, $dbh);
pandora_process_alert ($pa_config, $data, $agent, $module, pandora_process_alert ($pa_config, $data, $agent, $module,
@ -357,6 +366,8 @@ sub pandora_execute_alert ($$$$$$$) {
my ($pa_config, $data, $agent, $module, my ($pa_config, $data, $agent, $module,
$alert, $alert_mode, $dbh) = @_; $alert, $alert_mode, $dbh) = @_;
logger ($pa_config, "Executing alert '" . $alert->{'name'} . "' for module '" . $module->{'nombre'} . "'.", 10);
# Get active actions/commands # Get active actions/commands
my @actions; my @actions;
@ -389,11 +400,13 @@ sub pandora_execute_alert ($$$$$$$) {
} }
# No actions defined # No actions defined
return if ($#actions < 0); if ($#actions < 0) {
logger ($pa_config, "No actions defined for alert '" . $alert->{'name'} . "' module '" . $module->{'nombre'} . "'.", 10);
return;
}
# Execute actions # Execute actions
foreach my $action (@actions) { foreach my $action (@actions) {
logger($pa_config, "Alert (" . $alert->{'name'} . ") executed for agent " . $agent->{'nombre'}, 2);
pandora_execute_action ($pa_config, $data, $agent, $alert, $alert_mode, $action, $module, $dbh); pandora_execute_action ($pa_config, $data, $agent, $alert, $alert_mode, $action, $module, $dbh);
} }
@ -412,6 +425,8 @@ sub pandora_execute_action ($$$$$$$$) {
my ($pa_config, $data, $agent, $alert, my ($pa_config, $data, $agent, $alert,
$alert_mode, $action, $module, $dbh) = @_; $alert_mode, $action, $module, $dbh) = @_;
logger($pa_config, "Executing action '" . $action->{'name'} . "' for alert '". $alert->{'name'} . "' agent '" . (defined ($agent) ? $agent->{'nombre'} : 'N/A') . "'.", 10);
my $field1 = $action->{'field1'} ne "" ? $action->{'field1'} : $alert->{'field1'}; my $field1 = $action->{'field1'} ne "" ? $action->{'field1'} : $alert->{'field1'};
my $field2 = $action->{'field2'} ne "" ? $action->{'field2'} : $alert->{'field2'}; my $field2 = $action->{'field2'} ne "" ? $action->{'field2'} : $alert->{'field2'};
my $field3 = $action->{'field3'} ne "" ? $action->{'field3'} : $alert->{'field3'}; my $field3 = $action->{'field3'} ne "" ? $action->{'field3'} : $alert->{'field3'};
@ -454,24 +469,20 @@ sub pandora_execute_action ($$$$$$$$) {
if ($action->{'internal'} == 0) { if ($action->{'internal'} == 0) {
my $command = subst_alert_macros (decode_entities ($action->{'command'}), \%macros); my $command = subst_alert_macros (decode_entities ($action->{'command'}), \%macros);
$command = subst_alert_macros ($command, \%macros); $command = subst_alert_macros ($command, \%macros);
logger($pa_config, "Executing command $command", 4); logger($pa_config, "Executing command '$command' for action '" . $action->{'name'} . "' alert '". $alert->{'name'} . "' agent '" . (defined ($agent) ? $agent->{'nombre'} : 'N/A') . "'.", 8);
eval { eval {
system ($command); system ($command);
if ($? != 0) { logger($pa_config, "Command '$command' for action '" . $action->{'name'} . "' alert '". $alert->{'name'} . "' agent '" . (defined ($agent) ? $agent->{'nombre'} : 'N/A') . "' returned with errorlevel " . ($? >> 8), 8);
logger($pa_config, 'Executed command for alert ' . $alert->{'name'} . ' returned with errorlevel ' . ($? >> 8), 1);
}
}; };
if ($@){ if ($@){
logger($pa_config, "Error $@ executing command $command", 1); logger($pa_config, "Error $@ executing command '$command' for action '" . $action->{'name'} . "' alert '". $alert->{'name'} . "' agent '" . (defined ($agent) ? $agent->{'nombre'} : 'N/A') ."'.", 8);
} }
# Internal Audit # Internal Audit
} elsif ($action->{'name'} eq "Internal Audit") { } elsif ($action->{'name'} eq "Internal Audit") {
$field1 = subst_alert_macros ($field1, \%macros); $field1 = subst_alert_macros ($field1, \%macros);
pandora_audit ($pa_config, $field1, defined ($agent) ? $agent->{'nombre'} : 'N/A', 'Alert (' . $alert->{'description'} . ')', $dbh); pandora_audit ($pa_config, $field1, defined ($agent) ? $agent->{'nombre'} : 'N/A', 'Alert (' . $alert->{'description'} . ')', $dbh);
# Email # Email
@ -489,7 +500,7 @@ sub pandora_execute_action ($$$$$$$$) {
# Unknown # Unknown
} else { } else {
logger($pa_config, "Unknown action " . $action->{'name'}, 1); logger($pa_config, "Unknown action '" . $action->{'name'} . "' for alert '". $alert->{'name'} . "' agent '" . (defined ($agent) ? $agent->{'nombre'} : 'N/A') . "'.", 3);
} }
} }
@ -514,52 +525,55 @@ sub pandora_process_module ($$$$$$$$$) {
my ($pa_config, $data, $agent, $module, $module_type, my ($pa_config, $data, $agent, $module, $module_type,
$timestamp, $utimestamp, $server_id, $dbh) = @_; $timestamp, $utimestamp, $server_id, $dbh) = @_;
logger($pa_config, "Processing module '" . $module->{'nombre'} . "' for agent " . (defined ($agent) ? "'" . $agent->{'nombre'} . "'" : 'ID ' . $module->{'id_agente'}) . ".", 10);
# Get module type # Get module type
if ($module_type eq '') { if (! defined ($module_type)) {
$module_type = get_db_value ($dbh, 'SELECT nombre FROM ttipo_modulo WHERE id_tipo = ?', $module->{'id_tipo_modulo'}); $module_type = get_db_value ($dbh, 'SELECT nombre FROM ttipo_modulo WHERE id_tipo = ?', $module->{'id_tipo_modulo'});
if (! defined ($module_type)) { if (! defined ($module_type)) {
logger($pa_config, "Invalid module type ID " . $module->{'id_tipo_modulo'} . " module '" . $module->{'nombre'} . "' agent " . (defined ($agent) ? "'" . $agent->{'nombre'} . "'" : 'ID ' . $module->{'id_agente'}) . ".", 10);
pandora_update_module_on_error ($pa_config, $module->{'id_agente_modulo'}, $dbh);
return;
}
}
# Get agent information
if (! defined ($agent)) {
$agent = get_db_single_row ($dbh, 'SELECT * FROM tagente WHERE id_agente = ?', $module->{'id_agente'});
if (! defined ($agent)) {
logger($pa_config, "Agent ID " . $module->{'id_agente'} . " not found while processing module '" . $module->{'nombre'} . "'.", 3);
pandora_update_module_on_error ($pa_config, $module->{'id_agente_modulo'}, $dbh); pandora_update_module_on_error ($pa_config, $module->{'id_agente_modulo'}, $dbh);
return; return;
} }
} }
# Process data # Process data
$data = process_data ($data, $module, $module_type, $utimestamp, $dbh); my $processed_data = process_data ($data, $module, $module_type, $utimestamp, $dbh);
if (! defined ($data)) { if (! defined ($data)) {
logger($pa_config, "Received invalid data from module '" . $module->{'nombre'} . "'", 3); logger($pa_config, "Received invalid data '" . $data . "' from agent '" . $agent->{'nombre'} . "' module '" . $module->{'nombre'} . "' agent " . (defined ($agent) ? "'" . $agent->{'nombre'} . "'" : 'ID ' . $module->{'id_agente'}) . ".", 3);
pandora_update_module_on_error ($pa_config, $module->{'id_agente_modulo'}, $dbh); pandora_update_module_on_error ($pa_config, $module->{'id_agente_modulo'}, $dbh);
return; return;
} }
# Get agent information $timestamp = strftime ("%Y-%m-%d %H:%M:%S", localtime($utimestamp)) if (! defined ($timestamp) || $timestamp eq '');
if ($agent eq '') {
$agent = get_db_single_row ($dbh, 'SELECT * FROM tagente WHERE id_agente = ?', $module->{'id_agente'});
if (! defined ($agent)) {
pandora_update_module_on_error ($pa_config, $module->{'id_agente_modulo'}, $dbh);
return;
}
}
if ($timestamp eq '') {
$timestamp = strftime ("%Y-%m-%d %H:%M:%S", localtime($utimestamp));
}
# Export data # Export data
export_module_data ($data, $agent, $module, $module_type, $timestamp, $dbh); export_module_data ($pa_config, $processed_data, $agent, $module, $module_type, $timestamp, $dbh);
# Get previous status # Get previous status
my $agent_status = get_db_single_row ($dbh, 'SELECT * FROM tagente_estado WHERE id_agente_modulo = ?', $module->{'id_agente_modulo'}); my $agent_status = get_db_single_row ($dbh, 'SELECT * FROM tagente_estado WHERE id_agente_modulo = ?', $module->{'id_agente_modulo'});
if (! defined ($agent_status)) { if (! defined ($agent_status)) {
logger($pa_config, "Status for agent '" . $agent->{'nombre'} . "' not found while processing module " . $module->{'nombre'} . ".", 3);
pandora_update_module_on_error ($pa_config, $module->{'id_agente_modulo'}, $dbh); pandora_update_module_on_error ($pa_config, $module->{'id_agente_modulo'}, $dbh);
return; return;
} }
# Get current status # Get current status
my $status = get_module_status ($data, $module, $module_type); my $status = get_module_status ($processed_data, $module, $module_type);
# Generate alerts # Generate alerts
if (pandora_inhibit_alerts ($pa_config, $agent, $dbh) == 0) { if (pandora_inhibit_alerts ($pa_config, $agent, $dbh) == 0) {
pandora_generate_alerts ($pa_config, $data, $status, $agent, $module, $utimestamp, $dbh); pandora_generate_alerts ($pa_config, $processed_data, $status, $agent, $module, $utimestamp, $dbh);
} }
#Update module status #Update module status
@ -570,7 +584,7 @@ sub pandora_process_module ($$$$$$$$$) {
# Generate events # Generate events
if ($status_changes == $module->{'min_ff_event'} + 1) { if ($status_changes == $module->{'min_ff_event'} + 1) {
generate_status_event ($pa_config, $data, $agent, $module, $status, $last_status, $dbh); generate_status_event ($pa_config, $processed_data, $agent, $module, $status, $last_status, $dbh);
} }
# tagente_estado.last_try defaults to NULL, should default to '0000-00-00 00:00:00' # tagente_estado.last_try defaults to NULL, should default to '0000-00-00 00:00:00'
@ -578,22 +592,23 @@ sub pandora_process_module ($$$$$$$$$) {
# Do we have to save module data? # Do we have to save module data?
if ($agent_status->{'last_try'} !~ /(\d+)\-(\d+)\-(\d+) +(\d+):(\d+):(\d+)/) { if ($agent_status->{'last_try'} !~ /(\d+)\-(\d+)\-(\d+) +(\d+):(\d+):(\d+)/) {
logger($pa_config, "Invalid last try timestamp '" . $agent_status->{'last_try'} . "' for agent '" . $agent->{'nombre'} . "' not found while processing module '" . $module->{'nombre'} . "'.", 3);
pandora_update_module_on_error ($pa_config, $module->{'id_agente_modulo'}, $dbh); pandora_update_module_on_error ($pa_config, $module->{'id_agente_modulo'}, $dbh);
return; return;
} }
my $last_try = ($1 == 0) ? 0 : timelocal($6, $5, $4, $3, $2 - 1, $1 - 1900); my $last_try = ($1 == 0) ? 0 : timelocal($6, $5, $4, $3, $2 - 1, $1 - 1900);
my $save = ($module->{'history_data'} == 1 && ($agent_status->{'datos'} ne $data || $last_try < (time() - 86400))) ? 1 : 0; my $save = ($module->{'history_data'} == 1 && ($agent_status->{'datos'} ne $processed_data || $last_try < (time() - 86400))) ? 1 : 0;
db_do ($dbh, 'UPDATE tagente_estado SET datos = ?, estado = ?, last_status = ?, status_changes = ?, utimestamp = ?, timestamp = ?, db_do ($dbh, 'UPDATE tagente_estado SET datos = ?, estado = ?, last_status = ?, status_changes = ?, utimestamp = ?, timestamp = ?,
id_agente = ?, current_interval = ?, running_by = ?, last_execution_try = ?, last_try = ? id_agente = ?, current_interval = ?, running_by = ?, last_execution_try = ?, last_try = ?
WHERE id_agente_modulo = ?', $data, $status, $last_status, $status_changes, WHERE id_agente_modulo = ?', $processed_data, $status, $last_status, $status_changes,
$current_utimestamp, $timestamp, $module->{'id_agente'}, $module->{'module_interval'}, $server_id, $current_utimestamp, $timestamp, $module->{'id_agente'}, $module->{'module_interval'}, $server_id,
$utimestamp, ($save == 1) ? $timestamp : $agent_status->{'last_try'}, $module->{'id_agente_modulo'}); $utimestamp, ($save == 1) ? $timestamp : $agent_status->{'last_try'}, $module->{'id_agente_modulo'});
# Save module data # Save module data
if ($save == 1) { if ($save == 1) {
save_module_data ($data, $module, $module_type, $utimestamp, $dbh); save_module_data ($processed_data, $module, $module_type, $utimestamp, $dbh);
} }
} }
@ -602,7 +617,6 @@ sub pandora_process_module ($$$$$$$$$) {
########################################################################## ##########################################################################
sub pandora_planned_downtime ($$) { sub pandora_planned_downtime ($$) {
my ($pa_config, $dbh) = @_; my ($pa_config, $dbh) = @_;
my $utimestamp = time(); my $utimestamp = time();
# Start pending downtimes (disable agents) # Start pending downtimes (disable agents)
@ -610,13 +624,15 @@ sub pandora_planned_downtime ($$) {
foreach my $downtime (@downtimes) { foreach my $downtime (@downtimes) {
logger($pa_config, "Starting planned downtime '" . $downtime->{'nombre'} . "'.", 10);
db_do($dbh, 'UPDATE tplanned_downtime SET executed = 1 WHERE id = ?', $downtime->{'id'}); db_do($dbh, 'UPDATE tplanned_downtime SET executed = 1 WHERE id = ?', $downtime->{'id'});
pandora_event ($pa_config, "Server ".$pa_config->{'servername'}." started planned downtime: ".$downtime->{'description'}, 0, 0, 1, 0, 0, 'system', $dbh); pandora_event ($pa_config, "Server ".$pa_config->{'servername'}." started planned downtime: ".$downtime->{'description'}, 0, 0, 1, 0, 0, 'system', $dbh);
my @downtime_agents = db_do($dbh, 'SELECT * FROM tplanned_downtime_agents WHERE id_downtime = ' . $downtime->{'id'}); my @downtime_agents = db_do($dbh, 'SELECT * FROM tplanned_downtime_agents WHERE id_downtime = ' . $downtime->{'id'});
foreach my $downtime_agent (@downtime_agents) { foreach my $downtime_agent (@downtime_agents) {
db_do ($dbh, 'UPDATE tagente SET disabled = 1 WHERE id_agente = ?', $downtime_agent->{'id_agent'}); db_do ($dbh, 'UPDATE tagente SET disabled = 1 WHERE id_grupo = ?', $downtime_agent->{'id_group'});
} }
} }
@ -624,13 +640,15 @@ sub pandora_planned_downtime ($$) {
@downtimes = get_db_rows($dbh, 'SELECT * FROM tplanned_downtime WHERE executed = 1 AND date_to <= ?', $utimestamp); @downtimes = get_db_rows($dbh, 'SELECT * FROM tplanned_downtime WHERE executed = 1 AND date_to <= ?', $utimestamp);
foreach my $downtime (@downtimes) { foreach my $downtime (@downtimes) {
logger($pa_config, "Ending planned downtime '" . $downtime->{'nombre'} . "'.", 10);
db_do($dbh, 'UPDATE tplanned_downtime SET executed = 0 WHERE id = ?', $downtime->{'id'}); db_do($dbh, 'UPDATE tplanned_downtime SET executed = 0 WHERE id = ?', $downtime->{'id'});
pandora_event ($pa_config, 'Server ' . $pa_config->{'servername'} . ' stopped planned downtime: ' . $downtime->{'description'}, 0, 0, 1, 0, 0, 'system', $dbh); pandora_event ($pa_config, 'Server ' . $pa_config->{'servername'} . ' stopped planned downtime: ' . $downtime->{'description'}, 0, 0, 1, 0, 0, 'system', $dbh);
my @downtime_agents = get_db_rows($dbh, 'SELECT * FROM tplanned_downtime_agents WHERE id_downtime = ' . $downtime->{'id'}); my @downtime_agents = get_db_rows($dbh, 'SELECT * FROM tplanned_downtime_agents WHERE id_downtime = ' . $downtime->{'id'});
foreach my $downtime_agent (@downtime_agents) { foreach my $downtime_agent (@downtime_agents) {
db_do ($dbh, 'UPDATE tagente SET disabled = 0 WHERE id_agente = ?', $downtime_agent->{'id_agent'}); db_do ($dbh, 'UPDATE tagente SET disabled = 0 WHERE id_agrupo = ?', $downtime_agent->{'id_group'});
} }
} }
} }
@ -640,7 +658,7 @@ sub pandora_planned_downtime ($$) {
########################################################################## ##########################################################################
sub pandora_reset_server ($$) { sub pandora_reset_server ($$) {
my ($pa_config, $dbh) = @_; my ($pa_config, $dbh) = @_;
db_do ($dbh, 'UPDATE tserver SET status = 0, threads = 0, queued_modules = 0 WHERE name = ?', $pa_config->{'servername'}); db_do ($dbh, 'UPDATE tserver SET status = 0, threads = 0, queued_modules = 0 WHERE name = ?', $pa_config->{'servername'});
} }
@ -666,7 +684,10 @@ sub pandora_update_server ($$$$$;$$) {
$server = get_db_single_row ($dbh, 'SELECT * FROM tserver $server = get_db_single_row ($dbh, 'SELECT * FROM tserver
WHERE id_server = ?', WHERE id_server = ?',
$server_id); $server_id);
return unless defined ($server); if (! defined ($server)) {
logger($pa_config, "Server '" . $pa_config->{'servername'} . "' not found.", 3);
return;
}
} }
# Server going up # Server going up
@ -711,6 +732,8 @@ sub pandora_update_agent ($$$$$$$) {
sub pandora_module_keep_alive ($$$$$) { sub pandora_module_keep_alive ($$$$$) {
my ($pa_config, $id_agent, $agent_name, $server_id, $dbh) = @_; my ($pa_config, $id_agent, $agent_name, $server_id, $dbh) = @_;
logger($pa_config, "Updating keep_alive module for agent '" . $agent_name . "'.", 10);
# Update keepalive module # Update keepalive module
my $module = get_db_single_row ($dbh, 'SELECT * FROM tagente_modulo WHERE id_agente = ? AND id_tipo_modulo = 100', $id_agent); my $module = get_db_single_row ($dbh, 'SELECT * FROM tagente_modulo WHERE id_agente = ? AND id_tipo_modulo = 100', $id_agent);
return unless defined ($module); return unless defined ($module);
@ -725,6 +748,8 @@ sub pandora_create_incident ($$$$$$$$) {
my ($pa_config, $dbh, $title, $text, my ($pa_config, $dbh, $title, $text,
$priority, $status, $origin, $id_group) = @_; $priority, $status, $origin, $id_group) = @_;
logger($pa_config, "Creating incident '$text' source '$origin'.", 8);
db_do($dbh, 'INSERT INTO tincidencia (`inicio`, `titulo`, `descripcion`, `origen`, `estado`, `prioridad`, `id_grupo`) db_do($dbh, 'INSERT INTO tincidencia (`inicio`, `titulo`, `descripcion`, `origen`, `estado`, `prioridad`, `id_grupo`)
VALUES (NOW(), ?, ?, ?, ?, ?, ?)', $title, $text, $origin, $status, $priority, $id_group); VALUES (NOW(), ?, ?, ?, ?, ?, ?)', $title, $text, $origin, $status, $priority, $id_group);
} }
@ -737,6 +762,8 @@ sub pandora_audit ($$$$$) {
my ($pa_config, $description, $name, $action, $dbh) = @_; my ($pa_config, $description, $name, $action, $dbh) = @_;
my $disconnect = 0; my $disconnect = 0;
logger($pa_config, "Creating audit entry '$description' name '$name' action '$action'.", 10);
my $utimestamp = time(); my $utimestamp = time();
my $timestamp = strftime ("%Y-%m-%d %H:%M:%S", localtime($utimestamp)); my $timestamp = strftime ("%Y-%m-%d %H:%M:%S", localtime($utimestamp));
@ -751,10 +778,12 @@ sub pandora_audit ($$$$$) {
# Create a new entry in tagente_modulo and the corresponding entry in # Create a new entry in tagente_modulo and the corresponding entry in
# tagente_estado. # tagente_estado.
########################################################################## ##########################################################################
sub pandora_create_module ($$$$$$$$$) { sub pandora_create_module ($$$$$$$$$$) {
my ($agent_id, $module_type_id, $module_name, $max, my ($pa_config, $agent_id, $module_type_id, $module_name, $max,
$min, $post_process, $description, $interval, $dbh) = @_; $min, $post_process, $description, $interval, $dbh) = @_;
logger($pa_config, "Creating module '$module_name' for agent ID $agent_id.", 10);
# Provide some default values # Provide some default values
$max = 0 if ($max eq ''); $max = 0 if ($max eq '');
$min = 0 if ($min eq ''); $min = 0 if ($min eq '');
@ -775,7 +804,7 @@ sub pandora_create_agent ($$$$$$$$$$) {
$address_id, $group_id, $parent_id, $os_id, $address_id, $group_id, $parent_id, $os_id,
$description, $dbh) = @_; $description, $dbh) = @_;
logger ($pa_config, "$server_name: Creating agent $agent_name ($address)", 1); logger ($pa_config, "Server '$server_name' creating agent '$agent_name' address '$address'.", 10);
$description = "Created by $server_name" unless ($description ne ''); $description = "Created by $server_name" unless ($description ne '');
@ -793,6 +822,8 @@ sub pandora_event (%$$$$$$$$) {
my ($pa_config, $evento, $id_grupo, $id_agente, $severity, my ($pa_config, $evento, $id_grupo, $id_agente, $severity,
$id_alert_am, $id_agentmodule, $event_type, $dbh) = @_; $id_alert_am, $id_agentmodule, $event_type, $dbh) = @_;
logger($pa_config, "Generating event '$evento' for agent ID $id_agente module ID $id_agentmodule.", 10);
my $utimestamp = time (); my $utimestamp = time ();
my $timestamp = strftime ("%Y-%m-%d %H:%M:%S", localtime ($utimestamp)); my $timestamp = strftime ("%Y-%m-%d %H:%M:%S", localtime ($utimestamp));
$id_agentmodule = 0 unless defined ($id_agentmodule); $id_agentmodule = 0 unless defined ($id_agentmodule);
@ -807,6 +838,8 @@ sub pandora_event (%$$$$$$$$) {
sub pandora_update_module_on_error ($$$) { sub pandora_update_module_on_error ($$$) {
my ($pa_config, $id_agent_module, $dbh) = @_; my ($pa_config, $id_agent_module, $dbh) = @_;
logger($pa_config, "Updating module ID $id_agent_module on error.", 10);
# Update last_execution_try # Update last_execution_try
db_do ($dbh, 'UPDATE tagente_estado SET last_execution_try = ? db_do ($dbh, 'UPDATE tagente_estado SET last_execution_try = ?
WHERE id_agente_modulo = ?', time (), $id_agent_module); WHERE id_agente_modulo = ?', time (), $id_agent_module);
@ -828,9 +861,15 @@ sub pandora_exec_forced_alerts {
# Get the agent and module associated with the alert # Get the agent and module associated with the alert
my $module = get_db_single_row ($dbh, 'SELECT * FROM tagente_modulo WHERE id_agente_modulo = ?', $alert->{'id_agent_module'}); my $module = get_db_single_row ($dbh, 'SELECT * FROM tagente_modulo WHERE id_agente_modulo = ?', $alert->{'id_agent_module'});
next unless defined ($module); if (! defined ($module)) {
logger($pa_config, "Module ID " . $alert->{'id_agent_module'} . " not found for alert ID " . $alert->{'id_template_module'} . ".", 10);
next;
}
my $agent = get_db_single_row ($dbh, 'SELECT * FROM tagente WHERE id_agente = ?', $module->{'id_agente'}); my $agent = get_db_single_row ($dbh, 'SELECT * FROM tagente WHERE id_agente = ?', $module->{'id_agente'});
next unless defined ($agent); if (! defined ($agent)) {
logger($pa_config, "Agent ID " . $module->{'id_agente'} . " not found for module ID " . $module->{'id_agente_modulo'} . " alert ID " . $alert->{'id_template_module'} . ".", 10);
next;
}
pandora_execute_alert ($pa_config, 'N/A', $agent, $module, $alert, 1, $dbh); pandora_execute_alert ($pa_config, 'N/A', $agent, $module, $alert, 1, $dbh);
@ -857,6 +896,7 @@ sub pandora_module_keep_alive_nd {
AND ( tagente_estado.utimestamp + (tagente.intervalo * 2) < UNIX_TIMESTAMP())'); AND ( tagente_estado.utimestamp + (tagente.intervalo * 2) < UNIX_TIMESTAMP())');
foreach my $module (@modules) { foreach my $module (@modules) {
logger($pa_config, "Updating keep_alive module for module '" . $module->{'nombre'} . "' agent ID " . $module->{'id_agente'} . " (agent without data).", 10);
pandora_process_module ($pa_config, 0, '', $module, 'keep_alive', '', time (), 0, $dbh); pandora_process_module ($pa_config, 0, '', $module, 'keep_alive', '', time (), 0, $dbh);
} }
} }
@ -867,12 +907,15 @@ sub pandora_module_keep_alive_nd {
sub pandora_evaluate_snmp_alerts ($$$$$$$$) { sub pandora_evaluate_snmp_alerts ($$$$$$$$) {
my ($pa_config, $trap_id, $trap_agent, $trap_oid, my ($pa_config, $trap_id, $trap_agent, $trap_oid,
$trap_oid_text, $trap_custom_oid, $trap_custom_value, $dbh) = @_; $trap_oid_text, $trap_custom_oid, $trap_custom_value, $dbh) = @_;
# Get all SNMP alerts # Get all SNMP alerts
my @snmp_alerts = get_db_rows ($dbh, 'SELECT * FROM talert_snmp'); my @snmp_alerts = get_db_rows ($dbh, 'SELECT * FROM talert_snmp');
# Find those that apply to the given SNMP trap # Find those that apply to the given SNMP trap
foreach my $alert (@snmp_alerts) { foreach my $alert (@snmp_alerts) {
logger($pa_config, "Evaluating SNMP alert ID " . $alert->{'id_as'} . ".", 10);
my ($fire_alert, $alert_data) = (0, ''); my ($fire_alert, $alert_data) = (0, '');
my ($times_fired, $internal_counter, $alert_type) = my ($times_fired, $internal_counter, $alert_type) =
($alert->{'times_fired'}, $alert->{'internal_counter'}, $alert->{'alert_type'}); ($alert->{'times_fired'}, $alert->{'internal_counter'}, $alert->{'alert_type'});
@ -1136,7 +1179,6 @@ sub get_module_status ($$) {
sub generate_status_event ($$$$$$$) { sub generate_status_event ($$$$$$$) {
my ($pa_config, $data, $agent, $module, $status, $last_status, $dbh) = @_; my ($pa_config, $data, $agent, $module, $status, $last_status, $dbh) = @_;
my ($event_type, $severity); my ($event_type, $severity);
my $description = "Module " . $module->{'nombre'} . " ($data) is "; my $description = "Module " . $module->{'nombre'} . " ($data) is ";
# Normal # Normal
@ -1168,6 +1210,7 @@ sub generate_status_event ($$$$$$$) {
enterprise_hook('mcast_change_report', [$pa_config, $module->{'nombre'}, $module->{'custom_id'}, strftime ("%Y-%m-%d %H:%M:%S", localtime()), 'WARN', $dbh]); enterprise_hook('mcast_change_report', [$pa_config, $module->{'nombre'}, $module->{'custom_id'}, strftime ("%Y-%m-%d %H:%M:%S", localtime()), 'WARN', $dbh]);
} else { } else {
# Unknown status # Unknown status
logger($pa_config, "Unknown status $status for module '" . $module->{'nombre'} . "' agent '" . $agent->{'nombre'} . "'.", 10);
return; return;
} }
@ -1191,12 +1234,13 @@ sub save_module_data ($$$$$) {
########################################################################## ##########################################################################
# Export module data. # Export module data.
########################################################################## ##########################################################################
sub export_module_data ($$$$$$) { sub export_module_data ($$$$$$$) {
my ($data, $agent, $module, $module_type, $timestamp, $dbh) = @_; my ($pa_config, $data, $agent, $module, $module_type, $timestamp, $dbh) = @_;
# Data export is disabled # Data export is disabled
return if ($module->{'id_export'} < 1); return if ($module->{'id_export'} < 1);
logger($pa_config, "Exporting data for module '" . $module->{'nombre'} . "' agent '" . $agent->{'nombre'} . "'.", 10);
db_do($dbh, 'INSERT INTO tserver_export_data db_do($dbh, 'INSERT INTO tserver_export_data
(`id_export_server`, `agent_name` , `module_name`, `module_type`, `data`, `timestamp`) VALUES (`id_export_server`, `agent_name` , `module_name`, `module_type`, `data`, `timestamp`) VALUES
(?, ?, ?, ?, ?, ?)', $module->{'id_export'}, $agent->{'nombre'}, $module->{'nombre'}, $module_type, $data, $timestamp); (?, ?, ?, ?, ?, ?)', $module->{'id_export'}, $agent->{'nombre'}, $module->{'nombre'}, $module_type, $data, $timestamp);

View File

@ -42,6 +42,7 @@ my %PendingTasks :shared;
my $Sem :shared = Thread::Semaphore->new; my $Sem :shared = Thread::Semaphore->new;
my $TaskSem :shared = Thread::Semaphore->new (0); my $TaskSem :shared = Thread::Semaphore->new (0);
my $AgentSem :shared = Thread::Semaphore->new (1); my $AgentSem :shared = Thread::Semaphore->new (1);
my $ModuleSem :shared = Thread::Semaphore->new (1);
######################################################################################## ########################################################################################
# Data Server class constructor. # Data Server class constructor.
@ -65,7 +66,7 @@ sub run ($) {
my $self = shift; my $self = shift;
my $pa_config = $self->getConfig (); my $pa_config = $self->getConfig ();
print " [*] Starting Pandora FMS Data Server. \n"; print_message ($pa_config, " [*] Starting Pandora FMS Data Server.", 1);
$self->setNumThreads ($pa_config->{'dataserver_threads'}); $self->setNumThreads ($pa_config->{'dataserver_threads'});
$self->SUPER::run (\@TaskQueue, \%PendingTasks, $Sem, $TaskSem); $self->SUPER::run (\@TaskQueue, \%PendingTasks, $Sem, $TaskSem);
} }
@ -138,7 +139,7 @@ sub data_consumer ($$) {
$xml_data->{'timestamp'} = strftime ("%Y-%m-%d %H:%M:%S", localtime((stat($file_name))[9])) if ($pa_config->{'use_xml_timestamp'} eq '1' || ! defined ($xml_data->{'timestamp'})); $xml_data->{'timestamp'} = strftime ("%Y-%m-%d %H:%M:%S", localtime((stat($file_name))[9])) if ($pa_config->{'use_xml_timestamp'} eq '1' || ! defined ($xml_data->{'timestamp'}));
unlink ($file_name); unlink ($file_name);
process_xml_data ($self->getConfig (), $xml_data, $self->getServerID (), $self->getDBH ()); process_xml_data ($self->getConfig (), $file_name, $xml_data, $self->getServerID (), $self->getDBH ());
return; return;
} }
@ -149,8 +150,8 @@ sub data_consumer ($$) {
############################################################################### ###############################################################################
# Process XML data coming from an agent. # Process XML data coming from an agent.
############################################################################### ###############################################################################
sub process_xml_data ($$$$) { sub process_xml_data ($$$$$) {
my ($pa_config, $data, $server_id, $dbh) = @_; my ($pa_config, $file_name, $data, $server_id, $dbh) = @_;
my ($agent_name, $agent_version, $timestamp, $interval, $os_version) = my ($agent_name, $agent_version, $timestamp, $interval, $os_version) =
($data->{'agent_name'}, $data->{'version'}, $data->{'timestamp'}, ($data->{'agent_name'}, $data->{'version'}, $data->{'timestamp'},
@ -158,7 +159,7 @@ sub process_xml_data ($$$$) {
# Unknown agent! # Unknown agent!
if (! defined ($agent_name) || $agent_name eq '') { if (! defined ($agent_name) || $agent_name eq '') {
logger($pa_config, 'ERROR: Received data from an unnamed agent', 2); logger($pa_config, "$file_name has data from an unnamed agent", 3);
return; return;
} }
@ -252,21 +253,37 @@ sub process_module_data ($$$$$$$$$) {
# Get agent data # Get agent data
my $agent = get_db_single_row ($dbh, 'SELECT * FROM tagente WHERE nombre = ?', $agent_name); my $agent = get_db_single_row ($dbh, 'SELECT * FROM tagente WHERE nombre = ?', $agent_name);
return unless defined ($agent); if (! defined ($agent)) {
logger($pa_config, "Invalid agent '$agent_name' for module '$module_name'.", 3);
return;
}
# Get module data or create it if it does not exist # Get module data or create it if it does not exist
$ModuleSem->down ();
my $module = get_db_single_row ($dbh, 'SELECT * FROM tagente_modulo WHERE id_agente = ? AND nombre = ?', $agent->{'id_agente'}, $module_name); my $module = get_db_single_row ($dbh, 'SELECT * FROM tagente_modulo WHERE id_agente = ? AND nombre = ?', $agent->{'id_agente'}, $module_name);
if (! defined ($module)) { if (! defined ($module)) {
# Do not auto create modules # Do not auto create modules
return unless ($pa_config->{'autocreate'} == 1); if ($pa_config->{'autocreate'} ne '1') {
logger($pa_config, "Module '$module_name' not found for agent '$agent_name' and module auto-creation disabled.", 10);
$ModuleSem->up ();
return;
}
# Is the agent learning? # Is the agent learning?
return unless ($agent->{'modo'} eq '1'); if ($agent->{'modo'} ne '1') {
logger($pa_config, "Learning mode disabled. Skipping module '$module_name' agent '$agent_name'.", 10);
$ModuleSem->up ();
return;
}
# Get the module type # Get the module type
my $module_id = get_module_id ($dbh, $module_type); my $module_id = get_module_id ($dbh, $module_type);
return unless ($module_id > 0); if ($module_id <= 0) {
logger($pa_config, "Invalid module type '$module_type' for module '$module_name' agent '$agent_name'.", 3);
$ModuleSem->up ();
return;
}
# Get min/max/description/post process # Get min/max/description/post process
my $max = get_tag_value ($data, 'max', 0); my $max = get_tag_value ($data, 'max', 0);
@ -278,22 +295,33 @@ sub process_module_data ($$$$$$$$$) {
$post_process =~ s/,/./; $post_process =~ s/,/./;
# Create the module # Create the module
pandora_create_module ($agent->{'id_agente'}, $module_id, $module_name, pandora_create_module ($pa_config, $agent->{'id_agente'}, $module_id, $module_name,
$max, $min, $post_process, $description, $interval, $dbh); $max, $min, $post_process, $description, $interval, $dbh);
$module = get_db_single_row ($dbh, 'SELECT * FROM tagente_modulo WHERE id_agente = ? AND nombre = ?', $agent->{'id_agente'}, $module_name); $module = get_db_single_row ($dbh, 'SELECT * FROM tagente_modulo WHERE id_agente = ? AND nombre = ?', $agent->{'id_agente'}, $module_name);
return unless defined $module; if (! defined ($module)) {
logger($pa_config, "Could not create module '$module_name' for agent '$agent_name'.", 3);
$ModuleSem->up ();
return;
}
} }
$ModuleSem->up ();
# Module disabled! # Module disabled!
return if ($module->{'disabled'} eq '1'); if ($module->{'disabled'} eq '1') {
logger($pa_config, "Skipping disabled module '$module_name' agent '$agent_name'.", 10);
return;
}
# Parse the timestamp and process the module # Parse the timestamp and process the module
if ($timestamp =~ /(\d+)\/(\d+)\/(\d+) +(\d+):(\d+):(\d+)/ || if ($timestamp !~ /(\d+)\/(\d+)\/(\d+) +(\d+):(\d+):(\d+)/ &&
$timestamp =~ /(\d+)\-(\d+)\-(\d+) +(\d+):(\d+):(\d+)/) { $timestamp !~ /(\d+)\-(\d+)\-(\d+) +(\d+):(\d+):(\d+)/) {
my $utimestamp = timelocal($6, $5, $4, $3, $2 - 1, $1 - 1900); logger($pa_config, "Invalid timestamp '$timestamp' from module '$module_name' agent '$agent_name'.", 3);
my $value = get_tag_value ($data, 'data', ''); return;
pandora_process_module ($pa_config, $value, $agent, $module, $module_type, $timestamp, $utimestamp, $server_id, $dbh);
} }
my $utimestamp = timelocal($6, $5, $4, $3, $2 - 1, $1 - 1900);
my $value = get_tag_value ($data, 'data', '');
pandora_process_module ($pa_config, $value, $agent, $module, $module_type, $timestamp, $utimestamp, $server_id, $dbh);
} }
1; 1;

View File

@ -50,8 +50,8 @@ sub new ($$$) {
return undef unless $config->{'networkserver'} == 1; return undef unless $config->{'networkserver'} == 1;
if (! -e $config->{'snmpget'}) { if (! -e $config->{'snmpget'}) {
logger ($config, ' [E] ' . $config->{'snmpget'} . " needed by Pandora FMS Network Server not found.", 0); logger ($config, ' [E] ' . $config->{'snmpget'} . " needed by Pandora FMS Network Server not found.", 1);
print ' [E] ' . $config->{'snmpget'} . " needed by Pandora FMS Network Server not found.\n\n"; print_message ($config, ' [E] ' . $config->{'snmpget'} . " needed by Pandora FMS Network Server not found.", 1);
return undef; return undef;
} }
@ -69,7 +69,7 @@ sub run ($) {
my $self = shift; my $self = shift;
my $pa_config = $self->getConfig (); my $pa_config = $self->getConfig ();
print " [*] Starting Pandora FMS Network Server. \n"; print_message ($pa_config, " [*] Starting Pandora FMS Network Server.", 1);
$self->setNumThreads ($pa_config->{'network_threads'}); $self->setNumThreads ($pa_config->{'network_threads'});
$self->SUPER::run (\@TaskQueue, \%PendingTasks, $Sem, $TaskSem); $self->SUPER::run (\@TaskQueue, \%PendingTasks, $Sem, $TaskSem);
} }
@ -376,7 +376,7 @@ sub exec_network_module ($$$$) {
# Is everything goes ok # Is everything goes ok
if ($module_result == 0) { if ($module_result == 0) {
pandora_process_module ($pa_config, $module_data, '', $module, '', $timestamp, $utimestamp, $server_id, $dbh); pandora_process_module ($pa_config, $module_data, undef, $module, undef, $timestamp, $utimestamp, $server_id, $dbh);
# Update agent last contact using Pandora version as agent version # Update agent last contact using Pandora version as agent version
pandora_update_agent ($pa_config, $timestamp, $id_agente, $pa_config->{'servername'}.'_Net', $pa_config->{'version'}, -1, $dbh); pandora_update_agent ($pa_config, $timestamp, $id_agente, $pa_config->{'servername'}.'_Net', $pa_config->{'version'}, -1, $dbh);

View File

@ -51,8 +51,8 @@ sub new ($$;$) {
# Check for pandora_exec # Check for pandora_exec
if (system($config->{'plugin_exec'} . ' > /dev/null 2>&1') != 256) { if (system($config->{'plugin_exec'} . ' > /dev/null 2>&1') != 256) {
logger ($config, " [E] pandora_exec not found. Plugin Server not started.", 0); logger ($config, " [E] pandora_exec not found. Plugin Server not started.", 1);
print " [E] pandora_exec not found. Plugin Server not started.\n\n"; print_message ($config, " [E] pandora_exec not found. Plugin Server not started.", 1);
return undef; return undef;
} }
@ -70,7 +70,7 @@ sub run ($) {
my $self = shift; my $self = shift;
my $pa_config = $self->getConfig (); my $pa_config = $self->getConfig ();
print " [*] Starting Pandora FMS Plugin Server. \n"; print_message ($pa_config, " [*] Starting Pandora FMS Plugin Server.", 1);
$self->setNumThreads ($pa_config->{'plugin_threads'}); $self->setNumThreads ($pa_config->{'plugin_threads'});
$self->SUPER::run (\@TaskQueue, \%PendingTasks, $Sem, $TaskSem); $self->SUPER::run (\@TaskQueue, \%PendingTasks, $Sem, $TaskSem);
} }
@ -206,7 +206,7 @@ sub data_consumer ($$) {
my $utimestamp = time (); my $utimestamp = time ();
my $timestamp = strftime ("%Y-%m-%d %H:%M:%S", localtime($utimestamp)); my $timestamp = strftime ("%Y-%m-%d %H:%M:%S", localtime($utimestamp));
pandora_process_module ($pa_config, $module_data, '', $module, '', $timestamp, $utimestamp, $self->getServerID (), $dbh); pandora_process_module ($pa_config, $module_data, undef, $module, undef, $timestamp, $utimestamp, $self->getServerID (), $dbh);
pandora_update_agent ($pa_config, $timestamp, $module->{'id_agente'}, $pa_config->{'servername'}.'_Plugin', $pa_config->{'version'}, -1, $dbh); pandora_update_agent ($pa_config, $timestamp, $module->{'id_agente'}, $pa_config->{'servername'}.'_Plugin', $pa_config->{'version'}, -1, $dbh);
} }

View File

@ -64,7 +64,7 @@ sub run ($) {
my $self = shift; my $self = shift;
my $pa_config = $self->getConfig (); my $pa_config = $self->getConfig ();
print " [*] Starting Pandora FMS Prediction Server. \n"; print_message ($pa_config, " [*] Starting Pandora FMS Prediction Server.", 1);
$self->setNumThreads ($pa_config->{'prediction_threads'}); $self->setNumThreads ($pa_config->{'prediction_threads'});
$self->SUPER::run (\@TaskQueue, \%PendingTasks, $Sem, $TaskSem); $self->SUPER::run (\@TaskQueue, \%PendingTasks, $Sem, $TaskSem);
} }
@ -235,7 +235,7 @@ sub exec_prediction_module ($$$$) {
$module_data = $average; $module_data = $average;
} }
pandora_process_module ($pa_config, $module_data, '', $agent_module, '', $timestamp, $utimestamp, $server_id, $dbh); pandora_process_module ($pa_config, $module_data, undef, $agent_module, undef, $timestamp, $utimestamp, $server_id, $dbh);
pandora_update_agent ($pa_config, $timestamp, $agent_module->{'id_agente'}, $pa_config->{'servername'}.'_Prediction', $pa_config->{'version'}, -1, $dbh); pandora_update_agent ($pa_config, $timestamp, $agent_module->{'id_agente'}, $pa_config->{'servername'}.'_Prediction', $pa_config->{'version'}, -1, $dbh);
} }

View File

@ -65,7 +65,7 @@ sub run ($) {
my $self = shift; my $self = shift;
my $pa_config = $self->getConfig (); my $pa_config = $self->getConfig ();
print " [*] Starting Pandora FMS Recon Server. \n"; print_message ($pa_config, " [*] Starting Pandora FMS Recon Server.", 1);
$self->setNumThreads ($pa_config->{'recon_threads'}); $self->setNumThreads ($pa_config->{'recon_threads'});
$self->SUPER::run (\@TaskQueue, \%PendingTasks, $Sem, $TaskSem); $self->SUPER::run (\@TaskQueue, \%PendingTasks, $Sem, $TaskSem);
} }
@ -110,7 +110,7 @@ sub data_consumer ($$) {
# Get a NetAddr::IP object for the target network # Get a NetAddr::IP object for the target network
my $net_addr = new NetAddr::IP ($task->{'subnet'}); my $net_addr = new NetAddr::IP ($task->{'subnet'});
if (! defined ($net_addr)) { if (! defined ($net_addr)) {
logger ($pa_config, 'Invalid network ' . $task->{'subnet'} . ' for task ' . $task->{'name'}, 2); logger ($pa_config, "Invalid network " . $task->{'subnet'} . " for task '" . $task->{'name'} . "'.", 3);
update_recon_task ($dbh, $task_id, -1); update_recon_task ($dbh, $task_id, -1);
return -1; return -1;
} }
@ -137,10 +137,14 @@ sub data_consumer ($$) {
} }
next unless ($alive > 0); next unless ($alive > 0);
logger($pa_config, "Found host $addr.", 10);
# Guess the OS and filter # Guess the OS and filter
my $id_os = guess_os ($pa_config, $addr); my $id_os = guess_os ($pa_config, $addr);
next if ($task->{'id_os'} > 0 && $task->{'id_os'} != $id_os); if ($task->{'id_os'} > 0 && $task->{'id_os'} != $id_os) {
logger($pa_config, "Skipping host $addr os ID $id_os.", 10);
next;
}
$hosts_found ++; $hosts_found ++;
$addr_found .= $addr . " "; $addr_found .= $addr . " ";
@ -155,7 +159,10 @@ sub data_consumer ($$) {
# Add the new address if it does not exist # Add the new address if it does not exist
my $addr_id = get_addr_id ($dbh, $addr); my $addr_id = get_addr_id ($dbh, $addr);
$addr_id = add_address ($dbh, $addr) unless ($addr_id > 0); $addr_id = add_address ($dbh, $addr) unless ($addr_id > 0);
next unless ($addr_id > 0); if ($addr_id <= 0) {
logger($pa_config, "Could not add address '$addr' for host '$host_name'.", 3);
next;
}
# Crate a new agent # Crate a new agent
my $agent_id = pandora_create_agent ($pa_config, $pa_config->{'servername'}, my $agent_id = pandora_create_agent ($pa_config, $pa_config->{'servername'},
@ -282,10 +289,15 @@ sub create_network_profile_modules {
my @np_components = get_db_rows ($dbh, 'SELECT * FROM tnetwork_profile_component WHERE id_np = ?', $np_id); my @np_components = get_db_rows ($dbh, 'SELECT * FROM tnetwork_profile_component WHERE id_np = ?', $np_id);
foreach my $np_component (@np_components) { foreach my $np_component (@np_components) {
# Get network component data # Get network component data
my $component = get_db_single_row ($dbh, 'SELECT * FROM tnetwork_component wHERE id_nc = ?', $np_component->{'id_nc'}); my $component = get_db_single_row ($dbh, 'SELECT * FROM tnetwork_component wHERE id_nc = ?', $np_component->{'id_nc'});
next unless defined ($component); if (! defined ($component)) {
logger($pa_config, "Network component ID " . $np_component->{'id_nc'} . " for agent $addr not found.", 3);
next;
}
logger($pa_config, "Processing network component '" . $component->{'name'} . "' for agent $addr.", 10);
# Create the module # Create the module
my $module_id = db_insert ($dbh, 'INSERT INTO tagente_modulo (id_agente, id_tipo_modulo, descripcion, nombre, max, min, module_interval, tcp_port, tcp_send, tcp_rcv, snmp_community, snmp_oid, ip_target, id_module_group, flag, disabled, plugin_user, plugin_pass, plugin_parameter, max_timeout, id_modulo ) my $module_id = db_insert ($dbh, 'INSERT INTO tagente_modulo (id_agente, id_tipo_modulo, descripcion, nombre, max, min, module_interval, tcp_port, tcp_send, tcp_rcv, snmp_community, snmp_oid, ip_target, id_module_group, flag, disabled, plugin_user, plugin_pass, plugin_parameter, max_timeout, id_modulo )
@ -293,13 +305,11 @@ sub create_network_profile_modules {
$agent_id, $component->{'type'}, $component->{'description'}, $component->{'name'}, $component->{'max'}, $component->{'min'}, $component->{'module_interval'}, $component->{'tcp_port'}, $component->{'tcp_send'}, $component->{'tcp_rcv'}, $component->{'snmp_community'}, $agent_id, $component->{'type'}, $component->{'description'}, $component->{'name'}, $component->{'max'}, $component->{'min'}, $component->{'module_interval'}, $component->{'tcp_port'}, $component->{'tcp_send'}, $component->{'tcp_rcv'}, $component->{'snmp_community'},
$component->{'snmp_oid'}, $addr, $component->{'id_module_group'}, $component->{'plugin_user'}, $component->{'plugin_pass'}, $component->{'plugin_parameter'}, $component->{'max_timeout'}, $component->{'id_modulo'}); $component->{'snmp_oid'}, $addr, $component->{'id_module_group'}, $component->{'plugin_user'}, $component->{'plugin_pass'}, $component->{'plugin_parameter'}, $component->{'max_timeout'}, $component->{'id_modulo'});
logger($pa_config, 'Recon Server: Creating module ' . $component->{'name'} . " for agent $addr", 3);
# An entry in tagente_estado is necessary for the module to work # An entry in tagente_estado is necessary for the module to work
db_insert ($dbh, 'INSERT INTO tagente_estado (id_agente_modulo, datos, timestamp, estado, id_agente, last_try, utimestamp, current_interval, running_by) db_insert ($dbh, 'INSERT INTO tagente_estado (id_agente_modulo, datos, timestamp, estado, id_agente, last_try, utimestamp, current_interval, running_by)
VALUES (?, \'\', \'0000-00-00 00:00:00\', 1, ?, \'0000-00-00 00:00:00\', 0, ?, 0)', VALUES (?, \'\', \'0000-00-00 00:00:00\', 1, ?, \'0000-00-00 00:00:00\', 0, ?, 0)',
$module_id, $agent_id, $component->{'module_interval'}); $module_id, $agent_id, $component->{'module_interval'});
logger($pa_config, 'Creating module ' . $component->{'name'} . " for agent $addr from network component '" . $component->{'name'} . "'.", 10);
} }
} }

View File

@ -45,8 +45,8 @@ sub new ($$;$) {
# Start snmptrapd # Start snmptrapd
if (system ($config->{'snmp_trapd'} . ' -t -On -n -a -Lf ' . $config->{'snmp_logfile'} . ' -p /var/run/pandora_snmptrapd.pid -F %4y-%02.2m-%l[**]%02.2h:%02.2j:%02.2k[**]%a[**]%N[**]%w[**]%W[**]%q[**]%v\\\n >/dev/null 2>&1') != 0) { if (system ($config->{'snmp_trapd'} . ' -t -On -n -a -Lf ' . $config->{'snmp_logfile'} . ' -p /var/run/pandora_snmptrapd.pid -F %4y-%02.2m-%l[**]%02.2h:%02.2j:%02.2k[**]%a[**]%N[**]%w[**]%W[**]%q[**]%v\\\n >/dev/null 2>&1') != 0) {
logger ($config, " [E] Could not start snmptrapd.\n\n", 0); logger ($config, " [E] Could not start snmptrapd.", 1);
print " [E] Could not start snmptrapd.\n\n"; print_message ($config, " [E] Could not start snmptrapd.", 1);
return undef; return undef;
} }
@ -62,8 +62,9 @@ sub new ($$;$) {
############################################################################### ###############################################################################
sub run ($) { sub run ($) {
my $self = shift; my $self = shift;
my $pa_config = $self->getConfig ();
print " [*] Starting Pandora FMS SNMP Console. \n"; print_message ($pa_config, " [*] Starting Pandora FMS SNMP Console.", 1);
$self->SUPER::run (\&PandoraFMS::SNMPServer::pandora_snmptrapd); $self->SUPER::run (\&PandoraFMS::SNMPServer::pandora_snmptrapd);
} }
@ -124,6 +125,7 @@ sub pandora_snmptrapd {
# Unknown data # Unknown data
next if ($line !~ m/\[\*\*\]/); next if ($line !~ m/\[\*\*\]/);
logger($pa_config, "Reading trap '$line'", 10);
my ($date, $time, $source, $oid, my ($date, $time, $source, $oid,
$type, $type_desc, $value, $data) = split(/\[\*\*\]/, $line); $type, $type_desc, $value, $data) = split(/\[\*\*\]/, $line);

View File

@ -247,46 +247,24 @@ sub md5check {
} }
########################################################################## ##########################################################################
# SUB logger (pa_config, param_1, param_2) # SUB logger (pa_config, message, level)
# Log to file # Log to file
########################################################################## ##########################################################################
# param_1 : Data file sub logger ($$;$) {
# param_2 : Data my ($pa_config, $message, $level) = @_;
sub logger { return if ($level > $pa_config->{'verbosity'});
my $pa_config = $_[0];
my $fichero = $pa_config->{"logfile"};
my $datos = $_[1];
my $param2= $_[2];
my $verbose_level = 2; # if parameter not passed, verbosity is 2
if (!defined $pa_config->{"verbosity"}){
$pa_config->{"verbosity"} = 0;
}
if (defined $param2){
if (is_numeric($param2)){
$verbose_level = $param2;
}
}
if ($verbose_level <= $pa_config->{"verbosity"}) { my $file = $pa_config->{'logfile'};
if ($verbose_level > 0) {
$datos = "[V".$verbose_level."] ".$datos;
}
my $time_now = strftime ("%Y-%m-%d %H:%M:%S", localtime()); # Log rotation
if (-e $fichero){ if (-e $file && (stat($file))[7] > $pa_config->{'max_log_size'}) {
my $filesize = (stat($fichero))[7]; rename ($file, $file.'.old');
if ( $filesize > $pa_config->{'max_log_size'}) {
rename ($fichero, $fichero.".old");
}
}
open (FILE, ">> $fichero") or die "[FATAL] Cannot open logfile at $fichero";
my $server_name = $pa_config->{'servername'}.$pa_config->{"servermode"};
print FILE "$time_now $server_name $datos \n";
close (FILE);
} }
open (FILE, ">> $file") or die "[FATAL] Could not open logfile '$fichero'";
print FILE strftime ("%Y-%m-%d %H:%M:%S", localtime()) . " " . $pa_config->{'servername'} . $pa_config->{'servermode'} . " [V". $level ."] " . $message . "\n";
close (FILE);
} }
########################################################################## ##########################################################################
@ -342,7 +320,15 @@ sub float_equal {
# Tries to load the PandoraEnterprise module. Must be called once before # Tries to load the PandoraEnterprise module. Must be called once before
# enterprise_hook (). # enterprise_hook ().
########################################################################## ##########################################################################
sub enterprise_load () { sub enterprise_load ($) {
my $pa_config = shift;
# Check dependencies
eval 'local $SIG{__DIE__}; require IO::Socket::Multicast';
if ($@) {
print_message ($pa_config, " [*] Error loading Pandora FMS Enterprise: IO::Socket::Multicast not found.", 1);
return 0;
}
# Already loaded # Already loaded
#return 1 if (is_loaded ('PandoraFMS::Enterprise')); #return 1 if (is_loaded ('PandoraFMS::Enterprise'));
@ -387,9 +373,7 @@ sub enterprise_hook ($$) {
sub print_message ($$$) { sub print_message ($$$) {
my ($pa_config, $message, $log_level) = @_; my ($pa_config, $message, $log_level) = @_;
if ($pa_config->{'verbosity'} > $log_level){ print STDOUT $message . "\n" if ($pa_config->{'verbosity'} >= $log_level);
print STDOUT $message . "\n";
}
} }
########################################################################## ##########################################################################

View File

@ -51,8 +51,8 @@ sub new ($$;$) {
# Check for a WMI client # Check for a WMI client
if (system ($config->{'wmi_client'} . ' > /dev/null 2>&1') != 256) { if (system ($config->{'wmi_client'} . ' > /dev/null 2>&1') != 256) {
logger ($config, ' [E] ' . $config->{'wmi_client'} . " not found. Pandora FMS WMI Server needs a DCOM/WMI client.", 0); logger ($config, ' [E] ' . $config->{'wmi_client'} . " not found. Pandora FMS WMI Server needs a DCOM/WMI client.", 1);
print ' [E] ' . $config->{'wmi_client'} . " not found. Pandora FMS WMI Server needs a DCOM/WMI client.\n\n"; print_message ($config, ' [E] ' . $config->{'wmi_client'} . " not found. Pandora FMS WMI Server needs a DCOM/WMI client.", 1);
return undef; return undef;
} }
@ -70,7 +70,7 @@ sub run ($) {
my $self = shift; my $self = shift;
my $pa_config = $self->getConfig (); my $pa_config = $self->getConfig ();
print " [*] Starting Pandora FMS WMI Server. \n"; print_message ($pa_config, " [*] Starting Pandora FMS WMI Server.", 1);
$self->setNumThreads ($pa_config->{'wmi_threads'}); $self->setNumThreads ($pa_config->{'wmi_threads'});
$self->SUPER::run (\@TaskQueue, \%PendingTasks, $Sem, $TaskSem); $self->SUPER::run (\@TaskQueue, \%PendingTasks, $Sem, $TaskSem);
} }
@ -192,7 +192,7 @@ sub data_consumer ($$) {
my $utimestamp = time (); my $utimestamp = time ();
my $timestamp = strftime ("%Y-%m-%d %H:%M:%S", localtime($utimestamp)); my $timestamp = strftime ("%Y-%m-%d %H:%M:%S", localtime($utimestamp));
pandora_process_module ($pa_config, $module_data, '', $module, '', $timestamp, $utimestamp, $self->getServerID (), $dbh); pandora_process_module ($pa_config, $module_data, undef, $module, undef, $timestamp, $utimestamp, $self->getServerID (), $dbh);
pandora_update_agent ($pa_config, $timestamp, $module->{'id_agente'}, $pa_config->{'servername'} . '_WMI', $pa_config->{'version'}, -1, $dbh); pandora_update_agent ($pa_config, $timestamp, $module->{'id_agente'}, $pa_config->{'servername'} . '_WMI', $pa_config->{'version'}, -1, $dbh);
} }