2010-02-10 Sancho Lerena <slerena@artica.es>

* bin/pandora_server: Better error management, avoiding to show Enterprise
	loading errors, and showing in console critical errors, helping to identify
	silly errors like DB credentials, etc.
	Added usage of pandora_get_sharedconfig() to get configuration from DB.

	* Config.pm: Updated build. Added pandora_get_sharedconfig(). Force three
	config tokens to be readed from DB, using default values if cannot be readen
	from database (agentaccess, realtimestat and stats_interval).

	* Core.pm: Added new parameter to pandora_event() to pass status of the 
	event (validated, not validated). Implemented auto-validation of low 
	priority events: normal/ok events will be always shown as autovalidated, and
	warning and normal events will be validated with critical events, and when
	a module is restored (normal/ok), all it's warning/critical pending events
	will be validated. 

	Fixed also bug with FF Threshold who doesnt' trigger events until FF + 1 
	instead FF value.

	* Server.pm,
	NetworkServer.pm,
	Dataserver.pm,
	ReconServer.pm: Raise event with status 0 (non validated) by default.

	* NetworkServer.pm: Implemented support for SNMP v3.

	* util/pandora_db.pm: Very important upgrade to this script. Now will
	delete all huge tables (tagente_datos, tagente_datos_string and 
	tagent_acccess) using several independent blocks (by default 100) avoiding
	mysql locks which happen in the past. 



git-svn-id: https://svn.code.sf.net/p/pandora/code/trunk@2341 c3f86ba8-e40f-0410-aaad-9ba5e7f4b01f
This commit is contained in:
slerena 2010-02-10 17:32:10 +00:00
parent 5cb263a7b6
commit 4aff58545d
10 changed files with 289 additions and 123 deletions

View File

@ -1,3 +1,36 @@
2010-02-10 Sancho Lerena <slerena@artica.es>
* bin/pandora_server: Better error management, avoiding to show Enterprise
loading errors, and showing in console critical errors, helping to identify
silly errors like DB credentials, etc.
Added usage of pandora_get_sharedconfig() to get configuration from DB.
* Config.pm: Updated build. Added pandora_get_sharedconfig(). Force three
config tokens to be readed from DB, using default values if cannot be readen
from database (agentaccess, realtimestat and stats_interval).
* Core.pm: Added new parameter to pandora_event() to pass status of the
event (validated, not validated). Implemented auto-validation of low
priority events: normal/ok events will be always shown as autovalidated, and
warning and normal events will be validated with critical events, and when
a module is restored (normal/ok), all it's warning/critical pending events
will be validated.
Fixed also bug with FF Threshold who doesnt' trigger events until FF + 1
instead FF value.
* Server.pm,
NetworkServer.pm,
Dataserver.pm,
ReconServer.pm: Raise event with status 0 (non validated) by default.
* NetworkServer.pm: Implemented support for SNMP v3.
* util/pandora_db.pm: Very important upgrade to this script. Now will
delete all huge tables (tagente_datos, tagente_datos_string and
tagent_acccess) using several independent blocks (by default 100) avoiding
mysql locks which happen in the past.
2010-02-08 Sancho Lerena <slerena@artica.es>
* util/pandora_db.pl: Script upgrade to purge data in several steps

View File

