2 # Author : Ludovic Strappazon. l.strappazon@gmail.com
3 # Copyright 2004, Free Software Foundation e.V.
4 # Any comment, advice or enhancement are welcome :-)
6 PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
7 MYSQL="/usr/bin/mysql -u bacula --password=cW8s9_aH"
9 BACULA=/usr/local/bacula
11 PROGNAME=`basename $0`
12 PROGPATH=`echo $0 | sed -e 's,[\\/][^\\/][^\\/]*$,,'`
18 echo "Usage: $PROGNAME -P <pool> -M <media-type> -w <warning threshold> -c <critical threshold> [-S]"
25 echo "This plugin checks the space available in the pool against the space required for the next scheduled backups"
26 echo "Example : $PROGNAME -P default -M LTO -w 20 -c 10 will check the default pool, return OK if (available space) > 1,20*(required space), WARNING if 1,20*(required space) > (available space) > 1,10*(required space), and CRITICAL else."
28 echo "With the -S option, it will check the pool named Scratch and return WARNING instead of CRITICAL if the Scratch pool can save the situation."
29 echo "Example : $PROGNAME -P default -M LTO -w 20 -c 10 -S will check the default pool, return OK if (available space) > 1,20*(required space), WARNING if 1,20*(required space) > (available space) > 1,10*(required space) or if (available space in default and Scratch) > 1,10*(required space) > (available space in default), and CRITICAL else."
31 echo "The evaluation of the space required is done by adding the biggest backups of the same level than the scheduled jobs"
32 echo "The available space is evaluated by the number of out of retention tapes and the average VolBytes of these Full tapes"
34 echo "The Information Status are : \"Required, Available, Volume Errors\" and \"Will use Scratch pool\" if necessary."
36 echo "I think this plugin should be used in passive mode, and ran by a RunAfterJob"
42 while getopts :P:M:w:c:hS OPTION
47 M) MEDIA_TYPE="$OPTARG"
63 shift $(($OPTIND - 1))
65 if [ "$NB_ARGS" -ne 8 -a "$NB_ARGS" -ne 9 ]; then
66 print_revision $PROGNAME 13/06/2006
71 LAST_CHECK=`ps -ef | grep check_ba[Cc]ula_pools.sh | awk {'print $5'} | uniq | wc -l`
72 if [ "$LAST_CHECK" -gt 1 ]; then
73 echo "The last check was not complete, you should increase the check_period."
77 NB_VOLUMES=`$MYSQL << EOF
79 SELECT COUNT(MediaId) from Media, Pool where Media.PoolId=Pool.PoolId and Pool.Name="$POOL" AND Inchanger = "1";
82 NB_VOLUMES=`echo $NB_VOLUMES | cut -f 2 -d ' '`
86 q" | $BACULA/etc/bconsole | sed -n /Scheduled/,/Running/p | grep Backup | tr -s [:blank:] | tr '[:blank:]' '@' > ${TMP}/Scheduled.txt
89 for LINE in `cat ${TMP}/Scheduled.txt`
91 SCHEDULED_JOB=`echo $LINE | awk -F@ '{print $6}'`
92 LEVEL=`echo $LINE | awk -F@ '{print $1}' | cut -c 1`
94 MAX_VOLUME_JOB_FOR_LEVEL=`$MYSQL << EOF
96 SELECT MAX(JobBytes) from Job, Pool where Level="$LEVEL" AND Job.Name="$SCHEDULED_JOB" AND Job.PoolId=Pool.PoolId AND Pool.Name="$POOL";
99 MAX_VOLUME_JOB_FOR_LEVEL=`echo $MAX_VOLUME_JOB_FOR_LEVEL | cut -f 2 -d ' ' `
101 CAPA_REQUIRED=$[CAPA_REQUIRED+MAX_VOLUME_JOB_FOR_LEVEL]
104 rm ${TMP}/Scheduled.txt
107 if [ $NB_VOLUMES -gt 0 ]
110 NB_VOLUMES_OUT_OF_RETENTION=`$MYSQL << EOF
112 SELECT COUNT(MediaId) from Media, Pool where Media.PoolId=Pool.PoolId and Pool.Name="$POOL" AND LastWritten <> "0000-00-00 00:00:00" AND UNIX_TIMESTAMP()-UNIX_TIMESTAMP(LastWritten)>Media.VolRetention AND Inchanger = "1";
115 NB_VOLUMES_OUT_OF_RETENTION=`echo $NB_VOLUMES_OUT_OF_RETENTION | cut -f 2 -d ' '`
117 NB_VOLUMES_ERROR=`$MYSQL << EOF
119 SELECT COUNT(MediaId) from Media, Pool where Media.PoolId=Pool.PoolId and Pool.Name="$POOL" AND VolStatus="Error" AND Inchanger = "1";
122 NB_VOLUMES_ERROR=`echo $NB_VOLUMES_ERROR | cut -f 2 -d ' '`
124 AVERAGE_CAPA_VOLUME=`$MYSQL << EOF
126 SELECT SUM(VolBytes)/COUNT(MediaId) FROM Media where VolStatus="Full" AND MediaType="$MEDIA_TYPE";
129 AVERAGE_CAPA_VOLUME=`echo $AVERAGE_CAPA_VOLUME | cut -f 2 -d ' ' | cut -f 1 -d '.'`
131 CAPA_VOLUMES_APPEND=`$MYSQL << EOF
133 SELECT SUM("$AVERAGE_CAPA_VOLUME"-VolBytes) from Media, Pool where Media.PoolId=Pool.PoolId and Pool.Name="$POOL" AND (VolStatus = "Append" OR VolStatus = "Recycle" OR VolStatus = "Purge") AND Inchanger = "1" AND MediaType="$MEDIA_TYPE";
136 CAPA_VOLUMES_APPEND=`echo $CAPA_VOLUMES_APPEND | cut -f 2 -d ' '`
138 if [ $SCRATCH -eq 1 ]
140 CAPA_VOLUMES_SCRATCH=`$MYSQL << EOF
142 SELECT SUM("$AVERAGE_CAPA_VOLUME"-VolBytes) from Media, Pool where Media.PoolId=Pool.PoolId and Pool.Name="Scratch" AND VolStatus = "Append" AND Inchanger = "1" AND MediaType="$MEDIA_TYPE";
145 CAPA_VOLUMES_SCRATCH=`echo $CAPA_VOLUMES_SCRATCH | cut -f 2 -d ' '`
147 CAPA_VOLUMES_SCRATCH=0
150 CAPA_WARNING=`echo $[(WARNING+100)*CAPA_REQUIRED]/100 | bc | cut -f 1 -d '.'`
151 CAPA_CRITICAL=`echo $[(CRITICAL+100)*CAPA_REQUIRED]/100 | bc | cut -f 1 -d '.'`
152 CAPA_DISP=$[NB_VOLUMES_OUT_OF_RETENTION*AVERAGE_CAPA_VOLUME+CAPA_VOLUMES_APPEND]
153 CAPA_DISP_INCLUDING_SCRATCH=$[CAPA_DISP+CAPA_VOLUMES_SCRATCH]
155 MESSAGE="Required : $[CAPA_REQUIRED/1000000000] Go, available : $[CAPA_DISP/1000000000] Go, Volumes Error : $NB_VOLUMES_ERROR"
157 if [ "$CAPA_DISP" -gt $CAPA_WARNING ]; then
160 elif [ "$CAPA_DISP" -gt $CAPA_CRITICAL ];then
163 elif [ "$CAPA_DISP_INCLUDING_SCRATCH" -gt $CAPA_CRITICAL ];then
164 MESSAGE="${MESSAGE}. Will use Scratch Pool !"
173 echo "No volume in pool ${POOL}"
174 if [ "$CAPA_REQUIRED" -gt 0 ]