Ejemplos de operaciones sobre el LDAP de la FI

En este documento se muestran diversos ejemplos (código de los ejemplos) de operaciones LDAP sobre el servicio de directorio de la Facultad soportado en la máquina info.fi.upm.es. De las diversas opciones para acceder a este servicio, se ha optado por utilizar operaciones de línea de mandatos.

Acceso al nodo raíz de la Facultad

Empecemos visitando el nodo superior de la organización, que es de tipo organization y cuyo DN es dc=fi,dc=upm,dc=es. Para ello, se usará el siguiente mandato:
ldapsearch -H ldaps://info.fi.upm.es/ -LLL  -x -w micontraseña -D 'uid=fperez,ou=personal,dc=fi,dc=upm,dc=es' \
    -b 'dc=fi,dc=upm,dc=es' -s base
Dado que es la primera vez que aparece este mandato, vamos a explicar las distintas opciones especificadas en el mismo (nótese que las cuatro primeras opciones especifican aspectos generales de la operación y serán igual en todos los ejemplos): A continuación, se muestra la salida del mandato:
dn: dc=fi,dc=upm,dc=es
dc: fi
objectClass: dcObject
objectClass: organization
objectClass: labeledURIObject
o:: RmFjdWx0YWQgZGUgSW5mb3Jtw6F0aWNhIC0gVVBN
postalCode: 28660
l: Boadilla del Monte
st: Madrid
description:: RmFjdWx0YWQgZGUgSW5mb3Jtw6F0aWNhIChVbml2ZXJzaWRhZCBQb2xpdMOpY25p
 Y2EgZGUgTWFkcmlkKQ==
labeledURI: http://www.fi.upm.es
telephoneNumber: +34 913367399
facsimileTelephoneNumber: +34 913367412
postalAddress:: RmFjdWx0YWQgZGUgSW5mb3Jtw6F0aWNhIChVLlAuTS4pDQpDYW1wdXMgZGUgTW
 9udGVnYW5jZWRvDQpCb2FkaWxsYSBkZWwgTW9udGUNCjI4NjYwIC0gTWFkcmlkDQpTcGFpbg==
Nótese que, en primer lugar, aparece el DN del objeto accedido y, a continuación, los atributos del objeto recuperado.

Si cambiamos el ámbito para que sea de tipo -s one, se obtendrán los nodos de segundo nivel de la organización, que son de tipo organizationalUnit, entre los que se encuentran el correspondiente al personal de la facultad (personal), a los alumnos de la misma (alumnos), así como un nodo a partir del cual se despliegan las distintas agrupaciones que han definido los administradores de este servicio de directorio (grupo).

Si especificamos -s sub, u omitimos ese valor, muestra todo el árbol de objetos de la Facultad.

Acceso a mi entrada y a la de un alumno anónimo

Los empleados de este centro, entre los que me encuentro, están incluidos en el nodo personal, son de tipo inetOrgPerson y, en mi caso, el DN es uid=fperez,ou=personal,dc=fi,dc=upm,dc=es. Para ello, se usará el siguiente mandato:
ldapsearch -H ldaps://info.fi.upm.es/ -LLL -x -w micontraseña -D 'uid=fperez,ou=personal,dc=fi,dc=upm,dc=es' \
    -b 'uid=fperez,ou=personal,dc=fi,dc=upm,dc=es' -s base
Los alumnos están incluidos en el nodo alumnos, son de tipo inetOrgPerson. Se va a acceder a un alumno de prueba cuyo DN es uid=cprueba,ou=alumnos,dc=fi,dc=upm,dc=es, pero sólo vamos a mostrar algunos de los atributos del objeto. Para ello, se usará el siguiente mandato, donde se especifica al final del mandato los atributos que se quiere recuperar:
ldapsearch -H ldaps://info.fi.upm.es/ -LLL -x -w micontraseña -D 'uid=fperez,ou=personal,dc=fi,dc=upm,dc=es' \
    -b 'uid=cprueba,ou=alumnos,dc=fi,dc=upm,dc=es' -s base objectClass cn sn uid uidNumber mail homeDirectory
