Cache pingdom status values and use them if pingdom is down
authorTom Hughes <tom@compton.nu>
Thu, 31 Oct 2013 17:56:22 +0000 (17:56 +0000)
committerTom Hughes <tom@compton.nu>
Thu, 31 Oct 2013 17:56:22 +0000 (17:56 +0000)
.gitignore
bin/mkgeo

index 2b813248a3ba18629d9d74b4a68fd78952511110..4172355c896dec2c4228be85dde52dcd6dce58f4 100644 (file)
@@ -2,3 +2,4 @@ data/
 json/
 kml/
 origins/
+pingdom.yml
index 4dceb1ded1fc4d64c9371613da067f7d640d77cb..40527e2d0e45c0f4e378496d349f033e4e13eeee 100755 (executable)
--- a/bin/mkgeo
+++ b/bin/mkgeo
@@ -48,38 +48,34 @@ while (my($name,$cluster) = each %$clusters)
     }
 
     $cluster->{name} = $name;
-
-    if ($ENV{PINGDOM_USERNAME} && $ENV{PINGDOM_PASSWORD})
-    {
-        $cluster->{status} = "down";
-    }
-    else
-    {
-        $cluster->{status} = "up";
-    }
+    $cluster->{status} = "down";
 }
 
 # Initialise server details
 foreach my $server (@servers)
 {
-    if ($ENV{PINGDOM_USERNAME} && $ENV{PINGDOM_PASSWORD})
-    {
-        $server->{status} = "down";
-    }
-    else
-    {
-        $server->{status} = "up";
-    }
+    $server->{status} = "up";
 }
 
 # If pingdom support is enabled then check which servers are up
 if ($ENV{PINGDOM_USERNAME} && $ENV{PINGDOM_PASSWORD})
 {
     my $ua = LWP::UserAgent->new;
+    my $cache;
 
+    $ua->timeout(5);
     $ua->default_header("App-Key", "2cohi62u5haxvqmypk3ljqqrze1jufrh");
     $ua->credentials("api.pingdom.com:443", "Pingdom API", $ENV{PINGDOM_USERNAME}, $ENV{PINGDOM_PASSWORD});
 
+    if (-f "pingdom.yml")
+    {
+        $cache = YAML::LoadFile("pingdom.yml"); 
+    }
+    else
+    {
+        $cache = {};
+    }
+
     foreach my $server (@servers)
     {
         if (my $checkid = $server->{pingdom})
@@ -91,18 +87,29 @@ if ($ENV{PINGDOM_USERNAME} && $ENV{PINGDOM_PASSWORD})
                 my $check = decode_json($response->content);
 
                 $server->{status} = $check->{check}->{status};
-
-                if ($server->{status} eq "up")
-                {
-                    $server->{cluster}->{status} = "up";
-                }
-                else
-                {
-                    $server->{cluster}->{bandwidth} = $server->{cluster}->{bandwidth} - $server->{bandwidth};
-                }
+                $cache->{$server->{pingdom}} = $check->{check}->{status};
+            }
+            else
+            {
+                $server->{status} = $cache->{$server->{pingdom}} || "down";
             }
         }
     }
+
+    YAML::DumpFile("pingdom.yml", $cache);
+}
+
+# Mark a cluster as up if any servers are up
+foreach my $server (@servers)
+{
+    if ($server->{status} eq "up")
+    {
+        $server->{cluster}->{status} = "up";
+    }
+    else
+    {
+        $server->{cluster}->{bandwidth} = $server->{cluster}->{bandwidth} - $server->{bandwidth};
+    }
 }
 
 # Create target origins object