CODE: FHEM Featurelevel <=> Infrastructure Tech Level / FHEM_updatecheck

Begonnen von RichardCZ, 29 März 2020, 15:15:03

Vorheriges Thema - Nächstes Thema

RichardCZ

Wie können wir sicherstellen, dass wir moderne (oder auch: nicht bewusst kaputte) Technologien einsetzen ohne dabei eine Userinstallation zu zerschiessen, bzw. ohne User unnötig auszugrenzen?


  • Definieren einer vernünftigen mindest-Perlversion für einen FHEM Feauturelevel
  • Kenntnis über benötigte Module für einen gegebenen FHEM Featurelevel

Was bedeutet "vernünftige mindest-Version?" Derzeit: https://fhem.de/stats/statistics.html, was jeder "mindestens" hat - das ist 5.10.1
Künftig soll es das bedeuten was die FHEM community entscheidet. Das könnte sein
"Nix älteres als 10 Jahre"
"Nächstbessere als die, welche von weniger als X Leuten verwendet wird"
"Perl ohne gemeldete CVE Sicherheitsprobleme"
... was auch immer

Nach mehreren Tagen des Sinnierens über dieses Problem habe ich mich heute entschlossen ein wenig Demo-Code beizusteuern.

Gewollt war, dass dieser Code die von einem "FHEM Updateserver" bereitgestellten Versionen einem lokalen Realitätscheck unterziehen sollte und als Ergebnis dieses Checks, dem User sagen sollte bis zu welcher FHEM Version ("Featurelevel") er updaten kann - wenn überhaupt und was er ggf. machen muss um darüber hinaus updaten zu können.

Siehe Anhang.

Bei mir spuckt  FHEM_update sowas aus:

$ FHEM_update.pl
$VAR1 = {
          'possible' => '6.2.1',
          'ensure' => {
                        '6.5.5.5.1' => ' Modules: JSON, Advanced::Tech',
                        '7.0' => 'Perl version 5.32.0 Modules: JSON, Advanced::Tech, Alien::Tech',
                        '6.3.4-r2' => ' Modules: JSON'
                      }
        };


Jetzt ganz wichtig: Das ist nur eine Komponente des Update-Prozesses, nämlich der Check, natürlich ist da eine übergeordnete Komponente notwendig, die dann tatsächlich ein Update auf eine gegebene Version durchführt. Diese gegebene Version kann das sein, was der Check empfiehlt, es könnte aber auch etwas sein, was der User "forciert" (weil er wüsste, dass z.B. ein bestimmtes Perl modul nur für eine bestimmte Funktionalität benötigt wird, die er nicht braucht)

Zurück zum Check

Der User (oder die Updateroutine seines FHEM) wüsste hiermit also umgehend bis wohin er ohne weitere Aktion updaten kann (possible), bzw. was er tun muss um auf eine bestimmte Version upzudaten (ensure)-hash.

Die zentrale Datenstruktur ist eine Version => Requirements Liste. Demo-mäßig z.B. sowas

    '6.1' => {
        perl    => v5.10.1,
        modules => ['Net::SNMP'],
    },

    '6.2' => {
        perl    => v5.12.5,
        modules => ['Export::Attrs'],
    },

    '6.2.1' => {
        perl    => v5.12.5,
        modules => ['YAML'],
    },

    '6.3.4-r2' => {
        perl    => v5.18.1,
        modules => ['JSON'],
    },

    '6.5.5.5.1' => {
        perl    => v5.18.1,
        modules => ['Advanced::Tech'],
    },

    '7.0' => {
        perl    => v5.32.0,
        modules => ['Alien::Tech'],
    },


Wenn ihr das jetzt mit der Ausgabe da oben vergleicht, seht ihr, dass ich ein Perl > 5.18.1 und < 5.32.0 haben muss. Ebenso seht ihr, dass bei mir Export::Attrs, Net::SNMP, YAML aber nicht JSON installiert ist. Auch habe ich keine Advanced:: und Alien:: Tech module installiert.  ;)

Ich kann also von meinem Featurelevel 6.0 ohne Weiteres auf 6.2.1 updaten, für 6.3.4-r2, 6.5.5.5.1 und 7.0 müsste ich Vorbereitungen treffen.

Die Versionsnummern:

Ist vielleicht Overkill, aber ich habe mich da bei Gentoo bedient, weil ich gerne fertigen Code verwende (auch wenn man den etwas hübscher machen könnte) und weil Gentoo Versionsnummern eigentlich keine Wünsche offen lassen. Major/Minor/Patchlevel(s)[-revision(s)] etc.

Damit könnte man dann auch Usern, die echt nicht weiterkommen als - sagen wir - Perl 5.14, entsprechende Featurelevel

6.1.1, 6.1.2, 6.1.3 ... noch ne Zeitlang liefern (Bugfixes)
während der Hauptast irgendwo bei 7.8.schlagmichtot wäre


Witty House Infrastructure Processor (WHIP) is a modern and
comprehensive full-stack smart home framework for the 21st century.

RichardCZ

Aktuelle Version spuckt nun sowas aus. Die Requirements sollten programmatisch sein, damit das auch ein Automatismus verarbeiten kann (der das dann entweder für Programmkontrolle und/oder userdisplay zubereitet).

Ebenso habe ich in den Demo-Requirements-Daten mal zwei Module rein, damit man sieht, dass das auch geht.
Quantum::Superpositions gibt es übrigends. https://metacpan.org/pod/Quantum::Superpositions - ursprünglich vom PBP Autor.




$ FHEM_update.pl
$VAR1 = {
          'ensure' => {
                        '6.5.5.5.1' => {
                                         'mods' => [
                                                     'JSON',
                                                     'Advanced::Tech',
                                                     'Quantum::Superpositions'
                                                   ]
                                       },
                        '7.0' => {
                                   'perl' => v5.32.0,
                                   'mods' => [
                                               'JSON',
                                               'Advanced::Tech',
                                               'Quantum::Superpositions',
                                               'Alien::Tech'
                                             ]
                                 },
                        '6.3.4-r2' => {
                                        'mods' => [
                                                    'JSON'
                                                  ]
                                      }
                      },
          'possible' => '6.2.1'
        };


edit: Wenn ich jetzt also JSON installiere, sollte 6.3.4-r2  "possible" sein:

...
Appending installation info to /opt/perlbrew/perls/perl-5.30.1/lib/5.30.1/x86_64-linux/perllocal.pod
  MLEHMANN/JSON-XS-4.02.tar.gz
  /usr/bin/make install  -- OK


Tadaaa:

$ FHEM_update.pl
$VAR1 = {
          'ensure' => {
                        '7.0' => {
                                   'perl' => v5.32.0,
                                   'mods' => [
                                               'Advanced::Tech',
                                               'Quantum::Superpositions',
                                               'Alien::Tech'
                                             ]
                                 },
                        '6.5.5.5.1' => {
                                         'mods' => [
                                                     'Advanced::Tech',
                                                     'Quantum::Superpositions'
                                                   ]
                                       }
                      },
          'possible' => '6.3.4-r2'
        };


edit2: Und nur so als Ansicht, wie der Code bei mir im Editor aussieht. Ich versuche "in Paragraphen zu coden" - wie es PBP vorschlägt.
Witty House Infrastructure Processor (WHIP) is a modern and
comprehensive full-stack smart home framework for the 21st century.