scripts/gestion/chambres_vides.py
Vincent Le Gallic 2ce185720e Éclatement de config.py en plusieurs sous-module de config. L'API reste à peu près la même, il faut juste penser à import config.submodule avant d'utilisr config.submodule (confid.dns, config.upload par exemple)
Tous les autres fichiers modifiés le sont pour compatibilité avec ce changement.

Ce commit implique des commits du même genre dans l'intranet2, lc_ldap et bcfg2.
2013-03-26 16:24:31 +01:00

92 lines
3.5 KiB
Python
Executable file

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# Codé par b2moo, commenté par 20-100, cr{itiqu|on}é par Nit
import datetime
import time
import re
import ldap_crans
conn = ldap_crans.CransLdap()
import sys
sendmails = False
if "--mail-all" in sys.argv:
sendmails = True
import email.Header
import os
import config
year = config.ann_scol
delai = config.demenagement_delai
import config.mails.demenagement
# On récupère ceux qui n'ont pas payé cette année
bad_boys_e_s = conn.search('chbre=????&paiement=%d&paiement!=%d' % (year-1,year))['adherent']
now = time.time()
to_print = []
for clandestin in bad_boys_e_s:
# On cherche la dernière fois qu'il s'est retrouvé en chambre ????
for l in clandestin.historique():
# On récupère la date du dernier changement de chambre
# (l'historique est enregistré par ordre chronologique)
x = re.match("(.*),.* : chbre \((.*) -> \?\?\?\?\)",l)
if x <> None:
kickout_date = x.group(1)
exchambre = x.group(2)
machine_liste = clandestin.machines()
# On lui accorde un délai
kickout_date = time.mktime(time.strptime(kickout_date, "%d/%m/%Y %H:%M"))
delta = now - kickout_date
ttl = delai*86400 - delta
if ttl > 0:
if sendmails and machine_liste != []:
# On lui envoie un mail pour le prévenir
to = clandestin.mail()
if not "@" in to:
to += "@crans.org"
mail = config.mails.demenagement.message_demenagement % {"from" : "respbats@crans.org",
"chambre" : exchambre,
"jours" : int(ttl/86400) + 1,
"to" : to}
mailer = os.popen("/usr/sbin/sendmail -t", "w")
mailer.write(mail.encode("utf-8") + "\n.")
mailer.close()
else:
for m in machine_liste:
# On n'a pas envie d'essayer de supprimer une machine qui a une blackliste
if len(m.blacklist_actif()) > 0:
continue
to_print.append( (clandestin.id(), m.ip(), m.id(), m.nom()) )
m2 = conn.search('mid=%s' % m.id(),mode='w')['machine'][0]
m2.delete('Adherent sans chambre valide depuis %d jours' % delai)
if to_print != []:
# Il s'est passé quelque chose, donc on envoie un mail
# On regarde le plus grand hostname
hostnamemaxsize = max([len(i[3]) for i in to_print])
template = u"| %%4s | %%-15s | %%4s | %%-%ss |\n" % (hostnamemaxsize)
message = u""
message += u"\nListe des machines supprimée pour chambre invalide depuis plus de %s jours :\n" % delai
tiret_line = u"+------+-----------------+------+-%s-+\n" % ("-" * hostnamemaxsize)
message += tiret_line
message += template % ("aid", " ip", "mid", (" " * (max((hostnamemaxsize-8)/2,0)) + "hostname"))
message += tiret_line
for aid, ip, mid, hostname in to_print:
message += template % (aid, ip, mid, hostname)
message += tiret_line
headers = u"From: respbats@crans.org\nSubject: %s\n" % email.Header.make_header([("Machines supprimées pour chambre invalide", "utf8")]).encode()
headers += u"Content-Type: text/plain; charset=UTF-8\n"
headers += u"To: respbats@crans.org\n"
mail = headers + "\n" + message
mailer = os.popen("/usr/sbin/sendmail -t", "w")
mailer.write(mail.encode("utf-8") + "\n.")
mailer.close()