From 9a57aed7557ac05962d27c941d42f3e09e5de15d Mon Sep 17 00:00:00 2001
From: "Hahn Axel (hahn)" <axel.hahn@unibe.ch>
Date: Wed, 12 Feb 2025 12:11:41 +0100
Subject: [PATCH] acheck_ssl: add IML header in help; add warning and critical
 level

---
 check_ssl | 124 ++++++++++++++++++++++++++++++++++--------------------
 1 file changed, 78 insertions(+), 46 deletions(-)

diff --git a/check_ssl b/check_ssl
index 77e8938..566d5e6 100755
--- a/check_ssl
+++ b/check_ssl
@@ -18,17 +18,18 @@
 # 2020-03-05  v1.1  <axel.hahn@iml.unibe.ch>  switch to ph.* helper functions
 # 2023-02-13  v1.2  <axel.hahn@unibe.ch>      some shell fixes
 # 2023-08-23  v1.3  <axel.hahn@unibe.ch>      fix wrong exitcode to "critical"
+# 2025-02-12  v1.4  <axel.hahn@unibe.ch>      add IML header in help; add warning and critical level
 # ======================================================================
 
 
 . $(dirname $0)/inc_pluginfunctions
 
+self_APPNAME=$( basename $0 | tr [:lower:] [:upper:] )
+self_APPVERSION=1.4
+
 sDomain=
 iPort=443
 
-
-iWarnDaysBefore=60
-
 typeset -i iErrors=0
 typeset -i iWarnings=0
 
@@ -40,13 +41,36 @@ sStatus=
 
 # show help with syntax
 function showHelp(){
-  echo
-  echo ----- SSL Check v1.0
-  echo
-  echo "SYNTAX: $(basename $0) [domain] [[port]]"
-  echo "   domain - domain to verify the ssl vertificate from (required)"
-  echo "   port   - port number to connect (default: 443)"
-  echo
+    _self=$( basename $0 )
+cat <<EOH
+$( ph.showImlHelpHeader )
+
+Check if ssl certificate of a given domain is still valid.
+You can check https or any other port of a ssl enabled service like LDAPS, 
+IMPAS and others.
+
+You can customize the values for warning and critical level.
+
+SYNTAX: $_self [options] DOMAIN [PORT]
+
+OPTIONS
+    -w VALUE  warning level for expiration in days (default: 28)
+    -c VALUE  critical level for expiration in days (default: 7)
+
+PARAMETERS
+    DOMAIN    domain to verify the ssl vertificate from (required)
+    PORT      optional: port number to connect (default: 443)
+
+
+EXAMPLES
+
+    $_self www.iml.unibe.ch 443
+        check https port 443
+
+    $_self -w 30 -c 14 ldap.example.com 636
+        check ldaps port 636 and set custom warning and critical level
+
+EOH
 }
 
 
