#!/bin/sh # This is a backup script that takes snapshots of your device # In a Time Machine like fashion. You can add this to root's # crontab for regular backups # Config readonly SSH_HOST=192.168.1.34 readonly SSH_USER=pi readonly SSH_KEY="/home/yigit/.ssh/id_skeleton" readonly BACKUP_DESTINATION="~/snapshots/backups" readonly RSYNC_PROFILE="$SSH_USER@$SSH_HOST:$BACKUP_DESTINATION" [ $(id -u) != "0" ] && printf "This program must be run as root!\n" && exit alias ssh_cmd="ssh -i \"$SSH_KEY\" $SSH_USER@$SSH_HOST" [ -f "$XDG_CACHE_HOME/dbus_settings" ] && "$XDG_CACHE_HOME/dbus_settings" # Load the dbus settings for current session displays="$(ps -u $(id -u) -o pid= \ | xargs -I PID -r cat /proc/PID/environ 2> /dev/null \ | tr '\0' '\n' \ | grep ^DISPLAY=: \ | sort -u \ | xargs \ | cut -d ":" -f2)" notify() { IFS="\n" for x in $displays; do export DISPLAY=$x notify-send --app-name="$1" "$2" done ; } notify " Periodic backup" "Backup is starting" DEVICE=tatooine OPT="-aPh" SNAP="$RSYNC_PROFILE/$DEVICE/" date=$(date "+%d.%m.%Y_%I:%M") older=$(date --date="4 days ago" "+%d.%m.%Y_%I:%M") # You should enter absolute paths DIRS="/home/yigit /etc /var/lib /var/spool /usr/src/linux" # Check whether backup server is available on network timeout 3 ssh -i "$SSH_KEY" $SSH_USER@$SSH_HOST id < /dev/null > /dev/null 2> /dev/null || echo "SSH Failed." || exit ssh -i "$SSH_KEY" $SSH_USER@$SSH_HOST rm -rf "$BACKUP_DESTINATION/$DEVICE/$older" > /dev/null 2> /dev/null # Run rsync to create snapshot while IFS= read -r DIR do LINK="--link-dest=/home/$SSH_USER/snapshots/tatooine/last$DIR/" ssh -i "$SSH_KEY" $SSH_USER@$SSH_HOST mkdir -p "$BACKUP_DESTINATION/$DEVICE/$date$DIR" < /dev/null rsync --exclude '.cache' "$@" -e "ssh -i $SSH_KEY" $OPT "$LINK" "$DIR/" "${SNAP}$date$DIR/" done << EOF $DIRS EOF # Remove symlink to previous snapshot ssh_cmd rm -f "$BACKUP_DESTINATION/$DEVICE/last" < /dev/null # Create new symlink to latest snapshot for the next backup to hardlink ssh -i "$SSH_KEY" $SSH_USER@$SSH_HOST ln -s "$BACKUP_DESTINATION/$DEVICE/$date" "$BACKUP_DESTINATION/$DEVICE/last" < /dev/null # pidof slock > /dev/null && { # Shutdown if screen inhibition is enabled # shutdown -h now # }