
La generation du corps du mail est trop longue, et si la connexion (tcp) est ouverte trop tot, quand le corps est pret, la socket est deja refermee par un timeout. On ouvre la connexion plus tard, juste avant de l'utiliser. darcs-hash:20080116112655-c67a9-fc9993cbe695b91a601de515494b4d877200d4b5.gz
331 lines
11 KiB
Python
Executable file
331 lines
11 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
|
|
from ldap_crans import AssociationCrans
|
|
|
|
# Fonction retournant l'hote quand c'est possible
|
|
def gethostname(s):
|
|
try:
|
|
return socket.gethostbyaddr(s)[0]
|
|
except:
|
|
return s
|
|
|
|
# Liste des IP des serveurs
|
|
serveurs_ips = (
|
|
'138.231.136.10', '138.231.136.1', '138.231.136.3', '138.231.136.4',
|
|
'138.231.136.7', '138.231.136.8', '138.231.136.9', '138.231.136.11',
|
|
'138.231.136.101', '138.231.136.98', '138.231.136.102' )
|
|
|
|
###############################
|
|
# Ouverture des connections : #
|
|
###############################
|
|
|
|
pgsql = PgSQL.connect(host='/var/run/postgresql', database='filtrage', user='crans')
|
|
curseur = pgsql.cursor()
|
|
|
|
###########################
|
|
# 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
|
|
date > timestamp 'now' - interval '1 day'
|
|
AND NOT EXISTS (
|
|
SELECT 1
|
|
FROM exemptes
|
|
WHERE
|
|
upload.ip_crans <<= exemptes.ip_crans
|
|
AND upload.ip_ext <<= exemptes.ip_dest
|
|
)
|
|
GROUP BY ip_crans
|
|
ORDER BY somme DESC"""
|
|
curseur.execute(requete)
|
|
liste_upload = tableau(data = [ (l[1], l[2], gethostname(str(l[0])))
|
|
for l in curseur.fetchall()
|
|
if int(l[1]) > 100*1024*1024
|
|
and str(l[0]) not in serveurs_ips ],
|
|
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
|
|
date > timestamp 'now' - interval '1 day'
|
|
AND EXISTS (
|
|
SELECT 1
|
|
FROM exemptes
|
|
WHERE
|
|
upload.ip_crans = exemptes.ip_crans
|
|
AND upload.ip_ext <<= exemptes.ip_dest
|
|
)
|
|
GROUP BY ip_crans
|
|
ORDER BY somme DESC"""
|
|
curseur.execute(requete)
|
|
liste_exemptes = tableau(data = [ [l[1], l[2], gethostname(str(l[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 IP in serveurs_ips:
|
|
hostname = gethostname(IP)
|
|
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(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 AssociationCrans().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:
|
|
hostname = gethostname(IP)
|
|
liste_virus.append(["%s" % (str(hostname))])
|
|
|
|
liste_virus = tableau(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 = gethostname(IP)
|
|
liste_virus2.append([hostname, compteur])
|
|
liste_virus2 = tableau(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 = gethostname(IP)
|
|
liste_virus3.append([hostname, compteur])
|
|
liste_virus3 = tableau(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, max(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) \
|
|
AS tous \
|
|
LEFT JOIN \
|
|
(SELECT * FROM avertis_p2p \
|
|
WHERE date > timestamp 'now' - interval '1 day')\
|
|
AS avertis \
|
|
ON ip_src=ip_crans \
|
|
WHERE tous.compteur>5 \
|
|
GROUP BY ip_src, nom, compteur \
|
|
ORDER BY 3 DESC"
|
|
curseur.execute(requete)
|
|
liste_p2p = []
|
|
for IP, protocole, compteur, blackliste in curseur.fetchall():
|
|
hostname = gethostname(IP)
|
|
# Le champ blackliste contient la date du blacklistage si il a eu lieu
|
|
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(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>
|
|
|
|
*Gros uploads des serveurs* (sila est exempté totalement)
|
|
|
|
%(gros_uploads_des_serveurs)s
|
|
|
|
*Statistiques de traffic des serveurs*
|
|
|
|
%(liste_serveurs)s
|
|
|
|
*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.py
|
|
"""
|
|
|
|
uuid = md5.md5(str(long(time.time() * 1000)) +
|
|
str(long(random.random()*100000000000000000L))).hexdigest()
|
|
corps = message % { 'From': expediteur,
|
|
'To': destinataire,
|
|
'uuid': uuid,
|
|
'gros_uploads_des_serveurs': gros_uploads_des_serveurs,
|
|
'liste_serveurs': liste_serveurs,
|
|
'liste_upload': liste_upload,
|
|
'liste_p2p': liste_p2p,
|
|
'liste_virus': liste_virus,
|
|
'liste_virus2': liste_virus2,
|
|
'liste_virus3': liste_virus3,
|
|
'liste_exemptes': liste_exemptes
|
|
}
|
|
|
|
mail = smtplib.SMTP('localhost')
|
|
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)
|