319 lines
11 KiB
Python
Executable file
319 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
|
|
|
|
# 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')
|
|
|
|
###############################
|
|
# Ouverture des connections : #
|
|
###############################
|
|
|
|
pgsql = PgSQL.connect(host='/var/run/postgresql', database='filtrage', user='crans')
|
|
curseur = pgsql.cursor()
|
|
mail = smtplib.SMTP('localhost')
|
|
|
|
# Probablement à mettre ailleurs
|
|
def gethostname(s):
|
|
try:
|
|
return socket.gethostbyaddr(s)[0]
|
|
except:
|
|
return s
|
|
|
|
###########################
|
|
# 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 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(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 IP in serveurs_ips:
|
|
hostname = socket.gethostbyaddr(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(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:
|
|
try:
|
|
hostname = socket.gethostbyaddr("%s" % IP)[0]
|
|
except socket.herror:
|
|
continue
|
|
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 = socket.gethostbyaddr(IP)[0]
|
|
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 = socket.gethostbyaddr(IP)[0]
|
|
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 = socket.gethostbyaddr(IP)[0]
|
|
# 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>
|
|
|
|
*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': 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)
|