no cachear en squid

31 de julio de 2008

Un problema que puede haber con los proxys como Squid es que puede ser que algunas paginas Web no se vean correctamente porque Squid las cachea y no las refresca. Para solucionarlo posteo como decirle a Squid que no cachee ciertas paginas Web.

Para ello lo que haremos es crear un archivo de texto como "/etc/squid/no_cachear.conf" y colocar dentro los dominios que no queremos cachear.

.miempresa.com
.intranet.mibanco.com
Es muy importante no olvidar el punto "." que se encuentra al principio de la definición del dominio.

Ahora tenemos que modificar el squid.conf con lo siguientes parámetros:
acl no_cachear dstdomain "/etc/squid/no_cachear.conf"
no_cache deny no_cachear
always_direct allow no_cachear
Hay otros ejemplos de ACLs como por ejemplo no cachear URLs que contengan la cadena cgi-bin:
acl no_cachear urlpath_regex cgi-bin \?
no_cache deny no_cachear
Las pruebas las he hecho con Squid 2.6.

cisco netflow + netflow dump for linux

29 de julio de 2008

El Netflow es un protocolo propietario de Cisco para recoger información sobre el tráfico que atraviesa una interfaz red y posteriormente analizarlo para saber por ejemplo quien esta tirando de la red, hacia donde van los paquetes web, quien se conecta por ftp, etc.

Para que todo esto funcione necesitamos varias cosas. Primero tenemos que configurar nuestro router Cisco para que la interfaz envíe los registros de estadísticas a un colector de Netflow. Estos paquetes de estadísticas son paquetes UDP. Luego tenemos que configurar el recolector de Netflow y por ultimo tenemos que utilizar un analizador de Netflow (que puede estar en el mismo recolector) para sacar las estadísticas.

Cisco proporciona el protocolo de Netflow en sus routers Cisco, pero no proporciona ningún software para recolectar y analizar estas estadísticas.
Aquí tenéis una lista de analizadores de Netflow. Para hacer este post utilizaremos el nfdump para Linux. Se trata de un analizador libre de Sourceforge. El software de nfdump tiene dos utilidades básicas. Una es nfcapd que es el recolector de paquetes Netflow el cual esta constantemente escuchando en un puerto la llegada de paquetes UDP. Luego tenemos nfdump que analiza los paquetes que han ido recopilando el daemon de nfcapd.

Empezamos pues. Lo primero que haremos es configurar la interfaz de red del router de la cual quiero analizar los paquetes:

# conf term
(config)# interface ethernet 0
(config-if)# ip route-cache flow
Para detener el Netflow basta con denegar el comando con "no ip route-cache flow".

Ahora le tenemos que decir al router dónde tiene que enviar los paquetes del Netflow:
(config)# ip flow-export version 5 origin-as
(config)# ip flow-export destination 192.168.1.101 4444
En 192.168.1.101 está nuestro servidor de Linux donde instalaremos el recolector y el analizador. El 4444 es el puerto UDP donde escucharemos paquetes de Netflow. Tenemos que tener en cuenta que si hay un firewall entre nuestro router y nuestro recolector tendremos que abrir el puerto UDP 4444 para dejar pasar este tráfico.
Para asegurarnos que el router está bien configurado podemos utilizar los comandos "show ip flow export" para ver la configuración actual del Netflow o "show ip cache flow" para ver los paquetes que el Netflow tiene para enviar al recolector.

El siguiente paso es instalar el recolector en nuestra maquina Linux. Bajaremos nfdump-snapshot-20070808.tar.gz y lo instalaremos.
# tar -xzvf nfdump-snapshot-20070808.tar.gz
# cd nfdump-snapshot-20070808
# ./configure
# make
# make install
Una vez compilado he instalado, lanzamos el recolector en modo debug escuchando en el puerto 4444 (lo normal sería lanzar este comando en background):
# nfcapd -w -p 4444 -E
El parámetro -w le dice que cada cinco minutos rote los archivos de log que se encuentran en /var/tmp y que seran necesarios para el analizador. El parámetro -E indica al recolector que funcione en modo debug. Antes de lanzar el analizador tenemos que dejar el daemon del nfcapd funcionando un rato para que vaya recopilando información. Una vez tengamos unos cuantos archivos de log en /var/tmp ya podemos lanzar el analizador con el comando nfdump.