@ -68,6 +68,10 @@ sub pandora_startup () {
$DBH = db_connect ('mysql', $Config{'dbname'}, $Config{'dbhost'}, 3306,
$Config{'dbuser'}, $Config{'dbpass'});
# Grab config tokens shared with the console and not in the .conf
pandora_get_sharedconfig (\%Config, $DBH);
pandora_audit (\%Config, 'Pandora FMS Server Daemon starting', 'SYSTEM', 'System', $DBH);
# Load servers
@ -119,12 +123,32 @@ sub pandora_restart () {
########################################################################################
sub pandora_crash () {
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);
my $full_error = "";
my $show_error = 0;
# Avoid show messages about enterprise library loading failurem, VERY
# confussing.
foreach my $error_line (@_) {
logger (\%Config, '[E] \'' . $Config{'servername'} . "': $error_line", 1);
#print_message (\%Config, "[E] $error_line \n", 0);
if ($error_line !~ m/Enterprise/i){
logger (\%Config, '[E] \'' . $Config{'servername'} . "': $error_line", 1);
} else {
$show_error = 1;
}
$full_error .= $error_line;
}
if ($show_error == 1){
logger (\%Config, 'Pandora FMS Server \'' . $Config{'servername'} . '\' unhandled error.', 1);
}
# It's interesting show by console problems, not only in logs. This helps
# to solve stupid problems like Database credential problems for example
if ($full_error !~ m/Enterprise/i) {
print_message (\%Config, ' [E] Unhandled error in "' . $Config{'servername'} . "\". See more information in logfiles at '/var/log/pandora' \n", 0);
print_message (\%Config, " Error description:\n", 0);
print_message (\%Config, $full_error, 0);
}
}

View File

@ -237,6 +237,6 @@ max_queue_files 250
# Flag to activate GIS (positional infomration for agents and maps) by default it is desactivated
# activate_gis 0
# Radius of the Error in meters to consider two gis locations as the same location.
# location_error 50

View File

@ -33,11 +33,12 @@ our @EXPORT = qw(
pandora_init
pandora_load_config
pandora_start_log
pandora_get_sharedconfig
);
# version: Defines actual version of Pandora Server for this module only
my $pandora_version = "3.0";
my $pandora_build = "091216";
my $pandora_version = "3.1-dev";
my $pandora_build = "100209";
our $VERSION = $pandora_version." ".$pandora_build;
# Setup hash
@ -120,6 +121,41 @@ sub pandora_init {
}
}
##########################################################################
# Read some config tokens from database set by the console
##########################################################################
sub pandora_get_sharedconfig ($$) {
my $pa_config = $_[0];
my $dbh = $_[1];
my $temp;
# Agentaccess option
$temp = get_db_value ($dbh, "SELECT value FROM tconfig WHERE token = 'agentaccess'");
if (defined($temp)) {
$pa_config->{"agentaccess"} = $temp;
}
# Realtimestats 0 disabled, 1 enabled.
# Master servers will generate all the information (global tactical stats).
# and each server will generate it's own server stats (lag, etc).
$temp = get_db_value ($dbh, "SELECT value FROM tconfig WHERE token = 'realtimestats'");
if (defined($temp)) {
$pa_config->{"realtimestats"} = $temp;
}
# Stats_interval option
$temp = get_db_value ($dbh, "SELECT value FROM tconfig WHERE token = 'stats_interval'");
if (defined($temp)) {
$pa_config->{"stats_interval"} = $temp;
}
}
##########################################################################
# Read external configuration file
##########################################################################
@ -187,7 +223,6 @@ sub pandora_load_config {
$pa_config->{"web_threads"} = 1; # 3.0
$pa_config->{"activate_gis"} = 0; # 3.1
$pa_config->{"location_error"} = 50; # 3.1
$pa_config->{"max_queue_files"} = 250;
# Internal MTA for alerts, each server need its own config.
@ -223,9 +258,6 @@ sub pandora_load_config {
$pa_config->{'mcast_change_group'} = '';
$pa_config->{'mcast_change_port'} = '';
# Update tagent_access
$pa_config->{"agentaccess"} = 1;
# Ignore the timestamp in the XML and use the file timestamp instead
$pa_config->{'use_xml_timestamp'} = 0;
@ -238,6 +270,17 @@ sub pandora_load_config {
# Restart server on error
$pa_config->{'restart'} = 0;
# -------------------------------------------------------------------------
# This values are not stored in .conf files.
# This values should be stored in database, not in .conf files!
# Default values are set here because if they are not present in config DB
# don't get an error later.
$pa_config->{"realtimestats"} = 0;
$pa_config->{"stats_interval"} = 300;
$pa_config->{"agentaccess"} = 1;
# -------------------------------------------------------------------------
# Check for UID0
if ($pa_config->{"quiet"} != 0){
if ($> == 0){
@ -497,9 +540,6 @@ sub pandora_load_config {
elsif ($parametro =~ m/^max_queue_files\s([0-9]*)/i) {
$pa_config->{'max_queue_files'}= clean_blank($1);
}
elsif ($parametro =~ m/^agentaccess\s([0-1])/i) {
$pa_config->{'agentaccess'}= clean_blank($1);
}
elsif ($parametro =~ m/^use_xml_timestamp\s([0-1])/i) {
$pa_config->{'use_xml_timestamp'} = clean_blank($1);
}

View File

@ -219,7 +219,7 @@ sub pandora_process_alert ($$$$$$$) {
pandora_event ($pa_config, "Alert ceased (" .
$alert->{'name'} . ")", $agent->{'id_grupo'},
$agent->{'id_agente'}, $alert->{'priority'}, $id, $alert->{'id_agent_module'},
"alert_ceased", $dbh);
"alert_ceased", 0, $dbh);
return;
}
@ -416,7 +416,7 @@ sub pandora_execute_alert ($$$$$$$) {
pandora_event ($pa_config, "Alert $text (" . $alert->{'name'} . ") assigned to (". $module->{'nombre'} .")",
$agent->{'id_grupo'}, $agent->{'id_agente'}, $alert->{'priority'}, (defined ($alert->{'id_template_module'})) ? $alert->{'id_template_module'} : 0,
$alert->{'id_agent_module'}, $event, $dbh);
$alert->{'id_agent_module'}, $event, 0, $dbh);
}
##########################################################################
@ -585,7 +585,7 @@ sub pandora_process_module ($$$$$$$$$) {
($agent_status->{'status_changes'} + 1, $agent_status->{'last_status'});
# Generate events
if ($status_changes == $module->{'min_ff_event'} + 1) {
if ($status_changes == $module->{'min_ff_event'}) {
generate_status_event ($pa_config, $processed_data, $agent, $module, $status, $last_status, $dbh);
}
@ -629,7 +629,7 @@ sub pandora_planned_downtime ($$) {
logger($pa_config, "Starting planned downtime '" . $downtime->{'name'} . "'.", 10);
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', 0, $dbh);
my @downtime_agents = get_db_rows($dbh, 'SELECT * FROM tplanned_downtime_agents WHERE id_downtime = ' . $downtime->{'id'});
@ -646,7 +646,7 @@ sub pandora_planned_downtime ($$) {
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', 0, $dbh);
my @downtime_agents = get_db_rows($dbh, 'SELECT * FROM tplanned_downtime_agents WHERE id_downtime = ' . $downtime->{'id'});
@ -916,7 +916,7 @@ sub pandora_create_agent ($$$$$$$$$$$;$$$$) {
logger ($pa_config, "Server '$server_name' CREATED agent '$agent_name' address '$address'.", 10);
# FIXME: use $group_id instead of $pa_config->{'autocreate_group'} ????
pandora_event ($pa_config, "Agent [$agent_name] created by $server_name", $pa_config->{'autocreate_group'}, $agent_id, 2, 0, 0, 'new_agent', $dbh);
pandora_event ($pa_config, "Agent [$agent_name] created by $server_name", $pa_config->{'autocreate_group'}, $agent_id, 2, 0, 0, 'new_agent', 0, $dbh);
return $agent_id;
}
@ -925,7 +925,7 @@ sub pandora_create_agent ($$$$$$$$$$$;$$$$) {
##########################################################################
sub pandora_event (%$$$$$$$$) {
my ($pa_config, $evento, $id_grupo, $id_agente, $severity,
$id_alert_am, $id_agentmodule, $event_type, $dbh) = @_;
$id_alert_am, $id_agentmodule, $event_type, $event_status, $dbh) = @_;
logger($pa_config, "Generating event '$evento' for agent ID $id_agente module ID $id_agentmodule.", 10);
@ -934,7 +934,7 @@ sub pandora_event (%$$$$$$$$) {
$id_agentmodule = 0 unless defined ($id_agentmodule);
db_do ($dbh, 'INSERT INTO tevento (`id_agente`, `id_grupo`, `evento`, `timestamp`, `estado`, `utimestamp`, `event_type`, `id_agentmodule`, `id_alert_am`, `criticity`)
VALUES (?, ?, ?, ?, 0, ?, ?, ?, ?, ?)', $id_agente, $id_grupo, $evento, $timestamp, $utimestamp, $event_type, $id_agentmodule, $id_alert_am, $severity);
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', $id_agente, $id_grupo, $evento, $timestamp, $event_status, $utimestamp, $event_type, $id_agentmodule, $id_alert_am, $severity);
}
##########################################################################
@ -1094,7 +1094,7 @@ sub pandora_evaluate_snmp_alerts ($$$$$$$$) {
# Generate an event
pandora_event ($pa_config, "SNMP alert fired (" . $alert->{'description'} . ")",
0, 0, $alert->{'priority'}, 0, 0, 'alert_fired', $dbh);
0, 0, $alert->{'priority'}, 0, 0, 'alert_fired', 0, $dbh);
# Update alert status
db_do ($dbh, 'UPDATE talert_snmp SET times_fired = ?, last_fired = ?, internal_counter = ? WHERE id_as = ?',
@ -1278,6 +1278,20 @@ sub get_module_status ($$) {
return 0;
}
##########################################################################
# Validate event.
# This validates all events pending to ACK for the same id_agent_module
##########################################################################
sub pandora_validate_event (%$$) {
my ($pa_config, $id_agentmodule, $dbh) = @_;
if (!defined($id_agentmodule)){
return;
}
logger($pa_config, "Validating events for id_agentmodule #$id_agentmodule", 10);
db_do ($dbh, 'UPDATE tevento SET estado = 1 WHERE estado = 0 AND id_agentmodule = '.$id_agentmodule);
}
##########################################################################
# Generates an event according to the change of status of a module.
##########################################################################
@ -1286,6 +1300,9 @@ sub generate_status_event ($$$$$$$) {
my ($event_type, $severity);
my $description = "Module " . $module->{'nombre'} . " ($data) is ";
# Mark as "validated" any previous event for this module
pandora_validate_event ($pa_config, $module->{'id_agente_modulo'}, $dbh);
# Normal
if ($status == 0) {
($event_type, $severity) = ('going_down_normal', 2);
@ -1320,8 +1337,15 @@ sub generate_status_event ($$$$$$$) {
}
# Generate the event
pandora_event ($pa_config, $description, $agent->{'id_grupo'}, $module->{'id_agente'},
$severity, 0, $module->{'id_agente_modulo'}, $event_type, $dbh);
if ($status != 0){
pandora_event ($pa_config, $description, $agent->{'id_grupo'}, $module->{'id_agente'},
$severity, 0, $module->{'id_agente_modulo'}, $event_type, 0, $dbh);
} else {
# Self validate this event if has "normal" status
pandora_event ($pa_config, $description, $agent->{'id_grupo'}, $module->{'id_agente'},
$severity, 0, $module->{'id_agente_modulo'}, $event_type, 1, $dbh);
}
}
##########################################################################

View File

@ -144,7 +144,7 @@ sub data_consumer ($$) {
}
rename($file_name, $file_name . '_BADXML');
pandora_event ($pa_config, "Unable to process XML data file ($file_name)", 0, 0, 0, 0, 0, 'error', $dbh);
pandora_event ($pa_config, "Unable to process XML data file ($file_name)", 0, 0, 0, 0, 0, 'error', 0, $dbh);
}
###############################################################################

View File

@ -240,37 +240,75 @@ next_pair:
}
##########################################################################
# SUB pandora_query_snmp (pa_config, oid, community, target, version, error, dbh)
# SUB pandora_query_snmp (pa_config, module)
# Makes a call to SNMP modules to get a value,
##########################################################################
sub pandora_query_snmp (%$$$$$) {
my $pa_config = $_[0];
my $snmp_oid = $_[1];
my $snmp_community =$_[2];
my $snmp_target = $_[3];
my $snmp_version = $_[4];
# $_[5] contains error var.
sub pandora_query_snmp (%$) {
my $pa_config = $_[0];
my $module = $_[1];
my $snmp_version = $module->{"tcp_send"}; # (1, 2, 2c or 3)
my $snmp3_privacy_method = $module->{"custom_string_1"}; # DES/AES
my $snmp3_privacy_pass = $module->{"custom_string_2"};
my $snmp3_security_level = $module->{"custom_string_3"}; # noAuthNoPriv|authNoPriv|authPriv
my $snmp3_auth_user = $module->{"plugin_user"};
my $snmp3_auth_pass = $module->{"plugin_pass"};
my $snmp3_auth_method = $module->{"plugin_parameter"}; #MD5/SHA1
my $snmp_community = $module->{"snmp_community"};
my $snmp_target = $module->{"ip_target"};
my $snmp_oid = $module->{"snmp_oid"};
my $snmp_timeout = $pa_config->{"snmp_timeout"};
my $snmp_retries = $pa_config->{'snmp_checks'};
my $module_result = 1; # by default error
my $module_data = 0;
my $output; # Command output
# If not defined, always snmp v1 (standard)
if ($snmp_version ne '1' && $snmp_version ne '2'
&& $snmp_version ne '2c' && $snmp_version ne '3') {
$snmp_version = '1';
}
my $snmp_timeout = $pa_config->{"snmp_timeout"};
my $snmp_retries = $pa_config->{'snmp_checks'};
# TODO: Alternative version if command is not available or user select a new switch
# with "use internal SNMP" option. At this moment, due to locks() external snmp is much faster
$_[5] = 0;
my $snmpget_cmd = $pa_config->{"snmpget"};
my $output = "";
$output = `$snmpget_cmd -v $snmp_version -r $snmp_retries -t $snmp_timeout -OUevqt -c $snmp_community $snmp_target $snmp_oid 2>/dev/null`;
if ($output eq ""){
$_[5] = 1;
# SNMP v1, v2 and v2c call
if ($snmp_version ne '3'){
$output = `$snmpget_cmd -v $snmp_version -r $snmp_retries -t $snmp_timeout -OUevqt -c $snmp_community $snmp_target $snmp_oid 2>/dev/null`;
if ($output ne ""){
$module_result = 0;
$module_data = $output;
}
} else {
# SNMP v3 has a very different command syntax
my $snmp3_extra = "";
my $snmp3_execution;
# SNMP v3 authentication only
if ($snmp3_security_level eq "authNoPriv"){
$snmp3_extra = " -a $snmp3_auth_method -u $snmp3_auth_user -A $snmp3_auth_pass ";
}
# SNMP v3 privacy AND authentication
if ($snmp3_security_level eq "authPriv"){
$snmp3_extra = " -a $snmp3_auth_method -u $snmp3_auth_user -A $snmp3_auth_pass -x $snmp3_privacy_method -X $snmp3_privacy_pass ";
}
$snmp3_execution = "$snmpget_cmd -v $snmp_version -r $snmp_retries -t $snmp_timeout -OUevqt -l $snmp3_security_level $snmp3_extra $snmp_target $snmp_oid 2>/dev/null";
$output = `$snmp3_execution`;
if ($output ne ""){
$module_result = 0;
$module_data = $output;
}
}
return $output;
return ($module_data, $module_result);
}
##########################################################################
@ -308,43 +346,45 @@ sub exec_network_module ($$$$) {
if ((defined($ip_target)) && ($ip_target)) {
# -------------------------------------------------------
# ICMP Modules
# ------------
if ($id_tipo_modulo == 6){ # ICMP (Connectivity only: Boolean)
$module_data = pandora_ping ($pa_config, $ip_target);
$module_result = 0; # Successful
} elsif ($id_tipo_modulo == 7){ # ICMP (data for latency in ms)
$module_data = pandora_ping_latency ($pa_config, $ip_target);
# -------------------------------------------------------
if ($id_tipo_modulo == 6){ # ICMP (Connectivity only: Boolean)
$module_data = pandora_ping ($pa_config, $ip_target);
$module_result = 0; # Successful
# SNMP Modules (Proc=18, inc, data, string)
# ------------
} elsif (($id_tipo_modulo == 15) || ($id_tipo_modulo == 18) || ($id_tipo_modulo == 16) || ($id_tipo_modulo == 17)) { # SNMP module
if ((defined($snmp_oid)) && ($snmp_oid ne "") && (defined($snmp_community)) && ($snmp_community ne "")) { # Port check
$temp2 = pandora_query_snmp ($pa_config, $snmp_oid, $snmp_community, $ip_target, $tcp_send, $error);
} else {
$error = 1
}
if ($error == 0) { # A correct SNMP Query
$module_result = 0;
}
elsif ($id_tipo_modulo == 7){ # ICMP (data for latency in ms)
$module_data = pandora_ping_latency ($pa_config, $ip_target);
$module_result = 0; # Successful
}
# -------------------------------------------------------
# SNMP Modules (Proc=18, inc, data, string)
# -------------------------------------------------------
elsif (($id_tipo_modulo == 15) ||
($id_tipo_modulo == 18) ||
($id_tipo_modulo == 16) ||
($id_tipo_modulo == 17)) {
($module_data, $module_result) = pandora_query_snmp ($pa_config, $module);
if ($module_result == 0) { # A correct SNMP Query
# SNMP_DATA_PROC
if ($id_tipo_modulo == 18){ #snmp_data_proc
# RFC1213-MIB where it says that: SYNTAX INTEGER { up(1), down(2), testing(3),
# unknown(4), dormant(5), notPresent(6), lowerLayerDown(7) }
if ($temp2 != 1){ # up state is 1, down state in SNMP is 2 ....
$temp2 = 0;
if ($module_data != 1){ # up state is 1, down state in SNMP is 2 ....
$module_data = 0;
}
$module_data = $temp2;
}
# SNMP_DATA and SNMP_DATA_INC
elsif (($id_tipo_modulo == 15) || ($id_tipo_modulo == 16) ){
if (!is_numeric($temp2)){
if (!is_numeric($module_data)){
$module_result = 1;
} else {
$module_data = $temp2;
}
} else { # String SNMP
$module_data = $temp2;
}
}
} else { # Failed SNMP-GET
$module_data = 0;
if ($id_tipo_modulo == 18){ # snmp_proc
@ -352,16 +392,19 @@ sub exec_network_module ($$$$) {
# this is a fail monitor
if ($pa_config->{"snmp_proc_deadresponse"} eq "1"){
$module_result = 0;
} else {
$module_result = 1;
}
} else {
$module_result = 1; # No data, cannot connect
}
$module_data = 0;
}
}
}
}
# -------------------------------------------------------
# TCP Module
# ----------
} elsif (($id_tipo_modulo == 8) || ($id_tipo_modulo == 9) || ($id_tipo_modulo == 10) || ($id_tipo_modulo == 11)) { # TCP Module
# -------------------------------------------------------
elsif (($id_tipo_modulo == 8) ||
($id_tipo_modulo == 9) ||
($id_tipo_modulo == 10) ||
($id_tipo_modulo == 11)) { # TCP Module
if ((defined($tcp_port)) && ($tcp_port < 65536) && ($tcp_port > 0)) { # Port check
pandora_query_tcp ($pa_config, $tcp_port, $ip_target, \$module_result, \$module_data, $tcp_send, $tcp_rcv, $id_tipo_modulo);
} else {

View File

@ -177,7 +177,7 @@ sub data_consumer ($$) {
# Generate an event
pandora_event ($pa_config, "[RECON] New host [$host_name] detected on network [" . $task->{'subnet'} . ']',
$task->{'id_group'}, $agent_id, 2, 0, 0, 'recon_host_detected', $dbh);
$task->{'id_group'}, $agent_id, 2, 0, 0, 'recon_host_detected', 0, $dbh);
}
# Create an incident

View File

@ -219,7 +219,7 @@ sub upEvent ($) {
return unless defined ($self->{'_dbh'});
pandora_event ($self->{'_pa_config'}, $self->{'_pa_config'}->{'servername'} .
$ServerTypes[$self->{'_server_type'}] . ' going UP',
0, 0, 3, 0, 0, 'system', $self->{'_dbh'});
0, 0, 3, 0, 0, 'system', 0, $self->{'_dbh'});
}
########################################################################################
@ -231,7 +231,7 @@ sub downEvent ($) {
return unless defined ($self->{'_dbh'});
pandora_event ($self->{'_pa_config'}, $self->{'_pa_config'}->{'servername'} .
$ServerTypes[$self->{'_server_type'}] . ' going DOWN',
0, 0, 4, 0, 0, 'system', $self->{'_dbh'});
0, 0, 4, 0, 0, 'system', 0, $self->{'_dbh'});
}
########################################################################################
@ -244,7 +244,7 @@ sub restartEvent ($$) {
eval {
pandora_event ($self->{'_pa_config'}, $self->{'_pa_config'}->{'servername'} .
$ServerTypes[$self->{'_server_type'}] . " RESTARTING" . (defined ($msg) ? " ($msg)" : ''),
0, 0, 4, 0, 0, 'system', $self->{'_dbh'});
0, 0, 4, 0, 0, 'system', 0, $self->{'_dbh'});
};
}

View File

@ -19,14 +19,14 @@
# Includes list
use strict;
use Time::Local; # DateTime basic manipulation
use Time::Local; # DateTime basic manipulation
use DBI; # DB interface with MySQL
use PandoraFMS::Tools;
use PandoraFMS::DB;
use POSIX qw(strftime);
# version: define current version
my $version = "3.0 PS100203";
my $version = "3.1 PS100209";
# Pandora server configuration
my %conf;
@ -83,26 +83,10 @@ sub pandora_purgedb ($$) {
my $total_time;
my $purge_steps;
print "[PURGE] Deleting old event data (More than " . $conf->{'_days_purge'} . " days)... \n";
$dbh->do("DELETE FROM tevento WHERE utimestamp < '$ulimit_timestamp'");
print "[PURGE] Delete pending deleted modules (data table)...\n";
$dbh->do ("DELETE FROM tagente_datos WHERE id_agente_modulo IN (SELECT id_agente_modulo FROM tagente_modulo WHERE delete_pending = 1)");
print "[PURGE] Delete pending deleted modules (data string table)...\n";
$dbh->do ("DELETE FROM tagente_datos_string WHERE id_agente_modulo IN (SELECT id_agente_modulo FROM tagente_modulo WHERE delete_pending = 1)");
print "[PURGE] Delete pending deleted modules (data inc table)...\n";
$dbh->do ("DELETE FROM tagente_datos_inc WHERE id_agente_modulo IN (SELECT id_agente_modulo FROM tagente_modulo WHERE delete_pending = 1)");
print "[PURGE] Delete pending deleted modules (status, module table)...\n";
$dbh->do ("DELETE FROM tagente_estado WHERE id_agente_modulo IN (SELECT id_agente_modulo FROM tagente_modulo WHERE delete_pending = 1)");
$dbh->do ("DELETE FROM tagente_modulo WHERE delete_pending = 1");
print "[PURGE] Deleting old data... \n";
# This could be very timing consuming, so make this operation in $BIG_OPERATION_STEP steps (50 fixed by default)
# This could be very timing consuming, so make this operation in $BIG_OPERATION_STEP
# steps (100 fixed by default)
# Starting from the oldest record on the table
$first_mark = get_db_value ($dbh, 'SELECT utimestamp FROM tagente_datos ORDER BY utimestamp ASC LIMIT 1');
@ -111,29 +95,47 @@ sub pandora_purgedb ($$) {
for (my $ax = 1; $ax <= $BIG_OPERATION_STEP; $ax++){
$dbh->do ("DELETE FROM tagente_datos WHERE utimestamp < ". ($first_mark + ($purge_steps * $ax)) . " AND utimestamp > ". $first_mark );
$dbh->do ("DELETE FROM tagente_datos_string WHERE utimestamp < ". ($first_mark + ($purge_steps * $ax)) . " AND utimestamp > ". $first_mark );
db_do ($dbh, "DELETE FROM tagente_datos WHERE utimestamp < ". ($first_mark + ($purge_steps * $ax)) . " AND utimestamp > ". $first_mark );
db_do ($dbh, "DELETE FROM tagente_datos_string WHERE utimestamp < ". ($first_mark + ($purge_steps * $ax)) . " AND utimestamp > ". $first_mark );
print "[PURGE] Data deletion Progress %$ax .. \n";
}
print "[PURGE] Deleting old event data (More than " . $conf->{'_days_purge'} . " days)... \n";
db_do($dbh, "DELETE FROM tevento WHERE utimestamp < '$ulimit_timestamp'");
print "[PURGE] Delete pending deleted modules (data table)...\n";
my @deleted_modules = get_db_rows ($dbh, 'SELECT id_agente_modulo FROM tagente_modulo WHERE delete_pending = 1');
foreach my $module (@deleted_modules) {
print " Deleting data for module " . $module->{'id_agente_modulo'} . "\n";
db_do ($dbh, "DELETE FROM tagente_datos WHERE id_agente_modulo = ?", $module->{'id_agente_modulo'});
db_do ($dbh, "DELETE FROM tagente_datos_string WHERE id_agente_modulo = ?", $module->{'id_agente_modulo'});
db_do ($dbh, "DELETE FROM tagente_datos_inc WHERE id_agente_modulo = ?", $module->{'id_agente_modulo'});
}
print "[PURGE] Delete pending deleted modules (status, module table)...\n";
db_do ($dbh, "DELETE FROM tagente_estado WHERE id_agente_modulo IN (SELECT id_agente_modulo FROM tagente_modulo WHERE delete_pending = 1)");
db_do ($dbh, "DELETE FROM tagente_modulo WHERE delete_pending = 1");
print "[PURGE] Delete old session data \n";
$dbh->do ("DELETE FROM tsesion WHERE utimestamp < $ulimit_timestamp");
db_do ($dbh, "DELETE FROM tsesion WHERE utimestamp < $ulimit_timestamp");
print "[PURGE] Delete old data from SNMP Traps \n";
$dbh->do ("DELETE FROM ttrap WHERE timestamp < '$limit_timestamp'");
db_do ($dbh, "DELETE FROM ttrap WHERE timestamp < '$limit_timestamp'");
print "[PURGE] Deleting old access data (More than 24hr) \n";
#$dbh->do("DELETE FROM tagent_access WHERE utimestamp < '$ulimit_access_timestamp'");
$first_mark = get_db_value ($dbh, 'SELECT utimestamp FROM tagent_access ORDER BY utimestamp ASC LIMIT 1');
$total_time = $ulimit_access_timestamp - $first_mark;
$purge_steps = int( $total_time / $BIG_OPERATION_STEP);
$total_time = $ulimit_access_timestamp - $first_mark;
$purge_steps = int( $total_time / $BIG_OPERATION_STEP);
for (my $ax = 1; $ax <= $BIG_OPERATION_STEP; $ax++){
$dbh->do ("DELETE FROM tagent_access WHERE utimestamp < ". ( $first_mark + ($purge_steps * $ax)) . " AND utimestamp > ". $first_mark);
print "[PURGE] Agent access deletion progress %$ax .. \n";
}
db_do ($dbh, "DELETE FROM tagent_access WHERE utimestamp < ". ( $first_mark + ($purge_steps * $ax)) . " AND utimestamp > ". $first_mark);
print "[PURGE] Agent access deletion progress %$ax .. \n";
}
}
@ -386,19 +388,19 @@ sub pandoradb_main ($$$) {
print "Starting at ". strftime ("%Y-%m-%d %H:%M:%S", localtime()) . "\n";
# Move old data to the history DB
if (defined ($history_dbh)) {
undef ($history_dbh) unless defined (enterprise_hook ('pandora_historydb', [$dbh, $history_dbh, $conf->{'_history_db_days'}, $conf->{'_history_db_step'}, $conf->{'_history_db_delay'}]));
}
# Purge
pandora_purgedb ($conf, $dbh);
# Consistency check
pandora_checkdb_consistency ($dbh);
# Compact
if ($conf->{'_onlypurge'} == 0) {
# Move old data to the history DB
if (defined ($history_dbh)) {
undef ($history_dbh) unless defined (enterprise_hook ('pandora_historydb', [$dbh, $history_dbh, $conf->{'_history_db_days'}, $conf->{'_history_db_step'}, $conf->{'_history_db_delay'}]));
}
# Compact on if enable and DaysCompact are below DaysPurge
if (($conf->{'_onlypurge'} == 0) && ($conf->{'_days_compact'} < $conf->{'_days_purge'})) {
pandora_compactdb ($conf, defined ($history_dbh) ? $history_dbh : $dbh);
}