"Después del juego es antes del juego"
Sepp Herberger

Mostrando las entradas para la consulta openwrt ordenadas por fecha. Ordenar por relevancia Mostrar todas las entradas
Mostrando las entradas para la consulta openwrt ordenadas por fecha. Ordenar por relevancia Mostrar todas las entradas

miércoles, 24 de septiembre de 2025

Fijar velocidad de red en puertos de un dispositivo OpenWRT

Tengo un dispositivo OpenWRT actuando de switch de red y, debido a la malidad calidad del cableado de red, he tenido problemas de estabilidad de la conexión, con cortes intermitentes. Analizando el tráfico de red veo que salta entre 100Mbps y 1000Mbps cada cierto tiempo, provocando un microcorte que congela la conexión a la red interna e Internet.

La solución que he encontrado es fijar a velocidad de 100Mbps el puerto concreto donde va la conexión con la red del centro, de manera que no hay ningún tipo de negociación.

Lo primero es saber cual es el nombre del puerto, eso lo hacemos con:
# brctl  show:
bridge name	bridge id		STP enabled	interfaces
br-lan		7fff.6c7220153a30	no		lan4
							            lan2
							            wan
							            lan3
                                        lan1
En mi caso es el puerto "wan", solo hay que mirar las etiquetas que tiene la entrada rj45 donde va la conexión que falla. Lo siguiente es poner un script de autoarranque que fije esa velocidad:
# cat /etc/hotplug.d/iface/99-fix-speed
#!/bin/sh

[ "$ACTION" = ifup ] || exit 0

if [ "$INTERFACE" = "lan" ]; then
    ethtool -s wan speed 100 duplex full autoneg off
fi
Reiniciando el dispositivo vemos si tiene la velocidad correcta con:
# ethtool wan
Las pruebas posteriores me confirman que un este truquito la señal es mucho mas estable y casi no hay microcortes.

martes, 25 de febrero de 2025

OpenWRT: unir todos los puertos de red bajo el mismo bridge.

Tenemos por los centros muchos routers DIR‑860L sobrantes de las antiguas pizarras digitales. Ya he dedicado varios articulos a estos router porque que me parecen bastante interesantes.

Lo primero que suelo hacer es quitarles el sistema DD-WRT que traen de serie y poner un OpenWRT que es mucho más versatil y parecido a un Linux.

Estos router traen 5 puertos GigaEthernet. 4 de ellos están en un mismo bridge, llamado LAN, y el otro puerto está aparte y es el puerto WAN del router, lo que permite que por defecto el router interconecte 2 redes cableadas distintas, en distintas VLANs, y enrute el tráfico entre ambas.

Pero puede ser que no queramos eso, sino que los 5 puertos ethernet estén en la misma red. Eso convierte el router en un miniswitch de 5 puertos GigaEthernet, el cual nos puede venir bien en algunas estancias del centro. Para unir los 5 puertos una vez hemos cargado OpenWRT los pasos son sencillos:

Editamos /etc/config/network para que quede asi:
config interface 'loopback'
	option ifname 'lo'
	option proto 'static'
	option ipaddr '127.0.0.1'
	option netmask '255.0.0.0'

config globals 'globals'
	option ula_prefix 'fdda:86a9:b1ad::/48'

config interface 'lan'
	option force_link '1'
	option macaddr '9a:45:4a:fb:74:c1'
	option type 'bridge'
	option proto 'dhcp'
	option ip6assign '60'
	option _orig_ifname 'eth0.1 radio0.network1 radio1.network1'
	option _orig_bridge 'true'
	option ifname 'eth0.1 eth0.2'

config switch
	option name 'switch0'
	option reset '1'
	option enable_vlan '1'

config switch_vlan
	option device 'switch0'
	option vlan '1'
	option ports '0 1 2 3 4 6t'
	option vid '1'  
Comentarios:
  • La macaddr habrá que cambiarla para poner la tuya.
  • Vease que todo se mete en la misma VLAN, la otra VLAN que tenía el router desaparece.
  • En ports metemos todos los puertos dentro del bridge, de manera que están en la misma red y no hay que enrutar el tráfico entre ellos.
Para hacer esto me he basado en este hilo de Reddit.

Bueno, pues con esto podemos reaprovechar mejor esos router ociosos que nos dejaron las pizarras Siatic.

回头见!

domingo, 19 de enero de 2025

Convertir una impresora USB en una impresora de red mediante OpenWRT

Cuando tenemos una impresora USB y queremos compartirla en una red podemos hacer lo típico: conectarla a un PC y compartirla desde allí, pero queda mas profesional y glamouroso convertirla en una impresora de red con su IP propia sin tener que depender de un PC de usuario que puede estar apagado o encendido.

Para ello sólo necesitamos un punto de acceso wifi o router wifi casero que cuente con un puerto USB y tenga OpenWRT instalado. Ese tema lo hemos tratado largo y tendido en el blog y hay mucha documentación en Internet al respecto.

Una vez configurado el dispositivo OpenWRT debemos conectarlo a la red local con una dirección IP fija, esto dependerá de cada caso y puede hacerse via ethernet o como cliente de la red wifi. Es también un tema visto anteriormente en el bloq en esta entrada y esta otra entrada.

En mi caso conecto el OpenWRT a una red wifi, ya que donde quiero poner la impresora no hay puntos de red cercanos. La configuración seria algo así como:
# cat /etc/config/wireless 

config wifi-device 'radio0'
	option type 'mac80211'
	option hwmode '11g'
	option path 'pci0000:00/0000:00:00.0/0000:01:00.0/bcma0:1'
	option disabled '0'
	option country 'ES'

config wifi-iface 'wifinet0'
	option ssid 'NOMBRE_RED'
	option device 'radio0'
	option mode 'sta'
	option key 'PASSWORD_RED'
	option network 'wwan'
	option encryption 'psk2'
La red cableada la dejo con una IP fija por mi propia tranquilidad, aunque no la voy a usar para nada:
# cat /etc/config/network 

config interface 'loopback'
	option ifname 'lo'
	option proto 'static'
	option ipaddr '127.0.0.1'
	option netmask '255.0.0.0'

config globals 'globals'
	option ula_prefix 'fda2:68de:6428::/48'

config interface 'lan'
	option type 'bridge'
	option ifname 'eth0.1'
	option proto 'static'
	option ipaddr '192.168.2.1'
	option netmask '255.255.255.0'
	option ip6assign '60'

config switch
	option name 'switch0'
	option reset '1'
	option enable_vlan '1'

config switch_vlan
	option device 'switch0'
	option vlan '1'
	option ports '0 1 2 3 8t'

config interface 'wan'
	option proto 'dhcp'

config interface 'wwan'
	option proto 'dhcp'
Hecho esto, instalo los paquetes de OpenWRT necesarios para compartir la impresora USB:
# opkg update
# opkg install kmod-usb-printer
# opkg install p910nd luci-app-p910nd
# opkg install usbutils
A continuación pincho la impresora USB en el router y verifico que ha sido detectada con:
# lsusb
Si todo ha ido bien, debe haber creado en /dev un dispositivo para la impresora:
# ls /dev/usb/lp*
/dev/usb/lp0
Bien, nuestra impresora es /dev/usb/lp0. A continuación configuramos el servico p919nd, que es el encargado de compartir nuestra impresora USB por la red local.
# cat /etc/config/p910nd 

config p910nd
	option device '/dev/usb/lp0'
	option runas_root '0'
	option mdns '0'
	option mdns_ty 'My Printer Manufacturer/Model'
	option mdns_note 'Basement'
	option enabled '1'
	option port '0'
	option bidirectional '1'
Puntualizaciones:
  • En algunos modelos de impresora el parámetro bidirectional debe valer 0. No hay regla, es cuestión de prueba y error.
  • Cambiar device según el nombre del dispositivo detectado en /dev/usb/...
  • El port con valor 0 hará que la impresora escuche en el puerto TCP 9100. Puede tener los valores 0, 1 y 2 (9100, 9101 y 9102), compartiendo en 3 puestos distintos hasta tres impresoras.
  • Los parámetros mdns tienen que ver con el protocolo Bonjour y yo no los uso. Si te gusta usar esos protocolos tan vociferantes tienes mas información al respecto en este enlace.

Hemos dicho que el servivio p910nd escuchará en el puerto 9100, pero no hay que olvidar abrirlo en el firewall de OpenWRT:
# cat /etc/config/firewall 
...
...
...
#Allow attached network printer
config 'rule'
        option name 'p910nd'
        option 'src' 'lan wan'
        option 'proto' 'tcp'
        option 'dest_port' '9100'
        option 'target' 'ACCEPT'
