Duplicate Veritas Netbackup Images


This page shows a script I use to duplicate images from Netbackup to be stored offsite. I did this as I refused to pay Veritas $10K for their "Vault" software addon. This setup uses three media pools (OFFSITE[1-3]) which are rotated weekly such that 2 copies are offsite at any given time, with Tuesday being the pickup/drop-off day. My backup server is "ipswich". This script runs each Sunday AM. Also, here is a companion script that will check to make sure the right tapes are loaded for the next run of the duplicate script.

Please let me know if you have any suggestions or improvements for this script.

#!/bin/ksh
# Duplicate NetBackup images

# Top directory for files
TOPDIR=/usr/local/lib/netbackup
# Who to notify
MAILTO=kylet
# File used to keep sequence rotation
OFFSITEFILE=${TOPDIR}/.offsite
# For errors
ERRLOG=${TOPDIR}/nbdup.err
# For the work file
WRKFILE=${TOPDIR}/nbdup.wrk
# For the log file
LOG=${TOPDIR}/nbdup.log
# The date a week ago for determining what sessions to duplicate 
WEEKAGO=`/tools/bin/date --date=-1week +%D`
# When to expire this duplicate set due to 2 copy limit
EXPIREDATE=`/tools/bin/date --date=+12days +%D`
# When this set will come back from offsite rotation
TAPERETURN=`/tools/bin/date --date=Tuesday+2weeks +%D`

if [ ! -s $OFFSITEFILE ]
then	
	OFFSITENUM=1
else
	OFFSITENUM=`cat $OFFSITEFILE`
	case $OFFSITENUM in
	1)
		OFFSITENUM=2
		NEXTRUN=3
		TAPES="80-89"
	;;
	2)
		OFFSITENUM=3
		NEXTRUN=1
		TAPES="90-99"
	;;
	3)
		OFFSITENUM=1
		NEXTRUN=2
		TAPES="70-79"
	;;
	*)
		OFFSITENUM=1
		TAPES="70-79"
	;;
	esac
fi

test -f $LOG.2 && mv $LOG.2 $LOG.3
test -f $LOG.1 && mv $LOG.1 $LOG.2
test -f $LOG.0 && mv $LOG.0 $LOG.1
mv $LOG $LOG.0

DESTPOOL=OFFSITE${OFFSITENUM}
echo $OFFSITENUM > $OFFSITEFILE

# List clients to act on and then duplicate all their full backup images for the past week
for CLIENT in `/usr/openv/netbackup/bin/admincmd/bpimagelist -L -d $WEEKAGO -st FULL | grep "^Client: " | awk ' { print $2 } ' | sort -u`
do
	/usr/openv/netbackup/bin/admincmd/bpduplicate -dstunit ipswich_sto -client $CLIENT -st FULL -v -L $LOG -dp $DESTPOOL -shost ipswich -s $WEEKAGO 
	if [ $? -ne 0 ]
	then
		echo "Error with backup of $CLIENT" >> $ERRLOG
	fi
done

# Duplicate Oracle backups for the last week
/usr/openv/netbackup/bin/admincmd/bpduplicate -dstunit ipswich_sto -ct Oracle -v -L $LOG -dp $DESTPOOL -shost ipswich -s $WEEKAGO 
if [ $? -ne 0 ]
then
	echo "Error with backup of Oracle" >> $ERRLOG
fi

# Expire media in offsite destination media pool
for MEDIAID in `/usr/openv/netbackup/bin/admincmd/bpmedialist -p $DESTPOOL | grep "^00" | awk ' { print $1 }`
do
	for BACKUPID in `/usr/openv/netbackup/bin/admincmd/bpimmedia -mediaid $MEDIAID -l | grep "^IMAGE " | awk ' { print $4 }`
        do
		/usr/openv/netbackup/bin/admincmd/bpexpdate -backupid $BACKUPID -d $EXPIREDATE 00:00:00 -copy 2 -force
	done
done

echo "\nPrepare offsite set $OFFSITENUM (Tapes $TAPES)" > $WRKFILE
echo "Iron Mountain label number: 6549CL${OFFSITENUM}" >> $WRKFILE
echo "Return date for ${DESTPOOL}: ${TAPERETURN}" >> $WRKFILE
echo "Next offsite pool: OFFSITE${NEXTRUN}" >> $WRKFILE
echo "State of tapes in pool: ${DESTPOOL}\n" >> $WRKFILE
/usr/local/scripts/avmedia $DESTPOOL >> $WRKFILE
echo "\n" >> $WRKFILE

if [ -s $ERRLOG ]
then
        cat $ERRLOG >> $WRKFILE
	cat $LOG >> $WRKFILE
	cat $WRKFILE | mailx -s "NetBackup Offsite Status (with errors)" $MAILTO
else
	cat $LOG >> $WRKFILE
	cat $WRKFILE | mailx -s "NetBackup Offsite Status" $MAILTO
fi

mv $WRKFILE $LOG
rm -f $ERRLOG