Éclatement de config.py en plusieurs sous-module de config. L'API reste à peu près la même, il faut juste penser à import config.submodule avant d'utilisr config.submodule (confid.dns, config.upload par exemple)

Tous les autres fichiers modifiés le sont pour compatibilité avec ce changement.

Ce commit implique des commits du même genre dans l'intranet2, lc_ldap et bcfg2.
This commit is contained in:
Vincent Le Gallic 2013-03-26 16:24:31 +01:00
parent 51a3e7e858
commit 2ce185720e
19 changed files with 30 additions and 1142 deletions

View file

@ -4,7 +4,7 @@
"""
Script de déconnection automatique des machines du crans pour les raisons :
- upload
- p2p
- p2p (plus maintenant)
- flood
- virus
@ -20,7 +20,8 @@ import commands
import sys
import psycopg2
sys.path.append('/usr/scripts/gestion')
from config import upload, virus, p2p, NETs
from config import upload, virus, NETs
import config.mails.upload
import ipt
import smtplib
from ldap_crans import crans_ldap
@ -242,14 +243,14 @@ for elupload, eltype, elid in uploadeurs:
################################
mail = connectsmtp()
corps = upload.message_hard % {'from': upload.expediteur, 'to': proprio.email(), 'upload': elupload, 'proprio': proprio.Nom()}
corps = config.mails.upload.message_hard % {'from': upload.expediteur, 'to': proprio.email(), 'upload': elupload, 'proprio': proprio.Nom()}
corps = corps.encode('utf-8')
mail.sendmail(upload.expediteur, proprio.email(), corps)
# On envoie un mail à disconnect
################################
if upload.disconnect_mail_hard:
corps = upload.message_disconnect_hard % {'from': upload.expediteur, 'to': upload.expediteur, 'upload': elupload, 'proprio': proprio.Nom(), 'mdc': mdcf, 'chambre': proprio.chbre()}
corps = config.mails.upload.message_disconnect_hard % {'from': upload.expediteur, 'to': upload.expediteur, 'upload': elupload, 'proprio': proprio.Nom(), 'mdc': mdcf, 'chambre': proprio.chbre()}
corps = corps.encode('utf-8')
mail.sendmail(upload.expediteur, upload.expediteur, corps)
@ -266,7 +267,7 @@ for elupload, eltype, elid in uploadeurs:
+ "/usr/scripts/surveillance/fiche_deconnexion/generate.py --upload aid=%d" % int(proprio.id()))
# Envoi du mail à disconnect
corps = upload.message_disconnect_multi % {'from': upload.expediteur, 'to': upload.expediteur, 'nbdeco': nb_decos, 'proprio': proprio.Nom(), 'ps': fichier_ps}
corps = config.mails.upload.message_disconnect_multi % {'from': upload.expediteur, 'to': upload.expediteur, 'nbdeco': nb_decos, 'proprio': proprio.Nom(), 'ps': fichier_ps}
corps = corps.encode('utf-8')
mail.sendmail(upload.expediteur, upload.expediteur, corps)
@ -298,14 +299,14 @@ for elupload, eltype, elid in uploadeurs:
################################
mail = connectsmtp()
corps = upload.message_soft % {'from': upload.expediteur, 'to': proprio.email(), 'upload': elupload, 'proprio': proprio.Nom()}
corps = config.mails.upload.message_soft % {'from': upload.expediteur, 'to': proprio.email(), 'upload': elupload, 'proprio': proprio.Nom()}
corps = corps.encode('utf-8')
mail.sendmail(upload.expediteur, proprio.email(), corps)
# On envoie un mail à disconnect
################################
if upload.disconnect_mail_soft:
corps = upload.message_disconnect_soft % {'from': upload.expediteur, 'to': upload.expediteur, 'upload': elupload, 'proprio': proprio.Nom()}
corps = config.mails.upload.message_disconnect_soft % {'from': upload.expediteur, 'to': upload.expediteur, 'upload': elupload, 'proprio': proprio.Nom()}
corps = corps.encode('utf-8')
mail.sendmail(upload.expediteur, upload.expediteur, corps)
@ -458,148 +459,3 @@ for IP in infectes:
print "Suppression de %s des machines infectees, mais aucune blackliste"%hostname
requete = "DELETE FROM avertis_virus where ip_crans='%s'"%IP
curseur.execute(requete)
################################################################################
# Gestion du peer to peer #
################################################################################
# Dans la table p2p on sélectionne les ip_src qui appartiennent au réseau
requete = "SELECT ip_src,id_p2p,count(ip_src) FROM p2p WHERE %s AND date > timestamp 'now' - interval '2 hours' AND id_p2p != 1 GROUP BY ip_src,id_p2p ORDER BY ip_src" % ip_src_in_crans
curseur.execute(requete)
fraudeurs = curseur.fetchall()
# Récupération des fraudeurs pour ne pas les resanctionner
requete = "SELECT ip_crans,protocole FROM avertis_p2p WHERE date > timestamp 'now' - interval '3 hours'"
curseur.execute(requete)
avertisp2p = curseur.fetchall()
for ip, id_p2p, nombre in fraudeurs:
# On récupére le protocole de p2p :
requete = "SELECT nom FROM protocole_p2p WHERE id_p2p=%d" % id_p2p
curseur.execute(requete)
protocole = curseur.fetchall()[0][0]
# On ne prend pas en compte s'il est sous le seuil admis, ou
#s'il est averti
if nombre <= p2p.limite[protocole] or (ip, protocole) in avertisp2p:
continue
# Récupération des ref de la machine
machines = ldap.search('ipHostNumber=%s' % ip, 'w' )['machine']
if len(machines) == 0:
# La machine a ete supprimee entre temps
continue
machine = machines[0]
hostname = machine.nom()
proprio = machine.proprietaire()
blacklist = proprio.blacklist()
if isinstance(machine, MachineFixe):
_, chambre = reperage_chambre(machine.mac())
else:
chambre = 'machine wifi'
# Envoi du mail à disconnect
mail = connectsmtp()
if p2p.disconnect_mail:
requete = "select date from p2p where date > timestamp 'now' - interval '2 hours' and ip_src='%s' order by date limit 1"%ip
curseur.execute(requete)
date = curseur.fetchall()[0][0]
corps = p2p.avertissement % { 'From': upload.expediteur,
'To': upload.expediteur,
'protocole': protocole,
'hostname': hostname,
'nb_paquets': nombre,
'datedebut': date,
'chambre': chambre,
}
corps = corps.encode('utf-8')
mail.sendmail(upload.expediteur, upload.expediteur, corps)
# Inscription dans la base des avertis
requete = "INSERT INTO avertis_p2p (ip_crans,date,protocole) VALUES ('%s','now','%s')" % (ip, protocole)
curseur.execute(requete)
# On envoie un mail a l'adhérent
################################
corps = p2p.deconnexion % { 'From': p2p.expediteur,
'To': proprio.email(),
'protocole': protocole,
'hostname': hostname }
corps = corps.encode('utf-8')
mail.sendmail(p2p.expediteur, proprio.email(), corps)
# L'adhérent n'est pas encore blacklisté
fin = int(time()) + 24*3600
proprio.blacklist(['now', fin, 'autodisc_p2p', hostname])
proprio.save()
# Vérification du nombre de déconnexions
#########################################
nb_decos = len([ x for x in proprio.blacklist() if int(x.split('$')[0]) > time()-365*24*3600 and x.split('$')[2] == 'autodisc_p2p' ])
if nb_decos >= 3:
# Génération du fichier postscript
try:
fichier_ps = generate_ps('p2p', proprio, ldap)
except:
fichier_ps = ("ERREUR lors de la génération. Merci de regénérer manuellement la fiche avec la commande :\n"
+ "/usr/scripts/surveillance/fiche_deconnexion/generate.py --p2p aid=%d" % int(proprio.id()))
# Envoi du mail à disconnect
corps = p2p.message_disconnect_multi % { 'from': p2p.expediteur,
'to': p2p.expediteur,
'nbdeco': nb_decos,
'proprio':proprio.Nom(),
'ps': fichier_ps }
corps = corps.encode('utf-8')
mail.sendmail(p2p.expediteur, p2p.expediteur, corps)
################################################################################
# Gestion du bittorrent #
################################################################################
# Dans la table p2p on sélectionne les ip_src qui appartiennent au réseau
requete = "SELECT ip_src,count(ip_src) FROM p2p WHERE %s AND date > timestamp 'now' - interval '2 hours' AND id_p2p = 1 GROUP BY ip_src,id_p2p ORDER BY ip_src" % ip_src_in_crans
curseur.execute(requete)
fraudeurs = curseur.fetchall()
# Récupération des fraudeurs pour ne pas les avertir de nouveau
requete = "SELECT ip_crans,protocole FROM avertis_p2p WHERE date > timestamp 'now' - interval '14 days'"
curseur.execute(requete)
avertisp2p = curseur.fetchall()
for ip, nombre in fraudeurs:
# On récupére le protocole de p2p :
protocole = 'Bittorrent'
# On ne prend pas en compte s'il est sous le seuil admis, ou
#s'il est averti
if nombre <= p2p.limite[protocole] or (ip, protocole) in avertisp2p:
continue
# Récupération des ref de la machine
machines = ldap.search('ipHostNumber=%s' % ip, 'w' )['machine']
if len(machines) == 0:
# La machine a ete supprimee entre temps
continue
machine = machines[0]
hostname = machine.nom()
proprio = machine.proprietaire()
# On envoie un mail a l'adhérent
################################
mail = connectsmtp()
corps = p2p.avertissement_bt % { 'From': p2p.expediteur,
'To': proprio.email(),
'protocole': protocole,
'hostname': hostname }
corps = corps.encode('utf-8')
mail.sendmail(p2p.expediteur, proprio.email(), corps)
# Inscription dans la base des avertis
requete = "INSERT INTO avertis_p2p (ip_crans,date,protocole) VALUES ('%s','now','%s')" % (ip, protocole)
curseur.execute(requete)