From 679fbc217cfa12a57846d2d27776563f05a88157 Mon Sep 17 00:00:00 2001 From: Michel Blockelet Date: Mon, 5 Oct 2009 18:02:21 +0200 Subject: [PATCH] [surveillance/filtrage_netacct.py] Comptage des moities de conversations Avant, on ne comptait les conversations que quand on avait les deux lignes (ip crans->ip ext et ip ext->ip crans) cote a cote. Or ce n'est pas toujours le cas (parfois une ligne peut s'intercaler au milieu, ou parfois la conversation n'a pas de reponse). La il compte tout, en essayant d'optimiser quand meme un peu quand il le peut. darcs-hash:20091005160221-ddb99-d260dd6e9e5d22b59da7046293abd29aece0927d.gz --- surveillance/filtrage_netacct.py | 106 +++++++++++++++++-------------- 1 file changed, 60 insertions(+), 46 deletions(-) diff --git a/surveillance/filtrage_netacct.py b/surveillance/filtrage_netacct.py index c30c2f17..c268750b 100644 --- a/surveillance/filtrage_netacct.py +++ b/surveillance/filtrage_netacct.py @@ -29,36 +29,72 @@ reseau = config.NETs['all'] ################################### pgsql = PgSQL.connect(host='pgsql.adm.crans.org', database='filtrage', user='crans') pgsql.autocommit = True - -################################################################# -# Parser ler log de net-acct : /var/log/net-acct/net-acct.log : # -################################################################# + +# Fonction de commit : +###################### +def commit(act, prec={'donnees':0}): + # act = communication actuelle + # prec = communication précédente si elle existe + + # Vérification de l'IP : + verif = iptools.AddrInNets(act["ip_src"],reseau) + if verif: + crans = "src" + ext = "dest" + upload = int(act["donnees"]) + download = int(prec["donnees"]) + port_src=int(act['port_src']) + port_dest=int(act['port_dest']) + else : + crans = "dest" + ext = "src" + upload = int(prec["donnees"]) + download = int(act["donnees"]) + port_src=int(act['port_dest']) + port_dest=int(act['port_src']) + + proto = int(act["proto"]) + ip_crans = act["ip_%s" % crans] + ip_ext = act["ip_%s" % ext] + port_crans = int(act["port_%s" % crans]) + port_ext = int(act["port_%s" % ext]) + + # Traitement dans la base SQL + date = strptime.syslog2pgsql(strftime("%b %d %H:%M:%S",localtime(int(act["date"])))) + curseur = pgsql.cursor() + requete = "INSERT INTO upload (ip_crans,ip_ext,port_crans,port_ext,download,upload,date,id) VALUES ('%s','%s',%d,%d,%d,%d,'%s',%d)" % (ip_crans, ip_ext, port_crans, port_ext, download, upload, date, proto) + curseur.execute(requete) + + +################################################################## +# Parser les logs de net-acct : /var/log/net-acct/net-acct.log : # +################################################################## # On récupère en continu les log de net-account netacct = os.popen("sh -c 'tail -F /var/log/net-acct/net-acct.log 2> /dev/null'") # Sélectionner le couple de ligne qui va bien (port_src_i=port_dest_i+1 et ip_src_i=ip_dest_i+1 # Création d'un dictionnaire pour matcher les conversations -precedent = {"ip_src":"0","ip_dest":"0","port_src":"0","port_dest":"0","donnees":0,"date":"0"} +precedent = {"ip_src":"0","ip_dest":"0","port_src":"0","port_dest":"0","date":"0"} + +# Marqueur pour ne pas enregistrer deux fois la même conversation +precedent_commite = True for log in netacct : # Découpage du log date,proto,ip_src,port_src,ip_dest,port_dest,donnees = log.split("\t")[0:-2] - # si on change de date, on analyse le dump et on commite + # Si on change de date, on analyse le dump et on commite if precedent["date"] != date: print 'dump (%s=>%s)'%(precedent["date"],date) #os.system('/usr/scripts/surveillance/filtrage_dump.py') print 'done' - # Autocommit, on ne commite pas... - # pgsql.commit() - - # ip_src,ip_dest,port_src,port_dest - proto = int(proto) # Création d'un dictionnaire pour matcher les conversations actuel = {} + actuel["date"] = date + actuel["proto"] = proto actuel["ip_src"]=ip_src actuel["port_src"]=port_src actuel["ip_dest"]=ip_dest @@ -66,40 +102,18 @@ for log in netacct : actuel["donnees"]=donnees actuel["date"]=date - # on regarde si c'est le retour de la connection du dessus - if actuel["ip_src"]==precedent["ip_dest"] and actuel["ip_dest"]==precedent["ip_src"] and actuel["port_src"]==precedent["port_dest"] and actuel["port_dest"]==precedent["port_src"] : + # On regarde si c'est le retour de la connexion du dessus + print actuel + if (actuel["ip_src"]==precedent["ip_dest"] + and actuel["ip_dest"]==precedent["ip_src"] + and actuel["port_src"]==precedent["port_dest"] + and actuel["port_dest"]==precedent["port_src"]): + commit(actuel, precedent) + precedent_commite = True + elif not precedent_commite: + # On commite le précédent avant de l'écraser + commit(precedent) + else: + precedent_commite = False - # Remplissage de la base de données : - #################################### - - # Vérification de l'IP: - verif = iptools.AddrInNets (actuel["ip_src"],reseau) - if verif: - crans = "src" - ext = "dest" - upload = int(actuel["donnees"]) - download = int(precedent["donnees"]) - port_src=int(actuel['port_src']) - port_dest=int(actuel['port_dest']) - else : - crans = "dest" - ext = "src" - upload = int(precedent["donnees"]) - download = int(actuel["donnees"]) - port_src=int(actuel['port_dest']) - port_dest=int(actuel['port_src']) - - ip_crans = actuel["ip_%s" % crans] - ip_ext = actuel["ip_%s" % ext] - port_crans = int(actuel["port_%s" % crans]) - port_ext = int(actuel["port_%s" % ext]) - #print actuel["ip_%s" % crans] - #print ip_crans, ip_ext,port_crans, port_ext - - # Traitement dans la base SQL - date = strptime.syslog2pgsql(strftime("%b %d %H:%M:%S",localtime(int(date)))) - curseur = pgsql.cursor() - requete = "INSERT INTO upload (ip_crans,ip_ext,port_crans,port_ext,download,upload,date,id) VALUES ('%s','%s',%d,%d,%d,%d,'%s',%d)" % (ip_crans, ip_ext, port_crans, port_ext, download, upload, date, proto) - curseur.execute(requete) - precedent=actuel