#!/bin/bash # ====================================================================== # # Icinga/ Nagios Check # EOL - End of life detection - Warn before reaching end of life # # - includes inc_pluginfunctions # - eol data are organized in check_eol*.cfg # - detection functions are in check_eol-detect-[name] # # ---------------------------------------------------------------------- # # REQUIREMENTS: # - linux (Centos, Debian, Ubuntu, ...) # # ---------------------------------------------------------------------- # # SYNTAX: # # check_eol # show help and known product keys # # check_eol PRODUCT # detect PRODUCT and its EOL date in the *cfg files. # Remark: all keys are lowercase. Some product keys are followed by a # major version, some by major and a minor version, # # check_eol detect[KEY] # There is a special prefix "detect". # KEY is one of OS|PHP .. you can use uppercase or lowercase. # # ---------------------------------------------------------------------- # # EXAMPLES: # # use a product key and version # check_eol centos 7 # check_eol php 7.4 # # use auto detection of a version # check_eol os detect # check_eol php detect # # ---------------------------------------------------------------------- # 2020-02-21 v1.0 <axel.hahn@iml.unibe.ch> # 2020-03-05 v1.1 <axel.hahn@iml.unibe.ch> switch to ph.* helper functions # ====================================================================== . `dirname $0`/inc_pluginfunctions eolcfg="${0}-data/*.cfg" _version="0.3" # --- limits typeset -i iDaysWarn=365 typeset -i iDaysCritical=90 bDebug=false myKey= myEolEnd= typeset -i myDaysLeft= # ---------------------------------------------------------------------- # automatic detection # ---------------------------------------------------------------------- # auto detetct an os or a version based on cli output # used on param detect* # global string myKey name of product function autodetect(){ myVersion= case $myKey in 'os') # ----- detect operating system and major version # see inc_pluginfunctions myKey=`ph.getOS` myVersion=`ph.getOSMajor` ;; 'mysqlany') local _tmpfile=/tmp/detect_mysql_$$ mysql --version >$_tmpfile 2>&1 if [ $? -ne 0 ]; then rm -f $_tmpfile ph.abort "UNKNOWN: mysql was not found. A Mysql version cannot be detected." fi # default: mysql myKey=mysql # scan for forks: # todo: add ... percona ... memdb ... whatever grep "MariaDB" $_tmpfile >/dev/null && myKey=mariadb rm -f $_tmpfile ;; *) # echo ERROR: detection for [$1] is not implemented esac detectorPlugin="$0-versiondetect/detect-$myKey" if [ -x "$detectorPlugin" ]; then myVersion=`. "$detectorPlugin"` fi if [ -z "$myVersion" ]; then ph.abort "UNKNOWN: [$myKey] was not detected properly. It is unknown or output for version cannot be parsed." fi } # ---------------------------------------------------------------------- # functions for eol check # ---------------------------------------------------------------------- # get count of days left to a given date # param string date as "YYYY-MM-DD" function getDaysLeft(){ local mydate=$1 echo $mydate | grep "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]" >/dev/null if [ $? -eq 0 ]; then typeset -i local tsend=`date --date="$mydate" +%s` typeset -i local daysLeft=($tsend - `date +%s`)/60/60/24 echo $daysLeft fi } # detect product in *cfg files and find its EOL # global string myKey name of product # global string myVersion its version function findEolDate(){ line=`grep "^$myKey:$myVersion:" $eolcfg | sort -n | tail -1` if [ ! -z "$line" ]; then myEolEnd=`echo $line | cut -f 4 -d ":"` myComment=`echo $line | cut -f 5 -d ":"` myDaysLeft=`getDaysLeft $myEolEnd` # --- verify days left with limits ph.setStatus "ok" if [ $myDaysLeft -lt $iDaysWarn ]; then ph.setStatus "warning" if [ $myDaysLeft -lt $iDaysCritical ]; then ph.setStatus "critical" fi fi if [ $myDaysLeft -ge 0 ]; then ph.status "[$myKey $myVersion] ends on $myEolEnd ... $myDaysLeft days left $myComment" else echo "[$myKey $myVersion] ended on $myEolEnd ... `echo $myDaysLeft | sed 's#\-##'` days EXPIRED ALREADY !!! $myComment" fi echo grep "^$myKey:" $eolcfg | grep -v ":$myKey:[0-9]" | cut -f 3- -d ":" echo echo "Limit Info: warn below $iDaysWarn days; critical below $iDaysCritical days" ph.perfadd "$myKey-v$myVersion" "${myDaysLeft}" $iDaysWarn $iDaysCritical 0 else ph.setStatus "unknown" echo "UNKNOWN. Sorry, [$myKey $myVersion] was not found in $eolcfg." echo grep "^$myKey:" $eolcfg >/dev/null if [ $? -eq 0 ]; then echo "HINT: the product [$myKey] is known ... but not the version [$myVersion] ... or its date is invalid i.e. 30th of feb or not YYYY-MM-DD" echo grep "^$myKey:" $eolcfg | grep -v ":$myKey:[0-9]" | cut -f 3- -d ":" echo echo "Maybe an admin can add the version in `grep -l "^$myKey:" $eolcfg`" echo "Existing/ known versions are:" grep "^$myKey:[0-9]" $eolcfg | cut -f 3 -d ":" | sort -un else echo "The product key [$myKey] was not detected in any version." fi fi } # ---------------------------------------------------------------------- # MAIN # ---------------------------------------------------------------------- # --- no param? show help if [ $# -lt 2 ]; then cat <<EOH ______________________________________________________________________ CHECK EOL :: v${_version} (c) Institute for Medical Education - Univerity of Bern Licence: GNU GPL 3 ______________________________________________________________________ Check and of support of an OS or a product. The dates are defined in the files check_eol-*.cfg For detailed information see `basename $0`.md USAGE $ `basename $0` [-c CRITICAL] [-w WARING] PRODUCT VERSION PARAMETERS PRODUCT set a product; known product keys are listed below `grep "^[a-zA-Z]" $eolcfg | cut -f 2 -d ":" | sort -un | sed "s#^# #g"` VERSION set a version. Autodetection: There is a special handling vor version "detect". You can set "os" as product to detect the (linux) distribution. See examples below. OPTIONS -c set critical limit; default $iDaysCritical -w set warning limit; default $iDaysWarn EXAMPLES `basename $0` php 7.4 `basename $0` -w 100 -c 30 php 7.4 `basename $0` os detect `basename $0` php detect EOH ph.abort fi # --- parse params I: override warning and critical typeset -i iShift=0 while getopts ":c: :w:" opt do case $opt in c) iDaysCritical=$OPTARG iShift=$iShift+2 ;; w) iDaysWarn=$OPTARG iShift=$iShift+2 ;; *) ph.abort "ERROR: parameter unknown -- $opt" esac done shift $iShift # --- verify warning and critical if [ $iDaysWarn -lt $iDaysCritical ]; then ph.abort "ERROR: warning limit $iDaysWarn cannot be lower critical $iDaysCritical" fi # --- parse params II: get product and version myKey=$1 myVersion=$2 test $myVersion = "detect" && autodetect $myKey findEolDate "$myKey" "$myVersion" # --- bye ph.exit # ----------------------------------------------------------------------