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