Obtener la Lista de Canales y Programación de Movistar TV

Por cierto, a mí el igmpproxy con la misma configuración que tú, la real que me genera no incluye la primera línea de altnet, la 172.16, no sé por qué.

Probé configurándolo manualmente con la linea añádida, y downstream también para el interface docker0 y el bridge sobre el que va el container de movistartv y me corrompió el vídeo del blob que había en la tv.

Eso quiere decir que podría pasar el tráfico multicast desde fuera al container, en lugar de darle acceso a la vlan2 con macvlan.

Igualmente, sería útil si funcionase bien, claro. Es lo que más perdido me tiene ahora, cuando v el blob funciona con igmpproxy o omcproxy externoy muestra video corrupto para los directos, no para los u7d, que también funcionan. El grabber sigue sin ir en ninguno de los casos.
 
(Estaba poniendo en este post también la configuración, pero me va a llevar un poco más, así que la dejo para el siguiente)

Es que es lo que te digo, se supone que esa es la IP "pública" del router para la interfaz IPTV:
En el host tengo udpxy y reparte perfectamente la tv a donde quiera
Es normal que desde el host todo vaya perfecto.

Pero a la vez, intentas acceder desde un contenedor metiendo por medio un puente macvlan...
eso sucede en un namespace diferente, tiene diferente mac, es parte de la funcionalidad del macvlan
Haciendo una búsqueda rápida:

Host vs. Bridge

If you use IPTV, SAT>IP or HDHomeRun, you need to create the container with --net=host and remove the -p flags. This is because to work with these services Tvheadend requires a multicast address of 239.255.255.250 and a UDP port of 1900 which at this time is not possible with docker bridge mode.

https://docs.linuxserver.io/images/docker-tvheadend
Y en modo host, si funciona como en LXC, tienes acceso directo a las interfaces del router, debería funcionar igual que te funciona udpxy. De hecho, ya te digo que con LXC funciona perfectamente.

Probé confiurándolo manualmente con downstream no sólo para la lan sino para el interface docker0

podría llegar a pasar directamente desde fuera el tráfico multicast al container, sin darle acceso a la vlan2.
Eso ya suena mejor... el router es el único que tiene acceso directo a la VLAN2 y utilizas OMCProxy para redirigir el tráfico no sólo a la LAN, también al contenedor...

Las pixelaciones o las imágenes corruptas suelen aparecer cuando no se hace uso de IGMP Snooping y todas las interfaces se inundan de tráfico Multicast.

En resumen:
  • Nada de puentes macvlan a la VLAN2, elige entre:
    • Acceso directo a las interfaces de red del host
    • downstream a docker0
  • Desactivar MulticastAllInterface
  • Ojo con el Firewall si usas OMCProxy y docker0
  • TVHeadend es una maravilla....... ;)
 
Última edición:
SIgue sin funcionar.

He parado el container y la red del docker, y pruebo el grabber desde un chroot, con lo que tiene acceso directo a la red del host, y falla igualmente. Esto es con igmpproxy funcionando también en el host. Con omcproxy es exactamente igual.

Eso que pegas me suena del container que hay para el tvheadend en linuxserver, que es lo que empecé a intentar usar esta semana.

SI buscas un poco más veras que el macvlanse puede usar en estos casos, valga como prueba que el blob funciona bien con ese acceso multiplexado a la vlan2.

Lo que no comenté es que estoy con openwrt master que ahora mismo ya no tiene el kmod-bridge y no estoy seguro de que la opción igmp_snooping esté teniendo efecto en mi br-lan.

Por último, el udpxy me funciona tanto en el host como en el container donde tengo el blob de movistsartv y estoy haciendo las pruebas.

Código:
root@XXXX ~ $ schroot -v -c focal
root@XXXX ~ $ cat /etc/lsb-release                                                                                                                                           DISTRIB_ID=Ubuntu                                                                                                                                                                     DISTRIB_RELEASE=20.04                                                                                                                                                             DISTRIB_CODENAME=focal                                                                                                                                                       DISTRIB_DESCRIPTION="Ubuntu 20.04 LTS"                                                                                                                           root@XXXX ~ $ ./tv_grab_es_movistartv --m3u .xmltv/MovistarTV                                                                                       Traceback (most recent call last):                                                                                                                                                   File "./tv_grab_es_movistartv", line 1231, in <module>                                                                                                               print u'Excepción:\n\n\t %s\n\nTraceback:\n\n\t%s' % (e.message, traceback.format_exc())                                           UnicodeEncodeError: 'ascii' codec can't encode character u'\xf3' in position 7: ordinal not in range(128)                         root@himawari ~ $ cat .xmltv/tv_grab_es_movistartv.log                                                                                                         [30/05/2020 06:30:02] [INFO] ---------------------------------------------------                                                                         [30/05/2020 06:30:02] [INFO] MovistarTV EPG Grabber                                                                                                       [30/05/2020 06:30:02] [INFO] Parámetros: []                                                                                                                           [30/05/2020 06:30:02] [INFO] ---------------------------------------------------                                                                         [30/05/2020 06:30:02] [INFO] Creando caché en /root/.xmltv/cache                                                                                   [30/05/2020 06:30:02] [INFO] Cookie: no encontrada                                                                                                             [30/05/2020 06:30:02] [DEBUG] Caché: configuración no encontrada                                                                                 [30/05/2020 06:30:02] [INFO] Descargando configuración del cliente                                                                                 [30/05/2020 06:30:02] [DEBUG] End Points: buscando                                                                                                         [30/05/2020 06:30:02] [DEBUG] End Points: por defecto                                                                                                       [30/05/2020 06:30:02] [INFO] Set-Cookie: JSESSIONID=6287513ABBA53856FE6342D56F46DADF-node3; Path=/appserver; HttpOnly                                                                                                                                                       
[30/05/2020 06:30:02] [DEBUG] Cache: tv_grab_es_movistartv.cookie guardado                                                               [30/05/2020 06:30:02] [INFO] Descargando pefil del servicio                                                                                               [30/05/2020 06:30:02] [DEBUG] End Points: buscando                                                                                                         [30/05/2020 06:30:02] [DEBUG] End Points: por defecto                                                                                                       [30/05/2020 06:30:03] [INFO] Descargando parámetros de configuración                                                                           [30/05/2020 06:30:03] [DEBUG] End Points: buscando                                                                                                         [30/05/2020 06:30:03] [DEBUG] End Points: por defecto                                                                                                       [30/05/2020 06:30:03] [INFO] tvPackages: UTXBV|UTXCP                                                                                                   [30/05/2020 06:30:03] [INFO] Demarcation: 24                                                                                                                       [30/05/2020 06:30:03] [DEBUG] End Points: buscando                                                                                                         [30/05/2020 06:30:03] [DEBUG] End Points: por defecto                                                                                                       [30/05/2020 06:30:03] [INFO] Nuevos End Points: [u'epNoCach8', u'epNoCach9', u'epNoCach4', u'epNoCach5', u'epNoCach6', u'epNoCach7', u'epNoCach1', u'epNoCach2', u'epNoCach3', u'epNoCach10']                                               [30/05/2020 06:30:03] [DEBUG] Cache: tv_grab_es_movistartv.endpoints guardado                                                         [30/05/2020 06:30:03] [INFO] Descargando mapa de géneros                                                                                               [30/05/2020 06:30:03] [DEBUG] Cache: config.json guardado                                                                                               [30/05/2020 06:30:03] [INFO] Buscando el Proveedor de Servicios de Galicia                                                                     [30/05/2020 06:30:03] [DEBUG] Caché: datos del Proveedor de Servicios no encontrados                                               [30/05/2020 06:30:03] [DEBUG] Descargando XML de 239.0.2.129:3937                                                                         [30/05/2020 06:30:06] [ERROR] Error al descargar los archivos XML: ('timed out',)                                                             [30/05/2020 06:30:06] [ERROR] Usando el Proveedor de Servicios por defecto: 239.0.2.150                                           [30/05/2020 06:30:06] [DEBUG] Caché: metadatos de la EPG no encontrados                                                                   [30/05/2020 06:30:06] [INFO] Descargando canales, paquetes e índices                                                                             [30/05/2020 06:30:06] [DEBUG] Descargando XML de 239.0.2.150:3937                                                                         [30/05/2020 06:30:09] [ERROR] Error al descargar los archivos XML: ('timed out',)                                                   
[30/05/2020 06:30:09] [CRITICAL] 'NoneType' object has no attribute '__getitem__'
Traceback (most recent call last):
  File "./tv_grab_es_movistartv", line 1196, in <module>
    xdata = iptv.get_service_provider_data()
  File "./tv_grab_es_movistartv", line 805, in get_service_provider_data
    self.__get_epg_data(connection['mcast_grp'], connection['mcast_port'])
  File "./tv_grab_es_movistartv", line 797, in __get_epg_data
    'channels': self.__get_channels(xml['2_0']),
