lunes, 16 de febrero de 2009

perl-ldap

Si queremos utilizar los script de perl para ldap. Debemos instalar los siguientes paquetes.

libnet-ph-perl
libdbd-ldap-perl

Una vez instalado, podemos almacenar nuestra carpeta perl_ldap en cualqueir parte del disco duro
y ejecutarla.

Por ejemplo:

debian:/isp/openldap/ldap_perl# ./ldap_management_ies.sh ADD user54 domain usuario54 apellido54 user54
uid= user54,ou=Alumnos, dc=iesperemaria, dc=comdebian:/isp/openldap/ldap_perl#

IO::Socket::INET: connect: Conexión rehusada at ./ldap_add.pl line 70,

Si al intentar introducir una entrada desde perl, en el árbol de directorios de ldap, sale el siguiente error:

debian:/isp/openldap/ldap_perl# ./ldap_management_ies.sh ADD user54 domain usuario54 apellido54 user54
IO::Socket::INET: connect: Conexión rehusada at ./ldap_add.pl line 70, <DATA> line 225.
uid= user54,ou=Alumnos, dc=iesperemaria, dc=comsystem ./ldap_add.pl user54 domain usuario54 apellido54 user54 failed: 28416 at ./ldap_management_ies.sh line 30.

Posiblemente es que no hayas iniciado el servicio ldap.

Comprobamos si está iniciado ( y comprobamos que no).

debian:/isp/openldap/ldap_perl# ps -ef | grep slapd
root 9581 9195 0 14:09 pts/1 00:00:00 grep slapd


Arrancamos el servicio, bien desde /etc/init.d.... o si lo hemos instalado desde los fuentes, de la siguiente forma:
debian:/isp/openldap# /isp/openldap/libexec/slapd -f /isp/openldap/etc/openldap/slapd.conf

Si probamos a insertar de nuevo, vemos que nos deja:
debian:/isp/openldap/ldap_perl# ./ldap_management_ies.sh ADD user54 domain usuario54 apellido54 user54
uid= user54,ou=Alumnos, dc=iesperemaria, dc=comdebian:/isp/openldap/ldap_perl#



Instalar .bin en Linux

Me situo en la carpeta donde se encuentra el archivo.bin
#chmod a+x archivo.bin
# ./ archivo.bin

viernes, 13 de febrero de 2009

ldap-utils

Crear la raíz del árbol
Establecemos tanto la raíz dc=iesperemaria,dc=com, como el administrador de LDAP, Manager.
Tanto la raíz como el administrador deben estar definidos en slapd.conf

---archivo inicial.ldif

dn: dc=iesperemaria, dc=com
objectclass: dcObject
objectclass: organization
o: IESPEREMARIA
dc: iesperemaria

dn: cn=Manager,dc=iesperemaria, dc=com
objectclass: organizationalRole
cn:Manager

---- fin archivo inicial.ldif

ldapadd ­x ­D "cn=Manager,dc=iesperemaria,dc=com" ­W ­f inicial.ldif


Crear las distintas entradas.
Creamos por ejemplo una organización que sea alumnos, y dentro de ella un alumno.
Hay que dejar una linea en blanco entre cada entrada del árbol

--- archivo nodos.ldif
dn:ou=Alumnos,dc=iesperemaria,dc=com
objectClass: organizationalUnit
ou: Alumnos

dn: uid=alu001 ,ou=Alumnos,dc=iesperemaria,dc=com
objectClass: person
objectClass: inetOrgPerson
objectClass: organizationalPerson
uid: alu001
cn: Alumno 001
givenname: Alumno
sn: 001
mobileTelephoneNumber: 666666666
mail: alu001@gmail.com

----fin nodos.ldif

ldapadd ­x ­D "cn=Manager,dc=iesperemaria,dc=com" ­W ­f nodos.ldif

LDAPMODIFY - AÑADIR ATRIBUTO / MODIFICAR VALOR ATRIBUTO / ELIMINAR ATRIBUTO
Por ejemplo:
1.-Modificar el email
2.-Añadir el atributo código postal.
3.-Eliminar el teléfono.

Me creo un archivo modificar.ldif que contiene:
-----
dn: uid=alu001 ,ou=Alumnos,dc=iesperemaria,dc=com
changetype: modify
replace: mail
mail: alu@gmail.com

dn: uid=alu001 ,ou=Alumnos,dc=iesperemaria,dc=com
changetype: modify
add: postalCode
postalCode: 03503

dn: uid=alu001 ,ou=Alumnos,dc=iesperemaria,dc=com
changetype: modify
delete: mobile
------

