diff --git a/.VERSION b/.VERSION index 83be1c0..aac3eaf 100644 --- a/.VERSION +++ b/.VERSION @@ -1 +1 @@ -v9.1.0-beta.3 \ No newline at end of file +v9.1.0-beta.4 \ No newline at end of file diff --git a/.github/workflows/build-debian12-beta.yml b/.github/workflows/build-debian12-beta.yml index c49a940..0ce29bf 100644 --- a/.github/workflows/build-debian12-beta.yml +++ b/.github/workflows/build-debian12-beta.yml @@ -158,29 +158,3 @@ jobs: ghcr.io/buanet/iobroker:${{ env.version }}-node${{ vars.EXPERIMENTAL_NODE_VERSION }} provenance: false outputs: type=image,name=target,annotation-index.org.opencontainers.image.description=Official Docker image for ioBroker smarthome software (https://www.iobroker.net) - - delete-untagged-images: - if: ${{ always() }} - needs: [build-with-recommended-node, build-with-experimental-node] - name: Delete untagged images from GitHub Container Registry - runs-on: ubuntu-latest - steps: - - name: Delete images - uses: actions/github-script@v7.0.1 - with: - github-token: ${{ secrets.PACKAGES_PASS }} - script: | - const response = await github.request("GET /users/${{ env.OWNER }}/packages/container/${{ env.PACKAGE_NAME }}/versions", - { per_page: ${{ env.PER_PAGE }} - }); - for(version of response.data) { - if (version.metadata.container.tags.length == 0) { - console.log("delete " + version.id) - const deleteResponse = await github.request("DELETE /user/packages/container/${{ env.PACKAGE_NAME }}/versions/" + version.id, { }); - console.log("status " + deleteResponse.status) - } - } - env: - OWNER: buanet - PACKAGE_NAME: iobroker - PER_PAGE: 100 diff --git a/.github/workflows/build-debian12-dev.yml b/.github/workflows/build-debian12-dev.yml index 6c9f49a..319d16d 100644 --- a/.github/workflows/build-debian12-dev.yml +++ b/.github/workflows/build-debian12-dev.yml @@ -142,29 +142,3 @@ jobs: tags: | buanet/iobroker:dev-node${{ vars.EXPERIMENTAL_NODE_VERSION }}, ghcr.io/buanet/iobroker:dev-node${{ vars.EXPERIMENTAL_NODE_VERSION }} - -# delete-untagged-images: -# if: ${{ always() }} -# needs: [build-with-recommended-node, build-with-experimental-node] -# name: Delete untagged images from GitHub Container Registry -# runs-on: ubuntu-latest -# steps: -# - name: Delete images -# uses: actions/github-script@v7.0.1 -# with: -# github-token: ${{ secrets.PACKAGES_PASS }} -# script: | -# const response = await github.request("GET /users/${{ env.OWNER }}/packages/container/${{ env.PACKAGE_NAME }}/versions", -# { per_page: ${{ env.PER_PAGE }} -# }); -# for(version of response.data) { -# if (version.metadata.container.tags.length == 0) { -# console.log("delete " + version.id) -# const deleteResponse = await github.request("DELETE /user/packages/container/${{ env.PACKAGE_NAME }}/versions/" + version.id, { }); -# console.log("status " + deleteResponse.status) -# } -# } -# env: -# OWNER: buanet -# PACKAGE_NAME: iobroker -# PER_PAGE: 100 diff --git a/.github/workflows/build-debian12-latest.yml b/.github/workflows/build-debian12-latest.yml index a5ff93b..873d411 100644 --- a/.github/workflows/build-debian12-latest.yml +++ b/.github/workflows/build-debian12-latest.yml @@ -148,29 +148,3 @@ jobs: iobroker/iobroker:${{ env.version }}, provenance: false outputs: type=image,name=target,annotation-index.org.opencontainers.image.description=Official Docker image for ioBroker smarthome software (https://www.iobroker.net) - - delete-untagged-images: - if: ${{ always() }} - needs: [build-latest-for-buanet, build-latest-for-iobroker] - name: Delete untagged images from GitHub Container Registry - runs-on: ubuntu-latest - steps: - - name: Delete images - uses: actions/github-script@v7.0.1 - with: - github-token: ${{ secrets.PACKAGES_PASS }} - script: | - const response = await github.request("GET /users/${{ env.OWNER }}/packages/container/${{ env.PACKAGE_NAME }}/versions", - { per_page: ${{ env.PER_PAGE }} - }); - for(version of response.data) { - if (version.metadata.container.tags.length == 0) { - console.log("delete " + version.id) - const deleteResponse = await github.request("DELETE /user/packages/container/${{ env.PACKAGE_NAME }}/versions/" + version.id, { }); - console.log("status " + deleteResponse.status) - } - } - env: - OWNER: buanet - PACKAGE_NAME: iobroker - PER_PAGE: 100 diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f290c4..5e81e40 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,14 @@ ## Changelog -### v9.1.0-beta.3 (23.11.2023) -* add --force to restore in maintenance script -* improve shebang in scripts for downgrade and portability +### v9.1.0-beta.4 (08.01.2023) +* add trap for debugging mode ([#421](https://github.com/buanet/ioBroker.docker/issues/421)) +* fix ownership of userscripts ([#423 by @EugenMayer](https://github.com/buanet/ioBroker.docker/pull/423)) +* add strict mode to healthcheck.sh ([#424 by @EugenMayer](https://github.com/buanet/ioBroker.docker/pull/424)) +* fixes for ci process and dockerfile +* remove deprecated files from repo +* v9.1.0-beta.3 (23.11.2023) + * add --force to restore in maintenance script + * improve shebang in scripts for downgrade and portability * v9.1.0-beta.2 (06.11.2023) * enhance logging/ fix typos * add env PACKAGES_UPDATE and remove automatic package updates on first container start diff --git a/debian11/node16/Dockerfile b/debian11/node16/Dockerfile deleted file mode 100644 index 32323ae..0000000 --- a/debian11/node16/Dockerfile +++ /dev/null @@ -1,98 +0,0 @@ -FROM debian:bullseye-slim - -LABEL org.opencontainers.image.title="Official ioBroker Docker Image" \ - org.opencontainers.image.description="Officical Docker image for ioBroker smarthome software (https://www.iobroker.net)" \ - org.opencontainers.image.documentation="https://github.com/buanet/ioBroker.docker#readme" \ - org.opencontainers.image.authors="André Germann " \ - org.opencontainers.image.url="https://github.com/buanet/ioBroker.docker" \ - org.opencontainers.image.source="https://github.com/buanet/ioBroker.docker" \ - org.opencontainers.image.base.name="docker.io/library/debian:bullseye-slim" \ - org.opencontainers.image.version="${VERSION}" \ - org.opencontainers.image.created="${DATI}" - -ENV DEBIAN_FRONTEND noninteractive - -# Install prerequisites (including node) and generating locales -RUN apt-get update && apt-get install -y \ - apt-utils \ - cifs-utils \ - curl \ - gosu \ - iputils-ping \ - jq \ - locales \ - nfs-common \ - procps \ - python3 \ - python3-dev \ - sudo \ - tar \ - tzdata \ - udev \ - wget \ - # Install node - && curl -sL https://deb.nodesource.com/setup_16.x | bash \ - && apt-get update && apt-get install -y nodejs \ - # Install node-gyp - && npm install -g node-gyp \ - # Generating locales - && sed -i 's/^# *\(de_DE.UTF-8\)/\1/' /etc/locale.gen \ - && sed -i 's/^# *\(en_US.UTF-8\)/\1/' /etc/locale.gen \ - && locale-gen - -# Create directorys and copy scripts -COPY scripts /opt/scripts -COPY userscripts /opt/userscripts -RUN chmod 777 /opt/scripts/ \ - && chmod 777 /opt/userscripts/ \ - && chmod +x /opt/scripts/*.sh \ - && chmod +x /opt/userscripts/*.sh - -# Prepare and install ioBroker -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 \ - # Run installer - && curl -sL https://iobroker.net/install.sh | bash - \ - # Deleting UUID from build - && iobroker unsetup -y \ - # Backup initial ioBroker and userscript folder - && tar -cf /opt/initial_iobroker.tar /opt/iobroker \ - && tar -cf /opt/initial_userscripts.tar /opt/userscripts \ - # Setting up iobroker-user (shell, home dir and rights) - && chsh -s /bin/bash iobroker \ - && usermod --home /opt/iobroker iobroker \ - && usermod -u 1000 iobroker \ - && groupmod -g 1000 iobroker \ - && chown root:iobroker /usr/sbin/gosu \ - && chmod +s /usr/sbin/gosu \ - # Clean up installation cache - && apt-get autoclean -y \ - && apt-get autoremove \ - && apt-get clean \ - && rm -rf /tmp/* /var/tmp/* \ - && rm -rf /root/.cache/* /root/.npm/* \ - && rm -rf /var/lib/apt/lists/* - -# Setting up default ENVs -ENV DEBIAN_FRONTEND="teletype" \ - LANG="de_DE.UTF-8" \ - LANGUAGE="de_DE:de" \ - LC_ALL="de_DE.UTF-8" \ - SETGID=1000 \ - SETUID=1000 \ - TZ="Europe/Berlin" - -# Expose default admin ui port -EXPOSE 8081 - -# Change work dir -WORKDIR /opt/iobroker/ - -# Healthcheck -HEALTHCHECK --interval=15s --timeout=5s --retries=5 \ - CMD ["/bin/bash", "-c", "/opt/scripts/healthcheck.sh"] - -# Run startup-script -ENTRYPOINT ["/bin/bash", "-c", "/opt/scripts/iobroker_startup.sh"] diff --git a/debian11/node18/Dockerfile b/debian11/node18/Dockerfile deleted file mode 100644 index 3435eac..0000000 --- a/debian11/node18/Dockerfile +++ /dev/null @@ -1,102 +0,0 @@ -FROM debian:bullseye-slim - -LABEL org.opencontainers.image.title="Official ioBroker Docker Image" \ - org.opencontainers.image.description="Official Docker image for ioBroker smarthome software (https://www.iobroker.net)" \ - org.opencontainers.image.documentation="https://github.com/buanet/ioBroker.docker#readme" \ - org.opencontainers.image.authors="André Germann " \ - org.opencontainers.image.url="https://github.com/buanet/ioBroker.docker" \ - org.opencontainers.image.source="https://github.com/buanet/ioBroker.docker" \ - org.opencontainers.image.base.name="docker.io/library/debian:bullseye-slim" \ - org.opencontainers.image.version="${VERSION}" \ - org.opencontainers.image.created="${DATI}" - -ENV DEBIAN_FRONTEND noninteractive - -# Copy scripts -COPY scripts /opt/scripts -COPY userscripts /opt/userscripts - -# Install prerequisites (including node) and generating locales -RUN apt-get update && apt-get install -y \ - apt-utils \ - cifs-utils \ - curl \ - gosu \ - iputils-ping \ - jq \ - locales \ - nfs-common \ - procps \ - python3 \ - python3-dev \ - sudo \ - tar \ - tzdata \ - udev \ - wget \ - # Install node - && curl -sL https://deb.nodesource.com/setup_18.x | bash \ - && apt-get update && apt-get install -y nodejs \ - # Install node-gyp - && npm install -g node-gyp \ - # Generating locales - && sed -i 's/^# *\(de_DE.UTF-8\)/\1/' /etc/locale.gen \ - && sed -i 's/^# *\(en_US.UTF-8\)/\1/' /etc/locale.gen \ - && locale-gen \ - # Change permissions for scripts - && chmod 777 /opt/scripts/ \ - && chmod 777 /opt/userscripts/ \ - && chmod +x /opt/scripts/*.sh \ - && chmod +x /opt/userscripts/*.sh \ - # Prepare - && mkdir -p /opt/scripts/.docker_config/ \ - && echo "starting" > /opt/scripts/.docker_config/.healthcheck \ - && echo "${VERSION}" > /opt/scripts/.docker_config/.thisisdocker \ - && echo "true" > /opt/.first_run \ - # Run installer - && curl -sL https://iobroker.net/install.sh | bash - \ - # Deleting UUID from build - && iobroker unsetup -y \ - && echo "true" > /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 \ - # Setting up iobroker-user (shell, home dir and rights) - && chsh -s /bin/bash iobroker \ - && usermod --home /opt/iobroker iobroker \ - && usermod -u 1000 iobroker \ - && groupmod -g 1000 iobroker \ - && chown root:iobroker /usr/sbin/gosu \ - && chmod +s /usr/sbin/gosu \ - # Clean up installation cache - && apt-get autoclean -y \ - && apt-get autoremove \ - && apt-get clean \ - && rm -rf /tmp/* /var/tmp/* \ - && rm -rf /root/.cache/* /root/.npm/* \ - && rm -rf /var/lib/apt/lists/* - -# Setting up default ENVs -ENV DEBIAN_FRONTEND="teletype" \ - LANG="de_DE.UTF-8" \ - LANGUAGE="de_DE:de" \ - LC_ALL="de_DE.UTF-8" \ - SETGID=1000 \ - SETUID=1000 \ - TZ="Europe/Berlin" - -# Expose default admin ui port -EXPOSE 8081 - -# Change work dir -WORKDIR /opt/iobroker/ - -# Healthcheck -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/debian11/scripts/healthcheck.sh b/debian11/scripts/healthcheck.sh deleted file mode 100644 index d55d1f4..0000000 --- a/debian11/scripts/healthcheck.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash - -# Script checks health of running container - -if [ "$(cat /opt/scripts/.docker_config/.healthcheck)" == "starting" ] -then - echo "Health status: OK - Startup script is still running." - exit 0 -elif [ "$(cat /opt/scripts/.docker_config/.healthcheck)" == "maintenance" ] -then - echo "Health status: OK - Container is running in maintenance mode." - exit 0 -elif [ "$(ps -fe|grep "[i]obroker.js-controller"|awk '{print $2}')" != "" ] -then - echo "Health status: OK - Main process (js-controller) is running." - exit 0 -fi - -echo "Health status: !!! NOT OK !!! - Something went wrong. Please see container logs for more details and/or try restarting the container." -exit 1 diff --git a/debian11/scripts/iobroker_startup.sh b/debian11/scripts/iobroker_startup.sh deleted file mode 100644 index 3131964..0000000 --- a/debian11/scripts/iobroker_startup.sh +++ /dev/null @@ -1,581 +0,0 @@ -#!/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 -backitup=$IOB_BACKITUP_EXTDB -debug=$DEBUG -multihost=$IOB_MULTIHOST -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 -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 - -pkill_timeout=10 # timeout for iobroker shutdown in seconds - -# Stop on error function -stop_on_error() { - if [[ "$debug" == "true" ]]; then - echo " " - echo "[DEBUG] Debug mode prevents the container from exiting on errors." - echo "[DEBUG] This enables you to investigate or fix your issue on the command line." - echo "[DEBUG] If you want to stop or restart your container you have to do it manually." - echo "[DEBUG] IoBroker is not running!" - tail -f /dev/null - else - echo " " - echo "This Script will exit now." - exit 1 - fi -} - -# Getting date and time for logging -dati=$(date '+%Y-%m-%d %H:%M:%S') - -# Logging header -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 "----- ██╗ ██████╗ ██████╗ ██████╗ ██████╗ ██╗ ██╗ ███████╗ ██████╗ -----" -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 "----- 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 "----- Version Information -----" -echo -n "----- " && echo -n "$(printf "%-20s %-28s" image: "${VERSION}")" && echo " -----" -echo -n "----- " && echo -n "$(printf "%-20s %-28s" build: "${BUILD}")" && echo " -----" -echo -n "----- " && echo -n "$(printf "%-20s %-28s" node: "$(node -v)")" && echo " -----" -echo -n "----- " && echo -n "$(printf "%-20s %-28s" npm: "$(npm -v)")" && echo " -----" -echo "----- -----" -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 [[ "$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 [[ "$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: "***")" && 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 [[ "$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: "***")" && 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 -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 " " - -# Debug logging notice -if [[ "$debug" == "true" ]]; then - echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" - echo "!!!! DEBUG LOG ACTIVE !!!!" - echo "!!!! Environment variable DEBUG is set to true. !!!!" - echo "!!!! This will extend the logging output and may slow down container start. !!!!" - echo "!!!! Please make sure to deactivate if no longer needed. !!!!" - echo "!!!! For more information see ioBroker Docker image documentation: !!!!" - echo "!!!! https://docs.buanet.de/iobroker-docker-image/docs/ !!!!" - echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" - echo " " -fi - -##### -# STEP 1 - Preparing container -##### -echo "$(printf -- '-%.0s' {1..80})" -echo "----- Step 1 of 5: Preparing container -----" -echo "$(printf -- '-%.0s' {1..80})" -echo " " - -# Actions running on first start only -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." - else - bash /opt/scripts/setup_packages.sh -update - fi - echo " " - # Installing packages from ENV - if [[ "$packages" != "" && "$offlinemode" = "true" ]]; then - echo "PACKAGES is set, but OFFLINE_MODE is \"true\". Skipping Linux package installation." - elif [[ "$packages" != "" ]]; then - echo "PACKAGES is set. Installing the following additional Linux packages: ""$packages" - bash /opt/scripts/setup_packages.sh -install - fi - echo " " - # Register maintenance script - echo -n "Registering maintenance script as command... " - echo "alias maintenance='/opt/scripts/maintenance.sh'" >> /etc/bash.bashrc - echo "alias maint='/opt/scripts/maintenance.sh'" >> /etc/bash.bashrc - echo "alias m='/opt/scripts/maintenance.sh'" >> /etc/bash.bashrc - echo "Done." -else - echo "This is not the first run of this container. Skipping first run preparation." -fi -echo " " - -# 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 custom values." - echo -n "Changing UID to \"""$setuid""\" and GID to \"""$setgid""\"... " - usermod -u "$setuid" iobroker - groupmod -og "$setgid" iobroker - echo "Done." - echo " " -fi - -# Change directory for next steps -cd /opt/iobroker - -##### -# STEP 2 - Detecting ioBroker-Installation -##### -echo "$(printf -- '-%.0s' {1..80})" -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 - 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 - 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!" - if [[ "$debug" == "true" ]]; then - echo "[DEBUG] Detected files:" - ls -al - fi - echo "Please check/ recreate mounted folder or volume and try again." - stop_on_error -fi -echo " " - -##### -# STEP 3 - Checking ioBroker-Installation -##### -echo "$(printf -- '-%.0s' {1..80})" -echo "----- Step 3 of 5: Checking ioBroker installation -----" -echo "$(printf -- '-%.0s' {1..80})" -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!" -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." -fi -echo " " - -# Backing up original iobroker-file and changing sudo to 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 -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, running "iob setup first" for database init (but not on slaves!), otherwise check database connection -if [[ -f /opt/iobroker/.fresh_install && "$multihost" != "slave" ]]; 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 is set to \"slave\". Hostname check will be skipped." - echo " " -else - # get admin instance and hostname - set +e - admininstance=$(bash iobroker list instances | grep 'enabled' | grep -m 1 -o 'system.adapter.admin..') - set -e - if [[ "$admininstance" != "" ]]; then - if [[ "$debug" == "true" ]]; then echo "[DEBUG] Detected admin instance is:" "$admininstance"; fi - adminhostname=$(bash iobroker object get "$admininstance" --pretty | grep -oP '(?<="host": ")[^"]*') - if [[ "$debug" == "true" ]]; then echo "[DEBUG] Detected admin hostname is:" "$adminhostname"; fi - else - set +e - admininstance=$(bash iobroker list instances | grep 'disabled' | grep -m 1 -o 'system.adapter.admin..') - set -e - if [[ "$admininstance" != "" ]]; then - if [[ "$debug" == "true" ]]; then echo "[DEBUG] Detected admin instance is disabled."; fi - if [[ "$debug" == "true" ]]; then echo "[DEBUG] Detected admin instance is:" "$admininstance"; fi - adminhostname=$(bash iobroker object get "$admininstance" --pretty | grep -oP '(?<="host": ")[^"]*') - 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 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 - fi - # check hostname - if [[ "$adminhostname" != "" && "$adminhostname" != "$(hostname)" ]]; then - echo "Hostname in ioBroker does not match the hostname of this container." - echo -n "Updating hostname to \"""$(hostname)""\"... " - bash iobroker host "$adminhostname" - echo "Done." - echo " " - elif [[ "$adminhostname" = "$(hostname)" ]]; then - echo "Hostname in ioBroker matches the hostname of this container." - echo "No action required." - echo " " - else - echo "There was a problem checking the hostname." - stop_on_error - fi -fi - -# extended debug output -if [[ "$debug" == "true" && "$multihost" != "slave" ]]; then - echo "[DEBUG] Collecting some more ioBroker debug information... " - echo " " - # get information and send to array - IFS=$'\n' - instances_array=("$(iob list instances)") - repos_array=("$(iob repo list)") - updates_array=("$(iob update)") - # list iob instances - echo "[DEBUG] ##### iobroker list instances #####" - for i in "${instances_array[@]}" - do - echo "$i" - done - echo " " - echo "[DEBUG] ##### iobroker repo list #####" - for i in "${repos_array[@]}" - do - echo "$i" - done - echo " " - echo "[DEBUG] ##### iobroker update #####" - for i in "${updates_array[@]}" - do - echo "$i" - done - echo " " - unset IFS -fi - -##### -# STEP 4 - Setting up special sessting for ioBroker-adapters -##### -echo "$(printf -- '-%.0s' {1..80})" -echo "----- Step 4 of 5: Applying special settings -----" -echo "$(printf -- '-%.0s' {1..80})" -echo " " - -echo "Some adapters have special requirements/ settings which can be activated by the use of environment variables." -echo "For more information see ioBroker Docker Image Docs (https://docs.buanet.de/iobroker-docker-image/docs/)." -echo " " - -# Checking ENV for Adminport -if [[ "$adminport" != "" && "$multihost" != "slave" ]]; then - adminportold=$(bash iobroker object get "$admininstance" --pretty | grep -oP '(?<="port": )[^,]*') - admininstanceshort=$(echo "$admininstance" | grep -m 1 -o 'admin..') - if [[ "$adminport" != "$adminportold" ]]; 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: " "$adminportold"; fi - echo "Setting Adminport to \"""$adminport""\"... " - bash iobroker set "$admininstanceshort" --port "$adminport" - echo "Done." - echo " " - fi -fi - -# Checking ENV for Backitup (external database backups) -if [[ "$backitup" == "true" ]]; then - echo -n "IOB_BACKITUP_EXTDB is \"true\". Unlocking features..." - echo "true" > /opt/scripts/.docker_config/.backitup - echo "Done." - echo " " -fi - -# Checking ENV for AVAHI -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." - echo " " -fi - -# Checking ENV for Z-WAVE -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." - echo " " -fi - -# checking ENV for USBDEVICES -if [[ "$usbdevices" != "" && "$usbdevices" != "none" ]]; then - echo "USBDEVICES is set." - IFS=';' read -ra devicearray <<< "$usbdevices" - for i in "${devicearray[@]}" - do - if [[ -e "$i" ]]; then - echo -n "Setting permissions for \"""$i""\"... " - chown root:dialout "$i" - chmod g+rw "$i" - echo "Done." - if [[ "$debug" == "true" ]]; then echo "[DEBUG] Permissions set: " "$(ls -al "$i")"; fi - else - echo "Looks like the device \"""$i""\" does not exist." - echo "Did you mount it correctly by using the \"--device\" option?" - echo "For more information see ioBroker Docker Image Docs (https://docs.buanet.de/iobroker-docker-image/docs/#mounting-usb-devices)." - stop_on_error - fi - 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... " - 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." -elif [[ -f /opt/userscripts/userscript_firststart.sh || -f /opt/userscripts/userscript_everystart.sh ]]; 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." - 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." - fi -fi -echo " " - -# 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 -##### -echo "$(printf -- '-%.0s' {1..80})" -echo "----- Step 5 of 5: ioBroker startup -----" -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 - -# Function for graceful shutdown by SIGTERM signal -shut_down() { - echo " " - echo "Recived termination signal (SIGTERM)." - echo "Shutting down ioBroker... " - - local status timeout - - timeout="$(date --date="now + ""$pkill_timeout"" sec" +%s)" - pkill -u iobroker -f iobroker.js-controller - status=$? - if (( status >= 2 )); then # syntax error or fatal error - return 1 - fi - - if (( status == 1 )); then # no processes matched - return - fi - - # pgrep exits with status 1 when there are no matches - while pgrep -u iobroker > /dev/null; (( $? != 1 )); do - if (($(date +%s) > timeout)); then - echo -e "\nTimeout reached. Killing remaining processes... " - pkill --signal SIGKILL -u iobroker - echo "Done. Have a nice day!" - exit - fi - - echo -n "." - sleep 1 - done - - echo -e '\nDone. Have a nice day!' - exit -} - -# Trap to get signal for graceful shutdown -trap 'shut_down' SIGTERM - -# IoBroker start -gosu iobroker node node_modules/iobroker.js-controller/controller.js & wait - -# Fallback process for keeping container running when ioBroker is stopped for maintenance (e.g. js-controller update) -tail -f /dev/null diff --git a/debian11/scripts/maintenance.sh b/debian11/scripts/maintenance.sh deleted file mode 100644 index c0ab532..0000000 --- a/debian11/scripts/maintenance.sh +++ /dev/null @@ -1,312 +0,0 @@ -#!/usr/bin/env bash - -# bash strict mode -set -euo pipefail - -autoconfirm= # can be set to 'yes' by command line option -killbyname= # can be set to 'yes' by command line option (undocumented, only for use with backitup restore scripts) -healthcheck=/opt/scripts/.docker_config/.healthcheck # path of healthcheck file -pkill_timeout=10 # timeout for stopping iobroker in seconds - -# display help text -display_help() { - echo "This script helps you manage your ioBroker container!" - echo " " - echo "Usage: maintenance [ COMMAND ] [ OPTION ]" - echo " maint [ COMMAND ] [ OPTION ]" - echo " m [ COMMAND ] [ OPTION ]" - echo " " - echo "COMMANDS" - echo "------------------" - echo " status > reports the current state of maintenance mode" - 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 " restore > stops iobroker and restores the last backup" - echo " help > shows this help" - echo " " - echo "OPTIONS" - echo "------------------" - echo " -y|--yes > confirms the used command without asking" - echo " -h|--help > shows this help" - echo " " -} - -# check maintenance enabled -maintenance_enabled() { - [[ -f "$healthcheck" && "$(cat "$healthcheck")" == maintenance ]] -} - -# check status starting -check_starting() { - [[ -f "$healthcheck" && "$(cat "$healthcheck")" == starting ]] -} - -# display maintenance status -maintenance_status() { - if maintenance_enabled; then - echo "Maintenance mode is turned ON." - else - echo "Maintenance mode is turned OFF." - fi -} - -# enable maintenance mode -enable_maintenance() { - if maintenance_enabled; then - echo "Maintenance mode is already turned ON." - return - fi - - echo "You are now going to stop ioBroker and activate maintenance mode for this container." - - if [[ "$killbyname" != yes ]]; then - 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 - fi - fi - - echo "Activating maintenance mode..." - echo "maintenance" > "$healthcheck" - sleep 1 - echo -n "Stopping ioBroker..." - stop_iob -} - -# disable maintenance mode -disable_maintenance() { - if ! maintenance_enabled; then - echo "Maintenance mode is already turned OFF." - return - fi - - echo "You are now going to deactivate maintenance mode for this container." - echo "Depending on the restart policy, your container will be stopped or restarted immediately." - - 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 - fi - - echo "Deactivating maintenance mode and forcing container to stop or restart..." - echo "stopping" > "$healthcheck" - gosu root pkill -u root - echo "Done." -} - -# upgrade js-controller -upgrade_jscontroller() { - echo "You are now going to upgrade your js-controller." - echo "As this will change data in /opt/iobroker, make sure you have a backup!" - echo "During the upgrade process, the container will automatically switch into maintenance mode and stop ioBroker." - echo "Depending on the restart policy, your container will be stopped or restarted automatically after the upgrade." - - 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 - fi - - if ! maintenance_enabled > /dev/null; then - autoconfirm=yes - enable_maintenance - fi - - echo "Upgrading js-controller..." - iobroker update - sleep 1 - iobroker upgrade self - sleep 1 - echo "Done." - - echo "Container will be stopped or restarted in 5 seconds..." - sleep 5 - echo "stopping" > "$healthcheck" - gosu root pkill -u root -} - -# stop iobroker and wait until all processes stopped or pkill_timeout is reached -stop_iob() { - local status timeout - - timeout="$(date --date="now + $pkill_timeout sec" +%s)" - pkill -u iobroker -f 'iobroker.js-controller[^/]*$' - status=$? - if (( status >= 2 )); then # syntax error or fatal error - return 1 - elif (( status == 1 )); then # no processes matched - return - fi - - if [[ "$killbyname" != yes ]]; then - # pgrep exits with status 1 when there are no matches - while pgrep -u iobroker -f 'io.' > /dev/null; (( $? != 1 )); do - if (($(date +%s) > timeout)); then - echo -e "\nTimeout reached. Killing remaining processes..." - pgrep --list-full -u iobroker - pkill --signal SIGKILL -u iobroker -f 'io.' - echo "\nDone." - return - fi - sleep 1 - echo -n "." - done - else - for ((i=0; i<3; i++)); do - sleep 1 - echo -n "." - done - fi - - echo -e "Done." -} - -# 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 - fi - - if ! maintenance_enabled > /dev/null; then - echo -n "Stopping ioBroker..." - stop_iob - fi - - echo "Container will be stopped or restarted in 5 seconds..." - sleep 5 - echo "stopping" > "$healthcheck" - gosu root pkill -u root -} - -# restore iobroker -restore_iobroker() { - echo "You are now going to perform a restore of your iobroker." - echo "During the restore process, the container will automatically switch into maintenance mode and stop ioBroker." - echo "Depending on the restart policy, your container will be stopped or restarted automatically after the restore." - - 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 - fi - - if check_starting > /dev/null; then - echo "Startup script is still running." - echo "Please check container log and wait until ioBroker is sucessfully started." - echo "Then try again." - return 1 - fi - - if ! maintenance_enabled > /dev/null; then - autoconfirm=yes - enable_maintenance - fi - - echo -n "Restoring ioBroker... " - set +e - bash iobroker restore 0 > /opt/iobroker/log/restore.log 2>&1 - return=$? - set -e - if [[ "$return" -ne 0 ]]; then - echo "Failed." - echo "For more details see \"/opt/iobroker/log/restore.log\"." - echo "Please check backup file location and permissions and try again." - return 1 - fi - 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 10 seconds..." - sleep 10 - echo "stopping" > "$healthcheck" - gosu root pkill -u root -} - -# parsing commands and options - -# default command to run unless another was given -run=(display_help) - -for arg in "$@"; do - case $arg in - help|-h|--help) - run=(display_help) - ;; - status|stat|s) - run=(maintenance_status) - ;; - on) - run=(enable_maintenance) - ;; - off) - run=(disable_maintenance) - ;; - upgrade|upgr|u) - run=(upgrade_jscontroller) - ;; - restart|rest|r) - run=(restart_container) - ;; - restore) - run=(restore_iobroker) - ;; - -y|--yes) - autoconfirm=yes - ;; - -kbn|--killbyname) - killbyname=yes - ;; - --) - break - ;; - *) - >&2 echo "Unknown parameter: $arg" - >&2 echo "Please try again or see help (help|-h|--help)." - exit 1 - ;; - esac -done - -"${run[@]}" \ No newline at end of file diff --git a/debian11/scripts/setup_avahi.sh b/debian11/scripts/setup_avahi.sh deleted file mode 100644 index 46d5873..0000000 --- a/debian11/scripts/setup_avahi.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash - -if [ -e /usr/sbin/avahi-daemon ] && [ -e /var/run/dbus ] -then - echo "[setup_avahi.sh] Avahi is already installed. Nothing to do here." -else - echo -n "[setup_avahi.sh] Avahi-daemon is NOT installed. Going to install it now... " - apt-get update > /opt/scripts/avahi_startup.log 2>&1 - apt-get install -y --no-install-recommends libavahi-compat-libdnssd-dev avahi-daemon >> /opt/scripts/avahi_startup.log 2>&1 - rm -rf /var/lib/apt/lists/* >> /opt/scripts/avahi_startup.log 2>&1 - echo "Done." - echo -n "[setup_avahi.sh] Configuring avahi-daemon... " - sed -i '/^rlimit-nproc/s/^\(.*\)/#\1/g' /etc/avahi/avahi-daemon.conf - echo "Done." - echo -n "[setup_avahi.sh] Configuring dbus... " - mkdir /var/run/dbus/ - echo "Done." -fi - -if [ -f /var/run/dbus/pid ]; -then - rm -f /var/run/dbus/pid -fi - -if [ -f /var/run/avahi-daemon//pid ]; -then - rm -f /var/run/avahi-daemon//pid -fi - -echo -n "[setup_avahi.sh] Starting dbus... " - dbus-daemon --system >> /opt/scripts/avahi_startup.log 2>&1 -echo "Done." - -echo -n "[setup_avahi.sh] Starting avahi-daemon... " - /etc/init.d/avahi-daemon start >> /opt/scripts/avahi_startup.log 2>&1 -echo "Done." - -exit 0 diff --git a/debian11/scripts/setup_iob_db.sh b/debian11/scripts/setup_iob_db.sh deleted file mode 100644 index df1d679..0000000 --- a/debian11/scripts/setup_iob_db.sh +++ /dev/null @@ -1,357 +0,0 @@ -#!/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" == "none" ]]; then - echo "IOB_OBJECTSDB_PASS is available but value is set to \"none\"." - echo -n "Removing password of objects db... " - jq '.objects.options.auth_pass = null' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp - write_iobroker_json - echo "Done." - elif [[ "$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... " - 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" == "none" ]]; then - echo "IOB_STATESDB_PASS is available but value is set to \"none\"." - echo -n "Removing password of states db... " - jq '.states.options.auth_pass = null' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp - write_iobroker_json - echo "Done." - elif [[ "$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... " - 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 diff --git a/debian11/scripts/setup_packages.sh b/debian11/scripts/setup_packages.sh deleted file mode 100644 index 1db9a5f..0000000 --- a/debian11/scripts/setup_packages.sh +++ /dev/null @@ -1,84 +0,0 @@ -#!/bin/bash - -# bash strict mode -set -euo pipefail - -# Reading ENV -set +u -packages=$PACKAGES -debug=$DEBUG -set -u - -export DEBIAN_FRONTEND=noninteractive - -check_package_preq() { - # check for influx packages - if [[ "$i" == "influxdb" || "$i" == "influxdb2-cli" ]]; then - # add influxdata repo keys - wget -qO- https://repos.influxdata.com/influxdata-archive_compat.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg > /dev/null - echo "deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] https://repos.influxdata.com/debian stable main" | sudo tee /etc/apt/sources.list.d/influxdata.list - apt-get -q update >> /opt/scripts/setup_packages.log 2>&1 - fi -} -check_package_validity() { - # check string for double spaces - while echo "$packages" | grep -q ' '; do - packages=$(echo "$packages" | sed 's/ / /g') - done - # remove packages when "influxdb" AND "influxdb2-cli" - if echo "$packages" | grep -qw "influxdb" && echo "$packages" | grep -qw "influxdb2-cli"; then - echo "PACKAGES includes influxdb AND influxdb2-cli." - echo "As installing both packages together is not possible, they will be skipped." - packages=$(echo "$packages" | sed 's/influxdb2-cli//g;s/influxdb//g') - # check string for double spaces again - while echo "$packages" | grep -q ' '; do - packages=$(echo "$packages" | sed 's/ / /g') - done - if [[ $debug == "true" ]]; then echo "[DEBUG] New list of packages: ""$packages"; fi - echo " " - fi -} - -if [[ "$1" == "-install" ]]; then - echo " " - apt-get -q update >> /opt/scripts/setup_packages.log 2>&1 - check_package_validity - for i in $packages; do - if ! dpkg -s "$i" >/dev/null 2>&1; then - echo -n "$i is not installed. Installing... " - check_package_preq >> /opt/scripts/setup_packages.log 2>&1 - if ! apt-get -q -y --no-install-recommends install "$i" >> /opt/scripts/setup_packages.log 2>&1; then - echo "Failed." - echo "For more details see \"/opt/scripts/setup_packages.log\"." - else - echo "Done." - fi - else - echo "$i is already installed." - fi - done -elif [[ "$1" == "-update" ]]; then - echo -n "Updating Linux packages on first run... " - apt-get -q update >> /opt/scripts/setup_packages.log 2>&1 - return1=$? - apt-get -q -y upgrade >> /opt/scripts/setup_packages.log 2>&1 - return2=$? - if [[ "$return1" -ne 0 || "$return2" -ne 0 ]]; then - echo "Failed." - echo "For more details see \"/opt/scripts/setup_packages.log\"." - echo "Make sure the container has internet access to get the latest package updates." - echo "This has no impact to the setup process. The script will continue." - else - echo "Done." - fi -else - echo "No paramerter found!" - exit 1 -fi - -# Silent Cleanup -apt-get -qq autoclean -y && apt-get -qq autoremove && apt-get -qq clean -rm -rf /tmp/* /var/tmp/* /root/.cache/* /var/lib/apt/lists/* -rm -f /opt/scripts/.packages /opt/scripts/.docker_config/.packages - -exit 0 \ No newline at end of file diff --git a/debian11/scripts/setup_zwave.sh b/debian11/scripts/setup_zwave.sh deleted file mode 100644 index 8efd62e..0000000 --- a/debian11/scripts/setup_zwave.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -if [ -e /usr/local/lib64 ] -then - echo "[setup_zwave.sh] Openzwave is already installed. Nothing to do here." -else - echo -n "[setup_zwave.sh] Openzwave is NOT installed. Going to install it now... " - cd /opt || exit - curl -s -L -O http://old.openzwave.com/downloads/openzwave-1.6.1007.tar.gz - tar -xf openzwave-1.6.1007.tar.gz && rm openzwave-1.6.1007.tar.gz - cd openzwave-1.6.1007 && make > /dev/null 2>&1 && make install > /dev/null 2>&1 - ldconfig /usr/local/lib64 - cd /opt/iobroker || exit - echo "Done." -fi - -exit 0 diff --git a/debian11/userscripts/userscript_everystart_example.sh b/debian11/userscripts/userscript_everystart_example.sh deleted file mode 100644 index 320e6a9..0000000 --- a/debian11/userscripts/userscript_everystart_example.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -# This is an example script file. -# To run the Script on every start of the container you have to rename it to userscript_everystart.sh. - -# You can add your advanced script code here! - -echo " " -echo "I'm your startscript userscript_everystart.sh. I will run on EVERY container startup." -echo " " - - -exit 0 diff --git a/debian11/userscripts/userscript_firststart_example.sh b/debian11/userscripts/userscript_firststart_example.sh deleted file mode 100644 index 1e25e34..0000000 --- a/debian11/userscripts/userscript_firststart_example.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -# This is an example script file. -# To run the Script on the first start of a new container you have to rename it to userscript_firststart.sh. - -# You can add your advanced script code here! - -echo " " -echo "I'm your startscript userscript_firststart.sh. I will run only on the FIRST startup of the container." -echo " " - -exit 0 diff --git a/debian12/scripts/healthcheck.sh b/debian12/scripts/healthcheck.sh index 5c57498..060cc92 100644 --- a/debian12/scripts/healthcheck.sh +++ b/debian12/scripts/healthcheck.sh @@ -1,5 +1,8 @@ #!/usr/bin/env bash +# bash strict mode +set -euo pipefail + # Script checks health of running container if [ "$(cat /opt/.docker_config/.healthcheck)" == "starting" ] diff --git a/debian12/scripts/iobroker_startup.sh b/debian12/scripts/iobroker_startup.sh index 8418264..3cb51e2 100644 --- a/debian12/scripts/iobroker_startup.sh +++ b/debian12/scripts/iobroker_startup.sh @@ -34,6 +34,13 @@ set -u pkill_timeout=10 # timeout for iobroker shutdown in seconds +# Exit with error function +exit_with_error() { + echo " " + echo "This Script will exit now." + exit 1 +} + # Stop on error function stop_on_error() { if [[ "$debug" == "true" || "$debug" == "42" ]]; then @@ -42,11 +49,10 @@ stop_on_error() { echo "[DEBUG] This enables you to investigate or fix your issue on the command line." echo "[DEBUG] If you want to stop or restart your container you have to do it manually." echo "[DEBUG] IoBroker is not running!" - tail -f /dev/null + trap 'exit_with_error' SIGTERM SIGKILL + tail -f /dev/null & wait else - echo " " - echo "This Script will exit now." - exit 1 + exit_with_error fi } @@ -244,6 +250,7 @@ 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 + chown -R "$setuid":"$setgid" /opt/userscripts chown -R "$setuid":"$setgid" /opt/.docker_config echo "Done." fi