#!/bin/sh
#script for doing sliced full and incremental backups to cdr
#stef at hardco.de, 2003
#full backup: "cdbackup.sh full"
#incremental backup: "cdbackup.sh </path/referencearchivebasename>"
#Reference archive name is the filename of the first slice without .number.dar
#Dar will also search/ask for the last reference archive slice.
#A plain catalogue file can also be used as an incremental reference.
#backups everything starting from / (see DAR_PARAMS) to iso/rr cdrs
#Archive slices are stored temporarily in ./ (see TDIR) and get deleted
#if written successfully to cdr.
#The first cdr will also contain the dar_static executable.
#If anything goes wrong while trying to write to cdr, you can try again
#or keep the current archive slice as a file in ./ (see TDIR).
#For backing up to files only, simply accept the cdr write error and
#answer with 'keep file' (or even better: use dar directly).
#Slice size is for 700MB cdr blanks, see (and maybe change) DAR_PARAMS below.
#For (slow!) compression, add a -y or -z<num> parameter to DAR_PARAMS.
#The archive slice file names are:
#- for full backups: YYYY-MM-DD.<slice number>.dar
#- for incrementals: YYYY-MM-DD_YYYY-MM-DD.<slice number>.dar
# The second date is the name of the reference archive, so you can end
# up with names like YYYY-MM-DD_YYYY-MM-DD_YYYY-MM-DD_YYYY-MM-DD.1.dar
# for a four level stacked incremental backup.
#Files which don't get backed up: (see DAR_PARAMS below)
#- the slice files of the current archive
#- the slice files of the reference archive
#- files called "darswap" (for manually adding more swap space for incrementals)
#- directory contents of /mnt, /cdrom, /proc, /dev/pts
#hints:
#- You need at least 700MB of free disk space in ./ (or in TDIR, if changed).
#- For incrementals, you need about 1KB of memory per tested file.
# Create a large file "darswap" and add this as additional swap space.
#- If you are doing more than one backup per day, the filenames may interfere.
#- Carefully read the dar man page as well as the excellent TUTORIAL and NOTES.
#uncompressed, for 700MB cdr blanks:
DAR_PARAMS="-s 699M -S 691M -R / -P dev/pts -P proc -P mnt -P cdrom -D"
#temporary or target directory:
TDIR="."
#I'm using a USB CDR drive, so i don't know which 'scsi'-bus it is on.
#Cdrecord -scanbus is grepped for the following string:
DRIVENAME="PLEXTOR"
#Also because of USB i have to limit drive speed:
DRIVESPEED=4
#used external programs:
DAR_EXEC="/root/app/dar-1.3.0/dar" #tested: dar-1.3.0
DAR_STATIC="/root/app/dar-1.3.0/dar_static" #copied to the first cdr
MKISOFS="/root/app/cdrtools-2.0/bin/mkisofs" #tested: cdrtools-2.0
CDRECORD="/root/app/cdrtools-2.0/bin/cdrecord" #tested: cdrtools-2.0
GREP="/usr/bin/grep" #tested: gnu grep 2.2
BASENAME="/usr/bin/basename"
DATECMD="/bin/date"
MKDIR="/bin/mkdir"
MV="/bin/mv"
CP="/bin/cp"
RM="/bin/rm"
#initial call of this script (just executes dar with the proper parameters):
DATE=`$DATECMD -I`
START=`$DATECMD`
if [ "$1" != "" ] && [ "$2" == "" ] ; then
if [ "$1" == "full" ] ; then
echo "starting full backup"
$DAR_EXEC -c "$TDIR/$DATE" \
-X "$DATE.*.dar" -X "darswap" \
-N $DAR_PARAMS -E "$0 %p %b %n"
else
echo "starting incremental backup based on $1"
LDATE=`$BASENAME $1`
$DAR_EXEC -c "$TDIR/${DATE}_$LDATE" -A $1 \
-X "${DATE}_$LDATE.*.dar" -X "$LDATE.*.dar" -X "darswap" \
-N $DAR_PARAMS -E "$0 %p %b %n"
fi
echo "backup done"
echo "start: $START"
echo "end: `$DATECMD`"
#called by dar's -E parameter after each slice:
elif [ -r "$1/$2.$3.dar" ] ; then
echo -n "creating cdr $3 volume dir containing $2.$3.dar"
$MKDIR "$1/$2.$3.cdr"
$MV "$1/$2.$3.dar" "$1/$2.$3.cdr"
if [ "$3" == "1" ] ; then
echo -n " and dar_static"
$CP $DAR_STATIC "$1/$2.$3.cdr"
fi
echo
SCANBUS=`$CDRECORD -scanbus 2>/dev/null | $GREP $DRIVENAME`
DEV=${SCANBUS:1:5}
CDBLOCKS=`$MKISOFS -R -print-size -quiet $1/$2.$3.cdr`
echo "writing cdr $3 (${CDBLOCKS}s)..."
KEEPFILE="n"
until $MKISOFS -R "$1/$2.$3.cdr" | \
$CDRECORD -eject -s dev=$DEV speed=$DRIVESPEED tsize=${CDBLOCKS}s -
do
read -p "write error, try [A]gain or [k]eep $2.$3.dar? " ERR
if [ "$ERR" == "k" ] ; then
KEEPFILE="y"
break
fi
done
if [ "$KEEPFILE" == "y" ] ; then
echo "cdr not written, keeping $2.$3.dar as file"
$MV "$1/$2.$3.cdr/$2.$3.dar" "$1/$2.$3.dar"
fi
echo "removing volume dir"
$RM -rf "$1/$2.$3.cdr"
echo "backup continues"
else
echo "usage: $0 <full|/path/referencearchivebasename>"
fi
exit 0
syntax highlighted by Code2HTML, v. 0.9.1