#!/bin/bash # File and directory settings GROUPION_DIR="/Applications/MAMP/htdocs/groupion" BACKUP_ROOT="/Users/Shared/Groupion/Backups" BACKUP_FILE="${BACKUP_ROOT}/groupion-backup-$(date +%Y-%m-%d-%H%M%S).tar.gz.gpg" BACKUP_TEMP="/Library/Caches/com.example.backupserver" DB_DUMP="${BACKUP_TEMP}/database.dump" FILE_DIR="${BACKUP_TEMP}/files" # Database settings: Backup user, password, database name DB_USER="groupionbackup" DB_PASS="password" DB_NAME="groupion" # Remote transfer settings REMOTE_USER="isensebk" REMOTE_HOST="backupserver.example.com" REMOTE_DIR="/home/isensebk/backups" SSH_KEYFILE="/Library/Groupion/keyfile" # GnuPG settings GPG_RECIPIENT="48BE6C86" GPG_PASSPHRASE="password" GPG_HOME_DIR="/var/root/.gnupg" # Paths to various utilities DUMP_COMMAND="/Applications/MAMP/Library/bin/mysqldump" GPG_COMMAND="/usr/local/bin/gpg2" # Created files and directories should be inaccessible by others umask 077 echo "Processing data..." # Fail if backup files already exist if [ -e "${BACKUP_FILE}" ] || [ -e "${DB_DUMP}" ] || \ [ -e "${FILE_DIR}" ] ; then echo "ERROR: Old backup files already exist." >&2 exit 1 fi # Create temp directories mkdir -p "${BACKUP_ROOT}" mkdir -p "${BACKUP_TEMP}" mkdir -p "${FILE_DIR}" if [ ! -d "${BACKUP_ROOT}" ] || [ ! -d "${BACKUP_TEMP}" ] || \ [ ! -d "${FILE_DIR}" ] ; then echo "ERROR: Cannot create backup directories." >&2 exit 1 fi # Dump database "${DUMP_COMMAND}" -u "${DB_USER}" --password="${DB_PASS}" \ --add-drop-table "${DB_NAME}" > "${DB_DUMP}" EXITCODE="$?" if [ "${EXITCODE}" -ne 0 ] ; then rm -rf "${BACKUP_TEMP}" echo "ERROR: Database dump failed, code ${EXITCODE}." exit 2 fi # Copy Groupion files to temp directory cp -R -p "${GROUPION_DIR}" "${FILE_DIR}" EXITCODE="$?" if [ "${EXITCODE}" -ne 0 ] ; then rm -rf "${BACKUP_TEMP}" echo "ERROR: File copy failed, code ${EXITCODE}." exit 3 fi # Create compressed archive set -o pipefail tar -C "${BACKUP_TEMP}" -czf - "." | \ "${GPG_COMMAND}" --batch \ --always-trust \ --homedir "${GPG_HOME_DIR}" \ --passphrase "${GPG_PASSPHRASE}" \ --default-key "${GPG_RECIPIENT}" \ -s -e -r "${GPG_RECIPIENT}" > "${BACKUP_FILE}" EXITCODE="$?" # Delete temporary files rm -rf "${BACKUP_TEMP}" if [ "${EXITCODE}" -ne 0 ] ; then # Remove backup file in case of failure rm "${BACKUP_FILE}" echo "ERROR: tar failed, code: ${EXITCODE}." >&2 exit 4 fi # Send to remote server scp -i "${SSH_KEYFILE}" "${BACKUP_FILE}" \ "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}" EXITCODE="$?" if [ "${EXITCODE}" -ne 0 ] ; then # Remove backup file in case of failure rm "${BACKUP_FILE}" echo "ERROR: tar failed, code: ${EXITCODE}." >&2 exit 4 fi echo "Backup succeeded, file \"${BACKUP_FILE}\"." exit 0