[fhem.pl] findet keine Module im eigenen Pfad (.)

Begonnen von mahowi, 23 September 2016, 08:22:51

Vorheriges Thema - Nächstes Thema

mahowi

Seit einem Update von Perl (5.22.2) scheint der aktuelle Pfad (.) nicht mehr in @INC zu sein. Dadurch startet fhem nicht mehr:

pi@raspberrypi:/opt/fhem $ sudo  perl fhem.pl configDB
2016.09.23 08:05:37 1: Can't locate configDB.pm in @INC (you may need to install the configDB module) (@INC contains: /etc/perl /usr/local/lib/arm-linux-gnueabihf/perl/5.22.2 /usr/local/share/perl/5.22.2 /usr/lib/arm-linux-gnueabihf/perl5/5.22 /usr/share/perl5 /usr/lib/arm-linux-gnueabihf/perl/5.22 /usr/share/perl/5.22 /usr/local/lib/site_perl /usr/lib/arm-linux-gnueabihf/perl-base) at (eval 10) line 2.
BEGIN failed--compilation aborted at (eval 10) line 2.

Undefined subroutine &main::cfgDB_Init called at fhem.pl line 480.


Behoben hab ich das Problem, indem ich use Cwd;
use lib cwd;
in fhem.pl eingefügt habe. Damit werden die Module im aktuellen Pfad auch wieder gefunden.

Ich konnte dazu im Netz nur finden, daß dieser "taint mode" genutzt wird, wenn das Programm setuid oder setgid läuft.

Hätte es irgendwelche Nachteile, die beiden Zeilen in fhem.pl aufzunehmen?
CUBe (MAX): HT, FK | CUBe (SlowRF): ESA2000WZ
JeeLink: LaCrosse | nanoCUL433: Smartwares SHS-51001-EU, EM1000GZ
ZME_UZB1: GreenWave PowerNode, Popp Thermostat | SIGNALDuino: HE877, X10 MS14A, Revolt NC-5462,  IT Steckdosen + PIR
tado° | Milight | HUE, Lightify | SmarterCoffee

rudolfkoenig

Kannst du bitte in fhem.pl unter der (einzigen) Zeile mit @INC folgendes einfuegen:
    push @INC, "." if(!grep(/\\./, @INC));
und testen?

mahowi

Sorry, kam gerade erst dazu. Das bringt leider nichts, danach wird RTypes.pm nicht gefunden.

pi@raspberrypi:/opt/fhem $ sudo ./fhem.pl configDB.db
Can't locate RTypes.pm in @INC (you may need to install the RTypes module) (@INC contains: /etc/perl /usr/local/lib/arm-linux-gnueabihf/perl/5.22.2 /usr/local/share/perl/5.22.2 /usr/lib/arm-linux-gnueabihf/perl5/5.22 /usr/share/perl5 /usr/lib/arm-linux-gnueabihf/perl/5.22 /usr/share/perl/5.22 /usr/local/lib/site_perl /usr/lib/arm-linux-gnueabihf/perl-base) at ./fhem.pl line 511.
CUBe (MAX): HT, FK | CUBe (SlowRF): ESA2000WZ
JeeLink: LaCrosse | nanoCUL433: Smartwares SHS-51001-EU, EM1000GZ
ZME_UZB1: GreenWave PowerNode, Popp Thermostat | SIGNALDuino: HE877, X10 MS14A, Revolt NC-5462,  IT Steckdosen + PIR
tado° | Milight | HUE, Lightify | SmarterCoffee

betateilchen

Da ist aber . immer noch nicht in @INC enthalten, wenn man sich die Liste in der Fehlermeldung mal genauer anschaut.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

mahowi

Stimmt. Ich hab die Zeile wie von Rudi geschrieben hinzugefügt. Wie gesagt, mit use Cwd;
use lib cwd;
am Anfang klappt's. Damit wird der aktuelle Pfad hinzugefügt. Ich weiß allerdings nicht, was passiert, wenn "." schon in @INC eingeschlossen ist.
CUBe (MAX): HT, FK | CUBe (SlowRF): ESA2000WZ
JeeLink: LaCrosse | nanoCUL433: Smartwares SHS-51001-EU, EM1000GZ
ZME_UZB1: GreenWave PowerNode, Popp Thermostat | SIGNALDuino: HE877, X10 MS14A, Revolt NC-5462,  IT Steckdosen + PIR
tado° | Milight | HUE, Lightify | SmarterCoffee

betateilchen

Zitat von: rudolfkoenig am 23 September 2016, 13:17:03
Kannst du bitte in fhem.pl unter der (einzigen) Zeile mit @INC folgendes einfuegen:
    push @INC, "." if(!grep(/\\./, @INC));
und testen?

Hallo Rudi,

das wird in diesem Fall nichts nützen, weil configDB.pm von fhem.pl geladen wird, lange bevor überhaupt @INC von fhem.pl ausgewertet bzw. geändert wird. Wenn schon, müsste die Zeile ziemlich weit am Anfang von fhem.pl eingefügt werden.

Das ist letztendlich genau das Thema, worüber wir neulich schon per email diskutiert hatten, als ich überlegt hatte, configDB.pm nach ./FHEM zu verschieben.

Zitat von: Rudi
- use FHEM:configDB funktioniert nicht immer, weil fhem.pl nicht immer in
  modpath gestartet ist (bzw. wurde), und bisher auch kein chdir dahin erfolgt.

Man könnte das Ganze vielleicht (ungetestet) per Umgebungsvariable im fhem Startskript lösen:


export PERL5LIB=.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

@mahowi: kannst du bitte die erwaehnte Zeile vor
require RTypes;
verschieben, und erneut testen?

@betateilchen: wir koennten das "configDB.pm ins FHEM Verzeichnis verschrieben" Problem dadurch loesen, dass wir modpath abschaffen (bzw. als . hartkodieren), und fordern, dass fhem.pl so gestartet wird, dass das FHEM Verzeichnis im cwd liegt. Habe keinen Ueberblick, wie die Leute ihr FHEM starten, immerhin waere das fuer die Installation via .deb bzw. fuer die Startskripte fhem.2, fhem.3, fhem.4 kein Problem. Fuer fhem.1 dagegen schon.

betateilchen

Zitat von: rudolfkoenig am 24 September 2016, 18:43:48
@betateilchen: wir koennten das "configDB.pm ins FHEM Verzeichnis verschrieben" Problem dadurch loesen,

Von hartcodierten Pfaden halte ich nicht viel, deshalb ist die Idee, modpath anzufassen m.E. nicht wirklich zielführend.
Und es gibt ja eigentlich gar kein "configDB.pm verschieben"-Problem. Das Problem, um das es hier im Thread eigentlich geht, wird von einer Änderung im perl Interpreter hervorgerufen.

Mich würde interessieren, ob die Zeile Wirkung zeigt, wenn man sie ziemlich weit an den Anfang von fhem.pl stellen würde, beispielsweise so (ca. Zeile 400):


}

push @INC, "." if(!grep(/\\./, @INC));

