viernes, 30 de enero de 2009

Configurando cliente de correo Mutt para el envío de notificaciones batch

Mi Linux no cuenta son servicios de correos activados, pero sí tengo acceso a la LAN de la empresa, en la cuál existe un servidor exchange.

Para que el cliente de correo mutt envíe los correos de salida a este servidor, me bastó con crear un archivo en el home de mi usuario, con el nombre .muttrc y la siguiente línea:

set smtp_url="smtp://mi_smtp_server.mi_dominio:mi_puerto_smtp"

Con esto fué suficiente, ahora soy feliz y puedo enviar correos desde mis shell scripts, con la siguiente sintaxis:

mutt -x -s "Mi subject" mi_correo@mi_dominio <<!
Mi contenido del mensaje
.
!

Muy interesante, no?

martes, 6 de enero de 2009

Apache + CGI + ANSI/C

Por un lado, hice el siguiente cambio en el archivo /etc/httpd/conf/httpd.conf


1.- Descomenté la línea:

AddHandler cgi-script .cgi


2.- Luego cambié este bloque...

<Directory "/var/www/cgi-bin">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>

...por este otro...

<Directory "/var/www/cgi-bin">
AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all
</Directory>


3.- Por último, reinicié el apache.

4.- Construí el programa CGI en base al siguiente fuente:

ejemplo.c (/var/www/cgi-bin/ejemplo.cgi):

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <string.h>
int main(void) {
size_t qChr;
char *sStr;
qChr=strlen(getenv("QUERY_STRING"));
printf("Content-type: text/html\n\n");
printf("<html>\n");
printf("<body bgcolor=black text=lightgreen>\n");
sStr=(char*)malloc((qChr+1)*sizeof(char));
if(!sStr) {
printf("Error\n");
}
else {
memset((void*)sStr, (int)NULL, (qChr+1)*sizeof(char));
strcpy(sStr, getenv("QUERY_STRING"));
printf("%s\n", sStr);
}
printf("</body>\n");
printf("</html>\n");
return(0);
}

5.- Escribí el formulario HTML que invoca al programa CGI con el método GET:

/var/www/html/index.html:

<html>
<form action="
http://miweb/cgi-bin/ejemplo.cgi" method="GET"> Director: <input type="text" name="dir"> <br>
Producer: <input type="text" name="prod">
<input type="submit" value="Fire">
</form>
</html>

6.- La alternativa al método GET es el método POST, en el documento HTML sólo cambié el GET por el POST. Principalmente, lo que cambia son dos cosas: los pares campo valor, no son mostrados en la barra de direcciones, y en el servidor dichos valores son recibidos por el proceso a través de la entrada estandar (stdin) en lugar de la variable de ambiente QUERY_STRING. El fuente C queda de la siguiente forma:

int main(void) {
char sBuff[1000];
memset((void*)sBuff, (int)NULL, sizeof(sBuff));
printf("Content-type: text/html\n\n");
printf("<html>\n");
printf("<body bgcolor=black text=lightgreen>\n");
fgets(sBuff, sizeof(sBuff)/sizeof(char), stdin);
printf("%s\n", sBuff); printf("</body>\n");
printf("</html>\n");
return(0);
}


Esto fué un pequeño apunte de mi prueba. Una forma de probar mi programa CGI fué, conectándome con telnet al puerto http (80) de mi servidor, y pasarle el siguiente texto a ciegas:

GET /cgi-bin/ejemplo.cgi?dir=123&prod=456 HTTP/1.1
Host: miweb
User-agent: pepe
<<línea en blanco>>

Donde mi servidor me responde la salida generada por mi programa CGI.

Si el método utilizado es POST, la solicitud debería ser algo parecido a esto:

POST http://miweb/cgi-bin/ejemplo.cgi HTTP/1.0
Host: miweb
Accept: text/html, text/plain, text/css, text/sgml, */*;q=0.01
Accept-Encoding: gzip, bzip2
Accept-Language: en
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Lynx/2.8.6rel.2 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.8g
Referer:
http://miweb/ejemplo.html
Content-type: application/x-www-form-urlencoded
Content-length: 16
dir=123&prod=456
<<línea en blanco>>

"Espero os haya gustado"