TypeError: 'NoneType' object has no attribute '__getitem__'
 
Última edición:
He logrado un avance, consigo que me funcione el grabber en mi portatil que está conectado por wifi, a traves de un punto de acceso Unifi que va conectado por un switch neutro a la lan del OpenWRT.

Tengo el omcproxy funcionando en el OpenWRT.

Desde el propio OpenWRT, desde el chroot, el grabber sigue sin sir.
 
Sí, podría ser, yo también estoy en la verión de git, de finales de febrero, justo antes del cambio al kernel 5 y la verdad es que cero problemas.

No sé decirte... mis casos de uso son distintos a los tuyos. Y Docker... en fin, en mi caso siempre ha sido un pozo de problemas sin fondo. Por eso uso LXC.

Esta es mi configuración:

/etc/config/network
Código:
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 'fd89:abcd:fedc::/48'

config interface 'lan'
    option type 'bridge'
    option ifname 'eth0 eth2 eth3'
    option proto 'static'
    option ipaddr '192.168.1.1'
    option netmask '255.255.255.0'
    option ip6assign '60'
    option igmp_snooping '1'

config interface 'wan'
    option ifname 'eth1'
    option proto 'dhcp'

config interface 'wan6'
    option ifname 'eth1'
    option proto 'dhcpv6'
    option auto '0'

config interface 'voip'
    option proto 'dhcp'
    option ifname 'eth1.3'
    option defaultroute '0'
    option peerdns '0'
    option mtu '1594'

config interface 'iptv'
    option proto 'static'
    option ifname 'eth1.2'
    option ipaddr '10.XX.XX.XX'
    option netmask '255.192.0.0'
    option gateway '10.64.0.1'
    option broadcast '10.127.255.255'
    option defaultroute '0'
    option peerdns '0'
    option mtu '1594'

config interface 'ppp'
    option proto 'pppoe'
    option ifname 'eth1.6'
    option username 'adslppp@telefonicanetap'
    option password 'adslppp'
    option ipv6 'auto'
    option mtu '1492'
    option keepalive '0'

config interface 'vpn'
    option ifname 'tun0'
    option proto 'none'

/etc/config/firewall
Código:
config defaults
    option input 'DROP'
    option output 'ACCEPT'
    option forward 'REJECT'
    option syn_flood '1'
    option auto_helper '1'
    option drop_invalid '1'

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

config rule
    option name 'Allow-DHCP-Renew'
    option src 'wan'
    option proto 'udp'
    option dest_port '68'
    option target 'ACCEPT'
    option family 'ipv4'

config rule
    option name 'Allow-Ping'
    option src 'wan'
    option proto 'icmp'
    option icmp_type 'echo-request'
    option family 'ipv4'
    option target 'ACCEPT'
    option enabled '0'

config rule
    option name 'Allow-IGMP'
    option src 'wan'
    option proto 'igmp'
    option family 'ipv4'
    option target 'ACCEPT'

config rule
    option name 'Allow-UDP-Multicast'
    option src 'wan'
    option proto 'udp'
    option dest 'lan'
    option dest_ip '224.0.0.0/4'
    option target 'ACCEPT'
    option family 'ipv4'

config rule
    option name 'Allow-DHCPv6'
    option src 'wan'
    option proto 'udp'
    option src_ip 'fc00::/6'
    option dest_ip 'fc00::/6'
    option dest_port '546'
    option family 'ipv6'
    option target 'ACCEPT'

config rule
    option name 'Allow-MLD'
    option src 'wan'
    option proto 'icmp'
    option src_ip 'fe80::/10'
    list icmp_type '130/0'
    list icmp_type '131/0'
    list icmp_type '132/0'
    list icmp_type '143/0'
    option family 'ipv6'
    option target 'ACCEPT'

config rule
    option name 'Allow-ICMPv6-Input'
    option src 'wan'
    option proto 'icmp'
    list icmp_type 'echo-request'
    list icmp_type 'echo-reply'
    list icmp_type 'destination-unreachable'
    list icmp_type 'packet-too-big'
    list icmp_type 'time-exceeded'
    list icmp_type 'bad-header'
    list icmp_type 'unknown-header-type'
    list icmp_type 'router-solicitation'
    list icmp_type 'neighbour-solicitation'
    list icmp_type 'router-advertisement'
    list icmp_type 'neighbour-advertisement'
    option limit '1000/sec'
    option family 'ipv6'
    option target 'ACCEPT'
    option enabled '0'

config rule
    option name 'Allow-ICMPv6-Forward'
    option src 'wan'
    option dest '*'
    option proto 'icmp'
    list icmp_type 'echo-request'
    list icmp_type 'echo-reply'
    list icmp_type 'destination-unreachable'
    list icmp_type 'packet-too-big'
    list icmp_type 'time-exceeded'
    list icmp_type 'bad-header'
    list icmp_type 'unknown-header-type'
    option limit '1000/sec'
    option family 'ipv6'
    option target 'ACCEPT'
    option enabled '0'

config rule
    option name 'Allow-IPSec-ESP'
    option src 'wan'
    option dest 'lan'
    option proto 'esp'
    option target 'ACCEPT'
    option enabled '0'