# If started as root, and there is a fhem user in the /etc/passwd, su to it
if($^O !~ m/Win/ && $< == 0) {

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

mahowi

@Rudi: Wenn ich die Zeile vor "require RTypes;" schiebe, komme ich zum selben Ergebnis: pi@raspberrypi:/opt/fhem $ sudo ./fhem.pl configDB.db
Can't locate RTypes.pm in @INC (you may need to install the RTypes module) (@INC contains: /etc/perl /usr/local/lib/arm-linux-gnueabihf/perl/5.22.2 /usr/local/share/perl/5.22.2 /usr/lib/arm-linux-gnueabihf/perl5/5.22 /usr/share/perl5 /usr/lib/arm-linux-gnueabihf/perl/5.22 /usr/share/perl/5.22 /usr/local/lib/site_perl /usr/lib/arm-linux-gnueabihf/perl-base .) at ./fhem.pl line 512.


@betateilchen: Dasselbe Ergebnis auch, wenn ich die Zeile an der Stelle einfüge, wie von Dir beschrieben.

Beide Male ist "." in @INC enthalten.

Ich starte fhem übrigens als Service wie im Posting von betateilchen.
CUBe (MAX): HT, FK | CUBe (SlowRF): ESA2000WZ
JeeLink: LaCrosse | nanoCUL433: Smartwares SHS-51001-EU, EM1000GZ
ZME_UZB1: GreenWave PowerNode, Popp Thermostat | SIGNALDuino: HE877, X10 MS14A, Revolt NC-5462,  IT Steckdosen + PIR
tado° | Milight | HUE, Lightify | SmarterCoffee

rudolfkoenig

Da bin ich verwirrt: wieso ist cwd besser als ., und was heisst "Beide Male ist "." in @INC enthalten.": vorher oder nachhher?

mahowi

Mit "Beide Male" meine ich, daß "." bei den beiden Lösungen von Dir und betateilchen in @INC enthalten ist.

Wieso cwd besser ist, kann ich auch nicht sagen. Wie es aussieht, wird nach dem Einfügen von push @INC, "." if(!grep(/\\./, @INC)); zwar configDB geladen, modpath aber nicht mehr in @INC aufgenommen.
CUBe (MAX): HT, FK | CUBe (SlowRF): ESA2000WZ
JeeLink: LaCrosse | nanoCUL433: Smartwares SHS-51001-EU, EM1000GZ
ZME_UZB1: GreenWave PowerNode, Popp Thermostat | SIGNALDuino: HE877, X10 MS14A, Revolt NC-5462,  IT Steckdosen + PIR
tado° | Milight | HUE, Lightify | SmarterCoffee

betateilchen

das von Dir beschriebene Verhalten ist irgendwie komplett unlogisch *grübel*
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

mahowi

Ich würde es auch gerne logisch erklären, kann ich aber leider nicht. Installiert habe ich Perl 5.22.2 aus dem testing-Zweig von Raspbian:
pi@raspberrypi:~ $ apt-cache policy perl
perl:
  Installiert:           5.22.2-5
  Installationskandidat: 5.22.2-5
  Versionstabelle:
*** 5.22.2-5 990
        990 http://mirrordirector.raspbian.org/raspbian testing/main armhf Packages
        100 /var/lib/dpkg/status


Bis zu einem Update vor ca. einer Woche lief auch alles problemlos. Danach wurde scheinbar eine Standardeinstellung von Perl geändert, die zu dem beschriebenen Verhalten führte. Nach einigem Suchen im Netz bin ich dann auf die Lösung mit use Cwd; use lib cwd; gestoßen. Damit funktioniert es auch, das Arbeitsverzeichnis wird in @INC aufgenommen.

Nach dem Einfügen von push @INC, "." if(!grep(/\\./, @INC)); an verschiedenen Stellen in fhem.pl und Auskommentieren von "cwd" kommt es dann dazu, daß zwar configDB.pm in "." gefunden wird, scheinbar aber die Module in FHEM (wo RTypes.pm ja liegt) nicht mehr.

Soweit ich das bisher gelesen habe, dürfte es mit "use lib cwd;" keine Probleme geben. Wenn das Verzeichnis schon in @INC vorhanden ist, wird es mit "use lib" lediglich an den Anfang gesetzt.
CUBe (MAX): HT, FK | CUBe (SlowRF): ESA2000WZ
JeeLink: LaCrosse | nanoCUL433: Smartwares SHS-51001-EU, EM1000GZ
ZME_UZB1: GreenWave PowerNode, Popp Thermostat | SIGNALDuino: HE877, X10 MS14A, Revolt NC-5462,  IT Steckdosen + PIR
tado° | Milight | HUE, Lightify | SmarterCoffee

Christian Uhlmann

Hallo zusammen,

soeben hat es mich auch erwischt, habe mit meinem Debian Stretch ein Update gefahren, danach erhalte ich die selbe Fehlermeldung.
Konnte es mit der Lösung von mahowi auch fixen.
Jetzt die Frage, ist der Stand immer noch der selbe oder hat sich hier etwas getan?

@mahowi
wie läuft das bei dir momentan?


LG Christian
Host: Debian Buster als VM / XCP-NG
Gateways: DuoFern Stick, CUL433 Revolt, CUL MAX, HMLan, HM-USB 2, LaCrosseGateway
Devices: 12x Rademacher Rollos, 6x TX 29 DT-HT, 10x HM-CC-RT-DN, 14x MAX Fensterkontakte, Diverse HM Aktoren für Licht, Klingel, Gong, Eingangstür, ESPEasy, Sonoff mit Tasmota

mahowi

Ich arbeite mit der Lösung von oben. Bis jetzt problemlos.
CUBe (MAX): HT, FK | CUBe (SlowRF): ESA2000WZ
JeeLink: LaCrosse | nanoCUL433: Smartwares SHS-51001-EU, EM1000GZ
ZME_UZB1: GreenWave PowerNode, Popp Thermostat | SIGNALDuino: HE877, X10 MS14A, Revolt NC-5462,  IT Steckdosen + PIR
tado° | Milight | HUE, Lightify | SmarterCoffee