Skip to content

Instantly share code, notes, and snippets.

@LatinSuD
Created June 23, 2022 06:08
Show Gist options
  • Save LatinSuD/46ffa23aeb9f12773c0032f0ba7d8dfc to your computer and use it in GitHub Desktop.
Save LatinSuD/46ffa23aeb9f12773c0032f0ba7d8dfc to your computer and use it in GitHub Desktop.
Ping Continuo
#!/bin/bash
# Hace pings normales y solo muestra cuando hay perdidas
export LANG=C
if [ -t 1 ]; then # es shell interactivo
trap "stty echo; echo" SIGINT SIGTERM
stty -echo
export INTERACTIVO=1
fi
# Detectar version de awk y sus parametros recomendados
if awk -Wv 2>/dev/null | head -1 | grep -q '^mawk'; then
awk_args=('-W' 'interactive')
else
awk_args=()
fi
{
ping "$@" &
#cat /usr/local/bin/kkf | awk '{system("sleep 0.5"); print}'
while test $(jobs -rp | wc -l) -gt 0; do sleep 1.1; echo s ; done
} |
egrep --line-buffered '^s$|icmp_(r|s)eq' |
sed -u -r 's/.*icmp_(r|s)eq=([0-9]+) .*/\2/' |
awk "${awk_args[@]}" '
BEGIN {
BORRADO="\r \r"
seq=1 # Siguiente seq esperado
ultimoseq16=1 # Codigo SEQ original del icmp. Son 16 bits solo.
perdidos=0
recienperdido=0
animacion[0]="|"; animacion[1]="/"; animacion[2]="-"; animacion[3]="\\";
estadoanimacion=0 # Cada vez que llamamos a estado sin que haya habido pings de por medio animamos la barrita
vuelta=0 # como ping va hasta 65536 cada vuelta se incrementa esta variable
vivo=0 # Se pone a 0 si no se han visto pings entre 2 impresiones de estado
}
/[0-9]/ {
if (ultimoseq16>60000 && $1<5000) {
vuelta++
}
ultimoseq16=$1
curseq=$1 + vuelta*65536
if (curseq != seq) {
perdidos += (curseq-seq)
if (ENVIRON["INTERACTIVO"]==1) {
printf("%s", BORRADO)
}
printf("%s", "Perdidos " (curseq-seq) " en " curseq " ")
system("date");
recienperdido=1
};
seq=curseq+1
vivo=1
estadoanimacion=0
}
function estado(anima) {
if (vivo == 0 && anima)
estadoanimacion += anima
if ((seq-1) == 0) {
porecentaje=0
} else {
porcentaje=100*perdidos/(seq-1)
}
if (ENVIRON["INTERACTIVO"]==1) {
printf("%s%.1f%s", BORRADO "Total perdidos: " perdidos "/" (seq-1) " ", porcentaje, "% " animacion[estadoanimacion%4]);
}
vivo=0
}
{
if ($1 == "s" || recienperdido) {
estado(1)
}
recienperdido=0
}
END {
estado(0)
print ""
}
'
if [ -t 1 ]; then # es shell interactivo
stty echo
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment