diff --git a/.VERSION b/.VERSION index 8a82f2e..a9e5fdc 100644 --- a/.VERSION +++ b/.VERSION @@ -1 +1 @@ -v5.2.0-beta2 \ No newline at end of file +v5.2.0-beta3 \ No newline at end of file diff --git a/.github/workflows/build-debian-image-beta-node14.yml b/.github/workflows/build-debian-image-beta-node14.yml new file mode 100644 index 0000000..3224edf --- /dev/null +++ b/.github/workflows/build-debian-image-beta-node14.yml @@ -0,0 +1,130 @@ +# Github action to build Docker image from beta branch (tag: beta) +name: Build debian based image (beta-node14) + +on: + workflow_dispatch: + pull_request: + branches: + - beta + types: + - closed + schedule: + - cron: '42 3 * * 1' + +jobs: + bulid-beta-node14-image: + runs-on: ubuntu-latest + steps: + - name: Checkout repo (beta) + uses: actions/checkout@v2.3.4 + with: + repository: 'buanet/ioBroker.docker' + ref: 'beta' + + - name: Get and write version and date + id: version + run: | + VERSION="$(cat .VERSION)" + MAJORVERSION="$(cat .VERSION | cut -c 1-2 | sed -r 's#^(.{0})#\1latest-#')" + DATI="$(date --rfc-3339=seconds | sed 's/ /T/')" + echo "This is the Version: $VERSION" + echo "version=$VERSION" >> $GITHUB_ENV + echo "This is the Major Version: $MAJORVERSION" + echo "majorversion=$MAJORVERSION" >> $GITHUB_ENV + echo "This is the Buildnumber/Timestamp: $DATI" + echo "dati=$DATI" >> $GITHUB_ENV + # startup script + 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/node14/Dockerfile > ./debian/node14/Dockerfile.tmp + mv -f ./debian/node14/Dockerfile.tmp ./debian/node14/Dockerfile + + - name: Set up manifest tool + run: | + wget https://github.com/estesp/manifest-tool/releases/download/v0.7.0/manifest-tool-linux-amd64 -O manifest-tool + chmod +x manifest-tool + + - name: Set up QEMU + uses: docker/setup-qemu-action@v1.2.0 + + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v1.5.1 + + - name: Login to DockerHub + uses: docker/login-action@v1.10.0 + with: + username: ${{ secrets.DOCKER_USER }} + password: ${{ secrets.DOCKER_PASS }} + + - name: Login to GitHub Container Registry + uses: docker/login-action@v1.10.0 + with: + registry: ghcr.io + username: ${{ secrets.PACKAGES_USER }} + password: ${{ secrets.PACKAGES_PASS }} + + - name: Build Docker image (node14-amd64) + uses: docker/build-push-action@v2.6.1 + with: + context: ./debian + file: ./debian/node14/Dockerfile + push: true + platforms: linux/amd64 + tags: | + buanet/iobroker:${{ env.version }}-node14-amd64, + ghcr.io/buanet/iobroker:${{ env.version }}-node14-amd64 + + - name: Build Docker image (node14-arm32v7) + uses: docker/build-push-action@v2.6.1 + with: + context: ./debian + file: ./debian/node14/Dockerfile + push: true + platforms: linux/arm/v7 + tags: | + buanet/iobroker:${{ env.version }}-node14-arm32v7, + ghcr.io/buanet/iobroker:${{ env.version }}-node14-arm32v7 + + - name: Build Docker image (node14-arm64v8) + uses: docker/build-push-action@v2.6.1 + with: + context: ./debian + file: ./debian/node14/Dockerfile + push: true + platforms: linux/arm64/v8 + tags: | + buanet/iobroker:${{ env.version }}-node14-arm64v8, + ghcr.io/buanet/iobroker:${{ env.version }}-node14-arm64v8 + + - name: Create and push manifests + run: | + sed -e "s/\${VERSION}/${{ env.version }}-node14/g" -e "s/\${DOCKERTAG}/beta-node14/g" ./manifest.yml > manifest_beta-node14.yaml + ./manifest-tool --username ${{ secrets.DOCKER_USER }} --password ${{ secrets.DOCKER_PASS }} push from-spec manifest_beta-node14.yaml + sed -e "s/\${VERSION}/${{ env.version }}-node14/g" -e "s/\${DOCKERTAG}/beta-node14/g" ./manifest_ghcr.yml > manifest_ghcr_beta-node14.yaml + ./manifest-tool --username ${{ secrets.PACKAGES_USER }} --password ${{ secrets.PACKAGES_PASS }} push from-spec manifest_ghcr_beta-node14.yaml + sed -e "s/\${VERSION}/${{ env.version }}/g" -e "s/\${DOCKERTAG}/${{ env.version }}/g" ./manifest.yml > manifest_version.yaml + ./manifest-tool --username ${{ secrets.DOCKER_USER }} --password ${{ secrets.DOCKER_PASS }} push from-spec manifest_version.yaml + sed -e "s/\${VERSION}/${{ env.version }}/g" -e "s/\${DOCKERTAG}/${{ env.version }}/g" ./manifest_ghcr.yml > manifest_ghcr_version.yaml + ./manifest-tool --username ${{ secrets.PACKAGES_USER }} --password ${{ secrets.PACKAGES_PASS }} push from-spec manifest_ghcr_version.yaml + + - name: Delete untagged images from GitHub packages + uses: actions/github-script@v3 + 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-debian-image-beta.yml b/.github/workflows/build-debian-image-beta.yml new file mode 100644 index 0000000..c4ec724 --- /dev/null +++ b/.github/workflows/build-debian-image-beta.yml @@ -0,0 +1,130 @@ +# Github action to build Docker image from beta branch (tag: beta) +name: Build debian based image (beta) + +on: + workflow_dispatch: + pull_request: + branches: + - beta + types: + - closed + schedule: + - cron: '42 3 * * 1' + +jobs: + bulid-beta-image: + runs-on: ubuntu-latest + steps: + - name: Checkout repo (beta) + uses: actions/checkout@v2.3.4 + with: + repository: 'buanet/ioBroker.docker' + ref: 'beta' + + - name: Get and write version and date + id: version + run: | + VERSION="$(cat .VERSION)" + MAJORVERSION="$(cat .VERSION | cut -c 1-2 | sed -r 's#^(.{0})#\1latest-#')" + DATI="$(date --rfc-3339=seconds | sed 's/ /T/')" + echo "This is the Version: $VERSION" + echo "version=$VERSION" >> $GITHUB_ENV + echo "This is the Major Version: $MAJORVERSION" + echo "majorversion=$MAJORVERSION" >> $GITHUB_ENV + echo "This is the Buildnumber/Timestamp: $DATI" + echo "dati=$DATI" >> $GITHUB_ENV + # startup script + 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/node12/Dockerfile > ./debian/node12/Dockerfile.tmp + mv -f ./debian/node12/Dockerfile.tmp ./debian/node12/Dockerfile + + - name: Set up manifest tool + run: | + wget https://github.com/estesp/manifest-tool/releases/download/v0.7.0/manifest-tool-linux-amd64 -O manifest-tool + chmod +x manifest-tool + + - name: Set up QEMU + uses: docker/setup-qemu-action@v1.2.0 + + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v1.5.1 + + - name: Login to DockerHub + uses: docker/login-action@v1.10.0 + with: + username: ${{ secrets.DOCKER_USER }} + password: ${{ secrets.DOCKER_PASS }} + + - name: Login to GitHub Container Registry + uses: docker/login-action@v1.10.0 + with: + registry: ghcr.io + username: ${{ secrets.PACKAGES_USER }} + password: ${{ secrets.PACKAGES_PASS }} + + - name: Build Docker image (amd64) + uses: docker/build-push-action@v2.6.1 + with: + context: ./debian + file: ./debian/node12/Dockerfile + push: true + platforms: linux/amd64 + tags: | + buanet/iobroker:${{ env.version }}-amd64, + ghcr.io/buanet/iobroker:${{ env.version }}-amd64 + + - name: Build Docker image (arm32v7) + uses: docker/build-push-action@v2.6.1 + with: + context: ./debian + file: ./debian/node12/Dockerfile + push: true + platforms: linux/arm/v7 + tags: | + buanet/iobroker:${{ env.version }}-arm32v7, + ghcr.io/buanet/iobroker:${{ env.version }}-arm32v7 + + - name: Build Docker image (arm64v8) + uses: docker/build-push-action@v2.6.1 + with: + context: ./debian + file: ./debian/node12/Dockerfile + push: true + platforms: linux/arm64/v8 + tags: | + buanet/iobroker:${{ env.version }}-arm64v8, + ghcr.io/buanet/iobroker:${{ env.version }}-arm64v8 + + - name: Create and push manifests + run: | + sed -e "s/\${VERSION}/${{ env.version }}/g" -e "s/\${DOCKERTAG}/beta/g" ./manifest.yml > manifest_beta.yaml + ./manifest-tool --username ${{ secrets.DOCKER_USER }} --password ${{ secrets.DOCKER_PASS }} push from-spec manifest_beta.yaml + sed -e "s/\${VERSION}/${{ env.version }}/g" -e "s/\${DOCKERTAG}/beta/g" ./manifest_ghcr.yml > manifest_ghcr_beta.yaml + ./manifest-tool --username ${{ secrets.PACKAGES_USER }} --password ${{ secrets.PACKAGES_PASS }} push from-spec manifest_ghcr_beta.yaml + sed -e "s/\${VERSION}/${{ env.version }}/g" -e "s/\${DOCKERTAG}/${{ env.version }}/g" ./manifest.yml > manifest_version.yaml + ./manifest-tool --username ${{ secrets.DOCKER_USER }} --password ${{ secrets.DOCKER_PASS }} push from-spec manifest_version.yaml + sed -e "s/\${VERSION}/${{ env.version }}/g" -e "s/\${DOCKERTAG}/${{ env.version }}/g" ./manifest_ghcr.yml > manifest_ghcr_version.yaml + ./manifest-tool --username ${{ secrets.PACKAGES_USER }} --password ${{ secrets.PACKAGES_PASS }} push from-spec manifest_ghcr_version.yaml + + - name: Delete untagged images from GitHub packages + uses: actions/github-script@v3 + 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-debian-image-dev-node14.yml b/.github/workflows/build-debian-image-dev-node14.yml index b0fa875..0d6c0ac 100644 --- a/.github/workflows/build-debian-image-dev-node14.yml +++ b/.github/workflows/build-debian-image-dev-node14.yml @@ -8,7 +8,7 @@ on: - dev jobs: - bulid-dev-image: + bulid-dev-node14-image: runs-on: ubuntu-latest steps: - name: Checkout repo (dev) diff --git a/.github/workflows/build-debian-image-dev.yml b/.github/workflows/build-debian-image-dev.yml index a8dc75d..929bbaa 100644 --- a/.github/workflows/build-debian-image-dev.yml +++ b/.github/workflows/build-debian-image-dev.yml @@ -8,7 +8,7 @@ on: - dev jobs: - bulid-dev-node14-image: + bulid-dev-image: runs-on: ubuntu-latest steps: - name: Checkout repo (dev) diff --git a/CHANGELOG.md b/CHANGELOG.md index 83a57e7..634ddfe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,14 +1,18 @@ ## Changelog -### * v5.2.0-beta2 (2021-08-28) -* redesign maintenance script -* switching amd64 base image to debian bullseye slim -* optimizing log output -* adding labels in OCI standard format -* adding packages update on first start -* adding file for docker detection by ioBroker adapters -* adding best practice for states db migation in readme -* removing couchdb option for states db (no longer supported) +### v5.2.0-beta3 (2021-09-04) +* reducing layers in dockerfile +* making hostname check mandatory for startup +* optimize startup log +* v5.2.0-beta2 (2021-08-28) + * redesign maintenance script + * switching amd64 base image to debian bullseye slim + * optimizing log output + * adding labels in OCI standard format + * adding packages update on first start + * adding file for docker detection by ioBroker adapters + * adding best practice for states db migation in readme + * removing couchdb option for states db (no longer supported) * v5.2.0-beta1 (2021-05-04) * added upgrade parameter to maintenance script * added expose for default admin ui port (#172) diff --git a/amd64/Dockerfile b/amd64/Dockerfile deleted file mode 100644 index fc49f7e..0000000 --- a/amd64/Dockerfile +++ /dev/null @@ -1,110 +0,0 @@ -FROM amd64/debian:buster - -LABEL org.opencontainers.image.title="ioBroker Docker Image" \ - org.opencontainers.image.description="Docker image for ioBroker smarthome software" \ - org.opencontainers.image.authors="info@buanet.de" \ - org.opencontainers.image.url="https://github.com/buanet/ioBroker.docker" \ - org.opencontainers.image.version="${VERSION}" \ - org.opencontainers.image.created="${DATI}" - -ENV DEBIAN_FRONTEND noninteractive - -# Install prerequisites (as listed in iobroker installer.sh) -RUN apt-get update && apt-get install -y \ - acl \ - apt-utils \ - build-essential \ - curl \ - git \ - gnupg2 \ - gosu \ - jq \ - libavahi-compat-libdnssd-dev \ - libcap2-bin \ - libpam0g-dev \ - libudev-dev \ - locales \ - pkg-config \ - procps \ - python \ - python-dev \ - sudo \ - udev \ - unzip \ - wget \ - && rm -rf /var/lib/apt/lists/* - -# Install node -RUN curl -sL https://deb.nodesource.com/setup_12.x | bash \ - && apt-get update && apt-get install -y nodejs \ - && rm -rf /var/lib/apt/lists/* - -# Generating locales -RUN 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 scripts directorys and copy scripts -RUN mkdir -p /opt/scripts/ \ - && mkdir -p /opt/userscripts/ \ - && chmod 777 /opt/scripts/ \ - && chmod 777 /opt/userscripts/ -WORKDIR /opt/scripts/ -COPY scripts/iobroker_startup.sh iobroker_startup.sh -COPY scripts/setup_avahi.sh setup_avahi.sh -COPY scripts/setup_packages.sh setup_packages.sh -COPY scripts/setup_zwave.sh setup_zwave.sh -COPY scripts/healthcheck.sh healthcheck.sh -COPY scripts/maintenance.sh maintenance.sh -RUN chmod +x iobroker_startup.sh \ - && chmod +x setup_avahi.sh \ - && chmod +x setup_packages.sh \ - && chmod +x setup_zwave.sh \ - && chmod +x healthcheck.sh \ - && chmod +x maintenance.sh -WORKDIR /opt/userscripts/ -COPY scripts/userscript_firststart_example.sh userscript_firststart_example.sh -COPY scripts/userscript_everystart_example.sh userscript_everystart_example.sh - -# Install ioBroker -WORKDIR / -RUN apt-get update \ - && curl -sL https://iobroker.net/install.sh | bash - \ - && mkdir -p /opt/scripts/.docker_config/ \ - && echo $(hostname) > /opt/scripts/.docker_config/.install_host \ - && echo "starting" > /opt/scripts/.docker_config/.healthcheck \ - && echo $(hostname) > /opt/.firstrun \ - && rm -rf /var/lib/apt/lists/* - -# Install node-gyp -WORKDIR /opt/iobroker/ -RUN npm install -g node-gyp - -# Backup initial ioBroker and userscript folder -RUN tar -cf /opt/initial_iobroker.tar /opt/iobroker \ - && tar -cf /opt/initial_userscripts.tar /opt/userscripts - -# Setting up iobroker-user (shell and home directory) -RUN chsh -s /bin/bash iobroker \ - && usermod --home /opt/iobroker iobroker \ - && usermod -u 1000 iobroker \ - && groupmod -g 1000 iobroker - -# Setting up 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 - -# 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/amd64/manifest.yml b/amd64/manifest.yml deleted file mode 100644 index c508c10..0000000 --- a/amd64/manifest.yml +++ /dev/null @@ -1,7 +0,0 @@ -image: buanet/iobroker:$VERSION-amd64 -manifests: - - - image: buanet/iobroker:$VERSION-amd64 - platform: - architecture: amd64 - os: linux diff --git a/amd64/scripts/healthcheck.sh b/amd64/scripts/healthcheck.sh deleted file mode 100644 index 072f9c0..0000000 --- a/amd64/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/amd64/scripts/iobroker_startup.sh b/amd64/scripts/iobroker_startup.sh deleted file mode 100644 index 2962c87..0000000 --- a/amd64/scripts/iobroker_startup.sh +++ /dev/null @@ -1,517 +0,0 @@ -#!/bin/bash - -# Setting healthcheck status to "starting" -echo "starting" > /opt/scripts/.docker_config/.healthcheck - -# Reading ENV -adminport=$IOB_ADMINPORT -avahi=$AVAHI -multihost=$IOB_MULTIHOST -objectsdbhost=$IOB_OBJECTSDB_HOST -objectsdbport=$IOB_OBJECTSDB_PORT -objectsdbtype=$IOB_OBJECTSDB_TYPE -packages=$PACKAGES -setgid=$SETGID -setuid=$SETUID -statesdbhost=$IOB_STATESDB_HOST -statesdbport=$IOB_STATESDB_PORT -statesdbtype=$IOB_STATESDB_TYPE -usbdevices=$USBDEVICES -zwave=$ZWAVE - -# Getting date and time for logging -dati=`date '+%Y-%m-%d %H:%M:%S'` - -# Logging header -echo ' ' -echo "$(printf -- '-%.0s' {1..60})" -echo -n "$(printf -- '-%.0s' {1..15})" && echo -n " "$dati" " && echo "$(printf -- '-%.0s' {1..15})" -echo "$(printf -- '-%.0s' {1..60})" -echo ' ' -echo "$(printf -- '-%.0s' {1..60})" -echo "----- Welcome to your ioBroker-container! -----" -echo "----- Startupscript is now running. -----" -echo "----- Please be patient! -----" -echo "$(printf -- '-%.0s' {1..60})" -echo ' ' -echo "$(printf -- '-%.0s' {1..60})" -echo "----- Debugging information -----" -echo "----- -----" -echo "----- System -----" -echo -n "----- " && echo -n "$(printf "%-10s %-23s" arch: $(uname -m))" && echo " -----" -echo "----- -----" -echo "----- Docker-Image -----" -echo -n "----- " && echo -n "$(printf "%-10s %-23s" image: ${VERSION})" && echo " -----" -echo -n "----- " && echo -n "$(printf "%-10s %-23s" build: ${BUILD})" && echo " -----" -echo "----- -----" -echo "----- Versions -----" -echo -n "----- " && echo -n "$(printf "%-10s %-23s" node: $(node -v))" && echo " -----" -echo -n "----- " && echo -n "$(printf "%-10s %-23s" npm: $(npm -v))" && echo " -----" -echo "----- -----" -echo "----- ENV -----" -if [ "$adminport" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" IOB_ADMINPORT: $adminport)" && echo " -----"; fi -if [ "$avahi" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" AVAHI: $avahi)" && echo " -----"; fi -if [ "$multihost" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" IOB_MULTIHOST: $multihost)" && echo " -----"; fi -if [ "$objectsdbhost" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" IOB_OBJECTSDB_HOST: $objectsdbhost)" && echo " -----"; fi -if [ "$objectsdbport" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" IOB_OBJECTSDB_PORT: $objectsdbport)" && echo " -----"; fi -if [ "$objectsdbtype" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" IOB_OBJECTSDB_TYPE: $objectsdbtype)" && echo " -----"; fi -if [ "$packages" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" PACKAGES: $packages)" && echo " -----"; fi -if [ "$setgid" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" SETGID: $setgid)" && echo " -----"; fi -if [ "$setuid" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" SETUID: $setuid)" && echo " -----"; fi -if [ "$statesdbhost" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" IOB_STATESDB_HOST: $statesdbhost)" && echo " -----"; fi -if [ "$statesdbport" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" IOB_STATESDB_PORT: $statesdbport)" && echo " -----"; fi -if [ "$statesdbtype" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" IOB_STATESDB_TYPE: $statesdbtype)" && echo " -----"; fi -if [ "$usbdevices" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" USBDEVICES: $usbdevices)" && echo " -----"; fi -if [ "$zwave" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" ZWAVE: $zwave)" && echo " -----"; fi -echo "$(printf -- '-%.0s' {1..60})" -echo ' ' - -##### -# STEP 1 - Preparing container -##### -echo "$(printf -- '-%.0s' {1..60})" -echo "----- Step 1 of 5: Preparing container -----" -echo "$(printf -- '-%.0s' {1..60})" -echo ' ' - -# Adding ckeck file for easy docker detection by ioBroker -echo "$VERSION" > /opt/scripts/.docker_config/.thisisdocker - -# Installing/ updating additional packages and setting uid/gid -if [ "$packages" != "" ] || [ $(cat /etc/group | grep 'iobroker:' | cut -d':' -f3) != $setgid ] || [ $(cat /etc/passwd | grep 'iobroker:' | cut -d':' -f3) != $setuid ] || [ -f /opt/.firstrun ] -then - if [ -f /opt/.firstrun ] - then - echo "Updating Linux packages on first run..." - bash /opt/scripts/setup_packages.sh -update - echo "Done." - echo ' ' - echo "Registering maintenance script as command..." - echo "alias maintenance=\'/opt/scripts/maintenance.sh\'" >> /root/.bashrc - echo "alias maint=\'/opt/scripts/maintenance.sh\'" >> /root/.bashrc - echo "Done." - echo ' ' - fi - if [ "$packages" != "" ] - then - echo "Installing additional packages is set by ENV." - echo "The following packages will be installed:" $packages"..." - echo $packages > /opt/scripts/.packages - bash /opt/scripts/setup_packages.sh -install - echo "Done." - echo ' ' - fi - if [ $(cat /etc/group | grep 'iobroker:' | cut -d':' -f3) != $setgid ] || [ $(cat /etc/passwd | grep 'iobroker:' | cut -d':' -f3) != $setuid ] - then - echo "Different UID and/ or GID is set by ENV." - echo "Changing UID to "$setuid" and GID to "$setgid"..." - usermod -u $setuid iobroker - groupmod -g $setgid iobroker - echo "Done." - echo ' ' - fi -else - echo "Nothing to do here." - echo ' ' -fi - -# Change directory for next steps -cd /opt/iobroker - - -##### -# Detecting ioBroker-Installation -##### -echo "$(printf -- '-%.0s' {1..60})" -echo "----- Step 2 of 5: Detecting ioBroker installation -----" -echo "$(printf -- '-%.0s' {1..60})" -echo ' ' - -if [ `find /opt/iobroker -type f | wc -l` -lt 1 ] -then - echo "There is no data detected in /opt/iobroker. 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." - rm -f /opt/scripts/.docker_config/.install_host -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 readme.md on Github (https://github.com/buanet/ioBroker.docker)." - exit 1 - else - echo "IoBroker backup file detected in /opt/iobroker. 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/ - chown -R $setuid:$setgid /opt/iobroker # fixes permission error during restore - echo "Done." - echo "Restoring ioBroker..." - iobroker restore 0 > /opt/iobroker/log/restore.log 2>&1 - echo "Done." - echo ' ' - echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" - echo "!!!!! IMPORTANT NOTE !!!!!" - echo "!!!!! The sartup 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 -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/ volume and start over." - exit 1 -fi -echo ' ' - - -##### -# Checking ioBroker-Installation -##### -echo "$(printf -- '-%.0s' {1..60})" -echo "----- Step 3 of 5: Checking ioBroker installation -----" -echo "$(printf -- '-%.0s' {1..60})" -echo ' ' - -# (Re)Setting permissions to "/opt/iobroker" and "/opt/scripts" -echo "(Re)Setting folder permissions (This might take a while! Please be patient!)..." - chown -R $setuid:$setgid /opt/iobroker - chown -R $setuid:$setgid /opt/scripts -echo "Done." -echo ' ' - -# Backing up original iobroker-file and changing sudo to gosu -echo "Fixing \"sudo-bug\" by replacing sudo in iobroker 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 for first run of a new installation and renaming ioBroker -if [ -f /opt/scripts/.docker_config/.install_host ] -then - echo "Looks like this is a new and empty installation of ioBroker." - echo "Hostname needs to be updated to " $(hostname)"..." - bash iobroker host $(cat /opt/scripts/.docker_config/.install_host) - rm -f /opt/scripts/.docker_config/.install_host - echo "Done." - echo ' ' -elif [ $(bash iobroker object get system.adapter.admin.0 --pretty | grep -oP '(?<="host": ")[^"]*') != $(hostname) ] -then - echo "Hostname in ioBroker does not match the hostname of this container." - echo "Updating hostname to " $(hostname)"..." - bash iobroker host $(iobroker object get system.adapter.admin.0 --pretty | grep -oP '(?<="host": ")[^"]*') - echo "Done." - echo ' ' -fi - - -##### -# Setting up prerequisites for some ioBroker-adapters -##### -echo "$(printf -- '-%.0s' {1..60})" -echo "----- Step 4 of 5: Applying special settings -----" -echo "$(printf -- '-%.0s' {1..60})" -echo ' ' - -echo "Some adapters have special requirements/ settings which can be activated by the use of environment variables." -echo "For more information take a look at readme.md on Github!" -echo ' ' - - -# Checking ENV for Adminport -if [ "$adminport" != "" ] -then - if [ "$adminport" != $(bash iobroker object get system.adapter.admin.0 --pretty | grep -oP '(?<="port": )[^,]*') ] - then - echo "Adminport set by ENV does not match port configured in ioBroker installation." - echo "Setting Adminport to \""$adminport"\"..." - bash iobroker set admin.0 --port $adminport - echo "Done." - echo ' ' - fi -fi - - -# Checking ENV for AVAHI -if [ "$avahi" != "" ] -then - if [ "$avahi" = "true" ] - then - echo "Avahi-daemon is activated by ENV." - chmod 755 /opt/scripts/setup_avahi.sh - bash /opt/scripts/setup_avahi.sh - echo "Done." - echo ' ' - fi -fi - - -# Checking ENV for Z-WAVE -if [ "$zwave" != "" ] -then - if [ "$zwave" = "true" ] - then - echo "Z-Wave is activated by ENV." - chmod 755 /opt/scripts/setup_zwave.sh - bash /opt/scripts/setup_zwave.sh - echo "Done." - echo ' ' - fi -fi - - -# checking ENV for USBDEVICES -if [ "$usbdevices" != "" ] -then - if [ "$usbdevices" != "none" ] - then - echo "Usb-device-support is activated by ENV." - IFS=';' read -ra devicearray <<< "$usbdevices" - for i in "${devicearray[@]}" - do - echo "Setting permissions for" $i"..." - chown root:dialout $i - chmod g+rw $i - done - echo "Done." - echo ' ' - fi -fi - - -# Checking ENV for multihost setup -# Configuring objects db host -if [ "$multihost" = "master" ] && [ "$objectsdbtype" = "" ] && [ "$objectsdbhost" = "" ] && [ "$objectsdbport" = "" ] -then - echo "Multihost is set as \"master\" by ENV and no external objects db is set." - echo "Setting host of objects db to \"0.0.0.0\" to allow external communication..." - 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." - echo ' ' -elif [ "$multihost" = "master" ] && [ "$objectsdbhost" = "127.0.0.1" ] -then - echo "Multihost is set as \"master\" by ENV. But objects db host is set to \"127.0.0.1\" by ENV too." - echo "This configuration will not work! Please change or remove ENV \"IOB_OBJECTSDB_HOST\" and start over!" - echo "For more information see readme.md on Github (https://github.com/buanet/ioBroker.docker)." - exit 1 -elif [ "$multihost" = "master" ] && [ "$objectsdbtype" != "" ] && [ "$objectsdbhost" != "" ] && [ "$objectsdbport" != "" ] -then - echo "Multihost is set as \"master\" by ENV and external objects db is set." - echo "Skipping this step..." - echo "Done." - echo ' ' -elif ([ "$multihost" = "slave" ] && [ "$objectsdbtype" = "" ]) || ([ "$multihost" = "slave" ] && [ "$objectsdbhost" = "" ]) || ([ "$multihost" = "slave" ] && [ "$objectsdbport" = "" ]) -then - echo "Multihost is set as \"slave\" by ENV. But no external objects db is set." - echo "You have to configure ENVs \"IOB_OBJECTSDB_TYPE\", \"IOB_OBJECTSDB_HOST\" and \"IOB_OBJECTSDB_PORT\" to connect to a maser objects db." - echo "Please check your settings and start over." - echo "For more information see readme.md on Github (https://github.com/buanet/ioBroker.docker)." - exit 1 -elif [ "$multihost" = "slave" ] && [ "$objectsdbtype" != "" ] && [ "$objectsdbhost" != "" ] && [ "$objectsdbport" != "" ] -then - echo "Multihost is set as \"slave\" by ENV and external objects db is set." - echo "Skipping this step..." - echo "Done." - echo ' ' -elif [ "$multihost" != "" ] -then - echo "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 readme.md on Github (https://github.com/buanet/ioBroker.docker)." - exit 1 -fi -#Configuring states db host -if [ "$multihost" = "master" ] && [ "$statesdbtype" = "" ] && [ "$statesdbhost" = "" ] && [ "$statesdbport" = "" ] -then - echo "Multihost is set as \"master\" by ENV and no external states db is set." - echo "Setting host of states db to \"0.0.0.0\" to allow external communication..." - 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." - echo ' ' -elif [ "$multihost" = "master" ] && [ "$statesdbhost" = "127.0.0.1" ] -then - echo "Multihost is set as \"master\" by ENV. But states db host is set to \"127.0.0.1\" by ENV too." - echo "This configuration will not work! Please change or remove ENV \"IOB_STATESDB_HOST\" and start over!" - echo "For more information see readme.md on Github (https://github.com/buanet/ioBroker.docker)." - exit 1 -elif [ "$multihost" = "master" ] && [ "$statesdbtype" != "" ] && [ "$statesdbhost" != "" ] && [ "$statesdbport" != "" ] -then - echo "Multihost is set as \"master\" by ENV and external states db is set." - echo "Skipping this step..." - echo "Done." - echo ' ' -elif ([ "$multihost" = "slave" ] && [ "$statesdbtype" = "" ]) || ([ "$multihost" = "slave" ] && [ "$statesdbhost" = "" ]) || ([ "$multihost" = "slave" ] && [ "$statesdbport" = "" ]) -then - echo "Multihost is set as \"slave\" by ENV. But no external states db is set." - 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 readme.md on Github (https://github.com/buanet/ioBroker.docker)." - exit 1 -elif [ "$multihost" = "slave" ] && [ "$statesdbtype" != "" ] && [ "$statesdbhost" != "" ] && [ "$statesdbport" != "" ] -then - echo "Multihost is set as \"slave\" by ENV and external states db is set." - echo "Skipping this step..." - echo "Done." - echo ' ' -elif [ "$multihost" != "" ] -then - echo "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 readme.md on Github (https://github.com/buanet/ioBroker.docker)." - exit 1 -fi - - -# Checking ENVs for custom setup of objects db -if [ "$objectsdbtype" != "" ] || [ "$objectsdbhost" != "" ] || [ "$objectsdbport" != "" ] -then - if [ "$objectsdbtype" != $(jq -r '.objects.type' /opt/iobroker/iobroker-data/iobroker.json) ] - then - echo "ENV IOB_OBJECTSDB_TYPE is set and value is different from detected ioBroker installation." - echo "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 "ENV IOB_OBJECTSDB_TYPE is set and value meets detected ioBroker installation. Nothing to do here." - fi - if [ "$objectsdbhost" != $(jq -r '.objects.host' /opt/iobroker/iobroker-data/iobroker.json) ] - then - echo "ENV IOB_OBJECTSDB_HOST is set and value is different from detected ioBroker installation." - echo "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 "ENV IOB_OBJECTSDB_HOST is set and value meets detected ioBroker installation. Nothing to do here." - fi - if [ "$objectsdbport" != $(jq -r '.objects.port' /opt/iobroker/iobroker-data/iobroker.json) ] - then - echo "ENV IOB_OBJECTSDB_PORT is set and value is different from detected ioBroker installation." - echo "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 "ENV IOB_OBJECTSDB_PORT is set and value meets detected ioBroker installation. Nothing to do here." - fi - echo ' ' -fi - - -# Checking ENVs for custom setup of states db# -if [ "$statesdbtype" != "" ] || [ "$statesdbhost" != "" ] || [ "$statesdbport" != "" ] -then - if [ "$statesdbtype" != $(jq -r '.states.type' /opt/iobroker/iobroker-data/iobroker.json) ] - then - echo "ENV IOB_STATESDB_TYPE is set and value is different from detected ioBroker installation." - echo "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 "ENV IOB_STATESDB_TYPE is set and value meets detected ioBroker installation. Nothing to do here." - fi - if [ "$statesdbhost" != $(jq -r '.states.host' /opt/iobroker/iobroker-data/iobroker.json) ] - then - echo "ENV IOB_STATESDB_HOST is set and value is different from detected ioBroker installation." - echo "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 "ENV IOB_STATESDB_HOST is set and value meets detected ioBroker installation. Nothing to do here." - fi - if [ "$statesdbport" != $(jq -r '.states.port' /opt/iobroker/iobroker-data/iobroker.json) ] - then - echo "ENV IOB_STATESDB_PORT is set and value is different from detected ioBroker installation." - echo "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 "ENV IOB_STATESDB_PORT is set and value meets detected ioBroker installation. Nothing to do here." - fi - echo ' ' -fi - - -# Checking for Userscripts in /opt/userscripts -if [ `find /opt/userscripts -type f | wc -l` -lt 1 ] -then - echo "There is no data detected in /opt/userscripts. Restoring exapmple userscripts..." - tar -xf /opt/initial_userscripts.tar -C / - chmod 755 /opt/userscripts/userscript_firststart_example.sh - chmod 755 /opt/userscripts/userscript_everystart_example.sh - echo "Done." - echo ' ' -elif [ -f /opt/userscripts/userscript_firststart.sh ] || [ -f /opt/userscripts/userscript_everystart.sh ] -then - if [ -f /opt/userscripts/userscript_firststart.sh ] && [ -f /opt/.firstrun ] - then - 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 - -# Removing first run marker when exists -if [ -f /opt/.firstrun ] -then -rm -f /opt/.firstrun -fi - -##### -# Starting ioBroker -##### -echo "$(printf -- '-%.0s' {1..60})" -echo "----- Step 5 of 5: ioBroker startup -----" -echo "$(printf -- '-%.0s' {1..60})" -echo ' ' -echo "Starting ioBroker..." -echo ' ' - -# 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..." - pid=$(ps -ef | awk '/[j]s.controller/{print $2}') - kill -SIGTERM "$pid" - 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/amd64/scripts/maintenance.sh b/amd64/scripts/maintenance.sh deleted file mode 100644 index 910c6b4..0000000 --- a/amd64/scripts/maintenance.sh +++ /dev/null @@ -1,194 +0,0 @@ -#!/bin/bash - -############################ -##### default settings ##### -############################ - -autoconfirm=no # yould be set to true by commandline option - - -#################################### -##### declaration of functions ##### -#################################### - -# display help text -display_help() { - echo "This script is build to manage your ioBroker container!" - echo "Usage: maintenance [ COMMAND ] [ OPTIONS ]" - echo " maint [ COMMAND ] [ OPTIONS ]" - echo '' - echo "COMMANDS" - echo "------------------" - echo " status > gives the current state of maintenance mode" - echo " on > switches mantenance mode ON" - echo " off > switches mantenance mode OFF and shuts down/ restarts container" - echo " upgrade > will put container to maintenance mode and upgrade iobroker" - echo '' - echo "OPTIONS" - echo "------------------" - echo " -h|--help > shows this help" - echo " -y|--yes > confirms the used command without asking" - echo '' - exit 0 -} - -# checking maintenance mode status -check_status() { - if [ $(cat /opt/scripts/.docker_config/.healthcheck) == 'maintenance' ] - then - echo 'Maintenance mode is turned ON.' - elif [ $(cat /opt/scripts/.docker_config/.healthcheck) != 'maintenance' ] - then - echo 'Maintenance mode is turned OFF.' - fi -} - -# turn maintenance mode ON -switch_on() { - if [ $(cat /opt/scripts/.docker_config/.healthcheck) != 'maintenance' ] && [ "$autoconfirm" == "no" ] # maintenance mode OFF / autoconfirm = no - then - echo 'You are now going to stop ioBroker and activating maintenance mode for this container.' - read -p 'Do you want to continue [yes/no]? ' A - if [ "$A" == "y" ] || [ "$A" == "Y" ] || [ "$A" == "yes" ] - then - echo 'Activating maintenance mode...' - echo "maintenance" > /opt/scripts/.docker_config/.healthcheck - sleep 1 - echo 'Done.' - echo 'Stopping ioBroker...' - pkill -u iobroker - sleep 1 - echo 'Done.' - exit 0 - else - exit 0 - fi - elif [ $(cat /opt/scripts/.docker_config/.healthcheck) != 'maintenance' ] && [ "$autoconfirm" == "yes" ] # maintenance mode OFF / autoconfirm = yes - then - echo 'You are now going to stop ioBroker and activating maintenance mode for this container.' - echo 'This command was already confirmed by -y or --yes option.' - echo 'Activating maintenance mode...' - echo "maintenance" > /opt/scripts/.docker_config/.healthcheck - sleep 1 - echo 'Done.' - echo 'Stopping ioBroker...' - pkill -u iobroker - sleep 1 - echo 'Done.' - exit 0 - else - echo 'Maintenance mode is already turned ON.' - fi -} - -# turn maintenance mode OFF -switch_off() { - echo 'You are now going to deactivate maintenance mode for this container.' - echo 'Depending on the restart policy, your container will be stopped/ restarted immediately.' - read -p 'Do you want to continue [yes/no]? ' A - if [ "$A" == "y" ] || [ "$A" == "Y" ] || [ "$A" == "yes" ] - then - echo 'Deactivating maintenance mode and forcing container to stop/ restart...' - echo "stopping" > /opt/scripts/.docker_config/.healthcheck - pkill -u root - exit 0 - else - exit 0 - fi -} - -# upgrade js-controller -upgrade() { - 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 of the restart policy, you container will be stoped/ restarted automatically after the upgrade.' - read -p 'Do you want to continue [yes/no]? ' A - if [ "$A" == "y" ] || [ "$A" == "Y" ] || [ "$A" == "yes" ] - then - echo 'Activating maintenance mode...' - echo "maintenance" > /opt/scripts/.docker_config/.healthcheck - sleep 1 - echo 'Done.' - echo 'Stopping ioBroker...' - pkill -u iobroker - sleep 1 - echo 'Done.' - echo 'Upgrading js-controller...' - iobroker update - iobroker upgrade self - sleep 1 - echo 'Done.' - echo 'Container will be stopped/ restarted in 5 seconds...' - sleep 5 - echo "stopping" > /opt/scripts/.docker_config/.healthcheck - pkill -u root - exit 0 - else - exit 0 - fi -} - -######################################## -##### parsing commands and options ##### -######################################## - -for i in "$@"; do - case $i in - help|-h|--help) - display_help # calling function to display help text - exit - ;; - status) - check_status # calling function to check maintenance mode status - ;; - -y|--yes) - autoconfirm=yes # answers prompts with "yes" - ;; - on|-on) - switch_on # calling function to switch maintenance mode on - exit - ;; - -a=*|--argument=*) # dummy exaple for parsing option with value - ARGUMENT="${i#*=}" - shift - ;; - -?*) - printf 'WARN: Unknown option (ignored): %s\n' "$1" - ;; - *) # Default case: No more options, so break out of the loop. - break - ;; - esac -done - -while :; do - case $1 in - -h|--help) - display_help # calling function to display help text - exit - ;; - -y|--yes) - autoconfirm=yes # answers prompts with "yes" - ;; - status) - check_status # calling function to check maintenance mode status - ;; - on|-on) - switch_on # calling function to switch maintenance mode on - exit - ;; - --) # End of all options. - shift - break - ;; - -?*) - printf 'WARN: Unknown option (ignored): %s\n' "$1" - ;; - *) # Default case: No more options, so break out of the loop. - break - esac - shift -done - -exit 0 diff --git a/amd64/scripts/setup_avahi.sh b/amd64/scripts/setup_avahi.sh deleted file mode 100644 index 4fd1ab1..0000000 --- a/amd64/scripts/setup_avahi.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - -echo "Checking avahi-daemon installation state..." - -if [ -e /usr/sbin/avahi-daemon ] && [ -e /var/run/dbus ] -then - echo "Avahi is already installed..." -else - echo "Avahi-daemon is NOT installed. Going to install it now..." - apt-get update > /opt/scripts/avahi_startup.log 2>&1 - apt-get install -y 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 "Configuring avahi-daemon..." - sed -i '/^rlimit-nproc/s/^\(.*\)/#\1/g' /etc/avahi/avahi-daemon.conf - echo "Configuring dbus..." - mkdir /var/run/dbus/ -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 "Starting dbus..." -dbus-daemon --system - -echo "Starting avahi-daemon..." -/etc/init.d/avahi-daemon start - -exit 0 diff --git a/amd64/scripts/setup_packages.sh b/amd64/scripts/setup_packages.sh deleted file mode 100644 index d959a5b..0000000 --- a/amd64/scripts/setup_packages.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash - -if [ $1 == "-install" ] -then - apt-get -qq update - packages=$(cat /opt/scripts/.packages) - for i in $packages; do - sudo apt-get -qq -y install $i - done -elif [ $1 == "-update" ] -then - apt-get -qq update - apt-get -qq -y upgrade -else - echo "No paramerter found!" - exit 1 -fi - -rm -rf /var/lib/apt/lists/* -rm -f /opt/scripts/.packages - -exit 0 diff --git a/amd64/scripts/setup_zwave.sh b/amd64/scripts/setup_zwave.sh deleted file mode 100644 index 11d8024..0000000 --- a/amd64/scripts/setup_zwave.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash - -echo "Checking openzwave installation state..." - -if [ -e /usr/local/lib64 ] -then - echo "Openzwave is already installed..." -else - echo "Openzwave is NOT installed. Going to install it now..." - cd /opt - 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 - # echo "Openzwave is now installed..." -fi - -exit 0 diff --git a/amd64/scripts/userscript_everystart_example.sh b/amd64/scripts/userscript_everystart_example.sh deleted file mode 100644 index 9023677..0000000 --- a/amd64/scripts/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/amd64/scripts/userscript_firststart_example.sh b/amd64/scripts/userscript_firststart_example.sh deleted file mode 100644 index 4fef50d..0000000 --- a/amd64/scripts/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/arm32v7/Dockerfile b/arm32v7/Dockerfile deleted file mode 100644 index e082af9..0000000 --- a/arm32v7/Dockerfile +++ /dev/null @@ -1,107 +0,0 @@ -FROM balenalib/armv7hf-debian:buster - -LABEL org.opencontainers.image.title="ioBroker Docker Image" \ - org.opencontainers.image.description="Docker image for ioBroker smarthome software" \ - org.opencontainers.image.authors="info@buanet.de" \ - org.opencontainers.image.url="https://github.com/buanet/ioBroker.docker" \ - org.opencontainers.image.version="${VERSION}" \ - org.opencontainers.image.created="${DATI}" - -ENV DEBIAN_FRONTEND noninteractive - -# Install prerequisites (as listed in iobroker installer.sh) -RUN apt-get update && apt-get install -y \ - acl \ - apt-utils \ - build-essential \ - curl \ - git \ - gnupg2 \ - gosu \ - jq \ - libavahi-compat-libdnssd-dev \ - libcap2-bin \ - libpam0g-dev \ - libudev-dev \ - locales \ - pkg-config \ - procps \ - python \ - python-dev \ - sudo \ - udev \ - unzip \ - wget \ - && rm -rf /var/lib/apt/lists/* - -# Install node -RUN curl -sL https://deb.nodesource.com/setup_12.x | bash \ - && apt-get update && apt-get install -y nodejs \ - && rm -rf /var/lib/apt/lists/* - -# Generating locales -RUN 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 scripts directorys and copy scripts -RUN mkdir -p /opt/scripts/ \ - && mkdir -p /opt/userscripts/ \ - && chmod 777 /opt/scripts/ \ - && chmod 777 /opt/userscripts/ -WORKDIR /opt/scripts/ -COPY scripts/iobroker_startup.sh iobroker_startup.sh -COPY scripts/setup_avahi.sh setup_avahi.sh -COPY scripts/setup_packages.sh setup_packages.sh -COPY scripts/setup_zwave.sh setup_zwave.sh -COPY scripts/healthcheck.sh healthcheck.sh -COPY scripts/maintenance.sh maintenance.sh -RUN chmod +x iobroker_startup.sh \ - && chmod +x setup_avahi.sh \ - && chmod +x setup_packages.sh \ - && chmod +x setup_zwave.sh \ - && chmod +x healthcheck.sh \ - && chmod +x maintenance.sh -WORKDIR /opt/userscripts/ -COPY scripts/userscript_firststart_example.sh userscript_firststart_example.sh -COPY scripts/userscript_everystart_example.sh userscript_everystart_example.sh - -# Install ioBroker -WORKDIR / -RUN apt-get update \ - && curl -sL https://iobroker.net/install.sh | bash - \ - && mkdir -p /opt/scripts/.docker_config/ \ - && echo $(hostname) > /opt/scripts/.docker_config/.install_host \ - && echo "starting" > /opt/scripts/.docker_config/.healthcheck \ - && echo $(hostname) > /opt/.firstrun \ - && rm -rf /var/lib/apt/lists/* - -# Install node-gyp -WORKDIR /opt/iobroker/ -RUN npm install -g node-gyp - -# Backup initial ioBroker and userscript folder -RUN tar -cf /opt/initial_iobroker.tar /opt/iobroker \ - && tar -cf /opt/initial_userscripts.tar /opt/userscripts - -# Setting up iobroker-user (shell and home directory) -RUN chsh -s /bin/bash iobroker \ - && usermod --home /opt/iobroker iobroker \ - && usermod -u 1000 iobroker \ - && groupmod -g 1000 iobroker - -# Setting up 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" - -# 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/arm32v7/manifest.yml b/arm32v7/manifest.yml deleted file mode 100644 index eba6823..0000000 --- a/arm32v7/manifest.yml +++ /dev/null @@ -1,8 +0,0 @@ -image: buanet/iobroker:$VERSION-arm32v7 -manifests: - - - image: buanet/iobroker:$VERSION-arm32v7 - platform: - architecture: arm - variant: v7 - os: linux diff --git a/arm32v7/scripts/healthcheck.sh b/arm32v7/scripts/healthcheck.sh deleted file mode 100644 index 072f9c0..0000000 --- a/arm32v7/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/arm32v7/scripts/iobroker_startup.sh b/arm32v7/scripts/iobroker_startup.sh deleted file mode 100644 index 67c1ffb..0000000 --- a/arm32v7/scripts/iobroker_startup.sh +++ /dev/null @@ -1,507 +0,0 @@ -#!/bin/bash - -# Setting healthcheck status to "starting" -echo "starting" > /opt/scripts/.docker_config/.healthcheck - -# Reading ENV -adminport=$IOB_ADMINPORT -avahi=$AVAHI -multihost=$IOB_MULTIHOST -objectsdbhost=$IOB_OBJECTSDB_HOST -objectsdbport=$IOB_OBJECTSDB_PORT -objectsdbtype=$IOB_OBJECTSDB_TYPE -packages=$PACKAGES -setgid=$SETGID -setuid=$SETUID -statesdbhost=$IOB_STATESDB_HOST -statesdbport=$IOB_STATESDB_PORT -statesdbtype=$IOB_STATESDB_TYPE -usbdevices=$USBDEVICES -zwave=$ZWAVE - -# Getting date and time for logging -dati=`date '+%Y-%m-%d %H:%M:%S'` - -# Logging header -echo ' ' -echo "$(printf -- '-%.0s' {1..60})" -echo -n "$(printf -- '-%.0s' {1..15})" && echo -n " "$dati" " && echo "$(printf -- '-%.0s' {1..15})" -echo "$(printf -- '-%.0s' {1..60})" -echo ' ' -echo "$(printf -- '-%.0s' {1..60})" -echo "----- Welcome to your ioBroker-container! -----" -echo "----- Startupscript is now running. -----" -echo "----- Please be patient! -----" -echo "$(printf -- '-%.0s' {1..60})" -echo ' ' -echo "$(printf -- '-%.0s' {1..60})" -echo "----- Debugging information -----" -echo "----- -----" -echo "----- System -----" -echo -n "----- " && echo -n "$(printf "%-10s %-23s" arch: $(uname -m))" && echo " -----" -echo "----- -----" -echo "----- Versions -----" -echo -n "----- " && echo -n "$(printf "%-10s %-23s" image: $VERSION)" && echo " -----" -echo -n "----- " && echo -n "$(printf "%-10s %-23s" node: $(node -v))" && echo " -----" -echo -n "----- " && echo -n "$(printf "%-10s %-23s" npm: $(npm -v))" && echo " -----" -echo "----- -----" -echo "----- ENV -----" -if [ "$adminport" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" IOB_ADMINPORT: $adminport)" && echo " -----"; fi -if [ "$avahi" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" AVAHI: $avahi)" && echo " -----"; fi -if [ "$multihost" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" IOB_MULTIHOST: $multihost)" && echo " -----"; fi -if [ "$objectsdbhost" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" IOB_OBJECTSDB_HOST: $objectsdbhost)" && echo " -----"; fi -if [ "$objectsdbport" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" IOB_OBJECTSDB_PORT: $objectsdbport)" && echo " -----"; fi -if [ "$objectsdbtype" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" IOB_OBJECTSDB_TYPE: $objectsdbtype)" && echo " -----"; fi -if [ "$packages" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" PACKAGES: $packages)" && echo " -----"; fi -if [ "$setgid" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" SETGID: $setgid)" && echo " -----"; fi -if [ "$setuid" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" SETUID: $setuid)" && echo " -----"; fi -if [ "$statesdbhost" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" IOB_STATESDB_HOST: $statesdbhost)" && echo " -----"; fi -if [ "$statesdbport" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" IOB_STATESDB_PORT: $statesdbport)" && echo " -----"; fi -if [ "$statesdbtype" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" IOB_STATESDB_TYPE: $statesdbtype)" && echo " -----"; fi -if [ "$usbdevices" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" USBDEVICES: $usbdevices)" && echo " -----"; fi -if [ "$zwave" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" ZWAVE: $zwave)" && echo " -----"; fi -echo "$(printf -- '-%.0s' {1..60})" -echo ' ' - -##### -# STEP 1 - Preparing container -##### -echo "$(printf -- '-%.0s' {1..60})" -echo "----- Step 1 of 5: Preparing container -----" -echo "$(printf -- '-%.0s' {1..60})" -echo ' ' - -# Installing additional packages and setting uid/gid -if [ "$packages" != "" ] || [ $(cat /etc/group | grep 'iobroker:' | cut -d':' -f3) != $setgid ] || [ $(cat /etc/passwd | grep 'iobroker:' | cut -d':' -f3) != $setuid ] || [ -f /opt/.firstrun ] -then - if [ "$packages" != "" ] - then - echo "Installing additional packages is set by ENV." - echo "The following packages will be installed:" $packages"..." - echo $packages > /opt/scripts/.packages - bash /opt/scripts/setup_packages.sh - echo "Done." - echo ' ' - fi - if [ $(cat /etc/group | grep 'iobroker:' | cut -d':' -f3) != $setgid ] || [ $(cat /etc/passwd | grep 'iobroker:' | cut -d':' -f3) != $setuid ] - then - echo "Different UID and/ or GID is set by ENV." - echo "Changing UID to "$setuid" and GID to "$setgid"..." - usermod -u $setuid iobroker - groupmod -g $setgid iobroker - echo "Done." - echo ' ' - fi - if [ -f /opt/.firstrun ] - then - echo "Registering maintenance script as command." - echo "alias maintenance=\'/opt/scripts/maintenance.sh\'" >> /root/.bashrc - echo "alias maint=\'/opt/scripts/maintenance.sh\'" >> /root/.bashrc - echo "Done." - echo ' ' - fi -else - echo "Nothing to do here." - echo ' ' -fi - -# Change directory for next steps -cd /opt/iobroker - - -##### -# Detecting ioBroker-Installation -##### -echo "$(printf -- '-%.0s' {1..60})" -echo "----- Step 2 of 5: Detecting ioBroker installation -----" -echo "$(printf -- '-%.0s' {1..60})" -echo ' ' - -if [ `find /opt/iobroker -type f | wc -l` -lt 1 ] -then - echo "There is no data detected in /opt/iobroker. 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." - rm -f /opt/scripts/.docker_config/.install_host -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 readme.md on Github (https://github.com/buanet/ioBroker.docker)." - exit 1 - else - echo "IoBroker backup file detected in /opt/iobroker. 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/ - chown -R $setuid:$setgid /opt/iobroker # fixes permission error during restore - echo "Done." - echo "Restoring ioBroker..." - iobroker restore 0 > /opt/iobroker/log/restore.log 2>&1 - echo "Done." - echo ' ' - echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" - echo "!!!!! IMPORTANT NOTE !!!!!" - echo "!!!!! The sartup 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 -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/ volume and start over." - exit 1 -fi -echo ' ' - - -##### -# Checking ioBroker-Installation -##### -echo "$(printf -- '-%.0s' {1..60})" -echo "----- Step 3 of 5: Checking ioBroker installation -----" -echo "$(printf -- '-%.0s' {1..60})" -echo ' ' - -# (Re)Setting permissions to "/opt/iobroker" and "/opt/scripts" -echo "(Re)Setting folder permissions (This might take a while! Please be patient!)..." - chown -R $setuid:$setgid /opt/iobroker - chown -R $setuid:$setgid /opt/scripts -echo "Done." -echo ' ' - -# Backing up original iobroker-file and changing sudo to gosu -echo "Fixing \"sudo-bug\" by replacing sudo in iobroker 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 for first run of a new installation and renaming ioBroker -if [ -f /opt/scripts/.docker_config/.install_host ] -then - echo "Looks like this is a new and empty installation of ioBroker." - echo "Hostname needs to be updated to " $(hostname)"..." - bash iobroker host $(cat /opt/scripts/.docker_config/.install_host) - rm -f /opt/scripts/.docker_config/.install_host - echo "Done." - echo ' ' -elif [ $(bash iobroker object get system.adapter.admin.0 --pretty | grep -oP '(?<="host": ")[^"]*') != $(hostname) ] -then - echo "Hostname in ioBroker does not match the hostname of this container." - echo "Updating hostname to " $(hostname)"..." - bash iobroker host $(iobroker object get system.adapter.admin.0 --pretty | grep -oP '(?<="host": ")[^"]*') - echo "Done." - echo ' ' -fi - - -##### -# Setting up prerequisites for some ioBroker-adapters -##### -echo "$(printf -- '-%.0s' {1..60})" -echo "----- Step 4 of 5: Applying special settings -----" -echo "$(printf -- '-%.0s' {1..60})" -echo ' ' - -echo "Some adapters have special requirements/ settings which can be activated by the use of environment variables." -echo "For more information take a look at readme.md on Github!" -echo ' ' - - -# Checking ENV for Adminport -if [ "$adminport" != "" ] -then - if [ "$adminport" != $(bash iobroker object get system.adapter.admin.0 --pretty | grep -oP '(?<="port": )[^,]*') ] - then - echo "Adminport set by ENV does not match port configured in ioBroker installation." - echo "Setting Adminport to \""$adminport"\"..." - bash iobroker set admin.0 --port $adminport - echo "Done." - echo ' ' - fi -fi - - -# Checking ENV for AVAHI -if [ "$avahi" != "" ] -then - if [ "$avahi" = "true" ] - then - echo "Avahi-daemon is activated by ENV." - chmod 755 /opt/scripts/setup_avahi.sh - bash /opt/scripts/setup_avahi.sh - echo "Done." - echo ' ' - fi -fi - - -# Checking ENV for Z-WAVE -if [ "$zwave" != "" ] -then - if [ "$zwave" = "true" ] - then - echo "Z-Wave is activated by ENV." - chmod 755 /opt/scripts/setup_zwave.sh - bash /opt/scripts/setup_zwave.sh - echo "Done." - echo ' ' - fi -fi - - -# checking ENV for USBDEVICES -if [ "$usbdevices" != "" ] -then - if [ "$usbdevices" != "none" ] - then - echo "Usb-device-support is activated by ENV." - IFS=';' read -ra devicearray <<< "$usbdevices" - for i in "${devicearray[@]}" - do - echo "Setting permissions for" $i"..." - chown root:dialout $i - chmod g+rw $i - done - echo "Done." - echo ' ' - fi -fi - - -# Checking ENV for multihost setup -# Configuring objects db host -if [ "$multihost" = "master" ] && [ "$objectsdbtype" = "" ] && [ "$objectsdbhost" = "" ] && [ "$objectsdbport" = "" ] -then - echo "Multihost is set as \"master\" by ENV and no external objects db is set." - echo "Setting host of objects db to \"0.0.0.0\" to allow external communication..." - 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." - echo ' ' -elif [ "$multihost" = "master" ] && [ "$objectsdbhost" = "127.0.0.1" ] -then - echo "Multihost is set as \"master\" by ENV. But objects db host is set to \"127.0.0.1\" by ENV too." - echo "This configuration will not work! Please change or remove ENV \"IOB_OBJECTSDB_HOST\" and start over!" - echo "For more information see readme.md on Github (https://github.com/buanet/ioBroker.docker)." - exit 1 -elif [ "$multihost" = "master" ] && [ "$objectsdbtype" != "" ] && [ "$objectsdbhost" != "" ] && [ "$objectsdbport" != "" ] -then - echo "Multihost is set as \"master\" by ENV and external objects db is set." - echo "Skipping this step..." - echo "Done." - echo ' ' -elif ([ "$multihost" = "slave" ] && [ "$objectsdbtype" = "" ]) || ([ "$multihost" = "slave" ] && [ "$objectsdbhost" = "" ]) || ([ "$multihost" = "slave" ] && [ "$objectsdbport" = "" ]) -then - echo "Multihost is set as \"slave\" by ENV. But no external objects db is set." - echo "You have to configure ENVs \"IOB_OBJECTSDB_TYPE\", \"IOB_OBJECTSDB_HOST\" and \"IOB_OBJECTSDB_PORT\" to connect to a maser objects db." - echo "Please check your settings and start over." - echo "For more information see readme.md on Github (https://github.com/buanet/ioBroker.docker)." - exit 1 -elif [ "$multihost" = "slave" ] && [ "$objectsdbtype" != "" ] && [ "$objectsdbhost" != "" ] && [ "$objectsdbport" != "" ] -then - echo "Multihost is set as \"slave\" by ENV and external objects db is set." - echo "Skipping this step..." - echo "Done." - echo ' ' -elif [ "$multihost" != "" ] -then - echo "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 readme.md on Github (https://github.com/buanet/ioBroker.docker)." - exit 1 -fi -#Configuring states db host -if [ "$multihost" = "master" ] && [ "$statesdbtype" = "" ] && [ "$statesdbhost" = "" ] && [ "$statesdbport" = "" ] -then - echo "Multihost is set as \"master\" by ENV and no external states db is set." - echo "Setting host of states db to \"0.0.0.0\" to allow external communication..." - 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." - echo ' ' -elif [ "$multihost" = "master" ] && [ "$statesdbhost" = "127.0.0.1" ] -then - echo "Multihost is set as \"master\" by ENV. But states db host is set to \"127.0.0.1\" by ENV too." - echo "This configuration will not work! Please change or remove ENV \"IOB_STATESDB_HOST\" and start over!" - echo "For more information see readme.md on Github (https://github.com/buanet/ioBroker.docker)." - exit 1 -elif [ "$multihost" = "master" ] && [ "$statesdbtype" != "" ] && [ "$statesdbhost" != "" ] && [ "$statesdbport" != "" ] -then - echo "Multihost is set as \"master\" by ENV and external states db is set." - echo "Skipping this step..." - echo "Done." - echo ' ' -elif ([ "$multihost" = "slave" ] && [ "$statesdbtype" = "" ]) || ([ "$multihost" = "slave" ] && [ "$statesdbhost" = "" ]) || ([ "$multihost" = "slave" ] && [ "$statesdbport" = "" ]) -then - echo "Multihost is set as \"slave\" by ENV. But no external states db is set." - 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 readme.md on Github (https://github.com/buanet/ioBroker.docker)." - exit 1 -elif [ "$multihost" = "slave" ] && [ "$statesdbtype" != "" ] && [ "$statesdbhost" != "" ] && [ "$statesdbport" != "" ] -then - echo "Multihost is set as \"slave\" by ENV and external states db is set." - echo "Skipping this step..." - echo "Done." - echo ' ' -elif [ "$multihost" != "" ] -then - echo "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 readme.md on Github (https://github.com/buanet/ioBroker.docker)." - exit 1 -fi - - -# Checking ENVs for custom setup of objects db -if [ "$objectsdbtype" != "" ] || [ "$objectsdbhost" != "" ] || [ "$objectsdbport" != "" ] -then - if [ "$objectsdbtype" != $(jq -r '.objects.type' /opt/iobroker/iobroker-data/iobroker.json) ] - then - echo "ENV IOB_OBJECTSDB_TYPE is set and value is different from detected ioBroker installation." - echo "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 "ENV IOB_OBJECTSDB_TYPE is set and value meets detected ioBroker installation. Nothing to do here." - fi - if [ "$objectsdbhost" != $(jq -r '.objects.host' /opt/iobroker/iobroker-data/iobroker.json) ] - then - echo "ENV IOB_OBJECTSDB_HOST is set and value is different from detected ioBroker installation." - echo "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 "ENV IOB_OBJECTSDB_HOST is set and value meets detected ioBroker installation. Nothing to do here." - fi - if [ "$objectsdbport" != $(jq -r '.objects.port' /opt/iobroker/iobroker-data/iobroker.json) ] - then - echo "ENV IOB_OBJECTSDB_PORT is set and value is different from detected ioBroker installation." - echo "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 "ENV IOB_OBJECTSDB_PORT is set and value meets detected ioBroker installation. Nothing to do here." - fi - echo ' ' -fi - - -# Checking ENVs for custom setup of states db# -if [ "$statesdbtype" != "" ] || [ "$statesdbhost" != "" ] || [ "$statesdbport" != "" ] -then - if [ "$statesdbtype" != $(jq -r '.states.type' /opt/iobroker/iobroker-data/iobroker.json) ] - then - echo "ENV IOB_STATESDB_TYPE is set and value is different from detected ioBroker installation." - echo "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 "ENV IOB_STATESDB_TYPE is set and value meets detected ioBroker installation. Nothing to do here." - fi - if [ "$statesdbhost" != $(jq -r '.states.host' /opt/iobroker/iobroker-data/iobroker.json) ] - then - echo "ENV IOB_STATESDB_HOST is set and value is different from detected ioBroker installation." - echo "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 "ENV IOB_STATESDB_HOST is set and value meets detected ioBroker installation. Nothing to do here." - fi - if [ "$statesdbport" != $(jq -r '.states.port' /opt/iobroker/iobroker-data/iobroker.json) ] - then - echo "ENV IOB_STATESDB_PORT is set and value is different from detected ioBroker installation." - echo "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 "ENV IOB_STATESDB_PORT is set and value meets detected ioBroker installation. Nothing to do here." - fi - echo ' ' -fi - - -# Checking for Userscripts in /opt/userscripts -if [ `find /opt/userscripts -type f | wc -l` -lt 1 ] -then - echo "There is no data detected in /opt/userscripts. Restoring exapmple userscripts..." - tar -xf /opt/initial_userscripts.tar -C / - chmod 755 /opt/userscripts/userscript_firststart_example.sh - chmod 755 /opt/userscripts/userscript_everystart_example.sh - echo "Done." - echo ' ' -elif [ -f /opt/userscripts/userscript_firststart.sh ] || [ -f /opt/userscripts/userscript_everystart.sh ] -then - if [ -f /opt/userscripts/userscript_firststart.sh ] && [ -f /opt/.firstrun ] - then - 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 - -# Removing first run marker when exists -if [ -f /opt/.firstrun ] -then -rm -f /opt/.firstrun -fi - -##### -# Starting ioBroker -##### -echo "$(printf -- '-%.0s' {1..60})" -echo "----- Step 5 of 5: ioBroker startup -----" -echo "$(printf -- '-%.0s' {1..60})" -echo ' ' -echo "Starting ioBroker..." -echo ' ' - -# 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..." - pid=$(ps -ef | awk '/[j]s.controller/{print $2}') - kill -SIGTERM "$pid" - 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/arm32v7/scripts/maintenance.sh b/arm32v7/scripts/maintenance.sh deleted file mode 100644 index 4f77980..0000000 --- a/arm32v7/scripts/maintenance.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/bin/bash - -if [ "$1" == "status" ] -then - if [ $(cat /opt/scripts/.docker_config/.healthcheck) == 'maintenance' ] - then - echo 'Maintenance mode is ON.' - exit 0 - elif [ $(cat /opt/scripts/.docker_config/.healthcheck) != 'maintenance' ] - then - echo 'Maintenance mode is OFF.' - exit 0 - fi -elif [ "$1" == "on" ] -then - echo 'You are going to stop ioBroker and activating maintenance mode for this container.' - read -p 'Do you want to continue [yes/no]? ' A - if [ "$A" == "y" ] || [ "$A" == "Y" ] || [ "$A" == "yes" ] - then - echo 'Activating maintenance mode...' - echo "maintenance" > /opt/scripts/.docker_config/.healthcheck - sleep 1 - echo 'Done.' - echo 'Stopping ioBroker...' - pkill -u iobroker - sleep 1 - echo 'Done.' - exit 0 - else - exit 0 - fi -elif [ "$1" == "off" ] -then - echo 'You are going to deactivate maintenance mode for this container.' - echo 'Depending of the restart policy of this container, this will stop/ restart your container immediately.' - read -p 'Do you want to continue [yes/no]? ' A - if [ "$A" == "y" ] || [ "$A" == "Y" ] || [ "$A" == "yes" ] - then - echo 'Deactivating maintenance mode and forcing container to stop/ restart...' - echo "maintenance" > /opt/scripts/.docker_config/.healthcheck - pkill -u root - exit 0 - else - exit 0 - fi -else - echo 'Invalid command. Please try again.' -fi - -exit 0 diff --git a/arm32v7/scripts/setup_avahi.sh b/arm32v7/scripts/setup_avahi.sh deleted file mode 100644 index 4fd1ab1..0000000 --- a/arm32v7/scripts/setup_avahi.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - -echo "Checking avahi-daemon installation state..." - -if [ -e /usr/sbin/avahi-daemon ] && [ -e /var/run/dbus ] -then - echo "Avahi is already installed..." -else - echo "Avahi-daemon is NOT installed. Going to install it now..." - apt-get update > /opt/scripts/avahi_startup.log 2>&1 - apt-get install -y 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 "Configuring avahi-daemon..." - sed -i '/^rlimit-nproc/s/^\(.*\)/#\1/g' /etc/avahi/avahi-daemon.conf - echo "Configuring dbus..." - mkdir /var/run/dbus/ -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 "Starting dbus..." -dbus-daemon --system - -echo "Starting avahi-daemon..." -/etc/init.d/avahi-daemon start - -exit 0 diff --git a/arm32v7/scripts/setup_packages.sh b/arm32v7/scripts/setup_packages.sh deleted file mode 100644 index 449900f..0000000 --- a/arm32v7/scripts/setup_packages.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -apt-get -qq update - -packages=$(cat /opt/scripts/.packages) -for i in $packages; do - sudo apt-get -qq -y install $i -done - -rm -rf /var/lib/apt/lists/* -rm -f /opt/scripts/.packages - -exit 0 diff --git a/arm32v7/scripts/setup_zwave.sh b/arm32v7/scripts/setup_zwave.sh deleted file mode 100644 index 11d8024..0000000 --- a/arm32v7/scripts/setup_zwave.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash - -echo "Checking openzwave installation state..." - -if [ -e /usr/local/lib64 ] -then - echo "Openzwave is already installed..." -else - echo "Openzwave is NOT installed. Going to install it now..." - cd /opt - 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 - # echo "Openzwave is now installed..." -fi - -exit 0 diff --git a/arm32v7/scripts/userscript_everystart_example.sh b/arm32v7/scripts/userscript_everystart_example.sh deleted file mode 100644 index 9023677..0000000 --- a/arm32v7/scripts/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/arm32v7/scripts/userscript_firststart_example.sh b/arm32v7/scripts/userscript_firststart_example.sh deleted file mode 100644 index 4fef50d..0000000 --- a/arm32v7/scripts/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/arm64v8/Dockerfile b/arm64v8/Dockerfile deleted file mode 100644 index 6e23a59..0000000 --- a/arm64v8/Dockerfile +++ /dev/null @@ -1,108 +0,0 @@ -FROM balenalib/aarch64-debian:buster - -LABEL org.opencontainers.image.title="ioBroker Docker Image" \ - org.opencontainers.image.description="Docker image for ioBroker smarthome software" \ - org.opencontainers.image.authors="info@buanet.de" \ - org.opencontainers.image.url="https://github.com/buanet/ioBroker.docker" \ - org.opencontainers.image.version="${VERSION}" \ - org.opencontainers.image.created="${DATI}" - - -ENV DEBIAN_FRONTEND noninteractive - -# Install prerequisites (as listed in iobroker installer.sh) -RUN apt-get update && apt-get install -y \ - acl \ - apt-utils \ - build-essential \ - curl \ - git \ - gnupg2 \ - gosu \ - jq \ - libavahi-compat-libdnssd-dev \ - libcap2-bin \ - libpam0g-dev \ - libudev-dev \ - locales \ - pkg-config \ - procps \ - python \ - python-dev \ - sudo \ - udev \ - unzip \ - wget \ - && rm -rf /var/lib/apt/lists/* - -# Install node -RUN curl -sL https://deb.nodesource.com/setup_12.x | bash \ - && apt-get update && apt-get install -y nodejs \ - && rm -rf /var/lib/apt/lists/* - -# Generating locales -RUN 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 scripts directorys and copy scripts -RUN mkdir -p /opt/scripts/ \ - && mkdir -p /opt/userscripts/ \ - && chmod 777 /opt/scripts/ \ - && chmod 777 /opt/userscripts/ -WORKDIR /opt/scripts/ -COPY scripts/iobroker_startup.sh iobroker_startup.sh -COPY scripts/setup_avahi.sh setup_avahi.sh -COPY scripts/setup_packages.sh setup_packages.sh -COPY scripts/setup_zwave.sh setup_zwave.sh -COPY scripts/healthcheck.sh healthcheck.sh -COPY scripts/maintenance.sh maintenance.sh -RUN chmod +x iobroker_startup.sh \ - && chmod +x setup_avahi.sh \ - && chmod +x setup_packages.sh \ - && chmod +x setup_zwave.sh \ - && chmod +x healthcheck.sh \ - && chmod +x maintenance.sh -WORKDIR /opt/userscripts/ -COPY scripts/userscript_firststart_example.sh userscript_firststart_example.sh -COPY scripts/userscript_everystart_example.sh userscript_everystart_example.sh - -# Install ioBroker -WORKDIR / -RUN apt-get update \ - && curl -sL https://iobroker.net/install.sh | bash - \ - && mkdir -p /opt/scripts/.docker_config/ \ - && echo $(hostname) > /opt/scripts/.docker_config/.install_host \ - && echo "starting" > /opt/scripts/.docker_config/.healthcheck \ - && echo $(hostname) > /opt/.firstrun \ - && rm -rf /var/lib/apt/lists/* - -# Install node-gyp -WORKDIR /opt/iobroker/ -RUN npm install -g node-gyp - -# Backup initial ioBroker and userscript folder -RUN tar -cf /opt/initial_iobroker.tar /opt/iobroker \ - && tar -cf /opt/initial_userscripts.tar /opt/userscripts - -# Setting up iobroker-user (shell and home directory) -RUN chsh -s /bin/bash iobroker \ - && usermod --home /opt/iobroker iobroker \ - && usermod -u 1000 iobroker \ - && groupmod -g 1000 iobroker - -# Setting up 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" - -# 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/arm64v8/manifest.yml b/arm64v8/manifest.yml deleted file mode 100644 index 657cde3..0000000 --- a/arm64v8/manifest.yml +++ /dev/null @@ -1,8 +0,0 @@ -image: buanet/iobroker:$VERSION-arm64v8 -manifests: - - - image: buanet/iobroker:$VERSION-arm64v8 - platform: - architecture: arm64 - variant: v8 - os: linux diff --git a/arm64v8/scripts/healthcheck.sh b/arm64v8/scripts/healthcheck.sh deleted file mode 100644 index 072f9c0..0000000 --- a/arm64v8/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/arm64v8/scripts/iobroker_startup.sh b/arm64v8/scripts/iobroker_startup.sh deleted file mode 100644 index 67c1ffb..0000000 --- a/arm64v8/scripts/iobroker_startup.sh +++ /dev/null @@ -1,507 +0,0 @@ -#!/bin/bash - -# Setting healthcheck status to "starting" -echo "starting" > /opt/scripts/.docker_config/.healthcheck - -# Reading ENV -adminport=$IOB_ADMINPORT -avahi=$AVAHI -multihost=$IOB_MULTIHOST -objectsdbhost=$IOB_OBJECTSDB_HOST -objectsdbport=$IOB_OBJECTSDB_PORT -objectsdbtype=$IOB_OBJECTSDB_TYPE -packages=$PACKAGES -setgid=$SETGID -setuid=$SETUID -statesdbhost=$IOB_STATESDB_HOST -statesdbport=$IOB_STATESDB_PORT -statesdbtype=$IOB_STATESDB_TYPE -usbdevices=$USBDEVICES -zwave=$ZWAVE - -# Getting date and time for logging -dati=`date '+%Y-%m-%d %H:%M:%S'` - -# Logging header -echo ' ' -echo "$(printf -- '-%.0s' {1..60})" -echo -n "$(printf -- '-%.0s' {1..15})" && echo -n " "$dati" " && echo "$(printf -- '-%.0s' {1..15})" -echo "$(printf -- '-%.0s' {1..60})" -echo ' ' -echo "$(printf -- '-%.0s' {1..60})" -echo "----- Welcome to your ioBroker-container! -----" -echo "----- Startupscript is now running. -----" -echo "----- Please be patient! -----" -echo "$(printf -- '-%.0s' {1..60})" -echo ' ' -echo "$(printf -- '-%.0s' {1..60})" -echo "----- Debugging information -----" -echo "----- -----" -echo "----- System -----" -echo -n "----- " && echo -n "$(printf "%-10s %-23s" arch: $(uname -m))" && echo " -----" -echo "----- -----" -echo "----- Versions -----" -echo -n "----- " && echo -n "$(printf "%-10s %-23s" image: $VERSION)" && echo " -----" -echo -n "----- " && echo -n "$(printf "%-10s %-23s" node: $(node -v))" && echo " -----" -echo -n "----- " && echo -n "$(printf "%-10s %-23s" npm: $(npm -v))" && echo " -----" -echo "----- -----" -echo "----- ENV -----" -if [ "$adminport" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" IOB_ADMINPORT: $adminport)" && echo " -----"; fi -if [ "$avahi" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" AVAHI: $avahi)" && echo " -----"; fi -if [ "$multihost" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" IOB_MULTIHOST: $multihost)" && echo " -----"; fi -if [ "$objectsdbhost" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" IOB_OBJECTSDB_HOST: $objectsdbhost)" && echo " -----"; fi -if [ "$objectsdbport" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" IOB_OBJECTSDB_PORT: $objectsdbport)" && echo " -----"; fi -if [ "$objectsdbtype" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" IOB_OBJECTSDB_TYPE: $objectsdbtype)" && echo " -----"; fi -if [ "$packages" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" PACKAGES: $packages)" && echo " -----"; fi -if [ "$setgid" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" SETGID: $setgid)" && echo " -----"; fi -if [ "$setuid" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" SETUID: $setuid)" && echo " -----"; fi -if [ "$statesdbhost" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" IOB_STATESDB_HOST: $statesdbhost)" && echo " -----"; fi -if [ "$statesdbport" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" IOB_STATESDB_PORT: $statesdbport)" && echo " -----"; fi -if [ "$statesdbtype" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" IOB_STATESDB_TYPE: $statesdbtype)" && echo " -----"; fi -if [ "$usbdevices" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" USBDEVICES: $usbdevices)" && echo " -----"; fi -if [ "$zwave" != "" ]; then echo -n "----- " && echo -n "$(printf "%-10s %-23s" ZWAVE: $zwave)" && echo " -----"; fi -echo "$(printf -- '-%.0s' {1..60})" -echo ' ' - -##### -# STEP 1 - Preparing container -##### -echo "$(printf -- '-%.0s' {1..60})" -echo "----- Step 1 of 5: Preparing container -----" -echo "$(printf -- '-%.0s' {1..60})" -echo ' ' - -# Installing additional packages and setting uid/gid -if [ "$packages" != "" ] || [ $(cat /etc/group | grep 'iobroker:' | cut -d':' -f3) != $setgid ] || [ $(cat /etc/passwd | grep 'iobroker:' | cut -d':' -f3) != $setuid ] || [ -f /opt/.firstrun ] -then - if [ "$packages" != "" ] - then - echo "Installing additional packages is set by ENV." - echo "The following packages will be installed:" $packages"..." - echo $packages > /opt/scripts/.packages - bash /opt/scripts/setup_packages.sh - echo "Done." - echo ' ' - fi - if [ $(cat /etc/group | grep 'iobroker:' | cut -d':' -f3) != $setgid ] || [ $(cat /etc/passwd | grep 'iobroker:' | cut -d':' -f3) != $setuid ] - then - echo "Different UID and/ or GID is set by ENV." - echo "Changing UID to "$setuid" and GID to "$setgid"..." - usermod -u $setuid iobroker - groupmod -g $setgid iobroker - echo "Done." - echo ' ' - fi - if [ -f /opt/.firstrun ] - then - echo "Registering maintenance script as command." - echo "alias maintenance=\'/opt/scripts/maintenance.sh\'" >> /root/.bashrc - echo "alias maint=\'/opt/scripts/maintenance.sh\'" >> /root/.bashrc - echo "Done." - echo ' ' - fi -else - echo "Nothing to do here." - echo ' ' -fi - -# Change directory for next steps -cd /opt/iobroker - - -##### -# Detecting ioBroker-Installation -##### -echo "$(printf -- '-%.0s' {1..60})" -echo "----- Step 2 of 5: Detecting ioBroker installation -----" -echo "$(printf -- '-%.0s' {1..60})" -echo ' ' - -if [ `find /opt/iobroker -type f | wc -l` -lt 1 ] -then - echo "There is no data detected in /opt/iobroker. 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." - rm -f /opt/scripts/.docker_config/.install_host -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 readme.md on Github (https://github.com/buanet/ioBroker.docker)." - exit 1 - else - echo "IoBroker backup file detected in /opt/iobroker. 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/ - chown -R $setuid:$setgid /opt/iobroker # fixes permission error during restore - echo "Done." - echo "Restoring ioBroker..." - iobroker restore 0 > /opt/iobroker/log/restore.log 2>&1 - echo "Done." - echo ' ' - echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" - echo "!!!!! IMPORTANT NOTE !!!!!" - echo "!!!!! The sartup 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 -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/ volume and start over." - exit 1 -fi -echo ' ' - - -##### -# Checking ioBroker-Installation -##### -echo "$(printf -- '-%.0s' {1..60})" -echo "----- Step 3 of 5: Checking ioBroker installation -----" -echo "$(printf -- '-%.0s' {1..60})" -echo ' ' - -# (Re)Setting permissions to "/opt/iobroker" and "/opt/scripts" -echo "(Re)Setting folder permissions (This might take a while! Please be patient!)..." - chown -R $setuid:$setgid /opt/iobroker - chown -R $setuid:$setgid /opt/scripts -echo "Done." -echo ' ' - -# Backing up original iobroker-file and changing sudo to gosu -echo "Fixing \"sudo-bug\" by replacing sudo in iobroker 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 for first run of a new installation and renaming ioBroker -if [ -f /opt/scripts/.docker_config/.install_host ] -then - echo "Looks like this is a new and empty installation of ioBroker." - echo "Hostname needs to be updated to " $(hostname)"..." - bash iobroker host $(cat /opt/scripts/.docker_config/.install_host) - rm -f /opt/scripts/.docker_config/.install_host - echo "Done." - echo ' ' -elif [ $(bash iobroker object get system.adapter.admin.0 --pretty | grep -oP '(?<="host": ")[^"]*') != $(hostname) ] -then - echo "Hostname in ioBroker does not match the hostname of this container." - echo "Updating hostname to " $(hostname)"..." - bash iobroker host $(iobroker object get system.adapter.admin.0 --pretty | grep -oP '(?<="host": ")[^"]*') - echo "Done." - echo ' ' -fi - - -##### -# Setting up prerequisites for some ioBroker-adapters -##### -echo "$(printf -- '-%.0s' {1..60})" -echo "----- Step 4 of 5: Applying special settings -----" -echo "$(printf -- '-%.0s' {1..60})" -echo ' ' - -echo "Some adapters have special requirements/ settings which can be activated by the use of environment variables." -echo "For more information take a look at readme.md on Github!" -echo ' ' - - -# Checking ENV for Adminport -if [ "$adminport" != "" ] -then - if [ "$adminport" != $(bash iobroker object get system.adapter.admin.0 --pretty | grep -oP '(?<="port": )[^,]*') ] - then - echo "Adminport set by ENV does not match port configured in ioBroker installation." - echo "Setting Adminport to \""$adminport"\"..." - bash iobroker set admin.0 --port $adminport - echo "Done." - echo ' ' - fi -fi - - -# Checking ENV for AVAHI -if [ "$avahi" != "" ] -then - if [ "$avahi" = "true" ] - then - echo "Avahi-daemon is activated by ENV." - chmod 755 /opt/scripts/setup_avahi.sh - bash /opt/scripts/setup_avahi.sh - echo "Done." - echo ' ' - fi -fi - - -# Checking ENV for Z-WAVE -if [ "$zwave" != "" ] -then - if [ "$zwave" = "true" ] - then - echo "Z-Wave is activated by ENV." - chmod 755 /opt/scripts/setup_zwave.sh - bash /opt/scripts/setup_zwave.sh - echo "Done." - echo ' ' - fi -fi - - -# checking ENV for USBDEVICES -if [ "$usbdevices" != "" ] -then - if [ "$usbdevices" != "none" ] - then - echo "Usb-device-support is activated by ENV." - IFS=';' read -ra devicearray <<< "$usbdevices" - for i in "${devicearray[@]}" - do - echo "Setting permissions for" $i"..." - chown root:dialout $i - chmod g+rw $i - done - echo "Done." - echo ' ' - fi -fi - - -# Checking ENV for multihost setup -# Configuring objects db host -if [ "$multihost" = "master" ] && [ "$objectsdbtype" = "" ] && [ "$objectsdbhost" = "" ] && [ "$objectsdbport" = "" ] -then - echo "Multihost is set as \"master\" by ENV and no external objects db is set." - echo "Setting host of objects db to \"0.0.0.0\" to allow external communication..." - 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." - echo ' ' -elif [ "$multihost" = "master" ] && [ "$objectsdbhost" = "127.0.0.1" ] -then - echo "Multihost is set as \"master\" by ENV. But objects db host is set to \"127.0.0.1\" by ENV too." - echo "This configuration will not work! Please change or remove ENV \"IOB_OBJECTSDB_HOST\" and start over!" - echo "For more information see readme.md on Github (https://github.com/buanet/ioBroker.docker)." - exit 1 -elif [ "$multihost" = "master" ] && [ "$objectsdbtype" != "" ] && [ "$objectsdbhost" != "" ] && [ "$objectsdbport" != "" ] -then - echo "Multihost is set as \"master\" by ENV and external objects db is set." - echo "Skipping this step..." - echo "Done." - echo ' ' -elif ([ "$multihost" = "slave" ] && [ "$objectsdbtype" = "" ]) || ([ "$multihost" = "slave" ] && [ "$objectsdbhost" = "" ]) || ([ "$multihost" = "slave" ] && [ "$objectsdbport" = "" ]) -then - echo "Multihost is set as \"slave\" by ENV. But no external objects db is set." - echo "You have to configure ENVs \"IOB_OBJECTSDB_TYPE\", \"IOB_OBJECTSDB_HOST\" and \"IOB_OBJECTSDB_PORT\" to connect to a maser objects db." - echo "Please check your settings and start over." - echo "For more information see readme.md on Github (https://github.com/buanet/ioBroker.docker)." - exit 1 -elif [ "$multihost" = "slave" ] && [ "$objectsdbtype" != "" ] && [ "$objectsdbhost" != "" ] && [ "$objectsdbport" != "" ] -then - echo "Multihost is set as \"slave\" by ENV and external objects db is set." - echo "Skipping this step..." - echo "Done." - echo ' ' -elif [ "$multihost" != "" ] -then - echo "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 readme.md on Github (https://github.com/buanet/ioBroker.docker)." - exit 1 -fi -#Configuring states db host -if [ "$multihost" = "master" ] && [ "$statesdbtype" = "" ] && [ "$statesdbhost" = "" ] && [ "$statesdbport" = "" ] -then - echo "Multihost is set as \"master\" by ENV and no external states db is set." - echo "Setting host of states db to \"0.0.0.0\" to allow external communication..." - 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." - echo ' ' -elif [ "$multihost" = "master" ] && [ "$statesdbhost" = "127.0.0.1" ] -then - echo "Multihost is set as \"master\" by ENV. But states db host is set to \"127.0.0.1\" by ENV too." - echo "This configuration will not work! Please change or remove ENV \"IOB_STATESDB_HOST\" and start over!" - echo "For more information see readme.md on Github (https://github.com/buanet/ioBroker.docker)." - exit 1 -elif [ "$multihost" = "master" ] && [ "$statesdbtype" != "" ] && [ "$statesdbhost" != "" ] && [ "$statesdbport" != "" ] -then - echo "Multihost is set as \"master\" by ENV and external states db is set." - echo "Skipping this step..." - echo "Done." - echo ' ' -elif ([ "$multihost" = "slave" ] && [ "$statesdbtype" = "" ]) || ([ "$multihost" = "slave" ] && [ "$statesdbhost" = "" ]) || ([ "$multihost" = "slave" ] && [ "$statesdbport" = "" ]) -then - echo "Multihost is set as \"slave\" by ENV. But no external states db is set." - 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 readme.md on Github (https://github.com/buanet/ioBroker.docker)." - exit 1 -elif [ "$multihost" = "slave" ] && [ "$statesdbtype" != "" ] && [ "$statesdbhost" != "" ] && [ "$statesdbport" != "" ] -then - echo "Multihost is set as \"slave\" by ENV and external states db is set." - echo "Skipping this step..." - echo "Done." - echo ' ' -elif [ "$multihost" != "" ] -then - echo "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 readme.md on Github (https://github.com/buanet/ioBroker.docker)." - exit 1 -fi - - -# Checking ENVs for custom setup of objects db -if [ "$objectsdbtype" != "" ] || [ "$objectsdbhost" != "" ] || [ "$objectsdbport" != "" ] -then - if [ "$objectsdbtype" != $(jq -r '.objects.type' /opt/iobroker/iobroker-data/iobroker.json) ] - then - echo "ENV IOB_OBJECTSDB_TYPE is set and value is different from detected ioBroker installation." - echo "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 "ENV IOB_OBJECTSDB_TYPE is set and value meets detected ioBroker installation. Nothing to do here." - fi - if [ "$objectsdbhost" != $(jq -r '.objects.host' /opt/iobroker/iobroker-data/iobroker.json) ] - then - echo "ENV IOB_OBJECTSDB_HOST is set and value is different from detected ioBroker installation." - echo "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 "ENV IOB_OBJECTSDB_HOST is set and value meets detected ioBroker installation. Nothing to do here." - fi - if [ "$objectsdbport" != $(jq -r '.objects.port' /opt/iobroker/iobroker-data/iobroker.json) ] - then - echo "ENV IOB_OBJECTSDB_PORT is set and value is different from detected ioBroker installation." - echo "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 "ENV IOB_OBJECTSDB_PORT is set and value meets detected ioBroker installation. Nothing to do here." - fi - echo ' ' -fi - - -# Checking ENVs for custom setup of states db# -if [ "$statesdbtype" != "" ] || [ "$statesdbhost" != "" ] || [ "$statesdbport" != "" ] -then - if [ "$statesdbtype" != $(jq -r '.states.type' /opt/iobroker/iobroker-data/iobroker.json) ] - then - echo "ENV IOB_STATESDB_TYPE is set and value is different from detected ioBroker installation." - echo "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 "ENV IOB_STATESDB_TYPE is set and value meets detected ioBroker installation. Nothing to do here." - fi - if [ "$statesdbhost" != $(jq -r '.states.host' /opt/iobroker/iobroker-data/iobroker.json) ] - then - echo "ENV IOB_STATESDB_HOST is set and value is different from detected ioBroker installation." - echo "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 "ENV IOB_STATESDB_HOST is set and value meets detected ioBroker installation. Nothing to do here." - fi - if [ "$statesdbport" != $(jq -r '.states.port' /opt/iobroker/iobroker-data/iobroker.json) ] - then - echo "ENV IOB_STATESDB_PORT is set and value is different from detected ioBroker installation." - echo "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 "ENV IOB_STATESDB_PORT is set and value meets detected ioBroker installation. Nothing to do here." - fi - echo ' ' -fi - - -# Checking for Userscripts in /opt/userscripts -if [ `find /opt/userscripts -type f | wc -l` -lt 1 ] -then - echo "There is no data detected in /opt/userscripts. Restoring exapmple userscripts..." - tar -xf /opt/initial_userscripts.tar -C / - chmod 755 /opt/userscripts/userscript_firststart_example.sh - chmod 755 /opt/userscripts/userscript_everystart_example.sh - echo "Done." - echo ' ' -elif [ -f /opt/userscripts/userscript_firststart.sh ] || [ -f /opt/userscripts/userscript_everystart.sh ] -then - if [ -f /opt/userscripts/userscript_firststart.sh ] && [ -f /opt/.firstrun ] - then - 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 - -# Removing first run marker when exists -if [ -f /opt/.firstrun ] -then -rm -f /opt/.firstrun -fi - -##### -# Starting ioBroker -##### -echo "$(printf -- '-%.0s' {1..60})" -echo "----- Step 5 of 5: ioBroker startup -----" -echo "$(printf -- '-%.0s' {1..60})" -echo ' ' -echo "Starting ioBroker..." -echo ' ' - -# 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..." - pid=$(ps -ef | awk '/[j]s.controller/{print $2}') - kill -SIGTERM "$pid" - 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/arm64v8/scripts/maintenance.sh b/arm64v8/scripts/maintenance.sh deleted file mode 100644 index 4f77980..0000000 --- a/arm64v8/scripts/maintenance.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/bin/bash - -if [ "$1" == "status" ] -then - if [ $(cat /opt/scripts/.docker_config/.healthcheck) == 'maintenance' ] - then - echo 'Maintenance mode is ON.' - exit 0 - elif [ $(cat /opt/scripts/.docker_config/.healthcheck) != 'maintenance' ] - then - echo 'Maintenance mode is OFF.' - exit 0 - fi -elif [ "$1" == "on" ] -then - echo 'You are going to stop ioBroker and activating maintenance mode for this container.' - read -p 'Do you want to continue [yes/no]? ' A - if [ "$A" == "y" ] || [ "$A" == "Y" ] || [ "$A" == "yes" ] - then - echo 'Activating maintenance mode...' - echo "maintenance" > /opt/scripts/.docker_config/.healthcheck - sleep 1 - echo 'Done.' - echo 'Stopping ioBroker...' - pkill -u iobroker - sleep 1 - echo 'Done.' - exit 0 - else - exit 0 - fi -elif [ "$1" == "off" ] -then - echo 'You are going to deactivate maintenance mode for this container.' - echo 'Depending of the restart policy of this container, this will stop/ restart your container immediately.' - read -p 'Do you want to continue [yes/no]? ' A - if [ "$A" == "y" ] || [ "$A" == "Y" ] || [ "$A" == "yes" ] - then - echo 'Deactivating maintenance mode and forcing container to stop/ restart...' - echo "maintenance" > /opt/scripts/.docker_config/.healthcheck - pkill -u root - exit 0 - else - exit 0 - fi -else - echo 'Invalid command. Please try again.' -fi - -exit 0 diff --git a/arm64v8/scripts/setup_avahi.sh b/arm64v8/scripts/setup_avahi.sh deleted file mode 100644 index 4fd1ab1..0000000 --- a/arm64v8/scripts/setup_avahi.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - -echo "Checking avahi-daemon installation state..." - -if [ -e /usr/sbin/avahi-daemon ] && [ -e /var/run/dbus ] -then - echo "Avahi is already installed..." -else - echo "Avahi-daemon is NOT installed. Going to install it now..." - apt-get update > /opt/scripts/avahi_startup.log 2>&1 - apt-get install -y 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 "Configuring avahi-daemon..." - sed -i '/^rlimit-nproc/s/^\(.*\)/#\1/g' /etc/avahi/avahi-daemon.conf - echo "Configuring dbus..." - mkdir /var/run/dbus/ -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 "Starting dbus..." -dbus-daemon --system - -echo "Starting avahi-daemon..." -/etc/init.d/avahi-daemon start - -exit 0 diff --git a/arm64v8/scripts/setup_packages.sh b/arm64v8/scripts/setup_packages.sh deleted file mode 100644 index 449900f..0000000 --- a/arm64v8/scripts/setup_packages.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -apt-get -qq update - -packages=$(cat /opt/scripts/.packages) -for i in $packages; do - sudo apt-get -qq -y install $i -done - -rm -rf /var/lib/apt/lists/* -rm -f /opt/scripts/.packages - -exit 0 diff --git a/arm64v8/scripts/setup_zwave.sh b/arm64v8/scripts/setup_zwave.sh deleted file mode 100644 index 11d8024..0000000 --- a/arm64v8/scripts/setup_zwave.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash - -echo "Checking openzwave installation state..." - -if [ -e /usr/local/lib64 ] -then - echo "Openzwave is already installed..." -else - echo "Openzwave is NOT installed. Going to install it now..." - cd /opt - 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 - # echo "Openzwave is now installed..." -fi - -exit 0 diff --git a/arm64v8/scripts/userscript_everystart_example.sh b/arm64v8/scripts/userscript_everystart_example.sh deleted file mode 100644 index 9023677..0000000 --- a/arm64v8/scripts/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/arm64v8/scripts/userscript_firststart_example.sh b/arm64v8/scripts/userscript_firststart_example.sh deleted file mode 100644 index 4fef50d..0000000 --- a/arm64v8/scripts/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/debian/node12/Dockerfile b/debian/node12/Dockerfile index a05be5e..f4757e6 100644 --- a/debian/node12/Dockerfile +++ b/debian/node12/Dockerfile @@ -9,7 +9,7 @@ LABEL org.opencontainers.image.title="ioBroker Docker Image" \ ENV DEBIAN_FRONTEND noninteractive -# Install prerequisites +# Install prerequisites (including node) and generating locales RUN apt-get update && apt-get install -y \ curl \ gosu \ @@ -19,18 +19,15 @@ RUN apt-get update && apt-get install -y \ sudo \ udev \ wget \ - && rm -rf /var/lib/apt/lists/* - -# Install node -RUN curl -sL https://deb.nodesource.com/setup_12.x | bash \ + # 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 \ + # Install node + && curl -sL https://deb.nodesource.com/setup_12.x | bash \ && apt-get update && apt-get install -y nodejs \ && rm -rf /var/lib/apt/lists/* -# Generating locales -RUN 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 scripts directorys and copy scripts RUN mkdir -p /opt/scripts/ \ && mkdir -p /opt/userscripts/ \ @@ -40,7 +37,7 @@ WORKDIR /opt/scripts/ COPY scripts/* ./ RUN chmod +x *.sh WORKDIR /opt/userscripts/ -COPY scripts/* ./ +COPY userscripts/* ./ RUN chmod +x *.sh # Install ioBroker @@ -51,19 +48,18 @@ RUN apt-get update \ && echo $(hostname) > /opt/scripts/.docker_config/.install_host \ && echo "starting" > /opt/scripts/.docker_config/.healthcheck \ && echo $(hostname) > /opt/.firstrun \ + # Backup initial ioBroker and userscript folder + && tar -cf /opt/initial_iobroker.tar /opt/iobroker \ + && tar -cf /opt/initial_userscripts.tar /opt/userscripts \ && rm -rf /var/lib/apt/lists/* -# Backup initial ioBroker and userscript folder -RUN tar -cf /opt/initial_iobroker.tar /opt/iobroker \ - && tar -cf /opt/initial_userscripts.tar /opt/userscripts - # Setting up iobroker-user (shell and home directory) RUN chsh -s /bin/bash iobroker \ && usermod --home /opt/iobroker iobroker \ && usermod -u 1000 iobroker \ && groupmod -g 1000 iobroker -# Setting up ENVs +# Setting up default ENVs ENV DEBIAN_FRONTEND="teletype" \ LANG="de_DE.UTF-8" \ LANGUAGE="de_DE:de" \ diff --git a/debian/node14/Dockerfile b/debian/node14/Dockerfile index e3b629f..36ec884 100644 --- a/debian/node14/Dockerfile +++ b/debian/node14/Dockerfile @@ -9,7 +9,7 @@ LABEL org.opencontainers.image.title="ioBroker Docker Image" \ ENV DEBIAN_FRONTEND noninteractive -# Install prerequisites +# Install prerequisites (including node) and generating locales RUN apt-get update && apt-get install -y \ curl \ gosu \ @@ -19,18 +19,15 @@ RUN apt-get update && apt-get install -y \ sudo \ udev \ wget \ - && rm -rf /var/lib/apt/lists/* - -# Install node -RUN curl -sL https://deb.nodesource.com/setup_14.x | bash \ + # 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 \ + # Install node + && curl -sL https://deb.nodesource.com/setup_14.x | bash \ && apt-get update && apt-get install -y nodejs \ && rm -rf /var/lib/apt/lists/* -# Generating locales -RUN 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 scripts directorys and copy scripts RUN mkdir -p /opt/scripts/ \ && mkdir -p /opt/userscripts/ \ @@ -40,7 +37,7 @@ WORKDIR /opt/scripts/ COPY scripts/* ./ RUN chmod +x *.sh WORKDIR /opt/userscripts/ -COPY scripts/* ./ +COPY userscripts/* ./ RUN chmod +x *.sh # Install ioBroker @@ -51,19 +48,18 @@ RUN apt-get update \ && echo $(hostname) > /opt/scripts/.docker_config/.install_host \ && echo "starting" > /opt/scripts/.docker_config/.healthcheck \ && echo $(hostname) > /opt/.firstrun \ + # Backup initial ioBroker and userscript folder + && tar -cf /opt/initial_iobroker.tar /opt/iobroker \ + && tar -cf /opt/initial_userscripts.tar /opt/userscripts \ && rm -rf /var/lib/apt/lists/* -# Backup initial ioBroker and userscript folder -RUN tar -cf /opt/initial_iobroker.tar /opt/iobroker \ - && tar -cf /opt/initial_userscripts.tar /opt/userscripts - # Setting up iobroker-user (shell and home directory) RUN chsh -s /bin/bash iobroker \ && usermod --home /opt/iobroker iobroker \ && usermod -u 1000 iobroker \ && groupmod -g 1000 iobroker -# Setting up ENVs +# Setting up default ENVs ENV DEBIAN_FRONTEND="teletype" \ LANG="de_DE.UTF-8" \ LANGUAGE="de_DE:de" \ diff --git a/debian/scripts/iobroker_startup.sh b/debian/scripts/iobroker_startup.sh index b6f6dc1..b378f3d 100644 --- a/debian/scripts/iobroker_startup.sh +++ b/debian/scripts/iobroker_startup.sh @@ -75,12 +75,12 @@ echo "$(printf -- '-%.0s' {1..80})" echo ' ' # Adding ckeck file for easy docker detection by ioBroker -echo "$VERSION" > /opt/scripts/.docker_config/.thisisdocker +echo "${VERSION}" > /opt/scripts/.docker_config/.thisisdocker -# Installing/ updating additional packages and setting uid/gid +# Installing/updating additional packages, registering maintenance script and setting uid/gid if [ "$packages" != "" ] || [ $(cat /etc/group | grep 'iobroker:' | cut -d':' -f3) != $setgid ] || [ $(cat /etc/passwd | grep 'iobroker:' | cut -d':' -f3) != $setuid ] || [ -f /opt/.firstrun ] then - if [ -f /opt/.firstrun ] + if [ -f /opt/.firstrun ] then echo "Updating Linux packages on first run..." bash /opt/scripts/setup_packages.sh -update @@ -120,7 +120,7 @@ cd /opt/iobroker ##### -# Detecting ioBroker-Installation +# STEP 2 - Detecting ioBroker-Installation ##### echo "$(printf -- '-%.0s' {1..80})" echo "----- Step 2 of 5: Detecting ioBroker installation -----" @@ -131,6 +131,8 @@ if [ `find /opt/iobroker -type f | wc -l` -lt 1 ] then echo "There is no data detected in /opt/iobroker. Restoring initial ioBroker installation..." tar -xf /opt/initial_iobroker.tar -C / + # Removing UUID generated on docker image build + iobroker unsetup echo "Done." elif [ -f /opt/iobroker/iobroker ] then @@ -167,14 +169,14 @@ then fi 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/ volume and start over." + echo "Please check/ recreate mounted folder or volume and start over." exit 1 fi echo ' ' ##### -# Checking ioBroker-Installation +# STEP 3 - Checking ioBroker-Installation ##### echo "$(printf -- '-%.0s' {1..80})" echo "----- Step 3 of 5: Checking ioBroker installation -----" @@ -196,16 +198,8 @@ echo "Fixing \"sudo-bug\" by replacing sudo in iobroker with gosu..." echo "Done." echo ' ' -# Checking for first run of a new installation and renaming ioBroker -if [ -f /opt/scripts/.docker_config/.install_host ] -then - echo "Looks like this is a new and empty installation of ioBroker." - echo "Hostname needs to be updated to " $(hostname)"..." - bash iobroker host $(cat /opt/scripts/.docker_config/.install_host) - rm -f /opt/scripts/.docker_config/.install_host - echo "Done." - echo ' ' -elif [ $(bash iobroker object get system.adapter.admin.0 --pretty | grep -oP '(?<="host": ")[^"]*') != $(hostname) ] +# checking hostname in ioBroker to match container hostname +if [ $(bash iobroker object get system.adapter.admin.0 --pretty | grep -oP '(?<="host": ")[^"]*') != $(hostname) ] then echo "Hostname in ioBroker does not match the hostname of this container." echo "Updating hostname to " $(hostname)"..." @@ -214,9 +208,27 @@ then echo ' ' fi +# Checking for first run of a new installation and renaming ioBroker +#if [ -f /opt/scripts/.docker_config/.install_host ] +#then +# echo "Looks like this is a new and empty installation of ioBroker." +# echo "Hostname needs to be updated to " $(hostname)"..." +# bash iobroker host $(cat /opt/scripts/.docker_config/.install_host) +# rm -f /opt/scripts/.docker_config/.install_host +# echo "Done." +# echo ' ' +#elif [ $(bash iobroker object get system.adapter.admin.0 --pretty | grep -oP '(?<="host": ")[^"]*') != $(hostname) ] +#then +# echo "Hostname in ioBroker does not match the hostname of this container." +# echo "Updating hostname to " $(hostname)"..." +# bash iobroker host $(iobroker object get system.adapter.admin.0 --pretty | grep -oP '(?<="host": ")[^"]*') +# echo "Done." +# echo ' ' +#fi + ##### -# Setting up prerequisites for some ioBroker-adapters +# STEP 4 - Setting up prerequisites for some ioBroker-adapters ##### echo "$(printf -- '-%.0s' {1..80})" echo "----- Step 4 of 5: Applying special settings -----" @@ -485,7 +497,7 @@ rm -f /opt/.firstrun fi ##### -# Starting ioBroker +# STEP 5 - Starting ioBroker ##### echo "$(printf -- '-%.0s' {1..80})" echo "----- Step 5 of 5: ioBroker startup -----"