]> git.openstreetmap.org Git - dns.git/blobdiff - bin/mkgeo
Generate better KML when crossing the date line from west to east
[dns.git] / bin / mkgeo
index adf8f8b2526be1069226769756a02ab4aaae311c..6474a76fe705dbd36d5cc0eed587b8491393eb9e 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;
@@ -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 };
@@ -68,22 +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(" ");
-    $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");
 }