scripts/surveillance/statistiques.py
salles e2b1d0e07a Mail plus compact regroupant les utilisations de P2P avec en gras ceux qui
sont au moment du mail sanctionn.
La limite  droite est celle au moment du mail, si elle change entre le
moment d'une santion et d'un mail il peut y avoir une incohrence (??)

On tient compte dans la requte sql de l'ip mais aussi du protocole
utilise, une machine utilisant plusieurs protocoles sera assure donc
d'apparatre avec les deux flux distincts dans le rcapitulatif (il n'y a
pas de sanctions croises pour le moment)

darcs-hash:20060311000319-72cb0-6594868619e8497a46de722f029b6ef23c1e6dd3.gz
2006-03-11 01:03:19 +01:00

282 lines
9.9 KiB
Python
Executable file

#! /usr/bin/env python
# -*- encoding: iso-8859-15 -*-
"""
Script d'envoi des statistiques des déconnections et du traffic de la journée à disconnect@
Copyright (C) Xavier Pessoles - Étienne Chové
Licence : GPLv2
"""
###########################
# Import des commmandes : #
###########################
import commands
import sys
from pyPgSQL import PgSQL
sys.path.append('/usr/scripts/gestion')
sys.path.append('/usr/scripts/surveillance')
import config
import smtplib
import socket
import time, random, md5
from analyse import stats
from affich_tools import tableau_ng
from ldap_crans import crans
###############################
# Ouverture des connections : #
###############################
pgsql = PgSQL.connect(host='/var/run/postgresql', database='filtrage', user='crans')
curseur = pgsql.cursor()
mail = smtplib.SMTP('localhost')
###########################
# Statistiques d'upload : #
###########################
# Y a-t-il eu des récidivistes
# Liste des uploads :
#####################
requete = "SELECT ip_crans,sum(upload) as somme,sum(download) FROM upload WHERE ip_crans IN (SELECT ip_crans FROM avertis_upload where hard='1' or soft='1') and date > timestamp 'now' - interval '1 day' GROUP BY ip_crans ORDER BY somme DESC"
curseur.execute(requete)
liste_upload = tableau_ng( data = [ [l[1], l[2], socket.gethostbyaddr(str(l[0]))[0]] for l in curseur.fetchall() ],
titre = ['upload','download','machine'],
largeur = [10, 10, 30],
format = ['o','o','s'],
alignement = ['d','d','c']).encode('iso-8859-15')
# Traffic exempté :
###################
requete = "SELECT ip_crans,sum(upload) AS somme , sum(download) FROM upload WHERE ip_crans IN ( SELECT ip_crans from exemptes) and date > timestamp 'now' - interval '1 day' GROUP BY ip_crans ORDER BY somme DESC"
curseur.execute(requete)
liste_exemptes = tableau_ng( data = [ [l[1],l[2],socket.gethostbyaddr(str(l[0]))[0] ] for l in curseur.fetchall() ],
titre = ['upload','download','machine'],
largeur = [10, 10, 30],
format = ['o','o','s'],
alignement = ['d','d','c']).encode('iso-8859-15')
# Upload des serveurs :
#######################
liste_serveurs = []
for i in (10,1,3,4,7,8,9,11):
IP='138.231.136.%d' % i
hostname = socket.gethostbyaddr("%s"%IP)[0]
requete = "SELECT sum(upload),sum(download) FROM upload WHERE ip_crans='%s' AND date > timestamp 'now' - interval '1 day' "%IP
curseur.execute(requete)
traffic=curseur.fetchone()
if traffic == [None, None] :
continue
liste_serveurs.append([traffic[0],traffic[1],hostname])
liste_serveurs = tableau_ng( data = liste_serveurs,
titre = ['upload','download','serveur'],
largeur = [10, 10, 30],
format = ['o','o','s'],
alignement = ['d','d','c']).encode('iso-8859-15')
# statistiques des gros uploads depuis les serveurs
###################################################
gros_uploads_des_serveurs = stats (ip_crans=[x.ip() for x in crans().machines() if x.nom() not in [u'sila.crans.org']],show=['ip_crans','ip_ext'],upload_mini=50,show_limit=100).encode('iso-8859-15')
############################
# Statistiques virus/p2p : #
############################
# Machines actuellement déconnectées :
######################################
requete = "SELECT DISTINCT ip_crans FROM avertis_virus"
curseur.execute(requete)
infections = [ x[0] for x in curseur.fetchall() ]
liste_virus=[]
for IP in infections:
try:
hostname = socket.gethostbyaddr("%s"%IP)[0]
except socket.herror:
continue
liste_virus.append(["%s"%(str(hostname))])
liste_virus = tableau_ng(liste_virus, titre=['machine'], largeur=[30]).encode('iso-8859-15')
# Machines ayant fait des attaques virus dans la journée :
##########################################################
requete = "SELECT * FROM (SELECT ip_src,count(ip_src) as compteur FROM virus WHERE date > timestamp 'now' - interval '1 day' group by ip_src order by compteur desc) AS tous WHERE tous.compteur>'%s' limit 30" % config.virus.virus
curseur.execute(requete)
liste_virus2 = []
for IP, compteur in curseur.fetchall():
hostname = socket.gethostbyaddr(IP)[0]
liste_virus2.append([hostname,compteur])
liste_virus2 = tableau_ng( data = liste_virus2,
titre = ['machine','nombre'],
largeur = [30, 12],
alignement = ['c','d'] ).encode('iso-8859-15')
# Machines ayant fait de attaques flood dans la journée :
#########################################################
requete = "SELECT * FROM (SELECT ip_src,count(ip_src) as compteur FROM flood WHERE date > timestamp 'now' - interval '1 day' group by ip_src order by compteur desc) AS tous WHERE tous.compteur>'%s' limit 30" % config.virus.flood
curseur.execute(requete)
liste_virus3 = []
for IP, compteur in curseur.fetchall():
hostname = socket.gethostbyaddr(IP)[0]
liste_virus3.append([hostname,compteur])
liste_virus3 = tableau_ng( data = liste_virus3,
titre = ['machine','nombre'],
largeur = [30, 12],
alignement = ['c','d'] ).encode('iso-8859-15')
# Machines ayant utilisé des protocoles P2P dans la journée :
#############################################################
requete = "SELECT ip_src, nom, compteur, date FROM \
(SELECT ip_src,nom,count(ip_src) as compteur \
FROM p2p INNER JOIN protocole_p2p ON p2p.id_p2p=protocole_p2p.id_p2p \
WHERE p2p.date > timestamp 'now' - interval '1 day' \
GROUP BY ip_src,nom ORDER BY compteur desc) \
AS tous \
LEFT JOIN avertis_p2p ON ip_src=ip_crans \
WHERE tous.compteur>5 \
LIMIT 30"
curseur.execute(requete)
liste_p2p = []
for IP, protocole, compteur, blackliste in curseur.fetchall():
hostname = socket.gethostbyaddr(IP)[0]
if blackliste :
liste_p2p.append(['*%s*'%hostname, '*%s*'%protocole, '*%d*'%compteur, '*%d*'%config.p2p.limite[protocole]])
else:
liste_p2p.append([hostname, protocole, compteur, config.p2p.limite[protocole]])
liste_p2p = tableau_ng( data = liste_p2p,
titre = ['machine','protocole','nombre','limite'],
largeur = [32, 14, 10, 8],
alignement = ['c','c','d','d'] ).encode('iso-8859-15')
#############
# Message : #
#############
expediteur = "disconnect@crans.org"
destinataire = "disconnect@crans.org"
message="""From: %(From)s
To: %(To)s
Subject: Statistiques des dernières 24h
Message-Id: <%(uuid)s1@crans.org>
*Machines actuellement déconnectées pour virus*
%(liste_virus)s
*Machines ayant commis des attaques virales dans la journée*
%(liste_virus2)s
*Machines ayant commis des attaques virales de type flood dans la journée*
%(liste_virus3)s
*Machines ayant utilisé des protocoles P2P durant la journée*
%(liste_p2p)s
*Statistiques de traffic des adhérents* (tout le traffic)
%(liste_upload)s
*Statistiques de traffic des adhérents exemptés* (juste le traffic exempté)
%(liste_exemptes)s
*Statistiques de traffic des serveurs*
%(liste_serveurs)s
*Gros uploads des serveurs* (sila est exempté totalement)
%(gros_uploads_des_serveurs)s
--
statistiques.py
"""
uuid = md5.md5(str(long(time.time() * 1000)) +
str(long(random.random()*100000000000000000L))).hexdigest()
corps = message %{'From':expediteur,
'To':destinataire,
'uuid':uuid,
'liste_upload':liste_upload,
'liste_p2p_bl':liste_p2p_bl,
'liste_p2p':liste_p2p,
'liste_virus':liste_virus,
'liste_virus2':liste_virus2,
'liste_virus3':liste_virus3,
'liste_exemptes':liste_exemptes,
'liste_serveurs':liste_serveurs,
'gros_uploads_des_serveurs':gros_uploads_des_serveurs}
mail.sendmail('disconnect@crans.org','disconnect@crans.org',corps)
###
# On remplace le CA par un script
###
# Pas propre.
for l in gros_uploads_des_serveurs.split('\n')[2:]:
l2 = l.split('|')
if float(l2[4].strip()[:-2]) > 200:
# question de Florian
message = """From: Florian Dumas <fdumas@crans.org>
To: disconnect@crans.org
Subject: Re: Statistiques des dernières 24h
Message-Id: <%(uuid)s2@crans.org>
References: <%(uuid)s1@crans.org>
In-Reply-To: <%(uuid)s1@crans.org>
Disconnect nous disait :
> |machine crans| machine ext | download | upload |
> |-------------+------------------------------------------+----------+----------|
> %(corps)s
C'est normal ?
--
Florian
""" % { 'corps': l, 'uuid': uuid }
#mail.sendmail('disconnect@crans.org','disconnect@crans.org',message)
# réponse de Vincent
ip_crans = socket.gethostbyname(l2[1].strip()+'.crans.org')
ip_ext = socket.gethostbyname(l2[2].strip())
raison = stats (ip_crans=[ip_crans], ip_ext=[ip_ext], show=['ip_ext','port_crans','port_ext'], upload_mini=10, show_limit=10).encode('iso8859-15')
message = """From: Vincent Bernat <bernat@crans.org>
To: disconnect@crans.org
Subject: Re: Re: Statistiques des dernières 24h
Message-Id: <%(uuid)s3@crans.org>
References: <%(uuid)s1@crans.org> <%(uuid)s2@crans.org>
In-Reply-To: <%(uuid)s2@crans.org>
Florian Dumas nous disait:
> Disconnect nous disait :
> > |machine crans| machine ext | download | upload |
> > |-------------+------------------------------------------+----------+----------|
> > %(corps)s
>
> C'est normal ?
A toi de voir...
%(raison)s
--
Vince
""" % {'corps': l, 'raison': raison, 'uuid': uuid}
#mail.sendmail('disconnect@crans.org','disconnect@crans.org',message)