* Correction de plusieurs bugs, on peut théoriquement créer des machines
Mais il faut éviter, parce qu'elles peuvent prendre des ip en .0 ou .255 Il reste quelques détails genre 'historique' et 'ouverture de ports' à régler...
This commit is contained in:
parent
e3e0485045
commit
18571ae112
3 changed files with 42 additions and 15 deletions
29
attributs.py
29
attributs.py
|
@ -35,7 +35,7 @@
|
||||||
|
|
||||||
import re, sys, netaddr, time
|
import re, sys, netaddr, time
|
||||||
from unicodedata import normalize
|
from unicodedata import normalize
|
||||||
from crans_utils import format_tel, format_mac, mailexist, validate_name
|
from crans_utils import format_tel, format_mac, mailexist, validate_name, ip4_of_rid, ip6_of_mac
|
||||||
|
|
||||||
sys.path.append("/usr/scripts/gestion")
|
sys.path.append("/usr/scripts/gestion")
|
||||||
import config, annuaires_pg
|
import config, annuaires_pg
|
||||||
|
@ -177,8 +177,8 @@ class objectClass(Attr):
|
||||||
""" Internal purpose (et à fin pédagogique) """
|
""" Internal purpose (et à fin pédagogique) """
|
||||||
|
|
||||||
def parse_value(self, val, ldif):
|
def parse_value(self, val, ldif):
|
||||||
if val not in [ 'top', 'posixAccount', 'shadowAccount', 'proprio',
|
if val not in [ 'top', 'organizationalUnit', 'posixAccount', 'shadowAccount',
|
||||||
'adherent', 'club', 'machine', 'machineCrans',
|
'proprio', 'adherent', 'club', 'machine', 'machineCrans',
|
||||||
'borneWifi', 'machineWifi', 'machineFixe',
|
'borneWifi', 'machineWifi', 'machineFixe',
|
||||||
'cransAccount', 'service', 'facture', 'freeMid' ]:
|
'cransAccount', 'service', 'facture', 'freeMid' ]:
|
||||||
raise ValueError("Pourquoi insérer un objectClass=%r ?" % val)
|
raise ValueError("Pourquoi insérer un objectClass=%r ?" % val)
|
||||||
|
@ -399,7 +399,7 @@ class dnsAttr(Attr):
|
||||||
def parse_value(self, dns, ldif):
|
def parse_value(self, dns, ldif):
|
||||||
dns = dns.lower()
|
dns = dns.lower()
|
||||||
name, net = dns.split('.', 1)
|
name, net = dns.split('.', 1)
|
||||||
if self.ctxt_check and (net not in ['crans.org', 'wifi.crans.org'] or
|
if self.ctxt_check and (net not in ['adm.crans.org', 'crans.org', 'wifi.crans.org'] or
|
||||||
not re.match('[a-z][-_a-z0-9]+', name)):
|
not re.match('[a-z][-_a-z0-9]+', name)):
|
||||||
raise ValueError("Nom d'hote invalide %r" % dns)
|
raise ValueError("Nom d'hote invalide %r" % dns)
|
||||||
self.value = dns
|
self.value = dns
|
||||||
|
@ -443,7 +443,7 @@ class macAddress(Attr):
|
||||||
|
|
||||||
class ipHostNumber(Attr):
|
class ipHostNumber(Attr):
|
||||||
singlevalue = True
|
singlevalue = True
|
||||||
optional = False
|
optional = True
|
||||||
unique = True
|
unique = True
|
||||||
legend = u"Adresse IPv4 de la machine"
|
legend = u"Adresse IPv4 de la machine"
|
||||||
hname = "IPv4"
|
hname = "IPv4"
|
||||||
|
@ -452,12 +452,28 @@ class ipHostNumber(Attr):
|
||||||
|
|
||||||
def parse_value(self, ip, ldif):
|
def parse_value(self, ip, ldif):
|
||||||
if ip == '<automatique>':
|
if ip == '<automatique>':
|
||||||
ip = Rid(rid= ldif['rid'][0]).ipv4()
|
ip = ip4_of_rid(ldif['rid'][0])
|
||||||
self.value = netaddr.ip.IPAddress(ip)
|
self.value = netaddr.ip.IPAddress(ip)
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return unicode(self.value)
|
return unicode(self.value)
|
||||||
|
|
||||||
|
class ip6HostNumber(Attr):
|
||||||
|
singlevalue = True
|
||||||
|
optional = True
|
||||||
|
unique = True
|
||||||
|
legend = u"Adresse IPv6 de la machine"
|
||||||
|
hname = "IPv6"
|
||||||
|
category = 'base_tech'
|
||||||
|
can_modify = [nounou]
|
||||||
|
|
||||||
|
def parse_value(self, ip, ldif):
|
||||||
|
if ip == '<automatique>':
|
||||||
|
ip = ip6_of_mac(ldif['macAddress'][0], ldif['rid'][0])
|
||||||
|
self.value = netaddr.ip.IPAddress(ip)
|
||||||
|
|
||||||
|
def __unicode__(self):
|
||||||
|
return unicode(self.value)
|
||||||
|
|
||||||
class mid(Attr):
|
class mid(Attr):
|
||||||
singlevalue = True
|
singlevalue = True
|
||||||
|
@ -804,6 +820,7 @@ CRANS_ATTRIBUTES= {
|
||||||
'sshFingerprint' : sshFingerprint,
|
'sshFingerprint' : sshFingerprint,
|
||||||
'macAddress': macAddress,
|
'macAddress': macAddress,
|
||||||
'ipHostNumber': ipHostNumber,
|
'ipHostNumber': ipHostNumber,
|
||||||
|
'ip6HostNumber': ip6HostNumber,
|
||||||
'hostAlias' : hostAlias,
|
'hostAlias' : hostAlias,
|
||||||
'ipsec' : ipsec,
|
'ipsec' : ipsec,
|
||||||
'puissance' : puissance,
|
'puissance' : puissance,
|
||||||
|
|
|
@ -36,6 +36,9 @@ from unicodedata import normalize
|
||||||
|
|
||||||
def ip4_of_rid(rid):
|
def ip4_of_rid(rid):
|
||||||
"""Convertit un rid en son IP associée"""
|
"""Convertit un rid en son IP associée"""
|
||||||
|
# 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]:
|
||||||
break
|
break
|
||||||
|
@ -57,6 +60,8 @@ 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.
|
||||||
"""
|
"""
|
||||||
|
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]:
|
||||||
break
|
break
|
||||||
|
|
23
lc_ldap.py
23
lc_ldap.py
|
@ -258,19 +258,22 @@ class lc_ldap(ldap.ldapobject.LDAPObject):
|
||||||
|
|
||||||
else: raise ValueError("Realm inconnu: %r" % realm)
|
else: raise ValueError("Realm inconnu: %r" % realm)
|
||||||
|
|
||||||
|
# On récupère la plage des mids
|
||||||
|
plage = xrange( *(config.rid[realm]))
|
||||||
# On récupère le premier id libre dans la plages s'il n'est pas
|
# On récupère le premier id libre dans la plages s'il n'est pas
|
||||||
# déjà précisé dans le ldiff
|
# déjà précisé dans le ldiff
|
||||||
rid = uldif.setdefault('rid', [ unicode(self._find_id('rid', plage)) ])
|
rid = uldif.setdefault('rid', [ unicode(self._find_id('rid', plage)) ])
|
||||||
|
|
||||||
# La machine peut-elle avoir une ipv4 ?
|
# La machine peut-elle avoir une ipv4 ?
|
||||||
if 'v6' not in realm:
|
if 'v6' not in realm:
|
||||||
uldif['ipHostNumber'] = [ unicode(crans_utils.ip4_of_rid(rid[0])) ]
|
uldif['ipHostNumber'] = [ unicode(crans_utils.ip4_of_rid(int(rid[0]))) ]
|
||||||
uldif['ip6HostNumber'] = [ unicode(crans_utils.ip6_of_mac(uldif['macAddress'][0], rid[0])) ]
|
uldif['ip6HostNumber'] = [ unicode(crans_utils.ip6_of_mac(uldif['macAddress'][0], int(rid[0]))) ]
|
||||||
|
|
||||||
|
# Mid
|
||||||
|
uldif['mid'] = [ unicode(self._find_id('mid')) ]
|
||||||
|
|
||||||
# On récupère la plage des mids
|
|
||||||
plage = xrange( *(config.rid[realm]))
|
|
||||||
# Tout doit disparaître !!
|
# Tout doit disparaître !!
|
||||||
machine = self._create_entity('mid=%s,%s' % (mid[0], parent), uldif)
|
machine = self._create_entity('mid=%s,%s' % (uldif['mid'][0], parent), uldif)
|
||||||
if machine.may_be(created, self.droits + self._is_parent(machine)):
|
if machine.may_be(created, self.droits + self._is_parent(machine)):
|
||||||
machine.create()
|
machine.create()
|
||||||
else:
|
else:
|
||||||
|
@ -483,7 +486,7 @@ class CransLdapObject(object):
|
||||||
# Création de la requête LDAP
|
# Création de la requête LDAP
|
||||||
modlist = addModlist(cldif_to_ldif(self.attrs))
|
modlist = addModlist(cldif_to_ldif(self.attrs))
|
||||||
# Requête LDAP de création de l'objet
|
# Requête LDAP de création de l'objet
|
||||||
self.add_s(self.dn, modlist)
|
self.conn.add_s(self.dn, modlist)
|
||||||
|
|
||||||
|
|
||||||
def save(self):
|
def save(self):
|
||||||
|
@ -513,12 +516,14 @@ class CransLdapObject(object):
|
||||||
if differences:
|
if differences:
|
||||||
raise EnvironmentError("Les modifications apportées à l'objet %s n'ont pas été correctement sauvegardées\n%s" % (self.dn, differences))
|
raise EnvironmentError("Les modifications apportées à l'objet %s n'ont pas été correctement sauvegardées\n%s" % (self.dn, differences))
|
||||||
|
|
||||||
def may_be(self, what, obj):
|
def may_be(self, what, liste):
|
||||||
"""Teste si celui qui est bindé peut effectuer ce qui est dans what, pour
|
"""Teste si liste peut faire ce qui est dans what, pour
|
||||||
what élément de {create, delete, modify}.
|
what élément de {create, delete, modify}.
|
||||||
|
On passe une liste de droits plutôt que l'objet car il faut ajouter
|
||||||
|
les droits soi et parent.
|
||||||
Retourne un booléen
|
Retourne un booléen
|
||||||
"""
|
"""
|
||||||
if set(obj.droits).intersection(self.can_be_by[what]) != set([]):
|
if set(liste).intersection(self.can_be_by[what]) != set([]):
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue