From db8b27e6a539fe7f6fc76aed16fa9035a0c6a403 Mon Sep 17 00:00:00 2001 From: Antoine Durand-Gasselin Date: Thu, 26 Aug 2010 14:00:22 +0000 Subject: [PATCH] [lc_ldap] Creation de machines, sanity checks --- attributs.py | 86 ++-------------------------------------------------- lc_ldap.py | 46 +++++++++++++++++++++++----- 2 files changed, 40 insertions(+), 92 deletions(-) diff --git a/attributs.py b/attributs.py index a1a9b10..48097c1 100644 --- a/attributs.py +++ b/attributs.py @@ -85,7 +85,7 @@ class Attr: """Vérifie si l'attribut est modifiable""" return False -Class nom(Attr): +class nom(Attr): singlevalue = True optional = False legend = "Nom" @@ -94,7 +94,7 @@ Class nom(Attr): def normalize(self, values): return [ values.strip().capitalize() for v in values ] -Class prenom(Attr): +class prenom(Attr): singlevalue = True optional = False legend = u"Prénom" @@ -227,85 +227,3 @@ class historique(Attr): legend = u"Historique de l'objet" -# CRANS_ATTRIBUTES = { -# 'nom' : { 'attr' : 'nom', -# 'hname' : 'Nom', -# 'isunique' : True }, -# 'prenom' : { 'attr' : 'prenom', -# 'hname' : u'Prénom', -# 'isunique' : True }, -# 'tel' : { 'attr' : 'tel', -# 'hname' : 'Téléphone', -# 'isunique' : True }, -# 'paiement' : { 'attr' : 'paiement', -# 'hname' : u'Années de cotisations', -# 'isunique' : False }, -# 'carteEtudiant' : { 'attr' : 'carteEtudiant', -# 'hname' : u'Carte fournie pour les années', -# 'isunique' : False }, -# 'mailAlias' : { 'attr' : 'mailAlias', -# 'hname' : 'Alias mail', -# 'isunique' : False }, -# 'canonicalAlias' : { 'attr' : 'canonicalAlias', -# 'hname' : 'Alias mail canonique', -# 'isunique' : True }, -# 'etudes' : { 'attr' : 'etudes', -# 'hname' : u'Études suivies', -# 'isunique' : False }, -# 'chbre' : { 'attr' : 'chbre', -# 'hname' : 'Chambre', -# 'isunique' : True }, -# 'droits' : { 'attr' : 'droits', -# 'hname' : 'Droits', -# 'isunique' : False }, -# 'solde' : { 'attr' : 'solde', -# 'hname' : "Solde sur le compte d'impression", -# 'isunique' : True }, -# -# -# 'mid' : { 'attr' : 'mid', -# 'hname' : 'Identifiant de machine', -# 'isunique' : True }, -# 'hostAlias' : { 'attr' : 'hostAlias', -# 'hname' : 'Alias de nom de machine', -# 'isunique' : False }, -# 'ipsec' : { 'attr' : 'ipsec', -# 'hname' : 'Clef wifi', -# 'isunique' : True }, -# 'puissance' : { 'attr' : 'puissance', -# 'hname' : u"Puissance d'émission de la borne wifi", -# 'isunique' : True }, -# 'canal' : { 'attr' : 'canal', -# 'hname' : u"Canal d'émission de la borne wifi", -# 'isunique' : True }, -# 'portTCPout' : { 'attr' : 'portTCPout', -# 'hname' : u"Port TCP ouvert vers l'extérieur", -# 'isunique' : False }, -# 'portTCPin' : { 'attr' : 'portTCPin', -# 'hname' : u"Port TCP ouvert depuis l'extérieur", -# 'isunique' : False }, -# 'portUDPout' : { 'attr' : 'portUDPout', -# 'hname' : u"Port UDP ouvert vers l'extérieur", -# 'isunique' : False }, -# 'portUDPin' : { 'attr' : 'portUDPin', -# 'hname' : u"Port UDP ouvert depuis l'extérieur", -# 'isunique' : False }, -# 'prise' : { 'attr' : 'prise', -# 'hname' : 'Prise sur laquelle est branchée la machine', -# 'isunique' : True }, -# -# -# 'cid' : { 'attr' : 'cid', -# 'hname' : 'Identifiant de club', -# 'isunique' : True }, -# 'responsable' : { 'attr' : 'responsable', -# 'hname' : 'Responsable du club', -# 'isunique' : True }, -# -# 'blacklist' : {'attr' : 'blacklist', -# 'hname' : 'Historique des sanctions', -# 'isunique' : False }, -# 'historique' : { 'attr' : 'historique', -# 'hname' : 'Historique des modifications', -# 'isunique' : False }, -# } diff --git a/lc_ldap.py b/lc_ldap.py index 2ae150a..25f5602 100644 --- a/lc_ldap.py +++ b/lc_ldap.py @@ -102,8 +102,8 @@ class lc_ldap(ldap.ldapobject.LDAPObject): else: self.conn = self.simple_bind_s() - def search(self, filter, mode='ro', dn= base_dn, scope= 2, sizelimit=400): - res = self.search_ext_s(dn, scope, filter, sizelimit=sizelimit) + def search(self, filterstr, mode='ro', dn= base_dn, scope= 2, sizelimit=400): + res = self.search_ext_s(dn, scope, filterstr, sizelimit=sizelimit) return [ CransLdapObject(self, r[0], mode=mode) for r in res ] def allMachines(self): @@ -122,13 +122,41 @@ class lc_ldap(ldap.ldapobject.LDAPObject): return machines def newMachine(self, parent, realm, uldif): - """Crée une nouvelle machine""" - raise NotImplementedError() + """Crée une nouvelle machine: realm peut être: + adm, serveurs, bornes, wifi, adherents, gratuit ou personnel-ens""" + owner = self.search('objectClass=*', dn=parent, scope=0)[0] + + if realm in ["adm", "serveurs"]: + uldif['objectClass'] = [u'machineCrans'] + assert isinstance(owner, AssociationCrans) + # XXX - Vérifier les droits + + elif realm == "bornes": + uldif['objectClass'] = [u'borneWifi'] + assert isinstance(owner, AssociationCrans) + # XXX - Vérifier les droits + + elif realm in ["wifi", "wifi-adh"]: + uldif['objectClass'] = [u'machineWifi'] + realm = "wifi-adh" + assert isinstance(owner, adherent) or isinstance(owner, club) + # XXX - Vérifier les droits (owner.type_connexion) + + elif realm in ["adherent", "gratuit", "personnel-ens"]: + uldif['objectClass'] = [u'machineFixe'] + assert isinstance(owner, adherent) or isinstance(owner, club) + # XXX - Vérifier les droits + + else: raise ValueError("Realm inconnu: %s" % realm) + + plage = config.NETs[realm] + mid = uldif.setdefault('mid', [ unicode(self._find_id('mid', plage)) ]) + return self._create_entity('mid=%s,%s' % (aid[0], parent), uldif) def newAdherent(self, uldif): """Crée un nouvel adhérent""" aid = uldif.setdefault('aid', [ unicode(self._find_id('aid')) ]) - # XXX - autres tests + uldif['objectClass'] = [u'adherent'] return self._create_entity('aid=%s,%s' % (aid[0], base_dn), uldif) def newClub(self, uldif): @@ -142,13 +170,15 @@ class lc_ldap(ldap.ldapobject.LDAPObject): def _create_entity(self, dn, uldif): '''Crée une nouvelle entité ldap en dn, avec attributs ldif: uniquement en unicode''' + for attr, vals in uldif: + nuldiff = self.normalize_and_validate(attr, vals) lock = CransLock(self) for item in ['aid', 'uid', 'chbre', 'mailAlias', 'canonicalAlias', 'fid', 'cid', 'mid', 'macAddress', 'host', 'hostAlias' ]: - for val in uldif.get(item, []): + for val in nuldif.get(item, []): lock.add(item, val) #uldif['historique'] = [ self._hist('Création')] - ldif = uldif_to_ldif(uldif) + ldif = uldif_to_ldif(nuldif) modlist = addModlist(ldif) with lock: # print dn, modlist @@ -223,7 +253,7 @@ class CransLdapObject: histo = self._gen_hist(self._modifs) self._modifs['historique'] += histo for attr, vals in self._modifs.items: - self._modifs[attr] = self.validate_and_normalize(attr, vals) + self._modifs[attr] = self.normalize_and_validate(attr, vals) # On récupère la liste des modifications modlist = self.get_modlist()