conf-10-check-nrpe/conf/usr/local/bin/check_service
2021-02-20 17:24:50 +01:00

323 lines
9.3 KiB
Bash
Executable File

#!/usr/bin/env bash
################################################################################
# BSD 3-Clause License
#
# Copyright (c) 2020-2021, Alban Vidal <alban.vidal@zordhak.fr>
# Copyright (c) 2020-2021, Quentin Lejard <q.lejard@valde.fr>
# All rights reserved.
#
# Please see license file on root of this directory
################################################################################
# !! GIT FILE !!
# https://framagit.org/zorval/scripts/check-nrpe
################################################################################
# Script de check des services SystemD
# Option possible : --print pour afficher sur l'écran d'accueil
# Si pas d'option : directement utilisable par NRPE
OPTION_1=$1
PRINT_MODE=false
if [ ! -z "$OPTION_1" ]; then
if [ "$OPTION_1" = "--print" ]; then
PRINT_MODE=true
else
echo "[CRITICAL] Option '$OPTION_1' inconnue"
exit 2
fi
fi
FIC_BASE=/etc/zorval/check_services_base
FIC_SPEC=/etc/zorval/check_services-
FIC_COLORS=/etc/profile.d/00_fonctions.sh
# Récupération des couleurs (NORMAL GRAS SSLIGNE ROUGE VERT BLEU GRIS)
if [ "$PRINT_MODE" = true ]; then
if [ -f $FIC_COLORS ]; then
source $FIC_COLORS
else
echo "[CRITICAL] Impossible de lire le fichier $FIC_COLORS"
exit 2
fi
fi
# Fonction qui permet de tester l'état d'un service systemd passé en paramètres
# Elle attend en argument le nom du service
# Elle renvoie "$LETTER_1 $LETTER_2 $COLOR_1 $COLOR_2 $SERVICE_COLOR $SERVICE_STATUS"
test_service() {
local SERVICE=$1
LETTER_1=A
IS_ENABLED=$(systemctl is-enabled "$service" 2>/dev/null)
IS_ACTIVE=$(systemctl is-active "$service" 2>/dev/null)
# SERVICE_STATUS=1 => problème
# SERVICE_STATUS=0 => ok
SERVICE_STATUS=1
# Cas d'un service lancé par un timer, ou dépendant d'un autre service
if [ "$IS_ENABLED" = static ]; then
COLOR_2=GRIS
LETTER_2=S
if [ "$IS_ACTIVE" = inactive ]; then
SERVICE_COLOR=NORMAL
COLOR_1=VERT
SERVICE_STATUS=0
elif [ "$IS_ACTIVE" = active ]; then
SERVICE_COLOR=NORMAL
COLOR_1=VERT
SERVICE_STATUS=0
elif [ "$IS_ACTIVE" = failed ]; then
SERVICE_COLOR=ROUGE
COLOR_1=ROUGE
fi
# Cas d'un service standard, activé
elif [ "$IS_ENABLED" = enabled ] || [ "$IS_ENABLED" = enabled-runtime ]; then
COLOR_2=VERT
LETTER_2=E
# S'il est démarré
if [ "$IS_ACTIVE" = active ]; then
SERVICE_COLOR=NORMAL
COLOR_1=VERT
SERVICE_STATUS=0
# S'il est arrêté ou en échec
elif [ "$IS_ACTIVE" = inactive ] || [ "$IS_ACTIVE" = failed ]; then
SERVICE_COLOR=ROUGE
COLOR_1=ROUGE
fi
# Cas d'un service standard, désactivé
elif [ "$IS_ENABLED" = disabled ]; then
COLOR_2=ROUGE
LETTER_2=E
# S'il est démarré
if [ "$IS_ACTIVE" = active ]; then
SERVICE_COLOR=ROUGE
COLOR_1=VERT
# S'il est arrêté ou en échec
elif [ "$IS_ACTIVE" = inactive ] || [ "$IS_ACTIVE" = failed ]; then
SERVICE_COLOR=ROUGE
COLOR_1=ROUGE
fi
# Cas inconnu
else
COLOR_1=ROUGE
COLOR_2=ROUGE
LETTER_2=E
SERVICE_COLOR=ROUGE
fi
echo "$LETTER_1 $LETTER_2 $COLOR_1 $COLOR_2 $SERVICE_COLOR $SERVICE_STATUS"
}
# Nombre de caractère par colonne
longueur_col_1=0
longueur_col_2=0
# Test existence et lecture des fichiers
if [ -f "$FIC_BASE" ]; then
FIC_BASE_EXISTS=true
FIC_BASE_CONTENT="$(grep -Ev '^[ \t]*#|^[ \t]*$' $FIC_BASE)"
else
FIC_BASE_EXISTS=false
fi
if ls "$FIC_SPEC"* >/dev/null 2>&1; then
FIC_SPEC_EXISTS=true
FIC_SPEC_CONTENT="$(grep -Ehv '^[ \t]*#|^[ \t]*$' ${FIC_SPEC}*)"
else
FIC_SPEC_EXISTS=false
fi
#
# Première étape : pour un bel affichage, on récupère la longueur max des noms
# des services pour chaque colonne (il y a 2 colonnes)
#
if [ "$FIC_BASE_EXISTS" = true ] && [ "$PRINT_MODE" = true ] ; then
current_col=1
while IFS= read -r service; do
# Si le service doit être masqué, on passe au service suivant
grep --quiet -- "--${service}" "$FIC_SPEC"* >/dev/null 2>&1 && continue
# Si ce service a un plus grand nombre de caractères que le nombre actuel pour cette colonne
# alors on remplace la valeur
if [ "$current_col" = 1 ] && (( ${#service} > $longueur_col_1 )); then
longueur_col_1=${#service}
elif [ "$current_col" = 2 ] && (( ${#service} > $longueur_col_2 )); then
longueur_col_2=${#service}
fi
((current_col++))
if [ "$current_col" = "3" ]; then
current_col=1
fi
done <<< "$FIC_BASE_CONTENT"
current_col=1
if [ "$FIC_SPEC_EXISTS" = true ]; then
while IFS= read -r service; do
# Si on masque le service dans le bloc des services de base, on passe au suivant
[[ $service =~ ^- ]] && continue
# Si ce service a un plus grand nombre de caractères que le nombre actuel pour cette colonne
# alors on remplace la valeur
if [ "$current_col" = 1 ] && (( ${#service} > $longueur_col_1 )); then
longueur_col_1=${#service}
elif [ "$current_col" = 2 ] && (( ${#service} > $longueur_col_2 )); then
longueur_col_2=${#service}
fi
((current_col++))
if [ "$current_col" = "3" ]; then
current_col=1
fi
done <<< "$FIC_SPEC_CONTENT"
fi
fi
#
# Deuxième étape : on récupère l'état de chaque service
#
STDOUT=""
STDERR=""
if [ "$FIC_BASE_EXISTS" = true ]; then
if [ "$PRINT_MODE" = true ]; then
echo -e "${GRAS}${SSLIGNE}${BLEU}Services standards$NORMAL\n"
fi
current_col=1
# Pour chaque service défini dans $FIC_BASE
while IFS= read -r service; do
# Si le service doit être masqué, on passe au service suivant
if grep --quiet -- "--$service" "$FIC_SPEC"* >/dev/null 2>&1; then
continue
# Sinon si le service doit être grisé
elif grep --quiet -- "-$service" "$FIC_SPEC"* >/dev/null 2>&1; then
if [ "$PRINT_MODE" = true ]; then
SERVICE_COLOR="GRIS"
COLOR_1="GRIS"
COLOR_2="GRIS"
LETTER_1=A
LETTER_2=E
SERVICE_STATUS=0
else
continue
fi
else
read LETTER_1 LETTER_2 COLOR_1 COLOR_2 SERVICE_COLOR SERVICE_STATUS < <(test_service "$service")
fi
if [ "$PRINT_MODE" = true ]; then
[ "$current_col" = 1 ] && longueur_col=$longueur_col_1 || longueur_col=$longueur_col_2
printf "[$(eval echo \$$COLOR_1)%s${NORMAL}/$(eval echo \$$COLOR_2)%s${NORMAL}] $(eval echo \$$SERVICE_COLOR)%-${longueur_col}s${NORMAL} " "$LETTER_1" "$LETTER_2" "$service"
((current_col++))
if [ "$current_col" = "3" ]; then
echo
current_col=1
fi
else
if [ "$SERVICE_STATUS" = "0" ]; then
STDOUT+="\n[OK] $service"
else
STDERR+="\n[CRITICAL] $service"
fi
fi
done <<< "$FIC_BASE_CONTENT"
if [ "$PRINT_MODE" = true ] && [ "$current_col" = 2 ]; then
echo
fi
else
echo "Aucun service surveillé"
exit
fi
if [ "$FIC_SPEC_EXISTS" = true ] && grep --quiet --invert-match '^-' "${FIC_SPEC}"*; then
if [ "$PRINT_MODE" = true ]; then
NB_SERVICES_SPEC=$(grep --count --invert-match '^-' "${FIC_SPEC}"* 2>/dev/null)
if [ "$NB_SERVICES_SPEC" == "1" ]; then
echo -e "\n${GRAS}${SSLIGNE}${BLEU}Service spécifique$NORMAL\n"
else
echo -e "\n${GRAS}${SSLIGNE}${BLEU}Services spécifiques$NORMAL\n"
fi
fi
current_col=1
while IFS= read -r service; do
# Si on masque le service dans le bloc des services de base, on passe au suivant
[[ $service =~ ^- ]] && continue
read LETTER_1 LETTER_2 COLOR_1 COLOR_2 SERVICE_COLOR SERVICE_STATUS < <(test_service "$service")
if [ "$PRINT_MODE" = true ]; then
[ "$current_col" = 1 ] && longueur_col=$longueur_col_1 || longueur_col=$longueur_col_2
printf "[$(eval echo \$$COLOR_1)%s${NORMAL}/$(eval echo \$$COLOR_2)%s${NORMAL}] $(eval echo \$$SERVICE_COLOR)%-${longueur_col}s${NORMAL} " "$LETTER_1" "$LETTER_2" "$service"
((current_col++))
if [ "$current_col" = "3" ]; then
echo
current_col=1
fi
else
if [ "$SERVICE_STATUS" = "0" ]; then
STDOUT+="\n[OK] $service"
else
STDERR+="\n[CRITICAL] $service"
fi
fi
done <<< "$FIC_SPEC_CONTENT"
if [ "$PRINT_MODE" = true ] && [ "$current_col" = 2 ]; then
echo
fi
fi
if [ "$PRINT_MODE" = false ]; then
RC=0
if [ ! -z "$STDERR" ]; then
echo -n "[CRITICAL] Services en erreur :"
echo -e "$STDERR\n"
RC=2
else
echo -n "[OK] "
fi
if [ ! -z "$STDOUT" ]; then
echo -n "Services sous surveillance :"
echo -e "$STDOUT"
fi
exit $RC
fi