| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- <?php
- declare(strict_types=1);
- require_once __DIR__ . "/../includes/auth.php";
- require_once __DIR__ . "/../includes/layout.php";
- require_once __DIR__ . "/../includes/backups.php";
- manageRequireLogin();
- $messages = [];
- $errors = [];
- if (($_SERVER["REQUEST_METHOD"] ?? "") === "POST") {
- try {
- manageRequireCsrf();
- $action = (string) ($_POST["action"] ?? "");
- $instance = trim((string) ($_POST["instance"] ?? ""));
- $filename = trim((string) ($_POST["filename"] ?? ""));
- if ($action === "download") {
- // Sends headers and exits on success.
- manageBackupSendDownload($instance, $filename);
- } elseif ($action === "delete") {
- manageBackupDelete($instance, $filename);
- $messages[] = "Backup " . $filename . " wurde gelöscht.";
- } elseif ($action === "s3_sync") {
- $result = manageBackupSyncAllS3();
- if ($result["error"] !== null) {
- $errors[] = "S3-Sync abgebrochen: " . $result["error"];
- }
- $messages[] = "S3-Sync: " . $result["uploaded"] . " hochgeladen, " . $result["pending"] . " offen.";
- }
- } catch (Throwable $exception) {
- $errors[] = $exception->getMessage();
- }
- }
- try {
- $grouped = manageBackupGroupByInstance();
- $settings = manageBackupSettings();
- $registered = [];
- foreach (manageInstanceList() as $instance) {
- $registered[$instance["id"]] = $instance;
- }
- } catch (Throwable $exception) {
- $grouped = [];
- $settings = ["retention" => 0, "s3_retention" => 0];
- $registered = [];
- $errors[] = $exception->getMessage();
- }
- manageRenderHeader("Backups", $messages, $errors);
- ?>
- <section class="cards">
- <div class="card">
- <p class="card-label">Lokale Aufbewahrung</p>
- <p class="card-value"><?php echo (int) $settings["retention"]; ?></p>
- <p class="card-hint">pro Instanz</p>
- </div>
- <div class="card">
- <p class="card-label">S3-Aufbewahrung</p>
- <p class="card-value"><?php echo manageS3Enabled() ? (int) $settings["s3_retention"] : "–"; ?></p>
- <p class="card-hint"><?php echo manageS3Enabled() ? "pro Instanz" : "S3 ist deaktiviert"; ?></p>
- </div>
- <div class="card">
- <p class="card-label">Instanzen mit Backups</p>
- <p class="card-value"><?php echo count($grouped); ?></p>
- </div>
- </section>
- <?php if (manageS3Enabled()): ?>
- <form method="POST" class="inline-form">
- <?php echo manageCsrfField(); ?>
- <input type="hidden" name="action" value="s3_sync">
- <button type="submit" class="btn btn-secondary">S3-Uploads jetzt nachholen</button>
- <span class="hint">Lädt alle lokal vorhandenen Backups hoch, die noch nicht im Bucket bestätigt sind.</span>
- </form>
- <?php endif; ?>
- <?php if ($grouped === []): ?>
- <p class="empty">Es wurden noch keine Backups empfangen.</p>
- <?php else: ?>
- <?php foreach ($grouped as $instanceId => $backups): ?>
- <section class="panel" id="<?php echo manageEscape($instanceId); ?>">
- <div class="panel-head">
- <h2><?php echo manageEscape($instanceId); ?></h2>
- <?php if (!isset($registered[$instanceId])): ?>
- <span class="badge badge-warn">nicht mehr registriert</span>
- <?php elseif (!$registered[$instanceId]["enabled"]): ?>
- <span class="badge badge-error">deaktiviert</span>
- <?php endif; ?>
- <span class="muted"><?php echo count($backups); ?> Backup(s)</span>
- </div>
- <div class="table-scroll">
- <table class="data-table">
- <thead>
- <tr>
- <th>Datei</th>
- <th>Empfangen</th>
- <th>Größe</th>
- <th>Auslöser</th>
- <th>Version</th>
- <th>Speicherort</th>
- <th>Aktionen</th>
- </tr>
- </thead>
- <tbody>
- <?php foreach ($backups as $backup): ?>
- <?php $filename = (string) ($backup["filename"] ?? ""); ?>
- <tr>
- <td>
- <code><?php echo manageEscape($filename); ?></code>
- <?php if (!empty($backup["s3_last_error"])): ?>
- <br><span class="badge badge-error">S3-Fehler</span>
- <span class="muted"><?php echo manageEscape($backup["s3_last_error"]); ?></span>
- <?php endif; ?>
- </td>
- <td><?php echo manageEscape($backup["uploaded_at"] ?? ""); ?></td>
- <td><?php echo manageEscape(manageFormatBytes((int) ($backup["size"] ?? 0))); ?></td>
- <td><?php echo manageEscape($backup["trigger"] !== "" ? ($backup["trigger"] ?? "") : "–"); ?></td>
- <td><?php echo manageEscape(($backup["app_version"] ?? "") !== "" ? $backup["app_version"] : "–"); ?></td>
- <td><?php echo manageEscape(manageBackupStorageLabel($backup)); ?></td>
- <td>
- <div class="button-row">
- <form method="POST">
- <?php echo manageCsrfField(); ?>
- <input type="hidden" name="action" value="download">
- <input type="hidden" name="instance" value="<?php echo manageEscape($instanceId); ?>">
- <input type="hidden" name="filename" value="<?php echo manageEscape($filename); ?>">
- <button type="submit" class="btn btn-secondary">Herunterladen</button>
- </form>
- <form method="POST" onsubmit="return confirm('Dieses Backup endgültig löschen?');">
- <?php echo manageCsrfField(); ?>
- <input type="hidden" name="action" value="delete">
- <input type="hidden" name="instance" value="<?php echo manageEscape($instanceId); ?>">
- <input type="hidden" name="filename" value="<?php echo manageEscape($filename); ?>">
- <button type="submit" class="btn btn-danger">Löschen</button>
- </form>
- </div>
- </td>
- </tr>
- <?php endforeach; ?>
- </tbody>
- </table>
- </div>
- </section>
- <?php endforeach; ?>
- <?php endif; ?>
- <?php manageRenderFooter(); ?>
|