| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- <?php
- declare(strict_types=1);
- require_once __DIR__ . "/../includes/auth.php";
- require_once __DIR__ . "/../includes/layout.php";
- require_once __DIR__ . "/../includes/instances.php";
- manageRequireLogin();
- $messages = [];
- $errors = [];
- // Plaintext token to display once after create/rotate. Never persisted.
- $newToken = null;
- $newTokenInstance = "";
- if (($_SERVER["REQUEST_METHOD"] ?? "") === "POST") {
- try {
- manageRequireCsrf();
- $action = (string) ($_POST["action"] ?? "");
- $id = trim((string) ($_POST["instance"] ?? ""));
- if ($action === "create") {
- $created = manageInstanceCreate(
- trim((string) ($_POST["new_instance"] ?? "")),
- trim((string) ($_POST["label"] ?? "")),
- trim((string) ($_POST["notes"] ?? "")),
- );
- $newToken = $created["token"];
- $newTokenInstance = $created["instance"]["id"];
- $messages[] = "Instanz \"" . $created["instance"]["id"] . "\" wurde angelegt.";
- } elseif ($action === "rotate") {
- $newToken = manageInstanceRotateToken($id);
- $newTokenInstance = $id;
- $messages[] = "Neues Token für \"" . $id . "\" erzeugt. Das alte Token ist ab sofort ungültig.";
- } elseif ($action === "toggle") {
- $instance = manageInstanceFind($id);
- if ($instance === null) {
- throw new RuntimeException("Instanz wurde nicht gefunden.");
- }
- manageInstanceUpdate($id, ["enabled" => !$instance["enabled"]]);
- $messages[] = $instance["enabled"]
- ? "Instanz \"" . $id . "\" wurde deaktiviert."
- : "Instanz \"" . $id . "\" wurde aktiviert.";
- } elseif ($action === "save") {
- manageInstanceUpdate($id, [
- "label" => trim((string) ($_POST["label"] ?? "")),
- "notes" => trim((string) ($_POST["notes"] ?? "")),
- ]);
- $messages[] = "Instanz \"" . $id . "\" wurde gespeichert.";
- } elseif ($action === "delete") {
- manageInstanceDelete($id);
- $messages[] = "Instanz \"" . $id . "\" wurde entfernt. Vorhandene Backups bleiben erhalten.";
- }
- } catch (Throwable $exception) {
- $errors[] = $exception->getMessage();
- }
- }
- try {
- $instances = manageInstanceList();
- } catch (Throwable $exception) {
- $instances = [];
- $errors[] = $exception->getMessage();
- }
- manageRenderHeader("Instanzen", $messages, $errors);
- ?>
- <?php if ($newToken !== null): ?>
- <div class="token-box">
- <p><strong>Token für <?php echo manageEscape($newTokenInstance); ?></strong></p>
- <p class="muted">Dieses Token wird nur jetzt angezeigt. Der Server speichert lediglich einen Hash davon.</p>
- <pre class="token-value"><?php echo manageEscape($newToken); ?></pre>
- <p>In die <code>config.php</code> des Clients eintragen:</p>
- <pre class="code-block">define("MANAGE_SERVER_URL", "<?php echo manageEscape(rtrim((string) MANAGE_PUBLIC_URL, "/")); ?>");
- define("MANAGE_INSTANCE", "<?php echo manageEscape($newTokenInstance); ?>");
- define("MANAGE_TOKEN", "<?php echo manageEscape($newToken); ?>");</pre>
- </div>
- <?php endif; ?>
- <h2>Neue Instanz</h2>
- <form method="POST" class="panel">
- <?php echo manageCsrfField(); ?>
- <input type="hidden" name="action" value="create">
- <div class="form-row">
- <div class="form-group">
- <label for="new_instance">Kennung</label>
- <input type="text" id="new_instance" name="new_instance" required
- pattern="[A-Za-z0-9][A-Za-z0-9._\-]*" maxlength="120" placeholder="psa-prod">
- <p class="hint">Buchstaben, Zahlen, Punkt, Unterstrich, Bindestrich.</p>
- </div>
- <div class="form-group">
- <label for="label">Bezeichnung</label>
- <input type="text" id="label" name="label" maxlength="200" placeholder="Stadt Freising Produktiv">
- </div>
- </div>
- <div class="form-group">
- <label for="notes">Notiz</label>
- <input type="text" id="notes" name="notes" maxlength="500">
- </div>
- <button type="submit" class="btn">Instanz anlegen</button>
- </form>
- <h2>Registrierte Instanzen</h2>
- <?php if ($instances === []): ?>
- <p class="empty">Noch keine Instanz registriert.</p>
- <?php else: ?>
- <?php foreach ($instances as $instance): ?>
- <section class="panel" id="<?php echo manageEscape($instance["id"]); ?>">
- <div class="panel-head">
- <h3><?php echo manageEscape($instance["id"]); ?></h3>
- <?php if ($instance["enabled"]): ?>
- <span class="badge badge-ok">aktiv</span>
- <?php else: ?>
- <span class="badge badge-error">deaktiviert</span>
- <?php endif; ?>
- </div>
- <dl class="meta-list">
- <div><dt>Version</dt><dd><?php echo manageEscape($instance["version"] !== "" ? $instance["version"] : "–"); ?></dd></div>
- <div><dt>PHP</dt><dd><?php echo manageEscape($instance["php_version"] !== "" ? $instance["php_version"] : "–"); ?></dd></div>
- <div><dt>Zuletzt gesehen</dt><dd><?php echo manageEscape($instance["last_seen_at"] !== "" ? $instance["last_seen_at"] : "nie"); ?></dd></div>
- <div><dt>Letzte IP</dt><dd><?php echo manageEscape($instance["last_ip"] !== "" ? $instance["last_ip"] : "–"); ?></dd></div>
- <div><dt>Letztes Backup</dt><dd><?php echo manageEscape($instance["last_backup_at"] !== "" ? $instance["last_backup_at"] : "nie"); ?></dd></div>
- <div><dt>Backups</dt><dd><?php echo (int) $instance["backup_count"]; ?></dd></div>
- <div><dt>Offene Migrationen</dt><dd><?php echo (int) $instance["pending_migrations"]; ?></dd></div>
- <div><dt>Token erneuert</dt><dd><?php echo manageEscape($instance["token_rotated_at"] !== "" ? $instance["token_rotated_at"] : "–"); ?></dd></div>
- <div><dt>Freier Speicher</dt><dd><?php echo $instance["disk_free"] > 0 ? manageEscape(manageFormatBytes($instance["disk_free"])) : "–"; ?></dd></div>
- </dl>
- <form method="POST" class="inline-form">
- <?php echo manageCsrfField(); ?>
- <input type="hidden" name="action" value="save">
- <input type="hidden" name="instance" value="<?php echo manageEscape($instance["id"]); ?>">
- <div class="form-row">
- <div class="form-group">
- <label>Bezeichnung
- <input type="text" name="label" maxlength="200" value="<?php echo manageEscape($instance["label"]); ?>">
- </label>
- </div>
- <div class="form-group">
- <label>Notiz
- <input type="text" name="notes" maxlength="500" value="<?php echo manageEscape($instance["notes"]); ?>">
- </label>
- </div>
- </div>
- <button type="submit" class="btn btn-secondary">Speichern</button>
- </form>
- <div class="button-row">
- <form method="POST" onsubmit="return confirm('Neues Token erzeugen? Das alte Token wird sofort ungültig.');">
- <?php echo manageCsrfField(); ?>
- <input type="hidden" name="action" value="rotate">
- <input type="hidden" name="instance" value="<?php echo manageEscape($instance["id"]); ?>">
- <button type="submit" class="btn btn-secondary">Token erneuern</button>
- </form>
- <form method="POST">
- <?php echo manageCsrfField(); ?>
- <input type="hidden" name="action" value="toggle">
- <input type="hidden" name="instance" value="<?php echo manageEscape($instance["id"]); ?>">
- <button type="submit" class="btn btn-secondary">
- <?php echo $instance["enabled"] ? "Deaktivieren" : "Aktivieren"; ?>
- </button>
- </form>
- <form method="POST" onsubmit="return confirm('Instanz wirklich entfernen? Backups bleiben erhalten.');">
- <?php echo manageCsrfField(); ?>
- <input type="hidden" name="action" value="delete">
- <input type="hidden" name="instance" value="<?php echo manageEscape($instance["id"]); ?>">
- <button type="submit" class="btn btn-danger">Entfernen</button>
- </form>
- </div>
- </section>
- <?php endforeach; ?>
- <?php endif; ?>
- <?php manageRenderFooter(); ?>
|