Compare commits

...

4 Commits

Author SHA1 Message Date
buanet
bf87667fc0 improve maintenance command by symlinking 2023-11-03 20:37:49 +01:00
buanet
375d192c7c fix restore/ adding backup file selection 2023-11-03 18:02:10 +01:00
André Germann
4738e035b5 Merge pull request #392 from buanet/feature-error-handling-user-scripts
add error handling for user scripts
2023-10-17 21:59:34 +02:00
buanet
814cfae657 add error handling for user scripts 2023-10-11 09:20:33 +02:00
5 changed files with 108 additions and 52 deletions

View File

@@ -1 +1 @@
v9.0.1 v9.1.0-beta.1

View File

@@ -1,5 +1,12 @@
## Changelog ## Changelog
### v9.1.0-beta.1 (03.11.2023)
* improve maintenance command by symlinking ([#390](https://github.com/buanet/ioBroker.docker/issues/390))
* 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
* add error handling for user scripts
### v9.0.1 (10.10.2023) ### v9.0.1 (10.10.2023)
* fix issue with avahi setup ([#384](https://github.com/buanet/ioBroker.docker/issues/384); [#385 by @z1r0](https://github.com/buanet/ioBroker.docker/pull/385)) * fix issue with avahi setup ([#384](https://github.com/buanet/ioBroker.docker/issues/384); [#385 by @z1r0](https://github.com/buanet/ioBroker.docker/pull/385))
* add silent cleanup to setup_avahi.sh * add silent cleanup to setup_avahi.sh

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

@@ -133,11 +133,7 @@ if [[ -f /opt/.docker_config/.first_run ]]; then
if [[ "$offlinemode" = "true" ]]; then if [[ "$offlinemode" = "true" ]]; then
echo "OFFLINE_MODE is \"true\". Skipping Linux package updates on first run." echo "OFFLINE_MODE is \"true\". Skipping Linux package updates on first run."
else else
if bash /opt/scripts/setup_packages.sh -update; then if ! bash /opt/scripts/setup_packages.sh -update; then echo "Failed."; fi
echo " "
else
echo "Error: Updating failed."
fi
fi fi
echo " " echo " "
# Installing packages from ENV # Installing packages from ENV
@@ -145,18 +141,14 @@ if [[ -f /opt/.docker_config/.first_run ]]; then
echo "PACKAGES is set, but OFFLINE_MODE is \"true\". Skipping Linux package installation." echo "PACKAGES is set, but OFFLINE_MODE is \"true\". Skipping Linux package installation."
elif [[ "$packages" != "" ]]; then elif [[ "$packages" != "" ]]; then
echo "PACKAGES is set. Installing the following additional Linux packages: ""$packages" echo "PACKAGES is set. Installing the following additional Linux packages: ""$packages"
if bash /opt/scripts/setup_packages.sh -install; then if ! bash /opt/scripts/setup_packages.sh -install; then echo "Failed."; fi
echo " "
else
echo "Error: Installation failed."
fi
fi fi
echo " " echo " "
# Register maintenance script # Register maintenance script
echo -n "Registering maintenance script as command... " echo -n "Registering maintenance script as command... "
echo "alias maintenance='/opt/scripts/maintenance.sh'" >> /etc/bash.bashrc ln -s /opt/scripts/maintenance.sh /bin/maintenance
echo "alias maint='/opt/scripts/maintenance.sh'" >> /etc/bash.bashrc ln -s /opt/scripts/maintenance.sh /bin/maint
echo "alias m='/opt/scripts/maintenance.sh'" >> /etc/bash.bashrc ln -s /opt/scripts/maintenance.sh /bin/m
echo "Done." echo "Done."
else else
echo "This is not the first run of this container. Skipping first run preparation." echo "This is not the first run of this container. Skipping first run preparation."
@@ -505,17 +497,24 @@ elif [[ -f /opt/userscripts/userscript_firststart.sh || -f /opt/userscripts/user
echo "Userscript for first start detected and this is the first start of a new container." echo "Userscript for first start detected and this is the first start of a new container."
echo "Running userscript_firststart.sh... " echo "Running userscript_firststart.sh... "
chmod 755 /opt/userscripts/userscript_firststart.sh chmod 755 /opt/userscripts/userscript_firststart.sh
bash /opt/userscripts/userscript_firststart.sh if ! bash /opt/userscripts/userscript_firststart.sh; then
echo "Failed."
else
echo "Done." echo "Done."
fi fi
fi
if [[ -f /opt/userscripts/userscript_everystart.sh ]]; then if [[ -f /opt/userscripts/userscript_everystart.sh ]]; then
echo "Userscript for every start detected. Running userscript_everystart.sh... " echo "Userscript for every start detected. Running userscript_everystart.sh... "
chmod 755 /opt/userscripts/userscript_everystart.sh chmod 755 /opt/userscripts/userscript_everystart.sh
bash /opt/userscripts/userscript_everystart.sh if ! bash /opt/userscripts/userscript_everystart.sh; then
echo "Failed."
else
echo "Done." echo "Done."
fi fi
fi fi
echo " " echo " "
fi
# Removing first run an fresh install markers when exists # Removing first run an fresh install markers when exists
if [[ -f /opt/.docker_config/.first_run ]]; then rm -f /opt/.docker_config/.first_run; fi if [[ -f /opt/.docker_config/.first_run ]]; then rm -f /opt/.docker_config/.first_run; 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
@@ -219,35 +220,63 @@ restore_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
else
return 1 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
if [[ "$return_value" -ne 0 ]]; then
echo "Failed." echo "Failed."
echo "For more details see \"/opt/iobroker/log/restore.log\"." echo "For more details see \"/opt/iobroker/log/restore.log\"."
echo "Please check backup file location and permissions and try again." echo "Please check backup file location and permissions and try again."
@@ -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
} }