#!/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"
