Commit db7d41d9 authored by Vincent Le gallic's avatar Vincent Le gallic

Split de lc_ldap.py en lc_ldap.py et objets.py + création du wrapper shortcuts.py

Ça permet de faire les choses sales du genre os.getenv("SUDO_USER") ou import_secrets
dans le wrapper et pas dans le binding même.
parent a620f5b5
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Binding Cr@ns-made pour s'interfacer avec la base LDAP
Copyright (C) 2010-2013 Cr@ns <roots@crans.org>
Authors: Antoine Durand-Gasselin <adg@crans.org>
Nicolas Dandrimont <olasd@crans.org>
Olivier Iffrig <iffrig@crans.org>
Valentin Samir <samir@crans.org>
Daniel Stan <dstan@crans.org>
Vincent Le Gallic <legallic@crans.org>
Pierre-Elliott Bécue <becue@crans.org>
"""
from lc_ldap import *
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# ATTRIBUTS.PY-- Description des attributs ldap
""" Définition des classes permettant d'instancier les attributs LDAP. """
#
# Copyright (C) 2010-2013 Cr@ns <roots@crans.org>
# Authors: Antoine Durand-Gasselin <adg@crans.org>
......@@ -160,6 +162,16 @@ class AttrsDict(dict):
def items(self):
return [(key, self[key]) for key in self]
def to_ldif(self):
"""
Transforme le dico en ldif valide au sens openldap.
Ce ldif est celui qui sera transmis à la base.
"""
ldif = {}
for attr, vals in self.items():
ldif[attr] = [ str(val) for val in vals ]
return ldif
class Attr(object):
"""Objet représentant un attribut.
......
This diff is collapsed.
This diff is collapsed.
......@@ -4,6 +4,7 @@
import ldap
import lc_ldap
import attributs
import objets
from gen_confs.dhcpd_new import dydhcp
services_dn = 'ou=services,dc=crans,dc=org'
......@@ -26,7 +27,7 @@ services_to_attrs['mail_modif'] = []
# génération des arguments du service à redémarrer (par defaut [])
services_to_args={}
services_to_args['macip']=lambda x: issubclass(type(x.parent), lc_ldap.machine) and ([str(x)] if isinstance(x, attributs.ipHostNumber) else [ str(ip) for ip in x.parent.get('ipHostNumber',[]) ]) or ([ str(ip) for m in x.parent.machines() for ip in m.get('ipHostNumber',[])] if issubclass(type(x.parent), lc_ldap.proprio) else [])
services_to_args['macip']=lambda x: issubclass(type(x.parent), objets.machine) and ([str(x)] if isinstance(x, attributs.ipHostNumber) else [ str(ip) for ip in x.parent.get('ipHostNumber',[]) ]) or ([ str(ip) for m in x.parent.machines() for ip in m.get('ipHostNumber',[])] if issubclass(type(x.parent), lc_ldap.proprio) else [])
## Inutile pour blackliste pour le moment
#services_to_args['blacklist']=lambda x: issubclass(type(x.parent), lc_ldap.machine) and [ str(ip) for m in x.parent.proprio().machines() for ip in m['ipHostNumber'] ] or [ str(ip) for m in x.parent.machines() for ip in m['ipHostNumber'] ]
services_to_args['port']=lambda x: [str(x)] if isinstance(x, attributs.ipHostNumber) or isinstance(x, attributs.ip6HostNumber) else [ str(ip) for ip in x.parent.get('ipHostNumber',[]) ]
......
#!/usr/bin/env python
# -*- coding: utf-8 -*-
""" Raccourcis pour se connecter facilement à la base LDAP avec le binding lc_ldap. """
import sys
import os.path
import lc_ldap as module_qui_a_le_meme_nom_que_sa_classe_principale
import variables
#: Pour enregistrer dans l'historique, on a besoin de savoir qui exécute le script
#: Si le script a été exécuté via un sudo, la variable SUDO_USER (l'utilisateur qui a effectué le sudo)
#: est plus pertinente que USER (qui sera root)
current_user = os.getenv("SUDO_USER") or os.getenv("USER")
# Quand on a besoin du fichier de secrets
def import_secrets():
"""Importe le fichier de secrets."""
if not "/etc/crans/secrets/" in sys.path:
sys.path.append("/etc/crans/secrets/")
import secrets
return secrets
def lc_ldap(*args, **kwargs):
"""Renvoie une connexion à la base LDAP."""
return module_qui_a_le_meme_nom_que_sa_classe_principale.lc_ldap(*args, **kwargs)
def lc_ldap_test(*args, **kwargs):
"""Renvoie une connexion LDAP à la base de tests."""
# On impose le serveur
kwargs["uri"] = 'ldap://vo.adm.crans.org'
# On pense à laisser la possibilité de se connecter par username ou dn…
if not kwargs.has_key("user"):
# … mais si rien n'est spécifié, on fournit le dn par défaut
kwargs.setdefault("dn", 'cn=admin,dc=crans,dc=org')
# Le mot de passe de la base de test
kwargs.setdefault("cred", variables.ldap_test_password)
# On en a aussi besoin pour le lookup en readonly
kwargs.setdefault("readonly_dn", variables.readonly_dn)
kwargs.setdefault("readonly_password", variables.ldap_test_password)
kwargs.setdefault("user", current_user)
return module_qui_a_le_meme_nom_que_sa_classe_principale.lc_ldap(*args, **kwargs)
def lc_ldap_admin(*args, **kwargs):
"""Renvoie une connexion LDAP à la vraie base, en admin.
Possible seulement si on peut lire secrets.py
"""
secrets = import_secrets()
kwargs.setdefault("user", current_user)
return module_qui_a_le_meme_nom_que_sa_classe_principale.lc_ldap(uri='ldap://ldap.adm.crans.org/', dn=secrets.ldap_auth_dn,
cred=secrets.ldap_password, user=current_user)
def lc_ldap_readonly(*args, **kwargs):
"""Connexion LDAP à la vraie base, en readonly.
Possible seulement si on peut lire secrets.py
"""
secrets = import_secrets()
kwargs["uri"] = 'ldap://ldap.adm.crans.org/'
kwargs["dn"] = secrets.ldap_readonly_auth_dn
kwargs["cred"] = secrets.ldap_readonly_password
kwargs.setdefault("user", current_user)
return module_qui_a_le_meme_nom_que_sa_classe_principale.lc_ldap(*args, **kwargs)
def lc_ldap_local(*args, **kwargs):
"""Connexion 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.
Attention, les accès internes en lecture seule
ou avec une socket ldapi semblent moins prioritaires
qu'avec cn=admin. Ne pas utiliser cette fonction
si vous souhaitez faire beaucoup de recherches
indépendantes (c'est le temps d'accès à la socket
qui est problématique).
"""
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
kwargs["uri"] = ro_uri
kwargs["dn"] = auth_dn
kwargs["cred"] = auth_pw
kwargs.setdefault("user", current_user)
return module_qui_a_le_meme_nom_que_sa_classe_principale.lc_ldap(*args, **kwargs)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# import lib standard
import psycopg2
import traceback
import random
import string
import os
import sys
## import dans /usr/scripts/
sys.path.append("/usr/scripts/")
import lc_ldap
from gestion.affich_tools import anim, OK, cprint, ERREUR
## import locaux
import lc_ldap
import shortcuts
import variables
show_traceback = False
if "--traceback" in sys.argv:
show_traceback = True
......@@ -124,8 +132,7 @@ def tests_machines(parent_dn, realm_list, ipsec=False):
print "Test de la librairie lc_ldap"
print "Connection"
current_user = os.getenv("SUDO_USER") or os.getenv("USER")
conn= lc_ldap.lc_ldap_test(user=current_user)
conn = shortcuts.lc_ldap_test()
print u"Tests effectués avec les droits %s " % ', '.join(conn.droits)
......@@ -174,7 +181,7 @@ anim("Creation d'un adherent")
try:
adherent = conn.newAdherent(adherent_ldif)
adherent.create()
except:
except Exception:
print ERREUR
print traceback.format_exc()
adherent = None
......@@ -191,8 +198,8 @@ else:
# Création et suppression de machines Crans #
#############################################
tests_machines(lc_ldap.base_dn, ["adm", "serveurs", "serveurs-v6", "adm-v6"])
tests_machines(lc_ldap.base_dn, ["bornes"])
tests_machines(variables.base_dn, ["adm", "serveurs", "serveurs-v6", "adm-v6"])
tests_machines(variables.base_dn, ["bornes"])
######################
......@@ -204,7 +211,7 @@ try:
club = conn.newClub(club_ldif)
club['responsable'] = str(adherent['aid'][0])
club.create()
except:
except Exception:
print ERREUR
print traceback.format_exc()
else:
......@@ -216,7 +223,7 @@ else:
try:
club = conn.search('cid=%s' % club['cid'][0], mode='rw')[0]
club.delete()
except:
except Exception:
print ERREUR
print traceback.format_exc()
else: print OK
......@@ -234,7 +241,7 @@ if adherent:
try:
adherent = conn.search('aid=%s' % adherent['aid'][0], mode='rw')[0]
adherent.delete()
except:
except Exception:
print ERREUR
print traceback.format_exc()
else: print OK
......@@ -256,7 +263,7 @@ else:
try:
facture = conn.search('fid=%s' % facture['fid'][0], mode='rw')[0]
facture.delete()
except:
except Exception:
print ERREUR
print traceback.format_exc()
else: print OK
......
#!/usr/bin/env python
# -*- coding: utf-8 -*-
""" Définitions de variables utiles pour lc_ldap. """
#: uri par défaut de la base LDAP
uri = 'ldap://ldap.adm.crans.org/'
#: dn racine de l'endroit où sont stockées les données
base_dn = 'ou=data,dc=crans,dc=org'
#: dn racine de l'endroit où sont stockés les logs
log_dn = "cn=log"
#: dn pour se binder en root
admin_dn = "cn=admin,dc=crans,dc=org"
#: dn pour se binder en readonly
readonly_dn = "cn=readonly,dc=crans,dc=org"
#: dn racine de l'endroit où sont stockés les invités (artefact garbage ?)
invite_dn = 'ou=invites,ou=data,dc=crans,dc=org'
# Protection contre les typos
#: Droit de créer
created = 'created'
#: Droit de modifier
modified = 'modified'
#: Droit de supprimer
deleted = 'deleted'
#: Mot de passe de la base de tests
ldap_test_password = '75bdb64f32'
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment