diff --git a/.forgejo/workflows/build.yml b/.forgejo/workflows/build.yml new file mode 100644 index 0000000..7152c11 --- /dev/null +++ b/.forgejo/workflows/build.yml @@ -0,0 +1,49 @@ +name: Build and push image + +on: + push: + branches: [master] + schedule: + - cron: '0 4 * * *' # daily, picks up LSIO base image updates + workflow_dispatch: + +jobs: + build: + runs-on: docker + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + ref: master + fetch-depth: 0 + token: ${{ secrets.PUSH_TOKEN }} + + - name: Merge upstream + run: | + git config user.name "forgejo-runner" + git config user.email "runner@forge.jannis.wtf" + git fetch origin master + git reset --hard origin/master + git remote add upstream https://github.com/linuxserver/docker-plex + git fetch upstream + git merge upstream/master --no-edit + git push origin master + + - name: Set up Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Forgejo registry + uses: docker/login-action@v3 + with: + registry: forge.jannis.wtf + username: ${{ secrets.REGISTRY_USER }} + password: ${{ secrets.REGISTRY_TOKEN }} + + - name: Build and push + uses: docker/build-push-action@v5 + with: + context: . + push: true + tags: | + forge.jannis.wtf/fej/plex-wireguard:latest + forge.jannis.wtf/fej/plex-wireguard:${{ github.sha }} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 6e8ad97..b733b8b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +# Wireguard configs, you never know +wg*.conf # Windows image file caches Thumbs.db ehthumbs.db diff --git a/Dockerfile b/Dockerfile index 0ad3c08..9bd89c9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -28,11 +28,13 @@ ENV DEBIAN_FRONTEND="noninteractive" \ ATTACHED_DEVICES_PERMS="/dev/dri /dev/dvb -type c" RUN \ - echo "**** install runtime packages ****" && \ + echo "**** install runtime packages & wireguard ****" && \ apt-get update && \ apt-get install -y \ udev \ - wget && \ + wget \ + iproute2 \ + wireguard-tools &&\ echo "**** install plex ****" && \ if [ -z ${PLEX_RELEASE+x} ]; then \ PLEX_RELEASE=$(curl -sX GET 'https://plex.tv/api/downloads/5.json' \ @@ -56,6 +58,7 @@ RUN \ # add local files COPY root/ / + # add unrar COPY --from=unrar /usr/bin/unrar-ubuntu /usr/bin/unrar diff --git a/Jenkinsfile b/Jenkinsfile index b4fb77c..f0e1f0d 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -77,6 +77,7 @@ pipeline { ''' script{ env.EXIT_STATUS = '' + env.CI_TEST_ATTEMPTED = '' env.LS_RELEASE = sh( script: '''docker run --rm quay.io/skopeo/stable:v1 inspect docker://ghcr.io/${LS_USER}/${CONTAINER_NAME}:latest 2>/dev/null | jq -r '.Labels.build_version' | awk '{print $3}' | grep '\\-ls' || : ''', returnStdout: true).trim() @@ -873,6 +874,7 @@ pipeline { script{ env.CI_URL = 'https://ci-tests.linuxserver.io/' + env.IMAGE + '/' + env.META_TAG + '/index.html' env.CI_JSON_URL = 'https://ci-tests.linuxserver.io/' + env.IMAGE + '/' + env.META_TAG + '/report.json' + env.CI_TEST_ATTEMPTED = 'true' } sh '''#! /bin/bash set -e @@ -1075,98 +1077,13 @@ EOF ) ''' } } - // If this is a Pull request send the CI link as a comment on it - stage('Pull Request Comment') { - when { - not {environment name: 'CHANGE_ID', value: ''} - environment name: 'EXIT_STATUS', value: '' - } - steps { - sh '''#! /bin/bash - # Function to retrieve JSON data from URL - get_json() { - local url="$1" - local response=$(curl -s "$url") - if [ $? -ne 0 ]; then - echo "Failed to retrieve JSON data from $url" - return 1 - fi - local json=$(echo "$response" | jq .) - if [ $? -ne 0 ]; then - echo "Failed to parse JSON data from $url" - return 1 - fi - echo "$json" - } - - build_table() { - local data="$1" - - # Get the keys in the JSON data - local keys=$(echo "$data" | jq -r 'to_entries | map(.key) | .[]') - - # Check if keys are empty - if [ -z "$keys" ]; then - echo "JSON report data does not contain any keys or the report does not exist." - return 1 - fi - - # Build table header - local header="| Tag | Passed |\\n| --- | --- |\\n" - - # Loop through the JSON data to build the table rows - local rows="" - for build in $keys; do - local status=$(echo "$data" | jq -r ".[\\"$build\\"].test_success") - if [ "$status" = "true" ]; then - status="✅" - else - status="❌" - fi - local row="| "$build" | "$status" |\\n" - rows="${rows}${row}" - done - - local table="${header}${rows}" - local escaped_table=$(echo "$table" | sed 's/\"/\\\\"/g') - echo "$escaped_table" - } - - if [[ "${CI}" = "true" ]]; then - # Retrieve JSON data from URL - data=$(get_json "$CI_JSON_URL") - # Create table from JSON data - table=$(build_table "$data") - echo -e "$table" - - curl -X POST -H "Authorization: token $GITHUB_TOKEN" \ - -H "Accept: application/vnd.github.v3+json" \ - "https://api.github.com/repos/$LS_USER/$LS_REPO/issues/$PULL_REQUEST/comments" \ - -d "{\\"body\\": \\"I am a bot, here are the test results for this PR: \\n${CI_URL}\\n${SHELLCHECK_URL}\\n${table}\\"}" - else - curl -X POST -H "Authorization: token $GITHUB_TOKEN" \ - -H "Accept: application/vnd.github.v3+json" \ - "https://api.github.com/repos/$LS_USER/$LS_REPO/issues/$PULL_REQUEST/comments" \ - -d "{\\"body\\": \\"I am a bot, here is the pushed image/manifest for this PR: \\n\\n\\`${GITHUBIMAGE}:${META_TAG}\\`\\"}" - fi - ''' - - } - } } /* ###################### - Send status to Discord + Comment on PR and Send status to Discord ###################### */ post { always { - sh '''#!/bin/bash - rm -rf /config/.ssh/id_sign - rm -rf /config/.ssh/id_sign.pub - git config --global --unset gpg.format - git config --global --unset user.signingkey - git config --global --unset commit.gpgsign - ''' - script{ + script { env.JOB_DATE = sh( script: '''date '+%Y-%m-%dT%H:%M:%S%:z' ''', returnStdout: true).trim() @@ -1209,6 +1126,87 @@ EOF "username": "Jenkins"}' ${BUILDS_DISCORD} ''' } } + script { + if (env.GITHUBIMAGE =~ /lspipepr/){ + if (env.CI_TEST_ATTEMPTED == "true"){ + sh '''#! /bin/bash + # Function to retrieve JSON data from URL + get_json() { + local url="$1" + local response=$(curl -s "$url") + if [ $? -ne 0 ]; then + echo "Failed to retrieve JSON data from $url" + return 1 + fi + local json=$(echo "$response" | jq .) + if [ $? -ne 0 ]; then + echo "Failed to parse JSON data from $url" + return 1 + fi + echo "$json" + } + + build_table() { + local data="$1" + + # Get the keys in the JSON data + local keys=$(echo "$data" | jq -r 'to_entries | map(.key) | .[]') + + # Check if keys are empty + if [ -z "$keys" ]; then + echo "JSON report data does not contain any keys or the report does not exist." + return 1 + fi + + # Build table header + local header="| Tag | Passed |\\n| --- | --- |\\n" + + # Loop through the JSON data to build the table rows + local rows="" + for build in $keys; do + local status=$(echo "$data" | jq -r ".[\\"$build\\"].test_success") + if [ "$status" = "true" ]; then + status="✅" + else + status="❌" + fi + local row="| "$build" | "$status" |\\n" + rows="${rows}${row}" + done + + local table="${header}${rows}" + local escaped_table=$(echo "$table" | sed 's/\"/\\\\"/g') + echo "$escaped_table" + } + + if [[ "${CI}" = "true" ]]; then + # Retrieve JSON data from URL + data=$(get_json "$CI_JSON_URL") + # Create table from JSON data + table=$(build_table "$data") + echo -e "$table" + + curl -X POST -H "Authorization: token $GITHUB_TOKEN" \ + -H "Accept: application/vnd.github.v3+json" \ + "https://api.github.com/repos/$LS_USER/$LS_REPO/issues/$PULL_REQUEST/comments" \ + -d "{\\"body\\": \\"I am a bot, here are the test results for this PR: \\n${CI_URL}\\n${SHELLCHECK_URL}\\n${table}\\"}" + else + curl -X POST -H "Authorization: token $GITHUB_TOKEN" \ + -H "Accept: application/vnd.github.v3+json" \ + "https://api.github.com/repos/$LS_USER/$LS_REPO/issues/$PULL_REQUEST/comments" \ + -d "{\\"body\\": \\"I am a bot, here is the pushed image/manifest for this PR: \\n\\n\\`${GITHUBIMAGE}:${META_TAG}\\`\\"}" + fi + ''' + } + } + } + sh '''#!/bin/bash + rm -rf /config/.ssh/id_sign + rm -rf /config/.ssh/id_sign.pub + git config --global --unset gpg.format + git config --global --unset user.signingkey + git config --global --unset commit.gpgsign + ''' } cleanup { sh '''#! /bin/bash diff --git a/README.md b/README.md index 94c1429..e30016f 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,19 @@ +<<<<<<< HEAD +======= +due to the recent purge of Hosters by plex, this fork adds wireguard functionallity to the plex container as a quick workaround. all traffic gets tunneled. + +wireguard onfig file has to be mounted in /etc/wireguard/wg0.conf. e.g.: +``` + volumes: + - ./wg0.conf:/etc/wireguard/wg0.conf +``` + + + + +>>>>>>> 72bdfaa (Update README.md) [![linuxserver.io](https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/linuxserver_medium.png)](https://linuxserver.io) [![Blog](https://img.shields.io/static/v1.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=linuxserver.io&message=Blog)](https://blog.linuxserver.io "all the things you can do with our containers including How-To guides, opinions and much more!") @@ -371,6 +385,8 @@ Once registered you can define the dockerfile to use with `-f Dockerfile.aarch64 ## Versions +* **15.03.26:** - Allow TMPDIR to be changed to better support read-only containers +* **15.03.26:** - Fix initial claim setup on non-root containers * **04.11.24:** - Add Nvidia capability needed for h265 * **18.07.24:** - Rebase to Ubuntu Noble. * **12.02.24:** - Use universal hardware acceleration blurb diff --git a/package_versions.txt b/package_versions.txt index b1ccad2..d36b5b4 100755 --- a/package_versions.txt +++ b/package_versions.txt @@ -5,13 +5,13 @@ apt-utils 2.8.3 deb base-files 13ubuntu10.4 deb base-passwd 3.6.3build1 deb bash 5.2.21-2ubuntu4 deb -bsdutils 1:2.39.3-9ubuntu6.4 deb +bsdutils 1:2.39.3-9ubuntu6.5 deb ca-certificates 20240203 deb catatonit 0.1.7-1 deb -coreutils 9.4-3ubuntu6.1 deb +coreutils 9.4-3ubuntu6.2 deb cron 3.0pl1-184ubuntu2 deb cron-daemon-common 3.0pl1-184ubuntu2 deb -curl 8.5.0-2ubuntu10.6 deb +curl 8.5.0-2ubuntu10.8 deb dash 0.5.12-6ubuntu5 deb debconf 1.5.86ubuntu1 deb debianutils 5.17build1 deb @@ -34,7 +34,7 @@ grep 3.11-4build1 deb gzip 1.12-1ubuntu3.1 deb hostname 3.23+nmu2ubuntu2 deb init-system-helpers 1.66ubuntu1 deb -jq 1.7.1-3ubuntu0.24.04.1 deb +jq 1.7.1-3ubuntu0.24.04.2 deb keyboxd 2.4.4-2ubuntu17.4 deb krb5-locales 1.20.1-6ubuntu2.6 deb libacl1 2.3.2-1build1.1 deb @@ -43,17 +43,17 @@ libassuan0 2.5.6-1build1 deb libattr1 1:2.5.2-1build1.1 deb libaudit-common 1:3.1.2-2.1build1.1 deb libaudit1 1:3.1.2-2.1build1.1 deb -libblkid1 2.39.3-9ubuntu6.4 deb +libblkid1 2.39.3-9ubuntu6.5 deb libbrotli1 1.1.0-2build2 deb libbsd0 0.12.1-1build1.1 deb libbz2-1.0 1.0.8-5.1build0.1 deb libc-bin 2.39-0ubuntu8.7 deb libc6 2.39-0ubuntu8.7 deb libcap-ng0 0.8.4-2build2 deb -libcap2 1:2.66-5ubuntu2.2 deb +libcap2 1:2.66-5ubuntu2.4 deb libcom-err2 1.47.0-2.4~exp1ubuntu4.1 deb libcrypt1 1:4.4.36-4build1 deb -libcurl4t64 8.5.0-2ubuntu10.6 deb +libcurl4t64 8.5.0-2ubuntu10.8 deb libdb5.3t64 5.3.28+dfsg2-7 deb libdebconfclient0 0.271ubuntu3 deb libext2fs2t64 1.47.0-2.4~exp1ubuntu4.1 deb @@ -66,10 +66,10 @@ libgpg-error0 1.47-3build2.1 deb libgssapi-krb5-2 1.20.1-6ubuntu2.6 deb libhogweed6t64 3.9.1-2.2build1.1 deb libidn2-0 2.3.7-2build1.1 deb -libjq1 1.7.1-3ubuntu0.24.04.1 deb +libjq1 1.7.1-3ubuntu0.24.04.2 deb libk5crypto3 1.20.1-6ubuntu2.6 deb libkeyutils1 1.6.3-3build1 deb -libkmod2 31+20240202-2ubuntu7.1 deb +libkmod2 31+20240202-2ubuntu7.2 deb libkrb5-3 1.20.1-6ubuntu2.6 deb libkrb5support0 1.20.1-6ubuntu2.6 deb libksba8 1.6.6-1build1 deb @@ -78,7 +78,7 @@ libldap2 2.6.10+dfsg-0ubuntu0.24.04.1 deb liblz4-1 1.9.4-1build1.1 deb liblzma5 5.6.1+really5.4.5-1ubuntu0.2 deb libmd0 1.1.0-2build1.1 deb -libmount1 2.39.3-9ubuntu6.4 deb +libmount1 2.39.3-9ubuntu6.5 deb libncursesw6 6.4+20240113-1ubuntu2 deb libnettle8t64 3.9.1-2.2build1.1 deb libnghttp2-14 1.59.0-1ubuntu0.2 deb @@ -102,47 +102,47 @@ libselinux1 3.5-2ubuntu2.1 deb libsemanage-common 3.5-1build5 deb libsemanage2 3.5-1build5 deb libsepol2 3.5-2build1 deb -libsmartcols1 2.39.3-9ubuntu6.4 deb +libsmartcols1 2.39.3-9ubuntu6.5 deb libsqlite3-0 3.45.1-1ubuntu2.5 deb libss2 1.47.0-2.4~exp1ubuntu4.1 deb -libssh-4 0.10.6-2ubuntu0.2 deb -libssl3t64 3.0.13-0ubuntu3.7 deb +libssh-4 0.10.6-2ubuntu0.4 deb +libssl3t64 3.0.13-0ubuntu3.9 deb libstdc++6 14.2.0-4ubuntu2~24.04.1 deb -libsystemd0 255.4-1ubuntu8.12 deb +libsystemd0 255.4-1ubuntu8.15 deb libtasn1-6 4.19.0-3ubuntu0.24.04.2 deb libtinfo6 6.4+20240113-1ubuntu2 deb -libudev1 255.4-1ubuntu8.12 deb +libudev1 255.4-1ubuntu8.15 deb libunistring5 1.1-2build1.1 deb -libuuid1 2.39.3-9ubuntu6.4 deb +libuuid1 2.39.3-9ubuntu6.5 deb libxxhash0 0.8.2-2build1 deb libzstd1 1.5.5+dfsg2-2build1.1 deb locales 2.39-0ubuntu8.7 deb login 1:4.13+dfsg1-4ubuntu3.2 deb logsave 1.47.0-2.4~exp1ubuntu4.1 deb mawk 1.3.4.20240123-1build1 deb -mount 2.39.3-9ubuntu6.4 deb +mount 2.39.3-9ubuntu6.5 deb ncurses-base 6.4+20240113-1ubuntu2 deb ncurses-bin 6.4+20240113-1ubuntu2 deb netcat-openbsd 1.226-1ubuntu2 deb -openssl 3.0.13-0ubuntu3.7 deb +openssl 3.0.13-0ubuntu3.9 deb passwd 1:4.13+dfsg1-4ubuntu3.2 deb perl-base 5.38.2-3.2ubuntu0.2 deb pinentry-curses 1.2.1-3ubuntu5 deb -plexmediaserver 1.43.0.10492-121068a07 deb +plexmediaserver 1.43.1.10611-1e34174b1 deb procps 2:4.0.4-4ubuntu3.2 deb publicsuffix 20231001.0357-0.1 deb readline-common 8.2-4build1 deb sed 4.9-2build1 deb sensible-utils 0.0.22 deb -systemd-dev 255.4-1ubuntu8.12 deb +systemd-dev 255.4-1ubuntu8.15 deb systemd-hwe-hwdb 255.1.7 deb -systemd-standalone-sysusers 255.4-1ubuntu8.12 deb +systemd-standalone-sysusers 255.4-1ubuntu8.15 deb sysvinit-utils 3.08-6ubuntu3 deb tar 1.35+dfsg-3build1 deb -tzdata 2025b-0ubuntu0.24.04.1 deb +tzdata 2026a-0ubuntu0.24.04.1 deb ubuntu-keyring 2023.11.28.1 deb -udev 255.4-1ubuntu8.12 deb +udev 255.4-1ubuntu8.15 deb unminimize 0.2.1 deb -util-linux 2.39.3-9ubuntu6.4 deb +util-linux 2.39.3-9ubuntu6.5 deb wget 1.21.4-1ubuntu4.1 deb zlib1g 1:1.3.dfsg-3.1ubuntu2.1 deb diff --git a/readme-vars.yml b/readme-vars.yml index 2ad47e0..9f7a516 100644 --- a/readme-vars.yml +++ b/readme-vars.yml @@ -125,6 +125,8 @@ init_diagram: | "plex:latest" <- Base Images # changelog changelogs: + - {date: "15.03.26:", desc: "Allow TMPDIR to be changed to better support read-only containers"} + - {date: "15.03.26:", desc: "Fix initial claim setup on non-root containers"} - {date: "04.11.24:", desc: "Add Nvidia capability needed for h265"} - {date: "18.07.24:", desc: "Rebase to Ubuntu Noble."} - {date: "12.02.24:", desc: "Use universal hardware acceleration blurb"} diff --git a/root/etc/s6-overlay/s6-rc.d/init-plex-chown/run b/root/etc/s6-overlay/s6-rc.d/init-plex-chown/run index f98e669..47b1c1e 100755 --- a/root/etc/s6-overlay/s6-rc.d/init-plex-chown/run +++ b/root/etc/s6-overlay/s6-rc.d/init-plex-chown/run @@ -1,7 +1,11 @@ #!/usr/bin/with-contenv bash # shellcheck shell=bash -mkdir -p /run/plex-temp +# remove plex temporary directory after unclean stop +if [[ -d "${TMPDIR}" ]]; then + rm -rf "${TMPDIR}" +fi +mkdir -p ${TMPDIR} # create folders if [[ ! -d "${PLEX_MEDIA_SERVER_APPLICATION_SUPPORT_DIR}" ]]; then @@ -40,7 +44,7 @@ if [[ -z ${LSIO_NON_ROOT_USER} ]]; then # permissions (non-recursive) on config root and folders lsiown abc:abc \ - /run/plex-temp \ + "${TMPDIR}" \ /config \ /config/* fi diff --git a/root/etc/s6-overlay/s6-rc.d/init-plex-claim/run b/root/etc/s6-overlay/s6-rc.d/init-plex-claim/run index a94451e..700b1c0 100755 --- a/root/etc/s6-overlay/s6-rc.d/init-plex-claim/run +++ b/root/etc/s6-overlay/s6-rc.d/init-plex-claim/run @@ -19,8 +19,15 @@ if [[ ! -f "${PLEX_MEDIA_SERVER_PREFERENCES}" ]]; then export PLEX_MEDIA_SERVER_INFO_MODEL PLEX_MEDIA_SERVER_INFO_PLATFORM_VERSION=$(uname -r) export PLEX_MEDIA_SERVER_INFO_PLATFORM_VERSION - s6-setuidgid abc /bin/bash -c \ - 'LD_LIBRARY_PATH=/usr/lib/plexmediaserver:/usr/lib/plexmediaserver/lib /usr/lib/plexmediaserver/Plex\ Media\ Server' & + + if [[ -z ${LSIO_NON_ROOT_USER} ]]; then + s6-setuidgid abc /bin/bash -c \ + 'LD_LIBRARY_PATH=/usr/lib/plexmediaserver:/usr/lib/plexmediaserver/lib /usr/lib/plexmediaserver/Plex\ Media\ Server' & + else + /bin/bash -c \ + 'LD_LIBRARY_PATH=/usr/lib/plexmediaserver:/usr/lib/plexmediaserver/lib /usr/lib/plexmediaserver/Plex\ Media\ Server' & + fi + PID=$! echo "Waiting for Plex to generate its config" DBNAME="/config/Library/Application Support/Plex Media Server/Plug-in Support/Databases/com.plexapp.plugins.library.db-wal" diff --git a/root/etc/s6-overlay/s6-rc.d/init-wireguard/dependencies.d/init-services b/root/etc/s6-overlay/s6-rc.d/init-wireguard/dependencies.d/init-services new file mode 100644 index 0000000..e69de29 diff --git a/root/etc/s6-overlay/s6-rc.d/init-wireguard/run b/root/etc/s6-overlay/s6-rc.d/init-wireguard/run new file mode 100755 index 0000000..85ad6c3 --- /dev/null +++ b/root/etc/s6-overlay/s6-rc.d/init-wireguard/run @@ -0,0 +1,14 @@ +#!/usr/bin/with-contenv bash + +# Bring up WireGuard if not already up +if ! ip link show dev wg0 > /dev/null 2>&1; then + wg-quick up wg0 +fi + +# Monitor wireguard status +while true; do + if ! ip link show dev wg0 | grep -q "UP"; then + wg-quick up wg0 + fi + sleep 60 +done diff --git a/root/etc/s6-overlay/s6-rc.d/init-wireguard/type b/root/etc/s6-overlay/s6-rc.d/init-wireguard/type new file mode 100644 index 0000000..5883cff --- /dev/null +++ b/root/etc/s6-overlay/s6-rc.d/init-wireguard/type @@ -0,0 +1 @@ +longrun diff --git a/root/etc/s6-overlay/s6-rc.d/init-wireguard/up b/root/etc/s6-overlay/s6-rc.d/init-wireguard/up new file mode 100644 index 0000000..e69de29 diff --git a/root/etc/s6-overlay/s6-rc.d/svc-plex/dependencies.d/init-wireguard b/root/etc/s6-overlay/s6-rc.d/svc-plex/dependencies.d/init-wireguard new file mode 100644 index 0000000..e69de29 diff --git a/root/etc/s6-overlay/s6-rc.d/svc-plex/run b/root/etc/s6-overlay/s6-rc.d/svc-plex/run index bb60746..c029d4d 100755 --- a/root/etc/s6-overlay/s6-rc.d/svc-plex/run +++ b/root/etc/s6-overlay/s6-rc.d/svc-plex/run @@ -1,6 +1,8 @@ #!/usr/bin/with-contenv bash # shellcheck shell=bash +# Wait for WireGuard to be up + echo "Starting Plex Media Server. . . (you can ignore the libusb_init error)" PLEX_MEDIA_SERVER_INFO_MODEL=$(uname -m) export PLEX_MEDIA_SERVER_INFO_MODEL diff --git a/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-wireguard b/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-wireguard new file mode 100644 index 0000000..e69de29