OpenNIT

Quelltext des aktuellen Standes

Fassung 1.1.1

run-update.php

2 KB
<?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);
}