Moin.
Nicht erst seit IPv6 kann ein Rechner mehr als eine IP Adresse haben. Ich möchte auf meinem Rechner weg von diesen krummen Portnummern und daher eine (weitere) IP Adresse verwenden, um mich dort an einen Standard Port (80/443) zu binden.
Da TcpServerUtils::TcpServer_Open() in Bezug auf das Binding ja nur ein Wrapper für IO::Socket::INET6 ist, stellt sich mir die Frage, warum via
LocalHost => ($global ? ($global eq "global"? undef:$global) : "127.0.0.1")
hier künstlich auf die zwei Optionen "alle IPs" und "localhost" eingeschränkt wird.
Ich würde diesen Teil gerne aufweiten, um konkrete IPs angeben zu können, an die sich FHEM bindet.
Damit mein Codeschnipsel eine Chance hat, übernommen zu werden, würde ich gerne im Vorfeld fragen, wie es hier mit der Abwärtskompatibilität gehandhabt wird. Lieber häßlich und abwärtskompatibel oder intuitiv und kompatibilitätsbrechend?
define WEB FHEMWEB IPV6:443 global
attr WEB IP fdca:ffee:dead:beaf::1
versus
define WEB FHEMWEB [fdca:ffee:dead:beaf::1]:443
Zitathier künstlich auf die zwei Optionen "alle IPs" und "localhost" eingeschränkt wird.
Ich sehe in dem zitierten Code 2 Fragezeichen.
ZitatLieber häßlich und abwärtskompatibel oder intuitiv und kompatibilitätsbrechend?
Lieber haesslich. Und intuitiv ist meist subjektiv.
Hallo Rudolf,
danke für die schnelle Antwort.
Zitat von: rudolfkoenig am 18 März 2016, 16:10:05
Ich sehe in dem zitierten Code 2 Fragezeichen.
Ist meine Ist-Analyse inkorrekt? Habe ich etwas übersehen? Kann sich FHEM ggf. bereits sich über andere Wege an eine konkrete IP binden?
Gruß,
Oliver
Ja. Ja. Jein: Du hast die Zeile netterweise direkt zitiert.
Hatte das damals eigentlich geklappt? In FHEM/01_FHEMWEB.pm steht folgendes (Zeile 232):
sub
FW_Define($$)
{
my ($hash, $def) = @_;
my ($name, $type, $port, $global) = split("[ \t]+", $def);
return "Usage: define <name> FHEMWEB [IPV6:]<tcp-portnr> [global]"
if($port !~ m/^(IPV6:)?\d+$/ || ($global && $global ne "global"));
Ich denke, dass das wohl die Zeile ist, die verhindert, dass ich den Hostnamen angeben kann, an den das Webinterface gebunden werden soll. Demnach geht wohl nur nichts oder "global". Hintergrund ist, dass ich jetzt mehrere Adressen auf dem Rechner eingerichtet habe und nicht möchte, dass der Rechner auf allen Interfaces lauscht.
Bei telnet hat es funktioniert. Wenn auch mit dem Umweg über einen anderen Port, weil ich da sonst die Meldung "bereits benutzt" bekomme. Das stimmt natürlich, weil da fhem auch hört, wenn man von global auf eine definierte Adresse umstellt.
PS: Hätte ich lieber ein neues Thema aufmachen sollen?
Habe die Pruefung auf "global" entfernt (analog zu telnet), und das "Feature" im commandref erwaehnt.
D.h. mit "define WEB FHEMWEB 8083 192.168.178.10" ist http://localhost:8083 nicht erreichbar.
Danke. Das war ja schnell. Sieht so aus, dass es funktioniert (netstat -tl).
PS: Nutze das, dass dann jetzt fhem nicht mehr in allen Netzen, wo der Rechner eine Schnittstelle hat auch fhem zur Verfügung steht (localhost ist mir egal, ob das zugreifbar ist oder nicht). Dann muss ich nur noch die ganzen anderen offenen Ports von Perl zuordnen. Aber das finde ich sicherlich im Quellcode.
Ich finde diese neue Möglichkeit genial und echt praktisch.
So sieht meine Konfiguration aus:
Internals:
CONNECTS 1
CSRFTOKEN
DEF 8081 global
FD 218
NAME WEBbridge
NR 495
NTFY_ORDER 50-WEBbridge
PORT 8081
STATE Initialized
TYPE FHEMWEB
Attributes:
allowfrom ^192\.168\.24\.([1-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-4]))$|^172.*$|127.0.0.1
csrfToken none
hiddenroomRegexp .*
Leider erhalte ich beim Ändern des DEFs (z.B. auf IP 192.168.0.50) permanent Fehlermeldung in folgender Art:
WEBbridge: Can't open server port at 8081: Cannot assign requested address
Fhem selbst läuft in einem anderen Subnet und hat die IP 172.19.0.100. Nur diese wird scheinbar akzeptiert. Alles andere funktioniert bei mir nicht.
define WEBbridge FHEMWEB 8081 IP 172.19.0.100
Nur macht dies ja keinen Sinn, weil es gleichbedeutend mit localhost ist.
Zitatdefine WEBbridge FHEMWEB 8081 IP 172.19.0.100
So war das nicht gemeint. Eher so:
define WEBbridge FHEMWEB 8081 172.19.0.100
Und ich habe keine Probleme beim Aendern, selbst wenn ich das ueber die gleiche Verbindung durchfuehre.
Ja, sorry. Das war ein Tippfehler. Das "IP" stand da natürlich nicht drin. :-)
Wie gesagt: Ich kann nur die eigene IP eingeben. Alles andere schlägt fehl.
Muss die IP im Augenblick des Speicherns erreichbar sein?
ZitatMuss die IP im Augenblick des Speicherns erreichbar sein?
??? Wie, erreichbar?
"konfiguriert auf dem FHEM-Server" ist die richtige Formulierung. Und ja.
Es geht doch darum, eine externe IP anzugeben (wie bspw. die eines Proxy-Servers), die als einzige auf diese FHEM-Instanz zugreifen kann, oder?
Sobald ich dort die IP des Proxys angeben (ist pingbar vom fhem-host), so erscheint die Fehlermeldung.
Ein verbose5-Log gibt es dazu leider nicht.
Erzwinge ich das direkt über die fhem.cfg (Ja, ich weiß - war nur ein Test), so beendet sich FHEM direkt:
WEBbridge: Can't open server port at 8081: Cannot assign requested address. Exiting.
Und ja, das FHEMWEB-Update habe ich geladen. Keine Updates ausstehend. :-)
ZitatEs geht doch darum, eine externe IP anzugeben (wie bspw. die eines Proxy-Servers), die als einzige auf diese FHEM-Instanz zugreifen kann, oder?
Nein. Es geht darum, dass man einen Rechner mit vielen IP-Adressen (bildlich: Netzwerkkarten) hat, und FHEMWEB soll nur auf einem dieser IP-Adressen lauschen, und nicht (wie per global) auf allen.
Ah, das erklärt nun einiges.
Ich dachte, es wäre ein geändertes allowfrom-Verhalten gewesen.