martes, 12 de noviembre de 2013

DomainPOP con postfix


Ya había hablado anteriormente sobre la recolección DomainPOP y el cariño que le tienen mis paisanos. Realmente con lineas conmutadas, como nunca descubrimos el ETRN

En vista a que  no tenemos ETRN seguimos arrastrando los pies... veamos como es un DomainPOP con postfix...

Es tan sencillo como crear un dominio virtual y asignarle usuarios reales. Para no volverte loco pon el nombre del usaurio igual que el del dominoio.

Por ejemplo, crea el usuario "subdom". Luego crea el fichero /etc/postfix/virtual y ponle esto:

@subdom.tudomionio.cu   subdom
@otro.tudominio.cu           otro

Ya hemos declarado que subdom y otro, serán usuarios y que todo lo que se envíe a los dominios virtuales @otro.tudominio.cu será almacenado en /var/mail/otro, no olvides postmap /etc/postfix/virtual

Finalmente en el /etc/main.cf pones:

virtual_alias_domains = subdom.tudominio.cu otro.tudominio.cu
virtual_alias_maps = hash:/etc/postfix/virtual

OJO no olvides que en mydestination y debes incluir ambos dominios virtuales.

jueves, 12 de septiembre de 2013

que es sieve y como usarlo


A menudo, en temas de correo, oímos hablar de Sieve, que por cierto, significa "colador". Dícese de sieva a:

         un lenguaje de programación única y
         expresamente para filtrar correo.

Con esos truenos mete miedo al que no quiere o sabe programar, pero noes más que un sistema de filtrado vestido de sintaxis clásica. Sieve tiene muchas implementaciones para ciertos usos específicos, por eso, al buscar en internet encontramos unas guías abstractas que con la explicación y cuarenta quilos, coges el P1. La documentación oficial en la wiki de fastmail.fm aclara que hay que tener una cuenta de fastmail... Entonces salta la interrogante:

-¿y cómo lo pruebo?

Hay sitios web de correo que te permiten implementar filtros de correo usando sieve. Fastmail.fmi (los creadores de sieve) es uno de ellos, también myopera y todos los que le cuelgan a messagingengine.com allá en país de los canguros. Pero aquí en cubita la bella no sería útil para borrar los correos grandes del servidor SIN TENER QUE BAJARLOS :D

Pero como dice el forense: -vamos por partes

En linux existe una implementación, típica de linux como dicen los novatos: "un comando". El intérprete de sieve casi siempre viene en el paquete mailutils. Con eso, podemos botar a fetchmail y a procmail, ya que ese intérprete hace tanto la bajada del correo como su reparto y filtrado.

Los "escripses" de sieve son ficheros con una extensión ".siv"

Digamos que tenemos nuestro escript; queremos alar, bajar y filtrar el correo en un buzón imap:

$ sieve -f imap://fulano:tupassword@servidor/ escript.siv

Si quieres alar de un pop3:

$ sieve -f pop://fulano:tupassword@servidor/ escript.siv

Osea, -f indica la URL hacia el buzón, ya que por defecto el sieve de mailutils, ala los correos en
/var/mail/$USER

Bueno, dentro de escript.siv va todo lo que has visto (o no) en la guías abstractas...

Hablemos de el lenguaje como tal. Para empezar tiene librerías. Como en cualquier lenguaje, dichas librerías cumplen funciones y han de ser inlcuídas o no, a gusto del consumidor. Eso en mi opinión es un cliché pa que parezca un lenguaje y un estorbo a la hora de teclear porque algunas cosas ya están incluidas pero otras no.

La sintaxis básica es esta:

require ["libreriatal","libreriamascual"];
if condición {
   acción;
   acción "parámetro";
   stop;
   }

OJO! hay cosas que terminan en punto y coma; la sentencias pues.

Por ejemplo, digamos que queremos mandar todos los correos cuyo asunto incluya la palabra 'Re:' al buzón "respuestas", para eso usaremos la librería "fileinto" que se dedica a "archivar en" donde le digas. Este
script debería tener una linea para incluir la librería y otro para filtrar. Se verían así:

   require ["fileinto"];
   if header :contains "Subject" "Re:" { fileinto "respuestas"; stop; }

Simple, si el campo Subject: contiene la cadena "Re:", ejecutamos fileinto, a fileinto le mandamos como argumento el nombre del buzón, en este caso 'respuestas' será el nombre del buzón LOCAL donde se
almacenará el correo por último el punto y coma. Después viene la sentencia "stop" que la veremos más adelante.

Ya solo sería ejecutar el intérprete como expliqué arriba. Simplemente varíe el campo que desea machear y el criterio, con eso estará creando filtros a como le acomode.

NO ponga ":" ya que eso seria, por ejemplo el valor "From:" machearía un campo que diga "From::" en el correo y no existe tal cosa.

Podemos también comprar múltiples valores o múltiples campos. Por ejemplo, veamos que nuestra dirección este en To: o Cc:

   if header :contains ["To","Cc"] "tudireccion" {
   fileinto "/home/fulano/mail/personal";
   stop;
   }

No tenemos que poner la dirección entera, pongamos solamente la parte de alante, de todas formas si el "To:" contiene una parte, macheará. Teniendo en cuenta lo "corticas" que son la direcciones cubanas como por ejemplo: salvadorsanchez@cacocum.hlg.sld.cu Mira que hay palabras largas en el idioma finlandés, pero nada como la direcciones de correo del ICRT, que se llevan la pantalla de lado a lado y se desaparecen antes que termines de leerla :D Mira que hay

Pero ÉCHATE ESTO, ponte que no quieras bajar aquellos correos más grande de un mega, podemos borrarlo SIN BAJARLO, mira:

   if size :over 1024K {discard; stop;}

Dícese de un correo cuyo tamaño sea mayor que 1024K ha de ser borrado.

La sentencia discard, borra el correo sin bajarlo, porque los encabezados de imap se bajan sin bajar el correo completo. Recuerde que sieve no solo es un comando de mailutils, está implementado en otro lenguaje, por ejemplo, la sentencia ":envelope" en vez de :contains, se usa para machear el comando MAIL FROM de los servidores SMTP en una implementación que trabaje DENTRO del servidor.

ah! y el stop... Si en vez de usar "stop" usaremos "keep", estaríamos diciendo que siga procesando el correo al siguiente filtro. El stop quiere decir que para ese correo que macheó esa regla, no se le hará más nada. En cambio, keep, seguirá procesando el correo por las demás reglas.

Para los usuarios de procmail:

:0c es keep
:0f es stop

Veamos cosas más locales y "desorbitantes", por ejemplo, digamos que queremos quitar todos los adjuntos del '.exe' de los correos para evitar virus.

if attachment :matches "*.exe*" { discard; stop; }

Usamos la sentencia attachment con el símbolo :matches detrás, osea "si el adjunto machea", luego el argumento "entre comilla" es el macheo, en este caso "*.exe*" note que está entre *asteriscos*, es una expresión regular.

También podemos anidar, para probar varias condiciones. Por ejemplo si un fichero ".zip" es mayor de un mega, que no pase.

if attachment :contains ".zip" {
   if size :over 1024K { discard; stop; }
   }

Como ven: ¡Dentro de los {} metimos otro filtro!

Digamos que el jefe nos dice:

-quiero que todos los correos que vengan del banco, se le envíen
 a "mengana", a "siclano" pero que además, le lleguen al que se lo
 mandaron originalmente
El diablito te dice "MDaemon lo hace facilito" pero tu, un linuxero radical, que usa software libre por convicción (o porque te obligaron a poner Nova) sabes que sieve tiene el power...

Así mismo, como dijo el jefe:

if envelope :contains "From" "banco" {
  redirect "mengana@dominio.cu";
  redirect "fulano@dominio.cu";
  keep;
}

El secreto para que le llegue a quien se lo mandaron originalmente es la palabra clave "keep" osea, "keep walking in your way" sigue tu camino.

