Restructure start script, extract provider specific scripts and add support for fetching configs from URL
This commit is contained in:
		| @@ -17,8 +17,7 @@ OPENVPN_IP=$(curl -s https://freevpn.${DOMAIN}/accounts/ | grep IP |  sed s/"^.* | ||||
| # freevpn.me , main server, presents two servers with different address | ||||
| # and related password to be used  | ||||
| SERVER=${OPENVPN_IP%".freevpn.${DOMAIN}"} | ||||
| PASSWORD=$(curl -s https://freevpn.${DOMAIN}/accounts/ | grep Password |  sed s/"^.*Password\:.... "/""/g | sed s/"<.*"/""/g) | ||||
| echo "${PASSWORD}" > /etc/freevpn_password | ||||
| export OPENVPN_PASSWORD=$(curl -s https://freevpn.${DOMAIN}/accounts/ | grep Password |  sed s/"^.*Password\:.... "/""/g | sed s/"<.*"/""/g) | ||||
| 
 | ||||
| DIR="/tmp/freevpn" | ||||
| TARGET="/etc/openvpn/freevpn" | ||||
							
								
								
									
										16
									
								
								openvpn/modify-openvpn-config.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										16
									
								
								openvpn/modify-openvpn-config.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| #!/bin/bash | ||||
|  | ||||
| echo "Modify chosen OpenVPN config for best behaviour in this container" | ||||
|  | ||||
| # Every config modification have its own environemnt variable that can configure the behaviour. | ||||
| # Different users, providers or host systems might have specific preferences. | ||||
| # But we should try to add sensible defaults, a way to disable it, and alternative implementations as needed. | ||||
|  | ||||
| CONFIG_MOD_USERPASS=${CONFIG_MOD_USERPASS:-"1"} | ||||
|  | ||||
|  | ||||
| ## Option 1 - Change the auth-user-pass line to point to credentials file | ||||
| if [[ $CONFIG_MOD_USERPASS == "1" ]]; then | ||||
|     echo "Point auth-user-pass option to the username/password file" | ||||
|     sed -i "s/auth-user-pass/auth-user-pass \/config\/openvpn-credentials.txt/" "$CHOSEN_OPENVPN_CONFIG" | ||||
| fi | ||||
							
								
								
									
										19
									
								
								openvpn/nordvpn/configure-openvpn.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										19
									
								
								openvpn/nordvpn/configure-openvpn.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| #! /bin/bash | ||||
|  | ||||
| NORDVPN_PROTOCOL=${NORDVPN_PROTOCOL:-UDP} | ||||
| export NORDVPN_PROTOCOL | ||||
|  | ||||
| NORDVPN_CATEGORY=${NORDVPN_CATEGORY:-P2P} | ||||
| export NORDVPN_CATEGORY | ||||
|  | ||||
|  | ||||
| if [[ -n $OPENVPN_CONFIG ]]; then | ||||
|     tmp_Protocol="${OPENVPN_CONFIG##*.}" | ||||
|     export NORDVPN_PROTOCOL=${tmp_Protocol^^} | ||||
|     echo "Setting NORDVPN_PROTOCOL to: ${NORDVPN_PROTOCOL}" | ||||
|     ${VPN_PROVIDER_HOME}/updateConfigs.sh --openvpn-config | ||||
| elif [[ -n $NORDVPN_COUNTRY ]]; then | ||||
|     export OPENVPN_CONFIG=$(${VPN_PROVIDER_HOME}/updateConfigs.sh) | ||||
| else | ||||
|     export OPENVPN_CONFIG=$(${VPN_PROVIDER_HOME}/updateConfigs.sh --get-recommended) | ||||
| fi | ||||
| @@ -110,7 +110,7 @@ download_hostname() { | ||||
|  | ||||
|     log "Downloading config: ${ovpnName}" | ||||
|     log "Downloading from: ${nordvpn_cdn}" | ||||
|     curl ${nordvpn_cdn} -o "${ovpnName}" | ||||
|     curl -sSL ${nordvpn_cdn} -o "${ovpnName}" | ||||
| } | ||||
| update_hostname() { | ||||
|     log "Checking line endings" | ||||
|   | ||||
							
								
								
									
										155
									
								
								openvpn/start.sh
									
									
									
									
									
								
							
							
						
						
									
										155
									
								
								openvpn/start.sh
									
									
									
									
									
								
							| @@ -1,7 +1,17 @@ | ||||
| #!/bin/bash | ||||
| VPN_PROVIDER="${OPENVPN_PROVIDER,,}" | ||||
| VPN_PROVIDER_CONFIGS="/etc/openvpn/${VPN_PROVIDER}" | ||||
| export VPN_PROVIDER_CONFIGS | ||||
|  | ||||
| ## | ||||
| # Get some initial setup out of the way. | ||||
| ## | ||||
|  | ||||
| [[ "${DEBUG}" == "true" ]] && set -x | ||||
|  | ||||
| # If openvpn-pre-start.sh exists, run it | ||||
| if [[ -x /scripts/openvpn-pre-start.sh ]]; then | ||||
|   echo "Executing /scripts/openvpn-pre-start.sh" | ||||
|   /scripts/openvpn-pre-start.sh "$@" | ||||
|   echo "/scripts/openvpn-pre-start.sh returned $?" | ||||
| fi | ||||
|  | ||||
| # If create_tun_device is set, create /dev/net/tun | ||||
| if [[ "${CREATE_TUN_DEVICE,,}" == "true" ]]; then | ||||
| @@ -10,98 +20,67 @@ if [[ "${CREATE_TUN_DEVICE,,}" == "true" ]]; then | ||||
|   chmod 0666 /dev/net/tun | ||||
| fi | ||||
|  | ||||
| if [[ "${OPENVPN_PROVIDER}" == "**None**" ]] || [[ -z "${OPENVPN_PROVIDER-}" ]]; then | ||||
|   echo "OpenVPN provider not set. Exiting." | ||||
|   exit 1 | ||||
| elif [[ ! -d "${VPN_PROVIDER_CONFIGS}" ]]; then | ||||
|   echo "Could not find OpenVPN provider: ${OPENVPN_PROVIDER}" | ||||
|   echo "Please check your settings." | ||||
|   exit 1 | ||||
| ## | ||||
| # Configure OpenVPN. | ||||
| # This basically means to figure out the config file to use as well as username/password | ||||
| ## | ||||
|  | ||||
| # If no OPENVPN_PROVIDER is given, we default to "custom" provider. | ||||
| VPN_PROVIDER="${OPENVPN_PROVIDER:-custom}" | ||||
| VPN_PROVIDER="${VPN_PROVIDER,,}" # to lowercase | ||||
| VPN_PROVIDER_HOME="/etc/openvpn/${VPN_PROVIDER}" | ||||
| mkdir -p "$VPN_PROVIDER_HOME" | ||||
|  | ||||
| # Make sure that we have enough information to start OpenVPN | ||||
| if [[ -z $OPENVPN_CONFIG_URL ]] && [[ "${OPENVPN_PROVIDER}" == "**None**" ]] || [[ -z "${OPENVPN_PROVIDER-}" ]]; then | ||||
|   echo "ERROR: Cannot determine where to find your OpenVPN config. Both OPENVPN_CONFIG_URL and OPENVPN_PROVIDER is unset." | ||||
|   echo "You have to either provide a URL to the config you want to use, or set a configured provider that will download one for you." | ||||
|   echo "Exiting..." && exit 1 | ||||
| fi | ||||
| echo "Using OpenVPN provider: ${VPN_PROVIDER^^}" | ||||
|  | ||||
| if [[ -n $OPENVPN_CONFIG_URL ]]; then | ||||
|   echo "Found URL to OpenVPN config, will download it." | ||||
|   CHOSEN_OPENVPN_CONFIG=$VPN_PROVIDER_HOME/downloaded_config.ovpn | ||||
|   curl -o "$CHOSEN_OPENVPN_CONFIG" -sSL "$OPENVPN_CONFIG_URL" | ||||
|   # shellcheck source=/dev/null | ||||
|   . /etc/openvpn/modify-openvpn-config.sh | ||||
| elif [[ -x $VPN_PROVIDER_HOME/configure-openvpn.sh ]]; then | ||||
|   echo "Provider $OPENVPN_PROVIDER has a custom startup script, executing it" | ||||
|   # shellcheck source=/dev/null | ||||
|   . "$VPN_PROVIDER_HOME"/configure-openvpn.sh | ||||
| fi | ||||
|  | ||||
| echo "Using OpenVPN provider: ${OPENVPN_PROVIDER}" | ||||
| if [[ -z ${CHOSEN_OPENVPN_CONFIG} ]]; then | ||||
|   # We still don't have a config. The user might have set a config in OPENVPN_CONFIG. | ||||
|   if [[ -n "${OPENVPN_CONFIG-}" ]]; then | ||||
|     readarray -t OPENVPN_CONFIG_ARRAY <<< "${OPENVPN_CONFIG//,/$'\n'}" | ||||
|  | ||||
| # If openvpn-pre-start.sh exists, run it | ||||
| if [ -x /scripts/openvpn-pre-start.sh ] | ||||
| then | ||||
|    echo "Executing /scripts/openvpn-pre-start.sh" | ||||
|    /scripts/openvpn-pre-start.sh "$@" | ||||
|    echo "/scripts/openvpn-pre-start.sh returned $?" | ||||
| fi | ||||
|     ## Trim leading and trailing spaces from all entries. Inefficient as all heck, but works like a champ. | ||||
|     for i in "${!OPENVPN_CONFIG_ARRAY[@]}"; do | ||||
|       OPENVPN_CONFIG_ARRAY[${i}]="${OPENVPN_CONFIG_ARRAY[${i}]#"${OPENVPN_CONFIG_ARRAY[${i}]%%[![:space:]]*}"}" | ||||
|       OPENVPN_CONFIG_ARRAY[${i}]="${OPENVPN_CONFIG_ARRAY[${i}]%"${OPENVPN_CONFIG_ARRAY[${i}]##*[![:space:]]}"}" | ||||
|     done | ||||
|  | ||||
| if [[ "${OPENVPN_PROVIDER^^}" = "NORDVPN" ]] | ||||
| then | ||||
|     if [[ -z $NORDVPN_PROTOCOL ]] | ||||
|     then | ||||
|       export NORDVPN_PROTOCOL=UDP | ||||
|     # If there were multiple configs (comma separated), select one of them | ||||
|     if (( ${#OPENVPN_CONFIG_ARRAY[@]} > 1 )); then | ||||
|       OPENVPN_CONFIG_RANDOM=$((RANDOM%${#OPENVPN_CONFIG_ARRAY[@]})) | ||||
|       echo "${#OPENVPN_CONFIG_ARRAY[@]} servers found in OPENVPN_CONFIG, ${OPENVPN_CONFIG_ARRAY[${OPENVPN_CONFIG_RANDOM}]} chosen randomly" | ||||
|       OPENVPN_CONFIG="${OPENVPN_CONFIG_ARRAY[${OPENVPN_CONFIG_RANDOM}]}" | ||||
|     fi | ||||
|  | ||||
|     if [[ -z $NORDVPN_CATEGORY ]] | ||||
|     then | ||||
|       export NORDVPN_CATEGORY=P2P | ||||
|     fi | ||||
|  | ||||
|     if [[ -n $OPENVPN_CONFIG ]] | ||||
|     then | ||||
|       tmp_Protocol="${OPENVPN_CONFIG##*.}" | ||||
|       export NORDVPN_PROTOCOL=${tmp_Protocol^^} | ||||
|       echo "Setting NORDVPN_PROTOCOL to: ${NORDVPN_PROTOCOL}" | ||||
|       ${VPN_PROVIDER_CONFIGS}/updateConfigs.sh --openvpn-config | ||||
|     elif [[ -n $NORDVPN_COUNTRY ]] | ||||
|     then | ||||
|       export OPENVPN_CONFIG=$(${VPN_PROVIDER_CONFIGS}/updateConfigs.sh) | ||||
|     # Check that the chosen config exists. | ||||
|     if [[ -f "${VPN_PROVIDER_HOME}/${OPENVPN_CONFIG}.ovpn" ]]; then | ||||
|       echo "Starting OpenVPN using config ${OPENVPN_CONFIG}.ovpn" | ||||
|       CHOSEN_OPENVPN_CONFIG="${VPN_PROVIDER_HOME}/${OPENVPN_CONFIG}.ovpn" | ||||
|     else | ||||
|       export OPENVPN_CONFIG=$(${VPN_PROVIDER_CONFIGS}/updateConfigs.sh --get-recommended) | ||||
|       echo "Supplied config ${OPENVPN_CONFIG}.ovpn could not be found." | ||||
|       exit 1 # No longer fall back to default. The user chose a specific config - we should use it or fail. | ||||
|     fi | ||||
| elif [[ "${OPENVPN_PROVIDER^^}" = "FREEVPN" ]] | ||||
| then | ||||
|     FREEVPN_DOMAIN=${OPENVPN_CONFIG%%-*} | ||||
|      | ||||
|     # Update FreeVPN certs | ||||
|     /etc/openvpn/updateFreeVPN.sh | ||||
|     # Get password obtained from updateFreeVPN.sh | ||||
|     export OPENVPN_PASSWORD=$(cat /etc/freevpn_password) | ||||
|     rm /etc/freevpn_password | ||||
| elif [[ "${OPENVPN_PROVIDER^^}" = "VPNBOOK" ]] | ||||
| then | ||||
|     pwd_url=$(curl -s "https://www.vpnbook.com/freevpn" | grep -m2 "Password:" | tail -n1 | cut -d \" -f2) | ||||
|     curl -s -X POST --header "apikey: 5a64d478-9c89-43d8-88e3-c65de9999580" \ | ||||
|       -F "url=https://www.vpnbook.com/${pwd_url}" \ | ||||
|       -F 'language=eng' \ | ||||
|       -F 'isOverlayRequired=true' \ | ||||
|       -F 'FileType=.Auto' \ | ||||
|       -F 'IsCreateSearchablePDF=false' \ | ||||
|       -F 'isSearchablePdfHideTextLayer=true' \ | ||||
|       -F 'scale=true' \ | ||||
|       -F 'detectOrientation=false' \ | ||||
|       -F 'isTable=false' \ | ||||
|       "https://api.ocr.space/parse/image" -o /tmp/vpnbook_pwd | ||||
|     export OPENVPN_PASSWORD=$(cat /tmp/vpnbook_pwd  | awk -F',' '{ print $1 }' | awk -F':' '{print $NF}' | tr -d '"' | awk '{print $1 $2}') | ||||
| fi | ||||
|  | ||||
| if [[ -n "${OPENVPN_CONFIG-}" ]]; then | ||||
|   readarray -t OPENVPN_CONFIG_ARRAY <<< "${OPENVPN_CONFIG//,/$'\n'}" | ||||
|   ## Trim leading and trailing spaces from all entries. Inefficient as all heck, but works like a champ. | ||||
|   for i in "${!OPENVPN_CONFIG_ARRAY[@]}"; do | ||||
|     OPENVPN_CONFIG_ARRAY[${i}]="${OPENVPN_CONFIG_ARRAY[${i}]#"${OPENVPN_CONFIG_ARRAY[${i}]%%[![:space:]]*}"}" | ||||
|     OPENVPN_CONFIG_ARRAY[${i}]="${OPENVPN_CONFIG_ARRAY[${i}]%"${OPENVPN_CONFIG_ARRAY[${i}]##*[![:space:]]}"}" | ||||
|   done | ||||
|   if (( ${#OPENVPN_CONFIG_ARRAY[@]} > 1 )); then | ||||
|     OPENVPN_CONFIG_RANDOM=$((RANDOM%${#OPENVPN_CONFIG_ARRAY[@]})) | ||||
|     echo "${#OPENVPN_CONFIG_ARRAY[@]} servers found in OPENVPN_CONFIG, ${OPENVPN_CONFIG_ARRAY[${OPENVPN_CONFIG_RANDOM}]} chosen randomly" | ||||
|     OPENVPN_CONFIG="${OPENVPN_CONFIG_ARRAY[${OPENVPN_CONFIG_RANDOM}]}" | ||||
|   fi | ||||
|   if [[ -f "${VPN_PROVIDER_CONFIGS}/${OPENVPN_CONFIG}.ovpn" ]]; then | ||||
|     echo "Starting OpenVPN using config ${OPENVPN_CONFIG}.ovpn" | ||||
|     OPENVPN_CONFIG="${VPN_PROVIDER_CONFIGS}/${OPENVPN_CONFIG}.ovpn" | ||||
|   else | ||||
|     echo "Supplied config ${OPENVPN_CONFIG}.ovpn could not be found." | ||||
|     echo "Using default OpenVPN gateway for provider ${VPN_PROVIDER}" | ||||
|     OPENVPN_CONFIG="${VPN_PROVIDER_CONFIGS}/default.ovpn" | ||||
|     echo "No VPN configuration provided. Using default." | ||||
|     CHOSEN_OPENVPN_CONFIG="${VPN_PROVIDER_HOME}/default.ovpn" | ||||
|   fi | ||||
| else | ||||
|   echo "No VPN configuration provided. Using default." | ||||
|   OPENVPN_CONFIG="${VPN_PROVIDER_CONFIGS}/default.ovpn" | ||||
| fi | ||||
|  | ||||
| # add OpenVPN user/pass | ||||
| @@ -110,7 +89,7 @@ if [[ "${OPENVPN_USERNAME}" == "**None**" ]] || [[ "${OPENVPN_PASSWORD}" == "**N | ||||
|     echo "OpenVPN credentials not set. Exiting." | ||||
|     exit 1 | ||||
|   fi | ||||
|   echo "Found existing OPENVPN credentials..." | ||||
|   echo "Found existing OPENVPN credentials at /config/openvpn-credentials.txt" | ||||
| else | ||||
|   echo "Setting OPENVPN credentials..." | ||||
|   mkdir -p /config | ||||
| @@ -165,6 +144,7 @@ if [[ "${ENABLE_UFW,,}" == "true" ]]; then | ||||
|     ufw disable | ||||
|     echo "" > /etc/ufw/user.rules | ||||
|   fi | ||||
|  | ||||
|   # Enable firewall | ||||
|   echo "enabling firewall" | ||||
|   sed -i -e s/IPV6=yes/IPV6=no/ /etc/default/ufw | ||||
| @@ -215,4 +195,5 @@ if [[ -n "${LOCAL_NETWORK-}" ]]; then | ||||
|   fi | ||||
| fi | ||||
|  | ||||
| exec openvpn ${TRANSMISSION_CONTROL_OPTS} ${OPENVPN_OPTS} --config "${OPENVPN_CONFIG}" | ||||
| # shellcheck disable=SC2086 | ||||
| exec openvpn ${TRANSMISSION_CONTROL_OPTS} ${OPENVPN_OPTS} --config "${CHOSEN_OPENVPN_CONFIG}" | ||||
							
								
								
									
										15
									
								
								openvpn/vpnbook/configure-openvpn.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										15
									
								
								openvpn/vpnbook/configure-openvpn.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| #! /bin/bash | ||||
|  | ||||
| pwd_url=$(curl -s "https://www.vpnbook.com/freevpn" | grep -m2 "Password:" | tail -n1 | cut -d \" -f2) | ||||
| curl -s -X POST --header "apikey: 5a64d478-9c89-43d8-88e3-c65de9999580" \ | ||||
|     -F "url=https://www.vpnbook.com/${pwd_url}" \ | ||||
|     -F 'language=eng' \ | ||||
|     -F 'isOverlayRequired=true' \ | ||||
|     -F 'FileType=.Auto' \ | ||||
|     -F 'IsCreateSearchablePDF=false' \ | ||||
|     -F 'isSearchablePdfHideTextLayer=true' \ | ||||
|     -F 'scale=true' \ | ||||
|     -F 'detectOrientation=false' \ | ||||
|     -F 'isTable=false' \ | ||||
|     "https://api.ocr.space/parse/image" -o /tmp/vpnbook_pwd | ||||
| export OPENVPN_PASSWORD=$(cat /tmp/vpnbook_pwd  | awk -F',' '{ print $1 }' | awk -F':' '{print $NF}' | tr -d '"') | ||||
		Reference in New Issue
	
	Block a user