[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
This commit is contained in:
Michel Blockelet 2009-10-05 18:02:21 +02:00
parent e06b757c1b
commit 679fbc217c

View file

@ -30,35 +30,71 @@ reseau = config.NETs['all']
pgsql = PgSQL.connect(host='pgsql.adm.crans.org', database='filtrage', user='crans') pgsql = PgSQL.connect(host='pgsql.adm.crans.org', database='filtrage', user='crans')
pgsql.autocommit = True pgsql.autocommit = True
################################################################# # Fonction de commit :
# Parser ler log de net-acct : /var/log/net-acct/net-acct.log : # ######################
################################################################# 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 # 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'") 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 # 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 # 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 : for log in netacct :
# Découpage du log # Découpage du log
date,proto,ip_src,port_src,ip_dest,port_dest,donnees = log.split("\t")[0:-2] 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: if precedent["date"] != date:
print 'dump (%s=>%s)'%(precedent["date"],date) print 'dump (%s=>%s)'%(precedent["date"],date)
#os.system('/usr/scripts/surveillance/filtrage_dump.py') #os.system('/usr/scripts/surveillance/filtrage_dump.py')
print 'done' 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 # Création d'un dictionnaire pour matcher les conversations
actuel = {} actuel = {}
actuel["date"] = date
actuel["proto"] = proto
actuel["ip_src"]=ip_src actuel["ip_src"]=ip_src
actuel["port_src"]=port_src actuel["port_src"]=port_src
actuel["ip_dest"]=ip_dest actuel["ip_dest"]=ip_dest
@ -66,40 +102,18 @@ for log in netacct :
actuel["donnees"]=donnees actuel["donnees"]=donnees
actuel["date"]=date actuel["date"]=date
# on regarde si c'est le retour de la connection du dessus # On regarde si c'est le retour de la connexion 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"] : print actuel
if (actuel["ip_src"]==precedent["ip_dest"]
# Remplissage de la base de données : and actuel["ip_dest"]==precedent["ip_src"]
#################################### and actuel["port_src"]==precedent["port_dest"]
and actuel["port_dest"]==precedent["port_src"]):
# Vérification de l'IP: commit(actuel, precedent)
verif = iptools.AddrInNets (actuel["ip_src"],reseau) precedent_commite = True
if verif: elif not precedent_commite:
crans = "src" # On commite le précédent avant de l'écraser
ext = "dest" commit(precedent)
upload = int(actuel["donnees"])
download = int(precedent["donnees"])
port_src=int(actuel['port_src'])
port_dest=int(actuel['port_dest'])
else: else:
crans = "dest" precedent_commite = False
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 precedent=actuel