Ignore servers which are down when building a GeoDNS map
authorTom Hughes <tom@compton.nu>
Tue, 15 May 2012 21:34:07 +0000 (22:34 +0100)
committerTom Hughes <tom@compton.nu>
Tue, 15 May 2012 21:34:07 +0000 (22:34 +0100)
bin/mkgeo
src/tile.openstreetmap

index bb29fe60f9fc9604e9e22a61602ff2323ab10c5e..ce98991c345d38339f7e0292044226742200573d 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 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;
 use XML::Writer;
 use XML::TreeBuilder;
 use YAML;
@@ -13,6 +15,28 @@ my $source = shift @ARGV;
 my $zone = shift @ARGV;
 my $servers = YAML::LoadFile("src/${source}");
 
 my $zone = shift @ARGV;
 my $servers = YAML::LoadFile("src/${source}");
 
+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)
+{
+    $server->{status} = "down";
+
+    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 %countries = ();
 
 my $countries = XML::TreeBuilder->new;
@@ -42,6 +66,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});
 
             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 };
 #            print STDERR "$servername is $match for $name with distance $distance\n";
 
             push @servers, { name => $servername, priority => $priority, distance => $distance };
@@ -88,7 +114,7 @@ foreach my $country (values %countries)
     $kmlwriter->endTag("Placemark");
 }
 
     $kmlwriter->endTag("Placemark");
 }
 
-foreach my $server (grep { $servers->{$_}->{default} }keys %$servers)
+foreach my $server (grep { $servers->{$_}->{default} } keys %$servers)
 {
     $zonefile->print("Cxx.${zone}:${server}.${zone}:600\n");
 }
 {
     $zonefile->print("Cxx.${zone}:${server}.${zone}:600\n");
 }
index 4b91b572b83480ae301997e5150e667407a5e09a..d7d0fadb16c72d9fa773e3899f21ff9b70446440 100644 (file)
@@ -2,6 +2,7 @@
 london:
   lat: 51.507222
   lon: -0.1275
 london:
   lat: 51.507222
   lon: -0.1275
+  pingdom: 546503
   default: true
   preferred:
     continents:
   default: true
   preferred:
     continents:
@@ -14,6 +15,7 @@ london:
 sjobo:
   lat: 55.632025
   lon: 13.70273
 sjobo:
   lat: 55.632025
   lon: 13.70273
+  pingdom: 546505
   preferred:
     continents:
       - EU
   preferred:
     continents:
       - EU