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

Add script to update Transmission peer port #2611

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,7 @@ ENV VPN_SERVICE_PROVIDER=pia \
ENTRYPOINT ["/gluetun-entrypoint"]
EXPOSE 8000/tcp 8888/tcp 8388/tcp 8388/udp
HEALTHCHECK --interval=5s --timeout=5s --start-period=10s --retries=3 CMD /gluetun-entrypoint healthcheck
COPY extras/scripts/transmission-port-update.sh /scripts/transmission-port-update.sh
ARG TARGETPLATFORM
RUN apk add --no-cache --update -l wget && \
apk add --no-cache --update -X "https://dl-cdn.alpinelinux.org/alpine/v3.17/main" openvpn\~2.5 && \
Expand Down
132 changes: 132 additions & 0 deletions extras/scripts/transmission-port-update.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
#!/bin/sh
juanlufont marked this conversation as resolved.
Show resolved Hide resolved

# Description: This script updates the peer port for the Transmission torrent
# client using its RPC API.
# Author: Juan Luis Font

# default values
DEFAULT_URL="http://localhost:9091/transmission/rpc"
WGET_OPTS="--quiet"

usage() {
echo "Usage: $0 [OPTIONS]"
echo ""
echo "Update Transmission peer-port via RPC API"
echo ""
echo "Options:"
echo " -h, --help Show this help message and exit."
echo " -u, --user USER Specify the Transmission RPC user name."
echo " (Omit if not required)"
echo " -p, --pass PASS Specify the Transmission RPC password."
echo " (Omit if not required)"
echo " -P, --port PORT Specify the Transmission Peer Port."
echo " If PORT is a comma-separated list of ports,"
echo " only use the first one."
echo " REQUIRED"
echo " -U, --url URL Specify the Transmission RPC URL."
echo " DEFAULT: ${DEFAULT_URL}"
echo "Example:"
echo " $0 -u admin -p **** 40409"
}

while [ $# -gt 0 ]; do
case "$1" in
-h | --help)
usage
exit 0
;;
-u | --user)
USERNAME="$2"
_USECRED=true
shift 2
;;
-p | --pass)
PASSWORD="$2"
_USECRED=true
shift 2
;;
-P | --port)
PORTS="$2"
PORT=$(echo "$PORTS" | cut -d',' -f1)
shift 2
;;
-U | --url)
RPC_URL="$2"
shift 2
;;
*)
echo "Unknown option: $1"
usage
exit 1
;;
esac
done

if [ -z "${PORT}" ]; then
echo "ERROR: No Transmission peer-port provided!"
exit 1
fi

if [ "${_USECRED}" ]; then
# make sure username AND password were provided
if [ -z "${USERNAME}" ]; then
echo "ERROR: Transmission RPC Username not provided."
exit 1
fi
if [ -z "${PASSWORD}" ]; then
echo "ERROR: Transmission RPC Password not provided."
exit 1
fi
# basic auth options, --auth-no-challenge avoids 409 Conflict
WGET_OPTS="
${WGET_OPTS}
--auth-no-challenge
--user=${USERNAME}
--password=${PASSWORD}
"
fi

if [ -z "${RPC_URL+x}" ]; then
RPC_URL="${DEFAULT_URL}"
fi

# get the X-Transmission-Session-Id
# shellcheck disable=SC2086
SESSION_ID=$(
wget \
${WGET_OPTS} \
--server-response \
"$RPC_URL" 2>&1 |
grep 'X-Transmission-Session-Id:' |
awk '{print $2}'
)

# generate payload string
PAYLOAD=$(printf '{
"method": "session-set",
"arguments": {
"peer-port": %s
}
}' "$PORT")

# update peer host via API
# shellcheck disable=SC2086
RES=$(
wget \
${WGET_OPTS} \
--header="Content-Type: application/json" \
--header="X-Transmission-Session-Id: $SESSION_ID" \
--post-data="${PAYLOAD}" \
"$RPC_URL" \
-O -
)

# check string returned by wget
SUCCESS='{"arguments":{},"result":"success"}'
if [ "$RES" != "$SUCCESS" ]; then
echo "ERROR: Could not update Transmission peer-port"
exit 1
fi

echo "Success! Transmission peer-port updated to ${PORT}"
exit 0