84 lines
2.3 KiB
Bash
Executable file
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
|