#!/usr/bin/env bash STATE_OK=0 STATE_WARNING=1 STATE_CRITICAL=2 STATE_UNKNOWN=3 LAST_DIAGNOSIS_CRIT=720 # default value LAST_DIAGNOSIS_WARN=24 # default value CHECK_STATE=$STATE_OK function help () { cat <|all|last_diagnosis] [-c ] [-w ] Options: -h Print this -a last_diagnosis: Hours since last diagnosis was run. all: Check all categories. : See below for list of categories. -c Only applicable to 'last_diagnosis'. -w Only applicable to 'last_diagnosis'. Category can be one of the following: "base system" "internet connectivity" "dns records" "ports exposure" "web" "email" "services status check" "system resources" "system configurations" "applications" EOF } function category () { while IFS= read line; do if [[ $(echo "$line" | grep -c "^ description: ") -gt 0 ]]; then currentcategory="$(echo "${line}" | sed 's/^ description: //')" # currentcategory="${line//^ description: /}" fi # echo "==${currentcategory}==${line}==" if [[ "${currentcategory,,}" == "${1,,}" || "${1,,}" == 'all' ]]; then echo "$line" fi done } SHOW=$(mktemp /tmp/XXXXXX) sudo yunohost diagnosis show --full > $SHOW # SHOW="show_full.yml" CHECK_TYPE='na' CATEGORY='' while [[ $# -gt 0 ]]; do case "$1" in -h) help exit ;; -a) shift if [[ "$1" == 'last_diagnosis' ]]; then CHECK_TYPE='last_diagnosis' else CHECK_TYPE='category' CATEGORY="$1" fi ;; -w) shift LAST_DIAGNOSIS_WARN="$1" ;; -c) shift LAST_DIAGNOSIS_CRIT="$1" ;; esac shift done case "$CHECK_TYPE" in category) OKS=$(cat $SHOW | category "$CATEGORY" | grep -Ec "^ *status: (SUCCESS|INFO)") WARNINGS=$(cat $SHOW | category "$CATEGORY" | grep -c "^ *status: WARNING") ERRORS=$(cat $SHOW | category "$CATEGORY" | grep -c "^ *status: ERROR") if [[ $ERRORS -gt 0 ]]; then CHECK_STATE=$STATE_CRITICAL cat $SHOW | category "$CATEGORY" | grep -A1 "^ *status: ERROR" | grep '^ *summary: ' | sed 's/^ *summary: /ERROR: /' cat $SHOW | category "$CATEGORY" | grep -A1 "^ *status: WARNING" | grep '^ *summary: ' | sed 's/^ *summary: /WARNING: /' elif [[ $WARNINGS -gt 0 ]]; then CHECK_STATE=$STATE_WARNING cat $SHOW | category "$CATEGORY" | grep -A1 "^ *status: WARNING" | grep '^ *summary: ' | sed 's/^ *summary: /WARNING: /' elif [[ $OKS -eq 0 ]]; then CHECK_STATE=$STATE_UNKNOWN echo -e "UNKNOWN: Could not get results from 'yunohost diagnosis show'" else CHECK_STATE=$STATE_OK echo "OK: All diagnostics return SUCCESS" fi echo -e "|'OK'=$OKS 'WARNING'=$WARNINGS 'ERROR'=$ERRORS" # The perfdata ;; last_diagnosis) LAST_DIAGNOSIS=$(( ($(date +%s) - $(cat $SHOW | grep timestamp | tail -n1 | grep -o '[0-9]*') )/3600 )) if [[ $LAST_DIAGNOSIS -gt $LAST_DIAGNOSIS_CRIT ]]; then CHECK_STATE=$STATE_CRITICAL echo "CRITICAL: Diagnosis results are more than $LAST_DIAGNOSIS_CRIT hours old." elif [[ $LAST_DIAGNOSIS -gt $LAST_DIAGNOSIS_WARN ]]; then CHECK_STATE=$STATE_WARNING echo "WARNING: Diagnosis results are more than $LAST_DIAGNOSIS_WARN hours old." else CHECK_STATE=$STATE_OK echo "OK: Diagnosis results are less than $LAST_DIAGNOSIS_WARN hours old." fi echo -e "|'Last_Diagnosis'=${LAST_DIAGNOSIS}h" # The perfdata ;; na) CHECK_STATE=$STATE_UNKNOWN echo -e "UNKNOWN: Incorrect parameters. See help for details.'" ;; esac rm $SHOW exit $CHECK_STATE