Ce fut laborieux mais j'ai enfin pu configurer "IGMPPROXY" et "uHTTPd" dans OpenWRT, version 24.10.0.
On commence par "uHTTPd" :1\ création de ce répertoire "/www/api" et non "/www/api/1.0".
2\ mettre dans "/www/api" tous vos fichiers "*.xml".
3\ mettre le script cgi dans ce même répertoire, mais vous le nommez "1.0".
Je sais, dans l'exemple donné par Rooot, il se nomme gatway.cgi, mais je l'ai bien renommé en "1.0".
C'est ça l'astuce. Pourquoi ? Il faut préciser dans l'url le script cgi qui sera exécuter, sinon cela ne fonctionne pas.
En rouge, le nom du script dans l'url : "192.168.1.1/api/
1.0/?method=ftth.getInfo"
C'est ce que j'ai compris des contraintes de fonctionnement de "uHTTPd".
J'ai cherché à résoudre ce problème en conservant le nom "gateway.cgi", mais cela fut une prise de tête et sans succès.
4\ il faut rendre ensuite ce script cgi exécutable :
chmod +x /www/api/1.0
5\ modification du fichier de configuration "/etc/config/uhttpd". Vous ajoutez :
option cgi_prefix '/api/'
et suppression ou mise en commentaire :
# option cgi_prefix '/cgi-bin'
Voici le fichier "uHTTPd" complet :
config uhttpd 'main'
list listen_http '0.0.0.0:80'
list listen_http '[::]:80'
list listen_https '0.0.0.0:443'
list listen_https '[::]:443'
option redirect_https '0'
option home '/www'
option rfc1918_filter '1'
option max_requests '3'
option max_connections '100'
option cert '/etc/uhttpd.crt'
option key '/etc/uhttpd.key'
# option cgi_prefix '/cgi-bin'
list lua_prefix '/cgi-bin/luci=/usr/lib/lua/luci/sgi/uhttpd.lua'
option script_timeout '60'
option network_timeout '30'
option http_keepalive '20'
option tcp_keepalive '1'
option ubus_prefix '/ubus'
option cgi_prefix '/api/'
config cert 'defaults'
option days '397'
option key_type 'ec'
option bits '2048'
option ec_curve 'P-256'
option country 'ZZ'
option state 'Somewhere'
option location 'Unknown'
option commonname 'OpenWrt'
L'inconvénient de cette astuce est de ne plus disposer de LUCI, ni à aucun autre site web que vous avez hébergé.
Mais votre décodeur TV Plus SFR fonctionne.

C'est le but recherché, non ?
6\ voici le script "cgi" que j'utilise :
#!/bin/sh
METHOD=$(echo "$QUERY_STRING" | sed -n 's/.*method=\([^&]*\).*/\1/p')
case "$METHOD" in
ftth.getInfo) FILE="ftth.xml" ;;
lan.getHostsList) FILE="lan.xml" ;;
system.getInfo) FILE="system.xml" ;;
tv.getInfo) FILE="tv.xml" ;;
usb.getInfo) FILE="usb.xml" ;;
wan.getInfo) FILE="wan.xml" ;;
*)
echo "Status: 404 Not Found"
echo "Content-type: text/html"
echo
echo "Method not found"
exit 0
;;
esac
echo "Content-type: application/xml"
echo
cat "/www/api/$FILE" 2>/dev/null || echo "XML file not found"
C'est le même que celui donné par Rooot, sauf que "/1.0" a disparu du chemin.
On passe maintenant à l'IGMPPROXY.7\ je n'avais pas compris qu'il fallait convertir le fichier igmpproxy que j'utilise sous "systemdnetworkd" dans le format UCI (Unified Configuration Interface). Après quelques recherches, sans se tromper de version puisque je suis dans la "24.10.0", j'ai trouvé comment faire :
config igmpproxy
option quickleave 1
config phyint
option network 'wan'
option direction 'upstream'
option ratelimit 0
option threshold 1
list altnet '1.1.1.1/32'
list altnet 'xxx.xxx.xxx.xxx/26'
list altnet '77.128.0.0/9'
list altnet '224.0.0.0/8'
list altnet '162.168.0.0/16'
config phyint
option network 'br1'
option direction 'downstream'
option ratelimit 0
option threshold 1
J'ai masqué mon adresse IPv4 publique.
8\ il n'est plus nécessaire de préciser les interfaces à interdire.
9\ il ne faut pas mettre les interfaces physiques mais les interfaces logiques.
Ce fichier igmpproxy au format UCI va être convertit et le résultat va se trouver dans "/etc/igmpproxy.conf". OpenWRT va rechercher les interfaces physiques à partir des interfaces logiques afin de les remplacer. Le fichier finalisé se nomme "/etc/igmpproxy.conf" que voici :
quickleave
phyint eth0 upstream ratelimit 0 threshold 1
altnet 1.1.1.1/32
altnet xxx.xxx.xxx.xxx/26
altnet 77.128.0.0/9
altnet 224.0.0.0/8
altnet 162.168.0.0/16
phyint br1 downstream ratelimit 0 threshold 1
10\ dans ma structure réseau, j'ai wan & wan6 pour l'IPv4 & l'IPv6. j'ai un premier bridge br0 où j'ai rattaché usb0, usb1 et usb2, mes trois dongle éthernet. Dans le second bridge br1, j'ai rattaché mon quatrième dongle éthernet sous le nom tv0. Le flux multicast passe de wan puis ensuite vers le bridge br1 et sort par tv0. Tv0 ne possède pas d'adresse Ip. Il ne doit pas être référence dans le fichier igmpproxy.
11\ j'ai pu conserver le triple play (téléphone, télévision, internet) et aujourd'hui, mon OpenWRT sous Raspberry Pi 4B est opérationnel. Ce fut un peu moins compliquer à résoudre que sous "systemd-networkd". Je rencontre des problème pour affecter des adresses IPv6 à tous mes périphériques. L'exemple le plus frappant est windows où j'ai des interfaces (éthernet & wifi) et qu'un seul DUID. Si je déclare les deux, c'est le bordel. OpenWRT ne sait pas gérer les IAID, ce qui aurait pu résoudre ce problème. je vais devoir approfondir ce problème, mais je ne vais pas me lancer dans le NAT66.
@+