Files

90 lines
2.5 KiB
Plaintext
Raw Permalink Normal View History

2025-12-02 10:32:59 -05:00
#!/bin/bash
#
# Copyright (c) 2022 Xibo Signage Ltd
#
# Xibo - Digital Signage - http://www.xibo.org.uk
#
# This file is part of Xibo.
#
# Xibo is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# any later version.
#
# Xibo is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with Xibo. If not, see <http://www.gnu.org/licenses/>.
#
/bin/mkdir -p /var/www/backup/db
age=86401
MYSQL_BACKUP_ENABLED=
MYSQL_DATABASE=
# Is this enabled?
if [ "$MYSQL_BACKUP_ENABLED" == "false" ]
then
echo "Backup not enabled"
exit 0
fi
# See if there is an existing backup, and if so, get its age
if [ -e /var/www/backup/db/latest.sql.gz ]
then
age=$((`date +%s` - `date -r /var/www/backup/db/latest.sql.gz +%s`))
# Age can potentially be negative. If it is, make it 0 so that
# we run a backup now
if [ $age -lt 0 ]
then
echo "Last backup was in the future. Resetting"
age=86401
fi
echo "Existing backup is $age seconds old"
fi
# Check if mysqldump is running already
# pgrep exits with 0 if a process is found and 1 otherwise
pgrep mysqldump > /dev/null 2>&1
mysqldump_running=$?
# If the backup is older than 1 day, and mysqldump isn't running,
# then take a new one
if [ $age -gt 86400 ] && [ $mysqldump_running -ne 0 ]
then
echo "Creating new backup"
# Tell bash to consider all exit values when evaluating the
# exit code of a pipe rather than just the right-most one
# That way we can detect if mysqldump errors or is killed etc
set -o pipefail
/usr/bin/mysqldump --single-transaction --hex-blob --no-tablespaces $MYSQL_DATABASE \
| gzip > /var/www/backup/db/backup.sql.gz
RESULT=$?
if [ $RESULT -eq 0 ] && [ -e /var/www/backup/db/backup.sql.gz ]
then
echo "Rotating backups"
mv /var/www/backup/db/latest.sql.gz /var/www/backup/db/previous.sql.gz
mv /var/www/backup/db/backup.sql.gz /var/www/backup/db/latest.sql.gz
exit 0
else
echo "BACKUP FAILED"
echo "Not rotating backups"
exit 1
fi
elif [ $mysqldump_running -eq 0 ]
then
echo "Backup already in progress. Exiting"
exit 0
fi