FHEM Forum

FHEM - Entwicklung => FHEM Development => Thema gestartet von: jw2013 am 08 Dezember 2025, 18:52:53

Titel: use lib '.'; in fhem.pl
Beitrag von: jw2013 am 08 Dezember 2025, 18:52:53
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".
Titel: Aw: use lib '.'; in fhem.pl
Beitrag von: rudolfkoenig am 08 Dezember 2025, 20:56:09
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
Titel: Aw: use lib '.'; in fhem.pl
Beitrag von: jw2013 am 08 Dezember 2025, 21:43:45
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.

Titel: Aw: use lib '.'; in fhem.pl
Beitrag von: jw2013 am 08 Dezember 2025, 21:56:44
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.
Titel: Aw: use lib '.'; in fhem.pl
Beitrag von: rudolfkoenig am 09 Dezember 2025, 17:58:39
ZitatOder noch eine elegantere Lösung: Ganz oben das "use lib '.';" weg, und unten eine Zeile einfügen:
Danke fuer den Vorschlag, ich habe es genauso eingecheckt.
Titel: Aw: use lib '.'; in fhem.pl
Beitrag von: jw2013 am 09 Dezember 2025, 18:16:06
Besten Dank dafür (und für FHEM sowieso)!
- jens
Titel: Aw: use lib '.'; in fhem.pl
Beitrag von: krikan am 17 Dezember 2025, 15:33:59
Unter Windows führt diese Änderung wohl dazu, dass sich FHEM nicht mehr so einfach per Kommandozeile als Dienst einrichten lässt: https://forum.fhem.de/index.php?topic=143363.msg1353846#msg1353846

Könntet Ihr Euch das bitte einmal anschauen. Danke.
Titel: Aw: use lib '.'; in fhem.pl
Beitrag von: jw2013 am 17 Dezember 2025, 19:57:38
Schande über mein Haupt, ich habe keine Windows Instanz zum Testen :-/

Für das FHEM on OpenWrt Projekt benötige ich die Änderung auch nicht zwingend, mir ist es nur dadurch aufgefallen.
Im Service-Script habe ich ein cd /usr/share/fhem vor dem Start eingebaut, das reicht für den Zweck aus.

Allerdings ist fhem.pl ja auch dazu gedacht, als Client aufgerufen zu werden, und da führt die Verwendung von '.' zu undefiniertem Verhalten.
Titel: Aw: use lib '.'; in fhem.pl
Beitrag von: rudolfkoenig am 17 Dezember 2025, 20:10:22
ZitatSchande über mein Haupt, ich habe keine Windows Instanz zum Testen :-/
Entspann Dich, ich habe die Aenderung eingebaut, weil ich das fuer richtig halte.
Fuer perl Pakete ist "neuerdings" /opt/fhem/lib/FHEM die richtige Stelle, und nicht /opt/fhem/FHEM.