From b4800bdecdc9580db5b09b62fbfa1b333a0eb1bf Mon Sep 17 00:00:00 2001 From: crschnick Date: Sun, 9 Jun 2024 18:45:49 +0000 Subject: [PATCH] Rework --- .../java/io/xpipe/core/process/OsType.java | 14 ++++- .../xpipe/core/store/NetworkTunnelStore.java | 2 +- dist/changelogs/10.0.md | 2 + .../base/service/AbstractServiceStore.java | 4 ++ .../service/AbstractServiceStoreProvider.java | 20 +++++++ .../base/service/ServiceCopyUrlAction.java | 60 +++++++++++++++++++ .../ext/base/service/ServiceOpenAction.java | 7 +-- ext/base/src/main/java/module-info.java | 2 +- 8 files changed, 101 insertions(+), 10 deletions(-) create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/service/ServiceCopyUrlAction.java diff --git a/core/src/main/java/io/xpipe/core/process/OsType.java b/core/src/main/java/io/xpipe/core/process/OsType.java index 30765336..3e2e81dc 100644 --- a/core/src/main/java/io/xpipe/core/process/OsType.java +++ b/core/src/main/java/io/xpipe/core/process/OsType.java @@ -89,7 +89,17 @@ public interface OsType { @Override public String getTempDirectory(ShellControl pc) throws Exception { - return pc.executeSimpleStringCommand(pc.getShellDialect().getPrintEnvironmentVariableCommand("TEMP")); + var def = pc.executeSimpleStringCommand(pc.getShellDialect().getPrintEnvironmentVariableCommand("TEMP")); + if (!def.isBlank() && pc.getShellDialect().directoryExists(pc, def).executeAndCheck()) { + return def; + } + + var fallback = pc.executeSimpleStringCommand(pc.getShellDialect().getPrintEnvironmentVariableCommand("LOCALAPPDATA")); + if (!fallback.isBlank() && pc.getShellDialect().directoryExists(pc, fallback).executeAndCheck()) { + return fallback; + } + + return def; } @Override @@ -116,7 +126,7 @@ public interface OsType { .trim(); } catch (Throwable t) { // Just in case this fails somehow - return "Windows ?"; + return "Windows"; } } } diff --git a/core/src/main/java/io/xpipe/core/store/NetworkTunnelStore.java b/core/src/main/java/io/xpipe/core/store/NetworkTunnelStore.java index 0a5da727..d9d30a0c 100644 --- a/core/src/main/java/io/xpipe/core/store/NetworkTunnelStore.java +++ b/core/src/main/java/io/xpipe/core/store/NetworkTunnelStore.java @@ -112,7 +112,7 @@ public interface NetworkTunnelStore extends DataStore { @Override public int getLocalPort() { - return local; + return remotePort; } @Override diff --git a/dist/changelogs/10.0.md b/dist/changelogs/10.0.md index bac9bd6c..d013f161 100644 --- a/dist/changelogs/10.0.md +++ b/dist/changelogs/10.0.md @@ -34,6 +34,8 @@ If you have existing scripts, they will have to be manually adjusted by setting The docker integration has been updated to support docker contexts. The UI has also been streamlined to make common actions more easily accessible. +There's also now support for Windows containers running on HyperV. + Note that old docker container connections will be removed as they are incompatible with the new version. ## Better connection organization diff --git a/ext/base/src/main/java/io/xpipe/ext/base/service/AbstractServiceStore.java b/ext/base/src/main/java/io/xpipe/ext/base/service/AbstractServiceStore.java index 62f9ef53..d8aa5825 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/service/AbstractServiceStore.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/service/AbstractServiceStore.java @@ -24,6 +24,10 @@ public abstract class AbstractServiceStore extends JacksonizedValue implements S Validators.nonNull(remotePort); } + public boolean requiresTunnel() { + return getHost().getStore().requiresTunnel(); + } + @Override public NetworkTunnelSession newSession() throws Exception { var l = localPort != null ? localPort : HostHelper.findRandomOpenPortOnAllLocalInterfaces(); diff --git a/ext/base/src/main/java/io/xpipe/ext/base/service/AbstractServiceStoreProvider.java b/ext/base/src/main/java/io/xpipe/ext/base/service/AbstractServiceStoreProvider.java index 21aa1c40..dcb9e333 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/service/AbstractServiceStoreProvider.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/service/AbstractServiceStoreProvider.java @@ -1,10 +1,12 @@ package io.xpipe.ext.base.service; +import io.xpipe.app.comp.base.SystemStateComp; import io.xpipe.app.comp.store.StoreEntryComp; import io.xpipe.app.comp.store.StoreEntryWrapper; import io.xpipe.app.comp.store.StoreSection; import io.xpipe.app.ext.DataStoreProvider; import io.xpipe.app.ext.SingletonSessionStoreProvider; +import io.xpipe.app.fxcomps.Comp; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreEntry; import io.xpipe.app.util.DataStoreFormatter; @@ -23,6 +25,24 @@ public abstract class AbstractServiceStoreProvider implements SingletonSessionSt return DataStorage.get().getOrCreateNewSyntheticEntry(s.getHost().get(), "Services", ServiceGroupStore.builder().parent(s.getHost()).build()); } + @Override + public Comp stateDisplay(StoreEntryWrapper w) { + return new SystemStateComp(Bindings.createObjectBinding( + () -> { + AbstractServiceStore s = w.getEntry().getStore().asNeeded(); + if (!s.requiresTunnel()) { + return SystemStateComp.State.SUCCESS; + } + + if (!s.isSessionEnabled()) { + return SystemStateComp.State.OTHER; + } + + return s.isSessionRunning() ? SystemStateComp.State.SUCCESS : SystemStateComp.State.FAILURE; + }, + w.getCache())); + } + @Override public StoreEntryComp customEntryComp(StoreSection sec, boolean preferLarge) { var toggle = createToggleComp(sec); diff --git a/ext/base/src/main/java/io/xpipe/ext/base/service/ServiceCopyUrlAction.java b/ext/base/src/main/java/io/xpipe/ext/base/service/ServiceCopyUrlAction.java new file mode 100644 index 00000000..d3f35e90 --- /dev/null +++ b/ext/base/src/main/java/io/xpipe/ext/base/service/ServiceCopyUrlAction.java @@ -0,0 +1,60 @@ +package io.xpipe.ext.base.service; + +import io.xpipe.app.core.AppI18n; +import io.xpipe.app.ext.ActionProvider; +import io.xpipe.app.storage.DataStoreEntryRef; +import io.xpipe.app.util.ClipboardHelper; +import javafx.beans.value.ObservableValue; +import lombok.Value; + +public class ServiceCopyUrlAction implements ActionProvider { + + @Override + public LeafDataStoreCallSite getLeafDataStoreCallSite() { + return new LeafDataStoreCallSite() { + + @Override + public boolean isMajor(DataStoreEntryRef o) { + return true; + } + + @Override + public boolean canLinkTo() { + return true; + } + + @Override + public ActionProvider.Action createAction(DataStoreEntryRef store) { + return new Action(store.getStore()); + } + + @Override + public Class getApplicableClass() { + return AbstractServiceStore.class; + } + + @Override + public ObservableValue getName(DataStoreEntryRef store) { + return AppI18n.observable("copyUrl"); + } + + @Override + public String getIcon(DataStoreEntryRef store) { + return "mdi2c-content-copy"; + } + }; + } + + @Value + static class Action implements ActionProvider.Action { + + AbstractServiceStore serviceStore; + + @Override + public void execute() throws Exception { + serviceStore.startSessionIfNeeded(); + var l = serviceStore.getSession().getLocalPort(); + ClipboardHelper.copyUrl("localhost:" + l); + } + } +} diff --git a/ext/base/src/main/java/io/xpipe/ext/base/service/ServiceOpenAction.java b/ext/base/src/main/java/io/xpipe/ext/base/service/ServiceOpenAction.java index 36709196..ca122c55 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/service/ServiceOpenAction.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/service/ServiceOpenAction.java @@ -9,11 +9,6 @@ import lombok.Value; public class ServiceOpenAction implements ActionProvider { - @Override - public String getId() { - return "openWebsite"; - } - @Override public LeafDataStoreCallSite getLeafDataStoreCallSite() { return new LeafDataStoreCallSite() { @@ -45,7 +40,7 @@ public class ServiceOpenAction implements ActionProvider { @Override public String getIcon(DataStoreEntryRef store) { - return "mdi2w-web"; + return "mdi2s-search-web"; } }; } diff --git a/ext/base/src/main/java/module-info.java b/ext/base/src/main/java/module-info.java index e76a8d7e..29be2492 100644 --- a/ext/base/src/main/java/module-info.java +++ b/ext/base/src/main/java/module-info.java @@ -58,7 +58,7 @@ open module io.xpipe.ext.base { UnzipAction, JavapAction, JarAction; - provides ActionProvider with ServiceOpenAction, + provides ActionProvider with ServiceOpenAction, ServiceCopyUrlAction, CloneStoreAction, RefreshChildrenStoreAction, ScanStoreAction, LaunchStoreAction, XPipeUrlAction, EditStoreAction, DeleteChildrenStoreAction,