El siguiente ejemplo muestra el correo de un alumno dado su número de matrícula. Dado que el número de matrícula es parte del DN, no es necesario realizar una búsqueda sino que se accede directamente al registro buscado:
ldapsearch -H ldaps://info.fi.upm.es/ -LLL -x -w micontraseña -D 'uid=fperez,ou=personal,dc=fi,dc=upm,dc=es' \
    -b 'uid='$1',ou=alumnos,dc=fi,dc=upm,dc=es' -s base mail | grep -v ^dn

Búsquedas en el árbol

En este apartado se van a mostrar distintas búsquedas en el DIT de la Facultad.

El primer ejemplo muestra todos los miembros del personal que comparten el despacho recibido como argumento. Nótese que es suficiente con un ámbito que abarque a los nodos hijos para visitar todo el personal del centro. Observe que el filtro se especifica en notación prefija (polaca):

ldapsearch -H ldaps://info.fi.upm.es/ -LLL -x -w micontraseña -D 'uid=fperez,ou=personal,dc=fi,dc=upm,dc=es' \
    -b 'ou=personal,dc=fi,dc=upm,dc=es' -s one '(&(objectClass=inetOrgPerson)(roomNumber='$1'))' cn sn
El siguiente ejemplo imprime el número de despacho y de teléfono del profesor cuyo apellido se ha recibido como argumento:
ldapsearch -H ldaps://info.fi.upm.es/ -LLL -x -w micontraseña -D 'uid=fperez,ou=personal,dc=fi,dc=upm,dc=es' \
    -b 'ou=personal,dc=fi,dc=upm,dc=es' -s one '(&(objectClass=inetOrgPerson)(sn='*$1*'))' cn roomNumber telephoneNumber | grep -v ^dn
El siguiente ejemplo, que también usa un ámbito que afecta sólo a los hijos, obtiene los números de teléfono de los miembros del personal de nombre Fernando pero que no son del DATSI:
ldapsearch -H ldaps://info.fi.upm.es/ -LLL -x -w micontrasenha -D 'uid=fperez,ou=personal,dc=fi,dc=upm,dc=es' \
    -b 'ou=personal,dc=fi,dc=upm,dc=es' -s one '(&(objectClass=inetOrgPerson)(!(departmentNumber=DATSI))(cn=*Fernando*)(telephoneNumber=*))' cn telephoneNumber
El tercer ejemplo usa el ámbito por defecto (-s sub, que afecta a todo el sub-árbol) para enviar un correo a todas las personas vinculadas con el centro (profesores, alumnos, personal de servicio,...) que se llamen Fernando:
LISTA=`ldapsearch -H ldaps://info.fi.upm.es/ -LLL -x -w micontraseña -D 'uid=fperez,ou=personal,dc=fi,dc=upm,dc=es'  \
          -b 'dc=fi,dc=upm,dc=es' '(&(objectClass=inetOrgPerson)(cn=*Fernando*))' mail | grep -v ^dn | sed 's/^mail://'`
mail -s Felicidades  `echo $LISTA` << EOF
Felicidades....
EOF

Uso de grupos

Es frecuente el uso de grupos dentro del DIT de una institución para poder tratar de forma un conjunto de nodos. En esta sección se plantean ejemplos que hacen uso de esa funcionalidad.

El primer ejemplo obtiene un listado con todos los números de teléfono del personal de un departamento accediendo primero al grupo asociado con ese departamento y, a continuación, por cada miembro de ese grupo, obtiene su número de teléfono. Nótese que son todos accesos de ámbito base.

LISTA=`ldapsearch -H ldaps://info.fi.upm.es/ -LLL -x -w micontraseña -D 'uid=fperez,ou=personal,dc=fi,dc=upm,dc=es' \
          -b cn=$1,ou=dinamicos,ou=grupos,dc=fi,dc=upm,dc=es -s base memberUID | grep -v ^dn | sed 's/memberUid://'`
for U in `echo $LISTA`
do
    ldapsearch -H ldaps://info.fi.upm.es/ -LLL -x -w  micontraseña -D 'uid=fperez,ou=personal,dc=fi,dc=upm,dc=es' \
          -b 'uid='$U',ou=personal,dc=fi,dc=upm,dc=es' -s base telephoneNumber | grep -v ^dn |  sed 's/telephoneNumber://'
