Archivos Mensuales: abril 2014

Haciendo bien tu trabajo …

Nadie puede negar la voluntad de trabajo de muchísimos venezolanos, el problema es que muchísimas veces (me incluyo) no lo sabemos hacer correctamente, lo cual explica la gran mayoría de los problemas que como país nos acontecen, desde el productivo y competitivo hasta el político-ideológico.

La necesidad es mala consejera, sobre todo cuando se trata de hacer algún trabajo “por la chamba y por los dineritos que me entrarán al hacerlo”, si en la fórmula no se incluye la mística necesaria para no solamente hacer bien nuestro trabajo, sino disfrutarlo, estaremos no solamente perdiendo nuestro tiempo, sino que, si seguimos pensando de manera egoísta, de dejar de hacer perder el tiempo (y un sinfín de cosas más, incluso la vida) a los demás.

Llegando bien a tu destino

Una de las cosas que más cuesta explicar es la labor de taxista en Venezuela, por cosas como la crisis, no solamente veras profesionales tras el volante (y hasta el ex-dueño de una constructora de casas a la que el gobierno jamás le pagó y se declaró en bancarrota), sino que verás gente haciendo la labor únicamente por la necesidad y sin la mística y dedicación necesaria para realizar el trabajo.

Siempre tengo anécdotas encontradas y divergentes acerca de los taxistas, desde el señor mayor que, con un carrito destartalado me llevó desde el Aeropuerto de Barcelona a mi destino y de paso, me esperó a que cenara en una arepera (donde también le brindé la cena y hablamos de su vida, de su anciana esposa muy enferma, lo que lo había llevado a dedicarse a ser taxista, del cómo los “taxistas oficiales” de la línea del aeropuerto no “le daban chance de trabajar” lo ninguneaban y lo relegaban a un rincón bastante alejado del andén principal, etc); pasando por el “taxi pirata” enfrente del C.C. Sambil que me dijo con actitud retrechera “son 150 Bolívares, si quieres no te montas, yo no llevo a nadie de gratis”, al señor de la línea del terminal de la Bandera en Caracas que me pidió permiso para meterse por “unos caminos verdes” para llegar más rápido, valorando así mi tiempo, hasta aquel que te hace perder el tiempo en una cola porque no se quiere desviar, las cosas son tan variopintas y anecdóticas como pudiera imaginarse.

Recordé todo esto hace unos días, tomé un taxi en el centro de Barquisimeto y el hombre, al ver que yo iba hacia el oeste, en vez de tomar la Ribereña, o bueno, tal vez no “desviarse” tanto, tomar la 14 ó la 16; el hombre como si nada permanece inmóvil (y con una cara de obstinación y stress que no se le puede poner peor) en una grandísima cola en la carrera 18 (para el que no lo sabe, el Barquisimeto es poco asiduo de “desviarse” de su ruta, y todos aprendieron a bajar y a subir la ciudad por las mismas calles y carreras), en cada calle que pasábamos le recordaba la “existencia” de la 16, le dije “mire, si nos desviamos acá, salimos a la Escuela Costa Rica, pasamos detrás del ambulatorio y agarramos la carrera 13 frente al San Juan”, el hombre simplemente dijo “ujum”, y siguió aferrado a su volante y mirando la cola, al llegar a la 38 fue igual, “mire, si doblamos acá, podemos agarrar la 14 allá abajo y salimos al parque ayacucho”, el hombre me miró con cara de “¡no me fastidies!” y siguió con actitud de Juan Peña en “El Diente roto” de Pedro Emilio Coll, así fue en cada calle hasta la calle 48, donde dobló, me dejó en mi destino (luego de una hora y cuarto de cola) y al pagarle ni las gracias me dió, es decir, hace más de media hora que me hubiera dejado en mi destino e incluso hubiera tomado ya otra carrera; pero capaz llegará a su casa, cansado y obstinado, peleando con su mujer diciendo “¡coño!, ¡no agarré casi carreras y me mamé unas colas terribles y varios clientes intensos y fastidiosos!” y tratará de preguntarse (sin respuesta obviamente) por qué le va mal en su trabajo …

Tal como el taxista que me llevó de Maiquetía a un hotel en La Guaira y aunque viendo que estaba lloviendo y yo llegaba con más de 90 kilogramos en maletas desde Guatemala; el hombre, a pesar de haberme cobrado *casi* como un pasaje Caracas-Barquisimeto, fue incapaz de estacionarse dentro del Hotel, ayudar a bajar las maletas o siquiera prestarme un paraguas; ¿para qué se dedica a ser taxista si no desea tener la empatía, la mística y el buen trato hacia sus clientes y sólo nos ve como máquinas que le damos dinero para que él mueva un volante y pise un freno y un acelerador? …

