Der Plugin Update Checker prüft automatisch GitHub auf verfügbare Updates aller installierten osTicket-Plugins und zeigt Update-Badges direkt in der Plugin-Liste an (Admin Panel > Manage > Plugins). Kein manuelles Besuchen von GitHub-Repositories mehr, um nach neuen Versionen zu schauen.
Installed Plugins
Plugin Name (instances) Version Status Date Installed
----------------------------------------------------------------------
Markdown Support (2) 1.0.0 [1.2.0] Enabled 2025-01-10
^^^^^^^ klickbares Badge
API Endpoints (3) 1.1.0 [1.1.2] Enabled 2025-01-05
Priority Icons (1) 1.0.3 Enabled 2025-01-08
(kein Badge = aktuell)
JSON_HEX_TAG| Komponente | Version | Hinweis |
|---|---|---|
| osTicket | 1.18.x | Getestet mit 1.18.x |
| PHP | 8.1+ | Erforderlich |
| PHP cURL | beliebig | Erforderlich für GitHub API-Aufrufe |
| Moderner Browser | ES6+ | Chrome, Firefox, Edge, Safari |
update-check nach /include/plugins/ auf deinen osTicket-Servercomposer install --no-dev im Plugin-Verzeichnis ausEndgültiger Pfad: /pfad/zu/osticket/include/plugins/update-check/
cd /pfad/zu/osticket/include/plugins
git clone https://github.com/markus-michalski/osticket-plugin-update-check.git update-check
cd update-check
composer install --no-dev
Das Plugin erstellt automatisch eine Singleton-Instanz und beginnt sofort mit der Update-Prüfung.
include/plugins/update-check/
+-- plugin.php # Plugin-Metadaten
+-- class.UpdateCheckPlugin.php # Haupt-Plugin-Klasse
+-- config.php # Konfigurationsformular
+-- src/
| +-- AssetInjector.php # Output-Buffer-Injection
| +-- FileCache.php # Dateibasierter Cache
| +-- GitHubReleaseChecker.php # GitHub API-Client
| +-- PluginUpdateCollector.php # Update-Datensammler
+-- assets/
| +-- update-badges.css # Badge-Styling
| +-- update-badges.js # DOM-Manipulation
+-- vendor/ # Composer-Autoload
+-- README.md
+-- CHANGELOG.md
| Einstellung | Standard | Beschreibung |
|---|---|---|
| Cache-Dauer | 6 Stunden | Wie lange GitHub-API-Antworten gecacht werden |
| GitHub-Token | (leer) | Optionaler Personal Access Token für höhere Rate Limits |
| Modus | Limit | Empfehlung |
|---|---|---|
| Ohne Token | 60 Anfragen/Stunde | Ausreichend für weniger als 10 Plugins |
| Mit Token | 5.000 Anfragen/Stunde | Empfohlen für viele Plugins |
Falls du viele Plugins hast oder Rate-Limit-Fehler siehst:
bootstrap()-Methode des Plugins erkennt, ob der User auf /scp/plugins.php istDas Plugin verwendet PHPs version_compare() mit v-Präfix-Entfernung:
v1.2.0 und 1.2.0 werden identisch behandeltsys_get_temp_dir() . '/osticket-update-check/'expires_at- und data-FeldernDamit ein Plugin Update-Checks erhält, muss seine plugin.php eine GitHub-URL im url-Feld enthalten:
<?php return [
'id' => 'vendor:plugin-name',
'version' => '1.0.0',
'name' => 'Mein Plugin',
'url' => 'https://github.com/user/repo', // Erforderlich!
'plugin' => 'class.MyPlugin.php:MyPlugin',
];
Unterstützte URL-Formate:
https://github.com/user/repohttps://github.com/user/repo.githttp://github.com/user/repoZusätzlich erforderlich:
v1.0.0 oder 1.0.0)Prüfe:
Plugin aktiviert?
Plugins haben GitHub-URL?
plugin.php des Ziel-Plugins'url' => 'https://github.com/...'-Eintrag vorhanden istGitHub Releases vorhanden?
PHP-Fehlerprotokoll prüfen:
grep "UpdateCheck" /pfad/zu/osticket/include/ost-errors.log
Cache leeren:
rm -rf /tmp/osticket-update-check/
Symptome: Badges verschwinden nach vielen Prüfungen.
Lösung:
Mögliche Ursachen:
version-Feld in plugin.php stimmt nicht mit der tatsächlich installierten Version übereinDas Plugin folgt einer sauberen Trennung der Zuständigkeiten:
| Klasse | Verantwortlichkeit |
|---|---|
UpdateCheckPlugin |
Bootstrap, Seitenerkennung, Orchestrierung |
UpdateCheckConfig |
Admin-Konfigurationsformular |
FileCache |
Dateibasiertes Caching mit TTL |
GitHubReleaseChecker |
GitHub API-Client, URL-Parsing, Versionsvergleich |
PluginUpdateCollector |
Iteriert Plugins, sammelt Update-Daten |
AssetInjector |
Output-Buffer-Injection von CSS/JS |
Das Plugin verwendet Output-Buffer-Injection (ob_start() Callback) - dasselbe bewährte Pattern wie das Priority Icons-Plugin:
ob_start(function (string $buffer) use ($injector, $updateData): string {
try {
return $injector->inject($buffer, $updateData);
} catch (\Throwable $e) {
error_log('[UpdateCheck] Asset injection failed: ' . $e->getMessage());
return $buffer;
}
});
Warum ob_start()?
| Methode | Problem |
|---|---|
Signal::connect('apps.scp') |
Feuert nur auf dem Apps-Tab, nicht auf der Plugin-Liste |
$ost->addExtraHeader() |
global $ost ist NULL während bootstrap() |
| Externe CSS/JS-Dateien | include/.htaccess blockiert HTTP-Zugriff |
ob_start() Callback |
Zuverlässig, Crash-geschützt mit try-catch |
XSS-Prävention:
JSON_HEX_TAG | JSON_HEX_APOS verhindert Script-InjectionisValidHttpUrl()) erlaubt nur http:- und https:-ProtokolleinnerHTML für benutzerkontrollierte DatenSSL-Verifizierung:
CURLOPT_SSL_VERIFYPEER = true und CURLOPT_SSL_VERIFYHOST = 2 bei allen API-AufrufenDoppel-Injection-Schutz:
data-plugin="update-check" vor der InjectionCrash-Schutz:
ob_start()-Callback verhindert weißen Bildschirm bei FehlernKeine Datenbankmodifikationen:
| Szenario | Auswirkung |
|---|---|
| Nicht-Plugin-Seiten | Null (frühzeitiger Return in bootstrap()) |
| Plugin-Seite, warmer Cache | < 10ms zusätzliche Ladezeit |
| Plugin-Seite, kalter Cache | ~5s pro Plugin (cURL-Timeout), danach gecacht |
| cURL-Timeout | 5 Sekunden pro Anfrage |
F: Prüft das Plugin auch seine eigenen Updates?
A: Ja! Da das Plugin selbst eine GitHub-URL in seiner plugin.php hat, prüft es auch seine eigenen Updates.
F: Was passiert, wenn GitHub nicht erreichbar ist?
A: Das Plugin cached Fehler für 1 Stunde und gibt graziös zurück. Kein Badge wird angezeigt und keine Fehler werden dem Benutzer angezeigt. Fehler werden im PHP-Fehlerprotokoll protokolliert.
F: Funktioniert es mit privaten GitHub-Repositories?
A: Nur wenn du einen GitHub Personal Access Token konfigurierst, der Zugriff auf das private Repository hat. Ohne Token sind nur öffentliche Repositories zugänglich.
F: Was passiert, wenn ich das Plugin deaktiviere?
A: Die Badges verschwinden sofort. Keine Daten werden verändert - das Plugin injiziert nur CSS/JS in die Seitenausgabe.
F: Warum werden Assets inline geladen statt als externe Dateien?
A: Die include/.htaccess von osTicket enthält Deny from all, was den HTTP-Zugriff auf alle Dateien im include/-Verzeichnis blockiert. Inline-Injection umgeht dies ohne Core-Dateien zu modifizieren.
F: Warum dateibasierter Cache statt Datenbank?
A: osTicket bietet keine allgemeine Cache-API. Dateibasiertes Caching mit sys_get_temp_dir() ist einfach, erfordert keine Datenbankmodifikationen und funktioniert auf allen Systemen.
F: Funktioniert es mit NGINX?
A: Ja. Da alle Assets inline injiziert werden, gibt es keine externen Dateianfragen, die durch Webserver-Konfigurationen blockiert werden könnten.
F: Wie findet das Plugin heraus, welche Plugins geprüft werden sollen?
A: Es verwendet PluginManager::allInstalled(), um alle installierten Plugins zu iterieren, und liest dann die plugin.php-Metadaten jedes Plugins über PluginManager::getInfoForPath(), um das url-Feld zu finden. Nur URLs mit github.com werden geprüft.
Dieses Plugin wird unter der GNU General Public License v2 veröffentlicht, kompatibel mit dem osTicket-Core.
Siehe LICENSE für Details.
Bei Fragen oder Problemen erstelle bitte ein Issue auf GitHub:
Issue Tracker: https://github.com/markus-michalski/osticket-plugin-update-check/issues
Bei der Meldung von Problemen bitte angeben:
php -v)[UpdateCheck]Entwickelt von Markus Michalski
Beiträge willkommen!
Siehe CHANGELOG.md für die Versionshistorie.