2018-02-03 05:53:58 +00:00
#!/bin/bash
2018-02-03 12:31:21 +00:00
# Forked from binhex's OpenVPN dockers
2018-02-03 06:45:45 +00:00
set -e
2015-08-07 21:07:55 +00:00
2019-12-30 19:50:37 +00:00
ETC_OPENVPN = /etc/openvpn
OPENVPN_CONFIG = " $ETC_OPENVPN /client.ovpn "
2018-02-03 02:39:47 +00:00
# check for presence of network interface docker0
check_network = $( ifconfig | grep docker0 || true )
2018-02-02 09:33:40 +00:00
2018-02-03 02:39:47 +00:00
# if network interface docker0 is present then we are running in host mode and thus must exit
if [ [ ! -z " ${ check_network } " ] ] ; then
echo "[crit] Network type detected as 'Host', this will cause major issues, please stop the container and switch back to 'Bridge' mode" | ts '%Y-%m-%d %H:%M:%.S' && exit 1
2015-05-09 16:59:36 +00:00
fi
2018-02-03 02:39:47 +00:00
export VPN_ENABLED = $( echo " ${ VPN_ENABLED } " | sed -e 's~^[ \t]*~~;s~[ \t]*$~~' )
if [ [ ! -z " ${ VPN_ENABLED } " ] ] ; then
echo " [info] VPN_ENABLED defined as ' ${ VPN_ENABLED } ' " | ts '%Y-%m-%d %H:%M:%.S'
2015-05-10 16:30:28 +00:00
else
2018-02-03 02:39:47 +00:00
echo "[warn] VPN_ENABLED not defined,(via -e VPN_ENABLED), defaulting to 'yes'" | ts '%Y-%m-%d %H:%M:%.S'
export VPN_ENABLED = "yes"
fi
if [ [ $VPN_ENABLED = = "yes" ] ] ; then
2019-12-30 19:50:37 +00:00
# Set default path to OpenVPN config file if not defined.
if [ -z " $VPN_CONFIG " ] ; then
export VPN_CONFIG = /config/client.ovpn
fi
# exit if ovpn file not found
if [ ! -f " ${ VPN_CONFIG } " ] ; then
echo " [crit] No OpenVPN config file located at $VPN_CONFIG . Please download from your VPN provider and then restart this container, exiting... " | ts '%Y-%m-%d %H:%M:%.S' && exit 1
fi
echo " [info] OpenVPN config file is located at ${ VPN_CONFIG } " | ts '%Y-%m-%d %H:%M:%.S'
# set perms and owner for files in $VPN_CONFIG directory
2018-02-03 02:39:47 +00:00
set +e
2019-12-30 19:50:37 +00:00
chown -R " ${ PUID } " :" ${ PGID } " " $VPN_CONFIG " & > /dev/null
2018-02-03 02:39:47 +00:00
exit_code_chown = $?
2019-12-30 19:50:37 +00:00
chmod -R 644 " $VPN_CONFIG " & > /dev/null
2018-02-03 02:39:47 +00:00
exit_code_chmod = $?
set -e
if ( ( ${ exit_code_chown } != 0 || ${ exit_code_chmod } != 0 ) ) ; then
2019-12-30 19:50:37 +00:00
echo " [warn] Unable to chown/chmod $VPN_CONFIG , assuming SMB mountpoint " | ts '%Y-%m-%d %H:%M:%.S'
2018-02-03 02:39:47 +00:00
fi
2018-04-14 20:18:27 +00:00
# Read username and password env vars and put them in credentials.conf, then add ovpn config for credentials file
2018-04-16 04:25:29 +00:00
if [ [ ! -z " ${ VPN_USERNAME } " ] ] && [ [ ! -z " ${ VPN_PASSWORD } " ] ] ; then
2019-12-30 19:50:37 +00:00
OPENVPN_CREDENTIALS = " $ETC_OPENVPN /credentials.conf "
echo " ${ VPN_USERNAME } " > $OPENVPN_CREDENTIALS
echo " ${ VPN_PASSWORD } " >> $OPENVPN_CREDENTIALS
2018-04-14 20:18:27 +00:00
2018-04-16 04:25:29 +00:00
# Replace line with one that points to credentials.conf
2019-12-30 19:50:37 +00:00
auth_cred_exist = $( grep -m 1 'auth-user-pass' $VPN_CONFIG || true )
2018-04-16 05:15:40 +00:00
if [ [ ! -z " ${ auth_cred_exist } " ] ] ; then
# Get line number of auth-user-pass
LINE_NUM = $( grep -Fn -m 1 'auth-user-pass' ${ VPN_CONFIG } | cut -d: -f 1)
2019-12-30 19:50:37 +00:00
sed " ${ LINE_NUM } s/.*/auth-user-pass credentials.conf\n/ " ${ VPN_CONFIG } > $OPENVPN_CONFIG
2018-04-16 05:16:30 +00:00
else
2019-12-30 19:50:37 +00:00
sed -e "\$aauth-user-pass credentials.conf\n" ${ VPN_CONFIG } > $OPENVPN_CONFIG
2018-04-14 20:18:27 +00:00
fi
fi
2018-02-03 02:39:47 +00:00
# convert CRLF (windows) to LF (unix) for ovpn
2019-12-30 19:50:37 +00:00
/usr/bin/dos2unix $OPENVPN_CONFIG 1> /dev/null
2018-02-03 02:39:47 +00:00
# parse values from ovpn file
export vpn_remote_line = $( cat " ${ VPN_CONFIG } " | grep -P -o -m 1 '(?<=^remote\s)[^\n\r]+' | sed -e 's~^[ \t]*~~;s~[ \t]*$~~' )
if [ [ ! -z " ${ vpn_remote_line } " ] ] ; then
echo " [info] VPN remote line defined as ' ${ vpn_remote_line } ' " | ts '%Y-%m-%d %H:%M:%.S'
else
echo " [crit] VPN configuration file ${ VPN_CONFIG } does not contain 'remote' line, showing contents of file before exit... " | ts '%Y-%m-%d %H:%M:%.S'
cat " ${ VPN_CONFIG } " && exit 1
fi
export VPN_REMOTE = $( echo " ${ vpn_remote_line } " | grep -P -o -m 1 '^[^\s\r\n]+' | sed -e 's~^[ \t]*~~;s~[ \t]*$~~' )
if [ [ ! -z " ${ VPN_REMOTE } " ] ] ; then
echo " [info] VPN_REMOTE defined as ' ${ VPN_REMOTE } ' " | ts '%Y-%m-%d %H:%M:%.S'
else
echo " [crit] VPN_REMOTE not found in ${ VPN_CONFIG } , exiting... " | ts '%Y-%m-%d %H:%M:%.S' && exit 1
fi
export VPN_PORT = $( echo " ${ vpn_remote_line } " | grep -P -o -m 1 '(?<=\s)\d{2,5}(?=\s)?+' | sed -e 's~^[ \t]*~~;s~[ \t]*$~~' )
if [ [ ! -z " ${ VPN_PORT } " ] ] ; then
echo " [info] VPN_PORT defined as ' ${ VPN_PORT } ' " | ts '%Y-%m-%d %H:%M:%.S'
else
echo " [crit] VPN_PORT not found in ${ VPN_CONFIG } , exiting... " | ts '%Y-%m-%d %H:%M:%.S' && exit 1
fi
export VPN_PROTOCOL = $( cat " ${ VPN_CONFIG } " | grep -P -o -m 1 '(?<=^proto\s)[^\r\n]+' | sed -e 's~^[ \t]*~~;s~[ \t]*$~~' )
if [ [ ! -z " ${ VPN_PROTOCOL } " ] ] ; then
echo " [info] VPN_PROTOCOL defined as ' ${ VPN_PROTOCOL } ' " | ts '%Y-%m-%d %H:%M:%.S'
else
export VPN_PROTOCOL = $( echo " ${ vpn_remote_line } " | grep -P -o -m 1 'udp|tcp-client|tcp$' | sed -e 's~^[ \t]*~~;s~[ \t]*$~~' )
if [ [ ! -z " ${ VPN_PROTOCOL } " ] ] ; then
echo " [info] VPN_PROTOCOL defined as ' ${ VPN_PROTOCOL } ' " | ts '%Y-%m-%d %H:%M:%.S'
else
echo " [warn] VPN_PROTOCOL not found in ${ VPN_CONFIG } , assuming udp " | ts '%Y-%m-%d %H:%M:%.S'
export VPN_PROTOCOL = "udp"
fi
fi
# required for use in iptables
if [ [ " ${ VPN_PROTOCOL } " = = "tcp-client" ] ] ; then
export VPN_PROTOCOL = "tcp"
fi
VPN_DEVICE_TYPE = $( cat " ${ VPN_CONFIG } " | grep -P -o -m 1 '(?<=^dev\s)[^\r\n\d]+' | sed -e 's~^[ \t]*~~;s~[ \t]*$~~' )
if [ [ ! -z " ${ VPN_DEVICE_TYPE } " ] ] ; then
export VPN_DEVICE_TYPE = " ${ VPN_DEVICE_TYPE } 0 "
echo " [info] VPN_DEVICE_TYPE defined as ' ${ VPN_DEVICE_TYPE } ' " | ts '%Y-%m-%d %H:%M:%.S'
else
echo " [crit] VPN_DEVICE_TYPE not found in ${ VPN_CONFIG } , exiting... " | ts '%Y-%m-%d %H:%M:%.S' && exit 1
fi
# get values from env vars as defined by user
export LAN_NETWORK = $( echo " ${ LAN_NETWORK } " | sed -e 's~^[ \t]*~~;s~[ \t]*$~~' )
if [ [ ! -z " ${ LAN_NETWORK } " ] ] ; then
echo " [info] LAN_NETWORK defined as ' ${ LAN_NETWORK } ' " | ts '%Y-%m-%d %H:%M:%.S'
else
echo "[crit] LAN_NETWORK not defined (via -e LAN_NETWORK), exiting..." | ts '%Y-%m-%d %H:%M:%.S' && exit 1
fi
export NAME_SERVERS = $( echo " ${ NAME_SERVERS } " | sed -e 's~^[ \t]*~~;s~[ \t]*$~~' )
if [ [ ! -z " ${ NAME_SERVERS } " ] ] ; then
echo " [info] NAME_SERVERS defined as ' ${ NAME_SERVERS } ' " | ts '%Y-%m-%d %H:%M:%.S'
else
echo "[warn] NAME_SERVERS not defined (via -e NAME_SERVERS), defaulting to Google and FreeDNS name servers" | ts '%Y-%m-%d %H:%M:%.S'
export NAME_SERVERS = "8.8.8.8,37.235.1.174,8.8.4.4,37.235.1.177"
fi
export VPN_OPTIONS = $( echo " ${ VPN_OPTIONS } " | sed -e 's~^[ \t]*~~;s~[ \t]*$~~' )
if [ [ ! -z " ${ VPN_OPTIONS } " ] ] ; then
echo " [info] VPN_OPTIONS defined as ' ${ VPN_OPTIONS } ' " | ts '%Y-%m-%d %H:%M:%.S'
else
echo "[info] VPN_OPTIONS not defined (via -e VPN_OPTIONS)" | ts '%Y-%m-%d %H:%M:%.S'
export VPN_OPTIONS = ""
fi
elif [ [ $VPN_ENABLED = = "no" ] ] ; then
echo "[warn] !!IMPORTANT!! You have set the VPN to disabled, you will NOT be secure!" | ts '%Y-%m-%d %H:%M:%.S'
2015-05-09 19:49:07 +00:00
fi
2018-02-03 04:36:40 +00:00
# split comma seperated string into list from NAME_SERVERS env variable
IFS = ',' read -ra name_server_list <<< " ${ NAME_SERVERS } "
# process name servers in the list
for name_server_item in " ${ name_server_list [@] } " ; do
# strip whitespace from start and end of lan_network_item
name_server_item = $( echo " ${ name_server_item } " | sed -e 's~^[ \t]*~~;s~[ \t]*$~~' )
2018-02-04 04:02:02 +00:00
echo " [info] Adding ${ name_server_item } to resolv.conf " | ts '%Y-%m-%d %H:%M:%.S'
2018-02-03 04:36:40 +00:00
echo " nameserver ${ name_server_item } " >> /etc/resolv.conf
done
2018-02-04 04:19:02 +00:00
if [ [ -z " ${ PUID } " ] ] ; then
echo "[info] PUID not defined. Defaulting to root user" | ts '%Y-%m-%d %H:%M:%.S'
export PUID = "root"
fi
if [ [ -z " ${ PGID } " ] ] ; then
echo "[info] PGID not defined. Defaulting to root group" | ts '%Y-%m-%d %H:%M:%.S'
export PGID = "root"
fi
2018-02-03 11:56:58 +00:00
if [ [ $VPN_ENABLED = = "yes" ] ] ; then
2018-02-04 04:02:02 +00:00
echo "[info] Starting OpenVPN..." | ts '%Y-%m-%d %H:%M:%.S'
2019-12-30 19:50:37 +00:00
cd $ETC_OPENVPN
exec openvpn --config $OPENVPN_CONFIG &
2018-12-14 05:16:04 +00:00
# give openvpn some time to connect
sleep 5
2018-02-04 05:50:57 +00:00
#exec /bin/bash /etc/openvpn/openvpn.init start &
2018-02-03 12:39:52 +00:00
exec /bin/bash /etc/qbittorrent/iptables.sh
2018-02-03 11:56:58 +00:00
else
2018-02-03 12:39:52 +00:00
exec /bin/bash /etc/qbittorrent/start.sh
2018-02-03 11:56:58 +00:00
fi
2019-12-30 19:50:37 +00:00