Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(portforwarding): Allow running script upon port forwarding success #2399

Merged
merged 3 commits into from
Nov 10, 2024

Conversation

lavalleeale
Copy link
Contributor

@lavalleeale lavalleeale commented Aug 6, 2024

This PR allows an environment variable (VPN_PORT_FORWARDING_STATUS_SCRIPT) to be set that will run a script whenever there is an update to port forwarding status that could be used to sync with other programs that need to know what ports have been forwarded.

EDIT by qdm12:

Copy link
Owner

@qdm12 qdm12 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice, thank you for this PR 👍

We need to notably:

  • change this to a run command (instead of script file)
  • make code ready for a down command (later 🙏, if anyone needs such command)
  • make a PR to the github wiki to document this (probably in the setup/advance/vpn-port-forwarding document) and mention the command is a single command, which doesn't understand shell specific syntax such as &&, and one should use /bin/sh -c "my shell syntax" to do so if they want (bash isn't installed by default, only sh)

Thanks!

internal/configuration/settings/portforward.go Outdated Show resolved Hide resolved
internal/configuration/settings/portforward.go Outdated Show resolved Hide resolved
internal/configuration/settings/portforward.go Outdated Show resolved Hide resolved
internal/configuration/settings/portforward.go Outdated Show resolved Hide resolved
internal/portforward/service/script.go Outdated Show resolved Hide resolved
internal/portforward/service/script.go Outdated Show resolved Hide resolved
internal/portforward/service/script.go Outdated Show resolved Hide resolved
internal/portforward/service/start.go Outdated Show resolved Hide resolved
internal/portforward/service/start.go Outdated Show resolved Hide resolved
@lavalleeale
Copy link
Contributor Author

Ok, I believe that I have resolved all the issues with the initial implementation, I am not a huge fan of comma separating the ports, but that is how the current code works to give maximum compatibility

Copy link
Owner

@qdm12 qdm12 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice job! 👍
Just 2 renames to do 😉
And once done I'll handle the using-that-command-package-and-plug-lines-to-the-logger. I just worked on it yesterday so it's still fresh in my mind 😉 !

internal/configuration/settings/portforward.go Outdated Show resolved Hide resolved
internal/portforward/service/command.go Outdated Show resolved Hide resolved
internal/portforward/service/command.go Outdated Show resolved Hide resolved
internal/portforward/service/settings.go Outdated Show resolved Hide resolved
internal/portforward/service/start.go Outdated Show resolved Hide resolved
@qdm12 qdm12 added the Status: 🟡 Nearly resolved This might be resolved or is about to be resolved label Aug 17, 2024
@qdm12
Copy link
Owner

qdm12 commented Aug 21, 2024

FYI I'm working on your branch right now, almost done rebasing+fixing the last feedback I left, so please hold 😉 Thanks!!

@qdm12
Copy link
Owner

qdm12 commented Aug 22, 2024

Hi @lavalleeale could you give me (force) push access to your Gluetun branch master? I'm done with the changes, just waiting to force push them there.

@thibautd
Copy link

thibautd commented Sep 2, 2024

Thanks for working on this, can't wait !

@iceteaSA
Copy link

Anything happening here?

@qdm12
Copy link
Owner

qdm12 commented Nov 8, 2024

@lavalleeale I still don't have push access to your fork, can you please allow force push access? Otherwise I'll create another PR with another branch, but would like to give you the credits for it ideally!

@lavalleeale
Copy link
Contributor Author

Done!

@qdm12
Copy link
Owner

qdm12 commented Nov 8, 2024

Thanks @lavalleeale
Just waiting for CI to pass, and I'll re-recheck my own still unresolved comments to make I've done them (has been a while already!).

@qdm12 qdm12 merged commit a035a15 into qdm12:master Nov 10, 2024
5 checks passed
@qdm12
Copy link
Owner

qdm12 commented Nov 12, 2024

Merged, thanks! I've tested it locally, it looks like it's working fine.
I also added VPN_PORT_FORWARDING_DOWN_COMMAND in the next commit, which does what its name says.
And also pushed f9bdb21 to support quoting better i.e. echo "hello" would previously be changed to echo "hello which would fail the parsing step, now it's fixed.

@KSmanis
Copy link

KSmanis commented Nov 12, 2024

@qdm12 Thanks for merging! I've already successfully migrated my setup from polling the control server to this hook, but I'd rather not follow the master branch. Any plans on a new release soon?

@thibautd
Copy link

For those wanting to use this new feature with Transmission, I wrote a simple Python script to automatically update the Peer Port in Transmission. It's written in Python and uses the uv package manager.

docker-compose.yml

services:
  gluetun:
    build: ./gluetun
    container_name: gluetun
    cap_add:
      - NET_ADMIN
    devices:
      - /dev/net/tun:/dev/net/tun
    environment:
      - Your other env vars here...
      - VPN_PORT_FORWARDING_UP_COMMAND=/bin/uv run --script /transmission-sync.py {{PORTS}}
    restart: unless-stopped
    networks:
      - internal
  transmission:
    image: lscr.io/linuxserver/transmission:latest
    container_name: transmission
    network_mode: "service:gluetun"
    volumes:
      - # Your volumes here
    restart: unless-stopped

I had to create a custom Docker image for gluetun to install Python, uv and my script inside:

gluetun/Dockerfile

FROM qmcgaw/gluetun:latest

RUN apk add --no-cache python3

COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
COPY transmission-sync.py /

Finally, the Python script wich uses https://pypi.org/project/transmission-rpc/.

gluetun/transmission-sync.py

# /// script
# requires-python = ">=3.12"
# dependencies = [
#     "requests",
#     "transmission-rpc",
# ]
# ///

import sys
import requests
from transmission_rpc import Client

PORTS = [int(p) for p in sys.argv[1].split(",")]

print('Set port: ', PORTS)

CLIENT = Client(host="127.0.0.1", port=9091)
CLIENT.set_session(peer_port=PORTS[0])

print('Done')

I put that here in case it can be useful :-)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Feature request: Webhook call when forwarded port change
5 participants