#!/bin/sh helpme() { echo "usage:" echo " $0 full|partial|restore [--name NAME] SRC DEST [options]" echo " COMMANDS:" echo " full: Make a full backup of SRC to DEST/HOST/TIMESTAMP_full/" echo " partial: Make partial backup of SRC to DEST/HOST/TIMESTAMP_part/" echo " relative to the latest full backup in that directory" echo " restore: Restore the backup at DEST/ to SRC/" echo " NAME:" echo " Force main subdir inside DEST instead of hostname." echo " Useful if backing up, eg, external media." echo " SRC:" echo " Relative or absolute path for the source to backup or restore from." echo " When backing up, can be a remote path in the form of user@host:path;" echo " The HOST component of the kyanite backup path is gleaned from this if so." echo " When restoring, this is the full path to the timestamped backup folder." echo " DEST:" echo " Relative or absolute path for the destination to backup or restore to." echo " When backing up, this is path to the root of your kyanite backups." echo " When restoring, this is the path to your restore destination." echo " OPTIONS:" echo " anything provided after DEST is passed as additional options to rsync," echo " e.g. '--exclude .cache'" } if [ -z "$3" ]; then helpme; exit; fi if [ "$1" = "full" ]; then mode=full; elif [ "$1" = "partial" ]; then mode=part; elif [ "$1" = "restore" ]; then mode=restore; else mode=none; fi shift; if [ "$1" = "--name" ]; then shift forcedName=$1; shift; fi srcDir=$1; shift; destDir=$1 remoteHost=$(echo $srcDir | awk -F : '{ print $1 }' | awk -F @ '{ print $2 }'); if [ ! -z "${remoteHost}" ]; then host=${remoteHost}; else host=$(hostname); fi if [ ! -z "${forcedName}" ]; then host=${forcedName}; fi shift; case $mode in full) fullDest=${destDir}/${host}/$(date +%Y-%m-%d_%H:%M)_full; mkdir -p ${fullDest}; rsync -av $@ ${srcDir} ${fullDest}; ;; part) fullDest=${destDir}/${host}/$(date +%Y-%m-%d_%H:%M)_part; lastFullBackup=$(ls -1d ${destDir}/${host}/*_full | tail -n 1); mkdir -p ${fullDest}; rsync -av --link-dest=${lastFullBackup} $@ ${srcDir} ${fullDest}; ;; restore) rsync -av $@ ${srcDir} ${destDir} ;; *) helpme ;; esac