miércoles, 4 de septiembre de 2013

procmail en el nilo


Todo el mundo cree que su configuración es casi jeroglífica y están en lo cierto. Ahora les mostraré una traducción romanizada del .procmailrc usado por el faraón Tutancamón. No no no no serio, les explicaré lo poquito que aprendí de procmail cacharreando y comiéndome los man Sin internet. Veremos solamente lo básico para no desbordarle el cerebro.

fetchmail y la mayoría de los MTA entregan a través de procmail. En este ejemplo, pasamos por alto el MTA y le damos el correo a procmail directamente; pero más adelante veremos como operar nuestro propio MTA. Tengamos en cuenta que todo entra por estandar input. Veamos como se las arreglaba Tutancamon para distribuir sus correos en unix.

$ cat .procmailrc

MAILDIR=$HOME/Mail
DEFAULT=/var/mail/$USER
VERBOSE=off

:0
* ^From:.princesa@rio_nilo.eg
jevita

Aquí de configuramos en las tres primeras lineas lo necesario para que funcione en "~/Mail" y la magia empieza en el jeroglifico ":0"

Eso es un numero cero con dos puntos y si ponemos ":0:" le decimos que bloquee el fichero de arribo para por si alguien lo modifica por el camino, osea, evita que dos aplicaciones escriban en el mismo fichero.
Yo no lo uso. Bueno, veamos lo demás:

* ^From:.princesa@rio_nilo.eg

Eso es "*" Compara "^" lo que empieze de "From:" palante ".princesa@rio_nilo.eg" note el punto delante de la dirección; quiere decir que machee lo que tenga delante para no contar el nombre real y guiarte por la dirección de correo así por ejemplo si el header de la dirección dice.

   From: "Pantera del Desierto" <princesa@rio_nilo.eg>

Procmail usará esa expresión egrep(por si no lo a notado) y macheara la dirección de correo sin importar lo que tenga.

Luego en la siguiente linea dice solamente

jevita

Guao! Que ruta tan simple. Es que ya declaramos la variable $MAILDIR y eso lo hace una ruta relativa que el programa la interpreta como una ruta absoluta conjugada con la vairable $MAILDIR.

Yo para ponerle la tapa al pomo, creo un link entre los "inboxes"

ln -s /var/mail/inbox /hom/tutancamon/Mail/inbox

Así el inbox del home y el de /var/mail son la misma cosa. Pero acá hay un detalle curioso y es que procmail es capaz de entregar en cualquier formato (decente) de correo. Si pusiéramos:

jevita/

Con el "/" al final. Entregaríamos en un "Maildir" bajo "~/Mail/".

Aprovechemos para hablar un poquito sobre los "maildir"

Maildir es el formato de "qmail". Muy bueno para grandes cantidad de correos muy rápido. Su escritura y lectura es mas rápido porque es de uno en uno. También dicen que es más seguro pero no dicen en que
sentido o porqué es más seguro, así que... no creo que sea más seguro. Las explicaciones que dan usualmente hablan de mayor rendimiento pero no de seguridad como tal. El Maildir organiza los correos tendiendo dentro 3 subdirectorios: "cur","new","tmp" El directorio "cur" almacena los correos leídos, el directorio "new" los nuevos y el "tmp" los que están siendo escritos, evitando así el uso de locks. Cada correo será siempre un fichero separado en la carpeta new o cur, ideal para cuando desarrollo aplicaciones de correo y no quiera lidiar con el formato mbox.

Pero volviendo con procmail... En el caso que pusiéramos:

jevita/.

Con un "/." entonces entregaríamos en formato "MH" que es el que usan algunos clientes muy viejos pero es otro buen sustituto del mbox principalmente cuando son muchos correos. De todas formas le recomiendo
más "Maildir" que "MH", ya que mh tiene TODO el correo (nuevo y viejo) en un mismo directorio, usando un fichero de control para ver cual es nuevo o viejo. Dicho fichero varía según el cliente y suele dar unos
bateos horribles.

Por último:

jevita

Entrega en formato crudo porque si confiamos en que será un mbox... no se mi procmail que fue descargado y compilado supuestamente última vesión y el formato mbox no pincha bien. Mas bien tira los correos
crudos uno atrás del otro en un fichero. Para corregir ese "palo" yo pongo esta regla primero que ninguna.

:0fw
| formail

Formail es un programa que manipula los encabezados del correo. Veamos un ejemplo típico de formail manipulando encabezados:

| formail -I "From: Fulano <direccion@dominio.org>"

Esto le insertará y/o remplazará el encabezado from. Digamos que desea marcar todos los hilos nuevos de un lista y que dichos correos lleguen a su carpeta filtrada con la marca flag puesta. Aquí formail es la herramienta definitiva.Digamos que la lista se llama gutl-l@jovenclub.cu:

Nuestro procmailrc se vería así:

:0fw # resalta los nuevos correos en gutl
* X-BeenThere: gutl-l@jovenclub.cu
* !^Subject.*(Re:|Fw:)
|formail -I 'X-Status: F'


Osea que todo lo que NO tenga Re o Fw en el asunto es un nuevo hilo, ya solo es cuestión de mirar la carpeta donde filtra la lista y verá los nuevos hilos con la flag puesta. El como se ven, depende mucho de
su cliente de correo.

Bueno y como filtral una lista? Pues mailman tiene el encabezado X-BeenThere: donde va la dirección de la lista, así que:

:0 # gutl-l la lista de cuba
* X-BeenThere: gutl-l@jovenclub.cu
gutl-l

Con eso tienen una breve noción de procmail, lo demás es "creatividad"

martes, 3 de septiembre de 2013

date -d FUTURO

Aveces queremos hacer un script o ALGO que machee una fecha que no es la actual, quicieramos que date resolveria ese problema pero cambiar la hora es una jodienda, pero mira, corre:

$  date -d '+7 days'

y te saldrá la hora de hoy, dentro de 7 días :D

pero aún más bestial, que día del mes era hace sieta días:

$ date -d '-7 days' '+%d'



Gnu-PGP y los secretos masónicos



Se especula que hay una selta secreta que pretendo cogerse el mundo. Uno de estos miembros decidio que su correo no debia ser leido por ahi o que sus email no se usarian para ingeneria social o que a nadie le interesa lo que se habla con su novia, entonces se inventó GPG (vea la verdadera historia aquí)

El principio es sencillo:

1- Crear un clave PGP.
2- Manda una clave publica a alguien.
3- Ese alguien te lo cifra con TU clave pública.
4- tu lo desifras con tu password.

Primero lo primero. Crear una Clave personal, la tuya la que no tiene nadie. Eso lo hacemos generando un "par de claves" par porque son dos, la perosnal y la publica pero se genera travez de una.

$ gpg --gen-key

Ahi comenzará un poroceso donde se genera la clave. Si pretende planear como hacer caer la unión sovietica por correo le recomiendo que se haga de un pasword bien pinguo.

echo! Clave creada para la dirección frater@gran_logia.org

Ahora probemos cifrar algo, un buen fichero de texto por ejemplo. Cogemos un fichero y le corremos este comando:

$ gpg --armor -r frater -o monografia.asc -e malvado_plan_B.txt

Ahora la explicación de los parametros:

"--armor" genera una forma llamada "ASCII amored data" o armadura ASCII lista para pasra por el correo. Claro esto es un chapusería porque lleva toda una información MIME que diga que es un correo cifrado en GPG pero bueno para que comprenda el principio.

Ahora bien, en este caso usamos nuestra propia clave publica pero si fueramos escribirle a:

complice@logia.pais_victima.org

Necesitamos la clave pública DE ÉL no la de nosotros. Le recuerdo que nosotros recibimos mensajes encriptados con nuestra propia clave publica. Veamos como sería este negocio...

Le mandamos nuestra clave publica a nuestro complice, Lo hacemos asi:

$ gpg --export --armor -o clave_publica.asc

Muy importante el parametro "--armor" sin la armadura ASCII solo mandariamos un chorro de mierda binaria buena para nada a nivel de correo pero muy util a nivel de archivo.

Ahora aparecera el fichero clave_publica.asc y este es la clave publica que le mandamos al cómplice.

Él ALLÁ correra el comando:

$ gpg --import clave_publica.asc

y agregara nuestra clave a su deposito de claves. Ahora esta listo para crear un cifrado que ni el podrá ver; solo su creador (tu) con la clave

Entonces Él ALLÁ corre.

$ gpg --armor -r frater -o monografia.asc -e malvado_plan_B.txt

y el fichero monografia.asc estara listo para ser enviado cifrado con nuestra clave para que solo tu lo puedas ver. Entonces el borra el fichero malvado_plan-B.txt con metodo Gudman de 7 pases y te envia el cifrado.

del lado de ACA lo decifras con el comando:

$ gpg -o planes.txt -d monografia.asc

Y te pedirá TU password de TU clave. Complicado verdad :-(

PERO BUENO!!

Mutt te hace la vida MUY facil, veamos como se comporta Mutt y sus habilidades especiales. Yo uso el 1.5.20 que es la version mas estable hasta el momento que escribo esto.

En el .muttrc pondremos lo siguiente.

set pgp_decode_command="gpg %?p?--passphrase-fd 0? --no-verbose --batch --output - %f"
set pgp_verify_command="gpg --no-verbose --batch --output - --verify %s %f"
set pgp_decrypt_command="gpg --passphrase-fd 0 --no-verbose --batch --output - %f"
set pgp_sign_command="gpg --no-verbose --batch --output - --passphrase-fd 0 --armor --detach-sign --textmode %?a?-u %a? %f"
set pgp_clearsign_command="gpg --no-verbose --batch --output - --passphrase-fd 0 --armor --textmode --clearsign %?a?-u %a? %f"
set pgp_encrypt_only_command="gpg --output - --armor -r %r -e %f"
set pgp_encrypt_sign_command="gpg --passphrase-fd 0 --batch --quiet --no-verbose --textmode --output - --encrypt --sign %?a?-u %a? --armor --always-trust -r %r -- %f"
set pgp_import_command="gpg --no-verbose --import -v %f"
set pgp_export_command="gpg --no-verbose --export --armor %r"
set pgp_verify_key_command="gpg --no-verbose --batch --fingerprint --check-sigs %r"
set pgp_list_pubring_command="gpg --no-verbose --batch --with-colons --list-keys %r"
set pgp_list_secring_command="gpg --no-verbose --batch --with-colons --list-secret-keys %r"
set pgp_autosign=yes
#OJO en este liena de abajo
set pgp_sign_as=frater
set pgp_replyencrypt=yes
set pgp_timeout=1800
set pgp_good_sign="^gpg: Good signature from"

Preste atención a la 4ta linea de abajo hacia arriba, dice:

set pgp_sign_as=frater

Ahí sustituya "frater" por su nombre de clave o mejor por la ID. Para averiguar la ID liste sus claves.

$ gpg -k

y tendrá algo como esto:

    pub   1024D/DE1A6CA5 2010-05-28
    uid                  chicho <frater@gran_logia.org>
    sub   2048g/0C914E56 2010-05-28

En este caso su clave es la "pub" DE1A6CA5

Ahora Mutt esta listo para convertirce en la herramienta definitiva para su consiparicion de conquista mundial. Mandele su clave publica a sus amigos iluminatis, esto lo hace en la pantalla principal de Mutt
presionando la combinaciond e teclas Escape + "k"

Enonces recivira el "input" donde pone la direccion de su complice y el asunto:

"oigan todos... le mando mi clave a mi complice"

ya que el asunto NO se encripta; así que usa uno menos explícito...

Pero nos surge la duda..

-Como encripto?

Bueno eso ya viene siendo mas complicado. Primero le pide su clave publica a su amigo el complice y cuando la tenga ya mutt sabra que hacer con ella. Veamos un ejemplo.

Cuando su amigo mande su clave publica mutt le dara la opcion de "importarla". Usted la importa y luego compone un mesaje NORMAL. Luego de poner todo sus secretos mas intimos y los tarros que le pega a
su novia salva el texto y cierra el editor. Al romperse la tuberia caerá en la pantalla de mutt done le dice presione "y" para enviar, NO la presione.

Ahi usted presiona "k" y le dara varais opciones. Una de ellas es la "e" de Encrypt. Si todo esta bien Mutt detecta la clave publica con la dirección de su complice que conincide con la direccion del destino del mensaje y BUN! cifrado para el cómplice.

Eso es la firma PGP. Esta se usa como un sello de lacre para la autenticidad y NO encrypta el mensaje. Para ello en la pantalla donde presiono "k" en vez de presionar luego la "e" solo presione la "s" de Sign y generara la firma de autenticidad anidada al correo.

Ahora también está de moda, que la clave sea en el cuerpo del mensaje, ya sea la firma o la propia clave. lugar de ser un adjunto, sea parte del cuerpo. Los clientes de correos lo procesan pero mutt parece quedarse loco.

Para cifrar en lina y procesar correos cifrados en linea, podemos usar esto:


set pgp_replyinline=yes
set pgp_autoinline=yes

No obstante, decifrar inline sigue siendo una jodienda. Si vez la documentación oficial, es todo una brujería con procmail, pero es más simple esto:

message-hook '!~g !~G ~b "^-----BEGIN PGP (SIGNED )?MESSAGE"' 'exec check-traditional-pgp'

Simple verdad? un ganchito... Otra cosa, quizas quieras agregar un encabezado para decirles a todos donde est;a tu firma:

set my_header="X-PGP-Key:h ttp://tuserver/~usuario/clave.asc"

Claro! Evolution lo hace todo solo y Thunderbird tiene un plugin.

viernes, 9 de agosto de 2013

repo personalizado de arch

Es pelapingante tener que descargar un chorro de paquetes una y otra vez cada vez; teniendo en cuenta que arch actualiza sus paquetes cada vez que va al baño.

 Cuando tienes un batallón de máquinas con arch eso puede llegar a ser un problema. Mejor que uno se baje todo lo que hace falta y lo comparta con los demás:

Primero le agregamos un repositorio personalizado a pacman, en /etc/pacman.conf

[mirepo]
SigLevel = Optional TrustAll
Server = http://localhost


Luego en esta máquina corremos un servidor web, por ejemplo, el que tiene arch por defecto.

darkhttp /var/cache/pacman/pkg/mirepo.db.tar.gz &

Y con este escript recreamos el repo cada vez que nos de la gana:


#!/bin/sh
pacman -Syyu
pacman -Qdt
rm /var/cache/pacman/pkg/custom.db.tar.gz
paccache -vur -k 1
pacman -Sc

# recrea la base de datos
repo-add /var/cache/pacman/pkg/custom.db.tar.gz /var/cache/pacman/pkg/*.pkg.tar.xz

# EOF


Con eso solo tenemos que configurar el repo "mirepo" en las demás máquinas y listo... Yo tengo un chroot con todo instalado y ese es el que actualizo, desde ese sirvo los paquetes, así evitas desastres.

lunes, 5 de agosto de 2013

mariconerías de MySQL

Esta es una de esas mañanas en que al revisar el correo te encuentras 500 email de Nagios; diciéndote que MySQL no está funcionando. Anonadado por el misterio, te diriges al servidor; y al arrancar MySQL... sorpresa, error:

Checking for corrupt, not cleanly closed and upgrade needing tables

Bueno... y ahora que? Nada que contar, los apagones jodieron la integridad referencial (u otra palabra sofisticada que se te ocurra) de la base de datos. Como diría un amigo mio: -Qué no se soluciona en linux corriendo un comando? La cuestión es saber el lugar donde correrlo. Me viene a la cabeza una frase de la revista ubunchu: -luchando con monstruosos dispositivos de hardware en el recóndito laberinto del sistema de archivos. Un ingeniero debe obtener magia de linea de comandos, solo un verdadero mago puede triunfar.

cd /var/lib/mysql
myisamchk */*

y a otra cosa mariposa...

miércoles, 3 de julio de 2013

mnoGoSearch


mnoGoSearch, es uno de los tantos buscadores e indexadores mediocres que existen en el mundo del software libre. De los todos los que hay, es el que menos apesta.
Lo mas triste del caso, es que no está en los repositorios de debian, no se cual será el misterioso motivo por el que lo quitaron, para dejar hyperestraier.

Descarga el que más te acomode aquí yo prefiero usar el código fuente compilado, el mismo, cógelo aquí.

Puede usar mil y una base de datos, pero mejor compilamos la de sqlite3 nada más.
aptitude install libsqlite3-dev

Luego:

atool -x mnogosearch-3.3.12.tar.gz
cd mnogo-*
./configure --prefix=/opt/mnogosearch --with-sqlite3

Se manda a configurar y si NO te dio bateo, entonces... 

make install

La configuración... bueno, eso son otros $20. Por ejemplo, la conexión con la base de datos, es todo una ceremonia, que poco se parece a lo que dice en la documentación, ya que el mismo, no pincha como en el ejemplo.

En el fichero /opt/mnogosearch/etc/indexer.conf le pones esta linea para crear la conexión con la BD:



DBAddr sqlite3://mnogo:@/opt/mnogosearch/mnogosearch.db/?dbmode=blob&Deflate=yes&zint4=yes



También debes especificarle la conexión al buscador en el fichero:

/opt/mnogosearch/etc/search.htm

Fíjate que es diferente, el parámetro dbmode=blob tiene ahora:

LiveUpdates=yes

Esto quiere decir que la puntación de cada documento se actualiza cada vez que accedas a él.

DBAddr sqlite3://mnogo:@/opt/mnogosearch/mnogosearch.db/?dbmode=blob&LiveUpdates=yes&Deflate=yes&zint4=yes


Como todos los indexadores; tiene un crawler y un frontend web para buscar. Pero volviendo con el crawler en "indexer.conf".

A mi me gusta tener los tipos de ficheros aparte, ya que uso "varios crawler"; una configuración para la documentación de flash, otra para los correos, etc... pero lo mejor es tener los tipos de ficheros aparte y así funciona con todos. Entonces pones una linea que diga:

Include filetypes.conf

y en el fichero /opt/mnogosearch/etc/filetypes.conf vamos a poner una buena catatombe de cosas extrañas. Sería más fácil si manejas los conceptos de MIME type; y si conoces el fichero .mailcap entenderás todo facilito. Por tanto, te sugiero que veas por arribita "man mailcap" para que tengas una idea de como funciona el mime-type; también deberías mirar /etc/mailcap.

Aclaración para el que leyó man mailcap: La única diferencia es que aquí, la declaraciones de los tipos mime van por un lado, y el comando a ejecutar va por otro.

Te explico lo que vamos hacer. Aquí vamos a declarar que fichero se permiten o no, además que hacer con cada fichero, ya que mnogosearch solo entiende de texto plano o de html; por tanto, usaremos terceras aplicaciones que conviertan lo que queremos en HTML puro. Además, el fichero también controla que extensiones el crawler debe revisar y cuales debe ignorar. En adicción, la opción NoCase, hará que ignore su si extención es .EXT o .ext, a ambas las tomará por la misma, osea
obviando la maýuscula.
Allow */ *.html *.htm *.txt *.ps *.pdf NoCase
Allow *.1.gz *.2.gz *.3.gz *.4.gz *.5.gz *.6.gz *.7.gz *.8.gz NoCase
Disallow * 

Ahí dice, primero permitir los ficheros *.(véase arriba) y aunque la documentación dice que soporta expresiones regulares, la práctica demuestra lo contrario, por eso no puse *.[0-0].gz y tienes que hacer la pincha del indio poniendo número a número.

Ah! OJO, el primer Allow el el fichero "*/" osea, DIRECTORIOS, si no, el indexer NO pincha.

Ahora que tenemos declarado las extensiones de ficheros, vamos a decirle que hacer con cada uno de esos ficheros para traducirlos a HTML. Vamos a declarar el contenido mime según su extención.

# tipos de ficheros y extenciones
AddType text/plain          *.txt  *.pl *.js *.h *.c *.pm *.e .py *.sh NoCase
AddType text/html           *.html *.htm NoCase
AddType application/pdf         *.pdf
AddType application/msword     *.doc
AddType application/oasis-document *.odt
AddType application/man   *.1.gz *.2.gz *.3.gz *.4.gz *.5.gz *.6.gz *.7.gz *.8.gz NoCase

Vites? cargamos un tipo de mime y lo casamos con una extención, hemos declarado que los ficheros cuyo nombre termine .doc será un fichero del tipo application/msword. Ahora que todo es mime-content lo demás es cuesta abajo, solo es cuestión del comando adecuado.

Cada vez que se reciba un contenido que NO sea html, se buscara en la tabla de de conversión y se ejecutará un comando. En dicha tabla, cada fichero debe estar casado con un comando a ejecutar, la tabla le dice a mnogosearch que hacer ante cada mime-content. mnoGoGearch le manda el contenido como parámetro y el comando ha de devolver HTML pero OJO!!! el comando debe devolver el HTML por SALIDA ESTANDAR (stdout)

Osea:

entra fichero como parametro (el $1)
sale HTML como salida estandar

<= comando foo.doc
=> <p>este es el contenido del documento word</p>

Mientras respetes eso, puedes agregar cuantos mimes quieras con el comando que te de la gana. En linux hay mil y convertidores tufichero2html, busca "aptitude search 2html" y "aptitude search tohtml" para que veas.

Esta es la mía:

Mime application/msword            "text/plain; charset=utf-8" "catdoc -a -dutf-8 $1"
Mime application/man              text/html                  "gunzip -c $1|man2html"
Mime application/pdf                text/html                  "pdftohtml -stdout $1"
Mime application/oasis-document     text/html                  "odt2txt $1|markdown"

La sintáxis es:

Mime contenido/mime  forma/salida   "comando que ejecuta"

Veamos un ejemplo abstraído, convertir todos los ficheros del tipo chipojo verde, en html.

AddType chipojo/verde *.chv
Mime chipojo/verde text/html  "reptil2html --input-type chipojo --color green --stdout -i $1"

Si miras la ultima parte veras que se declara a los ficheros application/oasis-document son del tipo text/html, pero en realidad odt2txt lo que hace es devolver texto, NO html. Pues parae so está puesto ahí markdown. Para el que no lo conozca, markdown es uno de los llamados "lenguajes textiles"; es el más bien el rey de los lenguajes textiles, ya que por medio de texto crea fichero HTML, esos son los ficheros .md que ves en github como un html lindo.

Mira que fácil convertiresmo 3 lineas de texto plano en un lindo HTML que cumpla todos lo estándares, gracias a markdown y tidy.
lazaro@utopian:~$ echo -e "titulo\n-\nhola mundo\n_texto subrayado_"|markdown|tidy -q
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html>
<head>
<title></title>
</head>
<body>
<h2>titulo</h2>
<p>hola mundo <em>texto subrayado</em></p>
</body>
</html>


Si miras la salida de odt2txt verás que es medianamente compatible con esta sintaxis, ya que casi todos los ficheros fulanito2txt son compatibles con esto de los lenguajes textiles y casi todos mirando a markdown que es el caballo de atila.

Es más lindo convertir un odt en HTML que en txt, el txt se ve feo.

Ahora que todo está listo podemos indexar nuestros ficheros y cuanto sitio web nos parezca :D pero aún no lo hemos dichero al crawler donde y cuando tiene que ir a buscar la cosas. El cuando es relativo, ya que el organiza todos las ubicaciones como le da la gana mientras indexa.

De vuelta al fichero /opt/mnogosearch/etc/indexer.conf lo pondremos una
linea así:

# indexamos el contenido de la carpeta de documentos
Server file:///home/lazaro/Documentos/

# indexamos el blog
Server /var/www/nanoblog/

# indexamos /usr/share/doc/
Server file:///usr/share/doc/

# indexamos las paginas de man
Server file:///usr/share/man/man1/
Server file:///usr/share/man/man2/
Server file:///usr/share/man/man3/
Server file:///usr/share/man/man4/
Server file:///usr/share/man/man5/
Server file:///usr/share/man/man6/
Server file:///usr/share/man/man7/
Server file:///usr/share/man/man8/

# indexamos la memoria flash de la documentacion
Server file:///media/NEUDATRANS/

Finalmente corres el crawler y veras algo como esto:

lazaro@utopian:~$ /opt/mnogosearch/sbin/indexer
indexer[29669]: indexer from mnogosearch-3.3.12-sqlite3 started with '/opt/mnogosearch/etc/indexer.conf'
indexer[29669]: [29669]{01} URL: file:///usr/share/man/man8/grpck.8.gz
indexer[29669]: [29669]{01} URL: file:///usr/share/man/man8/update-openoffice-dicts.8.gz


Ah! mira:

Por defecto, buscara y parceará todos vínculos en los archivos HTML, además de que irá a buscarlos también, osea si tiene salida al mar, y el crawler chcoca con un documento que hace referncia a otro, ira a buscar ese otro, solamente ese otro (si no haría un mirror de internet completo) Por ejemplo si tiene un documento que diga "puede ver aquí tal cosa" dale por sentado que está en el indice de mnogosearch porque el fue a buscarlo ;)

