
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
119 lines
3.9 KiB
Python
119 lines
3.9 KiB
Python
#! /usr/bin/env python
|
|
# -*- encoding: iso-8859-15 -*-
|
|
|
|
###########################
|
|
# Import des commmandes : #
|
|
###########################
|
|
|
|
import commands
|
|
import os
|
|
#import pg # Import des commandes de postgres
|
|
import sys
|
|
sys.path.append('/usr/scripts/gestion')
|
|
import iptools
|
|
from pyPgSQL import PgSQL
|
|
from time import strftime, localtime
|
|
sys.path.append('/usr/scripts/surveillance')
|
|
import strptime, config
|
|
|
|
# définition des tables
|
|
#######################
|
|
from socket import gethostname
|
|
hostname = gethostname().split(".")[0]
|
|
|
|
# Définition de constantes :
|
|
############################
|
|
reseau = config.NETs['all']
|
|
|
|
# Ouverture de la base de données :
|
|
###################################
|
|
pgsql = PgSQL.connect(host='pgsql.adm.crans.org', database='filtrage', user='crans')
|
|
pgsql.autocommit = True
|
|
|
|
# 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","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
|
|
if precedent["date"] != date:
|
|
print 'dump (%s=>%s)'%(precedent["date"],date)
|
|
#os.system('/usr/scripts/surveillance/filtrage_dump.py')
|
|
print 'done'
|
|
|
|
# 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
|
|
actuel["port_dest"]=port_dest
|
|
actuel["donnees"]=donnees
|
|
actuel["date"]=date
|
|
|
|
# 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
|
|
|
|
precedent=actuel
|