From 2121fec318ab512fe34cebe1209cf44135955f94 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 28 Apr 2026 18:02:36 +0000 Subject: [PATCH] feat: add Pull new images button while containers are running Agent-Logs-Url: https://github.com/nextcloud/all-in-one/sessions/446ad3c6-142d-4e62-adb8-b43a7e548cda Co-authored-by: szaimen <42591237+szaimen@users.noreply.github.com> --- php/public/index.php | 1 + php/src/Controller/DockerController.php | 19 ++++++++++++++++--- php/templates/containers.twig | 8 ++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/php/public/index.php b/php/public/index.php index eb2a7878..eaf02fa0 100644 --- a/php/public/index.php +++ b/php/public/index.php @@ -105,6 +105,7 @@ $app->post('/api/docker/restore', AIO\Controller\DockerController::class . ':Sta $app->post('/api/docker/stop', AIO\Controller\DockerController::class . ':StopContainer'); $app->post('/api/docker/backup-reset-location', AIO\Controller\DockerController::class . ':DeleteBorgBackupConfig'); $app->post('/api/docker/prune', AIO\Controller\DockerController::class . ':SystemPrune'); +$app->post('/api/docker/pull-images', AIO\Controller\DockerController::class . ':PullImages'); $app->get('/api/docker/logs', AIO\Controller\DockerController::class . ':GetLogs'); $app->post('/api/auth/login', AIO\Controller\LoginController::class . ':TryLogin'); $app->get('/api/auth/getlogin', AIO\Controller\LoginController::class . ':GetTryLogin'); diff --git a/php/src/Controller/DockerController.php b/php/src/Controller/DockerController.php index 66e8a3e2..94b78213 100644 --- a/php/src/Controller/DockerController.php +++ b/php/src/Controller/DockerController.php @@ -45,15 +45,15 @@ readonly class DockerController { $this->dockerActionManager->ConnectContainerToNetwork($container); } - private function PerformRecursiveImagePull(string $id) : void { + private function PerformRecursiveImagePull(string $id, ?\Closure $addToStreamingResponseBody = null) : void { $container = $this->containerDefinitionFetcher->GetContainerById($id); // Pull all dependencies first and then itself foreach($container->dependsOn as $dependency) { - $this->PerformRecursiveImagePull($dependency); + $this->PerformRecursiveImagePull($dependency, $addToStreamingResponseBody); } - $this->dockerActionManager->PullImage($container, true); + $this->dockerActionManager->PullImage($container, true, $addToStreamingResponseBody); } public function PullAllContainerImages(): void { @@ -63,6 +63,19 @@ readonly class DockerController { $this->PerformRecursiveImagePull($id); } + public function PullImages(Request $request, Response $response, array $args) : Response { + // Get streaming response start and closure + $nonbufResp = $this->startStreamingResponse($response); + $addToStreamingResponseBody = $this->getAddToStreamingResponseBody($nonbufResp); + + $id = self::TOP_CONTAINER; + $this->PerformRecursiveImagePull($id, $addToStreamingResponseBody); + + // End streaming response + $this->finalizeStreamingResponse($nonbufResp); + return $nonbufResp; + } + public function GetLogs(Request $request, Response $response, array $args) : Response { $requestParams = $request->getQueryParams(); diff --git a/php/templates/containers.twig b/php/templates/containers.twig index 8faa4474..a7d29c6b 100644 --- a/php/templates/containers.twig +++ b/php/templates/containers.twig @@ -291,6 +291,14 @@ {% if has_update_available == true %} {% if is_mastercontainer_update_available == false %}

⚠️ Container updates are available. Click on Stop containers and Start and update containers to update them. You should consider creating a backup first.

+ {% if isAnyRunning == true and isApacheStarting != true %} +

Alternatively, you can already pull the new images now while the containers are still running. The new images will automatically be used whenever the containers are recreated – either manually or automatically via AIO's daily backup/update schedule.

+
+ + + +
+ {% endif %} {% endif %} {% else %} {% if is_mastercontainer_update_available == false %}