ShowNextTapeNeeded
From The Open Source Backup Wiki (Amanda, MySQL Backup)
I have been having major issues with having to find time to log onto the server and find out what tapes to put in. We disabled the email from amcheck due to so many emails coming from several servers every day.
So, I wrote a quick script that (I'm surprised is still easy to configure) will go through the tapelist for all backup "programs" you have, output the tapes that will be needed on that day, and then (optionally) eject those tapes so you can put in the next tapes, and then (optionally) output the info to the screen, a printer, or an email.
I figured I'd share it. Feel free to use, edit, and do whatever with! hope it helps somebody! (I fire this at noon each day, so that backups that ran the previous night are ejected from our 2 tape drives and I can quickly swap out what tapes it tells me it will need that night.) Oh, and the "program" names are the names of the configurations of our backups. (Most will use Daily and Weekly, i don't like capitals....)
This should be able to be extended for larger tape-changers to get a list of tapes that are in the slots and compare to the tapes that are needed, ejecting only the slots that are not needed.
#!/bin/bash
#
# Generates a printed or emailed output of what tapes are next
# and what's expected tomorrow.
# ALSO will offline the tapes in the drives... if you want it to.
#
# What programs are there (daily, weekly, monthly, etc..... names) (aka... amanda config names)
# space-delimited
PROGRAMS=(daily weekly);
# Output last-run status check (0 for off, 1 for on)
STATUSCHECKS=(1 1)
# How many tapes does each program need (per run)?
TAPESNEEDED=(2 2);
# tapelist filenames
FILE[0]="/etc/amanda/daily/tapelist";
FILE[1]="/etc/amanda/weekly/tapelist";
# days of the week (0=Sunday) they run (array-like space-delimited string)
# I run daily on Mon-Thursday at like 11PM, and weekly on Saturday mornings at 2AM
DAYS[0]="1 2 3 4";
DAYS[1]="6";
#Names of each day of the week
DAYLIST=("Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday");
#Number of days in the future to list (Starting on today, going for this many days)
DAYSTOSHOW=3;
# Other Filenames
OUTFILE="/etc/amanda/nexttape.txt";
# Output to Screen (0|1)
OUTPUT=0
# Print Options (0|1)
PRINT=1
# Email Options (0|1)
USEMAIL=0
EMAIL=amandabackup@masonco.local
SUBJECT="Amanda - Expected Tapes"
#Auto-Eject (performs an ammt offline)
AUTOEJECT=1
#Drives that will be ejected (iff AUTOEJECT)
DRIVES[0]="/dev/nst0"
DRIVES[1]="/dev/nst1"
#_____________________________________________________
#
# DO NOT EDIT BEYOND THIS LINE
#_____________________________________________________
DAYOFWEEK=$(date "+%w");
DAYSOFTHEWEEK[0]=$DAYOFWEEK;
for((i = 1; i < $DAYSTOSHOW; i++ )); do
let "DAYSOFTHEWEEK[i]=DAYSOFTHEWEEK[i-1] + 1";
if [ ${DAYSOFTHEWEEK[$i]} -ge 7 ]; then
DAYSOFTHEWEEK[$i]=0;
fi
done
printf "\t%s - %s\n\t%s\n" "Amanda Tape Backup" "Next Expected Tape" "$(date)">> $OUTFILE
printf -- "--------------------------------------------------------------------\n" >> $OUTFILE
printf -- " Program Day Tapes \n" >> $OUTFILE
printf -- "-------------------- ---------- ------------------------------------\n" >> $OUTFILE
for ((i = 0; i < ${#PROGRAMS[*]}; i++ )); do
k=0;
printf "%20s" "${PROGRAMS[$i]}" >> $OUTFILE
for((s = 0; s < $DAYSTOSHOW; s++ )); do
printf " %10s" ${DAYLIST[${DAYSOFTHEWEEK[$s]}]} >> $OUTFILE
for((t = 0; t < ${TAPESNEEDED[i]}; t++ )); do
echo ${DAYS[$i]} | grep -E " *${DAYSOFTHEWEEK[$s]} *" > /dev/null 2>&1
if [ $? -eq 0 ]; then
let "k = k + 1"
j=${#TAPES[*]};
TAPES[$j]=$(tail -$k ${FILE[$i]} | head -1 | awk '{print $2 }')
if [ $s -eq 0 ]; then
NEXTTAPES[${#NEXTTAPES[*]}]=${TAPES[$j]};
fi
printf " %10s" ${TAPES[$j]} >> $OUTFILE
else
printf " %10s" "----------" >> $OUTFILE
fi
done
printf "\n%20s" " " >> $OUTFILE
done
printf "\n" >> $OUTFILE
done
printf -- "--------------------------------------------------------------------\n" >> $OUTFILE
printf "Tapes Needed For Next Run:\t%s\n\n" "${NEXTTAPES[*]}" >> $OUTFILE
printf "Status Check:\n" >> $OUTFILE
printf -- "--------------------------------------------------------------------\n" >> $OUTFILE
for ((i = 0; i < ${#PROGRAMS[*]}; i++ )); do
if [ ${STATUSCHECKS[$i]} -eq 1 ]; then
printf "%20s\n" "${PROGRAMS[$i]}" >> $OUTFILE
amstatus ${PROGRAMS[$i]} --summary >> $OUTFILE 2> /dev/null
printf -- "--------------------------------------------------------------------\n" >> $OUTFILE
fi
done
if [ $AUTOEJECT -eq 1 ]; then
for ((i = 0; i < ${#DRIVES[*]}; i++ )); do
ammt -t ${DRIVES[$i]} offline >> $OUTFILE 2>&1
done
fi
if [ $USEMAIL -eq 1 ]; then
cat $OUTFILE | Mail -s "Amanda - Expected Tapes" $EMAIL;
fi
if [ $PRINT -eq 1 ]; then
lp $OUTFILE;
fi
if [ $OUTPUT -eq 1 ]; then
cat $OUTFILE;
fi
rm -f $OUTFILE;
