From 49e3e2c2a34e6cbfcba607a4f2849fb139d69fb0 Mon Sep 17 00:00:00 2001 From: Alexandre <44178713+alexbelgium@users.noreply.github.com> Date: Wed, 1 Jun 2022 15:03:37 +0200 Subject: [PATCH] Creation of transmission openvpn --- transmission_openvpn/CHANGELOG.md | 1 + transmission_openvpn/Dockerfile | 94 +++++++++++++++ transmission_openvpn/README.md | 44 +++++++ transmission_openvpn/apparmor.txt | 57 +++++++++ transmission_openvpn/build.json | 10 ++ transmission_openvpn/config.json | 108 ++++++++++++++++++ transmission_openvpn/icon.png | Bin 0 -> 15682 bytes transmission_openvpn/logo.png | Bin 0 -> 15682 bytes transmission_openvpn/rootfs/entrypoint.sh | 27 +++++ .../cont-init.d/00-aaa_dockerfile_backup.sh | 43 +++++++ .../rootfs/etc/cont-init.d/99-run.sh | 15 +++ transmission_openvpn/updater.json | 9 ++ 12 files changed, 408 insertions(+) create mode 100644 transmission_openvpn/CHANGELOG.md create mode 100644 transmission_openvpn/Dockerfile create mode 100644 transmission_openvpn/README.md create mode 100644 transmission_openvpn/apparmor.txt create mode 100644 transmission_openvpn/build.json create mode 100644 transmission_openvpn/config.json create mode 100644 transmission_openvpn/icon.png create mode 100644 transmission_openvpn/logo.png create mode 100644 transmission_openvpn/rootfs/entrypoint.sh create mode 100644 transmission_openvpn/rootfs/etc/cont-init.d/00-aaa_dockerfile_backup.sh create mode 100644 transmission_openvpn/rootfs/etc/cont-init.d/99-run.sh create mode 100644 transmission_openvpn/updater.json diff --git a/transmission_openvpn/CHANGELOG.md b/transmission_openvpn/CHANGELOG.md new file mode 100644 index 000000000..68dde260e --- /dev/null +++ b/transmission_openvpn/CHANGELOG.md @@ -0,0 +1 @@ +- Initial build diff --git a/transmission_openvpn/Dockerfile b/transmission_openvpn/Dockerfile new file mode 100644 index 000000000..ef718bdb2 --- /dev/null +++ b/transmission_openvpn/Dockerfile @@ -0,0 +1,94 @@ +#============================# +# ALEXBELGIUM'S DOCKERFILE # +#============================# +# _.------. +# _.-` ('>.-`"""-. +# '.--'` _'` _ .--.) +# -' '-.-';` ` +# ' - _.' ``'--. +# '---` .-'""` +# /` +#=== Home Assistant Addon ===# + +################# +# 1 Build Image # +################# + +ARG BUILD_FROM +ARG BUILD_VERSION +ARG BUILD_UPSTREAM=4.0 +FROM ${BUILD_FROM} + +################## +# 2 Modify Image # +################## + +# MOFIFY DATA PATH +ENV TRANSMISSION_HOME="/addons_config/transmission" \ + CREATE_TUN_DEVICE=false + +################## +# 3 Install apps # +################## + +# Add rootfs +COPY rootfs/ / + +# Modules +ARG MODULES="00-banner.sh 90-dns_set.sh 92-local_mounts.sh 92-smb_mounts.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 +CMD [ "/entrypoint.sh" ] +SHELL ["/bin/bash", "-o", "pipefail", "-c"] + +############ +# 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/transmission_openvpn/README.md b/transmission_openvpn/README.md new file mode 100644 index 000000000..006071a31 --- /dev/null +++ b/transmission_openvpn/README.md @@ -0,0 +1,44 @@ +# Home assistant add-on: Transmission Openvpn + +[![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%2Ftransmission_openvpn%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%2Ftransmission_openvpn%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%2Ftransmission_openvpn%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 + +Transmission is a bittorrent client. +This addon is based on the [Haugene docker image](https://github.com/haugene/docker-transmission-openvpn). + +## 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 my Hass.io add-ons repository][repository] to your Hass.io instance. +1. Install this add-on. +1. Click the `Save` button to store your configuration. +1. Start the add-on. +1. Check the logs of the add-on to see if everything went well. +1. Carefully configure the add-on to your preferences, see the official documentation for for that. + +## Configuration + +Options : see https://github.com/haugene/docker-transmission-openvpn for documentation + +Complete transmission options are in /config/addons_config/transmission (make sure addon is stopped before modifying it as Transmission writes its ongoing values when stopping and could erase your changes) + +Webui can be found at `:9091`. + +[repository]: https://github.com/alexbelgium/hassio-addons diff --git a/transmission_openvpn/apparmor.txt b/transmission_openvpn/apparmor.txt new file mode 100644 index 000000000..eed8d0d3e --- /dev/null +++ b/transmission_openvpn/apparmor.txt @@ -0,0 +1,57 @@ +#include + +profile db21ed7f_transmission_openvpn 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, + /dev/net/tun 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/transmission_openvpn/build.json b/transmission_openvpn/build.json new file mode 100644 index 000000000..381e7979d --- /dev/null +++ b/transmission_openvpn/build.json @@ -0,0 +1,10 @@ +{ + "build_from": { + "aarch64": "haugene/transmission-openvpn:latest", + "amd64": "haugene/transmission-openvpn:latest", + "armv7": "haugene/transmission-openvpn:latest" + }, + "codenotary": { + "signer": "alexandrep.github@gmail.com" + } +} diff --git a/transmission_openvpn/config.json b/transmission_openvpn/config.json new file mode 100644 index 000000000..609a6a127 --- /dev/null +++ b/transmission_openvpn/config.json @@ -0,0 +1,108 @@ +{ + "arch": [ + "aarch64", + "amd64", + "armv7" + ], + "codenotary": "alexandrep.github@gmail.com", + "description": "Bittorrent client based on linuxserver image", + "devices": [ + "/dev/net/tun", + "/dev/sda", + "/dev/sdb", + "/dev/sdc", + "/dev/sdd", + "/dev/sde", + "/dev/sdf", + "/dev/sdg", + "/dev/nvme", + "/dev/mmcblk", + "/dev/sda1", + "/dev/sdb1", + "/dev/sdc1", + "/dev/sdd1", + "/dev/sde1", + "/dev/sdf1", + "/dev/sdg1", + "/dev/sda2", + "/dev/sdb2", + "/dev/sdc2", + "/dev/sdd2", + "/dev/sde2", + "/dev/sdf2", + "/dev/sdg2", + "/dev/sda3", + "/dev/sdb3", + "/dev/sda4", + "/dev/sdb4", + "/dev/nvme0", + "/dev/nvme1", + "/dev/nvme2" + ], + "image": "ghcr.io/alexbelgium/transmission_openvpn-{arch}", + "map": [ + "config:rw", + "share:rw", + "media:rw", + "ssl" + ], + "name": "Transmission Openvpn", + "options": { + "PGID": "1000", + "PUID": "1000", + "DNS_server": "8.8.8.8,1.1.1.1", + "TRANSMISSION_WEB_UI": "transmission-web-control", + "TRANSMISSION_DOWNLOAD_DIR": "/share/downloads", + "TRANSMISSION_INCOMPLETE_DIR": "/share/incomplete", + "OPENVPN_PROVIDER": "PIA", + "OPENVPN_CONFIG": "france", + "OPENVPN_USERNAME": "user", + "OPENVPN_PASSWORD": "pass", + "LOCAL_NETWORK": "192.168.178.0/16", + "TRANSMISSION_DOWNLOAD_DIR": "/addons_config/transmission/downloads", + "TRANSMISSION_INCOMPLETE_DIR": "/addons_config/transmission/incomplete", + "TRANSMISSION_WATCH_DIR": "/addons_config/transmission/watch_dir", + "DEBUG": false + }, + "ports": { + "51413/tcp": 51413, + "51413/udp": 51413, + "9091/tcp": 9091 + }, + "ports_description": { + "51413/tcp": "Peer port (setup router port forwarding to this port)", + "51413/udp": "Peer port (setup router port forwarding to this port)", + "9091/tcp": "Web UI port (required)" + }, + "privileged": [ + "SYS_ADMIN", + "DAC_READ_SEARCH", + "NET_ADMIN" + ], + "schema": { + "PGID": "int", + "PUID": "int", + "DNS_server": "str?", + "cifspassword": "str?", + "cifsusername": "str?", + "TRANSMISSION_WEB_UI": "list(standard|combustion|kettu|transmission-web-control|flood-for-transmission|shift)", + "localdisks": "str?", + "networkdisks": "str?", + "pass": "str?", + "user": "str?", + "OPENVPN_PROVIDER": "str", + "OPENVPN_CONFIG": "str?", + "OPENVPN_USERNAME": "str", + "OPENVPN_PASSWORD": "str", + "LOCAL_NETWORK": "str", + "TRANSMISSION_DOWNLOAD_DIR": "str", + "TRANSMISSION_INCOMPLETE_DIR": "str", + "TRANSMISSION_WATCH_DIR": "str", + "DEBUG": "bool" + }, + "slug": "transmission_openvpn", + "startup": "services", + "url": "https://github.com/alexbelgium/hassio-addons", + "version": "4.0", + "webui": "http://[HOST]:[PORT:9091]" +} \ No newline at end of file diff --git a/transmission_openvpn/icon.png b/transmission_openvpn/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..678ef848b724cf9b106a541d20c464e6daede9f0 GIT binary patch literal 15682 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 literal 0 HcmV?d00001 diff --git a/transmission_openvpn/logo.png b/transmission_openvpn/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..678ef848b724cf9b106a541d20c464e6daede9f0 GIT binary patch literal 15682 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 literal 0 HcmV?d00001 diff --git a/transmission_openvpn/rootfs/entrypoint.sh b/transmission_openvpn/rootfs/entrypoint.sh new file mode 100644 index 000000000..85d8a9212 --- /dev/null +++ b/transmission_openvpn/rootfs/entrypoint.sh @@ -0,0 +1,27 @@ +#!/bin/bash +echo "Starting..." + +############################ +# Backup Dockerfile Script # +############################ + +if [ -f /etc/cont-init.d/00-aaa_dockerfile_backup.sh ]; then + chown "$(id -u)":"$(id -g)" /etc/cont-init.d/00-aaa_dockerfile_backup.sh + chmod +x /etc/cont-init.d/00-aaa_dockerfile_backup.sh + /./etc/cont-init.d/00-aaa_dockerfile_backup.sh + rm /etc/cont-init.d/00-aaa_dockerfile_backup.sh +fi + +#################### +# Starting scripts # +#################### + +for SCRIPTS in /etc/cont-init.d/*; do + [ -e "$SCRIPTS" ] || continue + echo "$SCRIPTS: executing" + chown "$(id -u)":"$(id -g)" "$SCRIPTS" + chmod a+x "$SCRIPTS" + # Change shebang if no s6 supervision + sed -i 's|/usr/bin/with-contenv bashio|/usr/bin/env bashio|g' "$SCRIPTS" + /."$SCRIPTS" || echo "$SCRIPTS: exiting $?" +done diff --git a/transmission_openvpn/rootfs/etc/cont-init.d/00-aaa_dockerfile_backup.sh b/transmission_openvpn/rootfs/etc/cont-init.d/00-aaa_dockerfile_backup.sh new file mode 100644 index 000000000..bb8872f05 --- /dev/null +++ b/transmission_openvpn/rootfs/etc/cont-init.d/00-aaa_dockerfile_backup.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +# If dockerfile failed install manually + +############################## +# Automatic modules download # +############################## +if [ -e "/MODULESFILE" ]; then + MODULES=$(/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 + +if [ -e "/MODULESFILE" ] && [ ! -f /entrypoint.sh ]; then + for scripts in $MODULES; do + echo "$scripts : executing" + chown "$(id -u)":"$(id -g)" /etc/cont-init.d/"$scripts" + chmod a+x /etc/cont-init.d/"$scripts" + /./etc/cont-init.d/"$scripts" || echo "/etc/cont-init.d/$scripts: exiting $?" + rm /etc/cont-init.d/"$scripts" + done | tac +fi diff --git a/transmission_openvpn/rootfs/etc/cont-init.d/99-run.sh b/transmission_openvpn/rootfs/etc/cont-init.d/99-run.sh new file mode 100644 index 000000000..c72a85f96 --- /dev/null +++ b/transmission_openvpn/rootfs/etc/cont-init.d/99-run.sh @@ -0,0 +1,15 @@ +#!/usr/bin/bashio + +#################### +# Export variables # +#################### + +echo "Exporting variables" +for k in $(bashio::jq "/data/options.json" 'keys | .[]'); do + bashio::log.blue $k=$(bashio::config $k) + export $k=$(bashio::config $k) +done + +echo "" +bashio::log.info "Starting app" +/./etc/openvpn/start.sh diff --git a/transmission_openvpn/updater.json b/transmission_openvpn/updater.json new file mode 100644 index 000000000..9d04451f0 --- /dev/null +++ b/transmission_openvpn/updater.json @@ -0,0 +1,9 @@ +{ + "github_fulltag": "true", + "last_update": "21-05-2022", + "repository": "alexbelgium/hassio-addons", + "slug": "transmission_openvpn", + "source": "github", + "upstream_repo": "haugene/docker-transmission-openvpn", + "upstream_version": "3.00-r5-ls125" +} \ No newline at end of file