commit 4a2eb7588dfbcf3f2110822b8b0a83e21d5ae574 Author: Andrew Hurley Date: Wed Oct 26 20:31:43 2022 +1100 First Commit 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