debian:/isp/openldap/bin# ./ldapmodify -x -D "cn=Manager,dc=iesperemaria, dc=com" -W -f modificar.ldif
Enter LDAP Password:
modifying entry "uid=acoloma,ou=Profesores,dc=iesperemaria,dc=com"


Para comprobar que las modificaciones se han echo podemos ejecutar:
debian:/isp/openldap/sbin# ./slapcat

LDAPMODIFY - MODIFICAR EL RDN

----rdn.ldif
dn:
uid=alu001,ou=Profesores,dc=iesperemaria,dc=com
changetype: modrdn
newrdn:
uid=Alumno 001
deleteoldrdn:1
----

La opción deleteoldrdn:
Si = 0 --> mantiene la entrada anterior.
Si = 1 --> modifica la entrada.


debian:/isp/openldap/bin# ./ldapmodify -x -D "cn=Manager,dc=iesperemaria, dc=com" -W -f rdn.ldif

LDAPDELETE
Elimina una entrada del directorio.

debian:/isp/openldap/bin# ./ldapdelete -W -D "cn=Manager,dc=iesperemaria,dc=com" uid=alu002,ou=Alumnos,dc=iesperemaria,dc=com
Enter LDAP Password:

Si ejecutamos slapcat comprobamos que el alumno alu002 ha sido eliminado del árbol de directorio.




ldap_bind: Invalid credentials (49)

debian:/isp/openldap/bin# ./ldapadd -x -D "cn=Manager, dc=iesperemaria,dc=com" -W -f personas.ldif
Enter LDAP Password:
ldap_bind: Invalid credentials (49)

Posiblemente sea error de la contraseña. Debes configurar en /etc/openldap/slapd.conf lo siguiente:

#Con esto, estoy asignado al usuario Manager como administrador. (ese usuario no tiene porque existir en el sistema Linux, le pongo ese nombre como otro cualquiera).
rootdn "cn=Manager,dc=iesperemaria,dc=com"

#Luego nos faltaría asignarle una contraseña.
#PRIMERA OPCIÓN: ASIGNARLE UNA CONTRASEÑA PLANA.
#Esto quiero decir que la contraseña será la palabra secret
rootpw secret

#SEGUNDA OPCION: ASIGNALE CONTRASEÑA ENCRIPTADA.
#con pasword-hash le indico el tipo de encriptación
#con rootpw y el tipo de encriptación, le añado la clave encriptada.
password-hash {MD5}
rootpw {MD5}5XJsaCEF5IJSIJkJjIbXBA==

------- /Fin de modificaciones en slapd.conf

Para gener una clave encriptada hacemos:

/usr/sbin/slappasswd -h {tipo de encriptacion}

Por ejemplo:
debian:/isp/openldap/sbin# ./slappasswd -h {MD5}
New password:
Re-enter new password:
{MD5}5XJsaCEF5IJSIJkJjIbXBA==


Este es la contraseña encriptada que añadiremos al slapd.conf


Puedes ver los archivos de logs para comprobar los errores
cat /var/log/messages
cat /var/log/syslog

ldap_add: Server is unwilling to perform (53)

Comprueba el archivo .ldif, que posiblemente esté indicando mal al árbol de directorios.
Fijate si, dn: dc=iesperemaria, dc=com, se corresponde con el dc del /etc/openldap/ slapd.conf

Puedes ver los archivos de logs para comprobar los errores
cat /var/log/messages
cat /var/log/syslog

miércoles, 4 de febrero de 2009

Restricción CHECK

USO CHECK: Restringir los valores que puede tomar un campo en concreto de la tabla.

Ejemplos:
check (id between 1 and 20) : Que el id solo pueda tomar valores entre 1 y 20
check (turno in ('Mañanas','Tardes')): Que el campo turno solo pueda tomar valores Mañanas o Tardes.

Ejemplo práctico POSTGRESQL:

#Creamos una tabla
postgres=# create table prucheck(
postgres(# id bigint,
postgres(# nombre varchar(20),
postgres(# check (id between 1 and 20),
postgres(# check (nombre in ('Lunes','Martes')));
CREATE TABLE

Probamos a insertar valores válidos
postgres=# insert into prucheck (id, nombre) values (1,'Lunes');
INSERT 29781 1

Probamos a insertar valores no válidos
postgres=# insert into prucheck (id, nombre) values (21,'Martes');
ERROR: el nuevo registro para la relación "prucheck" viola la restricción check "$1"

Ejemplo práctico MYSQL:
CREATE TABLE `tablacheck3` (
`id` INT NOT NULL,
`semana` VARCHAR(20) NOT NULL,
check (id between 1 and 20),
check (semana in ('Lunes','Martes'))
)
ENGINE = myisam;

PERO NO FUNCIONA EL CHECK--> deja insertar valores que no cumplen la restricción.

INSERT INTO `tablacheck3` ( `id` , `semana` )
VALUES (
'1', '''Lunes'''
), (
'221', '''hola'''
);


ANOTACIÓN: Esta probado bajo myisam, posiblemente con innodb si que se cumpla la restricción.

MYSQL no cumple las claves ajenas!!.

EJEMPLO.

Tenemos la tabla cantantes que tiene como clave primaria titulo y cantante, y como clave ajena cantante.

mysql> describe cd;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| titulo | varchar(30) | NO | PRI | | |
| cantante | int(11) | NO | PRI | | |
| coste | int(11) | YES | | NULL | |
| copias | int(11) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+

INSERCIÓN QUE CUMPLA LA RESTRICCIÓN.

Si realizamos una insercion de un cantante que existe en la tabla de cantantes nos deja --> cumple la restricción de integridad.

mysql> insert into cd (titulo,cantante) values ('kk',10);
Query OK, 1 row affected (0.33 sec)

INSERCIÓN QUE NO CUMPLA LA RESTRICCIÓN.

Si realizamos una inserción de un cantante que no existe en la tabla de cantantes, nos debería decir que viola la restriccion de integridad.

mysql> insert into cd (titulo,cantante) values ('kk',103233);
Query OK, 1 row affected (0.00 sec)

PROBLEMA

No nos sirve de nada mantener una base de datos, que no nos asegura las relaciones entre tablas.
No nos va a permitir tener una base de datos consistente.


SOLUCIÓN.

Debemos crear las tablas como innoDB.
Ejemplo:

CREATE TABLE cd(
titulo varchar(30) NOT NULL,
cantante int NOT NULL,
coste int,
copias int,
PRIMARY KEY (titulo, cantante),
FOREIGN KEY(cantante) REFERENCES artista(cif) ON UPDATE CASCADE
)TYPE=INNODB;


Si realizamos una insercción de un cantante que no existe sobre la tabla cantantes, nos dará un error.

mysql> insert into cd (titulo,cantante) values ("titulo 1", 987);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`musicainnodb/cd`, CONSTRAINT `cd_ibfk_1` FOREIGN KEY (`cantante`) REFERENCES `artista` (`cif`) ON UPDATE CASCADE)



CONCLUSION

Como puede ser que el motor de almacenamiento por defecto de MySQL, sea MyISAM, y este no soporte ninguna regla de integridad referencial???..

No tiene sentido que por defecto no se cumpla ni las claves ajenas, y ademas! que me deje meter como clave primaria un vacio!!.

psql: FATAL: la autentificación Ident falló para el usuario

ERROR AL CREAR USUARIO E INTENTAR ACCEDER A POSTGRESQL
Si creamos un usuario en postgreSQL e intenamos acceder, nos da el siguiente error:

//Creamos el usuario dentro de psql (también podriamos crearlo fuera)
postgres=# create user usuario22 with password 'usuario22';
CREATE ROLE

//Salimos de psql, e intentamos entrar.
El -W es para que nos pida la contraseña.
El -d es para especificarle el nombre de la base de datos.

postgres@debian:/home/dani$ psql -U usuario22 -W -d alumnos;
Contraseña para usuario usuario22:

2 tipos de errores

//ERROR 1

psql: FATAL: la autentificación Ident falló para el usuario «usuario22»;

Este error es porque no existe ningun usuario en el archivo pg_hba.conf

También puede ser porque el método de cifrado de contraseña es erróneo.

//ERROR 2

psql: FATAL: No se encuentra pg_hba.conf o el archivo es incorrecto
HINT: Vea el registro del servidor para obtener más detalles.

Este error es porque aún existiendo usuario en pg_hba.conf no se encuentra usuario22.


SOLUCION

Debemos editar el pg_hba.conf

debian:/home/dani# gedit /etc/postgresql/8.1/main/pg_hba.conf

Y en él, debemos incluir a los usuarios que queramos que puedan acceder desde psql.

local all user22 md5
# TYPE DATABASE USER CIDR-ADDRESS METHOD
local all user22 127.0.0.1/32 md5

Reiniciamos el servicio y debe funcionar!.
debian:/home/dani# /etc/init.d/postgresql-8.1 restart

INTENTAMOS ACCEDER

postgres@debian:/etc/postgresql/8.1/main$ psql -U user22 -W -d alumnos;
Contraseña para usuario user1:
Bienvenido a psql 8.1.11, la terminal interactiva de PostgreSQL.

Digite: \copyright para ver los términos de distribución
\h para ayuda de comandos SQL
\? para ayuda de comandos psql
\g o or termine con punto y coma para ejecutar una consulta
\q para salir

alumnos=#
palyginti kainas