backup-docker/v2b.sh

123 lines
2.8 KiB
Bash
Executable File

#!/bin/bash
#set -o xtrace
set -u
set -o pipefail
if [[ $(id -u) -ne "0" ]]; then
printf "Elevated privileges required\n"
exit 1
fi
UMASK="$(umask)"
cprompt () {
if [[ $UNATTENDED == "true" ]]; then
return;
fi
read -r -s -N 1 -p "Press 'Enter' to backup, 'Escape' to skip..."
if [[ $REPLY != $'\n' ]]; then
printf "backup skipped!\n"
return 1
else
printf "backup starting.\n"
fi
}
usage () {
printf "v2b.sh <option> [ <prefix> ]\n"
printf " <prefix> only backup volumes with this prefix (underscore not required)\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: PREFIXES REMOVED\n";;
k) 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))
FOLDER="_vols_"
if [[ $# > 0 ]]; then
VOLUMES="$(docker volume ls -q |grep "${1}_")"
else
VOLUMES="$(docker volume ls -q)"
fi
if [[ -z $VOLUMES ]]; then
printf "Cannot find volumes spec: ${1}_\n"
exit 1
fi
if [[ -d ${FOLDER} ]]; then
LASTF="$(ls -d --format=single-column ${FOLDER}* |tail -n1)"
else
LASTF="${FOLDER}"
fi
USER="$(stat -c '%u' $BASH_SOURCE)"
INDEX="$((( ${LASTF#${FOLDER}} + 0 )))"
NEWFL="${FOLDER}$(printf "%05d" $((( ${INDEX} + 1 ))))"
TEMPF="$(sudo -u \#${USER?err} mktemp -dt -p $PWD _XXXXXXXXXXXXXXX_)"
for VOL in ${VOLUMES}; do
if [[ $REMOVE == "true" ]]; then
if [[ $# > 0 ]]; then
TAR="${VOL#${1}_}.tar.bz2"
else
TAR="${VOL#*_}.tar.bz2"
fi
else
TAR="${VOL}.tar.bz2"
fi
printf "\n${VOL} --> ${TEMPF}/${TAR}\n"
cprompt || continue
docker run --rm --log-driver none \
-v "${VOL}:/volume" \
-v "${TEMPF}:/backup" \
loomchild/volume-backup backup -v "${TAR}"
if [[ -f "${TEMPF}/${TAR}" ]]; then
chmod 600 "${TEMPF}/${TAR}"
fi
done
if [[ -z "$(ls -A ${TEMPF})" ]]; then
rmdir "${TEMPF}"
else
if [[ $KEEP == "true" ]]; then
mv "${FOLDER}" "${NEWFL}"
else
rm -rf "${FOLDER}"
fi
if mv "${TEMPF}" "${FOLDER}"; then
if [[ $SEND == "true" ]]; then
if [[ $ADDR =~ ":" ]]; then
if ssh "${ADDR%:*}" "mkdir -p ${ADDR#*:}"; then
scp "${FOLDER}"/* "${ADDR}"
fi
else
if ssh "${ADDR}" "mkdir -p ${PWD}/_$(hostname -f)_"; then
scp "${FOLDER}"/* "${ADDR}:${PWD}/_$(hostname -f)_"
fi
fi
fi
fi
fi
set +o xtrace