[draft] script alerte fin de connexion (glissante)
This commit is contained in:
parent
4800bdb555
commit
cd04584618
1 changed files with 66 additions and 0 deletions
66
gestion/mail/fin_connexion.py
Executable file
66
gestion/mail/fin_connexion.py
Executable file
|
@ -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]
|
Loading…
Add table
Add a link
Reference in a new issue