test/bin/backuptool
2025-02-22 21:52:40 +01:00

474 lines
25 KiB
Bash
Executable File

#!/bin/bash
#
# Federated Backup / Restore Tool to B2 Backblaze
. /federated/lib/functions.sh
B2="$(command b2)"
[ -z "$B2" ] && B2=/federated/bin/b2-linux
usage() {
cat << EOF
Backup / Restore for Backblaze
Usage: $0 [options] service
Arguments:
service Service to backup, system, nfs, or all for all services
service - nextcloud,listmonk,espocrm,etc
system - /federated/{bin,certs,lib,logs} dirs
nfs - /mnt/mountpoint dirs
all - system dirs + every app installed
Options
-l List files in a backup
-b Perform backup of a service
-d Delete backups of a service
-r passkey host Restore a backup of a service and host from Backblaze.
If passkey isn't specified we will use the passkey from
the .gpg backblaze file. If host isn't specified then it
will use this host.
EOF
exit 2;
}
createbucket() {
if [ ! -f "/federated/bin/.b2init" ]; then
B2_APPLICATION_KEY_ID="$B2_APPLICATION_KEY_ID" B2_APPLICATION_KEY="$B2_APPLICATION_KEY" $B2 bucket create $UUID allPrivate
echo "$UUID" > /federated/bin/.b2init
fi
}
listbackup_system() {
echo "* Listing backup system files for /federated/{bin,certs,lib,logs}.."
echo "* Listing backup system files for /federated/bin.."
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp list-current-files b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/bin/
[ $? -ne 0 ] && failcheck "* Couldn't list backup files"
echo "* Listing backup system files for /federated/certs.."
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp list-current-files b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/certs/
[ $? -ne 0 ] && failcheck "* Couldn't list backup files"
echo "* Listing backup system files for /federated/lib.."
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp list-current-files b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/lib/
[ $? -ne 0 ] && failcheck "* Couldn't list backup files"
echo "* Listing backup system files for /federated/logs.."
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp list-current-files b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/logs/
[ $? -ne 0 ] && failcheck "* Couldn't list backup files"
}
listbackup_allservices() {
echo "* Listing backup files for all services.."
for i in "${SERVICES[@]}"; do
[ ! -d "/federated/apps/$i" ] && echo "$i not installed, skipping." && continue
echo "* Listing backup files for /federated/apps/$i.."
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp list-current-files b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/apps/$i/
[ $? -ne 0 ] && failcheck "* Couldn't list backup files"
done
}
listbackup_service() {
echo "* Listing backup files for /federated/apps/$SERVICE.."
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp list-current-files b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/apps/$SERVICE/
[ $? -ne 0 ] && failcheck "* Couldn't list backup files"
}
backup_service() {
echo "* Backing up /federated/apps/$SERVICE.."
# Dump only users and roles for postgresql service
if [ "$SERVICE" = "postgresql" ]; then
# When backing up postgresql we need to check if there are any databases that exist in
# postgresql from the SERVICES array, that don't have a /federated/apps/appname directory,
# and back them up.
for db in "${SERVICES[@]}"; do
if [[ ! -d "/federated/apps/$db" ]]; then
if docker exec postgresql psql -U $db -c '\q' 2>/dev/null; then
echo "** Backing up database $db to /federated/apps/postgresql.."
docker exec postgresql /bin/bash -c "pg_dump $db -c -U postgres | gzip -9 > /docker-entrypoint-initdb.d/dump_$db.sql.gz"
[ $? -ne 0 ] && failcheck "* Couldn't pg_dump database files"
fi
fi
done
docker exec postgresql /bin/bash -c "pg_dumpall --globals-only -c -U postgres | gzip -9 > /docker-entrypoint-initdb.d/dump_$SERVICE.sql.gz"
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp /federated/apps/$SERVICE b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/apps/$SERVICE/
[ $? -ne 0 ] && failcheck "* Couldn't backup files"
rm /federated/apps/postgresql/data/docker-entrypoint-initdb.d/dump_*
# Dump mysql databases
elif [ "$SERVICE" = "pdnsmysql" ]; then
# When backing up pdnsmysql we need to check if there are any databases that exist in
# mysql from the SERVICES array, that don't have a /federated/apps/appname directory,
# and back them up.
for db in "${SERVICES[@]}"; do
if [[ ! -d "/federated/apps/$db" ]]; then
if docker exec pdnsmysql mariadb -uroot -p$MYSQL_PASSWORD $db 2>/dev/null; then
echo "** Backing up database $db to /federated/apps/pdnsmysql.."
docker exec pdnsmysql mariadb-dump -uroot -p${MYSQL_PASSWORD} $db | gzip -9 > /federated/apps/pdnsmysql/dump_$db.sql.gz
[ $? -ne 0 ] && failcheck "* Couldn't backup files"
fi
fi
done
# Backup mysql user table
docker exec pdnsmysql mariadb-dump -uroot -p${MYSQL_PASSWORD} mysql user | gzip -9 > /federated/apps/pdnsmysql/dump_$SERVICE.sql.gz
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp /federated/apps/$SERVICE b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/apps/$SERVICE/
[ $? -ne 0 ] && failcheck "* Couldn't backup files"
rm /federated/apps/pdnsmysql/dump_*
elif [ "$SERVICE" = "pdns" ]; then
docker exec pdnsmysql mariadb-dump -uroot -p${MYSQL_PASSWORD} pdns | gzip -9 > /federated/apps/pdns/dump_$SERVICE.sql.gz
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp /federated/apps/$SERVICE b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/apps/$SERVICE/
[ $? -ne 0 ] && failcheck "* Couldn't backup files"
rm /federated/apps/pdns/dump_$SERVICE.sql.gz
elif [ "$SERVICE" = "pdnsadmin" ]; then
docker exec pdnsmysql mariadb-dump -uroot -p${MYSQL_PASSWORD} pdns | gzip -9 > /federated/apps/pdnsadmin/dump_$SERVICE.sql.gz
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp /federated/apps/$SERVICE b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/apps/$SERVICE/
[ $? -ne 0 ] && failcheck "* Couldn't backup files"
rm /federated/apps/pdnsadmin/dump_$SERVICE.sql.gz
elif [ "$SERVICE" = "castopod" ]; then
docker exec pdnsmysql mariadb-dump -uroot -p${MYSQL_PASSWORD} castopod | gzip -9 > /federated/apps/castopod/dump_$SERVICE.sql.gz
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp /federated/apps/$SERVICE b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/apps/$SERVICE/
[ $? -ne 0 ] && failcheck "* Couldn't backup files"
rm /federated/apps/castopod/dump_$SERVICE.sql.gz
elif [ "$SERVICE" = "wordpress" -o "$SERVICE" = "wordpressshop" ]; then
docker exec pdnsmysql mariadb-dump -uroot -p${MYSQL_PASSWORD} ${SERVICE} | gzip -9 > /federated/apps/${SERVICE}/dump_$SERVICE.sql.gz
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp /federated/apps/$SERVICE b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/apps/$SERVICE/
[ $? -ne 0 ] && failcheck "* Couldn't backup files"
rm /federated/apps/wordpress/dump_$SERVICE.sql.gz
elif [ "$SERVICE" = "bookstack" ]; then
docker exec pdnsmysql mariadb-dump -uroot -p${MYSQL_PASSWORD} bookstack | gzip -9 > /federated/apps/bookstack/dump_$SERVICE.sql.gz
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp /federated/apps/$SERVICE b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/apps/$SERVICE/
[ $? -ne 0 ] && failcheck "* Couldn't backup files"
rm /federated/apps/bookstack/dump_$SERVICE.sql.gz
elif [ "$SERVICE" = "espocrm" ]; then
docker exec pdnsmysql mariadb-dump -uroot -p${MYSQL_PASSWORD} espocrm | gzip -9 > /federated/apps/espocrm/dump_$SERVICE.sql.gz
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp /federated/apps/$SERVICE b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/apps/$SERVICE/
[ $? -ne 0 ] && failcheck "* Couldn't backup files"
rm /federated/apps/espocrm/dump_$SERVICE.sql.gz
elif [ "$SERVICE" = "roundcube" ]; then
docker exec pdnsmysql mariadb-dump -uroot -p${MYSQL_PASSWORD} roundcube | gzip -9 > /federated/apps/roundcube/dump_$SERVICE.sql.gz
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp /federated/apps/$SERVICE b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/apps/$SERVICE/
[ $? -ne 0 ] && failcheck "* Couldn't backup files"
rm /federated/apps/espocrm/dump_$SERVICE.sql.gz
else
# For all other services, If the postgresql database exists for that service then dump it
docker exec postgresql psql -U $SERVICE -c '\q' &>/dev/null
if [ $? -eq 0 ]; then
docker exec postgresql /bin/bash -c "pg_dump $SERVICE -c -U postgres | gzip -9 > /docker-entrypoint-initdb.d/dump_$SERVICE.sql.gz"
[ $? -ne 0 ] && failcheck "* Couldn't pg_dump files"
mv /federated/apps/postgresql/data/docker-entrypoint-initdb.d/dump_$SERVICE.sql.gz /federated/apps/$SERVICE/
fi
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp /federated/apps/$SERVICE b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/apps/$SERVICE/
[ $? -ne 0 ] && failcheck "* Couldn't backup files"
[ -f "/federated/apps/$SERVICE/dump_$SERVICE.sql.gz" ] && rm /federated/apps/$SERVICE/dump_$SERVICE.sql.gz
fi
}
backup_system() {
echo "* Backing up system file /etc/federated.."
cp /etc/federated /federated/bin/.etc.federated
echo "* Backing up system files in /federated/{bin,certs,lib,logs}.."
echo "* Backing up system files in /federated/bin.."
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp /federated/bin b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/bin/
[ $? -ne 0 ] && failcheck "* Couldn't backup files"
echo "* Backing up system files in /federated/certs.."
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp /federated/certs b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/certs/
[ $? -ne 0 ] && failcheck "* Couldn't backup files"
echo "* Backing up system files in /federated/lib.."
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp /federated/lib b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/lib/
[ $? -ne 0 ] && failcheck "* Couldn't backup files"
echo "* Backing up system files in /federated/logs.."
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp /federated/logs b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/logs/
[ $? -ne 0 ] && failcheck "* Couldn't backup files"
}
backup_allservices() {
echo "* Backing up all services.."
for i in "${SERVICES[@]}"; do
# If app isn't installed then skip
[ ! -d "/federated/apps/$i" ] && echo "$i not installed, skipping." && continue
# Backup each service
echo "** Backing up /federated/apps/$i.."
if [ "$i" = "postgresql" ]; then
# When backing up postgresql we need to check if there are any databases that exist in
# postgresql from the SERVICES array, that don't have a /federated/apps/appname directory,
# and back them up.
for db in "${SERVICES[@]}"; do
if [[ ! -d "/federated/apps/$db" ]]; then
if docker exec postgresql psql -U $db -c '\q' 2>/dev/null; then
echo "*** Backing up database $db to /federated/apps/postgresql.."
docker exec postgresql /bin/bash -c "pg_dump $db -c -U postgres | gzip -9 > /docker-entrypoint-initdb.d/dump_$db.sql.gz"
[ $? -ne 0 ] && failcheck "* Couldn't pg_dump database files"
fi
fi
done
# Dump postgresql global objects only, no databases, then send everything to Backblaze
docker exec postgresql /bin/bash -c "pg_dumpall --globals-only -c -U postgres | gzip -9 > /docker-entrypoint-initdb.d/dump_$i.sql.gz"
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp --full-if-older-than 1M /federated/apps/$i b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/apps/$i/
[ $? -ne 0 ] && failcheck "* Couldn't backup files"
rm /federated/apps/postgresql/data/docker-entrypoint-initdb.d/dump_*
elif [ "$i" = "pdnsmysql" ]; then
# When backing up pdnsmysql we need to check if there are any databases that exist in
# mysql from the SERVICES array, that don't have a /federated/apps/appname directory,
# and back them up.
for db in "${SERVICES[@]}"; do
if [[ ! -d "/federated/apps/$db" ]]; then
if docker exec pdnsmysql mariadb -uroot -p$MYSQL_PASSWORD $db 2>/dev/null; then
echo "*** Backing up database $db to /federated/apps/pdnsmysql.."
docker exec pdnsmysql mariadb-dump -uroot -p${MYSQL_PASSWORD} $db | gzip -9 > /federated/apps/pdnsmysql/dump_$db.sql.gz
[ $? -ne 0 ] && failcheck "* Couldn't backup files"
fi
fi
done
# Backup pdnsmysql mysql user table and send to backblaze
docker exec pdnsmysql mariadb-dump -uroot -p${MYSQL_PASSWORD} mysql user | gzip -9 > /federated/apps/pdnsmysql/dump_$i.sql.gz
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp --full-if-older-than 1M /federated/apps/$i b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/apps/$i/
[ $? -ne 0 ] && failcheck "* Couldn't backup files"
rm /federated/apps/pdnsmysql/dump_*
elif [ "$i" = "pdns" ]; then
docker exec pdnsmysql mariadb-dump -uroot -p${MYSQL_PASSWORD} pdns | gzip -9 > /federated/apps/pdns/dump_$i.sql.gz
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp --full-if-older-than 1M /federated/apps/$i b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/apps/$i/
[ $? -ne 0 ] && failcheck "* Couldn't backup files"
rm /federated/apps/pdns/dump_$i.sql.gz
elif [ "$i" = "pdnsadmin" ]; then
docker exec pdnsmysql mariadb-dump -uroot -p${MYSQL_PASSWORD} pdns | gzip -9 > /federated/apps/pdnsadmin/dump_$i.sql.gz
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp --full-if-older-than 1M /federated/apps/$i b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/apps/$i/
[ $? -ne 0 ] && failcheck "* Couldn't backup files"
rm /federated/apps/pdnsadmin/dump_$i.sql.gz
elif [ "$i" = "castopod" ]; then
docker exec pdnsmysql mariadb-dump -uroot -p${MYSQL_PASSWORD} castopod | gzip -9 > /federated/apps/castopod/dump_$i.sql.gz
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp --full-if-older-than 1M /federated/apps/$i b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/apps/$i/
[ $? -ne 0 ] && failcheck "* Couldn't backup files"
rm /federated/apps/castopod/dump_$i.sql.gz
elif [ "$i" = "wordpress" ]; then
docker exec pdnsmysql mariadb-dump -uroot -p${MYSQL_PASSWORD} wordpress | gzip -9 > /federated/apps/wordpress/dump_$i.sql.gz
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp --full-if-older-than 1M /federated/apps/$i b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/apps/$i/
[ $? -ne 0 ] && failcheck "* Couldn't backup files"
rm /federated/apps/wordpress/dump_$i.sql.gz
elif [ "$i" = "bookstack" ]; then
docker exec pdnsmysql mariadb-dump -uroot -p${MYSQL_PASSWORD} bookstack | gzip -9 > /federated/apps/bookstack/dump_$i.sql.gz
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp --full-if-older-than 1M /federated/apps/$i b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/apps/$i/
[ $? -ne 0 ] && failcheck "* Couldn't backup files"
rm /federated/apps/bookstack/dump_$i.sql.gz
elif [ "$i" = "espocrm" ]; then
docker exec pdnsmysql mariadb-dump -uroot -p${MYSQL_PASSWORD} espocrm | gzip -9 > /federated/apps/espocrm/dump_$i.sql.gz
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp --full-if-older-than 1M /federated/apps/$i b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/apps/$i/
[ $? -ne 0 ] && failcheck "* Couldn't backup files"
rm /federated/apps/espocrm/dump_$i.sql.gz
elif [ "$i" = "roundcube" ]; then
docker exec pdnsmysql mariadb-dump -uroot -p${MYSQL_PASSWORD} roundcube | gzip -9 > /federated/apps/roundcube/dump_$i.sql.gz
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp --full-if-older-than 1M /federated/apps/$i b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/apps/$i/
[ $? -ne 0 ] && failcheck "* Couldn't backup files"
rm /federated/apps/roundcube/dump_$i.sql.gz
else
docker exec postgresql psql -U $i -c '\q' &>/dev/null
if [ $? -eq 0 ]; then
docker exec postgresql /bin/bash -c "pg_dump $i -c -U postgres | gzip -9 > /docker-entrypoint-initdb.d/dump_$i.sql.gz"
[ $? -ne 0 ] && failcheck "* Couldn't pg_dump files"
mv /federated/apps/postgresql/data/docker-entrypoint-initdb.d/dump_$i.sql.gz /federated/apps/$i/
fi
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp --full-if-older-than 1M /federated/apps/$i b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/apps/$i/
[ $? -ne 0 ] && failcheck "* Couldn't backup files"
[ -f "/federated/apps/$i/dump_$i.sql.gz" ] && rm /federated/apps/$i/dump_$i.sql.gz
fi
done
}
backup_nfsmounts() {
# Backup NFS mounts if they exist
NFSMOUNT=$(lsblk | grep mnt | awk '{ print $7 }')
if [ "$NFSMOUNT" = "" ]; then
echo "* No NFS mounts to backup.";
else
echo "* NFS mount found: $NFSMOUNT"
echo "* Backing up NFS.."
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp $NFSMOUNT b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/$NFSMOUNT/
[ $? -ne 0 ] && failcheck "* Couldn't backup NFS mount"
fi
}
listbackup_nfsmounts() {
# List NFS mounts if they exist
NFSMOUNT=$(lsblk | grep mnt | awk '{ print $7 }')
if [ "$NFSMOUNT" = "" ]; then
echo "* No NFS mounts to list.";
else
echo "* NFS mount found: $NFSMOUNT"
echo "* Listing NFS.."
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp list-current-files b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/$NFSMOUNT/
[ $? -ne 0 ] && failcheck "* Couldn't list NFS mount"
fi
}
delete_backup() {
echo "* Deleting backup files for /federated/apps/$SERVICE.."
mkdir -p /federated/tmp/empty
cd /federated/tmp/empty && B2_APPLICATION_KEY_ID="$B2_APPLICATION_KEY_ID" B2_APPLICATION_KEY="$B2_APPLICATION_KEY" $B2 sync --allow-empty-source --delete . b2://fed-customers/$UUID/federated/apps/$SERVICE/
[ $? -ne 0 ] && failcheck "* Couldn't delete files"
cd /federated && rm -rf /federated/tmp/empty
}
restorebackup_system() {
echo "* Restoring system files to /federated.restore/{bin,certs,lib,logs}.."
echo "* Restoring system files to /federated.restore/bin.."
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp --force b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/bin/ /federated.restore/bin
[ $? -ne 0 ] && failcheck "* Couldn't restore files"
echo "* Restoring system files to /federated.restore/certs.."
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp --force b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/certs/ /federated.restore/certs
[ $? -ne 0 ] && failcheck "* Couldn't restore files"
echo "* Restoring system files to /federated.restore/lib.."
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp --force b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/lib/ /federated.restore/lib
[ $? -ne 0 ] && failcheck "* Couldn't restore files"
echo "* Restoring system files to /federated.restore/logs.."
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp --force b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/lib/ /federated.restore/logs
[ $? -ne 0 ] && failcheck "* Couldn't restore files"
}
restorebackup_service() {
echo "* Restoring $SERVICE to /federated.restore/apps/$SERVICE.."
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp --force b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/apps/$SERVICE/ /federated.restore/apps/$SERVICE
[ $? -ne 0 ] && failcheck "* Couldn't restore files"
}
restorebackup_allservices() {
echo "* Restoring all services.."
for i in "${SERVICES[@]}"; do
echo "** Restoring $i to /federated.restore/apps/$i.."
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp --force b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/federated/apps/$i/ /federated.restore/apps/$i
done
}
restorebackup_nfsmounts() {
# Restore NFS mounts if they exist
NFSMOUNT=$(lsblk | grep mnt | awk '{ print $7 }')
if [ "$NFSMOUNT" = "" ]; then
echo "* No NFS mounts to restore.";
else
echo "* NFS mount found: $NFSMOUNT"
echo "* Restoring NFS.."
PASSPHRASE=$GPG_PASSPHRASE duplicity --tempdir /federated/tmp --force b2://$B2_APPLICATION_KEY_ID:$B2_APPLICATION_KEY@fed-customers/$UUID/$NFSMOUNT/ /federated.restore/$NFSMOUNT
[ $? -ne 0 ] && failcheck "* Couldn't restore NFS mount"
fi
}
check_freedisk() {
# Check if there is enough free disk space (needs 15G minimum)
FREEDISK=$(df /federated | awk 'NR==2{print int($4/1024/1024)}')
if [ $FREEDISK -lt 15 ]; then
send_alert_backups
failcheck "Disk is below 15G, can't backup."
fi
}
while getopts "lbdr" OPTION; do
case $OPTION in
l)
LIST_BACKUP="true";
;;
b)
RUN_BACKUP="true";
;;
d)
RUN_DELETE="true";
;;
r)
RUN_RESTORE="true";
;;
*)
usage;
exit 2;
esac
done
[ $# -gt 4 ] || [ $# -lt 1 ] && usage
SERVICE=$2
if [ $# -ge 3 ]; then
PASSKEY=$2
BACKUPHOST=$3
SERVICE=$4
fi
if [ -f "/federated/bin/.gpg.backblaze" ]; then
GPG_PASSPHRASE=`cat /federated/bin/.gpg.backblaze`
else
failcheck "/federated/bin/.gpg.backblaze doesn't exist"
fi
# Source the federated file
if [ -f "/etc/federated" ]; then
. /etc/federated
[ -z "$B2_APPLICATION_KEY_ID" ] && failcheck "/etc/federated doesn't include B2_APPLICATION_KEY_ID for backups"
[ -z "$B2_APPLICATION_KEY" ] && failcheck "/etc/federated doesn't include B2_APPLICATION_KEY for backups"
[ -z "$DOMAIN" ] && failcheck "/etc/federated doesn't include DOMAIN for backups"
[[ ! "$BACKUPHOST" ]] && UUID=$(hostname -f) || UUID="$BACKUPHOST"
else
failcheck "Could not find an /etc/federated file."
fi
# Grab the MySQL pass we need for dumping backups
[ -d "/federated/apps/pdnsmysql" ] && MYSQL_PASSWORD=`cat /federated/apps/pdnsmysql/.env | grep MYSQL_ROOT_PASSWORD | awk -F= '{ print $2 }'`
mkdir -p /federated/tmp
# If -d is specified then run delete backup
[ $RUN_DELETE ] && delete_backup
# If -l is specified then run list backup
if [ $LIST_BACKUP ]; then
if [ "$SERVICE" = "all" ]; then
listbackup_system
listbackup_allservices
listbackup_nfsmounts
elif [ "$SERVICE" = "system" ]; then
listbackup_system
elif [ "$SERVICE" = "nfs" ]; then
listbackup_nfsmounts
else
if printf '%s\0' "${SERVICES[@]}" | grep -Fxqz -- "$SERVICE"; then
listbackup_service
else
failcheck "$SERVICE is not a valid service"
fi
fi
fi
# If -b is specified then run backup
if [ $RUN_BACKUP ]; then
check_freedisk
if [ "$SERVICE" = "all" ]; then
backup_system
backup_allservices
backup_nfsmounts
elif [ "$SERVICE" = "system" ]; then
backup_system
elif [ "$SERVICE" = "nfs" ]; then
backup_nfsmounts
else
if printf '%s\0' "${SERVICES[@]}" | grep -Fxqz -- "$SERVICE"; then
backup_service
else
failcheck "$SERVICE is not a valid service"
fi
fi
fi
# If -r is specified then run restore
if [ $RUN_RESTORE ]; then
check_freedisk
if [ "$PASSKEY" = "" ]; then
GPG_PASSPHRASE=`cat /federated/bin/.gpg.backblaze`
else
GPG_PASSPHRASE="$PASSKEY"
fi
if [ "$SERVICE" = "all" ]; then
restorebackup_system
restorebackup_allservices
restorebackup_nfsmounts
elif [ "$SERVICE" = "system" ]; then
restorebackup_system
elif [ "$SERVICE" = "nfs" ]; then
restorebackup_nfsmounts
else
if printf '%s\0' "${SERVICES[@]}" | grep -Fxqz -- "$SERVICE"; then
restorebackup_service
else
failcheck "$SERVICE is not a valid service"
fi
fi
fi