[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:
parent
ed855e941f
commit
9e78235eff
1 changed files with 114 additions and 59 deletions
|
@ -6,29 +6,36 @@ import sys, re
|
||||||
from pyPgSQL import PgSQL
|
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:
|
||||||
ip_crans = [ip_crans]
|
ip_crans = [ip_crans]
|
||||||
|
|
||||||
if type(ip_ext) == str:
|
if type(ip_ext) == str:
|
||||||
ip_ext = [ip_ext]
|
ip_ext = [ip_ext]
|
||||||
|
|
||||||
# variables pour la requete et l'affichage
|
# 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 = []
|
titre = []
|
||||||
format = []
|
format = []
|
||||||
alignement = []
|
alignement = []
|
||||||
|
|
||||||
if 'ip_crans' in show and len(ip_crans)!=1:
|
if 'ip_crans' in show and len(ip_crans)!=1:
|
||||||
select.append('ip_crans')
|
select.append('ip_crans')
|
||||||
largeur.append(13)
|
largeur.append(13)
|
||||||
titre.append('machine crans')
|
titre.append('machine crans')
|
||||||
format.append('s')
|
format.append('s')
|
||||||
alignement.append('c')
|
alignement.append('c')
|
||||||
|
|
||||||
if 'ip_ext' in show :
|
if 'ip_ext' in show :
|
||||||
select.append('ip_ext')
|
select.append('ip_ext')
|
||||||
largeur.append('*')
|
largeur.append('*')
|
||||||
titre.append('machine ext')
|
titre.append('machine ext')
|
||||||
format.append('s')
|
format.append('s')
|
||||||
alignement.append('c')
|
alignement.append('c')
|
||||||
|
|
||||||
if 'port_ext' in show :
|
if 'port_ext' in show :
|
||||||
select.append('port_ext')
|
select.append('port_ext')
|
||||||
largeur.append(10)
|
largeur.append(10)
|
||||||
titre.append('port ext')
|
titre.append('port ext')
|
||||||
format.append('s')
|
format.append('s')
|
||||||
alignement.append('d')
|
alignement.append('d')
|
||||||
|
|
||||||
if 'port_crans' in show :
|
if 'port_crans' in show :
|
||||||
select.append('port_crans')
|
select.append('port_crans')
|
||||||
largeur.append(10)
|
largeur.append(10)
|
||||||
titre.append('port crans')
|
titre.append('port crans')
|
||||||
format.append('s')
|
format.append('s')
|
||||||
alignement.append('d')
|
alignement.append('d')
|
||||||
|
|
||||||
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,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 ])
|
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()
|
||||||
curseur.execute(requete)
|
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]
|
return socket.gethostbyaddr(ip)[0]
|
||||||
except:
|
except:
|
||||||
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
|
||||||
ip de la machine crans
|
trier par download plutôt que par upload
|
||||||
--ip-ext
|
--ip-crans [ip]
|
||||||
ip de la machine extérieure
|
ip de la machine crans
|
||||||
--show
|
--ip-ext [ip]
|
||||||
champs à afficher (parmi ip_crans, ip_ext, port_crans, port_ext)
|
ip de la machine extérieure
|
||||||
--upload-mini
|
--show [champ]
|
||||||
upload mini des lignes à afficher
|
champs à afficher (parmi ip_crans, ip_ext, port_crans, port_ext)
|
||||||
--show-limit
|
--upload-mini [n Mo]
|
||||||
nombre maximum de lignes à afficher
|
upload mini des lignes à afficher
|
||||||
--begin-time
|
--show-limit [n]
|
||||||
heure de départ de l'analyse (en heure depuis maintenant)
|
nombre maximum de lignes à afficher
|
||||||
--end-time
|
--begin-time [n heures]
|
||||||
heure de fin de l'analyse (en heure depuis maintenant)
|
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"""
|
sudo /usr/scripts/surveillance/analyse.py bilou.crans.org"""
|
||||||
|
|
||||||
# import des modules
|
# import des modules
|
||||||
|
@ -150,13 +190,25 @@ 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)
|
||||||
|
|
||||||
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
|
# recherche de la machine crans
|
||||||
###############################
|
###############################
|
||||||
ip_crans = []
|
ip_crans = []
|
||||||
|
@ -173,7 +225,7 @@ Exemples :
|
||||||
print ' depuis la machine %s' % ip_crans_nom[0]
|
print ' depuis la machine %s' % ip_crans_nom[0]
|
||||||
elif ip_crans_nom:
|
elif ip_crans_nom:
|
||||||
print ' depuis les machines %s' % ', '.join(ip_crans_nom)
|
print ' depuis les machines %s' % ', '.join(ip_crans_nom)
|
||||||
|
|
||||||
# recherche de la machine ext
|
# recherche de la machine ext
|
||||||
#############################
|
#############################
|
||||||
ip_ext = []
|
ip_ext = []
|
||||||
|
@ -188,7 +240,7 @@ Exemples :
|
||||||
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
|
||||||
try :
|
try :
|
||||||
ip_ext_nom.append(socket.gethostbyaddr(value)[0])
|
ip_ext_nom.append(socket.gethostbyaddr(value)[0])
|
||||||
|
@ -203,12 +255,14 @@ 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 :
|
||||||
print ' affichage de %s' % ', '.join(show)
|
print ' affichage de %s' % ', '.join(show)
|
||||||
|
|
||||||
# upload mini à afficher
|
# upload mini à afficher
|
||||||
########################
|
########################
|
||||||
upload_mini = 0
|
upload_mini = 0
|
||||||
|
@ -247,7 +301,7 @@ Exemples :
|
||||||
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
|
||||||
|
|
||||||
# fin de l'analyse
|
# fin de l'analyse
|
||||||
##################
|
##################
|
||||||
end_time = 0
|
end_time = 0
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue