diff --git a/app/sovran_systemsos_web/static/js/rebuild.js b/app/sovran_systemsos_web/static/js/rebuild.js index a377d3c..41b7a03 100644 --- a/app/sovran_systemsos_web/static/js/rebuild.js +++ b/app/sovran_systemsos_web/static/js/rebuild.js @@ -51,19 +51,26 @@ async function pollRebuildStatus() { if (data.running) return; _rebuildFinished = true; stopRebuildPoll(); - onRebuildDone(data.result === "success"); + if (data.result === "reboot_required") { + onRebuildDone("reboot_required"); + } else { + onRebuildDone(data.result === "success"); + } } catch (err) { if (!_rebuildServerDown) { _rebuildServerDown = true; if ($rebuildStatus) $rebuildStatus.textContent = "Applying changes…"; } } } -function onRebuildDone(success) { +function onRebuildDone(result) { if ($rebuildSpinner) $rebuildSpinner.classList.remove("spinning"); if ($rebuildClose) $rebuildClose.disabled = false; - if (success) { + if (result === true) { if ($rebuildStatus) $rebuildStatus.textContent = "✓ Done"; // Auto-reload the page after a short delay so tiles and toggles reflect the new state setTimeout(function() { window.location.reload(); }, 1200); + } else if (result === "reboot_required") { + if ($rebuildStatus) $rebuildStatus.textContent = "✓ Done — reboot required"; + if ($rebuildReboot) $rebuildReboot.style.display = "inline-flex"; } else { if ($rebuildStatus) $rebuildStatus.textContent = "✗ Something went wrong"; if ($rebuildSave) $rebuildSave.style.display = "inline-flex"; diff --git a/app/sovran_systemsos_web/static/js/update.js b/app/sovran_systemsos_web/static/js/update.js index 2a7ce7f..791e8d2 100644 --- a/app/sovran_systemsos_web/static/js/update.js +++ b/app/sovran_systemsos_web/static/js/update.js @@ -111,14 +111,20 @@ async function pollUpdateStatus() { if (data.log) appendLog(data.log); _updateLogOffset = data.offset; } - if (data.result === "success") { + if (data.result === "reboot_required") { + appendLog("[Server restarted — update completed, reboot required.]\n"); + } else if (data.result === "success") { appendLog("[Server restarted — update completed successfully.]\n"); } else { appendLog("[Server restarted — update encountered an error.]\n"); } _updateFinished = true; stopUpdatePoll(); - onUpdateDone(data.result === "success"); + if (data.result === "reboot_required") { + onUpdateDone("reboot_required"); + } else { + onUpdateDone(data.result === "success"); + } return; } appendLog("[Server reconnected]\n"); @@ -129,19 +135,27 @@ async function pollUpdateStatus() { if (data.running) return; _updateFinished = true; stopUpdatePoll(); - if (data.result === "success") onUpdateDone(true); - else onUpdateDone(false); + if (data.result === "reboot_required") { + onUpdateDone("reboot_required"); + } else if (data.result === "success") { + onUpdateDone(true); + } else { + onUpdateDone(false); + } } catch (err) { if (!_serverWasDown) { _serverWasDown = true; appendLog("\n[Server restarting — waiting for it to come back…]\n"); if ($modalStatus) $modalStatus.textContent = "Server restarting…"; } } } -function onUpdateDone(success) { +function onUpdateDone(result) { if ($modalSpinner) $modalSpinner.classList.remove("spinning"); if ($btnCloseModal) $btnCloseModal.disabled = false; - if (success) { + if (result === true) { if ($modalStatus) $modalStatus.textContent = "✓ Update complete"; if ($btnReboot) $btnReboot.style.display = "inline-flex"; + } else if (result === "reboot_required") { + if ($modalStatus) $modalStatus.textContent = "✓ Update complete — reboot required"; + if ($btnReboot) $btnReboot.style.display = "inline-flex"; } else { if ($modalStatus) $modalStatus.textContent = "✗ Update failed"; if ($btnSave) $btnSave.style.display = "inline-flex"; diff --git a/modules/core/sovran-hub.nix b/modules/core/sovran-hub.nix index e8400b4..ccf3929 100644 --- a/modules/core/sovran-hub.nix +++ b/modules/core/sovran-hub.nix @@ -143,8 +143,21 @@ let echo "" if [ "$RC" -eq 0 ]; then - echo "── Step 2/3: nixos-rebuild switch ──────────────────" - if ! nixos-rebuild switch --flake /etc/nixos --print-build-logs 2>&1; then + echo "── Step 2/3: nixos-rebuild ──────────────────────────" + if nixos-rebuild switch --flake /etc/nixos --print-build-logs 2>&1; then + echo "[OK] switch succeeded" + elif grep -q "switchInhibitors\|Pre-switch checks failed" "$LOG" 2>/dev/null; then + echo "" + echo " ✓ Build succeeded — a reboot is required to apply this update" + echo " (Critical system components changed; running nixos-rebuild boot instead)" + if nixos-rebuild boot --flake /etc/nixos --print-build-logs 2>&1; then + echo "REBOOT_REQUIRED" > "$STATUS" + exit 0 + else + echo "[ERROR] nixos-rebuild boot also failed" + RC=1 + fi + else echo "[ERROR] nixos-rebuild switch failed" RC=1 fi @@ -197,6 +210,17 @@ let echo " ✓ Rebuild completed successfully" echo "══════════════════════════════════════════════════" echo "SUCCESS" > "$STATUS" + elif grep -q "switchInhibitors\|Pre-switch checks failed" "$LOG" 2>/dev/null; then + echo "" + echo " ✓ Build succeeded — a reboot is required to apply this rebuild" + echo " (Critical system components changed; running nixos-rebuild boot instead)" + if nixos-rebuild boot --flake /etc/nixos --print-build-logs 2>&1; then + echo "REBOOT_REQUIRED" > "$STATUS" + else + echo "[ERROR] nixos-rebuild boot also failed" + echo "FAILED" > "$STATUS" + exit 1 + fi else echo "" echo "══════════════════════════════════════════════════"