Pero bueno ponte cómodo que esto va pa largo :D

En lo que palo va y viene, vamos a ir configurando el fronted-web que lo
tenemos tirado a mierda

Localizas la URL y veras el buscador

http://localhost/cgi-bin/search.cgi

Bueno pero aún no puedes buscar por que el indice no esta hecho, declaramos que fuera del tipo "blob" (mira la documentación para una explicación más linda) por tanto, tenemos que crear el índice de referencia. Mira que comando más raro, el parámetro es "-Eblob"

lazaro@utopian:~$ /opt/mnogosearch/sbin/indexer -Eblob
indexer[31030]: Converting to blob
indexer[31030]: Loading URL list

Pa largo igual :D así que ponte cómodo de nuevo

Lo mejor de esto, es que puedes indexar una flash con documentación y luego desconectar la flash (muy útil para mis 4 gigas bytes de disco duro) no depende de que el fichero indexado sea alcanzable, ya que puedes hacer click en el link que dice "cache copy" y ver el documento. 

Además, cuando vez un cache copy, los parámetros de tu búsqueda salen resaltado en amarillo ;) cada vez que hagas click en en documento, el cgi acutaliza la base de datos y tratarará de refrescar la cache si hiciste click en el enlace, también tomara las palabras claves y reoganizará la relevancia, todo eso sucederá si tiene el parametro LiveUpdates=yes, lo cual haría un poco (imperceptible) lenta la busqueda, si quieres precindir de estas características simplemetne quita ese parámetro en la conección de search.htm.

