diff --git a/opt/hc/bin/check_health.sh b/opt/hc/bin/check_health.sh index 2662951..344ae1e 100755 --- a/opt/hc/bin/check_health.sh +++ b/opt/hc/bin/check_health.sh @@ -38,7 +38,7 @@ # ------------------------- CONFIGURATION starts here ------------------------- # define the version (YYYY-MM-DD) -typeset -r SCRIPT_VERSION="2019-10-24" +typeset -r SCRIPT_VERSION="2020-03-12" # location of parent directory containing KSH functions/HC plugins typeset -r FPATH_PARENT="/opt/hc/lib" # location of custom HC configuration files @@ -134,6 +134,7 @@ typeset ARG_HC_ARGS="" # no extra arguments to HC plug-in by default typeset ARG_HISTORY=0 # include historical events is off by default typeset ARG_LAST=0 # report last events typeset ARG_LIST="" # list all by default +typeset ARG_LIST_DETAILS=0 # list with full details is off by default typeset ARG_LOCK=1 # lock for concurrent script executions is on by default typeset ARG_LOG=1 # logging is on by default typeset ARG_NO_FIX=0 # fix/healing is not disabled by default @@ -571,7 +572,7 @@ cat << EOT Execute/report simple health checks (HC) on UNIX hosts. Syntax: ${SCRIPT_DIR}/${SCRIPT_NAME} [--help] | [--help-terse] | [--version] | - [--list=] | [--list-core] | [--list-include] | [--fix-symlinks] | [--show-stats] | (--archive-all | --disable-all | --enable-all) | [--fix-logs [--with-history]] | + [--list=] | [--list-details] | [--list-core] | [--list-include] | [--fix-symlinks] | [--show-stats] | (--archive-all | --disable-all | --enable-all) | [--fix-logs [--with-history]] | (--check-host | ((--archive | --check | --enable | --disable | --run [--timeout=] | --show) --hc= [--config-file=] [hc-args="])) [--display=] ([--debug] [--debug-level=]) [--log-healthy] [--no-fix] [--no-log] [--no-lock] [--no-monitor] [[--flip-rc] [--with-rc=]]] [--notify=] [--mail-to=] [--sms-to= --sms-provider=] @@ -606,12 +607,15 @@ Parameters: in double quotes (example: --hc_args="arg1,arg2=value,arg3"). --id : value of a FAIL ID (must be specified as uninterrupted sequence of numbers) --last : show the last (failed) events for each HC and their combined STC value ---list : show the available health checks. Use to search with wildcards. Following details are shown: +--list : show the available health checks in a terse manner. Use --list-details for a more extensive list. +--list-details : show the available health checks with following details included: - health check (plugin) name - state of the HC plugin (disabled/enabled) - version of the HC plugin - whether the HC plugin requires a configuration file in ${CONFIG_DIR} - whether the HC plugin is scheduled by cron + - whether the plugin contains a facility for --log-healthy and/or whether it is enabled + - whether the plugin contains fix/healing logic (see --no-fix) --list-core : show the available core plugins (mail,SMS,...) --list-include : show the available includes/libraries --log-healthy : log/show also passed health checks. By default this is off when the plugin support this feature. @@ -954,6 +958,10 @@ do ARG_ACTION=9 fi ;; + -list-details|--list-details) + ARG_LIST_DETAILS=1 + ARG_ACTION=9 + ;; -list-hc|--list-hc|-list-all|--list-all) print -u2 "WARN: deprecated option. Use --list | --list=" exit 0 diff --git a/opt/hc/lib/core/include_core.sh b/opt/hc/lib/core/include_core.sh index 1c36131..af3cd32 100755 --- a/opt/hc/lib/core/include_core.sh +++ b/opt/hc/lib/core/include_core.sh @@ -30,7 +30,7 @@ # RETURNS: 0 function version_include_core { -typeset _VERSION="2019-11-03" # YYYY-MM-DD +typeset _VERSION="2020-03-12" # YYYY-MM-DD print "INFO: $0: ${_VERSION#version_*}" @@ -1594,10 +1594,18 @@ fi # print header if [[ "${FACTION}" != "list" ]] then - # shellcheck disable=SC1117 - printf "%-40s\t%-8s\t%s\t\t%s\t%s\t%s\t%s\n" "Health Check" "State" "Version" "Config?" "Sched?" "H+?" "Fix?" - # shellcheck disable=SC2183,SC1117 - printf "%110s\n" | tr ' ' - + if (( ARG_LIST_DETAILS > 0 )) + then + # shellcheck disable=SC1117 + printf "%-40s\t%-8s\t%s\t\t%s\t%s\t%s\t%s\n" "Health Check" "State" "Version" "Config?" "Sched?" "H+?" "Fix?" + # shellcheck disable=SC2183,SC1117 + printf "%110s\n" | tr ' ' - + else + # shellcheck disable=SC1117 + printf "%-40s\t%-8s\n" "Health Check" "State" + # shellcheck disable=SC2183,SC1117 + printf "%60s\n" | tr ' ' - + fi fi print "${FPATH}" | tr ':' '\n' 2>/dev/null | grep -v "core$" 2>/dev/null | sort 2>/dev/null |\ while read -r FDIR @@ -1607,68 +1615,10 @@ do # cache script contents in memory FSCRIPT=$(<${FFILE}) + # --list (basic) # find function name but skip helper functions in the plug-in file (function _name) FNAME=$(print -R "${FSCRIPT}" | grep -E -e "^function[[:space:]]+[^_]" 2>/dev/null) - # look for version string (cut off comments but don't use [:space:] in tr) - FVERSION=$(print -R "${FSCRIPT}" | grep '^typeset _VERSION=' 2>/dev/null |\ - awk 'match($0,/[0-9]+-[0-9]+-[0-9]+/){print substr($0, RSTART, RLENGTH)}' 2>/dev/null) - # look for configuration file string - HAS_FCONFIG=$(print -R "${FSCRIPT}" | grep -c '^typeset _CONFIG_FILE=' 2>/dev/null) - if (( HAS_FCONFIG > 0 )) - then - FCONFIG="Yes" - # *.conf.dist first - if [[ -r ${CONFIG_DIR}/${FNAME#function *}.conf.dist ]] - then - # check for log_healthy parameter (config file) - HAS_FHEALTHY=$(_CONFIG_FILE="${CONFIG_DIR}/${FNAME#function *}.conf.dist" data_get_lvalue_from_config 'log_healthy') - case "${HAS_FHEALTHY}" in - no|NO|No) - FHEALTHY="No" - ;; - yes|YES|Yes) - FHEALTHY="Yes" - ;; - *) - FHEALTHY="N/S" - ;; - esac - else - FHEALTHY="N/S" - fi - # *.conf next - if [[ -r ${CONFIG_DIR}/${FNAME#function *}.conf ]] - then - # check for log_healthy parameter (config file) - HAS_FHEALTHY=$(_CONFIG_FILE="${CONFIG_DIR}/${FNAME#function *}.conf" data_get_lvalue_from_config 'log_healthy') - case "${HAS_FHEALTHY}" in - no|NO|No) - FHEALTHY="No" - ;; - yes|YES|Yes) - FHEALTHY="Yes" - ;; - *) - FHEALTHY="N/S" - ;; - esac - fi - # check for log_healthy support through --hc-args (plugin) - elif (( $(print -R "${FSCRIPT}" | grep -c -E -e "_LOG_HEALTHY" 2>/dev/null) > 0 )) - then - FCONFIG="No" - FHEALTHY="S" - else - FCONFIG="No" - FHEALTHY="N/S" - fi - # check fix - if (( $(print -R "${FSCRIPT}" | grep -c -E -e "_HC_CAN_FIX=1" 2>/dev/null) > 0 )) - then - FFIX="Yes" - else - FFIX="No" - fi + # check state DISABLE_FFILE="$(print ${FFILE##*/} | sed 's/\.sh$//')" if [[ -f "${STATE_PERM_DIR}/${DISABLE_FFILE}.disabled" ]] @@ -1677,30 +1627,104 @@ do else FSTATE="enabled" fi - # reset state when unlinked - [[ -h ${FFILE%%.*} ]] || FSTATE="unlinked" - # check scheduling - is_scheduled "${FNAME#function *}" - # shellcheck disable=SC2181 - if (( $? == 0 )) + + # --list-details + if (( ARG_LIST_DETAILS > 0 )) then - FSCHEDULED="No" - else - FSCHEDULED="Yes" + # look for version string (cut off comments but don't use [:space:] in tr) + FVERSION=$(print -R "${FSCRIPT}" | grep '^typeset _VERSION=' 2>/dev/null |\ + awk 'match($0,/[0-9]+-[0-9]+-[0-9]+/){print substr($0, RSTART, RLENGTH)}' 2>/dev/null) + # look for configuration file string + HAS_FCONFIG=$(print -R "${FSCRIPT}" | grep -c '^typeset _CONFIG_FILE=' 2>/dev/null) + if (( HAS_FCONFIG > 0 )) + then + FCONFIG="Yes" + # *.conf.dist first + if [[ -r ${CONFIG_DIR}/${FNAME#function *}.conf.dist ]] + then + # check for log_healthy parameter (config file) + HAS_FHEALTHY=$(_CONFIG_FILE="${CONFIG_DIR}/${FNAME#function *}.conf.dist" data_get_lvalue_from_config 'log_healthy') + case "${HAS_FHEALTHY}" in + no|NO|No) + FHEALTHY="No" + ;; + yes|YES|Yes) + FHEALTHY="Yes" + ;; + *) + FHEALTHY="N/S" + ;; + esac + else + FHEALTHY="N/S" + fi + # *.conf next + if [[ -r ${CONFIG_DIR}/${FNAME#function *}.conf ]] + then + # check for log_healthy parameter (config file) + HAS_FHEALTHY=$(_CONFIG_FILE="${CONFIG_DIR}/${FNAME#function *}.conf" data_get_lvalue_from_config 'log_healthy') + case "${HAS_FHEALTHY}" in + no|NO|No) + FHEALTHY="No" + ;; + yes|YES|Yes) + FHEALTHY="Yes" + ;; + *) + FHEALTHY="N/S" + ;; + esac + fi + # check for log_healthy support through --hc-args (plugin) + elif (( $(print -R "${FSCRIPT}" | grep -c -E -e "_LOG_HEALTHY" 2>/dev/null) > 0 )) + then + FCONFIG="No" + FHEALTHY="S" + else + FCONFIG="No" + FHEALTHY="N/S" + fi + # check fix + if (( $(print -R "${FSCRIPT}" | grep -c -E -e "_HC_CAN_FIX=1" 2>/dev/null) > 0 )) + then + FFIX="Yes" + else + FFIX="No" + fi + + # reset state when unlinked + [[ -h ${FFILE%%.*} ]] || FSTATE="unlinked" + # check scheduling + is_scheduled "${FNAME#function *}" + # shellcheck disable=SC2181 + if (( $? == 0 )) + then + FSCHEDULED="No" + else + FSCHEDULED="Yes" + fi fi # show results if [[ "${FACTION}" != "list" ]] then - # shellcheck disable=SC1117 - printf "%-40s\t%-8s\t%s\t%s\t%s\t%s\t%s\n" \ - "${FNAME#function *}" \ - "${FSTATE}" \ - "${FVERSION#typeset _VERSION=*}" \ - "${FCONFIG}" \ - "${FSCHEDULED}" \ - "${FHEALTHY}" \ - "${FFIX}" + if (( ARG_LIST_DETAILS > 0 )) + then + # shellcheck disable=SC1117 + printf "%-40s\t%-8s\t%s\t%s\t%s\t%s\t%s\n" \ + "${FNAME#function *}" \ + "${FSTATE}" \ + "${FVERSION#typeset _VERSION=*}" \ + "${FCONFIG}" \ + "${FSCHEDULED}" \ + "${FHEALTHY}" \ + "${FFIX}" + else + # shellcheck disable=SC1117 + printf "%-40s\t%-8s\n" \ + "${FNAME#function *}" \ + "${FSTATE}" + fi else # shellcheck disable=SC1117 printf "%s\n" "${FNAME#function *}" @@ -1735,11 +1759,18 @@ fi # legend if [[ "${FACTION}" != "list" ]] then - print - print "Config?: plugin has a default configuration file (Yes/No)" - print "Sched? : plugin is scheduled through cron (Yes/No)" - print "H+? : plugin can choose whether to log/show passed health checks (Yes/No/Supported/Not supported)" - print "Fix? : plugin contains fix/healing logic (Yes/No) -- not used by default!" + if (( ARG_LIST_DETAILS > 0 )) + then + print + print "Config?: plugin has a default configuration file (Yes/No)" + print "Sched? : plugin is scheduled through cron (Yes/No)" + print "H+? : plugin can choose whether to log/show passed health checks (Yes/No/Supported/Not supported)" + print "Fix? : plugin contains fix/healing logic (Yes/No) -- not used by default!" + else + print + print "Tip: use --list-details to see a list of health checks with more details" + + fi fi return 0