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)