2010-06-09 11 views
0

J'utilise openldap sous Mac OS X Server 10.6 et j'ai besoin de générer une vcard pour tous les utilisateurs d'un groupe donné. En utilisant ldapsearch, je peux lister tous les membres de tous les utilisateurs de ce groupe. J'ai trouvé un script perl (Advanced LDAP Search ou ALS) qui a été écrit par quelqu'un qui va générer la vcard facilement. ALS peut être trouvé ici http://www.ldapman.org/tools/als.gzCréation de ldapsearch et vcard

Donc ce que j'ai besoin de faire est de créer un script wrapper (en python ou perl) qui va effectivement boucler à travers les memberUid et exécuter la commande ALS pour créer la vcard et l'ajouter au fichier.

Cette commande fournit les memberUid de:

ldapsearch -x -b 'dc=ldap,dc=server,dc=com' '(cn=testgroup)' 

ensuite en cours d'exécution SLA donne vcard:

als -b dc=ldap,dc=server,dc=com -V uid=aaronh > vcardlist.vcf 

S'il est plus facile de le faire en utilisant Perl puisque la SLA utilise déjà ce qui serait bien. J'ai fait plus de travail en python mais je suis ouvert aux suggestions.

Merci à l'avance, Aaron

EDIT:

Voici un lien vers le Net: code LDAP que je dois à ce jour. Jusqu'à présent, il supprime les entrées ldap avec toutes les informations utilisateur. Ce qui me manque est comment capturer juste l'UID pour chaque utilisateur et puis le pousser dans la SLA.

http://www.queencitytech.com/net-ldap

Voici un exemple d'entrée (après l'exécution du code à partir du lien ci-dessus):

#------------------------------- 
DN: uid=aaronh,cn=users,dc=ldap,dc=server,dc=com 
    altSecurityIdentities : Kerberos:[email protected] 
    apple-generateduid : F0F9DA73-70B3-47EB-BD25-FE4139E16942 
    apple-imhandle : Jabber:[email protected] 
    apple-mcxflags : <?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>simultaneous_login_enabled</key> 
    <true/> 
</dict> 
</plist> 

    authAuthority : ;ApplePasswordServer;0x4c11231147c72b59000001f800001663,1024 35 131057002239213764263627099108547501925287731311742942286788930775556419648865483768960345576253082450228562208107642206135992876630494830143899597135936566841409094870100055573569425410665510365545238751677692308677943427807426637133913499488233527734757673201849965347880843479632671824597968768822920700439 [email protected]:192.168.1.175;Kerberosv5;0x4c11231147c72b59000001f800001663;[email protected];LDAP.SERVER.COM;1024 35 131057002239213764263627099108547501925287731311742942286788930775556419648865483768960345576253082450228562208107642206135992876630494830143899597135936566841409094870100055573569425410665510365545238751677692308677943427807426637133913499488233527734757673201849965347880843479632671824597968768822920700439 [email protected]:192.168.1.170 
    cn : Aaron Hoffman 
    gidNumber : 20 
    givenName : Aaron 
    homeDirectory : 99 
    loginShell : /bin/bash 
    objectClass : inetOrgPersonposixAccountshadowAccountapple-userextensibleObjectorganizationalPersontopperson 
    sn : Hoffman 
    uid : aaronh 
    uidNumber : 2643 
    userPassword : ******** 
#------------------------------- 

Répondre

1

Ma langue de choix serait Perl - mais seulement parce que je l'ai fait similaire opérations utilisant Perl et LDAP. Si je me souviens bien, cette commande ldapsearch vous donnera l'entrée LDIF complète pour chaque uid dans le groupe de test cn. Si c'est le cas, alors vous devrez le nettoyer un peu avant qu'il ne soit prêt pour la partie. Bien que ce ne soit certainement pas la solution la plus élégante, une méthode rapide et sale consiste à utiliser des backticks et à lancer la sortie de la commande via un grep. Cela retournera une bonne liste de tous les membres. De là, c'est juste une boucle foreach simple et vous avez terminé. Sans aucun essai ou savoir avec certitude ce que votre sortie LDAP ressemble, je partirais avec quelque chose comme ceci:

#!/usr/bin/perl 

# should return a list of "memberUid: name" entries 
@uids = `ldapsearch -x -b 'cn=testgroup,cn=groups,dc=ldap,dc=server,dc=com' | grep memberUid:`; 

foreach (@uids) { 
    $_ =~ s/memberUid: //; # get rid of the "uid: " part, leaving just the name 
    chomp $_;   # get rid of the pesky newline 
    system "als -b \"dc=ldap,dc=server,dc=com\" -V uid=$_ >> vcardlist.vcf"; 
} 

Comme je l'ai dit, je n'ai pas testé, et je ne sais pas exactement ce que le la sortie de votre ldapsearch ressemble, vous devrez peut-être l'ajuster un peu pour répondre à vos besoins exacts. Cela devrait suffire à vous faire passer.

Si quelqu'un a une meilleure idée j'aimerais l'entendre aussi.

+0

On dirait que ça devrait marcher pour moi. Je n'ai pas utilisé LDAP depuis des années, mais quand je l'ai fait, j'ai utilisé la bibliothèque Net :: LDAP pure-Perl. Bien que le noyau du traitement LDAP soit dans ce script als externe de toute façon, il ne serait pas vraiment utile ici, mais pourrait être utilisé pour remplacer l'invocation de ldapsearch. – araqnid

+0

Oui, vous avez absolument raison. Net :: LDAP pourrait certainement être utilisé ici pour obtenir les UID, mais il faudrait beaucoup plus de temps et d'effort pour travailler - bien plus, je pense, que l'OP voudrait dépenser pour un script d'utilisation unique quand ldapsearch est facilement accessible disponible. –

+0

Merci pour l'aide avec ceci. J'avais besoin de faire quelques changements. Quand j'ai couru ldapsearch, il sort chaque uid comme "memberUid". En outre, als n'a pas pu être trouvé, donc je devais lui dire d'utiliser Perl. Maintenant, le fichier vcardlist.vcf produit le résultat, mais le fichier ne semble avoir que la vcard testgroup ainsi qu'un autre groupe dont tous les utilisateurs font également partie. Des idées pour lesquelles ça ferait ça? – Aaron

Questions connexes