Ah! search.html puede conecectar a varias bases de datos con distintos  paráemtros, como es mi caso; tengo conectada una base de datos para la flash y otras para el disco duro local. Al crwaler le puedes mandar distintos fichero indexer.conf para indexar distintos sitios; pero el search.htm puedes usar TODAS las bases de datos a la vez. Con el LiveUpdate eso podría llegar a ser dolorosamente lento, sobre todo en bases de datos como SQLite.

Yo puedo decir descansadamente que uso más mnogosearch que google; porque al menos en debian, /usr/share/doc y man contienen todo lo necesario para echar a andar las aplicaciones...

martes, 2 de julio de 2013

Ctrl-S


Para los que usen aterm, xter, wterm algoTerm, etc... Sucede que cunado tocas Control y S se apra el terminal, entonces hay que meter pa control Q u otras maromas...

pon:

stty -ixon

En el .bashrc y se acabó la jodienda...

jueves, 25 de abril de 2013

6in4 en 4 patadas

Un túnel 6in4, es una de las tantas tecnologías transicionales. Dicen que es malísimo y vulnerable pro yo creo que no es nada que un buen y sencillo cortafuegos no pueda resolver.

Para que tena una idea de la teoría: Encapsulamos paquetes ipv en una 4, localizamos el destino, si es alncanzable por cuatro, el mandamos un 4 encapsulado, si no, le mandamos el paquete a un túnel cualquiera que se tengamos cerca y este se encarga de meterlo en la red ipv6 nativa. Osea, levantaremos una interfaz visual que con una ruta especial se encargará de todos estos menesteres. Primero y principioso, crear el tunel:

Pero eso lleva muchos pasos. Necesitaremos una ipv4 pública. Supongamos que nuestra ip es 10.0.0.1 A partir de esa ip, generaremos una "subnet" ipv6 que sera todita nuestra. Osea, a partir de una ipv4, tendremos todo un rango ipv6 para asignarle un ip a cada partícula de polvo en nuestra empresa.

ipv6calc --quiet --action conv6to4 10.0.0.1

y nos devuelve nuestro prefijo: 2002:a00:1::

Ese será nuestro rango ipv6. Pero qué hacer con el? Pues crear ipevesieses y asignarla a cuanta interfaz nos venga en gana; pero antes, hay que terminar el túnel y asignarle una. Con este pase mágico, lo hacemos:

ip tunnel add tun6to4 mode sit ttl 255 remote any local 10.0.0.1
ip link set tun6to4 up
ip -6 addr add 2002:a00:1::1/16 dev tun6to4

Pero por razones de seguridad, no le podremos aún el toque mágico que lo hecha a andar. Aseguremos primero el cortafuegos. Algo sencillo, permitirá todas las conexiones apara afuera pero nada para adentro.


ip6tables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
ip6tables -A INPUT -j DROP

y permitiremos que se haga forward de nuestra LAN, osea que nuestra LAN acceda a la ip6 pero que nadie acceda a nuestra LAN

ip6tables -A FORWARD --state RELATED,ESTABLISHED -j ACCEPT
ip6tables -A FORWARD -j DROP
sysctl net.ipv6.conf.all.forwarding=1

Sin complicaciones. Ahora que estamos asegurados, levantamos el túnel poniendo la guinda en la punta del pastel. En debian, este tabaco hace que se redireccione todo como expliqué arriba. Abra cadabra:

ip -6 route add 2000::/3 via ::192.88.99.1 dev tun6to4 metric 1

...y al carajo albañiles que se acabó la mezcla! Te pones otra ip como esa en una interfaz real que de a la lan, por ejemplo, eth0

ip -6 addr add 2002:a00:1::cafe/64 dev eth0

y configuras las máquina de tu LAN asignándoles una ipv6 de ese rango y a 2002:a00:1::cafe como su puerta de enlace. OJO, las direcciones asignadas a interfaces reales son /64

Un ejemplo decomo quedaría el fichero /etc/network/interfaces


iface eth1 inet6 static
        address 2002:a00:1:21c:c0ff:feb2:91c2
        netmask 64
        gateway 2002:a00:1::cafe



Bienvenido al sixbone! Agáchate que viene la galleta, el hacker está a 2x1 con descuento para los 6in4.




iptables con psd para evitar escaneos

Sencillo pero eficiente. El módulo psd para en seco los escaneos de puertos. Cómo lo hace? Pues ni puta idea; lo hace y lo hace MUY bien. Pero el ritual ha llevar a cabo es particularmente complejo ya que hay que crear un modulo... instalamos lo necesario; los paquetes son: iptables-dev iptables-persistent xtables-addons-common module-assistant

Con esto se compila le módulo:

 module-assistant auto-install xtables-addons-source 

 y andando se quita el frio:

iptables -A INPUT -m psd -j DROP

