Overly Sharpened Blog

Daily Backups

(but note, straightforward doesn't imply simple :p)

Source

#!/bin/bash
renice 20 $$
ionice -c3 -p$$

base=$(basename "$0")

# export DISPLAY=:0

echo $(date) Starting backups >> /var/log/backup

BACKUP_TO_A="/media/drive_a/"
BACKUP_TO_B="/media/drive_b/"

mountpoint "$BACKUP_TO_A" && BACKUP_TO="$BACKUP_TO_A"
mountpoint "$BACKUP_TO_B" && BACKUP_TO="$BACKUP_TO_B"
mountpoint "$BACKUP_TO"  || exit

YESTERDAY="$(ls -1r ${BACKUP_TO}| head -n 1)"
TODAY="$(date +%F)"
#btrfs subvolume snapshot

echo $(date) Will snapshot ${YESTERDAY} to ${TODAY} >> /var/log/backup

mountpoint "${BACKUP_TO}/${TODAY}" || {
	btrfs subvolume snapshot "${BACKUP_TO}/${YESTERDAY}" "${BACKUP_TO}/${TODAY}" || exit 1
}

touch "${BACKUP_TO}/${TODAY}" || true
chmod a+rx "${BACKUP_TO}/${TODAY}" || true

mkdir /var/backups/share/backup || true
umount -l /var/backups/share/backup || true
mount --bind $BACKUP_TO /var/backups/share/backup || true

BACKUP_TO="${BACKUP_TO}/${TODAY}"

echo $(date) Backing up to $BACKUP_TO >> /var/log/backup
echo $(date) Start: $(df -h $BACKUP_TO | tail -n 1)

eval $(ssh-agent)
ssh-add

STANDARD_PARMS="--inplace --delete --ignore-errors --exclude .local/share/Trash/ --exclude .gvfs/ --exclude /media/"

PARMS="-vaxR $STANDARD_PARMS"
MOUNTS="-vaR $STANDARD_PARMS" 

do_backup ()
{
  TARGET_USER="$1"
  TARGET_HOST="$2"
  TARGET_PATH="$3"
  
  echo $(date) Trying:   $TARGET_HOST:$TARGET_PATH >> /var/log/backup
  
  STORE_PATH="$BACKUP_TO/$TARGET_HOST"
  ping -c 1 $TARGET_HOST && {
    echo $(date) Starting: $TARGET_HOST:$TARGET_PATH >> /var/log/backup
  	
    mkdir -p $STORE_PATH
    rsync --rsync-path='rsync --blocking-io' $PARMS $TARGET_USER@$TARGET_HOST:$TARGET_PATH $STORE_PATH
    echo $(date) Complete: $TARGET_HOST@$TARGET_PATH >> /var/log/backup
  }
}

do_local_backup ()
{
  TARGET_PATH="$1"

  STORE_PATH="$BACKUP_TO/local"

  echo $(date) Trying:   local:$TARGET_PATH >> /var/log/backup

  # mountpoint $TARGET_PATH && {
  find $TARGET_PATH -maxdepth 0 -not -empty -type d | grep / && {
    echo $(date) Starting: local:$TARGET_PATH >> /var/log/backup

    mkdir -p $STORE_PATH
    rsync $PARMS $TARGET_PATH $STORE_PATH
    echo $(date) Complete: local:$TARGET_PATH >> /var/log/backup
  }
}

do_backup root applicati.local / office/applicati &
PARMS="$PARMS --exclude foo/ --exclude Music/" do_backup root cwillu-laptop.local / office/cwillu-laptop &


btrfs subvolume snapshot / /backup-snap && {
	do_local_backup /backup-snap/./
	btrfs subvolume delete /backup-snap
} &

do_local_backup /media/shares &

wait

ssh-agent -k

echo $(date) End:   $(df -h $BACKUP_TO | tail -n 1)
echo $(date) Backups Complete >> /var/log/backup