If cURL fails in retrieving the XML-file, then exit with a UNKNOWN state.
189 lines
5.1 KiB
PHP
Executable File
189 lines
5.1 KiB
PHP
Executable File
#!/usr/bin/php
|
|
<?php
|
|
|
|
/*
|
|
Copyright (C) 2014 Jack-Benny Persson <jack-benny@cyberinfo.se>
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
// Define exit status
|
|
define ("OK", 0);
|
|
define ("WARNING", 1);
|
|
define ("CRITICAL", 2);
|
|
define ("UNKNOWN", 3);
|
|
|
|
// Define version and program
|
|
define ("VERSION", 0.5);
|
|
define ("PROGRAM", $argv[0]);
|
|
|
|
// Function for printing usage
|
|
function usage()
|
|
{
|
|
print "check_smhiwarn version " . VERSION . "\n";
|
|
print "Copyright (C) Jack-Benny Persson <jack-benny@cyberinfo.se>\n";
|
|
print "Usage: " . PROGRAM . " 'District'\n";
|
|
print "Example: " . PROGRAM . " 'Skåne län utom Österlen'\n";
|
|
}
|
|
|
|
// All of the avaliable districts
|
|
$availDistricts = array(
|
|
"Skagerack",
|
|
"Vänern",
|
|
"Kattegatt",
|
|
"Bälten",
|
|
"Sydvästra Östersjön",
|
|
"Södra Östersjön",
|
|
"Sydöstra Östersjön",
|
|
"Mellersta Östersjön",
|
|
"Mellersta Östersjön",
|
|
"Norra Östersjön",
|
|
"Rigabukten",
|
|
"Finska viken",
|
|
"Skärgårdshavet",
|
|
"Södra Bottenhavet",
|
|
"Norra Bottenhavet",
|
|
"Norra Kvarken",
|
|
"Bottenviken",
|
|
"Dalarnas län, Dalafjällen",
|
|
"Jämtlands län, Härjedalsfjällen",
|
|
"Jämtlands län, Jämtlandsfjällen",
|
|
"Västerbottens län, södra Lapplandsfjällen",
|
|
"Norrbottens län, norra Lapplandsfjällen",
|
|
"Skåne län utom Österlen",
|
|
"Skåne län, Österlen",
|
|
"Blekinge län",
|
|
"Hallands län",
|
|
"Kronobergs län, västra delen",
|
|
"Kronobergs län, östra delen",
|
|
"Kalmar län, öland",
|
|
"Gotlands län",
|
|
"Jönköpings län, västra delen utom syd om Vättern",
|
|
"Jönköpings län, östra delen",
|
|
"Kalmar län utom öland",
|
|
"Jönköpings län, syd om Vättern",
|
|
"Västra Götalands län, Sjuhäradsbygden och Göta älv",
|
|
"Västra Götalands län, Bohuslän och Göteborg",
|
|
"Västra Götalands län, inre Dalsland",
|
|
"Västra Götalands län, sydväst Vänern",
|
|
"Västra Götalands län, norra Västergötland",
|
|
"Värmlands län",
|
|
"Södermanlands län",
|
|
"Stockholms län utom Roslagskusten.",
|
|
"Västmanlands län",
|
|
"Uppsala län utom Upplandskusten",
|
|
"Stockholms län, Roslagskusten",
|
|
"Uppsala län, Upplandskusten",
|
|
"Dalarnas län utom Dalafjällen",
|
|
"Gävleborgs län kustland",
|
|
"Gävleborgs län inland",
|
|
"Västernorrlands län",
|
|
"Jämtlands län utom fjällen",
|
|
"Västerbottens län kustland",
|
|
"Västerbottens län inland",
|
|
"Norrbottens län kustland",
|
|
"Norrbottens län inland",
|
|
);
|
|
|
|
// Check if first argument is set
|
|
if (!isset($argv[1]))
|
|
{
|
|
usage();
|
|
exit(UNKNOWN);
|
|
}
|
|
|
|
// Set first argument to $district
|
|
$district = $argv[1];
|
|
|
|
// Simple way of listing all the avaliable districts
|
|
if ($district == 'list')
|
|
{
|
|
foreach ($availDistricts as $dist)
|
|
print "$dist\n";
|
|
exit(UNKNOWN);
|
|
}
|
|
|
|
// Check if the district exists
|
|
if (!preg_grep("/^$district$/u", $availDistricts))
|
|
{
|
|
print "$district does not exists\n";
|
|
print "List all avaliable districts by \"" . PROGRAM . " 'list'\"\n";
|
|
exit(UNKNOWN);
|
|
}
|
|
|
|
|
|
// Retrive the data
|
|
//$data = file_get_contents("testing/smhi_alla_varningar.xml"); //For testing purposes
|
|
$ch = curl_init("http://www.smhi.se/weatherSMHI2/varningar/smhi_alla_varningar.xml");
|
|
curl_setopt($ch, CURLOPT_HEADER, 0);
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
curl_setopt($ch, CURLOPT_FAILONERROR, true);
|
|
// check if curl failed and bail out if it did
|
|
if (($data = curl_exec($ch)) === false)
|
|
{
|
|
print curl_error($ch);
|
|
curl_close($ch);
|
|
exit(UNKNOWN);
|
|
}
|
|
curl_close($ch);
|
|
|
|
//print "\n$data\n"; // for testing purposes (uncomment to view xml-file)
|
|
|
|
// Regex the area (1st paranthesis is area, 2nd is warning class, 3rd is warning msg)
|
|
preg_match("/($district)(?:: )(?:Varning klass )([1-3]+)(?:,\s)([-0-9\p{L}.,&\s]*)/iu",
|
|
$data, $matches);
|
|
|
|
// Count how many warnings are issued and issue a critical if more than one
|
|
preg_match_all("/$district/u", $data, $counts);
|
|
$numberMatches = (count($counts[0]));
|
|
if ($numberMatches > 1)
|
|
{
|
|
print "More than one warning is issued for $district, check smhi.se!";
|
|
exit(CRITICAL);
|
|
}
|
|
|
|
// Define the paranthesis
|
|
if (isset($matches[2]))
|
|
{
|
|
$warnLevel = $matches[2];
|
|
$warnMsg = $matches[3];
|
|
}
|
|
else
|
|
{
|
|
$warnLevel = 0;
|
|
}
|
|
|
|
// Check for warnings and exit with correct exit status
|
|
switch ($warnLevel)
|
|
{
|
|
case 0:
|
|
print "No warnings issued for $district";
|
|
exit(OK);
|
|
case 1:
|
|
print "Class 1 warning issued for $district: $warnMsg";
|
|
exit(WARNING);
|
|
case 2:
|
|
print "Class 2 warning issued for $district: $warnMsg";
|
|
exit(CRITICAL);
|
|
case 3:
|
|
print "Class 3 warning issued for $district: $warnMsg";
|
|
exit(CRITICAL);
|
|
default:
|
|
print "Unknown error for $district";
|
|
exit(UNKNOWN);
|
|
}
|
|
|
|
?>
|