Hello Arno,

This is the script :

#! /bin/sh
# Author : Ludovic Strappazon. [EMAIL PROTECTED]
# Copyright : Kern Sibbald
# Any comment, advice or enhancement are welcome :-)

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
MYSQL="/usr/bin/mysql -u bacula --password=XXXXX"
TMP=/tmp
BACULA=/usr/local/bacula

PROGNAME=`basename $0`
PROGPATH=`echo $0 | sed -e 's,[\\/][^\\/][^\\/]*$,,'`
STATUS=""

. $PROGPATH/utils.sh

print_usage() {
        echo "Usage: $PROGNAME -P <pool> -M <media-type> -w <warning threshold> -c <critical threshold> [-S]"
}

print_help() {
        echo ""
        print_usage
        echo ""
        echo "This plugin checks the space available in the pool against the space required for the next scheduled backups"
        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."
    echo ""
    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."
    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."
    echo ""
    echo "The evaluation of the space required is done by adding the biggest backups of the same level than the scheduled jobs"
    echo "The available space is evaluated by the number of out of retention tapes and the average VolBytes of these Full tapes"
    echo ""
    echo "The Information Status are : \"Required, Available, Volume Errors\" and \"Will use Scratch pool\" if necessary."
    echo ""
    echo "I think this plugin should be used in passive mode, and ran by a RunAfterJob"
    exit 3
}

NB_ARGS=$#
SCRATCH=0
while getopts :P:M:w:c:hS OPTION
do
  case $OPTION in
    P) POOL="$OPTARG"
       ;;
    M) MEDIA_TYPE="$OPTARG"
       ;;
    S) SCRATCH=1
       ;;
    w) WARNING="$OPTARG"
       ;;
    c) CRITICAL="$OPTARG"
       ;;
    h) print_help
       exit 3
       ;;
    *) print_usage
       exit 3
       ;;
  esac
done
shift $(($OPTIND - 1))

if [ "$NB_ARGS" -ne 8 -a "$NB_ARGS" -ne 9 ]; then
    print_revision $PROGNAME 13/06/2006
    print_usage
        exit 3
fi

LAST_CHECK=`ps -ef | grep check_ba[Cc]ula_pools.sh | awk {'print $5'} | uniq | wc -l`
if [ "$LAST_CHECK" -gt 1 ]; then
    echo "The last check was not complete, you should increase the check_period."
    exit 3
fi

NB_VOLUMES=`$MYSQL << EOF
USE bacula
SELECT COUNT(MediaId) from Media, Pool where Media.PoolId=Pool.PoolId and Pool.Name="$POOL" AND Inchanger = "1";
EOF`

NB_VOLUMES=`echo $NB_VOLUMES | cut -f 2 -d ' '`

echo "st
1
q" | $BACULA/etc/bconsole | sed -n /Scheduled/,/Running/p | grep Backup | tr -s [:blank:] | tr '[:blank:]' '@' > ${TMP}/Scheduled.txt

CAPA_REQUIRED=0
for LINE in `cat ${TMP}/Scheduled.txt`
do
  SCHEDULED_JOB=`echo $LINE | awk -F@ '{print $6}'`
  LEVEL=`echo $LINE | awk -F@ '{print $1}' | cut -c 1`

MAX_VOLUME_JOB_FOR_LEVEL=`$MYSQL << EOF
USE bacula
SELECT MAX(JobBytes) from Job, Pool where Level="$LEVEL" AND Job.Name="$SCHEDULED_JOB" AND Job.PoolId=Pool.PoolId AND Pool.Name="$POOL";
EOF
`
MAX_VOLUME_JOB_FOR_LEVEL=`echo $MAX_VOLUME_JOB_FOR_LEVEL | cut -f 2 -d ' ' `

CAPA_REQUIRED=$[CAPA_REQUIRED+MAX_VOLUME_JOB_FOR_LEVEL]
done

rm ${TMP}/Scheduled.txt


if [ $NB_VOLUMES -gt 0 ]
then

  NB_VOLUMES_OUT_OF_RETENTION=`$MYSQL << EOF
USE bacula
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";
EOF
`
  NB_VOLUMES_OUT_OF_RETENTION=`echo $NB_VOLUMES_OUT_OF_RETENTION | cut -f 2 -d ' '`

NB_VOLUMES_ERROR=`$MYSQL << EOF
USE bacula
SELECT COUNT(MediaId) from Media, Pool where Media.PoolId=Pool.PoolId and Pool.Name="$POOL" AND VolStatus="Error" AND Inchanger = "1";
EOF
`
NB_VOLUMES_ERROR=`echo $NB_VOLUMES_ERROR | cut -f 2 -d ' '`

AVERAGE_CAPA_VOLUME=`$MYSQL << EOF
USE bacula
SELECT SUM(VolBytes)/COUNT(MediaId) FROM Media where VolStatus="Full" AND MediaType="$MEDIA_TYPE";
EOF
`
AVERAGE_CAPA_VOLUME=`echo $AVERAGE_CAPA_VOLUME | cut -f 2 -d ' ' | cut -f 1 -d '.'`

CAPA_VOLUMES_APPEND=`$MYSQL << EOF
USE bacula
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";
EOF
`
CAPA_VOLUMES_APPEND=`echo $CAPA_VOLUMES_APPEND | cut -f 2 -d ' '`

if [ $SCRATCH -eq 1 ]
then
CAPA_VOLUMES_SCRATCH=`$MYSQL << EOF
USE bacula
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";
EOF
`
CAPA_VOLUMES_SCRATCH=`echo $CAPA_VOLUMES_SCRATCH | cut -f 2 -d ' '`
else
CAPA_VOLUMES_SCRATCH=0
fi

CAPA_WARNING=`echo $[(WARNING+100)*CAPA_REQUIRED]/100 | bc | cut -f 1 -d '.'`
CAPA_CRITICAL=`echo $[(CRITICAL+100)*CAPA_REQUIRED]/100 | bc | cut -f 1 -d '.'`
CAPA_DISP=$[NB_VOLUMES_OUT_OF_RETENTION*AVERAGE_CAPA_VOLUME+CAPA_VOLUMES_APPEND]
CAPA_DISP_INCLUDING_SCRATCH=$[CAPA_DISP+CAPA_VOLUMES_SCRATCH]

MESSAGE="Required : $[CAPA_REQUIRED/1000000000] Go, available : $[CAPA_DISP/1000000000] Go, Volumes Error : $NB_VOLUMES_ERROR"

if [ "$CAPA_DISP" -gt $CAPA_WARNING ]; then
   echo $MESSAGE
   exit 0
elif [ "$CAPA_DISP" -gt $CAPA_CRITICAL ];then
   echo $MESSAGE
   exit 1
elif [ "$CAPA_DISP_INCLUDING_SCRATCH" -gt $CAPA_CRITICAL ];then
   MESSAGE="${MESSAGE}. Will use Scratch Pool !"
   echo $MESSAGE
   exit 1
else
   exit 2
fi
exit 3

else
  echo "No volume in pool ${POOL}"
  if [ "$CAPA_REQUIRED" -gt 0 ]
     then exit 2
     else exit 0
  fi
fi

Arno Lehmann wrote:
Hello,

On 7/6/2006 5:10 PM, Ludovic Strappazon wrote:
  
Hi Mark,

I've written a nagios shell script to check my pools in the way you 
describe.
I also remember that Arno Lehmann did something similar in perl (it is 
distibuted with the bacula sources)
    

Erm, no, not really.
I considered adding such a function to the baculareport scrip I created, 
but never actually found it necessary. But I really like to see what 
you've got :-)

  
Regards,
Ludovic Strappazon.

[EMAIL PROTECTED] a écrit :

    
Is there any way to have bacula predict how many volumes will be 
needed for the next night's backup?
My goal is to make sure that the autochanger is always loaded with 
enough tapes
to handle the next night's backup, without changing tapes every day.

I'm interested in having bacula notify me in advance that it guesses 
that the
following night's backup will require "N" volumes. I don't want to run
"estimate" for each client (which is a time-consuming and resource 
intensive
action), and then sum the results. It would be great if bacula made 
use of
information that's in the database to get the average of the sizes of 
the last
"X" backups of the same level that's scheduled for the next backup 
(ie., full,
incremental, differential) for each client, and then added a user-defined
fudge-factor (maybe 10%) to guess at the size of the upcoming backup 
for all
scheduled jobs.
      

I would even try to estimate the expected growth (does *anybody* have 
backup sets that become smaller over time?) from the existing backups. 
Simply assume a linear growth and add the observed error to your result. 
Or something. I would need to brush up my mathematical / statistical 
knowledge a bit :-)

  
For example, most of our non-full backups are under 100GB for all clients
combined, so our autochanger can run for a long time without manually 
removing
full tapes and putting in new ones. However, full backups can be 
anywhere from
40GB to over 2TB (depending on the client). To reduce contention, full 
backups
are set up with a staggered schedule--each client does a "full" on a 
different
night. It would be nice to get some warning from bacula that the next 
night's
backup will "probably" take 6 volumes, so that I can make sure the 
enough empty
(or over-writeable) tapes are loaded.


Any suggestions about scripting such an "early warning system"? I'm 
thinking of something like:

----------- bad pseudo-code ---------------------------
    foreach $client sqlquery("Get list of clients scheduled to backup 
tonight")
    {
        $backup_level=sqlquery("Get level of next backup for $client");
      

One problem might be to get the pool the next backup goes to.

  
        $size=average(sqlquery "size in GB of all backups for
                $client of $backup_level");
    
        $predictedsize=$total + $size;
    }

    $predictedsize=$predictedsize * $fudgefactor;
      

This would need to be calculated per pool, IMO.

  
    foreach $volsize (sqlquery("Select VolumeSize in GB
                    where VolumeStatus='Full'"))
    {
        $volsizetotal=$volsize + $volsizetotal;
        $volcount++;     }

    $average_GB_to_fill_volume=$volsizetotal/$volcount;
      

I do have some function to estimate volume capacity in baculareport.pl 
which is a little more complicated, but still gives reasonable results :-)

  
    $volumes_needed=$predictedsize / $average_GB_to_fill_volume;

    roundup($volumes_needed);

    print "There will be $volumes_needed needed for tonight's backup";
------------ EO bad pseudo-code 
-------------------------------------------

      

Apart from my obsession with with putting backups of different levels to 
different pools and storage devices, I fully agree - such a script would 
be a nice addition.

Arno

  
Thanks,

Mark
----
Mark Bergman                      [EMAIL PROTECTED]
System Administrator
Section of Biomedical Image Analysis             215-662-7310
Department of Radiology,           University of Pennsylvania

http://pgpkeys.pca.dfn.de:11371/pks/lookup?search=mark.bergman%40.uphs.upenn.edu 




The information contained in this e-mail message is intended only for 
the personal and confidential use of the recipient(s) named above. If 
the reader of this message is not the intended recipient or an agent 
responsible for delivering it to the intended recipient, you are 
hereby notified that you have received this document in error and that 
any review, dissemination, distribution, or copying of this message is 
strictly prohibited. If you have received this communication in error, 
please notify us immediately by e-mail, and delete the original message.

Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job 
easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache 
Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Bacula-users mailing list
Bacula-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bacula-users

  
      

------------------------------------------------------------------------

Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642


------------------------------------------------------------------------

_______________________________________________
Bacula-users mailing list
Bacula-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bacula-users
    

  

Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Bacula-users mailing list
Bacula-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bacula-users

Reply via email to