[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/')
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
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
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
upload_mini : n'affiche que les lignes avec plus d'upload que la valeur donnée
show_limit : nombre max de lignes à afficher
begin : date de départ d'analyse (en heure avant maintenant)
end : date de fin d'analyse (en heure avant maintenant)
begin_time : date de départ 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:
@ -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']
largeur += [10,10]
titre += ['download','upload']
format += ['o','o']
alignement += ['d','d']
if show_download:
sort_by = 'download'
titre += ['*download*','upload']
else:
sort_by = 'upload'
titre += ['download','*upload*']
# requete dans la base
######################
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 ])
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')
curseur = pgsql.cursor()
@ -97,45 +128,54 @@ def stats(ip_crans=[], ip_ext=[], show=['ip_crans','ip_ext','port_crans','port_e
return ip
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
for champ in select:
if champ == 'ip_ext':
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':
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:
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__' :
help = """Statistiques d'upload d'une machine du crans
usage: analyse.py [options]
usage: analyse.py [option]...
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-ext
--ip-ext [ip]
ip de la machine extérieure
--show
--show [champ]
champs à afficher (parmi ip_crans, ip_ext, port_crans, port_ext)
--upload-mini
--upload-mini [n Mo]
upload mini des lignes à afficher
--show-limit
--show-limit [n]
nombre maximum de lignes à afficher
--begin-time
heure de départ de l'analyse (en heure depuis maintenant)
--end-time
heure de fin de l'analyse (en heure depuis maintenant)
--begin-time [n heures]
heure de départ de l'analyse (en heures depuis maintenant)
--end-time [n heures]
heure de fin de l'analyse (en heures depuis maintenant)
Exemples :
Exemple :
sudo /usr/scripts/surveillance/analyse.py bilou.crans.org"""
# import des modules
@ -150,11 +190,23 @@ Exemples :
# parsage des arguments
#######################
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 :
print help
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"
# recherche de la machine crans
@ -203,7 +255,9 @@ Exemples :
# 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 :
show = ['ip_crans', 'ip_ext', 'port_crans', 'port_ext']
else :
@ -260,10 +314,11 @@ Exemples :
sys.exit(4)
break
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
#######################
#print stats(ip_crans, group, upload_mini, limit, heures)
print stats(ip_crans, ip_ext, show, upload_mini, limit, begin_time, end_time)
print stats(ip_crans, ip_ext, show, upload_mini, limit, begin_time,
end_time, show_download)