Integración de IT PAM y Webform de Drupal

Después de haberme pegado bastante con ello, lo dejo aquí por si vale para alguien en el futuro, y le ahorro algún disgusto :)

NOTA: Tengo poca idea de PHP, SOAP, WSDL, etc., pero creo que al final no me ha quedado del todo mal….

PROBLEMA:

Se quiere integrar un formulario de Drupal (alta de nueva máquina virtual), con un proceso de IT PAM, que crea la máquina virtual, da el alta en la CMDB, etc.

El problema viene en como notificar al IT PAM que hay un nuevo formulario. La primera idea, es crear un proceso que cada X tiempo, verifique si hay un formulario nuevo en base de datos, y si lo hay, procesarlo. Obviamente este comportamiento es un poco “chapucero” y nada elegante.

Investigando un poco el tema, hemos averiguado que IT PAM tiene un servicio web que puede ser consumido, enviandole la petición adecuada, usuario, proceso a desencadenar, etc.

Este servicio web se puede consultar en

http://<itpamhost>:8080/itpam/soap

con ?wsdl al final, para ver el xml.

Se probó a consumir el servicio web utilizando curl, funcionando de manera satisfactoria, creando un xml como este:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:itp="http://www.ca.com/itpam">
   <soapenv:Header/>
   <soapenv:Body>
      <itp:executeStartRequest>
         <itp:auth>
            <itp:user>USUARIO</itp:user>
            <itp:password>PASSWORD</itp:password>
         </itp:auth>
          <itp:objLocation>
            <itp:name>NOMBRE_PROCESO</itp:name>
            <itp:path>PATH_PROCESO</itp:path>
         </itp:objLocation>
       </itp:executeStartRequest>
   </soapenv:Body>
</soapenv:Envelope>

Sin embargo, consumirlo con curl tenía los mismos problemas que el anterior supuesto (habría que comprobar de alguna manera que ha sido actualizada la base de datos), y ejecutar un proceso con un trigger de mysql no es nada recomendable (problemas de seguridad, locking,…)

SOLUCION:

Se creó un fichero .php que realizaba el proceso “manualmente” de manera correcta:

<?php
      // include soap file
      require_once('nusoap/nusoap.php');

      // set end point
      $endpoint = "http://<ITPAMHOST>:8080/itpam/soap";

      // create client
      $client = new nusoap_client($endpoint);

      if ( $client->getError() ) {
        print "Soap Constructor Error: ";
        print_r($client->getError());
      }

      // Human readable
      $request = <<<HEREDOC
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:itp="http://www.ca.com/itpam">
   <soapenv:Header/>
   <soapenv:Body>
      <itp:executeStartRequest>
         <itp:auth>
            <itp:user>USUARIO</itp:user>
            <itp:password>PASSWORD</itp:password>
         </itp:auth>
         <itp:objLocation>
            <itp:name>NOMBRE_PROCESO</itp:name>
            <itp:path>PATH_PROCESO</itp:path>
         </itp:objLocation>
      </itp:executeStartRequest>
   </soapenv:Body>
</soapenv:Envelope>
HEREDOC;

      $msg     = $client->serializeEnvelope($request, '', array(), 'document', 'encoded', '');
      $result  = $client->send($msg,"executeStartRequest");

      if ( $client->fault ) { //soap_fault
        print "Soap Fault :";
        print_r($client->fault->faultcode);
        print_r($client->fault->faultstring);
      }
      elseif ( $client->getError() ) {
        print "Soap Error :";
        print_r($client->getError());
      }
      else {
        print "Result: ";
        print_r($result);
      }

?>

Aprovechando que Drupal es opensource, y teniendo el codigo, se intentó modificar parte del codigo del modulo encargado de la gestión de modulos (webform), sin exito.

Investigando un poco más, se vió que el modulo Webform, tiene una API, que permite ejecutar “cosas” en distintos puntos del proceso (antes de entrar en base de datos, al actualizar, etc.)

Por lo tanto, solo quedaba encontrar como utilizar esa característica para nuestros propositos.

La solución más elegante (y la que se ha usado), es crear un modulo de Drupal nuevo, llamado “itpam”, que utiliza el “hook” _webform_submission_insert cuyo contenido es:

itpam/itpam.info:

; $Id: $
name = ITPAM
description = "Module for notify IT PAM"
package = Administration
core = 6.x
php = 5.1

itpam/itpam.module:


