diff options
Diffstat (limited to 'src/main/java/io')
-rw-r--r-- | src/main/java/io/github/jshipit/ContainerManager.java | 22 | ||||
-rwxr-xr-x | src/main/java/io/github/jshipit/JshipIT.java | 1 | ||||
-rw-r--r-- | src/main/java/io/github/jshipit/SysUtils.java | 14 |
3 files changed, 27 insertions, 10 deletions
diff --git a/src/main/java/io/github/jshipit/ContainerManager.java b/src/main/java/io/github/jshipit/ContainerManager.java index c22d51b..8a3ecc7 100644 --- a/src/main/java/io/github/jshipit/ContainerManager.java +++ b/src/main/java/io/github/jshipit/ContainerManager.java @@ -52,7 +52,7 @@ public class ContainerManager { new File(containerDirectory+"/work").mkdirs(); } - public void startContainer() { + public String startContainer(boolean getCommand) { String containerDirectory = dataStore.getContainerPath(this.containerName); List<String> content = null; @@ -70,14 +70,13 @@ public class ContainerManager { SysUtils sysUtils = new SysUtils(); String[] diffs = layers.toArray(new String[0]); - sysUtils.overlayMount(diffs, containerDirectory + "/containerOverlay", containerDirectory + "/root", containerDirectory + "/work"); + return sysUtils.overlayMount(diffs, containerDirectory + "/containerOverlay", containerDirectory + "/root", containerDirectory + "/work", !getCommand); } public void runCommand(String command) { String containerDirectory = dataStore.getContainerPath(this.containerName); String dataStorePath = dataStore.getPath(); - startContainer(); File configPath = new File(dataStorePath + "/" + this.containerImage + "/" + this.containerTag + "/config"); String content = null; @@ -114,10 +113,21 @@ public class ContainerManager { bwrapCommand.add("--ro-bind "+containerDirectory+"/root / --chdir /"); bwrapCommand.add("--share-net"); - bwrapCommand.add("--hostname "+ (!hostname.isBlank() ? hostname : this.containerName+"-"+this.containerImage)); - bwrapCommand.add(cmd); + bwrapCommand.add("--unshare-uts --hostname "+ (!hostname.isBlank() ? hostname : this.containerName+"-"+this.containerImage)); + bwrapCommand.add("/bin/sh -c "+cmd); SysUtils sysUtils = new SysUtils(); - sysUtils.execInBwrap(bwrapCommand.toArray(new String[0])); + String bwrapCMD = sysUtils.execInBwrap(bwrapCommand.toArray(new String[0]), false); + String mountCMD = startContainer(true); + + String CMD = "unshare --user --map-root-user --mount bash -c \""+mountCMD+";"+bwrapCMD+";"+command+"\""; // I am starting to realize that this project was not a good idea + ProcessBuilder pb = new ProcessBuilder("bash", "-c", CMD); + pb.inheritIO(); + try { + Process p = pb.start(); + p.waitFor(); + } catch (IOException | InterruptedException e) { + throw new RuntimeException(e); + } } public String genContainerID() { diff --git a/src/main/java/io/github/jshipit/JshipIT.java b/src/main/java/io/github/jshipit/JshipIT.java index 9d109ba..becd91b 100755 --- a/src/main/java/io/github/jshipit/JshipIT.java +++ b/src/main/java/io/github/jshipit/JshipIT.java @@ -34,7 +34,6 @@ public class JshipIT { dataStore.createImage(commandPull.containerApiRepo, commandPull.containerRepo, commandPull.containerImage, commandPull.containerTag); } else if (commands.getParsedCommand().equals("start")) { ContainerManager containerManager = new ContainerManager(commandStart.containerName, dataStore); - containerManager.startContainer(); containerManager.runCommand(null); } diff --git a/src/main/java/io/github/jshipit/SysUtils.java b/src/main/java/io/github/jshipit/SysUtils.java index e6de886..144c401 100644 --- a/src/main/java/io/github/jshipit/SysUtils.java +++ b/src/main/java/io/github/jshipit/SysUtils.java @@ -29,9 +29,12 @@ public class SysUtils { } } - public void execInBwrap(String[] args) { + public String execInBwrap(String[] args, boolean execute) { //System.out.println("bwrap "+String.join(" ", args)); - ProcessBuilder pb = new ProcessBuilder("bwrap", args.toString()); + if (!execute) { + return "bwrap "+String.join(" ", args); + } + ProcessBuilder pb = new ProcessBuilder("bash", "-c", "bwrap "+String.join(" ", args)); pb.inheritIO(); try { Process p = pb.start(); @@ -39,9 +42,13 @@ public class SysUtils { } catch (Exception e) { throw new RuntimeException(e); } + return ""; } - public void overlayMount(String[] lower, String upper, String target, String work) { + public String overlayMount(String[] lower, String upper, String target, String work, boolean execute) { + if (!execute) { + return "mount -t overlay overlay -o lowerdir="+String.join(":", lower)+",upperdir="+upper+",workdir="+work+" "+target; + } if (Platform.isLinux()) { ProcessBuilder pb = new ProcessBuilder("unshare", "--user", "--map-root-user", "--mount", "mount", "-t", "overlay", "overlay", "-o", "lowerdir="+String.join(":", lower)+",upperdir="+upper+",workdir="+work, target); @@ -57,5 +64,6 @@ public class SysUtils { System.out.println("Platform not supported."); System.out.println("mount -t overlay overlay -o lowerdir="+String.join(":", lower)+",upperdir="+upper+",workdir="+work+" "+target); } + return ""; } } |