diff --git a/README.md b/README.md new file mode 100644 index 0000000..19329b7 --- /dev/null +++ b/README.md @@ -0,0 +1,224 @@ +# Community Hass.io Add-ons: ZeroTier One + +[![GitHub Release][releases-shield]][releases] +![Project Stage][project-stage-shield] +[![License][license-shield]](LICENSE.md) + +![Supports aarch64 Architecture][aarch64-shield] +![Supports amd64 Architecture][amd64-shield] +![Supports armhf Architecture][armhf-shield] +![Supports armv7 Architecture][armv7-shield] +![Supports i386 Architecture][i386-shield] + +[![GitLab CI][gitlabci-shield]][gitlabci] +![Project Maintenance][maintenance-shield] +[![GitHub Activity][commits-shield]][commits] + +[![Discord][discord-shield]][discord] +[![Community Forum][forum-shield]][forum] + +[![Buy me a coffee][buymeacoffee-shield]][buymeacoffee] + +[![Support my work on Patreon][patreon-shield]][patreon] + +Radically simplify your network with a virtual networking layer that works +the same everywhere. + +## About + +ZeroTier delivers the capabilities of VPNs, SDN, and SD-WAN with a single +system. Manage all your connected resources across both local and wide area +networks as if the whole world is a single data center. + +People use ZeroTier to seamlessly connect laptops, desktops, phones, +embedded devices, cloud resources, and apps any way they want anywhere they go. +It transforms the entire world into a single data center, to which you +can now add your Home Assistant instance using this add-on. + +## 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 "ZeroTier One" add-on. +1. Create a free account at [zerotier.com][zerotier] and get a network ID. +1. Set the "network_id" add-on option with your network ID. +1. Start the "ZeroTier One" add-on +1. Check the logs of the "ZeroTier One" add-on to see if everything went well. +1. The instance will show up in your ZeroTier account. + +**NOTE**: Do not add this repository to Hass.io, please use: +`https://github.com/hassio-addons/repository`. + +## Configuration + +**Note**: _Remember to restart the add-on when the configuration is changed._ + +Example add-on configuration: + +```json +{ + "log_level": "info", + "port": 9993, + "network_id":"wgfyiwe73747457" +} +``` + +**Note**: _This is just an example, don't copy and paste 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: `network_id` + +Configures the network identifier of the network (VLAN) to join. +You can find this number in your ZeroTier account. + +**Note**: _This option support secrets, e.g., `!secret zerotier_network_id`._ + +### Option: `port` + +ZeroTier UDP & TCP port for communications. + +You **do not** need to expose this port to the outside world! +So please **do not** forward this port in your router. + +### Option: `api_auth_token` + +ZeroTier exposes a local HTTP JSON API, which uses the port set using the +`port` option above. It allows tools and programs to access this ZeroTier +instance for quering data (or control it). + +This token is like a password for accessing that API, you can leave this +option empty if you are not planning on using this feature. + +For more information on the ZeroTier JSON API, [check their documentation][api]. + +**Note**: _This option support secrets, e.g., `!secret zerotier_token`._ + +## 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 [Community Hass.io Add-ons Discord chat server][discord] for add-on + support and feature requests. +- The [Home Assistant Discord chat server][discord-ha] for general Home + Assistant discussions and questions. +- The Home Assistant [Community Forum][forum]. +- 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) 2019 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-shield]: https://img.shields.io/badge/aarch64-yes-green.svg +[amd64-shield]: https://img.shields.io/badge/amd64-yes-green.svg +[api]: https://www.zerotier.com/manual.shtml#4_1 +[armhf-shield]: https://img.shields.io/badge/armhf-yes-green.svg +[armv7-shield]: https://img.shields.io/badge/armv7-yes-green.svg +[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-zerotier.svg +[commits]: https://github.com/hassio-addons/addon-zerotier/commits/master +[contributors]: https://github.com/hassio-addons/addon-zerotier/graphs/contributors +[discord-ha]: https://discord.gg/c5DvZ4e +[discord-shield]: https://img.shields.io/discord/478094546522079232.svg +[discord]: https://discord.me/hassioaddons +[dockerhub]: https://hub.docker.com/r/hassioaddons/zerotier +[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-zerotier/badges/master/pipeline.svg +[gitlabci]: https://gitlab.com/hassio-addons/addon-zerotier/pipelines +[home-assistant]: https://home-assistant.io +[i386-shield]: https://img.shields.io/badge/i386-yes-green.svg +[issue]: https://github.com/hassio-addons/addon-zerotier/issues +[keepchangelog]: http://keepachangelog.com/en/1.0.0/ +[license-shield]: https://img.shields.io/github/license/hassio-addons/addon-zerotier.svg +[maintenance-shield]: https://img.shields.io/maintenance/yes/2019.svg +[patreon-shield]: https://www.frenck.nl/images/patreon.png +[patreon]: https://www.patreon.com/ +[project-stage-shield]: https://img.shields.io/badge/project%20stage-experimental-yellow.svg +[reddit]: https://reddit.com/r/homeassistant +[releases-shield]: https://img.shields.io/github/release/hassio-addons/addon-zerotier.svg +[releases]: https://github.com/hassio-addons/addon-zerotier/releases +[repository]: https://github.com/hassio-addons/repository +[semver]: http://semver.org/spec/v2.0.0.htm diff --git a/zerotier/.README.j2 b/zerotier/.README.j2 new file mode 100644 index 0000000..4714fce --- /dev/null +++ b/zerotier/.README.j2 @@ -0,0 +1,78 @@ +# Community Hass.io Add-ons: ZeroTier One + +[![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] + +[![Support my work on Patreon][patreon-shield]][patreon] + +Radically simplify your network with a virtual networking layer that works +the same everywhere. + +## About + +ZeroTier delivers the capabilities of VPNs, SDN, and SD-WAN with a single +system. Manage all your connected resources across both local and wide area +networks as if the whole world is a single data center. + +People use ZeroTier to seamlessly connect laptops, desktops, phones, +embedded devices, cloud resources, and apps any way they want anywhere they go. +It transforms the entire world into a single data center, to which you +can now add your Home Assistant instance using this add-on. + +[Click here for the full documentation][docs] + +{% 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/478094546522079232.svg +[discord]: https://discord.me/hassioaddons +[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/2019.svg +[patreon-shield]: https://www.frenck.nl/images/patreon.png +[patreon]: https://www.patreon.com/frenck +[project-stage-shield]: https://img.shields.io/badge/project%20stage-experimental-yellow.svg +[release-shield]: https://img.shields.io/badge/version-{{ version }}-blue.svg +[release]: {{ repo }}/tree/{{ version }} diff --git a/zerotier/Dockerfile b/zerotier/Dockerfile new file mode 100755 index 0000000..b0320fa --- /dev/null +++ b/zerotier/Dockerfile @@ -0,0 +1,54 @@ +ARG BUILD_FROM=hassioaddons/base:3.0.1 +# hadolint ignore=DL3006 +FROM ${BUILD_FROM} + +# Set shell +SHELL ["/bin/bash", "-o", "pipefail", "-c"] + +# Setup base +RUN \ + apk add --no-cache --virtual .build-dependencies \ + build-base=0.5-r1 \ + linux-headers=4.18.13-r1 \ + git=2.20.1-r0 \ + \ + && apk add --no-cache \ + libgcc=8.2.0-r2 \ + libstdc++=8.2.0-r2 \ + \ + && git clone --branch "1.2.12" --depth=1 \ + "https://github.com/zerotier/ZeroTierOne.git" /tmp/zerotier \ + \ + && cd /tmp/zerotier \ + && make \ + && make install \ + \ + && rm -f -r /tmp/* \ + && apk del --purge .build-dependencies + +# Copy root filesystem +COPY rootfs / + +# Build arguments +ARG BUILD_ARCH +ARG BUILD_DATE +ARG BUILD_REF +ARG BUILD_VERSION + +# Labels +LABEL \ + io.hass.name="ZeroTier One" \ + io.hass.description="Radically simplify your network with a virtual networking layer that works the same everywhere" \ + io.hass.arch="${BUILD_ARCH}" \ + io.hass.type="addon" \ + io.hass.version=${BUILD_VERSION} \ + maintainer="Franck Nijhof " \ + org.label-schema.description="Radically simplify your network with a virtual networking layer that works the same everywhere" \ + org.label-schema.build-date=${BUILD_DATE} \ + org.label-schema.name="ZeroTier One" \ + 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-zerotier/tree/master/README.md" \ + org.label-schema.vcs-ref=${BUILD_REF} \ + org.label-schema.vcs-url="https://github.com/hassio-addons/addon-zerotier" \ + org.label-schema.vendor="Community Hass.io Add-ons" diff --git a/zerotier/build.json b/zerotier/build.json new file mode 100644 index 0000000..7ceed1b --- /dev/null +++ b/zerotier/build.json @@ -0,0 +1,10 @@ +{ + "build_from": { + "aarch64": "hassioaddons/base-aarch64:3.0.1", + "amd64": "hassioaddons/base-amd64:3.0.1", + "armhf": "hassioaddons/base-armhf:3.0.1", + "armv7": "hassioaddons/base-armv7:3.0.1", + "i386": "hassioaddons/base-i386:3.0.1" + }, + "args": {} +} diff --git a/zerotier/config.json b/zerotier/config.json new file mode 100755 index 0000000..8e9f731 --- /dev/null +++ b/zerotier/config.json @@ -0,0 +1,43 @@ +{ + "name": "ZeroTier One", + "version": "dev", + "slug": "zerotier", + "description": "Radically simplify your network with a virtual networking layer that works the same everywhere", + "url": "https://github.com/hassio-addons/addon-zerotier", + "startup": "services", + "arch": [ + "aarch64", + "amd64", + "armhf", + "armv7", + "i386" + ], + "boot": "auto", + "hassio_api": true, + "hassio_role": "default", + "homeassistant_api": false, + "host_network": true, + "apparmor": true, + "privileged": [ + "NET_ADMIN", + "SYS_ADMIN" + ], + "devices": [ + "/dev/net/tun:/dev/net/tun:rwm" + ], + "map": [ + "config", + "ssl:rw" + ], + "options": { + "network_id":"", + "port": 9993, + "api_auth_token": "" + }, + "schema": { + "api_auth_token": "str", + "log_level": "match(^(trace|debug|info|notice|warning|error|fatal)$)?", + "network_id":"match([0-9a-z]{16})", + "port": "port" + } +} diff --git a/zerotier/icon.png b/zerotier/icon.png new file mode 100644 index 0000000..a90b22a Binary files /dev/null and b/zerotier/icon.png differ diff --git a/zerotier/logo.png b/zerotier/logo.png new file mode 100644 index 0000000..385d0ad Binary files /dev/null and b/zerotier/logo.png differ diff --git a/zerotier/rootfs/etc/cont-init.d/10-identity.sh b/zerotier/rootfs/etc/cont-init.d/10-identity.sh new file mode 100644 index 0000000..343f87b --- /dev/null +++ b/zerotier/rootfs/etc/cont-init.d/10-identity.sh @@ -0,0 +1,38 @@ +#!/usr/bin/with-contenv bashio +# ============================================================================== +# Community Hass.io Add-ons: ZeroTier One +# Generates an identiy in case it does not exists yet +# ============================================================================== +readonly private='/ssl/zerotier/identity.secret' +readonly public='/ssl/zerotier/identity.public' +declare node + +# Generate identity if it does not exist +if ! bashio::fs.file_exists "${private}" \ + || ! bashio::fs.file_exists "${public}"; +then + bashio::log.info "Generating identity files..." + + if bashio::fs.file_exists "${private}"; then + rm -f "${private}" \ + || bashio::exit.nok "Failed to delete old private identify file" + fi + + if bashio::fs.file_exists "${public}"; then + rm -f "${public}" \ + || bashio::exit.nok "Failed to delete old private identify file" + fi + + if ! bashio::fs.directory_exists '/ssl/zerotier'; then + mkdir /ssl/zerotier \ + || bashio::exit.nok "Failed to create identity folder" + fi + + zerotier-idtool generate "${private}" "${public}" +fi + +ln -s "${private}" /var/lib/zerotier-one/identity.secret +ln -s "${public}" /var/lib/zerotier-one/identity.public + +node=$(cut -d ':' -f1 < "${private}") +bashio::log.info "ZeroTier node address: ${node}" diff --git a/zerotier/rootfs/etc/cont-init.d/20-api.sh b/zerotier/rootfs/etc/cont-init.d/20-api.sh new file mode 100644 index 0000000..6e48a5d --- /dev/null +++ b/zerotier/rootfs/etc/cont-init.d/20-api.sh @@ -0,0 +1,10 @@ +#!/usr/bin/with-contenv bashio +# ============================================================================== +# Community Hass.io Add-ons: ZeroTier One +# Sets the auth token for the local JSON API +# ============================================================================== +declare token +if bashio::config.has_value 'api_auth_token'; then + token=$(bashio::config 'api_auth_token') + echo "${token}" > /data/authtoken.secret +fi diff --git a/zerotier/rootfs/etc/cont-init.d/21-network.sh b/zerotier/rootfs/etc/cont-init.d/21-network.sh new file mode 100644 index 0000000..c2ac58c --- /dev/null +++ b/zerotier/rootfs/etc/cont-init.d/21-network.sh @@ -0,0 +1,17 @@ +#!/usr/bin/with-contenv bashio +# ============================================================================== +# Community Hass.io Add-ons: ZeroTier One +# Creates ZeroTier One configuration in case it is non-existing +# ============================================================================== +readonly network=$(bashio::config 'network_id') + +# Ensure network folder exists +mkdir -p "/var/lib/zerotier-one/networks.d" \ + || bashio::exit.nok "Could not create networks folder" + +# Ensure the file exists. An empty file will cause automatic join. +touch "/data/network.${network}.conf" +ln -s \ + "/data/network.${network}.conf" \ + "/var/lib/zerotier-one/networks.d/${network}.conf" \ + || bashio::exit.nok "Could not create network file" diff --git a/zerotier/rootfs/etc/services.d/zerotier/finish b/zerotier/rootfs/etc/services.d/zerotier/finish new file mode 100644 index 0000000..2bb6055 --- /dev/null +++ b/zerotier/rootfs/etc/services.d/zerotier/finish @@ -0,0 +1,9 @@ +#!/usr/bin/execlineb -S0 +# ============================================================================== +# Community Hass.io Add-ons: ZeroTier One +# Take down the S6 supervision tree when ZeroTier fails +# ============================================================================== +if -n { s6-test $# -ne 0 } +if -n { s6-test ${1} -eq 256 } + +s6-svscanctl -t /var/run/s6/services diff --git a/zerotier/rootfs/etc/services.d/zerotier/run b/zerotier/rootfs/etc/services.d/zerotier/run new file mode 100644 index 0000000..180de15 --- /dev/null +++ b/zerotier/rootfs/etc/services.d/zerotier/run @@ -0,0 +1,15 @@ +#!/usr/bin/with-contenv bashio +# ============================================================================== +# Community Hass.io Add-ons: ZeroTier One +# Runs ZeroTier One +# ============================================================================== +declare -a options + +bashio::log.info "Starting ZeroTier One..." + +# Note sure what this does. +options+=(-U) +options+=("-p$(bashio::config 'port')") + +# Run the ZeroTier One +exec zerotier-one "${options[@]}"