lunes, 25 de marzo de 2013

¿me dice la hora por favor?


Cualquiera que sincronize debidamente por NTP, tienen las misma hora EPOCH,
es decir, hasta los mismos segundos. Pero surge una interrogante:


                           ¿Que cosa es un segundo?

Hace unos años un segundo era el tiempo que tardaba el volante de un reloj en moverse de un lado a otro. Pero cuando el volante cambia su tamaño, material o peso, cambia el tiempo que tarda en moverse de un lado a otro. Si vamos a los números muy pequeños, a los 0,00N segundos, dos volantes no tendrán la misma noción de un segundo. Tengamos en cuenta que el tiempo es una magnitud cuya existencia real es aun cuestionada por los físicos más escapaos del yuma.

Mientras tanto, aparecieron las computadoras. Ya no hay un volantes pero persiste el problema del milisegundo. Los relojes deben medir el tiempo basándose en la frecuencia del microprocesador.

                      ¡¿y qué pasa cuando sube el voltaje?!

Pues la frecuencia varía. Además, pal caso es la misma mierda, porque si tomamos un volante que pese una pendejésima menos que el otro, su segundo sera entonces un pendejisegundo de diferencia con respecto al otro volante.

No parece haber un sistema decente que mantenga un flujo de tiempo constante. No hay un árbol de tiempo, ni un caudal de un rió fluye siempre igual. La marea del mar varía de solo mirarlo, también según como esté la luna, que es particularmente venática.

:-P drama descomunal. Parece no tener solución

Pero eso No ha frenado a nuestra civilización de querer demostrar la existencia del tiempo real; hasta decir que es una dimensión más del universo ¿Se ha puesto a pensar, como se comporta el flujo de tiempo en una
cuerda? Debe ser algo sublime.

Pero de vuelta a lo que nos compete...

Decíamos que el EPOCH (la hora de unix) es la cantidad de segundos transcurridos desde 1970 hasta la ACTUALIDAD. Alabao! ¿y qué es "la actualidad" entonces?! ¡ÑÓ! ¡Cuantas preguntas existenciales! Pues en epoch, la actualidad o el presente, es la cantidad de segundos que se suman desde 1970 hasta la hora
que tiene la máquina. Por ende:

Si nuestra máquina tiene UN segundo de atraso,
dará el EPOCH de manera incorrecta.

Si un satélite de GPS se equivoca UN SEGUNDO, dará mal unos metros la ubicación de un cuerpo moviéndose en la tierra. Las triangulaciones satelitales requieren una precisión de milisegundos.

Supongamos que los Yankis tiran un misil para el Capitolio...



Mientras el misil vuela en el aire, la tierra se va trasladando a 15 grados por hora. En dos minutos, la tierra se habrá desplazado 0,5 grados sobre su propio eje y el objetivo no estará en el mismo lugar, si leí bien mi regla de cálculos, estará a 2500 metros.

Para contrarestar esta impresición, el GPS ordena al misil que corrija su curso. Le indica un ángulo de inclinación que lo vuelve a poner con destino al blanco. Esto sucede en el aire, sobre todo si el objetivo está en movimiento.

Supongamos que el sistema tiene una diferencia de 0,4 segundos y que dada la altura, el retardo ha provocado que el satélite ordene al misil, una inclinación de 7,3 miserables grados de más.

Ahora el misil que está a 32 kM de altura, recibió una inclinación que excede 7,3 grados al desplazamiento axial de la tierra y por tanto, su objetivo ya NO será el capitolio.

Por 7,3 grados nos quedamos sin estadio de pelota! 



Pero NO solo en los celajes, aquí en la baja atmósfera también suceden cagástrofes locales:

Una aplicación que trabaje con Round Robin, por ejemplo el MRTG; si le entran datos con dos EPOCH iguales, crea inconsistencias en la base de datos. Un evento que debe loguearse cada un segundo y si estos segundos están mal, el log estará alterado. Quizás a usted no le importe mucho ese asunto, pero recuerde que los países desarrollados son desarrollados por que su tecnología es de alta precisión ;) Por eso los países subdesarrollados NO fabrican cohetes, ni aún teniendo los recursos.

Entonces, definitivamente tiene que existir una fuente infalible de tiempo. Tienen que haberla inventado o no hubiesen misiles teledirigidos de alcance global.

Gracias a ntp, tenemos una fuente infalible de tiempo.

Bueno, en nuestro mundo el tiempo parece no existir. Pero en el micromundo hay algo que es bien constante. Un tipo muy escapao de la física, descubrió que si podía tomarle el pulso a un átomo, obtendría un flujo de tiempo BIEN preciso y constante. El átomo tiene un electrón que orbita alrededor del núcleo con una constancia y precisión casi infalible. Con eso, se inventó un aparatico que le dicen:

   "reloj atómico" (dicho con una gran sonrisa y los ojos cerrados)

y diiiicen, que el más preciso del mundo. Su imprecisión es de un milisegundo cada no se cuantos miles de años. Tiempo más que suficiente para morirte sin ver como tu reloj se atrasa un milisegundo :D

Pues ya, solucionado el problema, inventaron el stratum 0. Pero en la tienda de Carlos 3ero NO venden relojes atómicos :(

Los stratum 0 transmiten por honda corta la hora y los radios relojes la reciben. Calculan la diferencia usando la frecuencia y retardo de la señal y andando; se inventó el stratum 1, es decir: Aquellos relojes que reciben la hora del infalible. Bueno pero ese tampoco lo tengo :-/ Pero aún queda la opción de conectar una computadora al GPS o al raioreloj...

Bueno, resuelto el problema, que los stratum dos manden la hora por la red y todos felices.

SI TA BIEN :D créete eso

La cosa no es tan simple como mandar un string con la hora. Si NTP fuera tan simple como eso, chocaría de frente con la metatranca más grande que ha dado la física: "la relatividad de Einstein"

-son las 3 con 2 minutos y 0.0001 milisegundos, TRABA, aquí te lo mando

El paquete tardará 65 milisegundos en recorrer el cable (una fibra óptica muy de pinga). Al llegar, ya tendrá 0.6499 de atraso y ya vimos el desastre cuando hay 0,4 segundos de atraso así que solo será cuestión de tiempo que el reloj se atrase gradualmente.

COÑO! El tiempo es relativo!

Cuando miras un reloj, ves que son las 12 y media con 18 segundos. Pero la luz viaja a no se cuantos kilómetros por hora. Valla, como que 18 segundos son más que preciso pero en realidad la imagen llegó a tus ojos con unos 0,000036 segundos de retardo :D

Para resolver este problema, el protocolo NTP, compara el tiempo que tardo en viajar el paquete por la red. El paquete dice:

-son las 3 y 20, sali a las 3 y 24

Cuando llegue, ntp mira la hora y mira lo que tardó el paquete en llegar.

-segun el reloj de él, este paquete tardo 12 minutos en llegar y tenia las
  3 y 20 por tanto 4 y 12 son 16. En este momento son las 3 y 36

Balla no es así exactamente. Es mucho más complejo. El paquete de NTP es una matatranca tremenda que se se basa en una pila de cosas.


Las computadoras conectadas, al radio, o al segundo infalible (el GPS), son los llamados stratum 2, esos tienen servidor NTP y por lo general son de acceso público.


Bueno pero todo eso está muy bonito en teoría. Cuando hay que mandar un paquete por modem de 28K por un ADSL; empieza la realidad del cubano a derretir nuestro sueño. Ahí es cuando entra:

¡Chrony al rescate! Defensor de los pueblos pobres, oprimidos por el subdesarrollo o bloqueados comercialmente :D

NTP puede ser configurado para evitar que un drift muy largo descarte una fuente como fideligna. Chrony, por naturaleza, hace mil y una maroma para acercarse a la realidad. Además. Chrony, hace algo único

   "adivina nuestro hardware"

Chrony se basa en los estratos y almacena en un fichero el drift con que periódicamente falla nuestro micro. De esta forma aplica un "threshold" basado en la conducta usual de nuestro microprocesador. Por ejemplo: Si el micro se adelanta 0.005 ms cada un segundo. Chrony estará atrazándolo 0.005 ms cada un segundo para mantener la realidad acoplada.  Esto se hace de esta forma, porque cuando cambias la hora, algunos
servicios se vuelven locos. Prueba a usar "date -s" y veras como dovecot se para en seco :D porque un cambio de hora en el server es una violación de seguridad.

Si un marcapasos pulsa dos veces por segundo y tú le cambias la hora de sopetón:

 Biip biip bip-bip-bip biiiiiiiiiiiiiiiiiiiiiip ¡¡ENFERMERAAA!!

Para hacer esto de manera "imperceptible", están los llamados "threshold". Aplicar un "tresjol" no es más que: "ir restando milisegundo por milisegundo, hasta alcanzar la hora correcta"

Dime... ¿no es fascinante? Todavía hay mediocres por ahí que usan "date -s" La delgada linea que separa la ignorancia de la estupidez. Algo típico: -mi reloj (de mano) está puesto por radioreloj, tu celular está mal

¡COJONE! ¡que somos informáticos, somos científicos! Técnicos operadores de sistemas unix. NO somos copiadores de códigos ni seguidores de tutoriales baratos. Podemos tener un sistema cuya precisión de tiempo sea digna de tirar un misil ICBM y no nos cuesta nada.

Con todos esto en mi cabeza, cada vez que alguien me dice que mi nokia sincronizado por cubacell podría estar mal, lo que me dan ganas de matarlo, no sería homicidio, es que la ignorancia mata a los pueblos. Ya que tenemos un chrony tan preciso:

echo 'stratum 2' >> /etc/chrony/chrony.conf
echo 'allow 0/0' >> /etc/chrony/chrony.conf

De esta forma podremos responder con mucha precisión cuando nos pregunten:

¿qué hora es?

martes, 19 de marzo de 2013

róbate la hora


Los cubanos le sacamos agua a un ladriyo :D

Para aquellos que 50 segundos de diferencia no le quita el sueño; ya pueden actualizar detrás de un servidor proxy y no necestian NTP ya que con este método lo que hacemos es:

   "setear la hora usando el header Date: de un servidor remoto"

al cron le ponemos una tarea asi:

 # cada una hora, sincronizate
 00 * * * * cronos.sh http://www.algunsitio.com

El script recibe una URL como parámetro y de ahí se fachará la hora. Google tiene una hora bien firme pero no creoq ue le haga mucha gracias tu pedidera de encabezados. Asegúrate de usar algun servicio decente...

sin mas, aqui los dejo con el script

#!/bin/bash
#
# http://github.com/uranio-235/dev/blob/master/cronos.sh
#
# debemos esperar a que comienze un segundo para
# evitar que la transicion 59 > 00 cause drift
while test $(date +%S) -gt 10; do sleep 5; done

# ejecutamos test y curl para que se cacheen
# en memoria y arranquen mas rapido despues
curl --help 2> /dev/null > /dev/null
test

# calentamos los motores aritmeticos tambien :D
echo $(($(seq 1 9|shuf|tail -1)*$(seq 1 9|shuf|tail -1)-$(seq 1 9|shuf|tail -1)))

# trae la fecha del header Date:
remota=$(curl -I $1 2> /dev/null |grep 'Date:'|sed s/'Date: '/''/g)

# arrestun momentum
local=$(date +%s)

# si el sistema tiene la misma fecha ni te inmutes
test $(date -d "$remota" +%s) = $local && exit 0

# un segundo menos es por culpa de Einstein, asume que esta bien
test $(date -d "$remota" +%s) = $(($local-1)) && exit 0

# SETEA LA FECHA!
date -s "$remota"

# logueo por syslog
logger 'le fachamos a' $1 'las' $(date)

exit 0
# vim:fo=tcq:tw=75:nowrap:
# EOF





martes, 26 de febrero de 2013

BOSH con prosody


Un servidor BOSH, es aquel servidor que da la posibilidad de tener jabber atravez de http. De he ahí que antes se le llamo http-bind. La cuestión es tener jabber a través de consultas HTTP, dando la posibilidad de usar jabber con aplicaciones web o simplemente para clientes que están detrás de proxys muy restrictivos en el quinto infierno.

Prosody, permite configurar con mucha facilidad esta maravilla del mundo moderno. Lo primero es abrir el fichero de configuración que ya todos conocemos y en la sesión de módulos habilitaremos un módulo llamado "mod_bosh". Si todo esto te sonó en sueco, dirígete a las entradas anteriores donde explico cual es el fichero de configuración y que forma tiene.

También tendremos que agregar un parámetro con los detalles de nuestro servidor bosh. En teoría la cosa es tan fácil como:

bosh_ports = { "http-bind" }

Pero eso haría que el servidor bosh escuche en el 5280 y dijimos que tenemos un servidor bosh para los usuarios que radican detrás de un servidor proxy restrictivo, por ejemplo, el proxy de una escuela o de alguna corporación de mala muerte.

En dicho lugar solo están abiertos los puertos 443 para SSL y 80 para HTTP, por tanto, nuestro servidor BOSH puede y tendrá que adaptarse a las complejas circunstancias de nuestros pobres usuarios.

bosh_ports = {
              {
                 port = 80;
                 path = "http-bind";
              },
              {
                 port = 443;
                 path = "http-bind";
                 ssl = {
                          key = "bosh.key";
                          certificate = "bosh.crt";
                       }
              }
           }


Sí! ya se. Es un reguero tremendo de parentesis y cuando copies con Vim o con cooledit se formará tremendo desorden. Suerte!

Para los usuarios de nginx, les daré las mieles antes de que larguen el pelo tratando de lograr el proxy inverso. La configuración sería más o menos así.

location /http-bind/ {
   proxy_pass  http://localhost:80/http-bind/;
   proxy_buffering off;
   tcp_nodelay on;
}

Muy importante que /http-bind/ este entre dos "/" tanto al principio como al final, si no, no pincha.

lunes, 25 de febrero de 2013

servidor MUC con procody


"más de lo mismo" sería un buen encabezamiento para este post. Hablábamos en el post anterior de un servidor jabber bueniiiiisimo. Lo cierto es que si fuera tan bueno, medio mundo lo usara, pero hay que reconocer que tiene su encanto.

En el post anterior, quedamos en que le habilitaríamos un un servidor de conferencias que trae incorporado y miren que facilito es esto:

echo 'Component "conference.tudominio.cu" "muc"' >> /etc/prosody/prosody.cfg.lua

Ahora solo falta crear un puntero DNS que apunte a conference.tudominio.cu

Para prosody todo estos servicios adicionales son "componentes". Como buenos ejemplos, tenemos un sock5, una pasarela de transferencias y en especial, el servidor BOSH, ese que permite jabber por http. Gracias a eso ponemos las jugosas interfaces web como JWM. En la próxima entrada veremos como
habilitar el servidor BOSH de prosody.

Nota para los imbéciles: no olvide reiniciar prosody

roster compartido en prosody


En el post anterior hablamos sobre un servidor de jabber con prosody y hablamos sobre sus características expandibles. Como servidor Muc, BOSH y roster compartido. Empezemos por la que más me gusta.

El mal llamado roster compartido, es en realidad un grupo en el que varios JID ya están declarados y no han de ser añadidos. De esta forma, un nuevo usuarios se incorpora y estará en la lista, además, tendrá a todos los usuarios en la suya. Evita tener que agregar usuario por usuario. Para crear este grupo especial, debemos tener habilitado un módulo llamado "groups", si no sabe como hacer esto, diríjase al post anterior.

Una vez habilitado, escribiremos su parámetro de configuración fuera de la sesión donde declaramos los módulos. El parámetro se llama groups_file y sería más o menos así.

echo 'groups_file = "/etc/prosody/sharedgroups.txt"' >> /etc/prosody/prosody.cfg.lua

Pero tenemos un fichero nuevo, un tal sharedgroups.txt. Dicho fichero no existe aun así que lo crearemos. Ahí declararemos un grupo llamada "Usuarios" y le pondremos los usuarios deseados. Los grupos se declaran poniendo el [Nombre] entre corchetes. Puede poner todo los grupos que quiera. Debajo del grupo pondremos la JID, podemos agregarle un nombre real con un "="

echo '[Usuarios]'
echo 'admin@dominio.cu'
echo 'fulano@dominio.cu'
echo 'contabilidad@dominio.cu=Hilda Maria
echo 'chicho@gmail.com'
echo 'pepe@jabber.org'

Con eso creamos un grupo llamado Usuarios. El roster de esos tres usuarios tendrá a lo mismos autorizados; listos para hacer click e iniciar la charla. Además, tendrá otros dos extras.

Pero sería desesperante tener que escribir en un fichero cada vez que se crea un usaurio. Mejor sería algo que mantenga esa lista de manera automática. Por eso, cree un fichero que al ser corrido, recoge todos los
usuarios del sistema y recrea el fichero.

Para esto, vamos a necesitas un módulo extra:

curl http://prosody.im/files/mod_listusers.lua > /usr/share/lua/5.1/prosody/modules/mod_listusers.lua

Ojo con la versión y la ruta. Bajamos un módulo especial que NO se usará dentro del servidor. ¿Se recuerdan que prosodyctl hacia mas cosas de las que dice hacer? Una vez bajado el módulo corremos:

prosodyctl restart
prosodyctl mod_listusers

¡Y sorpresa! una lista con todos los usaurios de nuestro sistema. ¿Qué podemos hacer con ella? Mire:

root@donor:~# cat /usr/local/bin/update_prosody_roster.sh
#!/bin/bash
echo '[Usuarios]' > /etc/prosody/sharedgroups.txt
prosodyctl mod_listusers >> /etc/prosody/sharedgroups.txt
killall -9 lua
/etc/init.d/prosody start

De esta forma, cuando un usuario se agregue o cuando lo agreguemos manualmente, solo tenemos que correr "update_prosody_roster.sh" y para tener todos los usaurios en el roster masivo. Si tienes el módulo
"watchregistrations" te enterarás cada vez que un usuario se registre y podrías correr el script. De otra forma, si los agregas tu a mano, corres el script despues de agreagarlos, o modifica el escript para mandarle el usuario como parámetro y que este ejecute el add de prosodyctl.

En el próximo post, veremos como configurar un servidor MUC para conferencias...

servidor jabber con prosody


Lua, es uno de los tantos lenguajes interpretados que hay. Echo por los Brasileños; aunque lo de ellos definitivamente es la samba y el futboll. Lo digo porque ese fue uno de los primeros lenguajes que estuve manoseando y No creo que halla un buen motivo para escribir algo con él.

¡Pero Prosody, demuestra que me equivoco!

La robusteza, simplicidad y el rendimiento de este servidor quizás sean superiores a la de ejabberd (que está escrito en Erlang, un lenguaje aún más exótico que Lua). Por otra parte, su todo en uno, lo hace más versátil que otros cuantos. No tiene nada que envidiarle al cochino OpenFire y toda su parafernaria de Java.

Prosody cuenta de manera incorporada con servidor MUC (sala de charla), pasarelas hacia servicios, logger de error, loger normal, logger de debug, servidor BOSH, discovery, mensaje masivo, MOTD y todo lo que necesita un completo servidor jabber. Incluso un servidor http y una interfaz de telnet. No piense usted que todo eso es obligado e incluido por defecto.

En su estado natural, prosody solo viene con lo básico. Ampliarlo, es solo cuestión de modificar la configuración. No piense en una extraña interfaz web como la de ejabber, hablamos de un fichero de configuración ".lua" con todo comentado.  No necesitamos saber Lua para configurarlo porque hay mas
comentarios que código en dicho fichero. La exoticidad de Lua radica en que un comentario es "--" en vez de "#"

Prosody tiene un bonito esquema modular. Los módulos del llamado tipo "core", son lo básico del jabber: iq, precense, etc... No son funciones del servidor, son módulos, módulos base que incluso pueden ser deshabilitados. De forma que el servidor es un núcleo monolítico, compuesto por varios módulos. Ampliarlo, es solo cuestión de quitar comentarios y las cosas más específicas, como un roster compartido, es solo  uestión de insertarle un módulo y parametrisarlo; no hay compilar nada.

Comenzamos. En debian todo es muy fácil:

aptitude install prosody

Esto dará lugar un fichero de configuracion en: /etc/prosody/prosody.cfg.lua

De ahí modificaremos lo que necesitamos. Primero, poner la JID del admin, eso lo haremos aunque nuestro dominio no halla sido declarado.

admins = { 'tu_usaurio@tudominio.cu' }

Ahora vamos a la sesión modules_enabled. Todo bien comentadito. Yo lo habilito todo menos el servidor http y el telnet, como que no me da buena espina.

Si habilitamos el módulo "motd" nuestro servidor contará con un MOTD, pero debemos especificarlo. De esta forma cada módulo es una función que puede o no llevar parámetros de configuración. Para argumentar la configuración de motd, escribimos FUERA de las sesión de módulos.

motd_text = 'este es el motd de mi server'

Pero "motd_text" no estaba escrito en ninguna parte. Para ver si un módulo tiene o no configuración, sus detalles, que hace y hasta un ejemplo, podemos verlo en la lista de módulos.

http://prosody.im/doc/modules

Pero volvamos a la configuración. La siguiente linea de interés es la que permite el registro de usuarios.

allow_registration = true;

OJO! se requiere un ";" al final de la configuración (razón por la cual abandoné Lua). Si no quieres que los usuarios se registren déjalo en false. Puedes usar la aplicación de control para crear usuarios. Ejecuta prosodyctl sin parámetros y veras una pantalla aprueba de imbéciles que te dice como crear los usuarios y otras opciones interesantes. Lo bueno que tiene esa aplicación es que hace más cosas de la que dice.

Lo siguiente es el SSL, no es bueno desabilitarlo porque muchos cliente jabbers traen por definición usar ssl. Mejor seguir a las que dice:

c2s_require_encryption = false
s2s_require_encryption = false

Poniéndolas en false, el servidor usara lo mismo SSL que plana.

Pero aún no hemos declarado el dominio. Resulta que como te dije todo es modular. Los dominios son VirtualHost. Al igual que en apache, incluso el dominio por defecto, es un virtual host. Podemos declarar varios dominios y dejarlos deshabilitados.

VirtualHost "tudominio.cu"

Ya tenemos un dominio, podríamos tener más con solo agregarlos pero con eso ya tenemos un servidor con lo indispensable. Veamos en el próximo post, como es el caso de un servidor con sala de conferencias y con roster compartido, dos características que no faltan en servidor jabber corporativo.

viernes, 8 de febrero de 2013

dovecot chrueco

Ahora la han cogido de gracia en dovecot, poner los mailbox en un lugar extraño. Cunado haces un upgrade de sistema, el despingue es de alcurnia. Para los enchapados a la antigua, así ponemos los mailboxes en /var/mail/$USERNAME

En el fichero /etc/dovecot/dovecot.conf localizamos la parte esta:


# See </usr/share/doc/dovecot-common/wiki/Variables.txt>\
# Some examples:
#
#   mail_location = maildir:~/Maildir                     
#   mail_location = mbox:~/mail:INBOX=/var/mail/%u
#   mail_location = mbox:/var/mail/%d/%1n/%n:INDEX=/var/indexes/%d/%1n/%n
#
# </usr/share/doc/dovecot-common/wiki/MailLocation.txt>
#
mail_location = mbox:~/mail:INBOX=/var/mail/%u

Cambiamos el parámetro mail_location por lo señalado en rojo.