jueves, 27 de diciembre de 2012

Monitorizar Glassfish con Jconsole

Para realizar un análisis del rendimiento del Glassfish y de la JVM que este esté gestionando, podemos utilizar una herramienta de monitorización muy conocida por todos los que desarrollamos en JAVA que es Jconsole.
Jconsole permite entre otras, la monitorización de un servidor de aplicaciones remoto, cosa que es fundamental dado que en producción no es habitual tener entorno de X para maximizar el rendimiento del servidor.

La manera de conectar nuestro Jconsole local contra nuestro servidor de producción es mediante la cadena de conexión service:jmx:rmi:///jndi/rmi://10.0.10.75:8686/jmxrmi cambiando tanto la ip como el puerto (el puerto que trae por defecto Glassfish es el 8686). Como nota adicional para los que no estén muy familiarizados, Jconsole es una herramienta que viene por defecto con el JDK y que se  encuentra dentro de la carpeta bin como muestro a continuación.


Para lanzarlo basta con ejecutar el comando jconsole de la siguiente manera:

rencinar@OPT360:~/software/jdk1.6.0_17/bin$ ./jconsole
 

 Automáticamente se nos abrirá la siguiente pantalla de inicio:



Introducimos en remote process la cadena de conexión como hemos indicado antes y el usuario y contraseña con el que entramos en la parte de administración del Glassfish.


Tras conectar tendremos nuestro Jconsole monitorizando el Glassfish de nuestro servidor.




lunes, 22 de octubre de 2012

Unión de Strings nulos en Postgresql

Algo en lo que no se suele caer al hacer la unión de 2 campos de tipo string en una select en Postgresql (y en casi todos los motores de base de datos) es que si uno de los 2 es nulo el resultado es nulo. Dicho así puede parecer obvio, pero cuando no se usa con frecuencia, uno suele "picar" en el razonamiento erróneo de un string más un nulo da como resultado el string.


Un ejemplo que clarifique la problemática es que si tenemos, en una base de datos Postgresql, una tabla que se llame clientes con los siguientes campos y valores:

|----------------------------------------|
| Id | Nombre | Apellidos |
|----------------------------------------|
|1      Pepe        Perez       |
|2      Lola         Lopez      |
|3      Juan         <null>    |
|----------------------------------------|


Cuando realicemos una select como esta:

          select Nombre || ',' || Apellidos as nombreCompleto from clientes order by Id;

El resultado será:

Pepe,Perez
Lola,Lopez
<null>

Para solucionar el problema y en general, una buena política de trabajo cuando nos toque componer strings de salida, es utilizar el CASE y el COALESCE con el fin de blindar las consultas.

Con el comando COALESCE nos encargaremos de evaluar si el campo es nulo y en el caso de que lo sea, darle un valor (en este caso vacío, que no nulo ) y el CASE nos servirá para operar cada uno de los campos a mostrar y componer el resultado final.

La consulta final sería de esta forma:

SELECT
case
        when coalesce (Nombre, '' ) = '' then ''
        else trim(Nombre)
        end ||
        case
            when coalesce(Apellidos , '') = '' then ''
            else ', ' || trim(Apellidos)
        end   nombreCompleto
FROM clientes
ORDER BY Id;

El resultado será:

Pepe,Perez
Lola,Lopez
Juan




viernes, 24 de agosto de 2012

Reiniciar secuencia en MySql

En innumerables ocasiones nos encontramos que los sistemas que utilizamos tiran de tablas donde el id es un secuencia. Con normalidad los secuenciales son utilizados como id de una tabla de tal manera que al ir insertando datos va incrementándose el id. Al listar los datos de una tabla, estos id´s no tienen por que ser consecutivos porque al borrar una fila esa tupla desaparece pero el secuencial no mete ese valor del id otra vez en la secuencia y si insertamos un nuevo registro continuará con la numeración que tiene el secuencial. Supongamos que tengo esta tabla:

id  nombre
1   Pepe
2   Pepo
3   Pepi

Si elimino el registro con id 2 el secuencial tendría como siguiente id el 4 y si inserto un nuevo dato tendríamos que los id´s que tenemos son 1,3 y 4:

id  nombre

1   Pepe
3   Pepi
4   Pipo

En el caso de que esto pase en una tabla en la cual el id es vital para el negocio (por ejemplo una tabla que contenga facturas y que el número de factura sea el del id) tendremos, cada vez que eliminemos alguna, que indicarle a la secuencia que el siguiente valor es otro número distinto al que tiene para que continúe desde el que le indiquemos la secuencia.

Para reiniciar una secuencia y que empiece desde el número que nosotros queramos, tenemos que lanzar:

ALTER TABLE <tabla> AUTO_INCREMENT= 1
 
Donde el valor 1 del AUTO_INCREMENT es el valor que va a utilizar para la siguiente inserción 
y la tabla es la tabla sobre la que queremos inicializar la secuencia.
 
 

miércoles, 8 de agosto de 2012

Migrar tienda con Prestashop

Backup de la tienda Origen

 Antes de migrar nuestra tienda a otra ubicación tenemos que hacer un backup de la base de datos y un tareo del directorio donde tenemos instalada nuestra tienda.