El analizador tiene muchas opciones (nfdump --help) pero la llamada básica es la siguiente:
# nfdump -R /var/tmp -o extended -s srcip -s ip/flows -s dstport/pps/packets/bytes -s record/bytes
Con el parámetro -R le decimos donde se encuentra los archivos de log que está recopilando el recolector de Netflow. Con el parámetro -o le decimos que muestre los listados con la mayor información posible. Con el parámetro -s le indicamos el tipo de listados estadísticos que queremos. Por ejemplo si lanzamos el analizador de esta forma:
# nfdump -R /var/tmp -o extended -s dstport/packets/bytes
Lo que obtenemos es un top 10 de las puertos de destino (dstport) con más tráfico ordenados por paquetes (packets) y bytes.

Otro parámetro interesante es el -t, el cual nos permite analizar todos los archivos de log pero en una franja de tiempo concreta.
Por ejemplo si queremos ver el trafico a partir de las 19:30 haremos:
# nfdump -R /var/tmp -o extended -s srcip -s ip/flows -s dstport/pps/packets/bytes -s record/bytes -t 2008/07/29.19:30:00
También es interesante el uso de filtros. Para especificar filtros dentro de nfdump utilizamos las comillas dobles. Podemos utitilizar filtros para delimitar las estadísticas a unas IPs en concreto, a un puerto o a una duración de una conexión.
Veamos unos ejemplos de filtros.
# nfdump -R /var/tmp -o extended -s srcip -s ip/flows -s dstport/pps/packets/bytes -s record/bytes "tcp and (dst ip 80.80.80.80)"
Este filtro lo que hace es mostrar solo las estadísticas para las conexiones TCP donde la IP de destino sea 80.80.80.80.
# nfdump -R /var/tmp -o extended -s dstip/bytes "dst port 25"
Este filtro lo que hace es mostrar solo las estadísticas para las conexiones a servidores de correo (puerto 25).
# nfdump -R /var/tmp -o extended -s dstip/bytes "duration > 3000"
Este filtro lo que hace es mostrar solo las estadísticas para las conexiones salientes que han durado más de 3000 milisegundos.

Aquí teneis una post interesante de como detectar actividades "anormales" con netflow:

Detecting Worms and Abnormal Activities with NetFlow, Part 1
Detecting Worms and Abnormal Activities with NetFlow, Part 2


Más información:
+ http://nfdump.sourceforge.net/
+ http://manageengine.adventnet.com/products/netflow/help/cisco-netflow/cisco-ios-netflow.html
+ http://en.wikipedia.org/wiki/Netflow
+ http://www.cisco.com/en/US/products/ps6601/products_ios_protocol_group_home.html

se nos colo UPS

24 de julio de 2008

Tenemos 4 antivirus diferentes en la empresa y ninguno nos detectó el virus de UPS. La primera notificación que tengo es de las 16:15h (23.07.2008) que me llama una persona que le ha llegado un adjunto con un ejecutable (dentro de un Zip) y que no hace nada. Madre mia, ya la hemos liado. Ni el ClamAv+BitDefender+AVG que están en mi servidor de correo Zimbra ni el propio Kaspersky han detectado el posible virus.

A las 16:26 mando el archivo comprimido a VirusTotal y de los 35 antivirus solo 8 reconocían un virus. Naturalmente ninguno de ellos era uno de los mios. Pero me alegré porque uno de los que lo detectaba era NOD32 (lo reconoce como Win32/Spy.Agent.NHS) el cual lo tenemos en pruebas porque estamos pensado cambiar los Kaspersky por NOD32. Estamos fastidiados... lo único que podía hacer es monitorizar la entrada de algún mail de UPS y esperar. Suerte que eran las 5 de la tarde y había poca gente trabajando.

