Meta.pm: Metadaten über FHEM Module

Begonnen von Loredo, 19 Februar 2019, 11:43:50

Vorheriges Thema - Nächstes Thema

Loredo

Hi,

bei der Recherche zu externen Abhängigkeiten von FHEM Modulen ist mir mal wieder bewusst geworden, wie unterschiedlich das dokumentiert ist und wie schwer es für Nutzer und auch Entwickler ist, diese verlässlich zusammenzutragen oder gar maschinenlesbar auszuwerten. Jetzt, wo André und Co. eine ganze Reihe von Modulen neu bereitgestellt haben, die eine starke Abhängigkeit zu Node.js bzw. NPM Paketen haben, wollte ich das zum Anlass nehmen das ganze zu verbessern.

Für die Installation an sich habe ich als erstes Beispiel einmal das npmjs.pm Modul geschrieben, welches nun Node.js Pakete installieren/deinstallieren/aktualisieren kann. Andrés Module reagieren sogar darauf, wenn NPM was an den Node.js Pakete macht. Allerdings fehlt noch immer die maschinenlesbare Info, dass zum FHEM Modul "alexa" das Node.js Paket "alexa-fhem" gehört und dass beide nur zusammen funktionieren.

Meta.pm ermöglicht es nun, dass man Meta-Informationen als zusätzlichen Pod im JSON Format in eine Moduldatei mit ablegt. Das JSON Format folgt dabei der Spezifikation von CPAN::Meta::Spec und wurde um einige Custom Attribute (beginnend mit x_) für FHEM erweitert. Wenn ein Modul Meta.pm implementiert hat, dann gibt es im $modules{<PKG>}{META} Hash die entsprechenden Informationen über die Moduldatei.

Beispiel:


{
  'ORDER' => '42',
  'UndefFn' => 'FHEM::npmjs::Undef',
  'GetFn' => 'FHEM::npmjs::Get',
  'DefFn' => 'FHEM::npmjs::Define',
  'NotifyFn' => 'FHEM::npmjs::Notify',
  'NAME' => 'npmjs',
  'LOADED' => 1,
  'AttrFn' => 'FHEM::npmjs::Attr',
  'SetFn' => 'FHEM::npmjs::Set',
  'AttrList' => 'disable:1,0 disabledForIntervals updateListReading:1,0 npmglobal:1,0 event-aggregator event-min-interval event-on-change-reading event-on-update-reading oldreadings stateFormat:textField-long timestamp-on-change-reading',
  'META' => {
              'description' => 'commandref.html#npmjs',
              'x_fhem_maintainer_github' => [
                                              'jpawlowski'
                                            ],
              'author' => [
                            'Julian Pawlowski <julian.pawlowski@gmail.com>'
                          ],
              'x_prereqs_os' => {
                                  'runtime' => {
                                                 'suggests' => {},
                                                 'requires' => {},
                                                 'recommends' => {
                                                                   'debian|ubuntu' => 0
                                                                 }
                                               }
                                },
              'x_prereqs_os_debian' => {
                                         'runtime' => {
                                                        'requires' => {},
                                                        'suggests' => {},
                                                        'recommends' => {
                                                                          'openssh-client' => 0
                                                                        }
                                                      }
                                       },
              'x_file' => [
                            './FHEM/42_npmjs.pm',
                            './FHEM/',
                            '42_npmjs.pm',
                            '42',
                            'npmjs',
                            'pm',
                            [
                              2049,
                              576456,
                              33188,
                              1,
                              6061,
                              6061,
                              0,
                              53269,
                              [
                                1550565749,
                                '2019-02-19 09:42:29',
                                '2019-02-19',
                                '2019',
                                '02',
                                '19',
                                '09:42:29',
                                '09',
                                '42',
                                '29'
                              ],
                              [
                                1550565676,
                                '2019-02-19 09:41:16',
                                '2019-02-19',
                                '2019',
                                '02',
                                '19',
                                '09:41:16',
                                '09',
                                '41',
                                '16'
                              ],
                              [
                                1550565746,
                                '2019-02-19 09:42:26',
                                '2019-02-19',
                                '2019',
                                '02',
                                '19',
                                '09:42:26',
                                '09',
                                '42',
                                '26'
                              ],
                              4096,
                              112
                            ],
                            'META.json',
                            undef
                          ],
              'x_prereqs_permissions_filemod' => {
                                                   'runtime' => {
                                                                  'recommends' => {},
                                                                  'requires' => {},
                                                                  'suggests' => {}
                                                                }
                                                 },
              'x_prereqs_permissions_fileown' => {
                                                   'runtime' => {
                                                                  'recommends' => {},
                                                                  'suggests' => {},
                                                                  'requires' => {}
                                                                }
                                                 },
              'resources' => {
                               'license' => [
                                              'https://fhem.de/#License'
                                            ],
                               'repository' => {
                                                 'x_branch_dev' => 'trunk',
                                                 'x_branch_master' => 'trunk',
                                                 'type' => 'svn',
                                                 'url' => 'https://svn.fhem.de/fhem/',
                                                 'web' => 'https://svn.fhem.de/'
                                               },
                               'bugtracker' => {
                                                 'x_web_title' => 'Sonstige Systeme',
                                                 'web' => 'https://forum.fhem.de/index.php/board,29.0.html'
                                               },
                               'homepage' => 'https://fhem.de/'
                             },
              'name' => 'FHEM::npmjs',
              'meta-spec' => {
                               'url' => 'https://metacpan.org/pod/CPAN::Meta::Spec',
                               'version' => 2
                             },
              'prereqs' => {
                             'runtime' => {
                                            'recommends' => {},
                                            'requires' => {
                                                            'perl' => '5.014',
                                                            'GPUtils qw(GP_Import)' => 0,
                                                            'Data::Dumper' => 0,
                                                            'JSON' => 0
                                                          },
                                            'suggests' => {}
                                          }
                           },
              'x_prereqs_binary_exec' => {
                                           'runtime' => {
                                                          'recommends' => {},
                                                          'requires' => {
                                                                          '/usr/bin/npm|/usr/local/bin/npm' => 0,
                                                                          '/usr/bin/node|/usr/local/bin/node' => 0
                                                                        },
                                                          'suggests' => {
                                                                          '/usr/bin/ssh|/usr/local/bin/ssh' => 0
                                                                        }
                                                        }
                                         },
              'keywords' => [
                              'fhem-core',
                              'fhem-mod',
                              'fhem-mod-device',
                              'nodejs',
                              'node',
                              'npm'
                            ],
              'dynamic_config' => 1,
              'x_lang' => {
                            'DE' => {
                                      'description' => '/./docs/commandref_DE.html#npmjs',
                                      'abstract' => 'Modul zur Bedienung der Node.js Paket Installation und Updates'
                                    },
                            'de' => {
                                      'description' => 'commandref.html#npmjs',
                                      'abstract' => 'Modul zur Bedienung der Node.js Installation und Updates'
                                    }
                          },
              'generated_by' => 'FHEM::Meta v0.0.1, 2019-02-19 09:42:29',
              'license' => 'GPL_3',
              'release_status' => 'stable',
              'x_prereqs_os_ubuntu' => {
                                         'runtime' => {
                                                        'suggests' => {},
                                                        'requires' => {},
                                                        'recommends' => {
                                                                          'openssh-client' => 0
                                                                        }
                                                      }
                                       },
              'x_fhem_maintainer' => [
                                       'loredo'
                                     ],
              'abstract' => 'Module to control Node.js package installation and update',
              'version' => 'v0.10.3',
              'x_prereqs_nodejs' => {
                                      'runtime' => {
                                                     'recommends' => {},
                                                     'suggests' => {},
                                                     'requires' => {
                                                                     'node' => '8',
                                                                     'npm' => 0
                                                                   }
                                                   }
                                    },
              'x_vcs' => [
                           '$Id: 42_npmjs.pm 18636 2019-02-19 02:26:02Z loredo $',
                           '42_npmjs.pm',
                           '42',
                           'npmjs',
                           'pm',
                           '18636',
                           '2019-02-19 02:26:02',
                           '2019-02-19',
                           2019,
                           '02',
                           '19',
                           '02:26:02',
                           '02',
                           '26',
                           '02',
                           'loredo',
                           1550543162
                         ],
              'x_prereqs_python' => {
                                      'runtime' => {
                                                     'suggests' => {},
                                                     'requires' => {},
                                                     'recommends' => {}
                                                   }
                                    },
              'x_prereqs_sudo' => {
                                    'runtime' => {
                                                   'suggests' => {
                                                                   'ALL=NOPASSWD: /usr/local/bin/npm install *' => 0,
                                                                   'ALL=NOPASSWD: /usr/bin/npm install *' => 0
                                                                 },
                                                   'requires' => {},
                                                   'recommends' => {
                                                                     'ALL=NOPASSWD: /usr/bin/npm update *' => 0,
                                                                     'ALL=NOPASSWD: /usr/local/bin/npm update *' => 0
                                                                   }
                                                 }
                                  },
              'x_version' => '42_npmjs.pm:v0.10.3-s18636/2019-02-19'
            }
}



Das npmjs.pm Modul nutzt Meta.pm einmal beispielhaft zur Anzeige der Versionsinformation als INTERNAL (siehe Screenshot anbei). Die Paketabhängigkeiten werden noch nicht ausgewertet, sollen aber in einem widerum separaten Installer Modul einmal dem Benutzer verfügbar gemacht werden, um idealerweise diese auch per Klick auflösen zu können.

