98_Installer - Modul komplett refaktoriert inkl. nutzbarer Online-Hilfe

Begonnen von DS_Starter, 14 Oktober 2026, 17:27:48

Vorheriges Thema - Nächstes Thema

DS_Starter

Hallo Rudi,

in meinen Systemen nutze ich das Installer-Modul sehr gern und intensiv für alle Perl-Modul Verwaltungen.
Mir waren aber immer wieder Fehler, (für mich) nicht erklärbare Verhaltensweisen und fehlende Features aufgefallen.

Ich habe mich daher hingesetzt und das Modul vollständig refaktoriert, um sowohl die Lesbarkeit als auch die Wartbarkeit deutlich zu verbessern.
Besonders hilfreich sind die neuen Set-/Get‑Befehle zzExportPerlList, zzImportPerlList und showDiffPerlList, die Systemumzüge oder Systemvergleiche erheblich vereinfachen.

Mit set ... zzExportPerlList lässt sich die auf System 1 installierte Perl‑Modulliste (Name/Version als JSON) exportieren.
Auf System 2 kann diese Liste anschließend über get ... showDiffPerlList mit dem dortigen Ist‑Stand verglichen werden. Abweichungen werden übersichtlich im Popup dargestellt und können direkt per Install/Deinstall bereinigt werden.

set ... zzImportPerlList geht einen Schritt weiter: Es vergleicht den Modulstand des Zielsystems automatisch mit der exportierten Quelle und installiert alle fehlenden oder veralteten Pakete selbstständig nach.

Da sowohl Installer.pm als auch Meta.pm aktuell von dir betreut werden, in der Maintainer.txt aber als verwaist markiert sind, würde ich beide Module übernehmen und als Interims‑Maintainer die neue Installer-Version einchecken/weiterführen — zumindest solange, bis sich jemand mit mehr Zeit findet, sofern das für dich in Ordnung ist.
Alternativ steht die neue Datei 98_Installer in meinem Contrib zur Verfügung. Ein Patch lohnt sich nicht, da das Modul strukturell grundlegend überarbeitet wurde. (Interessenten können sich das Modul gern vorab laden und ausprobieren)

Der Installer ist für mich zwar eher ein Nebenschauplatz, aber ich halte das Modul für sehr nützlich in der Systempflege. Sicherlich gibt es noch weitere Optimierungsmöglichkeiten, und ich habe mit Sicherheit noch nicht alle Möglichkeiten des Moduls verstanden und ergründen können. Dennoch läuft es inzwischen stabil und wie gewünscht, und man kann seine Systeme damit komfortabel und zuverlässig verwalten.


Zur Übersicht das Changelog was in 98_Installer.pm bis jetzt umgesetzt ist:

- **Change:**
  * Code-Refactoring (Lesbarkeit, einheitlicher Stil)
    - alle Subs sowie der Modulkopf neu strukturiert, doppelten Code in Hilfssubs zusammengeführt
      (u.a. UpdatablePerlPackages, __GetLayout, __TableHeader/__TableRow, __InfoLink, __SudoError)
    - Laden des JSON-Moduls als Schleife statt verschachtelter eval-Blöcke, das geladene Modul
      wird auch für die Ausgabe der Meta-JSON verwendet
    - Konstanten (POLLINTERVAL, UPDATEINTERVAL, HAS_METARequirementsRange) in einem use constant-Block
  * fehlt jedes JSON-Modul, wird nicht mehr abgebrochen, sondern Define liefert eine Fehlermeldung
  * Get-Usage im Modus install listet cfg-Dateien sortiert und prüft Verzeichnisse relativ zu modpath
  * Attribut updatePerlUsedModulesOnly hat jetzt den Default 0,
    set updatePerl zeigt dadurch alle veralteten Module in der Update-Liste
  * Online-Hilfe (deutsch und englisch) komplett neu erstellt (Define, Set, Get, Attribute und Readings, Verweis auf das Wiki zu FHEM::Meta und CPAN)
  * Abstract in den Metadaten angepasst
  * Kommandos, die einen Hintergrundprozess starten, werden abgelehnt, solange ein anderes läuft
 