config rule
    option name 'Allow-ISAKMP'
    option src 'wan'
    option dest 'lan'
    option dest_port '500'
    option proto 'udp'
    option target 'ACCEPT'

config include
    option path '/etc/firewall.user'

config zone
    option forward 'REJECT'
    option output 'ACCEPT'
    option name 'voip'
    option input 'ACCEPT'
    option masq '1'
    option mtu_fix '1'
    option network 'voip'

config zone
    option input 'DROP'
    option forward 'REJECT'
    option output 'ACCEPT'
    option name 'iptv'
    option masq '1'
    option mtu_fix '1'
    option network 'iptv'

config forwarding
    option dest 'iptv'
    option src 'lan'

config forwarding
    option dest 'voip'
    option src 'lan'

config forwarding
    option dest 'wan'
    option src 'lan'

config rule
    option src 'wan'
    option target 'ACCEPT'
    list proto 'udp'
    option dest_port 'XXXXX'
    option name 'Allow-OpenVPN'

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

config zone
    option name 'wan'
    option input 'DROP'
    option output 'ACCEPT'
    option forward 'REJECT'
    option masq '1'
    option mtu_fix '1'
    option network 'ppp wan wan6'

config forwarding
    option dest 'vpn'
    option src 'iptv'

config forwarding
    option dest 'vpn'
    option src 'lan'

config forwarding
    option dest 'vpn'
    option src 'wan'

config forwarding
    option dest 'iptv'
    option src 'vpn'

config forwarding
    option dest 'lan'
    option src 'vpn'

config forwarding
    option dest 'wan'
    option src 'vpn'

config include 'miniupnpd'
    option type 'script'
    option path '/usr/share/miniupnpd/firewall.include'
    option family 'any'
    option reload '1'

/etc/firewall.user
Código:
##
## RIPd y la entrada de VOD la gestiono aquí, pero no tienen porqué estar aquí
## OJO: Los helpers de Netfilter para RTSP ya no funcionan por seguridad, hay que hacerlo a mano con DNAT
##

# Rutas RIP
iptables -I INPUT 4 -i eth1.2 -p udp -m udp --dport 520 -j ACCEPT
iptables -I INPUT 4 -i eth1.3 -p udp -m udp --dport 520 -j ACCEPT

# Entrada de VOD
iptables -t nat -A PREROUTING -i eth1.2 -p udp -j DNAT --dport 28241 --to-destination 192.168.1.2
[...]
iptables -t nat -A PREROUTING -i eth1.2 -p udp -j DNAT --dport 27000:28240 --to-destination 192.168.1.200

/etc/config/dhcp
Código:
config dnsmasq
    option domainneeded '1'
    option localise_queries '1'
    option rebind_protection '1'
    option rebind_localhost '1'
    option local '/mi.dominio.es/'
    option domain 'mi.dominio.es'
    option expandhosts '1'
    option authoritative '1'
    option readethers '1'
    option leasefile '/tmp/dhcp.leases'
    list rebind_domain 'telefonica.net'
    option filterwin2k '1'
    option nonegcache '1'
    list server '172.26.23.3'
    option enable_tftp '1'
    option tftp_root '/tftp'
    option dhcp_boot 'lpxelinux.0'
    option ednspacket_max '5120'
    option dnsforwardmax '1024'
    option cachesize '4096'
    option localservice '1'

config dhcp 'lan'
    option interface 'lan'
    option leasetime '12h'
    option dhcpv6 'disabled'
    option ra 'server'
    option ra_management '1'
    option start '101'
    option limit '99'
    option networkid 'tag:!ial'
    list dhcp_option '240,:::::239.0.2.10:22222:v6.0:239.0.2.30:22222'

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'

config vendorclass 'vendortv'
    option vendorclass 'IAL'
    option networkid 'ial'

config dhcp 'ial'
    option networkid 'tag:ial'
    option interface 'lan'
    option start '200'
    option limit '24'
    option leasetime '24h'
    list dhcp_option 'IAL,6,172.26.23.3'
    list dhcp_option 'IAL,240,:::::239.0.2.10:22222:v6.0:239.0.2.30:22222'

/etc/dnsmasq.conf
Código:
tftp-secure

dhcp-option=ial,6,172.26.23.3
dhcp-option=ial,240,:::::239.0.2.10:22222:v6.0:239.0.2.30:22222

dhcp-match=set:efi,option:client-arch,7
dhcp-match=set:efi,option:client-arch,9
dhcp-match=set:ipxe,175
dhcp-boot=tag:ipxe,http://www/boot.php
dhcp-boot=tag:efi,ipxe.efi

/etc/config/igmpproxy
Código:
config igmpproxy
    option quickleave '1'

config phyint
    option network 'iptv'
    option zone 'iptv'
    option direction 'upstream'
    list altnet '172.16.0.0/12'
    list altnet '192.168.1.0/24'

config phyint
    option network 'lan'
    option zone lan
    option direction 'downstream'

/etc/quagga/ripd.conf
Código:
hostname router
password zebrapass
log file /var/log/ripd.log
!
router rip
 version 2
 network eth1.2
 network eth1.3
 passive-interface eth1.2
 passive-interface eth1.3
!
line vty
!

/etc/quagga/zebra.conf
Código:
hostname router
password zebrapass
enable password zebrapass
log file /var/log/zebra.log
!
interface lo
!
interface eth0
!
interface eth1
!
interface eth2
!
interface eth3
!
interface br-lan
!
interface eth1.2
!
interface eth1.3
!
interface eth1.6
!
interface pppoe
!
ip forwarding
ipv6 forwarding
!
!
line vty
!

/etc/sysctl.conf
Código:
net.ipv4.conf.all.force_igmp_version = 2
net.nf_conntrack_max = 262144
vm.max_map_count = 262144

Te dejo 3 scripts, uno aumenta el tiempo de reinicio de LuCi a 20 segundos, los otros dos arreglan lxc-checkconfig y montan el cgroup de systemd que OpenWRT por defecto no monta.

/usr/bin/fix-lxc-auto
Bash:
#!/bin/bash

# Monta el cgroup de systemd antes de arrancar un contenedor (si no está montado)
cat /etc/init.d/lxc-auto | sed -e "s/start() {/start() {\n\tmount -a\n\tif [ ! -d \"\/sys\/fs\/cgroup\/systemd\" ]; then\n\t\tmkdir \/sys\/fs\/cgroup\/systemd\n\t\tmount -t cgroup -o rw,nosuid,nodev,noexec,relatime,none,name=systemd cgroup \/sys\/fs\/cgroup\/systemd\n\tfi/g" -i /etc/init.d/lxc-auto

exit 0

/usr/bin/fix-lxc-checkconfig
Bash:
#/bin/bash

