Pour viter toute confusion future, on stocke les dates de blacklist en

nombre de secondes coules depuis Epoch.

darcs-hash:20060326040112-68412-f01c2b7b858e2b5ece65beac8b7943ad7919724c.gz
This commit is contained in:
glondu 2006-03-26 06:01:12 +02:00
parent 65b6a8768d
commit 22fc2f1c0a
3 changed files with 134 additions and 97 deletions

View file

@ -16,7 +16,6 @@ import ldap, ldap.modlist
import config, annuaires, iptools, chgpass, user_tests, cPickle
from chgpass import chgpass
from affich_tools import coul, prompt
from time import sleep, localtime
date_format = '%d/%m/%Y %H:%M'
hostname = gethostname().split(".")[0]
@ -158,18 +157,16 @@ def is_actif(sanction):
Retourne True ou False suivant si la sanction fournie (chaîne
venant de blacklist) est active ou non
"""
bl = sanction.split(',')
try:
now = time.time()
debut = time.mktime( time.strptime(bl[0], date_format) )
if bl[1] == '-':
fin = now + 1
else:
fin = time.mktime( time.strptime(bl[1], date_format) )
return debut < now and fin > now
except:
return False
bl = sanction.split('$')
now = time.time()
debut = int(bl[0])
if bl[1] == '-':
fin = now + 1
else:
fin = int(bl[1])
return debut < now and fin > now
def format_mac(mac):
"""
Formatage des adresses mac
@ -323,7 +320,7 @@ class crans_ldap:
sys.stderr.write("ERREUR : serveur LDAP injoignable\n")
sys.exit(1)
else:
sleep(0.3)
time.sleep(0.3)
def exist(self, arg):
"""
@ -620,7 +617,7 @@ class crans_ldap:
# considéré non ok s'il n'a pas fourni sa carte d'etudiant
# alors que l'on est desormais en periode de bloquage
# définifif (cf config.py).
if localtime()[1] == 9:
if time.localtime()[1] == 9:
# Pour septembre paiement année précédente ok
el = "(|(paiement=%d)(paiement=%d))" % (ann_scol, ann_scol-1)
else:
@ -792,9 +789,11 @@ class crans_ldap:
__machines = ()
def all_machines(self, graphic=False):
"""Renvoie toutes les machines autorisées.
"""
Renvoie toutes les machines autorisées.
Cela affiche des trucs et des bidules si graphic est à True."""
Cela affiche des trucs et des bidules si graphic est à True.
"""
if graphic: from affich_tools import anim, cprint, OK
if not self.__machines:
# Récolte des données
@ -843,23 +842,26 @@ class base_classes_crans(crans_ldap):
def blacklist_actif(self):
"""
Vérifie si l'instance courante est blacklistée.
Retourne les sanctions en cours (liste)
Retourne une liste vide si aucune sanction en cours
Retourne les sanctions en cours (liste).
Retourne une liste vide si aucune sanction en cours.
"""
return self.blacklist_all()[0].keys()
def blacklist_all(self):
"""
Vérifie si l'instance courante est blacklistée ou a été blacklistée.
Retourne les sanctions en cours sous forme de dictionnaire avec comme clef
la sanction et comme valeur une liste de couple de dates correspondant aux
Vérifie si l'instance courante est blacklistée ou a été
blacklistée. Retourne les sanctions en cours sous la forme
d'un couple de deux dictionnaires (l'un pour les sanctions
actives, l'autre pour les inactive), chacun ayant comme
clef la sanction et comme valeur une liste de couple de
dates (en secondes depuis epoch) correspondant aux
différentes périodes de sanctions.
ex: { 'upload' : (('17/11/2004 00:00','20/11/2004 00:00'), ('...', '...')) }
ex: {'upload': [(1143336210, 1143509010), ...]}
"""
bl_liste = self._data.get('blacklist', [])
if 'machineWifi' in self._data['objectClass'] or 'machineFixe' in self._data['objectClass']:
if isinstance(self, Machine):
# Il faut aussi regarder la blackliste du propriétaire
p = self.proprietaire()
bl_liste += p.blacklist()
@ -868,44 +870,42 @@ class base_classes_crans(crans_ldap):
inactifs = {}
for sanction in bl_liste:
s = sanction.split(',')[2]
champs = sanction.split('$')
s = champs[2]
if is_actif(sanction):
if not s in actifs:
actifs[s] = []
actifs[s].append((sanction.split(',')[0],
sanction.split(',')[1]))
actifs.setdefault(s, []).append((champs[0], champs[1]))
else:
if not s in inactifs:
inactifs[s] = []
inactifs[s].append((sanction.split(',')[0],
sanction.split(',')[1]))
inactifs.setdefault(s, []).append((champs[0], champs[1]))
return (actifs, inactifs)
def blacklist(self, new=None):
"""
Blacklistage de la ou de toutes la machines du propriétaire
new est une liste de 4 termes:
[ debut_sanction, fin_sanction, sanction, commentaire ]
début et fin doivent être sous la forme donnée par date_format
pour un début ou fin immédiate mettre now
pour une fin indéterminée mettre '-'
pour modifier une entrée donner un tuple de deux termes :
( index dans blacklist à modifier, nouvelle liste )
l'index est celui obtenu dans la liste retournée par blacklist()
* new est une liste de 4 termes :
[debut_sanction, fin_sanction, sanction, commentaire]
* début et fin sont le nombre de secondes depuis epoch
* pour un début ou fin immédiate mettre now
* pour une fin indéterminée mettre '-'
Les données sont stockées dans la base sous la forme :
debut$fin$sanction$commentaire
Pour modifier une entrée donner un tuple de deux termes :
(index dans blacklist à modifier, nouvelle liste),
l'index étant celui dans la liste retournée par blacklist().
"""
if not self._data.has_key('blacklist'):
self._data['blacklist'] = []
liste = list(self._data['blacklist'])
if new == None: return map(decode, liste)
liste = self._data.setdefault('blacklist', [])[:]
if new == None:
return map(decode, liste)
if type(new) == tuple:
# Modif
# Modification
index = new[0]
new = new[1]
if new == '':
liste.pop(index)
# La ligne suivante est inutile, elle est laissée dans un souci de clarté
self._set('blacklist', liste)
# La liste n'a pas changé, mais son contenu, lui, a bien changé
self.modifs.setdefault('blacklist', None)
return liste
else:
index = -1
@ -913,55 +913,57 @@ class base_classes_crans(crans_ldap):
if type(new) != list or len(new) != 4:
raise TypeError
# Verif que les dates sont OK
if new[0] == 'now':
new[0] = time.strftime(date_format)
debut = 0
# Verification que les dates sont OK
if new[0] == 'now':
debut = new[0] = int(time.time())
else:
try: debut = int(time.mktime(time.strptime(new[0], date_format)))
try: debut = new[0] = int(new[0])
except: raise ValueError(u'Date de début blacklist invalide')
if new[1] == 'now':
new[1] = time.strftime(date_format)
fin = 0
elif new[1] != '-':
try: fin = int(time.mktime(time.strptime(new[1], date_format)))
except: raise ValueError(u'Date de fin blacklist invalide')
else:
if new[1] == 'now':
fin = new[1] = int(time.time())
elif new[1] == '-':
fin = -1
else:
try: fin = new[1] = int(new[1])
except: raise ValueError(u'Date de fin blacklist invalide')
if debut == fin:
raise ValueError(u'Dates de début et fin identiques')
raise ValueError(u'Dates de début et de fin identiques')
elif fin != -1 and debut > fin:
raise ValueError(u'Date de fin avant date de début')
# On prend en compte le fuseau horaire et on dépasse la fin
# de sanction d'1min pour être sur quelle périmé.
fin = fin+60-time.timezone
# On dépasse la fin de sanction d'1min pour être sûr qu'elle est périmée.
fin = fin + 60
new_c = ','.join(new)
new_c = '$'.join(map(str, new))
new_c = preattr(new_c)[1]
if index != -1:
liste[index] = new_c
touched = True
if index != -1:
if liste[index] == new_c:
touched = False
else:
liste[index] = new_c
else:
liste = liste + [ new_c ]
liste.append(new_c)
if self._data['blacklist'] != liste:
if touched:
# La ligne suivante est inutile, elle est laissée dans un souci de clarté
self._data['blacklist'] = liste
self.modifs.setdefault('blacklist_' + new[2], None)
if not hasattr(self, "_blacklist_restart"):
self._blacklist_restart = {}
if not self._blacklist_restart.has_key(new[2]):
self._blacklist_restart[new[2]] = [ debut, fin ]
else:
if debut not in self._blacklist_restart[new[2]]:
self._blacklist_restart[new[2]].append(debut)
if fin != -1 and fin not in self._blacklist_restart[new[2]]:
self._blacklist_restart[new[2]].append(fin)
restart = self._blacklist_restart.setdefault(new[2], [])
if debut not in restart:
restart.append(debut)
if fin != -1 and fin not in restart:
restart.append(fin)
return liste
def restore(self):
""" Restore les données à l'état initial """
""" Restore les données à l'état initial (ou pas) """
self._data = self._init_data.copy()
self.modifs = {}
@ -1079,7 +1081,7 @@ class base_classes_crans(crans_ldap):
liste_historique.append(ligne)
modif = ', '.join(liste_historique)
timestamp = localtime()
timestamp = time.localtime()
hist = "%s, %s" % ( time.strftime(date_format, timestamp), script_utilisateur )
# On loggue