Mostrando las entradas con la etiqueta pingmon. Mostrar todas las entradas
Mostrando las entradas con la etiqueta pingmon. Mostrar todas las entradas

2025-05-14

pingmon update

Hace un tiempo hice un script para monitorear mi conexión a internet usando ping

Le hice algunos cambios menores, y ahora muestra datos aunque no haya llenado toda la ventana.

Esta es la última versión

#!/usr/bin/env python3

import subprocess
import sys
import re

SEQ_NUMBER_RE = re.compile(r".*icmp_seq=(\d+) ttl.*")

def report(probes, count):
  if len(probes) < count:
    count = len(probes)
  return str ( count - sum(probes[-count:]) ) 

def monitor(ip):
  probes = []
  ping = subprocess.Popen(["ping", ip], stdout=subprocess.PIPE)
  stdout = ping.stdout

  stdout.readline() # Ignore first line
  line_count = 0
  last_seq_number = 0
  while True:
    line_count +=1
    line = stdout.readline().decode()
    try:
      seq_number = int( SEQ_NUMBER_RE.match(line).group(1))
    except Exception:
      print( "!!! Failed while parsing line " + line )
      seq_number = last_seq_number
    probes.extend([0] * (seq_number - last_seq_number - 1))
    probes.append(1)
    print( "(%s) 10:%s 100:%s 1000:%s 10000:%s" % (
      line_count, report(probes, 10), report(probes, 100), report(probes, 1000), report(probes, 10000)
    ) )

    probes = probes[-10000:] # Keep memory usage bounded
    last_seq_number = seq_number

def main(argv):
  monitor(argv[1])

if __name__ == '__main__':
  main(sys.argv)

2021-03-03

pingmon en python3

Hace un tiempo hice un scriptcito en python para monitorear la conexión de red usando ping. Hoy quise usarlo de nuevo y descubrí que no anda en python3, así que lo adapté. Solo necesitaba 2 pequeños cambios:

  • print es python3 es una función, así que tuve que agregar unos paréntesis.
  • sys.stdout.readline() en python 3 devuelve un montón de bytes (en vez de un string) así que agregué .encode() para transformarlo en string

Dejo acá abajo la versión nueva:

#!/usr/bin/env python3

import subprocess
import sys
import re

SEQ_NUMBER_RE = re.compile(".*icmp_seq=(\d+) ttl.*")

def report(probes, count):
  if len(probes) < count:
    return "N/A"
  return str ( count - sum(probes[-count:]) )

def monitor(ip):
  probes = []
  ping = subprocess.Popen(["ping", ip], stdout=subprocess.PIPE)
  stdout = ping.stdout

  stdout.readline() # Ignore first line
  line_count = 0
  last_seq_number = 0
  while True:
    line_count +=1
    seq_number = int( SEQ_NUMBER_RE.match(stdout.readline().decode()).group(1))
    probes.extend([0] * (seq_number - last_seq_number - 1))
    probes.append(1)
    print( "(%s) 10:%s 100:%s 1000:%s" % (
      line_count, report(probes, 10), report(probes, 100), report(probes, 1000)
    ) )

    probes = probes[-1000:] # Keep memory usage bounded
    last_seq_number = seq_number

def main(argv):
  monitor(argv[1])

if __name__ == '__main__':
  main(sys.argv)

 

Happy hacking,
Aureliano

2017-12-03

Mejor pingmon.py

Hace un tiempo hice un script que uso para monitorear el servicio de mi proveedor de internet. Como últimamente estuvo andando mal, lo cambié un toque para que me muestre la cantidad de paquetes perdidos en los últimos 10, 100 y 1000 (en vez de los porcentajes).

Dejó acá el código fuente:

#!/usr/bin/env python

import subprocess
import sys
import re

SEQ_NUMBER_RE = re.compile(".*icmp_seq=(\d+) ttl.*")

def report(probes, count):
  if len(probes) < count:
    return "N/A"
  return str ( count - sum(probes[-count:]) )

def monitor(ip):
  probes = []
  ping = subprocess.Popen(["ping", ip], stdout=subprocess.PIPE)
  stdout = ping.stdout

  stdout.readline() # Ignore first line
  line_count = 0
  last_seq_number = 0
  while True:
    line_count +=1
    seq_number = int( SEQ_NUMBER_RE.match(stdout.readline()).group(1))
    probes.extend([0] * (seq_number - last_seq_number - 1))
    probes.append(1)
    print "(%s) 10:%s 100:%s 1000:%s" % (
      line_count, report(probes, 10), report(probes, 100), report(probes, 1000)
    )

    probes = probes[-1000:] # Keep memory usage bounded
    last_seq_number = seq_number

def main(argv):
  monitor(argv[1])

if __name__ == '__main__':
  main(sys.argv)


Hasta la próxima,
Aureliano.

2016-05-01

Mejorando pingmon.py

En mi post anterior puse un scriptcito en python para monitorear una conexión con ping. Después de eso lo mejoré un toquecito, y ahora toma los últimos 10, 100 y 1000 probes y calcula el porcentaje que tienen respuesta. La ejecución se ve así:
$ pingmon.py 8.8.8.8
(1) 10:N/A 100:N/A 1000:N/A
(2) 10:N/A 100:N/A 1000:N/A
(3) 10:N/A 100:N/A 1000:N/A
(4) 10:N/A 100:N/A 1000:N/A
(5) 10:N/A 100:N/A 1000:N/A
(6) 10:N/A 100:N/A 1000:N/A
(7) 10:N/A 100:N/A 1000:N/A
(8) 10:N/A 100:N/A 1000:N/A
(9) 10:N/A 100:N/A 1000:N/A
(10) 10:N/A 100:N/A 1000:N/A
(11) 10:100.00% 100:N/A 1000:N/A
(12) 10:100.00% 100:N/A 1000:N/A
(13) 10:100.00% 100:N/A 1000:N/A


Y el código del script creció un poquito, pero sigue entrando en un post.
#!/usr/bin/env python

import subprocess
import sys
import re

SEQ_NUMBER_RE = re.compile(".*icmp_seq=(\d+) ttl.*")

def pct_str(probes, count):
  if len(probes) < (count + 1):
    return "N/A"
  return "%.2f%%" % ( 100 * sum(probes[-count-1:-1]) / count )

def monitor(ip):
  probes = []
  ping = subprocess.Popen(["ping", ip], stdout=subprocess.PIPE)
  stdout = ping.stdout

  stdout.readline() # Ignore first line
  line_count = 0
  last_seq_number = 0
  while True:
    line_count +=1
    seq_number = int( SEQ_NUMBER_RE.match(stdout.readline()).group(1))
    probes.extend([0] * (seq_number - last_seq_number - 1))
    probes.append(1)
    print "(%s) 10:%s 100:%s 1000:%s" % (
      line_count, pct_str(probes, 10), pct_str(probes, 100), pct_str(probes, 1000)
    )

    probes = probes[-1000:] # Keep memory usage bounded
    last_seq_number = seq_number

def main(argv):
  monitor(argv[1])


Siéntase a gusto de hackear este script si quieren algún monitoreo distinto (cambiar la salida y/o la forma de monitorear).

Espero que les sea útil,
Aureliano.

2016-04-28

Monitoreo con ping

A veces mi proveedor de internet anda mal. Una de las cosas que pasan es que empieza a dropear muchos paquetes y, para ver eso, hago un ping. El problema es que el ping no te dice el porcentaje de los paquetes que se cayeron :/. Por lo tanto hice un script en python, al que llamé pingmon.py, que wrappea ping y da esa información en cada vuelta exitosa de un paquete.

La salida se ve así:
$ pingmon.py 8.8.8.8
Packets returned: 1 Packet count: 1 Return percentage: 100.00 %
Packets returned: 2 Packet count: 4 Return percentage: 50.00 %
Packets returned: 3 Packet count: 5 Return percentage: 60.00 %
Packets returned: 4 Packet count: 7 Return percentage: 57.14 %
Packets returned: 5 Packet count: 8 Return percentage: 62.50 %
Packets returned: 6 Packet count: 11 Return percentage: 54.55 %


Y el código del script es éste:
import subprocess
import sys
import re

SEQ_NUMBER_RE = re.compile(".*icmp_seq=(\d+) ttl.*")
 

def monitor(ip):
  ping = subprocess.Popen(["ping", ip], stdout=subprocess.PIPE)
  stdout = ping.stdout

  stdout.readline() # Ignore first line
  line_count = 0
  while True:
    line_count +=1
    seq_number = int( SEQ_NUMBER_RE.match(stdout.readline()).group(1))
    print "Packets returned: %d Packet count: %d Return percentage: %.2f %%" % (line_count, seq_number, (100.0 * line_count)/seq_number )

def main(argv):
  monitor(argv[1])


Espero que les sirva,
Aureliano.