scripts/surveillance/statistiques.py
chove a3aea36608 petite correction, dans la premire requete, on exclu pas les exemptions
darcs-hash:20051221121327-4ec08-467ad99d15b8942efc99077ef275ec84dd92780d.gz
2005-12-21 13:13:27 +01:00

222 lines
7.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
from analyse import stats
from affich_tools import tableau_ng
###############################
# 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
###################################################
# liste des seveur à controler :
# - nom du serveur
# - adresse IP
# - upload mini critique
# - nombre max de lignes à afficher
serveurs = [['Zamok','138.231.136.1',30,20],
['Rouge','138.231.136.3',30,20],
['Sila','138.231.136.10',1000,20]]
gros_uploads_des_serveurs = ""
for serveur in serveurs :
gros_uploads_des_serveurs += "*Gros upload depuis %s*\n\n" % serveur[0]
gros_uploads_des_serveurs += stats(ip_crans=serveur[1],group=['ip_ext'],upload_mini=serveur[2],limit=serveur[3]).encode('iso-8859-15')
gros_uploads_des_serveurs += "\n\n"
############################
# Statistiques virus/p2p : #
############################
# Machines actuekkement 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 utilisant des protocoles P2P :
#########################################
requete = "SELECT ip_crans,protocole FROM avertis_p2p WHERE date>timestamp 'now' - interval '1 day'"
curseur.execute(requete)
liste_p2p = []
for IP, protocole in curseur.fetchall():
hostname = socket.gethostbyaddr(IP)[0]
requete = "SELECT COUNT(ip_src) from p2p where date > timestamp 'now' - interval '1 day' and ip_src='%s'"%IP
curseur.execute(requete)
paquets=curseur.fetchone()[0]
liste_p2p.append([protocole,hostname,str(paquets)])
liste_p2p = tableau_ng( data = liste_p2p,
titre = ['protocole','machine','nombre'],
largeur = [12, 30, 8],
alignement = ['g','c','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
*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 utilisant des protocoles P2P* (Nb de paquets par 24 heures)
/Le seuil actuel est de %(seuil)d paquets par 24 heures./
%(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)s
--
statistiques.py
"""
corps = message %{'From':expediteur,
'To':destinataire,
'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,
'seuil':config.p2p.tag}
mail.sendmail('disconnect@crans.org','disconnect@crans.org',corps)