From 484028f22fc3aca8fef32e7eaa0e55d1058443e8 Mon Sep 17 00:00:00 2001 From: crschnick Date: Sun, 16 Mar 2025 09:15:31 +0000 Subject: [PATCH] Fix incus/lxd launches for busybox [stage] --- dist/changelogs/15.6_incremental.md | 3 ++- .../ext/system/incus/IncusCommandView.java | 20 ++++++++++++++----- .../ext/system/incus/IncusContainerStore.java | 7 ++++++- .../xpipe/ext/system/lxd/LxdCommandView.java | 18 ++++++++++++----- .../ext/system/lxd/LxdContainerStore.java | 6 +++++- version | 2 +- 6 files changed, 42 insertions(+), 14 deletions(-) diff --git a/dist/changelogs/15.6_incremental.md b/dist/changelogs/15.6_incremental.md index bdb525d7f..d29a05856 100644 --- a/dist/changelogs/15.6_incremental.md +++ b/dist/changelogs/15.6_incremental.md @@ -1,2 +1,3 @@ - Fix fish shell session scripts not getting added to PATH -- Fix window becoming unusable on Linux when changing appearance settings while window was maximized \ No newline at end of file +- Fix window becoming unusable on Linux when changing appearance settings while window was maximized +- Fix terminal launches failing for alpine LXD/incus containers diff --git a/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusCommandView.java b/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusCommandView.java index cdfc444ef..9a010282b 100644 --- a/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusCommandView.java +++ b/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusCommandView.java @@ -1,16 +1,19 @@ package io.xpipe.ext.system.incus; import io.xpipe.app.ext.ContainerStoreState; +import io.xpipe.app.ext.ShellStore; import io.xpipe.app.issue.ErrorEvent; import io.xpipe.app.storage.DataStoreEntry; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.CommandViewBase; import io.xpipe.core.process.*; +import io.xpipe.core.store.StatefulDataStore; import lombok.NonNull; import java.util.*; import java.util.function.Consumer; +import java.util.function.Supplier; import java.util.stream.Collectors; public class IncusCommandView extends CommandViewBase { @@ -138,16 +141,16 @@ public class IncusCommandView extends CommandViewBase { } } - public ShellControl exec(String container, String user) { + public ShellControl exec(String container, String user, Supplier busybox) { var sub = shellControl.subShell(); - sub.setDumbOpen(createOpenFunction(container, user, false)); - sub.setTerminalOpen(createOpenFunction(container, user, true)); + sub.setDumbOpen(createOpenFunction(container, user, false, busybox)); + sub.setTerminalOpen(createOpenFunction(container, user, true, busybox)); return sub.withErrorFormatter(IncusCommandView::formatErrorMessage) .withExceptionConverter(IncusCommandView::convertException) .elevated(requiresElevation()); } - private ShellOpenFunction createOpenFunction(String containerName, String user, boolean terminal) { + private ShellOpenFunction createOpenFunction(String containerName, String user, boolean terminal, Supplier busybox) { return new ShellOpenFunction() { @Override public CommandBuilder prepareWithoutInitCommand() { @@ -164,7 +167,14 @@ public class IncusCommandView extends CommandViewBase { if (user != null) { b.addQuoted(user); } - return b.add("--session-command").addLiteral(command); + return b.add(sc -> { + var suType = busybox.get(); + if (suType) { + return "-c"; + } else { + return "--session-command"; + } + }).addLiteral(command); } }; } diff --git a/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusContainerStore.java b/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusContainerStore.java index 4bed5ffac..1c85e4b87 100644 --- a/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusContainerStore.java +++ b/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusContainerStore.java @@ -7,6 +7,7 @@ import io.xpipe.app.ext.ShellStore; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.*; import io.xpipe.core.process.ShellControl; +import io.xpipe.core.process.ShellStoreState; import io.xpipe.core.store.FixedChildStore; import io.xpipe.core.store.StatefulDataStore; import io.xpipe.ext.base.identity.IdentityValue; @@ -75,7 +76,11 @@ public class IncusContainerStore @Override public ShellControl control(ShellControl parent) { var user = identity != null ? identity.unwrap().getUsername() : null; - var sc = new IncusCommandView(parent).exec(containerName, user); + var sc = new IncusCommandView(parent).exec(containerName, user, () -> { + var state = getState(); + var alpine = state.getOsName() != null && state.getOsName().toLowerCase().contains("alpine"); + return alpine; + }); sc.withSourceStore(IncusContainerStore.this); if (identity != null && identity.unwrap().getPassword() != null) { sc.setElevationHandler(new BaseElevationHandler( diff --git a/ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdCommandView.java b/ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdCommandView.java index 3c18bf1df..9d8dce899 100644 --- a/ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdCommandView.java +++ b/ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdCommandView.java @@ -11,6 +11,7 @@ import lombok.NonNull; import java.util.*; import java.util.function.Consumer; +import java.util.function.Supplier; import java.util.stream.Collectors; public class LxdCommandView extends CommandViewBase { @@ -150,16 +151,16 @@ public class LxdCommandView extends CommandViewBase { } } - public ShellControl exec(String container, String user) { + public ShellControl exec(String container, String user, Supplier busybox) { var sub = shellControl.subShell(); - sub.setDumbOpen(createOpenFunction(container, user, false)); - sub.setTerminalOpen(createOpenFunction(container, user, true)); + sub.setDumbOpen(createOpenFunction(container, user, false, busybox)); + sub.setTerminalOpen(createOpenFunction(container, user, true, busybox)); return sub.withErrorFormatter(LxdCommandView::formatErrorMessage) .withExceptionConverter(LxdCommandView::convertException) .elevated(requiresElevation()); } - private ShellOpenFunction createOpenFunction(String containerName, String user, boolean terminal) { + private ShellOpenFunction createOpenFunction(String containerName, String user, boolean terminal, Supplier busybox) { return new ShellOpenFunction() { @Override public CommandBuilder prepareWithoutInitCommand() { @@ -176,7 +177,14 @@ public class LxdCommandView extends CommandViewBase { if (user != null) { b.addQuoted(user); } - return b.add("--session-command").addLiteral(command); + return b.add(sc -> { + var suType = busybox.get(); + if (suType) { + return "-c"; + } else { + return "--session-command"; + } + }).addLiteral(command); } }; } diff --git a/ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdContainerStore.java b/ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdContainerStore.java index 320850ba3..70d07b77e 100644 --- a/ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdContainerStore.java +++ b/ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdContainerStore.java @@ -73,7 +73,11 @@ public class LxdContainerStore @Override public ShellControl control(ShellControl parent) { var user = identity != null ? identity.unwrap().getUsername() : null; - var base = new LxdCommandView(parent).exec(containerName, user); + var base = new LxdCommandView(parent).exec(containerName, user, () -> { + var state = getState(); + var alpine = state.getOsName() != null && state.getOsName().toLowerCase().contains("alpine"); + return alpine; + }); if (identity != null && identity.unwrap().getPassword() != null) { base.setElevationHandler(new BaseElevationHandler( LxdContainerStore.this, identity.unwrap().getPassword()) diff --git a/version b/version index 0f98fe395..644a261e2 100644 --- a/version +++ b/version @@ -1 +1 @@ -15.6-3 +15.6-4