#!/bin/bash RES_OPENSLX=0 RES_SAT=0 case "$1" in both) RES_OPENSLX=1 RES_SAT=1 ;; openslx) RES_OPENSLX=1 ;; sat) RES_SAT=1 ;; *) echo "Error: Restore mode must be one of both, openslx, sat" exit 1 ;; esac BACKUP="$1" if [ -z "$BACKUP" ] || [ ! -f "$BACKUP" ]; then echo "Backup file not found: $BACKUP" exit 1 fi if [ "$(whoami)" != "root" ]; then echo "Must be running as root!" exit 1 fi DIR="/root/restore/$(date +%s)" if [ -d "$DIR" ]; then echo "Restore already running!?" exit 1 fi mkdir -p "$DIR" if ! cd "$DIR"; then echo "Could not cd to $DIR" exit 1 fi if ! tar --ignore-failed-read -x -f "$BACKUP"; then echo "Could not extract $BACKUP - make sure it's a valid .tar.gz / .tgz" exit 1 fi if [ -f db.sql ]; then DB_OLD=1 elif [ -f openslx.sql ] || [ -f sat.sql ]; then DB_OLD=0 else echo "Error: database dump not found in backup - are you sure this is a valid backup?" exit 1 fi if [ $RES_SAT -eq 1 -a $DB_OLD -eq 0 -a ! -f sat.sql ]; then echo "Error: this backup does not contain the DozMod database" echo "Error: cannot restore VM/lecture information" exit 1 fi if [ $RES_OPENSLX -eq 1 -a $DB_OLD -eq 0 -a ! -f openslx.sql ]; then echo "Error: this backup does not contain the OpenSLX database" echo "Error: cannot restore satellite configuration" exit 1 fi if [ $RES_OPENSLX -eq 1 -a ! -f files.tgz ]; then echo "Error: files.tgz not found in backup - are your sure this is a valid backup?" exit 1 fi if [ $DB_OLD -eq 1 ]; then mysql --defaults-extra-file=/etc/mysql/debian.cnf --default-character-set=utf8 < db.sql RET=$? else RET=0 if [ $RES_SAT -eq 1 ]; then mysql --defaults-extra-file=/etc/mysql/debian.cnf --default-character-set=utf8 < sat.sql RET=$? fi if [ $RET -eq 0 -a $RES_OPENSLX -eq 1 ]; then mysql --defaults-extra-file=/etc/mysql/debian.cnf --default-character-set=utf8 < openslx.sql RET=$? fi fi if [ $RET -ne 0 ]; then echo "Error: Restoring database contents failed with exit code $RET" exit 1 fi if [ $RES_OPENSLX -eq 1 ]; then # Since we came that far we'll delete some old configs (if existent) rm -rf /opt/ldadp/{configs,pid,logs}/* /opt/openslx/configs/* /srv/openslx/www/boot/default/config.tgz 2> /dev/null # Force triggering IP detection/setting, which should in turn regenerate ldadp configs and launch ldadp instances if applicable echo "UPDATE openslx.property SET value = 'invalid' WHERE name = 'server-ip' LIMIT 1" | mysql --defaults-extra-file=/etc/mysql/debian.cnf --default-character-set=utf8 # Try to update the db (if required) curl -s 'http://localhost/slx-admin/api.php?do=update' tar --ignore-failed-read -x -f files.tgz -C / RET=$? if [ $RET -ne 0 ]; then echo "WARNING: Restoring filesystem contents failed with exit code $RET - backup might be incomplete!" fi # Make sure the directory tree is owned by taskmanager, as tar will create intermediate # directories as owned by root if they do not exist. chown -R taskmanager /srv/openslx/www/boot /opt/openslx/configs fi rm -rf -- "$DIR" rm -f -- "$BACKUP" echo "Success." exit 0