From e853ef30b3f512947de83620db52b010e11457dc Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 22 May 2018 21:29:22 +0200 Subject: [PATCH] :sparkles: Initial add-on code --- .gitlab-ci.yml | 332 ++++++++++++++++++ README.md | 272 ++++++++++++++ images/screenshot.png | Bin 0 -> 53263 bytes sonweb/.README.j2 | 76 ++++ sonweb/Dockerfile | 58 +++ sonweb/build.json | 10 + sonweb/config.json | 40 +++ sonweb/icon.png | Bin 0 -> 1396 bytes sonweb/logo.png | Bin 0 -> 78160 bytes .../rootfs/etc/cont-init.d/10-requirements.sh | 26 ++ sonweb/rootfs/etc/cont-init.d/11-nginx.sh | 25 ++ sonweb/rootfs/etc/cont-init.d/12-patches.sh | 36 ++ .../etc/cont-init.d/13-persistent-data.sh | 23 ++ sonweb/rootfs/etc/fix-attrs.d/01-sonweb | 2 + sonweb/rootfs/etc/nginx/nginx-ssl.conf | 62 ++++ sonweb/rootfs/etc/nginx/nginx.conf | 46 +++ sonweb/rootfs/etc/php7/blacklist.txt | 2 + sonweb/rootfs/etc/php7/conf.d/99-sonweb.ini | 9 + sonweb/rootfs/etc/php7/php-fpm.d/www.conf | 11 + sonweb/rootfs/etc/services.d/nginx/finish | 9 + sonweb/rootfs/etc/services.d/nginx/run | 12 + sonweb/rootfs/etc/services.d/php-fpm/finish | 9 + sonweb/rootfs/etc/services.d/php-fpm/run | 9 + 23 files changed, 1069 insertions(+) create mode 100644 .gitlab-ci.yml create mode 100755 README.md create mode 100644 images/screenshot.png create mode 100644 sonweb/.README.j2 create mode 100755 sonweb/Dockerfile create mode 100755 sonweb/build.json create mode 100755 sonweb/config.json create mode 100755 sonweb/icon.png create mode 100755 sonweb/logo.png create mode 100755 sonweb/rootfs/etc/cont-init.d/10-requirements.sh create mode 100755 sonweb/rootfs/etc/cont-init.d/11-nginx.sh create mode 100644 sonweb/rootfs/etc/cont-init.d/12-patches.sh create mode 100644 sonweb/rootfs/etc/cont-init.d/13-persistent-data.sh create mode 100644 sonweb/rootfs/etc/fix-attrs.d/01-sonweb create mode 100755 sonweb/rootfs/etc/nginx/nginx-ssl.conf create mode 100755 sonweb/rootfs/etc/nginx/nginx.conf create mode 100644 sonweb/rootfs/etc/php7/blacklist.txt create mode 100644 sonweb/rootfs/etc/php7/conf.d/99-sonweb.ini create mode 100644 sonweb/rootfs/etc/php7/php-fpm.d/www.conf create mode 100755 sonweb/rootfs/etc/services.d/nginx/finish create mode 100755 sonweb/rootfs/etc/services.d/nginx/run create mode 100644 sonweb/rootfs/etc/services.d/php-fpm/finish create mode 100644 sonweb/rootfs/etc/services.d/php-fpm/run diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..afcee70 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,332 @@ +--- +image: docker:stable + +variables: + ADDON_GITHUB_REPO: hassio-addons/addon-sonweb + ADDON_SLUG: sonweb + ADDON_TARGET: sonweb + DOCKER_DRIVER: overlay2 + DOCKER_HUB_ORG: hassioaddons + +stages: + - preflight + - build + - scan + - deploy + - publish + +# Generic DIND template +.dind: &dind + before_script: + - docker info + - docker login -u gitlab-ci-token -p "${CI_JOB_TOKEN}" registry.gitlab.com + services: + - docker:dind + +# Generic preflight template +.preflight: &preflight + stage: preflight + tags: + - preflight + +# Generic build template +.build: &build + <<: *dind + stage: build + script: + - | + docker run \ + --privileged \ + --volume /var/run/docker.sock:/var/run/docker.sock \ + --volume "$PWD":/docker \ + hassioaddons/build-env:latest \ + --image "addon" \ + --cache-from "${DOCKER_HUB_ORG}/${ADDON_SLUG}-${ADDON_ARCH}" \ + --cache-tag "test" \ + --git-url "https://github.com/${ADDON_GITHUB_REPO}" \ + --target "${ADDON_TARGET}" \ + --tag-latest \ + --git \ + --${ADDON_ARCH} + - | + docker tag \ + "addon:latest" \ + "registry.gitlab.com/${CI_PROJECT_PATH}/${ADDON_ARCH}:${CI_COMMIT_SHA}" + - | + docker push \ + "registry.gitlab.com/${CI_PROJECT_PATH}/${ADDON_ARCH}:${CI_COMMIT_SHA}" + tags: + - build + +# Generic scan template +.scan: &scan + <<: *dind + stage: scan + allow_failure: true + before_script: + - docker info + - docker run -d --name db arminc/clair-db:latest + - docker run -p 6060:6060 --link db:postgres -d --name clair arminc/clair-local-scan:v2.0.1 + - apk add -U curl ca-certificates + - | + curl \ + --silent \ + --show-error \ + --location \ + --fail \ + --retry 3 \ + --output /usr/bin/clair-scanner \ + https://github.com/arminc/clair-scanner/releases/download/v8/clair-scanner_linux_amd64 + - chmod +x /usr/bin/clair-scanner + - touch clair-whitelist.yml + - echo "Waiting for Clair to start" + - | + while ! nc -z docker 6060; do + sleep 1 + WAIT=$((${WAIT} + 1)) + if [ "${WAIT}" -gt 30 ]; then + echo "Error > Timeout waiting for Clair to start" + exit 1 + fi + done + - docker pull "registry.gitlab.com/${CI_PROJECT_PATH}/${ADDON_ARCH}:${CI_COMMIT_SHA}" + script: + - | + clair-scanner \ + -c http://docker:6060 \ + --ip $(hostname -i) \ + -w clair-whitelist.yml \ + "registry.gitlab.com/${CI_PROJECT_PATH}/${ADDON_ARCH}:${CI_COMMIT_SHA}" + tags: + - scan + +# Generic deploy template +.deploy: &deploy + <<: *dind + stage: deploy + before_script: + - docker info + - docker login -u gitlab-ci-token -p "${CI_JOB_TOKEN}" registry.gitlab.com + - docker pull "registry.gitlab.com/${CI_PROJECT_PATH}/${ADDON_ARCH}:${CI_COMMIT_SHA}" + - docker pull hassioaddons/build-env:latest + script: + - | + docker run \ + --privileged \ + --volume /var/run/docker.sock:/var/run/docker.sock \ + --volume "$PWD":/docker \ + hassioaddons/build-env:latest \ + --image "${DOCKER_HUB_ORG}/${ADDON_SLUG}-${ADDON_ARCH}" \ + --cache-from "registry.gitlab.com/${CI_PROJECT_PATH}/${ADDON_ARCH}" \ + --cache-tag "${CI_COMMIT_SHA}" \ + --git-url "https://github.com/${ADDON_GITHUB_REPO}" \ + --target "${ADDON_TARGET}" \ + --login "${DOCKER_LOGIN}" \ + --password "${DOCKER_PASSWORD}" \ + --git \ + --push \ + --${ADDON_ARCH} + tags: + - deploy + +# Generic publish template +.publish: &publish + stage: publish + image: + name: hassioaddons/repository-updater:latest + entrypoint: [""] + script: + - | + repository-updater \ + --token "${GITHUB_TOKEN}" \ + --repository "${REPOSITORY}" \ + --addon "${ADDON_GITHUB_REPO}" + tags: + - publish + +# Preflight jobs +hadolint: + <<: *preflight + image: hadolint/hadolint:latest + before_script: + - hadolint --version + script: + - hadolint "${ADDON_TARGET}/Dockerfile" + +shellcheck: + <<: *preflight + image: + name: koalaman/shellcheck-alpine:stable + entrypoint: [""] + before_script: + - shellcheck --version + - apk --no-cache add grep + - | + find . -type f -print0 | \ + xargs -0 sed -i 's:#!/usr/bin/with-contenv bash:#!/bin/bash:g' + script: + - | + for file in $(grep -IRl "#\!\(/usr/bin/env \|/bin/\)" --exclude-dir ".git" "${ADDON_TARGET}"); do + if ! shellcheck $file; then + export FAILED=1 + else + echo "$file OK" + fi + done + if [ "${FAILED}" = "1" ]; then + exit 1 + fi + +yamllint: + <<: *preflight + image: sdesbure/yamllint + before_script: + - yamllint --version + script: + - yamllint . + +jsonlint: + <<: *preflight + image: sahsu/docker-jsonlint + before_script: + - jsonlint --version || true + script: + - | + for file in $(find . -type f -name "*.json"); do + if ! jsonlint -q $file; then + export FAILED=1 + else + echo "$file OK" + fi + done + if [ "${FAILED}" = "1" ]; then + exit 1 + fi + +markdownlint: + <<: *preflight + image: + name: ruby:alpine + entrypoint: [""] + before_script: + - gem install mdl + - mdl --version + script: + - mdl --style all --warnings . + +# Build jobs +build:armhf: + <<: *build + variables: + ADDON_ARCH: armhf + +build:aarch64: + <<: *build + variables: + ADDON_ARCH: aarch64 + +build:i386: + <<: *build + variables: + ADDON_ARCH: i386 + +build:amd64: + <<: *build + variables: + ADDON_ARCH: amd64 + +# Scan jobs +clair:armhf: + <<: *scan + variables: + ADDON_ARCH: armhf + +clair:aarch64: + <<: *scan + variables: + ADDON_ARCH: aarch64 + +clair:i386: + <<: *scan + variables: + ADDON_ARCH: i386 + +clair:amd64: + <<: *scan + variables: + ADDON_ARCH: amd64 + +# Deploy jobs +deploy:armhf: + <<: *deploy + variables: + ADDON_ARCH: armhf + only: + - master + - /^v\d+\.\d+\.\d+(?:-(?:beta|rc)(?:(?:(?:\+|\.)?[a-zA-Z0-9]+)*)?)?$/ + except: + - /^(?!master).+@/ + +deploy:aarch64: + <<: *deploy + variables: + ADDON_ARCH: aarch64 + only: + - master + - /^v\d+\.\d+\.\d+(?:-(?:beta|rc)(?:(?:(?:\+|\.)?[a-zA-Z0-9]+)*)?)?$/ + except: + - /^(?!master).+@/ + +deploy:i386: + <<: *deploy + variables: + ADDON_ARCH: i386 + only: + - master + - /^v\d+\.\d+\.\d+(?:-(?:beta|rc)(?:(?:(?:\+|\.)?[a-zA-Z0-9]+)*)?)?$/ + except: + - /^(?!master).+@/ + +deploy:amd64: + <<: *deploy + variables: + ADDON_ARCH: amd64 + only: + - master + - /^v\d+\.\d+\.\d+(?:-(?:beta|rc)(?:(?:(?:\+|\.)?[a-zA-Z0-9]+)*)?)?$/ + except: + - /^(?!master).+@/ + +# Publish jobs +stable: + <<: *publish + variables: + REPOSITORY: hassio-addons/repository + only: + - /^v\d+\.\d+\.\d+(?:(?:(?:\+|\.)?[a-zA-Z0-9]+)*)?$/ + except: + - /^(?!master).+@/ + environment: + name: stable + +beta: + <<: *publish + variables: + REPOSITORY: hassio-addons/repository-beta + only: + - /^v\d+\.\d+\.\d+(?:-(?:beta|rc)(?:(?:(?:\+|\.)?[a-zA-Z0-9]+)*)?)?$/ + except: + - /^(?!master).+@/ + environment: + name: beta + +edge: + <<: *publish + variables: + REPOSITORY: hassio-addons/repository-edge + only: + - master + except: + - /^(?!master).+@/ + environment: + name: edge diff --git a/README.md b/README.md new file mode 100755 index 0000000..716b13b --- /dev/null +++ b/README.md @@ -0,0 +1,272 @@ +# Community Hass.io Add-ons: SonWEB + +[![GitHub Release][releases-shield]][releases] +![Project Stage][project-stage-shield] +[![License][license-shield]](LICENSE.md) + +[![GitLab CI][gitlabci-shield]][gitlabci] +![Project Maintenance][maintenance-shield] +[![GitHub Activity][commits-shield]][commits] + +[![Bountysource][bountysource-shield]][bountysource] +[![Discord][discord-shield]][discord] +[![Community Forum][forum-shield]][forum] + +[![Buy me a coffee][buymeacoffee-shield]][buymeacoffee] + +Centrally manage all your Sonoff-Tasmota devices. + +![SonWEB screenshot](images/screenshot.png) + +## About + +SonWEB is an administrative web interface to manage all your Sonoff-Tasmota +flashed devices centrally. Some of its features: + +- Scans your networks and adds your devices automatically +- See the status off all your devices quick and easy +- Configure all your devices from a single place +- Send out firmware updates over the air to one or more your devices at once +- Can automatically download the latest firmware for you + +## Installation + +The installation of this add-on is pretty straightforward and not different in +comparison to installing any other Hass.io add-on. + +1. [Add our Hass.io add-ons repository][repository] to your Hass.io instance. +1. Install the "SonWEB" add-on +1. Start the "SonWEB" add-on +1. Check the logs of the "SonWEB" if everything went well + +**NOTE**: Do not add this repository to Hass.io, please use: +`https://github.com/hassio-addons/repository`. + +## Docker status + +[![Docker Architecture][armhf-arch-shield]][armhf-dockerhub] +[![Docker Version][armhf-version-shield]][armhf-microbadger] +[![Docker Layers][armhf-layers-shield]][armhf-microbadger] +[![Docker Pulls][armhf-pulls-shield]][armhf-dockerhub] + +[![Docker Architecture][aarch64-arch-shield]][aarch64-dockerhub] +[![Docker Version][aarch64-version-shield]][aarch64-microbadger] +[![Docker Layers][aarch64-layers-shield]][aarch64-microbadger] +[![Docker Pulls][aarch64-pulls-shield]][aarch64-dockerhub] + +[![Docker Architecture][amd64-arch-shield]][amd64-dockerhub] +[![Docker Version][amd64-version-shield]][amd64-microbadger] +[![Docker Layers][amd64-layers-shield]][amd64-microbadger] +[![Docker Pulls][amd64-pulls-shield]][amd64-dockerhub] + +[![Docker Architecture][i386-arch-shield]][i386-dockerhub] +[![Docker Version][i386-version-shield]][i386-microbadger] +[![Docker Layers][i386-layers-shield]][i386-microbadger] +[![Docker Pulls][i386-pulls-shield]][i386-dockerhub] + +## Configuration + +**Note**: _Remember to restart the add-on when the configuration is changed._ + +Example add-on configuration: + +```json +{ + "log_level": "info", + "ssl": false, + "certfile": "fullchain.pem", + "keyfile": "privkey.pem", + "ipv6": true +} +``` + +**Note**: _This is just an example, don't copy and past it! Create your own!_ + +### Option: `log_level` + +The `log_level` option controls the level of log output by the addon and can +be changed to be more or less verbose, which might be useful when you are +dealing with an unknown issue. Possible values are: + +- `trace`: Show every detail, like all called internal functions. +- `debug`: Shows detailed debug information. +- `info`: Normal (usually) interesting events. +- `warning`: Exceptional occurrences that are not errors. +- `error`: Runtime errors that do not require immediate action. +- `fatal`: Something went terribly wrong. Add-on becomes unusable. + +Please note that each level automatically includes log messages from a +more severe level, e.g., `debug` also shows `info` messages. By default, +the `log_level` is set to `info`, which is the recommended setting unless +you are troubleshooting. + +### Option: `ssl` + +Enables/Disables SSL (HTTPS) on the web interface of SonWEB +Panel. Set it `true` to enable it, `false` otherwise. + +### Option: `certfile` + +The certificate file to use for SSL. + +**Note**: _The file MUST be stored in `/ssl/`, which is the default for Hass.io_ + +### Option: `keyfile` + +The private key file to use for SSL. + +**Note**: _The file MUST be stored in `/ssl/`, which is the default for Hass.io_ + +### Option: `ipv6` + +Set this option too `false` to disable IPv6 support. + +## Embedding into Home Assistant + +It is possible to embed the SonWEB interface directly into Home Assistant, +allowing you to access it through the Home Assistant frontend. + +Home Assistant provides the `panel_iframe` component, for these purposes. + +Example configuration: + +```yaml +panel_iframe: + sonweb: + title: SonWEB + icon: mdi:light-switch + url: http://addres.to.your.hass.io:9541 +``` + +## Changelog & Releases + +This repository keeps a change log using [GitHub's releases][releases] +functionality. The format of the log is based on +[Keep a Changelog][keepchangelog]. + +Releases are based on [Semantic Versioning][semver], and use the format +of ``MAJOR.MINOR.PATCH``. In a nutshell, the version will be incremented +based on the following: + +- ``MAJOR``: Incompatible or major changes. +- ``MINOR``: Backwards-compatible new features and enhancements. +- ``PATCH``: Backwards-compatible bugfixes and package updates. + +## Support + +Got questions? + +You have several options to get them answered: + +- The Home Assistant [Community Forum][forum], we have a + [dedicated topic][forum] on that forum regarding this add-on. +- The Home Assistant [Discord Chat Server][discord] for general Home Assistant + discussions and questions. +- Join the [Reddit subreddit][reddit] in [/r/homeassistant][reddit] + +You could also [open an issue here][issue] GitHub. + +## Contributing + +This is an active open-source project. We are always open to people who want to +use the code or contribute to it. + +We have set up a separate document containing our +[contribution guidelines](CONTRIBUTING.md). + +Thank you for being involved! :heart_eyes: + +## Authors & contributors + +The original setup of this repository is by [Franck Nijhof][frenck]. + +For a full list of all authors and contributors, +check [the contributor's page][contributors]. + +## We have got some Hass.io add-ons for you + +Want some more functionality to your Hass.io Home Assistant instance? + +We have created multiple add-ons for Hass.io. For a full list, check out +our [GitHub Repository][repository]. + +## License + +MIT License + +Copyright (c) 2018 Franck Nijhof + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +[aarch64-anchore-shield]: https://anchore.io/service/badges/image/db1960b51d33fe80c8a6f3318f327532c3a7f1f501c767dfa3d9202196982e2f +[aarch64-anchore]: https://anchore.io/image/dockerhub/hassioaddons%2Fsonweb-aarch64%3Alatest +[aarch64-arch-shield]: https://img.shields.io/badge/architecture-aarch64-blue.svg +[aarch64-dockerhub]: https://hub.docker.com/r/hassioaddons/sonweb-aarch64 +[aarch64-layers-shield]: https://images.microbadger.com/badges/image/hassioaddons/sonweb-aarch64.svg +[aarch64-microbadger]: https://microbadger.com/images/hassioaddons/sonweb-aarch64 +[aarch64-pulls-shield]: https://img.shields.io/docker/pulls/hassioaddons/sonweb-aarch64.svg +[aarch64-version-shield]: https://images.microbadger.com/badges/version/hassioaddons/sonweb-aarch64.svg +[amd64-anchore-shield]: https://anchore.io/service/badges/image/67ef5b927a8e861eee9e576477f4f6f1e52ccc30c657e906720a8fa3a9fe5fc7 +[amd64-anchore]: https://anchore.io/image/dockerhub/hassioaddons%2Fsonweb-amd64%3Alatest +[amd64-arch-shield]: https://img.shields.io/badge/architecture-amd64-blue.svg +[amd64-dockerhub]: https://hub.docker.com/r/hassioaddons/sonweb-amd64 +[amd64-layers-shield]: https://images.microbadger.com/badges/image/hassioaddons/sonweb-amd64.svg +[amd64-microbadger]: https://microbadger.com/images/hassioaddons/sonweb-amd64 +[amd64-pulls-shield]: https://img.shields.io/docker/pulls/hassioaddons/sonweb-amd64.svg +[amd64-version-shield]: https://images.microbadger.com/badges/version/hassioaddons/sonweb-amd64.svg +[armhf-anchore-shield]: https://anchore.io/service/badges/image/f2968fbefd4a99acfd25c100c099fcc1a5ae486289ca5b3548efde4c02583cc4 +[armhf-anchore]: https://anchore.io/image/dockerhub/hassioaddons%2Fsonweb-armhf%3Alatest +[armhf-arch-shield]: https://img.shields.io/badge/architecture-armhf-blue.svg +[armhf-dockerhub]: https://hub.docker.com/r/hassioaddons/sonweb-armhf +[armhf-layers-shield]: https://images.microbadger.com/badges/image/hassioaddons/sonweb-armhf.svg +[armhf-microbadger]: https://microbadger.com/images/hassioaddons/sonweb-armhf +[armhf-pulls-shield]: https://img.shields.io/docker/pulls/hassioaddons/sonweb-armhf.svg +[armhf-version-shield]: https://images.microbadger.com/badges/version/hassioaddons/sonweb-armhf.svg +[bountysource-shield]: https://img.shields.io/bountysource/team/hassio-addons/activity.svg +[bountysource]: https://www.bountysource.com/teams/hassio-addons/issues +[buymeacoffee-shield]: https://www.buymeacoffee.com/assets/img/guidelines/download-assets-sm-2.svg +[buymeacoffee]: https://www.buymeacoffee.com/frenck +[commits-shield]: https://img.shields.io/github/commit-activity/y/hassio-addons/addon-sonweb.svg +[commits]: https://github.com/hassio-addons/addon-sonweb/commits/master +[contributors]: https://github.com/hassio-addons/addon-sonweb/graphs/contributors +[discord-shield]: https://img.shields.io/discord/330944238910963714.svg +[discord]: https://discord.gg/c5DvZ4e +[forum-shield]: https://img.shields.io/badge/community-forum-brightgreen.svg +[forum]: https://community.home-assistant.io/?u=frenck +[frenck]: https://github.com/frenck +[gitlabci-shield]: https://gitlab.com/hassio-addons/addon-sonweb/badges/master/pipeline.svg +[gitlabci]: https://gitlab.com/hassio-addons/addon-sonweb/pipelines +[i386-anchore-shield]: https://anchore.io/service/badges/image/bfa0ec04d5a8519ccfaf3be75bcd92bd1d9821946e39368d2b88d7d14d16e58e +[i386-anchore]: https://anchore.io/image/dockerhub/hassioaddons%2Fsonweb-i386%3Alatest +[i386-arch-shield]: https://img.shields.io/badge/architecture-i386-blue.svg +[i386-dockerhub]: https://hub.docker.com/r/hassioaddons/sonweb-i386 +[i386-layers-shield]: https://images.microbadger.com/badges/image/hassioaddons/sonweb-i386.svg +[i386-microbadger]: https://microbadger.com/images/hassioaddons/sonweb-i386 +[i386-pulls-shield]: https://img.shields.io/docker/pulls/hassioaddons/sonweb-i386.svg +[i386-version-shield]: https://images.microbadger.com/badges/version/hassioaddons/sonweb-i386.svg +[issue]: https://github.com/hassio-addons/addon-sonweb/issues +[keepchangelog]: http://keepachangelog.com/en/1.0.0/ +[license-shield]: https://img.shields.io/github/license/hassio-addons/addon-sonweb.svg +[maintenance-shield]: https://img.shields.io/maintenance/yes/2018.svg +[project-stage-shield]: https://img.shields.io/badge/project%20stage-concept-red.svg +[reddit]: https://reddit.com/r/homeassistant +[releases-shield]: https://img.shields.io/github/release/hassio-addons/addon-sonweb.svg +[releases]: https://github.com/hassio-addons/addon-sonweb/releases +[repository]: https://github.com/hassio-addons/repository +[semver]: http://semver.org/spec/v2.0.0.html diff --git a/images/screenshot.png b/images/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..19e9e86944a25517a6cda732f60212932f2cdaf7 GIT binary patch literal 53263 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 qFfg#{8_OK&PZ$k0000 literal 0 HcmV?d00001 diff --git a/sonweb/.README.j2 b/sonweb/.README.j2 new file mode 100644 index 0000000..936686b --- /dev/null +++ b/sonweb/.README.j2 @@ -0,0 +1,76 @@ +# Community Hass.io Add-ons: SonWEB + +[![Release][release-shield]][release] ![Project Stage][project-stage-shield] ![Project Maintenance][maintenance-shield] + +[![Discord][discord-shield]][discord] [![Community Forum][forum-shield]][forum] + +[![Buy me a coffee][buymeacoffee-shield]][buymeacoffee] + +Centrally manage all your Sonoff-Tasmota devices. + +## About + +SonWEB is an administrative web interface to manage all your Sonoff-Tasmota +flashed devices centrally. Some of its features: + +- Scans your networks and adds your devices automatically +- See the status off all your devices quick and easy +- Configure all your devices from a single place +- Send out firmware updates over the air to one or more your devices at once +- Can automatically download the latest firmware for you + +[Click here for the full documentation][docs] + +![SonWEB screenshot][screenshot] + +{% if channel == "edge" %} +## WARNING! THIS IS AN EDGE VERSION! + +This Hass.io Add-ons repository contains edge builds of add-ons. Edge builds +add-ons are based upon the latest development version. + +- They may not work at all. +- They might stop working at any time. +- They could have a negative impact on your system. + +This repository was created for: + +- Anybody willing to test. +- Anybody interested in trying out upcoming add-ons or add-on features. +- Developers. + +If you are more interested in stable releases of our add-ons: + + + +{% endif %} +{% if channel == "beta" %} +## WARNING! THIS IS A BETA VERSION! + +This Hass.io Add-ons repository contains beta releases of add-ons. + +- They might stop working at any time. +- They could have a negative impact on your system. + +This repository was created for: + +- Anybody willing to test. +- Anybody interested in trying out upcoming add-ons or add-on features. + +If you are more interested in stable releases of our add-ons: + + + +{% endif %} +[buymeacoffee-shield]: https://www.buymeacoffee.com/assets/img/guidelines/download-assets-sm-2.svg +[buymeacoffee]: https://www.buymeacoffee.com/frenck +[discord-shield]: https://img.shields.io/discord/330944238910963714.svg +[discord]: https://discord.gg/c5DvZ4e +[docs]: {{ repo }}/blob/{{ version }}/README.md +[forum-shield]: https://img.shields.io/badge/community-forum-brightgreen.svg +[forum]: https://community.home-assistant.io/?u=frenck +[maintenance-shield]: https://img.shields.io/maintenance/yes/2018.svg +[project-stage-shield]: https://img.shields.io/badge/project%20stage-concept-red.svg +[release-shield]: https://img.shields.io/badge/version-{{ version }}-blue.svg +[release]: {{ repo }}/tree/{{ version }} +[screenshot]: https://github.com/hassio-addons/addon-sonweb/raw/master/images/screenshot.png diff --git a/sonweb/Dockerfile b/sonweb/Dockerfile new file mode 100755 index 0000000..734f2fd --- /dev/null +++ b/sonweb/Dockerfile @@ -0,0 +1,58 @@ +ARG BUILD_FROM=hassioaddons/base-amd64:1.4.1 +# hadolint ignore=DL3006 +FROM ${BUILD_FROM} + +# Setup base +RUN \ + apk add --no-cache \ + nginx=1.12.2-r3 \ + patch=2.7.5-r2 \ + php7-curl=7.1.17-r0 \ + php7-fpm=7.1.17-r0 \ + php7-json=7.1.17-r0 \ + php7-opcache=7.1.17-r0 \ + php7-session=7.1.17-r0 \ + php7-zip=7.1.17-r0 \ + php7=7.1.17-r0 \ + \ + && apk add --no-cache --virtual .build-dependencies \ + git=2.15.0-r1 \ + \ + && git clone --branch master --single-branch \ + https://github.com/reloxx13/SonWEB.git /var/www/sonweb \ + && git -C /var/www/sonweb checkout 74704ba33f7b4df0d5fd75c55253356edbb65029 \ + \ + && apk del --purge .build-dependencies \ + \ + && rm -f -r /var/www/sonweb/.git \ + && find /var/www/sonweb -type f -name ".htaccess" -depth -exec rm -f {} \; \ + && find /var/www/sonweb -type f -name "*.md" -depth -exec rm -f {} \; \ + && find /var/www/sonweb -type f -name ".gitignore" -depth -exec rm -f {} \; \ + && find /var/www/sonweb -type f -name ".empty" -depth -exec rm -f {} \; + +# Copy root filesystem +COPY rootfs / + +# Build arugments +ARG BUILD_ARCH +ARG BUILD_DATE +ARG BUILD_REF +ARG BUILD_VERSION + +# Labels +LABEL \ + io.hass.name="SonWEB" \ + io.hass.description="Centrally manage all your Sonoff-Tasmota devices" \ + io.hass.arch="${BUILD_ARCH}" \ + io.hass.type="addon" \ + io.hass.version=${BUILD_VERSION} \ + maintainer="Franck Nijhof " \ + org.label-schema.description="Centrally manage all your Sonoff-Tasmota devices" \ + org.label-schema.build-date=${BUILD_DATE} \ + org.label-schema.name="SonWEB" \ + org.label-schema.schema-version="1.0" \ + org.label-schema.url="https://community.home-assistant.io/?u=frenck" \ + org.label-schema.usage="https://github.com/hassio-addons/addon-sonweb/tree/master/README.md" \ + org.label-schema.vcs-ref=${BUILD_REF} \ + org.label-schema.vcs-url="https://github.com/hassio-addons/addon-sonweb" \ + org.label-schema.vendor="Community Hass.io Addons" diff --git a/sonweb/build.json b/sonweb/build.json new file mode 100755 index 0000000..17647ee --- /dev/null +++ b/sonweb/build.json @@ -0,0 +1,10 @@ +{ + "squash": false, + "build_from": { + "aarch64": "hassioaddons/base-aarch64:1.4.1", + "amd64": "hassioaddons/base-amd64:1.4.1", + "armhf": "hassioaddons/base-armhf:1.4.1", + "i386": "hassioaddons/base-i386:1.4.1" + }, + "args": {} +} diff --git a/sonweb/config.json b/sonweb/config.json new file mode 100755 index 0000000..a2f6bfd --- /dev/null +++ b/sonweb/config.json @@ -0,0 +1,40 @@ +{ + "name": "SonWEB", + "version": "dev", + "slug": "sonweb", + "description": "Centrally manage all your Sonoff-Tasmota devices", + "url": "https://community.home-assistant.io/?u=frenck", + "webui": "[PROTO:ssl]://[HOST]:[PORT:9541]", + "startup": "system", + "arch": [ + "aarch64", + "amd64", + "armhf", + "i386" + ], + "boot": "auto", + "hassio_api": true, + "map": [ + "ssl" + ], + "ports": { + "9541/tcp": 9541 + }, + "options": { + "log_level": "info", + "ssl": false, + "certfile": "fullchain.pem", + "keyfile": "privkey.pem", + "ipv6": false + }, + "schema": { + "log_level": "match(^(trace|debug|info|notice|warning|error|fatal)$)", + "ssl": "bool", + "certfile": "str", + "keyfile": "str", + "ipv6": "bool" + }, + "environment": { + "LOG_FORMAT": "{LEVEL}: {MESSAGE}" + } +} diff --git a/sonweb/icon.png b/sonweb/icon.png new file mode 100755 index 0000000000000000000000000000000000000000..ce94a9570d42d5679f7cf66b881cffd8950e4427 GIT binary patch literal 1396 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 UtGEOK1poj507*qoM6N<$f|(;gJpcdz literal 0 HcmV?d00001 diff --git a/sonweb/rootfs/etc/cont-init.d/10-requirements.sh b/sonweb/rootfs/etc/cont-init.d/10-requirements.sh new file mode 100755 index 0000000..c4b0b3a --- /dev/null +++ b/sonweb/rootfs/etc/cont-init.d/10-requirements.sh @@ -0,0 +1,26 @@ +#!/usr/bin/with-contenv bash +# ============================================================================== +# Community Hass.io Add-ons: SonWEB +# This files check if all user configuration requirements are met +# ============================================================================== +# shellcheck disable=SC1091 +source /usr/lib/hassio-addons/base.sh + +# Check SSL requirements, if enabled +if hass.config.true 'ssl'; then + if ! hass.config.has_value 'certfile'; then + hass.die 'SSL is enabled, but no certfile was specified' + fi + + if ! hass.config.has_value 'keyfile'; then + hass.die 'SSL is enabled, but no keyfile was specified' + fi + + if ! hass.file_exists "/ssl/$(hass.config.get 'certfile')"; then + hass.die 'The configured certfile is not found' + fi + + if ! hass.file_exists "/ssl/$(hass.config.get 'keyfile')"; then + hass.die 'The configured keyfile is not found' + fi +fi diff --git a/sonweb/rootfs/etc/cont-init.d/11-nginx.sh b/sonweb/rootfs/etc/cont-init.d/11-nginx.sh new file mode 100755 index 0000000..fd3b383 --- /dev/null +++ b/sonweb/rootfs/etc/cont-init.d/11-nginx.sh @@ -0,0 +1,25 @@ +#!/usr/bin/with-contenv bash +# ============================================================================== +# Community Hass.io Add-ons: SonWEB +# Configures NGINX for use with SonWEB +# ============================================================================== +# shellcheck disable=SC1091 +source /usr/lib/hassio-addons/base.sh + +declare certfile +declare keyfile + +if hass.config.true 'ssl'; then + rm /etc/nginx/nginx.conf + mv /etc/nginx/nginx-ssl.conf /etc/nginx/nginx.conf + + certfile=$(hass.config.get 'certfile') + keyfile=$(hass.config.get 'keyfile') + + sed -i "s/%%certfile%%/${certfile}/g" /etc/nginx/nginx.conf + sed -i "s/%%keyfile%%/${keyfile}/g" /etc/nginx/nginx.conf +fi + +if ! hass.config.true 'ipv6'; then + sed -i '/listen \[::\].*/ d' /etc/nginx/nginx.conf +fi diff --git a/sonweb/rootfs/etc/cont-init.d/12-patches.sh b/sonweb/rootfs/etc/cont-init.d/12-patches.sh new file mode 100644 index 0000000..cd476a5 --- /dev/null +++ b/sonweb/rootfs/etc/cont-init.d/12-patches.sh @@ -0,0 +1,36 @@ +#!/usr/bin/with-contenv bash +# ============================================================================== +# Community Hass.io Add-ons: SonWEB +# Applies patch to remove SelfUpdate, since that is useless shit in Docker +# ============================================================================== +# shellcheck disable=SC1091 +source /usr/lib/hassio-addons/base.sh + +patch -F2 -R --ignore-whitespace /var/www/sonweb/includes/header.php <<'PATCH' +--- header.php 2018-05-22 00:00:00.463304792 +0200 ++++ header.php 2018-05-22 00:00:00.291634513 +0200 +@@ -178,6 +178,15 @@ + + + ++ ++

