From 4a2eb7588dfbcf3f2110822b8b0a83e21d5ae574 Mon Sep 17 00:00:00 2001 From: Andrew Hurley Date: Wed, 26 Oct 2022 20:31:43 +1100 Subject: [PATCH] First Commit --- README.md | 0 b2v.sh | 39 +++++++++++++++ backup.cron | 1 + backup.sh | 3 ++ m2v.sh | 49 +++++++++++++++++++ rem.sh | 103 +++++++++++++++++++++++++++++++++++++++ v2b.sh | 135 ++++++++++++++++++++++++++++++++++++++++++++++++++++ vvv.sh | 115 ++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 445 insertions(+) create mode 100644 README.md create mode 100755 b2v.sh create mode 100644 backup.cron create mode 100755 backup.sh create mode 100755 m2v.sh create mode 100755 rem.sh create mode 100755 v2b.sh create mode 100755 vvv.sh diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/b2v.sh b/b2v.sh new file mode 100755 index 0000000..a8ea10b --- /dev/null +++ b/b2v.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +#set -o xtrace + +PREFIX="" +if [[ -v 1 ]]; then + PREFIX="${1}_" +fi + +cprompt () { + read -r -s -N 1 -p "Continue [Enter]?" + if [[ $REPLY == $'\n' ]]; then + printf "\n" + else + printf "\n" + printf " Script stopped!\n" + exit + fi +} + +#pushd vtb || exit 1 +for TAR in *.tar.bz2; do + if [[ $TAR =~ .tar.bz2 ]]; then + VOL=${TAR%.tar.bz2} + if [[ -n $PREFIX ]]; then + VOL="${PREFIX}${VOL#*_}" + fi + if sudo docker volume ls -q |grep -qw "${VOL}"; then + printf "Operation: ${TAR} -> ${VOL}\n" + cprompt + sudo cat "${TAR}" \ + |sudo docker run -i -v "${VOL}:/volume" --rm \ + loomchild/volume-backup restore -v -f - || exit 3 + fi + fi +done +#popd || exit 1 + +set +o xtrace diff --git a/backup.cron b/backup.cron new file mode 100644 index 0000000..15b2fea --- /dev/null +++ b/backup.cron @@ -0,0 +1 @@ +14 4 * * * root /srv/backup/backup.sh 2>&1 |tee /root/cron-backup.log diff --git a/backup.sh b/backup.sh new file mode 100755 index 0000000..846eea2 --- /dev/null +++ b/backup.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +pushd /srv/backup && ./vvv.sh docker local mailu && nice ./v2b.sh -u backup_docker && popd diff --git a/m2v.sh b/m2v.sh new file mode 100755 index 0000000..7e87e4a --- /dev/null +++ b/m2v.sh @@ -0,0 +1,49 @@ +#!/bin/bash + +set -o xtrace + +if [[ $# < 2 ]]; then + echo "First argument is compose prefix. File with list of 'volumes binddir' needed as second argument" + exit 1 +fi + +if [[ ! -f "${2}" ]]; then + echo "File with list of 'volumes binddir' missing (${2})." + exit 1 +fi + +if [[ ! -d "../@${1}" ]]; then + echo "Compose directory not valid (${1})" + exit 1 +fi + +sudo docker rm -f helper +if [[ -f log.txt ]]; then + mv log.txt "log-$(date +%N).txt" +else + touch log.txt +fi + +VOLUMES="$(sudo docker volume ls -q |grep ${1}_)a" +touch log.txt +sleep 2 +while read -r F1 F2; do + VOLUME="${1}_${F1}" + if grep -wq "${VOLUME}" - <<< $VOLUMES; then + COMMAND="rm -rvf /volume/{*,.*} && cp -a ../bindmnt/. /volume" + BINDMNT=$(realpath "../cndata/${F2}") + sudo docker run --name helper \ + -v "${VOLUME}:/volume" \ + -v "${BINDMNT}:/bindmnt" \ + busybox \ + sh -c "${COMMAND}" + sudo docker logs helper >> log.txt + sudo docker rm -f helper + sleep 2 + else + echo "$VOLUME is not available for restoration" + exit 1 + fi +done < "${2}" + +set +o xtrace diff --git a/rem.sh b/rem.sh new file mode 100755 index 0000000..a1ad4d1 --- /dev/null +++ b/rem.sh @@ -0,0 +1,103 @@ +#!/bin/bash + + +set -o xtrace +set -u +set -o pipefail + +usage () { + printf " Usage: rem.sh \n" + printf " option: f (local folder contents to send to remote)\n" + printf " option: b (send backup scripts located in ../backup to remote)\n" + printf " option: d (send server docker spec located in ../docker to remote)\n" + printf " option: s (send server certificates located in ../srvtls to remote)\n" + printf " option: c (send server config located in ../config to remote)\n" + printf " option: a (options d,s,c combined - complete server, excluding scripts)\n" +} + + +FOLDER="_vols_" +SCRIPTS="false" +CERTS="false" +DOCKER="false" +CONFIG="false" +OUTPUT="" +while getopts ':f:bdsca' OPT; do + case $OPT in + b) + SCRIPTS="true" + OUTPUT="${OUTPUT} Option: SEND BACKUP SCRIPTS\n";; + f) + FOLDER="${OPTARGS}" + OUTPUT="${OUTPUT} Option: SPECIFY SOURCE FOLDER\n";; + s) + CERTS="true" + OUTPUT="${OUTPUT} Option: SEND CERTIFICATES\n";; + d) + DOCKER="true" + OUTPUT="${OUTPUT} Option: SEND DOCKER SPEC\n";; + c) + CONFIG="true" + OUTPUT="${OUTPUT} Option: SEND CONFIG SPEC\n";; + a) + CONFIG="true"; DOCKER="true"; CERTS="true"; + OUTPUT="${OUTPUT} Option: SEND ALL (BACKUP,CERTS,DOCKER,CONFIG\n";; + \?) + usage; + exit;; + esac +done +shift $((OPTIND -1)) + +REMOTEURL="" +if [[ -v 1 ]]; then + REMOTEURL="${1}" +else + echo "Missing remote address: user@url" + exit 1 +fi + +REMOTEDIR="_vols_" +sudo ssh "${REMOTEURL}" << EOT || exit 1 +echo "Local user: $USER" +echo "Remote user: \$USER" +pushd /srv/backup || exit 1 +if [[ -d _vols_ ]]; then + if [[ -n "$(ls -A _vols_)" ]]; then + TF="$(stat -c "%W" "${REMOTEDIR}")" + mv "${REMOTEDIR}" "${REMOTEDIR}\${TF}" || exit 1 + fi +fi +mkdir -p "${REMOTEDIR}" || exit 1 +popd || exit 1 +EOT + +pushd "${FOLDER}" || exit 1 +sudo scp *.tar.bz2 "${REMOTEURL}:/srv/backup/_vols_" || exit 1 +popd || exit 1 + +if [[ $SCRIPTS == "true" ]]; then + pushd "../backup" || exit 1 + sudo scp *.sh "${REMOTEURL}:/srv/backup" || exit 1 + popd || exit 1 +fi + +if [[ $CERTS == "true" ]]; then + pushd "../srvtls" || exit 1 + sudo scp * "${REMOTEURL}:/srv/srvtls" || exit 1 + popd || exit 1 +fi + +if [[ $DOCKER == "true" ]]; then + pushd "../docker" || exit 1 + sudo scp * .env "${REMOTEURL}:/srv/docker" || exit 1 + popd || exit 1 +fi + +if [[ $CONFIG == "true" ]]; then + pushd "../config" || exit 1 + sudo scp * .env "${REMOTEURL}:/srv/config" || exit 1 + popd || exit 1 +fi + +set +o xtrace diff --git a/v2b.sh b/v2b.sh new file mode 100755 index 0000000..3c9fbec --- /dev/null +++ b/v2b.sh @@ -0,0 +1,135 @@ +#!/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