]> git.openstreetmap.org Git - dns.git/blobdiff - bin/mkgeo
Update country database
[dns.git] / bin / mkgeo
index 880b2d56681c1143e1a76471cdc54894f07593a3..f7e6d818a0e2fe82b9376b8f17e2ced43d697271 100755 (executable)
--- a/bin/mkgeo
+++ b/bin/mkgeo
@@ -5,6 +5,8 @@ use warnings;
 
 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;
@@ -13,6 +15,34 @@ my $source = shift @ARGV;
 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;
@@ -24,10 +54,10 @@ foreach my $country ($countries->look_down("_tag" => "country"))
     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;
@@ -42,6 +72,8 @@ foreach my $country ($countries->look_down("_tag" => "country"))
             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 };
@@ -58,9 +90,9 @@ $countries->delete;
 
 my $zonefile = IO::File->new("> data/${zone}") || die "$!";
 my $kmlfile = IO::File->new("> kml/${zone}.kml") || die "$!";
-my $kmlwriter = XML::Writer->new(OUTPUT => $kmlfile);
+my $kmlwriter = XML::Writer->new(OUTPUT => $kmlfile, ENCODING => 'utf-8');
 
-$kmlwriter->xmlDecl("UTF-8");
+$kmlwriter->xmlDecl();
 $kmlwriter->startTag("kml", "xmlns" => "http://www.opengis.net/kml/2.2");
 $kmlwriter->startTag("Document");
 
@@ -68,21 +100,31 @@ foreach my $country (values %countries)
 {
     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");
 }