- **Fix:**
  * Voreinstellung für 'devStateIcon' angepasst
  * Attribut installerMode, der Wert install fehlte in der Attributliste
  * Attribut updateListReading hat das Reading updateListAsJSON auch bei Wert 0 geschrieben
  * Notify, nach dem Start wurde das nie geschriebene Reading cpanVersion abgefragt, jetzt cpanminusVersion
  * Suche, HTML-Tabellenköpfe wurden mit </td> statt </th> geschlossen
  * Suche, Package-Abstracts bei Keywords waren leer
  * Suche, Textausgabe enthielt das HTML-Suchformular und Listen waren ohne Trennzeichen
  * Modulinfo, fehlendes </tr> in der Device-Liste und ein verirrtes </span> bei Node.js
  * Modulinfo, bei veralteten Perl-Paketen wird jetzt Update statt Install angeboten
  * Modulinfo, Link zum Dev-Branch bei SVN-Repositories zeigte auf den Main-Branch
  * Prerequisites-Check, leere Einträge in den Modul- und Package-Listen vermieden
  * Prerequisites-Check, Attribut global verbose wird nach dem Laden der Pakete wiederhergestellt
    bzw. wieder entfernt, wenn es vorher nicht gesetzt war
  * Prerequisites-Check, Perl-Pakete werden ohne String-eval geladen
  * Prerequisites-Check, "Alles in Ordnung"-Meldung konnte einen leeren Text ausgeben
  * Parser für veraltete Pakete erkennt weitere Versionsformate und ignoriert Leerzeilen,
    current und latest gingen bei Namen mit Bindestrich verloren
 
  * CpanInstall: Unkritische und harmlose Tar-Meldungen bezüglich unbekannter Extended Header Keywords
    (z.B. Apple-spezifische 'LIBARCHIVE.xattr'-Attribute beim Entpacken von Modulen) werden nun korrekt gefiltert und ignorieren den Parsing-Fehler 'E501'.
  * CpanOutdated: Der Regex zum Parsen der veralteten Perl-Pakete wurde robuster gestaltet (unterstützt nun flexiblere Versionsformate wie SemVer
    oder Alpha/Beta-Zusätze) und leere Zeilen am Ende der Konsolenausgabe werden automatisch übersprungen, um fälschliche 'E501'-Fehler zu verhindern.
   
- **Neu:**
  * Export & Import: Neue Set-Kommandos 'zzExportPerlList' und 'zzImportPerlList' hinzugefügt, um installierte Perl-Pakete in eine JSON-Datei zu exportieren
    bzw. auf anderen Systemen einzulesen und Differenzen direkt zur Installation anzubieten.
  * Differenzliste: Neues Get-Kommando 'showDiffPerlList' implementiert, das eine übersichtliche Differenztabelle zwischen einer exportierten JSON-Datei
    und dem lokalen System anzeigt – inklusive interaktiver Direktlinks ("Install" / "Deinstall") für eine gezielte Paketverwaltung.
  * Dokumentation: Die integrierte Online-Hilfe wurde um die Dokumentation der neuen Kommandos 'zzExportPerlList', 'zzImportPerlList' und 'showDiffPerlList' ergänzt.
  * Perl-Paketliste exportieren und importieren
    - set zzExportPerlList schreibt die installierten Perl-Pakete mit Version in eine JSON-Datei
    - set zzImportPerlList installiert fehlende und ältere Pakete aus einer solchen Datei
    - get showDiffPerlList zeigt die Differenz (Missing, Outdated, Newer locally, Extra)
      mit Links zum Installieren, Aktualisieren und Deinstallieren
    - Deinstall in der Differenzliste fragt vorher nach und nennt die FHEM-Module, die das Paket verwenden
    - Vergleich und Import nutzen die zuletzt ermittelte Paketliste, kein Scan im FHEM-Prozess
  * Paketnamen in showOutdatedPerlList, showInstalledPerlList, showDiffPerlList enthalten jetzt Links zum CPAN-Eintrag des Paketes


LG,
Heiko
Proxmox+Debian+MariaDB, PV: SMA, Victron+Pylontech
Maintainer:SSCam,SSChatBot,SSCal,SSFile,DbLog,DbRep,Log2Syslog,SolarForecast,Watches,Dashboard,PylonLowVoltage,MemSaver
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

rudolfkoenig

ZitatDa sowohl Installer.pm als auch Meta.pm aktuell von dir betreut werden, in der Maintainer.txt aber als verwaist markiert sind, würde ich beide Module übernehmen und als Interims‑Maintainer die neue Installer-Version einchecken/weiterführen
Das wuerde mich sehr freuen, und vielen Dank schonmal fuer die Arbeit!

