|
|
|
@ -2,11 +2,11 @@
@@ -2,11 +2,11 @@
|
|
|
|
|
# SPDX-FileCopyrightText: 2019 Max Mehl <mail [at] mehl [dot] mx> |
|
|
|
|
# SPDX-License-Identifier: GPL-3.0-or-later |
|
|
|
|
######################################################################## |
|
|
|
|
# |
|
|
|
|
# Saves specific files and directories from a remote server via SSH. |
|
|
|
|
# |
|
|
|
|
# Saves specific files and directories from a remote server via SSH. |
|
|
|
|
# Provides easy shortcuts for Uberspace.de hosts. |
|
|
|
|
# README.md provides more details. |
|
|
|
|
# |
|
|
|
|
# |
|
|
|
|
######################################################################## |
|
|
|
|
|
|
|
|
|
# Set correct UTF-8 encoding (for FreeBSD jail) |
|
|
|
@ -18,7 +18,7 @@ source "$CURDIR"/config.cfg
@@ -18,7 +18,7 @@ source "$CURDIR"/config.cfg
|
|
|
|
|
|
|
|
|
|
if [ ! -e "${HOSTS}" ]; then echo "Missing hosts file. Please set a correct value of HOSTS= in your config file. Current value: ${HOSTS}"; exit 1; fi |
|
|
|
|
|
|
|
|
|
if [ ! -z "${SSH_KEY}" ]; then |
|
|
|
|
if [ -n "${SSH_KEY}" ]; then |
|
|
|
|
SSH_KEY_ARG="-i ${SSH_KEY}" |
|
|
|
|
else |
|
|
|
|
# defaults |
|
|
|
@ -43,29 +43,41 @@ function logecho {
@@ -43,29 +43,41 @@ function logecho {
|
|
|
|
|
echo "$(pdate) $@" >> "$LOG" |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
while read line; do |
|
|
|
|
while read -r line; do |
|
|
|
|
# if line is a comment or blank, go to next line |
|
|
|
|
if $(echo "$line" | grep -qE "^\s*(#|$)"); then continue; fi |
|
|
|
|
if echo "$line" | grep -qE "^\s*(#|$)"; then continue; fi |
|
|
|
|
|
|
|
|
|
RHOST=$(echo "$line" | cut -d";" -f1 | trim) |
|
|
|
|
RUSER=$(echo "$RHOST" | cut -d"@" -f1) |
|
|
|
|
ALLRDIR=$(echo "$line" | cut -d";" -f2 | trim) |
|
|
|
|
US_VERSION=$(echo "$line" | cut -d";" -f3 | trim) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Get SSH port if needed |
|
|
|
|
if echo "$RHOST" | grep -q ":"; then |
|
|
|
|
RPORT=$(echo "$RHOST" | cut -d":" -f2) |
|
|
|
|
RHOST=$(echo "$RHOST" | cut -d":" -f1) |
|
|
|
|
RPORT_ARG="-p ${RPORT}" |
|
|
|
|
else |
|
|
|
|
# defaults |
|
|
|
|
RPORT="" |
|
|
|
|
RPORT_ARG="" |
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
logecho "${RHOST}: Starting backups" |
|
|
|
|
|
|
|
|
|
# Task ssh-checker.sh to check this host |
|
|
|
|
if ! "${CURDIR}"/ssh-checker.sh "${RHOST}"; then |
|
|
|
|
logecho "${RHOST}: ERROR when connecting via SSH. Please run ssh-checker.sh to debug." |
|
|
|
|
logecho "${RHOST}: Aborting backup after an error." |
|
|
|
|
continue |
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
NORDIR=$(echo $ALLRDIR | grep -o "|" | wc -l) |
|
|
|
|
NORDIR=$[$NORDIR + 1] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
NORDIR=$(echo "$ALLRDIR" | grep -o "|" | wc -l) |
|
|
|
|
NORDIR=$(($NORDIR + 1)) |
|
|
|
|
|
|
|
|
|
for ((i = 1; i <= $NORDIR; i++)); do |
|
|
|
|
RDIR=$(echo "$ALLRDIR" | cut -d"|" -f${i} | trim) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if [ "${RDIR}" == "%virtual" ]; then |
|
|
|
|
RDIR=/var/www/virtual/${RUSER} |
|
|
|
|
DEST="$BACKUPDIR/$RHOST/$DATE/virtual" |
|
|
|
@ -81,7 +93,7 @@ while read line; do
@@ -81,7 +93,7 @@ while read line; do
|
|
|
|
|
else |
|
|
|
|
DEST="$BACKUPDIR/$RHOST/$DATE/$(basename "${RDIR}")" |
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Set Source directory, and make exception for %mysql |
|
|
|
|
SOURCE="${RDIR}" |
|
|
|
|
if [ "${RDIR}" == "mysql" ]; then |
|
|
|
@ -91,28 +103,28 @@ while read line; do
@@ -91,28 +103,28 @@ while read line; do
|
|
|
|
|
SOURCE=/mysql_backup/current/${RUSER} |
|
|
|
|
fi |
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Create backup destination if necessary |
|
|
|
|
if [ ! -e "${DEST}" ]; then mkdir -p "${DEST}"; fi |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# RSYNC |
|
|
|
|
logecho "${RHOST}: Downloading ${SOURCE} to ${DEST}" |
|
|
|
|
rsync -a -e "ssh -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o Compression=no -T -x ${SSH_KEY_ARG}" ${RHOST}:${SOURCE}/ "${DEST}"/ |
|
|
|
|
|
|
|
|
|
rsync -a -e "ssh -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o Compression=no -T -x ${RPORT_ARG} ${SSH_KEY_ARG}" "${RHOST}:${SOURCE}"/ "${DEST}"/ |
|
|
|
|
|
|
|
|
|
# Pack backup directory, and delete uncompressed one |
|
|
|
|
logecho "${RHOST}: Archiving $(basename ${DEST})" |
|
|
|
|
tar cf ${DEST}.tar -C $(echo ${DEST} | sed "s|$(basename ${DEST})$||") $(basename ${DEST}) # TODO: avoid absolute paths |
|
|
|
|
rm -rf ${DEST} |
|
|
|
|
|
|
|
|
|
logecho "${RHOST}: Archiving $(basename "${DEST}")" |
|
|
|
|
tar cf "${DEST}".tar -C $(echo ${DEST} | sed "s|$(basename ${DEST})$||") $(basename ${DEST}) # TODO: avoid absolute paths |
|
|
|
|
rm -rf "${DEST}" |
|
|
|
|
|
|
|
|
|
# Encrypt archive with GPG (it compresses at the same time) |
|
|
|
|
logecho "${RHOST}: Encrypting and compressing $(basename ${DEST})" |
|
|
|
|
gpg --output ${DEST}.tar.gpg --encrypt --recipient ${GPG} ${DEST}.tar |
|
|
|
|
rm ${DEST}.tar |
|
|
|
|
|
|
|
|
|
logecho "${RHOST}: Encrypting and compressing $(basename "${DEST}")" |
|
|
|
|
gpg --output "${DEST}".tar.gpg --encrypt --recipient ${GPG} "${DEST}".tar |
|
|
|
|
rm "${DEST}".tar |
|
|
|
|
|
|
|
|
|
# Delete all old directories except the $MAXBAK most recent |
|
|
|
|
if [ $(ls -tp "${BACKUPDIR}"/"${RHOST}"/ | grep '/$' | wc -l | tr -d ' ') -gt $MAXBAK ]; then |
|
|
|
|
logecho "${RHOST}: Removing older backups of $(basename ${DEST})" |
|
|
|
|
ls -tpd "${BACKUPDIR}"/"${RHOST}"/* | grep '/$' | tail -n +$[$MAXBAK + 1] | xargs -0 | xargs rm -r -- |
|
|
|
|
logecho "${RHOST}: Removing older backups of $(basename "${DEST}")" |
|
|
|
|
ls -tpd "${BACKUPDIR}"/"${RHOST}"/* | grep '/$' | tail -n +$(($MAXBAK + 1)) | xargs -0 | xargs rm -r -- |
|
|
|
|
fi |
|
|
|
|
done |
|
|
|
|
|
|
|
|
|