diff --git a/gestion/mail/fin_connexion.py b/gestion/mail/fin_connexion.py new file mode 100755 index 00000000..38e8fd78 --- /dev/null +++ b/gestion/mail/fin_connexion.py @@ -0,0 +1,66 @@ +#!/bin/bash /usr/scripts/python.sh +# -*- coding: utf-8 -*- +# Draf de code pour alerter les adhérents de leur fin de connexion imminente +# Ce script devra aussi permettre d'alerter les cableurs sur les prochaines +# affluences en perm + +import sys +import pytz +import datetime + +from lc_ldap.shortcuts import lc_ldap_readonly +from lc_ldap.variables import base_dn +import ldap + +FORMAT_LDAP = '%Y%m%d%H%M%S%z' + +#: filtre ldap max(finConnexion) \in intervalle +# NB: finConnexion est un attribut ldap multivalué, et on s'intéresse ici +# à sa valeur max pour un adhérent. +# Les filtres ldap recherchent, de manière existentielle, une valeur valide. +# Ainsi, en notant F l'ensemble des valeurs : +# max(F) >= v <=> \exists x\in F x>= v <=> finConnexion>=v +# L'autre inégalité ( < ) est plus délicate : +# max(F) < v <=> \forall x\in F x < v <=> \not( \exists x\in F x >= v ) +# <=> \not( finConnexion>= v ) +filtre_tpl = u'(&(finConnexion>=%s)(!(finConnexion>=%s)))' + +try: + with open('/etc/timezone', 'r') as f: + tz = pytz.timezone(f.read().strip()) +except: + tz = pytz.UTC + +#: Périodicité du script (pour n'envoyer le mail qu'une fois) +periodicite = datetime.timedelta(days=7) + +#: Dans combien de temps la connexion aura-t-elle expiré ? +expire_delay = datetime.timedelta(days=21) + +c = lc_ldap_readonly() + +# Instant courant: on ne garde que le jour +to_erase = { 'second': 0, 'minute': 0, 'microsecond': 0, 'hour': 0, } +now = datetime.datetime.now(tz).replace(**to_erase) + +# Applique un delta, si spécifié +for arg in sys.argv[1:]: + if arg.startswith('+'): + now += datetime.timedelta(days=int(arg[1:])) +print "Nous serons le %s" % now + +fin = now + expire_delay +warn_debut = fin - periodicite + +filtre = filtre_tpl % tuple(d.strftime(FORMAT_LDAP) for d in [warn_debut, fin] ) + +# NB: on ne prend que les adhérents, d'où SCOPE_ONELEVEL +to_warn = c.search(filtre, scope=ldap.SCOPE_ONELEVEL, dn=base_dn) + + +print ("%d adhérents seront prévenu que leur connexion expire entre le %s " + \ + "et le %s") % (len(to_warn), warn_debut, fin) + +if "--list" in sys.argv: + for adh in to_warn: + print repr(adh) + ' ' + adh.dn.split(',', 1)[0]