231 lines
7.7 KiB
Python
Executable file
231 lines
7.7 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
|
|
Licence : ????
|
|
"""
|
|
|
|
###########################
|
|
# 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
|
|
|
|
######################
|
|
# 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 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')
|
|
|
|
|
|
# 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 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 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.append(["%s\n"%(str(hostname))])
|
|
|
|
liste_virus = tableau_ng(liste_virus, titre=['machine'], largeur=[30]).encode('iso-8859-15')
|
|
|
|
requete = "SELECT ip_src,count(ip_src) as compteur FROM virus group by ip_src order by compteur desc"
|
|
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 = ['g','c'] ).encode('iso-8859-15')
|
|
|
|
requete = "SELECT ip_src,count(ip_src) as compteur FROM flood group by ip_src order by compteur desc"
|
|
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 = ['g','c'] ).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 déconnectées pour virus*
|
|
|
|
%(liste_virus)s
|
|
|
|
*Machines ayant commis des attaques virales*
|
|
|
|
%(liste_virus2)s
|
|
|
|
*Machines ayant commis des attaques virales de type flood*
|
|
|
|
%(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* (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_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)
|