From fd0ad9e5a09e23d21b806148430784f55b003ff8 Mon Sep 17 00:00:00 2001 From: buanet Date: Sun, 19 Feb 2023 19:05:39 +0100 Subject: [PATCH] v8.0.0-beta.1 --- .VERSION | 2 +- ...yml => build-debian-image-beta-node20.yml} | 20 +- .github/workflows/build-debian-image-beta.yml | 6 +- ....yml => build-debian-image-dev-node20.yml} | 16 +- .github/workflows/build-debian-image-dev.yml | 6 +- .vscode/settings.json | 5 + CHANGELOG.md | 10 + debian/node18/Dockerfile | 6 +- debian/scripts/iobroker_startup.sh | 322 +++++++--------- debian/scripts/maintenance.sh | 46 +++ debian/scripts/setup_iob_db.sh | 345 ++++++++++++++++++ 11 files changed, 576 insertions(+), 208 deletions(-) rename .github/workflows/{build-debian-image-beta-node18.yml => build-debian-image-beta-node20.yml} (86%) rename .github/workflows/{build-debian-image-dev-node18.yml => build-debian-image-dev-node20.yml} (88%) create mode 100644 .vscode/settings.json create mode 100644 debian/scripts/setup_iob_db.sh diff --git a/.VERSION b/.VERSION index 1a2bcd3..2c78386 100644 --- a/.VERSION +++ b/.VERSION @@ -1 +1 @@ -v7.2.0 \ No newline at end of file +v8.0.0-beta.1 \ No newline at end of file diff --git a/.github/workflows/build-debian-image-beta-node18.yml b/.github/workflows/build-debian-image-beta-node20.yml similarity index 86% rename from .github/workflows/build-debian-image-beta-node18.yml rename to .github/workflows/build-debian-image-beta-node20.yml index 3365745..8a4427e 100644 --- a/.github/workflows/build-debian-image-beta-node18.yml +++ b/.github/workflows/build-debian-image-beta-node20.yml @@ -1,5 +1,5 @@ # Github action to build Docker image from beta branch (tag: beta) -name: Build debian beta-node18 +name: Build debian beta-node20 on: release: @@ -7,7 +7,7 @@ on: workflow_dispatch: jobs: - build-beta-node18-image: + build-beta-node20-image: runs-on: ubuntu-latest steps: - name: Fetching latest prerelease tag @@ -35,8 +35,8 @@ jobs: sed -e "s/\${VERSION}/$VERSION/" -e "s/\${BUILD}/$DATI/" ./debian/scripts/iobroker_startup.sh > ./debian/scripts/iobroker_startup.tmp mv -f ./debian/scripts/iobroker_startup.tmp ./debian/scripts/iobroker_startup.sh # amd64 - sed -e "s/\${VERSION}/$VERSION/" -e "s/\${DATI}/$DATI/" ./debian/node18/Dockerfile > ./debian/node18/Dockerfile.tmp - mv -f ./debian/node18/Dockerfile.tmp ./debian/node18/Dockerfile + sed -e "s/\${VERSION}/$VERSION/" -e "s/\${DATI}/$DATI/" ./debian/node20/Dockerfile > ./debian/node20/Dockerfile.tmp + mv -f ./debian/node20/Dockerfile.tmp ./debian/node20/Dockerfile - name: Set up QEMU uses: docker/setup-qemu-action@v2.1.0 @@ -58,18 +58,18 @@ jobs: username: ${{ secrets.PACKAGES_USER }} password: ${{ secrets.PACKAGES_PASS }} - - name: Build Docker image (node18) + - name: Build Docker image (node20) uses: docker/build-push-action@v4.0.0 with: context: ./debian - file: ./debian/node18/Dockerfile + file: ./debian/node20/Dockerfile push: true platforms: linux/amd64,linux/arm/v7,linux/arm64/v8 tags: | - buanet/iobroker:beta-node18, - buanet/iobroker:${{ env.version }}-node18, - ghcr.io/buanet/iobroker:beta-node18, - ghcr.io/buanet/iobroker:${{ env.version }}-node18 + buanet/iobroker:beta-node20, + buanet/iobroker:${{ env.version }}-node20, + ghcr.io/buanet/iobroker:beta-node20, + ghcr.io/buanet/iobroker:${{ env.version }}-node20 - name: Delete untagged images from GitHub packages uses: actions/github-script@v6 diff --git a/.github/workflows/build-debian-image-beta.yml b/.github/workflows/build-debian-image-beta.yml index 69ac5df..bd88537 100644 --- a/.github/workflows/build-debian-image-beta.yml +++ b/.github/workflows/build-debian-image-beta.yml @@ -35,8 +35,8 @@ jobs: sed -e "s/\${VERSION}/$VERSION/" -e "s/\${BUILD}/$DATI/" ./debian/scripts/iobroker_startup.sh > ./debian/scripts/iobroker_startup.tmp mv -f ./debian/scripts/iobroker_startup.tmp ./debian/scripts/iobroker_startup.sh # amd64 - sed -e "s/\${VERSION}/$VERSION/" -e "s/\${DATI}/$DATI/" ./debian/node16/Dockerfile > ./debian/node16/Dockerfile.tmp - mv -f ./debian/node16/Dockerfile.tmp ./debian/node16/Dockerfile + sed -e "s/\${VERSION}/$VERSION/" -e "s/\${DATI}/$DATI/" ./debian/node18/Dockerfile > ./debian/node18/Dockerfile.tmp + mv -f ./debian/node18/Dockerfile.tmp ./debian/node18/Dockerfile - name: Set up QEMU uses: docker/setup-qemu-action@v2.1.0 @@ -62,7 +62,7 @@ jobs: uses: docker/build-push-action@v4.0.0 with: context: ./debian - file: ./debian/node16/Dockerfile + file: ./debian/node18/Dockerfile push: true platforms: linux/amd64,linux/arm/v7,linux/arm64/v8 tags: | diff --git a/.github/workflows/build-debian-image-dev-node18.yml b/.github/workflows/build-debian-image-dev-node20.yml similarity index 88% rename from .github/workflows/build-debian-image-dev-node18.yml rename to .github/workflows/build-debian-image-dev-node20.yml index 0388c08..55919dd 100644 --- a/.github/workflows/build-debian-image-dev-node18.yml +++ b/.github/workflows/build-debian-image-dev-node20.yml @@ -1,11 +1,11 @@ # Github action to build Docker image from dev branch (tag: dev) -name: Build debian dev-node18 +name: Build debian dev-node20 on: workflow_dispatch: jobs: - build-dev-node18-image: + build-dev-node20-image: runs-on: ubuntu-latest steps: - name: Checkout repo @@ -29,8 +29,8 @@ jobs: sed -e "s/\${VERSION}/$VERSION-dev/" -e "s/\${BUILD}/$DATI/" ./debian/scripts/iobroker_startup.sh > ./debian/scripts/iobroker_startup.tmp mv -f ./debian/scripts/iobroker_startup.tmp ./debian/scripts/iobroker_startup.sh # amd64 - sed -e "s/\${VERSION}/$VERSION-dev/" -e "s/\${DATI}/$DATI/" ./debian/node18/Dockerfile > ./debian/node18/Dockerfile.tmp - mv -f ./debian/node18/Dockerfile.tmp ./debian/node18/Dockerfile + sed -e "s/\${VERSION}/$VERSION-dev/" -e "s/\${DATI}/$DATI/" ./debian/node20/Dockerfile > ./debian/node20/Dockerfile.tmp + mv -f ./debian/node20/Dockerfile.tmp ./debian/node20/Dockerfile - name: Set up QEMU uses: docker/setup-qemu-action@v2.1.0 @@ -52,16 +52,16 @@ jobs: username: ${{ secrets.PACKAGES_USER }} password: ${{ secrets.PACKAGES_PASS }} - - name: Build Docker image (node18) + - name: Build Docker image (node20) uses: docker/build-push-action@v4.0.0 with: context: ./debian - file: ./debian/node18/Dockerfile + file: ./debian/node20/Dockerfile push: true platforms: linux/amd64,linux/arm/v7,linux/arm64/v8 tags: | - buanet/iobroker:dev-node18, - ghcr.io/buanet/iobroker:dev-node18 + buanet/iobroker:dev-node20, + ghcr.io/buanet/iobroker:dev-node20 - name: Delete untagged images from GitHub packages uses: actions/github-script@v6 diff --git a/.github/workflows/build-debian-image-dev.yml b/.github/workflows/build-debian-image-dev.yml index eeeb50f..07553fb 100644 --- a/.github/workflows/build-debian-image-dev.yml +++ b/.github/workflows/build-debian-image-dev.yml @@ -29,8 +29,8 @@ jobs: sed -e "s/\${VERSION}/$VERSION-dev/" -e "s/\${BUILD}/$DATI/" ./debian/scripts/iobroker_startup.sh > ./debian/scripts/iobroker_startup.tmp mv -f ./debian/scripts/iobroker_startup.tmp ./debian/scripts/iobroker_startup.sh # amd64 - sed -e "s/\${VERSION}/$VERSION-dev/" -e "s/\${DATI}/$DATI/" ./debian/node16/Dockerfile > ./debian/node16/Dockerfile.tmp - mv -f ./debian/node16/Dockerfile.tmp ./debian/node16/Dockerfile + sed -e "s/\${VERSION}/$VERSION-dev/" -e "s/\${DATI}/$DATI/" ./debian/node18/Dockerfile > ./debian/node18/Dockerfile.tmp + mv -f ./debian/node18/Dockerfile.tmp ./debian/node18/Dockerfile - name: Set up QEMU uses: docker/setup-qemu-action@v2.1.0 @@ -56,7 +56,7 @@ jobs: uses: docker/build-push-action@v4.0.0 with: context: ./debian - file: ./debian/node16/Dockerfile + file: ./debian/node18/Dockerfile push: true platforms: linux/amd64,linux/arm/v7,linux/arm64/v8 tags: | diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..8ef1e9b --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "cSpell.enableFiletypes": [ + "shellscript" + ] +} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 9ec037f..7651ad1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,14 @@ ## Changelog +### v8.0.0-beta.1 (coming soon) +* upgrade node version to recommended node18 +* rewrite of multihost setup handling +* rewrite of custom objects and states db setup handling +* extend logging and error handling +* add volume instruction to dockerfile +* add support for password protected custom objects and states db ([#306](https://github.com/buanet/ioBroker.docker/issues/306)) +* add restore command to maintenance script +* add database connection check at startup +* remove initial restore feature ### v7.2.0 (12.12.2022) * update docs diff --git a/debian/node18/Dockerfile b/debian/node18/Dockerfile index 61130a7..1fa9724 100644 --- a/debian/node18/Dockerfile +++ b/debian/node18/Dockerfile @@ -52,11 +52,12 @@ RUN chmod 777 /opt/scripts/ \ RUN mkdir -p /opt/scripts/.docker_config/ \ && echo "starting" > /opt/scripts/.docker_config/.healthcheck \ && echo "${VERSION}" > /opt/scripts/.docker_config/.thisisdocker \ - && echo $(hostname) > /opt/.firstrun \ + && echo "ture" > /opt/.first_run \ # Run installer && curl -sL https://iobroker.net/install.sh | bash - \ # Deleting UUID from build && iobroker unsetup -y \ + && echo "ture" > /opt/iobroker/.fresh_install \ # Backup initial ioBroker and userscript folder && tar -cf /opt/initial_iobroker.tar /opt/iobroker \ && tar -cf /opt/initial_userscripts.tar /opt/userscripts \ @@ -94,5 +95,8 @@ WORKDIR /opt/iobroker/ HEALTHCHECK --interval=15s --timeout=5s --retries=5 \ CMD ["/bin/bash", "-c", "/opt/scripts/healthcheck.sh"] +# Volumes for persistent data +VOLUME ["/opt/iobroker"] + # Run startup-script ENTRYPOINT ["/bin/bash", "-c", "/opt/scripts/iobroker_startup.sh"] diff --git a/debian/scripts/iobroker_startup.sh b/debian/scripts/iobroker_startup.sh index cbaa92a..5688021 100644 --- a/debian/scripts/iobroker_startup.sh +++ b/debian/scripts/iobroker_startup.sh @@ -17,6 +17,8 @@ offlinemode=$OFFLINE_MODE objectsdbhost=$IOB_OBJECTSDB_HOST objectsdbport=$IOB_OBJECTSDB_PORT objectsdbtype=$IOB_OBJECTSDB_TYPE +objectsdbname=$IOB_OBJECTSDB_NAME # new for sentinel support +objectsdbpass=$IOB_OBJECTSDB_PASS # new for auth support packages=$PACKAGES permissioncheck=$PERMISSION_CHECK setgid=$SETGID @@ -24,6 +26,8 @@ setuid=$SETUID statesdbhost=$IOB_STATESDB_HOST statesdbport=$IOB_STATESDB_PORT statesdbtype=$IOB_STATESDB_TYPE +statesdbname=$IOB_STATESDB_NAME # new for sentinel support +statesdbpass=$IOB_STATESDB_PASS # new for auth support usbdevices=$USBDEVICES zwave=$ZWAVE set -u @@ -42,7 +46,7 @@ stop_on_error() { else echo ' ' echo "This Script will exit now." - exit 1 + exit 1 fi } @@ -84,12 +88,16 @@ if [[ "$avahi" != "" ]]; then echo -n "----- " && echo -n "$( if [[ "$debug" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" DEBUG: $debug)" && echo " -----"; fi if [[ "$backitup" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_BACKITUP_EXTDB: $backitup)" && echo " -----"; fi if [[ "$multihost" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_MULTIHOST: $multihost)" && echo " -----"; fi +if [[ "$objectsdbtype" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_OBJECTSDB_TYPE: $objectsdbtype)" && 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 [[ "$objectsdbname" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_OBJECTSDB_NAME: $objectsdbname)" && echo " -----"; fi +if [[ "$objectsdbpass" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_OBJECTSDB_PASS: $objectsdbpass)" && echo " -----"; fi +if [[ "$statesdbtype" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_STATESDB_TYPE: $statesdbtype)" && 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 [[ "$statesdbname" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_STATESDB_NAME: $statesdbname)" && echo " -----"; fi +if [[ "$statesdbpass" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_STATESDB_PASS: $statesdbpass)" && 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 [[ "$permissioncheck" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" PERMISSION_CHECK: $permissioncheck)" && echo " -----"; fi @@ -100,7 +108,7 @@ if [[ "$zwave" != "" ]]; then echo -n "----- " && echo -n "$( echo "$(printf -- '-%.0s' {1..80})" echo ' ' -# Debug loggin notice +# Debug logging notice if [[ "$debug" == "true" ]]; then echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" echo "!!!! DEBUG LOG ACTIVE !!!!" @@ -117,12 +125,12 @@ fi # STEP 1 - Preparing container ##### echo "$(printf -- '-%.0s' {1..80})" -echo "----- Step 1 of 5: Preparing container -----" +echo "----- Step 1 of 5: Preparing container -----" echo "$(printf -- '-%.0s' {1..80})" echo ' ' # Actions running on first start only -if [[ -f /opt/.firstrun ]]; then +if [[ -f /opt/.first_run ]]; then # Updating Linux packages if [[ "$offlinemode" = "true" ]]; then echo "OFFLINE_MODE is \"true\". Skipping Linux package updates on first run." @@ -159,7 +167,7 @@ fi # Setting UID and/ or GID 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 "SETUID and/ or SETGID are set to custom values." echo -n "Changing UID to "$setuid" and GID to "$setgid"... " usermod -u $setuid iobroker groupmod -og $setgid iobroker @@ -186,43 +194,29 @@ if [[ `find /opt/iobroker -type f | wc -l` -lt 1 ]]; 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 / - mkdir /opt/iobroker/backups - mv /opt/*.tar.gz /opt/iobroker/backups/ - # fixing permission errors during restore - chown -R $setuid:$setgid /opt/iobroker - echo 'Done.' - echo -n "Restoring ioBroker... " - bash iobroker restore 0 > /opt/iobroker/log/restore.log 2>&1 - echo 'Done.' - echo ' ' - echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" - echo "!!!! IMPORTANT NOTE !!!!" - echo "!!!! The startup script restored iobroker from a backup file. !!!!" - echo "!!!! Check /opt/iobroker/log/restore.log to see if restore was successful. !!!!" - echo "!!!! When ioBroker now starts it will reinstall all Adapters automatically. !!!!" - echo "!!!! This might be take a looooong time! Please be patient! !!!!" - echo "!!!! You can view installation process by taking a look at ioBroker log. !!!!" - echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" - fi + echo "IoBroker backup file detected in /opt/iobroker." + if [[ "$debug" == "true" ]]; then echo "[DEBUG] Backup file name: " $(ls *_backupiobroker.tar.gz); fi + echo "Since Docker Image v8, automatic initial restore is no longer supported!" + echo "IoBroker will start with a fresh installation, while your backup file will be copied into the backup directory." + echo "You will be able to restore your backup file manually by using the backitup adapter or the containers maintenance script." + echo "For more information see ioBroker Docker Image Docs (https://docs.buanet.de/iobroker-docker-image/docs/)." + echo ' ' + echo -n "Copying backup file and restoring initial ioBroker installation... " + mv /opt/iobroker/*.tar.gz /opt/ + tar -xf /opt/initial_iobroker.tar -C / + mkdir /opt/iobroker/backups + mv /opt/*.tar.gz /opt/iobroker/backups/ + # fixing permission errors during restore + chown -R $setuid:$setgid /opt/iobroker + echo 'Done.' 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." + echo "There is data detected in /opt/iobroker but it looks like it is no instance of ioBroker!" if [[ "$debug" == "true" ]]; then echo "[DEBUG] Detected files:" ls -al fi - exit 1 + echo "Please check/ recreate mounted folder or volume and try again." + stop_on_error fi echo ' ' @@ -237,14 +231,13 @@ echo ' ' # (Re)Setting permissions to "/opt/iobroker" and "/opt/scripts" if [[ "$permissioncheck" == "false" ]]; then echo "PERMISSION_CHECK is set to false. Use this at your own risk!" - echo ' ' else 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 ' ' fi +echo ' ' # Backing up original iobroker-file and changing sudo to gosu echo -n "Fixing \"sudo-bug\" by replacing sudo with gosu... " @@ -254,9 +247,108 @@ echo -n "Fixing \"sudo-bug\" by replacing sudo with gosu... " echo 'Done.' echo ' ' +# Checking multihost and db setup +if [[ "$multihost" == "master" || "$multihost" == "slave" ]]; then + # multihost enabled + if [[ "$multihost" == "master" ]]; then + set +e + bash /opt/scripts/setup_iob_db.sh -master + return=$? + set -e + if [[ "$return" -ne 0 ]]; then stop_on_error; fi + elif [[ "$multihost" == "slave" ]]; then + set +e + bash /opt/scripts/setup_iob_db.sh -slave + return=$? + set -e + if [[ "$return" -ne 0 ]]; then stop_on_error; fi + fi +elif [[ "$multihost" == "" || "$multihost" == "false" ]]; then + # no multihost, only debug output + if [[ "$debug" == "true" ]]; then + echo "[DEBUG] Checking multihost settings... " + echo "[DEBUG] No multihost settings detected." + echo "[DEBUG] Done." + echo ' ' + fi + # checking custom objects db settings + if [[ "$objectsdbtype" != "" || "$objectsdbhost" != "" || "$objectsdbport" != "" ]]; then + set +e + bash /opt/scripts/setup_iob_db.sh -objectsdb + return=$? + set -e + if [[ "$return" -ne 0 ]]; then stop_on_error; fi + else + #no custom objects db settings, only debug output + if [[ "$debug" == "true" ]]; then + echo "[DEBUG] Checking custom objects db settings... " + echo "[DEBUG] No custom objects db settings detected." + echo "[DEBUG] Done." + echo ' ' + fi + fi + # checking custom states db settings + if [[ "$statesdbtype" != "" || "$statesdbhost" != "" || "$statesdbport" != "" ]]; then + set +e + bash /opt/scripts/setup_iob_db.sh -statesdb + return=$? + set -e + if [[ "$return" -ne 0 ]]; then stop_on_error; fi + else + #no custom states db settings, only debug output + if [[ "$debug" == "true" ]]; then + echo "[DEBUG] Checking custom states db settings... " + echo "[DEBUG] No custom states db settings detected." + echo "[DEBUG] Done." + echo ' ' + fi + fi +else + echo "IOB_MULTIHOST is set, but the value is not valid. Please check your configuration." + if [[ "$debug" == "true" ]]; then echo "[DEBUG] IOB_MULTIHOST = "$multihost; fi + echo "For more information see ioBroker Docker Image Docs (https://docs.buanet.de/iobroker-docker-image/docs/#environment-variables-env)." + stop_on_error +fi + +# if restored a fresh install, runing "iob setup first" for database init, otherwise check database connection +if [[ -f /opt/iobroker/.fresh_install ]]; then + echo -n "Initializing a fresh installation of ioBroker... " + set +e + bash iob setup first > /opt/iobroker/log/iob_setup_first.log 2>&1 + return=$? + set -e + rm -f /opt/iobroker/.fresh_install + if [[ "$return" -ne 0 ]]; then + echo "Failed." + echo "For more details see \"/opt/iobroker/log/iob_setup_first.log\"." + echo "Please check your configuration and try again." + stop_on_error + fi + echo 'Done.' + echo ' ' +else + echo -n "Checking Database connection... " + set +e + if iob uuid &> /dev/null; then + echo 'Done.' + echo ' ' + else + errormsg=$(iob uuid 2>&1 | sed 's/^/[DEBUG] /') + echo "Failed." + if [[ "$debug" == "true" ]]; then + echo "[DEBUG] Error message: " + echo "$errormsg" + fi + echo "Please check your configuration and try again." + echo "For more information see ioBroker Docker Image Docs (https://docs.buanet.de/iobroker-docker-image/docs)." + stop_on_error + fi + set -e +fi + # hostname check if [[ "$multihost" == "slave" ]]; then - echo "IOB_MULTIHOST ist set to \"slave\". Hostname check will be skipped." + echo "IOB_MULTIHOST is set to \"slave\". Hostname check will be skipped." echo ' ' else # get admin instance and hostname @@ -269,7 +361,7 @@ else if [[ "$debug" == "true" ]]; then echo "[DEBUG] Detected admin hostname is:" $adminhostname; fi else echo "There was a problem detecting the admin instance of your iobroker." - echo "Make sure the ioBroker installation you use has an admin instance or start over with a fresh installation and restore your configuration." + echo "Make sure the ioBroker installation you use has an admin instance or try again with a fresh installation and restore your configuration." echo "For more details see https://docs.buanet.de/iobroker-docker-image/docs/#restore" stop_on_error fi @@ -399,137 +491,6 @@ if [[ "$usbdevices" != "" && "$usbdevices" != "none" ]]; then echo ' ' fi -# Checking ENV for multihost setup -if [[ "$multihost" != "" ]]; then - echo "Checking for multihost settings... " - # Configuring objects db host - 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 "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 "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 "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 "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 "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 "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 "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 "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 - fi - echo 'Done.' - echo ' ' -fi - -# Checking ENVs for custom setup of objects db -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 - chown -R $setuid:$setgid /opt/iobroker/iobroker-data/iobroker.json && chmod 674 /opt/iobroker/iobroker-data/iobroker.json - echo 'Done.' - 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 - 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 - chown -R $setuid:$setgid /opt/iobroker/iobroker-data/iobroker.json && chmod 674 /opt/iobroker/iobroker-data/iobroker.json - echo 'Done.' - 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 - 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 - chown -R $setuid:$setgid /opt/iobroker/iobroker-data/iobroker.json && chmod 674 /opt/iobroker/iobroker-data/iobroker.json - echo 'Done.' - else - echo "IOB_OBJECTSDB_PORT is set and value meets detected ioBroker installation." - fi - echo 'Done.' - echo ' ' -fi - -# Checking ENVs for custom setup of states db -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 - chown -R $setuid:$setgid /opt/iobroker/iobroker-data/iobroker.json && chmod 674 /opt/iobroker/iobroker-data/iobroker.json - echo 'Done.' - 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 - 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 - chown -R $setuid:$setgid /opt/iobroker/iobroker-data/iobroker.json && chmod 674 /opt/iobroker/iobroker-data/iobroker.json - echo 'Done.' - 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 - 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 - chown -R $setuid:$setgid /opt/iobroker/iobroker-data/iobroker.json && chmod 674 /opt/iobroker/iobroker-data/iobroker.json - echo 'Done.' - else - echo "IOB_STATESDB_PORT is set and value meets detected ioBroker installation." - fi - echo 'Done.' - echo ' ' -fi - # Checking for Userscripts in /opt/userscripts if [[ `find /opt/userscripts -type f | wc -l` -lt 1 ]]; then echo -n "There is no data detected in /opt/userscripts. Restoring exapmple userscripts... " @@ -537,29 +498,26 @@ if [[ `find /opt/userscripts -type f | wc -l` -lt 1 ]]; then 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 + if [[ -f /opt/userscripts/userscript_firststart.sh && -f /opt/.first_run ]]; 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 bash /opt/userscripts/userscript_firststart.sh echo 'Done.' - echo ' ' fi 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 echo 'Done.' - echo ' ' fi fi +echo ' ' -# Removing first run marker when exists -if [[ -f /opt/.firstrun ]]; then - rm -f /opt/.firstrun -fi +# Removing first run an fresh install markers when exists +if [[ -f /opt/.first_run ]]; then rm -f /opt/.first_run; fi +if [[ -f /opt/iobroker/.fresh_install ]]; then rm -f /opt/iobroker/.fresh_install; fi ##### # STEP 5 - Starting ioBroker diff --git a/debian/scripts/maintenance.sh b/debian/scripts/maintenance.sh index c2b4a62..95222ab 100644 --- a/debian/scripts/maintenance.sh +++ b/debian/scripts/maintenance.sh @@ -23,6 +23,7 @@ display_help() { 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 ' restore > stops iobroker and restores the last backup' echo ' help > shows this help' echo '' echo 'OPTIONS' @@ -217,6 +218,48 @@ restart_container() { pkill -u root } +# restore iobroker +restore_iobroker() { + echo 'You are now going to perform a restore of your iobroker.' + + 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 + + # fixing permission errors during restore + #chown -R $setuid:$setgid /opt/iobroker/backup + + echo -n "Restoring ioBroker... " + bash iobroker restore 0 > /opt/iobroker/log/restore.log 2>&1 + echo 'Done.' + echo ' ' + echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" + echo "!!!! IMPORTANT NOTE !!!!" + echo "!!!! The maintenance script restored iobroker from a backup file. !!!!" + echo "!!!! Check /opt/iobroker/log/restore.log to see if restore was successful. !!!!" + echo "!!!! When ioBroker starts it will reinstall all Adapters automatically. !!!!" + echo "!!!! This might be take a looooong time! Please be patient! !!!!" + echo "!!!! You can view installation process by taking a look at ioBroker log. !!!!" + echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" + sleep 10 + echo 'Container will be stopped or restarted in 5 seconds...' + sleep 5 + echo 'stopping' > "$healthcheck" + pkill -u root +} + # parsing commands and options # default command to run unless another was given @@ -242,6 +285,9 @@ for arg in "$@"; do restart|rest|r) run=(restart_container) ;; + restore) + run=(restore_iobroker) + ;; -y|--yes) autoconfirm=yes ;; diff --git a/debian/scripts/setup_iob_db.sh b/debian/scripts/setup_iob_db.sh new file mode 100644 index 0000000..faa0e20 --- /dev/null +++ b/debian/scripts/setup_iob_db.sh @@ -0,0 +1,345 @@ +#!/bin/bash + +# reading env +debug=$DEBUG +objectsdbhost=$IOB_OBJECTSDB_HOST +objectsdbport=$IOB_OBJECTSDB_PORT +objectsdbtype=$IOB_OBJECTSDB_TYPE +objectsdbname=$IOB_OBJECTSDB_NAME # new for sentinel support +objectsdbpass=$IOB_OBJECTSDB_PASS # new for auth support +setgid=$SETGID +setuid=$SETUID +statesdbhost=$IOB_STATESDB_HOST +statesdbport=$IOB_STATESDB_PORT +statesdbtype=$IOB_STATESDB_TYPE +statesdbname=$IOB_STATESDB_NAME # new for sentinel support +statesdbpass=$IOB_STATESDB_PASS # new for auth support + +# functions +write_iobroker_json() { + 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 +} +set_objectsdb_type() { + if [[ "$objectsdbtype" != "$(jq -r '.objects.type' /opt/iobroker/iobroker-data/iobroker.json)" ]]; then + echo "IOB_OBJECTSDB_TYPE is available but value is different from detected ioBroker installation." + echo -n "Setting type of objects db to \"""$objectsdbtype""\"... " + jq --arg value "$objectsdbtype" '.objects.type = $value' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo 'Done.' + else + echo "IOB_OBJECTSDB_TYPE is available and value meets detected ioBroker installation." + fi +} +set_objectsdb_host() { + if [[ $objectsdbhost == *","* ]]; then + if [[ "$(jq -c -n --arg value $objectsdbhost '$value|split(",")')" != "$(jq -r '.objects.host' /opt/iobroker/iobroker-data/iobroker.json)" ]]; then + echo "IOB_OBJECTSDB_HOST is available but value is different from detected ioBroker installation." + echo -n "Setting host of objects db to \"""$objectsdbhost""\"... " + jq --arg value "$objectsdbhost" '.objects.host = ($value|split(","))' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo 'Done.' + else + echo "IOB_OBJECTSDB_HOST is available and value meets detected ioBroker installation." + fi + if [[ $objectsdbname != "" ]]; then + if [[ "$objectsdbname" != "$(jq -r '.objects.sentinelName' /opt/iobroker/iobroker-data/iobroker.json)" ]]; then + echo "IOB_OBJECTSDB_NAME is available but value is different from detected ioBroker installation." + echo -n "Setting name of objects db to \"""$objectsdbname""\"... " + jq --arg value "$objectsdbname" '.objects.sentinelName = $value' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo 'Done.' + else + echo "IOB_OBJECTSDB_NAME is available and value meets detected ioBroker installation." + fi + else + if [[ "$(jq -r '.objects.sentinelName' /opt/iobroker/iobroker-data/iobroker.json)" != "mymaster" ]]; then + echo "IOB_OBJECTSDB_NAME is not available. Using default value \"mymaster\" instead." + echo -n "Setting name of objects db to \"mymaster\"... " + jq --arg value "mymaster" '.objects.sentinelName = $value' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo 'Done.' + else + echo "IOB_OBJECTSDB_NAME is not available but default value \"mymaster\" meets detected ioBroker installation.." + fi + fi + else + if [[ "$objectsdbhost" != "$(jq -r '.objects.host' /opt/iobroker/iobroker-data/iobroker.json)" ]]; then + echo "IOB_OBJECTSDB_HOST is available but value is different from detected ioBroker installation." + echo -n "Setting host of objects db to \"""$objectsdbhost""\"... " + jq --arg value "$objectsdbhost" '.objects.host = $value' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo 'Done.' + else + echo "IOB_OBJECTSDB_HOST is available and value meets detected ioBroker installation." + fi + fi +} +set_objectsdb_port() { + if [[ $objectsdbport == *","* ]]; then + if [[ "$(jq -c -n --arg value $objectsdbport '$value|split(",")')" != "$(jq -r '.objects.port' /opt/iobroker/iobroker-data/iobroker.json)" ]]; then + echo "IOB_OBJECTSDB_PORT is available but value is different from detected ioBroker installation." + echo -n "Setting port of objects db to \"""$objectsdbport""\"... " + jq --arg value "$objectsdbport" '.objects.port = ($value|split(","))' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo 'Done.' + else + echo "IOB_OBJECTSDB_PORT is available and value meets detected ioBroker installation." + fi + else + if [[ "$objectsdbport" != "$(jq -r '.objects.port' /opt/iobroker/iobroker-data/iobroker.json)" ]]; then + echo "IOB_OBJECTSDB_PORT is available but value is different from detected ioBroker installation." + echo -n "Setting port of objects db to \"""$objectsdbport""\"... " + jq --arg value "$objectsdbport" '.objects.port = $value' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo 'Done.' + else + echo "IOB_OBJECTSDB_PORT is available and value meets detected ioBroker installation." + fi + fi +} +set_objectsdb_pass() { + if [[ "$objectsdbpass" != "$(jq -r '.objects.options.auth_pass' /opt/iobroker/iobroker-data/iobroker.json)" ]]; then + echo "IOB_OBJECTSDB_PASS is available but value is different from detected ioBroker installation." + echo -n "Setting password of objects db to \"""$objectsdbpass""\"... " + jq --arg value "$objectsdbpass" '.objects.options.auth_pass = $value' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo 'Done.' + else + echo "IOB_OBJECTSDB_PASS is available and value meets detected ioBroker installation." + fi +} +set_statesdb_type() { + if [[ "$statesdbtype" != "$(jq -r '.states.type' /opt/iobroker/iobroker-data/iobroker.json)" ]]; then + echo "IOB_STATESDB_TYPE is available but value is different from detected ioBroker installation." + echo -n "Setting type of states db to \"""$statesdbtype""\"... " + jq --arg value "$statesdbtype" '.states.type = $value' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo 'Done.' + else + echo "IOB_STATESDB_TYPE is available and value meets detected ioBroker installation." + fi +} +set_statesdb_host() { + if [[ $statesdbhost == *","* ]]; then + if [[ "$(jq -c -n --arg parm $statesdbhost '$parm|split(",")')" != "$(jq -r '.states.host' /opt/iobroker/iobroker-data/iobroker.json)" ]]; then + echo "IOB_STATESDB_HOST is available but value is different from detected ioBroker installation." + echo -n "Setting host of states db to \"""$statesdbhost""\"... " + jq --arg value "$statesdbhost" '.states.host = ($value|split(","))' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo 'Done.' + else + echo "IOB_STATESDB_HOST is available and value meets detected ioBroker installation." + fi + if [[ $statesdbname != "" ]]; then + if [[ "$statesdbname" != "$(jq -r '.states.sentinelName' /opt/iobroker/iobroker-data/iobroker.json)" ]]; then + echo "IOB_STATESDB_NAME is available but value is different from detected ioBroker installation." + echo -n "Setting name of states db to \"""$statesdbname""\"... " + jq --arg value "$statesdbname" '.states.sentinelName = $value' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo 'Done.' + else + echo "IOB_STATESDB_NAME is available and value meets detected ioBroker installation." + fi + else + if [[ "$(jq -r '.states.sentinelName' /opt/iobroker/iobroker-data/iobroker.json)" != "mymaster" ]]; then + echo "IOB_STATESDB_NAME is not available. Using default value \"mymaster\" instead." + echo -n "Setting name of states db to \"mymaster\"... " + jq --arg value "mymaster" '.states.sentinelName = $value' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo 'Done.' + else + echo "IOB_STATESDB_NAME is not available but default value \"mymaster\" meets detected ioBroker installation.." + fi + fi + else + if [[ "$statesdbhost" != "$(jq -r '.states.host' /opt/iobroker/iobroker-data/iobroker.json)" ]]; then + echo "IOB_STATESDB_HOST is available but value is different from detected ioBroker installation." + echo -n "Setting host of states db to \"""$statesdbhost""\"... " + jq --arg value "$statesdbhost" '.states.host = $value' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo 'Done.' + else + echo "IOB_STATESDB_HOST is available and value meets detected ioBroker installation." + fi + fi +} +set_statesdb_port() { + if [[ $statesdbport == *","* ]]; then + if [[ "$(jq -c -n --arg value $statesdbport '$value|split(",")')" != "$(jq -r '.states.port' /opt/iobroker/iobroker-data/iobroker.json)" ]]; then + echo "IOB_STATESDB_PORT is available but value is different from detected ioBroker installation." + echo -n "Setting port of states db to \"""$statesdbport""\"... " + jq --arg value "$statesdbport" '.states.port = ($value|split(","))' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo 'Done.' + else + echo "IOB_STATESDB_PORT is available and value meets detected ioBroker installation." + fi + else + if [[ "$statesdbport" != "$(jq -r '.states.port' /opt/iobroker/iobroker-data/iobroker.json)" ]]; then + echo "IOB_STATESDB_PORT is available but value is different from detected ioBroker installation." + echo -n "Setting port of states db to \"""$statesdbport""\"... " + jq --arg value "$statesdbport" '.states.port = $value' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo 'Done.' + else + echo "IOB_STATESDB_PORT is available and value meets detected ioBroker installation." + fi + fi +} +set_statesdb_pass() { + if [[ "$statesdbpass" != "$(jq -r '.states.options.auth_pass' /opt/iobroker/iobroker-data/iobroker.json)" ]]; then + echo "IOB_STATESDB_PASS is available but value is different from detected ioBroker installation." + echo -n "Setting password of states db to \"""$statesdbpass""\"... " + jq --arg value "$statesdbpass" '.states.options.auth_pass = $value' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo 'Done.' + else + echo "IOB_STATESDB_PASS is available and value meets detected ioBroker installation." + fi +} +config_error_output() { + echo ' ' + echo "Something went wrong. Looks like at least one parameter defining the custom db connection was not set properly or is missing." + echo "Please check your configuration and try again." + echo "For more information see ioBroker Docker Image Docs (https://docs.buanet.de/iobroker-docker-image/docs/)." +} + +# parameter check +if [[ "$1" == "-master" ]]; then # setup master + echo "IOB_MULTIHOST is available and set to \"master\"." + echo 'Done.' + echo ' ' + # multihost objects db + if [[ "$objectsdbtype" != "" && "$objectsdbhost" != "" && "$objectsdbport" != "" ]]; then + echo "Configuring custom objects db..." + set_objectsdb_type + set_objectsdb_host + set_objectsdb_port + if [[ "$objectsdbpass" != "" ]]; then set_objectsdb_pass; fi + echo 'Done.' + echo ' ' + elif [[ "$objectsdbtype" == "" && "$objectsdbhost" == "" && "$objectsdbport" == "" ]]; then + echo "No custom objects db is set." + if [[ "$(jq -r '.objects.host' /opt/iobroker/iobroker-data/iobroker.json)" != "0.0.0.0" ]]; then + echo -n "Configuring default objects db to accept external connections... " + jq --arg value "0.0.0.0" '.objects.host = $value' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo 'Done.' + else + echo "Default objects db is accepting external connections." + fi + else + if [[ "$debug" == "true" ]]; then + echo "[DEBUG] IOB_OBJECTSDB_TYPE = ""$objectsdbtype" + echo "[DEBUG] IOB_OBJECTSDB_HOST = ""$objectsdbhost" + echo "[DEBUG] IOB_OBJECTSDB_PORT = ""$objectsdbport" + fi + config_error_output + exit 1 + fi + # multihost states db + if [[ "$statesdbtype" != "" && "$statesdbhost" != "" && "$statesdbport" != "" ]]; then + echo "Configuring custom states db..." + set_statesdb_type + set_statesdb_host + set_statesdb_port + if [[ "$statesdbpass" != "" ]]; then set_statesdb_pass; fi + echo 'Done.' + echo ' ' + elif [[ "$statesdbtype" == "" && "$statesdbhost" == "" && "$statesdbport" == "" ]]; then + echo "No custom states db is set." + if [[ "$(jq -r '.states.host' /opt/iobroker/iobroker-data/iobroker.json)" != "0.0.0.0" ]]; then + echo -n "Configuring default states db to accept external connections... " + jq --arg value "0.0.0.0" '.states.host = $value' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo 'Done.' + else + echo "Default states db is accepting external connections." + fi + else + if [[ "$debug" == "true" ]]; then + echo "[DEBUG] IOB_STATESDB_TYPE = ""$statesdbtype" + echo "[DEBUG] IOB_STATESDB_HOST = ""$statesdbhost" + echo "[DEBUG] IOB_STATESDB_PORT = ""$statesdbport" + fi + config_error_output + exit 1 + fi +elif [[ "$1" == "-slave" ]]; then # setup slave + echo "IOB_MULTIHOST is available and set to \"slave\"." + echo 'Done.' + echo ' ' + # multihost slave objects db connection + if [[ "$objectsdbtype" != "" && "$objectsdbhost" != "" && "$objectsdbport" != "" ]]; then + echo "Configuring objects db connection..." + set_objectsdb_type + set_objectsdb_host + set_objectsdb_port + if [[ "$objectsdbpass" != "" ]]; then set_objectsdb_pass; fi + echo 'Done.' + echo ' ' + else + if [[ "$debug" == "true" ]]; then + echo "[DEBUG] IOB_OBJECTSDB_TYPE = ""$objectsdbtype" + echo "[DEBUG] IOB_OBJECTSDB_HOST = ""$objectsdbhost" + echo "[DEBUG] IOB_OBJECTSDB_PORT = ""$objectsdbport" + fi + config_error_output + exit 1 + fi + # multihost slave states db connection + if [[ "$statesdbtype" != "" && "$statesdbhost" != "" && "$statesdbport" != "" ]]; then + echo "Configuring states db connection..." + set_statesdb_type + set_statesdb_host + set_statesdb_port + if [[ "$statesdbpass" != "" ]]; then set_statesdb_pass; fi + echo 'Done.' + echo ' ' + else + if [[ "$debug" == "true" ]]; then + echo "[DEBUG] IOB_STATESDB_TYPE = ""$statesdbtype" + echo "[DEBUG] IOB_STATESDB_HOST = ""$statesdbhost" + echo "[DEBUG] IOB_STATESDB_PORT = ""$statesdbport" + fi + config_error_output + exit 1 + fi +elif [[ "$1" == "-objectsdb" ]]; then # setup objects db standalone + if [[ "$objectsdbtype" != "" && "$objectsdbhost" != "" && "$objectsdbport" != "" ]]; then + echo "Configuring custom objects db..." + set_objectsdb_type + set_objectsdb_host + set_objectsdb_port + if [[ "$objectsdbpass" != "" ]]; then set_objectsdb_pass; fi + echo 'Done.' + echo ' ' + else + if [[ "$debug" == "true" ]]; then + echo "[DEBUG] IOB_OBJECTSDB_TYPE = ""$objectsdbtype" + echo "[DEBUG] IOB_OBJECTSDB_HOST = ""$objectsdbhost" + echo "[DEBUG] IOB_OBJECTSDB_PORT = ""$objectsdbport" + fi + config_error_output + exit 1 + fi +elif [[ "$1" == "-statesdb" ]]; then # setup states db standalone + if [[ "$statesdbtype" != "" && "$statesdbhost" != "" && "$statesdbport" != "" ]]; then + echo "Configuring custom states db..." + set_statesdb_type + set_statesdb_host + set_statesdb_port + if [[ "$statesdbpass" != "" ]]; then set_statesdb_pass; fi + echo 'Done.' + echo ' ' + else + if [[ "$debug" == "true" ]]; then + echo "[DEBUG] IOB_STATESDB_TYPE = ""$statesdbtype" + echo "[DEBUG] IOB_STATESDB_HOST = ""$statesdbhost" + echo "[DEBUG] IOB_STATESDB_PORT = ""$statesdbport" + fi + config_error_output + exit 1 + fi +fi