backup-docker/v2b.sh

136 lines
3.1 KiB
Bash
Executable File

#!/bin/bash
#set -o xtrace
set -u
set -o pipefail
UMASK="$(umask)"
final-local () {
if [[ -z "$(ls -A ${TEMPF})" ]]; then
rmdir "${TEMPF}"
else
if [[ $KEEP == "true" ]]; then
mv "${FOLDER}" "${NEWFL}"
else
rm -rf "${FOLDER}"
fi
mv "${TEMPF}" "${FOLDER}"
fi
}
final-remote () {
if [[ -z "$(ls ${TEMPF})" ]]; then
rmdir "${TEMPF}"
else
sudo scp -r "${TEMPF}" "${ADDR}:/srv/backup/${TEMPF}" || exit 1
if [[ $KEEP == "true" ]]; then
sudo ssh "${ADDR}" "cd /srv/backup; mv \"${FOLDER}\" \"${NEWFL}\""
else
sudo ssh "${ADDR}" "cd /srv/backup; rm -rf \"${FOLDER}\""
fi
sudo scp -r "${TEMPF}" "${ADDR}:/srv/backup" && rm -rf "${TEMPF}"
sudo ssh "${ADDR}" "cd /srv/backup; mv \"${TEMPF}\" \"${FOLDER}\""
fi
}
cprompt () {
if [[ $UNATTENDED == "true" ]]; then return; fi
read -r -s -N 1 -p "Continue [Enter]?"
if [[ $REPLY != $'\n' ]]; then
printf "\n"
printf " Script stopped!\n"
if [[ $SEND == "true" ]]; then
final-remote
else
final-local
fi
exit
fi
}
usage () {
printf "v2b.sh <option> [ <prefix> ]\n"
printf " <prefix> only backup volumes with this prefix\n"
printf " option: k (keep existing backups)\n"
printf " option: p (remove prefix from tar archive file name\n"
printf " option: u (unattended backup)\n"
printf " option: s <address> (send backup directly to remote address via ssh)\n"
}
SEND="false"
ADDR=""
REMOVE="false"
KEEP="false"
UNATTENDED="false"
OUTPUT=""
while getopts ':s:pku' OPT; do
case $OPT in
s) SEND="true"; ADDR="${OPTARG}"; OUTPUT="${OUTPUT} Option: SEND BACKUPS\n";;
p) REMOVE="true"; OUTPUT="${OUTPUT} Option: RESTART AFTER\n";;
r) KEEP="true"; OUTPUT="${OUTPUT} Option: KEEP EXISTING BACKUPS\n";;
u) UNATTENDED="true"; OUTPUT="${OUTPUT} Option: UNATTENDED BACKUP\n";;
\?) usage; exit;;
esac
done
shift $((OPTIND -1))
if [[ $SEND == "true" ]]; then
FOLDER="_$(hostname -f)_"
else
FOLDER="_vols_"
fi
if [[ $# > 0 ]]; then
VOLUMES="$(sudo docker volume ls -q |grep "${1}")"
else
VOLUMES="$(sudo docker volume ls -q)"
fi
if [[ -z $VOLUMES ]]; then
printf "Cannot find volumes spec: ${1}_\n"
exit 1
fi
if [[ $SEND == "true" ]]; then
if sudo ssh "${ADDR}" test -d "/srv/backup/${FOLDER}"; then
LASTF="$(sudo ssh "${ADDR}" ls -d --format=single-column ${FOLDER}* |tail -n1)"
else
LASTF="${FOLDER}"
fi
else
if [[ -d ${FOLDER} ]]; then
LASTF="$(ls -d --format=single-column ${FOLDER}* |tail -n1)"
else
LASTF="${FOLDER}"
fi
fi
INDEX="$((( ${LASTF#${FOLDER}} + 0 )))"
NEWFL="${FOLDER}$(printf "%05d" $((( ${INDEX} + 1 ))))"
TEMPF="$(mktemp -dt -p $PWD XXXXXXXXXXXXXXX)"
for VOL in ${VOLUMES}; do
if [[ $REMOVE == "true" ]]; then
TAR="${VOL#${1}_}.tar.bz2"
else
TAR="${VOL}.tar.bz2"
fi
printf "${VOL} --> ${TEMPF}/${TAR}\n"
cprompt
sudo docker run --rm --log-driver none \
-v "${VOL}:/volume" \
-v "${TEMPF}:/backup" \
loomchild/volume-backup backup -v "${TAR}"
sudo chmod 400 "${TEMPF}/${TAR}"
done
if [[ $SEND == "true" ]]; then
final-remote
else
final-local
fi
set +o xtrace