diff --git a/helperFunctions.sh b/helperFunctions.sh index e76d00428..82ec906ab 100755 --- a/helperFunctions.sh +++ b/helperFunctions.sh @@ -102,7 +102,7 @@ openwbDebugLog() { export -f openwbDebugLog openwbRunLoggingOutput() { - $1 2>&1 | while read -r line + "$@" 2>&1 | while read -r line do # use path to /var/log as link in ramdisk may not be set up yet! echo "$(date +"%Y-%m-%d %H:%M:%S"): $1: $line" >> "/var/log/openWB.log" diff --git a/runs/backup.sh b/runs/backup.sh new file mode 100755 index 000000000..412cc3f64 --- /dev/null +++ b/runs/backup.sh @@ -0,0 +1,41 @@ +#!/bin/bash +OPENWBBASEDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd) +BACKUPDIR="$OPENWBBASEDIR/web/backup" +. "$OPENWBBASEDIR/helperFunctions.sh" + +backup() { + # $1: name for new backup file + # remove old backup files + openwbDebugLog MAIN 1 "deleting old backup files if present" + rm "$BACKUPDIR/"* + + # tell mosquitto to store all retained topics in db now + openwbDebugLog MAIN 1 "sending 'SIGUSR1' to mosquitto" + sudo pkill --echo -SIGUSR1 mosquitto + # give mosquitto some time to finish + sleep 0.2 + + # create backup file + BACKUPFILE="$BACKUPDIR/$1" + openwbDebugLog MAIN 0 "creating new backup file: $BACKUPFILE" + sudo tar --verbose --create --gzip --file="$BACKUPFILE" \ + --exclude="$BACKUPDIR" \ + --exclude="$OPENWBBASEDIR/.git" \ + "$OPENWBBASEDIR/" "/var/lib/mosquitto/" + openwbDebugLog MAIN 1 "setting permissions of new backup file" + sudo chown pi:www-data "$BACKUPFILE" + sudo chmod 664 "$BACKUPFILE" + + openwbDebugLog MAIN 0 "backup finished" +} + +useExtendedFilename=$1 +if ((useExtendedFilename == 1)); then + FILENAME="openWB_backup_$(date +"%Y-%m-%d_%H:%M:%S").tar.gz" +else + FILENAME="backup.tar.gz" +fi + +openwbRunLoggingOutput backup "$FILENAME" +# return our filename for further processing +echo "$FILENAME" diff --git a/runs/reboot.sh b/runs/reboot.sh index fad02d527..96e0882dd 100755 --- a/runs/reboot.sh +++ b/runs/reboot.sh @@ -1,6 +1,5 @@ #!/bin/bash - sudo rm /var/log/openWB.log sudo touch /var/log/openWB.log sudo chmod 777 /var/log/openWB.log -$(sleep 5 && sudo reboot now)& +$(sleep 5 && sudo reboot now) & diff --git a/runs/restore.sh b/runs/restore.sh index f594781ed..dccac44d6 100755 --- a/runs/restore.sh +++ b/runs/restore.sh @@ -1,20 +1,50 @@ #!/bin/bash -echo "****************************************" -echo "Step 1: moving file to home directory..." -sudo cp /var/www/html/openWB/web/tools/upload/backup.tar.gz /home/pi/backup.tar.gz -cd /home/pi/ -echo "****************************************" -echo "Step 2: extracting archive..." -sudo tar -vxf backup.tar.gz -echo "****************************************" -echo "Step 3: replacing old files..." -sudo cp -v -R /home/pi/var/www/html/openWB/* /var/www/html/openWB/ -sudo chmod 777 /var/www/html/openWB/openwb.conf -echo "****************************************" -echo "Step 4: cleanup after restore..." -sudo rm /var/www/html/openWB/web/tools/upload/backup.tar.gz -sudo rm /home/pi/backup.tar.gz -sudo rm -R /home/pi/var -echo "****************************************" -echo "End: Restore finished." -echo "****************************************" +OPENWBBASEDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd) +RAMDISKDIR="$OPENWBBASEDIR/ramdisk" +SOURCEFILE="$OPENWBBASEDIR/web/tools/upload/backup.tar.gz" +WORKINGDIR="/home/pi/openwb_restore" +MOSQUITTODIR="/var/lib/mosquitto" +LOGFILE="$OPENWBBASEDIR/web/tools/upload/restore.log" + +{ + echo "$(date +"%Y-%m-%d %H:%M:%S") Restore of backup started..." + echo "****************************************" + echo "Step 1: setting flag 'update in progress' and wait for control loop to finish" + echo 1 >"$OPENWBBASEDIR/ramdisk/updateinprogress" + # Wait for regulation loop(s) and cron jobs to end, but with timeout in case a script hangs + pgrep -f "$OPENWBBASEDIR/(regel\\.sh|runs/cron5min\\.sh|runs/cronnightly\\.sh)$" | + timeout 15 xargs -n1 -I'{}' tail -f --pid="{}" /dev/null + echo "****************************************" + echo "Step 2: creating working directory \"$WORKINGDIR\"" + mkdir -p "$WORKINGDIR" + echo "****************************************" + echo "Step 3: extracting archive to working dir \"$WORKINGDIR\"..." + if ! sudo tar --verbose --extract --file="$SOURCEFILE" --directory="$WORKINGDIR"; then + echo "something went wrong! aborting restore" + echo "Wiederherstellung fehlgeschlagen! Bitte Protokolldateien prüfen." >"$RAMDISKDIR/lastregelungaktiv" + echo 0 >"$OPENWBBASEDIR/ramdisk/updateinprogress" + exit 1 + fi + echo "****************************************" + echo "Step 4: replacing old files..." + # we use cp not mv because of not empty directories in destination + sudo cp -v -p -r "${WORKINGDIR}${OPENWBBASEDIR}/." "${OPENWBBASEDIR}/" + echo "****************************************" + echo "Step 5: restoring mosquitto db..." + if [[ -f "${WORKINGDIR}${MOSQUITTODIR}/mosquitto.db" ]]; then + sudo systemctl stop mosquitto.service + sleep 2 + sudo mv -v -f "${WORKINGDIR}${MOSQUITTODIR}/mosquitto.db" "$MOSQUITTODIR/mosquitto.db" + else + echo "Backup does not contain mosquitto.db. Skipping restore." + fi + echo "****************************************" + echo "Step 6: cleanup after restore..." + sudo rm "$SOURCEFILE" + sudo rm -R "$WORKINGDIR" + echo "****************************************" + echo "$(date +"%Y-%m-%d %H:%M:%S") End: Restore finished." + echo "rebooting" + "$OPENWBBASEDIR/runs/reboot.sh" + echo "****************************************" +} >"$LOGFILE" 2>&1 diff --git a/web/settings/backup.php b/web/settings/backup.php index 5d7e1699e..575eb5f06 100644 --- a/web/settings/backup.php +++ b/web/settings/backup.php @@ -1,22 +1,10 @@ @@ -62,16 +50,21 @@