miércoles, 9 de septiembre de 2015

¿Cómo puedo ejecutar programas en OpenWRT?

¡Trabajadores!

Como verdaderos apóstoles, hemos de instalar software libre en todos los dispositivos que tengamos a mano. Solo así nos aseguraremos de transitar la real senda de la Liberación.

He comentado ya del caso del router TP Link WR491ND y de su firmware de control alternativo y abierto OpenWRT. Gracias a el nuestro router dejará de ser un dispositivo bobo, y pasará a convertirse en un verdadero router peronista capaz de correr otras aplicaciones. OpenWRT es un firmware abierto, pensado para controlar enrutadores. Como tal, es un sistema operativo que convierte a nuestro router en una computadora de pequeñas dimensiones y potencia reducida, pero programable para conducir efectivamente una serie de tareas.

Por medio de OpenWRT y un router compatible, podremos crear un servidor de archivos, servidores pequeños de correo de status, controlar en horarios determinados dispositivos electrónicos a través de interfaces seriales, USB, o Ethernet.

Con un poco de dificultad, se pueden programar entonces dispositivos controlados a partir del router, como por ejemplo, aspersores que trabajen a horario, unidades de medición del clima que lean las condiciones de temperatura y humedad y la transmitan por internet, podremos controlar cámaras de seguridad, relays que enciendan luces, abran o cierren portones eléctricos, enciendan bombas o motores eléctricos, o con más software libre podremos convertir nuestro router en un dispositivo de transmisión de medios (fotos, audio e incluso video) para operar dentro de la red local, y muchso etcéteras

Sin embargo, no necesitamos tanta dificultad, aún así podremos desarrollar nuestras propias "aplicaciones caseras" por medio de código Ash. Dicho código comprende comandos y condicionales, de manera de poder realizar ciertas acciones útiles, con poco ingenio y habilidad.

Es importante si bien los guiones los almacenaremos dentro del directorio /root del router, los mismos han de concentrarse en operar dentro del directorio /tmp/ del router, ya que el mismo es la memoria RAM volátil. Esto es así pues los routers disponen de muy poco espacio físico (un chip EEPROM de 4 megabytes, y raramente más).

Para disponer nuestros scripts, crearemos dentro del router un directorio a tal efecto:

mkdir /root/scripts/
Por ejemplo, si nuestro proveedor nos da IP dinámica y quisiéramos saber cuáles nuestra dirección IP de salida actual para montar un servidor de juego o por cualquier motivo, podríamos crear un script que lo haga.

Para ello, hemos de utilizar siempre el básico editor Vi. Se trata de un editor mínimo incorporado dentro del router. Para editar texto debemos llamarlo con vi nombredelarchivo.

En este caso podriamos hacer:

vi /root/scripts/decimelaip

Presionamos i para entrar al modo edición, y le pegamos el siguiente código peronista:

#!/bin/sh
# Scropt decimelaip Informa la IP de salida.
rm -f /tmp/log/ipactual.log
wget -q http://ipecho.net/plain -O /tmp/log/ipactual.log
echo La direccion IP actual de salida a internet es:
echo '' >> /tmp/log/ipactual.log
cat /tmp/log/ipactual.log


Para guardar el archivo y abandonar el editor, debemos presionar Esc y escribir :wq seguido de Enter.

Ahora podremos darle permisos de ejecución con:

chmod +x /root/scripts/decimelaip

y ejecutarlo con:

sh ~/scripts/decimelaip
 
También podríamos configurar un script que revise por medio de un ping a google.com, para saber si hay conexión WAN (al cablemódem), y si no la encuentra, que reinicie el router. Este microprograma puede ser útil para una tarea de administración remota.

Para ello editaríamos el archivo:

vi /root/scripts/pingreset

Activamos el modo de edición con i y le pegamos el siguiente código:

#!/bin/sh
# Programa para probar la conexion o resetear.
if ping -c 1 google.com > /dev/null ; then
echo "Todo OK, el cliente funciona y no necesita reiniciarse"
pingfail=0
else
 pingfail=$(($pingfail+1))
echo $pingfail " ping fracasados"
if [ $pingfail -gt 10 ];
then
echo "mas de 10 ping a google fracasados. RESETEANDO EL ROUTER!!"
reboot
fi
fi


Luego guardamos y salimos con Esc +:wq, y le damos permisos de ejecución con:

chmod +x /root/scripts/pingreset

Podremos ejecutarlo con:

sh ~/scripts/pingreset

Un script que conviene tener en el directorio root de nuestro router es uno que active o desactive la red wifi. Para ello editamos:

