#!/usr/bin/env python #-*- coding: iso8859-15 -*- ########################################################## # NETSTATISTICS v1.0 # ########################################################## # Autor: Juan Miguel Taboada Godoy # # Fecha: Malaga, 15 de enero de 2007 # # Descripción: Adquisitor de datos para Estadisticas # # de red # # Versión: 2007011500 # # # # Codigo fuente bajo licencia GNU/GPL # # Centrologic (Computational Logistic Center) # # http://www.centrologic.com - info@centrologic.com # ########################################################## # Librerías que voy a usar {{{1 from lib.NET_ANALISYS import netping, netusage from lib.HERENCIA import BASE,DEFAULTCONFIG # }}}1 # ### CONFIG ### ###################################### ## Acceso a los datos estadisticos de red NETSTATISTICS: Configuracion por defecto class CONFIG(DEFAULTCONFIG): # Constructor {{{1 def __init__(self): # Cargo las acciones del padre DEFAULTCONFIG.__init__(self,"NETSTATISTICS") # }}}1 # Config Telemando {{{1 # devnet {{{2 ## Ruta al fichero que contiene las estadisticas de red ## \param self - ## \param arg Ruta al fichero que contiene las estadisticas de red def devnet(self,arg=None): if (arg!=None): self._devnet=arg return self._devnet # }}}2 # pingfile {{{2 ## Ruta al fichero que contiene las estadisticas del ping ## \param self - ## \param arg Ruta al fichero que contiene las estadisticas del ping def pingfile(self,arg=None): if (arg!=None): self._pingfile=arg return self._pingfile # }}}2 # }}}1 # Checker {{{1 ## Comprueba que el conjunto minimo de datos requeridos por la clase han sido declarados por el usuario: \n ## - debug() ## - devnet() ## - pingfile() ## \param self - def check(self): self._check("debug") self._check("devnet") self._check("pingfile") self.check_default() # }}}1 # ### TELEMANDO ### ################################### ## Acceso a los datos estadisticos de red NETSTATISTICS: Telemando class TELEMANDO(BASE): # Constructor {{{1 ## Constructor ## \param self - ## \param id Identificador del Telemando (ALFANUMERICO) ## \param registrador Registrador de datos ## \warning En el nombre de fichero no indique la extension del mismo (.signal.dat), esto ya lo hace la clase como obligacion. def __init__(self,id,registrador): # Cargo las acciones del padre BASE.__init__(self,id,"NETSTATISTICS") # Lista de senales a descargar self.__senales=[] # Inicio el lector de ficheros self.__REGISTRADOR=registrador # }}}1 # Devuelve el listado de registradores {{{1 ## Devuelve un listado de registradores ## \param self - def registradores(self): return self.__REGISTRADOR.list() # }}}1 # Anade una senal a la lista de descarga {{{1 ## Insertar una senal en la lista de senales a descargar ## \param self - ## \param dispositivo Dispositivo del que recoger informacion ## \param tipo Tipo de datos a recoger del dispositivo: bi (banda entrada), bo (banda salida), pi (paquetes entrada), po (paquetes salida) def addsignal(self,dispositivo,tipo): # Checkeo de tipo if ((tipo!='bi') and (tipo!='bo') and (tipo!='pi') and (tipo!='po') and (tipo!='hp') and (tipo!='pe') and (tipo!='pr') and (tipo!='pp') and (tipo!='pm') and (tipo!='pa') and (tipo!='px') and (tipo!='pv') ): raise IOError,"El tipo indicado '%s' es desconocido. Se permiten: bi, bo, pi, po, hp, pe, pr, pp, pm, pa, px y pv" % (tipo) # Guarda la solicitud de datos self.__senales.append((dispositivo,tipo)) # }}}1 # Obtiene los datos de red {{{1 ## Obtiene los datos de red ## \param self - def download(self): # Descarga de datos self.debug("Obteniendo captura del sistema '%s'" % (self.internal_id())) captura=netusage(self.valor("devnet")) pings=netping(self.valor("pingfile")) # Procesa los datos de la captura for elemento in self.__senales: # Inicializo el flag de registro registra=True # Extraigo el dato (dispositivo,tipo)=elemento # Compruebo si el dispositivo está en la lista if (not ((dispositivo in captura) or (dispositivo in pings))): # Muestro un mensaje de error self.debug("No existe informacion disponible para %s (Tipo: %s)" % (dispositivo,tipo)) # Anoto valor nulo para el valor valor=None else: # Compruebo el tipo del dato if (tipo=='bi'): # Band Input valor=captura[dispositivo][0] elif (tipo=='bo'): # Band Output valor=captura[dispositivo][1] elif (tipo=='pi'): # Packet Input valor=captura[dispositivo][2] elif (tipo=='po'): # Packet Output valor=captura[dispositivo][3] elif (tipo=='hp'): # Hay ping valor=pings[dispositivo][0] elif (tipo=='pe'): # Ping Enviados valor=pings[dispositivo][1] elif (tipo=='pr'): # Ping Recibidos valor=pings[dispositivo][2] elif (tipo=='pp'): # Ping Perdidos (%) valor=pings[dispositivo][3] elif (tipo=='pm'): # Ping minimo valor=pings[dispositivo][4] elif (tipo=='pa'): # Ping medio valor=pings[dispositivo][5] elif (tipo=='px'): # Ping maximo valor=pings[dispositivo][6] elif (tipo=='pv'): # Ping dispositivo valor=pings[dispositivo][7] else: self.debug("El tipo solicitado '%s' para el dispositivo '%s' no es reconocido por la funcion de descarga y no se recolecta" % (tipo,dispositivo)) registra=False # Registro el valor en la clase de salida if (registra): self.__REGISTRADOR.register(dispositivo,tipo,valor) # }}}1 # Escribe el resultado en un fichero de registros {{{1 ## Escribe el resultado a un fichero de registros en formato SIGNALS ## \param self - ## \Exception IOError Si ocurre un error en el proceso def write(self): self.__REGISTRADOR.write() # }}}1 # ### EXCEPTIONS ### ################################## # EXCEPTION CLASSES {{{1 # Excepciones básicas # Except (General Exception) {{{2 class Except(Exception): def __init__(self,string): self.string=string def __str__(self): return self.string #}}}2 # ConnectionError (Conexión errónea al servidor) {{{2 class ConnectionError(Exception): def __init__(self,string): self.string=string def __str__(self): return self.string # }}}2 # IOError (Error de entrada/salida) {{{2 class IOError(Exception): def __init__(self,string): self.string=string def __str__(self): return self.string # }}}2 # ExecutionError (Error de ejecucción) {{{2 class ExecutionError(Exception): def __init__(self,string): self.string=string def __str__(self): return self.string # }}}2 # Excepciones graves # TerminalError (Error irrecuperable del programa) {{{2 class TerminalError(Exception): def __init__(self,string): self.string=string def __str__(self): return self.string # }}}2 # }}}1