@@ -57,73 +81,81 @@ function showHelp(){
 
 # --- check requirements
 
-  ph.require openssl
+ph.require openssl
 
-  if [ $# -eq 0 ]; then
+if [ $# -eq 0 ]; then
     showHelp
-    ph.abort
-  fi
+    exit 0
+fi
 
 # --- start
 
-  sDomain=$1
-  if [ ! -z $2 ]; then
-    iPort=$2
-  fi
+# set default / override from command line params
+typeset -i iWarnLimit;     iWarnLimit=$(     ph.getValueWithParam 28 w "$@")
+typeset -i iCriticalLimit; iCriticalLimit=$( ph.getValueWithParam 7  c "$@")
+
+sParams="$*"
+sP1="$( rev <<< $sParams | cut -f 2 -d ' ' | rev )"
+sP2="$( rev <<< $sParams | cut -f 1 -d ' ' | rev )"
 
+if grep -q "^[0-9]*$" <<< $sP2; then
+    sDomain=$sP1
+    iPort=$sP2
+else
+    sDomain=$sP2
+fi
 
 # --- try to connect
 
-  echo | openssl s_client -connect ${sDomain}:${iPort} >/dev/null 2>&1  
-  if [ $? -ne 0 ]; then
+echo | openssl s_client -connect ${sDomain}:${iPort} >/dev/null 2>&1  
+if [ $? -ne 0 ]; then
     ph.setStatus "critical"
     ph.status "unable to connect to ${sDomain} via port :${iPort} - maybe wrong host ... or port ... wrong chaining"
     # repeat the last command without redirecting output
     echo | openssl s_client -connect ${sDomain}:${iPort}
     ph.exit
-  fi
+fi
 
-  echo | openssl s_client -connect ${sDomain}:${iPort} 2>/dev/null | openssl x509 -noout -subject | grep -F ${sDomain} >/dev/null
-  if [ $? -ne 0 ]; then
+echo | openssl s_client -connect ${sDomain}:${iPort} 2>/dev/null | openssl x509 -noout -subject | grep -F ${sDomain} >/dev/null
+if [ $? -ne 0 ]; then
     ph.setStatus "unknown"
     echo SORRY, openssl was unable to fetch the right certificate - this happens on multiple ssl webs - it finds
     echo | openssl s_client -connect ${sDomain}:${iPort} 2>/dev/null | openssl x509 -noout -subject
     ph.exit
-  fi
+fi
 
 # --- unix timestamps valid from .. to
 
-  dateFrom=$(echo | openssl s_client -connect ${sDomain}:${iPort} 2>/dev/null | openssl x509 -noout -startdate | cut -f 2 -d "=")
-  dateTo=$(echo   | openssl s_client -connect ${sDomain}:${iPort} 2>/dev/null | openssl x509 -noout -enddate   | cut -f 2 -d "=")
-
-  tsFrom=$(date -d "${dateFrom}" +%s)
-  tsTo=$(date -d "${dateTo}" +%s)
+dateFrom=$(echo | openssl s_client -connect ${sDomain}:${iPort} 2>/dev/null | openssl x509 -noout -startdate | cut -f 2 -d "=")
+dateTo=$(echo   | openssl s_client -connect ${sDomain}:${iPort} 2>/dev/null | openssl x509 -noout -enddate   | cut -f 2 -d "=")
 
-  tsNow=$(date +%s)
-  typeset -i iDaysLeft=($tsTo-$tsNow)/60/60/24
+tsFrom=$(date -d "${dateFrom}" +%s)
+tsTo=$(date -d "${dateTo}" +%s)
 
+tsNow=$(date +%s)
+typeset -i iDaysLeft=($tsTo-$tsNow)/60/60/24
 
 # --- check date
 
-  if [ ${tsFrom} -gt ${tsNow} ]; then
+if [ ${tsFrom} -gt ${tsNow} ]; then
     ph.setStatus "critical"
     ph.status "certificate ${sDomain}:${iPort} is not valid yet - ${dateFrom}"
-  else
-    if [ ${tsTo} -lt ${tsNow} ]; then
-      ph.setStatus "critical"
-      ph.status "certificate ${sDomain}:${iPort} is out of date - ${dateTo} - ${iDaysLeft} days"
     else
-      # --- check close ending day
-      if [ ${iDaysLeft} -lt ${iWarnDaysBefore} ]; then
-        ph.setStatus "warning"
-        ph.status "certificate ${sDomain}:${iPort} is out of date - ${dateTo} - ${iDaysLeft} days"
-      else
-        ph.setStatus "ok"
-        ph.status "${sDomain}:${iPort} - valid to ${dateTo} (${iDaysLeft} days left)"
-      fi
+        if [ ${tsTo} -lt ${tsNow} ]||[ ${iDaysLeft} -le $iCriticalLimit ]; then
+            ph.setStatus "critical"
+            ph.status "certificate ${sDomain}:${iPort} is out of date - ${dateTo} - ${iDaysLeft} days"
+        else
+            # --- check close ending day
+            if [ ${iDaysLeft} -lt ${iWarnLimit} ]; then
+                ph.setStatus "warning"
+                ph.status "certificate ${sDomain}:${iPort} is out of date - ${dateTo} - ${iDaysLeft} days"
+            else
+                ph.setStatus "ok"
+                ph.status "${sDomain}:${iPort} - valid to ${dateTo} (${iDaysLeft} days left)"
+        fi
     fi
-  fi
+fi
 
-  ph.exit
+ph.exit
 
 # ----------------------------------------------------------------------
-- 
GitLab