dpl/scripts/node-onboarding/promote.php
hellcat 6af676421b
Some checks are pending
Docker Build and Publish / build (push) Waiting to run
Add append-only batch node onboarding and recovery checks
2026-10-17 08:29:05 +08:00

26 lines
1.5 KiB
PHP

<?php
// Default is preview. Apply only in a separately authorized target environment.
require __DIR__ . '/operations.php';
use DplOnboarding\PanelChange;
$opts = getopt('', ['backup:', 'mode:', 'plans:', 'group:', 'subscribe-url:', 'group-name:', 'verification:', 'apply', 'help']);
if (isset($opts['help'])) {
echo "--backup=DIR --mode=append --group=ID [--verification=QA_REPORT --apply]\n";
echo "--backup=DIR --mode=initialize --plans=IDS --subscribe-url=HTTPS_URL [--group=ID] [--group-name=NAME] [--verification=QA_REPORT --apply]\n";
exit;
}
try {
$dir = $opts['backup'] ?? throw new RuntimeException('Missing --backup');
$apply = array_key_exists('apply', $opts);
unset($opts['backup'], $opts['apply']);
if (!isset($opts['mode']) || !in_array($opts['mode'], ['append','initialize'], true)) throw new RuntimeException('Explicit --mode required');
if (isset($opts['group'])) { DplOnboarding\ids($opts['group']); if (str_contains($opts['group'],',')) throw new RuntimeException('One group required'); }
DplOnboarding\boot();
$result = DplOnboarding\locked($dir, fn() => PanelChange::promote($dir, $opts, $apply));
// Journal is field-scoped and contains no passwords/UUIDs/tokens.
echo json_encode($result, JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE) . PHP_EOL;
} catch (Throwable $e) {
$reason=get_class($e)===RuntimeException::class ? $e->getMessage() : "Inspect protected journal/current state";
fwrite(STDERR, "Promotion stopped: " . $reason . "\n");
exit(1);
}