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

* conf/pandora_server.conf, lib/PandoraFMS/Config.pm: Added
    location_error parameter

    * lib/PandoraFMS/Core.pm: Fixed bugs in the creation and update of
    the agent that where messing with the locations. Fixed distance on the
    earth formula. Use of the location_error parameter to decide if an
    agent has moved or not.

    * util/pandora_xml_stress.pl, util/pandora_xml_stress.README: added
    parameter timezone_offset_range to let the timezone be random in the
    range given, and added the code to use it.



git-svn-id: https://svn.code.sf.net/p/pandora/code/trunk@2332 c3f86ba8-e40f-0410-aaad-9ba5e7f4b01f
This commit is contained in:
pabloconcepcion 2010-02-05 15:27:25 +00:00
parent a8d699af88
commit 41088ccf74
6 changed files with 47 additions and 10 deletions

View File

@ -1,3 +1,17 @@
2010-01-29 Pablo de la Concepción <pablo.concepcion@artica.es>
* conf/pandora_server.conf, lib/PandoraFMS/Config.pm: Added
location_error parameter
* lib/PandoraFMS/Core.pm: Fixed bugs in the creation and update of
the agent that where messing with the locations. Fixed distance on the
earth formula. Use of the location_error parameter to decide if an
agent has moved or not.
* util/pandora_xml_stress.pl, util/pandora_xml_stress.README: added
parameter timezone_offset_range to let the timezone be random in the
range given, and added the code to use it.
2010-01-29 Pablo de la Concepción <pablo.concepcion@artica.es>
* lib/PandoraFMS/DataServer.pm: Improved timezone_offset management.

View File

@ -236,3 +236,7 @@ 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

