fix restore/ adding backup file selection

This commit is contained in:
buanet
2023-11-03 18:02:10 +01:00
parent 4738e035b5
commit 375d192c7c
3 changed files with 85 additions and 33 deletions

View File

@@ -1,6 +1,8 @@
## Changelog ## Changelog
### v9.1.0-beta.1 (coming soon) ### v9.1.0-beta.1 (coming soon)
* fix restore/ adding backup file selection ([#394](https://github.com/buanet/ioBroker.docker/issues/394))
* fix calling iob start|stop with parameters
* enhance logging in iobroker_startup.sh * enhance logging in iobroker_startup.sh
* add error handling for user scripts * add error handling for user scripts

View File

@@ -39,27 +39,48 @@ iob_diag () {
fi fi
} }
if [ "$1" = "fix" ]; then # call iobroker fixer # run iobroker maintenance script
iob_fix iob_maint() {
elif [ "$1" = "node fix" ]; then # call iobroker node fixer
echo "The execution of this command is blocked as your ioBroker is running inside a Docker container!"
echo "To fix any issues with nodejs, please pull the latest version of the Docker image and recreate your container."
elif [ "$1" = "diag" ]; then # call iobroker diag script
iob_diag
elif [ "$1" = "start" ] || [ "$1" = "stop" ] || [ "$1" = "restart" ]; then # block execution of iobroker start | stop | restart
echo "The execution of this command is blocked as your ioBroker is running inside a Docker container!"
echo "For more details see ioBroker Docker image docs (https://docs.buanet.de/iobroker-docker-image/docs/) or use the maintenance script 'maintenance --help'."
elif [ "$1" = "m" ] || [ "$1" = "maint" ] || [ "$1" = "maintenance" ]; then # call iobroker maintenance script
shift shift
if [ "$(id -u)" -eq 0 ]; then # check for execution as root if [ "$(id -u)" -eq 0 ]; then
gosu iobroker bash /opt/scripts/maintenance.sh "$@" gosu iobroker bash /opt/scripts/maintenance.sh "$@"
else else
bash /opt/scripts/maintenance.sh "$@" bash /opt/scripts/maintenance.sh "$@"
fi fi
else # passing all other parameters to iobroker.js }
if [ "$(id -u)" -eq 0 ]; then # check for execution as root
# pass parameters and run iobroker.js
iob_run() {
if [ "$(id -u)" -eq 0 ]; then
gosu iobroker node /opt/iobroker/node_modules/iobroker.js-controller/iobroker.js "$@" gosu iobroker node /opt/iobroker/node_modules/iobroker.js-controller/iobroker.js "$@"
else else
node /opt/iobroker/node_modules/iobroker.js-controller/iobroker.js "$@" node /opt/iobroker/node_modules/iobroker.js-controller/iobroker.js "$@"
fi fi
}
if [ "$1" = "fix" ]; then
# call iobroker fixer
iob_fix
elif [ "$1" = "node fix" ]; then
# call iobroker node fixer
echo "The execution of this command is blocked as your ioBroker is running inside a Docker container!"
echo "To fix any issues with nodejs, please pull the latest version of the Docker image and recreate your container."
elif [ "$1" = "diag" ]; then
# call iobroker diag script
iob_diag
elif [ "$1" = "start" ] || [ "$1" = "stop" ] || [ "$1" = "restart" ]; then
# block execution of iobroker start | stop | restart but pass start | stop for adapters
if [ ! "$2" ]; then
echo "The execution of this command is blocked as your ioBroker is running inside a Docker container!"
echo "For more details see ioBroker Docker image docs (https://docs.buanet.de/iobroker-docker-image/docs/) or use the maintenance script 'maintenance --help'."
else
# passing all other parameters to iobroker.js but check for execution as root
iob_run "$@"
fi
elif [ "$1" = "m" ] || [ "$1" = "maint" ] || [ "$1" = "maintenance" ]; then
# call iobroker maintenance script but check for execution as root
iob_maint "$@"
else
# passing all other parameters to iobroker.js but check for execution as root
iob_run "$@"
fi fi

View File

@@ -165,12 +165,12 @@ stop_iob() {
if [[ "$killbyname" != yes ]]; then if [[ "$killbyname" != yes ]]; then
# pgrep exits with status 1 when there are no matches # pgrep exits with status 1 when there are no matches
while pgrep -u iobroker -f 'io.' > /dev/null; (( $? != 1 )); do while pgrep -u iobroker -f 'io\..' > /dev/null; (( $? != 1 )); do
if (($(date +%s) > timeout)); then if (($(date +%s) > timeout)); then
echo -e "\nTimeout reached. Killing remaining processes..." echo -e "\nTimeout reached. Killing remaining processes..."
pgrep --list-full -u iobroker pgrep --list-full -u iobroker -f 'io\..'
pkill --signal SIGKILL -u iobroker -f 'io.' pkill --signal SIGKILL -u iobroker -f 'io\..'
echo "\nDone." echo "Done."
return return
fi fi
sleep 1 sleep 1
@@ -184,6 +184,7 @@ stop_iob() {
fi fi
echo -e "Done." echo -e "Done."
echo " "
} }
# restart container # restart container
@@ -218,40 +219,68 @@ restore_iobroker() {
echo "You are now going to perform a restore of your iobroker." echo "You are now going to perform a restore of your iobroker."
echo "During the restore process, the container will automatically switch into maintenance mode and stop ioBroker." echo "During the restore process, the container will automatically switch into maintenance mode and stop ioBroker."
echo "Depending on the restart policy, your container will be stopped or restarted automatically after the restore." echo "Depending on the restart policy, your container will be stopped or restarted automatically after the restore."
# check autoconfirm
if [[ "$autoconfirm" != yes ]]; then if [[ "$autoconfirm" != yes ]]; then
local reply local reply
read -rp 'Do you want to continue [yes/no]? ' reply read -rp 'Do you want to continue [yes/no]? ' reply
if [[ "$reply" == y || "$reply" == Y || "$reply" == yes ]]; then if [[ "$reply" != y && "$reply" != Y && "$reply" != yes ]]; then
: # continue return 1
else
return 1
fi fi
fi fi
echo " "
# check startup script running
if check_starting > /dev/null; then if check_starting > /dev/null; then
echo "Startup script is still running." echo "Startup script is still running."
echo "Please check container log and wait until ioBroker is sucessfully started." echo "Please check container log and wait until ioBroker is sucessfully started."
echo "Then try again."
return 1 return 1
fi fi
# check mainenance mode
if ! maintenance_enabled > /dev/null; then if ! maintenance_enabled > /dev/null; then
autoconfirm=yes autoconfirm=yes
enable_maintenance enable_maintenance
fi fi
echo -n "Restoring ioBroker... " # list backup files
backup_dir="/opt/iobroker/backups"
backup_files=($(find $backup_dir -type f))
backup_count=${#backup_files[@]}
if [[ $backup_count -eq 0 ]]; then
echo "Ther are no backup files in $backup_dir."
echo "Please check and try again."
return 1
elif [[ $backup_count -eq 1 ]]; then
selected_backup=$(basename "${backup_files[0]}")
echo "There is one backup file in $backup_dir."
else
# more than one backup file found, ask user to select
echo "There is more than one backup file in $backup_dir."
echo "Please select file for restore:"
for ((i=0; i<$backup_count; i++)); do
echo "$i: $(basename "${backup_files[$i]}")"
done
echo
read -rp "Enter the number of the backup to restore (0-$((backup_count - 1))): " selected_number
selected_backup=$(basename "${backup_files[$selected_number]}")
fi
# restoe backup
echo -n "Restoring ioBroker from $selected_backup... "
set +e set +e
bash iobroker restore 0 > /opt/iobroker/log/restore.log 2>&1 bash iobroker restore "$selected_backup" > /opt/iobroker/log/restore.log 2>&1
return=$? return_value=$?
set -e set -e
if [[ "$return" -ne 0 ]]; then
echo "Failed." if [[ "$return_value" -ne 0 ]]; then
echo "For more details see \"/opt/iobroker/log/restore.log\"." echo "Failed."
echo "Please check backup file location and permissions and try again." echo "For more details see \"/opt/iobroker/log/restore.log\"."
return 1 echo "Please check backup file location and permissions and try again."
return 1
fi fi
echo "Done." echo "Done."
echo " " echo " "
@@ -265,8 +294,8 @@ restore_iobroker() {
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
sleep 10 sleep 10
echo "Container will be stopped or restarted in 10 seconds..." echo "Container will be stopped or restarted in 10 seconds..."
sleep 10
echo "stopping" > "$healthcheck" echo "stopping" > "$healthcheck"
sleep 10
pkill -u iobroker pkill -u iobroker
} }