This repository has been archived on 2025-03-21. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
uberspace-backup/uberspace-backup.sh

112 lines
3.8 KiB
Bash
Raw Normal View History

2019-06-29 16:48:23 +02:00
#!/usr/bin/env bash
# SPDX-FileCopyrightText: 2019 Max Mehl <mail [at] mehl [dot] mx>
2019-06-29 16:46:14 +02:00
# SPDX-License-Identifier: GPL-3.0-or-later
2017-01-24 20:59:15 +01:00
########################################################################
#
# Saves specific files and directories from a remote server via SSH.
# Provides easy shortcuts for Uberspace.de hosts.
# README.md provides more details.
#
########################################################################
2017-01-17 17:25:00 +01:00
CURDIR=$(dirname "$(readlink -f "$0")")
if [ ! -e "$CURDIR"/config.cfg ]; then echo "Missing config.cfg file. Edit and rename config.cfg.sample"; exit 1; fi
source "$CURDIR"/config.cfg
2019-06-29 16:46:14 +02:00
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
2019-06-29 16:50:14 +02:00
SSH_KEY_ARG="-i ${SSH_KEY}"
2019-06-29 16:46:14 +02:00
else
# defaults
SSH_KEY_ARG=""
SSH_KEY=~/.ssh/id_rsa
fi
2017-01-17 17:25:00 +01:00
# Get current date
DATE=$(date +"%Y-%m-%d_%H-%M")
2017-01-18 00:38:36 +01:00
LOG="$CURDIR"/backup.log
2017-01-17 17:25:00 +01:00
function trim {
2019-06-29 17:26:18 +02:00
sed -r -e 's/^[[:space:]]*//g' -e 's/[[:space:]]*$//g'
2017-01-17 17:25:00 +01:00
}
function pdate {
DATE=$(date +%y-%m-%d_%H:%M:%S)
echo "[$DATE]"
}
function logecho {
# Echo string and copy it to log while attaching the current date
echo "$(pdate) $@"
echo "$(pdate) $@" >> "$LOG"
}
2017-01-17 17:25:00 +01:00
while read line; do
# if line is a comment, go to next line
2017-01-17 17:25:00 +01:00
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)
2017-01-18 01:00:30 +01:00
logecho "${RHOST}: Starting backups"
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
2017-01-17 17:25:00 +01:00
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"
elif [ "${RDIR}" == "%mysql" ]; then
RDIR=mysql
DEST="$BACKUPDIR/$RHOST/$DATE/$(basename "${RDIR}")"
elif [ "${RDIR}" == "%mails" ]; then
RDIR=/home/${RUSER}/users
DEST="$BACKUPDIR/$RHOST/$DATE/mails"
2017-01-24 20:19:41 +01:00
elif [ "${RDIR}" == "%home" ]; then
RDIR=/home/${RUSER}
DEST="$BACKUPDIR/$RHOST/$DATE/home"
2017-01-17 17:25:00 +01:00
else
DEST="$BACKUPDIR/$RHOST/$DATE/$(basename "${RDIR}")"
fi
# Set Source directory, and make exception for %mysql
SOURCE="${RDIR}"
if [ "${RDIR}" == "mysql" ]; then SOURCE=/mysqlbackup/latest/${RUSER}; fi
2017-01-17 18:13:18 +01:00
2017-01-17 17:25:00 +01:00
# Create backup destination if necessary
if [ ! -e "${DEST}" ]; then mkdir -p "${DEST}"; fi
# RSYNC
2017-01-18 00:57:35 +01:00
logecho "${RHOST}: Downloading ${SOURCE} to ${DEST}"
2019-06-29 16:46:14 +02:00
rsync -a -e "ssh -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o Compression=no -T -x ${SSH_KEY_ARG}" ${RHOST}:${SOURCE}/ "${DEST}"/
2017-01-17 18:02:32 +01:00
2017-01-17 17:25:00 +01:00
# Pack backup directory, and delete uncompressed one
2017-01-18 00:57:35 +01:00
logecho "${RHOST}: Archiving $(basename ${DEST})"
2017-01-18 00:38:36 +01:00
tar cf ${DEST}.tar -C $(echo ${DEST} | sed "s|$(basename ${DEST})$||") $(basename ${DEST}) # TODO: avoid absolute paths
2017-01-17 17:25:00 +01:00
rm -rf ${DEST}
# Encrypt archive with GPG (it compresses at the same time)
2017-01-18 00:57:35 +01:00
logecho "${RHOST}: Encrypting and compressing $(basename ${DEST})"
2017-01-18 00:38:36 +01:00
gpg --output ${DEST}.tar.gpg --encrypt --recipient ${GPG} ${DEST}.tar
2017-01-17 17:25:00 +01:00
rm ${DEST}.tar
# Delete all old directories except the $MAXBAK most recent
2019-07-15 09:13:12 +02:00
if [ $(ls -tp "${BACKUPDIR}"/"${RHOST}"/ | grep '/$' | wc -l | tr -d ' ') -gt $MAXBAK ]; then
2017-01-18 00:57:35 +01:00
logecho "${RHOST}: Removing older backups of $(basename ${DEST})"
2019-07-15 09:13:12 +02:00
ls -tpd "${BACKUPDIR}"/"${RHOST}"/* | grep '/$' | tail -n +$[$MAXBAK + 1] | xargs -0 | xargs rm -r --
2017-01-17 18:13:18 +01:00
fi
2017-01-17 17:25:00 +01:00
done
done < "$HOSTS"
2017-01-18 01:00:30 +01:00
logecho "Finished all operations."