DS_Starter

#3
@all,

die v1.0.0 des Installers ist eingecheckt und morgen früh im Update enthalten.
Verbesserungshinweise oder Patches nehme ich gern entgegen.

@Rudi, Maintainer.txt habe ich auch auf mich umgestellt.

LG,
Heiko
Proxmox+Debian+MariaDB, PV: SMA, Victron+Pylontech
Maintainer:SSCam,SSChatBot,SSCal,SSFile,DbLog,DbRep,Log2Syslog,SolarForecast,Watches,Dashboard,PylonLowVoltage,MemSaver
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

DS_Starter

#4
@all,

in meinem Contrib liegt die v1.1.0 des Moduls.

Manchmal kann ein Perl Paket nicht installiert werden weil bestimmte Voraussetzungen fehlen. Dann zeigt das Modul einen Fehler an den man sich mit "get ... showErrorList" ansehen kann.
Nun kann man sich auch das korrespondierende cpanm Logfile einlesen und es bei Bedarf über einen eingebauten Copy-Button von einem LLM seiner Wahl analysieren lassen was zu tun ist. Damit sollte man schnell zum Ziel kommen wenn die Situation nicht so deutlich sein sollte.

Anbei Screenshots mit einem Beispiel nach "set ... installPerl GD".

EDIT: eingecheckt für den 20.10. ab ca. 08:15.

LG,
Heiko
Proxmox+Debian+MariaDB, PV: SMA, Victron+Pylontech
Maintainer:SSCam,SSChatBot,SSCal,SSFile,DbLog,DbRep,Log2Syslog,SolarForecast,Watches,Dashboard,PylonLowVoltage,MemSaver
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

binford6000

Gm Heiko,
Define setzt alias/devStateIcon/group/icon/room unter

