use lib '.'; in fhem.pl

Begonnen von jw2013, 08 Dezember 2025, 18:52:53

Vorheriges Thema - Nächstes Thema

jw2013

Hi,

es wäre schön, wenn die o.g. Zeile aus fhem.pl entfernt werden könnte.

Für Installationen, bei denen "attr global modpath ." gesetzt ist, wird '.' ja korrekterweise als Pfad in @INC mit aufgenommen.

Ansonsten ist es problematisch und führt abhängig vom Init-System (OpenWRT in diesem Fall) und den Verzeichnis-Rechten sogar zu Fehlern. Wenn Perl z.B. nicht als root ausgeführt wird, bricht der Interpreter die Suche nach Modulen nach dem ersten "Permission denied" ab, und sucht nicht in /usr/lib/perl5/5.40/ weiter, wo das Modul zu finden wäre.

2025.12.08 17:04:09 5: Cmd: >define FHEMWEB FHEMWEB 8083 global<
2025.12.08 17:04:09 5: Loading /usr/lib/fhem/FHEM/01_FHEMWEB.pm
2025.12.08 17:04:09 1: reload: Error:Modul 01_FHEMWEB deactivated:
 Can't locate MIME/Base64.pm:   ./MIME/Base64.pm: Permission denied at /usr/lib/fhem/FHEM/HttpUtils.pm line %, <$fh> line 1.
BEGIN failed--compilation aborted at /usr/lib/fhem/FHEM/HttpUtils.pm line %, <$fh> line 1.
Compilation failed in require at /usr/lib/fhem/FHEM/01_FHEMWEB.pm line %, <$fh> line 1.
BEGIN failed--compilation aborted at /usr/lib/fhem/FHEM/01_FHEMWEB.pm line %, <$fh> line 1.

2025.12.08 17:04:09 0: Can't locate MIME/Base64.pm:   ./MIME/Base64.pm: Permission denied at /usr/lib/fhem/FHEM/HttpUtils.pm line %, <$fh> line 1.
BEGIN failed--compilation aborted at /usr/lib/fhem/FHEM/HttpUtils.pm line %, <$fh> line 1.
Compilation failed in require at /usr/lib/fhem/FHEM/01_FHEMWEB.pm line %, <$fh> line 1.
BEGIN failed--compilation aborted at /usr/lib/fhem/FHEM/01_FHEMWEB.pm line %, <$fh> line 1.

2025.12.08 17:04:09 5: /etc/config/fhem/mod.cfg.d/01_fhemweb.cfg line 1 returned >Cannot load module FHEMWEB<
2025.12.08 17:04:09 5: Cmd: >attr FHEMWEB group System<
2025.12.08 17:04:09 5: /etc/config/fhem/mod.cfg line 1 returned >Cannot load module FHEMWEB<

Ohne die eine Zeile in fhem.pl funktioniert alles auch z.B. als Benutzer "fhem".
Wer nicht mit der Zeit geht, geht mit der Zeit

rudolfkoenig

Zitates wäre schön, wenn die o.g. Zeile aus fhem.pl entfernt werden könnte.
Habs gemacht und versucht fhem mit configDB zu starten:
> perl fhem.pl configDB
2025.12.08 20:54:15 1: Can't locate configDB.pm in @INC (you may need to install the configDB module) (@INC entries checked: /usr/lib/perl5/5.42/site_perl /usr/share/perl5/site_perl /usr/lib/perl5/5.42/vendor_perl /usr/share/perl5/vendor_perl /usr/lib/perl5/5.42/core_perl /usr/share/perl5/core_perl) at (eval 9) line 1.
BEGIN failed--compilation aborted at (eval 9) line 1.

Undefined subroutine &main::cfgDB_Init called at fhem.pl line 590.
Exit 2

jw2013

Ah, das eine Modul, dass im gleichen Verzeichnis wie die Binary liegt...

Den gleichen Fehler bekomme ich übrigens aktuell auch, wenn ich z.B. "path/to/fhem.pl ConfigDB" aus einem anderen Verzeichnis heraus aufrufe.

Unter diesen Umständen wäre der korrekte Fix wie folgt:

Zitatuse FindBin;
use lib $FindBin::Bin;

FindBin ist Teil der Core Perl Distribution. https://perldoc.perl.org/FindBin

Läge configDB.pm im Unterverzeichnis /lib, würde das wie folgt ausschauen:

Zitatuse FindBin;
use lib "$FindBin::Bin/lib";

Am allerschönsten wäre allerdings ein Kommandozeilen-Paramter -I für fhem.pl selbst, dem man einen Pfad mit angeben kann.
Wenn der angegeben wird, sollte fhem.pl diesen anstelle von '.' oder $FindBin::Bin verwenden.

Wer nicht mit der Zeit geht, geht mit der Zeit

jw2013

Oder noch eine elegantere Lösung: Ganz oben das "use lib '.';" weg, und unten eine Zeile einfügen:

if(configDBUsed()) {
  eval "use configDB";
  eval "use lib '.'; use configDB" if ($@);
  Log 1, $@ if($@);
  cfgDB_Init();
}

Die Verwendung anderer Pfade könnte man auch über die Umgebungsvariable PERL5LIB steuern, dann brauchts keinen neuen Parameter.
Wer nicht mit der Zeit geht, geht mit der Zeit