]> git.sur5r.net Git - bacula/bacula/blob - bacula/examples/nagios/check_bacula_pools.sh
Fix typo in check_bacula.c + add makeit to build
[bacula/bacula] / bacula / examples / nagios / check_bacula_pools.sh
1 #! /bin/sh
2 # Author : Ludovic Strappazon. l.strappazon@gmail.com
3 # Copyright 2004, Free Software Foundation Europe e.V.
4 # Any comment, advice or enhancement are welcome  :-) 
5
6 PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
7 MYSQL="/usr/bin/mysql -u bacula --password=mypassword"
8 TMP=/tmp
9 BACULA=/usr/local/bacula
10
11 PROGNAME=`basename $0`
12 PROGPATH=`echo $0 | sed -e 's,[\\/][^\\/][^\\/]*$,,'`
13 STATUS=""
14
15 . $PROGPATH/utils.sh
16
17 print_usage() {
18         echo "Usage: $PROGNAME -P <pool> -M <media-type> -w <warning threshold> -c <critical threshold> [-S]"
19 }
20
21 print_help() {
22         echo ""
23         print_usage
24         echo ""
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."
27         echo ""
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."
30         echo ""
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"
33         echo ""
34         echo "The Information Status are : \"Required, Available, Volume Errors\" and \"Will use Scratch pool\" if necessary."
35         echo ""
36         echo "I think this plugin should be used in passive mode, and ran by a RunAfterJob"
37         exit 3
38 }
39
40 NB_ARGS=$#
41 SCRATCH=0
42 while getopts :P:M:w:c:hS OPTION
43 do
44   case $OPTION in
45     P) POOL="$OPTARG"
46        ;;
47     M) MEDIA_TYPE="$OPTARG"
48        ;;
49     S) SCRATCH=1
50        ;;
51     w) WARNING="$OPTARG"
52        ;;
53     c) CRITICAL="$OPTARG"
54        ;;
55     h) print_help
56        exit 3
57        ;;
58     *) print_usage
59        exit 3
60        ;;
61   esac
62 done
63 shift $(($OPTIND - 1))
64
65 if [ "$NB_ARGS" -ne 8 -a "$NB_ARGS" -ne 9 ]; then
66         print_revision $PROGNAME 25/05/2005
67         print_usage
68         exit 3
69 fi
70
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."
74         exit 3
75 fi
76
77   NB_VOLUMES_OUT_OF_RETENTION=`$MYSQL << EOF
78 USE bacula
79 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";
80 EOF
81 `
82   NB_VOLUMES_OUT_OF_RETENTION=`echo $NB_VOLUMES_OUT_OF_RETENTION | cut -f 2 -d ' '`
83
84 NB_VOLUMES_ERROR=`$MYSQL << EOF
85 USE bacula
86 SELECT COUNT(MediaId) from Media, Pool where Media.PoolId=Pool.PoolId and Pool.Name="$POOL" AND VolStatus="Error" AND Inchanger = "1";
87 EOF
88 `
89 NB_VOLUMES_ERROR=`echo $NB_VOLUMES_ERROR | cut -f 2 -d ' '`
90
91 AVERAGE_CAPA_VOLUME=`$MYSQL << EOF
92 USE bacula
93 SELECT SUM(VolBytes)/COUNT(MediaId) FROM Media where VolStatus="Full" AND MediaType="$MEDIA_TYPE";
94 EOF
95 `
96 AVERAGE_CAPA_VOLUME=`echo $AVERAGE_CAPA_VOLUME | cut -f 2 -d ' ' | cut -f 1 -d '.'`
97
98 CAPA_VOLUMES_APPEND=`$MYSQL << EOF
99 USE bacula
100 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";
101 EOF
102 `
103 CAPA_VOLUMES_APPEND=`echo $CAPA_VOLUMES_APPEND | cut -f 2 -d ' '`
104
105 if [ $SCRATCH -eq 1 ]
106 then
107 CAPA_VOLUMES_SCRATCH=`$MYSQL << EOF
108 USE bacula
109 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";
110 EOF
111 `
112 CAPA_VOLUMES_SCRATCH=`echo $CAPA_VOLUMES_SCRATCH | cut -f 2 -d ' '`
113 else 
114 CAPA_VOLUMES_SCRATCH=0
115 fi
116
117 echo "st
118 1
119 q" | $BACULA/etc/bconsole | sed -n /Scheduled/,/Running/p | grep Backup | tr -s [:blank:] | tr '[:blank:]' '@' > ${TMP}/Scheduled.txt
120
121 CAPA_REQUIRED=0
122 for LINE in `cat ${TMP}/Scheduled.txt`
123 do
124   SCHEDULED_JOB=`echo $LINE | awk -F@ '{print $6}'`
125   LEVEL=`echo $LINE | awk -F@ '{print $1}' | cut -c 1` 
126
127 MAX_VOLUME_JOB_FOR_LEVEL=`$MYSQL << EOF
128 USE bacula
129 SELECT MAX(JobBytes) from Job, Pool where Level="$LEVEL" AND Job.Name="$SCHEDULED_JOB" AND Job.PoolId=Pool.PoolId AND Pool.Name="$POOL";
130 EOF
131 `
132 MAX_VOLUME_JOB_FOR_LEVEL=`echo $MAX_VOLUME_JOB_FOR_LEVEL | cut -f 2 -d ' ' `
133
134 CAPA_REQUIRED=$[CAPA_REQUIRED+MAX_VOLUME_JOB_FOR_LEVEL]
135 done
136
137 rm ${TMP}/Scheduled.txt
138
139 CAPA_WARNING=`echo $[(WARNING+100)*CAPA_REQUIRED]/100 | bc | cut -f 1 -d '.'`
140 CAPA_CRITICAL=`echo $[(CRITICAL+100)*CAPA_REQUIRED]/100 | bc | cut -f 1 -d '.'`
141 CAPA_DISP=$[NB_VOLUMES_OUT_OF_RETENTION*AVERAGE_CAPA_VOLUME+CAPA_VOLUMES_APPEND]
142 CAPA_DISP_INCLUDING_SCRATCH=$[CAPA_DISP+CAPA_VOLUMES_SCRATCH]
143
144 MESSAGE="Required : $[CAPA_REQUIRED/1000000000] Go, available : $[CAPA_DISP/1000000000] Go, Volumes Error : $NB_VOLUMES_ERROR"
145
146 if [ "$CAPA_DISP" -gt $CAPA_WARNING ]; then
147    echo $MESSAGE
148    exit 0
149 elif [ "$CAPA_DISP" -gt $CAPA_CRITICAL ];then
150    echo $MESSAGE
151    exit 1
152 elif [ "$CAPA_DISP_INCLUDING_SCRATCH" -gt $CAPA_CRITICAL ];then
153    MESSAGE="${MESSAGE}. Will use Scratch Pool !"
154    echo $MESSAGE
155    exit 1
156 else
157    exit 2
158 fi
159 exit 3