A las 16:58 mando otra vez el virus a VirusTotal y ya son 11 de los 35... al menos el Kaspersky ya lo reconoce, pero mi servidor de correo aun no. Hasta las 17:45 solo uno de los tres antivirus del correo lo reconoce. El primero en ponerse las pilas fue el AVG. Ya tenemos un antivirus en el servidor de correo que lo reconoce !!!... nos quedan el ClamAv y el Bitdefender.

Esta mañana (24.03.2008) ya reconocían todos los antivirus el problema... eso sí la primera maquina que recivió el mail quedó infectada.

la telenovela de Kaminsky

23 de julio de 2008

Que follón con el bug del DNS de Kaminsky. Recapitulamos a ver si me entero:

1) A principios de enero Kaminsky descubrió un mega bug que echaría por tierra todo Internet y como es un profesional decidió reunirse en secreto con los dioses (Cert, Cisco, Microsoft, 3Com, IBM, HP, Avaya....) para reparar el problema.

2) Meses después, exactamente el 8 de julio quedan todos en un bar y dicen... ahora liberamos el parche. Tuvo que ser el día8 porque Microsoft es dios de dioses y era el segundo martes de cada mes... esta claro ¿no?.

3) Corren ríos de bits y mails, foros, blogs, etc explicando o intentando descubrir cual era el problema.

4) Kaminsky dice que dará un mes de plazo antes de explicar los detalles del problema en el BlackHat para dar explicaciones. Para quien no lo sepa el BlackHat es una concentración de gente mala que se reunen en las Vegas con su portátil para jugar a las cartas mientras otro habla.

5) Ahora empieza lo bueno. De todas las personas que hablaron y dieron su hipótesis alguien llamado Halvar Flake (que dicen que su nombre real es Thomas Dullien presidente de Zynamics) dijo la suya sin saber ningún detalle técnico del bug de Kaminsky. Poco después el propio Kaminsky dijo en Twitter (una fantástica utilidad que aun estoy por encontrar el sentido) que esta persona iba bien encaminada... pero que aun así no informara demasiado.

6) El lunes pasado en el blog de Thomas Ptacek (director de la empresa Matasano) se publica con pelos y señales un post firmado por ecopeland (que se supone que es un trabajador de Matasano) explicando los detalles del bug. Horas después este post es borrado y el director de Matasano pide disculpas. Pide disculpas porque resulta que este director era uno de los que conocía los detalles del bug... y aparentemente en una noche loca se fue de la lengua. Ahora resulta que hay un tal Erin Copeland que trabaja en Matasano y que seguramente es el acompañante de copas de Thomas Ptacek.

Bien como el post a desaparecido pero Internet no olvida aquí está el post.

ya empiezan las quejas

Cambias algo de la informática de la empresa y ya está todo el mundo quejándose. Hemos cambiado una fotocopiadora Canon vieja que se estropeaba cada dos por tres ( ya teníamos la tienda de campaña para cada vez que venia el técnico Canon) y ponemos una pedazo de impresora+escanner+fax+pdf+que_te_lo_hace_todo y ya esta la gente quejándose de que eso es muy difícil y que la otra iba mejor... vamos que es para coger a la persona y fotocopiarla.

Lo mejor es no decir nada. Quitar, poner, montar y desmontar sin decir nada ya que al final no pueden estar todos contentos todos. Intento convencer a mi jefe que al final es lo mejor. Si somos los responsable de las impresoras, la telefonía, la red, los ordenadores, la maquina de fichar, los portátiles, los proyectores, las tarjetas de vodafone... pues nosotros sabremos lo que se necesita ¿no?.

Visita obligada a La vida del informático y La culpa es siempre del informatico (en especial el sexto comentario personal).

canon + ldap zimbra

22 de julio de 2008

Nos acaba de llegar una impresora láser Canon 2270 de esas que puedes escanear en PDF y dejar el resultado del PDF en una carpeta de Windows compartida o enviar el PDF por correo. Como tenemos Zimbra y la impresora trae un cliente de LDAP hemos decido que la impresora ataque al LDAP de Zimbra para que en la impresora salga la libreta de direcciones de todas las personas de la empresa y no tengas que teclear toda la dirección de correo.

Lo primero que hay que hacer es configurar correctamente el TCP/IP de la impresora. Sobre todo el DNS y la puerta de enlace si tu servidor de Zimbra no esta en la misma LAN como es mi caso. Otra cosa que hay que hacer es abrir el puerto TCP 389 tanto en el firewall de Zimbra (o firewall intermedios) para dejar pasar las peticiones LDAP de la impresora.

El siguiente paso es decirle a la impresora donde está el servidor SMTP para que pueda enviar correo. En mi caso le diré que para enviar correo utilice mi Zimbra:


Luego tendremos que dar de alta el LDAP de Zimbra. Para ello le decimos la direccion IP del servidor de Zimbra donde está nuestro LDAP y le decimos también la cadena de busqueda que será "ou=people,dc=mizimbra,dc=com".


Si hay algun problema con la conexión lo mejor es probar si desde una maquina con Windows y un cliente de LDAP se puede acceder a la información LDAP del Zimbra. Yo utilizo este LDAP Browser para hacer las pruebas y ver la estructura interna del LDAP.

En la Wiki de Zimbra hay más información sobre LDAP.

un regalo

21 de julio de 2008

No hay nada más agradable para un administrador que te regalen para el departamento 3 Netfinity (dos 5000 y un 5100). Son un poco viejos pero para guarrearlos y hacerle trastadas (con un Linux) ya nos sirven. Además vienen con su controladora de RAID y sus DAT para hacer backups.

zmbigmsg

17 de julio de 2008

zmbigmsg es un script en bash para buscar mensajes grandes dentro del almacén de mensajes de Zimbra. Mi objetivo es buscar los mensajes que superan por ejemplo 50Mb o 100Mb. Por cada mensaje encontrado muestra la ruta del archivo físico del mensaje y quien lo envía y lo recibe.

Es importante saber que para borrar este mensaje no hay que eliminarlo físicamente sino que hay que entrar en el buzón del usuario y borrarlo desde allí, de lo contrario se crearían inconsistencias dentro del base de datos ya que existirian mensajes no asociados a un mensaje físico dentro del store.

Una vez eliminado el mensaje del buzón de la persona es posible que si volvemos a lanzar zmbigmsg el mensaje físico aun exista.
Esto es debido a que Zimbra no borra físicamente el mensaje sino que lo marca para borrar. Quien realmente borra el mensaje físico es un proceso llamado zmpurgemessage que esta en el cron de la maquina y que se lanza cada hora.

Recomiendo leer un post anterior que explica más detalladamente como están implementados los buzones y los archivos físicos de los correos.

zmbigmsg v0.1b


ubicación de los mensajes en zimbra

16 de julio de 2008

Para saber donde están ubicados físicamente los mensajes de un usuario de Zimbra tenemos que consultar el mysql de Zimbra.

Nos conectamos al mysql y miramos que esquemas tenemos y luego miramos la lista de buzones:

# su - zimbra
# mysql
mysql> show databases;
mysql> select comment, group_id from zimbra.mailbox order by comment
+--------------------------------+----------+
 comment                     group_id 
+--------------------------------+----------+
 xxxxx@yyyyyy.com                 1 
 zzzz@yyyyyyy.com                  4 

X rows in set (0.00 sec)
El el campo group_id tenemos el ID del grupo de mailboxes al que pertenece el usuario. Por tanto si pertenece al group_id=4 querrá decir que habrá un esquema dentro del mysql que se llamará mboxgroup4.

