diff --git a/.VERSION b/.VERSION index ecdba1c..97a50b0 100644 --- a/.VERSION +++ b/.VERSION @@ -1 +1 @@ -v4.0.1beta +v4.0.2beta diff --git a/README.md b/README.md index 7798035..febfbff 100644 --- a/README.md +++ b/README.md @@ -32,19 +32,20 @@ The following will give a short overview. Since v3 is possible to set some environment variables to configure a new container. -|env|value|description| +|env|default|description| |---|---|---| -|PACKAGES|package1 package2 package2|seperateed by whitespace; will install the listed packages on startup
(be paitient, this may take some time!)| -|AVAHI|true|will install and activate avahi-daemon for supporting yahka-adapter| -|LANGUAGE|de_DE:de|following locales are pre-generated: de_DE:de, en_US:en| -|LANG|de_DE.UTF-8|following locales are pre-generated: de_DE.UTF-8, en_US.UTF-8| -|LC_ALL|de_DE|following locales are pre-generated: de_DE.UTF-8, en_US.UTF-8| -|TZ|Europe/Berlin|all valid Linux-timezones| -|SETUID|1000|for security reasons it might be useful to specify the uid of the containers iobroker user to match an existing user on the docker host| -|SETGID|1000|for security reasons it might be useful to specify the gid of the containers iobroker user to match an existing group on the docker host| -|ZWAVE|false|will install openzwave to support zwave-adapter| -|ADMINPORT|8081|for setting iobroker adminport (beta feature!)| -|USBDEVICES|none|for automatically setting permissions on mounted devices like "/dev/ttyACM0". For more than one device separate with ";" (beta feature!)| +|ADMINPORT|8081|Sets ioBroker-adminport on startup (beta)| +|AVAHI|false|Installs and activates avahi-daemon for supporting yahka-adapter, can be "true" or "false"| +|LANG|de_DE.UTF‑8|The following locales are pre-generated: de_DE.UTF-8, en_US.UTF-8| +|LANGUAGE|de_DE:de|The following locales are pre-generated: de_DE:de, en_US:en| +|LC_ALL|de_DE|The following locales are pre-generated: de_DE.UTF-8, en_US.UTF-8| +|PACKAGES|vi|Installs additional packages to your container, needed by some adapters, packages should be seperated by whitespace like "package1 package2 package3"| +|REDIS|false|Activates redis as states-db on startup, fill with "hostname:port" to set redis connection otherwise use "false"(beta)| +|SETGID|1000|For security reasons it might be useful to specify the gid of the containers iobroker user to match an existing group on the docker host| +|SETUID|1000|For security reasons it might be useful to specify the uid of the containers iobroker user to match an existing user on the docker host| +|TZ|Europe/Berlin|All valid Linux-timezones| +|USBDEVICES|none|Sets relevant permissions on mounted devices like "/dev/ttyACM0", for more than one device separate with ";" like "/dev/ttyACM0;/dev/ttyACM01" (beta)| +|ZWAVE|false|Will install openzwave to support zwave-adapter, can be "true" or "false"| ### Mounting Folder/ Volume @@ -60,11 +61,14 @@ After some issues with permissions related to the use of a dedicated user for io ## Changelog -### v4.0.1beta (2019-11-25) -* added env for iobroker admin port -* added env for usb-devices (setting permissions) -* updateing prerequisites for iobroker installation -* some small codefixes +### v4.0.2beta (2019-12-10) +* added env for activating redis +* enhancements in startupscript and dockerfile +* v4.0.1beta (2019-11-25) + * added env for iobroker admin port + * added env for usb-devices (setting permissions) + * updateing prerequisites for iobroker installation + * some small codefixes ### v4.0.0 (2019-10-25) * v3.1.4beta (2019-10-23) diff --git a/aarch64/Dockerfile b/aarch64/Dockerfile index 4551331..8dc774e 100644 --- a/aarch64/Dockerfile +++ b/aarch64/Dockerfile @@ -12,31 +12,31 @@ RUN apt-get update && apt-get upgrade -y && apt-get install -y \ curl \ git \ gnupg2 \ - gosu \ - libavahi-compat-libdnssd-dev \ + gosu \ + libavahi-compat-libdnssd-dev \ libcap2-bin \ libpam0g-dev \ libudev-dev \ locales \ - pkg-config \ - procps \ + pkg-config \ + procps \ python \ - python-dev \ - sudo \ + python-dev \ + sudo \ + udev \ unzip \ wget \ && rm -rf /var/lib/apt/lists/* # Install node10 RUN curl -sL https://deb.nodesource.com/setup_10.x | bash \ - && apt-get update && apt-get install -y \ - nodejs \ + && 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 + && sed -i 's/^# *\(en_US.UTF-8\)/\1/' /etc/locale.gen \ + && locale-gen # Create scripts directory and copy scripts RUN mkdir -p /opt/scripts/ \ @@ -47,7 +47,7 @@ COPY scripts/setup_avahi.sh setup_avahi.sh COPY scripts/setup_packages.sh setup_packages.sh COPY scripts/setup_zwave.sh setup_zwave.sh RUN chmod +x iobroker_startup.sh \ - && chmod +x setup_avahi.sh \ + && chmod +x setup_avahi.sh \ && chmod +x setup_packages.sh # Install ioBroker @@ -70,18 +70,19 @@ RUN chsh -s /bin/bash iobroker \ && usermod --home /opt/iobroker iobroker # Setting up ENVs -ENV DEBIAN_FRONTEND="teletype" \ - LANG="de_DE.UTF-8" \ - LANGUAGE="de_DE:de" \ - LC_ALL="de_DE.UTF-8" \ - TZ="Europe/Berlin" \ - PACKAGES="vi" \ - ADMINPORT=8081 \ - SETUID=1000 \ - SETGID=1000 \ - AVAHI="false" \ - ZWAVE="false" \ - USBDEVICES="none" +ENV ADMINPORT=8081 \ + AVAHI="false" \ + DEBIAN_FRONTEND="teletype" \ + LANG="de_DE.UTF-8" \ + LANGUAGE="de_DE:de" \ + LC_ALL="de_DE.UTF-8" \ + PACKAGES="vi" \ + REDIS="false" \ + SETGID=1000 \ + SETUID=1000 \ + TZ="Europe/Berlin" \ + USBDEVICES="none" \ + ZWAVE="false" # Run startup-script ENTRYPOINT ["/opt/scripts/iobroker_startup.sh"] diff --git a/aarch64/scripts/iobroker_startup.sh b/aarch64/scripts/iobroker_startup.sh index 4e40f6f..9805355 100644 --- a/aarch64/scripts/iobroker_startup.sh +++ b/aarch64/scripts/iobroker_startup.sh @@ -1,18 +1,19 @@ #!/bin/bash # Reading ENV -packages=$PACKAGES adminport=$ADMINPORT -uid=$SETUID -gid=$SETGID -zwave=$ZWAVE avahi=$AVAHI +gid=$SETGID +packages=$PACKAGES +redis=$REDIS +uid=$SETUID usbdevices=$USBDEVICES +zwave=$ZWAVE # Getting date and time for logging dati=`date '+%Y-%m-%d %H:%M:%S'` -# Header +# Logging header echo ' ' echo "$(printf -- '-%.0s' {1..60})" echo -n "$(printf -- '-%.0s' {1..15})" && echo -n " "$dati" " && echo "$(printf -- '-%.0s' {1..15})" @@ -36,23 +37,35 @@ echo -n "----- " && echo -n "$(printf "%-10s %-23s" node: $(node - echo -n "----- " && echo -n "$(printf "%-10s %-23s" npm: $(npm -v))" && echo " -----" echo "----- -----" echo "----- ENV -----" -echo -n "----- " && echo -n "$(printf "%-10s %-23s" PACKAGES: $PACKAGES)" && echo " -----" echo -n "----- " && echo -n "$(printf "%-10s %-23s" ADMINPORT: $ADMINPORT)" && echo " -----" echo -n "----- " && echo -n "$(printf "%-10s %-23s" AVAHI: $AVAHI)" && echo " -----" -echo -n "----- " && echo -n "$(printf "%-10s %-23s" ZWAVE: $ZWAVE)" && echo " -----" +echo -n "----- " && echo -n "$(printf "%-10s %-23s" PACKAGES: $PACKAGES)" && echo " -----" +echo -n "----- " && echo -n "$(printf "%-10s %-23s" REDIS: $REDIS)" && echo " -----" echo -n "----- " && echo -n "$(printf "%-10s %-23s" SETGID: $SETGID)" && echo " -----" echo -n "----- " && echo -n "$(printf "%-10s %-23s" SETUID: $SETUID)" && echo " -----" +echo -n "----- " && echo -n "$(printf "%-10s %-23s" USBDEVICES: $USBDEVICES)" && echo " -----" +echo -n "----- " && echo -n "$(printf "%-10s %-23s" ZWAVE: $ZWAVE)" && echo " -----" echo "$(printf -- '-%.0s' {1..60})" echo ' ' -# Checking and installing additional packages + +# Not in use +# if [ -f /opt/.firstrun ] +# rm -f /opt/.firstrun + + +##### +# STEP 1 - Preparing container +##### echo "$(printf -- '-%.0s' {1..60})" -echo "----- Step 1 of 5: Installing additional packages -----" +echo "----- Step 1 of 5: Preparing container -----" echo "$(printf -- '-%.0s' {1..60})" echo ' ' +# Installing additional packages if [ "$packages" != "" ] then + echo "Installing additional packages is set by ENV." echo "The following packages will be installed:" $packages"..." echo $packages > /opt/scripts/.packages sh /opt/scripts/setup_packages.sh > /opt/scripts/setup_packages.log 2>&1 @@ -62,10 +75,26 @@ else fi echo ' ' +# Checking and setting uid/gid +if [ $(cat /etc/group | grep 'iobroker:' | cut -d':' -f3) != $gid ] || [ $(cat /etc/passwd | grep 'iobroker:' | cut -d':' -f3) != $uid ] +then + echo "Different UID and/ or GID is set by ENV." + echo "Changing UID to "$uid" and GID to "$gid"..." + usermod -u $uid iobroker + groupmod -g $gid iobroker + echo "Done." +else + echo "There are no changes in UID/ GID needed." +fi +echo ' ' + # 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})" @@ -73,42 +102,30 @@ echo ' ' if [ `ls -1a|wc -l` -lt 3 ] then - echo "There is no data detected in /opt/iobroker. Restoring..." + echo "There is no data detected in /opt/iobroker. Restoring initial ioBroker installation..." tar -xf /opt/initial_iobroker.tar -C / echo "Done." else if [ -f /opt/iobroker/iobroker ] then - echo "Installation of ioBroker detected in /opt/iobroker." + echo "Existing installation of ioBroker detected in /opt/iobroker." else echo "There is data detected in /opt/iobroker, but it looks like it is no instance of iobroker!" - echo "Please check/ recreate mounted folder/ volume and restart ioBroker container." + echo "Please check/ recreate mounted folder/ volume and restart ioBroker container." exit 1 fi fi echo ' ' + +##### # Checking ioBroker-Installation +##### echo "$(printf -- '-%.0s' {1..60})" echo "----- Step 3 of 5: Checking ioBroker installation -----" echo "$(printf -- '-%.0s' {1..60})" echo ' ' -# Checking for first run and set uid/gid -if [ -f /opt/.firstrun ] -then - echo "This is the first run of a new container. Time for some preparation." - echo ' ' - echo "Changing UID to "$uid" and GID to "$gid"..." - usermod -u $uid iobroker - groupmod -g $gid iobroker - rm -f /opt/.firstrun - echo "Done." -else - echo "This is NOT the first run of the container. Some Steps will be skipped." -fi -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 $uid:$gid /opt/iobroker @@ -117,7 +134,7 @@ echo "Done." echo ' ' # Backing up original iobroker-file and changing sudo to gosu -echo "Fixing \"sudo-bug\" by replacing sudo with 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 @@ -133,29 +150,39 @@ then rm -f /opt/iobroker/.install_host echo 'Done.' echo ' ' +elif [ $(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)"..." + sh /opt/iobroker/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 which can be activated by the use of environment variables." -echo "For more information take a look at readme.md" +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" != "8081" ] +if [ "$adminport" != $(iobroker object get system.adapter.admin.0 --pretty | grep -oP '(?<="port": )[^,]*') ] then - echo "Adminport is set by ENV." + echo "Adminport set by ENV does not match port configured in ioBroker installation." echo "Setting Adminport to" $adminport"..." iobroker set admin.0 --port $adminport echo 'Done.' echo ' ' fi -# Checking for enabled avahi-daemon +# Checking ENV for AVAHI if [ "$avahi" = "true" ] then echo "Avahi-daemon is activated by ENV." @@ -165,7 +192,7 @@ then echo ' ' fi -# Checking for enabled zwave-support +# Checking ENV for Z-WAVE if [ "$zwave" = "true" ] then echo "Z-Wave is activated by ENV." @@ -175,8 +202,7 @@ then echo ' ' fi -# checking enabled usb-devices - +# checking ENV for USBDEVICES if [ "$usbdevices" != "none" ] then echo "Usb-device-support is activated by ENV." @@ -192,16 +218,35 @@ then echo ' ' fi +# Checking ENV for REDIS +if [ "$redis" != "false" ] +then + echo "Connection to Redis is configured by ENV." + echo "Installing prerequisites..." + apt-get update 2>&1> /dev/null && apt-get install -y jq 2>&1> /dev/null && rm -rf /var/lib/apt/lists/* 2>&1> /dev/null + redisserver=$(echo $redis | sed -E 's/(.*):(.*)/\1/') + redisport=$(echo $redis | sed -E 's/(.*):(.*)/\2/') + echo "Setting configuration for Redis (Server: "$redisserver", Port: "$redisport") in ioBroker..." + cd /opt/iobroker/iobroker-data + jq --arg redisserver "$redisserver" --arg redisport "$redisport" '.states.type = "redis" | .states.host = $redisserver | .states.port = $redisport' iobroker.json > iobroker.json.tmp && mv iobroker.json.tmp iobroker.json + cd /opt/iobroker + echo "Done." + echo ' ' +fi + sleep 5 + +##### # Starting ioBroker +##### echo "$(printf -- '-%.0s' {1..60})" echo "----- Step 5 of 5: ioBroker startup -----" echo "$(printf -- '-%.0s' {1..60})" echo ' ' echo "Starting ioBroker..." echo ' ' -#gosu iobroker node --trace-warnings node_modules/iobroker.js-controller/controller.js > /opt/iobroker/iobroker.log 2>&1 & + gosu iobroker node node_modules/iobroker.js-controller/controller.js # Preventing container restart by keeping a process alive even if iobroker will be stopped diff --git a/amd64/Dockerfile b/amd64/Dockerfile index 8141a3b..1da5a9f 100644 --- a/amd64/Dockerfile +++ b/amd64/Dockerfile @@ -12,31 +12,31 @@ RUN apt-get update && apt-get upgrade -y && apt-get install -y \ curl \ git \ gnupg2 \ - gosu \ - libavahi-compat-libdnssd-dev \ + gosu \ + libavahi-compat-libdnssd-dev \ libcap2-bin \ libpam0g-dev \ libudev-dev \ locales \ - pkg-config \ - procps \ + pkg-config \ + procps \ python \ - python-dev \ - sudo \ + python-dev \ + sudo \ + udev \ unzip \ wget \ && rm -rf /var/lib/apt/lists/* # Install node10 RUN curl -sL https://deb.nodesource.com/setup_10.x | bash \ - && apt-get update && apt-get install -y \ - nodejs \ + && 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 + && sed -i 's/^# *\(en_US.UTF-8\)/\1/' /etc/locale.gen \ + && locale-gen # Create scripts directory and copy scripts RUN mkdir -p /opt/scripts/ \ @@ -47,7 +47,7 @@ COPY scripts/setup_avahi.sh setup_avahi.sh COPY scripts/setup_packages.sh setup_packages.sh COPY scripts/setup_zwave.sh setup_zwave.sh RUN chmod +x iobroker_startup.sh \ - && chmod +x setup_avahi.sh \ + && chmod +x setup_avahi.sh \ && chmod +x setup_packages.sh # Install ioBroker @@ -70,18 +70,19 @@ RUN chsh -s /bin/bash iobroker \ && usermod --home /opt/iobroker iobroker # Setting up ENVs -ENV DEBIAN_FRONTEND="teletype" \ - LANG="de_DE.UTF-8" \ - LANGUAGE="de_DE:de" \ - LC_ALL="de_DE.UTF-8" \ - TZ="Europe/Berlin" \ - PACKAGES="vi" \ - ADMINPORT=8081 \ - SETUID=1000 \ - SETGID=1000 \ - AVAHI="false" \ - ZWAVE="false" \ - USBDEVICES="none" +ENV ADMINPORT=8081 \ + AVAHI="false" \ + DEBIAN_FRONTEND="teletype" \ + LANG="de_DE.UTF-8" \ + LANGUAGE="de_DE:de" \ + LC_ALL="de_DE.UTF-8" \ + PACKAGES="vi" \ + REDIS="false" \ + SETGID=1000 \ + SETUID=1000 \ + TZ="Europe/Berlin" \ + USBDEVICES="none" \ + ZWAVE="false" # Run startup-script ENTRYPOINT ["/opt/scripts/iobroker_startup.sh"] diff --git a/amd64/scripts/iobroker_startup.sh b/amd64/scripts/iobroker_startup.sh index 4e40f6f..9805355 100644 --- a/amd64/scripts/iobroker_startup.sh +++ b/amd64/scripts/iobroker_startup.sh @@ -1,18 +1,19 @@ #!/bin/bash # Reading ENV -packages=$PACKAGES adminport=$ADMINPORT -uid=$SETUID -gid=$SETGID -zwave=$ZWAVE avahi=$AVAHI +gid=$SETGID +packages=$PACKAGES +redis=$REDIS +uid=$SETUID usbdevices=$USBDEVICES +zwave=$ZWAVE # Getting date and time for logging dati=`date '+%Y-%m-%d %H:%M:%S'` -# Header +# Logging header echo ' ' echo "$(printf -- '-%.0s' {1..60})" echo -n "$(printf -- '-%.0s' {1..15})" && echo -n " "$dati" " && echo "$(printf -- '-%.0s' {1..15})" @@ -36,23 +37,35 @@ echo -n "----- " && echo -n "$(printf "%-10s %-23s" node: $(node - echo -n "----- " && echo -n "$(printf "%-10s %-23s" npm: $(npm -v))" && echo " -----" echo "----- -----" echo "----- ENV -----" -echo -n "----- " && echo -n "$(printf "%-10s %-23s" PACKAGES: $PACKAGES)" && echo " -----" echo -n "----- " && echo -n "$(printf "%-10s %-23s" ADMINPORT: $ADMINPORT)" && echo " -----" echo -n "----- " && echo -n "$(printf "%-10s %-23s" AVAHI: $AVAHI)" && echo " -----" -echo -n "----- " && echo -n "$(printf "%-10s %-23s" ZWAVE: $ZWAVE)" && echo " -----" +echo -n "----- " && echo -n "$(printf "%-10s %-23s" PACKAGES: $PACKAGES)" && echo " -----" +echo -n "----- " && echo -n "$(printf "%-10s %-23s" REDIS: $REDIS)" && echo " -----" echo -n "----- " && echo -n "$(printf "%-10s %-23s" SETGID: $SETGID)" && echo " -----" echo -n "----- " && echo -n "$(printf "%-10s %-23s" SETUID: $SETUID)" && echo " -----" +echo -n "----- " && echo -n "$(printf "%-10s %-23s" USBDEVICES: $USBDEVICES)" && echo " -----" +echo -n "----- " && echo -n "$(printf "%-10s %-23s" ZWAVE: $ZWAVE)" && echo " -----" echo "$(printf -- '-%.0s' {1..60})" echo ' ' -# Checking and installing additional packages + +# Not in use +# if [ -f /opt/.firstrun ] +# rm -f /opt/.firstrun + + +##### +# STEP 1 - Preparing container +##### echo "$(printf -- '-%.0s' {1..60})" -echo "----- Step 1 of 5: Installing additional packages -----" +echo "----- Step 1 of 5: Preparing container -----" echo "$(printf -- '-%.0s' {1..60})" echo ' ' +# Installing additional packages if [ "$packages" != "" ] then + echo "Installing additional packages is set by ENV." echo "The following packages will be installed:" $packages"..." echo $packages > /opt/scripts/.packages sh /opt/scripts/setup_packages.sh > /opt/scripts/setup_packages.log 2>&1 @@ -62,10 +75,26 @@ else fi echo ' ' +# Checking and setting uid/gid +if [ $(cat /etc/group | grep 'iobroker:' | cut -d':' -f3) != $gid ] || [ $(cat /etc/passwd | grep 'iobroker:' | cut -d':' -f3) != $uid ] +then + echo "Different UID and/ or GID is set by ENV." + echo "Changing UID to "$uid" and GID to "$gid"..." + usermod -u $uid iobroker + groupmod -g $gid iobroker + echo "Done." +else + echo "There are no changes in UID/ GID needed." +fi +echo ' ' + # 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})" @@ -73,42 +102,30 @@ echo ' ' if [ `ls -1a|wc -l` -lt 3 ] then - echo "There is no data detected in /opt/iobroker. Restoring..." + echo "There is no data detected in /opt/iobroker. Restoring initial ioBroker installation..." tar -xf /opt/initial_iobroker.tar -C / echo "Done." else if [ -f /opt/iobroker/iobroker ] then - echo "Installation of ioBroker detected in /opt/iobroker." + echo "Existing installation of ioBroker detected in /opt/iobroker." else echo "There is data detected in /opt/iobroker, but it looks like it is no instance of iobroker!" - echo "Please check/ recreate mounted folder/ volume and restart ioBroker container." + echo "Please check/ recreate mounted folder/ volume and restart ioBroker container." exit 1 fi fi echo ' ' + +##### # Checking ioBroker-Installation +##### echo "$(printf -- '-%.0s' {1..60})" echo "----- Step 3 of 5: Checking ioBroker installation -----" echo "$(printf -- '-%.0s' {1..60})" echo ' ' -# Checking for first run and set uid/gid -if [ -f /opt/.firstrun ] -then - echo "This is the first run of a new container. Time for some preparation." - echo ' ' - echo "Changing UID to "$uid" and GID to "$gid"..." - usermod -u $uid iobroker - groupmod -g $gid iobroker - rm -f /opt/.firstrun - echo "Done." -else - echo "This is NOT the first run of the container. Some Steps will be skipped." -fi -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 $uid:$gid /opt/iobroker @@ -117,7 +134,7 @@ echo "Done." echo ' ' # Backing up original iobroker-file and changing sudo to gosu -echo "Fixing \"sudo-bug\" by replacing sudo with 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 @@ -133,29 +150,39 @@ then rm -f /opt/iobroker/.install_host echo 'Done.' echo ' ' +elif [ $(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)"..." + sh /opt/iobroker/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 which can be activated by the use of environment variables." -echo "For more information take a look at readme.md" +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" != "8081" ] +if [ "$adminport" != $(iobroker object get system.adapter.admin.0 --pretty | grep -oP '(?<="port": )[^,]*') ] then - echo "Adminport is set by ENV." + echo "Adminport set by ENV does not match port configured in ioBroker installation." echo "Setting Adminport to" $adminport"..." iobroker set admin.0 --port $adminport echo 'Done.' echo ' ' fi -# Checking for enabled avahi-daemon +# Checking ENV for AVAHI if [ "$avahi" = "true" ] then echo "Avahi-daemon is activated by ENV." @@ -165,7 +192,7 @@ then echo ' ' fi -# Checking for enabled zwave-support +# Checking ENV for Z-WAVE if [ "$zwave" = "true" ] then echo "Z-Wave is activated by ENV." @@ -175,8 +202,7 @@ then echo ' ' fi -# checking enabled usb-devices - +# checking ENV for USBDEVICES if [ "$usbdevices" != "none" ] then echo "Usb-device-support is activated by ENV." @@ -192,16 +218,35 @@ then echo ' ' fi +# Checking ENV for REDIS +if [ "$redis" != "false" ] +then + echo "Connection to Redis is configured by ENV." + echo "Installing prerequisites..." + apt-get update 2>&1> /dev/null && apt-get install -y jq 2>&1> /dev/null && rm -rf /var/lib/apt/lists/* 2>&1> /dev/null + redisserver=$(echo $redis | sed -E 's/(.*):(.*)/\1/') + redisport=$(echo $redis | sed -E 's/(.*):(.*)/\2/') + echo "Setting configuration for Redis (Server: "$redisserver", Port: "$redisport") in ioBroker..." + cd /opt/iobroker/iobroker-data + jq --arg redisserver "$redisserver" --arg redisport "$redisport" '.states.type = "redis" | .states.host = $redisserver | .states.port = $redisport' iobroker.json > iobroker.json.tmp && mv iobroker.json.tmp iobroker.json + cd /opt/iobroker + echo "Done." + echo ' ' +fi + sleep 5 + +##### # Starting ioBroker +##### echo "$(printf -- '-%.0s' {1..60})" echo "----- Step 5 of 5: ioBroker startup -----" echo "$(printf -- '-%.0s' {1..60})" echo ' ' echo "Starting ioBroker..." echo ' ' -#gosu iobroker node --trace-warnings node_modules/iobroker.js-controller/controller.js > /opt/iobroker/iobroker.log 2>&1 & + gosu iobroker node node_modules/iobroker.js-controller/controller.js # Preventing container restart by keeping a process alive even if iobroker will be stopped diff --git a/armv7hf/Dockerfile b/armv7hf/Dockerfile index 120093a..83e3f4a 100644 --- a/armv7hf/Dockerfile +++ b/armv7hf/Dockerfile @@ -12,31 +12,31 @@ RUN apt-get update && apt-get upgrade -y && apt-get install -y \ curl \ git \ gnupg2 \ - gosu \ - libavahi-compat-libdnssd-dev \ + gosu \ + libavahi-compat-libdnssd-dev \ libcap2-bin \ libpam0g-dev \ libudev-dev \ locales \ - pkg-config \ - procps \ + pkg-config \ + procps \ python \ - python-dev \ - sudo \ + python-dev \ + sudo \ + udev \ unzip \ wget \ && rm -rf /var/lib/apt/lists/* # Install node10 RUN curl -sL https://deb.nodesource.com/setup_10.x | bash \ - && apt-get update && apt-get install -y \ - nodejs \ + && 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 + && sed -i 's/^# *\(en_US.UTF-8\)/\1/' /etc/locale.gen \ + && locale-gen # Create scripts directory and copy scripts RUN mkdir -p /opt/scripts/ \ @@ -47,7 +47,7 @@ COPY scripts/setup_avahi.sh setup_avahi.sh COPY scripts/setup_packages.sh setup_packages.sh COPY scripts/setup_zwave.sh setup_zwave.sh RUN chmod +x iobroker_startup.sh \ - && chmod +x setup_avahi.sh \ + && chmod +x setup_avahi.sh \ && chmod +x setup_packages.sh # Install ioBroker @@ -70,18 +70,19 @@ RUN chsh -s /bin/bash iobroker \ && usermod --home /opt/iobroker iobroker # Setting up ENVs -ENV DEBIAN_FRONTEND="teletype" \ - LANG="de_DE.UTF-8" \ - LANGUAGE="de_DE:de" \ - LC_ALL="de_DE.UTF-8" \ - TZ="Europe/Berlin" \ - PACKAGES="vi" \ - ADMINPORT=8081 \ - SETUID=1000 \ - SETGID=1000 \ - AVAHI="false" \ - ZWAVE="false" \ - USBDEVICES="none" +ENV ADMINPORT=8081 \ + AVAHI="false" \ + DEBIAN_FRONTEND="teletype" \ + LANG="de_DE.UTF-8" \ + LANGUAGE="de_DE:de" \ + LC_ALL="de_DE.UTF-8" \ + PACKAGES="vi" \ + REDIS="false" \ + SETGID=1000 \ + SETUID=1000 \ + TZ="Europe/Berlin" \ + USBDEVICES="none" \ + ZWAVE="false" # Run startup-script ENTRYPOINT ["/opt/scripts/iobroker_startup.sh"] diff --git a/armv7hf/scripts/iobroker_startup.sh b/armv7hf/scripts/iobroker_startup.sh index 4e40f6f..9805355 100644 --- a/armv7hf/scripts/iobroker_startup.sh +++ b/armv7hf/scripts/iobroker_startup.sh @@ -1,18 +1,19 @@ #!/bin/bash # Reading ENV -packages=$PACKAGES adminport=$ADMINPORT -uid=$SETUID -gid=$SETGID -zwave=$ZWAVE avahi=$AVAHI +gid=$SETGID +packages=$PACKAGES +redis=$REDIS +uid=$SETUID usbdevices=$USBDEVICES +zwave=$ZWAVE # Getting date and time for logging dati=`date '+%Y-%m-%d %H:%M:%S'` -# Header +# Logging header echo ' ' echo "$(printf -- '-%.0s' {1..60})" echo -n "$(printf -- '-%.0s' {1..15})" && echo -n " "$dati" " && echo "$(printf -- '-%.0s' {1..15})" @@ -36,23 +37,35 @@ echo -n "----- " && echo -n "$(printf "%-10s %-23s" node: $(node - echo -n "----- " && echo -n "$(printf "%-10s %-23s" npm: $(npm -v))" && echo " -----" echo "----- -----" echo "----- ENV -----" -echo -n "----- " && echo -n "$(printf "%-10s %-23s" PACKAGES: $PACKAGES)" && echo " -----" echo -n "----- " && echo -n "$(printf "%-10s %-23s" ADMINPORT: $ADMINPORT)" && echo " -----" echo -n "----- " && echo -n "$(printf "%-10s %-23s" AVAHI: $AVAHI)" && echo " -----" -echo -n "----- " && echo -n "$(printf "%-10s %-23s" ZWAVE: $ZWAVE)" && echo " -----" +echo -n "----- " && echo -n "$(printf "%-10s %-23s" PACKAGES: $PACKAGES)" && echo " -----" +echo -n "----- " && echo -n "$(printf "%-10s %-23s" REDIS: $REDIS)" && echo " -----" echo -n "----- " && echo -n "$(printf "%-10s %-23s" SETGID: $SETGID)" && echo " -----" echo -n "----- " && echo -n "$(printf "%-10s %-23s" SETUID: $SETUID)" && echo " -----" +echo -n "----- " && echo -n "$(printf "%-10s %-23s" USBDEVICES: $USBDEVICES)" && echo " -----" +echo -n "----- " && echo -n "$(printf "%-10s %-23s" ZWAVE: $ZWAVE)" && echo " -----" echo "$(printf -- '-%.0s' {1..60})" echo ' ' -# Checking and installing additional packages + +# Not in use +# if [ -f /opt/.firstrun ] +# rm -f /opt/.firstrun + + +##### +# STEP 1 - Preparing container +##### echo "$(printf -- '-%.0s' {1..60})" -echo "----- Step 1 of 5: Installing additional packages -----" +echo "----- Step 1 of 5: Preparing container -----" echo "$(printf -- '-%.0s' {1..60})" echo ' ' +# Installing additional packages if [ "$packages" != "" ] then + echo "Installing additional packages is set by ENV." echo "The following packages will be installed:" $packages"..." echo $packages > /opt/scripts/.packages sh /opt/scripts/setup_packages.sh > /opt/scripts/setup_packages.log 2>&1 @@ -62,10 +75,26 @@ else fi echo ' ' +# Checking and setting uid/gid +if [ $(cat /etc/group | grep 'iobroker:' | cut -d':' -f3) != $gid ] || [ $(cat /etc/passwd | grep 'iobroker:' | cut -d':' -f3) != $uid ] +then + echo "Different UID and/ or GID is set by ENV." + echo "Changing UID to "$uid" and GID to "$gid"..." + usermod -u $uid iobroker + groupmod -g $gid iobroker + echo "Done." +else + echo "There are no changes in UID/ GID needed." +fi +echo ' ' + # 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})" @@ -73,42 +102,30 @@ echo ' ' if [ `ls -1a|wc -l` -lt 3 ] then - echo "There is no data detected in /opt/iobroker. Restoring..." + echo "There is no data detected in /opt/iobroker. Restoring initial ioBroker installation..." tar -xf /opt/initial_iobroker.tar -C / echo "Done." else if [ -f /opt/iobroker/iobroker ] then - echo "Installation of ioBroker detected in /opt/iobroker." + echo "Existing installation of ioBroker detected in /opt/iobroker." else echo "There is data detected in /opt/iobroker, but it looks like it is no instance of iobroker!" - echo "Please check/ recreate mounted folder/ volume and restart ioBroker container." + echo "Please check/ recreate mounted folder/ volume and restart ioBroker container." exit 1 fi fi echo ' ' + +##### # Checking ioBroker-Installation +##### echo "$(printf -- '-%.0s' {1..60})" echo "----- Step 3 of 5: Checking ioBroker installation -----" echo "$(printf -- '-%.0s' {1..60})" echo ' ' -# Checking for first run and set uid/gid -if [ -f /opt/.firstrun ] -then - echo "This is the first run of a new container. Time for some preparation." - echo ' ' - echo "Changing UID to "$uid" and GID to "$gid"..." - usermod -u $uid iobroker - groupmod -g $gid iobroker - rm -f /opt/.firstrun - echo "Done." -else - echo "This is NOT the first run of the container. Some Steps will be skipped." -fi -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 $uid:$gid /opt/iobroker @@ -117,7 +134,7 @@ echo "Done." echo ' ' # Backing up original iobroker-file and changing sudo to gosu -echo "Fixing \"sudo-bug\" by replacing sudo with 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 @@ -133,29 +150,39 @@ then rm -f /opt/iobroker/.install_host echo 'Done.' echo ' ' +elif [ $(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)"..." + sh /opt/iobroker/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 which can be activated by the use of environment variables." -echo "For more information take a look at readme.md" +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" != "8081" ] +if [ "$adminport" != $(iobroker object get system.adapter.admin.0 --pretty | grep -oP '(?<="port": )[^,]*') ] then - echo "Adminport is set by ENV." + echo "Adminport set by ENV does not match port configured in ioBroker installation." echo "Setting Adminport to" $adminport"..." iobroker set admin.0 --port $adminport echo 'Done.' echo ' ' fi -# Checking for enabled avahi-daemon +# Checking ENV for AVAHI if [ "$avahi" = "true" ] then echo "Avahi-daemon is activated by ENV." @@ -165,7 +192,7 @@ then echo ' ' fi -# Checking for enabled zwave-support +# Checking ENV for Z-WAVE if [ "$zwave" = "true" ] then echo "Z-Wave is activated by ENV." @@ -175,8 +202,7 @@ then echo ' ' fi -# checking enabled usb-devices - +# checking ENV for USBDEVICES if [ "$usbdevices" != "none" ] then echo "Usb-device-support is activated by ENV." @@ -192,16 +218,35 @@ then echo ' ' fi +# Checking ENV for REDIS +if [ "$redis" != "false" ] +then + echo "Connection to Redis is configured by ENV." + echo "Installing prerequisites..." + apt-get update 2>&1> /dev/null && apt-get install -y jq 2>&1> /dev/null && rm -rf /var/lib/apt/lists/* 2>&1> /dev/null + redisserver=$(echo $redis | sed -E 's/(.*):(.*)/\1/') + redisport=$(echo $redis | sed -E 's/(.*):(.*)/\2/') + echo "Setting configuration for Redis (Server: "$redisserver", Port: "$redisport") in ioBroker..." + cd /opt/iobroker/iobroker-data + jq --arg redisserver "$redisserver" --arg redisport "$redisport" '.states.type = "redis" | .states.host = $redisserver | .states.port = $redisport' iobroker.json > iobroker.json.tmp && mv iobroker.json.tmp iobroker.json + cd /opt/iobroker + echo "Done." + echo ' ' +fi + sleep 5 + +##### # Starting ioBroker +##### echo "$(printf -- '-%.0s' {1..60})" echo "----- Step 5 of 5: ioBroker startup -----" echo "$(printf -- '-%.0s' {1..60})" echo ' ' echo "Starting ioBroker..." echo ' ' -#gosu iobroker node --trace-warnings node_modules/iobroker.js-controller/controller.js > /opt/iobroker/iobroker.log 2>&1 & + gosu iobroker node node_modules/iobroker.js-controller/controller.js # Preventing container restart by keeping a process alive even if iobroker will be stopped