#!/bin/bash -e # # Plugin munin affichant la mémoire utilisée, disponible et maximale de la JVM de tomcat. # ## Dépendances # xmlstarlet # wget # ## Configuration # # Pour pouvoir lire le mot de passe automatiquement, le script doit tourner # sous l'utilisateur tomcat55. Dans /etc/munin/plugin-conf.d/munin-node, # ajouter : # # [tomcat_*] # user tomcat55 # # Autres options disponibles : # # env.status_url : URL vers la page « status » en XML du manager # env.http_username : Utilisateur HTTP # env.users_filename : Chemin vers le fichier tomcat-users.xml # ## TOMCAT_USERS=${users_filename:-'/etc/tomcat5.5/tomcat-users.xml'} USER=${http_username:-'munin'} URLS=( ${status_url:-'http://localhost/manager/status?XML=true https://localhost/manager/status?XML=true http://localhost/manager/status?XML=true'} ) WARNING=80 CRITICAL=90 #///////////////////////////////////////////////////////////////////////////////// # Affiche un message d'erreur et termine le script en renvoyant le code d'erreur 1 # # @param Message à afficher #///////////////////////////////////////////////////////////////////////////////// die(){ echo "$1" >&2 exit 1 } #//////////////////////////////////////////////////////////////////////////// # Récupère le mot de passe de l'utilisateur $1 contenu dans le fichier XML $2 # # @param in $1 Nom de l'utilisateur # @param in $2 Fichier XML contenant les utilisateurs Tomcat # @stdout Mot de passe de l'utilisateur #//////////////////////////////////////////////////////////////////////////// getPassword(){ local PASSWORD=$(xmlstarlet sel -t -m "tomcat-users/user[@username='$1']" -v "@password" "$2" 2> /dev/null) [[ -z $PASSWORD ]] && die "Aucun mot de passe trouvé dans le fichier « $2 » pour le compte « $1 » !" echo $PASSWORD } #////////////////////////////////////////////////////// # Récupère la page en XML contenant le statut de la JVM # # @param in $1 Login pour accéder à la page de statut # @param in $2 Mot de passe # @param in $3..$n URL à tester #////////////////////////////////////////////////////// getStatusPage(){ local USER="$1" local PASSWORD="$2" while [[ $# -gt 2 ]]; do local STATUS=$(wget -O- -q --no-check-certificate --http-user "$USER" --http-password "$PASSWORD" "$3") [[ -n $STATUS ]] && { echo $STATUS return } shift done } #/////////////////////////////////////// # Affiche la mémoire maximale allouable # # @param in $1 Page de statut de la JVM # @stdout Mémoire maximale allouable #/////////////////////////////////////// getMaxMemory(){ local MAX_MEM=$(xmlstarlet sel -t -m "status/jvm/memory" -v "@max" <<< "$1" 2> /dev/null) [[ -z $MAX_MEM ]] && die "Impossible de trouver la mémoire maximale allouable !" echo $MAX_MEM } #/////////////////////////////////////////////////////////////////////////// # Affiche la configuration du plugin # # @param in $1 Mémoire maximale allouable # @param in $2 Pourcentage à utiliser pour définir les « warnings » [0-100] # @param in $3 Pourcentage à utiliser pour définir les « criticals » [0-100] # @stdout Configuration du plugin #/////////////////////////////////////////////////////////////////////////// showConfig(){ local TMP=$(echo -e {max,total,free}.{'type GAUGE','min 0','draw AREA'}"\n") echo "graph_category Tomcat graph_title Tomcat JVM graph_info Mémoire de la JVM Tomcat graph_vlabel Mémoire $TMP max.label max total.label total free.label free total.warning $(($1 * $2 / 100)) total.critical $(($1 * $3 / 100)) " | sed -r 's/^\s+//' exit 0 } #///////////////////////////////////////////////////////////////////////////////////////// # Affiche les données sur la mémoire utilisée, disponible et maximale de la JVM de tomcat. # # @param in $1 Page de statut de la JVM # @stdout Données sur la mémoire utilisée, disponible et maximale de la JVM de tomcat #///////////////////////////////////////////////////////////////////////////////////////// showData(){ xmlstarlet sel -t -m "status/jvm/memory" \ -o "max.value " -v "@max" -n \ -o "total.value " -v "@total" -n \ -o "free.value " -v "@free" \ <<< "$1" 2> /dev/null } # Le fichier $TOMCAT_USERS n'est pas lisible => on quitte [[ ! -r $TOMCAT_USERS ]] && die "Impossible de lire le fichier $TOMCAT_USERS !" # On récupère le mot de passe de l'utilisateur $USER PASSWORD=$(getPassword $USER $TOMCAT_USERS) # On récupère la page de statut de la JVM de tomcat STATUS_PAGE=$(getStatusPage $USER $PASSWORD $URLS) [[ -z $STATUS_PAGE ]] && die 'Erreur : impossible de récupérer la page de statut de Tomcat !' ; # On affiche la configuration du plugin [[ $1 == 'config' ]] && showConfig $(getMaxMemory "$STATUS_PAGE") $WARNING $CRITICAL # On affiche les données du plugin showData "$STATUS_PAGE"