mysql> use mboxgroup4;
mysql> show tables;
Dado que sólo podemos tener 100 grupos de mailboxes (segun la wiki de zimbra) si nos dá que group_id=1023 entonces el ID del grupo de mailbox será 1024 mod 100 = 24. Debe existir el esquema mboxgroup24.

El ID del grupo de mailbox también se puede conseguir con el comando zmprov.

# zmprov getMailboxInfo miusuario@midominio.com
mailboxId: 1023
quotaUsed: 651627
Veamos ahora un listado de todos los mails que hay dentro del grupo mailbox 4. Si tenemos más de 100 usuarios puede ser que dentro de este grupo de mailbox haya correo de varias cuentas. En la tabla mail_items tenemos los mails y tambien tenemos los contactos de la libreta de direcciones. Aun no sé como distingue lo que es un mail de una contacto en la libreta de direcciones.

mysql> select * from mboxgroup4.mail_item where id>26000 and mailbox_id=4 \G
*************************** 1. row ***************************
mailbox_id: 4
id: 26001
type: 5
parent_id: NULL
folder_id: 2
index_id: 26001
imap_id: 26001
date: 1182380903
size: 95842
volume_id: 1
blob_digest: rbrw+fj0tvyvTPt2haxssued7,A=
unread: 1
flags: 2
tags: 0
sender: miusuario@midominio.com
subject: Un mensaje
name: NULL
metadata: d1:f147:This message...1:p8:Re: SF: 1:s21:miurusio@midominio.com1:vi10e
mod_metadata: 30102
change_date: 1182380905
mod_content: 30102

1 row in set (0.00 sec)
El campo volume_id=1 indica la carpeta donde estan almacenados todos los grupos de mailbox. Normalmente será /opt/zimbra/store. Veamos si esto es cierto:
mysql> select id, name, path from zimbra.volume;
+----+----------+-------------------+
 id   name       path              
+----+----------+-------------------+
  1  message1  /opt/zimbra/store 
  2  index1     /opt/zimbra/index 
+----+----------+-------------------+
2 rows in set (0.00 sec)
Luego tenemos que el mailbox_id=4 y el id=26001. Ahora según Zimbra tenemos que hacer una operació a nivel de bits y mover 12bits:

# perl -e 'print 4 >> 12 ; print "\n"'
0
# perl -e 'print 26001 >> 12 ; print "\n"'
6
Nos da como resultado 0 y 6.

Portanto el mensaje que buscamos está en:

<path del store> / <mailbox_id >> 12> / <mailbox_id> /msg/ <id >>12> / id-<?>.msg
es decir
/opt/zimbra/store/0/4/msg/6/26001-30102.msg

ajax: xajax y acceso a mysql (parte 3 y última)

13 de julio de 2008

Vamos a ver como integrar ahora xajax con el acceso a base de datos mysql. Supongamos que tenemos una bbdd con una tabla clientes y otra tabla de productos que han comprado esos clientes.
Diseñamos un formulario que nos permita buscar el nombre/apellido de un cliente y mostramos en la misma pagina todos los clientes. Una vez tengamos un listado de esos clientes, en la misma página podemos hacer click sobre un cliente y mostrar los productos que ha comprado. Todo esto de forma dinámica y sin refrescar la pagina.

La pagina principal tendrá este aspecto.

   <input type="text" name="buscar" id="buscar" value=""> 
   <input type="button" value="Buscar" onclick="
   xajax_buscar_cliente(document.getElementById('buscar').value)">
   <div id="clientes"></div>   
   <div id="productos"></div>
Lo primero que tenemos es un formulario con un input para introducir el nombre del cliente que queremos buscar y luego un botón que nos llamará a la función buscar_cliente que nos buscará y nos devolverá el resultado de la busqueda dentro de "<div id="clientes"></div>".
También tenemos un "<div id="productos"></div>" que nos montrará los productos que ha comprado el cliente que seleccionemos. Las dos últimas etiquetas son importantes porque xajax las utilizará para devolver el resultado que nosotros queramos dentro. Este resultado puede ser un simple número o todo un código HTML como una tabla.