@ -186,6 +186,7 @@ sub pandora_load_config {
$pa_config->{"export_threads"} = 1; # 3.0
$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;
@ -514,6 +515,9 @@ sub pandora_load_config {
elsif ($parametro =~ m/^activate_gis\s+([0-1])/i) {
$pa_config->{'activate_gis'} = clean_blank($1);
}
elsif ($parametro =~ m/^location_error\s+(\d+)/i) {
$pa_config->{'location_error'} = clean_blank($1);
}
} # end of loop for parameter #

View File

@ -757,28 +757,33 @@ sub pandora_update_agent ($$$$$$$;$$$$) {
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
if (distance_moved($pa_config, $last_agent_info->{'last_longitude'}, $last_agent_info->{'last_latitude'}, $last_agent_info->{'last_altitude'}, $longitude, $latitude, $altitude) > 10 ){
# If the agent has moved outside the range stablised as location error
if (distance_moved($pa_config, $last_agent_info->{'last_longitude'}, $last_agent_info->{'last_latitude'}, $last_agent_info->{'last_altitude'}, $longitude, $latitude, $altitude) > $pa_config->{'location_error'}){
# Save the agent data in the agent table
save_agent_position($pa_config, $timestamp, $last_agent_info->{'last_longitude'},$last_agent_info->{'last_latitude'}, $last_agent_info->{'last_altitude'}, $agent_id, $dbh);
# 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 = ?,
last_longitude = ?, last_latitude =?, last_altitude = ? WHERE id_agente = ?',
$agent_interval, $agent_version, $agent_timestamp, $timestamp, $os_version, $timezone_offset, $longitude, $latitude, $altitude, $agent_id);
}
else {
# Update the end timestamp for the agent
update_agent_position($pa_config, $timestamp, $agent_id, $dbh);
# Update the table tagente with all the new data but the location
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);
}
# 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 = ?,
last_longitude = ?, last_latitude =?, last_altitude = ? WHERE id_agente = ?',
$agent_interval, $agent_version, $agent_timestamp, $timestamp, $os_version, $timezone_offset, $longitude, $latitude, $altitude, $agent_id);
}
##########################################################################
# Measures the distance taking in acount the earth curvature
# The distance is based on Havesine formula
# Refferences:
# Refferences (Theory):
# * http://franchu.net/2007/11/16/gis-calculo-de-distancias-sobre-la-tierra/
# * http://en.wikipedia.org/wiki/Haversine_formula
# References (C implementation):
# * http://blog.julien.cayzac.name/2008/10/arc-and-distance-between-two-points-on.html
##########################################################################
sub distance_moved ($$$$$$$) {
my ($pa_config, $last_longitude, $last_latitude, $last_altitude, $longitude, $latitude, $altitude) = @_;
@ -788,7 +793,7 @@ sub distance_moved ($$$$$$$) {
my $long_difference = $last_longitude - $longitude;
my $lat_difference = $last_latitude - $latitude;
my $alt_difference = $last_altitude - $altitude;
#my $alt_difference = $last_altitude - $altitude;
my $to_radians= $pi/180;
my $to_half_radians= $pi/360;
@ -798,10 +803,11 @@ sub distance_moved ($$$$$$$) {
$long_aux *= $long_aux;
$lat_aux *= $lat_aux;
# Temporary value to make sorter the asin formula.
my $asinaux = ($lat_aux + cos($last_latitude*$to_radians) * cos($latitude*$to_radians) * $long_aux );
my $asinaux = sqrt($lat_aux + cos($last_latitude*$to_radians) * cos($latitude*$to_radians) * $long_aux );
# Assure the aux value is not greater than 1
if ($asinaux > 1) { $asinaux = 1; }
my $dist_in_rad = 2 * atan2($asinaux, sqrt (1 - $asinaux * $asinaux));
# We use: asin(x) = atan2(x, sqrt(1-x*x))
my $dist_in_rad = 2.0 * atan2($asinaux, sqrt (1 - $asinaux * $asinaux));
my $dist_in_meters = $earth_radius_in_meters * $dist_in_rad;
logger($pa_config, "Distance moved:" . $dist_in_meters ." meters", 10);
@ -909,6 +915,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);
return $agent_id;
}

View File

@ -58,6 +58,11 @@ startup_delay 2
# Timezone offset: Difference with the server timezone
timezone_offset 0
# Timezone offset range (to set a randomnuber of hours of difference with the
# server so timezone_offset can go from timezone_offset-timezone_offset_range
# to timezone_offset+timezone_offset_range
timezone_offset_range 0
# Agent position paramters
# Those parameters define the center and the zone where the agents will be
# randomly located.

View File

@ -91,6 +91,7 @@ sub generate_xml_files ($$$$$) {
my $temporal = get_conf_token ($conf, 'temporal', '/tmp');
my $startup_delay = get_conf_token ($conf, 'startup_delay', '5');
my $ag_timezone_offset = get_conf_token ($conf, 'timezone_offset', '0');
my $ag_timezone_offset_range = get_conf_token ($conf, 'timezone_offset_range', '0');
my $latitude_base = get_conf_token ($conf, 'latitude_base', '40.42056');
my $longitude_base = get_conf_token ($conf, 'longitude_base', '-3.708187');
my $altitude_base = get_conf_token ($conf, 'altitude_base', '0');
@ -123,6 +124,8 @@ sub generate_xml_files ($$$$$) {
# XML header
my $timestamp = strftime ("%Y-%m-%d %H:%M:%S", localtime ($utimestamp));
my $xml_data = "<?xml version='$xml_version' encoding='$encoding'?>\n";
my $sign = int rand(2);
$ag_timezone_offset += ($sign*(-1)+(1-$sign)) * int rand($ag_timezone_offset_range);
$xml_data .= "<agent_data os_name='$os_name' os_version='$os_version' interval='$interval' version='$os_version' timestamp='$timestamp' agent_name='$agent_name' timezone_offset='$ag_timezone_offset' longitude='$ag_longitude' latitude='$ag_latitude' altitude='$ag_altitude'>\n";
foreach my $module (@{$modules}) {