vi ~/wifionoff

Se abrirá el editor Vi con el archivo en blanco. Presionamos i y le insertamos el siguiente código:

#!/bin/sh
# Crea un archivo con el registro de estado del Wifi (on u off)
# Si el wifi está on lo apaga, si está off lo enciende.

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}


Una vez realizado esto, podremos darle permiso con:

chmod +x /root/wifionoff

Con este archivo creado, podremos ahora apagar o encender el wifi con dicho comando (siempre que estemos conectados por cable, claro está).

En vista de dicho archivo y si por algún motivo necesitásemos reiniciar solamente la red inalámbrica, pero queremos hacerlo estando conectados por wifi, podremos crear un script a tal efecto.

Para ello ingresamos

vi /root/scripts/resetearwifi

Y le pegamos el siguiente código:

#!/bin/sh
#Programa para resetear el wifi estando conectado por wifi
# requiere script wifionoff en /root/
cd /root/
./wifionoff && ./wifionoff


Lo guardamos y salimos con Esc + :wq, y le asignamos permisos de escritura con chmod + /root/scripts/resetearwifi.

En el caso de necesitar scripts puros para encender o apagar el wifi (por ejemplo, para utilizarlos a través de una orden cronometrada Cron, y activar o desactivar el wifi en determinadas horas del día), podremos utilizar Vi para incorporar dos archivos:

Un archivo /root/script/wifion que contenga el siguiente código:

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


...y un archivo /root/script/wifioff que contenga el siguiente código:


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



Es siempre útil contar con un script que nos presente el status del router. Para ello podremos crear con Vi un archivo /root/status e insertarle el código:

#!/bin/sh
# Programa que devuelve datos de estado del router
date
uptime
echo Detalle de las Conexiones del router
ifconfig
echo Direcciones IP cedidas por DHCP
cat /tmp/dhcp.leases
rm -f /tmp/log/ipactual.log
wget -q http://ipecho.net/plain -O /tmp/log/ipactual.log
echo '' >> /tmp/log/ipactual.log
echo La dirección IP actual de salida a internet es:
cat /tmp/log/ipactual.log


Guardamos el archivo con Esc + :wq y le damos permisos de ejecución con chmod +x /root/status.

Para ejecutarlo, podremos utilizar el comando ./status o sh /root/status.

Podremos crear otro programa de información aún mas detallado con facilidad. Por ejemplo, podríamos escribir un guion llamado /root/scripts/info con el siguiente contenido:

#scripts para detalles
echo INFORMACION DEL ROUTER - presione q para salir > /tmp/log/info
echo Dispositivo >> /tmp/log/info
cat /tmp/sysinfo/model >> /tmp/log/info
cat /proc/version >> /tmp/log/info
uname -mnrs >> /tmp/log/info
cd /tmp/
rm -f /tmp/log/ipactual.log
wget -q http://ipecho.net/plain -O /tmp/log/ipactual.log
echo '' >> /tmp/log/ipactual.log
echo La IP actual de salida a Internet es >> /tmp/log/info
cat /tmp/log/ipactual.log >> /tmp/log/info
echo INFORMACION DE LA CPU DEL ROUTER >> /tmp/log/info
cat /proc/cpuinfo >> /tmp/log/info

echo '' >> /tmp/log/info
echo ESTADO DE LA MEMORIA >> /tmp/log/info
cat /proc/meminfo >> /tmp/log/info

echo '' >> /tmp/log/info
echo MODULOS CARGADOS EN MEMORIA >> /tmp/log/info
cat /proc/modules >> /tmp/log/info

echo '' >> /tmp/log/info
echo DMESG DEL ROUTER >> /tmp/log/info
dmesg >> /tmp/log/info

echo '' >> /tmp/log/info
echo LOG INTERNO DEL APARATO >> /tmp/log/info
logread >> /tmp/log/info

echo '' >> /tmp/log/info
echo Generando archivo nuevo en tmp/log/info
cat /tmp/log/info | less
# Comentar para que no elimine el archivo al terminal el proceso:
rm /tmp/log/info


Con ello, al darle permisos de ejecución y ejecutar el script, nos devolverá una gran cantidad de información de status, en un paginador con le cual podremos movernos usando las flechas del cursor.
Para cerrar el paginador, debemos presionar q.

Red de invitados
En mi residencia de Puerta de Hierro dispongo de un único router que utilizo para mis quehaceres, pero en ocasiones debo montar el wifi para que mis invitados puedan utilizar sus dispositivos móviles. Es verdad que existen configuraciones específicas para el tema que nos aislan la red wifi de la red local, pero en mi caso no lo considero necesario de momento, por lo que simplemente dispongo una red wifi con una clave simple, diferente a la utilizada regularmente.