if ! grep -iq ZX /usr/bin/lxc-checkconfig; then
  sed -i '/SETCOLOR_FAILURE/   s/\"\$SET/\$SET/'  /usr/bin/lxc-checkconfig
  sed -i '/SETCOLOR_FAILURE/   s/ILURE\"/ILURE/'  /usr/bin/lxc-checkconfig
  sed -i '/xt_CHECKSUM$/a echo'                   /usr/bin/lxc-checkconfig
  sed -i '/E_INSTANCES$/a echo'                   /usr/bin/lxc-checkconfig
  sed -i '/ROUP_NS yes$/a echo'                   /usr/bin/lxc-checkconfig
  sed -i '/CAPABILITIES/  s/ES )/ES; echo \)/'    /usr/bin/lxc-checkconfig
  echo "### ZX: Formatting fixes applied"      >> /usr/bin/lxc-checkconfig
fi

exit 0

/usr/bin/fix-luci-reboot-time
Bash:
#!/bin/bash

# Aumenta el tiempo de espera antes de reinicar a 20s
cat /www/luci-static/resources/ui.js | sed -e "s/,5000)/,20000)/g" -i /www/luci-static/resources/ui.js

exit 0

Y por ultimo, un par de ejemplos de configuración de los contendedores:

Con las intefaces de red del host:
/srv/lxc/ovpnadmin/config
Código:
# Template used to create this container: /usr/share/lxc/templates/lxc-download
# Parameters passed to the template: --dist ubuntu --release bionic --arch amd64 --server images.linuxcontainers.org
# For additional config options, please look at lxc.container.conf(5)

# Uncomment the following line to support nesting containers:
#lxc.include = /usr/share/lxc/config/nesting.conf
# (Be aware this has security implications)

# Distribution configuration
lxc.include = /usr/share/lxc/config/ubuntu.common.conf
lxc.arch = linux64

# Container specific configuration
lxc.rootfs.path = dir:/srv/lxc/ovpnadmin/rootfs
lxc.uts.name = ovpnadmin

# OpenVPN
lxc.mount.entry = /etc/openvpn etc/openvpn none bind 0 0

# Network configuration
lxc.net.0.type = none

Obteniendo IP mediante el servidor DHCP del router:
/srv/lxc/contenedor2/config
Código:
# Template used to create this container: /usr/share/lxc/templates/lxc-download
# Parameters passed to the template: --dist ubuntu --release bionic --arch amd64 --server images.linuxcontainers.org --no-validate
# For additional config options, please look at lxc.container.conf(5)

# Uncomment the following line to support nesting containers:
#lxc.include = /usr/share/lxc/config/nesting.conf
# (Be aware this has security implications)

# Distribution configuration
lxc.include = /usr/share/lxc/config/ubuntu.common.conf
lxc.arch = linux64

# Container specific configuration
lxc.rootfs.path = dir:/srv/lxc/contenedor2/rootfs
lxc.uts.name = contenedor2

# Network configuration
lxc.net.0.type = veth
lxc.net.0.flags = up
lxc.net.0.link = br-lan
lxc.net.0.name = eth0
lxc.net.0.veth.pair = lxc0
lxc.net.0.hwaddr = 00:00:01:00:00:01
 
Olvidemos el docker, intento que funcione el grabber directamente en el host (con un chroot ya que no tengo python2 en el openwrt).

Ahora mismo me funciona en el portatil con wifi, pero no en el chroot del openwrt.

Aparte de los mtu que tienes en el voip y el iptv, me llaman la atención las IPs que usas con el DNAT,
Código:
# Entrada de VOD
iptables -t nat -A PREROUTING -i eth1.2 -p udp -j DNAT --dport 28241 --to-destination 192.168.1.2
[...]
iptables -t nat -A PREROUTING -i eth1.2 -p udp -j DNAT --dport 27000:28240 --to-destination 192.168.1.200

A qué corresponden?
 
Son las IP de los equipos de la LAN que reciben VOD, entre ellos el deco (192.168.1.200)

Los helpers de Netfilter ya no van:
Código:
## OJO: Los helpers de Netfilter para RTSP ya no funcionan por seguridad, hay que hacerlo a mano con DNAT
Y los MTU de las VLAN2 y VLAN3 son los correctos ;)
 
Última edición:
Sigo en el mismo punto, ahora funcionan en los equipos de la lan, por wifi además, me va todo, el blob y el grabber. Esto ayer no me iba.

Dentro del host es diferente, con el blob puedo ver los últimos 7 días pero no los directos, ni el grabber tampoco va.

El container con el blob lo he dejado en modo host. El grabber lo pruebo tanto desde el container ese como desde un chroot sin el docker funcionando. En ningún caso me va.

Teniendo esto en cuenta se me ocurre una forma de conseguir q me vaya en el host, dentro de un container, y es haciendo un bridge macvlan, con el que puedo asignarle otra ip dentro de la lan. Aún así preferiría hacerlo todo en modo host, sigo sin entender por qué si veo el tráfico multicast en mi br-lan cuando uso el grabber en otro equipo pero el grabber no va desde el mismo host.
 
Eso todo ya lo he comprobado.

Pero de alguna forma lo he hecho funcionar. Pego más tarde todo lo necesario.

Consigo que me funcione el grabber dentro de la misma máquina donde está el OpenWRT, en un docker con un macvlan bridge hecho sobre el br-lan, con lo que le asigno una IP de mi lan principal, diferente de la del host.

Lo raro es que para e blob si hago esto puedo ver los directos y la programación pero fallan los últimos 7 días.

De momento y hasta que tenga la solución con el tvheadend completamente funcional, tiro de dos dockers. Uno con el blob como lo tenía últimamente, el que pegué anteriormente. Eso implica que dentro del container tengo un eth0 de una red interna de docker y un eth1 sobre la eth0.2, activo la opción de multicast a todos los interfaces, y tengo un bird de fondo. Asi me funciona plenamente el bob. También me funciona si uso la parte server de blob en el portátil, o sea que tengo todo el tráfico multicast por la wifi, cosa que más adelante veré de anular ya que no lo necesito y prefiero tener la wifi lo más limpia posible

El otro docker es el del tvheadend, con su comskip y tu grabber. Este va sobre un bridge macvlan hecho sobre el br-lan (lo hago con un hotplug y le asigno ip y mac con la propia config/network del openwrt). De esta manera el grabber consigue descargar todo lo que necesita. Tengo que ver si el tvheadend consigo hacerlo funcionar al completo, no sólo los directos sino también los últimos 7 días.

Olvidaba decir que en el openwrt tengo el igmpproxy volcando el multicast de la vlan2 a br-lan y al veth2 (como he llamado al bridge macvlan). EL volcado al br-lan hace falta para poder ejecutar el grabber o el blob server en cualquier otro equipo, entiendo que si enchufo un decoder original también debería ir ahora (lo tengo guardado en su caja de lo poco me me gusta). Y el volcado al veth2 resulta necesario si quiero que funcione el grabber dentro del container, a pesarde que ya sea un bridge hecho sobre el propio br-lan.

En el mismo host, con la ip .1 no he encontrado manera de que funcione.
 
Consigo que me funcione el grabber dentro de la misma máquina donde está el OpenWRT, en un docker con un macvlan bridge hecho sobre el br-lan, con lo que le asigno una IP de mi lan principal, diferente de la del host.
Que es lo normal y así aislas los contenedores de OpenWRT, tienes acceso directo desde la LAN y no necesitas pelearte ni con OMCProxy ni con el Firewall.

