From e041264bea5e77cef300a1d81e92ef1367800252 Mon Sep 17 00:00:00 2001 From: Alexandre <44178713+alexbelgium@users.noreply.github.com> Date: Tue, 12 Apr 2022 16:37:26 +0200 Subject: [PATCH] feat: new addon --- README.md | 1 + omada/CHANGELOG.md | 1 + omada/Dockerfile | 97 ++++++++++++++++++ omada/Readme.md | 48 +++++++++ omada/apparmor.txt | 56 ++++++++++ omada/build.json | 7 ++ omada/config.json | 47 +++++++++ omada/icon.png | Bin 0 -> 21951 bytes omada/logo.png | Bin 0 -> 21951 bytes .../cont-init.d/00-aaa_dockerfile_backup.sh | 33 ++++++ omada/rootfs/etc/cont-init.d/00-folders.sh | 30 ++++++ 11 files changed, 320 insertions(+) create mode 100644 omada/CHANGELOG.md create mode 100644 omada/Dockerfile create mode 100644 omada/Readme.md create mode 100644 omada/apparmor.txt create mode 100644 omada/build.json create mode 100644 omada/config.json create mode 100644 omada/icon.png create mode 100644 omada/logo.png create mode 100644 omada/rootfs/etc/cont-init.d/00-aaa_dockerfile_backup.sh create mode 100644 omada/rootfs/etc/cont-init.d/00-folders.sh diff --git a/README.md b/README.md index 4d50b7a88..f6c320b7b 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,7 @@ https://github.com/alexbelgium/hassio-addons - [Firefly III Data Importer](fireflyiii_data_importer/) : Data importer for Firefly III - [Mealie](mealie/) : Mealie is a self hosted recipe manager and meal planner with a RestAPI backend and a reactive frontend application built in Vue for a pleasant user experience for the whole family. This addon is based on the docker image from hay-kot. - [Tandoor Recipes](tandoor_recipes/): Recipe manager +- [TP-link Omada](omada/): TP-Link Omada Controller - [Wger](wger/): manage your personal workouts, weight and diet plans - [Zoneminder](zoneminder/): a full-featured, open source, state-of-the-art video surveillance software system diff --git a/omada/CHANGELOG.md b/omada/CHANGELOG.md new file mode 100644 index 000000000..66f7e8b76 --- /dev/null +++ b/omada/CHANGELOG.md @@ -0,0 +1 @@ +- Initial release diff --git a/omada/Dockerfile b/omada/Dockerfile new file mode 100644 index 000000000..e6bc837ee --- /dev/null +++ b/omada/Dockerfile @@ -0,0 +1,97 @@ +#============================# +# ALEXBELGIUM'S DOCKERFILE # +#============================# +# _.------. +# _.-` ('>.-`"""-. +# '.--'` _'` _ .--.) +# -' '-.-';` ` +# ' - _.' ``'--. +# '---` .-'""` +# /` +#=== Home Assistant Addon ===# + +################# +# 1 Build Image # +################# + +ARG BUILD_FROM +ARG BUILD_VERSION +ARG BUILD_UPSTREAM="5.1.7" +FROM ${BUILD_FROM} + +################## +# 2 Modify Image # +################## + +RUN echo "Adding symlinks to entrypoint" \ + && sed -i \ + -e '1a chmod a+x /etc/cont-init.d/*' \ + -e '1a sed -i "s|/usr/bin/with-contenv bashio|/usr/bin/env bashio|g" /etc/cont-init.d/*' \ + -e '1a for i in /etc/cont-init.d/*; do /."$i"; done' \ + /entrypoint.sh + +################## +# 3 Install apps # +################## + +# Copy local files +COPY rootfs/ / + +# Modules +ARG MODULES="00-banner.sh" + +# Automatic modules download +RUN if ! command -v bash >/dev/null 2>/dev/null; then (apt-get update && apt-get install -yqq --no-install-recommends bash || apk add --no-cache bash) >/dev/null; fi \ + && if ! command -v curl >/dev/null 2>/dev/null; then (apt-get update && apt-get install -yqq --no-install-recommends curl || apk add --no-cache curl) >/dev/null; fi \ + && mkdir -p /etc/cont-init.d \ + && for scripts in $MODULES; do echo "$scripts" && curl -f -L -s -S "https://raw.githubusercontent.com/alexbelgium/hassio-addons/master/.templates/$scripts" -o /etc/cont-init.d/"$scripts" && [ "$(sed -n '/\/bin/p;q' /etc/cont-init.d/"$scripts")" != "" ] || (echo "script failed to install $scripts" && exit 1); done \ + && chmod -R 755 /etc/cont-init.d || printf '%s\n' "${MODULES}" >/MODULESFILE + +# Manual apps +ENV PACKAGES="" + +# Automatic apps & bashio +RUN if ! command -v bash >/dev/null 2>/dev/null; then (apt-get update && apt-get install -yqq --no-install-recommends bash || apk add --no-cache bash) >/dev/null; fi \ + && if ! command -v curl >/dev/null 2>/dev/null; then (apt-get update && apt-get install -yqq --no-install-recommends curl || apk add --no-cache curl) >/dev/null; fi \ + && curl -f -L -s -S "https://raw.githubusercontent.com/alexbelgium/hassio-addons/master/.templates/automatic_packages.sh" --output /automatic_packages.sh \ + && chmod 777 /automatic_packages.sh \ + && eval /./automatic_packages.sh "${PACKAGES:-}" \ + && rm /automatic_packages.sh || printf '%s\n' "${PACKAGES:-}" > /ENVFILE + +################ +# 4 Entrypoint # +################ + +#RUN chmod 777 /entrypoint.sh +#ENTRYPOINT [ "/usr/bin/env" ] +#CMD [ "/entrypoint.sh" ] + +############ +# 5 Labels # +############ + +ARG BUILD_ARCH +ARG BUILD_DATE +ARG BUILD_DESCRIPTION +ARG BUILD_NAME +ARG BUILD_REF +ARG BUILD_REPOSITORY +ARG BUILD_VERSION +LABEL \ + io.hass.name="${BUILD_NAME}" \ + io.hass.description="${BUILD_DESCRIPTION}" \ + io.hass.arch="${BUILD_ARCH}" \ + io.hass.type="addon" \ + io.hass.version=${BUILD_VERSION} \ + maintainer="alexbelgium (https://github.com/alexbelgium)" \ + org.opencontainers.image.title="${BUILD_NAME}" \ + org.opencontainers.image.description="${BUILD_DESCRIPTION}" \ + org.opencontainers.image.vendor="Home Assistant Add-ons" \ + org.opencontainers.image.authors="alexbelgium (https://github.com/alexbelgium)" \ + org.opencontainers.image.licenses="MIT" \ + org.opencontainers.image.url="https://github.com/alexbelgium" \ + org.opencontainers.image.source="https://github.com/${BUILD_REPOSITORY}" \ + org.opencontainers.image.documentation="https://github.com/${BUILD_REPOSITORY}/blob/main/README.md" \ + org.opencontainers.image.created=${BUILD_DATE} \ + org.opencontainers.image.revision=${BUILD_REF} \ + org.opencontainers.image.version=${BUILD_VERSION} diff --git a/omada/Readme.md b/omada/Readme.md new file mode 100644 index 000000000..68e04f27d --- /dev/null +++ b/omada/Readme.md @@ -0,0 +1,48 @@ +# Home assistant add-on: Omada controller + +[![Donate][donation-badge]](https://www.buymeacoffee.com/alexbelgium) + +![Version](https://img.shields.io/badge/dynamic/json?label=Version&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2Fomada%2Fconfig.json) +![Ingress](https://img.shields.io/badge/dynamic/json?label=Ingress&query=%24.ingress&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2Fomada%2Fconfig.json) +![Arch](https://img.shields.io/badge/dynamic/json?color=success&label=Arch&query=%24.arch&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2Fomada%2Fconfig.json) + +[![Codacy Badge](https://app.codacy.com/project/badge/Grade/9c6cf10bdbba45ecb202d7f579b5be0e)](https://www.codacy.com/gh/alexbelgium/hassio-addons/dashboard?utm_source=github.com&utm_medium=referral&utm_content=alexbelgium/hassio-addons&utm_campaign=Badge_Grade) +[![GitHub Super-Linter](https://github.com/alexbelgium/hassio-addons/workflows/Lint%20Code%20Base/badge.svg)](https://github.com/marketplace/actions/super-linter) +[![Builder](https://github.com/alexbelgium/hassio-addons/workflows/Builder/badge.svg)](https://github.com/alexbelgium/hassio-addons/actions/workflows/builder.yaml) + +[donation-badge]: https://img.shields.io/badge/Buy%20me%20a%20coffee-%23d32f2f?logo=buy-me-a-coffee&style=flat&logoColor=white + +_Thanks to everyone having starred my repo! To star it click on the image below, then it will be on top right. Thanks!_ + +[![Stargazers repo roster for @alexbelgium/hassio-addons](https://reporoster.com/stars/alexbelgium/hassio-addons)](https://github.com/alexbelgium/hassio-addons/stargazers) + +## About + +[TP-Link Omada Controller](https://www.tp-link.com/us/business-networking/omada-sdn-controller/) to control [TP-Link Omada Hardware](https://www.tp-link.com/en/business-networking/all-omada/). + +This addon is based on the docker image https://hub.docker.com/r/mbentley/omada-controller + +## Configuration + +Read official documentation for information how to set : https://hub.docker.com/r/mbentley/omada-controller + +## Installation + +The installation of this add-on is pretty straightforward and not different in comparison to installing any other add-on. + +1. Add my add-ons repository to your home assistant instance (in supervisor addons store at top right, or click button below if you have configured my HA) + [![Open your Home Assistant instance and show the add add-on repository dialog with a specific repository URL pre-filled.](https://my.home-assistant.io/badges/supervisor_add_addon_repository.svg)](https://my.home-assistant.io/redirect/supervisor_add_addon_repository/?repository_url=https%3A%2F%2Fgithub.com%2Falexbelgium%2Fhassio-addons) +1. Install this add-on. +1. Click the `Save` button to store your configuration. +1. Set the add-on options to your preferences +1. Start the add-on. +1. Check the logs of the add-on to see if everything went well. +1. Open the webUI and adapt the software options + +## Support + +Create an issue on github + +## Illustration + +[repository]: https://github.com/alexbelgium/hassio-addons diff --git a/omada/apparmor.txt b/omada/apparmor.txt new file mode 100644 index 000000000..536f95002 --- /dev/null +++ b/omada/apparmor.txt @@ -0,0 +1,56 @@ +#include + +profile omada_addon flags=(attach_disconnected,mediate_deleted) { + #include + + capability, + file, + signal, + mount, + umount, + remount, + network udp, + network tcp, + network dgram, + network stream, + network inet, + network inet6, + network netlink raw, + + capability setgid, + capability setuid, + capability sys_admin, + capability dac_read_search, + # capability dac_override, + # capability sys_rawio, + +# S6-Overlay + /bin/** ix, + /usr/bin/** ix, + /usr/lib/bashio/** ix, + /etc/s6/** rix, + /run/s6/** rix, + /etc/services.d/** rwix, + /etc/cont-init.d/** rwix, + /etc/cont-finish.d/** rwix, + /init rix, + /var/run/** mrwkl, + /var/run/ mrwkl, + /dev/i2c-1 mrwkl, + # Files required + /dev/sda1 mrwkl, + /dev/sdb1 mrwkl, + /dev/mmcblk0p1 mrwkl, + /dev/* mrwkl, + /tmp/** mrkwl, + + # Data access + /data/** rw, + + # suppress ptrace denials when using 'docker ps' or using 'ps' inside a container + ptrace (trace,read) peer=docker-default, + + # docker daemon confinement requires explict allow rule for signal + signal (receive) set=(kill,term) peer=/usr/bin/docker, + +} diff --git a/omada/build.json b/omada/build.json new file mode 100644 index 000000000..a51ed2d34 --- /dev/null +++ b/omada/build.json @@ -0,0 +1,7 @@ +{ + "build_from": { + "armv7": "mbentley/omada-controller:latest", + "aarch64": "mbentley/omada-controller:latest", + "amd64": "mbentley/omada-controller:latest" + } +} diff --git a/omada/config.json b/omada/config.json new file mode 100644 index 000000000..abc0c789c --- /dev/null +++ b/omada/config.json @@ -0,0 +1,47 @@ +{ + "apparmor": true, + "arch": ["aarch64", "amd64", "armv7"], + "boot": "auto", + "description": "TP-Link Omada Controller", + "environment": { + "MANAGE_HTTP_PORT": "8088", + "MANAGE_HTTPS_PORT": "8043", + "PORTAL_HTTP_PORT": "8088", + "PORTAL_HTTPS_PORT": "8843", + "SHOW_SERVER_LOGS": "true", + "SHOW_MONGODB_LOGS": "false", + "SSL_CERT_NAME": "tls.crt", + "SSL_KEY_NAME": "tls.key", + "TZ": "Etc/UTC" + }, + "image": "ghcr.io/alexbelgium/omada-{arch}", + "name": "Omada", + "options": {}, + "ports": { + "8088/tcp": 8088, + "8043/tcp": 8043, + "8843/tcp": 8843, + "29810/tcp": 29810, + "29811/tcp": 29811, + "29812/tcp": 29812, + "29813/tcp": 29813, + "29814/tcp": 29814 + }, + "map": ["config:rw"], + "ports_description": { + "8088/tcp": "web interface", + "8043/tcp": "web interface https", + "8843/tcp": "portal http", + "29810/tcp": "omada port", + "29811/tcp": "omada port", + "29812/tcp": "omada port", + "29813/tcp": "omada port", + "29814/tcp": "omada port" + }, + "schema": {}, + "slug": "omada", + "upstream": "5.1.7", + "url": "https://github.com/alexbelgium/hassio-addons", + "version": "5.1.7", + "webui": "[PROTO:ssl]://[HOST]:[PORT:8088]" +} diff --git a/omada/icon.png b/omada/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..425bcc63ddba82f6a162977bf40c77b8e20899c6 GIT binary patch literal 21951 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/dev/null 2>/dev/null; then (apt-get update && apt-get install -yqq --no-install-recommends bash || apk add --no-cache bash) >/dev/null; fi \ + && if ! command -v curl >/dev/null 2>/dev/null; then (apt-get update && apt-get install -yqq --no-install-recommends curl || apk add --no-cache curl) >/dev/null; fi \ + && mkdir -p /etc/cont-init.d \ + && for scripts in $MODULES; do echo "$scripts" && curl -f -L -s -S "https://raw.githubusercontent.com/alexbelgium/hassio-addons/master/.templates/$scripts" -o /etc/cont-init.d/"$scripts" && [ "$(sed -n '/\/bin/p;q' /etc/cont-init.d/"$scripts")" != "" ] || (echo "script failed to install $scripts" && exit 1); done \ + && chmod -R 755 /etc/cont-init.d +fi + +####################### +# Automatic installer # +####################### +if [ -e "/ENVFILE" ]; then + PACKAGES=$(/dev/null 2>/dev/null; then (apt-get update && apt-get install -yqq --no-install-recommends bash || apk add --no-cache bash) >/dev/null; fi \ + && if ! command -v curl >/dev/null 2>/dev/null; then (apt-get update && apt-get install -yqq --no-install-recommends curl || apk add --no-cache curl) >/dev/null; fi \ + && curl -f -L -s -S "https://raw.githubusercontent.com/alexbelgium/hassio-addons/master/.templates/automatic_packages.sh" --output /automatic_packages.sh \ + && chmod 777 /automatic_packages.sh \ + && eval /./automatic_packages.sh "${PACKAGES:-}" \ + && rm /automatic_packages.sh +fi diff --git a/omada/rootfs/etc/cont-init.d/00-folders.sh b/omada/rootfs/etc/cont-init.d/00-folders.sh new file mode 100644 index 000000000..b2ec95897 --- /dev/null +++ b/omada/rootfs/etc/cont-init.d/00-folders.sh @@ -0,0 +1,30 @@ +#!/bin/bash +# shellcheck shell=bash + +CONFIGSOURCE="/config/addons_config/omada" + +# Create directory +if [ ! -f "$CONFIGSOURCE" ]; then +echo "Creating directory" +mkdir -p "$CONFIGSOURCE" +fi + +# Ensure structure is correct +mkdir -p "$CONFIGSOURCE"/db "$CONFIGSOURCE"/html "$CONFIGSOURCE"/pdf +cp -rnf /opt/tplink/EAPController/data/* "$CONFIGSOURCE" + +# Make sure permissions are right +echo "Updating permissions" +chown -R "508:508" "$CONFIGSOURCE" + +# Delete previous directories +echo "Removing previous directories" +rm -r /opt/tplink/EAPController/data/html +rm -r /opt/tplink/EAPController/data/pdf +rm -r /opt/tplink/EAPController/data/db + +# Create symlink +echo "Creating symlink" +ln -s /config/addons_config/omada/pdf /opt/tplink/EAPController/data/pdf +ln -s /config/addons_config/omada/html /opt/tplink/EAPController/data/html +ln -s /config/addons_config/omada/db /opt/tplink/EAPController/data/db