Para realizar el backup de una base de datos MySql yo prefiero realizarlo mediante el comando mysqldump frente a otros softwares como PhpMyAdmin, que aunque es una herramienta que simplifica la administración y el mantenimiento de una base de datos MySql, para este tipo de cosas la veo un poco limitada en cuanto a rendimiento y se hace muy cuesta arriba a la hora de generar ficheros de backup con un tamaño de unos 25 Mb y de restaurarlos. El uso estándar del comando  mysqldump es:  

          mysqldump  -R --user (usuario) -p (Base de Datos) > (nombre).sql 

Esto nos generará un fichero .sql con todas las sentencias para que al lanzarlo nos construya una base de datos idéntica a la que teníamos. Como nota adicional siempre le pongo el -R para que realice también el backup de los procedimientos almacenados y funciones. Otros ejemplos de uso del comando mysqldump son:
  • Backup de todas las bases de datos 
    • mysqldump --user (usuario) -p --all-databases > (nombre).sql
  • Backup de la estructura
    • mysqldump --user (usuario) -p --no-data  (Base de Datos)) > (nombre).sql
  • Backup los datos exclusivamente
    • mysqldump --complete-insert --no-create-info --user (usuario) -p (Base de Datos) > (nombre).sql
  • Backup con la contraseña en la sentencia(la password va pegada al -p)
    • mysqldump --user (usuario) -pPASS --all-databases > (nombre).sql
Después lo que hay que realizar es un tareo del directorio donde tenemos Prestashop. Para ello utilizamos el comando tar de la siguiente manera: 

      tar -cvf (nombre del tar).tar (directorio de prestashop)

Con esta sentencia tendríamos tareado todo el contenido de el directorio donde está prestashop en el fichero .tar. Una opción interesante del comando tar es -j pues comprime con bunZip2 el contenido del fichero, con lo que si tenemos que mover el tar entre servidores el tiempo es menor y el consumo de trafico también sería menor.


Restaurar en el destino


Lo primero que vamos a realizar es la descompresión del .tar en el directorio que hallamos elegido para albergar la tienda. Para esto copiamos el archivo .tar en el directorio y ejecutamos el comando: 

      tar -xvf archivo.tar
 

