¿Como puedo programar un botón de mi router con OpenWRT?
En la necesidad de modernizar diferentes industrias del país, Juan Perón
invitó a un número de personalidades de la técnica, que estableciendo
vínculos con la Argentina, pudieron mejorar los prospectos de la
industria. De entre las enseñanzas, guardamos aquella de cómo programar
los botones de nuestro router a través del firmware OpenWRT para darle
nuevos usos.

(...)
Muchas veces me preguntaron porqué traje a los hombres de ciencia de un
país derrotado a nuestro Vergel de Paz. Pero la respuesta era simple:
los científicos Alemanes nos enseñaron los rudimentos de ciencia en la
que nuestros hombres atrasaban, y nos permitieron afianzar la industria
del país en un camino de grandeza como lo han tenido las Grandes
Naciones del Tierra.


Todo lo que hemos aprendido ha sido bueno, y de lo que no hemos sacado
rédito instantáneo, lo hemos hecho al tiempo. Así es como ha de lograrse
un verdadero progreso. En ocasiones, nos hemos valido de la
improvisación para encontrar un uso a la técnica y utillaje que siquiera
sus creadores preveían.

La industria mecánica de Córdoba es un claro ejemplo, con su rastrojero
iniciado a partir de utillaje aeronáutico y de circunstancias. Si este
ejemplo puede encontrarse en el desarrollo de la industria pesada, cómo
no va a haberlo en la telemática. Encontraremos ejemplos en lo que algo
pensado para una cosa, termina siendo mejor aplicado para otra.

La mayoría de los enruteadores modernos disponen de un botón nomenclado
como WPS. Dicho botón activa una funcionalidad telemática capaz de
"asociar" un dispositivo Wifi a nuestra red local inalámbrica cifrada
con contraseña sin necesidad de compartir la clave. Explicado de manera
sencilla, al presionar el botón se dará inicio a una ventana de tiempo
de dos minutos, durante el cual el router - en confianza - asociará a
cualquier dispositivo Wifi en el que también se presione dicho botón.
Una vez transcurrido los dos minutos, volverá a cifrarse y cerrarse la
red inalámbrica.
La idea original estaba bien intencionada. Sin embargo, muchas cosas
malas pueden hacerse en dos minutos, y si lo sabrá su madre. Nada impide
que durante dicha ventana temporal, usuarios malévolos en las cercanías
puedan asociarse a la red sin que tuviésemos maneras obvias de saberlo.
Por lo tanto, la funcionalidad WPS - en lugar de hacer la vida más fácil
al Pueblo - terminó perjudicándolo y llevándole inseguridad por partes
iguales...

Pues bien, en tratados anteriores he relatado a la Masa que muchos
routers (como por ejemplo, el TP-Link TL-WR941ND peronista) pueden ser
dotados de un firmware libre que reemplaza al limitado programa interno
original. He explicado como instalar dicho firmware libre OpenWRT en
nuestro router y cómo configurarlo para hacer de él una potente máquina
multifunción. ¡Lo hemos dicho! En vista de las mencionadas deficiencias
con el sistema de asociación WPS, el firmware libre OpenWRT no usa esta
característica, y ello significará que el botón WPS del router
(nomenclado como "QSS" en los routers TP-Link) quedará "como cenicero de
Pochoneta".

Sin embargo, gracias al Justicialismo y a nuestra doctrina de Software
Libre, nos será bien posible utilizar el botón QSS para realizar otras
acciones que nos plazcan, si sabemos configurarlo. Podremos programar el
botón WPS/QSS para que nos sirva para apagar o encender el radioemisor
de Wifi (y por lo tanto, de la red inalámbrica). Esto presenta algunas
ventajas: podríamos dejar el router encendido 24x7 realizando tareas de
enrutamiento por cable, servicio de correo, o un mini-servidor web, etc,
pero decidir apagar el Wifi cuando no estamos en el hogar, o apagarlo de
forma manual cuando nadie lo vaya a utilizar, o apagarlo automáticamente
siguiendo un patrón de horarios.


Naturalmente que en primer lugar, debemos tener ya instalado y
configurado OpenWRT en nuestro aparato (en este caso tomaré como
referencia el TP-Link TL-WR941ND). Hemos de notar también que por la
característica de esta tarea, nos convendrá conectarnos al router de
manera cableada.

Acto seguido, será útil asegurarnos de que el botón QSS del router
funciona, y conocer en particular cuál es su "nombre de hardware".

Para ello nos logueamos al router como se ha explicado en otros tratados
(normalmente con ssh root@dirección_ip_del_router). Una vez dentro del
router (el prompt podría indicar root@OpenWrt o similar) crearemos una
carpeta donde irán las rutinas autoejecutables para los botones. Lo
haremos ingresando en el router,:

mkdir -p /etc/hotplug.d/button

Ahora usaremos el editor peronista Vi para crear un archivo llamado
buttons en dicho directorio, con el comando:

vi /etc/hotplug.d/button/buttons

Es importante conocer bien el funcionamiento del editor, para ser
práctico a la hora de configurar el router. El editor Vi normalmente
opera en modo revisión, por lo cual no podremos modificar ni agregar
ningún texto. Para pasar al modo de inserción de texto hemos de
presionar la tecla i. Solo entonces podremos escribir o pegar en la
Terminal el texto que querramos. En este caso, hemos de pegar allí el
siguiente código, pensado para evaluar el funcionamiento de los botones
del router:

#!/bin/sh
# Script para que los botones reporten sus acciones.
logger el boton $BUTTON reporta accion $ACTION

Para guardar los cambios en el archivo recién editado en Vi, hemos de
presionar Esc, y tipear el comando :wq que se encargará de grabar (w) y
salir (q) del editor. Nos devolverá a la línea de comandos del router.

Conforme estemos en el prompt de nuestro enruteador, habremos de evaluar
el botón correspondiente: en el caso del TP-Link TL-WR941ND presionamos
el botón "QSS" que se encuentra en la derecha del panel frontal (es el
único botón).
Hecho esto, en la terminal del router ejecutaremos el comando:

logread

..y nos devolverá un largo archivo, el cual al final debería indicarnos
final algo como:

user.notice root: el boton wps reporta accion pressed
user.notice root: el boton wps reporta accion released

Esta información recabada es importante pues nos confirma el nombre de
hardware del botón QSS, que en realidad es "wps", y los estadíos que
puede tomar dicho botón de software: "pressed" (presionado) y "released"
(soltado).

Sabiendo esto, agregaremos dos archivos nuevos para configurarlo. Unos
es el archivo /etc/hotplug.d/button/00-button, que configura el
funcionamiento general de los botones, y otro es el que especificará el
funcionamiento particular el botón QSS. Para ello los agregamos con Vi:

vi /etc/hotplug.d/button/00-button

Una vez en el editor, presionamos i e insertamos el siguiente código:

#!/bin/sh
/lib/functions.sh
do_button () {
       local button
       local action
       local handler
       local min
       local max

       config_get button $1 button
       config_get action $1 action
       config_get handler $1 handler
       config_get min $1 min
       config_get max $1 max

       [ "$ACTION" = "$action" -a "$BUTTON" = "$button" -a -n
"$handler" ] && {
               [ -z "$min" -o -z "$max" ] && eval $handler
               [ -n "$min" -a -n "$max" ] && {
                       [ $min -le $SEEN -a $max -ge $SEEN ] && eval
$handler
               }
       }
}

config_load system
config_foreach do_button button


Guardamos los cambios y salimos de Vi con Esc + :wq.


Acto seguido, agregaremos la especificación de funcionamiento del botón
QSS en el fichero configuración correspondiente, que es
/etc/config/system. Para ello ingresamos el comando:

vi /etc/config/system

Las especificaciones de funcionamiento del botón QSS/WPS será la de
apagar el emisor Wifi y la red inalámbrica al presionarlo brevemente
(durante menos de un segundo). Si lo presionamos entre uno y cinco
segundos, encenderá el Wifi y la red inalámbrica. Considerando esto, en
Vi pasamos al modo inserción con la tecla i, y al final del archivo
/etc/config/system, habremos de agregarle las siguientes lineas de
configuración:

# Agregado al archivo /etc/config/system
# para configurar el botón OSS/WPS del Router TP-Link
# Esto apaga el emisor Wifi y la red inalámbrica
# al presionar el boton QSS/WPS menos de 1 segundo.
config button
   option button 'wps'
   option action 'released'
   option handler 'uci set wireless.@wifi-device[0].disabled=1 && wifi'
   option min '0'
   option max '1'

# Esto enciende el emisor Wifi y la red inalámbrica
# si se presiona el boton QSS/WPS entre 1 y 5 segundos.
config button
   option button 'wps'
   option action 'released'
   option handler 'uci set wireless.@wifi-device[0].disabled=0 && wifi'
   option min '1'
   option max '5'


..guardamos los cambios y salimos del editor Vi con la consabida
combinación de teclas Esc + :wq

Para probar los cambios, debemos reiniciar el router con:

reboot

Una vez que el router se reinicie, debemos presionar y soltar el botón
QSS durante menos de un segundo, y se apagará el Wifi (podremos
comprobarlo al comprobar el apagado de la luz "WLAN" del panel frontal
del router. Para reencender el Wifi, debemos presionar el botón QSS
entre 1 y 5 segundos (se encenderá la luz WLAN y podremos conectarnos
inalámbricamente).

Configurar el encendido / apagado del Wifi a un horario determinado:

Hemos mencionado la potencia y versatilidad que nos permiten los scripts
de Cron para activar o desactivar el Wifi en horarios particulares. Por
ejemplo, supongamos que según nuestros horarios de trabajo y sueño nos
conviene que el Wifi se apague automáticamente a la 23:30PM y se
encienda a diana, a las 6:30 AM durante los días de semana.

Para ello será necesario crear dos scripts ejecutables, uno para
encender el Wifi y otro para apagarlo, y programar el cronómetro del
router (cron). Todo ello lo haremos también desde la terminal del
router. Una vez logueados en él, podremos ingresar:

vi /root/wifioff

..presionamos i y le pegamos el siguiente código

#!/bin/sh
# Apaga la WLAN (sin detener el dispositivo de emision radio0)
wifi down

Una vez guardado el fichero y salido del editor (Esc + :wq),
utilizaremos el siguiente comando para crear el archivo de encendido:


vi /root/wifion

..y nuevamente usamos i para pegarle su código correspondiente que
figura a continuación:

#!/bin/sh
# Enciende la WLAN (sin detener el dispositivo de emision radio0)
wifi on

Guardamos y salimos con Esc + :wq


Conforme hayamos ingresado ambos archivos, nos será imprescindible
otorgarles permisos de ejecución para que dichos guiones puedan
utilizarse. Lo haremos con el comando:

chmod +x wifionoff wifion wifioff

Ahora podremos programar el cronómetro de ejecución (cron). Esto se hace
por medio de una tabla de texto (crontab), modificando el archivo
/etc/crontabs/root. Para hacer la tabla crontab editamos el archivo
referenciado usando Vi, con el comando:

vi /etc/crontabs/root

..presionamos i para configurar al siguiente texto al final del
archivo:

# Ejecuta este script wifioff todos los dias
# a las 23:30pm
30 23 * * * /root/wifioff
# ejecuta el script wifion a las 06:30am
# a las 6:30am
30 06 * * * /root/wifion

..guardamos la tabla de cron recién creada con Esc + :wq y al volver al
prompt del router, debemos ejecutar el comando reboot para que surta
efecto. Veremos que con ello el Wifi se apagará automáticamente a las
23:30 y se encenderá a las 06:30. Si necesitásemos encenderlo durante
ese horario, bien podríamos presionar el botón del aparato durante 1 y 5
segundos para activarlo.


Podría ser que en determinadas ocasiones necesitemos un script distinto,
que  si el Wifi está encendido lo apague, y si está apagado, lo
encienda. Para ello, debemos ingresar el siguiente script:

vi /root/wifionoff

y le pegamos el siguiente código:

#!/bin/sh
STATEFILE="/tmp/wifionoff.state"

if [ $# -eq 1 ]; then
 case $1 in
   "up"|"on")
     STATE=off
     ;;
   "down"|"off")
     STATE=on
     ;;
 esac
else
 if [ ! -e ${STATEFILE} ]; then
   STATE=on
 else
   . ${STATEFILE}
 fi
fi
if [ -z ${STATE} ]; then
 STATE=on
fi

if [ ${STATE} == "on" ]; then
 /sbin/wifi down
 STATE=off
else
 /sbin/wifi up
 STATE=on
fi

echo "STATE=${STATE}" > ${STATEFILE}

Guardamos y salimos del editor Vi con Esc + :wq.