[analyse.py] Passage en UTF-8 et on print pas impunément un unicode.

This commit is contained in:
Vincent Le Gallic 2013-11-14 02:22:41 +01:00
parent 3a7d53a65b
commit 0dfc1e151c

View file

@ -1,5 +1,5 @@
#! /usr/bin/env python #! /usr/bin/env python
# -*- coding: iso8859-15 -*- # -*- encoding: utf-8 -*-
import socket import socket
import sys, re import sys, re
@ -12,22 +12,22 @@ def stats(ip_crans=[], ip_ext=[],
upload_mini=0, show_limit=10, begin_time=24, end_time=0, upload_mini=0, show_limit=10, begin_time=24, end_time=0,
show_download=False,resolve_dns=True): show_download=False,resolve_dns=True):
""" """
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 machines Cr@ns 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
ip_ext : ips des machines extérieures ip_ext : ips des machines extérieures
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
show : liste des champs à afficher parmi : 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_time : date de départ 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) end_time : date de fin d'analyse (en heure avant maintenant)
show_download: trie par rapport au download plutôt que l'upload show_download: trie par rapport au download plutôt que l'upload
""" """
if type(ip_crans) == str: if type(ip_crans) == str:
@ -125,21 +125,21 @@ def stats(ip_crans=[], ip_ext=[],
results = curseur.fetchall() results = curseur.fetchall()
# on transforme tout en chaine # on transforme tout en chaine
results = [ [ str(x) for x in line ] for line in results ] results = [ [ str(x).decode("utf-8") for x in line ] for line in results ]
headers="" headers = u""
try: try:
upload = 0 upload = 0
download = 0 download = 0
for line in results: for line in results:
upload+=int(line[4]) upload += int(line[4])
download+=int(line[3]) download += int(line[3])
headers+=" upload: %sMo\n" % (upload/1024/1024) headers += u" upload: %sMo\n" % (upload/1024/1024)
headers+=" download: %sMo\n" % (download/1024/1024) headers += u" download: %sMo\n" % (download/1024/1024)
except IndexError: except IndexError:
pass pass
# on modifie les ip en noms de machine et les ports en noms # on modifie les ip en noms de machine et les ports en noms
def nom_de_machine (ip) : def nom_de_machine(ip):
if not resolve_dns: return ip if not resolve_dns: return ip
try: try:
return socket.gethostbyaddr(ip)[0] return socket.gethostbyaddr(ip)[0]
@ -151,7 +151,7 @@ def stats(ip_crans=[], ip_ext=[],
x.strip().replace('/tcp','').replace('/udp',''))[:2] x.strip().replace('/tcp','').replace('/udp',''))[:2]
for x in open('/etc/services').readlines() for x in open('/etc/services').readlines()
if x[0] not in ['\n','#']]: 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':
@ -201,23 +201,23 @@ if __name__ == '__main__' :
usage: analyse.py [option]... usage: analyse.py [option]...
Option fait partie des options suivantes : Option fait partie des options suivantes :
-d ou --show-download -d ou --show-download
trier par download plutôt que par upload trier par download plutôt que par upload
--ip-crans [ip] --ip-crans [ip]
ip de la machine crans ip de la machine crans
--ip-ext [ip] --ip-ext [ip]
ip de la machine extérieure ip de la machine extérieure
--show [champ] --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 [n Mo] --upload-mini [n Mo]
upload mini des lignes à afficher upload mini des lignes à afficher
--show-limit [n] --show-limit [n]
nombre maximum de lignes à afficher nombre maximum de lignes à afficher
--begin-time [n heures] --begin-time [n heures]
heure de départ de l'analyse (en heures depuis maintenant) heure de départ de l'analyse (en heures depuis maintenant)
--end-time [n heures] --end-time [n heures]
heure de fin de l'analyse (en heures depuis maintenant) heure de fin de l'analyse (en heures depuis maintenant)
-n -n
Ne pas résoudre les adresses ip Ne pas résoudre les adresses ip
Exemple : Exemple :
sudo /usr/scripts/surveillance/analyse.py bilou.crans.org""" sudo /usr/scripts/surveillance/analyse.py bilou.crans.org"""
@ -250,9 +250,9 @@ Exemple :
if key == '-d' or key == '--show-download': if key == '-d' or key == '--show-download':
show_download = True show_download = True
if show_download: if show_download:
headers+=u"Statistiques de download\n" headers += u"Statistiques de download\n"
else: else:
headers+=u"Statistiques d'upload\n" headers += u"Statistiques d'upload\n"
# recherche de la machine crans # recherche de la machine crans
############################### ###############################
@ -264,15 +264,15 @@ Exemple :
ip_crans.append(socket.gethostbyaddr(value)[2][0]) ip_crans.append(socket.gethostbyaddr(value)[2][0])
ip_crans_nom.append(socket.gethostbyaddr(value)[0]) ip_crans_nom.append(socket.gethostbyaddr(value)[0])
except socket.gaierror : except socket.gaierror :
print "Hôte %s inconnu" % value print "Hôte %s inconnu" % value
sys.exit(5) sys.exit(5)
except socket.herror: except socket.herror:
print "Hôte %s inconnu" % value print "Hôte %s inconnu" % value
ip_crans.append(value) ip_crans.append(value)
if len(ip_crans_nom)==1: if len(ip_crans_nom)==1:
headers+=u' depuis la machine %s\n' % ip_crans_nom[0] headers += u' depuis la machine %s\n' % ip_crans_nom[0]
elif ip_crans_nom: elif ip_crans_nom:
headers+=u' depuis les machines %s\n' % ', '.join(ip_crans_nom) headers += u' depuis les machines %s\n' % ', '.join(ip_crans_nom)
# recherche de la machine ext # recherche de la machine ext
############################# #############################
@ -280,13 +280,13 @@ Exemple :
ip_ext_nom = [] ip_ext_nom = []
for key,value in opts : for key,value in opts :
if key == '--ip-ext' : if key == '--ip-ext' :
# recherche de l'ip de la machine extérieur # recherche de l'ip de la machine extérieur
try: try:
ip_ext.append(socket.gethostbyaddr(value)[2][0]) ip_ext.append(socket.gethostbyaddr(value)[2][0])
except socket.herror: except socket.herror:
ip_ext.append(value) ip_ext.append(value)
except socket.gaierror : except socket.gaierror :
print "Hôte %s inconnu" % value print "Hôte %s inconnu" % value
sys.exit(5) sys.exit(5)
# recherche du nom d'hote # recherche du nom d'hote
@ -297,9 +297,9 @@ Exemple :
except socket.gaierror : except socket.gaierror :
ip_ext_nom.append(ip_ext[-1]) ip_ext_nom.append(ip_ext[-1])
if len(ip_ext_nom)==1: if len(ip_ext_nom)==1:
headers+=u' vers la machine extérieure %s\n' % ip_ext_nom[0] headers += u' vers la machine extérieure %s\n' % ip_ext_nom[0]
elif ip_ext_nom: elif ip_ext_nom:
headers+=u' vers les machines extérieures %s\n' % ', '.join(ip_ext_nom) headers += u' vers les machines extérieures %s\n' % ', '.join(ip_ext_nom)
# limite d'affichage # limite d'affichage
#################### ####################
@ -309,9 +309,9 @@ Exemple :
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 :
headers+=u' affichage de %s\n' % ', '.join(show) headers += u' affichage de %s\n' % ', '.join(show)
# upload mini à afficher # upload mini à afficher
######################## ########################
upload_mini = 0 upload_mini = 0
for key,value in opts : for key,value in opts :
@ -319,11 +319,11 @@ Exemple :
try : try :
upload_mini = int(value) upload_mini = int(value)
except : except :
print 'L\'upload mini doit être un entier (en MO)' print 'L\'upload mini doit être un entier (en MO)'
sys.exit(4) sys.exit(4)
break break
if upload_mini: if upload_mini:
headers+=u' pour les traffics supérieurs à %d Mo\n' % upload_mini headers += u' pour les traffics supérieurs à %d Mo\n' % upload_mini
# nombre limite d'enregristrements # nombre limite d'enregristrements
################################## ##################################
@ -332,17 +332,17 @@ Exemple :
if key == '--show-limit' : if key == '--show-limit' :
try : try :
limit = int(value) limit = int(value)
headers+=u' affichage des %d premiers résultats\n' % limit headers += u' affichage des %d premiers résultats\n' % limit
except : except :
print 'Le nombre limite n\'est pas un entier' print 'Le nombre limite n\'est pas un entier'
sys.exit(3) sys.exit(3)
break break
# Résolution dns # Résolution dns
################ ################
resolve_dns = '-n' not in [key for (key,value) in opts] resolve_dns = '-n' not in [key for (key,value) in opts]
# début de l'analyse # début de l'analyse
#################### ####################
begin_time = 24 begin_time = 24
for key,value in opts : for key,value in opts :
@ -350,7 +350,7 @@ Exemple :
try : try :
begin_time = int(value) begin_time = int(value)
except : except :
print 'Le nombre d\'heures doit être un entier' print 'Le nombre d\'heures doit être un entier'
sys.exit(4) sys.exit(4)
break break
@ -362,28 +362,28 @@ Exemple :
try : try :
end_time = int(value) end_time = int(value)
except : except :
print 'Le nombre d\'heures doit être un entier' print 'Le nombre d\'heures doit être un entier'
sys.exit(4) sys.exit(4)
break break
if begin_time != 24 or end_time: if begin_time != 24 or end_time:
headers+=u' entre il y a %d heure(s) et il y a %d heure(s)\n' % (begin_time,end_time) headers += u' entre il y a %d heure(s) et il y a %d heure(s)\n' % (begin_time,end_time)
# fichier de sortie # fichier de sortie
################### ###################
file=None file = None
for key,value in opts : for key,value in opts :
if key == '--file' : if key == '--file' :
file = value file = value
# affichage du résultat # affichage du résultat
####################### #######################
if not file: out = stats(ip_crans, ip_ext, show, upload_mini, limit, begin_time,
print headers + stats(ip_crans, ip_ext, show, upload_mini, limit, begin_time,
end_time, show_download,resolve_dns) end_time, show_download,resolve_dns)
out = headers + out
if not file:
print out.encode("utf-8")
else: else:
with open(file, 'w') as f: with open(file, 'w') as f:
f.write(headers.encode('utf-8')) f.write(out.encode('utf-8'))
f.write(stats(ip_crans, ip_ext, show, upload_mini, limit, begin_time,
end_time, show_download,resolve_dns))