done
El segundo ejemplo imprime las direcciones de correo de todos los alumnos cuya matrícula empieza por la letra especificada:
LISTA=`ldapsearch -LLL -H ldaps://info.fi.upm.es/ -x -w \`cat contra.txt\` -D 'uid=fperez,ou=personal,dc=fi,dc=upm,dc=es' -b cn=matriculas$1,ou=grupos,dc=fi,dc=upm,dc=es -s base memberUID | grep -v ^dn | sed 's/memberUid://'`
for U in `echo $LISTA`
do
ldapsearch -H ldaps://info.fi.upm.es/ -LLL -x -w  `cat contra.txt` -D 'uid=fperez,ou=personal,dc=fi,dc=upm,dc=es' -b 'uid='$U',ou=alumnos,dc=fi,dc=upm,dc=es' '(mail=*)' -s base mail 2>/dev/null | grep -v ^dn |  sed 's/mail://'
done
El siguiente ejemplo crea una página web con todas las fotografías de los profesores de un departamento. Observe el uso de la opción -t para que la información de las fotografías quede almacenada en ficheros externos.
LISTA=`ldapsearch -H ldaps://info.fi.upm.es/ -LLL -x -w micontraseña -D 'uid=fperez,ou=personal,dc=fi,dc=upm,dc=es' \ 
          -b cn=$1,ou=dinamicos,ou=grupos,dc=fi,dc=upm,dc=es -s base memberUID | grep -v ^dn | sed 's/memberUid://'`
rm -rf fotos_dpto*; mkdir fotos_dpto
echo "<html><body>" >> fotos_dpto.html
for U in `echo $LISTA`
do
    IMG=`ldapsearch -H ldaps://info.fi.upm.es/ -LLL -x -w  micontraseña -D 'uid=fperez,ou=personal,dc=fi,dc=upm,dc=es'  \
             -b 'uid='$U',ou=personal,dc=fi,dc=upm,dc=es' -t -T fotos_dpto -s base jpegPhoto | grep -v ^dn |
             sed 's/jpegPhoto:< file:\/\/\///'`
    test $IMG || continue
    mv $IMG ${IMG}.jpg
    echo "<img src=$IMG.jpg><p>" >> fotos_dpto.html
done
echo "</body></html>" >> fotos_dpto.html

Operación compare

LDAP ofrece una operación para comparar si un determinado atributo de un objeto tiene un valor dado, pudiendo devolver, entre otros, los valores verdadero, si ese atributo tiene dicho valor, falso, si tiene asociado otro valor, o indefinido, si no tiene ese atributo.
ldapcompare -H ldaps://info.fi.upm.es/ -x -w micontraseña -D 'uid=fperez,ou=personal,dc=fi,dc=upm,dc=es' \
   'uid=fperez,ou=personal,dc=fi,dc=upm,dc=es' 'roomNumber: 4201'

Operaciones de modificación de una entrada

En esta sección se muestran ejemplos de operaciones que modifican mi entrada del DIT del centro.

El primer ejemplo me asigna un número de despacho:

ldapmodify -H ldaps://info.fi.upm.es/ -x -w micontraseña -D 'uid=fperez,ou=personal,dc=fi,dc=upm,dc=es' << EOF
dn: uid=fperez,ou=personal,dc=fi,dc=upm,dc=es
add: roomNumber
roomNumber: 4201
-
EOF
El segundo me lo cambia:
ldapmodify -H ldaps://info.fi.upm.es/ -x -w micontraseña -D 'uid=fperez,ou=personal,dc=fi,dc=upm,dc=es' << EOF
dn: uid=fperez,ou=personal,dc=fi,dc=upm,dc=es
changetype: modify
replace: roomNumber
roomNumber: 4202
-
EOF
El tercero me lo elimina:
ldapmodify -H ldaps://info.fi.upm.es/ -x -w micontraseña -D 'uid=fperez,ou=personal,dc=fi,dc=upm,dc=es' << EOF
dn: uid=fperez,ou=personal,dc=fi,dc=upm,dc=es
delete: roomNumber
-
EOF