#!/bin/sh
-
fpo="/tmp/fping_${$}.out"
+sto="${fpo}.stats"
POTENTIAL_PING_PEERS='1.1.1.1 8.8.8.8 9.9.9.9 a.root-servers.net b.root-servers.net c.root-servers.net d.root-servers.net e.root-servers.net f.root-servers.net g.root-servers.net h.root-servers.net i.root-servers.net j.root-servers.net k.root-servers.net l.root-servers.net m.root-servers.net'
set -u
-echo "Pinging potential peers... please stand by and keep your Internet-directed traffic at a minimum."
+echo "This script will ping potential peers for two minutes," >&2
+echo "record stats, and recommend configuration values for lagdetect.sh" >&2
+echo "" >&2
+echo "Please keep your Internet-directed traffic at a minimum while pinging." >&2
+echo "" >&2
+echo "Hit the [ENTER] key when ready, or [CTRL]+[C] to abort..." >&2
+read _
+printf 'Performing pings, please be patient...' >&2
+#set -x
+
+(
+ s=0
+ while [ $s -lt 100 ]
+ do
+ sleep 10
+ printf '..' >&2
+ let s+=10
+ done
+) &
+
+fping --addr --count=480 --period=250 --retry=0 --size=1280 ${POTENTIAL_PING_PEERS} >"${fpo}" 2>&1
-fping --addr --count=48 --period=250 --retry=0 --size=1280 ${POTENTIAL_PING_PEERS} >"${fpo}" 2>&1
+wait
-awk -v "outfile=${fpo}" '
+echo "" >&2
+echo "Pings done. Computed settings follow:" >&2
+echo "" >&2
+echo "" >&2
+
+set -e
+
+awk -v "outfile=${sto}" '
/^[^ ].* 0% loss/ {
peers_records[$1]++
peers_totalms[$1] += $6
}
END {
- cmd_stats = "sort -nr > " outfile ".stats"
+ cmd_stats = "sort -n > " outfile
for (p in peers_loss)
{
- print "TIMEOUT " p " miss=" peers_loss[p]
+ # print "TIMEOUT " p " miss=" peers_loss[p]
}
for (p in peers_totalms)
{
alat = peers_totalms[p] / peers_records[p]
stdev = sqrt((peers_squarems[p] - peers_totalms[p] ^ 2 / peers_records[p])/peers_records[p])
+ stdevs += stdev
+ peercnt++
if (peers_loss[$1] < 2) {
printf("%5.2f stdev avg %-5.1f min %-5.1f max %-5.1f %s\n", stdev, alat, peers_min[p], peers_max[p], p) | cmd_stats
}
}
+ printf("FUDGE_MS=%.1f\n", 2 + (2.5 * stdevs/peercnt))
for (p in peers_pinglist)
{
#print p " " peers_pinglist[p]
}
}' "${fpo}"
-cat "${fpo}".stats
+awk '
+{
+ if(NR<5) {
+ peers[NR]=$NF
+ }
+}
+
+END {
+ printf "PING_PEERS=\""
+ for (p in peers) {
+ if(peers[p+1] == "") {
+ printf("%s", peers[p])
+ } else {
+ printf("%s ", peers[p])
+ }
+ }
+ printf "\"\n"
+}' "${sto}"
+
+rm -f "${fpo}" "${sto}"