[surveillance/analyse.py] Ajout option download, lisibilite++

Option permettant de trier par download plutôt que par upload

darcs-hash:20100318003626-ddb99-2f37c0c89c4733017bbd85db21f2fa2a5b633cec.gz
This commit is contained in:
Michel Blockelet 2010-03-18 01:36:26 +01:00
parent ed855e941f
commit 9e78235eff

View file

@ -7,20 +7,27 @@ from pyPgSQL import PgSQL
sys.path.append('/usr/scripts/gestion/') sys.path.append('/usr/scripts/gestion/')
from affich_tools import tableau from affich_tools import tableau
def stats(ip_crans=[], ip_ext=[], show=['ip_crans','ip_ext','port_crans','port_ext'], upload_mini=0, show_limit=10, begin_time=24, end_time=0): def stats(ip_crans=[], ip_ext=[],
show=['ip_crans', 'ip_ext', 'port_crans', 'port_ext'],
upload_mini=0, show_limit=10, begin_time=24, end_time=0,
show_download=False):
""" """
Retourne une chaine de caratères formatée avec le tableau de statistiques Retourne une chaine de caratères formatée avec le tableau de statistiques
d'upload de l'ip fourni d'upload de l'ip fourni
ip_crans : ips des machine ip_crans : ips des machines Cr@ns
chaine de caratère si il a qu'une machine chaine de caratère si il a qu'une machine
liste si il y a plusieurs machines liste si il y a plusieurs machines
view : liste des champs à afficher parmi : ip_ext : ips des machines extérieures
chaine de caratère si il a qu'une machine
liste si il y a plusieurs machines
show : liste des champs à afficher parmi :
ip_crans, ip_ext, port_crans, port_ext ip_crans, ip_ext, port_crans, port_ext
upload_mini : n'affiche que les lignes avec plus d'upload que la valeur donnée upload_mini : n'affiche que les lignes avec plus d'upload que la valeur donnée
show_limit : nombre max de lignes à afficher show_limit : nombre max de lignes à afficher
begin : date de départ d'analyse (en heure avant maintenant) begin_time : date de départ d'analyse (en heure avant maintenant)
end : date de fin d'analyse (en heure avant maintenant) end_time : date de fin d'analyse (en heure avant maintenant)
show_download: trie par rapport au download plutôt que l'upload
""" """
if type(ip_crans) == str: if type(ip_crans) == str:
@ -68,10 +75,16 @@ def stats(ip_crans=[], ip_ext=[], show=['ip_crans','ip_ext','port_crans','port_e
select += ['sum(download) as download','sum(upload) as upload'] select += ['sum(download) as download','sum(upload) as upload']
largeur += [10,10] largeur += [10,10]
titre += ['download','upload']
format += ['o','o'] format += ['o','o']
alignement += ['d','d'] alignement += ['d','d']
if show_download:
sort_by = 'download'
titre += ['*download*','upload']
else:
sort_by = 'upload'
titre += ['download','*upload*']
# requete dans la base # requete dans la base
###################### ######################
ip_crans = ' OR '.join([ "ip_crans='%s'"%x for x in ip_crans ]) ip_crans = ' OR '.join([ "ip_crans='%s'"%x for x in ip_crans ])
@ -79,7 +92,25 @@ def stats(ip_crans=[], ip_ext=[], show=['ip_crans','ip_ext','port_crans','port_e
ip_ext = ' OR '.join([ "ip_ext='%s'"%x for x in ip_ext ]) ip_ext = ' OR '.join([ "ip_ext='%s'"%x for x in ip_ext ])
if not ip_ext: ip_ext='true' if not ip_ext: ip_ext='true'
requete = "SELECT * FROM ( SELECT %s FROM upload WHERE (%s) AND (%s) AND (date > timestamp 'now' - interval '%d hours') AND (date < timestamp 'now' - interval '%d hours') GROUP BY %s) AS resultat_intemediaire WHERE upload>='%d' ORDER BY upload DESC LIMIT %d;" % (','.join(select), ip_crans, ip_ext, begin_time, end_time, ','.join(show), upload_mini*1024*1024, show_limit) requete = """
SELECT * FROM (
SELECT %(select)s FROM upload WHERE (%(ip_crans)s) AND (%(ip_ext)s)
AND (date > timestamp 'now' - interval '%(begin_time)d hours')
AND (date < timestamp 'now' - interval '%(end_time)d hours')
GROUP BY %(show)s)
AS resultat_intemediaire
WHERE %(sort_by)s >= '%(sort_mini)d'
ORDER BY %(sort_by)s DESC
LIMIT %(show_limit)d;""" % {
'select': ','.join(select),
'ip_crans': ip_crans,
'ip_ext': ip_ext,
'begin_time': begin_time,
'end_time': end_time,
'show': ','.join(show),
'sort_by': sort_by,
'sort_mini': upload_mini*1024*1024,
'show_limit': show_limit }
pgsql = PgSQL.connect(host='/var/run/postgresql', database='filtrage', user='crans') pgsql = PgSQL.connect(host='/var/run/postgresql', database='filtrage', user='crans')
curseur = pgsql.cursor() curseur = pgsql.cursor()
@ -97,45 +128,54 @@ def stats(ip_crans=[], ip_ext=[], show=['ip_crans','ip_ext','port_crans','port_e
return ip return ip
port_to_service = {} port_to_service = {}
for service,port in [ re.split('[ \t]+',x.strip().replace('/tcp','').replace('/udp',''))[:2] for x in open('/etc/services').readlines() if x[0] not in ['\n','#'] ] : for service,port in [re.split('[ \t]+',
x.strip().replace('/tcp','').replace('/udp',''))[:2]
for x in open('/etc/services').readlines()
if x[0] not in ['\n','#']]:
port_to_service[port]=service port_to_service[port]=service
for champ in select: for champ in select:
if champ == 'ip_ext': if champ == 'ip_ext':
col = select.index(champ) col = select.index(champ)
results = [ x[:col] + [nom_de_machine(x[col])] + x[col+1:] for x in results ] results = [x[:col] + [nom_de_machine(x[col])] + x[col+1:]
for x in results]
elif champ == 'ip_crans': elif champ == 'ip_crans':
col = select.index(champ) col = select.index(champ)
results = [ x[:col] + [nom_de_machine(x[col]).split('.')[0]] + x[col+1:] for x in results ] results = [x[:col] + [nom_de_machine(x[col]).split('.')[0]] + x[col+1:]
for x in results]
elif 'port' in champ: elif 'port' in champ:
col = select.index(champ) col = select.index(champ)
results = [ x[:col] + [port_to_service.get(x[col],x[col])] + x[col+1:] for x in results ] results = [x[:col] + [port_to_service.get(x[col],x[col])] + x[col+1:]
for x in results]
return tableau(results, titre=titre, largeur=largeur, alignement=alignement, format=format) return tableau(results, titre=titre, largeur=largeur,
alignement=alignement, format=format)
if __name__ == '__main__' : if __name__ == '__main__' :
help = """Statistiques d'upload d'une machine du crans help = """Statistiques d'upload d'une machine du crans
usage: analyse.py [options] usage: analyse.py [option]...
Option fait partie des options suivantes : Option fait partie des options suivantes :
--ip-crans -d ou --show-download
trier par download plutôt que par upload
--ip-crans [ip]
ip de la machine crans ip de la machine crans
--ip-ext --ip-ext [ip]
ip de la machine extérieure ip de la machine extérieure
--show --show [champ]
champs à afficher (parmi ip_crans, ip_ext, port_crans, port_ext) champs à afficher (parmi ip_crans, ip_ext, port_crans, port_ext)
--upload-mini --upload-mini [n Mo]
upload mini des lignes à afficher upload mini des lignes à afficher
--show-limit --show-limit [n]
nombre maximum de lignes à afficher nombre maximum de lignes à afficher
--begin-time --begin-time [n heures]
heure de départ de l'analyse (en heure depuis maintenant) heure de départ de l'analyse (en heures depuis maintenant)
--end-time --end-time [n heures]
heure de fin de l'analyse (en heure depuis maintenant) heure de fin de l'analyse (en heures depuis maintenant)
Exemples : Exemple :
sudo /usr/scripts/surveillance/analyse.py bilou.crans.org""" sudo /usr/scripts/surveillance/analyse.py bilou.crans.org"""
# import des modules # import des modules
@ -150,11 +190,23 @@ Exemples :
# parsage des arguments # parsage des arguments
####################### #######################
try : try :
opts, args = getopt.getopt(sys.argv[1:],'',['ip-crans=','ip-ext=','show=','upload-mini=','begin-time=','end-time=','show-limit=']) opts, args = getopt.getopt(sys.argv[1:], 'd', ['show-download',
'ip-crans=', 'ip-ext=', 'show=', 'upload-mini=',
'begin-time=', 'end-time=', 'show-limit='])
except getopt.GetoptError,message : except getopt.GetoptError,message :
print help print help
sys.exit(4) sys.exit(4)
# affichage des stats de download
#################################
show_download = False
for key,value in opts:
if key == '-d' or key == '--show-download':
show_download = True
if show_download:
print "Statistiques de download"
else:
print "Statistiques d'upload" print "Statistiques d'upload"
# recherche de la machine crans # recherche de la machine crans
@ -203,7 +255,9 @@ Exemples :
# limite d'affichage # limite d'affichage
#################### ####################
show = [ x[1] for x in opts if x[0] == '--show' and x[1] in ['ip_crans','ip_ext','port_crans','port_ext'] ] show = [x[1] for x in opts
if x[0] == '--show'
and x[1] in ['ip_crans', 'ip_ext', 'port_crans', 'port_ext']]
if not show : if not show :
show = ['ip_crans', 'ip_ext', 'port_crans', 'port_ext'] show = ['ip_crans', 'ip_ext', 'port_crans', 'port_ext']
else : else :
@ -260,10 +314,11 @@ Exemples :
sys.exit(4) sys.exit(4)
break break
if begin_time != 24 or end_time: if begin_time != 24 or end_time:
print ' entre il y a %d heures et il y a %d heures' % (begin_time,end_time) print (' entre il y a %d heure(s) et il y a %d heure(s)'
% (begin_time,end_time))
# affichage du résultat # affichage du résultat
####################### #######################
#print stats(ip_crans, group, upload_mini, limit, heures) print stats(ip_crans, ip_ext, show, upload_mini, limit, begin_time,
print stats(ip_crans, ip_ext, show, upload_mini, limit, begin_time, end_time) end_time, show_download)