Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/sh
- # ImPerial TeK. Solutions (ITS)
- # Copyright (c) 2018 v1ral <ImPerialTeKSolutions@outlook.com>
- PROGRAM="vpnbook"
- # URL to the site containing user and password
- SITE="https://www.vpnbook.com/freevpn"
- # URL to the site containing OpenVPN configs
- OPENVPN_SITE="https://www.vpnbook.com"
- # File where VPNBook credentials get stored
- AUTH_FILE="./vpnbook.auth"
- # Path to temporary file
- AUTH_FILE_TMP="/tmp/vpnbook.$$"
- # Folder where OpenVPN configs are created
- CONFIG_FOLDER="./"
- # Path to temporary folder for config generation
- CONFIG_FOLDER_TEMP="/tmp/vpnbook-config.$$"
- cleanup() {
- rm -f "$AUTH_FILE_TMP"
- rm -rf "$CONFIG_FOLDER_TEMP"
- }
- trap cleanup HUP INT TERM
- usage() {
- cat << EOF
- Usage: $PROGRAM <command> [parameter]
- Commands are
- config Generate OpenVPN configs for non-interactive usage based on configs provided
- on $OPENVPN_SITE
- auth Extract user and password from $OPENVPN_SITE and save to auth-user-pass file
- (default: $AUTH_FILE)
- Parameters are
- -a <file> Path to the auth_user_pass file (default: $AUTH_FILE)
- -c <folder> Folder where OpenVPN configs are generated (default: $CONFIG_FOLDER)
- -h Show this help
- EOF
- }
- download_site() {
- local site="$1"
- curl "$site" -s
- }
- extract_credentials() {
- awk -F '[<>]' '
- BEGIN { exit_value = 1 }
- /Username:/ && !user_found { print $5; user_found = 1; next }
- /Password:/ && user_found { print $5; exit_value = 0; exit }
- END { exit exit_value }
- '
- }
- extract_config_urls() {
- local site="$1"
- awk -F '[<>]' -v site=$site '
- /free-openvpn-account/ { split($4, a, /"/); print site a[2] }
- '
- }
- generate_auth() {
- local data="$1"
- if (echo "$data" | extract_credentials) > "$AUTH_FILE_TMP"; then
- mv "$AUTH_FILE_TMP" "$AUTH_FILE"
- chmod 600 "$AUTH_FILE"
- fi
- }
- generate_vpn_config() {
- awk -v auth_file="$AUTH_FILE" '
- # Remove windows newline
- { sub(/\r$/, "") }
- # Add both ports in config file and let OpenVPN select them remote-random
- /^remote/ {
- host = $2; print
- print $1, host, 25000
- if (!remote_random_printed) {
- print "remote-random"
- remote_random_printed = 1
- }
- next
- }
- # Switch authentication from interactive to file based
- /^auth-user-pass/ {
- print $1, auth_file
- print "auth-retry nointeract"
- next
- }
- # Let OpenVPN check the remote certificate
- /^<ca>/ {
- print "ns-cert-type server"
- }
- # Output everything else unchanged
- { print }
- '
- }
- generate_config() {
- local data="$1"
- mkdir "$CONFIG_FOLDER_TEMP" || return
- for url in $(echo "$site_data" | extract_config_urls "$OPENVPN_SITE"); do
- local file="$CONFIG_FOLDER_TEMP/${url##*/}"
- local conf_file="vpnbook-${file##*-}"
- conf_file=${conf_file%.zip}.ovpn
- conf_file="$CONFIG_FOLDER/$(echo $conf_file | tr 'A-Z' 'a-z')"
- curl "$url" -o "$file" -s
- unzip -p "$file" '*udp53*.ovpn' | generate_vpn_config > "$conf_file"
- done
- generate_auth "$data"
- }
- main() {
- case $1 in
- config | auth )
- generator_func="generate_$1"
- ;;
- * )
- usage
- exit 1
- ;;
- esac
- shift
- while getopts 'a:c:h' options; do
- case $options in
- a )
- auth_file=$OPTARG
- ;;
- c )
- config_folder=$OPTARG
- ;;
- h | \?)
- usage
- exit 1
- ;;
- esac
- done
- AUTH_FILE=${auth_file:-$AUTH_FILE}
- CONFIG_FOLDER=${config_folder:-$CONFIG_FOLDER}
- local site_data="$(download_site "$SITE")"
- $generator_func "$site_data"
- retval=$?
- cleanup
- return $retval
- }
- if [ "$PROGRAM" = ${0##*/} ]; then
- main "$@"
- exit $?
- fi
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement