Suite.
darcs-hash:20060319183602-68412-2d6a5d90ea6648879e95bc4f36a25250d5a561a0.gz
This commit is contained in:
parent
f9af7f43ae
commit
87e88a6443
1 changed files with 94 additions and 89 deletions
|
@ -27,16 +27,16 @@ random.seed() # On initialise le g
|
||||||
##################################################################################
|
##################################################################################
|
||||||
### paramètres de connaction à la base LDAP
|
### paramètres de connaction à la base LDAP
|
||||||
|
|
||||||
if __name__=='ldap_crans_test' or os.environ.get('crans_ldap','')=='test':
|
if __name__ == 'ldap_crans_test' or os.environ.get('crans_ldap', '') == 'test':
|
||||||
# Utilisation de la base de données de test (tests, séminaire...)
|
# Utilisation de la base de données de test (tests, séminaire...)
|
||||||
# Il faut au choix :
|
# Il faut au choix :
|
||||||
# - faire un import crans_ldap_test
|
# - faire un import crans_ldap_test
|
||||||
# ou - crans_ldap=test /le/script
|
# ou - crans_ldap=test /le/script
|
||||||
uri = ro_uri = 'ldap://egon.adm.crans.org/'
|
uri = ro_uri = 'ldap://egon.adm.crans.org/'
|
||||||
ldap_auth_dn='cn=admin,dc=crans,dc=org'
|
ldap_auth_dn = 'cn=admin,dc=crans,dc=org'
|
||||||
ldap_password='75bdb64f32'
|
ldap_password = '75bdb64f32'
|
||||||
|
|
||||||
elif user_tests.getuser()=='freerad':
|
elif user_tests.getuser() == 'freerad':
|
||||||
# Freeradius n'a pas accès au secret, donc accès que en local
|
# Freeradius n'a pas accès au secret, donc accès que en local
|
||||||
uri = ''
|
uri = ''
|
||||||
ro_uri = 'ldapi://%2fvar%2frun%2fldapi/'
|
ro_uri = 'ldapi://%2fvar%2frun%2fldapi/'
|
||||||
|
@ -50,28 +50,30 @@ else:
|
||||||
try:
|
try:
|
||||||
from secrets import ldap_password, ldap_auth_dn
|
from secrets import ldap_password, ldap_auth_dn
|
||||||
except:
|
except:
|
||||||
sys.stdout.write(coul('Warning : impossible de lire le fichier de secret !\n','jaune'))
|
sys.stdout.write(coul('Warning : impossible de lire le fichier de secret !\n', 'jaune'))
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
# uri pour les instances de crans_ldap faisant de la lecture seule
|
# uri pour les instances de crans_ldap faisant de la lecture seule
|
||||||
if os.path.exists('/var/run/ldapi') :
|
if os.path.exists('/var/run/ldapi'):
|
||||||
ro_uri = 'ldapi://%2fvar%2frun%2fldapi/'
|
ro_uri = 'ldapi://%2fvar%2frun%2fldapi/'
|
||||||
else :
|
else:
|
||||||
ro_uri = uri
|
ro_uri = uri
|
||||||
|
|
||||||
##################################################################################
|
##################################################################################
|
||||||
### Items de la blackliste
|
### Items de la blackliste
|
||||||
blacklist_items = { u'bloq' : u'Bloquage total de tous les services' ,
|
blacklist_items = { u'bloq' : u'Bloquage total de tous les services',
|
||||||
u'virus' : u'Bloquage sur squid',
|
u'virus' : u'Bloquage sur squid',
|
||||||
u'upload' : u'Bloquage total de l\'accès à l\'extérieur',
|
u'upload' : u"Bloquage total de l'accès à l'extérieur",
|
||||||
u'warez' : u'Bloquage sur squid',
|
u'warez' : u'Bloquage sur squid',
|
||||||
u'p2p' : u'Bloquage total de l\'accès à l\'extérieur',
|
u'p2p' : u"Bloquage total de l'accès à l'extérieur",
|
||||||
u'autodisc_upload' : u'Autodisconnect pour upload',
|
u'autodisc_upload' : u'Autodisconnect pour upload',
|
||||||
u'autodisc_p2p' : u'Autodisconnect pour P2P'}
|
u'autodisc_p2p' : u'Autodisconnect pour P2P' }
|
||||||
|
|
||||||
##################################################################################
|
##################################################################################
|
||||||
### Droits possibles
|
### Droits possibles
|
||||||
droits_possibles = [ u'Nounou', u'Apprenti', u'Modérateur', u'Câbleur', u'Déconnecteur', u'WebRadio' , u'Imprimeur', u'MultiMachines', u'Contrôleur' ]
|
droits_possibles = [ u'Nounou', u'Apprenti', u'Modérateur', u'Câbleur',
|
||||||
|
u'Déconnecteur', u'WebRadio', u'Imprimeur', u'MultiMachines',
|
||||||
|
u'Contrôleur' ]
|
||||||
|
|
||||||
##################################################################################
|
##################################################################################
|
||||||
### Variables internes diverses
|
### Variables internes diverses
|
||||||
|
@ -143,10 +145,10 @@ def preattr(val):
|
||||||
val = str(val).strip()
|
val = str(val).strip()
|
||||||
# On passe tout en utf-8 pour ne pas avoir de problèmes
|
# On passe tout en utf-8 pour ne pas avoir de problèmes
|
||||||
# d'accents dans la base
|
# d'accents dans la base
|
||||||
return [ len(val) , unicode(val,'iso-8859-1').encode('utf-8') ]
|
return [len(val), unicode(val,'iso-8859-1').encode('utf-8')]
|
||||||
elif t==unicode:
|
elif t==unicode:
|
||||||
val = val.strip()
|
val = val.strip()
|
||||||
return [ len(val) , val.encode('utf-8') ]
|
return [len(val), val.encode('utf-8')]
|
||||||
else:
|
else:
|
||||||
raise TypeError
|
raise TypeError
|
||||||
|
|
||||||
|
@ -176,23 +178,23 @@ def format_mac(mac):
|
||||||
Retourne la mac formatée.
|
Retourne la mac formatée.
|
||||||
"""
|
"""
|
||||||
l, mac = preattr(mac)
|
l, mac = preattr(mac)
|
||||||
mac = mac.strip().replace("-",":")
|
mac = mac.strip().replace("-", ":")
|
||||||
if mac.count(":") == 5:
|
if mac.count(":") == 5:
|
||||||
# On a une adresse de la forme 0:01:02:18:d1:90
|
# On a une adresse de la forme 0:01:02:18:d1:90
|
||||||
# On va compléter s'il manque des 0
|
# On va compléter s'il manque des 0
|
||||||
mac = ":".join(map(lambda x: x.replace(' ', '0'),
|
mac = ":".join(map(lambda x: x.replace(' ', '0'),
|
||||||
map(lambda x: "%02s" % x, mac.split(":"))))
|
map(lambda x: "%02s" % x, mac.split(":"))))
|
||||||
mac= mac.replace(':','').lower()
|
mac = mac.replace(':', '').lower()
|
||||||
if len(mac)!=12:
|
if len(mac) != 12:
|
||||||
raise ValueError(u'Longueur de l\'adresse mac incorrecte.')
|
raise ValueError(u"Longueur de l'adresse mac incorrecte.")
|
||||||
for c in mac[:]:
|
for c in mac[:]:
|
||||||
if c not in string.hexdigits:
|
if c not in string.hexdigits:
|
||||||
raise ValueError(u"Caractère interdit '%s' dans l\'adresse mac." % c)
|
raise ValueError(u"Caractère interdit '%s' dans l'adresse mac." % c)
|
||||||
if mac=='000000000000':
|
if mac == '000000000000':
|
||||||
raise ValueError(u"MAC nulle interdite\nIl doit être possible de modifier l'adresse de la carte.")
|
raise ValueError(u"MAC nulle interdite\nIl doit être possible de modifier l'adresse de la carte.")
|
||||||
|
|
||||||
# Formatage
|
# Formatage
|
||||||
mac="%s:%s:%s:%s:%s:%s" % ( mac[:2],mac[2:4],mac[4:6], mac[6:8], mac[8:10], mac[10:] )
|
mac = "%s:%s:%s:%s:%s:%s" % (mac[:2], mac[2:4], mac[4:6], mac[6:8], mac[8:10], mac[10:])
|
||||||
|
|
||||||
return mac
|
return mac
|
||||||
|
|
||||||
|
@ -201,36 +203,36 @@ def format_mac(mac):
|
||||||
|
|
||||||
class service:
|
class service:
|
||||||
""" Définit un service à redémarrer """
|
""" Définit un service à redémarrer """
|
||||||
def __init__(self,nom,args=[],start=[]):
|
def __init__(self, nom, args=[], start=[]):
|
||||||
"""
|
"""
|
||||||
Nom du service
|
Nom du service
|
||||||
Liste des arguments
|
Liste des arguments
|
||||||
Liste d'horaires de démarrages
|
Liste d'horaires de démarrages
|
||||||
"""
|
"""
|
||||||
|
|
||||||
self.nom=nom
|
self.nom = nom
|
||||||
self.args=args
|
self.args = args
|
||||||
self.start=map(int,start)
|
self.start = map(int, start)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
starting = self.start
|
starting = self.start
|
||||||
starting.sort()
|
starting.sort()
|
||||||
dates = ' et '.join(map(lambda t: t<time.time() and \
|
dates = ' et '.join(map(lambda t: t < time.time() and \
|
||||||
"maintenant" or time.strftime(date_format,
|
"maintenant" or time.strftime(date_format,
|
||||||
time.gmtime(t)),
|
time.gmtime(t)),
|
||||||
self.start))
|
self.start))
|
||||||
dates = " à partir d%s %s" % (dates.startswith("maintenant") and "e" or "u",
|
dates = " à partir d%s %s" % (dates.startswith("maintenant") and "e" or "u",
|
||||||
dates)
|
dates)
|
||||||
return ("%s(%s)%s" % (self.nom,
|
return ("%s(%s)%s" % (self.nom,
|
||||||
','.join(self.args),
|
','.join(self.args),
|
||||||
dates)).replace(" et maintenant","")
|
dates)).replace(" et maintenant", "")
|
||||||
|
|
||||||
class crans_ldap:
|
class crans_ldap:
|
||||||
"""
|
"""
|
||||||
Classe de connexion à la base LDAP du crans.
|
Classe de connexion à la base LDAP du crans.
|
||||||
"""
|
"""
|
||||||
conn=None
|
conn = None
|
||||||
base_dn='ou=data,dc=crans,dc=org'
|
base_dn = 'ou=data,dc=crans,dc=org'
|
||||||
base_lock = 'ou=lock,dc=crans,dc=org'
|
base_lock = 'ou=lock,dc=crans,dc=org'
|
||||||
base_services = 'ou=services,dc=crans,dc=org'
|
base_services = 'ou=services,dc=crans,dc=org'
|
||||||
|
|
||||||
|
@ -243,7 +245,7 @@ class crans_ldap:
|
||||||
'mac': 'macAddress',
|
'mac': 'macAddress',
|
||||||
'ip': 'ipHostNumber',
|
'ip': 'ipHostNumber',
|
||||||
'telephone': 'tel',
|
'telephone': 'tel',
|
||||||
'position': 'positionBorne'}
|
'position': 'positionBorne' }
|
||||||
|
|
||||||
# Les différentes classes LDAP de machines
|
# Les différentes classes LDAP de machines
|
||||||
ldap_machines_classes = ['machineFixe', 'machineWifi', 'machineCrans', 'borneWifi']
|
ldap_machines_classes = ['machineFixe', 'machineWifi', 'machineCrans', 'borneWifi']
|
||||||
|
@ -287,11 +289,14 @@ class crans_ldap:
|
||||||
search_champs[i] = auto_search_champs[i] + non_auto_search_champs[i]
|
search_champs[i] = auto_search_champs[i] + non_auto_search_champs[i]
|
||||||
|
|
||||||
# Profondeur des différentes recherches (scope)
|
# Profondeur des différentes recherches (scope)
|
||||||
scope = {'adherent': 1, 'club': 1,
|
scope = { 'adherent': 1,
|
||||||
'machineFixe': 2, 'machineWifi': 2,
|
'club': 1,
|
||||||
'machineCrans': 2, 'borneWifi': 2 }
|
'machineFixe': 2,
|
||||||
|
'machineWifi': 2,
|
||||||
|
'machineCrans': 2,
|
||||||
|
'borneWifi': 2 }
|
||||||
|
|
||||||
def __init__(self,readonly=False):
|
def __init__(self, readonly=False):
|
||||||
self.connect(readonly)
|
self.connect(readonly)
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
|
@ -300,7 +305,7 @@ class crans_ldap:
|
||||||
for lock in self._locks:
|
for lock in self._locks:
|
||||||
self.remove_lock(lock)
|
self.remove_lock(lock)
|
||||||
|
|
||||||
def connect(self,readonly=False):
|
def connect(self, readonly=False):
|
||||||
""" Initialisation la connexion vers le serveur LDAP """
|
""" Initialisation la connexion vers le serveur LDAP """
|
||||||
if readonly :
|
if readonly :
|
||||||
self.conn = ldap.initialize(ro_uri)
|
self.conn = ldap.initialize(ro_uri)
|
||||||
|
@ -310,7 +315,7 @@ class crans_ldap:
|
||||||
nbessais = 0
|
nbessais = 0
|
||||||
while True :
|
while True :
|
||||||
try:
|
try:
|
||||||
self.conn.bind_s(ldap_auth_dn,ldap_password,ldap.AUTH_SIMPLE)
|
self.conn.bind_s(ldap_auth_dn, ldap_password, ldap.AUTH_SIMPLE)
|
||||||
break
|
break
|
||||||
except ldap.SERVER_DOWN:
|
except ldap.SERVER_DOWN:
|
||||||
nbessais += 1
|
nbessais += 1
|
||||||
|
@ -320,7 +325,7 @@ class crans_ldap:
|
||||||
else:
|
else:
|
||||||
sleep(0.3)
|
sleep(0.3)
|
||||||
|
|
||||||
def exist(self,arg):
|
def exist(self, arg):
|
||||||
"""
|
"""
|
||||||
Vérifie l'existence d'une entrée dans la base et que cette
|
Vérifie l'existence d'une entrée dans la base et que cette
|
||||||
entrée n'appartient pas à l'objet en cours.
|
entrée n'appartient pas à l'objet en cours.
|
||||||
|
@ -334,10 +339,10 @@ class crans_ldap:
|
||||||
|
|
||||||
Exemple : exist('chbre=Z345') vérifie si il y a un adhérent en Z345
|
Exemple : exist('chbre=Z345') vérifie si il y a un adhérent en Z345
|
||||||
"""
|
"""
|
||||||
r=[]
|
r = []
|
||||||
|
|
||||||
# Premier test: dans les objets déjà inscrits
|
# Premier test: dans les objets déjà inscrits
|
||||||
ret = self.conn.search_s(self.base_dn,2,arg)
|
ret = self.conn.search_s(self.base_dn, 2, arg)
|
||||||
for res in ret:
|
for res in ret:
|
||||||
# C'est peut être l'objet courant
|
# C'est peut être l'objet courant
|
||||||
try: # Si ce n'est pas une classe fille avec l'attribut dn => erreur
|
try: # Si ce n'est pas une classe fille avec l'attribut dn => erreur
|
||||||
|
@ -348,8 +353,8 @@ class crans_ldap:
|
||||||
r.append(res[0])
|
r.append(res[0])
|
||||||
|
|
||||||
# Deuxième test : lock ?
|
# Deuxième test : lock ?
|
||||||
ret = self.conn.search_s(self.base_lock,1,arg)
|
ret = self.conn.search_s(self.base_lock, 1, arg)
|
||||||
lockid = '%s-%s' % (hostname, os.getpid() )
|
lockid = '%s-%s' % (hostname, os.getpid())
|
||||||
for res in ret:
|
for res in ret:
|
||||||
# Lock encore actif ?
|
# Lock encore actif ?
|
||||||
l = res[1]['lockid'][0]
|
l = res[1]['lockid'][0]
|
||||||
|
@ -357,7 +362,7 @@ class crans_ldap:
|
||||||
# C'est locké par un autre process que le notre
|
# C'est locké par un autre process que le notre
|
||||||
# il tourne encore ?
|
# il tourne encore ?
|
||||||
try:
|
try:
|
||||||
if l.split('-')[0] == hostname and os.system('ps %s > /dev/null 2>&1' % l.split('-')[1] ):
|
if l.split('-')[0] == hostname and os.system('ps %s > /dev/null 2>&1' % l.split('-')[1]):
|
||||||
# Il ne tourne plus
|
# Il ne tourne plus
|
||||||
self.remove_lock(res[0]) # delock
|
self.remove_lock(res[0]) # delock
|
||||||
continue
|
continue
|
||||||
|
@ -367,7 +372,7 @@ class crans_ldap:
|
||||||
|
|
||||||
return r
|
return r
|
||||||
|
|
||||||
def lock(self,item,valeur):
|
def lock(self, item, valeur):
|
||||||
"""
|
"""
|
||||||
Lock un item avec la valeur valeur, les items possibles
|
Lock un item avec la valeur valeur, les items possibles
|
||||||
peuvent être :
|
peuvent être :
|
||||||
|
@ -384,18 +389,18 @@ class crans_ldap:
|
||||||
# On le lock pas un truc vide
|
# On le lock pas un truc vide
|
||||||
return True
|
return True
|
||||||
|
|
||||||
lock_dn = '%s=%s,%s' % ( item, valeur, self.base_lock )
|
lock_dn = '%s=%s,%s' % (item, valeur, self.base_lock)
|
||||||
lockid = '%s-%s' % (hostname, os.getpid() )
|
lockid = '%s-%s' % (hostname, os.getpid())
|
||||||
modlist = ldap.modlist.addModlist({ 'objectClass' : 'lock' ,
|
modlist = ldap.modlist.addModlist({ 'objectClass': 'lock',
|
||||||
'lockid': lockid ,
|
'lockid': lockid,
|
||||||
item: valeur } )
|
item: valeur })
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.conn.add_s(lock_dn,modlist)
|
self.conn.add_s(lock_dn, modlist)
|
||||||
except ldap.ALREADY_EXISTS:
|
except ldap.ALREADY_EXISTS:
|
||||||
# Pas de chance, le lock est déja pris
|
# Pas de chance, le lock est déja pris
|
||||||
try:
|
try:
|
||||||
res = self.conn.search_s(lock_dn,2,'objectClass=lock')[0]
|
res = self.conn.search_s(lock_dn, 2, 'objectClass=lock')[0]
|
||||||
l = res[1]['lockid'][0]
|
l = res[1]['lockid'][0]
|
||||||
except: l = '%s-1' % hostname
|
except: l = '%s-1' % hostname
|
||||||
if l != lockid:
|
if l != lockid:
|
||||||
|
@ -404,7 +409,7 @@ class crans_ldap:
|
||||||
if l.split('-')[0] == hostname and os.system('ps %s > /dev/null 2>&1' % l.split('-')[1] ):
|
if l.split('-')[0] == hostname and os.system('ps %s > /dev/null 2>&1' % l.split('-')[1] ):
|
||||||
# Il ne tourne plus
|
# Il ne tourne plus
|
||||||
self.remove_lock(res[0]) # delock
|
self.remove_lock(res[0]) # delock
|
||||||
return self.lock(item,valeur) # relock
|
return self.lock(item, valeur) # relock
|
||||||
raise EnvironmentError(u'Objet (%s=%s) locké, patienter.' % (item, valeur), l)
|
raise EnvironmentError(u'Objet (%s=%s) locké, patienter.' % (item, valeur), l)
|
||||||
else:
|
else:
|
||||||
if not hasattr(self,'_locks'):
|
if not hasattr(self,'_locks'):
|
||||||
|
@ -412,13 +417,13 @@ class crans_ldap:
|
||||||
else:
|
else:
|
||||||
self._locks.append(lock_dn)
|
self._locks.append(lock_dn)
|
||||||
|
|
||||||
def remove_lock(self,lockdn):
|
def remove_lock(self, lockdn):
|
||||||
"""
|
"""
|
||||||
Destruction d'un lock
|
Destruction d'un lock
|
||||||
Destruction de tous les locks si lockdn=*
|
Destruction de tous les locks si lockdn=*
|
||||||
"""
|
"""
|
||||||
# Mettre des verifs ?
|
# Mettre des verifs ?
|
||||||
if lockdn!='*':
|
if lockdn != '*':
|
||||||
self.conn.delete_s(lockdn)
|
self.conn.delete_s(lockdn)
|
||||||
try:
|
try:
|
||||||
self._locks.remove(lockdn)
|
self._locks.remove(lockdn)
|
||||||
|
@ -434,7 +439,7 @@ class crans_ldap:
|
||||||
""" Liste les locks """
|
""" Liste les locks """
|
||||||
return self.conn.search_s(self.base_lock,1,'objectClass=lock')
|
return self.conn.search_s(self.base_lock,1,'objectClass=lock')
|
||||||
|
|
||||||
def services_to_restart(self,new=None,args=[],start=0):
|
def services_to_restart(self, new=None, args=[], start=0):
|
||||||
"""
|
"""
|
||||||
start indique la date (en secondes depuis epoch) à partir du
|
start indique la date (en secondes depuis epoch) à partir du
|
||||||
moment où cette action sera effectué
|
moment où cette action sera effectué
|
||||||
|
@ -495,9 +500,9 @@ class crans_ldap:
|
||||||
|
|
||||||
# Petite fonction à appliquer aux arguments
|
# Petite fonction à appliquer aux arguments
|
||||||
if type(args) == str: args = [ args ]
|
if type(args) == str: args = [ args ]
|
||||||
args=map(lambda x:preattr(x)[1] ,args)
|
args=map(lambda x:preattr(x)[1], args)
|
||||||
if type(start) == int: start = [ start ]
|
if type(start) == int: start = [ start ]
|
||||||
start=map(lambda x:preattr(x)[1] ,start)
|
start=map(lambda x:preattr(x)[1], start)
|
||||||
|
|
||||||
if new in serv.keys():
|
if new in serv.keys():
|
||||||
modlist = []
|
modlist = []
|
||||||
|
@ -527,9 +532,9 @@ class crans_ldap:
|
||||||
# else rien à faire
|
# else rien à faire
|
||||||
else:
|
else:
|
||||||
# Entrée non présente -> ajout
|
# Entrée non présente -> ajout
|
||||||
modlist = ldap.modlist.addModlist({ 'objectClass': 'service' ,
|
modlist = ldap.modlist.addModlist({ 'objectClass': 'service',
|
||||||
'cn': new ,
|
'cn': new,
|
||||||
'args': args ,
|
'args': args,
|
||||||
'start': start } )
|
'start': start } )
|
||||||
try:
|
try:
|
||||||
self.conn.add_s(serv_dn,modlist)
|
self.conn.add_s(serv_dn,modlist)
|
||||||
|
@ -883,13 +888,13 @@ class base_classes_crans(crans_ldap):
|
||||||
"""
|
"""
|
||||||
Blacklistage de la ou de toutes la machines du propriétaire
|
Blacklistage de la ou de toutes la machines du propriétaire
|
||||||
new est une liste de 4 termes:
|
new est une liste de 4 termes:
|
||||||
[ debut_sanction , fin_sanction, sanction, commentaire ]
|
[ debut_sanction, fin_sanction, sanction, commentaire ]
|
||||||
début et fin doivent être sous la forme donnée par date_format
|
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 un début ou fin immédiate mettre now
|
||||||
pour une fin indéterminée mettre '-'
|
pour une fin indéterminée mettre '-'
|
||||||
|
|
||||||
pour modifier une entrée donner un tuple de deux termes :
|
pour modifier une entrée donner un tuple de deux termes :
|
||||||
( index dans blacklist à modifier , nouvelle liste )
|
( index dans blacklist à modifier, nouvelle liste )
|
||||||
l'index est celui obtenu dans la liste retournée par blacklist()
|
l'index est celui obtenu dans la liste retournée par blacklist()
|
||||||
"""
|
"""
|
||||||
if not self._data.has_key('blacklist'):
|
if not self._data.has_key('blacklist'):
|
||||||
|
@ -972,7 +977,7 @@ class base_classes_crans(crans_ldap):
|
||||||
Pour ajouter une remarque new doit être la chaîne
|
Pour ajouter une remarque new doit être la chaîne
|
||||||
représentant la remarque à ajouter
|
représentant la remarque à ajouter
|
||||||
Pour modifier new doit être une liste de la forme:
|
Pour modifier new doit être une liste de la forme:
|
||||||
[ index de la remarque à modifier , nouvelle remarque ]
|
[ index de la remarque à modifier, nouvelle remarque ]
|
||||||
l'index est celui obtenu dans la liste retournée par info()
|
l'index est celui obtenu dans la liste retournée par info()
|
||||||
"""
|
"""
|
||||||
if not self._data.has_key('info'):
|
if not self._data.has_key('info'):
|
||||||
|
@ -1130,11 +1135,11 @@ class base_classes_crans(crans_ldap):
|
||||||
else:
|
else:
|
||||||
### Modification entrée
|
### Modification entrée
|
||||||
if not self._modifiable:
|
if not self._modifiable:
|
||||||
raise RuntimeError(u'Objet non modifiable : %s'%str(self))
|
raise RuntimeError(u'Objet non modifiable : %s' % str(self))
|
||||||
modlist = ldap.modlist.modifyModlist(self._init_data,self._data)
|
modlist = ldap.modlist.modifyModlist(self._init_data,self._data)
|
||||||
try:
|
try:
|
||||||
self.conn.modify_s(self.dn,modlist)
|
self.conn.modify_s(self.dn,modlist)
|
||||||
except ldap.TYPE_OR_VALUE_EXISTS , c:
|
except ldap.TYPE_OR_VALUE_EXISTS, c:
|
||||||
champ = c.args[0]['info'].split(':')[0]
|
champ = c.args[0]['info'].split(':')[0]
|
||||||
raise RuntimeError(u'Entrée en double dans le champ %s' % champ)
|
raise RuntimeError(u'Entrée en double dans le champ %s' % champ)
|
||||||
|
|
||||||
|
@ -1142,7 +1147,7 @@ class base_classes_crans(crans_ldap):
|
||||||
# Quasiement tout est traité dans les classes filles.
|
# Quasiement tout est traité dans les classes filles.
|
||||||
if hasattr(self,"_blacklist_restart"):
|
if hasattr(self,"_blacklist_restart"):
|
||||||
for n,t in self._blacklist_restart.items():
|
for n,t in self._blacklist_restart.items():
|
||||||
self.services_to_restart("blacklist_%s"%n,[],t)
|
self.services_to_restart("blacklist_%s"%n, [], t)
|
||||||
|
|
||||||
# Reinitialisation
|
# Reinitialisation
|
||||||
self._init_data = self._data.copy()
|
self._init_data = self._data.copy()
|
||||||
|
@ -1833,7 +1838,7 @@ class adherent(base_proprietaire):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
def compte(self,login=None,uidNumber=0,hash_pass='',shell=config.login_shell):
|
def compte(self, login=None, uidNumber=0, hash_pass='', shell=config.login_shell):
|
||||||
"""
|
"""
|
||||||
Création d'un compte à un adhérent
|
Création d'un compte à un adhérent
|
||||||
(la création se fait après l'écriture dans la base par la méthode save)
|
(la création se fait après l'écriture dans la base par la méthode save)
|
||||||
|
@ -1861,27 +1866,27 @@ class adherent(base_proprietaire):
|
||||||
for c in login[:]:
|
for c in login[:]:
|
||||||
if not c in (string.letters + '-'):
|
if not c in (string.letters + '-'):
|
||||||
raise ValueError(u"Seuls les caractères alphabétiques non accentués et le - sont autorisés dans le login.")
|
raise ValueError(u"Seuls les caractères alphabétiques non accentués et le - sont autorisés dans le login.")
|
||||||
if l<2:
|
if l < 2:
|
||||||
raise ValueError(u"Login trop court.")
|
raise ValueError(u"Login trop court.")
|
||||||
if l>config.maxlen_login:
|
if l > config.maxlen_login:
|
||||||
raise ValueError(u"Login trop long.")
|
raise ValueError(u"Login trop long.")
|
||||||
if login[0]=='-':
|
if login[0] == '-':
|
||||||
raise ValueError(u"- interdit en première position.")
|
raise ValueError(u"- interdit en première position.")
|
||||||
|
|
||||||
if mailexist(login):
|
if mailexist(login):
|
||||||
raise ValueError(u"Login existant ou correspondant à un alias mail.",1)
|
raise ValueError(u"Login existant ou correspondant à un alias mail.", 1)
|
||||||
|
|
||||||
home = '/home/' + login
|
home = '/home/' + login
|
||||||
if os.path.exists(home):
|
if os.path.exists(home):
|
||||||
raise ValueError(u'Création du compte impossible : home existant',1)
|
raise ValueError(u'Création du compte impossible : home existant', 1)
|
||||||
|
|
||||||
if os.path.exists("/var/mail/"+login):
|
if os.path.exists("/var/mail/" + login):
|
||||||
raise ValueError(u'Création du compte impossible : /var/mail/%s existant'%login,1)
|
raise ValueError(u'Création du compte impossible : /var/mail/%s existant' % login, 1)
|
||||||
|
|
||||||
# Lock du mail
|
# Lock du mail
|
||||||
self.lock('mail',login)
|
self.lock('mail', login)
|
||||||
|
|
||||||
self._data['mail']= [ login ]
|
self._data['mail'] = [login]
|
||||||
if not 'compte' in self.modifs:
|
if not 'compte' in self.modifs:
|
||||||
self.modifs.setdefault('compte', None)
|
self.modifs.setdefault('compte', None)
|
||||||
|
|
||||||
|
@ -1890,15 +1895,15 @@ class adherent(base_proprietaire):
|
||||||
a = '%s.%s' % (self.prenom().capitalize(), self.nom().capitalize())
|
a = '%s.%s' % (self.prenom().capitalize(), self.nom().capitalize())
|
||||||
self.cannonical_alias(a)
|
self.cannonical_alias(a)
|
||||||
|
|
||||||
self._data['objectClass'] = [ 'adherent', 'posixAccount', 'shadowAccount' ]
|
self._data['objectClass'] = ['adherent', 'posixAccount', 'shadowAccount']
|
||||||
self._data['uid'] = [ login ]
|
self._data['uid'] = [login]
|
||||||
self._data['cn'] = [ preattr(self.Nom())[1] ]
|
self._data['cn'] = [preattr(self.Nom())[1]]
|
||||||
#self._data['shadowLastChange'] = [ '12632' ]
|
#self._data['shadowLastChange'] = [ '12632' ]
|
||||||
#self._data['shadowMax'] = [ '99999']
|
#self._data['shadowMax'] = [ '99999']
|
||||||
#self._data['shadowWarning'] = [ '7' ]
|
#self._data['shadowWarning'] = [ '7' ]
|
||||||
self._data['loginShell' ] = [ shell ]
|
self._data['loginShell'] = [shell]
|
||||||
if hash_pass:
|
if hash_pass:
|
||||||
self._data['userPassword'] = [ hash_pass ]
|
self._data['userPassword'] = [hash_pass]
|
||||||
|
|
||||||
if uidNumber:
|
if uidNumber:
|
||||||
if self.exist('(uidNumber=%s)' % uidNumber):
|
if self.exist('(uidNumber=%s)' % uidNumber):
|
||||||
|
@ -1913,7 +1918,7 @@ class adherent(base_proprietaire):
|
||||||
pool_uid.append(uidNumber)
|
pool_uid.append(uidNumber)
|
||||||
break
|
break
|
||||||
if not len(pool_uid):
|
if not len(pool_uid):
|
||||||
raise ValueError(u'Plus d\'uid disponibles !')
|
raise ValueError(u"Plus d'uid disponibles !")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.lock('uidNumber',str(uidNumber))
|
self.lock('uidNumber',str(uidNumber))
|
||||||
|
@ -1921,8 +1926,8 @@ class adherent(base_proprietaire):
|
||||||
# Quelqu'un nous a piqué l'uid que l'on venait de choisir !
|
# Quelqu'un nous a piqué l'uid que l'on venait de choisir !
|
||||||
return self.compte(login,uidNumber,hash_pass,shell)
|
return self.compte(login,uidNumber,hash_pass,shell)
|
||||||
|
|
||||||
self._data['uidNumber']= [ str(uidNumber) ]
|
self._data['uidNumber']= [str(uidNumber)]
|
||||||
self._data['gidNumber']=[ str(config.gid) ]
|
self._data['gidNumber'] = [str(config.gid)]
|
||||||
|
|
||||||
self._data['homeDirectory']=[ preattr(home)[1] ]
|
self._data['homeDirectory']=[ preattr(home)[1] ]
|
||||||
gecos = '%s %s' % tuple(map(lambda x: strip_accents(x.capitalize()), (self.prenom(), self.nom())))
|
gecos = '%s %s' % tuple(map(lambda x: strip_accents(x.capitalize()), (self.prenom(), self.nom())))
|
||||||
|
@ -2371,7 +2376,7 @@ class Machine(base_classes_crans):
|
||||||
Défini ou retourne l'IP de la machine.
|
Défini ou retourne l'IP de la machine.
|
||||||
Les IP sont stoquées sous forme xxx.xxx.xxx.xxx et doivent être fournies ainsi.
|
Les IP sont stoquées sous forme xxx.xxx.xxx.xxx et doivent être fournies ainsi.
|
||||||
Si l'IP n'est pas définie retourne <automatique>.
|
Si l'IP n'est pas définie retourne <automatique>.
|
||||||
Si ip=<automatique> attribue la permière IP libre du sous réseau.
|
Si ip=<automatique> attribue la permière IP libre du sous-réseau.
|
||||||
"""
|
"""
|
||||||
if ip == None:
|
if ip == None:
|
||||||
if self._data.has_key('ipHostNumber'):
|
if self._data.has_key('ipHostNumber'):
|
||||||
|
@ -2433,14 +2438,14 @@ class Machine(base_classes_crans):
|
||||||
break
|
break
|
||||||
|
|
||||||
if not len(pool_ip):
|
if not len(pool_ip):
|
||||||
raise RuntimeError(u'Plus d\'IP libres dans %s.' % string.join(net, ' et '))
|
raise RuntimeError(u"Plus d'IP libres dans %s." % string.join(net, ' et '))
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# L'ip est elle dans le bon sous réseau ?
|
# L'ip est elle dans le bon sous-réseau ?
|
||||||
# (accessoirement teste si l'IP est valide et ne correspond pas
|
# (accessoirement teste si l'IP est valide et ne correspond pas
|
||||||
# à l'adresse de broadcast ou de réseau)
|
# à l'adresse de broadcast ou de réseau)
|
||||||
if not iptools.AddrInNet(ip,net):
|
if not iptools.AddrInNet(ip,net):
|
||||||
raise ValueError(u'IP invalide ou en dehors du sous réseau alloué.', 1)
|
raise ValueError(u'IP invalide ou en dehors du sous-réseau alloué.', 1)
|
||||||
# Reformatage
|
# Reformatage
|
||||||
ip = iptools.DecToQuad(iptools.QuadToDec(ip))
|
ip = iptools.DecToQuad(iptools.QuadToDec(ip))
|
||||||
# L'ip est-elle déja allouée ?
|
# L'ip est-elle déja allouée ?
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue