diff --git a/surveillance/analyse.py b/surveillance/analyse.py index 9e1907c4..ecb46ec7 100644 --- a/surveillance/analyse.py +++ b/surveillance/analyse.py @@ -6,29 +6,36 @@ import sys, re 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) + upload_mini : n'affiche que les lignes avec plus d'upload que la valeur donnée + show_limit : nombre max de lignes à afficher + 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: ip_crans = [ip_crans] if type(ip_ext) == str: ip_ext = [ip_ext] - + # variables pour la requete et l'affichage ########################################## @@ -37,41 +44,47 @@ def stats(ip_crans=[], ip_ext=[], show=['ip_crans','ip_ext','port_crans','port_e titre = [] format = [] alignement = [] - + if 'ip_crans' in show and len(ip_crans)!=1: select.append('ip_crans') largeur.append(13) titre.append('machine crans') format.append('s') alignement.append('c') - + if 'ip_ext' in show : select.append('ip_ext') largeur.append('*') titre.append('machine ext') format.append('s') alignement.append('c') - + if 'port_ext' in show : select.append('port_ext') largeur.append(10) titre.append('port ext') format.append('s') alignement.append('d') - + if 'port_crans' in show : select.append('port_crans') largeur.append(10) titre.append('port crans') format.append('s') alignement.append('d') - + 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,8 +92,26 @@ 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() curseur.execute(requete) @@ -95,47 +126,56 @@ def stats(ip_crans=[], ip_ext=[], show=['ip_crans','ip_ext','port_crans','port_e return socket.gethostbyaddr(ip)[0] except: 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 - ip de la machine crans ---ip-ext - ip de la machine extérieure ---show - champs à afficher (parmi ip_crans, ip_ext, port_crans, port_ext) ---upload-mini - upload mini des lignes à afficher ---show-limit - 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) + -d ou --show-download + trier par download plutôt que par upload + --ip-crans [ip] + ip de la machine crans + --ip-ext [ip] + ip de la machine extérieure + --show [champ] + champs à afficher (parmi ip_crans, ip_ext, port_crans, port_ext) + --upload-mini [n Mo] + upload mini des lignes à afficher + --show-limit [n] + nombre maximum de lignes à afficher + --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,13 +190,25 @@ 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) - - print "Statistiques d'upload" - + + + # 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 ############################### ip_crans = [] @@ -173,7 +225,7 @@ Exemples : print ' depuis la machine %s' % ip_crans_nom[0] elif ip_crans_nom: print ' depuis les machines %s' % ', '.join(ip_crans_nom) - + # recherche de la machine ext ############################# ip_ext = [] @@ -188,7 +240,7 @@ Exemples : except socket.gaierror : print "Hôte %s inconnu" % value sys.exit(5) - + # recherche du nom d'hote try : ip_ext_nom.append(socket.gethostbyaddr(value)[0]) @@ -203,12 +255,14 @@ 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'] + show = ['ip_crans', 'ip_ext', 'port_crans', 'port_ext'] else : print ' affichage de %s' % ', '.join(show) - + # upload mini à afficher ######################## upload_mini = 0 @@ -247,7 +301,7 @@ Exemples : print 'Le nombre d\'heures doit être un entier' sys.exit(4) break - + # fin de l'analyse ################## end_time = 0 @@ -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) +