From 602d93bdcd9bf68cb81f632d1420b3c1de93ee81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= Date: Wed, 3 Jan 2024 18:38:08 -0500 Subject: [PATCH 1/2] incusd/instance/qemu: Add ErrExecDisconnected MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber --- internal/server/instance/drivers/driver_qemu_cmd.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/internal/server/instance/drivers/driver_qemu_cmd.go b/internal/server/instance/drivers/driver_qemu_cmd.go index c440befbe4e..022be471505 100644 --- a/internal/server/instance/drivers/driver_qemu_cmd.go +++ b/internal/server/instance/drivers/driver_qemu_cmd.go @@ -13,6 +13,9 @@ import ( "github.com/lxc/incus/shared/logger" ) +// ErrExecDisconnected is returned when the guest disconnects the exec session. +var ErrExecDisconnected = fmt.Errorf("Disconnected") + // Cmd represents a running command for an Qemu VM. type qemuCmd struct { attachedChildPid int @@ -78,7 +81,7 @@ func (c *qemuCmd) Wait() (int, error) { // so we inform the client of the disconnection with a more // descriptive message. if errors.Is(err, io.EOF) { - return exitStatus, fmt.Errorf("Disconnected") + return exitStatus, ErrExecDisconnected } return exitStatus, err From 578f58c92be0c309b0af75c10201207768fef90a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= Date: Wed, 3 Jan 2024 18:51:17 -0500 Subject: [PATCH 2/2] incusd: Make VM shutdown/reboot exit cleanly MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #256 Signed-off-by: Stéphane Graber --- cmd/incusd/instance_exec.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/cmd/incusd/instance_exec.go b/cmd/incusd/instance_exec.go index 382e30c54a5..adee08836df 100644 --- a/cmd/incusd/instance_exec.go +++ b/cmd/incusd/instance_exec.go @@ -26,6 +26,7 @@ import ( "github.com/lxc/incus/internal/server/cluster" "github.com/lxc/incus/internal/server/db/operationtype" "github.com/lxc/incus/internal/server/instance" + "github.com/lxc/incus/internal/server/instance/drivers" "github.com/lxc/incus/internal/server/instance/instancetype" "github.com/lxc/incus/internal/server/operations" "github.com/lxc/incus/internal/server/request" @@ -286,7 +287,14 @@ func (s *execWs) Do(op *operations.Operation) error { _ = pty.Close() } + // Make VM disconnections (shutdown/reboot) match containers. + if cmdErr == drivers.ErrExecDisconnected { + cmdResult = 129 + cmdErr = nil + } + metadata := jmap.Map{"return": cmdResult} + err = op.ExtendMetadata(metadata) if err != nil { return err