diff --git a/gestion/mail/template/deconnex_ra/From/fr b/gestion/mail/template/deconnex_ra/From/fr new file mode 100644 index 00000000..26f7a28b --- /dev/null +++ b/gestion/mail/template/deconnex_ra/From/fr @@ -0,0 +1 @@ +Les nounous du Crans diff --git a/gestion/mail/template/deconnex_ra/README b/gestion/mail/template/deconnex_ra/README new file mode 100644 index 00000000..f9a30aa8 --- /dev/null +++ b/gestion/mail/template/deconnex_ra/README @@ -0,0 +1 @@ +Envoyé à l'adhérent lorsque son impression est terminée diff --git a/gestion/mail/template/deconnex_ra/Subject/fr b/gestion/mail/template/deconnex_ra/Subject/fr new file mode 100644 index 00000000..3e81cc46 --- /dev/null +++ b/gestion/mail/template/deconnex_ra/Subject/fr @@ -0,0 +1 @@ +[Crans] Deconnexion pour router advertisement diff --git a/gestion/mail/template/deconnex_ra/To/fr b/gestion/mail/template/deconnex_ra/To/fr new file mode 100644 index 00000000..38476730 --- /dev/null +++ b/gestion/mail/template/deconnex_ra/To/fr @@ -0,0 +1 @@ +{{To}} diff --git a/gestion/mail/template/deconnex_ra/X-Mailer/fr b/gestion/mail/template/deconnex_ra/X-Mailer/fr new file mode 100644 index 00000000..f5d9c869 --- /dev/null +++ b/gestion/mail/template/deconnex_ra/X-Mailer/fr @@ -0,0 +1 @@ +{{ mailer }} diff --git a/gestion/mail/template/deconnex_ra/body/fr b/gestion/mail/template/deconnex_ra/body/fr new file mode 100644 index 00000000..ed168e82 --- /dev/null +++ b/gestion/mail/template/deconnex_ra/body/fr @@ -0,0 +1,14 @@ +Bonjour {{tname}}, + +La machine {{mach}} dont tu es le propriétaire a été déconnectée du réseau. + +La raison de cette déconnexion est technique : le comportement de la machine est anormal. +Celle-ci émet des annonces signalant aux autres machines qu'elle peut gérer leur connexion +internet. Ceci est normalement réservé au routeur du réseau. Cela en compromet donc la +stabilité, et peut impacter les autres utilisateurs. + +Pour plus d'information, tu peux nous contacter via diconnect@crans.org. + + +-- +Les membres actifs de l'association diff --git a/surveillance/ra2.py b/surveillance/ra2.py new file mode 100755 index 00000000..bc33e99a --- /dev/null +++ b/surveillance/ra2.py @@ -0,0 +1,96 @@ +#!/bin/bash /usr/scripts/python.sh +# -*- coding: utf-8 -*- + +# Réecriture complète de ra.py +# On fait tourner ramond. Dès qu'une mac non autorisée fait une ra, +# ce script s'execute et pose une blackliste sur la machine. +# Prise en compte du nouveau binding. +# Envoie de mails au propriétaire et à disconnect +# Ecrit par Gabriel Détraz +# Avec l'aide importante de Pierre-elliot Becue + +import os +import sys +import time +import subprocess + +# On importe les scripts Crans +import lc_ldap.shortcuts +from cranslib import clogger +from gestion import mail +from utils.sendmail import actually_sendmail + +# On règle le nombre de RA admissibles par jour par machine: +TOL = 3 + +# Chemin du fichier des logs +LOGGER = clogger.CLogger('ra2', level='info') + +# On ouvre une connexion LDAP à la base admin/de test une fois pour toute. +CONN = lc_ldap.shortcuts.lc_ldap_admin() + +def ra_blacklist(Mac_ra): + thetime = time.strftime('%Y-%m-%d', time.localtime()) + + # Logs des macs capturées, avec la date + LOGGER.info("La mac %s fait des RA" % (Mac_ra,)) + + # On cherche la machine correspondante + machines = CONN.search(u'(macAddress=%s)' % Mac_ra,mode="rw") + + # On agit que si la machine est connu + if machines: + machine = machines[0] +# print machine + + p = subprocess.Popen(['grep','-c', thetime + '.*.' + Mac_ra, LOGGER.get_file_handler_path()],stdout=subprocess.PIPE) + stdout, stderr = p.communicate() +# print stdout + if int(stdout) <= TOL: + sys.exit(1) + + # Sécurité : on évite de poser une bl à un serveur + if isinstance(machine.proprio(), lc_ldap.objets.AssociationCrans): + sys.exit(1) + + # Cohérence : si il y a déjà un bl, on arrète + bl_actif = machine.blacklist_actif() + #print bl_actif + for blacklist in bl_actif: + #print x['type'] + if blacklist['type'] == 'ipv6_ra': + sys.exit(1) + + # On pose la blackliste sur la machine incriminée + machine.blacklist('ipv6_ra', u'auto ra.py : router advertisement', debut='now', fin='-') + machine.save() + send_mail(machine) + + # On envoie une notification à disconnect et à la personne : +def send_mail(machine): + adh = machine.proprio() + From = 'disconnect@crans.org' + To = adh.get_mail() + Cc = 'disconnect@crans.org' + name = adh.ldap_name + mach = unicode(machine['host'][0]) + if isinstance(adh, lc_ldap.objets.adherent): + tname = unicode(adh['prenom'][0]) + " " + unicode(adh['nom'][0]) + elif isinstance(adh, lc_ldap.objets.club): + tname = unicode(adh['nom'][0]) + mailtxt = mail.generate('deconnex_ra', { + 'To': To, + 'From': From, + 'tname': tname, + 'mach': mach, + }) + + actually_sendmail(From, (To,Cc), mailtxt) + +## Si testing : +if __name__ == "__main__": + # On récupère la mac dans l'env : + Mac_ra = os.getenv('SOURCE_MAC') +# Mac_ra = sys.argv[1] +# print Mac_ra + ra_blacklist(Mac_ra)