diff --git a/plugins/disk/quota2percent_ b/plugins/disk/quota2percent_ new file mode 100644 index 00000000..683a9368 --- /dev/null +++ b/plugins/disk/quota2percent_ @@ -0,0 +1,247 @@ +#!/bin/bash +# -*- sh -*- +: <<=cut + +=head1 NAME + +quota2percent - Plugin to show disk usage in percent of quota hard limit. + +=head1 APPLICABLE SYSTEMS + +All systems with "bash", "quota", "repquota" and "munin" +Systems with multiple users and individual storage space limitations administered via 'quota' + +=head1 CONFIGURATION + +The following is the default configuration + + [quota2percent_*] + user root + +You could define two alert levels and the graph language + + [quota2percent_*] + env.warning [value] (default: 90) + env.critical [value] (default: 95) + env.language [en|de|es] (default: en) + env.humanuid [value] (default: 1000, only need if there is an other value define for UID_MIN in /etc/login.defs) + +=head1 DESCRIPTION + +Wild card Plugin for monitoring the utilization of devices with quota rules. +A graph is drawn for each user, which shows the usage as a percentage of his hard limit. System accounts (UID <1000) are suppressed. +In addition, a graph is displayed which indicates the ratio device size to device coverage. +The script repqutoa, usually part of the package quota, is needed. +The plugin itself can be stored in any directory. For example, the device sdb1 shell be monitored, a symbolic link must be created +in the /etc/munin/plugins/ directory as follows: + +=over + +I<<< ln -s //quota2percent_ quota2percent_sdb1 >>> + +=back + +=head1 MAGIC MARKERS + + #%# family=auto + #%# capabilities=autoconf + +=head1 VERSION + +17.0210 + +=head1 HISTORY + +V17.0210 + + add env.humanid + add check if device exist + add if no limitations administered via 'quota' for the device the total line is shown only + fix same nitpicking details + add some comments + +V17.0131 + + add POD documentation + add env.language + add example graph for Munin Plugin Gallery + remove German comments + +V17.0124 + + first version, not munin rules conform + +=head1 AUTHOR + +Jo Hartmann + +=head1 LICENSE + +GPLv2 (L) + +=cut + +################################################### +# Autoconf section # +################################################### + + if [ "$1" = "autoconf" ]; then + if ! repquota -V &> /dev/null ; then + echo "no ('requota' executable is missing)" + exit 127 + fi + + if ! df "/dev/${0##*_}" &> /dev/null; then + echo "The device /dev/${0##*_} does not exist!" >&2 + exit 128 + fi + + echo yes + exit 0 + fi + +################################################### +# Preparation section # +################################################### + +# Load munin's shell libary + . "$MUNIN_LIBDIR/plugins/plugin.sh" + +# if any fetch from munin-node file + Warning=${warning:-90} + Critical=${critical:-95} + Language=${language:-en} + Min_UID=${humanuid:-1000} + +# Ensure that the 'root' path is valid + PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" + +# Checking if repquota installed and on the path + if ! repquota -V &> /dev/null ; then + echo "The script 'repquota' is not installed or on the path" >&2 + # Send the exit code FATAL ERROR happens + exit 127 + fi + +# get tehe wild card text + Id=${0##*_} + +# Check if device exist + if ! df "/dev/$Id" &> /dev/null; then + echo "The device /dev/$Id does not exist!" >&2 + exit 128 + fi + +################################################### +# Data reading sections # +################################################### + +# Reading the quotes for the selected device, using repquota + if repquota "/dev/$Id" &> /dev/null; then + readarray Quotas < <( repquota "/dev/$Id" | grep " -- " ) + else + echo "No limitations administered via 'quota' for $Id" >&2 + # If no limitatitons administered: create a dummy + Quotas[0]="root -- 1 1 1 1 1 1" + fi + + readarray Totals < <( df "/dev/$Id" ) + +# Get the count of Users + Users=${#Quotas[@]} + + +################################################### +# Munin Configuration Section # +################################################### + + if [ "$1" = "config" ]; then + + # Localisation of the graphic texts + case $Language in + de) + echo graph_title "Quota-Hard-Limit von $Id" + echo graph_vlabel "Nutzung in % Hardlimit" + echo graph_info "Die Grafik zeigt die Belegung des durch Quota reglementierten Speicherplatzes für alle regulären Nutzer (UID >= $Min_UID) in Prozent des Hardlimits." + Total_txt="Su. aller Nutzer" + Total_info="Inklusive Systemnutzer (UID < $Min_UID)" + ;; + es) + echo graph_title "Cuota de límite absoluto de $Id" + echo graph_vlabel "el % de uso del límite duro" + echo graph_info "El gráfico muestra la disponibilidad de espacio regulado por cuotas para todos los usuarios regulares (UID >= $Min_UID) como porcentaje de límites duros." + Total_txt="Suma de todos los usuarios " + Total_info="La inclusión de usuario del sistema (UID < $Min_UID) " + ;; + *) + echo graph_title "quota hard limit of $Id" + echo graph_vlabel "Usage in %" + echo graph_info "The graphic shows the allocation of the quota-regulated storage space for all regular users (UID >= $Min_UID) as a percentage of the hard limit ." + Total_txt="all users" + Total_info="system users (UID < $Min_UID) included" + ;; + esac + + # Defaults configuration + echo graph_category disk + echo graph_args --lower-limit 0 --upper-limit 100 + echo graph_printf %5.2lf %% + echo graph_scale no + + # For each quota user fetch his real name, solve the root problem, Output the configuration data + for((i=0; i<"$Users"; i++));do + Quota=( ${Quotas[$i]} ) + UserName=${Quota[0]} + Passwd=$(grep "$UserName" /etc/passwd) + OLDIFS=$IFS + IFS=':' Infos=($Passwd) + IFS=$OLDIFS + UserInfo=${Infos[4]} + UserInfo=${UserInfo%%,*} + + UserName="$(clean_fieldname "$UserName")" + + # I hate the underlines in place of blanks! + [ "$(echo "$UserName"|cut -c 1)" = "_" ] && UserInfo="$(clean_fieldname "$UserInfo")" + + # If no UserInfo found + [ ! -n "$UserInfo" ] && UserInfo="$UserName" + + # No graph for none human uid + [ "$(id -u "${Quota[0]}")" -lt "$Min_UID" ] && echo "$UserName.graph no" + + # configure the user lines + echo "$UserName.label $UserInfo" + echo "$UserName.warning $Warning" + echo "$UserName.critical $Critical" + done + + # configure the total line and send exit code NO ERROR happens + echo total.label "$Total_txt" + echo total.warning "$Warning" + echo total.critical "$Critical" + echo total.info "$Total_info" + exit 0 + fi + +################################################### +# Munin value section # +################################################### + +# fetch the needed values (used and hard limit) for each user, work around the root problem, calculate the percent value + for((i=0; i<"$Users"; i++));do + Quota=( ${Quotas[$i]} ) + UserName="$(clean_fieldname "${Quota[0]}")" + echo "${Quota[2]} ${Quota[4]} $UserName.value" | awk '{printf "%s %f\n",$3,$1*100/$2}' + done + +# the value for the total line + Total=( ${Totals[1]} ) + echo "${Total[2]} ${Total[1]} total.value" | awk '{printf "%s %f\n",$3,$1*100/$2}' + +# send the exit code NO ERROR happens + exit 0 + +################################################### +# Script end # +###################################################