Tras tener el directorio explotado, verificamos que los propietarios tanto de archivos como de carpetas son los correctos para esta nueva ubicación (si no los podéis cambiar con el comando chown.
Después de esto abrimos el fichero /nueva_ubicacion/config/settings.inc.php y editar las líneas correspondientes a la definición de las variables __PS_BASE_URI_, _DB_NAME_, _DB_SERVER_, _DB_USER_ y _DB_PASSWORD_ para que se ajusten a la nueva ubicación y a la nueva base de datos.
  • define(‘__PS_BASE_URI__’, ‘/directorio/‘); Directorio donde hemos descomprimido el tar, si es en el raíz de tu carpeta publica poner “/
  • define(‘_DB_NAME_’, ‘base de datos nueva‘); Poner el nuevo nombre de la base de datos
  • define(‘_DB_USER_’, ‘usuario de la base de datos‘); Poner el nuevo usuario de la base de datos
  • define(‘_DB_PASSWD_’, ‘pass‘); Contraseña del usuario de la base de datos
Ahora restauramos la base de datos con el siguiente comando 

      mysql -u (usuario) -p --database=(nombre bd) < (archivo de backup).sql

Tras restaurar la base de datos necesitaremos ajustar los parámetros PS_SHOP_DOMAIN_SSL y PS_SHOP_DOMAIN de la tabla ps_configuration y asignarles el valor dominio.es/directorio o si la tenemos en el raíz del dominio dominio.es, sin más.
En caso de estar trabajando con el usuario root de la base de datos podemos otorgarle permisos administrador a otro usuario de la siguiente manera:
      
      #GRANT ALL PRIVILEGES ON (nombre de la base de datos).* TO 'usuario@localhost' IDENTIFIED BY 'password';

Si en vez de (nombre de la base de datos)  pusiésemos *.* se replicarían estos privilegios a todas las bases de datos.
Con esto ya tendríamos nuestra tienda prestashop migrada a otra ubicación. Está probado para la versión 1.4.8. 

martes, 7 de agosto de 2012

Utilizar WhatsApp desde PC

Si deseamos utilizar WhatsApp desde un PC lo primero que tenemos que tener es un número de móvil disponible para posteriormente registrarnos. Si bien no poseemos de un número de móvil, o no queremos registrarnos con el nuestro personal, podemos obtener un número móvil virtual.

Para utilizar WhatsApp  en el PC lo primero que hay que hacer es descargarse YouWave . YouWave sirve para correr aplicaciones Android en el pc de manera rápida y sencilla. La apariencia es muy parecida a la que se consigue instalando el Android SDK pero la configuración "fina" del Android SDK en cuanto a las redes y al rendimiento es tediosa, solo tendría sentido instalar este último si además queremos desarrollar aplicaciones para Android (las aplicaciones en YouWave corren mejor consumiendo menos recursos que montando un AVD en Android SDK).



Después nos la bajamos el archivo WhatsApp.apk desde la página de WhatsApp  y lo guardamos en C:\Users\<usuario>\youwave\android apps (si en la instalación le indicasteis otra ruta en vez de la de por defecto le ponéis la que le indicasteis al YouWave).
 






Entonces, tras arrancar YouWave le damos a View>Apps para que recargue las aplicaciones (si veis que con esto no os las recarga, y con Redraw Icon tampoco os aparece el icono de WhatsApp reiniciar YouWave). Lo ultimo que falta es hacer doble click en el icono de Whatsapp para que nos lo instale y completar la configuración (que no es más que aceptar las condiciones e introducir el número de teléfono).



Telefonía Móvil Virtual

En los tiempos que corren es habitual hablar de operadoras de telefonía móvil virtual. Estas realizan toda su operativa a través de Internet o por teléfono, sin tiendas físicas ni intermediarios. Pero lo que no es habitual todavía es hablar de telefonía móvil sin tarjeta SIM o telefonía móvil virtual. Yo voy a hablaros de fonYou una operadora virtual con telefonía móvil virtual que está funcionando a las mil maravillas.

Por motivos de trabajo y privacidad tengo la necesidad de tener 2 números de teléfono contratados, el mio personal y el profesional, pero no quería adquirir un teléfono dualSim por el desembolso de dinero y que no tienen las mismas prestaciones que mi Iphone (siento ser un adicto de esta tecnología ). La idea de ir cargado con 2 móviles todo el día no me satisfacía, así que contraté un número con fonYou.
FonYou me permite tener 2 números de teléfono en mi móvil totalmente operativos y diferenciados el uno del otro, sin ningún tipo de coste adicional ni vinculación.

El funcionamiento es similar al de cualquier teléfono en red inteligente, se vincula el número a otro/otros números tanto de telefonía móvil o fija (permite hasta un máximo de 3 vinculaciones simultáneas) y desde fonYou se encargan de derivar tanto llamadas como sms a los terminales vinculados, siendo la llamada transparente tanto para el emisor como para el receptor. En el caso de querer hacer llamadas desde nuestro móvil virtual (y que al receptor le aparezca el número del móvil virtual), solo tenemos que realizar una llamada desde cualquiera de los números vinculado, validar la llamada con el código de seguridad y decir el número a donde queremos llamar.

Decir que entre otros servicios tiene un buzón de voz configurable, nos permite recibir los mensajes del buzón por correo electrónico con el archivo de sonido adjunto...etc En definitiva los servicios que nos presta la telefonía en red inteligente.

Los costes por el servicio son de 0 euros, lo único es que si emitimos llamadas nos costará lo mismo que una llamada de móvil a móvil, por el tramo de llamar desde nuestro numero al móvil al número móvil de fonYou.



Para finalizar decir que el número contratado será propiedad de fonYou a menos que lo compremos (cuesta unos 10 euros transcurridos 10 meses) en cuyo caso se nos proporcionará el ICC para que en caso de quererlo podamos migrar nuestro número a otra operadora.





domingo, 5 de agosto de 2012

Modificar navegabilidad de categorias en Prestashop

En una tienda con Prestashop no queríamos que las categorías intermedias fuesen "navegables", entendiendo por navegables que se pudiese clickar sobre ellas y nos mostrase en pantalla las subcategorías que de ella cuelgan. A continuación paso a ejemplificar esto para que quede claro el concepto de lo que queríamos.
Si partimos de este esquema de categorías:
  • Ropa
    • Hombre 
      • Pantalones
        • Vaqueros 
          • Vaquero 1
          • Vaquero 2
Donde Ropa, Hombre, Pantalones y Baqueros son categorías y  baquero 1, baquero 2 son artículos. Nosotros lo que queríamos era que las categorías intermedias (sin artículos ) como Ropa, Hombre, Pantalones no se pudiesen clickar para que no te listara las subcategorías que tenía. De esta manera solo queríamos que se pudiesen clickar las que tenían artículos.
Para ello tenemos que modificar el archivo que se encuentra en el directorio  modules/blockcategories/
category-tree-branch.tpl entendiendo que partimos del directorio donde tenemos instalado Prestashop.
Este fichero contiene el siguiente código:

<li {if isset($last) && $last == 'true'}class="last"{/if}>
        <a href="{$node.link}" {if isset($currentCategoryId) && ($node.id == $currentCategoryId)}class="selected"{/if} title="{$node.desc|escape:html:'UTF-8'}">{$node.name|escape:html:'UTF-8'}</a>
        {if $node.children|@count > 0}
                <ul>
                {foreach from=$node.children item=child name=categoryTreeBranch}
                        {if isset($smarty.foreach.categoryTreeBranch) && $smarty.foreach.categoryTreeBranch.last}
                                {include file="$branche_tpl_path" node=$child last='true'}
                        {else}
                                {include file="$branche_tpl_path" node=$child last='false'}
                        {/if}
                {/foreach}
                </ul>
        {/if}
</li>

Lo que nosotros teníamos que hacer era modificar el código para que si el nodo tiene hijos nos pintase solo el nombre y además ponerle el p con clase "dynamize" (el jQuery de la pagina entonces pone el símbolo de + al lado del nombre) y sino, entonces es que es un nodo final y ponemos el enlace.

El código quedaría de esta manera:
  
{if $node.children|@count > 0} 
   <p class="dynamize">{$node.name|escape:html:'UTF-8'}</p>       
    {else}
   <a href="{$node.link}" {if isset($currentCategoryId) && ($node.id == $currentCategoryId)}class="selected"{/if} title="{$node.desc|escape:html:'UTF-8'}">{$node.name|escape:html:'UTF-8'}</a>
{/if}

Y el módulo completo queda de la siguiente manera:

<li {if isset($last) && $last == 'true'}class="last"{/if}>
        {if $node.children|@count > 0}
                <p class="dynamize">{$node.name|escape:html:'UTF-8'}</p>
        {else}
                <a href="{$node.link}" {if isset($currentCategoryId) && ($node.id == $currentCategoryId)}class="selected"{/if} title="{$node.desc|escape:html:'UTF-8'}">{$node.name|escape:html:'UTF-8'}</a>
        {/if}   {if $node.children|@count > 0}
                <ul>
                {foreach from=$node.children item=child name=categoryTreeBranch}
                        {if isset($smarty.foreach.categoryTreeBranch) && $smarty.foreach.categoryTreeBranch.last}
                                {include file="$branche_tpl_path" node=$child last='true'}
                        {else}
                                {include file="$branche_tpl_path" node=$child last='false'}
                        {/if}
                {/foreach}
                </ul>
        {/if}
</li>

Una vez modificado ya lo podríamos comprobar accediendo a la tienda y navegando por las categorías.
Una cuestión importante a tener en cuenta a la hora de hacer modificaciones en Prestashop es el funcionamiento de Smarty. Si en el backoffice tenemos activado que Prestashop use la cache y no compile los elementos, cogerá de la última configuración compilada para servirte las páginas (es el optimizador de Smarty). Si queremos que esta u otras modificaciones en Prestashop estuvieran disponibles en la pagina,  tendríamos que compilar de nuevo las plantillas (desde backoffice, herramientas, rendimiento).


martes, 31 de julio de 2012

Instalar Php Mcrypt Centos 6

  Por defecto en Centos 6 no viene el repositorio para descargarnos la extensión Mcrypt para php. La biblioteca mcrypt tiene múltiples algoritmos para cifrar. Para instalar el paquete Mcrypt  de php en Centos tenemos que habilitar el repositorio epel e instalar el paquete php-mcrypt.
Para ello realizamos los siguientes pasos :


1- Accedemos al directorio /usr/src.
   [root@myserver ~]# cd /usr/src/


2- Descargamos el paquete epel-release-6-8.noarch.rpm.
[root@myserver src]# wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

3- Instalamos el paquete epel-release-6-8.noarch.rpm para crear el repositorio.
[root@myserver src]# rpm -ivh epel-release-6-8.noarch.rpm


4- Comprobamos que esté correctamente instalado y actualizamos los paquetes disponibles.
[root@myserver src]# yum repolist
[root@myserver src]# yum -y update



5- Instalamos el paquete php-mcrypt
[root@myserver ~]# yum install php-mcrypt



Si quisiéramos deshabilitar el repositorio después de la instalación, lo que tenemos que hacer es editar el fichero /etc/yum.repos.d/epel.repo y poner la variable enabled=0 en vez de enabled=1




lunes, 9 de julio de 2012

Mapear unidad de red por Samba en Linux

Al trabajar sobre Linux en un mundo de Windows se nos produce, con cierta frecuencia, la necesidad de conectarnos a unidades de red montadas en entornos Windows. No me entretendré más en esto porque la red está cargada de información al respecto solo decir que en general, para interactuar en una red Windows desde un linux necesitaremos usar Samba.

Para realizar este mapeo, tenemos que incluir una entrada en el fichero /etc/fstab similar a esta:

#Montaje Unidad de clientes
//10.0.10.44/generalInformatica /mnt/mountshare/10.0.10.44 smbfs defaults,credentials=/etc/samba/cred-file,uid=1000 0 0

Donde el primer parámetro es la ruta de la unidad a mapear, el segundo es el punto de montaje en nuestro sistema, el tercero es el sistema de ficheros (en nuestro caso el sistema de ficheros es el de samba) y como último parámetro importante es el credentials. Como todos sabemos, al conectarnos a una unidad de red nos puede pedir un usuario y contraseña. Para que el mapeo se pueda realizar necesitaremos indicarle en que fichero tenemos almacenado el usuario y la contraseña. La estructura del fichero es de la siguiente manera:

username=maroto
password=ratatui

Los permisos de este fichero son:

-rw-r--r-- 1 root root    39 ago 12  2011 cred-file

Con todo esto ya tenemos mapeada una unidad de red en Linux.

Mapeo de unidad en Linux

Para realizar el mapeo de una unidad en Linux tendremos que incluir la unidad a mapear en el fichero fstab
En el fichero fstab se encuentran los dispositivos a montar por el sistema y la configuración que usan. De esta manera, cuando el sistema arranca, lee este fichero y monta todos los dispositivos que en él figuran.

Para añadir un dispositivo tenemos que incluir una linea siguiendo la sintaxis <dispositivo> <punto_de_montaje> <sistema_de_archivos> <opciones> <dump-freq> <pass-num>
En mi caso quiero añadir el dispositivo /dev/dm-3 con punto de montaje /mnt/mountshare/docxyz y sistema de archivos ext3. La entrada nueva en el fichero quedaría de la siguiente forma:
/dev/dm-3 /mnt/mountshare/docxyz ext3 defaults 0 0
Para no tener que reiniciar la máquina podemos realizar el montado manual de la unidad de la siguiente manera:
[xyz@xyzcore02 ~]$ mount /dev/dm-3 /mnt/mountshare/docxyz

Para desmontar la unidad en caliente utilizaremos el comando umount. Un ejemplo de su uso sería:
[xyz@xyzcore02 ~]$ umount /dev/dm-3


Alta de usuario para el TRAC

Trac es un proyecto de software libre para gestión de proyectos e incidencias. La verdad es que de los software para la gestión de proyectos o incidencias que conozco es el más ágil a la hora de cerrar el ciclo de una gestión (desde su creación hasta su cierre), a mas a mas  de ser multi-proyecto y tener un WIKI integrada.

Trac utiliza los usuarios de apache para su autenticación, y luego desde la pestaña de Administración se les puede configurar los permisos y accesos a cada una de sus partes. Por lo anterior voy a describir como dar de alta usuarios en apache para una instalación de Trac.

Lo primero es ver donde está situado el fichero de usuarios y contraseñas. Este fichero se indica en el archivo de configuración del Trac (trac.conf).

[root@preproduccion conf]# grep -R "AuthUserFile /etc/" /etc/httpd/conf.d/

/etc/httpd/conf.d/trac.conf:   AuthUserFile /etc/httpd/conf.d/usuariosPreproduccion

En mi caso el fichero está situado en /etc/httpd/conf.d/usuariosPreproduccion. Lo siguiente es generar un usuario y su contraseña en ese fichero mediante el comando htpasswd de apache. Este comando vale tanto para añadir un usuario nuevo como para cambiar una contraseña. La sintaxis rápida es htpasswd fichero_usuarios usuario

[root@preproduccion conf]# htpasswd /etc/httpd/conf.d/usuariosPreproduccion  asia
New password:
Re-type new password:
Adding password for user asia

Tras esto ya tendremos disponible el usuario para poder entrar en el Trac. Podemos comprobar que se ha dado de alta de la siguiente manera:

[root@preproduccion conf.d]# grep -R "asia" /etc/httpd/conf.d/
/etc/httpd/conf.d/usuariosPreproduccion:asia:iny4c9z5OvL2Q

Como podéis ver la contraseña está encriptada, por lo que siempre podremos ver que usuarios están dados de alta, pero no que contraseña tienen.

miércoles, 4 de julio de 2012

Editar archivos PDF con OpenOffice

OpenOffice es una suit ofimática open source y freeware bajo licencia Apache 2.0. Su apariencia y uso es similar a la suit ofimática MS Office pero donde yo encuentro que OpenOffice gana potencia frente al software de Microsoft es en la cantidad de plugins disponibles, creados por la comunidad, que amplían las funcionalidades recogidas en OpenOffice.
Uno de esos plugins es Sun PDF Import. En innumerables ocasiones tenemos que editar documentación que nos mandan en PDF lo que supone un problema económico, al tener que comprar algún producto como Acrobat X Standard, y una ineludible adaptación a la interfaz de usuario. Gracias a Sun PDF Import los usuarios de OpenOffice no tenemos ni que adaptarnos a una nueva interfaz, ni que gastarnos un Euro para poder editar nuestros archivos PDF de una manera cómoda.

Para instalarlo, lo primero que tenemos que hacer es descargarnos el archivo desde aquí (todas las extensiones de los plugins para OpenOffice son .oxt).

Tras esto  tenemos que irnos a Herramientas (Tools)->Administrador de Extensiones.



Nos sale una pantalla con todas las extensiones que tenemos instaladas, en ella pinchamos en añadir.


Buscamos el archivo oracle-pdfimport.oxt que nos hemos descargado.





 Aceptamos la licencia.



Lo cargamos al gestor de extensiones, y tras reiniciar OpenOffice tendremos disponible la edición de archivos PDF (confirmar siempre que el plugin está activo).

lunes, 2 de julio de 2012

Instalar OpenProj en Debian

No se que más decir de todo lo que se ha dicho en la web de OpenProj. Es un software de gestión de proyectos similar al ms project, mucho más ligero, open-source y Freeware. No me voy a extender más en su descripción porque la web esta cargada de comparativas, informes de características detalladas...etc, solo quiero reseñar una comparativa muy buena sobre este tipo de software publicada en Balteus. Por ello paso a  describir la instalación de este magnifico software de gestión de proyectos.

Nos tenemos que descargar el paquete de OpenProj.
El archivo descargado es un rpm, así que para instalárnoslo en Debian tendremos que transformarlo a .deb. Para esto instalamos el paquete alien, que se encargará de la conversión de .rpm a .deb

root@OPT360:~# apt-get install alien
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias      
Leyendo la información de estado... Hecho
Se instalarán los siguientes paquetes extras:
  librpmbuild1 rpm
Paquetes sugeridos:
  lsb-rpm lintian lzma elfutils rpm-i18n
Se instalarán los siguientes paquetes NUEVOS:
  alien librpmbuild1 rpm
0 actualizados, 3 se instalarán, 0 para eliminar y 2 no actualizados.
Necesito descargar 1689 kB de archivos.
Se utilizarán 2376 kB de espacio de disco adicional después de esta operación.

Ahora realizamos la conversión mediante el comando alien -d openproj-1.4-2.noarch.rpm

root@OPT360:/home/rencinar/Descargas# alien -d openproj-1.4-2.noarch.rpm
Warning: Skipping conversion of scripts in package openproj: postinst postrm
Warning: Use the --scripts parameter to include the scripts.
openproj_1.4-3_all.deb generated



Lo siguiente es realizar la instalación de openproj_1.4-3_all.deb, para ello realizamos una instalación normal de un paquete .deb con el comando dpkg:


root@OPT360:/home/rencinar/Descargas# dpkg -i openproj_1.4-3_all.deb
Seleccionando el paquete openproj previamente no seleccionado.
(Leyendo la base de datos ... 208939 ficheros o directorios instalados actualmente.)
Desempaquetando openproj (de openproj_1.4-3_all.deb) ...
Configurando openproj (1.4-3) ...
Procesando disparadores para shared-mime-info ...
Unknown media type in type 'all/all'
Unknown media type in type 'all/allfiles'
Unknown media type in type 'uri/mms'
Unknown media type in type 'uri/mmst'
Unknown media type in type 'uri/mmsu'
Unknown media type in type 'uri/pnm'
Unknown media type in type 'uri/rtspt'
Unknown media type in type 'uri/rtspu'
Unknown media type in type 'fonts/package'
Unknown media type in type 'interface/x-winamp-skin'
Procesando disparadores para desktop-file-utils ...
Procesando disparadores para gnome-menus ...

Tras esto ya tenemos OpenProj, solo tenemos que lanzar el comando openproj

rencinar@OPT360:~$ openproj

Como reseña, el comando alien permite realizar la conversión y la instalación en el mismo paso mediante la opción -i (alien -i archivo.rpm).

Ver la versión de un Linux

En ocasiones necesitamos mirar la versión del sistema Linux con el que estamos trabajando. Al no usarlos de manera frecuente, cada vez que necesito ver la versión , tengo que volverlos a buscar. Por este motivo pongo la recopilación de comandos para ver la versión tanto en Red Hat/Centos y Debian.
Para ver la versión en Red Hat/Centos podemos lanzar los siguientes comandos:
  • cat /etc/redhat-release
  • cat /etc/issue
El resultado de cada uno de ellos es:

[root@core ~]$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 5.7 (Tikanga)

[root@core ~]$ cat /etc/issue
Red Hat Enterprise Linux Server release 5.7 (Tikanga)
Kernel \r on an \m


Para ver la versión en Debian podemos lanzar el siguiente comando:
  • lsb_release -a

El resultado es:

rencinar@OPT360:~/software/data-integration$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 6.0.5 (squeeze)
Release:        6.0.5
Codename:       squeeze

viernes, 3 de febrero de 2012

Evitar fsck en el arranque del sistema

Cuando montamos un sistema con unidades de disco mapeadas y de un volumen muy grande (como una unidad de 10 teras en una cabina Hitachi) nos encontramos con la problemática de que cuando se arranca el sistema, puede empezar ha hacer un fsck de esa unidad y estar más de 6 horas con la máquina parada (el tiempo depende del volumen de datos que tengamos). Para poder para esto y que no nos vuelva a pasar tendremos que hace un control^c para pararlo. Tras esto las unidades se quedan montadas en solo lectura, por esto tenemos que entrar en otra tty como root y montarlas en lectura/escritura con el comando:

root@OPT360:~$ mount -n -o remount /

Ahora ya podemos editar el fichero fstab donde se indica el modo y las acciones de montage y ponerle, al final de la unidad que queramos, que no realice el fsck un 0 quedando algo similar a esto:

## discos de la cabina para documentos
##/dev/dm-3               /mnt/mountshare/docsistema  ext3    defaults        0 0

Desactivar firewall en Redhat


Montando un servidor de producción me encontré con una cosa que no sabía y con la que perdí mucho tiempo. En una instalación nueva de Red Hat, el firewall se instala y se configura por defecto para iniciarse con cada arranque del servidor con la política DROP por defecto. Esto me provocó una gran perdida de tiempo, porque no podía conectarme a ningún servicio del Glassfish ni del apache y no sabía donde estaba el problema. Gracias a Josete, fui capaz de resolverlo en tiempos aceptables.
Lo que hicimos fue desactivar el firewall de RedHat de la siguiente manera:
Los servicios de iptables e ip6tables están en el directorio /etc/init.d/ así que como root los desactivamos con las siguientes sentencia:

server@OPT360:~$ /etc/init.d/iptables stop
server@OPT360:~$ /etc/init.d/ip6tables stop

Y luego con el comando chkconfig les quitamos el arranque automático:

server@OPT360:~$ chkconfig iptables --level 2345 off
server@OPT360:~$ chkconfig ip6tables --level 2345 off

martes, 24 de enero de 2012

Cambiar base de datos en el CAS

El CAS (Central Authentication Service) es un sistema de autenticación creado originalmente por la Universidad de Yale para proporcionar una autenticación segura de usuarios.

Este se monta sobre un apache para poder funcionar. Si deseamos configurarle tendremos que acceder al fichero deployerConfigContext.xml situado en la ruta (suponiendo /home/xyz/server/apache-tomcat-6.0.20 como el raíz de instalación del apache en el que esté) /home/xyz/server/apache-tomcat-6.0.20/webapps/cas/WEB-INF/deployerConfigContext.xml y editarlo con el vi.

rencinar@OPT360:~$ vi /home/xyz/server/apache-tomcat-6.0.20/webapps/cas/WEB-INF/deployerConfigContext.xml

En el econtraremos múltiples parametros susceptibles de configurar. Un ejemplo de estos es la base de datos a la que conectarnos, que en este caso es  Postgresql.

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
                <property name="driverClassName">
                  <value>org.postgresql.Driver</value>
                </property>
                <property name="url">
                  <value>jdbc:postgresql://predb01.dominio.es/xyzcore</value>
                </property>
                <property name="username"><value>pruebacore</value></property>
                <property name="password"><value>12345678</value></property>
      </bean>

Puede obtener mas información en:

Contraseña de admin automática en Glassfish

En innumerables ocasiones, cuando queremos hacer un deploy de una aplicación realizamos un comando de este estilo para que se haga de forma automática:

#Asignacion de parametros despendiendo del servidor indicado.
if [ "$1" == "xyz" ]; then
        SERVER_HOST=localhost
        SERVER_PORT=54848
        SERVER_PATH=$HOME/server/glassfishxyzCore/bin
elif [ "$1" == "jxyz" ]; then
        SERVER_HOST=localhost
        SERVER_PORT=64848
        SERVER_PATH=$HOME/server/glassfishJxyz/bin
else
        echo "Opción servidor $1 no es valida"
        echo "Opciones disponibles: "
        echo "  xyz     - servidor xyz"
        echo "  jxyz - servidor jxyz"
        exit -2
fi

#Deploy del directorio.
$SERVER_PATH/asadmin deploydir --echo=true --user admin --passwordfile "$HOME/aplicacion/bin/passfile"  --host $SERVER_HOST --port $SERVER_PORT  --force=true --enabled=true --name $2 --verify=false --precompilejsp=false "$3


Donde definimos un --user admin y un --passwordfile "passfile".
Para evitarnos los problemas de que no sea capaz de leer el fichero passfile por la codificación, permisos....etc podemos solucionarlo ejecutando el comando  ./asadmin login dentro de la carpeta bin del Glassfish. Este nos generará un fichero con el par usuario-clave que usará el glassfish para logar el usuario con la clave en él definida.

Un ejemplo de la ejecución del comando es:

rencinar@OPT360:~/proyectos/xyz/servers/glassfish/bin$ ./asadmin login
Please enter the admin user name>admin
Please enter the admin password>adminadmin
Trying to authenticate for administration of server at host [localhost] and port [4848] ...
An entry for login exists for host [localhost] and port [4848], probably from an earlier login operation.
Do you want to overwrite this entry (y/n)?y
Login information relevant to admin user name [admin] for host [localhost] and admin port [4848] stored at [/home/rencinar/.asadminpass] successfully.
Make sure that this file remains protected. Information stored in this file will be used by asadmin commands to manage associated domain.

Fijar reloj por NTP

El protocolo NTP (Network Time Protocol) sirve para ajustar en reloj de un sistema informático por red. Para comunicarse utiliza el puerto 123 y va por UDP.

Si necesitamos o queremos que todos los equipos de una red tengan la misma descripción horaria lo más adecuado es configurarles para que esta hora la tomen mediante ntp de algún servidor que provea.

Configurar el reloj  en RHEL, CENTOS o FEDORA por NTP:

Entramos en una consola y nos  logamos como root:

[rencinar@core mountshare]#  su -

Instalamos ntp:

[root@core mountshare]# yum -y install ntp

Arrancamos el servicio ntpd:

[root@core mountshare]# service ntpd start

Lo configuramos para que se ejecute cuando se reinicie el sistema:

[root@core mountshare]# chkconfig ntpd on

Configuramos la hora mediante el comando ntpdate y elegimos un servidor que nos pueda proveer de la hora por ntp (en mi caso 2.pool.ntp.org).

root@core:~# ntpdate -u 2.pool.ntp.org

Reiniciamos el servicio.

[root@core mountshare]# service ntpd restart

Tras esto tendremos la hora de nuestro sistema configurada y siempre actualizada.

[root@core mountshare]# date
lun ene 23 12:23:08 CET 2012


Configurar el reloj  en Debian por NTP:

Entramos en una consola y nos  logamos como root:

[rencinar@OPT mountshare]#  su -

Instalamos ntp:

root@OPT:~# apt-get install ntpdate

Lo configuramos para que se ejecute cuando se reinicie el sistema:

root@OPT:~# chkconfig ntp on 

Configuramos la hora mediante el comando ntpdate y elegimos un servidor que nos pueda proveer de la hora por ntp (en mi caso 2.pool.ntp.org).

root@OPT:~# ntpdate -u 2.pool.ntp.org

Reiniciamos el servicio ntpd: 

root@OPT:~# service ntp restart

Tras esto tendremos la hora de nuestro sistema configurada y siempre actualizada. 

root@OPT:~# date
lun ene 23 12:26:51 CET 2012

Puede obtener mas información en:

jueves, 19 de enero de 2012

Arranque de un servicio al iniciar el sistema en RHEL

Para que se lance un proceso al arrancar el sistema, necesitamos incluir como servicio este proceso en /etc/init.d/ con el nombre que queramos (en mi caso este proceso sera prueba) y generándolo siempre como root.

Un ejemplo de como sería el esqueleto para crear un servicio es el siguiente:

 #! /bin/sh
set -e
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:directorio donde esten los ejecutables que haga el starServer, stopServer
DESC="descripción entre comillas"
NAME=nombre del servio
STARTUP=ruta completa incluyendo el ejecutable de arranque
SHUTDOWN=ruta completa incluyendo el
ejecutable de parada
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
USER=usuario con el que se va a lanzar

test -x $DAEMON || exit 0

d_start() {
       su $USER $STARTUP || echo -n " already running"
}
d_stop() {
       su $USER $SHUTDOWN || echo -n " not running"
}
case "$1" in
 start)
       echo -n "Starting $DESC: $NAME"
       d_start
       echo "."
       ;;
 stop)
       echo -n "Stopping $DESC: $NAME"
       d_stop
       echo "."
       ;;
 reload|restart|force-reload)
       echo -n "Restarting $DESC: $NAME"
       d_stop
       sleep 10
       d_start
       echo "."
       ;;
 *)
       echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
       exit 3
       ;;