Was man auch schon machen kann ist die Meta Informationen für alle Module zu laden, entweder für alle, die auch aktuell geladen sind oder auch für die, die derzeit nicht in der FHEM Instanz verwendet werden. Bei Modulen, die noch keinen META.json Pod haben, werden die Informationen so gut es geht aus anderen Quellen zusammengetragen (SVN Info, Dateiname, etc.).

André hat sich das ganze auch gewünscht, weil der für sein geplantes Discovery Modul ebenfalls die Möglichkeit braucht Informationen über ein Modul abzufragen, obwohl es noch nicht geladen wurde.

Das ganze ist jetzt mal eine erste Version, wahrscheinlich ändern sich Funktionsaufrufe nochmal hier und dort. Besser also nichts überstürzen :-)



Gruß
Julian
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

Loredo

In diesem Zusammenhang habe ich noch eine Frage an @Rudi:


Findet sich die aktuelle Major Versionsnummer von FHEM noch woanders als im Makefile, insbesondere in einer Datei, die auch über den Update Mechanismus aktualisiert wird?


Danke und Gruß
Julian
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

rudolfkoenig

Meinst du featurelevel?
"Major Versionsnummer" ist bei dem Entwicklungsmodell von FHEM wenig aussagekraeftig.

Loredo

Nein, ich meine nicht Feature Level.


Du hast mir schon einige Male erklärt, dass der Major Versionsstand nicht so aussagekräftig ist. Allerdings wird die Version ja trotzdem auf der Website und auch beim Namen des Debian Paketes genannt, sie spielt also trotzdem eine gewisse Rolle und Menschen (TM) sind halt daran gewöhnt, dass sie die Version, die sie auf der Website finden, dann auch irgendwo in der Software nachkontrollieren können. Zumindest mir leuchtet dann nach wie vor nicht ein, warum es dann überhaupt noch eine Version in diesem Format geben muss. Warum dann nicht sowas wie <2-stelliges Jahr>.<Releasemonat>? Oder eben komplett auf die Versionsnummer verzichten.


Aber solange die Versionsnummer irgendwo herumschwirrt, würde ich sie auch als Meta-Information verstehen und bereitstellen.
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

CoolTux

Naja so wie ich das verstanden habe ist es ja gerade eben keine Versionsnummer, sondern ein Featurelevel. Sprich ab diesem Level gibt es einige "gravierende" Änderungen. Meistens im Standardverhalten von Funktionen in der fhem.pl


Grüße
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

Loredo

Ok dann frage ich anders: Wo kann ich das aktuell höchste Feature Level auslesen, was der Benutzer einstellen kann?
Ist die Attributauswahl da verlässlich genug?
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

nils_

Zitat von: Loredo am 20 Februar 2019, 09:21:32
Ok dann frage ich anders: Wo kann ich das aktuell höchste Feature Level auslesen, was der Benutzer einstellen kann?
Ist die Attributauswahl da verlässlich genug?

https://forum.fhem.de/index.php/topic,97528.0.html

das höchste steht doch in $featurelevel, der user kann doch nur weniger einstellen. (spezialfall: 99.99)
so hab ich es verstanden.
viele Wege in FHEM es gibt!

CoolTux

Am besten ist Du liest die globale Variable $featurelevel aus.
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

Loredo

#8
Da sind wir genau bei dem Dilemma.
Die globale Variable $featurelevel gibt an, was der User eingestellt hat. Der Inhalt der Datei fhem.pl ist aber trotzdem nicht auf dem Stand von featurelevel 5.7 oder ähnliches.


Ich lese jetzt die Auswahlliste für featurelevel aus $modules{'Global'}{AttrList} aus. Ich wollte nur sicherstellen, dass diese Auswahlliste dann das einzig wahre Indiz dafür ist, welches der aktuellste Featurelevel ist und es dann richtig ist diesen als Major Version zu interpretieren.


Edit: Danke @nils_, den Beitrag kannte ich nicht. Dann macht das ganze jetzt auch Sinn für mich :-)
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

nils_

Zitat von: Loredo am 20 Februar 2019, 09:47:36
Edit: Danke @nils_, den Beitrag kannte ich nicht. Dann macht das ganze jetzt auch Sinn für mich :-)
es gibt in letzter zeit gehäuft fragen dazu (warum weiß ich auch nicht....), da hab ich mal einen der letzten beiträge dazu rausgesucht. und dann natürlich mit der hoffnung etwas licht ins dunkel zu bringen (hat ja anscheinend funktioniert :) )
viele Wege in FHEM es gibt!

Loredo

Zitat von: nils_ am 20 Februar 2019, 09:58:49
es gibt in letzter zeit gehäuft fragen dazu (warum weiß ich auch nicht....)