Ubicando bien tu negocio

Me encontraba muy temprano en la mañana en el andén del Terminal de pasajeros de Guanare, me pega el hambre y llamo a una señora, que cava en mano, carga pastelitos y empanadas y pasea por todos los andenes del mismo; mientras echo la mirada al horizonte, veo en la cerca perimetral, que queda colindante a un barrio, una joven, con una mesa, una cava con empanadas, una sombrilla, sentada mirando su celular, me pregunté ¿qué diferencia hay entre esa joven y esta señora?, ambas venden empanadas, ambas deben pararse muy temprano a hacer las empanadas y ambas tienen una cava, la diferencia notable es que la joven se sienta enfrente de su casa (no hay muro que evite que ella pueda entrar al terminal de pasajeros) y la señora toma su cavita y pasea por todo el anden, es probable que la señora termine antes que la joven, también es probable que la joven finalice el día más descansada que la señora, ¿quien lo está haciendo bien? …

Como aquella persona que se dedica a vender aceites y lubricantes para motor simplemente poniendo una mesa y un letrero en la puerta de su casa (como si viviera en un lugar extremadamente concurrido lleno de talleres mecánicos y vehículos) , puede que te levantes muy temprano a trabajar, pero no te estás ubicando correctamente, no es lo mismo vender café en la emergencia de un hospital que vender café a la salida de un jardín de niños y escuela primaria (si, he visto ese caso); también es el caso de que se ha fomentado, con exacerbado ahínco, que una persona con una silla, una mesa, una sombrilla, un par de celulares y una cestita llena de caramelos de menta para dar cambio, es un empleado formal muy bien organizado.

Transito informal

Siempre he dicho (con el perdón de los funcionarios), que el trabajo peor ejecutado en Venezuela, es el de los fiscales de tránsito, tal vez son pocos los que “se portan mal”, pero como acá en Venezuela, las cosas que ocurren mal hacen más ruido que las buenas, pues es lo que más se ve y escucha.

Imaginen el caso, Avenida Lara esquina Avenida Bracamonte de Barquisimeto, corredor vial, esquina (y con semáforo), rayado de acera en rojo, zona bancaria (bancos Del Tesoro y Venezuela) y aún así, jamás verás allí un par de fiscales dirigiendo el tráfico y peor aún, verás muchos vehículos estacionados incluso frente a la zona bancaria, incluso si desearan “portarse mal” y *matraquear* a malos conductores, ¡ese sería un paraíso!, sin embargo, lo más que verás será en cualquier otra esquina, un par de conos y ellos parando taxistas pidiendo papeles y “pidiendo para el refresco”.

¿se imaginan cómo serían de transitables nuestras avenidas y calles si cada fiscal “hiciera su trabajo” y ya le hubieran revocado la licencia a más de un multi-infractor loco que anda por las calles?, ¿se imaginan lo práctica que sería Caracas si no cualquiera que tuviera plata, pudiera tener carro y tener licencia con sólo pagar 500 mil sin tener siquiera que hacer examen?, ¿cuanta informalidad más cabrá dentro del rol de fiscal de tránsito, hasta que nos demos cuenta que es gracias a ellos (y culpa de ellos) que sigan en las calles gente que le tranca el paso a una ambulancia, hace doble (y triple) fila en un cruce, se atraviese en la encrucijada luego de comerse el semáforo, o crean que las avenidas son para detenerse y echar cuentos con el motorizado de al lado?.

Política informalizada

En estos últimos quince años, al igual que los taxistas, hemos tenido la más variopinta clase de funcionarios detrás de los organismos, desde veterinarios como Ministros de Salud, hasta filósofos en carteras de economía, acá todo el que quiera “echarle bolas” en un cargo lo hace así no tenga ninguna experiencia en el mismo, ¿las consecuencias?, pues las estamos viviendo ahora.

No estoy en contra de una persona no graduada en algo para poder ejercerlo, pero una cosa sin ecuanón es que debe, “al menos” ser docto, mi amigo Hector Colina podrá ser historiador, pero es un experto del software libre mucho más erúdito que muchos ingenieros graduados de conozco; pero hay graduados en una carrera, que ni en su propia área la pueden ejercer bien.

