136 lines
3.1 KiB
Bash
Executable File
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
|