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 2 commits into
base: master
Choose a base branch
from
Open
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
121 changes: 121 additions & 0 deletions extras/scripts/transmission-port-update.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
#!/bin/sh

# 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 "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 " REQUIRED"
echo " -U, --url URL Specify the Transmission RPC URL."
echo " DEFAULT: ${DEFAULT_URL}"
echo "Example:"
echo " $0 -u admin -p **** 40409"
exit 1
}

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

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

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

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

# get the X-Transmission-Session-Id
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
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 "Success! Peer port updated to ${PORT}"
exit 0
else
echo "ERROR: Could not update peer port"
exit 1
fi