<?php
function itpam_webform_submission_insert ($node, $submission){

if ($node->nid == 104){

      // include soap file
      require_once('nusoap/nusoap.php');

      // set end point
      $endpoint = "http://itpamhost:8080/itpam/soap";

      // create client
      $client = new nusoap_client($endpoint);

      if ( $client->getError() ) {
        print "Soap Constructor Error: ";
        print_r($client->getError());
      }

      // Human readable
      $request = <<<HEREDOC
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:itp="http://www.ca.com/itpam">
   <soapenv:Header/>
   <soapenv:Body>
      <itp:executeStartRequest>
         <itp:auth>
            <itp:user>USUARIO</itp:user>
            <itp:password>PASSWORD</itp:password>
         </itp:auth>
         <itp:objLocation>
            <itp:name>NOMBRE_PROCESO</itp:name>
            <itp:path>PATH_PROCESO/</itp:path>
         </itp:objLocation>
      </itp:executeStartRequest>
   </soapenv:Body>
</soapenv:Envelope>
HEREDOC;

      $msg     = $client->serializeEnvelope($request, '', array(), 'document', 'encoded', '');
      $result  = $client->send($msg,"executeStartRequest");

      if ( $client->fault ) { //soap_fault
        print "Soap Fault :";
        print_r($client->fault->faultcode);
        print_r($client->fault->faultstring);
      }
      elseif ( $client->getError() ) {
        print "Soap Error :";
        print_r($client->getError());
      }
      else {
        print "Result: ";
        print_r($result);
      }
}
}
?>

Este modulo se activa cuando se inserta un registro nuevo en la base de datos (se ha añadido el chequeo $node->nid == 104, que es el correspondiente en este caso, al alta de máquina virtual)

Una vez creado el modulo, y con los permisos adecuados, se activa el modulo desde la interfaz de administración de Drupal, é voilá!

PD.- Falta cambiar un par de detalles, pero como “guia” vale :)

Post to Twitter Post to Facebook Send Gmail Post to LinkedIn

No Comments »

minWi on septiembre 23rd 2011 in programación, sysadmin

Mirror de discos en rool pool en OpenIndiana

Una de las cosas que más me apetecía probar de OpenIndiana (vamos, de Solaris), era ZFS. Sin embargo, en la instalación de la versión servidor, no dejaba ninguna opción avanzada de almacenamiento, solamente elegir el disco y si era dedicado o había que particionar.


NOTA: La instalación usando F2,F3,… es un auténtico PITA.
Mi idea era montar un RAID0+1 con cuatro discos.
Más tarde, comprobé que un root pool no se puede extender a más de un disco (o eso creo!), por lo que descarté la idea, y decidí probar un RAID1.
La instalación de OpenIndiana la realicé en una máquina virtual bajo VMware Fusion, con dos discos de 20 GB (vamos, los screenshots de antes).
Una vez instalado, comprobamos el estado de los pooles (solo debería de haber uno, el pool “root”):
zpool status

Comprobamos los discos que tenemos:
format
ctrl+c


NOTA: Seguramente haya alguna forma más limpia de listar los discos, pero esta funciona.

Y procedemos a crear el mirror.
Como el segundo disco es “virgen”, hay que recrear la estructura del otro:
format
elegir disco
fdisk


Crear partición por defecto:

Ahora las particiones (slices) del disco inicial, recrearlas en el nuevo:
format
elegir disco
partition
print



format
elegir disco
partition
elegir slice 0
id de slice = root
tamaño = cylinders -1
label




Una vez creadas las slices, procedemos a “attachear” el disco/slice al rpool:

zpool attach -f rpool c3t0d0s0 c3t1d0s0


NOTA: No se porque hay que “forzar”, pero en todos los sitios donde he buscado, lo pone ;D
Esperamos a que se repliquen los datos (resilvered), e voilà!:

Para que todo quede como es debido, instalamos el cargador de arranque (grub) en el disco nuevo, para que el sistema pueda arrancar en caso de que falle:

installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c3t1d0s0

Probamos a quitar el primer disco del rpool:

zpool detach rpool c3t0d0s0


Reiniciamos… y funciona!

PD.- Puede que la entrada esté un poco confusa, por el tema de particiones o slices… la verdad es que yo tampoco lo tengo muy claro, así que refleja bien la realidad :P Prometo documentarme!

Post to Twitter Post to Facebook Send Gmail Post to LinkedIn

No Comments »

minWi on septiembre 20th 2011 in OpenIndiana

OpenIndiana 151a

Hace unos días, la comunidad detrás de OpenIndiana, ha hecho pública la versión 151a del sustituto del fallido OpenSolaris.
Es una “development release”, con lo cual se supone que no está preparada para entornos de producción, así que avisados estáis ;)
Yo por mi parte, siempre “le he tenido ganas” a los Solaris, pero hasta ahora no me había animado a más que instalarlo en alguna máquina virtual y poco más, pero esta vez parece que estoy aprendiendo algo.
De momento me quedo con que no es todo lo parecido a linux que pensaba, y estoy descubriendo muchas cosas interesantes (ZFS es la caña), y que hay que tener cuidado con algún comando, que en linux cumple un cometido, y en solaris otro totalmente distinto (vease, killall).
Una de las cosas que más me ha llamado la atención de esta versión, es la inclusión de KVM como herramienta de full-virtualization, ya que combinado con ZFS puede dar mucho juego (habrá que ver que tal de performance, ya que KVM está desarrollado en/para linux).