Meine Interpretation: Viele haben erkannt, dass FHEM inzwischen eine kritische Komponente ist und damit kommen Themen wie Backup und vor allem ein sauberer/einfacher/schneller Restore ins Spiel. Zwangsläufig wird man dann mit Fragen zur Versionierung konfrontiert und stößt dann auch darauf, wie man eigentlich damit bei FHEM umgeht. Bei anderen Projekten kann man einen komplett fixen Versionsstand adressieren und hat dann einen fest definierten Zustand. Das kriegt man bei FHEM derzeit leider nicht so einfach hin (siehe auch Diskussionen zum Docker Image).
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

CoolTux

Daher ja auch mein neues backupME Perl Skript. Ich habe es endlich mal geschafft mein Bash Skript zum Sichern in ein schönes Perl Skipt zu gießen.
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

betateilchen

#12
um auf die ursprüngliche Frage zurückzukommen:

Zitat von: Loredo am 20 Februar 2019, 08:57:00
Findet sich die aktuelle Major Versionsnummer von FHEM noch woanders als im Makefile, insbesondere in einer Datei, die auch über den Update Mechanismus aktualisiert wird?

Die "Versionsnummer" 5.9, die für die Erzeugung beispielsweise des Namens für das  Debian Paket verwendet wird, kommt ausschließlich aus dem Makefile.
Das Makefile selbst ist - wenn ich es richtig in Erinnerung habe - nicht Bestandteil der ausgelieferten Installationspakete und wird somit auch nicht per Update verteilt.

Du wirst also das Makefile auf einem typischen, aus einem Installationspaket stammenden FHEM System, gar nicht vorfinden.

Zitat von: Loredo am 20 Februar 2019, 10:07:18
Bei anderen Projekten kann man einen komplett fixen Versionsstand adressieren und hat dann einen fest definierten Zustand. Das kriegt man bei FHEM derzeit leider nicht so einfach hin (siehe auch Diskussionen zum Docker Image).

Einen fest definierten Zustand (ohne die Nutzung von svn) hast Du bei FHEM immer nur für den Zeitpunkt, an dem Rudi ein neues "Major Release" freigibt, also z.B. 5.8 oder 5.9. Im nightly build des Debian Paketes wird an die Versionsnummer 5.9 deshalb immer noch die svn Rev-Nummer angehängt, die in diesem nightly build enthalten ist.

Vor einer ähnlichen Frage wie der von Dir gestellten, standen Markus und ich im Rahmen des Neubaus der FHEM Statistik. "Wie bekommen wir raus, wie "alt" eine FHEM Installation beim Anwender ist?"

Die REV Id einer FHEM Installation befindet sich in der ersten Zeile der Datei /opt/fhem/controls_fhem.txt - und diese Datei wird per Update ausgeliefert!
Aus dieser Information kann man feststellen, wann die Installation zum letzten Mal ein Update erfahren hat, somit steht auch fest, welches "Major Release" die Installation hat.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

nils_

Zitat von: Loredo am 20 Februar 2019, 10:07:18
Bei anderen Projekten kann man einen komplett fixen Versionsstand adressieren und hat dann einen fest definierten Zustand. Das kriegt man bei FHEM derzeit leider nicht so einfach hin (siehe auch Diskussionen zum Docker Image).
da kannste dich ja eigentlich nur auf die svn-revision beziehen, um einen definierten zustand aller dateien zu diesem zeitpunkt adressieren zu können.
viele Wege in FHEM es gibt!

Loredo

Ich habe das Meta.pm Paket jetzt denke ich in einem solchen Status, dass man damit etwas anfangen kann.
Als erster Showcase habe ich begonnen den FHEM Installer zu schreiben, mit dem man die Metadaten entsprechend auswerten kann.


@justme1968/André, wir könnten jetzt beispielsweise auch die Node.js Abhängigkeiten als Metadaten in deine Module hängen und entsprechend mit anzeigen. Das npmjs Modul kann dann entsprechend dynamisch die Installationsliste generieren anstatt wie bisher statisch über einen Hash, der bei mir im Modul liegt.
Außerdem kannst du glaube ich anfangen dein Service Discovery Modul hervorzukramen :-)


@Rudi @Jörg und andere: Mir erschien es sinnvoll auch einige Compliance Dinge mit anzuzeigen bzw. zu verlinken (z.B. Copyright, Datenschutzerklärung).
Natürlich kann man die Links ändern, aber derzeit gibt es z.B. keine dedizierte Datenschutzerklärung für FHEM als Software. Ggf. bitte einen gesonderten Thread für die inhaltliche Diskussion zu Compliance/Privacy/Legal Themen aufmachen, wenn ihr euch dabei angesprochen fühlt.




Gruß
Julian
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER