#!/bin/sh # # Wed Apr 30 11:02:23 CEST 2008, anleo # ### Configuration { # Mail recipient RECIPIENT=andrea@cyberz.org # How often a mail will be sent (in seconds) when tape change is needed MAILNOTIFY=14400 # Log file LOGFILE=/tmp/mtx.log # Polling time when waiting for tape operations TAPEDELAY=5 # Bacula console program CONSOLE=/opt/csw/sbin/bconsole # MT command MT=/usr/bin/mt # GNU Grep GREP=/usr/sfw/bin/ggrep # Changer status file STATUS=/opt/csw/etc/bacula/mail-changer._TAPE_.status # Space separated volumes list VOLUMES=/opt/csw/etc/bacula/mail-changer._TAPE_.volumes # Bsmtp BSMTP=/opt/csw/sbin/bsmtp # Email address FROM="Bacula " ### } End of configuration # Variables from command line TAPEDRIVE="$4" COMMAND="$2" SLOT="$3" CVOLUME="$4" DRIVEID=`basename $TAPEDRIVE` STATUS=`echo $STATUS | sed s@_TAPE_@$DRIVEID@`; VOLUMES=`echo $VOLUMES | sed s@_TAPE_@$DRIVEID@`; if [ ! -f $STATUS ]; then echo 0 > $STATUS fi if [ ! -r $VOLUMES ]; then echo unable to read volume list, aborting exit 2 fi VOLUMES=`cat $VOLUMES`; NSLOT=`echo $VOLUMES | wc -w | awk '{ print $1 }'` log() { echo `date`: $* >> $LOGFILE } volume() { if [ $1 -eq 0 -o $1 -gt $NSLOT ]; then echo '' else echo $VOLUMES | awk '{ print $'$1' }'; fi } readvolume() { log reading tape volume LABELTMPFILE=/tmp/`basename $0`.label.$$.tmp $MT -f $TAPEDRIVE rewind >/dev/null 2>&1 dd if=$TAPEDRIVE of=$LABELTMPFILE bs=256k count=1 2>/dev/null VOL="`dd if=$LABELTMPFILE bs=1 skip=93 count=14 2>/dev/null`" rm -f $LABELTMPFILE log volume \"$VOL\" is loaded $MT -f $TAPEDRIVE rewind >/dev/null 2>&1 echo $VOL } notify() { $BSMTP -h localhost -f "$FROM" -s "$1" $RECIPIENT } log command line '(pid '$$'):' $0 $* log variables dump: tape $TAPEDRIVE, command $COMMAND, slot $SLOT, volume "$CVOLUME" case "$COMMAND" in unload) log tape unload request if $MT -f $TAPEDRIVE status >/dev/null 2>&1; then if [ ! -f /tmp/noeject ]; then $MT -f $TAPEDRIVE offline fi echo 0 > $STATUS fi ;; load) if [ $SLOT -eq "0`cat $STATUS`" ]; then log slot already loaded exit 0 fi log tape load request for slot $SLOT '('"`volume $SLOT`"')' STIME=`perl -e 'print time;'` # Number of mails sent so far NMAIL=0 while :; do NOW=`perl -e 'print time;'` ELAPSED=`echo $NOW-$STIME-$NMAIL*$MAILNOTIFY | bc` log waiting for volume "`volume $SLOT`"... $MT -f $TAPEDRIVE status 2>&1 | grep -i offline >/dev/null if [ $? = 1 ]; then log tape has been loaded MVOLUME="`readvolume`"; if [ "$MVOLUME" = "`volume $SLOT`" -o "`volume $SLOT`" = '' ]; then log got expected volume "`volume $SLOT`", returning echo "Volume `volume $SLOT` (slot $SLOT) has been loaded" | notify "Bacula tape load confirmation"; break; else log got unexpected volume "$MVOLUME", expecting "`volume $SLOT`" echo "Please load volume `volume $SLOT` (slot $SLOT). Current tape $MVOLUME has been offlined" | notify "Bacula tape change request (`volume $SLOT` required)"; if [ ! -f /tmp/noeject ]; then $MT -f $TAPEDRIVE offline >/dev/null 2>&1 fi NMAIL=`echo $NMAIL+1 | bc` fi else # tape is still offline (not tape loaded) if [ "$ELAPSED" -ge 0 ]; then log feel like sending email, elapsed is $ELAPSED echo "Please load volume `volume $SLOT` (slot $SLOT)" | notify "Bacula tape change request (`volume $SLOT` required)"; NMAIL=`echo $NMAIL+1 | bc` fi fi sleep $TAPEDELAY done echo $SLOT > $STATUS ;; loaded) log is slot $SLOT loaded\? if [ "0`cat $STATUS`" -gt 0 ]; then log loaded slot is `cat $STATUS` echo `cat $STATUS`; else log nothing loaded echo 0; fi ;; list) bash -c "echo {1..$NSLOT}" ;; volumes) for I in $VOLUMES; do echo $I done | awk '{ print NR":"$0 }' ;; slots) echo $VOLUMES | wc -w | awk '{ print $1 }' ;; *) log unknown command $COMMAND exit 1 esac exit 0