Skip to content

Instantly share code, notes, and snippets.

@libcrack
Last active July 27, 2016 01:17
Show Gist options
  • Select an option

  • Save libcrack/04c8daec0b170dcfd0561e89c0fc0fc6 to your computer and use it in GitHub Desktop.

Select an option

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
#!/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