Markus Michalski FAQ

Plugin Update Checker: Technische Details

Technik des Plugin Update Checkers: Ablauf, welche Plugins geprüft werden, URL-Erkennung, Versionsvergleich, Cache, Ausgabe der Badges per Output Buffer, Sicherheit und Dateistruktur.

English Version

Zurück zur Übersicht

Plugin Update Checker: Technische Details

Kennzeichen

Eigenschaft Wert
Plugin-Name Plugin Update Checker
Plugin-ID net.michalski:update-check
Composer-Paket mmd/osticket-plugin-update-check (Typ osticket-plugin)
Plugin-Klasse UpdateCheckPlugin in class.UpdateCheckPlugin.php
Konfigurationsklasse UpdateCheckConfig in config.php
Instanzen Singleton, wird beim Aktivieren automatisch angelegt

Ablauf

graph TD
    A[Seitenaufruf im Admin Panel] --> B{Skript plugins.php?}
    B -->|Nein| Z[Nichts tun]
    B -->|Ja| C{AJAX-Anfrage?}
    C -->|Ja| Z
    C -->|Nein| D[Alle installierten Plugins durchgehen]
    D --> E{url im plugin.php ist GitHub-Repo?}
    E -->|Nein| F[Plugin überspringen]
    E -->|Ja| G{Cache-Eintrag gültig?}
    G -->|Ja| H[Gecachte Release-Daten]
    G -->|Nein| I[GitHub API releases/latest]
    I --> H
    H --> J{Release neuer als installierte Version?}
    J -->|Nein| F
    J -->|Ja| K[Badge-Daten sammeln]
    K --> L[CSS und JS inline in die Seite einfügen]
    L --> M[Browser setzt Badge in die Versionsspalte]
  1. bootstrap() läuft nur, wenn das aufgerufene Skript plugins.php heißt, also auf der Plugin-Liste des Admin Panels. Bei AJAX-Anfragen (X-Requested-With: XMLHttpRequest) passiert nichts.
  2. Der UpdateCheckPlugin liest die Einstellungen aus der ersten aktiven Instanz.
  3. PluginUpdateCollector geht alle über PluginManager::allInstalled() bekannten Plugins durch und liest deren Metadaten per PluginManager::getInfoForPath().
  4. GitHubReleaseChecker holt je Plugin mit GitHub-URL das neueste Release, zuerst aus dem Cache, sonst von GitHub.
  5. Gibt es mindestens ein Update, startet das Plugin einen Output Buffer. AssetInjector fügt das CSS vor </head> und die Update-Daten samt JavaScript vor </body> ein.
  6. Das JavaScript sucht die Zeilen der Plugin-Liste über die Checkbox ids[] (ihr Wert ist die Plugin-ID) und hängt das Badge an die dritte Spalte, die Versionsspalte.

Gibt es kein Update, bleibt die Seite unverändert und es wird nichts eingefügt.

Welche Plugins geprüft werden

Geprüft wird jedes installierte Plugin, dessen plugin.php im Feld url ein GitHub-Repository nennt. Das gilt für Plugins beliebiger Entwickler, auch für den Plugin Update Checker selbst.

Versionsvergleich

Vom Tag-Namen und von der installierten Version wird ein führendes v entfernt. Danach entscheidet PHP version_compare(): Ein Badge erscheint nur, wenn die Release-Version größer ist als die installierte. Gleiche oder ältere Versionen und leere Werte erzeugen kein Badge. Pre-Release-Suffixe werden nicht eigens behandelt, sie folgen den Regeln von version_compare().

Cache

Fall Dauer Inhalt
Erfolgreiche Abfrage Einstellung Cache Duration (hours), Standard 6 Stunden tag_name und html_url des Releases
Fehler oder kein Release fest 1 Stunde Marker none

Anfragen an GitHub

Eigenschaft Wert
URL https://api.github.com/repos/<owner>/<repo>/releases/latest
Methode GET, über cURL
Header Accept: application/vnd.github.v3+json, User-Agent: osTicket-Plugin-UpdateChecker/..., optional Authorization: Bearer <Token>
Timeout 5 Sekunden Gesamtdauer und 5 Sekunden für den Verbindungsaufbau
Weiterleitungen bis zu 3
TLS Zertifikat und Hostname werden geprüft

Die Abfragen laufen nacheinander während des Seitenaufbaus der Plugin-Liste. Bei kaltem Cache und nicht erreichbarem GitHub kann sich die Ladezeit je geprüftem Plugin um bis zu 5 Sekunden verlängern. Danach merkt sich das Plugin den Fehler für eine Stunde. Welche Daten dabei an GitHub gehen, steht unter Datenschutz.

Ausgabe der Badges

Das CSS und das JavaScript des Plugins liegen im Ordner assets/ und werden inline in die Seite geschrieben, nicht als externe Dateien eingebunden. So braucht es keine Webserver-Anpassung. Die Update-Daten stehen als JSON in window.__pluginUpdates.

Das Badge ist ein Link mit dem Text der neuen Version. Er führt auf die Release-Seite bei GitHub, öffnet in einem neuen Tab (rel="noopener noreferrer") und hat den Tooltip Update available: v<Version>. Das Skript registriert sich außerdem auf pjax:end, damit die Badges nach einer PJAX-Navigation erneut gesetzt werden.

Sicherheit

Dateistruktur

include/plugins/update-check/
+-- plugin.php                      Plugin-Metadaten
+-- class.UpdateCheckPlugin.php     Plugin-Klasse
+-- config.php                      Konfigurationsformular
+-- src/
|   +-- AssetInjector.php           Einfügen von CSS/JS in den Output Buffer
|   +-- FileCache.php               Dateibasierter Cache mit Ablaufzeit
|   +-- GitHubReleaseChecker.php    URL-Erkennung, GitHub-Abfrage, Versionsvergleich
|   +-- PluginUpdateCollector.php   Durchläuft die installierten Plugins
+-- assets/
|   +-- update-badges.css           Badge-Stil
|   +-- update-badges.js            Badges in die Tabelle setzen
+-- vendor/                         Composer-Autoloader (nach composer install)