if (!defined $hash->{OLDDEF}) {
OLDDEF existiert nur bei modify, beim Einlesen der fhem.cfg läuft Define daher bei jedem Start durch.
Folge: per deleteattr entfernte Attribute sind nach jedem Neustart wieder gesetzt (und landen beim nächsten save wieder in der fhem.cfg).

Vorschlag: zusätzlich $init_done prüfen, damit die Defaults nur bei einem define zur Laufzeit gesetzt werden. Diff anbei.
if (!defined $hash->{OLDDEF} && $init_done) {
Getestet mit 98_Installer.pm 31800 2026-10-19 08:33:39Z DS_Starter
VG Sebastian

 

DS_Starter

Hallo Sebastian,

es war meine Absicht, dass bestimmte Framework-Attribute mit einem (sinnvollen) Defaultwert vorbelegt werden und der User sie natürlich ändern/überschreiben kann.

Wenn das grundsätzlich stören oder nicht gewünscht sein sollte, kann ich das Define auch um einen optionalen Parameter ergänzen der die Defaults veranlasst. Also etwa so:

defmod <Name> Installer [attrdefaults]
Wolltest du diese Beobachtung nur melden oder stören diese Vorbelegungen?

LG,
Heiko
Proxmox+Debian+MariaDB, PV: SMA, Victron+Pylontech
Maintainer:SSCam,SSChatBot,SSCal,SSFile,DbLog,DbRep,Log2Syslog,SolarForecast,Watches,Dashboard,PylonLowVoltage,MemSaver
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

binford6000

#7
ZitatWolltest du diese Beobachtung nur melden oder stören diese Vorbelegungen?

Mich persönlich stört es. Ich habe in FHEMWEB komplett icons abgeschafft und durch Favicons ersetzt.
Kann aber mit meinen lokalen Anpassungen leben.

Eine weitere Beobachtung von vorhin:

Internals:
   FUUID      6adc2cf1-f33f-f06b-a6a1-599f6c53c75833c2
   FVERSION   98_Installer.pm:v1.1.0-s31800/2026-10-19
   NAME       fhemInstaller
   NOTIFYDEV  global,fhemInstaller
   NR         62
   NTFY_ORDER 50-fhemInstaller
   STATE      command 'outdatedPerl' in progress
   TYPE       Installer
   eventCount 1
   READINGS:
     2026-09-15 12:47:00   cpanminusVersion 1.7049
     2026-10-18 10:49:50   installedPerl   successful
     2026-10-21 02:58:33   outdatedPerl    check completed
     2026-09-15 12:47:00   perlVersion     5.040001
     2026-10-24 08:45:51   state           command 'outdatedPerl' in progress
     2026-10-21 02:58:33   updatesAvailablePerl 2
Attributes:
   alias      ⚠️ FHEM Installer Status
   devStateIcon {
  if (ReadingsVal($name,'state',undef) =~ /up.to.date/) {
    return '<div>🔵</div>'
  }
  elsif (ReadingsVal($name,'state',undef) =~ /available|error/) {
    return '<div>🔴</div>'
  }
  elsif (ReadingsVal($name,'state',undef) =~ /progress/) {
    return '<div>🔄</div>'
  }
  elsif (ReadingsVal($name,'state',undef) =~ /outdated|warning/) {
    return '<div>🟡</div>'
  }
}
   group      🔄 Update
   icon       system_fhem
   installerMode update
   room       90_System->90_System

Trotz shutdown + restart und sogar reboot des lxc bleibt stat auf command 'outdatedPerl' in progress.
Jedes weitere set update / outdated wird mit

Another command ('outdatedPerl') is still in progress, please wait until it has finished.

⚠️ UPDATE:
Mit Verbose 5 kommt auch was im Log:

SubProcess: onRun returned error: Invalid version format (version required) at ./FHEM/98_Installer.pm line 1646.
Ich habe daraufhin 
if ((!defined $version || $version eq '') && $module =~ /-/) {
zu

if ((!defined $version || "$version" eq '') && $module =~ /-/) {
Geändert und dann lief das letzte Update auch durch.

Grüße,
Sebastian

DS_Starter

Beide Punkte werden mit der kommenden Version erledigt.

Lg,
Heiko
Proxmox+Debian+MariaDB, PV: SMA, Victron+Pylontech
Maintainer:SSCam,SSChatBot,SSCal,SSFile,DbLog,DbRep,Log2Syslog,SolarForecast,Watches,Dashboard,PylonLowVoltage,MemSaver
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

passibe

Servus, ich betreibe FHEM unter Docker und bekomme (vermutlich) seit einem neuerlichen Update alle vier Stunden folgende Meldung ins Log:

2026.10.24 10:47:24 2: Installer (fhemInstaller) - update in progress, process aborted.
Hier mal ein list von fhemInstaller, falls es was hilft. Bin mir um ehrlich zu sein gar nicht sicher, woher das device kommt, manuell angelegt habe ich es nicht und benutzt habe ich es auch noch nie. Vermutlich wird das über das Docker-Image angelegt?

Internals:
   FUUID      64407a84-f33f-fcd4-2f17-5f7bdb2f78b2e5a7
   FVERSION   98_Installer.pm:v1.1.0-s31800/2026-10-19
   NAME       fhemInstaller
   NOTIFYDEV  global,fhemInstaller
   NR         240
   NTFY_ORDER 50-fhemInstaller
   STATE      command 'outdatedPerl' in progress
   TYPE       Installer
   eventCount 1
   READINGS:
     2026-04-07 23:14:26   cpanminusVersion 1.7049
     2026-10-20 00:41:23   outdatedPerl    check completed
     2026-09-26 12:26:54   perlVersion     5.040005
     2026-10-24 16:35:57   state           command 'outdatedPerl' in progress
     2023-04-20 01:34:37   updatesAvailablePerl 0
Attributes:
   alias      FHEM Installer Status
   devStateIcon .*updates.available:security@red:outdated up.to.date:security@green:outdated .*outdated.*in.progress:system_fhem_reboot@orange .*in.progress:system_fhem_update@orange warning.*:message_attention@orange error.*:message_attention@red
   group      Update
   icon       system_fhem
   room       System

DS_Starter

Hallo zusammen,

der Installer wird morgen früh mit der Version 1.2.0 ausgeliefert, außerdem Meta.pm passend refaktoriert in der v1.0.0.
Hier das Changelog. Damit sollten die zuvor genannten Issues (inkl. passibe) erledigt sein.

- **Installer:**

  Fehlerbehandlung im Subprozess verbessert, hängender Befehlsstatus behoben

- **Fix:**
  * Exception im Kindprozess (OnRun) wird abgefangen und als Fehlerergebnis (E502) an den Parent
    gemeldet; der Befehl bleibt nicht mehr dauerhaft "in progress"
  * Exception im Kindprozess (OnRun) wird abgefangen und als Fehlerergebnis (E502) an den Parent
    gemeldet; der Befehl bleibt nicht mehr dauerhaft "in progress"
  * PollChild erkennt einen beendeten Kindprozess ohne Ergebnis (E503) und räumt den Subprozess auf
  * Fehlerergebnis aus PollChild im Format der Fehlerliste (Array von Fehler-Hashes) statt als String
  * PreProcessing setzt bei ungültigem JSON den State auf error statt auf "in progress" stehen zu lassen
  * Abbruch bei der Perl-Modulliste "Invalid version format (version required)": $VERSION von
    ExtUtils::Installed kann ein version-Objekt sein, der Vergleich mit '' wird jetzt auf dem
    String ausgeführt
  * Perl-Modulliste: Packlist-Namen ohne passende Moduldatei (z.B. Net, Pod, cpan::outdated) werden nicht mehr aufgelistet;
    Distributionsnamen mit '-' bleiben erhalten
 
- ** Change:**
  * PID des Kindprozesses wird gemerkt und beim Aufräumen entfernt
  * Define hat den optionalen Parameter defaultAttr; nur damit werden die Voreinstellungen für
    FHEMWEB (alias, devStateIcon, group, icon, room) gesetzt, bisher geschah das bei jedem neuen Anlegen.
    Das Icon bei Fehlern ruft getShowErrorList auf.

- **Meta:**
  Refactoring zur Verbesserung von Effektivität, Lesbarkeit und Wartbarkeit
  Speicherleaks beseitigt, öffentliche API und Datenstrukturen unverändert

- **Change:**
  * __GetMetadata in Teilfunktionen zerlegt (Dateiscan, JSON, Prereqs, Vererbung,
    Core-Defaults, Support-Status, Keywords)
  * doppelte Maintainer- und Update-Zweige zusammengeführt
  * Perl-Pragmas in den Core-Modul-Index aufgenommen (nur Fallback ohne Module::CoreList)
  * nicht unterstützte =encoding-Angabe wird mit Log 4 gemeldet
  * ungenutzte Imports entfernt (POSIX, Data::Dumper, Debug, genUUID)

- **Fix:**
  * GetModuleFilepath lädt Perl-Module nicht mehr per require, nur noch Suche in @INC
  * %maintainers wuchs bei jedem Reload (Duplikatprüfung verglich Modulnamen mit Maintainer-Namen)
  * Endlosrekursion bei zyklischen Paketabhängigkeiten (Schutz in Load)
  * veraltete Variablen in Get/SetInternals durch "my ... if(...)" entfernt
  * Fehlerbehandlung ohne Abhängigkeit von altem $@, Load meldet Fehler nicht mehr doppelt
  * x_file-Indexverschiebung bei nicht lesbarer Moduldatei
  * GetModuleFilepath('perl') liefert $^X
  * Fehlermeldung beim Lesen von MAINTAINER.txt gibt $! statt $@ aus

Beachtet den optionalen Zusatz "defaultAttr" im DEF von Installer.

LG,
Heiko
Proxmox+Debian+MariaDB, PV: SMA, Victron+Pylontech
Maintainer:SSCam,SSChatBot,SSCal,SSFile,DbLog,DbRep,Log2Syslog,SolarForecast,Watches,Dashboard,PylonLowVoltage,MemSaver
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

Sidey

Welche Anwendungsmöglichkeit soll der installer bei Einsatz in einem Container realisieren?
Nutze: SIGNALDuino, Homematic, Raspberry Pi, MQTT, Alexa, Docker, AlexaFhem,zigbee2mqtt, tasmota

Maintainer von: SIGNALduino, SD_WS*, fhem-docker, alexa-fhem-docker, fhempy-docker, WebAuth, fhem-mcp, midea-mqtt, whatsmeow-mqtt, alexa-cookie-service
https://github.com/sidey79?tab=repositories

passibe

Keine Ahnung. Wie gesagt, ich habe ihn noch nie benutzt und weiß nicht woher er kommt. Vermutlich habe ich den vor x Jahren mal definiert als mein FHEM noch nicht mit Docker lief und er ist bis jetzt als blinder Passagier mitgewandert. Bislang war er ja auch sehr unauffällig.

Aber vermutlich ist es dann Zeit, ihn zu löschen  :))