X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=backup.sh;h=307a14f23aae338f15b76d4c795aa0823ccdd180;hb=040ea36adf3804e541e9973d88c2168da11e8eae;hp=a6ebadee9fb63c7ffda8c00b1d83946ded76949f;hpb=2d0f32547efdc040cd047668e9c3fb18b3adf046;p=backup.sh diff --git a/backup.sh b/backup.sh index a6ebade..307a14f 100755 --- a/backup.sh +++ b/backup.sh @@ -68,21 +68,32 @@ 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 @@ -107,13 +118,19 @@ backup() 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,8 +167,6 @@ 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 @@ -165,8 +178,6 @@ backup() compressor=gzip fi - filesystems="" - # Check dump bit in fstab filesystems=`ssh -n root@$computer "cat /etc/fstab" \ | grep -v nfs \ @@ -176,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 @@ -215,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 @@ -228,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