X-Git-Url: https://git.openstreetmap.org/dns.git/blobdiff_plain/2c0b61152c298c48a02ce30bb489b9def3adec64..91ee369bf4f8185cedcfc258a832215b6dbc69f4:/bin/mkgeo diff --git a/bin/mkgeo b/bin/mkgeo index adf8f8b..f7e6d81 100755 --- 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 }; @@ -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"); }