Veamos ahora como esta definida la función buscar_cliente:
function buscar_cliente($buscar) {
   $con = conectar();
   mysql_select_db("test", $con);
   $sql = "select * from clientes where cliente like '%". $buscar ."%'";
   $result = mysql_query($sql,$con);
   
   $txt = "";
   while($row = mysql_fetch_array($result))
      $txt = $txt . "<a href='#' onclick='javascript:xajax_buscar_productos(".$row["id"].");' >" . $row["cliente"] . "</a><br>";
   
   mysql_close($con);
   
   $objResponse = new xajaxResponse();
   $objResponse->Assign("clientes","innerHTML",$txt);
   
   return $objResponse;
}
Lo que hace esta función es recibir un parámetro con el nombre que queremos buscar y buscarlo directamente con una select dentro del mysql.
Una vez tengo los resultados monto un $txt con las lineas de los resultados. Esta linea puede ser tan complicada como uno quiera. En mi caso es el nombre del cliente y un salto de linea.
Finalmente envio el resultado y le digo a xajax que el resultado lo meta dentro (innerHTML) de la etiqueta "clientes".

Al pulsar sobre el nombre del cliente llamaremos a la función buscar_productos, a la que le paso como parámetro el identificador del cliente del cual quiero saber que productos ha comprado.

Veamos esta función:
function buscar_productos($cliente) {
   $con = conectar();
   mysql_select_db("test", $con);
   $sql = "select * from productos where id_cliente=".$cliente;
   $result = mysql_query($sql,$con);
   
   $txt = "";   
   while($row = mysql_fetch_array($result))
      $txt = $txt . $row["producto"] . "<br>";
   
   mysql_close($con);

   $objResponse = new xajaxResponse();
   $objResponse->Assign("productos","innerHTML",$txt);
   
   return $objResponse;  
}
En esta función hacemos una select de los productos y directamnete como en caso anterior meto los resultados dentro de la etiqueta "productos".

parte3.zip (archivos fuente)

md5 and sha1 databases/reverses

11 de julio de 2008

