Merge branch 'master' of git.crans.org:/git/ldap

This commit is contained in:
Pierre-Elliott Bécue 2013-02-14 16:38:37 +01:00
commit b45c791c19
3 changed files with 35 additions and 14 deletions

View file

@ -474,7 +474,7 @@ class ip6HostNumber(Attr):
can_modify = [nounou] can_modify = [nounou]
def parse_value(self, ip, ldif): def parse_value(self, ip, ldif):
ip = ip6_of_mac(ldif['macAddress'][0], ldif['rid'][0]) ip = ip6_of_mac(ldif['macAddress'][0], int(ldif['rid'][0]))
self.value = netaddr.ip.IPAddress(ip) self.value = netaddr.ip.IPAddress(ip)
def __unicode__(self): def __unicode__(self):
@ -506,7 +506,7 @@ class rid(Attr):
# On veut éviter les rid qui recoupent les ipv4 finissant par # On veut éviter les rid qui recoupent les ipv4 finissant par
# .0 ou .255 # .0 ou .255
plages = [xrange(rid[a][0], rid[a][1]+1) for a in rid.keys() if 'v6' not in a] plages = [xrange(config.rid[a][0], config.rid[a][1]+1) for a in config.rid.keys() if ('v6' not in a) and ('special' not in a)]
for plage in plages: for plage in plages:
if rid in plage: if rid in plage:

View file

@ -60,6 +60,7 @@ def prefixev6_of_rid(rid):
Cette fonction retourne l'ip de début de ce sous-réseau. Cette fonction retourne l'ip de début de ce sous-réseau.
""" """
# Au cas où
rid = int(rid) rid = int(rid)
for net, plage in config.rid.items(): for net, plage in config.rid.items():
@ -75,6 +76,8 @@ def ip6_of_mac(mac, rid):
""" """
Retourne la bonne ipv6 de la machine en fonction de sa mac et de son rid. Retourne la bonne ipv6 de la machine en fonction de sa mac et de son rid.
""" """
# Au cas où
rid = int(rid)
for net, plage in config.rid.items(): for net, plage in config.rid.items():
if rid >= plage[0] and rid <= plage[1]: if rid >= plage[0] and rid <= plage[1]:

View file

@ -121,7 +121,6 @@ def cldif_to_ldif(cldif):
ldif[attr] = [ str(val) for val in vals ] ldif[attr] = [ str(val) for val in vals ]
return ldif return ldif
def lc_ldap_test(): def lc_ldap_test():
"""Binding LDAP à la base de tests""" """Binding LDAP à la base de tests"""
return lc_ldap(uri='ldap://vo.adm.crans.org',dn='cn=admin,dc=crans,dc=org', cred='75bdb64f32') return lc_ldap(uri='ldap://vo.adm.crans.org',dn='cn=admin,dc=crans,dc=org', cred='75bdb64f32')
@ -132,6 +131,23 @@ def lc_ldap_admin():
secrets = import_secrets() secrets = import_secrets()
return lc_ldap(uri='ldap://ldap.adm.crans.org/', dn=secrets.ldap_auth_dn, cred=secrets.ldap_password) return lc_ldap(uri='ldap://ldap.adm.crans.org/', dn=secrets.ldap_auth_dn, cred=secrets.ldap_password)
def lc_ldap_self():
"""Binding LDAP en lecture seule sur la base locale.
L'idée est que les machines avec un réplica bossent
avec elles-mêmes pour la lecture, pas avec vert."""
if os.path.exists('/var/run//slapd/ldapi'):
ro_uri = 'ldapi://%2fvar%2frun%2fslapd%2fldapi/'
auth_dn = auth_pw = ""
elif os.path.exists('/var/run/ldapi'):
ro_uri = 'ldapi://%2fvar%2frun%2fldapi/'
auth_dn = auth_pw = ""
else:
secrets = import_secrets()
ro_uri = 'ldap://127.0.0.1'
auth_dn = secrets.ldap_readonly_auth_dn
auth_pw = secrets.ldap_readonly_password
return lc_ldap(uri=ro_uri, dn=auth_dn, cred=auth_pw)
class lc_ldap(ldap.ldapobject.LDAPObject): class lc_ldap(ldap.ldapobject.LDAPObject):
"""Connexion à la base ldap crans, chaque instance représente une connexion """Connexion à la base ldap crans, chaque instance représente une connexion
@ -206,15 +222,15 @@ class lc_ldap(ldap.ldapobject.LDAPObject):
m = new_cransldapobject(self, dn, ldif = attrs) m = new_cransldapobject(self, dn, ldif = attrs)
parent_dn = dn.split(',', 1)[1] parent_dn = dn.split(',', 1)[1]
if not machines.has_key(parent_dn): if not machines.has_key(parent_dn):
machines[parent_dn]=[] machines[parent_dn] = []
machines[parent_dn].append(m) machines[parent_dn].append(m)
elif (dn.startswith('aid=') or dn.startswith('cid=') or dn==base_dn) and not parent.has_key(dn): elif (dn.startswith('aid=') or dn.startswith('cid=') or dn == base_dn) and not parent.has_key(dn):
parent[dn]=new_cransldapobject(self, dn, ldif = attrs) parent[dn] = new_cransldapobject(self, dn, ldif = attrs)
allmachines=[] allmachines = []
for dn,mlist in machines.items(): # on associe propriétaires et machines for dn,mlist in machines.items(): # on associe propriétaires et machines
parent[dn]._machines=mlist parent[dn]._machines = mlist
for m in mlist: for m in mlist:
m._proprio=parent[dn] m._proprio = parent[dn]
allmachines.append(m) allmachines.append(m)
return allmachines,parent.values() # on renvoie la liste des machines et des adherents (dont club et crans) return allmachines,parent.values() # on renvoie la liste des machines et des adherents (dont club et crans)
@ -223,7 +239,7 @@ class lc_ldap(ldap.ldapobject.LDAPObject):
s'éxécuter le plus rapidement possible. On dumpe malgré tout s'éxécuter le plus rapidement possible. On dumpe malgré tout
toute la base, c'est pour pouvoir aussi rajouter à moindre coût toute la base, c'est pour pouvoir aussi rajouter à moindre coût
les propriétaires.""" les propriétaires."""
machines,_=self.allMachinesAdherents() machines,_ = self.allMachinesAdherents()
return machines return machines
def allAdherents(self): def allAdherents(self):
@ -231,7 +247,7 @@ class lc_ldap(ldap.ldapobject.LDAPObject):
s'éxécuter le plus rapidement possible. On dumpe malgré tout s'éxécuter le plus rapidement possible. On dumpe malgré tout
toute la base, c'est pour pouvoir aussi rajouter à moindre coût toute la base, c'est pour pouvoir aussi rajouter à moindre coût
les machines.""" les machines."""
_,adherents=self.allMachinesAdherents() _,adherents = self.allMachinesAdherents()
return adherents return adherents
def newMachine(self, parent, realm, uldif): def newMachine(self, parent, realm, uldif):
@ -285,7 +301,7 @@ class lc_ldap(ldap.ldapobject.LDAPObject):
aid = uldif.setdefault('aid', [ unicode(self._find_id('aid')) ]) aid = uldif.setdefault('aid', [ unicode(self._find_id('aid')) ])
uldif['objectClass'] = [u'adherent'] uldif['objectClass'] = [u'adherent']
adherent = self._create_entity('aid=%s,%s' % (aid[0], base_dn), uldif) adherent = self._create_entity('aid=%s,%s' % (aid[0], base_dn), uldif)
if adherent.may_be(created, self): if adherent.may_be(created, self.droits):
adherent.create() adherent.create()
else: else:
raise EnvironmentError("Vous n'avez pas le droit de créer cet adhérent.") raise EnvironmentError("Vous n'avez pas le droit de créer cet adhérent.")
@ -295,7 +311,7 @@ class lc_ldap(ldap.ldapobject.LDAPObject):
cid = uldif.setdefault('cid', [ unicode(self._find_id('cid')) ]) cid = uldif.setdefault('cid', [ unicode(self._find_id('cid')) ])
uldif['objectClass'] = [u'club'] uldif['objectClass'] = [u'club']
club = self._create_entity('cid=%s,%s' % (cid[0], base_dn), uldif) club = self._create_entity('cid=%s,%s' % (cid[0], base_dn), uldif)
if club.may_be(created, self): if club.may_be(created, self.droits):
club.create() club.create()
else: else:
raise EnvironmentError("Vous n'avez pas le droit de créer cet adhérent.") raise EnvironmentError("Vous n'avez pas le droit de créer cet adhérent.")
@ -327,7 +343,8 @@ class lc_ldap(ldap.ldapobject.LDAPObject):
if i in nonfree: if i in nonfree:
continue continue
else: else:
my_id = attrify(i, attr, self, True) # On crée l'attribut associé, pour parser sa valeur.
my_id = attrify(unicode(i), attr, {}, self, False)
if my_id.value != i: if my_id.value != i:
continue continue
else: else:
@ -388,6 +405,7 @@ class CransLdapObject(object):
"""Classe de base des objets CransLdap. """Classe de base des objets CransLdap.
Cette classe ne devrait pas être utilisée directement.""" Cette classe ne devrait pas être utilisée directement."""
""" Qui peut faire quoi ? """
can_be_by = { created: [nounou], can_be_by = { created: [nounou],
modified: [nounou], modified: [nounou],
deleted: [nounou], deleted: [nounou],