Quelltext des aktuellen Standes
<?php
/**
* Background-Update-Script
*
* Wird von UpdateController::install() als Hintergrundprozess gestartet:
* php bin/run-update.php <userId> --confirm-backup
*
* Schreibt Fortschritt nach storage/.update_progress (JSON).
* Setzt Wartungsmodus und beendet ihn danach.
*
* `--confirm-backup` ist Pflicht: Ein Update tauscht Dateien aus und ändert das
* Datenbankschema. OpenNIT sichert sich nicht selbst und kann den Vorgang nicht
* zurückrollen; die Sicherung von Datenbank und Speicherverzeichnis liegt beim
* Betreiber.
*/
// Sicherheit: nur per CLI aufrufbar
if (PHP_SAPI !== 'cli') {
http_response_code(403);
exit('Nur per CLI erlaubt.');
}
// Ein Update lässt sich nicht zurückrollen; die Sicherung liegt beim Betreiber
// und muss bewusst bestätigt werden. Vor dem Laden der Umgebung geprüft, damit
// der Hinweis auch auf einer unvollständig eingerichteten Instanz erscheint.
if (!in_array('--confirm-backup', array_slice($argv, 1), true)) {
echo 'Abgebrochen: Ein Update lässt sich nicht zurückrollen.' . PHP_EOL
. 'Bitte zuerst Datenbank und Speicherverzeichnis sichern und den Aufruf mit' . PHP_EOL
. ' php bin/run-update.php <userId> --confirm-backup' . PHP_EOL
. 'wiederholen.' . PHP_EOL;
exit(1);
}
require_once __DIR__ . '/../vendor/autoload.php';
require_once __DIR__ . '/../bootstrap.php';
use OpenNIT\Core\Database;
use OpenNIT\Audit\AuditLogger;
use OpenNIT\Content\UpdateManager;
// Dotenv laden
$dotenv = Dotenv\Dotenv::createImmutable(dirname(__DIR__));
$dotenv->load();
$dbConfig = require __DIR__ . '/../config/database.php';
$runtimeFile = __DIR__ . '/../config/runtime.php';
$runtimeConfig = file_exists($runtimeFile) ? include $runtimeFile : [];
$timezone = $runtimeConfig['app']['timezone'] ?? 'Europe/Berlin';
date_default_timezone_set($timezone);
// User-ID aus Argument (für Audit-Log)
$userId = isset($argv[1]) ? (int)$argv[1] : 0;
try {
$db = new Database($dbConfig);
$auditLogger = new AuditLogger($db);
$manager = new UpdateManager($db, $auditLogger, (string)($runtimeConfig['update']['channel'] ?? 'stable'));
$result = $manager->installUpdate($userId, true);
if ($result['success']) {
echo 'Update erfolgreich: ' . $result['message'] . PHP_EOL;
exit(0);
} else {
echo 'Update fehlgeschlagen: ' . $result['message'] . PHP_EOL;
exit(1);
}
} catch (\Throwable $e) {
echo 'Kritischer Fehler: ' . $e->getMessage() . PHP_EOL;
exit(2);
}