use IO::File;
use Math::Trig qw(deg2rad pip2 great_circle_distance);
+use JSON::XS;
+use LWP::UserAgent;
use XML::Writer;
use XML::TreeBuilder;
use YAML;
my $zone = shift @ARGV;
my $servers = YAML::LoadFile("src/${source}");
+foreach my $server (values %$servers)
+{
+ $server->{status} = "down";
+}
+
+if ($ENV{PINGDOM_USERNAME} && $ENV{PINGDOM_PASSWORD})
+{
+ my $ua = LWP::UserAgent->new;
+
+ $ua->default_header("App-Key", "2cohi62u5haxvqmypk3ljqqrze1jufrh");
+ $ua->credentials("api.pingdom.com:443", "Pingdom API", $ENV{PINGDOM_USERNAME}, $ENV{PINGDOM_PASSWORD});
+
+ foreach my $server (values %$servers)
+ {
+ if (my $checkid = $server->{pingdom})
+ {
+ my $response = $ua->get("https://api.pingdom.com/api/2.0/checks/${checkid}");
+
+ if ($response->is_success)
+ {
+ my $check = decode_json($response->content);
+
+ $server->{status} = $check->{check}->{status};
+ }
+ }
+ }
+}
+
my %countries = ();
my $countries = XML::TreeBuilder->new;
my $code = $country->look_down("_tag" => "countryCode")->as_text;
my $name = $country->look_down("_tag" => "countryName")->as_text;
my $continent = $country->look_down("_tag" => "continent")->as_text;
- my $west = $country->look_down("_tag" => "bBoxWest")->as_text;
- my $north = $country->look_down("_tag" => "bBoxNorth")->as_text;
- my $east = $country->look_down("_tag" => "bBoxEast")->as_text;
- my $south = $country->look_down("_tag" => "bBoxSouth")->as_text;
+ my $west = $country->look_down("_tag" => "west")->as_text;
+ my $north = $country->look_down("_tag" => "north")->as_text;
+ my $east = $country->look_down("_tag" => "east")->as_text;
+ my $south = $country->look_down("_tag" => "south")->as_text;
my $lat = centre_lat( $south, $north );
my $lon = centre_lon( $west, $east );
my @servers;
my $priority = $match eq "preferred" ? 20 : 10;
my $distance = distance($lat, $lon, $server->{lat}, $server->{lon});
+ $priority = $priority * 10 if $server->{status} eq "up";
+
# print STDERR "$servername is $match for $name with distance $distance\n";
push @servers, { name => $servername, priority => $priority, distance => $distance };
{
my @servers = sort { $b->{priority} <=> $a->{priority} || $a->{distance} <=> $b->{distance} } @{$country->{servers}};
my $server = $servers->{$servers[0]->{name}};
+ my $clon = $country->{lon};
+ my $clat = $country->{lat};
+ my $slon = $server->{lon};
+ my $slat = $server->{lat};
+
+ if ($clon > 0 && $slon < 0 && 360 + $slon - $clon < $clon - $slon)
+ {
+ $clon = $clon - 360;
+ }
+ elsif ($slon > 0 && $clon < 0 && 360 + $clon - $slon < $slon - $clon)
+ {
+ $slon = $slon - 360;
+ }
$zonefile->print("C\L$country->{code}\E.${zone}:$servers[0]->{name}.${zone}:600\n");
$kmlwriter->startTag("Placemark");
$kmlwriter->dataElement("name", $country->{name});
$kmlwriter->startTag("LineString");
- $kmlwriter->startTag("coordinates");
- $kmlwriter->characters("$country->{lon},$country->{lat}");
- $kmlwriter->characters("$server->{lon},$server->{lat}");
- $kmlwriter->endTag("coordinates");
+ $kmlwriter->dataElement("coordinates", "$clon,$clat $slon,$slat");
$kmlwriter->endTag("LineString");
$kmlwriter->endTag("Placemark");
}
-foreach my $server (keys %$servers)
+foreach my $server (grep { $servers->{$_}->{default} } keys %$servers)
{
$zonefile->print("Cxx.${zone}:${server}.${zone}:600\n");
}