From 2af97e2abb1ae4d894b8efb1f64d9f9946bc9ad9 Mon Sep 17 00:00:00 2001
From: "Hahn Axel (hahn)" <axel.hahn@iml.unibe.ch>
Date: Mon, 13 Feb 2023 16:28:38 +0100
Subject: [PATCH] add check_requirements 1.0

---
 check_requirements | 170 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 170 insertions(+)
 create mode 100755 check_requirements

diff --git a/check_requirements b/check_requirements
new file mode 100755
index 0000000..693b561
--- /dev/null
+++ b/check_requirements
@@ -0,0 +1,170 @@
+#!/bin/bash
+# ======================================================================
+#
+# NAGIOS CLIENT CHECK :: check requirements
+#
+# Check if a list requirements regarding processes and network 
+# connections do exist 
+# ----------------------------------------------------------------------
+#
+# ah=axel.hahn@unibe.ch
+#
+# 2023-02-13  v1.0  ah 
+# ======================================================================
+
+
+. "$( dirname $0 )/inc_pluginfunctions"
+
+self_APPNAME=$( basename $0 | tr [:lower:] [:upper:] )
+self_APPVERSION=1.0
+
+self=$( basename $0 )
+
+typeset -i VERBOSE=0
+
+OUT=
+
+typeset -i COUNT=0
+typeset -i COUNTOK=0
+typeset -i COUNTERR=0
+
+PROCESSES=
+
+# ----------------------------------------------------------------------
+# functions
+# ----------------------------------------------------------------------
+
+# show help
+function showHelp(){
+cat <<EOF
+______________________________________________________________________
+
+$self_APPNAME 
+v$self_APPVERSION
+
+(c) Institute for Medical Education - University of Bern
+Licence: GNU GPL 3
+______________________________________________________________________
+
+Check if a list requirements regarding processes and network 
+connections do exist.
+
+The check returns OK if all given requirements match.
+
+SYNTAX:
+$(basename $0) [-h] [PARAMETERS]
+
+OPTIONS:
+
+    -h or --help         show this help.
+    -v or --verbose      show more data: processes and port numbers from
+                         /etc/services; add it as first param
+
+PARAMETERS:
+
+    -c|--connect TYPE TARGET PORT        
+                         check if connect to a server to a given port
+                         is reachable
+                         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
+    -t|--tcp PORT        check if connect on local tcp port is reachable;
+                         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
+
+$(basename $0) -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
+
+EOF
+}
+
+
+# helper function: add new line in $OUT
+function newline(){
+        OUT+="
+"
+}
+
+# check in process list
+# param  string  regex to search for in output of "ps x"
+function chkProcess(){
+        local label="$1"
+        test -z "$PROCESSES" && PROCESSES=$( ps x )
+        COUNT+=1
+        local 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"
+        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
+        fi
+        newline
+}
+
+# check connection
+# param  string  type: one of tcp|udp
+# param  string  target: a servername eg. localhost or www.example.com
+# param  integer port number to connect
+function chkConnection(){
+        local type="$1"     # tcp | udp
+        local target="$2"   # servername
+        local port="$3"     # port number
+        
+        COUNT+=1
+        if ! echo "$type/$target/$port" | grep -E "^(tcp|udp)/[a-z][a-z0-9\.\-]*/[1-9][0-9]*$" >/dev/null 2>&1; then
+                COUNTERR+=1
+                OUT+="ERROR  syntax error detected - verify params for port check; type=$type (one of tcp|udp) target=$target (servername to connect) port=$port"
+        else
+                if (>/dev/$type/$target/$port) 2>/dev/null; then
+                        COUNTOK+=1
+                        OUT+="OK     connection  $type to $target on port $port"
+                else
+                        COUNTERR+=1
+                        ph.setStatus critical
+                        OUT+="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
+        fi
+        newline
+}
+
+# ----------------------------------------------------------------------
+# MAIN
+# ----------------------------------------------------------------------
+
+if [ "$#" -eq 0 ]; then
+        showHelp;
+        exit 1
+fi
+
+# parse params
+while [[ "$#" -gt 0 ]]; do case $1 in
+    -c|--connect)   chkConnection "$2" "$3" "$4"; shift;shift;shift;shift ;; 
+    -p|--process)   chkProcess "$2";shift 2;;
+    -h|--help)      showHelp; exit 0;;
+    -t|--tcp)       chkConnection tcp localhost "$2"; shift;shift ;; 
+    -v|--verbose)   VERBOSE=1; shift;;
+    *) echo "ERROR: Unknown parameter: $1"; showHelp; exit 1;
+esac; done
+
+ph.status "$COUNT Requirement checks - errors: $COUNTERR"
+echo
+echo "STATUS TYPE        RESULT"
+echo "$OUT"
+ph.exit
+
+# ----------------------------------------------------------------------
-- 
GitLab