esac
exit 0


Tras generarlo le asignamos permisos de ejecución de la siguiente manera (siempre como root):

-bash-3.2$ chmod 755 prueba

Si hacemos un ls -ltr quedaría con los permisos:

-rwxr-xr-x 1 root root  1547 ene 19 12:23 PRUEBA

Con esto ya tendríamos un servicio que arranque nuestro proceso. Para poderlo arrancar sería tan fácil como hacer dentro del directorio /etc/init.d/
un:

-bash-3.2$ ./prueba start
-bash-3.2$ ./prueba stop

Ahora para incluirlo en el arranque del sistema utilizamos el comando chkconfig como root de la siguiente manera :

-bash-3.2$ chkconfig --add prueba  --level 2345

Esto lo incluye en el arranque del sistema para los niveles de arranque 2, 3, 4 y 5.

ResourceAdapterInternalException: MQJMSRA_RA4001: start:Aborting:Exception starting EMBEDDED broker=EMBEDDED Broker start failure:code = 1

Hay ocasiones que por celeridad o para evitarnos una configuración integra del Glassfish decidimos copiar el servidor de una máquina a otra. Esto tiene el por menor de tener que renombrar, en todos los lugares del servidor (exceptuando los ficheros binarios), la ip y el DNS antiguos por los nuevos. Esto lo podemos realizar mediante el comando:

grep -r "ip" /home/xyz/server/glassfishxyzCore/ 
grep -r "DNS" /home/xyz/server/glassfishxyzCore/ 

Donde tanto la ip como el DNS son las antiguas del servidor y glassfishxyzCore es la carpeta raíz del Glassfish. Entonces procedemos a re-arrancar el Glassfish, teniendo en cuenta que al cambiar la ip y el DNS el fichero lock que contiene la definición de imqbroker puede no refrescarse dando el siguiente error:

[#|2012-01-18T17:54:33.644+0100|SEVERE|sun-appserver2.1|javax.enterprise.resource.resourceadapter|_ThreadID=10;_ThreadName=main;_RequestID=6b789d3d-5089-4899-ad72-024b48a73a78;|RAR6035 : Resource adapter start failed : {0}
javax.resource.spi.ResourceAdapterInternalException: MQJMSRA_RA4001: start:Aborting:Exception starting EMBEDDED broker=EMBEDDED Broker start failure:code = 1
        at com.sun.messaging.jms.ra.ResourceAdapter.start(ResourceAdapter.java:476)
        at com.sun.enterprise.connectors.ActiveInboundResourceAdapter$1.run(ActiveInboundResourceAdapter.java:178)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.enterprise.connectors.ActiveInboundResourceAdapter.startResourceAdapter(ActiveInboundResourceAdapter.java:174)
        at com.sun.enterprise.connectors.ActiveInboundResourceAdapter.<init>(ActiveInboundResourceAdapter.java:132)
        at com.sun.enterprise.connectors.system.ActiveJmsResourceAdapter.<init>(ActiveJmsResourceAdapter.java:234)
        at com.sun.enterprise.connectors.ActiveRAFactory.createActiveResourceAdapter(ActiveRAFactory.java:107)
        at com.sun.enterprise.connectors.ResourceAdapterAdminServiceImpl.createActiveResourceAdapter(ResourceAdapterAdminServiceImpl.java:300)
        at com.sun.enterprise.connectors.ResourceAdapterAdminServiceImpl.createActiveResourceAdapter(ResourceAdapterAdminServiceImpl.java:445)
        at com.sun.enterprise.connectors.ConnectorRuntime.createActiveResourceAdapter(ConnectorRuntime.java:230)
        at com.sun.enterprise.jms.JmsProviderLifecycle.onStartup(JmsProviderLifecycle.java:428)
        at com.sun.enterprise.server.ApplicationServer.onStartup(ApplicationServer.java:446)
        at com.sun.enterprise.server.ondemand.OnDemandServer.onStartup(OnDemandServer.java:134)
        at com.sun.enterprise.server.PEMain.run(PEMain.java:409)
        at com.sun.enterprise.server.PEMain.main(PEMain.java:336)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at com.sun.enterprise.server.PELaunch.main(PELaunch.java:415)
Caused by: java.lang.RuntimeException: EMBEDDED Broker start failure:code = 1
        at com.sun.messaging.jms.ra.EmbeddedBrokerRunner.start(EmbeddedBrokerRunner.java:268)
        at com.sun.messaging.jms.ra.ResourceAdapter.start(ResourceAdapter.java:472)
        ... 19 more
|#]



Para solucionarlo basta con eliminar el fichero lock situado en imqbroker, para ello lanzamos un comando similar a este (considerando glassfishxyzCore la carpeta raíz del Glassfish y xyz el dominio que queremos arrancar):

-bash-3.2$ rm /home/xyz/server/glassfishxyzCore/domains/xyz/imq/instances/imqbroker/lock

Tras esto reiniciamos el servidor, y el archivo lock, estaría regenerado.

La configuración del imqbroker quedaría con una estructura similar a esta:
imqbroker:DNS_NUEVA_IP:47676