No hay mejor ejemplo que CONAVI, la Comisión Nacional de la Vivienda, durante 15 meses el arquitecto “y poeta productor de cine” Farruco Sesto, fue su presidente, fue tan funesto su paso por allí que el presidente Hugo Chávez deshizo el organismo luego que su titular admitiera en cadena de radio y televisión que cuando llegó al mismo “no tenía idea alguna de lo que era hacer casas populares” y finalizó su paso en 2009 sin una sola urbanización inaugurada por este organismo, llevando a la “emergencia” que hoy es “La Gran Misión Vivienda Venezuela”.

Es que precisamente la mayoría de las misiones y grandes misiones salieron, de la incapacidad de los organismos titulares de hacer las cosas bien, de hacer su trabajo como es debido.

¿Acaso se necesitaría Misión Saber y Trabajo si los ministerios de comercio e Industria se dedicaran al fomento y creación de empresas con el fin de emplear a toda esa mano de obra desempleada?, ¿necesitaríamos una Misión “En amor mayor”, si el IVSS no fuera una maraña inexpugnable de burocracia e ineptitud?.

Es que la creación de una Misión (estructura informal, adscrita directamente a la presidencia de la república, con presupuesto propio y accionar directo desde el consejo de ministros) es una demostración tácita de que el organismo (y los funcionarios que lo rigen) no están haciendo el trabajo como es debido (o ni siquiera lo están haciendo bien) y es una llamada de alerta para la re-estructuración; pero, con 33 ministerios, varias decenas de vice-ministerios y más de 30 misiones, está más que demostrado que hay mucho político allí que no está haciendo bien su trabajo …

La libertad de no hacerlo

Hay 2 cosas por las que hago mi trabajo, la libertad plena de desenvolverme y por la posibilidad de disfrutarlo; si, como todo el mundo tengo mis carencias y mis necesidades, pero eso no significa que voy a salir a la calle a vender SAINT (no solamente porque sea un software propietario sino porque simplemente no entiendo nada de administración y contabilidad); respeto a los demás, así que tengo la libertad de decir “no” cuando el momento impone hacer algo que o no me gusta o no se hacer; en Venezuela existe la tradición de “tirar flechas”, decir que “se sabe algo” sin saber y luego comienzas a lanzar ideas y teclas como flechas, a ver si pegas alguna.

Por algo, por mucha necesidad que tenga, no me verán instalando servidores Windows 2008, eso se llama “convicción”, y mi abuela me enseñó que las convicciones son los cimientos de la moral  …

 

¿alguna vez se han puesto a pensar cómo sería nuestro país si cada uno hiciera bien su trabajo?

 

Del por qué un desarrollador NO ES un Database Administrator?

O del por qué podría ser, pero debería primero cambiarse la camisa …

Este POST no busca explicar postgreSQL, ni siquiera es un artículo acerca de trucos o buenas prácticas, es simplemente una reflexión acerca de cómo pequeñas cosas que muchos pasan desapercibidas causan impacto profundo en el diseño de una aplicación.

Preámbulo

Tomé un servidor físico GNU/Linux que únicamente ejecutaba una base de datos y lo mudé a una máquina virtual restringida (¡conchale!, hay que ahorrar recursos!, pensé), pensando que todo quedaría bien.

Sin embargo, los usuarios del sistema (en producción) comenzaron a quejarse de lentitud, además, los administradores de sistemas comenzaron a notar excesivos picos de uso de CPU (¿en un equipo que sólo tiene postgreSQL?) e incluso en varias oportunidades se iba a SWAP.

Antes de devolver la base de datos al equipo físico, decidí hacer una revisión (les dije, “no solo monto sistemas, también sé de programación y mucho de base de datos, lo olvidan?”) y estas son las impresiones de la muy breve (pero exitosa) revisión.

El análisis

Lo primero que siempre hago cuando voy a analizar un sistema conectado a postgreSQL, es activar el slow log, esto es, comenzar a medir aquellos queries que consumen más del tiempo que uno supone debería asumir cierto tipo de consulta; paralelamente es daba una clase rápida de postgreSQL, de la importancia de entender el ciclo de parsing/análisis de una consulta SQL y más aún, de la importancia de entender SQL; por ejemplo, dos casos reales extraídos de este caso:

“fecha_inscrito” es un campo VARCHAR, donde almacenan algo como “12/04/2012”; si desean sacar el año, hacen un SPLIT de la cadena con un SUBSTR y sacan el tercer valor luego del “/” … ¿les parece eso correcto?, pues veamos el resultado:

postgres=# SELECT substr(’12/04/2012′, 6);
substr
——–
/2012
(1 fila)
Duración: 61,300 ms

Versus:

postgres=# SELECT EXTRACT(year from ‘2012-04-12’::date);
date_part
———–
2012
(1 fila)
Duración: 0,468 ms

Y comenzaron las alarmas!, 60 milisegundos menos!, pero chamo, a mi no me gusta trabajar con formato ANSI!, y luego les recuerdo que existe la variable de conexión DATESTYLE:

postgres=# SET datestyle to sql;
SET
Duración: 0,124 ms
postgres=# SELECT ‘2012-04-12’::date;
date
————
12/04/2012
(1 fila)
Duración: 0,154 ms

INSOLITO! ¿cómo es posible que una simple función SET cause que todas las fechas salgan con el formato que yo desee?, esto pasa cuando se desconocen los detalles de la base de datos con la que se trabaja.

Igual sucede cuando la gente comprende la diferencia entre usar ON y USING cuando se construyen JOINS (diferencia claro está, a nivel de planificador).

El tercer caso de no-entendimiento de postgreSQL ocurría con un “pseudo-ORM hecho a mano” por los mismos programadores, que no solamente escapaba mal las cadenas:

Esto:

(‘Empresa’, ‘   MATURIN’, ’15/04/2014′, …

No es igual a esto:

(‘Empresa’, ‘MATURIN’, ’15/04/2014′, …

Ya que la cadena ”    MATURIN” no es igual a “MATURIN”, a menos que se haga un TRIM adicional, afectando el performance de la consulta, sino que además, hacen cosas como esta:

’21’, ’32’, ’16’, ‘8’, …

¿Esos son cadenas o números?, luego de ejecutar un DESCRIBE a la tabla, encontramos con que son campos numéricos, y aunque postgreSQL hace la conversión, lanza un WARNING indicando que esos valores son “not integers”, lo cual obviamente no es para nada óptimo.

Esto es lo que pasa cuando los programadores, pensando como programadores, intentan diseñar bases de datos.

El extraño caso del CPU consumido

Me he encontrado con una consulta muy repetida, con esta forma:

SELECT * FROM sol_solvencia WHERE cod_aport = $1 and estatus = $2;

La consulta se repetía muchísimo (sobre todo en temporada de mucho uso de la aplicación web hecha en PHP) y los logs del postgreSQL reportaban que su duración, promedio, era de 550 milisegundos … grité (como gritó Emmet Brown cuando le dijeron que debía alimentar el D’lorean con 1.1Gigawatts) ¡550 milisegundos!, yo en 550 milisegundos corría una nómina y ellos sólo ejecutan un query!.

Luego de usar EXPLAIN ANALYZE nos encontramos con la sorpresa de que la tabla no posee índices de ningún tipo (alegan que es un sistema legado y viene así de informix) y en la actualidad posee unos 98 mil registros; por ende, postgreSQL no le queda de otra para hacer el WHERE que ejecutar un SEQUENTIAL SCAN; o lo que es lo mismo, postgreSQL iteró de manera secuencial por los 98 mil registros para sacar ámbos criterios, ¿en conclusión?, allí se van los 550 milisegundos.

Si el query se ejecuta a un ritmo de hasta 50 veces en un minuto, se imaginan el uso de CPU de postgreSQL para poder mantener ese ritmo.

Indizar, y sino, indizar también …

Luego de construir un par de índices sencillos:

CREATE INDEX idx_sol_solvencia_cod_aport ON sol_solvencia USING btree (cod_aport NULLS FIRST);

Y

CREATE INDEX idx_sol_solvencia_estatus ON sol_solvencia USING btree (cod_estatus);

El EXPLAIN cambia considerablemente:

Aggregate  (cost=32.19..32.20 rows=1 width=4)
  ->  Index Scan using idx_solvencia_fecha on sol_solvencia  (cost=0.00..31.96 rows=94 width=4)
        Index Cond: (fecha_now = ’11-04-2014′::date)
        Filter: ((estado = 1) OR (estado = 15))

Al realizar un escaneo sobre índices y luego una función de agregado sobre ámbos índices, la consulta se ejecuta en 1.7 milisegundos …

¡toda una mejora!, ¿no les parece?

Prepáralo, ponlo para llevar

Luego, les expliqué el concepto del planificador, del GeQo de postgreSQL, y de cómo se analizaban las consultas, luego de ello, les dije “¿y se imaginan que ese tiempo pudiera bajarse más?” … te miran con cara de gallina comiendo sal y tú les muestras PREPARE.

PREPARE genera sentencias preparadas, toma una consulta común, la pasa por el planificador, construye el plan en base a criterios pre-definidos y compila este plan, presto a simplemente recibir los parámetros, ¿y qué ganamos con esto?, ¡ahorrarnos milisegundos valiosos de planificación!.

PREPARE pln_obtenersolvencia (int, varchar) AS
SELECT * FROM sol_solvencia WHERE cod_aport = $1 and estatus = $2;

Como ven, la sentencia preparada es simplemente un QUERY tradicional, al cual hemos pasado sus condiciones (que deben ser criterios, no metadatos) como parámetros, así, postgreSQL puede analizar, planificar y compilar la sentencia y esperar únicamente a que pasemos los parámetros:

EXECUTE pln_obtenersolvencia(682185, 1);

Total runtime: 0.473 ms
(1 filas)

De 1.7 a 0.4 ha sido una mejora interesante, ¿no?.

Conclusiones

No busco “echarme de enemigos” a los desarrolladores, yo también soy uno (de diseñado APIs, frameworks, y módulos en python y PHP), pero, cuando se trata de bases de datos, los desarrolladores deben quitarse los audífonos, la sudadera geek y ponerse en la camisa y anteojos nerd de los DBA; porque al final del día, la aplicación no se está diseñando para yo sentirme cómodo para trabajar con fechas o agregar y agregar campos sin mantener un diccionario de datos simplemente porque me pidieron en un lugar meter el RIF como J310210423 en otro como J-31021042-3 y en otro el tipo de contribuyente por un campo y el código del mismo por otro; no se trata de nuestra comodidad (o de nuestro limitado conocimiento como desarrolladores) sino de la eficiencia y la funcionalidad que deben garantizar que sea el USUARIO FINAL (y sólo él, porque al final, es el que usará todos los días la aplicación) quien disfrute el uso de nuestra aplicación.

Por cierto, como colofón, habrán notado que la tabla se llama “solvencia”, si, es un sistema que genera solvencias al público en general, ahora las consultas duran menos de un milisegundo (y no casi un segundo en cargar) por lo que la mejora impacta a miles de personas que solicitan la solvencia en ese sistema …

… Y ya el CPU no se agota en la máquina virtual! …

 

Instalar openWRT a un TP-LINK WR-741ND

He tomado un viejo enrutador TP-LINK pre-N (150Mbps) que tenía por allí para actualizarle el firmware e instalar openWRT, mis razones de por qué openWRT y no DD-WRT?

tplink

  • Lo que no podés hacer por la interfaz, lo hacés por consola
  • El soporte a VLANs es exactamente igual al nativo en Linux, si aprendí en Linux, lo sé hacer en openWRT
  • Selección: Varios “optware” (módulos opcionales) y mod-hackings presentes para openWRT me son útiles (como soldarle un puerto USB y usarlo como servidor de impresión)

Entre otras cosas, DD-WRT es bastante óptimo en estos equipos para cosas como permitir gestionar la inalámbrica, múltiples SSID (es lo bueno del software libre: elección) pero en mi caso, usaré el equipo para más cosas y por ende openWRT es mi opción.

Actualización del Firmware oficial

Lo primero que debemos hacer es actualizar el firmware oficial de la página de TP-LINK, esto con el fin de evitar inconvenientes y tener un firmware “oficial” de respaldo ante cualquier inconveniente.

or seguridad, actualizar a la última versión de la versión 1 (V1.6 en mi caso).

Descargar cualquier versión v1 del ROM oficial acá:

http://www.tp-link.com/ve/support/download/?model=TL-WR741ND&version=V1

– Descargar y descomprimir:

wget -c http://www.tp-link.com/resources/software/201011814560814.zip

unzip 201011814560814.zip
cd 201011814560814

– Ir a System Tools > Firmware Upgrade y cargar el binario que descargamos (wr741nv1_en_3_12_4_up(100910).bin)

– Reiniciar el equipo y luego un “factory defaults”

downgrade

Listo, actualizado a la última versión “oficial”, pasamos a obtener OpenWRT.

Obtener openWRT

Para obtener openWRT podemos ir a la página oficial del enrutador:

Página oficial: http://wiki.openwrt.org/toh/tp-link/tl-wr741nd

Y aprovechar el WIKI en español que nos ofrecen:

Wiki de openWRT en español: http://wiki.openwrt.org/es/toh/tp-link/tl-wr741nd

Para descargar la última versión estable para el enrutador (Backfire) apuntamos a:

– Descargar la última versión backfire:
http://downloads.openwrt.org/backfire/10.03.1-rc3/ar71xx/openwrt-ar71xx-tl-wr741nd-v1-squashfs-factory.bin

– O con la última versión del trunk:
http://downloads.openwrt.org/snapshots/trunk/ar71xx/openwrt-ar71xx-generic-tl-wr741nd-v1-squashfs-factory.bin

También he descargado la última versión Beta (2014) (versión de actualización):

http://downloads.openwrt.org/attitude_adjustment/12.09/ar71xx/generic/openwrt-ar71xx-generic-tl-wr741nd-v1-squashfs-sysupgrade.bin

Con esto descargado, ahora si procedemos con el enrutador.

Desactivar opciones en el Router

Por seguridad deberíamos cumplir los siguientes criterios:

  • Estar conectados por la red alámbrica
  • Desactivar la red inalámbrica
  • Tener un firmware oficial descargado
  • Energía eléctrica estable (se los aseguro!, lean el último capítulo)

 

Preparando el TP-LINK para instalación

– Conectarse al equipo vía cable (parece obvio, pero hay que recordar que no se puede hacer este procedimiento vía wireless).
– Hacemos un respaldo del mismo (System tools > Backup & Restore > Backup)
– Reiniciamos el equipo a sus valores de fábrica (System Tools > Factory Defaults)
– Entramos al equipo con sus valores por defecto (IP: 192.168.1.1, user:admin, password:admin)
– Deshabilitamos el radio del equipo, para ello:
* vamos a la opción “wireless”
* desmarcan el checkbox “enable wireless radio”
* presionan el botón “SAVE”
* hagan click en el link “reboot” y luego en el botón “reboot”
* vayan a “status” y confirmen que Wireless está DISABLE.

wireless-disableAhora, ya podemos iniciar la instalación de openWRT.

Instalación vía Web

– Vamos a Firmware Upgrade (System Tools > Firmware Upgrade)

firmware-upgrade

Allí escogemos el archivo del firmware openWRT que seleccionamos y le damos “UPGRADE”.

Luego de unos minutos verán:

completed

Y el equipo se reiniciará en openWRT.

Accediendo al openWRT por primera vez

Al encender nuevamente el TP-LINK y conectarnos por red inalámbrica, nos dará una IP de la subred 192.168.1.0; nos conectamos al router a través de http://192.168.1.1/

Nos exigirá asegurar el equipo con una clave:

dd-wrt-first

Y luego de insertar la clave veremos que solicitará que aseguremos el acceso SSH:

no-password

 

Hacemos click en “Go to password configuration”:

Y configuramos la clave del usuario root:

openwrt-first

y el acceso SSH, luego presionan “SAVE & APPLY”:

save-apply

Y ya estamos listos para configurar, o para actualizar a la versión trunk “attitude adjustment”.

Actualizando a una nueva versión

descagar attitude_adjustment: http://downloads.openwrt.org/attitude_adjustment/12.09/ar71xx/generic/openwrt-ar71xx-generic-tl-wr741nd-v1-squashfs-sysupgrade.bin

Para actualizar se puede contar con varios modos, acá explicaré el modo SSH, el modo SCP (failsafe) y el modo Web

Modo Web

El modo web es muy sencillo, simplemente van a SYSTEM > FIRMWARE UPGRADE y cargan la versión de firmware que contenga la palabra “sysupgrade”:

system-flashing-openwrt

Vigilen los LEDs, cuando vean que el equipo esté completamente activado, verán que pierden el acceso Web, es porque hay un par de módulos que se deben activar “a mano” en esta versión de openWRT.

Acceso SSH:

  • Acceden por SSH al equipo 192.168.1.1 con el usuario “root” y la clave que le proporcionaron.

openwrt-ssh

Ejecutan los siguientes comandos:

opkg update
opkg install luci

/etc/init.d/uhttpd start
/etc/init.d/uhttpd enable

Y listo!, ya pueden acceder a la interfaz web.

Actualización via SSH

Podemos acceder vía SSH al TP-LINK y actualizarlo vía SSH

– Con acceso a Internet

Si es con acceso a Internet, simplemente, nos vamos al directorio TMP

root@OpenWrt:~# cd /tmp

Descargamos el FIRWMARE “sysupgrade” necesario:

root@OpenWrt:/tmp# wget -c http://downloads.openwrt.org/snapshots/trunk/ar71xx/openwrt-ar71xx-generic-tl-wr741nd-v1-squashfs-sysupgrade.bin
Connecting to downloads.openwrt.org (78.24.191.177:80)
openwrt-ar71xx-gener 100% |*****************************************************************************************************| 2880k 0:00:00 ETA

Ejecutar la actualización:

root@OpenWrt:/tmp# sysupgrade -v /tmp/openwrt-ar71xx-generic-tl-wr741nd-v1-squashfs-sysupgrade.bin

Upgrade completed
Rebooting system…

Al finalizar el reboot, hacer un “cold reset” (desconectar la energía, esperar 10 segundos y reconectar).

Volver a conectarse vía SSH y activar la interfaz web:

opkg update
opkg install luci
/etc/init.d/uhttpd start
/etc/init.d/uhttpd enable

– Sin acceso a Internet

Si no cuentan con Internet, pero el firmware lo han descargado a un equipo al que están conectados alámbricamente entonces usan SCP para copiarlo a /tmp en el TP-LINK

root@OpenWRT:/tmp# scp -P 22 root@192.168.1.2:/home/jesuslara/Descargas/openwrt/openwrt-ar71xx-tl-wr741nd-v1-squashfs-factory.bin .
Host ‘192.168.1.2’ is not in the trusted hosts file.
(ssh-rsa fingerprint md5 81:05:23:57:67:f5:bd:79:8a:08:2b:d9:eb:14:aa:00)
Do you want to continue connecting? (y/n) yes
root@192.168.1.2’s password:
openwrt-ar71xx-tl-wr741nd-v1-squashfs-factory.bin 100% 3840KB 768.0KB/s 00:05

Y actualizamos:

root@openWRT:/tmp# sysupgrade -v /tmp/openwrt-ar71xx-tl-wr741nd-v1-squashfs-factory.bin
Saving config files…
etc/sysctl.conf
etc/shells
etc/rc.local
etc/profile
etc/passwd
etc/inittab
etc/hosts
etc/group
etc/dropbear/dropbear_rsa_host_key
etc/dropbear/dropbear_dss_host_key
etc/config/system
etc/config/firewall
etc/config/dropbear
etc/config/dhcp
killall: watchdog: no process killed
Failed to connect to ubus
Switching to ramdisk…
Performing system upgrade…
Unlocking firmware …
Writing from <stdin> to firmware … [w]
Upgrade completed
Rebooting system…
Connection closed by foreign host.

Igual que los anteriores, actualizamos el opkg update y accedemos vía web.

Modo Failsafe

El modo “failsafe” es un modo busybox que es útil para recuperación, incluso en modos cuando ningún acceso es posible, en los TP-LINK el modo FAILSAFE se logra de la siguiente manera:

  • Desconectar cualquier cable de red que se tenga conectado
  • Desconectar de la corriente, esperar 10 segundos
  • Volver a conectar, observando los LEDs
  • Cuando el LED “SYS” comienza a parpadear y antes de quedar fijo, presionar varias veces el botón QSS
  • El LED “SYS” comenzará a parpadear muy rápidamente “Flash-blinking”, están en modo FAILSAFE

Para conectarse al modo FAILSAFE, deberán configurar manualmente su interfaz eth0 a la subred 192.168.1.0, yo en Debian ejecuté:

  • Desactivé el network-manager (service network-manager stop)
  • ifconfig eth0 up && ifconfig eth0 192.168.1.2 netmask 255.255.255.0

Y nos conectamos vía Telnet:

root@tafil:~# telnet 192.168.1.1
Trying 192.168.1.1…
Connected to 192.168.1.1.
Escape character is ‘^]’.

=== IMPORTANT ============================
 Use 'passwd' to set your login password
 this will disable telnet and enable SSH
 ------------------------------------------
BusyBox v1.19.4 (2014-04-23 10:39:15 UTC) built-in shell (ash)
Enter 'help' for a list of built-in commands.
_______ ________ __
 | |.-----.-----.-----.| | | |.----.| |_
 | - || _ | -__| || | | || _|| _|
 |_______|| __|_____|__|__||________||__| |____|
 |__| W I R E L E S S F R E E D O M
 -----------------------------------------------------
 BARRIER BREAKER (Bleeding Edge, r40555)
 -----------------------------------------------------
 * 1/2 oz Galliano Pour all ingredients into
 * 4 oz cold Coffee an irish coffee mug filled
 * 1 1/2 oz Dark Rum with crushed ice. Stir.
 * 2 tsp. Creme de Cacao
 -----------------------------------------------------

A partir de acá, la actualización procederá igual al modo SSH con o sin Internet.

Acceso Web a la versión trunk

Por seguridad, al actualizar, openWRT les exigirá reconfigurar la clave y el acceso SSH (con su nueva interfaz):

password-openwrt-2

y SSH:

ssh-openwrt-2

Luego, ya podemos configurar la inalámbrica:

configure-wifi

Y listo!, en próxima entrega otros experimentos! …

PD: ¿Y el modo recovery?

Cuando me encontraba experimentando con las diversas versiones y hacks de openWRT (Gargoyle, “attitude adjustment”, etc) durante un proceso de upgrade hubo un bajón de electricidad (bueno, técnicamente se fue la luz en mi casa) y el TP-LINK había quedado en un estado “BRICK” (un gran ladrillo), con el botón SYS completamente colgado. Es allí cuando el modo “recovery” entra en operación.

Para ello, accedemos vía telnet tal como expliqué, no sin antes borrar todo en la memoria existente:

Primero, ejecutamos “firstboot”

root@(none):/# firstboot

This will erase all settings and remove any installed packages. Are you sure? [N/y]
y
/dev/mtdblock3 is not mounted, erasing it
erasing 0 10000
erasing 10000 10000
erasing 20000 10000
erasing 30000 10000
erasing 40000 10000
erasing 50000 10000
erasing 60000 10000
erasing 70000 10000
erasing 80000 10000
erasing 90000 10000
erasing a0000 10000
erasing b0000 10000
erasing c0000 10000
erasing d0000 10000
erasing e0000 10000
erasing f0000 10000
root@(none):/#

Cambiamos al directorio TMP

root@(none):/# cd /tmp

Luego, usamos SCP para copiar un firmware COMPLETO (no un sysupgrade) a /TMP:

root@(none):/tmp# scp -P 22 root@192.168.1.2:/home/jesuslara/Descargas/openwrt/openwrt-ar71xx-tl-wr741nd-v1-squashfs-factory.bin .

/usr/bin/dbclient: Warning: failed creating /root/.ssh: Read-only file system

Host ‘192.168.1.2’ is not in the trusted hosts file.
(ssh-rsa fingerprint md5 81:05:23:57:67:f5:bd:79:8a:08:2b:d9:eb:14:aa:00)
Do you want to continue connecting? (y/n) yes
root@192.168.1.2’s password:
openwrt-ar71xx-tl-wr741nd-v1-squashfs-factory.bin 100% 3840KB 768.0KB/s 00:05

Y lo cargamos con sysupgrade:

root@(none):/tmp# sysupgrade -v /tmp/openwrt-ar71xx-tl-wr741nd-v1-squashfs-factory.bin
Saving config files…
etc/sysctl.conf
etc/shells
etc/rc.local
etc/profile
etc/passwd
etc/inittab
etc/hosts
etc/group
etc/dropbear/dropbear_rsa_host_key
etc/dropbear/dropbear_dss_host_key
etc/config/system
etc/config/firewall
etc/config/dropbear
etc/config/dhcp
killall: watchdog: no process killed
Failed to connect to ubus
Switching to ramdisk…
Performing system upgrade…
Unlocking firmware …

Writing from <stdin> to firmware … [w]

Upgrade completed
Rebooting system…
Connection closed by foreign host.

El equipo “volverá a la vida” después de eso, de no ser así, podrían montar un TFTP y cargar el firmaware, usar MTD o incluso podrían fabricarse un cable USB-to-SERIAL para conectarse al TP-LINK (requiere algo de experiencia y soldadura!).

Incluso, podríamos usar el modo FAILSAFE para devolver el equipo a un firmware STOCK.

¿Qué más?

OpenWRT es bastante completo, lástima que su interfaz no sea “tan elaborada” como la de DD-WRT, sin embargo, tiene mucho más desarrollo (la versión TRUNK de mi TP-LINK es de Marzo de este año), por lo que sirve para tener cosas tan avanzadas como un kernel 3.3 o soporte a openFlow y openVswitch, entre otras.

En próximo artículo, VLANS y múltiples SSID.

 

¿Y DD-WRT?, si, también lo instalé en el TP-LINK, la forma de instalación es muy semejante … comenta si deseas que haga un artículo.

Happy Hacking!

 

 

 

A %d blogueros les gusta esto: