Encender y apagar la wifi de nuestro router A4001N utilizando el botón de reset/wps | Algo de Linux

jueves, 22 de octubre de 2015

Encender y apagar la wifi de nuestro router A4001N utilizando el botón de reset/wps

Si echáis un vistazo al siguiente howto, veréis que es muy sencillo asignar funciones a los botones de nuestro router wifi con OpenWRT:
http://wiki.openwrt.org/doc/howto/hardware.button

Para este post, he utilizado un A4001N, pero es perfectamente aplicable a otros routers con OpenWRT.
La idea es que podamos apagar el wifi si mantenemos presionado el botón de reset/wps durante un intervalo de tiempo y volver a encenderlo de nuevo del mismo modo.

Vamos a hacer todo ésto desde la línea de comandos, así que nos conectamos al router mediante ssh.

Una vez conectados, lo primero que tenemos que hacer es identificar los botones.  Para ello, creamos una carpeta en el directorio /etc/hotplug.d a la que llamaremos button:
# mkdir /etc/hotplug.d/button
Dentro de esa carpeta creamos un script al que podemos llamar buttons, por ejemplo, con el siguiente contenido:
/etc/hotplug.d/button/buttons
#!/bin/sh
logger the button was $BUTTON and the action was $ACTION
El script lo que hará será crear una entrada en el registro de logs con un mensaje que nos informa del botón que pulsó y la acción que se realizó.

Una vez lo hayamos guardado, pulsamos un botón (en nuestro caso hemos dicho que el botón de reset/wps, que por cierto, es el único que tiene nuestro router además del botón de apagado) y lo soltamos.

A continuación leemos los logs utilizando el comando logread:
# logread
Y entre los muchos mensajes de log, veremos algunos como los siguientes:
Thu Oct 22 20:30:37 2015 user.notice root: the button was wps and the action was pressed
Thu Oct 22 20:30:38 2015 user.notice root: the button was wps and the action was released
Que nos informa de dos cosas:
  • El botón llamando "wps" fué pulsado "presed".
  • El botón llamando "wps" fué soltado "released".
Pues bien. Con ésto ya hemos identificado el nombre del botón (wps) y sus dos acciones: "pressed" y "released".

El siguiente paso que daremos, una vez identificado el botón, será descargarnos un script que va a gestionar las acciones que se deben realizar cuando el botón se haya pulsado durante un intervalo de tiempo. Y lo vamos a descargar directamente en el router usando wget, así que si no tenéis instalado wget, lo instaláis:
# opkg update && opkg install wget
Una vez instalado wget, lo ejecutamos para que descargue el script 00-button y lo coloque en el directorio /etc/hotplug.d/button/ directamente:
# wget --no-check-certificate -O /etc/hotplug.d/button/00-button https://dev.openwrt.org/export/36332/trunk/target/linux/atheros/base-files/etc/hotplug.d/button/00-button
Y le damos permisos de ejecución:
# chmod 755 /etc/hotplug.d/button/00-button
Este script contiene el siguiente código:
. /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
Ahora que ya tenemos el script en su sitio, podemos crear configuraciones para ejecutar diferentes acciones en función del tiempo que el usuario deje pulsado el botón. 
Las configuraciones de los botones se almacenan en el mismo fichero que las configuraciones de los leds, es decir, en el archivo /etc/config/system. Así que editamos este fichero y le añadimos lo siguiente:
config button
        option button   wps
        option action   released
        option handler  "/usr/bin/wifionoff"
        option min      0
        option max      3
La configuración que estamos realizando se entiende por sí sola: Estamos definiendo un botón cuyo nombre es wps y la acción que se debe realizar (ejecutar el script /usr/bin/wifionoff) al soltar el botón cuando se haya pulsado durante un tiempo entre 0 y 3 segundos.

Por último, no nos queda más que crear el script /usr/bin/wifionoff, que se encargará de conmutar entre los estados de encendido y apagado del router:
#!/bin/sh
SW=$(uci -q get wireless.@wifi-device[0].disabled)
[ "$SW" == "1" ] && uci set wireless.@wifi-device[0].disabled=0
[ "$SW" == "1" ] || uci set wireless.@wifi-device[0].disabled=1
wifi
Si ahora quisiéramos hacer que el router se resetease a los valores por defecto al pulsar el mismo botón durante un tiempo de entre 20 y 25 segundos, añadiríamos la siguiente configuración al fichero /etc/config/system:
config button
        option button   wps
        option action   released
        option handler  "firstboot && reboot"
        option min      20
        option max      25
De este modo, podríamos configurar diferentes acciones dependiendo del intervalo de tiempo que se esté pulsando el botón.
Publicado por primera vez en http://enavas.blogspot.com.es