++ ++ + + + +PATCH + +# shellcheck disable=SC2181 +if [[ "$?" -ne 0 ]]; +then + hass.die 'Patching SonWEB SelfUpdate failed' +fi + +hass.log.debug 'Applied SonWEB SelfUpdate fix' diff --git a/sonweb/rootfs/etc/cont-init.d/13-persistent-data.sh b/sonweb/rootfs/etc/cont-init.d/13-persistent-data.sh new file mode 100644 index 0000000..c514e51 --- /dev/null +++ b/sonweb/rootfs/etc/cont-init.d/13-persistent-data.sh @@ -0,0 +1,23 @@ +#!/usr/bin/with-contenv bash +# ============================================================================== +# Community Hass.io Add-ons: SonWEB +# Ensures data is store in a persistent location +# ============================================================================== +# shellcheck disable=SC1091 +source /usr/lib/hassio-addons/base.sh + +if ! hass.directory_exists "/data/sonweb"; then + hass.log.debug 'Data directory not initialized, doing that now...' + + # Setup structure + cp -R /var/www/sonweb/data /data/sonweb + + # Ensure file permissions + chown -R nginx:nginx /data/sonweb + find /data/sonweb -not -perm 0644 -type f -exec chmod 0644 {} \; + find /data/sonweb -not -perm 0755 -type d -exec chmod 0755 {} \; +fi + +hass.log.debug 'Symlinking data directory to persistent storage location...' +rm -f -r /var/www/sonweb/data +ln -s /data/sonweb /var/www/sonweb/data diff --git a/sonweb/rootfs/etc/fix-attrs.d/01-sonweb b/sonweb/rootfs/etc/fix-attrs.d/01-sonweb new file mode 100644 index 0000000..8da210a --- /dev/null +++ b/sonweb/rootfs/etc/fix-attrs.d/01-sonweb @@ -0,0 +1,2 @@ +/var/www/sonweb true nginx 0644 0755 +/data/sonweb true nginx 0644 0755 diff --git a/sonweb/rootfs/etc/nginx/nginx-ssl.conf b/sonweb/rootfs/etc/nginx/nginx-ssl.conf new file mode 100755 index 0000000..fa28992 --- /dev/null +++ b/sonweb/rootfs/etc/nginx/nginx-ssl.conf @@ -0,0 +1,62 @@ +worker_processes 1; +pid /var/run/nginx.pid; +user nginx nginx; + +events { + worker_connections 1024; +} + +http { + include mime.types; + default_type application/octet-stream; + sendfile on; + keepalive_timeout 65; + + server { + server_name hassio.local; + listen 9541 default_server ssl; + listen [::]:9541 default_server ssl; + root /var/www/sonweb; + index index.php; + + ssl_certificate /ssl/%%certfile%%; + ssl_certificate_key /ssl/%%keyfile%%; + ssl_protocols TLSv1.2; + ssl_prefer_server_ciphers on; + ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA; + ssl_ecdh_curve secp384r1; + ssl_session_timeout 10m; + ssl_session_cache shared:SSL:10m; + ssl_session_tickets off; + ssl_stapling on; + ssl_stapling_verify on; + + add_header X-Content-Type-Options nosniff; + add_header X-XSS-Protection "1; mode=block"; + add_header X-Robots-Tag none; + + location ~ .php$ { + fastcgi_pass 127.0.0.1:9001; + fastcgi_read_timeout 900; + fastcgi_split_path_info ^(.+\.php)(/.+)$; + fastcgi_index index.php; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + include fastcgi_params; + } + + location /data/ { + deny all; + } + + rewrite ^/login$ /login.php last; + rewrite ^/logout$ /login.php?logout=logout last; + rewrite ^/doAjaxAll$ /index.php?doAjaxAll=doAjaxAll last; + rewrite ^/doAjax$ /index.php?doAjax=doAjax last; + rewrite "/([a-z]{2})/" /index.php?lang=$1 last; + rewrite ^/([a-zA-Z_]+)/([a-zA-Z_]+)/([0-9_]+)/?$ /index.php?page=$1&action=$2&device_id=$3; + rewrite ^/([a-zA-Z_]+)/(force)/?$ /index.php?page=$1&force=1; + rewrite ^/([a-zA-Z_]+)/([a-zA-Z_]+)/?$ /index.php?page=$1&action=$2; + rewrite ^/([a-zA-Z_]+)/([0-9]+)/?$ /index.php?page=$1&device_id=$2; + rewrite ^/([a-zA-Z_]+)/?$ /index.php?page=$1; + } +} diff --git a/sonweb/rootfs/etc/nginx/nginx.conf b/sonweb/rootfs/etc/nginx/nginx.conf new file mode 100755 index 0000000..c1a8d7d --- /dev/null +++ b/sonweb/rootfs/etc/nginx/nginx.conf @@ -0,0 +1,46 @@ +worker_processes 1; +pid /var/run/nginx.pid; +user nginx nginx; + +events { + worker_connections 1024; +} + +http { + include mime.types; + default_type application/octet-stream; + sendfile on; + keepalive_timeout 65; + + server { + server_name hassio.local; + listen 9541 default_server; + listen [::]:9541 default_server; + root /var/www/sonweb/; + index index.php; + + location ~ .php$ { + fastcgi_pass 127.0.0.1:9001; + fastcgi_read_timeout 900; + fastcgi_split_path_info ^(.+\.php)(/.+)$; + fastcgi_index index.php; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + include fastcgi_params; + } + + location /data/ { + deny all; + } + + rewrite ^/login$ /login.php last; + rewrite ^/logout$ /login.php?logout=logout last; + rewrite ^/doAjaxAll$ /index.php?doAjaxAll=doAjaxAll last; + rewrite ^/doAjax$ /index.php?doAjax=doAjax last; + rewrite "/([a-z]{2})/" /index.php?lang=$1 last; + rewrite ^/([a-zA-Z_]+)/([a-zA-Z_]+)/([0-9_]+)/?$ /index.php?page=$1&action=$2&device_id=$3; + rewrite ^/([a-zA-Z_]+)/(force)/?$ /index.php?page=$1&force=1; + rewrite ^/([a-zA-Z_]+)/([a-zA-Z_]+)/?$ /index.php?page=$1&action=$2; + rewrite ^/([a-zA-Z_]+)/([0-9]+)/?$ /index.php?page=$1&device_id=$2; + rewrite ^/([a-zA-Z_]+)/?$ /index.php?page=$1; + } +} diff --git a/sonweb/rootfs/etc/php7/blacklist.txt b/sonweb/rootfs/etc/php7/blacklist.txt new file mode 100644 index 0000000..f47d41f --- /dev/null +++ b/sonweb/rootfs/etc/php7/blacklist.txt @@ -0,0 +1,2 @@ +/data/sonweb/* +/var/www/sonweb/data/* diff --git a/sonweb/rootfs/etc/php7/conf.d/99-sonweb.ini b/sonweb/rootfs/etc/php7/conf.d/99-sonweb.ini new file mode 100644 index 0000000..82d2f7c --- /dev/null +++ b/sonweb/rootfs/etc/php7/conf.d/99-sonweb.ini @@ -0,0 +1,9 @@ +[general] +max_execution_time = 900 +opcache.enable=1 +opcache.interned_strings_buffer=8 +opcache.max_accelerated_files=4096 +opcache.memory_consumption=32 +opcache.revalidate_freq=0 +opcache.validate_timestamps=0 +opcache.blacklist_filename=/etc/php7/blacklist.txt diff --git a/sonweb/rootfs/etc/php7/php-fpm.d/www.conf b/sonweb/rootfs/etc/php7/php-fpm.d/www.conf new file mode 100644 index 0000000..13c8a71 --- /dev/null +++ b/sonweb/rootfs/etc/php7/php-fpm.d/www.conf @@ -0,0 +1,11 @@ +[www] +user = nginx +group = nginx +listen = 127.0.0.1:9001 +pm = dynamic +pm.max_children = 10 +pm.start_servers = 3 +pm.min_spare_servers = 2 +pm.max_spare_servers = 5 +pm.max_requests = 1024 +clear_env = yes diff --git a/sonweb/rootfs/etc/services.d/nginx/finish b/sonweb/rootfs/etc/services.d/nginx/finish new file mode 100755 index 0000000..b8068ed --- /dev/null +++ b/sonweb/rootfs/etc/services.d/nginx/finish @@ -0,0 +1,9 @@ +#!/usr/bin/execlineb -S0 +# ============================================================================== +# Community Hass.io Add-ons: SonWEB +# Take down the S6 supervision tree when Nginx fails +# ============================================================================== +if -n { s6-test $# -ne 0 } +if -n { s6-test ${1} -eq 256 } + +s6-svscanctl -t /var/run/s6/services diff --git a/sonweb/rootfs/etc/services.d/nginx/run b/sonweb/rootfs/etc/services.d/nginx/run new file mode 100755 index 0000000..4e3702b --- /dev/null +++ b/sonweb/rootfs/etc/services.d/nginx/run @@ -0,0 +1,12 @@ +#!/usr/bin/with-contenv bash +# ============================================================================== +# Community Hass.io Add-ons: SonWEB +# Runs the Nginx daemon +# ============================================================================== +# shellcheck disable=SC1091 +source /usr/lib/hassio-addons/base.sh + +# Wait for PHP-FPM to become available +s6-svwait -u -t 5000 /var/run/s6/services/php-fpm + +exec nginx -g "daemon off;" diff --git a/sonweb/rootfs/etc/services.d/php-fpm/finish b/sonweb/rootfs/etc/services.d/php-fpm/finish new file mode 100644 index 0000000..b84521c --- /dev/null +++ b/sonweb/rootfs/etc/services.d/php-fpm/finish @@ -0,0 +1,9 @@ +#!/usr/bin/execlineb -S0 +# ============================================================================== +# Community Hass.io Add-ons: SonWEB +# Take down the S6 supervision tree when PHP FPM fails +# ============================================================================== +if -n { s6-test $# -ne 0 } +if -n { s6-test ${1} -eq 256 } + +s6-svscanctl -t /var/run/s6/services diff --git a/sonweb/rootfs/etc/services.d/php-fpm/run b/sonweb/rootfs/etc/services.d/php-fpm/run new file mode 100644 index 0000000..7486cc0 --- /dev/null +++ b/sonweb/rootfs/etc/services.d/php-fpm/run @@ -0,0 +1,9 @@ +#!/usr/bin/with-contenv bash +# ============================================================================== +# Community Hass.io Add-ons: SonWEB +# Runs the PHP-FPM daemon +# ============================================================================== +# shellcheck disable=SC1091 +source /usr/lib/hassio-addons/base.sh + +exec php-fpm7 --nodaemonize