diff --git a/server/admin/versions.php b/server/admin/versions.php index 09534d6..5420c55 100644 --- a/server/admin/versions.php +++ b/server/admin/versions.php @@ -132,6 +132,34 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { saveManifest($manifestPath, $manifest); $message = "v{$version} retirée du manifest. Le ZIP reste dans builds/ (à supprimer en SFTP si voulu)."; } + elseif ($action === 'set_launcher') { + $lver = trim($_POST['launcher_version'] ?? ''); + $lmin = trim($_POST['launcher_min_required'] ?? ''); + if (!preg_match('/^\d+\.\d+\.\d+$/', $lver)) { + throw new Exception('Numéro de version launcher invalide (X.Y.Z attendu).'); + } + if ($lmin !== '' && !preg_match('/^\d+\.\d+\.\d+$/', $lmin)) { + throw new Exception('Numéro de version "minRequired" invalide.'); + } + $base = $config['base_url'] ?? 'https://asterionvr.com/PS_Launcher'; + $manifest['launcher'] = [ + 'version' => $lver, + 'minRequired' => $lmin !== '' ? $lmin : '0.5.0', + 'download' => [ + 'url' => "{$base}/builds/launcher/PSLauncher-{$lver}.exe", + 'sizeBytes' => 0, + 'sha256' => 'REPLACE_AFTER_BUILD', + ], + 'releaseNotesUrl' => null, + ]; + saveManifest($manifestPath, $manifest); + $message = "Section launcher mise à jour (v{$lver}). Upload PSLauncher-{$lver}.exe dans builds/launcher/ puis clique « Sync »."; + } + elseif ($action === 'remove_launcher') { + unset($manifest['launcher']); + saveManifest($manifestPath, $manifest); + $message = "Section launcher retirée du manifest (auto-update désactivé)."; + } elseif ($action === 'sync') { // Appel direct à la classe — pas d'exec(), fonctionne même quand la fonction // est désactivée par le mutualisé OVH. @@ -205,6 +233,81 @@ Layout::header('Versions', 'versions'); + +
+

Auto-update du launcher

+ + +

+ Version annoncée : v + • minRequired : + • Exe : présent" + : "absent" ?> + • Hash : OK" + : "à calculer" ?> +

+

URL attendue de l'exe :

+ +

Section launcher absente du manifest — l'auto-update est désactivé. Configure-la ci-dessous pour l'activer.

+ + +

Définir / mettre à jour

+
+ + +
+
+ + +
+
+ + +
+
+
+ + + + + + + + +
+ + +

Workflow

+
    +
  1. Définis la version ci-dessus (ex : 0.6.0).
  2. +
  3. Upload PSLauncher-X.Y.Z.exe via SFTP dans www/PS_Launcher/builds/launcher/.
  4. +
  5. Clique le bouton 🔁 Sync (sign-manifest) du tableau du dessous — il hashera le launcher en plus des versions Proserve.
  6. +
+ + +

Exes présents dans builds/launcher/

+ + +
+

Manifest actuel

diff --git a/server/tools/SignManifest.php b/server/tools/SignManifest.php index 03e479b..ba88726 100644 --- a/server/tools/SignManifest.php +++ b/server/tools/SignManifest.php @@ -82,6 +82,33 @@ final class SignManifest } unset($v); + // Section launcher : si présente, on tente de hasher le PSLauncher-{ver}.exe + // dans builds/launcher/. On ignore proprement si l'exe n'est pas là. + if (isset($manifest['launcher']) && is_array($manifest['launcher'])) { + $launcher = &$manifest['launcher']; + $lver = $launcher['version'] ?? ''; + $lurl = $launcher['download']['url'] ?? ''; + if ($lver !== '' && $lurl !== '') { + $lfile = basename(parse_url($lurl, PHP_URL_PATH) ?: ''); + $lpath = "{$this->buildsDir}/launcher/{$lfile}"; + if (!is_file($lpath)) { + // Fallback : tolérant sur le nom (PSLauncher-X.Y.Z.exe, etc.) + $candidates = glob("{$this->buildsDir}/launcher/*{$lver}*.exe", GLOB_NOSORT) ?: []; + if (count($candidates) === 1) $lpath = $candidates[0]; + } + if (is_file($lpath)) { + $lsize = filesize($lpath); + $lsha = hash_file('sha256', $lpath); + $launcher['download']['sizeBytes'] = $lsize; + $launcher['download']['sha256'] = $lsha; + $this->out(" [launcher] v{$lver} : " . basename($lpath) . " ({$lsize} octets) sha256={$lsha}"); + } else { + $this->out(" [launcher] v{$lver} : exe introuvable dans builds/launcher/"); + } + } + unset($launcher); + } + // Bump auto de `latest` sur la plus haute version effectivement uploadée if (!empty($hashedVersions)) { usort($hashedVersions, 'version_compare');