Mucho buscar aquí pero nunca encuentras el hash que necesitas :(... al final siempre queda rainbow.

Para md5:

+ http://gdataonline.com/ (para mi la mejor)

Para Sha1:



/sbin/nologin vs. /bin/false

9 de julio de 2008

Siempre había leído que si quieres una cuenta de usuario en Linux que no tenga acceso a shell puedes poner /sbin/nologin o /bin/false, indiferentemente. Aunque esto es cierto hay pequeñas diferencias que he descubierto hoy mientras montaba un vsftpd para un servidor interno a mi LAN.

El más restrictivo es el /bin/false ya que cierra cualquier entrada por consola, ssh y ftp. En cambio /sbin/nologin evita la entrada por consola y ssh, pero no por ftp en el caso que este cuanta tenga acceso por ftp. Además /sbin/nologin muestra el mensaje "This account is currently not available" a diferencia de /bin/false que no muestra absolutamente nada. Este mensaje se puede configurar creando el archivo de texto /etc/nologin.txt.

ajax: instalación de xajax y ejemplo (parte 2)

7 de julio de 2008

Para utilizar xajax nos bajaremos la versión estable que encontremos pero como aun no he probado la versión 0.5 (que está en beta) aprovecharé para probarla con este post. Bajaré xajax_0.5_beta_4b_Full.zip y descomprimiremos en nuestro servidor dentro de una carpeta temporal.
Una vista rápida al Zip y veremos que con la versión full tenemos toda la documentación de xajax dentro de /documentation y un montón de ejemplos dentro de /examples y /tests.

Las carpetas que realmente necesitaremos serán /xajax_core y /xajax_js. Copiaremos estas dos carpetas dentro de nuestro sitio web. Para crear paginas web en PHP y que utilicen Ajax necesitamos seguir una metodología cuando creemos nuestras paginas webs. El objetivo de xajas es crear funciones escritas en PHP (que realizan cualquier tipo de operación) y hacerlas disponibles en Ajax para poder utilizarlas desde cualquier página HTML.

Veamos pues como utilizamos xajax para crear el mismo ejemplo que creamos en la parte 1.

Lo primero que haremos es crear nuestra función PHP (que se ejecuta en el servidor) la cual le pasamos dos números y los suma. Crearemos el archivo misfunciones.server.php y pondremos este código:

<?php
function suma($a, $b) {
   $objResponse = new xajaxResponse();
   $objResponse->assign("resultado", "value", $a+$b);
   return $objResponse;
}
require("misfunciones.common.php");
$xajax->processRequest();
?>
Creamos la función, creamos un objeto de respuesta, asignamos la suma a una variable llamada resultado y devolvemos la respuesta al cliente.

Ahora crearemos otro archivo PHP llamado misfunciones.common.php donde definiremos que funciones de nuestro PHP queremos hacer publicas en Ajax:

<?php
require_once ("xajax_core/xajax.inc.php");
$xajax = new xajax("misfunciones.server.php");
$xajax->registerFunction("suma");
?>
De todas las funciones que hay dentro de misfunciones.server.php solo queremos hacer publica la función suma().

Ahora lo más divertido. Crearemos nuestro formulario llamado parte2.php donde pediremos dos números (el "a" y el "b") y llamaremos a nuestra función de Ajax para que los sume y nos devuelva el resultado.

<?php
require("misfunciones.common.php");
?>
<html>
<head>
   <?php $xajax->printJavascript('/'); ?> 
</head> 
<body> 
   <input type="text" name="a" id="a" value="0"> + <input type="text" name="b" id="b" value="0"> = 
   <input type="text" name="resultado" value="" size="3" /> 
   <input type="button" value="Calcular" onclick="xajax_suma(document.getElementById('a').value,
   document.getElementById('b').value)">
</body> 
</html>
Lo más importante es la función xajax_suma. Todas las funciones que definamos y publiquemos tendrán el prefijo "xajax_". Es interesante ver el codigo fuente del cliente de parte2.php y ver en que se convierte el "$xajax->printJavascript('/');". Es toda la lógica necesaria en JavaScript para poder hacer las llamadas a las funciones PHP.
parte2.zip (archivos fuente)

ajax: lo fácil que es y lo poco que se (parte 1)

6 de julio de 2008

Hace ya más de un año que tuve que crear mi primera web en Ajax. Una intranet que se comunicaba con SAP y sacaba listados de ventas, clientes, etc.
La verdad es que cuando oí hablar de Ajax pensé: joder otro lenguaje por aprender que seguro no aportará nada nuevo. Que equivocado que estaba en todo. De vez en cuando un administrador tiene que programar algo... desde un simple script hasta una intranet. Creo que un administrador no es realmente un administrador si no sabe programar.

La mejor manera de definir Ajax es decir lo que no es: no es un lenguaje, no es una aplicación para diseñar y programar webs, no es un componente ni algo que necesites descargar e instalar. Ajax no es nada de eso. Ajax ya está en tú navegador.

Ajax reune un conjunto de tecnologías existentes desde hace tiempo (XHTML, CSS, DOM, XML) y una lógica de aplicación escrita en JavaScript y que se ejecuta en un cliente.

El objetivo de Ajax es minimizar la cantidad de información que se envía del cliente al servidor y por tanto el número de refrescos que se producen en una pagina.

Todos hemos visto GMail. Puedes ir moviendote por todos los menús y opciones y la página web no se refresca nunca. Ajax esta continuamente funcionando por debajo y haciendo "mini" peticiones. Con Ajax obtienes mini porciones de datos y no páginas web completas.

El pilar de Ajax es simplemente un objeto. El objeto XMLHttpRequest.

