Member of The Internet Defense League Últimos cambios
Últimos Cambios
Blog personal: El hilo del laberinto Geocaching

Visualización de estadísticas persistentes

Última Actualización: 15 de marzo de 2008 - Sábado

Ahora que las estadísticas de BitTornado se almacenan de forma persistente, necesitamos una forma de consultarlas. Por ejemplo, nos puede interesar saber qué torrents hace más tiempo que están inactivos, o cual es nuestro SR ("Share Ratio") en ellos.

El programa es trivial, y muestra lo simple que es utilizar la tecnología de persistencia:

[jcea@XXXX BitTornado-0.3.17]$ cat z-showtraffic.py
#!/usr/local/bin/python

from durus.connection import Connection
from durus.client_storage import ClientStorage
from BitTornado.bencode import bencode,bdecode

import time,sys,sha

root=None
for i in sys.argv[1:] :
  f=open(i,"rb").read(1024*1024)
  metainfo=bdecode(f)
  info=metainfo["info"]
  info_hash = sha.new(bencode(info)).digest()

  if root==None :
    connection=Connection(ClientStorage(address="/video/0/durus-berkeleydbstorage/db/unix_socket"))
    root=connection.get_root()

  connection.abort()
  trafico=root["BT"][info_hash]
  up,down=trafico[0],trafico[1]
  print metainfo["info"]["name"]
  print metainfo["announce"]
  print "UP: %d - DOWN: %d - SR: %.2f - %s" %(up,down,up/(1.0+down),time.ctime(trafico[2]))
  print

El programa se crea dentro de la carpeta BitTorrent, para que tenga acceso a sus módulos. En la línea de comando le indicamos uno o más torrents de los que queremos que nos informe. El programa carga los torrents y muestra la información relevante, extraída del sistema de persistencia.

Algunos puntos interesantes:

  • Los ficheros indicados "se supone" que son torrents. Por si acaso no es así, solo cargamos el primer megabyte e intentamos decodificarlo. Añadí este refinamiento tras intentar decodificar un fichero AVI de 1.4 gigabytes por error :-).

  • En cada consulta al sistema de persistencia, iniciamos una transacción nueva mediante "connection.abort()". De esta manera reducimos el riesgo de conflictos. Lo correcto sería interceptar los conflictos y reintentar la lectura, pero eso es tarea futura.

  • Sumamos "1.0" a los bytes descargados, al calcular el SR, por dos motivos: evitar una división por cero, y pasar los bytes recibidos de entero a coma flotante, para que la división no trunque.

Versión 2.0

Tras un mes de utilizar el programa y encontrarle algunas pegas, publico aquí la versión mejorada:

[jcea@XXXX BitTornado-0.3.17]$ cat z-showtraffic.py
#!/usr/local/bin/python

from durus.connection import Connection
from durus.client_storage import ClientStorage
from BitTornado.bencode import bencode,bdecode

import time,sys,sha

root=None
for i in sys.argv[1:] :
  try :
    f=open(i,"rb").read(1024*1024)
    metainfo=bdecode(f)
    info=metainfo["info"]
    info_hash = sha.new(bencode(info)).digest()
  except KeyboardInterrupt :
    raise
  except :
    import traceback
    print "*****",i
    traceback.print_exc()
    print
    continue

  if root==None :
    connection=Connection(ClientStorage(address="/video/0/durus-berkeleydbstorage/db/unix_socket"))
    root=connection.get_root()

  connection.abort()
  print metainfo["info"]["name"]
  print metainfo["announce"]

  trafico=root["BT"].get(info_hash,None)
  if trafico!=None :
    up,down=trafico[0],trafico[1]
    print "UP: %d - DOWN: %d - SR: %.2f - %s" %(up,down,up/(1.0+down),time.ctime(trafico[2]))
  else :
    print "?????"

  print

Las mejoras son:

  • Cuando abrimos un fichero que no es un torrent, o que está corrupto, antes el programa mostraba el error y terminaba. Ahora muestra el error, como antes, pero continua la ejecución. Esto es especialmente interesante si hemos indicado varios ficheros, ya que continuará la ejecución, mostrando los siguientes.

    Nótese cómo procesamos "KeyboardInterrupt", por si pulsamos CONTROL+C durante la ejecución.

  • El segundo cambio es una comprobación de que el torrent en cuestión esté en el sistema de persistencia. Puede darse el caso de que no sea así. Por ejemplo, porque no lo hayamos activado aún, o porque sea un torrent muy antiguo, de antes de implantar el sistema de persistencia.


Historia

  • 15/mar/08: Mejora en el programa.

  • 20/feb/08: Primera versión de esta página.



Python Zope ©2008 jcea@jcea.es

Más información sobre los OpenBadges

Donación BitCoin: 19niBN42ac2pqDQFx6GJZxry2JQSFvwAfS