Tienes que estar aprendiendo la de dios, pero te has metido en un jardín de tres pares :D

El día que tengas que actualizar, ¿has pensado cómo lo vas a hacer? En mi caso lo hago desde LuCi, subo la imagen comprimida y listo, no tengo que volver a tocar nada, tengo dos particiones (SO y contendores) y al reiniciar queda todo igual que estaba.

Metieron Docker en OpenWRT hace cuatro días, no está tan maduro como LXC:

lxc-openwrt.png

Un saludo.
 
Estoy aprendiendo en este confinamiento sobre QoS, docker, macvlan y multicast la hostia.

El igmpproxy no me lo puedo evitar, lo tengo en el host volcando el multicast al veth2. Veo que el grabber tarda bastante en descargar toda la programación, el blob eso lo hace en mucho menos tiempo.

El tvheadend ya lo tengo configurado, me escaneó bien todos los canales. Estoy esperando a tener la programación completa para probarlo.

Me falta también tener los addons parcheados del hts. No tendras por casualidad algún buill para android arm64 (lo quiero para a Shield)? E inluso para linux x86-64 (para probarlo primero desde el portátil). Si no, aún me queda preparar todo para su buildeo.

De momento tengo aún el blob funcionando. He visto que los últimos 7 días a veces se me para durante la reproducción, aunque el container donde está no debería ver más que la vlan2, parece que alguna subscripción igmp la contesta el host cuando es el container el que debería. No sé si me equivoco mucho en esto. Sigo sin entender por qué volcando el multicast al br-lan, el blob me funciona si ejecuto server y cliente en un portatil conectado por wifi, pero no dentro de un container tal como tengo el tvheadend ahora (con el macvlan bridge y sin acceso directo a la vlan2).

Puede que no necesitara usar un macvlan bridge, y haya forma de hacerlo con la red por defecto del docker, volcando también el multicast desde el host, pero me resultaría mucho mas sucio conseguir integrarlo en el OpenWRT.

Con respecto a cómo voy a hacer para actualizarlo, no hay problema. Los builds me los genero yo, desde la propia máquina, desde el chroot del que pegué alguna cosa. Y la configuración la voy haciendo gradual, con un repo propio para el dir ./files del buildroot del openwrt, donde voy commiteando a medida que los cambios me convencen.

Llevo bastante tiempo usando OpenWRT, ya he estado contratado para montar cosas con él, así que me siento muy cómodo. Lo tengo con uefi y con dual partitions a la android (puedes ver el pull request correspondiente en el github del openwrt),

También hice otro pull request para el docker-compose que debe estar a punto de ser mergeado.

Cuando empecé con todo esto también instalé el lxc, lo pensaba usar para tener una arch en la que hacer cosas pero al final con el docker-compose me fue mucho más sencillo. Tengo un controlador de unifi, un emby, un medusa, un transmission, un nextcloud, un gitlab y un jitsi-meet, cada uno en su docker. De momento tengo también un comskip que con inotify escanea cada grabación completada por el blob, le pone marcas y lo reescribe.

Aún así echaba de menos poder hacer timeshift (con el blob no lo conseguí nunca), y olvidarme de los cortes en el video cuando hay una trasnferencia gorda de datos en la wifi. Además de que me encanta tener acceso al código y poder mejorarlo y aprender. Con tu grabber puedo, con el blob no.

Screenshot_20200530_212508.png
 
Última edición:
Tengo funcionando el tvheadend con el epg completo. Lo he probado con el addon pvr.hts sin parchear y los directos van perfectos. El build con tus cambios me falla, pvr.hts, se ve que no hice bien el merge.

Código:
In file included from /home/jmarcet/src/AUR/kodi-addon-pvr-hts/src/pvr.hts/src/tvheadend/TimeRecordings.cpp:25:                                                                                                                                                                                                                                                                            
/home/jmarcet/src/AUR/kodi-addon-pvr-hts/src/pvr.hts/src/tvheadend/entity/Recording.h:234:26: error: ‘const string& tvheadend::entity::Recording::GetImage() const’ cannot be overloaded with ‘const string& tvheadend::entity::Recording::GetImage() const’                                                                                                                               
  234 |       const std::string& GetImage() const { return m_image; }                                                                                                                                                                                                                                                                                                                      
      |                          ^~~~~~~~                                                     
/home/jmarcet/src/AUR/kodi-addon-pvr-hts/src/pvr.hts/src/tvheadend/entity/Recording.h:198:26: note: previous declaration ‘const string& tvheadend::entity::Recording::GetImage() const’                                                                                                                                                                                                    
  198 |       const std::string& GetImage() const { return m_image; }                                                                                                                        
      |                          ^~~~~~~~                                                     
/home/jmarcet/src/AUR/kodi-addon-pvr-hts/src/pvr.hts/src/tvheadend/entity/Recording.h:235:12: error: ‘void tvheadend::entity::Recording::SetImage(const string&)’ cannot be overloaded with ‘void tvheadend::entity::Recording::SetImage(const string&)’                                                                                                                                   
  235 |       void SetImage(const std::string &image) { m_image = image; }                                                                                                                   
      |            ^~~~~~~~                                                                   
/home/jmarcet/src/AUR/kodi-addon-pvr-hts/src/pvr.hts/src/tvheadend/entity/Recording.h:199:12: note: previous declaration ‘void tvheadend::entity::Recording::SetImage(const string&)’                                                                                                                                                                                                      
  199 |       void SetImage(const std::string &image) { m_image = image; }                                                                                                                   
      |            ^~~~~~~~                                                                   
/home/jmarcet/src/AUR/kodi-addon-pvr-hts/src/pvr.hts/src/tvheadend/entity/Recording.h:273:24: error: redeclaration of ‘std::string tvheadend::entity::Recording::m_image’                                                                                                                                                                                                                  
  273 |       std::string      m_image;                                                       
      |                        ^~~~~~~                                                        
/home/jmarcet/src/AUR/kodi-addon-pvr-hts/src/pvr.hts/src/tvheadend/entity/Recording.h:262:24: note: previous declaration ‘std::string tvheadend::entity::Recording::m_image’                                                                                                                                                                                                               
  262 |       std::string      m_image;                                                       
      |                        ^~~~~~~                                                        
make[2]: *** [CMakeFiles/pvr.hts.dir/build.make:200: CMakeFiles/pvr.hts.dir/src/tvheadend/TimeRecordings.cpp.o] Error 1                                                                      
make[2]: *** Waiting for unfinished jobs....                                                  
In file included from /home/jmarcet/src/AUR/kodi-addon-pvr-hts/src/pvr.hts/src/Tvheadend.h:43,                                                                                               
                 from /home/jmarcet/src/AUR/kodi-addon-pvr-hts/src/pvr.hts/src/client.cpp:26:                                                                                                
/home/jmarcet/src/AUR/kodi-addon-pvr-hts/src/pvr.hts/src/tvheadend/entity/Recording.h:234:26: error: ‘const string& tvheadend::entity::Recording::GetImage() const’ cannot be overloaded with ‘const string& tvheadend::entity::Recording::GetImage() const’                                                                                                                               
  234 |       const std::string& GetImage() const { return m_image; }                                                                                                                        
      |                          ^~~~~~~~                                                     
/home/jmarcet/src/AUR/kodi-addon-pvr-hts/src/pvr.hts/src/tvheadend/entity/Recording.h:198:26: note: previous declaration ‘const string& tvheadend::entity::Recording::GetImage() const’                                                                                                                                                                                                    
  198 |       const std::string& GetImage() const { return m_image; }                                                                                                                        
      |                          ^~~~~~~~                                                     
/home/jmarcet/src/AUR/kodi-addon-pvr-hts/src/pvr.hts/src/tvheadend/entity/Recording.h:235:12: error: ‘void tvheadend::entity::Recording::SetImage(const string&)’ cannot be overloaded with ‘void tvheadend::entity::Recording::SetImage(const string&)’                                                                                                                                   
  235 |       void SetImage(const std::string &image) { m_image = image; }                                                                                                                   
      |            ^~~~~~~~                                                                   
/home/jmarcet/src/AUR/kodi-addon-pvr-hts/src/pvr.hts/src/tvheadend/entity/Recording.h:199:12: note: previous declaration ‘void tvheadend::entity::Recording::SetImage(const string&)’                                                                                                                                                                                                      
  199 |       void SetImage(const std::string &image) { m_image = image; }                                                                                                                   
      |            ^~~~~~~~                                                                   
/home/jmarcet/src/AUR/kodi-addon-pvr-hts/src/pvr.hts/src/tvheadend/entity/Recording.h:273:24: error: redeclaration of ‘std::string tvheadend::entity::Recording::m_image’                                                                                                                                                                                                                  
  273 |       std::string      m_image;                                                       
      |                        ^~~~~~~                                                        
/home/jmarcet/src/AUR/kodi-addon-pvr-hts/src/pvr.hts/src/tvheadend/entity/Recording.h:262:24: note: previous declaration ‘std::string tvheadend::entity::Recording::m_image’                                                                                                                                                                                                               
  262 |       std::string      m_image;                                                       
      |                        ^~~~~~~                                                        
make[2]: *** [CMakeFiles/pvr.hts.dir/build.make:83: CMakeFiles/pvr.hts.dir/src/client.cpp.o] Error 1                                                                                         
In file included from /home/jmarcet/src/AUR/kodi-addon-pvr-hts/src/pvr.hts/src/tvheadend/AutoRecordings.cpp:26:                                                                              
/home/jmarcet/src/AUR/kodi-addon-pvr-hts/src/pvr.hts/src/tvheadend/entity/Recording.h:234:26: error: ‘const string& tvheadend::entity::Recording::GetImage() const’ cannot be overloaded with ‘const string& tvheadend::entity::Recording::GetImage() const’                                                                                                                               
  234 |       const std::string& GetImage() const { return m_image; }                                                                                                                        
      |                          ^~~~~~~~                                                     
/home/jmarcet/src/AUR/kodi-addon-pvr-hts/src/pvr.hts/src/tvheadend/entity/Recording.h:198:26: note: previous declaration ‘const string& tvheadend::entity::Recording::GetImage() const’                                                                                                                                                                                                    
  198 |       const std::string& GetImage() const { return m_image; }                                                                                                                        
      |                          ^~~~~~~~                                                     
/home/jmarcet/src/AUR/kodi-addon-pvr-hts/src/pvr.hts/src/tvheadend/entity/Recording.h:235:12: error: ‘void tvheadend::entity::Recording::SetImage(const string&)’ cannot be overloaded with ‘void tvheadend::entity::Recording::SetImage(const string&)’                                                                                                                                   
  235 |       void SetImage(const std::string &image) { m_image = image; }                                                                                                                   
      |            ^~~~~~~~                                                                   
/home/jmarcet/src/AUR/kodi-addon-pvr-hts/src/pvr.hts/src/tvheadend/entity/Recording.h:199:12: note: previous declaration ‘void tvheadend::entity::Recording::SetImage(const string&)’                                                                                                                                                                                                      
  199 |       void SetImage(const std::string &image) { m_image = image; }                                                                                                                   
      |            ^~~~~~~~                                                                   
/home/jmarcet/src/AUR/kodi-addon-pvr-hts/src/pvr.hts/src/tvheadend/entity/Recording.h:273:24: error: redeclaration of ‘std::string tvheadend::entity::Recording::m_image’                                                                                                                                                                                                                  
  273 |       std::string      m_image;                                                       
      |                        ^~~~~~~                                                        
/home/jmarcet/src/AUR/kodi-addon-pvr-hts/src/pvr.hts/src/tvheadend/entity/Recording.h:262:24: note: previous declaration ‘std::string tvheadend::entity::Recording::m_image’                                                                                                                                                                                                               
  262 |       std::string      m_image;                                                       
      |                        ^~~~~~~                                                        
make[2]: *** [CMakeFiles/pvr.hts.dir/build.make:109: CMakeFiles/pvr.hts.dir/src/tvheadend/AutoRecordings.cpp.o] Error 1                                                                      
In file included from /home/jmarcet/src/AUR/kodi-addon-pvr-hts/src/pvr.hts/src/Tvheadend.h:43,                                                                                               
                 from /home/jmarcet/src/AUR/kodi-addon-pvr-hts/src/pvr.hts/src/Tvheadend.cpp:22:                                                                                             
/home/jmarcet/src/AUR/kodi-addon-pvr-hts/src/pvr.hts/src/tvheadend/entity/Recording.h:234:26: error: ‘const string& tvheadend::entity::Recording::GetImage() const’ cannot be overloaded with ‘const string& tvheadend::entity::Recording::GetImage() const’                                                                                                                               
  234 |       const std::string& GetImage() const { return m_image; }                                                                                                                        
      |                          ^~~~~~~~                                                     
/home/jmarcet/src/AUR/kodi-addon-pvr-hts/src/pvr.hts/src/tvheadend/entity/Recording.h:198:26: note: previous declaration ‘const string& tvheadend::entity::Recording::GetImage() const’                                                                                                                                                                                                    
  198 |       const std::string& GetImage() const { return m_image; }                                                                                                                        
      |                          ^~~~~~~~                                                     
/home/jmarcet/src/AUR/kodi-addon-pvr-hts/src/pvr.hts/src/tvheadend/entity/Recording.h:235:12: error: ‘void tvheadend::entity::Recording::SetImage(const string&)’ cannot be overloaded with ‘void tvheadend::entity::Recording::SetImage(const string&)’                                                                                                                                   
  235 |       void SetImage(const std::string &image) { m_image = image; }                                                                                                                   
      |            ^~~~~~~~                                                                   
/home/jmarcet/src/AUR/kodi-addon-pvr-hts/src/pvr.hts/src/tvheadend/entity/Recording.h:199:12: note: previous declaration ‘void tvheadend::entity::Recording::SetImage(const string&)’                                                                                                                                                                                                      
  199 |       void SetImage(const std::string &image) { m_image = image; }                                                                                                                   
      |            ^~~~~~~~                                                                   
/home/jmarcet/src/AUR/kodi-addon-pvr-hts/src/pvr.hts/src/tvheadend/entity/Recording.h:273:24: error: redeclaration of ‘std::string tvheadend::entity::Recording::m_image’                                                                                                                                                                                                                  
  273 |       std::string      m_image;                                                       
      |                        ^~~~~~~                                                        
/home/jmarcet/src/AUR/kodi-addon-pvr-hts/src/pvr.hts/src/tvheadend/entity/Recording.h:262:24: note: previous declaration ‘std::string tvheadend::entity::Recording::m_image’                                                                                                                                                                                                               
  262 |       std::string      m_image;                                                       
      |                        ^~~~~~~                                                        
make[2]: *** [CMakeFiles/pvr.hts.dir/build.make:96: CMakeFiles/pvr.hts.dir/src/Tvheadend.cpp.o] Error 1                                                                                      
make[1]: *** [CMakeFiles/Makefile2:117: CMakeFiles/pvr.hts.dir/all] Error 2
make: *** [Makefile:172: all] Error 2
==> ERROR: A failure occurred in build().
    Aborting...
 
Lo compilé bien ahora, aunque no aprecio la diferencia en el Kodi. No veo forma de reproducir los últimos 7 días.

Puedes ver en mi copia del repo cómo dejé los cambios.se reduce a setear el género, el subgénero y el título original, donde van los tags que identifican los programas, si no entendí mal cómo funciona.

En el kodi sólo puedo abrir los directos. ¿Te das cuenta de qué me falta?
 
¿Cómo está la situación ahora mismo? Hemos hablado de tanto que me perdí...

Tengo funcionando el tvheadend con el epg completo. Lo he probado con el addon pvr.hts sin parchear y los directos van perfectos.
(y)

Veo que el grabber tarda bastante en descargar toda la programación, el blob eso lo hace en mucho menos tiempo.
Porque lo suyo es un addon PVR de Kodi y lo mío sólo es un grabber.

El grabber se descarga la guía básica por Multicast y completa los datos que faltan mediante el Servicio Web de Movistar+, pero lo hace de todos los canales y de tres días completos de una tacada. Claro, tarda...

Su addon le permite cargar la guía básica al arrancar y luego, la información extendida de forma progresiva según se va consultando la guía EPG.

Pero eso era en los inicios, hace tiempo cambió a una movida cliente-servidor... cerrada a cal y canto como siempre... que en fin, ni con un palo (ni lo de ahora ni lo de antes)

TVHeadend es una maravilla ;)

El build con tus cambios me falla, pvr.hts, se ve que no hice bien el merge.
Los parches ya no son necesarios, la versión de git ya tiene soporte para todo lo que metí en su día.

Y pvr.hts también.

Lo compilé bien ahora, aunque no aprecio la diferencia en el Kodi. No veo forma de reproducir los últimos 7 días.

En el kodi sólo puedo abrir los directos. ¿Te das cuenta de qué me falta?
Excepto ésto.

El addon U7D no es público y hasta que Kodi no solucione los problemas de buffering que tiene con los streams RTSP no lo voy a publicar.

No tendras por casualidad algún buill para android arm64 (lo quiero para a Shield)?
No, no tengo la Shield y todo lo que hay disponible es demasiado antiguo.

Tienes información aquí y aquí.

E inluso para linux x86-64 (para probarlo primero desde el portátil). Si no, aún me queda preparar todo para su buildeo.
¿TVHeadend? ¿pvr.hts? ¿OpenWRT?
 
¿Cómo está la situación ahora mismo? Hemos hablado de tanto que me perdí...


(y)


Porque lo suyo es un addon PVR de Kodi y lo mío sólo es un grabber.

El grabber se descarga la guía básica por Multicast y completa los datos que faltan mediante el Servicio Web de Movistar+, pero lo hace de todos los canales y de tres días completos de una tacada. Claro, tarda...

Su addon le permite cargar la guía básica al arrancar y luego, la información extendida de forma progresiva según se va consultando la guía EPG.

Pero eso era en los inicios, hace tiempo cambió a una movida cliente-servidor... cerrada a cal y canto como siempre... que en fin, ni con un palo (ni lo de ahora ni lo de antes)

TVHeadend es una maravilla ;)


Los parches ya no son necesarios, la versión de git ya tiene soporte para todo lo que metí en su día.

Y pvr.hts también.


Excepto ésto.

El addon U7D no es público y hasta que Kodi no solucione los problemas de buffering que tiene con los streams RTSP no lo voy a publicar.


No, no tengo la Shield y todo lo que hay disponible es demasiado antiguo.

Tienes información aquí y aquí.


¿TVHeadend? ¿pvr.hts? ¿OpenWRT?

Hola de nuevo. No me he olvidado de responder, he querido probar y limpiar todo para compartirlo completo. Esta semana han metido por fin en el master del openwrt el docker-compose y de forma casi simultánea han añadido una nueva luci-app-dockerman para controlar docker que funciona de maravilla.

Tengo addon cerrado y tvheadend+grabber dockerizados. He subido copia de todos los docker-compose que tengo en uso a Github.

Todos los contenedores están configurados con direcciones mac estáticas, de forma que puedo llevar buen control de estadísticas de los diferentes servicios. Las macs de cada bridge las listo en `/etc/ethers`. De esta forma con utilidades como nlbwmon, cada docker tiene un nombre fijo.

Para conseguir integrar bien las redes en el openwrt, cada uno de los bridges los añado a la lista de interfaces en `/etc/config/network` sin auto arranque, como para que sólo las active el propio docker.

Completo la integración con este script en `/etc/hotplug.d/net/11-docker-bridges`, en el que la variable IFACES es una lista de los bridges de los que se quiere una mac estática y marcados activos en el host:

Código:
#!/bin/sh

IFACES="docker0 br-tvlan br-unifi"

[ -n "$INTERFACE" -a -n "$( echo $IFACES | grep $INTERFACE )" ] || exit 0

if [ "$ACTION" = add ]; then
        MAC="$( grep $INTERFACE /etc/ethers | cut -d' ' -f1 )"
        [ "$INTERFACE" = "docker0" ] && IFACE=docker || IFACE="${INTERFACE/br-}"
        logger -t docker-bridges "Setting $IFACE network up"
        ifup $IFACE
        logger -t docker-bridges "Setting $INTERFACE mac address to $MAC"
        ifconfig $INTERFACE hw ether $MAC
fi

El `/etc/config/network` es como este, con una entrada tipo la de unifi o tvlan para cada bridge del docker:

Código:
config interface 'loopback'
        option ifname 'lo'
        option proto 'static'
        option ipaddr '127.0.0.1'
        option netmask '255.0.0.0'
      
config interface 'lan'
        option ifname 'eth1'
        option type 'bridge'
        option proto 'static'
        option igmp_snooping '1'
        option ipaddr 'XX.XX.XX.1'
        option netmask '255.255.255.0'

config interface 'wan'
        option ifname 'eth0.6'
        option proto 'pppoe'
        option username 'adslppp@XXXXXXXX'
        option password 'adslppp'
        option ipv6 'auto'
        option peerdns '0'
      
config interface 'iptv'
        option ifname 'eth0.2'
        option proto 'static'
        option ipaddr 'XX.XX.XX.XX'
        option netmask '255.240.0.0'
        option gateway '10.64.0.1'
        option defaultroute '0'
        option peerdns '0'
      
config interface 'voip'
        option ifname 'eth0.3'
        option proto 'dhcp'
        option defaultroute '0'
        option peerdns '0'
      
config interface 'tvlan'
        option ifname 'br-tvlan'
        option delegate '0'
        option proto 'static'
        option netmask '255.255.255.0'
        option ipaddr 'XX.XX.XX.1'
        list dns '172.26.23.3'
        option auto '0'

config interface 'unifi'
        option ifname 'br-unifi'
        option delegate '0'
        option proto 'static'
        option netmask '255.255.255.0'
        option ipaddr 'XX.XX.XX.1'
        option auto '0'
      
config interface 'docker'
        option ifname 'docker0'
        option proto 'static'
        option netmask '255.255.255.0'
        option ipaddr 'XX.XX.XX.1'
        option auto '0'

Sólo falta el `/etc/config/firewall`:

Código:
config defaults
        option syn_flood '1'
        option input 'REJECT'
        option output 'ACCEPT'
        option forward 'REJECT'
        option drop_invalid '1'
        option flow_offloading '0'
        option flow_offloading_hw '0'
        option auto_helper '1'
      
config zone
        option name 'lan'
        option input 'ACCEPT'
        option output 'ACCEPT'
        option forward 'REJECT'
        option network 'lan'
      
config zone
        option network 'docker'
        option input 'REJECT'
        option output 'ACCEPT'
        option forward 'REJECT'
        option name 'docker'
      
config zone
        option network 'tvlan'
        option input 'REJECT'
        option output 'ACCEPT'
        option forward 'REJECT'
        option name 'tvlan'
      
config zone
        option network 'unifi'
        option input 'REJECT'
        option output 'ACCEPT'
        option forward 'REJECT'
        option name 'unifi'
      
config zone
        option name 'wan'
        option input 'REJECT'
        option output 'ACCEPT'
        option forward 'REJECT'
        option masq '1'
        option mtu_fix '1'
        option network 'wan'
      
config zone
        option name 'iptv'
        option input 'ACCEPT'
        option output 'ACCEPT'
        option forward 'REJECT'
        option masq '1'
        option mtu_fix '1'
        option network 'iptv'
      
config zone
        option name 'voip'
        option input 'ACCEPT'
        option output 'ACCEPT'
        option forward 'REJECT'
        option masq '1'
        option mtu_fix '1'
        option network 'voip'
      
config rule
        option name 'Allow-imagenio@2001'
        option src 'lan'
        option proto 'tcp'
        option dest 'iptv'
        option dest_ip '172.26.22.23'
        option dest_port '2001'
        option family 'ipv4'
        option target 'ACCEPT'

config rule
        option name 'Allow-DHCP-Renew'
        option src 'wan'
        option proto 'udp'
        option dest_port '68'
        option family 'ipv4'
        option target 'ACCEPT'

config rule
        option name 'Allow-Ping'
        option src 'wan'
        option proto 'icmp'
        option icmp_type 'echo-request'
        option family 'ipv4'
        option target 'ACCEPT'

config rule
        option name 'Allow-IGMP'
        option src 'wan'
        option proto 'igmp'
        option family 'ipv4'
        option target 'ACCEPT'

config forwarding
        option src 'lan'
        option dest 'wan'
      
config forwarding
        option src 'lan'
        option dest 'voip'
      
config forwarding
        option src 'tvlan'
        option dest 'iptv'
      
config forwarding
        option src 'iptv'
        option dest 'tvlan'
      
config include
        option path '/etc/firewall.user'

En multimedia/docker-compose.yml están montados ambos contenedores. Bajo multimedia/movistartv está el docker del addon cerrado y bajo multimedia/tvheadend el docker con el tvheadend y tu grabber. El primero necesita acceso al eth0.2, tu grabber funciona con el igmpproxy ejecutado en el host con un `/etc/config/igmpproxy` de este estilo:

Código:
config igmpproxy
        option quickleave '1'                                                                                                                                                                     option verbose '0'                                                                                                                                                                                                                                     
config phyint                                                                                                                                                                                           option network 'iptv'                                                                                                                                                                     option zone 'iptv'                                                                                                                                                                           option altnet '172.0/11'                                                                                                                                                                 option direction 'upstream'                                                                                                                                                

config phyint
        option network 'tvlan'
        option zone 'tvlan'
        option direction 'downstream'
      
config phyint
        option network 'lan'
        option zone 'lan'
        option direction 'disabled'
      
config phyint
        option network 'voip'
        option zone 'voip'
        option direction 'disabled'
      
config phyint
        option network 'wan'
        option zone 'wan'
        option direction 'disabled'

Donde 'tvlan' es el bridge al que está conectado el container del tvheadend.

Con esto está todo separado y funcionando en la misma máquina. Si quieres probar una imagen compilada para x86-64 con todo lo necesario para usar esto, con adblock, banip, docker-compose, igmpproxy, lxc, ksmbd, nfsd, openvpn, tor, udpxy, wireguard, ... e incluso el luci-app-dockerman, puedes encontrar los builds que yo uso aquí.

Tiene de especial que es una imagen con arranque sólo para UEFI, y con doble arranque. Las actualizaciones de firmware se escriben a la partición alternativa y en caso de problemas con la principal (que cambia al actualizar) arranca de la otra. Desde el menú de grub se puede elegir también desde dónde arrancar.

Las fuentes que uso para montar todo están aquí y aquí.
 
Última edición:
Despues de volver a Movistar, no me han instalado ONT + ROUTER. Voy con un HGU. Me ha costado bastante configurar OpenWRT para que funcione en con el modo Semi-Bridge del HGU. Internet fue sencillo PPPoE en la WAN de OpenWRT, pero la TV....

Mas que nada era por curiosidad porque con el DRM... Al menos veo algunos canales sin depender de las apps de cada cadena.
Genero la guia y la lista de canales sin problemas, las puedo pasar a Xteve y de ahi a Plex.

No entiendo demasiado de estas cosas, pero si alguien necesita ayuda, igual puedo echar una mano.

Saludos!
 
Acabo de hacer público un proyecto que permite acceder a todo el IPTV de movistar, directos y últimos 7 días, pudiendo reboninar, pausar y avanzar al gusto por toda la parrilla. Continúa con el siguiente programa y todo en lugar de cortarse al finalizar un programa.

Esto lo logra integrándose en el Android TV, con el TiviMate en particular, que usa catchup Flussonic para los últimos 7 días. Lo que yo he escrito es un proxy a este sistema, por lo que podría funcionar también en cualquier SmartTV moderna que tenga reproductor de IPTV con catchup Flussonic.

Lo podéis encontrar aquí
 
Arriba