From 9557f8c8f8a8f48c2590fbb5123c6ea4a64ffc5d Mon Sep 17 00:00:00 2001 From: magges Date: Sun, 12 Jul 2026 23:01:26 +0000 Subject: [PATCH] Add Stop Podman to Settings, alongside Start/Restart MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rounds out the Podman Service card to the full start/stop/restart trio. Stop and Restart both get a confirm() first — both actually stop every running container (with its own configured grace period) before touching the API service itself, not just the service process; worth surfacing that explicitly rather than letting it be a surprise. Co-Authored-By: Claude Sonnet 5 --- webui/plugins/podman/Podman.page | 4 +++- webui/plugins/podman/ajax/settings.php | 5 +++++ webui/plugins/podman/javascript/settings.js | 18 +++++++++++++++--- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/webui/plugins/podman/Podman.page b/webui/plugins/podman/Podman.page index 4c1548b..1ee7649 100644 --- a/webui/plugins/podman/Podman.page +++ b/webui/plugins/podman/Podman.page @@ -238,15 +238,17 @@ function podman_asset_version(string $relPath): string
-

Podman Service

Start, restart, or check the podman.sock backend — no terminal needed.
+

Podman Service

Start, stop, restart, or check the podman.sock backend — no terminal needed.
Checking… +
+
Stop/Restart first stop all running containers (each gets its own configured grace period) — not just the API service.
diff --git a/webui/plugins/podman/ajax/settings.php b/webui/plugins/podman/ajax/settings.php index e2792a5..6848406 100644 --- a/webui/plugins/podman/ajax/settings.php +++ b/webui/plugins/podman/ajax/settings.php @@ -18,6 +18,7 @@ * autostart_save POST {"names": ["postgres", "nextcloud", ...]} * service_status GET -> {"running": bool, "output": "..."} * service_start POST -> {"running": bool, "output": "..."} + * service_stop POST -> {"running": bool, "output": "..."} * service_restart POST -> {"running": bool, "output": "..."} */ @@ -58,6 +59,10 @@ switch ($action) { podman_json_response(rc_podman('start', 120)); break; + case 'service_stop': + podman_json_response(rc_podman('stop', 120)); + break; + case 'service_restart': podman_json_response(rc_podman('restart', 120)); break; diff --git a/webui/plugins/podman/javascript/settings.js b/webui/plugins/podman/javascript/settings.js index f682a1e..35a6838 100644 --- a/webui/plugins/podman/javascript/settings.js +++ b/webui/plugins/podman/javascript/settings.js @@ -72,8 +72,13 @@ } } + function serviceButtons() { + return ['settings-service-status-btn', 'settings-service-start-btn', 'settings-service-stop-btn', 'settings-service-restart-btn'] + .map(function (id) { return P.el(id); }); + } + function refreshServiceStatus() { - const buttons = [P.el('settings-service-status-btn'), P.el('settings-service-start-btn'), P.el('settings-service-restart-btn')]; + const buttons = serviceButtons(); buttons.forEach(function (b) { b.disabled = true; }); return P.get('settings', 'service_status').then(renderServiceResult).catch(function (err) { P.el('settings-service-chip').className = 'podman-chip podman-chip-bad'; @@ -86,7 +91,7 @@ } function runServiceAction(action) { - const buttons = [P.el('settings-service-status-btn'), P.el('settings-service-start-btn'), P.el('settings-service-restart-btn')]; + const buttons = serviceButtons(); buttons.forEach(function (b) { b.disabled = true; }); P.el('settings-service-log').style.display = ''; P.el('settings-service-log').textContent = 'Working…'; @@ -205,7 +210,14 @@ P.el('settings-service-status-btn').addEventListener('click', refreshServiceStatus); P.el('settings-service-start-btn').addEventListener('click', function () { runServiceAction('service_start'); }); - P.el('settings-service-restart-btn').addEventListener('click', function () { runServiceAction('service_restart'); }); + P.el('settings-service-stop-btn').addEventListener('click', function () { + if (!confirm('Stop podman? All running containers will be stopped first (each with its own configured grace period).')) return; + runServiceAction('service_stop'); + }); + P.el('settings-service-restart-btn').addEventListener('click', function () { + if (!confirm('Restart podman? All running containers will be stopped and podman.sock will be unavailable until it comes back up.')) return; + runServiceAction('service_restart'); + }); P.el('settings-format-disk-btn').addEventListener('click', openFormatDiskModal); refreshServiceStatus();