HttpUtils mit ipv6

Begonnen von justme1968, 29 April 2022, 15:00:28

Vorheriges Thema - Nächstes Thema

justme1968

ich versuche gerade ein paar dinge mit ipv6. im zuge dessen wollte ich
zusätzlich zum httpmod device das meine externe ipv4 anzeigt das gleiche für ipv6 einrichten.

da dies nicht funktioniert hat ist mir beim suchen aufgefallen das es aktuell an mehreren stellen keine möglichkeit gibt verbindungsspezifisch ipv6 zu erlauben oder zu erzwingen.

es gibt zwar das globale useInet6 attribut, das ist aber eben global und sorgt dafür das auch das httpmod device für die ipv4 ip eine ipv6 auflöst und deshalb einen fehler im regex matching erzeugt.


deshalb hier der vorschlag in HttpUtils_Connect zuerst zu schauen ob es $hash->{try6} gibt und diesen wert zu verwenden bevor als fallback das globale $haveInet6 verwendet wird.

also: $hash->{try6} = 0 -> nur ipv4
        $hash->{try6} = 1 -> nur ipv6 probieren
        $hash->{try6} not defined -> globales $haveInet6 verwenden

im nächsten schritt kann man dann HTTPMOD ein attribut vorsehen das $hash->{try6} für HttpUtils setzt und so httmod device spezifisch ipv6 zu versuchen.

eventuell wäre auch ein force6 sinnvoll um ipv6 zu erzwingen und nicht auf ipv4 zurückzufallen. aber für meinen fall würde ein try6 erst mal reichen.

sieht jemand ein problem damit?


ps: eigentlich müsste man auch den HU_dnsCache verwerfen bzw. ignorieren wenn man direkt nacheinander versucht den gleichen host ein mal mit ipv4 und ein mal mit ipv6 aufzulösen. für den anwendungsfall hier bei dem ein device fest auf ipv4 oder ipv6 eingestellt wird sollte das aber meist unnötig sein.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rudolfkoenig

Eine Erweiterung unter folgender Bedingung ist relativ einfach: $hash->{try6} = 0 versucht nur IPv4, alles Andere richtet sich nach dem bisherigen verhalten von $haveInet6, d.h. falls "attr global useInet6 1" ist gesetzt und IO::Socket::INET6 geladen werden konnte, dann wird zunaechst IPv6 versucht, sonst bzw. danach IPv4.

Nur IPv6 fuer $hash->{try6} = 1 waere etwas aufwendiger zu bauen.
In diesem Zusammenhang: auf meiner TODO Liste steht noch ein Umbau auf IO::Socket:IP, da IO::Socket::INET6 deprecated ist.

Zitatps: eigentlich müsste man auch den HU_dnsCache verwerfen bzw. ignorieren wenn man direkt nacheinander versucht den gleichen host ein mal mit ipv4 und ein mal mit ipv6 aufzulösen.
Oder wir erweitern den Schluessel von Rechnername auf IPv[46]/Rechnername.

justme1968

für den obigen konkreten anwendungsfall funktioniert dein vorschlag (global ipv6 aktivieren und für das ipv4 device gezielt deaktivieren) genau so gut da fhem ja erst auf ipv4 zurück fällt wenn die ipv6 dns auflösung nicht geklappt hat. da ipv6 eher zunimmt und ipv4 abnehmen sollte ist es eigentlich auch der bessere weg.

wenn aktuell niemand das umgekehrt verhalten braucht würde mir das erst mal so reichen. die flexiblere variante kann man ja für die IO::Socket:IP umstellung im hinterkopf behalten.

magst du einen patch?


ich bin mir nicht sicher ob die erweiterung des cache auf v4/v6 reicht. ich habe vorhin bemerkt das es beim failover von einer v4/v6 wan verbindung auf eine die nur v4 unterstützt zum teil probleme in fhem gibt da die v6 adresse noch im cache ist obwohl die v6 connectivity weg ist. eigentlich müsste man wie z.b. im browser ipv4 und ipv6 dns auflösung gleichzeitig starten und die erste die zurück kommt verwenden. ich glaube das lohnt aber im fhem fall den aufwand nicht. vielleicht genügt ein weg das löschen des cache zu triggern den man als anwender verwenden kann wenn es ein wan failover gibt.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rudolfkoenig

Zitatmagst du einen patch?
Nein, danke, ich habe das jetzt implementiert.

Zitatich bin mir nicht sicher ob die erweiterung des cache auf v4/v6 reicht.
Mit diesem Flag ist es notwendig.
Es war eigentlich auch vorher notwendig, falls jemand "attr global useInet6 X" nach dem Start aendert.
Ich habe es jetzt eingebaut:
fhem> { HttpUtils_NonblockingGet({ url=>"http://fhem.de/MAINTAINER.txt",try6=>0,callback=>sub($$$){ Log 1,"ERR:$_[1] DATA:".length($_[2]) } }) }
fhem> { HttpUtils_NonblockingGet({ url=>"http://fhem.de/MAINTAINER.txt",try6=>1,callback=>sub($$$){ Log 1,"ERR:$_[1] DATA:".length($_[2]) } }) }
fhem> { HttpUtils_dumpDnsCache() }
fhem.de/IPv4   TS: 2022-04-30 20:05:04   TTL: 70084   ADDR: 88.99.31.202
fhem.de/IPv6   TS: 2022-04-30 20:05:09   TTL: 52037   ADDR: 42.1.4.248.1.10.8.6.0.0.0.0.0.0.0.2
fhem>

Und ein HttpUtils_clearDnsCache() spendiert, obwohl es mir nicht klar ist, wann es hilft: ein DNS-Query nach IPv6 Adresse liefert auch dann gueltige Werte zurueck, wenn man selbst kein IPv6 hat.