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:
parent
eee26aad4e
commit
6586957f8d
|
@ -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
|
||||||
|
|
|
@ -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 ();
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue