2010-01-21 Pablo de la Concepción <pablo.concepcion@artica.es>

* lib/PandoraFMS/Core.pm: Modified to unify create and update functions
    using optinal parameters as Ramon sugested.

    * lib/PandoraFMS/DataServer.pm: Modified to ignore invalid positional data,
    use the unified functions from Core.pm, and store the agent_timestamp    
    modified by the agent_timezone.




git-svn-id: https://svn.code.sf.net/p/pandora/code/trunk@2292 c3f86ba8-e40f-0410-aaad-9ba5e7f4b01f
This commit is contained in:
pabloconcepcion 2010-01-21 14:58:38 +00:00
parent 49666f0ab6
commit a3f1d2b8b1
3 changed files with 89 additions and 69 deletions

View File

@ -1,3 +1,12 @@
2010-01-21 Pablo de la Concepción <pablo.concepcion@artica.es>
* lib/PandoraFMS/Core.pm: Modified to unify create and update functions
using optinal parameters as Ramon sugested.
* lib/PandoraFMS/DataServer.pm: Modified to ignore invalid positional data,
use the unified functions from Core.pm, and store the agent_timestamp
modified by the agent_timezone.
2010-01-20 Ramon Novoa <rnovoa@artica.es>
* util/pandora_xml_stress.pl: Fixed the script. Was not working.

View File

@ -38,7 +38,6 @@ our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
our @EXPORT = qw(
pandora_audit
pandora_create_agent
pandora_create_agent_gis
pandora_create_incident
pandora_create_module
pandora_evaluate_alert
@ -60,7 +59,6 @@ our @EXPORT = qw(
pandora_reset_server
pandora_server_keep_alive
pandora_update_agent
pandora_update_agent_gis
pandora_update_module_on_error
pandora_update_server
@ -709,35 +707,13 @@ sub pandora_update_server ($$$$$;$$) {
WHERE id_server = ?', $status, $timestamp, $pa_config->{'pandora_master'}, $num_threads, $queue_size, $server->{'id_server'});
}
##########################################################################
# Update last contact field in agent table
##########################################################################
sub pandora_update_agent ($$$$$$$) {
my ($pa_config, $agent_timestamp, $agent_id, $os_version,
$agent_version, $agent_interval, $dbh) = @_;
my $timestamp = strftime ("%Y-%m-%d %H:%M:%S", localtime());
pandora_access_update ($pa_config, $agent_id, $dbh);
# No update for interval field (some old agents don't support it)
if ($agent_interval == -1){
db_do($dbh, 'UPDATE tagente SET agent_version = ?, ultimo_contacto_remoto = ?, ultimo_contacto = ?, os_version = ?, WHERE id_agente = ?',
$agent_version, $agent_timestamp, $timestamp, $os_version, $agent_id);
return;
}
db_do ($dbh, 'UPDATE tagente SET intervalo = ?, agent_version = ?, ultimo_contacto_remoto = ?, ultimo_contacto = ?, os_version = ?, WHERE id_agente = ?',
$agent_interval, $agent_version, $agent_timestamp, $timestamp, $os_version, $agent_id);
}
##########################################################################
# Update last contact, timezone and position fields in agent table
##########################################################################
sub pandora_update_agent_gis ($$$$$$$$$$$) {
sub pandora_update_agent ($$$$$$$;$$$$) {
my ($pa_config, $agent_timestamp, $agent_id, $os_version,
$agent_version, $agent_interval, $timezone_offset,
$longitude, $latitude, $altitude, $dbh) = @_;
$agent_version, $agent_interval, $dbh, $timezone_offset,
$longitude, $latitude, $altitude) = @_;
my $timestamp = strftime ("%Y-%m-%d %H:%M:%S", localtime());
@ -749,11 +725,35 @@ sub pandora_update_agent_gis ($$$$$$$$$$$) {
$agent_version, $agent_timestamp, $timestamp, $os_version, $agent_id);
return;
}
#Test if we have received the optional position parameters
if (!defined ($longitude) || !defined ($latitude ) || !defined ($altitude)){
if ( defined ($timezone_offset)) {
# Update the table tagente with all the new data
db_do ($dbh, 'UPDATE tagente SET intervalo = ?, agent_version = ?, ultimo_contacto_remoto = ?, ultimo_contacto = ?, os_version = ?,
timezone_offset = ? WHERE id_agente = ?', $agent_interval, $agent_version, $agent_timestamp, $timestamp, $os_version, $timezone_offset, $agent_id);
}
else {
# Update the table tagente with all the new data
db_do ($dbh, 'UPDATE tagente SET intervalo = ?, agent_version = ?, ultimo_contacto_remoto = ?, ultimo_contacto = ?, os_version = ? WHERE id_agente = ?',
$agent_interval, $agent_version, $agent_timestamp, $timestamp, $os_version, $agent_id);
}
return;
}
# If there is positional data
logger($pa_config, "Agent id $agent_id",10);
# Get the last position to see if it has moved.
my $last_agent_info= get_db_single_row ($dbh, 'SELECT * FROM tagente WHERE id_agente = ?', $agent_id);
# if the the flag update_gis_data is 0 the positional data is ignored.
if ($last_agent_info->{'update_gis_data'} == 0){
logger($pa_config, "Agent id $agent_id positional data ignored",10);
db_do($dbh, 'UPDATE tagente SET intervalo = ?, agent_version = ?, ultimo_contacto_remoto = ?, ultimo_contacto = ?, os_version = ?, WHERE id_agente = ?',
$agent_interval, $agent_version, $agent_timestamp, $timestamp, $os_version, $agent_id);
return;
}
logger($pa_config, "Old Agent data: last-longitude = ". $last_agent_info->{'last_longitude'}. " ID: $agent_id ", 10);
# If the agent has moved outside the range stablised as
@ -879,40 +879,33 @@ sub pandora_create_module ($$$$$$$$$$) {
return $module_id;
}
##########################################################################
# Create a new entry in tagente.
##########################################################################
sub pandora_create_agent ($$$$$$$$$$$) {
my ($pa_config, $server_name, $agent_name, $address,
$address_id, $group_id, $parent_id, $os_id,
$description, $interval, $dbh) = @_;
logger ($pa_config, "Server '$server_name' creating agent '$agent_name' address '$address'.", 10);
$description = "Created by $server_name" unless ($description ne '');
my $agent_id = db_insert ($dbh, 'INSERT INTO tagente (`nombre`, `direccion`, `comentarios`, `id_grupo`, `id_os`, `server_name`, `intervalo`, `id_parent`, `modo`)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, 1)', $agent_name, $address, $description, $group_id, $os_id, $server_name, $interval, $parent_id);
pandora_event ($pa_config, "Agent [$agent_name] created by $server_name", $pa_config->{'autocreate_group'}, $agent_id, 2, 0, 0, 'new_agent', $dbh);
return $agent_id;
}
##########################################################################
# Create a new entry in tagente with position information
##########################################################################
sub pandora_create_agent_gis ($$$$$$$$$$$$$$$) {
sub pandora_create_agent ($$$$$$$$$$$;$$$$) {
my ($pa_config, $server_name, $agent_name, $address,
$address_id, $group_id, $parent_id, $os_id,
$description, $interval, $timezone_offset,
$longitude, $latitude, $altitude, $dbh) = @_;
$description, $interval, $dbh, $timezone_offset,
$longitude, $latitude, $altitude) = @_;
logger ($pa_config, "Server '$server_name' creating agent '$agent_name' address '$address'.", 10);
$description = "Created by $server_name" unless ($description ne '');
my $agent_id = db_insert ($dbh, 'INSERT INTO tagente (`nombre`, `direccion`, `comentarios`, `id_grupo`, `id_os`, `server_name`, `intervalo`, `id_parent`,
my $agent_id;
# Test if the optional positional parameters are defined
if (!defined ($timezone_offset) || !defined ($longitude) || !defined ($latitude ) || !defined ($altitude)){
$agent_id = db_insert ($dbh, 'INSERT INTO tagente (`nombre`, `direccion`, `comentarios`, `id_grupo`, `id_os`, `server_name`, `intervalo`, `id_parent`, `modo`)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, 1)', $agent_name, $address, $description, $group_id, $os_id, $server_name, $interval, $parent_id);
}
else {
$agent_id = db_insert ($dbh, 'INSERT INTO tagente (`nombre`, `direccion`, `comentarios`, `id_grupo`, `id_os`, `server_name`, `intervalo`, `id_parent`,
`timezone_offset`, `last_longitude`, `last_latitude`, `last_altitude`,`modo` ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1)', $agent_name, $address,
$description, $group_id, $os_id, $server_name, $interval, $parent_id, $timezone_offset, $longitude, $latitude, $altitude);
# Save the first position
my $utimestamp = time ();
my $timestamp = strftime ("%Y-%m-%d %H:%M:%S", localtime ($utimestamp));
save_agent_position($pa_config, $timestamp, $longitude, $latitude, $altitude, $agent_id, $dbh);
}
logger ($pa_config, "Server '$server_name' CREATED agent '$agent_name' address '$address'.", 10);
pandora_event ($pa_config, "Agent [$agent_name] created by $server_name", $pa_config->{'autocreate_group'}, $agent_id, 2, 0, 0, 'new_agent', $dbh);

View File

@ -166,17 +166,11 @@ sub process_xml_data ($$$$$) {
if ($timezone_offset !~ /[-+]?[0-9,11,12]/) {
$timezone_offset = 0; # Default value
}
# Longitude must be a real number
if ($longitude !~ /[-+]?[0-9]*\.?[0-9]+/) {
$longitude = 0.0; # Default value
}
# Latitude must be a real number
if ($latitude !~ /[-+]?[0-9]*\.?[0-9]+/) {
$latitude = 0.0; # Default value
}
# Altitude must be a real number
if ($altitude !~ /[-+]?[0-9]*\.?[0-9]+/) {
$altitude = 0.0; # Default value
my $valid_position_data = 1;
# If position data are not valid should be ignored
if ($longitude !~ /[-+]?[0-9]*\.?[0-9]+/ || $latitude !~ /[-+]?[0-9]*\.?[0-9]+/ || $altitude !~ /[-+]?[0-9]*\.?[0-9]+/) {
$valid_position_data = 0;
}
logger($pa_config, "Getting GIS Data=timezone_offset=$timezone_offset longitude=$longitude latitude=$latitude altitude=$altitude", 10);
@ -191,7 +185,18 @@ sub process_xml_data ($$$$$) {
if ( $data->{'timestamp'} =~ /AUTO/ ){
$timestamp = strftime ("%Y/%m/%d %H:%M:%S", localtime());
}
else {
# Modify the timestamp with the timezone_offset
logger($pa_config, "Unmodified timestamp = $timestamp", 5);
$timestamp =~ /(\d+)\/(\d+)\/(\d+) +(\d+):(\d+):(\d+)/;
#my $last_fired = ($1 > 0) ?
my $utimestamp = timelocal($6, $5, $4, $3, $2 - 1, $1 - 1900) + ($timezone_offset * 3600);
logger($pa_config, "Seconds timestamp = $timestamp modified timestamp in seconds $utimestamp with timezone_offset = $timezone_offset", 5);
$timestamp = strftime ("%Y-%m-%d %H:%M:%S", localtime($utimestamp));
logger($pa_config, "Modified timestamp = $timestamp with timezone_offset = $timezone_offset", 5);
}
# Check some variables
$interval = 300 if (! defined ($interval) || $interval eq '');
$os_version = 'N/A' if (! defined ($os_version) || $os_version eq '');
@ -215,9 +220,16 @@ sub process_xml_data ($$$$$) {
$description = $data->{'description'} if (defined ($data->{'description'}));
# Create the agent
logger($pa_config, "Creating agent $agent_name at long: $longitude lat: $latitude alt: $altitude", 5);
$agent_id = pandora_create_agent_gis ($pa_config, $pa_config->{'servername'}, $agent_name, '', 0, $group_id, 0, $os, $description, $interval, $timezone_offset,
$longitude, $latitude, $altitude, $dbh);
if ($valid_position_data == 1) {
logger($pa_config, "Creating agent $agent_name at long: $longitude lat: $latitude alt: $altitude", 5);
$agent_id = pandora_create_agent($pa_config, $pa_config->{'servername'}, $agent_name, '', 0, $group_id, 0, $os,
$description, $interval, $dbh, $timezone_offset, $longitude, $latitude, $altitude);
}
else { # Ignore agent positional data
logger($pa_config, "Creating agent $agent_name", 5);
$agent_id = pandora_create_agent($pa_config, $pa_config->{'servername'}, $agent_name, '', 0, $group_id, 0, $os,
$description, $interval, $dbh, $timezone_offset);
}
if (! defined ($agent_id)) {
$AgentSem->up ();
return;
@ -225,10 +237,16 @@ sub process_xml_data ($$$$$) {
}
$AgentSem->up ();
logger($pa_config, "Updating agent $agent_name at long: $longitude lat: $latitude alt: $altitude", 5);
# Update agent information including position information
pandora_update_agent_gis ($pa_config, $timestamp, $agent_id, $os_version, $agent_version, $interval, $timezone_offset, $longitude, $latitude, $altitude, $dbh);
if ($valid_position_data == 1) {
logger($pa_config, "Updating agent $agent_name at long: $longitude lat: $latitude alt: $altitude", 5);
# Update agent information including position information
pandora_update_agent($pa_config, $timestamp, $agent_id, $os_version, $agent_version, $interval, $dbh, $timezone_offset, $longitude, $latitude, $altitude);
}
else {
logger($pa_config, "Updating agent $agent_name", 5);
# Update agent information without position information
pandora_update_agent($pa_config, $timestamp, $agent_id, $os_version, $agent_version, $interval, $dbh, $timezone_offset);
}
pandora_module_keep_alive ($pa_config, $agent_id, $agent_name, $server_id, $dbh);
# Process modules