X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=backup.sh;h=307a14f23aae338f15b76d4c795aa0823ccdd180;hb=040ea36adf3804e541e9973d88c2168da11e8eae;hp=366978dd0bfebe73a9021eeecb607af8631fc7a1;hpb=6c6378103700ad30a3fcb6cb6279c4d533642b83;p=backup.sh diff --git a/backup.sh b/backup.sh index 366978d..307a14f 100755 --- a/backup.sh +++ b/backup.sh @@ -68,52 +68,69 @@ echo `date`": Backup run starting" >&2 umask 027 -#selve backupen -# krever at noen variabler er satt -# krever at vi er i rett katalog backup() { echo -n `date` >&2 printf " $computer: $computer:$filesystem $backuplevel backup\n" >&2 - if [ "$backuplevel" = "daglig" ] || [ "$backuplevel" = "incremental" ] + SNARFILE="${storagedir}/${computer}/${sfilesystem}/.incremental.snar" + incrementalsnar="/root/.backup/${sfilesystem}.snar" + if [ "$backuplevel" = "daglig" ] then - lastd=`cat ../.date` - lastcmd="--newer='$lastd'" + # If incremental backup, we need to copy the incremental status to $computer. + # If it does not exist, whine a bit and then run date-based instead. + if [ -s "$SNARFILE" ]; then + if ! scp $SNARFILE root@$computer:$incrementalsnar; then + echo `date`" $computer: Could not copy .incremental.snar to $computer" + die + fi + lastcmd="--listed-incremental=$incrementalsnar --no-check-device" + else + echo `date`" $computer: Missing incremental.snar for $filesystem, doing date-based backup instead until next full backup" >&2 + incrementalsnar="" + lastd=`cat ../.date` + lastcmd="--newer='$lastd'" + fi else - lastcmd="" + lastcmd="--listed-incremental=$incrementalsnar" fi # expand the exclude-path for use with tar exf=`ssh root@$computer "ls ~/.backup/exclude"` # We try to run tar on the remote computer - # z gzip it # c create archive # C change to directory first # . where to start taring (see C) # $lastcmd only files newer than this # --one-file-system don't traverse file systems + # --use-compress-program compress it using gzip or pigz # --exclude-from file to get exclusion pattern from # Pipe the stuff over ssh to ourselves, run pee to cat the contents to a # file and build a file list, respectivly. TARFILE=$DATE.tmp - TARCMD="ssh root@$computer \"nice -n 19 ionice -c3 tar --one-file-system -zcf - -C $filesystem . $lastcmd \ + TARCMD="ssh root@$computer \"nice -n 19 ionice -c3 tar --one-file-system --use-compress-program $compressor -cf - -C $filesystem . $lastcmd \ --exclude-from=$exf\" | pee \"cat > $TARFILE\" \"tar tzvf -\"" echo `date`" $computer: Running $TARCMD" >&2 eval $TARCMD > $DATE.idx - if [ -s $TARFILE ]; then - # File is >0 in size, we assume it worked. + if [ $? -eq 0 ] && [ -s $TARFILE ]; then + # File is >0 in size and neither cat or tar tzvf failed; we assume it worked. + + if ! scp root@$computer:$incrementalsnar $SNARFILE.tmp; then + echo `date`" $computer: Could not copy .incremental.snar from $computer" + die + fi # Move tar file in place mv $TARFILE $DATE.tgz + mv $SNARFILE.tmp $SNARFILE # Update timestamp echo $DATEs > ../.date && touch -t $DATE ../.date - # Make a sorted filelist as well + # Make a sorted file list as well sort -k6 < $DATE.idx > $DATE.sdx # Fix permissions @@ -127,8 +144,6 @@ backup() # Something wrong happened. rm $TARFILE echo `date`" $computer: $TARFILE empty. $backuplevel backup of $computer:$filesystem failed and deleted" - - # We don't want to return 0 die fi @@ -152,13 +167,17 @@ backup() # Try to SSH to the computer without entering a password. if ! `ssh -n -o NumberOfPasswordPrompts=0 root@$computer /bin/true`; then echo `date`" $computer: Could not use passwordless SSH." - - # We don't want to return 0 die fi - - filesystems="" + # Check if pigz is available + if ssh -n root@$computer "pigz -V 2>/dev/null"; then + compressor=pigz + else + echo `date`" $computer: pigz missing; falling back to gzip." + compressor=gzip + fi + # Check dump bit in fstab filesystems=`ssh -n root@$computer "cat /etc/fstab" \ | grep -v nfs \ @@ -168,33 +187,33 @@ backup() # Clean up our dir at this client if ! ssh root@$computer "rm -r ~/.backup ; mkdir -m 700 ~/.backup"; then - echo `date`" $computer: Could not create backup staging area at $computer:~/.backup - skipping backup of $computer" + echo `date`" $computer: Could not create backup staging area at $computer:~/.backup" die fi # Try to copy $exclude to $computer if ! scp $exclude root@$computer:~/.backup/exclude > /dev/null; then - echo `date`" $computer: Could not copy exclude.txt to $computer - skipping backup of $computer" + echo `date`" $computer: Could not copy exclude.txt to $computer" die fi # Try to copy preeexec and postexec if they exist if [ -f $confdir/preexec.$computer ]; then if ! scp $confdir/preexec.$computer root@$computer:~/.backup/preexec >&2; then - echo `date`" $computer: Could not copy preexec.$computer to $computer:~/.backup/preexec - skipping backup of $computer" + echo `date`" $computer: Could not copy preexec.$computer to $computer:~/.backup/preexec" die fi fi if [ -f $confdir/postexec.$computer ]; then if ! scp $confdir/postexec.$computer root@$computer:~/.backup/postexec >&2; then - echo `date`" $computer: Could not copy postexec.$computer to $computer:~/.backup/postexec - skipping backup of $computer" + echo `date`" $computer: Could not copy postexec.$computer to $computer:~/.backup/postexec" die fi fi - # Try to run preexec if it exist + # Try to run preexec if it exists if ! ssh root@$computer "[ ! -f ~/.backup/preexec ] || /bin/bash -x ~/.backup/preexec" >&2; then - echo `date`" $computer: Could not run $computer:~/.backup/preexec - skipping backup of $computer" + echo `date`" $computer: Could not run $computer:~/.backup/preexec" die fi @@ -207,8 +226,6 @@ backup() # Prepare storage area mkdir -m 755 -p $storagedir/$computer/$sfilesystem/full 2>/dev/null mkdir -m 755 -p $storagedir/$computer/$sfilesystem/daglig 2>/dev/null - echo $filesystem > ${storagedir}/${computer}/.${sfilesystem}.name - chmod 644 ${storagedir}/${computer}/.${sfilesystem}.name # Default backuplevel backuplevel=daglig @@ -220,8 +237,7 @@ backup() echo $DATEs > $storagedir/$computer/$sfilesystem/.date fi - # Check if we want a full backup - Debug statement that causes noise in cron mail: - # printf " $computer $filesystem: $confdir/fastfullbackupdag.$computer.$sfilesystem\n" + # Check if we want a full backup if [ -f $confdir/fastfullbackupdag.$computer.$sfilesystem ]; then fullbackup_min_for_this_machine=$dagermellomfulleforfast if [ "$DAY_OF_MONTH" = "`cat $confdir/fastfullbackupdag.$computer.$sfilesystem`" ]; then