kyanite/kyanite.sh

84 lines
2.3 KiB
Bash
Executable file

#!/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