Commit cd045846 authored by Daniel Stan's avatar Daniel Stan

[draft] script alerte fin de connexion (glissante)

parent 4800bdb5
#!/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]
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment