#!/bin/bash source "$(dirname $(realpath $BASH_SOURCE))/config/backup.sh" readonly LOCK="/var/lock/backup" readonly MOUNT_POINT=$(dirname $REPOSITORY) function main() { mount | grep -q $MOUNT_POINT || mount $MOUNT_POINT if [[ -e /var/run/mysqld/mysqld.sock ]] then mysql_backup fi postgersql_backup borg create --compression zlib,6 --exclude-from "$(dirname $(realpath $BASH_SOURCE))/config/exclude.txt" "$REPOSITORY::cuddles-$(date +%Y-%m-%d_%H:%M:%S)" $BACKUP_FILES borg prune --keep-daily=7 --keep-weekly=4 --keep-monthly=-1 "$REPOSITORY" postgresql_test umount $MOUNT_POINT } function mysql_backup() { ensure_directory '/media/data/mysql_dump' 'mysql' rm /media/data/mysql_dump/*.dump for database in $(mysql_get_databases) do if [[ "$database" != "information_schema" && "$database" != "performance_schema" ]] then mysqldump --user "$MYSQL_USER" --password="$MYSQL_PASSWORD" "$database" > "/media/data/mysql_dump/$database.dump" fi done } function mysql_get_databases() { echo 'SHOW DATABASES;' | mysql --user "$MYSQL_USER" --password="$MYSQL_PASSWORD" --silent } function postgersql_backup() { ensure_directory '/media/data/pgsql_dump' 'postgres' sudo -u postgres rm /media/data/pgsql_dump/*.dump sudo -u postgres pg_dumpall --roles-only > '/media/data/pgsql_dump/_roles.dump' sed -i 's/^\(CREATE ROLE postgres;\)$/-- \1/' '/media/data/pgsql_dump/_roles.dump' for database in $(postgresql_get_databases) do sudo -u postgres pg_dump --file "/media/data/pgsql_dump/$database.dump" "$database" done } function postgresql_get_databases() { sudo -u postgres psql --pset tuples_only --command 'SELECT datname FROM pg_database WHERE datistemplate = false;' } function postgresql_test() { readonly CLUSTER_DIR="/var/lib/postgresql/$PGSQL_VERSION/backup" readonly TEST_DIR="$CLUSTER_DIR/tests" sudo -u postgres pg_createcluster "$PGSQL_VERSION" backup -d "$CLUSTER_DIR" > /dev/null sudo -u postgres pg_ctlcluster "$PGSQL_VERSION" backup start sudo -u postgres psql --port 5433 --output /dev/null --quiet --command '\i /media/data/pgsql_dump/_roles.dump' for database in $(postgresql_get_databases) do if [[ "$database" != "postgres" ]] then sudo -u postgres psql --port 5433 --output /dev/null --quiet --command "CREATE DATABASE $database;" sudo -u postgres psql --port 5433 --output /dev/null --quiet --command "\i /media/data/pgsql_dump/$database.dump" "$database" fi done sudo -u postgres pg_ctlcluster --mode immediate "$PGSQL_VERSION" backup stop sudo -u postgres pg_dropcluster "$PGSQL_VERSION" backup } function ensure_directory() { local name=$1 local user=$2 local group=${3-$user} if [[ ! -d "$name" ]] then mkdir --parent "$name" chown "$user:$group" "$name" fi } if [[ ! -f "$LOCK" ]] then touch "$LOCK" trap 'rm -f "$LOCK"' EXIT main fi