aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/io
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/io')
-rw-r--r--src/main/java/io/github/jshipit/ContainerManager.java22
-rwxr-xr-xsrc/main/java/io/github/jshipit/JshipIT.java1
-rw-r--r--src/main/java/io/github/jshipit/SysUtils.java14
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 "";
}
}