martes, 20 de enero de 2015

welcome aboard

De siempre, me ha gustado la paginita que pone ruby on rails en “/”. Pero sucede que en producción esto no sale. Sería genial tener eso como página de root, sobre todo cuando no tenemos/queremos mostrar una página CMS que diga click aquí o click allá para tal cosa.

Resulta que esa vista está en railties y si adivinamos bien la ruta, la puedes renderizar en una vista que responde a “/”. Para eso, creamos el método “welcome” en el controlador genérico que está en controllers/application_controller.rb, A mi me quedó así:
“controllers/application_controller.rb”

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception

  # agregamos el método "welcome"
  def welcome
     render File.join(Gem.path.first,"gems/railties-#{Rails.version}/lib/rails/templates/rails/welcome/index.html.erb")
  end

end
Je! No creerías que me iba bajar con una rutica escrita que debería cambiar con cada release de rails verdad? Vamo, que no somos programadores por gusto y si estoy con rails desde la versión 2; no fue comiendome los mocos. Dividido en sílaba: File.join conjuga la ruta de, Gem.path.first, osea el repo con las gemas. Ahí ha de estar gem/railties- seguido por la versión de rails; que porsupuesto, no hay que leer el árbol de directorios para deducirla.

Ahora el método welcome irá a buscar el welcome a board en railties. Solo falta declarar la ruta, pa que pinche en cualquier entorno.
“config/routes.rb”

   # el root clásico
   get '/' => "application#welcome"

   # las demás rutas aquí abajo

Bienvenido a bordo, estas sobre rieles!!!

martes, 2 de diciembre de 2014

proxy automático

Mozilla Firefox
Todo el que halla configurado un navegador con proxy; o sea, todo cubano que halla configurado un navegador, quizás halla visto que una de las tantas opciones dice “configuración automática”. Seguro se preguntarán que carajo es eso.

Pues esa un javascript que le dice al navegador como debe serla configuración del proxy; obviamente.

Resulta que hay dos maneras de hacerlo, vía DHCP o vía DNS. Algunos navegadores lo cogen por DHCP mientras que otros lo hacen por DNS.

Para evitar problemas, configuramos las dos…

Primero y principioso. Creamos el fichero wpad.dat, el nombre debe respetarse. Dicho fichero los servimos, así que por definición los podremos en /var/www. Este fichero contendrá las instrucciones que un navegador necesita para pinchar.
“/var/www/wpad.dat”
1
2
3
4
5
6
7
8
9
10
11
12
function FindProxyForURL(url, host) {

        // los host locales NO pasan a través del proxy
        if(shExpMatch(url,"*.hcg.sld.cu:*")) { return "DIRECT"; }
        if(shExpMatch(url,"*.hcg.sld.cu:*/*")) { return "DIRECT"; }

        // la red local, tampoco
        if(isInNet(host, "10.1.1.0", "255.255.255.0")) { return "DIRECT"; }

        // lo demás sale por el proxy
        return "PROXY 10.1.1.1:3128";
};
Como ve, es javascript puro, osea que las opciones se podrían hacer más creativas. Por ejemplo, si la ip de la máquina es tal, configuralo así o asao.

Los criticones de código diran que se pudo usar un swith en vez de 3 “if”. Pero eso correrá en un momento y entorno casi imposible de debugar. Lo intenté con swith y no me pinchó. Ahora el problema es que hay que declarar un nuevo contenido mime para este dato. En mi caso uso nginx y en el fichero de configuración de mime, le aclaramos el nuevo; a mi me quedó así:
mime.conf
1
2
3
4
5
6
7
types {

    application/x-ns-proxy-autoconfig     dat;
    text/html                             html htm shtml;
    text/css                              css;
    (muchas lineas más aqui)
}

Bueno ahora, vamos pal DHCP. Por supuesto, nada menos que el mismísimo dnsmasq:

Primero el método DHCP, declaramos una option cuyo código sea 252

option=252,http://10.1.1.1/wpad.dat
También declaramos un puntero DNS, que apunte a wpad.hcg.sld.cu y que sea el servidor donde está el wpad. Le recuerdo que “hcg.sld.cu” es el nombre del dominio. Al reiniciar nginx y dnsmasq, todo debe estar listo…

martes, 9 de septiembre de 2014

proxy padre de infomed

Un sitio donde toda la comunicación más allá del mar, sale a través del  llamado “proxy padre”. Siempre había oído hablar de casos como estos, pero nunca lo había vivido.

Toda la navegacion detrás de infomed, se realiza atreves de un SIN… simpatico proxy padre, que escucha por el puerto 3128.

Drama descomunal! Si en tu proxy local, declaras un proxy padre (en squid: “cache peer”) desembocará directamente en un nuevo problema; y es que entonces las páginas de infomed, NO se ven. Los del nodo no dejan acceder a infomed desde afuera porque eso seria jamarse el ancho de vianda por gusto. Simplemente te sale un html sato, diciendo que debes configurar debidamente tu proxy; haciendo una excepción para las direcciones “*.sld.cu”. Pero por suerte, squid tiene un mecanismo para usar multiples proxies. En este caso, con uno solo basta. Veamos de cerca la configuración.

/etc/squid/squid.conf
1
2
3
4
5
6
7
8
# el proxy padre de infomed
cache_peer 201.220.211.7 parent 3128 0 default
cache_peer_domain 201.220.211.7 !.sld.cu

# infomed no sale a travez del proxy
acl sitios_salud dstdomain .sld.cu
always_direct allow sitios_salud
never_direct allow all
Dividido en silabas pa los mentequita, linea por linea.
2 - declaramos el proxy
3 - decimos que atraves de ese proxy, se usara todo lo que NO sea .sld.cu
6 - los sitios de salud, son aquellos que digan “.sld.cu”
7 - los sitios de salud, van directo (sin proxy)
8 - el resto, no se permite directo (van via proxy)

Problema “resolvido”

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.