Write script
This commit is contained in:
parent
23e451d291
commit
d08d85f664
222
backup-local-dir
Executable file
222
backup-local-dir
Executable file
@ -0,0 +1,222 @@
|
||||
#!/bin/bash
|
||||
|
||||
|
||||
#
|
||||
log()
|
||||
{
|
||||
logger "[Backup Local Dir] $1"
|
||||
echo "[Backup Local Dir] $1"
|
||||
}
|
||||
notify()
|
||||
{
|
||||
notify-send "[Backup Local Dir] $1"
|
||||
log "$1"
|
||||
}
|
||||
complain()
|
||||
{
|
||||
logger -s "[Backup Local Dir] $1"
|
||||
notify-send "[Backup Local Dir] $1"
|
||||
}
|
||||
die()
|
||||
{
|
||||
complain "Fatal: $1"
|
||||
echo
|
||||
exit 1
|
||||
}
|
||||
quit()
|
||||
{
|
||||
local MSG="$1"
|
||||
|
||||
if [ "$MSG" = "" ] ; then
|
||||
log "Quitting ..."
|
||||
else
|
||||
log "Quitting: ${MSG}"
|
||||
fi
|
||||
echo
|
||||
|
||||
exit 0
|
||||
}
|
||||
heading()
|
||||
{
|
||||
echo
|
||||
log "******************************"
|
||||
log "******************************"
|
||||
log "********** $1"
|
||||
log "******************************"
|
||||
log "******************************"
|
||||
}
|
||||
list_snapshots()
|
||||
{
|
||||
local REPO="$1"
|
||||
|
||||
echo
|
||||
log "Listing snapshots for: ${REPO}"
|
||||
restic snapshots -r "${REPO}"
|
||||
if [ "$?" -ne 0 ] ; then
|
||||
die "Failed to list snapshots for repo!: ${REPO}"
|
||||
fi
|
||||
echo
|
||||
}
|
||||
do_backup()
|
||||
{
|
||||
local REPO="$1"
|
||||
local LOCAL_DIR="$2"
|
||||
|
||||
list_snapshots "${REPO}"
|
||||
|
||||
log "Backing up local dir \"${LOCAL_DIR}\" to: ${REPO}"
|
||||
restic backup -r "${REPO}" "${LOCAL_DIR}" \
|
||||
--exclude='.sync_*'
|
||||
if [ "$?" -ne 0 ] ; then
|
||||
die "Failed to backup!: \"${LOCAL_DIR}\" to \"${REPO}\""
|
||||
fi
|
||||
log "Success"
|
||||
|
||||
list_snapshots "${REPO}"
|
||||
}
|
||||
forget_snapshots()
|
||||
{
|
||||
local REPO="$1"
|
||||
local WITHIN="$2"
|
||||
|
||||
#
|
||||
log "Forgetting snapshots older than \"${WITHIN}\" from: ${REPO}"
|
||||
restic -r "${REPO}" forget --keep-within "${WITHIN}"
|
||||
}
|
||||
prune_repo()
|
||||
{
|
||||
local REPO="$1"
|
||||
|
||||
#
|
||||
log "Pruning repository: ${REPO}"
|
||||
restic -r "${REPO}" prune
|
||||
}
|
||||
|
||||
|
||||
#
|
||||
CLOUD_DIR=""
|
||||
RESTIC_REPOSITORY=""
|
||||
RESTIC_REPOSITORY_REMOTE=""
|
||||
RESTIC_PASSWORD=""
|
||||
RESTIC_FORGET_KEEP_WITHIN="3m"
|
||||
RESTIC_TAG=""
|
||||
|
||||
|
||||
#
|
||||
log "Begin parsing arguments ..."
|
||||
while [ "${#}" -gt 0 ]
|
||||
do
|
||||
|
||||
ARG="$1"
|
||||
shift
|
||||
|
||||
case "$ARG" in
|
||||
|
||||
|
||||
--help|-h)
|
||||
log
|
||||
log "*** Backup Local Directory - Help Menu ***"
|
||||
log "A simple utility to help backup a local directory to a restic repo"
|
||||
log
|
||||
log "--cloud ==> Specify local cloud directory (Currently: $CLOUD_DIR)"
|
||||
log "--repo ==> Specify restic repo for backup destination (Currently: $RESTIC_REPOSITORY)"
|
||||
log
|
||||
;;
|
||||
|
||||
|
||||
--cloud|--cloud-dir|-c|-d)
|
||||
CLOUD_DIR="$1"
|
||||
log "Found cloud dir argument: $CLOUD_DIR"
|
||||
shift
|
||||
;;
|
||||
|
||||
|
||||
--repo|--restic|--restic-repo|-r)
|
||||
RESTIC_REPOSITORY="$1"
|
||||
log "Found restic repo argument: $RESTIC_REPOSITORY"
|
||||
shift
|
||||
;;
|
||||
|
||||
|
||||
--password|--restic-password|--restic-repo-password|--repo-password|-p)
|
||||
RESTIC_PASSWORD="$1"
|
||||
log "Found restic repo password argument."
|
||||
shift
|
||||
;;
|
||||
|
||||
|
||||
*)
|
||||
die "Unexpected argument: $ARG"
|
||||
;;
|
||||
|
||||
esac
|
||||
|
||||
done
|
||||
log "Finished parsing arguments"
|
||||
|
||||
|
||||
# Cloud dir should be set
|
||||
if [ "$CLOUD_DIR" = "" ] ; then
|
||||
die "Cloud dir should be set"
|
||||
elif [ ! -d "$CLOUD_DIR" ] ; then
|
||||
die "Cloud dir should be a valid directory: ${CLOUD_DIR}"
|
||||
fi
|
||||
|
||||
|
||||
# Restic repo should be set
|
||||
if [ "$RESTIC_REPOSITORY" = "" ] ; then
|
||||
die "Restic repo should be set"
|
||||
fi
|
||||
|
||||
|
||||
# Remote restic repo should be set
|
||||
if [ "$RESTIC_REPOSITORY_REMOTE" = "" ] ; then
|
||||
die "Remote restic repo should be set"
|
||||
fi
|
||||
|
||||
|
||||
# Password shouldn't be blank
|
||||
if [ "$RESTIC_PASSWORD" = "" ] ; then
|
||||
die "Restic repo password should be set"
|
||||
fi
|
||||
|
||||
|
||||
# Export for restic
|
||||
export RESTIC_PASSWORD
|
||||
|
||||
|
||||
# Backup locally
|
||||
heading "Local Backup"
|
||||
do_backup "${RESTIC_REPOSITORY}" "${CLOUD_DIR}"
|
||||
|
||||
|
||||
# Backup to another cloud
|
||||
heading "Remote Backup"
|
||||
do_backup "${RESTIC_REPOSITORY_REMOTE}" "${CLOUD_DIR}"
|
||||
|
||||
|
||||
# Forget old snapshots
|
||||
heading "Forget old snapshots"
|
||||
forget_snapshots "${RESTIC_REPOSITORY}" "${RESTIC_FORGET_KEEP_WITHIN}"
|
||||
forget_snapshots "${RESTIC_REPOSITORY_REMOTE}" "${RESTIC_FORGET_KEEP_WITHIN}"
|
||||
|
||||
|
||||
# Prune
|
||||
heading "Pruning repositories"
|
||||
prune_repo "${RESTIC_REPOSITORY}"
|
||||
prune_repo "${RESTIC_REPOSITORY_REMOTE}"
|
||||
|
||||
|
||||
|
||||
#
|
||||
notify "Finished!"
|
||||
|
||||
|
||||
|
||||
exit 0
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user