#!/usr/bin/env python #-*- coding: iso8859-15 -*- ########################################################## # LIBRERIA DE ANALISIS DE RED v1.0 # ########################################################## # Autor: Juan Miguel Taboada Godoy # # Fecha: Malaga, 14 de diciembre de 2007 # # Descripcion: Contiene todos las funciones para # # analisisde de redes # # Version: 2007011500 # # # # Codigo fuente bajo licencia GNU/GPL # # Centrologic (Computational Logistic Center) # # http://www.centrologic.com - info@centrologic.com # ########################################################## ## \internal ## \defgroup NET_ANALISYS NET_ANALISYS: Libreria de analisis de red ## \version 15/01/2007 2003 Malaga # Librerias necesarias {{{1 import time import re # }}}1 # Netstat {{{1 ## \ingroup NET_ANALISYS ## Extrae una captura del ancho de banda y el numero de paquetes procesados por los interfaces disponibles ## \param fichero_proc especifica de donde se lee la informacion de la interfaz (Por defecto: /proc/net/dev) ## \return Diccionario con Epoch de ahora (TIME) y cada uno de los interfaces con tuplas que contienen (Bytes Recibidos,Bytes Enviados,Paquetes Recibidos,Paquetes Enviados) def netstat(fichero_proc): # Abre el fichero try: socketProc = open(fichero_proc,"r") except Exception,e: raise IOError,"ERROR al leer el fichero de informacion: %s" % (e) # Obtiene una foto del estado datosInterfaz = socketProc.readlines() datosTime = time.time() # Cierra el fichero socketProc.close() # Para cada dispositivo (cada línea) diccionario={} diccionario["TIME"]=datosTime for linea in datosInterfaz[2:]: # Si la encuentra, cambia por espacios los caracteres que no sean numericos linea = re.sub(':',' ',linea) # Cambia varios espacios por uno solo linea = re.sub(' +',' ',linea) # Divide la linea en partes, eliminando los espacios salida = linea.split(' ') # Guarda el resultado diccionario[salida[1]]=(int(salida[2]),int(salida[10]),int(salida[3]),int(salida[11])) # Devuelve el resultado return diccionario # }}}1 # Netusage {{{1 ## \ingroup NET_ANALISYS ## Calcula la media del ancho de banda y los paquetes, de entrada y salida. El test dura poco mas de un segundo aproximadamente ## \param fichero_proc Fichero que contiene las estadisticas de red (Por defecto: /proc/net/dev) ## \return Diccionario con cada interfaz como indice y una tupla con los datos de la media: (banda entrada,banda salida, paquetes entrada,paquetes salida) def netusage(fichero_proc="/proc/net/dev"): # Saca una captura old=netstat(fichero_proc) # Espera un segundo time.sleep(1) # Saca otra captura new=netstat(fichero_proc) # Calcula la diferencia temporal time_dif=float(new["TIME"]-old["TIME"]) # Crea un diccionario diccionario={} # Para cada elemento de la captura antigua for elemento in old: # Si es el tiempo o el elemento ya no existe, no se procesa, en otro caso sí if ((elemento!="TIME") and (elemento in new)): # OLD (o1,o2,o3,o4)=old[elemento] # NEW (n1,n2,n3,n4)=new[elemento] # Calcula la diferencia if (o1>n1): dif1=2**32-o1+n1 else: dif1=n1-o1 if (o2>n2): dif2=2**32-o2+n2 else: dif2=n2-o2 dif3=n3-o3 dif4=n4-o4 # Elimina los negativos if (dif3<0): dif3=0 if (dif4<0): dif4=0 # Calcula la media med1=float(dif1)/time_dif med2=float(dif2)/time_dif med3=float(dif3)/time_dif med4=float(dif4)/time_dif # Guarda el dato en el diccinario diccionario[elemento]=(med1,med2,med3,med4) # Devuelve el resultado return diccionario # }}}1 # Netping {{{1 ## \ingroup NET_ANALISYS ## Recoje los datos estadisticos de los pings ## \param fichero_pings Fichero que contiene las estadisticas de pings ## \return Diccionario con cada IP como indice y una tupla con los datos estadisticos: (Hay ping?, Pings Enviados, Pings Recibidos, % Ping Perdidos, Ping minimo, Ping medio, Ping maximo, Ping dispositivo) def netping(fichero_pings): # Abre el fichero try: file_pings = open(fichero_pings,"r") except Exception,e: raise IOError,"ERROR al leer el fichero de informacion: %s" % (e) # Obtiene una foto del estado datosPings = file_pings.readlines() datosTime = time.time() # Cierra el fichero file_pings.close() # Para cada dispositivo (cada línea) diccionario={} diccionario["TIME"]=datosTime for linea in datosPings: # Divide la linea en partes, eliminando los espacios salida=linea[:-1].split(" ") # Recojo los datos y los proceso. Del 1 al 4 los convierto en Int for i in range(1,5): if (salida[i]=='x'): salida[i]=None else: salida[i]=int(salida[i]) # Del 5 al 8 los convierto en Float for i in range(5,9): if (salida[i]=='x'): salida[i]=None else: salida[i]=float(salida[i]) # Guarda el resultado diccionario[salida[0]]=(salida[1],salida[2],salida[3],salida[4],salida[5],salida[6],salida[7],salida[8]) # Devuelve el resultado return diccionario # Devuelve el resultado return diccionario # }}}1