Last active
July 27, 2016 01:17
-
-
Save libcrack/04c8daec0b170dcfd0561e89c0fc0fc6 to your computer and use it in GitHub Desktop.
Read servers from OpenVPN client cfg file and sort them by average ping rtt
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env bash | |
| # libcrack.so | |
| # Tue Jul 26 23:50:46 CEST 2016 | |
| if [[ -z "${1}" ]]; then | |
| printf "\n\tUsage: ${MYSELF##*/} <openvpn_client.conf>\n\n" | |
| exit 1 | |
| fi | |
| MYSELF="$(realpath -e "${0#-*}")" | |
| MYHOME="$(dirname ${MYSELF})" | |
| TMP_FILE="$(mktemp /tmp/XXXXXXXX)" | |
| CSV_FILE="${MYHOME}/openvpn-servers.csv" | |
| CONFIG_FILE="${1}" | |
| PING_NR=10 | |
| ALIGN_MAX=35 | |
| SERVERS= | |
| SERVERS_NR= | |
| PING_OPT="-q -n -c ${PING_NR}" | |
| _read_server_list(){ | |
| if [[ -f "${CONFIG_FILE}" ]]; then | |
| printf "\e[32m[+]\e[0m Reading servers from ${CONFIG_FILE}\n" | |
| SERVERS="$(grep remote "${CONFIG_FILE}" | awk '{print $2}' | sort -u)" | |
| SERVERS_NR="$(grep remote "${CONFIG_FILE}" | awk '{print $2}' | sort -u | wc -l | awk '{print $1}')" | |
| printf "\e[32m[+]\e[0m Pinging ${SERVERS_NR} servers\n" | |
| else | |
| printf "\e[31m[x]\e[0m Failed to read servers from \"${CONFIG_FILE}\"\n" | |
| exit 1 | |
| fi | |
| } | |
| _benchmark_server_list(){ | |
| local count=0 | |
| for server in ${SERVERS}; do | |
| local align=$((${ALIGN_MAX}-${#server})) | |
| printf "\e[32m[+]\e[0m (${count}/${SERVERS_NR}) ${server} %${align}s" | |
| local avg="$(ping ${PING_OPT} "${server}" | egrep '^(round-trip|rtt)'|cut -f5 -d/)" | |
| if [[ $? == 0 ]]; then | |
| if [[ ${avg} =~ \d*\.\d* ]]; then | |
| printf "${avg}\n" | |
| printf "${server} ${avg}\n" >> "${TMP_FILE}" | |
| else | |
| printf "\e[31m${avg} (parse error)\e[0m\n" | |
| fi | |
| else | |
| printf "\e[31mNULL\e[0m (ping error)\n" | |
| fi | |
| count=$((${count}+1)) | |
| done | |
| printf "\e[32m[+]\e[0m Finished pinging ${SERVERS_NR} servers\n" | |
| printf "\e[32m[+]\e[0m Online servers: ${count}\n" | |
| } | |
| _print_server_list(){ | |
| while read line; do | |
| server="${line%% *}" | |
| msecs="${line##* }" | |
| if [[ ! -z "${server}" && ! -z "${msecs}" ]]; then | |
| printf "\e[32m[+]\e[0m ${msecs} ${server}\n" | |
| else | |
| printf "\e[31m[\e[0m${count}\e[31m]\e[0m failed to parse \"${line}\"\n" | |
| fi | |
| done < <(cat "${TMP_FILE}" | sort -k 2 -n) | |
| } | |
| _write_server_list(){ | |
| if [[ -f "${TMP_FILE}" ]]; then | |
| printf "\e[32m[+]\e[0m Creating ${CSV_FILE}\n" | |
| cat "${TMP_FILE}" | sort -k 2 -n | tr ' ' ',' > "${CSV_FILE}" | |
| if [[ $? != 0 ]]; then | |
| printf "\e[31m[x]\e[0m Error creating ${CSV_FILE}\n" | |
| fi | |
| printf "\e[32m[+]\e[0m Deleting ${TMP_FILE}\n" | |
| rm "${TMP_FILE}" | |
| return $? | |
| else | |
| printf "\e[31m[x]\e[0m Error: cannot find ${TMP_FILE}\n" | |
| return 1 | |
| fi | |
| } | |
| _read_server_list | |
| _benchmark_server_list | |
| _print_server_list | |
| _write_server_list | |
| exit 0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment