#! /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 Licence : ???? """ ########################### # Import des commmandes : # ########################### import commands import sys from pyPgSQL import PgSQL sys.path.append('/usr/scripts/gestion') import config import smtplib import socket from analyse import stats ###################### # Fonctions à la con # ###################### def humanise (nombre): """ Transforme un nombre en k,M,G """ if nombre > 0.8 * 1024**3 : return str(round(nombre/1024**3,1))+'G' if nombre > 0.8 * 1024**2 : return str(round(nombre/1024**2,1))+'M' if nombre > 0.8 * 1024 : return str(round(nombre/1024,1))+'k' return str(round(nombre,1)) ############################### # Ouverture des connections : # ############################### pgsql = PgSQL.connect(host='/var/run/postgresql', database='filtrage', user='crans') curseur = pgsql.cursor() mail = smtplib.SMTP('localhost') ########################### # Statistiques d'upload : # ########################### # Adhérents avertis : ##################### 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" curseur.execute(requete) hard = curseur.fetchall() liste_upload = '| upload | download | machine |\n' liste_upload += '|----------|----------|------------------------------|\n' for IP,upload,download in hard: hostname = socket.gethostbyaddr("%s"%IP)[0] liste_upload += '| %7so | %7so | %28s |\n' % (humanise(upload),humanise(download),hostname) # Upload exemptés : ################### 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" curseur.execute(requete) exemptes = curseur.fetchall() liste_exemptes = '| upload | download | machine |\n' liste_exemptes += '|----------|----------|------------------------------|\n' for IP,upload,download in exemptes: if upload < config.upload.soft : continue hostname = socket.gethostbyaddr("%s"%IP)[0] liste_exemptes += '| %7so | %7so | %28s |\n' % (humanise(upload),humanise(download),hostname) # Upload des serveurs : ####################### liste_serveurs = '| upload | download | machine |\n' liste_serveurs += '|----------|----------|------------------------------|\n' 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 += '| %7so | %7so | %28s |\n' % (humanise(traffic[0]),humanise(traffic[1]),str(hostname)) # 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 infecté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+="%s\n"%(str(hostname)) # 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 = '|protocole | machine | nombre |\n' liste_p2p += '|----------|------------------------------|----------|\n' 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 += '| %8s | %28s | %8s |\n' % (protocole,hostname,str(paquets)) ############# # Message : # ############# expediteur = "disconnect@crans.org" destinataire = "disconnect@crans.org" message="""From: %(From)s To: %(To)s Subject: Statistiques des dernières 24h *Machines infectées pour virus* %(liste_virus)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* (exemptions non comptés) %(liste_upload)s *Statistiques de traffic des adhérents exemptés* (tout compris) %(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_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)