Primer ejemplo de XML-RPC

Estimando que probablemente uno de los proyectos de la Fundación requiera la consulta de información de uno de los proyectos anteriores ubicado en uno de los servicios de hosting, decidí realizar algunos experimientos con XML-RPC para determinar la viabilidad de utilizarlo para esta tarea en caso de que sea realmente necesaria. Debido a que el hosting en el que se encuentra el proyecto tiene una versión bastante antigua de PHP4 se decidió utilizar la librería de http://phpxmlrpc.sourceforge.net/.

Este es mi primer contacto con XML-RPC. Había leido un poco del tema en la documentación del framework CodeIgniter que planeo utilizar dentro de poco en mis próximos proyectos, sin embargo como está basado en PHP5 y el hosting soporta únicamente PHP4 decidí probar con la librería mencionada anteriormente, la cual es bastante mas enrredada, pero por suerte bien documentada, aunque hacen falta ejemplos.

En este pequeño demo que implementé se envían por parte del cliente un nombre (“Pepe”) y la solicitud de ejecución de un procedimiento remoto (“HelloWorld.show”). El servidor relaciona este método remoto con un procedimiento local (“show”) que retorna la cadena resultante (“Hello Pepe”).

El Cliente.

Se realiza el include de la librería de XML-RPC.

include_once (“../lib/xmlrpc-2.2/lib/xmlrpc.inc”);

Se define la ubicación del servidor y se instancia un objeto de la clase cliente.

$host = “localhost”;
$location = “xmlrpc/d1”;
$server = “ServerHello.php”;

