| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- <?php
- declare(strict_types=1);
- require_once __DIR__ . "/../includes/auth.php";
- require_once __DIR__ . "/../includes/layout.php";
- require_once __DIR__ . "/../includes/instances.php";
- require_once __DIR__ . "/../includes/releases.php";
- require_once __DIR__ . "/../includes/backups.php";
- manageRequireLogin();
- $messages = [];
- $errors = [];
- $instances = [];
- $latest = "";
- $releaseCount = 0;
- try {
- $instances = manageInstanceList();
- $latest = manageReleaseLatestVersion();
- $releaseCount = count(manageReleaseReadManifest()["releases"]);
- } catch (Throwable $exception) {
- $errors[] = $exception->getMessage();
- }
- if (trim((string) MANAGE_PUBLIC_URL) === "") {
- $errors[] = "MANAGE_PUBLIC_URL ist nicht gesetzt. Clients können ohne diesen Wert kein Paket herunterladen.";
- }
- if (!managePasswordConfigured()) {
- $errors[] = "Es ist kein Admin-Passwort konfiguriert.";
- }
- // An instance is "stale" when it has not been seen for a week. Cheap signal
- // that a cron job died or the instance was decommissioned without being removed.
- function manageDashboardIsStale(string $lastSeenAt): bool
- {
- if ($lastSeenAt === "") {
- return true;
- }
- $timestamp = strtotime($lastSeenAt);
- return $timestamp === false || time() - $timestamp > 604800;
- }
- function manageDashboardUpdateState(array $instance, string $latest): string
- {
- if ($latest === "" || $instance["version"] === "") {
- return "unbekannt";
- }
- if (version_compare(ltrim($latest, "vV"), ltrim($instance["version"], "vV"), ">")) {
- return "Update verfügbar";
- }
- return "aktuell";
- }
- manageRenderHeader("Übersicht", $messages, $errors);
- ?>
- <section class="cards">
- <div class="card">
- <p class="card-label">Produkt</p>
- <p class="card-value"><?php echo manageEscape(manageProductName()); ?></p>
- </div>
- <div class="card">
- <p class="card-label">Aktuelles Release</p>
- <p class="card-value"><?php echo manageEscape($latest !== "" ? $latest : "keines"); ?></p>
- <p class="card-hint"><?php echo (int) $releaseCount; ?> Release(s) im Manifest</p>
- </div>
- <div class="card">
- <p class="card-label">Instanzen</p>
- <p class="card-value"><?php echo count($instances); ?></p>
- <p class="card-hint"><a href="instances.php">verwalten</a></p>
- </div>
- <div class="card">
- <p class="card-label">S3-Archiv</p>
- <p class="card-value"><?php echo manageS3Enabled() ? "aktiv" : "aus"; ?></p>
- <p class="card-hint"><a href="settings.php">Einstellungen</a></p>
- </div>
- </section>
- <h2>Instanzen</h2>
- <?php if ($instances === []): ?>
- <p class="empty">Noch keine Instanz registriert. <a href="instances.php">Jetzt anlegen</a> – dabei wird das
- Token erzeugt, das in die <code>config.php</code> des Clients gehört.</p>
- <?php else: ?>
- <div class="table-scroll">
- <table class="data-table">
- <thead>
- <tr>
- <th>Instanz</th>
- <th>Status</th>
- <th>Version</th>
- <th>Update</th>
- <th>Zuletzt gesehen</th>
- <th>Letztes Backup</th>
- <th>Backups</th>
- <th>Migrationen</th>
- </tr>
- </thead>
- <tbody>
- <?php foreach ($instances as $instance): ?>
- <?php
- $stale = manageDashboardIsStale($instance["last_seen_at"]);
- $updateState = manageDashboardUpdateState($instance, $latest);
- ?>
- <tr>
- <td>
- <strong><?php echo manageEscape($instance["id"]); ?></strong>
- <?php if ($instance["label"] !== ""): ?>
- <br><span class="muted"><?php echo manageEscape($instance["label"]); ?></span>
- <?php endif; ?>
- </td>
- <td>
- <?php if (!$instance["enabled"]): ?>
- <span class="badge badge-error">deaktiviert</span>
- <?php elseif ($stale): ?>
- <span class="badge badge-warn">inaktiv</span>
- <?php else: ?>
- <span class="badge badge-ok">aktiv</span>
- <?php endif; ?>
- </td>
- <td><?php echo manageEscape($instance["version"] !== "" ? $instance["version"] : "–"); ?></td>
- <td>
- <?php if ($updateState === "Update verfügbar"): ?>
- <span class="badge badge-warn">Update verfügbar</span>
- <?php else: ?>
- <?php echo manageEscape($updateState); ?>
- <?php endif; ?>
- </td>
- <td><?php echo manageEscape($instance["last_seen_at"] !== "" ? $instance["last_seen_at"] : "nie"); ?></td>
- <td><?php echo manageEscape($instance["last_backup_at"] !== "" ? $instance["last_backup_at"] : "nie"); ?></td>
- <td><a href="backups.php#<?php echo manageEscape($instance["id"]); ?>"><?php echo (int) $instance["backup_count"]; ?></a></td>
- <td>
- <?php if ($instance["pending_migrations"] > 0): ?>
- <span class="badge badge-error"><?php echo (int) $instance["pending_migrations"]; ?> offen</span>
- <?php else: ?>
- –
- <?php endif; ?>
- </td>
- </tr>
- <?php endforeach; ?>
- </tbody>
- </table>
- </div>
- <?php endif; ?>
- <h2>Client-Paket</h2>
- <p>
- Jedes Projekt erhält den Ordner <code>client-package/</code> aus diesem Repository: er enthält den
- einzukopierenden Client-Code <em>und</em> die vollständige Integrationsdokumentation.
- </p>
- <p>
- Verteilbares ZIP erzeugen: <code>scripts/build-client-package.sh</code> –
- das Ergebnis liegt danach unter <code>build/</code>.
- </p>
- <?php manageRenderFooter(); ?>
|