diff --git a/.VERSION b/.VERSION index 50ced9c..1038974 100644 --- a/.VERSION +++ b/.VERSION @@ -1 +1 @@ -v7.0.1 \ No newline at end of file +v7.1.0-beta.1 \ No newline at end of file diff --git a/.github/dependencies/.admin-version b/.github/dependencies/.admin-version new file mode 100644 index 0000000..e69de29 diff --git a/.github/dependencies/.backitup-version b/.github/dependencies/.backitup-version new file mode 100644 index 0000000..e69de29 diff --git a/.github/dependencies/.discovery-version b/.github/dependencies/.discovery-version new file mode 100644 index 0000000..e69de29 diff --git a/.github/workflows/build-debian-image-dev.yml b/.github/workflows/build-debian-image-dev.yml index daaef55..7c457dc 100644 --- a/.github/workflows/build-debian-image-dev.yml +++ b/.github/workflows/build-debian-image-dev.yml @@ -12,7 +12,7 @@ jobs: uses: actions/checkout@v3 with: repository: 'buanet/ioBroker.docker' - ref: 'main' + # ref: 'main' - name: Get and write version and date id: version diff --git a/.github/workflows/check-js-controller-release.yml b/.github/workflows/check-iobroker-versions.yml similarity index 65% rename from .github/workflows/check-js-controller-release.yml rename to .github/workflows/check-iobroker-versions.yml index b124486..bb76eac 100644 --- a/.github/workflows/check-js-controller-release.yml +++ b/.github/workflows/check-iobroker-versions.yml @@ -1,4 +1,4 @@ -name: Check js-controller release +name: Check ioBroker versions on: schedule: @@ -15,13 +15,20 @@ jobs: repository: 'buanet/ioBroker.docker' token: ${{ secrets.ACTIONS_PAT }} - - name: Fetch js-controller release version + - name: Fetch ioBroker versions run: | curl -sL https://repo.iobroker.live/sources-dist.json | \ jq -r '."js-controller".version' > .github/dependencies/.js-controller-version - # curl -sL https://api.github.com/repos/ioBroker/ioBroker.js-controller/releases/latest | \ - # jq -r ".tag_name" > .github/dependencies/.js-controller-version echo "[LOG] Fetched js-controller version is $(cat .github/dependencies/.js-controller-version)" + curl -sL https://repo.iobroker.live/sources-dist.json | \ + jq -r '."admin".version' > .github/dependencies/.admin-version + echo "[LOG] Fetched admin version is $(cat .github/dependencies/.admin-version)" + curl -sL https://repo.iobroker.live/sources-dist.json | \ + jq -r '."backitup".version' > .github/dependencies/.backitup-version + echo "[LOG] Fetched backitup version is $(cat .github/dependencies/.backitup-version)" + curl -sL https://repo.iobroker.live/sources-dist.json | \ + jq -r '."discovery".version' > .github/dependencies/.discovery-version + echo "[LOG] Fetched discovery version is $(cat .github/dependencies/.discovery-version)" - name: Check for modified files id: git-check @@ -32,7 +39,7 @@ jobs: run: | git config --global user.name 'buanet' git config --global user.email 'info@buanet.de' - git commit -am "new js-controller release" + git commit -am "new ioBroker versions" git push - name: Trigger build debian latest (buanet) diff --git a/CHANGELOG.md b/CHANGELOG.md index 906ebf6..fafd27f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ ## Changelog +### v7.1.0-beta.1 (12.10.2022) +* add env DEBUG for extended debugging log +* enhance logging in iobroker-startuo.sh +* enhance build process +* add restart option to maintenance script +* add strict mode for iobroker-startup.sh +* fix "unary operator expected" error + ### v7.0.1 (05.07.2022) * backitup restore patch diff --git a/README.md b/README.md index e3923e2..e921f35 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ Please do not use the issues for support questions. Not every error message is w ### Beta testing -If you want to get the newest features and changes feel free to use/ test the beta version of the Docker image. You can find the changelog for beta versions [here](https://github.com/buanet/ioBroker.docker/blob/dev/CHANGELOG.md). For more details and beta support join us at the "docker-image" chat on the [ioBroker Discord channel](https://discord.gg/Ne3y6fUac3). +If you want to get the newest features and changes feel free to use/ test the beta version of the Docker image. For more details and beta support join us at "beta testing & feedback" > "docker-image" on the [ioBroker Discord channel](https://discord.gg/Ne3y6fUac3). ### Support the project diff --git a/debian/scripts/iobroker_startup.sh b/debian/scripts/iobroker_startup.sh index 950e684..6e1abf7 100644 --- a/debian/scripts/iobroker_startup.sh +++ b/debian/scripts/iobroker_startup.sh @@ -1,11 +1,16 @@ -#!/bin/bash +#!/usr/bin/env bash + +# bash strict mode +set -euo pipefail # Setting healthcheck status to "starting" echo 'starting' > /opt/scripts/.docker_config/.healthcheck # Reading ENV +set +u adminport=$IOB_ADMINPORT avahi=$AVAHI +debug=$DEBUG multihost=$IOB_MULTIHOST offlinemode=$OFFLINE_MODE objectsdbhost=$IOB_OBJECTSDB_HOST @@ -19,6 +24,7 @@ statesdbport=$IOB_STATESDB_PORT statesdbtype=$IOB_STATESDB_TYPE usbdevices=$USBDEVICES zwave=$ZWAVE +set -u pkill_timeout=10 # timeout for iobroker shutdown in seconds @@ -30,44 +36,47 @@ echo ' ' echo "$(printf -- '-%.0s' {1..80})" echo -n "$(printf -- '-%.0s' {1..25})" && echo -n " "$dati" " && echo "$(printf -- '-%.0s' {1..25})" echo "$(printf -- '-%.0s' {1..80})" -echo ' ' -echo "$(printf -- '-%.0s' {1..80})" -echo "----- Welcome to your ioBroker-container! -----" -echo "----- Startupscript is now running. -----" +echo '----- -----' +echo "----- ██╗ ██████╗ ██████╗ ██████╗ ██████╗ ██╗ ██╗ ███████╗ ██████╗ -----" +echo "----- ██║ ██╔═══██╗ ██╔══██╗ ██╔══██╗ ██╔═══██╗ ██║ ██╔╝ ██╔════╝ ██╔══██╗ -----" +echo "----- ██║ ██║ ██║ ██████╔╝ ██████╔╝ ██║ ██║ █████╔╝ █████╗ ██████╔╝ -----" +echo "----- ██║ ██║ ██║ ██╔══██╗ ██╔══██╗ ██║ ██║ ██╔═██╗ ██╔══╝ ██╔══██╗ -----" +echo "----- ██║ ╚██████╔╝ ██████╔╝ ██║ ██║ ╚██████╔╝ ██║ ██╗ ███████╗ ██║ ██║ -----" +echo "----- ╚═╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚══════╝ ╚═╝ ╚═╝ -----" +echo '----- -----' +echo "----- Welcome to your ioBroker Docker container! -----" +echo "----- Startupscript is now running! -----" echo "----- Please be patient! -----" echo "$(printf -- '-%.0s' {1..80})" echo ' ' echo "$(printf -- '-%.0s' {1..80})" -echo "----- Debugging information -----" -echo "----- -----" -echo "----- System -----" +echo "----- System Information -----" echo -n "----- " && echo -n "$(printf "%-20s %-28s" arch: $(uname -m))" && echo " -----" echo -n "----- " && echo -n "$(printf "%-20s %-28s" hostname: $(hostname))" && echo " -----" echo "----- -----" -echo "----- Docker-Image -----" +echo "----- Version Information -----" echo -n "----- " && echo -n "$(printf "%-20s %-28s" image: ${VERSION})" && echo " -----" echo -n "----- " && echo -n "$(printf "%-20s %-28s" build: ${BUILD})" && echo " -----" -echo "----- -----" -echo "----- Versions -----" echo -n "----- " && echo -n "$(printf "%-20s %-28s" node: $(node -v))" && echo " -----" echo -n "----- " && echo -n "$(printf "%-20s %-28s" npm: $(npm -v))" && echo " -----" echo "----- -----" -echo "----- ENV -----" -if [ "$avahi" != "" ]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" AVAHI: $avahi)" && echo " -----"; fi -if [ "$adminport" != "" ]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_ADMINPORT: $adminport)" && echo " -----"; fi -if [ "$multihost" != "" ]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_MULTIHOST: $multihost)" && echo " -----"; fi -if [ "$objectsdbhost" != "" ]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_OBJECTSDB_HOST: $objectsdbhost)" && echo " -----"; fi -if [ "$objectsdbport" != "" ]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_OBJECTSDB_PORT: $objectsdbport)" && echo " -----"; fi -if [ "$objectsdbtype" != "" ]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_OBJECTSDB_TYPE: $objectsdbtype)" && echo " -----"; fi -if [ "$statesdbhost" != "" ]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_STATESDB_HOST: $statesdbhost)" && echo " -----"; fi -if [ "$statesdbport" != "" ]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_STATESDB_PORT: $statesdbport)" && echo " -----"; fi -if [ "$statesdbtype" != "" ]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_STATESDB_TYPE: $statesdbtype)" && echo " -----"; fi -if [ "$offlinemode" != "" ]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" OFFLINE_MODE: $offlinemode)" && echo " -----"; fi -if [ "$packages" != "" ]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" PACKAGES: "$packages")" && echo " -----"; fi -if [ "$setgid" != "" ]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" SETGID: $setgid)" && echo " -----"; fi -if [ "$setuid" != "" ]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" SETUID: $setuid)" && echo " -----"; fi -if [ "$usbdevices" != "" ]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" USBDEVICES: $usbdevices)" && echo " -----"; fi -if [ "$zwave" != "" ]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" ZWAVE: $zwave)" && echo " -----"; fi +echo "----- Environment Variables -----" +if [[ "$adminport" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_ADMINPORT: $adminport)" && echo " -----"; fi +if [[ "$avahi" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" AVAHI: $avahi)" && echo " -----"; fi +if [[ "$debug" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" DEBUG: $debug)" && echo " -----"; fi +if [[ "$multihost" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_MULTIHOST: $multihost)" && echo " -----"; fi +if [[ "$objectsdbhost" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_OBJECTSDB_HOST: $objectsdbhost)" && echo " -----"; fi +if [[ "$objectsdbport" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_OBJECTSDB_PORT: $objectsdbport)" && echo " -----"; fi +if [[ "$objectsdbtype" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_OBJECTSDB_TYPE: $objectsdbtype)" && echo " -----"; fi +if [[ "$statesdbhost" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_STATESDB_HOST: $statesdbhost)" && echo " -----"; fi +if [[ "$statesdbport" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_STATESDB_PORT: $statesdbport)" && echo " -----"; fi +if [[ "$statesdbtype" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_STATESDB_TYPE: $statesdbtype)" && echo " -----"; fi +if [[ "$offlinemode" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" OFFLINE_MODE: $offlinemode)" && echo " -----"; fi +if [[ "$packages" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" PACKAGES: "$packages")" && echo " -----"; fi +if [[ "$setgid" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" SETGID: $setgid)" && echo " -----"; fi +if [[ "$setuid" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" SETUID: $setuid)" && echo " -----"; fi +if [[ "$usbdevices" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" USBDEVICES: $usbdevices)" && echo " -----"; fi +if [[ "$zwave" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" ZWAVE: $zwave)" && echo " -----"; fi echo "$(printf -- '-%.0s' {1..80})" echo ' ' @@ -80,10 +89,10 @@ echo "$(printf -- '-%.0s' {1..80})" echo ' ' # Actions running on first start only -if [ -f /opt/.firstrun ]; then +if [[ -f /opt/.firstrun ]]; then # Updating Linux packages - if [ "$offlinemode" = "true" ]; then - echo 'Offline mode is activated by ENV. Skipping Linux package updates on first run.' + if [[ "$offlinemode" = "true" ]]; then + echo 'OFFLINE_MODE is \"true\". Skipping Linux package updates on first run.' echo ' ' else echo 'Updating Linux packages on first run...' @@ -91,6 +100,18 @@ if [ -f /opt/.firstrun ]; then echo 'Done.' echo ' ' fi + # Installing packages from ENV + if [[ "$packages" != "" && "$offlinemode" = "true" ]]; then + echo 'PACKAGES is set, but OFFLINE_MODE is \"true\". Skipping Linux package installation.' + echo ' ' + else + echo 'PACKAGES is set. Installing additional Linux packages.' + echo "Checking the following packages:" $packages"..." + echo $packages > /opt/scripts/.docker_config/.packages + bash /opt/scripts/setup_packages.sh -install + echo 'Done.' + echo ' ' + fi # Register maintenance script echo -n 'Registering maintenance script as command... ' echo "alias maintenance=\'/opt/scripts/maintenance.sh\'" >> /root/.bashrc @@ -103,23 +124,9 @@ else echo ' ' fi -# Installing packages from ENV -if [ "$packages" != "" ] && [ "$offlinemode" = "true" ]; then - echo 'Installing additional packages is set by ENV but offline mode is activated!' - echo 'Skipping Linux packages installation.' - echo ' ' -else - echo 'Installing additional packages is set by ENV.' - echo "Checking the following Packages:" $packages"..." - echo $packages > /opt/scripts/.docker_config/.packages - bash /opt/scripts/setup_packages.sh -install - echo 'Done.' - echo ' ' -fi - # Setting UID and/ or GID -if [ $(cat /etc/group | grep 'iobroker:' | cut -d':' -f3) != $setgid ] || [ $(cat /etc/passwd | grep 'iobroker:' | cut -d':' -f3) != $setuid ]; then - echo "Different UID and/ or GID is set by ENV." +if [[ "$setgid" != "$(cat /etc/group | grep 'iobroker:' | cut -d':' -f3)" || "$setuid" != "$(cat /etc/passwd | grep 'iobroker:' | cut -d':' -f3)" ]]; then + echo "SETUID and/ or SETGID are set to individual values." echo -n "Changing UID to "$setuid" and GID to "$setgid"... " usermod -u $setuid iobroker groupmod -g $setgid iobroker @@ -138,25 +145,24 @@ echo "----- Step 2 of 5: Detecting ioBroker installation echo "$(printf -- '-%.0s' {1..80})" echo ' ' -if [ `find /opt/iobroker -type f | wc -l` -lt 1 ] -then +if [[ `find /opt/iobroker -type f | wc -l` -lt 1 ]]; then echo "There is no data detected in /opt/iobroker." echo -n "Restoring initial ioBroker installation... " tar -xf /opt/initial_iobroker.tar -C / echo 'Done.' -elif [ -f /opt/iobroker/iobroker ] -then - echo "Existing installation of ioBroker detected in /opt/iobroker." -elif [ $(ls *_backupiobroker.tar.gz 2> /dev/null | wc -l) != "0" ] && [ $(tar -ztvf /opt/iobroker/*_backupiobroker.tar.gz "backup/backup.json" 2> /dev/null | wc -l) != "0" ] -then - if [ "$multihost" = "slave" ] - then +elif [[ -f /opt/iobroker/iobroker ]]; then + echo "Existing installation of ioBroker detected in \"/opt/iobroker\"." +elif [[ "$(ls *_backupiobroker.tar.gz 2> /dev/null | wc -l)" != "0" && "$(tar -ztvf /opt/iobroker/*_backupiobroker.tar.gz "backup/backup.json" 2> /dev/null | wc -l)" != "0" ]]; then + if [[ "$multihost" = "slave" ]]; then echo "IoBroker backup file detected in /opt/iobroker. But Multihost is set to \"slave\"." echo "Restoring a backup is not supported on Multihost slaves. Please check configuration and start over." echo "For more information see ioBroker Docker Image Docs (https://docs.buanet.de/iobroker-docker-image/docs/)." exit 1 else echo "IoBroker backup file detected in /opt/iobroker." + if [[ "$debug" == "true" ]]; then + echo "[DEBUG] Backup file name: " $(ls *_backupiobroker.tar.gz) + fi echo -n "Preparing restore... " mv /opt/iobroker/*.tar.gz /opt/ tar -xf /opt/initial_iobroker.tar -C / @@ -181,6 +187,10 @@ then else echo "There is data detected in /opt/iobroker but it looks like it is no instance of ioBroker or a valid backup file!" echo "Please check/ recreate mounted folder or volume and start over." + if [[ "$debug" == "true" ]]; then + echo "[DEBUG] Detected files:" + ls -al + fi exit 1 fi echo ' ' @@ -194,14 +204,14 @@ echo "$(printf -- '-%.0s' {1..80})" echo ' ' # (Re)Setting permissions to "/opt/iobroker" and "/opt/scripts" -echo -n "(Re)Setting folder permissions (This might take a while! Please be patient!)... " +echo -n "(Re)setting permissions (This might take a while! Please be patient!)... " chown -R $setuid:$setgid /opt/iobroker chown -R $setuid:$setgid /opt/scripts echo 'Done.' echo ' ' # Backing up original iobroker-file and changing sudo to gosu -echo -n "Fixing \"sudo-bug\" by replacing sudo in iobroker with gosu... " +echo -n "Fixing \"sudo-bug\" by replacing sudo with gosu... " cp -a /opt/iobroker/iobroker /opt/iobroker/iobroker.bak chmod 755 /opt/iobroker/iobroker sed -i 's/sudo -H -u/gosu/g' /opt/iobroker/iobroker @@ -209,13 +219,33 @@ echo 'Done.' echo ' ' # checking hostname in ioBroker to match container hostname -if [ $(bash iobroker object get system.adapter.admin.0 --pretty | grep -oP '(?<="host": ")[^"]*') != $(hostname) ] && [ "$multihost" != "slave" ] -then +if [[ "$(bash iobroker object get system.adapter.admin.0 --pretty | grep -oP '(?<="host": ")[^"]*')" != "$(hostname)" && "$multihost" != "slave" ]]; then echo "Hostname in ioBroker does not match the hostname of this container." - echo -n "Updating hostname to " $(hostname)"... " - bash iobroker host $(iobroker object get system.adapter.admin.0 --pretty | grep -oP '(?<="host": ")[^"]*') + if [[ "$debug" == "true" ]]; then + echo "[DEBUG] Detected hostname in ioBroker: " $(bash iobroker object get system.adapter.admin.0 --pretty | grep -oP '(?<="host": ")[^"]*') + echo "[DEBUG] Detected hostname in container: " $(hostname) + fi + echo -n "Updating hostname to "$(hostname)"... " + bash iobroker host $(bash iobroker object get system.adapter.admin.0 --pretty | grep -oP '(?<="host": ")[^"]*') echo 'Done.' echo ' ' +elif [[ "$multihost" == "slave" ]]; then + echo "IOB_MULTIHOST ist set to \"slave\". Hostname check will be skipped." + echo ' ' +elif [[ "$(bash iobroker object get system.adapter.admin.0 --pretty | grep -oP '(?<="host": ")[^"]*')" = "$(hostname)" && "$multihost" != "slave" ]]; then + echo "Hostname in ioBroker matches the hostname of this container." + if [[ "$debug" == "true" ]]; then + echo "[DEBUG] Detected hostname in ioBroker: " $(bash iobroker object get system.adapter.admin.0 --pretty | grep -oP '(?<="host": ")[^"]*') + echo "[DEBUG] Detected hostname in container: " $(hostname) + fi + echo "No action required." + echo ' ' +else + if [[ "$debug" == "true" ]]; then + echo "[DEBUG] There was a problem checking the hostname." + echo "[DEBUG] Detected hostname in ioBroker: " $(bash iobroker object get system.adapter.admin.0 --pretty | grep -oP '(?<="host": ")[^"]*') + echo "[DEBUG] Detected hostname in container: " $(hostname) + fi fi ##### @@ -231,11 +261,12 @@ echo "For more information see ioBroker Docker Image Docs (https://docs.buanet.d echo ' ' # Checking ENV for Adminport -if [ "$adminport" != "" ] -then - if [ "$adminport" != $(bash iobroker object get system.adapter.admin.0 --pretty | grep -oP '(?<="port": )[^,]*') ] - then - echo "Adminport set by ENV does not match port configured in ioBroker installation." +if [[ "$adminport" != "" ]]; then + if [[ "$adminport" != "$(bash iobroker object get system.adapter.admin.0 --pretty | grep -oP '(?<="port": )[^,]*')" ]]; then + echo "IOB_ADMINPORT is set and does not match port configured in ioBroker." + if [[ "$debug" == "true" ]]; then + echo "[DEBUG] Detected Admin Port in ioBroker: " $(bash iobroker object get system.adapter.admin.0 --pretty | grep -oP '(?<="port": )[^,]*') + fi echo -n "Setting Adminport to \""$adminport"\"... " bash iobroker set admin.0 --port $adminport echo 'Done.' @@ -244,12 +275,10 @@ then fi # Checking ENV for AVAHI -if [ "$avahi" = "true" ] && [ "$offlinemode" = "true" ]; then - echo 'Avahi-daemon is activated by ENV but offline mode is activated!' - echo 'Skipping Avahi daemon setup.' -elif [ "$avahi" = "true" ]; then - echo 'Avahi-daemon is activated by ENV.' - echo "Running setup script..." +if [[ "$avahi" = "true" && "$offlinemode" = "true" ]]; then + echo 'AVAHI is \"true\", but OFFLINE_MODE is also \"true\". Skipping Avahi daemon setup.' +elif [[ "$avahi" = "true" ]]; then + echo 'AVAHI is \"true\". Running setup script...' chmod 755 /opt/scripts/setup_avahi.sh bash /opt/scripts/setup_avahi.sh echo 'Done.' @@ -257,12 +286,10 @@ elif [ "$avahi" = "true" ]; then fi # Checking ENV for Z-WAVE -if [ "$zwave" = "true" ] && [ "$offlinemode" = "true" ]; then - echo 'Z-Wave is activated by ENV but offline mode is activated!' - echo 'Skipping Z-Wave setup.' -elif [ "$zwave" = "true" ]; then - echo "Z-Wave is activated by ENV." - echo "Running setup script..." +if [[ "$zwave" = "true" && "$offlinemode" = "true" ]]; then + echo 'ZWAVE is \"true\", but OFFLINE_MODE is also \"true\". Skipping Z-Wave setup.' +elif [[ "$zwave" = "true" ]]; then + echo 'ZWAVE is \"true\". Running setup script...' chmod 755 /opt/scripts/setup_zwave.sh bash /opt/scripts/setup_zwave.sh echo 'Done.' @@ -270,8 +297,8 @@ elif [ "$zwave" = "true" ]; then fi # checking ENV for USBDEVICES -if [ "$usbdevices" != "" ] && [ "$usbdevices" != "none" ]; then - echo "Usb-device-support is activated by ENV." +if [[ "$usbdevices" != "" && "$usbdevices" != "none" ]]; then + echo 'USBDEVICES is set.' IFS=';' read -ra devicearray <<< "$usbdevices" for i in "${devicearray[@]}" do @@ -284,74 +311,60 @@ if [ "$usbdevices" != "" ] && [ "$usbdevices" != "none" ]; then fi # Checking ENV for multihost setup -if [ "$multihost" != "" ] -then - echo "Checking multihost setup..." +if [[ "$multihost" != "" ]]; then + echo "Checking for multihost settings..." # Configuring objects db host - if [ "$multihost" = "master" ] && [ "$objectsdbtype" = "" ] && [ "$objectsdbhost" = "" ] && [ "$objectsdbport" = "" ] - then - echo "Multihost is set as \"master\" by ENV and no external objects db is set." - echo -n "Setting host of objects db to \"0.0.0.0\" to allow external communication... " + if [[ "$multihost" = "master" && "$objectsdbtype" = "" && "$objectsdbhost" = "" && "$objectsdbport" = "" ]]; then + echo "IOB_MULTIHOST is set to \"master\" and no external objects db is set." + echo -n "Setting host of objects db to \"0.0.0.0\" to allow external connections... " jq --arg objectsdbhost "0.0.0.0" '.objects.host = $objectsdbhost' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json chown -R $setuid:$setgid /opt/iobroker/iobroker-data/iobroker.json && chmod 674 /opt/iobroker/iobroker-data/iobroker.json echo 'Done.' - elif [ "$multihost" = "master" ] && [ "$objectsdbhost" = "127.0.0.1" ] - then - echo "Multihost is set as \"master\" by ENV. But objects db host is set to \"127.0.0.1\" by ENV too." - echo "This configuration will not allow slaves to connect the objects db! Please change or remove ENV \"IOB_OBJECTSDB_HOST\" and start over!" + elif [[ "$multihost" = "master" && "$objectsdbhost" = "127.0.0.1" ]]; then + echo "IOB_MULTIHOST is set to \"master\", but IOB_OBJECTSDB_HOST is set to \"127.0.0.1\"." + echo "This configuration will not allow slaves to connect to objects db! Please change or remove \"IOB_OBJECTSDB_HOST\" and start over!" echo "For more information see ioBroker Docker Image Docs (https://docs.buanet.de/iobroker-docker-image/docs/)." exit 1 - elif [ "$multihost" = "master" ] && [ "$objectsdbtype" != "" ] && [ "$objectsdbhost" != "" ] && [ "$objectsdbport" != "" ] - then - echo "Multihost is set as \"master\" by ENV and external objects db is set." - elif ([ "$multihost" = "slave" ] && [ "$objectsdbtype" = "" ]) || ([ "$multihost" = "slave" ] && [ "$objectsdbhost" = "" ]) || ([ "$multihost" = "slave" ] && [ "$objectsdbport" = "" ]) - then - echo "Multihost is set as \"slave\" by ENV. But no external objects db is set." - echo "You have to configure ENVs \"IOB_OBJECTSDB_TYPE\", \"IOB_OBJECTSDB_HOST\" and \"IOB_OBJECTSDB_PORT\" to connect to a maser objects db." - echo "Please check your settings and start over." + elif [[ "$multihost" = "master" && "$objectsdbtype" != "" && "$objectsdbhost" != "" && "$objectsdbport" != "" ]]; then + echo "IOB_MULTIHOST is set to \"master\" and external objects db is set." + elif ([[ "$multihost" = "slave" && "$objectsdbtype" = "" ]]) || ([[ "$multihost" = "slave" && "$objectsdbhost" = "" ]]) || ([[ "$multihost" = "slave" && "$objectsdbport" = "" ]]); then + echo "IOB_MULTIHOST is set to \"slave\", but no external objects db is set." + echo "You have to configure ENVs \"IOB_OBJECTSDB_TYPE\", \"IOB_OBJECTSDB_HOST\" and \"IOB_OBJECTSDB_PORT\" to connect to a master objects db." + echo "Please check your settings and start over!" echo "For more information see ioBroker Docker Image Docs (https://docs.buanet.de/iobroker-docker-image/docs/)." exit 1 - elif [ "$multihost" = "slave" ] && [ "$objectsdbtype" != "" ] && [ "$objectsdbhost" != "" ] && [ "$objectsdbport" != "" ] - then - echo "Multihost is set as \"slave\" by ENV and external objects db is set." - elif [ "$multihost" != "" ] - then - echo "Multihost is set but it seems like some configuration is missing." + elif [[ "$multihost" = "slave" && "$objectsdbtype" != "" && "$objectsdbhost" != "" && "$objectsdbport" != "" ]]; then + echo "IOB_MULTIHOST is set to \"slave\" and external objects db is set." + elif [[ "$multihost" != "" ]]; then + echo "IOB_MULTIHOST is set, but it seems like some configuration is missing." echo "Please checke if you have configured the ENVs \"MULTIHOST\", \"IOB_OBJECTSDB_TYPE\", \"IOB_OBJECTSDB_HOST\" and \"IOB_OBJECTSDB_PORT\" correctly and start over." echo "For more information see ioBroker Docker Image Docs (https://docs.buanet.de/iobroker-docker-image/docs/)." exit 1 fi - # Configuring states db host - if [ "$multihost" = "master" ] && [ "$statesdbtype" = "" ] && [ "$statesdbhost" = "" ] && [ "$statesdbport" = "" ] - then - echo "Multihost is set as \"master\" by ENV and no external states db is set." - echo -n "Setting host of states db to \"0.0.0.0\" to allow external communication... " + if [[ "$multihost" = "master" && "$statesdbtype" = "" && "$statesdbhost" = "" && "$statesdbport" = "" ]]; then + echo "IOB_MULTIHOST is set to \"master\" and no external states db is set." + echo -n "Setting host of states db to \"0.0.0.0\" to allow external connections... " jq --arg statesdbhost "0.0.0.0" '.states.host = $statesdbhost' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json chown -R $setuid:$setgid /opt/iobroker/iobroker-data/iobroker.json && chmod 674 /opt/iobroker/iobroker-data/iobroker.json echo 'Done.' - elif [ "$multihost" = "master" ] && [ "$statesdbhost" = "127.0.0.1" ] - then - echo "Multihost is set as \"master\" by ENV. But states db host is set to \"127.0.0.1\" by ENV too." - echo "This configuration will not work! Please change or remove ENV \"IOB_STATESDB_HOST\" and start over!" + elif [[ "$multihost" = "master" && "$statesdbhost" = "127.0.0.1" ]]; then + echo "IOB_MULTIHOST is set to \"master\", but states db host is set to \"127.0.0.1\"." + echo "This configuration will not allow slaves to connect to objects db! Please change or remove \"IOB_STATESDB_HOST\" and start over!" echo "For more information see ioBroker Docker Image Docs (https://docs.buanet.de/iobroker-docker-image/docs/)." exit 1 - elif [ "$multihost" = "master" ] && [ "$statesdbtype" != "" ] && [ "$statesdbhost" != "" ] && [ "$statesdbport" != "" ] - then - echo "Multihost is set as \"master\" by ENV and external states db is set." - elif ([ "$multihost" = "slave" ] && [ "$statesdbtype" = "" ]) || ([ "$multihost" = "slave" ] && [ "$statesdbhost" = "" ]) || ([ "$multihost" = "slave" ] && [ "$statesdbport" = "" ]) - then - echo "Multihost is set as \"slave\" by ENV. But no external states db is set." + elif [[ "$multihost" = "master" && "$statesdbtype" != "" && "$statesdbhost" != "" && "$statesdbport" != "" ]]; then + echo "IOB_MULTIHOST is set to \"master\" and external states db is set." + elif ([[ "$multihost" = "slave" && "$statesdbtype" = "" ]]) || ([[ "$multihost" = "slave" && "$statesdbhost" = "" ]]) || ([[ "$multihost" = "slave" && "$statesdbport" = "" ]]); then + echo "IOB_MULTIHOST is set to \"slave\", but no external states db is set." echo "You have to configure ENVs \"IOB_STATESDB_TYPE\", \"IOB_STATESDB_HOST\" and \"IOB_STATESDB_PORT\" to connect to a maser states db." - echo "Please check your settings and start over." + echo "Please check your settings and start over!" echo "For more information see ioBroker Docker Image Docs (https://docs.buanet.de/iobroker-docker-image/docs/)." exit 1 - elif [ "$multihost" = "slave" ] && [ "$statesdbtype" != "" ] && [ "$statesdbhost" != "" ] && [ "$statesdbport" != "" ] - then - echo "Multihost is set as \"slave\" by ENV and external states db is set." - elif [ "$multihost" != "" ] - then - echo "Multihost is set but it seems like some configuration is missing." + elif [[ "$multihost" = "slave" && "$statesdbtype" != "" && "$statesdbhost" != "" && "$statesdbport" != "" ]]; then + echo "IOB_MULTIHOST is set to \"slave\" and external states db is set." + elif [[ "$multihost" != "" ]]; then + echo "IOB_MULTIHOST is set, but it seems like some configuration is missing." echo "Please checke if you have configured the ENVs \"MULTIHOST\", \"IOB_STATESDB_TYPE\", \"IOB_STATESDB_HOST\" and \"IOB_STATESTDB_PORT\" correctly and start over." echo "For more information see ioBroker Docker image Docs (https://docs.buanet.de/iobroker-docker-image/docs/)." exit 1 @@ -361,11 +374,9 @@ then fi # Checking ENVs for custom setup of objects db -if [ "$objectsdbtype" != "" ] || [ "$objectsdbhost" != "" ] || [ "$objectsdbport" != "" ] -then - echo "Checking custom settings for objects db..." - if [ "$objectsdbtype" != $(jq -r '.objects.type' /opt/iobroker/iobroker-data/iobroker.json) ] - then +if [[ "$objectsdbtype" != "" || "$objectsdbhost" != "" || "$objectsdbport" != "" ]]; then + echo "Checking for custom objects db settings ..." + if [[ "$objectsdbtype" != "$(jq -r '.objects.type' /opt/iobroker/iobroker-data/iobroker.json)" ]]; then echo "IOB_OBJECTSDB_TYPE is set and value is different from detected ioBroker installation." echo -n "Setting type of objects db to \""$objectsdbtype"\"... " jq --arg objectsdbtype "$objectsdbtype" '.objects.type = $objectsdbtype' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json @@ -374,8 +385,7 @@ then else echo "IOB_OBJECTSDB_TYPE is set and value meets detected ioBroker installation." fi - if [ "$objectsdbhost" != $(jq -r '.objects.host' /opt/iobroker/iobroker-data/iobroker.json) ] - then + if [[ "$objectsdbhost" != "$(jq -r '.objects.host' /opt/iobroker/iobroker-data/iobroker.json)" ]]; then echo "IOB_OBJECTSDB_HOST is set and value is different from detected ioBroker installation." echo -n "Setting host of objects db to \""$objectsdbhost"\"... " jq --arg objectsdbhost "$objectsdbhost" '.objects.host = $objectsdbhost' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json @@ -384,8 +394,7 @@ then else echo "IOB_OBJECTSDB_HOST is set and value meets detected ioBroker installation." fi - if [ "$objectsdbport" != $(jq -r '.objects.port' /opt/iobroker/iobroker-data/iobroker.json) ] - then + if [[ "$objectsdbport" != "$(jq -r '.objects.port' /opt/iobroker/iobroker-data/iobroker.json)" ]]; then echo "IOB_OBJECTSDB_PORT is set and value is different from detected ioBroker installation." echo -n "Setting port of objects db to \""$objectsdbport"\"... " jq --arg objectsdbport $objectsdbport '.objects.port = $objectsdbport' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json @@ -399,11 +408,9 @@ then fi # Checking ENVs for custom setup of states db -if [ "$statesdbtype" != "" ] || [ "$statesdbhost" != "" ] || [ "$statesdbport" != "" ] -then - echo "Checking custom settings for states db..." - if [ "$statesdbtype" != $(jq -r '.states.type' /opt/iobroker/iobroker-data/iobroker.json) ] - then +if [[ "$statesdbtype" != "" || "$statesdbhost" != "" || "$statesdbport" != "" ]]; then + echo "Checking for custom states db settings..." + if [[ "$statesdbtype" != "$(jq -r '.states.type' /opt/iobroker/iobroker-data/iobroker.json)" ]]; then echo "IOB_STATESDB_TYPE is set and value is different from detected ioBroker installation." echo -n "Setting type of states db to \""$statesdbtype"\"... " jq --arg statesdbtype "$statesdbtype" '.states.type = $statesdbtype' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json @@ -412,8 +419,7 @@ then else echo "IOB_STATESDB_TYPE is set and value meets detected ioBroker installation." fi - if [ "$statesdbhost" != $(jq -r '.states.host' /opt/iobroker/iobroker-data/iobroker.json) ] - then + if [[ "$statesdbhost" != "$(jq -r '.states.host' /opt/iobroker/iobroker-data/iobroker.json)" ]]; then echo "IOB_STATESDB_HOST is set and value is different from detected ioBroker installation." echo -n "Setting host of states db to \""$statesdbhost"\"... " jq --arg statesdbhost "$statesdbhost" '.states.host = $statesdbhost' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json @@ -422,8 +428,7 @@ then else echo "IOB_STATESDB_HOST is set and value meets detected ioBroker installation." fi - if [ "$statesdbport" != $(jq -r '.states.port' /opt/iobroker/iobroker-data/iobroker.json) ] - then + if [[ "$statesdbport" != "$(jq -r '.states.port' /opt/iobroker/iobroker-data/iobroker.json)" ]]; then echo "IOB_STATESDB_PORT is set and value is different from detected ioBroker installation." echo -n "Setting port of states db to \""$statesdbport"\"... " jq --arg statesdbport $statesdbport '.states.port = $statesdbport' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json @@ -437,18 +442,15 @@ then fi # Checking for Userscripts in /opt/userscripts -if [ `find /opt/userscripts -type f | wc -l` -lt 1 ] -then +if [[ `find /opt/userscripts -type f | wc -l` -lt 1 ]]; then echo -n "There is no data detected in /opt/userscripts. Restoring exapmple userscripts... " tar -xf /opt/initial_userscripts.tar -C / chmod 755 /opt/userscripts/userscript_firststart_example.sh chmod 755 /opt/userscripts/userscript_everystart_example.sh echo 'Done.' echo ' ' -elif [ -f /opt/userscripts/userscript_firststart.sh ] || [ -f /opt/userscripts/userscript_everystart.sh ] -then - if [ -f /opt/userscripts/userscript_firststart.sh ] && [ -f /opt/.firstrun ] - then +elif [[ -f /opt/userscripts/userscript_firststart.sh || -f /opt/userscripts/userscript_everystart.sh ]]; then + if [[ -f /opt/userscripts/userscript_firststart.sh && -f /opt/.firstrun ]]; then echo "Userscript for first start detected and this is the first start of a new container." echo "Running userscript_firststart.sh..." chmod 755 /opt/userscripts/userscript_firststart.sh @@ -456,8 +458,7 @@ then echo "Done." echo ' ' 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..." chmod 755 /opt/userscripts/userscript_everystart.sh bash /opt/userscripts/userscript_everystart.sh @@ -467,9 +468,8 @@ then fi # Removing first run marker when exists -if [ -f /opt/.firstrun ] -then -rm -f /opt/.firstrun +if [[ -f /opt/.firstrun ]]; then + rm -f /opt/.firstrun fi ##### @@ -481,6 +481,7 @@ echo "$(printf -- '-%.0s' {1..80})" echo ' ' echo "Starting ioBroker..." echo ' ' +echo "##### #### ### ## # iobroker.js-controller log output # ## ### #### #####" # Setting healthcheck status to "running" echo "running" > /opt/scripts/.docker_config/.healthcheck diff --git a/debian/scripts/maintenance.sh b/debian/scripts/maintenance.sh index a6c9788..13c6852 100644 --- a/debian/scripts/maintenance.sh +++ b/debian/scripts/maintenance.sh @@ -22,6 +22,7 @@ display_help() { echo ' on > switches mantenance mode ON' echo ' off > switches mantenance mode OFF and stops or restarts the container' echo ' upgrade > puts the container to maintenance mode and upgrades ioBroker' + echo ' restart > stops iobroker and stops or restarts the container' echo ' help > shows this help' echo '' echo 'OPTIONS' @@ -157,6 +158,33 @@ upgrade_jscontroller() { pkill -u root } +# restart container +restart_container() { + echo 'You are now going to call a restart of your container.' + echo 'Restarting will work depending on the configured restart policy.' + + if [[ "$autoconfirm" != yes ]]; then + local reply + + read -rp 'Do you want to continue [yes/no]? ' reply + if [[ "$reply" == y || "$reply" == Y || "$reply" == yes ]]; then + : # continue + else + return 1 + fi + else + echo 'This command was already confirmed by the -y or --yes option.' + fi + + echo -n 'Stopping ioBroker...' + stop_iob + + echo 'Container will be stopped or restarted in 5 seconds...' + sleep 5 + echo 'stopping' > "$healthcheck" + pkill -u root +} + # stop iobroker and wait until all processes stopped or pkill_timeout is reached stop_iob() { local status timeout @@ -211,6 +239,9 @@ for arg in "$@"; do upgrade) run=(upgrade_jscontroller) ;; + restart) + run=(restart_container) + ;; -y|--yes) autoconfirm=yes ;; diff --git a/debian/scripts/setup_packages.sh b/debian/scripts/setup_packages.sh index e547cc9..da1ca2f 100644 --- a/debian/scripts/setup_packages.sh +++ b/debian/scripts/setup_packages.sh @@ -23,13 +23,8 @@ else exit 1 fi -# Cleanup -apt-get autoclean -y -apt-get autoremove -apt-get clean -rm -rf /tmp/* /var/tmp/* -rm -rf /root/.cache/* -rm -rf /var/lib/apt/lists/* -rm -f /opt/scripts/.docker_config/.packages +# Silent Cleanup +apt-get -qq autoclean -y && apt-get -qq autoremove && apt-get -qq clean +rm -rf /tmp/* /var/tmp/* && rm -rf /root/.cache/* && rm -rf /var/lib/apt/lists/* && rm -f /opt/scripts/.docker_config/.packages exit 0 diff --git a/docs/README_docker_hub_buanet.md b/docs/README_docker_hub_buanet.md index f8ff613..84f49b3 100644 --- a/docs/README_docker_hub_buanet.md +++ b/docs/README_docker_hub_buanet.md @@ -110,6 +110,7 @@ You could use environment variables to auto configure your ioBroker container on ### Configure environment: +* `DEBUG` (optional, default: false) Set true to get extended logging messages on container startup * `LANG` (optional, default: de_DE.UTF‑8) The following locales are pre-generated: de_DE.UTF-8, en_US.UTF-8 * `LANGUAGE` (optional, default: de_DE:de) The following locales are pre-generated: de_DE:de, en_US:en * `LC_ALL` (optional, default: de_DE.UTF-8) The following locales are pre-generated: de_DE.UTF-8, en_US.UTF-8 diff --git a/docs/README_docker_hub_iobroker.md b/docs/README_docker_hub_iobroker.md index ef02725..4936209 100644 --- a/docs/README_docker_hub_iobroker.md +++ b/docs/README_docker_hub_iobroker.md @@ -111,6 +111,7 @@ You could use environment variables to auto configure your ioBroker container on ### Configure environment: +* `DEBUG` (optional, default: false) Set true to get extended logging messages on container startup * `LANG` (optional, default: de_DE.UTF‑8) The following locales are pre-generated: de_DE.UTF-8, en_US.UTF-8 * `LANGUAGE` (optional, default: de_DE:de) The following locales are pre-generated: de_DE:de, en_US:en * `LC_ALL` (optional, default: de_DE.UTF-8) The following locales are pre-generated: de_DE.UTF-8, en_US.UTF-8