Una vez definido todo, reiniciamos los servicios:
# /etc/init.d/firewall restart
# /etc/init.d/p910nd restart
Y verificamos que el proceso p910nd está corriendo:
# ps w | grep 910
1282 p910nd     936 S    {p910nd} /usr/sbin/p9100d -d -b -f /dev/usb/lp0 0
Ya en plan maniático plus, tampoco está de más verificar desde un PC de la red (repito: un PC distinto al router con el que estamos trabajando) que el puerto 9100 está abierto en el openwrt:
# nc -zv ip-router 9100
Connection to ip-router 9100 port [tcp/*] succeeded!
Con esto ya tenemos todo, solo faltaría configurar la impresora en los clientes que vayan a usarla. En este enlace se explica en detalle como hacerlo para Windows y OSX/Linux. Yo por mi parte como uso Linux simplemente añado esto a /etc/cups/printers.conf:
<Printer HP-ML1210>
PrinterId 488303
UUID urn:uuid:8a19c7aa-3365-356a-70cd-736155c2fcfc
Info 
Location 
MakeModel Samsung ML-1210 Foomatic/gdi (recommended)
DeviceURI socket://ip-router:9100
State Idle
StateTime 1737140264
ConfigTime 1737134460
Type 8392708
Accepting Yes
Shared No
JobSheets none none
QuotaPeriod 0
PageLimit 0
KLimit 0
OpPolicy default
ErrorPolicy retry-job
</Printer>
Cada cual deberá cambiar la ip-router y el Modelo/Driver de impresora según sea su caso. Usar CUPS para añadir la impresora en lugar de editar mano el printers.conf siempre es una buena idea.

再见,同志!

jueves, 1 de diciembre de 2022

Interruptor casero USB.

Vamos a ver como construir un interruptor casero que se conecta por USB y que al pulsarse permite lanzar un evento en el ordenador, ejecutando un script.

Lo primero es construir el interruptor: ¿que usar si no tenemos ni idea de electrónica?. Pues no hace falta nada especial ya que con un ratón de ordenador es suficiente. Todos tenemos ratones USB rotos o antiguos que podemos reciclar. La idea es desmontar el ratón, sacar la placa, arrancar la luz led y verificar que el botón central (el asociado al click de la rueda) funciona y manda señal por el cable USB. Da igual el estado del resto de mecanismos.

Cogemos el ratón, lo metemos dentro de una cajita del tamaño adecuado y lo pegamos usando la pistola térmica de silicona que tenemos todos para las manualidades. En mi caso tenía una cajita que venía perfecta:
Nótese como buscamos que el interruptor del botón quede justo en el centro (marcado con el círculo amarillo). Luego he puesto una tapa de plástico agujereada para permitir llegar al interruptor y forrada con goma eva. Por último hago un interruptor externo con un tapón y un poco de espuma de embalaje. La idea es que el interruptor externo presione al interruptor interno del ratón.
Una vez pegado y montado todo:
Creo que es resultón para lo que yo quiero, pero si queremos hacerlo mas formal siempre podemos usar la impresora 3D para generar una cajita y botón con aspecto mas profesional.

Ya tenemos el hardware, vamos al software. Pinchamos el cable en un puerto USB y el Linux lo detecta como un ratón, pero como esta casi todo inutilizado tan solo recibirá eventos del botón central. Lo primero es encontrar el generador de eventos asociado al nuevo ratón:
# ls -l /dev/input/by-id
total 0
lrwxrwxrwx 1 root root  9 oct 27 09:34 usb-0461_USB_Optical_Mouse-event-mouse -> ../event2
lrwxrwxrwx 1 root root  9 oct 27 09:34 usb-0461_USB_Optical_Mouse-mouse -> ../mouse0
lrwxrwxrwx 1 root root  9 oct 27 09:34 usb-CHICONY_HP_Basic_USB_Keyboard-event-kbd -> ../event3
lrwxrwxrwx 1 root root 10 nov 29 13:32 usb-Logitech_USB-PS_2_Optical_Mouse-event-mouse -> ../event14
lrwxrwxrwx 1 root root  9 nov 29 13:32 usb-Logitech_USB-PS_2_Optical_Mouse-mouse -> ../mouse1
En nuestro caso sería /dev/input/event14. El paso siguiente es verificar que se detectan los eventos de pulsación. Para ello usamos triggerhappy:
# apt-get install triggerhappy
# thd --dump /dev/input/event14
Y pulsamos varias veces el interruptor para ver si se detecta. En consola debería mostrarse:
EV_KEY	BTN_MIDDLE	1	/dev/input/event14
# BTN_MIDDLE	1	command
EV_KEY	BTN_MIDDLE	0	/dev/input/event14
# BTN_MIDDLE	0	command
EV_KEY	BTN_MIDDLE	1	/dev/input/event14
# BTN_MIDDLE	1	command
thd --dump /dev/input/event14
EV_KEY	BTN_MIDDLE	0	/dev/input/event14
# BTN_MIDDLE	0	command
Perfecto: el evento generado por la pulsación del botón es "BTN_MIDDLE 1". Conviene recalcar en este momento que la pulsación del botón central del ratón puede ser también interceptado por nuestro entorno de escritorio Linux y provocar algún efecto asociado (por ejemplo, pegar el texto que hay en el portapapeles). Para evitar efectos colaterales recomendamos desactivar ese ratón en la configuración del entorno de escritorio:

Una vez tenemos el evento localizado, creamos la configuración que asocia dicho evento al lanzamiento de un script:
# cat /etc/triggerhappy/triggers.d/redbutton.conf
BTN_MIDDLE    1       /root/scripts/redbutton.sh
Después de este cambio de configuración se debe reiniciar el servicio triggerhappy, pero antes debemos configurarlo para que se ejecute como root (normalmente lo hace como nobody) y escuche solo los eventos que vengan de /dev/input/event14.

Inocente de mi, probé a modificar tanto /etc/default/triggerhappy como /etc/init.d/triggerhappy sin éxito. Seguia ejecutándose con el usario nobody y escuchando en /dev/input/event*. Esto lo podemos verificar haciendo:
# ps aux | grep thd
nobody   12523  0.1  0.0  43844  2852 ?        Ss   21:32   0:00 /usr/sbin/thd --triggers /etc/triggerhappy/triggers.d/ --socket /run/thd.socket --user nobody --deviceglob /dev/input/event*
La causa de esto es que en Ubuntu 18 el demonio triggerhappy se lanza realmente desde /lib/systemd/system/triggerhappy.service. Los otros dos ficheros están de adorno. No entiendo esta manía de tener servicios que están init.d y en systemd a la vez, es como si hubiesen quedado el trabajo a medias y se hubiesen ido de cañas.

Editamos /lib/systemd/system/triggerhappy.service y lo quedamos:
[Unit]
Description=triggerhappy global hotkey daemon
After=local-fs.target

[Service]
Type=notify
ExecStart=/usr/sbin/thd --triggers /etc/triggerhappy/triggers.d/ --socket /run/thd.socket --user root --deviceglob /dev/input/event14

[Install]
WantedBy=multi-user.target
Luego reiniciamos el servicio:
# service triggerhappy restart
Y bueno ahora nos falta escribir el script. Aqui podemos poner cualquier cosa, yo simplemente voy a hacer que se oiga un audio (descargado de Internet o generado con pico2wave) en el escritorio:
# cat /root/scripts/redbutton.sh 
#!/bin/bash

#Subimos el volumen al máximo en el alsamixer
amixer set Master unmute
amixer set Master 100%

#Si hay un usuario logado, conectamos con su pulseaudio para subir el volumen al máximo
user=$(who | grep "(:0)" | head -1 | cut -f1 -d" "); 
if  [ -n "$user" ]
then
  su $user -c "DISPLAY=:0 pactl set-sink-volume 0 150%"
  su $user -c "DISPLAY=:0 pactl set-sink-mute 0 0"
  cp -f /root/scripts/no.wav /tmp/no.wav
  su $user -c  "DISPLAY=:0 aplay /tmp/no.wav"
else
  cp -f /root/scripts/no.wav /tmp/no.wav
  DISPLAY=:0 aplay /tmp/no.wav
fi

exit 0
Con esto ya tenemos todo funcionando. Bien, y ahora la pregunta: ¿Para qué carajos quiero esto?. Bueno, pues aparte de para enredar, para conectarlo a una Raspberry Pi o un OpenWRT sin teclado/ratón y poder lanzar eventos sobre ellos: apagar/encender la wifi, hacer una foto con la webcam, reiniciar un servicio o una aplicación, etc.

En mi caso tengo una Rasbperry Pi mostrando una página web en modo kiosko con información en tiempo real. A veces el navegador se bloquea y hay que cerrarlo y abrirlo de nuevo, teniendo que conectarme por VNC y hacer el proceso a mano. Con un botón de este tipo puedo lanzar un script que permite a cualquiera reiniciar el navegador en todo momento.

Out!

miércoles, 2 de marzo de 2022

Sincronizando directorios remotos entre Linux y OpenWRT mediante syncthing

Después de montar un NAS sobre OpenWRT he querido probar una herramienta a la que tenia puesto el ojo hace tiempo: syncthing.

Syncthing permite mantener sincronizados de forma automática directorios entre distintas máquinas, incluso si corren diferentes sistemas operativos. Cualquier cambio en uno de los ficheros o subcarpetas en una máquina será propagada hacia las demás mediante un sistema P2P en tiempo real o en intervalos de tiempo predefinidos. Puede ser útil para tener, por ejemplo, una copia de seguridad de los datos de nuestros usuarios o de directorios importantes.

Hacerlo funcionar entre dos Ubuntu es bastante sencillo, hay muchos manuales en Internet. La versión que viene con Ubuntu 18 es bastante antigua, así que nos descargamos la más moderna versión 1.19, añadiendo el repositorio de la aplicación y ejecutando los comandos:
# apt-get install curl
# curl -s https://syncthing.net/release-key.txt | sudo apt-key add -
# echo "deb https://apt.syncthing.net/ syncthing stable" | tee /etc/apt/sources.list.d/syncthing.list
# apt-get install apt-transport-https
# apt-get update
# apt-get install syncthing
# systemctl enable syncthing@root.service
# systemctl start syncthing@root.service
Una vez instalado, los pasos sigientes son:
  1. Con el navegador, en la URL http://127.0.0.1:8384 accedemos al entorno web de configuración de syncthing, un entorno muy sencillo y funcional. Lo primero a hacer es definir un usuario y contraseña de acceso en Actions/Settings/GUI/GUI Authentication User-Password.
    Luego lo que he hecho es eliminar la carpeta compartida "Default Folder" de la sección "Folder", ya que no me interesa para nada, y añadir una carpeta que si quiero compartir y sincronizar, por ejemplo "/media/sync" o la que nos interese en nuestro caso.
  2. A continuación, instalamos la aplicación en el otro PC, la abrimos con el navegador en http://127.0.0.1:8384 y definimos usuario/contraseña y borramos la carpeta "Default Folder". No definimos ninguna carpeta para sincronizar.
  3. Volvemos al primer PC, a la página http://127.0.0.1:8384, y le damos al botón "Añadir un dispositivo remoto", en la sección "Dispositivos". Esto nos pide el Device ID del otro ordenador (que encontramos en su menú Actions/Show ID), pero como syncthing es muy listo lo ha localizado el solo por nosotros y aparece para que pinchemos y lo seleccionemos sin tener que escribir nada.
    Además marcamos la carpeta que queremos sincronizar en un checkbox que aparece en la parte inferior de la siguiente pestaña.
  4. De nuevo en el PC secundario abrimos la página http://127.0.0.1:8384, esperamos unos instantes y nos saldrá la petición de que otro dispositivo quiere sincronizar con este pc. Aceptamos y esperamos otro ratito. Ahora nos dirá que quiere sincronizar la carpeta compartida desde el otro PC, aceptamos de nuevo e indicamos la ruta local sobre la que queremos ubicar esa carpeta. Fin.
Con esto, cualquier cambio que hagamos sobre las carpetas conectadas se propagará al poco tiempo al otro extremo. También podemos programarlo a nivel de carpeta para que no sea una sincronización inmediata y se haga a ciertos intervalos.

Una vez conseguido entre 2 PC con Ubuntu el siguiente paso es hacerlo con uno que tenga OpenWRT, por ejemplo nuestro NAS. Para ello me he guiado con este enlace. Los pasos seguidos son:
  • Descargamos la versión para procesador MIPS (nuestros DLink DIR-860L funcionan con CPU MIPS) de syncthing, en el enlace https://github.com/syncthing/syncthing/releases/download/v1.19.0/syncthing-linux-mipsle-v1.19.0.tar.gz
  • Descomprimimos el fichero y localizamos el ejecutable syncthing entre los ficheros extraídos, verificando que es un ejecutable para MIPS:
    # ls -l syncthing 
    -rwxr-xr-x 1 root root 23242371 feb  1 12:52 syncthing
    # file syncthing 
    syncthing: ELF 32-bit LSB executable, MIPS, MIPS32 version 1 (SYSV), statically linked, Go BuildID=34n17_AjfWP2w_vsWklx/00redfghuYoGTWmMPWQy/8T6vcQMJvHjNx9l6eQVF/zZyy9E8KKWjV03NfAwtN, not stripped
    
  • Copiamos el fichero a nuestro OpenWRT. Como ocupa 23MB y nuestro DLink solo tiene 16MB de disco interno no nos queda otra que copiarlo sobre el disco duro externo USB que montamos en el NAS, en la ruta /disco:
    # scp syncthing root@nas:/disco/syncthing 
    
    Una vez copiado, conectamos por ssh al OpenWRT y lo ejecutamos (/disco/syncthing) para verificar que funciona...es raro encontrar un ejecutable para OpenWRT aislado que funcione sin quejarse, pero este lo hace sin problema.
  • Ahora creamos un script de inicio para ejecutar syncthing como un servicio en el arranque:
    # cat /etc/init.d/syncthing
    #!/bin/sh /etc/rc.common
    # Copyright (C) 2015 brglng@github.com
    
    START=99
    STOP=99
    
    start() {
            service_start /disco/syncthing 2>&1 | logger -t syncthing &
    }
    
    stop() {
            service_stop /disco/syncthing
    }
    
    Activamos y lanzamos el servicio y creamos la carpeta donde haremos las sincronizaciones (dentro del disco USB, obviamente):
    # /etc/init.d/syncthing enable
    # /etc/init.d/syncthing start
    # mkdir /disco/sync
    
  • Ahora tenemos un problemilla: para configurar syncthing hay que entrar con navegador web en http://127.0.0.1:8384, pero OpenWRT no tiene entorno gráfico ni navegador web. Debemos entrar desde un PC externo a http://nas:8334, pero syncthing por defecto solo acepta conexiones http desde 127.0.0.1. Esto se corrige editando: /root/.config/syncthing/config.xml y localizando:
    ...
    <gui enabled="true" tls="false">
      <address>127.0.0.1:8384</address> 
    </gui>
    ...
    
    Que debe cambiar a:
    ...
    <gui enabled="true" tls="false">
      <address>0.0.0.0:8384</address> 
    </gui>
    ...
    
    Tras esto, reiniciamos el servicio syncthing y ya podremos conectar a http://nas:8334
  • Una vez conectados al entorno web los pasos son similares a cuando lo hicimos con dos PC con Ubuntu, solo que la ruta de la carpeta sincronizada será /disco/sync
Y con esto ya tenemos nuestro NAS sincronizado mediante un servicio syncthing. En las pruebas preliminares no parece que se haya cargado de forma apreciable la modesta CPU MIPS de nuestro OpenWRT. Lo observaremos con cuidado.

jueves, 24 de febrero de 2022

NAS sobre DLink DIR 860L-B1 y OpenWRT

Seguimos haciendo cosas con los puntos wifi DLink DIR 860L-B1. Ahora vamos a ver como montar un servidor NAS que tenga al menos los servicios samba y sshfs. Opcionalmente se podrían montar otros servicios adicionales como NFS, RemoteFS, SFTP...

La almacenamiento será sobre disco duro externo de 1TB conectado al puerto USB 3.0 del DLink.

En un principio he intentado hacerlo funcionar con OpenWRT 21.02.1, que ya había utilizado para el montaje del routed client, pero he tenido estos dos problemas:
  • Los paquetes de samba4 ocupan una burrada, no hay espacio en los 16Mb de memoria SD del dispositivo para ellos.
  • En esta versión de OpenWRT no hay samba3. Existe un paquete llamado ksmbd-server que emula samba v3 a nivel de módulo del nucleo. El problema es que en las pruebas que he hecho es inestable y se cae con frecuencia.
Visto lo visto, he vuelto a usar OpenWRT 15.05, que sigue siendo una versión muy estable con buen funcionamiento.

Una vez cargado el sistema y hechas las configuraciones iniciales básicas, veamos como queda. La red pide una IP por DHCP en el puerto "lan" (hemos dado de alta el equipo en el arbol ldap con el nombre "nas" y una IP fija)
# cat /etc/config/network 
config interface 'loopback'
	option ifname 'lo'
	option proto 'static'
	option ipaddr '127.0.0.1'
	option netmask '255.0.0.0'

config globals 'globals'
	option ula_prefix 'fdda:86a9:b1ad::/48'

config interface 'lan'
	option ifname 'eth0.1'
	option force_link '1'
	option macaddr '9a:45:4e:fb:75:c1'
	option type 'bridge'
	option proto 'dhcp'
	
config interface 'wan'
	option ifname 'eth0.2'
	option force_link '1'
	option macaddr '9a:45:4e:fb:75:c2'
	option proto 'dhcp'

config interface 'wan6'
	option ifname 'eth0.2'
	option proto 'dhcpv6'

config switch
	option name 'switch0'
	option reset '1'
	option enable_vlan '1'

config switch_vlan
	option device 'switch0'
	option vlan '1'
	option ports '1 2 3 4 6t'

config switch_vlan
	option device 'switch0'
	option vlan '2'
	option ports '0 6t'    
Los interfaces wifi quedan apagados:
# cat /etc/config/wireless 
config wifi-device  radio0
	option type     mac80211
	option channel  36
	option hwmode	11a
	option path	'pci0000:00/0000:00:00.0/0000:01:00.0'
	option htmode	VHT80
	# REMOVE THIS LINE TO ENABLE WIFI:
	option disabled 1

config wifi-iface
	option device   radio0
	option network  lan
	option mode     ap
	option ssid     OpenWrt
	option encryption none

config wifi-device  radio1
	option type     mac80211
	option channel  11
	option hwmode	11g
	option path	'pci0000:00/0000:00:01.0/0000:02:00.0'
	option htmode	HT20
	# REMOVE THIS LINE TO ENABLE WIFI:
	option disabled 1

config wifi-iface
	option device   radio1
	option network  lan
	option mode     ap
	option ssid     OpenWrt
	option encryption none
Creamos un usuario normal para usar luego en samba. En /etc/passwd añadimos el usuario "nas":
# cat /etc/passwd
root:x:0:0:root:/root:/bin/ash
daemon:*:1:1:daemon:/var:/bin/false
ftp:*:55:55:ftp:/home/ftp:/bin/false
network:*:101:101:network:/var:/bin/false
nobody:*:65534:65534:nobody:/var:/bin/false
nas:*:1000:65534:nas:/var:/bin/ash
Y definimos una contraseña para él:
# passwd nas
El montaje del disco externo USB necesita estos paquetes:
# opkg update
# opkg install fdisk block-mount e2fsprogs kmod-fs-ext4 kmod-usb-storage kmod-usb2 kmod-usb3
Formateamos el disco externo (aconsejamos usar formato ext3) y lo pinchamos en el puerto usb. Con:
# fdisk -l
Sacamos un listado de los discos conectados, nuestro disco duro debe aparecer como /dev/sdaX. A continuación creamos el punto de montaje:
# mkdir /disco
# chown nas: /disco
# chmod 777 /disco
Modificamos el fichero "fstab" para que se automonte el disco en el arranque:
# cat /etc/config/fstab 
...
config mount
	option enabled '1'
	option device '/dev/sda1'
	option target '/disco'
Instalamos paquetes para permitir conexiones y transferencia de datos con sshfs, scp y rsync:
# opkg update
# opkg install openssh-sftp-server rsync
Y vamos a la configuración de samba:
# opkg update
# opkg install kmod-usb-storage block-mount samba36-server luci-app-samba
La configuración sería:
# cat /etc/config/samba 
config samba
	option workgroup 'WORKGROUP'
	option homes '1'
	option name 'NAS'
	option description 'NAS'

config sambashare
	option name 'datos'
	option path '/disco'
	option read_only 'no'
	option guest_ok 'no'
	option create_mask '777'
	option dir_mask '777'
   	option users 'nas'
Hay que crear el usuario "nas" en samba, con la contraseña que nos pareza conveniente:
# smbpasswd -a nas
Tras esto reiniciamos y probamos a montar desde una maquina cliente. En una máquina Linux que hará de cliente vamos a probar a montar mediante sshfs:
# sshfs root@nas:/disco /mnt
# mount
....
root@nas:/disco on /mnt type fuse.sshfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0)
# umount /mnt
Vamos a por samba. Samba casi siempre da problemas de permisos con el sistema de ficheros compartido. Para evitarlo, una vez montado el disco duro modificamos de nuevo los permisos de la carpeta (esto se debe a que cuando la partición montada es tipo extX no existe el parametro umask):
# chmod 777 /disco
Y ahora en un cliente Linux probamos a montar usando samba/cifs y creamos un directorio y un fichero para confirmar que todo va bien:
# mount -t cifs //172.19.231.150/datos /mnt -o username=nas,password=xxxx
# mount
....
//172.19.X.Y/datos on /mnt type cifs (rw,relatime,vers=1.0,cache=strict,username=nas,domain=NAS,uid=0,noforceuid,gid=0,noforcegid,addr=172.19.X.Y,unix,posixpaths,serverino,acl,rsize=1048576,wsize=1048576,actimeo=1)
# mkdir /mnt/prueba
# touch /mnt/prueba/test
# umount
Por último, para clientes Windows se realiza el montaje accediendo desde el explorador de archivos a la ruta "\\nas\disco". Pedirá usuario y contraseña y listo...excepto en Windows 10, que da un error derivado de que en dicho sistema se han puesto tiquismiquis con la versión de SMB soportada. Todo el asunto está descrito en este enlace, para que funcione simplemente hay que activar el soporte para SMB 1.0 siguiendo estos pasos:
  • Pulsar Windows Key + R, teclea "optionalfeatures.exe" y pulsa Enter. Sale una ventana muy años 90.
  • Buscar la sección "SMB 1.0/CIFS File Sharing Support" o similar, abrirla.
  • Marcar SMB 1.0/CIFS Client. Desmarcar MB 1.0/CIFS Automatic Removal y SMB 1.0/CIFS Server.
  • Reiniciar y acceder a "\\nas\disco" para verificar que funciona.
Por supuesto, todo esto es un ejemplo sencillo. Nada impide compartir distintas carpetas con distintos permisos de acceso dentro del disco externo, usando recursos samba diferentes. Eso queda al libre albedrío de cada cual.

Al ser un sistema donde el disco va por USB no es lo más rápido del mundo, pero queda ideal para copias de seguridad y tareas que no requieran una velocidad de transferencia excesiva.

Y poco mas se puede probar, simplemente estoy mirando la posibilidad de usar syncthing para mantener el disco NAS sincronizado con otor sistema de ficheros, en plan "copia de seguridad en tiempo real", a ver que tal rinde.

Ya iremos contando. До свидания!

martes, 15 de febrero de 2022

Configuración de DLink DIR 860L-B1 como "routed client" para conectar como cliente a una red wifi.

De este tema ya he hablado en anteriores posts:
  1. OpenWRT en DLink DIR 860L-B1: http://2tazasdelinux.blogspot.com/2020/11/instalar-openwrt-en-los-puntos-de.html
  2. Routed client con NAT: http://2tazasdelinux.blogspot.com/2017/03/configuracion-de-openwrt-como-routed.html
  3. Routed client con relayd: http://2tazasdelinux.blogspot.com/2017/04/configuracion-de-openwrt-como-routed.html
Pero ahora voy a documentar como hacerlo funcionar en nuestros famosos y ociosos DLink DIR 860L-B1.

Recapitulemos: un Routed Client es la configuración por defecto de OpenWRT. En ella el router interconecta la red inalámbrica con la red LAN del dispositivo. Como la mayoria de los drivers wifi no permiten hacer un "bridge" si el dispositivo se conecta a la red wifi en modo cliente, cuando queremos interconectar ambas redes tenemos que configurarlo a mano enrutando el tráfico entre uno y otro interfaz. Y como hacer eso es lo que contaremos aquí.

¿Qué utilidad tiene esto?: pues es algo similiar a una "tarjeta wifi" configurada y lista para usar en cualquier momento en un dispositivo que necesite conexión y no nos llegue la red cableada. El DLink se conecta a la red wifi del centro y con el cable de red conectamos a los puertos ethernet hasta 4 dispositivos, de tal manera que esos tienen acceso a la red del centro.

Si por ejemplo tenemos un PC de sobremesa en un area donde no llega red cableada (o llega, pero hay una avería de electrónica de red), simplemente con enchufarlo por un cable de red a un DLink configurado como contamos aqui tendrá acceso a la red del centro de forma inmediata, sin mas aspavientos y sin configurar nada en el PC.

1. Cargar OpenWRT en el DLink.

Aunque en el artículo anterior contamos como instalar OpenWRT y propusimos poner la versión 15.05, ahora he hecho pruebas con versiones posteriores y he visto que la versión 21.02.1 funciona mejor que la 15.05.

Por tanto lo cargamos la imagen como contamos en el articulo anterior, pero ahora usamos OpenWrt 21.02.1 r16325-88151b8303. En cualquier momento podremos encontrar la última imagen en la página oficial de OpenWRT dedicada a nuestro DLink.

Una vez instalado el OpenWRT hay dos alternativas para configurar la interconexión entre la wifi y los puertos ethernet del DLink:
  • Usando IP Masquerading y haciendo NAT.
  • Usando relayd, que crea un "pseudobridge" por software que interconecta el tráfico entre ambas redes.
Veremos cada uno de los casos y sus ventajas e inconvenientes.

2. Usando IP masquerading.

El esquema sería este:


La conexión wifi recibe una IP de nuestra red 172.X.Y.Z y su interfaz ethernet tiene la IP 192.168.1.1. Sobre esa interfaz corre un servidor DHCP que da direcciones a los clientes dentro de ese rango. Ambas redes están interconectadas mediante IP masquerading como se viene haciendo de toda la vida para cualquier subred privada.

Los PC u otros dispositivos conectados a los puertos ethernet, con direccionamiento 192.168.1.X, son enrutados a través de la conexión wifi hacia la red del centro.

Para lograr esto hay que realizar la siguiente configuración en los ficheros de OpenWRT:

Primero la configuración de red:
# cat /etc/config/network
config interface 'loopback'
    option device 'lo'
    option proto 'static'
    option ipaddr '127.0.0.1'
    option netmask '255.0.0.0'

config globals 'globals'
    option packet_steering '1'
    option ula_prefix 'fdd3:89a2:bcfc::/48'

config device
    option name 'br-lan'
    option type 'bridge'
    list ports 'lan1'
    list ports 'lan2'
    list ports 'lan3'
    list ports 'lan4'

config device
    option name 'lan1'
    option macaddr '90:8d:78:59:c9:5c'

config device
    option name 'lan2'
    option macaddr '90:8d:78:59:c9:5c'

config device
    option name 'lan3'
    option macaddr '90:8d:78:59:c9:5c'

config device
    option name 'lan4'
    option macaddr '90:8d:78:59:c9:5c'

config interface 'lan'
    option device 'br-lan'
    option proto 'static'
    option ipaddr '192.168.1.1'
    option netmask '255.255.255.0'
    option ip6assign '60'
    option force_link '1'
    option ip6assign '60'

config device
    option name 'wan'
    option macaddr '90:8d:78:59:c9:5f'

config interface 'wan'
    option device 'wan'
    option proto 'dhcp'

config interface 'wan6'
    option device 'wan'
    option proto 'dhcpv6'

config interface 'wwan'
    option proto 'dhcp'
Como vemos hay 3 interfaces
  • lan: correspondiente al bridge que une los 4 puertos LAN ethernet del router, con IP 192.168.1.1
  • wan: correspondiente al puerto wan del router (el amarillo), que no usamos para nada.
  • wwan: correspondiente a la conexión wifi, que se configura por dhcp.
Ahora la configuración de la wifi:
# cat /etc/config/wireless

config wifi-device 'radio0' #Esde dispostivo es de la red de 5Ghz, no la uso, lo dejo desactivado.
    option type 'mac80211'
    option channel '36'
    option hwmode '11a'
    option path '1e140000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0'
    option htmode 'VHT80'
    option disabled '1'

config wifi-device 'radio1'
    option type 'mac80211'
    option channel '11'
    option hwmode '11g'
    option path '1e140000.pcie/pci0000:00/0000:00:01.0/0000:02:00.0'
    option cell_density '0'

config wifi-iface 'wifinet0'
    option device 'radio1'
    option mode 'sta'
    option network 'wwan'
    option ssid 'SSID_RED_EDUCATIVA'
    option encryption 'psk2'
    option key 'PASSWD_RED_EDUCATIVA'
Conectamos el interface de red wwan/radio1 indicando la contraseña y clave de la red educativa. Esto lo adaptarás según la wifi que quieras usar de tu centro. El DLink se conecta, autentica y recibe una IP por DHCP. Para facilitar la gestión recomiendo que la tarjeta wifi tenga configurada una IP fija en el servidor DHCP del centro.

Ahora vamos a ver el servidor DHCP:
#cat /etc/config/dhcp
config dnsmasq
    option domainneeded '1'
    option boguspriv '1'
    option filterwin2k '0'
    option localise_queries '1'
    option rebind_protection '1'
    option rebind_localhost '1'
    option local '/lan/'
    option domain 'lan'
    option expandhosts '1'
    option nonegcache '0'
    option authoritative '1'
    option readethers '1'
    option leasefile '/tmp/dhcp.leases'
    option resolvfile '/tmp/resolv.conf.d/resolv.conf.auto'
    option nonwildcard '1'
    option localservice '1'
    option ednspacket_max '1232'

config dhcp 'lan'
    option interface 'lan'
    option start '100'
    option limit '150'
    option leasetime '12h'
    option dhcpv4 'server'
    option dhcpv6 'server'
    option ra 'server'
    option ra_slaac '1'
    option ignore '0'
    list ra_flags 'managed-config'
    list ra_flags 'other-config'

config dhcp 'wan'
    option interface 'wan'
    option ignore '1'

config odhcpd 'odhcpd'
    option maindhcp '0'
    option leasefile '/tmp/hosts/odhcpd'
    option leasetrigger '/usr/sbin/odhcpd-update'
    option loglevel '4'
Simplemente se define un servidor dhcp sobre el interface lan (el que da conexión cableada por los 4 puertos ethernet), que repartirá direcciones en el rango 192.168.1.100 a 192.168.1.150.

Ahora vemos la configuracion del firewall:
# cat /etc/config/firewall

config defaults
    option syn_flood '1'
    option input 'ACCEPT'
    option output 'ACCEPT'
    option forward 'REJECT'

config zone
    option name 'lan'
    option input 'ACCEPT'
    option output 'ACCEPT'
    option forward 'REJECT'
    list network 'lan'

config zone
    option name 'wwan'
    option input 'ACCEPT'
    option output 'ACCEPT'
    option forward 'ACCEPT'
    option masq '1'
    list network 'wwan'

config zone
    option name 'wan'
    option input 'ACCEPT'
    option output 'ACCEPT'
    option forward 'REJECT'
    option mtu_fix '1'
    list network 'wan'
    list network 'wan6'

config forwarding
    option src 'lan'
    option dest 'wwan'

config rule
    option name 'Allow-DHCP-Renew'
    option src 'wan'
    option proto 'udp'
    option dest_port '68'
    option target 'ACCEPT'
    option family 'ipv4'
....
.... esta parte queda sin tocar....
....

....
config include
    option path '/etc/firewall.user'
Basicamente se permite el forwarding entre lan y wwan, activando el masquerading en wwan. De esta manera el tráfico se enrutará entre ambos interfaces y redes.

3. Usando relayd.

En esta solución también la conexión wifi recibe una IP de nuestra red 172.X.Y.Z y su interfaz ethernet tiene la IP 192.168.1.1. Pero aquí acaban las similitudes con NAT. El servicio DHCP lo da el servidor del centro, por lo que las IP que reciben los clientes son de dicha red, del tipo 172.X.Y.W. Ambas redes están interconectadas mediante un demonio relayd que pasa el tráfico entre ellas por software (por eso a esta solución se le llama "pseudobridge").

Los PC u otros dispositivos conectados a los puertos ethernet tienen direccionamiento 172.X.Y.W, y gracias al relayd están lógicamente en la red del centro pudiendo ser alcanzados por ping u otro tipo de conexión. Por ejemplo, si conectamos una impresora por cable de red al DLink se podrá acceder a su IP para imprimir desde cualquier punto del centro.

Para lograr esto hay que realizar la configuración que datallaremos a continuación.

Instalar y activar el servicio relayd:
# opkg update
# opkg install relayd
# /etc/init.d/relayd enable
# /etc/init.d/relayd restart
La configuración de red:
# cat /etc/config/network

config interface 'loopback'
    option device 'lo'
    option proto 'static'
    option ipaddr '127.0.0.1'
    option netmask '255.0.0.0'

config globals 'globals'
    option packet_steering '1'
    option ula_prefix 'fdd3:89a2:bcfc::/48'

config device
    option name 'br-lan'
    option type 'bridge'
    list ports 'lan1'
    list ports 'lan2'
    list ports 'lan3'
    list ports 'lan4'

config device
    option name 'lan1'
    option macaddr '90:8d:78:59:c9:5c'

config device
    option name 'lan2'
    option macaddr '90:8d:78:59:c9:5c'

config device
    option name 'lan3'
    option macaddr '90:8d:78:59:c9:5c'

config device
    option name 'lan4'
    option macaddr '90:8d:78:59:c9:5c'

config interface 'lan'
    option device 'br-lan'
    option proto 'static'
    option ipaddr '192.168.1.1'
    option netmask '255.255.255.0'
    option ip6assign '60'
    option force_link '1'
    option ip6assign '60'

config device
    option name 'wan'
    option macaddr '90:8d:78:59:c9:5f'

config interface 'wan'
    option device 'wan'
    option proto 'dhcp'

config interface 'wan6'
    option device 'wan'
    option proto 'dhcpv6'

config interface 'wwan'
    option proto 'dhcp'

config 'interface' 'stabridge'
    option 'proto'      'relay'
    option 'network'    'lan wwan'
En este sistema hay también 3 interfaces:
  • lan: correspondiente al bridge que une los 4 puertos LAN ethernet del router, con IP 192.168.1.1
  • wan: correspondiente al puerto wan del router (el amarillo), que no usamos para nada.
  • wwan: correspondiente a la conexión wifi, que se configura por dhcp.
Adicionalmente interconectamos los interfaces lan y wwan mediante el demonio relayd.

Ahora la configuración de la wifi, que es totalmente igual a la del caso anterior:
# cat /etc/config/wireless

config wifi-device 'radio0' #Esde dispostivo es de la red de 5Ghz, no la uso, lo dejo desactivado.
    option type 'mac80211'
    option channel '36'
    option hwmode '11a'
    option path '1e140000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0'
    option htmode 'VHT80'
    option disabled '1'

config wifi-device 'radio1'
    option type 'mac80211'
    option channel '11'
    option hwmode '11g'
    option path '1e140000.pcie/pci0000:00/0000:00:01.0/0000:02:00.0'
    option cell_density '0'

config wifi-iface 'wifinet0'
    option device 'radio1'
    option mode 'sta'
    option network 'wwan'
    option ssid 'SSID_RED_EDUCATIVA'
    option encryption 'psk2'
    option key 'PASSWD_RED_EDUCATIVA'
Conectamos el interface de red wwan/radio1 indicando la contraseña y clave de la red educativa. Esto lo adaptarás según la wifi que quieras usar de tu centro. El DLink se conecta, autentica y recibe una IP por DHCP. Para facilitar la gestión recomiendo que la tarjeta wifi tenga configurada una IP fija en el servidor DHCP del centro.

Ahora vamos a ver el servidor DHCP:
#cat /etc/config/dhcp
config dnsmasq
    option domainneeded '1'
    option boguspriv '1'
    option filterwin2k '0'
    option localise_queries '1'
    option rebind_protection '1'
    option rebind_localhost '1'
    option local '/lan/'
    option domain 'lan'
    option expandhosts '1'
    option nonegcache '0'
    option authoritative '1'
    option readethers '1'
    option leasefile '/tmp/dhcp.leases'
    option resolvfile '/tmp/resolv.conf.d/resolv.conf.auto'
    option nonwildcard '1'
    option localservice '1'
    option ednspacket_max '1232'

config dhcp 'lan'
    option interface 'lan'
    option start '100'
    option limit '150'
    option leasetime '12h'
    option dhcpv4 'server'
    option dhcpv6 'server'
    option ra 'server'
    option ra_slaac '1'
    option ignore '1'
    list ra_flags 'managed-config'
    list ra_flags 'other-config'

config dhcp 'wan'
    option interface 'wan'
    option ignore '1'

config odhcpd 'odhcpd'
    option maindhcp '0'
    option leasefile '/tmp/hosts/odhcpd'
    option leasetrigger '/usr/sbin/odhcpd-update'
    option loglevel '4'
El servidor DHCP local está desactivado tanto en el interface wan como en el lan. Las direcciones IP para los puestos que se conecten por la red cableada llegarán desde el servidor DHCP del centro.

Ahora vemos la configuracion del firewall:
# cat /etc/config/firewall
config defaults
	option syn_flood '1'
    option input 'ACCEPT'
    option output 'ACCEPT'
    option forward 'REJECT'

config zone
    option name 'lan'
    option input 'ACCEPT'
    option output 'ACCEPT'
    option forward 'ACCEPT'
    list network 'lan'
    list network 'wwan'
....
.... esta parte queda sin tocar....
....
config include
    option path '/etc/firewall.user'
Simplemente permitimos todo tráfico (INPUT/OUTPUT/FORWARD) entre lan y wwan. El resto permanece igual.

4. Consideraciones finales.

Varias cosas importantes a tener en cuenta:
  • Usando NAT/Masquerading: hay que recordar que los equipos conectados por cable al DLink están en una red privada, con direccionamiento 192.168.1.X, por lo que aunque ellos tendrán acceso hacia todo el mundo, desde la red del centro no se podrá acceder a ellos.
  • Relayd: en este caso los equipos si están en la red del centro, con IP 172.X.Y.Z y se puede interactuar (ping, ssh, imprimir, etc) con ellos. Pero hemos tenido un problema grave al empezar a trabajar: en nuestro DLink, usando relayd, las respuestas DHCP no llegan. El puesto conectado al interface lan pide una IP, la petición llega al servidor DHCP del centro, se manda un paquete con la IP y al llegar al demonio relayd se pierde. Es un problema documentado en algunos router con OpenWRT y no está solucionado. En el siguiente punto vemos como hacer que funcione todo a pesar de este problema.
  • Relayd: como acabamos de decir, en nuestro DLink los paquetes DHCP llegados de fuera se pierden. Por ello, para que los equipos conectados al DLink mediante red cableada tengan red debemos configurarles la IP, puerta de enlace y DNS de forma estática a mano. Con este trámite todo funciona perfectamente.
  • Velocidad: no olvidemos que todo está conectado a través de un enlace wifi "G" que sería el cuello de botella. En las pruebas realizadas la descarga está entre 5-10MB/s. Esto hace que trabajar con un home montado mediante NFS sea muy lento, por lo que se aconseja (como ya hacemos con los portátiles de nuestros centros) trabajar con usuarios con home local.
  • Si probamos ambos métodos, NAT y relayd, se aconseja resetear la configuración del OpenWRT para empezar desde un sistema limpio cada prueba. Esto se hace con:
    # firstboot
    # reboot -f
    
Y con esto acabamos este nuevo montaje OpenWRT. Conforme vaya probando otras soluciones las iré poniendo aquí, tengo pensado probar a montar algo como un servidor NAS aprovechando el puerto USB 3, por ejemplo.

Out!

jueves, 26 de noviembre de 2020

Cambio automático de clave de wifi en punto de acceso OpenWrt.

El objetivo de esta entrada es configurar un punto de acceso que encenderá y apagará la red wifi a determinadas horas y que cada cierto tiempo cambiará automáticamente la clave. Todo se hará desde un ordenador externo que conectará por ssh con el OpenWRT del punto de acceso y ejecutará los comandos.

Lo primero es un script que calcule una nueva clave y la guarde en el fichero /root/scripts/wifi/clavewifi.txt.
# cat /root/scripts/generaClaveWifi.sh 
#!/bin/bash

claveletra=$(cat /dev/urandom | tr -dc abcdefghjklmnpqrstuvwxy | fold -w 2 | head -n 1)
clavenumero=$(cat /dev/urandom | tr -dc 0123456789 | fold -w 2 | head -n 1)
clave=$claveletra$clavenumero$claveletra$clavenumero
echo $clave > /root/scripts/wifi/clavewifi.txt
exit 0
La clave tiene el formato siguiente: 2 letras minúsculas y 2 dígitos, repetidos 2 veces. Por ejempo: "hx45hx45". El script es fácil de adaptar para cualquier otra combinación que deseemos.

Ahora el script que cambia la clave:
# cat /root/scripts/ponClaveWifi.sh 
#!/bin/bash

clave=$(cat /root/scripts/wifi/clavewifi.txt)
clave_router="claveopenwrt"
ssid="MI_WIFI"
security="WPA"
ip_openwrt="192.168.X.Y"
interface="1" #En mi caso la wifi está en el Interface 1.
comando="uci set wireless.@wifi-iface[$interface].key=$clave ; uci commit wireless ; wifi"
sshpass  -p $clave_router ssh -o StrictHostKeyChecking=no root@$ip_openwrt "$comando" > /dev/null 2>&1

qrencode -o /root/scripts/wifi.png "WIFI:S:${ssid};T:${security};P:${clave};;"

convert /root/scripts/wifi.png -background "black" -gravity south -extent 450x350  /root/scripts/wifi-canvas.png > /dev/null 2>&1
convert -pointsize 35 -fill white -draw "text 60,100 \"SSID: $ssid\" text 60,160 \"CLAVE: $clave\"" /root/scripts/wifi-canvas.png /root/scripts/wifi-key.png > /dev/null 2>&1
id_googledrive=1jMw8ixuAaR2RONW6IDmxii7nBdg4eJfZ
gdrive update $id_googledrive wifi-key.png > /dev/null 2>&1

exit 0
El script conecta con el punto de acceso mediante sshpass y ejecuta la secuencia de comands que cambian la clave, que son:
uci set wireless.@wifi-iface[$interface].key=$clave ; uci commit wireless ; wifi
El número con el $interface wifi a manejar lo determinamos previamente ejecutando a mano "uci show wireless", que muestra todas las interfaces que hay en nuestro router (lo normal es que haya dos, una emitiendo a 5Ghz y otra a 2.4Ghz).

Posteriormente creamos una imagen mediante qrencode que incluye un código QR conteniendo los datos de la wifi (ssid/contraseña) y añadimos mediante convert un texto con el SSID y la clave. El resultado es:



Esta imagen final contenida en el fichero wifi-key.png podemos difundirla de diversas maneras: publicarla en un servidor web, enviarla por correo a las cuentas interesadas o, como hago yo en el script anterior, subirla a Google Drive como fichero compartido. Previamente he compartido el enlace al fichero wifi-key.png con los usuarios que podrán consultar la clave.

Para subirla a Google Drive usamos el comando gdrive update, que sube y actualiza un fichero ya existente. El paso previo es subir la imagen a mano y compartirla. Eso nos dará un "id" que identifica el fichero y ese es el "id_googledrive" que usaremos en el script para posteriores actualizaciones.

Otros scrips que necesitamos son los que apagan y encienden la red wifi:
# cat /root/scripts/apagaWifi.sh 
#!/bin/bash
clave_router="claveopenwrt"
ip_openwrt="192.168.X.Y"
interface="1" #En mi caso la wifi está en el Interface 1.
comando="uci set wireless.@wifi-iface[$interface].disabled=1 ; uci commit wireless ; wifi"
sshpass  -p $clave_router ssh -o StrictHostKeyChecking=no root@$ip_openwrt "$comando"> /dev/null 2>&1

exit 0
Y:
# cat /root/scripts/enciendeWifi.sh 
#!/bin/bash
clave_router="claveopenwrt"
ip_openwrt="192.168.X.Y"
interface="1" #En mi caso la wifi está en el Interface 1.
comando="uci set wireless.@wifi-iface[$interface].disabled=0 ; uci commit wireless ; wifi"
sshpass  -p $clave_router ssh -o StrictHostKeyChecking=no root@$ip_openwrt "$comando" > /dev/null 2>&1

exit 0
Una vez tenemos los scripts, solo nos hace falta un cron para ejecutar las acciones de apagado, encendido y cambio de clave, en función de nuestras necesidades:
# cat /etc/cron.d/puntowifi
#Gestión de wifis . Se enciende por la mañana y se apaga por la noche. La clave cambia 5 veces al día.
00 24  * * *        root /root/scripts/wifi/apagaWifi.sh
30 11  * * *      root /root/scripts/wifi/enciendeWifi.sh
20 11,15,18,20,22  * * *      root /root/scripts/wifi/generaClaveWifi.sh  
22 11,15,18,20,22  * * *      root  /root/scripts/wifi/ponClaveWifi.sh 
Y con esto tenemos automatizado todo el proceso de cambio y difusión de la wifi. Así tendremos restringidos los accesos de una forma razonablemente sencilla.

Bueno, pues para hacer todo esto me he basado en esta entrada de blog, donde además viene muy bien explicado como hacerlo todo en el propio router OpenWRT, en lugar de usando una máquina externa como hemos explicado aquí.

Out!

Los camaradas chinos han lanzado esta semana la sonda Chang'e 5 que recogerá y traerá muestras de la Luna para fin de año:
Desde los años 70 no se hacía esto. Como vemos una vez más los chinos siguen avanzando hacia adelante mientras otros se dedican a dar vueltas sobre su estupidez.

martes, 17 de noviembre de 2020

Instalar OpenWrt en los puntos de acceso DLink DIR-860L

En todos los centros tenemos puntos de acceso DLink DIR-860L Modelo B1 que están siendo retirados al instalar las nuevas redes wifi. Originalmente vienen con el sistema operativo DD-WRT, que hasta ahora nos ha funcionado aceptablemente bien para el uso que les hemos dado.

El problema de DD-WRT es que es poco flexible, mientras que OpenWrt es mucho mas versátil: permite añadir y quitar paquetes de software, almacenar configuraciones y scripts fácilmente y tiene una comunidad de soporte enorme detrás.

Para cargar un nuevo firmware hay que poner el router en modo Recovery. Esto se hace apagando el router, presionando con un clip sobre el interruptor de reset que hay escondido en la base del mismo y encendiendo de nuevo el aparato. Tras 10-20 segundos el led de encendido comienza a parpadear. Soltamos el interruptor de reset.

Si abrimos el navegador y vamos a la dirección http://192.168.0.1 veremos esto:
Simplemente habria que seleccionar el fichero con el nuevo firmware, hacer Upload y esperar unos minutos a que se cargue y arranque.

¿Que firmwares OpenWrt podemos cargar? Veamos:

  • La primera opción es coger la última versión. En el momento de escribir esto era la 19.07.4. El problema es que una vez instalado he tenido problemas con la tarjeta wifi: se detectaba pero no funcionaba. Probando con otros firmwares mas antiguos como el 18.X o el 17.X no he tenido tampoco éxito. El fichero con el firmware estará en una ruta similar a esta:
    https://downloads.openwrt.org/releases/17.01.0/targets/ramips/mt7621/lede-17.01.0-r3205-59508e3-ramips-mt7621-dir-860l-b1-squashfs-factory.bin
  • Buscando en Internet encontré este post donde hay un desarrollo propio de imágenes para nuestro punto de acceso. Son imágenes que funcionan, pero están bastante cargadas de software y no son compatibles con los repositorios de paquetes oficiales, por lo que no es fácil instalar software adicional. No acababa de convencerme.
  • Encontré referencias a que las últimas versiones no van muy bien con la wifi, pero afortunadamente la 15.05.1 si que era plenamente operativa. Recomendamos pues descargar e instalar esta versión.


Una vez cargado el nuevo firmware, accedemos al interface web de configuración LuCI en la URL http://192.168.1.1. El primer paso definir una contraseña de root, para que se active la posibilidad de entrar por ssh en el dispositivo y realizar las siguientes configuraciones mediante líneas de comando o mediante LuCI, a nuestra elección.

Ya con OpenWRT cargado, ¿qué podemos hacer con los chismes?. Bueno, ideas:
  • Montar un punto wifi independiente para alguna cosa concreta. Es lo que se llama Routed AP.
  • Conectar el DLink con una red wifi preexistente y proporcionar conexión de red cableada desde alli. Es lo que se llama Routed Client.
  • Montar un repetidor wifi: no he probado si funciona.
  • Con una cámara USB montar una cámara IP.
  • Montar un sistema de USB sobre IP para conectar dispostivos USB remotos.
  • Montar un NAS pinchando un disco externo en el puerto USB.
  • Usarlo como dispositivo interpuesto físicamente para monitorizar el tráfico de red en algún punto que nos interese.
  • Con una tarjeta de sonido USB, usarlos como altavoces remotos para sistemas de hilo músical o megafonía.
  • .....
Vamos, que usos interesantes hay de sobra. Lo que nos falta es tiempo. Out!


Esto ya va siendo normal, pero no por ello menos emocionante: la cápsula Resilience de SpaceX se ha acoplado esta madrugada a la Estación Espacial Internacional. El anterior viaje en agosto fue un test, hoy era el primer vuelo regular con 4 cosmonautas:

Es curioso que apenas haya sido mencionado en las noticias, pero es a la vez un consuelo pensar que para los medios tradicionales los viajes de SpaceX son ya rutina. Esa es la idea: algún día los viajes a Marte en las sucesoras de las Falcon y Starship también serán rutina.

miércoles, 14 de octubre de 2020

Apagado de las redes wifi en puntos DLink con DD-WRT

Con la nueva red "educarex" de escuelas conectadas ya no necesitamos los antiguos puntos wifi DLink DIR-860L. Si los dejamos encendidos saturan el espacio radioeléctrico y ralentizan previsiblemente nuestra red.

Para evitar esto es conveniente apagar sus dos tarjetas de red, la de la red normal de 2.4Ghz y la de la red 5Ghz (no confundir con el 5G del coronavirus y el chís que nos quieren meter con la vacuna). Desde el interface web podemos apagarlas, pero no sé por que motivo a veces se encienden de nuevo y me encuentro que están emitiendo. Así que lo mejor es apagarlas por comandos, entrando por ssh al punto wifi y tecleando:
# nvram set rc_startup="ifconfig ra0 down; ifconfig ba0 down"
# nvram set cron_enable=1
# nvram set cron_jobs="00 * * * *    root   ifconfig ba0 down
00 * * * *    root   ifconfig ra0 down"
# nvram commit
Lo que hacemos es:
  • Apagar ra0 y ba0 (las 2 tarjetas de red) en cada reinicio del sistema.
  • Apagar ra0 y ba0 a cada hora en punto usando un crontab.
Creo que de esta manera lo tenemos todo apagado y si se levanta...caerá en una hora. Habrá que hacer algo útil con todos estos puntos Dlink sin uso cuando los retiremos definitivamente. Lo primero meter un OpenWRT.
El pasado septiembre la Starship SN6 hizo su segundo salto, esta vez de 150 metros de altura:



Que tiempos aquellos en que los inconscientes se reian de ese deposito de agua cilíndrico que explotaba en las pruebas de estrés de presión. Esa maravilla ha ascendido y bajado con un único motor Raptor desviado del eje de simetría de la nave (vamos, "torcido"). El software que controla ese motor para mantener el cohete en equilibrio debe ser bestial.

jueves, 9 de mayo de 2019

Listar clientes wifi conectados a un punto de acceso OpenWRT/LEDE

Cuanto tenemos un punto de acceso creado desde un dispositivo con OpenWRT o LEDE en el centro educativo puede suceder que se sature porque hay muchos clientes conectados. Es muy útil saber en cualquier momento cuantos clientes tiene asociados nuestro punto, por si fuera necesario hacer una limpieza.

Esto lo haríamos con el comando:
# iw dev wlan0 station dump | grep Station
o bien con:
# iwinfo wlan0 assoclist
Siendo wlan0 la tarjeta wifi sobre la que se monta el punto de acceso. Una vez averiguadas las MACs podemos hacer limpieza expulsando clientes con:
# ubus call hostapd.wlan0 del_client "{'addr':'00:11:22:33:44:55', 'reason':5, 'deauth':false, 'ban_time':0}"

En el último mes Space X nos ha alegrado con el lanzamiento y aterrizaje exítoso de un Falcon Heavy con carga útil (un satélite Arabsat). El despegue:


El aterrizaje de los dos boosters, siempre me queda estremecido esta imagen:


Y el aterrizaje de la etapa central en la barcaza "Of course, I still love you":


Por desgracia, la etapa central cayó al mar por el fuerte oleaje al volver a tierra, ya que falló el anclaje. No volverá a suceder, seguro.

El alucinante vídeo con todo el aterrizaje:

martes, 19 de marzo de 2019

Gestión remota de wifi en un router OpenWRT/LEDE

Tanto en el centro como para usos domésticos tengo varios router con OpenWRT o LEDE donados o recogidos literalmente de la basura. Aunque a veces es dificultoso poner el firmware OpenWRT en los router de las operadoras telefónicas el resultado merece la pena, ya que nos queda un aparatejo con un Linux empotrado y un abanico increíble de posibles usos, una pequeña parte de los cuales ya he tratado aquí. El DD-WRT (primo del OpenWRT) que traen nuestros puntos de acceso D-Link DIR-860L no está mal, pero el OpenwRT es mucho mas versátil, tanto en facilidad de uso como en repositorio de paquetes instalables.

Uno de estos usos es hacerlos funcionar como Puntos de Acceso wifi neutros (Dumb AP) ideales para crear redes wifi por diferentes puntos del edificio.

Al ser un Linux lo que corre por sus entrañas, es sencillo manejar el punto de acceso wifi remotamente desde una aplicación, script y/o consola remota. Ejecutar un comando sobre el router desde otra máquina es tan sencillo como:
# sshpass -p contraseña ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@ip "comando"
Ahora voy a describir 4 secuencias de comandos específicas para manejar la wifi:
  • Encender la wifi:
    wifi up
  • Apagar la wifi:
    wifi down
  • Cambiar la clave de la wifi:
    uci set wireless.@wifi-iface[0].key=clave1234; uci commit wireless;  wifi reload
  • Obtener estado de la wifi (on/off), clave, SSID:
    valor=$(iwinfo | head -1 | wc -l );key=$(uci get wireless.@wifi-iface[0].key);ssid=$(uci get wireless.@wifi-iface[0].ssid);echo $valor:$key:$ssid
Por tanto, para cambiar la clave de la wifi de un punto de acceso desde nuestro PC se haría tecleando:
# sshpass -p contraseña ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@ip "uci set wireless.@wifi-iface[0].key=clave1234; uci commit wireless;  wifi reload"
Con esto queda expuesta la facilidad de manejar estos puntos de acceso remotamente desde cualquier otro entorno con simples comandos. Ahora el límite es nuestra imaginación.



Ya lo sé, tengo debilidad por la Opportunity. Es uno de los aparatos mas condenadamente perfectos que ha hecho nuestra especie.

Su última foto panorámica (hay corrección de color para resaltar los detalles, el tono real es mas rojizo):


Su última foto antes de interrumpir la comunicación (nube de polvo y corte a mitad de la transmisión):


Su próxima foto cuando despierte:

martes, 12 de marzo de 2019

TVHeadend: configuración y uso (I)


Aquí conté mi interés por ver y grabar determinados programas de TV desde el PC. Esta era una forma artesanal de hacerlo, pero investigando al respecto he hallado una joyita llamada TVHeadend. Aviso de que este post es un tocho con el resumen de lo que he ido montando en las últimas semanas.

1. ¿Qué es TVHeadend?

TVHeadend es una aplicación servidor gestionada por un interface web que puede recibir streams de vídeo de diferentes fuentes:

  • Streams de IPTV por Internet.
  • Señal de TDT recibida por una tarjeta de TDT PCI/USB.
  • Señal de TV analógica recibida por una tarjeta de TV PCI/USB.
  • Señal de TV por satélite recibida mediante una tarjeta SAT PCI/USB.
  • Señal de televisión por cable.
  • Otras emisiones de TV más exóticas

Una vez configurados los streams de vídeo (que se corresponderían con los canales de TV), TVHeadend nos permite:

  • Grabarlos en un dispositivo de almacenamiento, funcionando como un PVR.
  • Retransmitirlos a otros puntos de nuestra red o a Internet.
  • Transcodificarlos a otro formato de vídeo.

La versión de TVHeadend que he usado es la 4.3, que aunque es una versión beta funciona razonablemente bien.

2. Instalación.

Yo lo instalé en un PC que tengo encendido 24/7, pero la mayoría de la gente opta por hacerlo en una Raspberry Pi u otro minipc con un disco externo conectado si desea grabar contenidos. Es el tipo de PC ideal para estos casos, aunque hay incluso una solución todavía mas austera usando OpenWrt.

En mi caso, con Manjaro la instalación es tan sencilla como hacer:
# yaourt -S tvheadend-git
Para Debian/Ubuntu los pasos son igualmente sencillos.

Una vez instalada y arrancada como servicio con
# systemctl restart tvheadend.service
Queda escuchando en el puerto 9981 de la máquina donde está instalado. Accederemos a él desde el navegador web con http://ip:9981.


La primera vez que entramos salta un asistente que nos permite configurar el idioma del interface, la lengua preferida para los canales, nos hace crear un usuario administrador y un usuario raso y, si tenemos un sintonizador de TV instalado, detectar los canales. Como en mi caso no tenía sintonizador pues me salté esta última parte.

Una vez configurado el asistente en mi caso tuve un pequeño problema: no me permitía entrar con los usuarios creados anteriormente. Mirando en Internet comentaban verificar si el programa estaba lanzándose con el parámetro "-C", para ello tuve que mirar el fichero .service:

# cat /usr/lib/systemd/system/tvheadend.service 
[Unit]
Description=Tvheadend - a TV streaming server and DVR
After=syslog.target network.target auditd.service

[Service]
EnvironmentFile=/etc/conf.d/tvheadend
ExecStart=/usr/bin/tvheadend -f -p /var/run/tvheadend.pid $OPTIONS
PIDFile=/var/run/tvheadend.pid
Type=forking
Restart=on-failure
RestartSec=54s

# To enable watchdog functionality, uncomment these, remove Type=forking
# and compile with --enable-libsystemd_daemon
#Type=notify
#WatchdogSec=1m
#TimeoutStartSec=5m
#TimeoutStopSec=20

[Install]
WantedBy=multi-user.target
Examinando este fichero determino que la configuración se toma de /etc/conf.d/tvheadend. Allí se define la variable OPTIONS con todos los parámetros usados para levantar el proceso. Entre ellos no estaba "-C", así que lo añado:
# cat /etc/conf.d/tvheadend 
# Configuration file for the tvheadend service.

MALLOC_ARENA_MAX=4
OPTIONS="-u hts -g video -6 --http_port 9981 --htsp_port 9982 -C"
Y luego reinicio el servicio. Despues de esto ya si podía conectarme al interface web con los usuarios creados.

3. Configuración de un stream de vídeo IPTV de entrada.

Como no tengo tarjetas de TV de ningún tipo (vamos, que no me han llegado de Aliexpress) vamos a configurar como fuente una emisión de IPTV. Ya comenté que el mejor sitio para los canales de TV española es éste, ya que se actualiza a menudo (por algún extraño motivo que se me escapa, las cadenas de TV privadas cambian con cierta frecuencia la URL para acceder a sus streamings de vídeo) y está muy ordenadio.

Cogemos la URL de Canal Extremadura:
http://hlstv.canalextremadura.es/livetv/multistream.smil/playlist.m3u8.
Para ver si funciona, nada mas sencillo que hacer:
# vlc http://hlstv.canalextremadura.es/livetv/multistream.smil/playlist.m3u8
Entramos en el interface web, en Configuration->DVB Inputs->Networks y creamos una red de tipo IPTV:


A continuación vamos a Configuration->DVB Inputs->Muxes y añadimos un mux. Nos preguntará en que red y diremos que en la creada en el paso anterior. Luego nos sale el formulario:


Debemos rellenar el campo URL con:
pipe:///usr/bin/ffmpeg -i http://hlstv.canalextremadura.es/livetv/multistream.smil/playlist.m3u8
-vcodec copy -acodec copy -f mpegts pipe:1
En negrita pongo la URL original de acceso a Canal Extremadura online. Con eso construimos una URL de TVHeadend en la que se define el comando que leerá ese streaming.

En Mux name y Service name ponemos "canal-extremadura". Guardamos el mux y esperamos un rato:


Cuando en la columna "Scan result" aparece un OK quiere decir que ha conectado con el streaming. Ahora nos vamos a Configuration->DVB Inputs->Services y vemos que se ha creado un "Servicio" para el streaming:


Ya casi estamos. Nos vamos a Configuration/Channel-EPG/Channel y añadimos el canal:


Completando los campos Name con "canal-extremadura" y Services con el servicio creado anteriormente. Con esto aparece el canal en la lista:


Dando al icono de "Play" de la parte izquierda de la lista se descarga un fichero que al abrirlo lanza el vlc y comienza a visualizarse el canal:


Con esto ya tenemos dado de alta un canal como entrada para TVHeadend. Para dar de alta el resto de canales se procedería igual, incluyendo aquí los canales de TV de pago si disponemos de las URL adecuadas para configurarlos. En Internet hay información de sobra sobre como configurar Movistar+, Canal Satélite, etc con TVHeadend.

4. Clientes TVHeadend.

Una vez tenemos los canales configurados la primera utilidad es poder redirigirlos a otros dispositivos dentro de nuestra red o incluso hacia fuera (por ejemplo, podríamos ver Canal Extremadura en Bulgaria o Movistar+ en la casa del pueblo). Para poder verlos simplemente vale con poner en un navegador "https://ip:9981", validarse (es conveniente usar un usuario no administrador de TVHeadend para poder ver canales) y podremos visualizar los canales configurados.

Pero hay alternativas bastante más elegantes, comentamos algunas:

  • Android: para dispositivos Android hay varias aplicaciones, como TVHClient, TVH Client y muchas más. En general es tan sencillo como dar la IP, el puerto y el usuario/contraseña y la aplicación nos permitirá ver los canales en el móvil
  • Kodi: si tenemos Kodi 18 o superior existe un addon muy potente (más que las aplicaciones Android) llamado "TVHeadend HTSP Client". Se configura rápidamente y tenemos acceso sencillo a muchas funcionalidades. Al ser Kodi multiplataforma podemos instalarlo en casi todos los sistemas operativos.
  • Aparte existen clientes para otros sistemas que funcionan con mayor o menor fortuna.

Mi recomendación es instalar Kodi y el complemento en los PC, tablets y Android Box, y una aplicación Android en los móviles. El addon se integra totalmente en Kodi, como podemos ver:


Si queremos emitir los canales hacia Internet sencillamente bastará con abrir los puertos 9981 y 9982 desde el router y darnos de alta en un servicio de DNS, como se haría para cualquier servicio que queramos ofrecer desde nuestro PC hacia el exterior (por ejemplo, para cámaras de vigilancia, clientes de descarga, servidores web, etc).

5. Cosas que se pueden hacer con el stream de entrada.

Parece que lo único que se puede hacer con el stream de entrada es verlo, pero no es así. Las posibilidades que nos ofrece TVHeadend son muchas más. Podemos:

  • Recodificar: los streams suelen venir en formato H.264 o similar, que son bastante pesados. Puede resultar interesante transcodificar al vuelo a otro formato de de vídeo antes de retransmitirlo. No he estudiado esta vía, así que poco puedo decir al respecto, solo que en Configuration/Stream/Stream Profiles hay diversos perfiles de codificación.
  • Grabar: esta parte es muy interesante para mi. Podemos realizar grabaciones de varios tipos desde la opción Digital Video Recording. Las distintas pestañas son:

    Upcoming/Current Recordings: permite ver las grabaciones pendientes y programar una grabación puntual de un canal en una fecha y hora concreta.


    Timers: permite programar una grabación periódica a unas horas fijas en determinados días de la semana.


    Autorecs: permite programar grabaciones "inteligentes" por distintos criterios (título de programa, intervalo de fecha, etc).


    Finished Recordings
    : permite visualizar, eliminar, descargar, etc las grabaciones que han finalizado. Adicionalmente si usamos el cliente Kodi podemos ver, avanzar y retroceder libremente por las grabaciones que se están efectuando en ese mismo momento.

    Failed Recordings: vemos las grabaciones que han fallado por el motivo que sea.

    Removed Recordings: grabaciones que han sido borradas.

    Todas las grabaciones van por defecto al directorio /home/hts de la máquina donde está TVHeadend (siendo hts el usuario creado en la instalación del programa). Podemos modificar el directorio destino cuando añadimos la grabación.

    En "Configuration/Recordings/Digital Video Recorder Profiles" podemos configurar muchos parámetros sobre como se realizarán las grabaciones, tanto de tiempo como de espacio ocupado. A mi me resulta útil "Recorded file(s) retention period" que dice cuantos días se mantendrá por defecto una grabación en el disco duro antes de ser automáticamente eliminada.

  • Timeshift: esta funcionalidad es la que nos permite "parar la TV" cuando estamos viendo un stream y tenemos una interrupción pero queremos seguir luego por donde ibamos. Lo que realmente se hace al parar el stream es iniciar una grabación que luego podemos poner en marcha y por la que queremos desplazarnos. Se activa y configura en Configuration->Recording->Timeshift.


    Una vez activada, con solo pulsar el botón de "Pause" en el cliente durante la reproducción de un stream empieza a funcionar el timeshift.

6. EPG.

Para finalizar veremos como conectar TVHeadend con una EPG para tener accesible la programación de los canales desde el interface web y los clientes. Esto no es en absoluto necesario, simplemente es una pijadita para dejarlo todo bonito.


Desde aquí podemos ver la programación y pulsando sobre el icono izquierdo de cada programa, crear un timer con su grabación:


TVHeadend no tiene un sistema propio para obtener la programación de EPG, pero usa un API bastante sencillo que facilita todo el proceso.

Los datos de EPG están en numerosos portales de Internet, por ejemplo FormulaTV, y en distintos formatos. Para extraer estos datos se usan unos programas llamados EPG Grabber, que conectan con el portal, lo parsean y generan un XML con los datos de programación de los canales durante los próximos días.

Hay muchos EPG Grabber, después de echar un vistazo me he decantado por WebGrab+Plus por su completitud. Todos los EPG que puede acceder están ordenados por paises aquí. De ellos yo he elegido FormulaTV para España, ya que es un portal bastante serio que lleva muchos años funcionando.

En Manjaro se instala y configura fácilmente, como vemos aquí. Una vez instalado hay que configurarlo para que se ejecute mediante crontab y que lea los datos de una de las posibles fuentes. La instalación en Manjaro/Arch se realiza sobre /opt/wg++, teniendo dentro un directorio /opt/wg++/siteini.pack/Spain con todos los grabbers para España.
# cd /opt/wg++/siteini.pack/Spain
# find | grep -i formula
formulatv.com.channels.xml
formulatv.com.ini
Vemos aquí que hay dos ficheros: el .ini contiene las instrucciones y configuración para realizar el parseo, esa parte no nos interesa. El fichero .channels.xml tiene la lista de canales que son leidos por el grabber:
# cat formulatv.com.channels.xml
<?xml version="1.0" encoding="UTF-8"?>
<site generator-info-name="WebGrab+Plus/w MDB &amp; REX Postprocess -- version V1.56.14 -- Jan van Straaten" site="formulatv.com">
 <channels>
  <channel update="i" site="formulatv.com" site_id="la1" xmltv_id="La 1">La 1</channel>
  <channel update="i" site="formulatv.com" site_id="la2" xmltv_id="La 2">La 2</channel>
  <channel update="i" site="formulatv.com" site_id="antena3" xmltv_id="Antena 3 Televisión">Antena 3 Televisión</channel>
  <channel update="i" site="formulatv.com" site_id="cuatro" xmltv_id="Cuatro">Cuatro</channel>
  <channel update="i" site="formulatv.com" site_id="telecinco" xmltv_id="Telecinco">Telecinco</channel>
  <channel update="i" site="formulatv.com" site_id="lasexta" xmltv_id="laSexta">laSexta</channel>
  <channel update="i" site="formulatv.com" site_id="movistar0" xmltv_id="#0">#0</channel>
  ....
  <channel update="i" site="formulatv.com" site_id="canal-extremadura" xmltv_id="Canal Extremadura">Canal Extremadura</channel>
  ....
 </channels>
</site>
Ahora debemos configurar un usuario para ejecutar WebGrab+Plus, en mi caso será con el usuario "hts" (ya creado para TVHeadend). En su home debemos copiar la carpeta "/usr/share/wg++" y programar la ejecución periódica del grabber.
# su hts
$ cp -R /usr/share/wg++ /home/hts/wg++
$ crontab -e
Metemos en el crontab del usuario "hts" la ejecución del grabber todos los días a las 2:15:
15 2 * * * /usr/bin/wg++
Ahora vamos a configurar el Grabber en /home/hts/wg++/WebGrab++.config.xml (como el usuario que ejecuta wg++ es "hts" se buscará en esa ruta).
$ cat /home/hts/wg++/WebGrab++.config.xml
<?xml version="1.0"?>
<settings>

<!-- for detailed info about the settings see http://webgrabplus.com/documentation/configuration/webgrabconfigxml -->

<filename>guide.xml</filename>
<mode></mode>
<postprocess grab="y" run="n">mdb</postprocess>
<user-agent>Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0</user-agent>
<logging>on</logging>
<retry time-out="5">4</retry>
<timespan>2</timespan>
<update>f</update>

<channel update="i" site="formulatv.com" site_id="canal-extremadura" xmltv_id="canal-extremadura">Canal Extremadura</channel>
<channel update="i" site="formulatv.com" site_id="laSexta" xmltv_id="laSexta">laSexta</channel>
<channel update="i" site="formulatv.com" site_id="la1" xmltv_id="La 1">La 1</channel>

</settings>
Sobre la configuración anterior resalto en negrita las partes sensibles:
  • La salida de la ejecución de wg++ se guardará en /home/hts/wg++/guide.xml.
  • En "site" se pone el nombre de la fuente tal y como aparece en el site de formulatv.com.channels.xml.
  • Cada canal se define con un site_id exactamente igual a como aparece en formulatv.com.channels.xml.
  • En "timespan" ponemos el número de días en el futuro a descargar. Lo mejor es empezar probando con 2 y luego ir aumentando. Creo que FormulaTV proporciona hasta 7 días.
Con todo esto ya tenemos un programa que se ejecutará a diario y que parseará el EPG de la fuente y canales definidos en /home/hts/wg++/WebGrab++.config.xml y lo dejará en formato XML en /home/hts/wg++/guide.xml. No hace falta esperar a las 2:15 para saberlo, podemos ejecutar wg++ a mano desde el usuario hts para que se genere el guide.xml y verificar que todo funciona.

Ahora falta la última parte: conectar el guide.xml para que lo lea TVHeadend y lo integre en su interface. En la página de WebGrabPlus se documenta cómo hacerlo interactuar con diferentes softwares, entre ellos TVHeadend.

Básicamente, hay que bajar un script y ponerlo en la ruta "/usr/bin/tb_grab....". Esto hará que TVHeadend lo reconozca automáticamente como un "grabber interno" y lo ejecute de forma periódica y automática para realizar la sincronización. Los pasos para instalarlo son:
$ sudo wget -O /usr/bin/tv_grab_wg++ http://www.webgrabplus.com/sites/default/files/tv_grab_wg.txt
$ sudo chmod +x /usr/bin/tv_grab_wg++
Después hay que modificar el script para decirle donde está el guide.xml:
$ cat /usr/bin/tv_grab_wg++ 
#!/bin/bash
#xmltv_file_location=~/.wg++/guide.xml
xmltv_file_location=/home/hts/wg++/guide.xml
dflag=
vflag=
...
...
Al ejecutarse desde el servicio TVHeadend el script /usr/bin/tv_grab_wg++ procesará guide.xml y generará unos datos EPG que se insertarán en el formato interno de TVHeadend, del cual desconocemos los detalles. Una cosa muy importante ya comentada en el enlace indicado anteriormente es que el nombre del canal en wg++ debe coincidir con el nombre del canal en TVHeadend. En este caso "canal-extremadura" debe ser igual en ambos sitios, ya que si no es así no podrá establecerse una relación directa entre canal de TVHeadend y canal obtenido de la EPG, y por tanto TVHeadend no podrá mostrar la programación aún cuando esté ahí.

El siguiente paso es activar el grabber en TVHeadend. Para ello iremos a Configuration->Channel/EPG y a las pestaña EPG Grabber Modules(1) activando en la lista que se muestra allí el grabber tv_grab_wg++ y ejecutando luego "Rerun Internal EPG Grabbers" para que se aplique de forma inmediata.


En las pestañas EPG Grabber Channels y Channels revisaremos que está la conexión entre los canales EPG y los canales de TVHeadend.



En la pestaña EPG Grabber podemos configurar ciertos aspectos de ejecución del grabber, como las horas de ejecución y la actualización de diversos datos.


(1) Aquí me he encontrado con un problema que me hizo perder un par de días: en el interface web no se veían las pestañas EPG Grabber Modules y EPG Grabber Channels en Configuration->Channel/EPG. Por tanto no podía activar el grabber interno. Tras mucho probar encontré en este enlace la causa: es un bug del interface web de TVHeadend, que oculta esas pestañas por defecto si no estás en modo de interface "Expert". La solución consiste en cambiar el modo de visualización general de Basic a Expert en General->Base->Default View Level. De esta manera ya aparecen ambas pestañas y podemos configurar el grabber.


Bueno, una vez hecho esto ya tenemos la EPG con los títulos y horas de los programas disponible en todos los interfaces y clientes de TVHeadend y doy por concluido el artículo. De momento no me interesa tocar más hasta que no reciba el adaptador USB de DVB.

7. Enlaces y ampliación.

Unos cuantos enlaces que me han servido de guía y en los que hay más información para seguir profundizando:


Dos fotos llenas de significado:



Son dos imágenes tomadas por el orbitador LRO de la Nasa de la sonda Chang'e 4 de China en la cara oculta de la Luna. Los americanos demostrando que los chinos han llegado a la Luna. En el año del 50 aniversario de alunizaje del Apolo XI estos gestos son muy importantes.

Siempre algún conspiranoico podrá decir que todo esto es CGI, pero junto con la Queqiao se lanzó un microsatelite Longjiang-2 que está realizando fotos y pueden ser descargadas desde la Tierra por cualquier radioaficionado con el equipo adecuado que apunte a Lagrange-2 en las frecuencias 435.400 y 436.400 MHz. Ahora vas y lo cascas.