Post to Twitter Post to Facebook Send Gmail Post to LinkedIn

No Comments »

minWi on septiembre 20th 2011 in OpenIndiana

Acualización del blog a WordPress 3.2.1

Several years later…

Post to Twitter Post to Facebook Send Gmail Post to LinkedIn

No Comments »

minWi on septiembre 19th 2011 in Blog

¡Anda!

¡Si tengo un blog!

Hace AÑOS (literalmente) que no escribo en el blog… muchas cosas han cambiado, y sobre todo mi vagancia parece que ha aumentado :)

Sigo escribiendo cosas (llamalo X) en twitter, y he remodelado (si, soy un cutre, no tengo ni idea de HTML, pero oye, no se puede saber de todo!) mi “web personal” (que de los 90′s es lo de web personal)

Así que… eduardominguez.es

Post to Twitter Post to Facebook Send Gmail Post to LinkedIn

No Comments »

minWi on febrero 9th 2011 in Blog

Bidobido

Bueno… mucho tiempo sin escribir en el blog, pero esta vez es por una buena causa (mas bien por si me toca una consola :P )
El caso es que leyendo los feeds del google reader, vi una entrada de r0sk, y justo hace poco, compre en bidobido, experiencia que paso a relatar:
Hace poco estuve buscando una memory stick para psp, tenia una de 4 gb, pero se me quedaba corta :) El caso es que twiteé a ver si alguien sabia algun sitio BBB (bueno, bonito, barato) para comprar una memory stick, y solo recibí una respuesta de r0sk, recomendandome discoazul, pero ya habia hecho la compra en bidobido, concretamente esta memory stick.
25€ y varios dias despues, llego a casa, y ahora vive felizmente dentro de mi psp :)
Como comentarios sobre el sitio (ya que estamos…), creo que peca de tener demasiadas categorias… es un poco lioso tener que bucear tanto (si, se que hay buscador).

Post to Twitter Post to Facebook Send Gmail Post to LinkedIn

No Comments »

minWi on septiembre 20th 2009 in Personal

Fedora 11 – Leonidas

Despues de varios retrasos (bugs mayores con anaconda), el proyecto Fedora mañana anunciará la version 11 de Fedora.
Como siempre, hay algun sysadmin que descuida un poco los permisos, y en la lista de mirrors ya hay alguna versión disponible para descarga
De todas maneras casi mejor esperar un par de dias a la “release” oficial :)
PD.- Feature list de Fedora 11

Post to Twitter Post to Facebook Send Gmail Post to LinkedIn

No Comments »

minWi on junio 8th 2009 in Fedora, Linux

Redimensionar lv

Quick tip:

  • Hacer backup
  • Desmontar
  • Pasar fsck
  • Redimensionar sistema de ficheros
  • Redimensionar lv
  • Pasar fsck
  • Montar

Ojo, porque se pueden perder datos… por eso lo del backup! :D

Post to Twitter Post to Facebook Send Gmail Post to LinkedIn

No Comments »

minWi on mayo 7th 2009 in Linux, sysadmin

CentOS 5.3 *almost* out

La gente de CentOS ya tiene preparada la versión 5.3 de la “hermana” de RHEL.

De momento no hay anuncio oficial ni dia de salida, pero sin embargo, en el foro, se han dejado caer ya los torrents, que no estan completos (96%, creo), y en el momento en que sea oficial, se completarán :D

Asi que yo, de momento, ya estoy descargando todas las versiones, aunque solo sea por ayudar con un poquito de ancho de banda :)

Los links de los torrents:

http://www.karan.org/mock/5.3/CentOS-5.3-i386-bin-1to6.torrent
http://www.karan.org/mock/5.3/CentOS-5.3-i386-bin-DVD.torrent
http://www.karan.org/mock/5.3/CentOS-5.3-x86_64-bin-1to7.torrent
http://www.karan.org/mock/5.3/CentOS-5.3-x86_64-bin-DVD.torrent

Post to Twitter Post to Facebook Send Gmail Post to LinkedIn

No Comments »

minWi on marzo 31st 2009 in CentOS, Linux, sysadmin

Molesto sonido de fondo en eee 901 con linux

Estaba yo escuchando musica via audacity, cuando me he enchufado los cascos y he notado un horrible ruido de fondo (ruido blanco, creo), que me ha parecido “normal”, puesto que el hardware de audio del portatil he supuesto que no seria muy “generoso”.

De todas maneras he estado mirando configuraciones y demas… y ha sido silenciar la entrada de microfono desde alsamixer… y mano de santo!!!

Resumiendo: Si oyes ruido de fondo, silencia el micro (alsamixer)

Post to Twitter Post to Facebook Send Gmail Post to LinkedIn

2 Comments »

minWi on enero 5th 2009 in Linux

  • RSS
  • Facebook
  • Google+
  • LinkedIn
  • Twitter
  • Picasa
  • Flickr
  • YouTube