Como leer un fichero linea por linea en Bash Script

Noviembre 20, 2009

Sencillo ejemplo de como leer un fichero línea por línea en bash y almacenar dicha línea en una variable para luego poder tratarla, la verdad que este código me ha resultado bastante útil durante mis tareas con sistemas operativos GNU/linux

i=0
while read line
   do i=$(($i+1));
   echo $i $line
done < "/etc/passwd"
echo "Final line count is: $i";

El ejemplo lee el fichero /etc/passwd y muestra el número de línea ( variable $i ) y el contenido de la línea ( variable $line )

Espero que os sea igual de útil que me ha sido a mi para muchas cosas


Autenticando Joomla 1.5 usando eDirectory

Julio 21, 2009

Por algunas cuestiones me interesaba que la autentificación de usuario en Joomla no se hiciera contra la base de datos MySQL local, si no que autentificara los usuarios a través de un directorio LDAP, en este caso Novell eDirectory 8.8. Permitiendo así que los usuarios del directorio pudieran entrar en Joomla con las mismas credenciales que usan para entrar en otros sistemas de nuestra red.

Aún que este artículo se basa en la configuración para eDirectory , al ser LDAP un estándar de acceso a directorios es extrapolable a otros directorios como openLDAP ,Microsoft Active Directory, Sun iPlanet etc.., en este artículo sin embargo nos centraremos en Novell eDirectory.

La autentificación LDAP nativa es una de las nuevas características que nos trae la versión 1.5 de Joomla, para versiones anteriores existe un paquete llamado JAuth que nos permite hacer lo mismo, pero que en este artículo no vamos a tratar.

Para la configuración de la autentificación LDAP, deberemos conocer cómo funciona un directorio LDAP y como está estructurado nuestro directorio, si no es así deberíamos mirar la estructura de nuestro directorio mediante un cliente LDAP, y leer un poco de documentación sobre directorios LDAP. Leer el resto de esta entrada »


Breve introducción a la Gestión de Identidades

Mayo 5, 2009

Podríamos definir la gestión de identidades como solución que permite sincronizar datos; cuentas de usuario , grupos , objetos etc.. entre diferentes repositorios de naturaleza distinta.

Un ejemplo seria poder sincronizar cuentas entre Microsoft Active Directory y una base de datos Oracle, logrando que cuando se diera de alta un usuario en Active Directory este mismo se replicara en la base de datos permitiéndose el acceso a ambos sistemas con la misma cuenta, obviamente no queda limitado a la conexión de dos sistemas si no que se puede conectar tantos sistemas como se requiera.

Esta funcionalidad se puede lograr mediante programas a medida o mediante soluciones de gestión de identidades, en el mercado hay varios fabricantes que han lanzado diferentes soluciones, algunas de estas son :

Leer el resto de esta entrada »


Error “Duplicate engine id detected” en User Application

Mayo 5, 2009

En algunas ocasiones en un entorno con User application en cluster me he encontrado con que uno de los nodos no arranca, apareciendo un error del tipo


“Duplicate engine id detected. This engine may not have been shutdown cleanly or another engine is running with engine-id: ENGINE01 . Waiting 60,000 ms for heartbeat to timeout.”

Esto es debido a que uno de los nodos del cluster no se ha cerrado bien y se queda a la espera , en principio esperando un tiempo prudencial tendría que arrancar , pero no siempre es así. Para forzar a arrancar el nodo tenemos que cambiar en la tabla de estado de los nodos el estado de dicho, eso se hace accediendo a la base de datos , en mi caso la por defecto , MySQL y consultando la tabla AFENGINESTATE.

select * from AFENGINESTATE;

ENGINEID HEARTBEAT STARTTIME SHUTDOWNTIME ENGINESTATE
Engine01 2009-05-04 21:58:13 2009-05-04 21:51:13 NULL 1
Engine02 2009-05-04 21:58:39 2009-05-04 21:54:39 NULL 1

En esta tabla podemos ver los dos nodos del cluster , llamados Engine01 y Engine02 , en este caso el Engine02 aparece arrancado cuando en verdad no lo esta, borramos el registro y volvemos a arrancar el nodo y veremos como ya no aparece y el nodo arranca correctamente.

El comando para borrar el registro podria ser por ejemplo este :

delete from AFENGINESTATE where ENGINEID=’Engine02′;

Ahora al volver a arrancar el servicio podremos ver como jboss y User Application vuelven a arrancar.


Ejecutar sentencias SQL directamente desde nuestro conector JDBC.

Marzo 12, 2009

Aún que el conector JDBC se encarga de realizar todas las operaciones sobre la base de datos, en algunos casos particulares nos puede interesar el hecho de ejecutar sentencias SQL desde las reglas directamente a la base de datos. Hay que tener en cuenta que estamos atacando directamente la base de datos y no pasamos por la política de Schemma Mapping, por lo que deberemos hacer referencia a los objetos y atributos tal y como están en la base de datos, de hecho el conector cuando ve la sentencia , no sigue ejecutando políticas y procede a ejecutar la sentencia SQL.

Existen dos tipos de sentencias SQL; Sentencias de ejecución, de las que sólo nos tenemos que preocupar de ejecutar,como es el caso de un update.O las sentencias de consulta, que nos devuelven un resultado, en este caso deberemos capturar el resultado y recorrer los valores segun nos convenga, como seria el caso de una sentencia select.

Leer el resto de esta entrada »


Implementando listas en DirXML

Marzo 5, 2009

A mi parecer, una de las cosas que hecho de menos en DirXML es la creación de tipos de variables complejas.DirXML no es un lenguaje tipado por lo que cualquier variable puede contener todo tipo de valor, esto resulta una ventaja en muchos casos , pero en otros presenta algunos inconvenientes.

Durante el desarollo de un conector , me encontré con la necesidad de usar algun tipo de dato un poco mas complejo, quería algo parecido a un array o una lista enlazada.En concreto quería encontrar una forma de buscar un valor en una lista de una forma rápida y cómoda sin tener que escribir el código para recorrerla.

La solución que finalmente implementé fue crear una cadena de valores separados por un carácter, como en mi caso los valores eran únicamente numéricos me bastó con utilizar el carácter – como separador. En mi caso los valores provenían de una query SQL , un bucle for-each cojia los valores de dicho resultado y los iba concatenando separados por el carácter de separación ‘-’

<do-for-each>

<arg-node-set>

<token-xpath expression=‘jdbc:row/jdbc:column[@jdbc:name="atributo"]‘/>

</arg-node-set>

<arg-actions>

<do-set-local-variable name=listascope=“driver”>

<arg-string>

<token-local-variable name=lista/>

<token-text xml:space=“preserve”>-</token-text>

<token-xpath expression=“$current-node/jdbc:value”/>

</arg-string>

</do-set-local-variable>

</arg-actions>

</do-for-each>

Ahora la pregunta sería como consultarla , en mi caso sólo necesito saber si existe el valor en la lista, para ello uso la función contains() de xpath,dicha función devuelve true si encuentra dentro de una cadena una subcadena pasada como parámetro

El carácter de separación se usa para poder buscar los valores , si queremos un 2 por ejemplo buscamos -2- y así nos aseguramos de que no cogemos el 22 o el 200.

Para ello modificamos el valor de la variable , dejanadolo entre el carácter de separación ‘-’

<do-set-local-variable name=itemscope=“policy”>

<arg-string>

<token-text xml:space=“preserve”>-</token-text>

<token-local-variable name=item/>

<token-text xml:space=“preserve”>-</token-text>

</arg-string>

</do-set-local-variable>

Y ahora podemos comparar con un simple if, nos devolverá TRUE si esta en la lista o FALSE si no lo esta.

<if-xpath op=“true”>contains($lista,$item)</if-xpath>

Una forma simple de implementar algo parecido a las listas en DirXML