From 1f5b193e6a2b7b2f20c1771a4a69670df01abe6e Mon Sep 17 00:00:00 2001 From: Jack-Benny Persson Date: Fri, 3 Jan 2014 15:28:34 +0100 Subject: [PATCH] First commit --- CHANGELOG | 4 + LICENSE | 16 ++++ README.md | 38 ++++++++ THANKS | 0 check_smhi.sh | 249 +++++++++++++++++++++++++++++++++++++++++++++++++ screenshot.png | Bin 0 -> 16190 bytes 6 files changed, 307 insertions(+) create mode 100644 CHANGELOG create mode 100644 LICENSE create mode 100644 README.md create mode 100644 THANKS create mode 100755 check_smhi.sh create mode 100644 screenshot.png diff --git a/CHANGELOG b/CHANGELOG new file mode 100644 index 0000000..1700b34 --- /dev/null +++ b/CHANGELOG @@ -0,0 +1,4 @@ +2014-01-03 +Version 0.1 - First release of the plugin + + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..dc6f96f --- /dev/null +++ b/LICENSE @@ -0,0 +1,16 @@ +Copyright (C) 2014 Jack-Benny Persson + +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 + diff --git a/README.md b/README.md new file mode 100644 index 0000000..eb79b1f --- /dev/null +++ b/README.md @@ -0,0 +1,38 @@ +# check\_smhi # +A Nagios plugin that checks the SMHI (Sveriges Meteorologiska och Hydrologiska +Institut) webpage for wheather alerts for a specfic region. If no alerts are +issued for the specified region or district the plugin exits with a STATE\_OK +(0) exit code. If a class 1 warning (lowest on the scale) is issued for the +region the plugin exits with a STATE\_WARNING (1). For class 2 and class 3 +wheater alerts the plugin exits with a STATE\_CRITICAL (2) exit code. + +## Usage ## +``` +-D + District to check for wheather alerts. + NOTE: Districts must be quoted, such as "Skåne län utom österlen" +-P + Print a list with all the avaliable districts. +-h + Print detailed help screen. +-V + Print version information. +``` + +Note from above that regions/districts must be quoted as a string! + +## Contributions ## +All contriubtions are welcome! Fork the repository, make your changes, push it +back up and send me a pull request. Once I've checked out the code and accepted +it I will add you to the THANKS file and update the CHANGELOG. + +## Copyright ## +This plugin is released under the GNU GPL license, version 2. Note that this +plugin may fail at any time! So DON'T rely on this plugin to protect life or +property! + +__Note that I am NOT in any way affiliated with SMHI.__ I wrote this plugin on +my own on and my own spare time. +This plugin fetches it's data from [SMHI](http://www.smhi.se) so please use the +plugin with respect for SMHI. For example use a check interval of something like +30 minutes instead of every single minute. diff --git a/THANKS b/THANKS new file mode 100644 index 0000000..e69de29 diff --git a/check_smhi.sh b/check_smhi.sh new file mode 100755 index 0000000..fe2419f --- /dev/null +++ b/check_smhi.sh @@ -0,0 +1,249 @@ +#!/bin/bash + +################################################################################ +# # +# Copyright (C) 2014 Jack-Benny Persson # +# # +# 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 # +# # +################################################################################ + +# check_smhi +Version="0.1" +Author="Jack-Benny Persson (jack-benny@cyberinfo.se)" + +# Binaries +Which="/usr/bin/which" +# Binaries entered in the list will be avalible to the script as variables with +# the first letter uppercase +Binaries=(sed awk egrep printf curl) + +# Variables +District="" +State_ok=0 +State_warning=1 +State_critical=2 +State_unknown=3 +AvailDistricts=( +"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" +) + +### Functions ### + +# Print version information +print_version() +{ + $Printf "\n$0 - $Version\n" +} + +# Print help information +print_help() +{ + print_version + $Printf "$Author\n" + $Printf "check_smhi\n" + /bin/cat <<-EOT + + Options: + -D + District to check for wheather alerts. + NOTE: Districts must be quoted, such as "Skåne län utom österlen" + -P + Print a list with all the avaliable districts. + -h + Print detailed help screen. + -V + Print version information. + EOT +} + +# Create variables with absolute path to binaries and check +# if we can execute it (binaries will be avaliable in +# variables with first character uppercase, such as Grep) +Count=0 +for i in ${Binaries[@]}; do + $Which $i &> /dev/null + if [ $? -eq 0 ]; then + declare $(echo ${Binaries[$Count]^}=`${Which} $i`) + ((Count++)) + else + echo "It seems you don't have ${Binaries[$Count]} installed" + exit 1 + fi +done + +# Sanity check (options and arguments) +if [ $# -eq 0 ]; then + echo "$0 requires an option" + print_help + exit $State_unknown + +elif [ $# -ge 1 ]; then + echo "$1" | egrep -q "\-." + if [ $? -ne 0 ]; then + echo "$0 requires an option" + print_help + exit $State_unknown + fi +fi + +# Parse command line options and arguments +while getopts D:hVP Opt; do + case "$Opt" in + D) District="$OPTARG" + ;; + h) print_help + exit $State_ok + ;; + V) print_version + exit $State_ok + ;; + P) Total=${#AvailDistricts[@]} + Num=0 + while [ $Num -lt $Total ]; do + echo "${AvailDistricts[$Num]}" + ((Num++)) + done + exit $State_ok + ;; + *) print_help + exit $State_unknown + ;; + esac +done + +# Check if the disctrict exists +Tot=${#AvailDistricts[@]} +Index=0 +Match=0 + +while [ $Index -lt $Tot ]; do + echo ${AvailDistricts[$Index]} | egrep -x "$District" &> /dev/null + if [ $? -eq 0 ]; then + Match=1 + break + fi + ((Index++)) +done + +if [ $Match -eq 0 ]; then + echo "District $District does not exist" + print_help +fi + + +### Main ### + +# Fetch the warning page +Data=`curl -s http://www.smhi.se/vadret/vadret-i-sverige/Varningar/varning_tabell_n1_sv.htm` + +# First we must replace all åäö with their HTML equivalent +HtmlDist=`echo $District | sed '{ +s/å/\å\;/g +s/Å/\Å\;/g +s/ä/\ä\;/g +s/Ä/\Ä\;/g +s/ö/\ö\;/g +s/Ö/\Ö\;/g +}'` + +# Get the line number for the current district in the HTML-file and add one line to it +LineNr=`echo "$Data" | sed -n "/$HtmlDist/="` +((LineNr++)) + +# Read the warning message (for example kuling, orkan, åska) +WarnMsg=`echo "$Data" | sed -n "${LineNr}p" | egrep -o "Varning klass [0-3] .*" | \ +sed 's/\(.*\).........../\1/' | \ +awk '{print substr($0, index($0,$4))}'` + +# Get the current warning class (1, 2 and 3) +Class=`echo "$Data" | sed -n "${LineNr}p" | egrep -o "Varning klass [0-3]" \ +| awk '{ print $3 }'` + +# Chech the current warning class issued for the district +if [ -z $Class ]; then + echo "No warnings issued for $District" + exit $State_ok +elif [ $Class -eq 1 ]; then + echo "Class ${Class} warning issued for $District: $WarnMsg" + exit $State_warning +elif [ $Class -eq 2 ]; then + echo "Class ${Class} warning issued for $District: $WarnMsg" + exit $State_critical +elif [ $Class -eq 3 ]; then + echo "Class ${Class} warning issued for $District: $WarnMsg" + exit $State_critical +else + echo "Unknown data from SHMI" + exit $State_unknown +fi + +# Catch all unknown errors (if we got this far, something went terribly wrong) +echo "Something went wrong with $0" +exit $State_unknown diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..3a3b1e077682ade32c0dc1782d0ed2c7b43ef104 GIT binary patch literal 16190 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 Z@YD-1B|Vuf|0#3_hzra7sTR}=_+MK)d-?zX literal 0 HcmV?d00001