$client = new xmlrpc_client(“http://{$host}/{$location}/{$server}”);

Se prepara el mensaje que enviará el cliente. El mensaje define cual es el procedimiento remoto a ejecutarse y la información relacionada con este (parámetros). Para el ejemplo se invocará al procedimiento HelloWorld.show y se le enviará “Pepe” que es de tipo string.

$message = new xmlrpcmsg(“HelloWorld.show”, array(new xmlrpcval(“Pepe”, “string”)));

Si se desea consultar los mensajes de depuración se debe activar la siguiente expresión.

// $client -> setDebug(3);

Con todo listo, se envía la solicitud al servidor y se captura su respuesta.

$response = $client -> send($message);

Si la respuesta referencia a un error, este viene con su respectivo código de fallo, en caso contrario se puede consultar su contenido.

if ($response -> faultCode())
echo “<br>KO. Error: ” . $response -> faultString();
else
echo “<br>OK. got … ” . $response -> value() -> scalarVal();

El Servidor.

Se realiza el include de la librería de XML-RPC, se incluyen los dos archivos inc: cliente y servidor.

include_once (“../lib/xmlrpc-2.2/lib/xmlrpc.inc”);
include_once (“../lib/xmlrpc-2.2/lib/xmlrpcs.inc”);

Se instancia un objeto de clase servidor en la que se especifica la siguiente información de los procedimientos remotos expuestos como disponibles:

  • Relación entre nombre de procedimiento remoto y función PHP a ejecutarse en su llamado.
  • La firma de la función (signature): tipo de retorno y de parámetros requeridos. Una función puede tener varias firmas.
  • Documentación de la función (docstring).

$server = new xmlrpc_server(array(
“HelloWorld.show” => array(“function” => “show”,
“signature” => array(array($xmlrpcValue, $xmlrpcString)),
“docstring” => “Shows a greeting message with the specified name.”)
), false);

Si se desea consultar los mensajes de depuración se debe activar la siguiente expresión.

// $server -> SetDebug(3);

Cuando todo está listo se envía la respuesta al cliente.

$server -> service();

Como siguiente paso se debe definir la función PHP show que será ejecutada cuando el procedimiento remoto HelloWorld.show sea solicitado.

La función recibe la información enviada por el cliente ($xmlrpcmsg) y tiene acceso a la variable $xmlrpcerruser la cual indica el número del error a partir del cual se encuentran disponibles para los errores definidos por el usuario.

function show($xmlrpcmsg)
{
global $xmlrpcerruser;

Verifico que el número de parámetros enviados por el cliente sea de uno, en caso contrario envío un código de error.

if ($xmlrpcmsg -> getNumParams() != 1)
{
return new xmlrpcresp(0, $xmlrpcerruser+1, “I am expecting a parameter for the name!”);
}

Obtengo el valor del parámetro disponible.

$val0 = $xmlrpcmsg -> getParam(0);

if($val0 -> kindOf() != “scalar”)
{
return new xmlrpcresp(0, $xmlrpcerruser+2, “I am expecting a string as parameter for the name!”);
}

$name = $val0 -> scalarval();

Compongo la cadena resultante: “Hello ” + valor del parámetro y la empaqueto en un mensaje de respuesta (xmlrpcresp) el cual es de tipo string y es enviado hacia el cliente.

return new xmlrpcresp(new xmlrpcval(“Hello ” . $name, “string”));
}

El demo #1 en ejecución puede ser consultado en http://demo.jorgeivanmeza.com/PHP/XMLRPCDemo/0.1/ClientHello.php

La documentación en línea de XML-RPC for PHP puede ser consultada en http://phpxmlrpc.sourceforge.net/doc-2/.

Mozilla Thunderbird + Lightning + GoogleCalendar

Ayer descubrí algo interesante. Por supuesto mi cliente de correo desde hace muchos años ha sido Thunderbird de los productos Mozilla. Hace un tiempo instalé el módulo Lightning para la gestión de calendarios (agendas), sin embargo apenas hace poco le empecé a dar un uso real. Ayer se me ocurrió que debería haber una forma de sincronizar este calendario con el web que provee Google … y por supuesto que la había.

Los siguientes pasos requieren se tenga instalado los siguientes paquetes de software:

Es necesario instalar el plugin de sincronización para Thunderbird, el cual puede descargarse de https://addons.mozilla.org/en-US/thunderbird/addon/4631.

De GoogleCalendar se requiere obtener el enlace privado del calendario.

Google Calendar > Configuración > Configuración > Calendarios > [calendario] >
Dirección privada: [XML] (copiar dirección del enlace)

En Thunderbird se asocia el calendario de Google a un calendario local.

Archivo > Nuevo > Calendario > En la red > Google Calendar >
Ubicación = [XML]
(pegar dirección del enlace)

Es posible mantener en Lightning varios calendarios provenientes de diferentes orígenes de datos, por ello es útil elegir un color diferente para cada una de estas fuentes.

Crear nuevas secciones en page.tpl de Drupal 5

Cómo agregar secciones nuevas a plantilla de un tema de Drupal además de las convencionales header, footer, left_sidebar, right_sidebar y content ?En el contenido de la plantilla (archivo page.tpl.php) agregar la impresión del contenido del nuevo bloque. En este caso links_section.

<?php if ($links_section):?>
<?php print $links_section; ?>
<?php endif; ?>

En el archivo de la plantilla (template.php) crear o editar la función TEMA_regions() especificando las regiones contenidas. En este caso, el tema se llama mitema y al final se incluye la sección nueva.

function mitema_regions()
{
return array('left' => t('left sidebar'),
'right' => t('right sidebar'),
'content' => t('content'),
'header' => t('header'),
'footer' => t('footer'),
'links_section' => t('links section'));
}

Para mas información consultar el siguiente enlace: http://drupal.org/node/29139.

“client denied by server configuration” en Apache 2.2.4

Esta vez estoy instalando Apache 2.2.4 y encontré un problema. Cuando ya estaba todo supuestamente listo e intentaba solicitar una página del Document_Root me respondía el servidor con un 403 (forbidden). Muy extraño. En los registros aparecían mensajes como el siguiente:[Tue Aug 07 17:06:14 2007] [error] [client 192.168.1.2] client denied by server configuration: /data/www/index.html

Encontré que la versión 2.2.x ajusta de una manera mas restrictiva los permisos sobre el directorio raíz (‘/’). En httpd.conf dice lo siguiente:

<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
</Directory>

Comentando la última línea: “Deny from all” se solucionó el inconveniente.

Como listar los paquetes instalados

Operating system Main command List installed packages
Linux (RedHat like distribution) rpm rpm -qa
Linux Debian dpkg dpkg -l
Linux (Slackware distribution) pkgtool pkgtool
ls -l /var/log/packages/
Cygwin Graphic installer (“setup.exe”) cygcheck -c
Solaris pkginfo pkginfo
grep xxx /var/sadm/install/contents
Irix versions versions
Compaq (Digital) Unix setld setld -i
AIX lslpp lslpp -l
HP-UX swlist swlist

Tomado de http://www.fortran-2000.com/ArnaudRecipes/Version.html.

Ver información adicional en Rosetta Stone for Unix.

Problemas con el idioma de los documentos con OpenOffice

El día de ayer tuve que invertir un buen par de horas en investigar acerca de unos presuntos problemas con la selección del idioma de los documentos de OpenOffice.

Instalé el diccionario en Español (Colombia) con el macro. Configuré correctamente en Herramientas > Opciones > Configuración de Idioma > Idiomas > Idioma Predeterminado (Occidental). La corrección automática funcionaba bien en los documentos nuevos, sin embargo algunos documentos traídos por los usuarios no eran verificados por el corrector.

Descubrí que, aparentemente, los carácteres (parrafos ?) también pueden tener secciones con diccionarios por separado.

El problema se solucionó seleccionando todo el documento afectado y eligiendo Formato > Carácter > Idioma = Español (Colombia).

Cambiar las contraseñas del sistema operativo y Samba a través de web

Otro problema que surge al intentar hacer en las empresas lo que mencioné en el post anterior con Samba, es que se manejan dos tipos de contraseñas que deben administrarse por separado: /etc/passwd y /etc/samba/smbpasswd; además su actualización debe hacerse desde la consola, hecho que para los usuarios, incluyendo a la mayoría de personajes de sistemas, es difícil o tedioso. Por eso busqué que software libre me permite actualizar estas contraseñas de manera unificada, simple y desde web.

Extrañamente sólo encontré una solución: ChangePassword alojada en http://changepassword.sourceforge.net/.

ChangePassword permite actualizar las contraseñas de Linux, Samba y Squid (en la Fundación no se utiliza) a través de una interfaz web generada por un CGI.

Su instalación es muy simple.

1. Descargue y descomprima el archivo changepassword-xx.tar.gz. En este momento la versión actual es la 0,9.

2. Edite el archivo conf.h con la información relacionada con la presentación: color de fondo, tipo de fuente, etc.

3. Ejecute el comando configure especificando la información de idioma, el logo, la ubicación del directorio de CGIs, la ubicación del archivo smbpasswd y del archivo de contraseñas de Squid.

./configure –enable-cgidir=/srv/www/cgi-bin
–enable-language=Spanish
–enable-smbpasswd=/etc/samba/smbpasswd
–disable-squidpasswd
–enable-logo=imagenes/logo_fdq.png

La ubicación del logo se referencia desde la raíz del sitio web.

El idioma se toma según los archivos contenidos en el directorio /languages de la distribución.

Después se dan los consabidos make y make install.

El archivo que se debe consultar para actualizar las contraseñas se ubica en:

http://SERVIDOR/cgi-bin/changepassword.cgi

Actualmente estoy recibiendo el mensaje: “No pude renombrar el archivo de contraseñas temporal.” (“Could not rename the temporary password file“), del cual no he podido encontrar su solución 🙁 Le escribí un mensaje al desarrollador a ver si me ayuda con su significado.

La dirección de correo electrónico del desarro

Controlando la máscara con Samba 3

Samba es uno de mis servicios preferidos en *NIX. Sirve para casi todo 😉

Hoy instalé y configuré en 10 minutos el servicio DHCP en el servidor UNO de la Fundación, para probar los equipos con direccionamiento dinámico ya que hasta ahora lo han manejado estático, configurando equipo por equipo. Esto porque dicen, lo cual es extrañamente muy cierto, que la red de Windows algunas veces no responde por nombre y por ello requieren conocer la IP específica de los equipos para poder acceder a los recursos compartidos.

El experimento es pasar las máquinas a direcciones dinámicas (con DHCP) y dentro de sus parámetros se especifica al servidor UNO como servidor de WINS, el cual es provisto por Samba.

Otro servicio que intento que los usuarios de Sistemas utilicen es el acceder a sus directorios HOME para que almacenen allí archivos importantes, incluyendo al directorio public_html donde puedan publicar documentos directamente en la web. En especial, que lo utilicen para el desarrollo de los proyectos y no utilicen versiones desactualizadas en sus equipos o sin los parámetros necesarios, como pasó hace poco, con el register_globals en on :-s.

Activar el servicio de WINS es muy sencillo:

wins support = yes

Con esto me surgió un pequeño problema, los archivos y directorios creados por los usuarios a través de las carpetas compartidas no quedaban con los permisos apropiados para poder ser consultados a través de web.

Una búsqueda rápida en la documentación de Samba me ayudó a encontrar las siguientes líneas que añadidas a la sección global del archivo /etc/samba/smb.conf asignan los permisos apropiados (al menos para mi caso).

force create mode = 0755
force directory mode = 0755

Mas información acerca de las opciones de control de acceso a los archivos, directorios y recursos compartidos se pueden consultar en en capítulo 16 del HOWTO oficial.

Actualizando MediaWiki 1.9

Después de actualizar a la última versión de MediaWiki utilizando OneClickInstalls de DH encontré que el sitio no estaba funcionando correctamente porque había incongruencias con la base de datos.

Para solucionarlas seguí los siguientes pasos.

$ cp AdminSettings.sample AdminSettings.php

$ vi AdminSettings.php

$wgDBadminuser = ‘wikiadmin’; // Nombre de usuario de la BD
$wgDBadminpassword = ‘adminpass’; // Contraseña de la BD

$ cd maintenance

$ /usr/local/php5/bin/php update.php

$ /usr/local/php5/bin/php refreshLinks.php

$ rm ../AdminSettings.php

La documentación relacionada a la actualización de MW se encuentra en la Wiki de DH.