En tal caso, podremos preveer dos scripts que cambien la configuración de la red, y la activen. Cada uno de ellos depende de distintos archivos de parámetros generales.

En OpenWRT la red inalámbrica se configura a través del archivo /etc/config/wireless, el cual delimita las opciones de la red wifi, entre ellas el nombre de red (ssid) y la contraseña (key).

Para el funcionamiento adecuado crearé dos archivos de configuración. En el archivo /etc/config/wireless.normal indicaremos nuestros datos normales de la red, incluyendo su nombre de red y su contraseña. Por ejemplo, indicaré:

# configuracion de la red Wifi normal
config wifi-device 'radio0'
    option type 'mac80211'
    option hwmode '11ng'
    option path 'platform/ath9k'
    option disabled '0'
    option country 'AR'
    option txpower '20'
    option htmode 'HT40'
    option channel 'auto'

config wifi-iface
    option device 'radio0'
    option network 'lan'
    option mode 'ap'
    option ssid 'Wifi de Peron'
    option key 'eStA cLabe nO lA Bas A DeScUBrIr nI LoCO'
    option encryption 'psk2+ccmp'


En tanto, en el archivo /etc/config/wireless.invitado pondremos los datos que corresponderán a la red temporal para invitados:

# configuracion del Wifi para invitados
config wifi-device 'radio0'
    option type 'mac80211'
    option hwmode '11ng'
    option path 'platform/ath9k'
    option disabled '0'
    option country 'AR'
    option txpower '20'
    option htmode 'HT40'
    option channel 'auto'

config wifi-iface
    option device 'radio0'
    option network 'lan'
    option mode 'ap'
    option ssid 'Puerta de Hierro - Invitados'
    option key 'vivaperon'
    option encryption 'psk2+ccmp'
# Activarlo con el programa /root/scripts/confwifiinvitado
# Para volver a la wifi normal usar /root/scripts/wifinormal


Estos archivos de configuración no requieren permisos de ejecución.

Para poder activar la red Wifi de invitados o la red Wifi normal, debemos crear dos scripts y darles permisos de ejecución que las den de alta. En el archivo /root/scripts/confwifiinvitado ingresamos el siguiente código:

#!/bin/sh
#activa wifi invitado siguiendo el archivo /etc/config/wireless.invitado
cd /root
wifi down
rm -f /etc/config/wireless
cp /etc/config/wireless.invitado /etc/config/wireless
wifi up
echo Se activo la wifi de invitado!

Luego en el archivo /root/scripts/confwifinormal, le incorporamos el siguiente código:

#!/bin/sh
#activa wifi normal segun archivo /etc/config/wireless.normal
cd /root
wifi down
rm -f /etc/config/wireless
cp /etc/config/wireless.normal /etc/config/wireless
wifi up
echo Se reestablecio la wifi normal...


Tras editar ambos scripts, les otorgamos sus necesaarios permisos de ejecución con:

chmod +x /root/scripts/confwifiinvitado /root/scritps/confwifinormal:

Ahora, si ejecutamos el script confwifiinvitado, la red se llamara "Puerta de Hierro - Invitados" y la contraseña será "vivaperon". Y si ejecutamos confwifinormal, la red se llamará "Red de Peron" y la contraseña será la dificultosa "eStA cLabe nO lA Bas A DeScUBrIr nI LoCO".

3 comentarios:

  1. General ¿dónde puedo conseguir el GTA 5 para linux? Sin tener que usar emuladores de sistemas operativos supuestamente inferiores obvio.

    ResponderEliminar
  2. Me gustaria un script para activar por 15 minutos y desactivar por 3 horas los puertos usb del router, la idea es ponerles un abanico que lo enfrie.

    ResponderEliminar
    Respuestas
    1. Estimado flopezcpa:

      Si su router dispone de puertos USB que calientan, puede deberse a que excede los requerimientos eléctricos de dicho puerto. No los emplee con dispositivos extraños, sólo suelen aceptar algún pendrive de bajo consumo.

      En el caso del router TP-Link 941NDv3 no cuenta con puertos USB, aunque dispone de los headers o conectores no poblados en su plaqueta. Sin embargo, utilizarlos requiere de habilidad instalandole los contactos.
      Existe la versión 1043MD que dispone de un puerto USB, util para conectarle un pendrive, montarlo desde OpenWRT, y cargarle en dicha memoria de masa paquetes de software muy útiles.

      Atte.

      Juan Perón.

      Eliminar