diff --git a/check_requirements b/check_requirements index 415cb770ea67eb246d5a3db34391e26307a96b74..ba80e9d656a2cab1e33c8ef95becf9e976064ebf 100755 --- a/check_requirements +++ b/check_requirements @@ -9,14 +9,15 @@ # # ah=axel.hahn@unibe.ch # -# 2023-02-13 v1.0 ah +# 2023-02-13 v1.0 ah initial version with check for processes, tcp/ udp +# 2023-02-15 v1.1 ah add label # ====================================================================== . "$( dirname $0 )/inc_pluginfunctions" self_APPNAME=$( basename $0 | tr [:lower:] [:upper:] ) -self_APPVERSION=1.0 +self_APPVERSION=1.1 self=$( basename $0 ) @@ -24,6 +25,7 @@ typeset -i VERBOSE=0 OUT= +typeset -i ADDHEADER=1 typeset -i COUNT=0 typeset -i COUNTOK=0 typeset -i COUNTERR=0 @@ -52,12 +54,12 @@ connections do exist. The check returns OK if all given requirements match. SYNTAX: -$(basename $0) [-h] [PARAMETERS] +$self [-h] [PARAMETERS] OPTIONS: - -h or --help show this help. - -v or --verbose show more data: processes and port numbers from + -h|--help show this help. + -v|--verbose show more data: processes and port numbers from /etc/services; add it as first param PARAMETERS: @@ -68,23 +70,60 @@ PARAMETERS: TYPE string one of tcp|udp TARGET string target host PORT int port number - -p|--process STRING check if a process with given regex exists + -l|--label STRING add label to divide the output in multiple sections + -p|--process STRING check if a process with given regex exists in the + output of 'ps aux' -t|--tcp PORT check if connect on local tcp port is reachable; - This is a shortcut for -c tcp localhost [port] + This is a shortcut for '-c tcp localhost PORT' The parameters can be repeated multiple times. Checks will be executed in the given order. -EXAMPLE +EXAMPLES -$(basename $0) -p httpd -p mysqld -t 22 -t 80 -t 443 -t 3306 +$self -p httpd -p mysqld -t 22 -t 80 -t 443 -t 3306 Check if - a process httpd and a process mysqld exist - localhost listens to ports 22, 80, 443 and 3306 +$self -l "webservice" -p httpd -t 80 -t 443 -l "database" -p mysqld -t 3306 + Use output with multiple sections + EOF } +# show a label to divide the output in multiple sections +function showLabel(){ + ADDHEADER=1 + newline + OUT+="========== $1" + newline; + +} + +# show a line with a result +# param string status, eg. OK|ERROR +# param string type, eg. process|connection +# param string result +function addOutput(){ + if [ $ADDHEADER -ne 0 ]; then + ADDHEADER=0 + newline + addOutput STATUS TYPE RESULT + newline + # addOutput ------ ---- ------ + # newline + fi + OUT+=$(printf "%-7s %-11s %s\n" "$1" "$2" "$3") +} + +function addVerbose(){ + if [ $VERBOSE -gt 0 ]; then + newline + OUT+="$(echo """$*""" | sed 's#^# > #g')" + newline + fi +} # helper function: add new line in $OUT function newline(){ @@ -96,19 +135,19 @@ function newline(){ # param string regex to search for in output of "ps aux" function chkProcess(){ local label="$1" + local found; + test -z "$PROCESSES" && PROCESSES=$( ps aux ) COUNT+=1 - local found=$( echo "$PROCESSES" | grep -v "grep" | grep -v "$self" | grep -E "$label" ) + found=$( echo "$PROCESSES" | grep -v "grep" | grep -v "$self" | grep -E "$label" ) if [ -z "$found" ]; then COUNTERR+=1 ph.setStatus critical - OUT+="ERROR process $label was not found" + addOutput "ERROR" "process" "$label was not found" else COUNTOK+=1 - OUT+="OK process $label ($( echo """$found""" | wc -l ) x)" - test $VERBOSE -gt 0 && newline - test $VERBOSE -gt 0 && OUT+="$( echo """$found""" | sed 's#^# #g')" - test $VERBOSE -gt 0 && newline + addOutput "OK" "process" "$label ($( echo """$found""" | wc -l ) x)" + addVerbose "$found" fi newline } @@ -129,15 +168,13 @@ function chkConnection(){ else if (>/dev/$type/$target/$port) 2>/dev/null; then COUNTOK+=1 - OUT+="OK connection $type to $target on port $port" + addOutput "OK" "connection" "$type to $target on port $port" else COUNTERR+=1 ph.setStatus critical - OUT+="ERROR connection $type to $target on port $port FAILED" + addOutput "ERROR" "connection" "$type to $target on port $port FAILED" fi - test $VERBOSE -gt 0 && newline - test $VERBOSE -gt 0 && OUT+="$( grep """ $port/$type""" /etc/services | sed 's#^# #g')" - test $VERBOSE -gt 0 && newline + addVerbose "$( grep """ $port/$type""" /etc/services )" fi newline } @@ -154,6 +191,7 @@ fi # parse params while [[ "$#" -gt 0 ]]; do case $1 in -c|--connect) chkConnection "$2" "$3" "$4"; shift;shift;shift;shift ;; + -l|--label) showLabel "$2"; shift;shift ;; -p|--process) chkProcess "$2";shift 2;; -h|--help) showHelp; exit 0;; -t|--tcp) chkConnection tcp localhost "$2"; shift;shift ;; @@ -162,8 +200,6 @@ while [[ "$#" -gt 0 ]]; do case $1 in esac; done ph.status "$COUNT Requirement checks - errors: $COUNTERR" -echo -echo "STATUS TYPE RESULT" echo "$OUT" ph.exit