Lo más fácil es siempre poner un ejemplo. Vamos a crear una página con un formulario para sumar dos números. Pondremos también un botón para sumar estos dos números. Con JavaScript es fácil sumar dos numero en HTML, pero lo que quiero es que estos dos números me los sume una aplicación externa, es decir otra página web (ya sea otra pagina en JavaScript, PHP, ASP, Perl...).

Veamos como sería el código:

<script>
function calcula(){
    var http;
    http = new XMLHttpRequest();
    http.open("GET", "suma.php?a="+document.forms[0].a.value+"&b="+document.forms[0].b.value, true);
    http.onreadystatechange = function() {
        if (http.readyState == 4) {
            var response = http.responseText;
            document.forms[0].resultado.value = response;
        }
    }
    http.send(null);
}
</script>

<form>
<input value="0" name="a"> + <input value="0" name="b"> = <input value="???" name="resultado">
<input onclick="calcula()" type="button" value="Calcula">
</form>
Creo que está claro. Miramos primero los inputs. Tenemos dos inputs (el "a" y el "b") donde nosotros escribiremos dos números. Luego tenemos el input "resultado" donde dejaremos la solución una vez calculada. Por último tenemos un botón que ejecuta la función en JavaScript, calcula().

Dentro de la función lo primero que hacemos es crear una instancia del objeto XMLHttpRequest. Luego le decimos cual es el programa que queremos ejecutar en fondo y que nos evitará tener que refrescar el navegador para obtener el resultado. En este caso ejecutaremos el programa suma.php al que le pasamos dos parámetros (el valor de a y el de b). Luego definimos una función que se ejecutará una vez cambie el estado (onreadystatechange). El estado cambiará cuando suma.php ya tenga calculado el resultado. Por ultimo hacemos un send para realizar la petición. El send esperará hasta que el evento onreadystatechage así lo decida.

Si escribimos este ejemplo veremos como realizamos peticiones web en fondo y en ningún momento se refresca el navegador.

Imagínate ahora que tienes un formulario donde escribes un código de cliente y automáticamente y sin refrescar la pagina te aparece un listado con todas las compras que ha realizado y todos los datos personales del cliente. Todo esto sin refrescar y por tanto dando la apariencia que no se esta haciendo nada... que los datos aparecen por arte de magia... Ajax es hacer magia. Si no crees que es mágia mirate backbase, YUI, dojo, rico, etc.

En el próximo post (parte 2) explicaré como utilizar xajax. Unas librerías para PHP que nos ayudan y simplifican en la programación en Ajax.

parte1.zip (archivos fuente)


asterisk and good applications

3 de julio de 2008

El tema del Astetisk se nos resiste... no terminamos de arrancar. No por problemas técnicos sino más bien por problemas con las mentes pensantes.

Mientras tanto me van llegando cosas al correo sobre Asterisk. A principio de mes llegó a Bilbao el creador de Asterisk y entre todas las cosas que dijo, contó una seria de aplicaciones graciosas para Asterisk... vamos de esas que le dices a Cisco que te las monte y te dice... "pero chaval tú donde vas !!!".

+ El "botaniccalls". Si tus plantas necesitan agua, estas te harán un llamada por teléfono.



+ El "popularity dialer". Si nadie te llama o estas reunido puedes programar una llamada con un conversión grabada para que te te llame a una hora concreta.



+ Las "queue games". En vez de un robot de espera con música te saldrá un robot con preguntas tipo trivial. Si aciertas la pregunta subirás en la cola y tu llamada será atendida antes que la otra.

chequear tablas mysql de zimbra

1 de julio de 2008

Ayer me fui de la oficina con un error en una tabla de MySql en Zimbra. Me decía que estaba corrupta. Como el error era en una tabla de log y el correo funcionaba perfectamente lo deje estar y aproveche antes de irme a dormir a repasarme los comandos de MySql para chequear y reparar las tablas.

Cuando he llegado esta mañana y he pasado los check a las tablas tenía más de una tabla que estaba corrupta. Así que lo primero que he hecho es programarme un script para ejecutarlo cada dia y me diera un estado de todas las tablas de MySql.