mirror of
https://github.com/haugene/docker-transmission-openvpn.git
synced 2025-08-16 19:27:07 +02:00
165 lines
5.3 KiB
Bash
Executable File
165 lines
5.3 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
set -e
|
|
TIME_FORMAT=`date "+%Y-%m-%d %H:%M:%S"`
|
|
|
|
log() {
|
|
printf "${TIME_FORMAT} %b\n" "$*" > /dev/stderr;
|
|
}
|
|
|
|
fatal_error() {
|
|
printf "${TIME_FORMAT} \e[41mERROR:\033[0m %b\n" "$*" >&2;
|
|
exit 1
|
|
}
|
|
|
|
# check for utils
|
|
script_needs() {
|
|
command -v $1 >/dev/null 2>&1 || fatal_error "This script requires $1 but it's not installed. Please install it and run again."
|
|
}
|
|
|
|
script_init() {
|
|
log "Checking curl installation"
|
|
script_needs curl
|
|
}
|
|
|
|
country_filter() { # curl -s "https://api.nordvpn.com/v1/servers/countries" | jq --raw-output '.[] | [.code, .name] | @tsv'
|
|
local nordvpn_api=$1 country=(${NORDVPN_COUNTRY//[;,]/ })
|
|
if [[ ${#country[@]} -ge 1 ]]; then
|
|
country=${country[0]//_/ }
|
|
local country_id=`curl -s "${nordvpn_api}/v1/servers/countries" | jq --raw-output ".[] |
|
|
select( (.name|test(\"^${country}$\";\"i\")) or
|
|
(.code|test(\"^${country}$\";\"i\")) ) |
|
|
.id" | head -n 1`
|
|
if [[ -n ${country_id} ]]; then
|
|
log "Searching for country : ${country} (${country_id})"
|
|
echo "filters\[country_id\]=${country_id}&"
|
|
fi
|
|
fi
|
|
}
|
|
group_filter() { # curl -s "https://api.nordvpn.com/v1/servers/groups" | jq --raw-output '.[] | [.identifier, .title] | @tsv'
|
|
local nordvpn_api=$1 category=(${NORDVPN_CATEGORY//[;,]/ })
|
|
if [[ ${#category[@]} -ge 1 ]]; then
|
|
category=${category[0]//_/ }
|
|
local identifier=`curl -s "${nordvpn_api}/v1/servers/groups" | jq --raw-output ".[] |
|
|
select( .title | test(\"${category}\";\"i\") ) |
|
|
.identifier" | head -n 1`
|
|
if [[ -n ${identifier} ]]; then
|
|
log "Searching for group: ${identifier}"
|
|
echo "filters\[servers_groups\]\[identifier\]=${identifier}&"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
technology_filter() { # curl -s "https://api.nordvpn.com/v1/technologies" | jq --raw-output '.[] | [.identifier, .name ] | @tsv' | grep openvpn
|
|
local identifier
|
|
if [[ ${NORDVPN_PROTOCOL,,} =~ .*udp.* ]]; then
|
|
identifier="openvpn_udp"
|
|
elif [[ ${NORDVPN_PROTOCOL,,} =~ .*tcp.* ]];then
|
|
identifier="openvpn_tcp"
|
|
fi
|
|
if [[ -n ${identifier} ]]; then
|
|
log "Searching for technology: ${identifier}"
|
|
echo "filters\[servers_technologies\]\[identifier\]=${identifier}&"
|
|
fi
|
|
}
|
|
select_hostname() { #TODO return multiples
|
|
local nordvpn_api="https://api.nordvpn.com" \
|
|
filters hostname
|
|
|
|
log "Selecting the best server..."
|
|
if [[ "$1" != "-d" ]]; then
|
|
filters+="$(country_filter ${nordvpn_api})"
|
|
fi
|
|
filters+="$(group_filter ${nordvpn_api})"
|
|
filters+="$(technology_filter )"
|
|
|
|
hostname=`curl -s "${nordvpn_api}/v1/servers/recommendations?${filters}limit=1" | jq --raw-output ".[].hostname"`
|
|
if [[ -z ${hostname} ]]; then
|
|
log "Unable to find a server with the specified parameters, using any recommended server"
|
|
hostname=`curl -s "${nordvpn_api}/v1/servers/recommendations?limit=1" | jq --raw-output ".[].hostname"`
|
|
fi
|
|
|
|
log "Best server : ${hostname}"
|
|
echo ${hostname}
|
|
}
|
|
download_hostname() {
|
|
#udp ==> https://downloads.nordcdn.com/configs/files/ovpn_udp/servers/nl601.nordvpn.com.udp.ovpn
|
|
#tcp ==> https://downloads.nordcdn.com/configs/files/ovpn_tcp/servers/nl542.nordvpn.com.tcp.ovpn
|
|
|
|
local nordvpn_cdn="https://downloads.nordcdn.com/configs/files"
|
|
|
|
if [[ ${NORDVPN_PROTOCOL,,} == udp ]]; then
|
|
nordvpn_cdn="${nordvpn_cdn}/ovpn_udp/servers/"
|
|
elif [[ ${NORDVPN_PROTOCOL,,} == tcp ]];then
|
|
nordvpn_cdn="${nordvpn_cdn}/ovpn_tcp/servers/"
|
|
fi
|
|
|
|
if [[ "$1" == "-d" ]]; then
|
|
nordvpn_cdn=${nordvpn_cdn}${2}
|
|
ovpnName=default.ovpn
|
|
else
|
|
nordvpn_cdn=${nordvpn_cdn}${1}
|
|
ovpnName=${1}.ovpn
|
|
fi
|
|
|
|
if [[ ${NORDVPN_PROTOCOL,,} == udp ]]; then
|
|
nordvpn_cdn="${nordvpn_cdn}.udp.ovpn"
|
|
elif [[ ${NORDVPN_PROTOCOL,,} == tcp ]];then
|
|
nordvpn_cdn="${nordvpn_cdn}.tcp.ovpn"
|
|
fi
|
|
|
|
log "Downloading config: ${ovpnName}"
|
|
log "Downloading from: ${nordvpn_cdn}"
|
|
curl ${nordvpn_cdn} -o "${ovpnName}"
|
|
}
|
|
update_hostname() {
|
|
log "Checking line endings"
|
|
sed -i 's/^M$//' *.ovpn
|
|
# Update configs with correct options
|
|
log "Updating configs for docker-transmission-openvpn"
|
|
sed -i 's=auth-user-pass=auth-user-pass /config/openvpn-credentials.txt=g' *.ovpn
|
|
sed -i 's/ping 15/inactive 3600\
|
|
ping 10/g' *.ovpn
|
|
sed -i 's/ping-restart 0/ping-exit 60/g' *.ovpn
|
|
sed -i 's/ping-timer-rem//g' *.ovpn
|
|
}
|
|
|
|
# If the script is called from elsewhere
|
|
cd "${0%/*}"
|
|
script_init
|
|
|
|
log "Removing existing configs"
|
|
find . ! -name '*.sh' -type f -delete
|
|
|
|
if [[ ! -z $OPENVPN_CONFIG ]] && [[ ! -z $NORDVPN_COUNTRY ]]
|
|
then
|
|
default="$(select_hostname)"
|
|
else
|
|
default="$(select_hostname -d)"
|
|
fi
|
|
download_hostname -d ${default}
|
|
|
|
if [[ ${1} == "--get-recommended" ]] || [[ ${1} == "-r" ]]
|
|
then
|
|
selected="default"
|
|
elif [[ ${1} == "--openvpn-config" ]] || [[ ${1} == "-o" ]]
|
|
then
|
|
log "Using OpenVPN CONFIG :: ${OPENVPN_CONFIG,,}"
|
|
download_hostname ${OPENVPN_CONFIG,,}
|
|
elif [[ ! -z $NORDVPN_COUNTRY ]]
|
|
then
|
|
selected="$(select_hostname)"
|
|
download_hostname ${selected}
|
|
else
|
|
selected="default"
|
|
fi
|
|
|
|
update_hostname
|
|
|
|
if [[ ! -z $selected ]]
|
|
then
|
|
echo ${selected}
|
|
fi
|
|
|
|
cd "${0%/*}"
|