Gnration des feuilles de dconnexion pour trop de p2p

+ petites corrections

darcs-hash:20060307145248-72cb0-4d70962d90f318e6572e09350eef1463d74dbcac.gz
This commit is contained in:
salles 2006-03-07 15:52:48 +01:00
parent 78ab350b53
commit 13a4688422

View file

@ -35,27 +35,59 @@ def machine_online(machine) :
""" """
Retourne True si la machine est connectée au réseau et False si elle ne l'est pas Retourne True si la machine est connectée au réseau et False si elle ne l'est pas
""" """
# les wifi sont toujours online # Les machines wifi sont toujours online
if machine.ipsec() : if machine.ipsec() :
return True return True
# arping pour les fixes # Arping pour les fixes
return not commands.getstatusoutput('/usr/sbin/arping -c 3 %s' % machine.mac())[0] return not commands.getstatusoutput('/usr/sbin/arping -c 3 %s' % machine.mac())[0]
def generate_ps(sanction, proprio) :
# Dossier de génération du ps
dossier = '/usr/scripts/surveillance/fiche_deconnexion'
# Base pour le nom du fichier
fichier = strftime('%Y-%m-%d-%H-%M') + '-%s-%s' % (sanction, proprio.Nom().lower().replace(' ','-'))
# Création du fichier tex
format_date = '%A %d %B %Y'
template = file('%s/deconnexion_%s.tex' % (dossier, sanction)).read()
template = template.replace('~prenom~',proprio.prenom().encode('iso8859-15'))
template = template.replace('~nom~',proprio.nom().encode('iso8859-15'))
template = template.replace('~chambre~',proprio.chbre().encode('iso8859-15'))
template = template.replace('~mail~',proprio.email().encode('iso8859-15'))
template = template.replace('~debut~',strftime(format_date,localtime()))
template = template.replace('~fin~',strftime(format_date,localtime(time()+14*86400)))
historique = [ bl.encode('iso-8859-15').split(',') for bl in proprio.blacklist() if bl.split(',')[2]=='autodisc_upload' ] # filtrage des autodisc
historique = [ (strftime('%A %d %B %Y',strptime(bl[0],'%d/%m/%Y %H:%M')), bl[-1].split(' ')[-2]) for bl in historique ] # transfomation en tupple (date, upload)
historique = [ '%s & %s & Mo'%(bl[0],bl[1]) for bl in historique ] # tranformation en ligne
historique = '\\\\\n'.join(historique) # assemblage des lignes
template = template.replace('~historique~', historique)
template = template.replace('~limitehard~', str(upload.hard))
template = template.replace('~nbadher~', str(len(ldap.search('paiement=ok')['adherent'])))
file('%s/%s.tex' % (dossier, fichier),'w').write(template)
# Compilation du fichier latex
commands.getstatusoutput('PATH="/bin:/usr/bin" cd %(dossier)s && latex %(base)s.tex && dvips %(base)s.dvi && rm -f %(base)s.dvi %(base)s.aux %(base)s.log %(base)s.tex'%{'dossier':dossier,'base':fichier})
return '%s/%s.ps' % (dossier, fichier)
# Variables utiles # Variables utiles
################## ##################
# création d'une chaine qui ressemble à : (ip_src<<=inet('138.231.136.0/21') or ip_src<<=inet('138.231.148.0/22')) # Création d'une chaine qui ressemble à :
# (ip_src<<=inet('138.231.136.0/21') or ip_src<<=inet('138.231.148.0/22'))
ip_src_in_crans = '(%s)' % ' or '.join([ "ip_src<<=inet('%s')" % net for net in NETs['all'] ]) ip_src_in_crans = '(%s)' % ' or '.join([ "ip_src<<=inet('%s')" % net for net in NETs['all'] ])
# Connections : # Connections :
############### ###############
# pgsql # Connection à la base sql via pgsql
pgsql = PgSQL.connect(host='/var/run/postgresql', database='filtrage', user='crans') pgsql = PgSQL.connect(host='/var/run/postgresql', database='filtrage', user='crans')
pgsql.autocommit = True pgsql.autocommit = True
curseur = pgsql.cursor() curseur = pgsql.cursor()
# smtp, assez capricieux # Le smtp est assez capricieux
for i in range(5): for i in range(5):
try: try:
mail = smtplib.SMTP('localhost') mail = smtplib.SMTP('localhost')
@ -185,10 +217,10 @@ for elupload, eltype, elid in uploadeurs:
############### ###############
debut = localtime(time()) debut = localtime(time())
fin = localtime(time()+60*60*24) fin = localtime(time()+60*60*24)
proprio.blacklist(["%d/%d/%d %d:%d" % (debut[2],debut[1],debut[0],debut[3],debut[4]),"%d/%d/%d %d:%d" % (fin[2],fin[1],fin[0],fin[3],fin[4]),'autodisc',"Déconn auto. %s Mo" % elupload]) proprio.blacklist(["%d/%d/%d %d:%d" % (debut[2],debut[1],debut[0],debut[3],debut[4]),"%d/%d/%d %d:%d" % (fin[2],fin[1],fin[0],fin[3],fin[4]),'autodisc_upload',"Déconn auto. %s Mo" % elupload])
proprio.save() proprio.save()
# On envoie un mail a l'adhérent # On envoie un mail à l'adhérent
################################ ################################
corps = upload.message_soft % {'from':upload.expediteur, 'to':proprio.email(), 'upload':elupload, 'proprio':proprio.Nom()} corps = upload.message_soft % {'from':upload.expediteur, 'to':proprio.email(), 'upload':elupload, 'proprio':proprio.Nom()}
corps = corps.encode('iso 8859-15') corps = corps.encode('iso 8859-15')
@ -201,41 +233,16 @@ for elupload, eltype, elid in uploadeurs:
corps = corps.encode('iso 8859-15') corps = corps.encode('iso 8859-15')
mail.sendmail(upload.expediteur,upload.expediteur,corps) mail.sendmail(upload.expediteur,upload.expediteur,corps)
# Vérification du nombre de déconnections # Vérification du nombre de déconnexions
######################################### #########################################
nb_decos = len([ x for x in proprio.blacklist() if mktime(strptime(x.split(',')[0],'%d/%m/%Y %H:%M')) > mktime(localtime())-30*24*60*60 and x.split(',')[2]=='autodisc' ]) nb_decos = len([ x for x in proprio.blacklist() if mktime(strptime(x.split(',')[0],'%d/%m/%Y %H:%M')) > mktime(localtime())-30*24*60*60 and x.split(',')[2]=='autodisc_upload' ])
if nb_decos >= 3: if nb_decos >= 3:
# dossier de génération du pdf # Génération du fichier postscript
dossier = '/usr/scripts/surveillance/fiche_deconnection/' fichier_ps = generate_ps('upload', proprio)
# base pour le dossier de destination
fichier = strftime('%Y-%m-%d-%H-%M') + '-' + proprio.Nom().lower().replace(' ','-')
# création du fichier tex # Envoi du mail à disconnect
format_date = '%A %d %B %Y' corps = upload.message_disconnect_multi % {'from':upload.expediteur, 'to':upload.expediteur, 'nbdeco':nb_decos, 'proprio':proprio.Nom(), 'ps':fichier_ps}
template = file(dossier + 'deconnexion_upload.tex').read()
template = template.replace('~prenom~',proprio.prenom().encode('iso8859-15'))
template = template.replace('~nom~',proprio.nom().encode('iso8859-15'))
template = template.replace('~chambre~',proprio.chbre().encode('iso8859-15'))
template = template.replace('~mail~',proprio.email().encode('iso8859-15'))
template = template.replace('~debut~',strftime(format_date,localtime()))
template = template.replace('~fin~',strftime(format_date,localtime(time()+14*86400)))
historique = [ bl.encode('iso-8859-15').split(',') for bl in proprio.blacklist() if bl.split(',')[2]=='autodisc' ] # filtrage des autodisc
historique = [ (strftime('%A %d %B %Y',strptime(bl[0],'%d/%m/%Y %H:%M')), bl[-1].split(' ')[-2]) for bl in historique ] # transfomation en tupple (date, upload)
historique = [ '%s & %s & Mo'%(bl[0],bl[1]) for bl in historique ] # tranformation en ligne
historique = '\\\\\n'.join(historique) # assemblage des lignes
template = template.replace('~historique~', historique)
template = template.replace('~limitehard~', str(upload.hard))
template = template.replace('~nbadher~', str(len(ldap.search('paiement=ok')['adherent'])))
file(dossier+fichier+'.tex','w').write(template)
# compilation
commands.getstatusoutput('PATH="/bin:/usr/bin" cd %(dossier)s && latex %(base)s.tex && dvips %(base)s.dvi && rm -f %(base)s.dvi %(base)s.aux %(base)s.log %(base)s.tex'%{'dossier':dossier,'base':fichier})
# envoie du mail à disconnect
corps = upload.message_disconnect_multi % {'from':upload.expediteur, 'to':upload.expediteur, 'nbdeco':nb_decos, 'proprio':proprio.Nom(), 'ps':dossier+fichier+'.ps'}
corps = corps.encode('iso 8859-15') corps = corps.encode('iso 8859-15')
mail.sendmail(upload.expediteur,upload.expediteur,corps) mail.sendmail(upload.expediteur,upload.expediteur,corps)
@ -263,7 +270,7 @@ for elupload, eltype, elid in uploadeurs:
################################################ ################################################
curseur.execute("INSERT INTO avertis_upload_soft (type,id,date) VALUES ('%s','%d','now')"%(eltype,elid)) curseur.execute("INSERT INTO avertis_upload_soft (type,id,date) VALUES ('%s','%d','now')"%(eltype,elid))
# On envoie un mail a l'adhérent # On envoie un mail à l'adhérent
################################ ################################
corps = upload.message_soft % {'from':upload.expediteur, 'to':proprio.email(), 'upload':elupload, 'proprio':proprio.Nom()} corps = upload.message_soft % {'from':upload.expediteur, 'to':proprio.email(), 'upload':elupload, 'proprio':proprio.Nom()}
corps = corps.encode('iso 8859-15') corps = corps.encode('iso 8859-15')
@ -284,44 +291,44 @@ curseur.execute("DELETE FROM avertis_upload_soft WHERE date < timestamp 'now' -
# Détection de l'existence de virus # # Détection de l'existence de virus #
################################################################################ ################################################################################
# Dans le table virus on sélectionne les ip_src qui appartiennent au reseau # Dans la table virus on sélectionne les ip_src qui appartiennent au réseau
requete = "SELECT ip_src,count(ip_src) FROM virus WHERE %s and date > timestamp 'now' - interval '1 hour' group by ip_src" % ip_src_in_crans requete = "SELECT ip_src,count(ip_src) FROM virus WHERE %s and date > timestamp 'now' - interval '1 hour' group by ip_src" % ip_src_in_crans
curseur.execute(requete) curseur.execute(requete)
infectes = curseur.fetchall() infectes = curseur.fetchall()
# Recuperation des infectes pour ne pas les reblacklister # Récupération des infectés pour ne pas les reblacklister
requete = "SELECT ip_crans FROM avertis_virus" requete = "SELECT ip_crans FROM avertis_virus"
curseur.execute(requete) curseur.execute(requete)
infectes_old = curseur.fetchall() infectes_old = curseur.fetchall()
for ip, nombre in infectes: for ip, nombre in infectes:
# si on est en dessous du seuil, on laisse passer # Si on est en dessous du seuil, on laisse passer
if nombre < virus.virus: if nombre < virus.virus:
continue continue
# si on est déja avertis, on laisse passer # Si on est déja avertis, on laisse passer
if [ip] in infectes_old: if [ip] in infectes_old:
continue continue
# lecture des infos de ldap # Lecture des infos de ldap
machine = ldap.search('ipHostNumber=%s' % ip,'w' )['machine'][0] machine = ldap.search('ipHostNumber=%s' % ip,'w' )['machine'][0]
hostname = machine.nom() hostname = machine.nom()
proprio = machine.proprietaire() proprio = machine.proprietaire()
blacklist = proprio.blacklist() blacklist = proprio.blacklist()
# inscription dans la table des infectes # Inscription dans la table des infectés
requete="INSERT INTO avertis_virus (ip_crans,date) VALUES ('%s','now')" % ip requete="INSERT INTO avertis_virus (ip_crans,date) VALUES ('%s','now')" % ip
curseur.execute(requete) curseur.execute(requete)
# on récupère les index des lignes de bl ou il y a marqué virus # On récupère les index des lignes de bl où il y a marqué virus
index = [blacklist.index(x) for x in blacklist if 'virus' in x ] index = [blacklist.index(x) for x in blacklist if 'virus' in x ]
if index : if index :
# adhérent déja blacklisté # L'adhérent est déjà blacklisté
proprio.blacklist(( index[0] , ['now','-','virus',hostname] )) proprio.blacklist(( index[0] , ['now','-','virus',hostname] ))
proprio.save() proprio.save()
else : else :
# adhérent non blacklisté # L'adhérent n'est pas encore blacklisté
proprio.blacklist(['now','-','virus',hostname]) proprio.blacklist(['now','-','virus',hostname])
proprio.save() proprio.save()
@ -329,40 +336,40 @@ for ip, nombre in infectes:
# Détection des virus qui floodent # # Détection des virus qui floodent #
################################################################################ ################################################################################
# Dans le table virus on sélectionne les ip_src qui appartiennent au reseau # Dans la table virus on sélectionne les ip_src qui appartiennent au réseau
requete = "SELECT ip_src,count(ip_src) FROM flood WHERE %s and date > timestamp 'now' - interval '1 hour' GROUP BY ip_src" % ip_src_in_crans requete = "SELECT ip_src,count(ip_src) FROM flood WHERE %s and date > timestamp 'now' - interval '1 hour' GROUP BY ip_src" % ip_src_in_crans
curseur.execute(requete) curseur.execute(requete)
infectes = curseur.fetchall() infectes = curseur.fetchall()
# Recuperation des infectes pour ne pas les reblacklister # Récupération des infectés pour ne pas les reblacklister
requete = "SELECT ip_crans FROM avertis_virus" requete = "SELECT ip_crans FROM avertis_virus"
curseur.execute(requete) curseur.execute(requete)
infectes_old = curseur.fetchall() infectes_old = curseur.fetchall()
for ip, nombre in infectes: for ip, nombre in infectes:
# si on est en dessous du seuil, ou qu'on est deja averti, on laisse passer # Si on est en dessous du seuil, ou qu'on est déjà averti, on laisse passer
if nombre < virus.flood or [ip] in infectes_old : if nombre < virus.flood or [ip] in infectes_old :
continue continue
# lecture des infos de ldap # Lecture des infos de ldap
machine = ldap.search('ipHostNumber=%s' % ip,'w' )['machine'][0] machine = ldap.search('ipHostNumber=%s' % ip,'w' )['machine'][0]
hostname = machine.nom() hostname = machine.nom()
proprio = machine.proprietaire() proprio = machine.proprietaire()
blacklist = proprio.blacklist() blacklist = proprio.blacklist()
# inscription dans la table des infectes # Inscription dans la table des infectés
requete="INSERT INTO avertis_virus (ip_crans,date) VALUES ('%s','now')" % ip requete="INSERT INTO avertis_virus (ip_crans,date) VALUES ('%s','now')" % ip
curseur.execute(requete) curseur.execute(requete)
# on récupère les index des lignes de bl ou il y a marqué virus # On récupère les index des lignes de bl où il y a marqué virus
index = [blacklist.index(x) for x in blacklist if 'virus' in x ] index = [blacklist.index(x) for x in blacklist if 'virus' in x ]
if index : if index :
# adhérent déja blacklisté # L'adhérent est déjà blacklisté
proprio.blacklist(( index[0] , ['now','-','virus',hostname] )) proprio.blacklist(( index[0] , ['now','-','virus',hostname] ))
proprio.save() proprio.save()
else : else :
# adhérent non blacklisté # L'adhérent n'est pas encore blacklisté
proprio.blacklist(['now','-','virus',hostname]) proprio.blacklist(['now','-','virus',hostname])
proprio.save() proprio.save()
@ -377,20 +384,20 @@ infectes = [ x[0] for x in curseur.fetchall() ]
for IP in infectes : for IP in infectes :
# Nombre de requets de virus # Nombre de requêtes de virus
requete1="SELECT COUNT(ip_src) FROM virus where ip_src='%s' and date > timestamp 'now' - interval '1 hour'" % IP requete1="SELECT COUNT(ip_src) FROM virus where ip_src='%s' and date > timestamp 'now' - interval '1 hour'" % IP
curseur.execute(requete1) curseur.execute(requete1)
nb_virus = curseur.fetchall() nb_virus = curseur.fetchall()
# Nombre de requetes de flood # Nombre de requêtes de flood
requete2="SELECT COUNT(ip_src) FROM flood where ip_src='%s' and date > timestamp 'now' - interval '1 hour'" % IP requete2="SELECT COUNT(ip_src) FROM flood where ip_src='%s' and date > timestamp 'now' - interval '1 hour'" % IP
curseur.execute(requete2) curseur.execute(requete2)
nb_flood = curseur.fetchall() nb_flood = curseur.fetchall()
# On traite que les IP qui sont descendues en dessous des seuils # On ne traite que les IP qui sont descendues en dessous des seuils
if nb_virus[0][0] < virus.virus and nb_flood[0][0] < virus.flood : if nb_virus[0][0] < virus.virus and nb_flood[0][0] < virus.flood :
machine = ldap.search('ipHostNumber=%s' % IP,'w' )['machine'][0] machine = ldap.search('ipHostNumber=%s' % IP,'w' )['machine'][0]
# si la machine est pas online, on reconnecte # Si la machine n'est pas online, on reconnecte
#if machine_online(machine) : #if machine_online(machine) :
proprio = machine.proprietaire() proprio = machine.proprietaire()
bl = proprio.blacklist() bl = proprio.blacklist()
@ -412,12 +419,12 @@ for IP in infectes :
# Gestion du peer to peer # # Gestion du peer to peer #
################################################################################ ################################################################################
# Dans le table p2p on sélectionne les ip_src qui appartiennent au reseau # 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 '1 day' GROUP BY ip_src,id_p2p ORDER BY ip_src" % ip_src_in_crans requete = "SELECT ip_src,id_p2p,count(ip_src) FROM p2p WHERE %s AND date > timestamp 'now' - interval '1 day' GROUP BY ip_src,id_p2p ORDER BY ip_src" % ip_src_in_crans
curseur.execute(requete) curseur.execute(requete)
fraudeurs = curseur.fetchall() fraudeurs = curseur.fetchall()
# Recuperation des fraudeurs pour ne pas les resanctionner # Récupération des fraudeurs pour ne pas les resanctionner
requete = "SELECT ip_crans,protocole FROM avertis_p2p WHERE date > timestamp 'now' - interval '1 day'" requete = "SELECT ip_crans,protocole FROM avertis_p2p WHERE date > timestamp 'now' - interval '1 day'"
curseur.execute(requete) curseur.execute(requete)
avertisp2p = curseur.fetchall() avertisp2p = curseur.fetchall()
@ -429,17 +436,18 @@ for ip, id_p2p, nombre in fraudeurs :
curseur.execute(requete) curseur.execute(requete)
protocole = curseur.fetchall()[0][0] protocole = curseur.fetchall()[0][0]
# On ne prend pas en compte s'il est sous le seuil admis, ou s'il est averti # On ne prend pas en compte s'il est sous le seuil admis, ou
#s'il est averti
if nombre <= p2p.tag or [ip, protocole] in avertisp2p : if nombre <= p2p.tag or [ip, protocole] in avertisp2p :
continue continue
# Recuperation des ref de la machine # Récupération des ref de la machine
machine = ldap.search('ipHostNumber=%s' % ip,'w' )['machine'][0] machine = ldap.search('ipHostNumber=%s' % ip,'w' )['machine'][0]
hostname = machine.nom() hostname = machine.nom()
proprio = machine.proprietaire() proprio = machine.proprietaire()
blacklist = proprio.blacklist() blacklist = proprio.blacklist()
# Envoie du mail à disconnect # Envoi du mail à disconnect
if p2p.disconnect_mail : if p2p.disconnect_mail :
requete="select date from p2p where date > timestamp 'now' - interval '1 day' and ip_src='%s' order by date limit 1"%ip requete="select date from p2p where date > timestamp 'now' - interval '1 day' and ip_src='%s' order by date limit 1"%ip
curseur.execute(requete) curseur.execute(requete)
@ -448,28 +456,36 @@ for ip, id_p2p, nombre in fraudeurs :
corps = corps.encode('iso 8859-15') corps = corps.encode('iso 8859-15')
mail.sendmail(upload.expediteur,upload.expediteur,corps) mail.sendmail(upload.expediteur,upload.expediteur,corps)
# inscription dans la base des avertis # Inscription dans la base des avertis
requete="INSERT INTO avertis_p2p (ip_crans,date,protocole) VALUES ('%s','now','%s')" % (ip, protocole) requete="INSERT INTO avertis_p2p (ip_crans,date,protocole) VALUES ('%s','now','%s')" % (ip, protocole)
curseur.execute(requete) curseur.execute(requete)
# On envoie un mail a l'adhérent # On envoie un mail a l'adhérent
################################ ################################
corps = p2p.deconnection % {'From':upload.expediteur, 'To':proprio.email(), 'protocole': protocole, 'hostname':hostname} corps = p2p.deconnexion % {'From':p2p.expediteur, 'To':proprio.email(), 'protocole': protocole, 'hostname':hostname}
corps = corps.encode('iso 8859-15') corps = corps.encode('iso 8859-15')
mail.sendmail(upload.expediteur,proprio.email(),corps) mail.sendmail(p2p.expediteur,proprio.email(),corps)
index = [blacklist.index(x) for x in blacklist if 'P2P' in x ] # Vérification du nombre de déconnexions
#########################################
nb_decos = len([ x for x in proprio.blacklist() if mktime(strptime(x.split(',')[0],'%d/%m/%Y %H:%M')) > mktime(localtime())-365*24*60*60 and x.split(',')[2]=='autodisc_p2p' ])
if nb_decos >= 3 :
fichier_ps = generate_ps('p2p', proprio)
# 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('iso 8859-15')
mail.sendmail(p2p.expediteur,p2p.expediteur,corps)
# On récupère les index des lignes de bl où il y a marqué autodisc_p2p
index = [blacklist.index(x) for x in blacklist if 'autodisc_p2p' in x ]
if index : if index :
# adhérent déja blacklisté # L'adhérent est déja blacklisté
fin = localtime(time()+60*60*24) fin = localtime(time()+60*60*24)
proprio.blacklist(( index[0] , ['now',"%d/%d/%d %d:%d" % (fin[2],fin[1],fin[0],fin[3],fin[4]),'p2p',hostname] )) proprio.blacklist(( index[0] , ['now',"%d/%d/%d %d:%d" % (fin[2],fin[1],fin[0],fin[3],fin[4]),'autodisc_p2p',hostname] ))
proprio.save() proprio.save()
else : else :
# adhérent non blacklisté # L'adhérent n'est pas encore blacklisté
fin = localtime(time()+60*60*24) fin = localtime(time()+60*60*24)
proprio.blacklist(['now',"%d/%d/%d %d:%d" % (fin[2],fin[1],fin[0],fin[3],fin[4]),'p2p',hostname]) proprio.blacklist(['now',"%d/%d/%d %d:%d" % (fin[2],fin[1],fin[0],fin[3],fin[4]),'autodisc_p2p',hostname])
proprio.save() proprio.save()