UNIVERSIDAD DE EL SALVADOR FACULTAD MULTIDISCIPLINARIA DE OCCIDENTE DEPARTAMENTO DE INGENIERIA
CATEDRA: Protocolos de comunicación
TRABAJO: “Cluster de replicación de datos”
DOCENTE: Ing. Juan Carlos Peña
PRESENTAN: Magaña Dahbura, José Rodrigo Minero Morales, Roberto Orlando Rodríguez Umaña, Víctor Manuel
FECHA DE ENTREGA: Santa Ana 18 de junio de 2009
CLUSTER REPLICACION DE DATOS CON LDAP SOBRE DEBIAN LENNY/SQUEEZE Introducción En el presente material se explica, de forma concisa, un esquema de migración y replica de datos entre servidores LDAP. El esquema involucra tres servidores LDAP, un servidor inicial con un esquema básico realizado a la medida de la organización; un segundo servidor que a su contenido agregará el del primero, sea por referencia o por migración; y un tercer servidor de réplica de datos del segundo por medio de una relación maestro-esclavo.
Aunque es obvio, aclaramos que los equipos deben estar interconectados y ser ruteables entre ellos. Para el caso, hemos supuesto la existencia de un servidor DNS. Este servicio puede ser provisto desde otro equipo físico, sin embargo, en nuestro caso lo hemos configurado en un equipo que también corre el servicio de LDAP, aunque dicha configuración es un tema adicional y no se aborda aquí. El servicio de DNS debe responder con las siguientes resoluciones:
Dirección IP
FQDN
192.168.1.3
ldap.amnet.tigo.com.sv
192.168.1.4
slave.amnet.tigo.com.sv
192.168.1.100
Ldap.tigo.com.sv
Creación del archivo de definición del esquema LDAP incluye archivos de esquema por defecto, sin embargo, se pueden crear definiciones de atributos y clases a la medida dentro de un fichero que, como buena práctica, suele ser llamado “local.schema” y estar contenido en el directorio “/etc/ldap/schema”. Par crear tanto un atributo como una clase, se debe hacer uso de un OID, el cual no es mas que un identificador de los elementos; su sintaxis es de numeros separados por puntos. Los OID son únicos y se pueden registrar los creados por cada organización estructuralmente bajo un OID asignado a la organización, sin embargo, para fines experimentales se pueden crear OIDs experimentales bajo 1.1, específicamente, se debe utilizar como base 1.1.2.1 para los atributos y 1.1.2.2 para las clases. La sintaxis para la creación de atributos se define de la siguiente manera: AttributeTypeDescription = "(" whsp numericoid whsp
; AttributeType identifier
[ "NAME" qdescrs ]
; name used in AttributeType
[ "DESC" qdstring ]
; description
[ "OBSOLETE" whsp ] [ "SUP" woid ]
; derived from this other ; AttributeType
[ "EQUALITY" woid
; Matching Rule name
[ "ORDERING" woid
; Matching Rule name
[ "SUBSTR" woid ]
; Matching Rule name
[ "SYNTAX" whsp noidlen whsp ] ; Syntax OID [ "SINGLE-VALUE" whsp ]
; default multi-valued
[ "COLLECTIVE" whsp ]
; default not collective
[ "NO-USER-MODIFICATION" whsp ]; default user modifiable [ "USAGE" whsp AttributeUsage ]; default userApplications whsp ")" Donde whsp equivale a un espacio. Otra práctica muy utilizada y con fines distintivos, aunque no obligatoria es iniciar el nombre de los atributos con “x-”. Para ejemplificar lo dicho, mostramos la definición de un atributo utilizado para los documentos de identificación personal: attributetype ( 1.1.2.1.1 NAME 'x-numDocumento' DESC 'Numero de Documento Personal' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{20} ) Podemos notar que se utiliza el primer OID utilizado para atributos (1.1.2.1.1) y al atributo se le asigna el nombre “x-numDocumento” y la descripción “Numero de Documento Personal”. Se establen criterios de igualdad y ordenamiento para cadenas ignorando la existencia de mayúsculas y se define la sintaxis como Cadena de caracteres con longitud 20. Los tipos de sintaxis, así como las reglas de igualación y ordenación se pueden encontrar en la documentación de OpenLDAP (http://www.openldap.org). Los atributos también pueden heredar de otros atributos; aspecto que es notorio en el ejemplo completo mostrado con posterioridad. Por su parte, la sintaxis de definición de las clases es:
ObjectClassDescription = "(" whsp numericoid whsp
; ObjectClass identifier
[ "NAME" qdescrs ] [ "DESC" qdstring ] [ "OBSOLETE" whsp ] [ "SUP" oids ]
; Superior ObjectClasses
[ ( "ABSTRACT" / "STRUCTURAL" / "AUXILIARY" ) whsp ] ; default structural [ "MUST" oids ]
; AttributeTypes
[ "MAY" oids ]
; AttributeTypes
whsp ")" Para el caso, citamos el ejemplo de la clase de definición de una persona: objectclass ( 1.1.2.2.1 NAME 'persona' DESC 'Clase persona, generica para diversos fines organizacionales' SUP person MUST ( x-id $ x-numDUIoPasaporte $ x-NIT $ xfechaNacimiento $ x-nacionalidad $ x-sexo $ x-direccionResidencial ) MAY ( x-correoElectronico $ x-telefonoResidencial $ xtelefonoMovil ) ) En primer lugar, se hace uso del primer OID asignable para clases (1.1.2.2.1) y se le asigna como nombre “persona”, especificando que se heredará de la clase “person”. Además, podemos notar que se hace uso de los atributos que han sido creados con anterioridad. Los atributos incluídos dentro de MUST son obligatorios, mientras que los incluídos dentro de MAY son opcionales. Lo que habría que hacer entonces para tener un fichero que defina esquemas propios es crear y editar el archivo “local.schema”:
# nano /etc/ldap/schema/local.schema El fichero completo debe quedar de una manera similar a la siguiente: ########################### # DEFINICION DE ATRIBUTOS # ########################### #Atributos referentes a documentos de identificacion personal attributetype ( 1.1.2.1.1 NAME 'x-numDocumento' DESC 'Numero de Documento Personal' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{20} ) attributetype ( 1.1.2.1.2 NAME 'x-numDUIoPasaporte' DESC 'Numero Unico de Identidad o Numero de Pasaporte' SUP x-numDocumento SINGLE-VALUE ) attributetype ( 1.1.2.1.3 NAME 'x-NIT' DESC 'Numero de Identificacion Tributaria' SUP x-numDocumento SINGLE-VALUE ) attributetype ( 1.1.2.1.4 NAME 'x-numISSS' DESC 'Numero de carnet de Seguro Social'
SUP x-numDocumento SINGLE-VALUE ) attributetype ( 1.1.2.1.5 NAME 'x-NUP' DESC 'Numero Unico de Prevision' SUP x-numDocumento SINGLE-VALUE ) attributetype ( 1.1.2.1.6 NAME 'x-licConducir' DESC 'Numero de Licencia de Conducir' SUP x-numDocumento ) #Atributos referentes a datos personales diversos attributetype ( 1.1.2.1.7 NAME 'x-fechaNacimiento' DESC 'Fecha de Nacimiento en formato DD/MM/AAAA' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{10} SINGLE-VALUE ) attributetype ( 1.1.2.1.8 NAME 'x-nacionalidad' DESC 'Pais de nacionalidad en codigo de dos letras' SUP countryName SINGLE-VALUE ) attributetype ( 1.1.2.1.9 NAME 'x-sexo'
DESC 'Sexo de la persona (M|F)' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{1} SINGLE-VALUE ) #Atributos de Identificacion attributetype ( 1.1.2.1.10 NAME 'x-id' DESC 'Identificador alfanumerico del objeto para fines organizacionales' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{10} SINGLE-VALUE ) #Atributos de contacto attributetype ( 1.1.2.1.11 NAME 'x-correoElectronico' DESC 'Direccion del buzon de correo electronico' SUP emailAddress ) attributetype ( 1.1.2.1.12 NAME 'x-telefonoResidencial' DESC 'Numero telefonico residencial' SUP telephoneNumber ) attributetype ( 1.1.2.1.13 NAME 'x-telefonoMovil' DESC 'Numero telefonico movil'
SUP telephoneNumber ) attributetype ( 1.1.2.1.14 NAME 'x-telefonoLaboral' DESC 'Numero telefonico del lugar de trabajo' SUP telephoneNumber ) attributetype ( 1.1.2.1.15 NAME 'x-direccionResidencial' DESC 'Direccion postal residencial' SUP postalAddress ) attributetype ( 1.1.2.1.16 NAME 'x-direccionLaboral' DESC 'Direccion postal laboral' SUP postalAddress ) #Atributos de informacion adicional attributetype ( 1.1.2.1.17 NAME 'x-fechaAceptacionCliente' DESC 'Fecha de inicio como cliente en formato DD/MM/AAAA' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{10} SINGLE-VALUE ) attributetype ( 1.1.2.1.18 NAME 'x-ingresoMensual' DESC 'Ingreso monetario promedio mensual' EQUALITY integerMatch ORDERING integerOrderingMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
######################## # DEFINICION DE CLASES # ######################## objectclass ( 1.1.2.2.1 NAME 'persona' DESC 'Clase persona, generica para diversos fines organizacionales' SUP person MUST ( x-id $ x-numDUIoPasaporte $ x-NIT $ x-fechaNacimiento $ x-nacionalidad $ x-sexo $ x-direccionResidencial ) MAY ( x-correoElectronico $ x-telefonoResidencial $ xtelefonoMovil ) ) objectclass ( 1.1.2.2.2 NAME 'empleado' DESC 'Empleado de la organizacion' SUP persona MUST ( x-numISSS $ x-NUP $ x-licConducir ) ) objectclass ( 1.1.2.2.3 NAME 'cliente' DESC 'Empleado de la organizacion' SUP persona MUST ( x-fechaAceptacionCliente $ x-ingresoMensual ) MAY ( x-telefonoLaboral $ x-direccionLaboral ) )
Instalación y configuración inicial del servidor LDAP En primer lugar, debemos instalar el software requerido para levantar el servicio de LDAP. # apt-get install slapd
Al momento de instalar, nos pedirá algunos parámetros de configuración como la contraseña para el uso de LDAP. Por defecto, el árbol se estructura a partir del nombre del dominio al que pertenece el equipo, si se desea cambiar esto o alguna otra configuración como compatibilidad con versiones anteriores de LDAP, entre otras, se puede hacer uso de: # dpkg-reconfigure slapd Ahora, podemos pasar a editar el principal archivo de configuración de LDAP, nombrado “slapd.conf”: # nano /etc/ldap/slapd.conf En primera instancia, encrontraremos la inclusión de los archivos contenedores de la definición del esquema. Debemos crear una entrada de inclusión para el fichero que con anterioridad ha sido creado para la definición de atributos y clases propias # Inclusion de esquemas locales include
/etc/ldap/schema/local.schema
El siguiente paso fundamental de configuración es establecer un súper usuario para los fines del uso de LDAP: rootdn
"cn=admin,dc=amnet,dc=com,dc=sv"
rootpw
{SSHA}PuYGSwerIy/NgXGE4gkf7/GlV8WozboD
En este caso particular, se ha hecho uso de una contraseña encriptata para esto utilizamos la siguiente línea de comandos: # slappasswd Luego introducimos la contraseña y copiamos el texto equivalente encriptado que nos devuelve para instroducirlo como valor de “rootpw” dentro del fichero slapd.conf. Guardamos los cambios realizados sobre el archivo de configuración y cerramos. Para simplificar las tareas y tener un software de administración relativamente sencillo y con interfaz gráfica podemos instalar phpLDAPadmin: # apt-get install phpldapadmin Para poder hacer uso de esta aplicación de administración web para LDAP, abrimos un navegador y vamos a la url “localhost/phpldapadmin”, nos logueamos y podemos hacer uso del explorador del árbol hubicado en el lado izquierdo para seleccionar un área específica de la estructura de árbol de nuestro servidor LDAP y utilizamos las opciones de la parte derecha para hacer modificaciones. La siguiente imagen muestra la interfaz de phpLDAPadmin:
Si deseamos agregar un objeto de las clases que hemos creado con anterioridad para nuestro esquema, seleccionamos la entrada en la que estará contenida y vamos a la opción “Create a child entry”, con la variante que la clase no aparecerá listada por lo que tenemos que seleccionar la opción “Default”:
Nos aparecerá un cuadro de diálogo en el que debemos seleeciona la calse que hemos creado y de cuyo tipo queremos agregar un objeto. Para el caso, hemos ubicado la clase “empleado” definida en el fichero “local.schema”:
Nos aparecerá la pantalla en que podemos asignar valores a los atributos del objeto. Para
documentación
adicional
sobre
el
uso
de
phpLDAPadmin,
remítase
a
http://phpldapadmin.sourceforge.net.
Uso de referencias como opción a la migración de datos En el caso planteado, se tiene un servidor LDAP del que se desea obtener la información por medio de otro servidor de nivel superior. Una opción sería hacer una copia de todos los datos contenidos en el primero al segundo, sin embargo, en bases de datos con gran cantidad de contenido, esto puede tener algún costo considerable de recursos, por lo que puede desearse tener un directorio de datos “particionado” como se le suele llamar. Para poder realizar esta tarea, contamos con la clase “referral”, incluída en el core de LDAP. Em primer lugar, debemos crear un fichero con la siguiente estructura LDIF para especificar los valores para los atributos del objeto:
$ nano agregarReferencia.ldif El fichero debe contener la siguiente estructura: dn:ou=empleadosAmnet,ou=empleados,dc=tigo,dc=com,dc=sv dc:empleadosAmnet objectClass: referral objectClass: extensibleObject ref: ldaps://ldap.amnet.tigo.com.sv/ou=empleados,dc=amnet,dc=com,dc=sv
En primer lugar, se especifica el dn del lugar del árbol en que estará contenida la referencia, para el caso, dentro de la unidad organizacional “empleados” se ha creado una nueva unidad organizacional llamada “empleadosAmnet”, nombre que pasa a ser el mismo componente de dominio. Luego, se especifica que indica que va a ser una instancia de las clases “referral” y “extensibleObjetc”. Por último, se especifica hacia donde estará apuntando la referencia por medio de la URI del recurso al que se hace referencia. Vale aclarar que es la URI la que define si se hará uso de transporte seguro o no, en este caso particular, se está haciendo uso de TLS. Guardamos el fichero y cerramos el editor. A este momento, ya existe la referencia y podemos acceder a datos del otro servidor. Si estamos utilizando ldapsearch, será necesario utilizar el parámetro -C para indicar que la búsqueda debe seguir las referencias. Por ejemplo, la sentencia para la búsqueda podría quedar de la siguiente manera: $ ldapsearch -x -b dc=tigo,dc=com,dc=sv -D cn=admin,dc=tigo,dc=com,dc=sv “(objectclass=*)” * -H ldap://ldap.tigo.com.sv -W -C Con esta sentencia estaríamos obteniendo como resultado todos los objetos que se encuentren estructuralmente debajo de la raíz del árbol de tigo. Si se desea eliminar la referencia, se debe hacer por medio del dn de la misma y haciendo uso del
parámetro -M, así por ejemplo: $ ldapdelete ou=clientesAmnet,ou=clientes,dc=tigo,dc=com,dc=sv -D cn=admin,dc=com,dc=sv -W -M
Servidor OpenLDAP con SSL/TLS Software utilizado: •Debian Lenny/Squeeze •OpenLDAP •OpenSSL •gnuTLS
1.Instalación de paquetes adicionales: # apt-get install openssl gnutls-bin 2.Creación de certificados: Para habilitar la conexión SSL/TLS en el servidor, se necesita un certificado de servidor. Además, en un saludo SSL el certificado de servidor solo provee una conexión segura y encriptada al servidor. Si se desea autenticación del cliente, entonces se le debe presentar al servidor LDAP un certificado de cliente y su llave. Para crear estos certificados utilizaremos comandos de OpenSSL. Cuando se le pregunte por el 'Common Name', se debe introducir el nombre distinguido calificado del servidor, ej: tigo.com.sv y no 'su nombre' como lo sugiere OpenSSL. Este es un error que causa la gran mayoría de fallas de certificados de servidor. Certificado dado por un CA Para crear un CA y los certificados de servidor y su llave privada, se siguen los siguientes pasos:
1)Crear un directorio para crear y firmar los certificados. #mkdir ~/certs
2)Cambiarse al directorio recién creado y correr el script CA de OpenSSL. #cd ~/certs #/usr/lib/ssl/misc/CA.pl -newca
Esto crea el cacert.pem y el cakey.pem en el directorio donde se tiene especificado que estará el CA. 3)Crear la petición de firmado para el certificado de servidor (Certificate Signing Request) #openssl req -newkey rsa:1024 -nodes -keyout newreq.pem -out newreq.pem
El resultado es newreq.pem 4)Hacer que la CA firme la CSR #/usr/lib/ssl/misc/CA.pl -sign
Esto crea el newcert.pem (certificado de servidor firmado por la CA) con una llave primaria newreq.pem. 5)Mover los certificados al lugar deseado: #cp /etc/ssl/CA/cacert.pem /etc/ldap/ssl/cacert.pem #mv newcert.pem /etc/ldap/ssl/servercrt.pem #mv newreq.pem /etc/ldap/ssl/serverkey.pem
Tiene que estar seguro que el dueño de los certificados es el mismo usuario que ejecuta slapd. Los certificados deben poder ser leídos públicamente. 6)Hacer el certificado de CA disponible a los clientes LDAP. Si el cliente esta en la misma máquina, tiene que copiar el cacert.pem a un lugar que sea accesible por el cliente. Si los clientes están en otras computadoras, entonces el cacert.pem debe ser copiado a esas computadoras y hacerlo accesible. Certificados de cliente Los certificados de clientes se crean de forma similar a los certificados de servidor. Usando los mismos pasos anteriormente descritos, los únicos cambios son los siguientes:
Paso 1 y 2: Saltarlo, la CA no tiene que ser creado de nuevo. Paso 3: El mismo comando pero ingrese el nombre del cliente en vez del nombre del servidor cuando se le pregunte por el Common Name. Paso 4: El mismo comando resultando con los archivos para el certificado y la llave primaria. Paso 5: Mover los certificados al lugar deseado por el usuario y renombrarlos: #mv newcert.pem ~/certs/ldap.client.pem #mv newreq.pem ~/certs/ldap.client.key.pem
Paso 6: Saltarlo.
3.Configuración de LDAP. Para configurar OpenLDAP, hay que considerar dos áreas: el servidor (slapd.conf) y el cliente(ldap.conf) Servidor: Modificar el archivo slapd.conf de manera que incluya por lo menos las siguientes directivas: TLSCipherSuite TLS_RSA_AES_256_CBC_SHA1 TLSCACertificateFile /etc/ldap/ssl/cacert.pem TLSCertificateFile /etc/ldap/ssl/servercrt.pem TLSCertificateKeyFile /etc/ldap/ssl/serverkey.pem # Si se requiere autenticación de clientes #TLSVerifyClient demand … o si no se desea TLSVerifyClient never
Cliente: El archivo ldap.conf contiene valores por defecto para todos los clientes LDAP de un sistema. Si se requiere valores específicos para un usuario, entonces se aplican las mismas
directivas para el archivo ldaprc o .ldaprc en el home del usuario. Si se está implementando autenticación de cliente, es requerido que se añada el certificado de cliente y su llave al archivo ldaprc or .ldaprc Ejemplo de ldap.conf # # Global LDAP settings # # See ldap.conf(5) for details # This file should be world readable but not world writable. HOST ldap.tigo.com.sv PORT 636 TLS_CACERT /etc/ldap/ssl/cacert.pem TLS_REQCERT demand
Esta configuración se conectará a ldaps://ldap.tigo.com.sv:636 sin la necesidad de especificar el host y el puerto en los comandos del cliente. Ejemplo de ldaprc Este archivo se usa para sobreescribir valores globales de LDAP y para establecer el certificado y llave privada usada para establecer autenticación del cliente. # # User specific LDAP settings # # Override global directive (if set) TLS_REQCERT demand # client authentication TLS_CERT /home/usuario/certs/ldap.client.pem TLS_KEY /home/usuario/certs/ldap.client.key.pem
4.Pruebas
Iniciamos el servidor en modo debug con el comando: #slapd -d127 -h "ldap:/// ldaps:///" Así iniciamos el servidor escuchando en los puertos 389 y 636. Para hacer que OpenLDAP inicie automáticamente en ambos puertos se tiene que modificar el archivo /etc/default/slapd, quitando el comentario a la línea siguiente: SLAPD_SERVICES="ldaps://127.0.0.1:636/ ldap://127.0.0.1:389/"
Podemos probar la conexión segura con búsquedas, por ejemplo si el cliente está en la misma computadora que el servidor escribimos: $ldapsearch -x -b 'dc=tigo,dc=com,dc=sv' -D "cn=admin,dc=tigo,dc=com,dc=sv" '(objectclass=*)' -W
Si el cliente es una computadora distinta: $ldapsearch -x -b 'dc=tigo,dc=com,dc=sv' -D "cn=admin,dc=tigo,dc=com,dc=sv" '(objectclass=*)' -H ldaps://ldap.tigo.com.sv -W
Réplica de un servidor de OpenLDAP con Syncrepl y SSL/TLS El motor de replicacion LDAP Sync (Syncrepl por sus siglás en inglés), es un motor de replicación que permite a un consumidor mantener una copia de un directorio. Para configurar una computadora que contenga una réplica sincronizada exacta de un directorio de OpenLDAP se tienen que configurar dos partes: el servidor y la réplica. 1.Servidor Como utilizaremos una conexión SSL/TLS, el servidor tiene que estar configurado como lo hicimos en la sección de configuración de SSL/TLS. Además de esto se tiene que modificar el archivo slapd.conf para que incluya las siguientes directivas: moduleload syncprov.la overlay syncprov syncprov-checkpoint 100 05 syncprov-sessionlog 100
2.Réplica Como utilizaremos una conexión SSL/TLS, la réplica tiene que estar configurada como un cliente, de la misma manera como lo hicimos en la sección de configuración de SSL/TLS. Además se tiene que modificar el archivo slapd.conf para que incluya las siguientes directivas:
moduleload syncprov.la overlay syncprov syncprov-checkpoint 100 05 syncprov-sessionlog 100 … … ##Define la dirección de ldap del servidor maestro que puede aceptar ##las solicitudes de actualización. rootdn
"cn=admin,dc=tigo,dc=com,dc=sv"
rootpw
{SSHA}tjbT+uoHBgqAsnGseYJN/Gmgu3XgjtP0
syncrepl rid=123 provider=ldaps://ldap.tigo.com.sv:636 #el servidor o proveedor type=refreshOnly interval=00:00:00:10
#se hará refrezco cada 10 segundos
searchbase="dc=tigo,dc=com,dc=sv"
#desde donde se replicará
bindmethod=simple binddn="cn=admin,dc=tigo,dc=com,dc=sv" #quién se conecta credentials=rootroot updateref ldaps://ldap.tigo.com.sv
#contraseña #indica el servidor y tipo de conexión
Creación de aplicación Inteligente de Migración y aplicación de Búsqueda en Servidores OpenLDAP Para el desarrollo de las aplicaciones se utilizó Java Naming and Directory Interface (JNDI). JNDI es una Interfaz de Programación de Aplicaciones (API) para servicios de directorio. Esto permite a los clientes descubrir y buscar objetos y nombres a través de un nombre. La API JNDI define un contexto que especifica donde buscar un objeto. El contexto inicial se usa normalmente como punto de partida. El contexto inicial será usado para buscar un nombre. El contexto inicial es análogo a la raíz de un árbol de directorios para un sistema de ficheros. La aplicación inteligente de migración y la de búsqueda comparten las mismas clases básicas: Entrada, LDAPConexion, LDAPManager. El migrador inteligente utiliza además la clase MigrationAssitant.
Descripción General de la clase Entrada Descripción Class Entrada java.lang.Object java.util.Dictionary java.util.Hashtable arabrab.clases.Entrada All Implemented Interfaces: java.io.Serializable, java.lang.Cloneable, java.util.Map public class Entrada extends java.util.Hashtable Esta clase representa una entrada con atributos en un servidor OpenLDAP.
________________________________________________________________________
Constructores Entrada public Entrada() Crea un nuevo objeto Entrada. Los parámetros por defecto son: dn= "", nombreCorto="", padre=null. Entrada public Entrada(Entradaentry) Crea un nuevo objeto Entrada. Parameters:
entry - Es la representación de una entrada en el servidor.
________________________________________________________________________
Métodos en Detalle setDN public void setDN(java.lang.String dn) Establece el DN de esta Entrada. Parameters: dn - El nombre distintivo de esta Entrada. getDN public java.lang.String getDN() Obtiene el DN de ésta Entrada. Returns: El nombre distintivo para esta Entrada.
getNombreCorto public java.lang.String getNombreCorto() Obtiene el nombre corto de esta Entrada. Returns: El nombre corto de esta Entrada.
setNombreCorto public void setNombreCorto(java.lang.String nombreCorto)
Establece el nombre corto de ésta Entrada. Parameters: nombreCorto - El nombre corto para esta Entrada.
getPadre public Entrada getPadre() Obtiene la Entrada padre de esta Entrada. Returns: La entrada superior de esta Entrada en el servidor. Retorna null si no tiene superior.
setPadre public void setPadre(Entrada padre) Establece quien es la entrada padre de ésta Entrada. Parameters: padre - La entrada superior para esta Entrada en el servidor.
toString public java.lang.String toString() Representa en texto esta Entrada. La representación textual de esta Entrada es su nombre corto. Overrides: toString in class java.util.Hashtable Returns: Un texto que representa esta Entrada en el servidor.
Descripción General de la clase LDAPConexion Descripción Class LDAPConexion java.lang.Object lucia.clases.LDAPConexion public class LDAPConexionextends java.lang.Object Esta clase representa una conexión con un servidor OpenLDAP.
________________________________________________________________________
Constructores LDAPConexion public LDAPConexion(java.lang.String host, int puerto, java.lang.String dnUser, java.lang.String psswUser) Crea un nuevo objeto LDAPConexion.
Parameters: host - El host con el que se establecerá la conexión. puerto - El número de puerto donde se enlazará la conexión. dnUser - El DN del Usuario con que el que se conectará. psswUser - Es la contrasena del Usuario con que el que se conectará.
________________________________________________________________________
Métodos en Detalle getHost public java.lang.String getHost() Obtiene el host de ésta LDAPConexion. Returns: El host con el que ha establecido la conexión.
setHost public void setHost(java.lang.String host) Establece el host de ésta LDAPConexion. Parameters: host - El host con el que se establecerá la conexión.
getPuerto public int getPuerto() Obtiene el puerto de ésta LDAPConexion. Returns: El puerto con el que se ha enlazado la conexión.
setPuerto public void setPuerto(int puerto) Establece el puerto de ésta LDAPConexion. Parameters: puerto - El puerto con el que se establecerá la conexión.
getDnUser public java.lang.String getDnUser() Obtiene el DN del usuario de ésta LDAPConexion. Returns: El DN del Usuario con que el que se ha establecido la conexión.
setDnUser public void setDnUser(java.lang.String dnUser) Establece el DN del usuario para ésta LDAPConexion. Parameters: dnUser - El DN del Usuario con que el que se establecerá la conexión.
getPsswUser public java.lang.String getPsswUser() Obtiene la contraseña de usuario para ésta LDAPConexion. Returns: El contrasena del Usuario con que el que se ha establecido la conexión.
setPsswUser public void setPsswUser(java.lang.String psswUser) Establece el passwor del usuario para ésta LDAPConexion. Parameters: psswUser - La contraseña del usuario con que el que se establecerá la conexión.
open public javax.naming.directory.DirContext open() throws javax.naming.NamingException Abre la conexión con el servidor LDAP. Returns: La interfaz de servicio de directorio. Este contiene los métodos para examinar y actualizar los atributos asociados con los objetos, además de buscar en el servidor. Throws: javax.naming.NamingException
close public void close(javax.naming.directory.DirContext dc) Cierra la conexión con el servidor LDAP. Parameters: dc - La interfaz de servicio de directorio.
Descripción General de la clase LDAPManager
Descripción Class LDAPManager java.lang.Object lucia.clases.LDAPManager
public class LDAPManagerextends java.lang.Object Esta clase representa un objeto que administra el acceso a un servidor OpenLDAP. Esta permite realizar búsquedas y agregar nuevas entradas al directorio.
________________________________________________________________________
Constructores LDAPManager public LDAPManager()
Crea un nuevo objeto LDAPManager. ________________________________________________________________________
Métodos en Detalle getDirectoryContext public javax.naming.directory.DirContext getDirectoryContext() Obtiene la interfaz de servicio de directorio de este LDAPManager. Returns: El DirContext de éste LDAPManager.
setDirectoryContext public void setDirectoryContext(javax.naming.directory.DirContext directoryContext) Establece la interfaz de servicio de directorio de este LDAPManager. Parameters: directoryContext - La interfaz de servicio de directorio
getLDAPConexion public LDAPConexion getLDAPConexion() Obtiene la LDAPConexion de este LDAPManager. Returns: La conexión LDAP con el servidor.
setLDAPConexion public void setLDAPConexion(LDAPConexion LDAPConexion) Establece la LDAPConexion de este LDAPManager. Parameters: LDAPConexion - La LDAPConexion a establecer en este LDAPManager.
buscar public java.util.ArrayList<Entrada> buscar(java.lang.String base, java.lang.String alcance, java.lang.String filtro, java.lang.String[] atributos) throws javax.naming.directory.InvalidSearchFilterException,javax.naming.NameNotFou
ndException,javax.naming.NoPermissionException,javax.naming.CommunicationEx ception,javax.naming.NamingException Busca una o varias entradas en el directorio OpenLDAP. Parameters: base - Es el DN a partir de donde se empezará a buscar. alcance - Es el nivel que baja el LDAPManager en el servidor para encontrar las entradas que correspondan con el criterio de búsqueda. Los valores que puede tomar el alcance son: base cuando se desea buscar todas las entradas que correspondan exactamente con el DN de la base. one cuando se desea buscar un nivel por debajo de la base. Y sub cuando se quiere buscar todas las entradas que se encuentran por debajo de la base, incluyendo las entradas anidadas. Si no se pasa un valor de estos, el valor por defecto es sub . filtro - Es un filtro de búsqueda. atributos - Es la lista de atributos de las entradas que nos interesa que la búsqueda arroje. Returns: Una lista de Entradas encontradas en el servidor que corresponde con el criterio de la búsqueda. Throws: javax.naming.directory.InvalidSearchFilterException - Excepción lanzada cuando el filtro de la búsqueda en un valor inválido. javax.naming.NameNotFoundException - Excepción lanzada cuando el DN de la base a partir de donde deseamos buscar, no se ha encontrado en el servidor. javax.naming.NoPermissionException - Excepción lanzada cuando el usuario con el se conectó al servidor no posee los privilegios para realizar búsquedas. javax.naming.CommunicationException - Excepción lanzada cuando al realizar la búsqueda ha existido un error de conexión con el servidor. javax.naming.NamingException - Excepción lanzada cuando la base de búsqueda no corresponde a un DN válido.
agregar public void agregar(Entrada entrada, java.util.ArrayList<javax.naming.directory.Attribute> a tributosExtra) throws javax.naming.directory.SchemaViolationException, javax.naming.directory.InvalidAttributesException, javax.naming.NameAlreadyBoundException, javax.naming.NoPermissionException, javax.naming.CommunicationException, javax.naming.NamingException Agrega una nueva Entrada al directorio LDAP. Parameters: entrada - Es el objeto Entrada que deseamos agregar al servidor. atributosExtra - Son otros atributos agregados que deseamos que esta entrada aloje en el servidor. Por ejemplo esto es útil cuando una entrada tiene varios cn o varios ou. Throws: javax.naming.directory.SchemaViolationException - Excepción lanzada cuando se está tratando de agregar atributos a una Entrada, cuyo esquema dentro del servidor no lo soporta. javax.naming.directory.InvalidAttributesException - Excepción lanzada cuando se trata agregar un atributo desconocido a la entrada en el servidor. javax.naming.NameAlreadyBoundException - Excepción lanzada cuando la entrada que se desea agregar, ya existe en el servidor. javax.naming.NoPermissionException - Excepción lanzada cuando el usuario con el que se conectó al servidor no posee los privilegios para agregar entradas. javax.naming.CommunicationException - Excepción lanzada cuando al tratar de agregar la entrada ha existido un error de conexión con
el servidor. javax.naming.NamingException - Excepción lanzada en cualquier otro tipo de error.
Descripción General de la clase MigrationAssistant Descripción Class MigrationAssistant java.lang.Object lucia.clases.MigrationAssistant
public class MigrationAssistantextends java.lang.Object Esta clase representa un Asistente de migración entre dos servidores OpenLDAP.
________________________________________________________________________
Constructores MigrationAssistant public MigrationAssistant(LDAPManager origen, LDAPManager destino) Crea un nuevo objeto para la asistencia de migración entre servidores. Parameters: origen - El administrador de acceso para el servidor de origen. destino - El administrador de acceso para el servidor de destino.
________________________________________________________________________
Métodos en Detalle getLdapManagerOrigen public LDAPManager getLdapManagerOrigen() Obtiene el administrador de acceso del servidor de origen.
Returns: El administrador de acceso del servidor de origen.
setLdapManagerOrigen public void setLdapManagerOrigen(LDAPManager ldapManagerOrigen) Establece el administrador de acceso para servidor de origen. Parameters: ldapManagerOrigen - El administrador de acceso para el servidor de origen.
getLdapManagerDestino public LDAPManager getLdapManagerDestino() Obtiene el administrador de acceso del servidor de destino. Returns: El administrador de acceso del servidor de destino.
setLdapManagerDestino public void setLdapManagerDestino(LDAPManager ldapManagerDestino) Establece el administrador de acceso para servidor de destino. Parameters: ldapManagerDestino - El administrador de acceso para el servidor de destino.
getEntradas public java.util.ArrayList<Entrada> getEntradas() Obtiene las entradas que migrará este asistente. Returns:
Las entradas a migrar por este asistente.
setEntradas public void setEntradas(java.util.ArrayList<Entrada> entradas) Establece las entradas que migrará este asistente. Parameters: entradas - Las entradas que migraŕa este asistente.
getDestino public Entrada getDestino() Obtiene la Entrada dentro del servidor de destino donde se alojarán las entradas a migrar. Returns: La entrada dentro del servidor de destino donde se migrarán los datos.
setDestino public void setDestino(Entrada destino) Establece la Entrada dentro del servidor de destino donde se alojarán las entradas a migrar. Parameters: destino - La entrada dentro del servidor de destino donde se migrarán los datos.
getNotificaciones public java.util.ArrayList<java.lang.String> getNotificaciones() Obtiene las notificaciones de estado para cada entrada migrada.
Returns: Las notificaciones de estado de migración para cada entrada migrada.
isConsevarAtributos public boolean isConsevarAtributos() Obtiene la decisión actual del asistente respecto a conservar los atributos en el destino. Returns: La decisión actual del asistente respecto a conservar los atributos de origen de las entradas a migrar en el destino.
setConsevarAtributos public void setConsevarAtributos(boolean consevarAtributos) Establece la decisión actual del asistente respecto a conservar los atributos en el destino. Parameters: consevarAtributos - La decisión actual del asistente respecto a conservar los atributos de origen de las entradas a migrar en el destino.
reiniciar public void reiniciar() Vuelve a un estado por defecto a este asistente. El proceso de reinicio consiste en limpiar la lista de entradas a migra, reiniciar el destino y limpiar la lista de notificaciones.
migrar public void migrar()
Realiza la acción de migración de las entradas del servidor de origen al servidor de destino.
Creación de aplicación de Backup Anin La aplicación de Backup utiliza las siguiente clases: Entrada, LDAPManager, LDAPConexion, Script y TransaccionBackup.
Descripción General de la clase Script Descripción Class Script java.lang.Object ldapBackup.clases.Script
public class Scriptextends java.lang.Object Esta clase un script a ejecutar.
________________________________________________________________________
Constructores Script public Script() Crea una nueva instancia de la clase Script
Script public Script(java.lang.String content) Crea una nueva instancia de la clase Script. Parameters: content - El contenido del script a ejecutar.
________________________________________________________________________
Métodos en detalle executeCommand public void executeCommand() throws java.lang.Exception Ejecuta el script. Throws: java.lang.Exception
getContenido public java.lang.String getContenido() Obtiene el contenido de este script. Returns: El contenido del script.
setContenido public void setContenido(java.lang.String contenido) Establece el contenido a ejecutar por este script. Parameters: contenido - El host con el que se establecerá la conexión.
getSHELL public java.lang.String getSHELL() Obtiene el SHELL que ejecutará de este script.
Returns: El SHELL que ejecutará este script.
setSHELL public void setSHELL(java.lang.String shell) Establece el shell que ejecutará este script. Parameters: shell - El host con el que se establecerá la conexión.
Descripción General de la clase TransaccionBackup Descripción Class TransaccionBackup java.lang.Object ldapBackup.clases.TransaccionBackup public class TransaccionBackupextends java.lang.Object Esta clase representa un transacción de respaldo de datos de un servidor.
________________________________________________________________________
Constructores TransaccionBackup public TransaccionBackup() Crea un nuevo objeto para una transacción de Backup.
________________________________________________________________________
Métodos en detalle getPATH public java.lang.String getPATH() Obtiene la ruta dentro del sistema de archivos donde se almacenará el backup Returns: La ruta donde se almacenará el archivo de respaldo.
setPATH public void setPATH(java.lang.String PATH) Establece la ruta dentro del sistema de archivos donde se almacenará el backup Parameters: PATH - La ruta donde se almacenará el archivo de respaldo.
getArchivo public java.lang.String getArchivo() Obtiene el nombre del archivo donde se guardará el backup. Returns: El nombre del archivo donde se almacenará el respaldo.
setArchivo public void setArchivo(java.lang.String archivo) Establece el nombre del archivo donde se guardará el backup.
Parameters: archivo - El nombre del archivo.
getDnBackup public java.lang.String getDnBackup() Obtiene el nombre del dn a partir de donde se ejecutará esta transacción de respaldo. Returns: El dn a partir de donde se ejecutará el backup.
setDnBackup public void setDnBackup(java.lang.String dnBackup) Establece el dn a partir de donde se ejecutará esta transacción de respaldo. Parameters: dnBackup - El dn a partir de donde se ejecutará el backup.
getHoraBackup public Tiempo getHoraBackup() Obtiene el tiempo en que se ejecutará esta transacción de respaldo. Returns: El tiempo en que se ejecutará la transacción.
setHoraBackup public void setHoraBackup(Tiempo horaBackup) Establece si el tiempo en que se ejecutará esta transacción de respaldo.
Parameters: horaBackup - El tiempo en que se ejecutará la transacción.
getConexionLDAP public LDAPConexion getConexionLDAP() Obtiene la LDAPConexion de este transacción. Returns: La conexión LDAP con el servidor de esta transacción.
setConexionLDAP public void setConexionLDAP(LDAPConexion conexionLDAP) Establece la LDAPConexion de esta transacción. Parameters: conexionLDAP - El valor de true si las seguirá y el false sino.
isReferencias public boolean isReferencias() Obtiene si la transacción seguirá las referencias o no. Returns: El valor de true si las seguirá y el false sino.
setReferencias public void setReferencias(boolean referencias) Establece si la transacción seguirá las referencias o no. Parameters:
referencias - El valor de true si las seguirá y el false sino.
isEstado public boolean isEstado() Obtiene el estado de esta transacción de respaldo. Returns: El valor de true si ya se ejecutó y false lo contrario
setEstado public void setEstado(boolean estado) Establece el estado de esta transacción de respaldo. Parameters: estado - El valor de true si ya se ejecutó y false lo contrario.
ejecutar public void ejecutar() throws java.lang.Exception Ejecuta la transacción de respaldo Throws: java.lang.Exception - Excepción lanzada en caso de poder ejecutar el respaldo.