Shell creation logic
Signed-off-by: Georg Pfuetzenreuter <mail@georg-pfuetzenreuter.net>
This commit is contained in:
parent
5bb047c960
commit
a014a0126f
@ -11,11 +11,11 @@ import java.util.stream.Collectors;
|
|||||||
import com.github.dockerjava.api.DockerClient;
|
import com.github.dockerjava.api.DockerClient;
|
||||||
import com.github.dockerjava.api.command.BuildImageResultCallback;
|
import com.github.dockerjava.api.command.BuildImageResultCallback;
|
||||||
import com.github.dockerjava.api.command.CreateContainerResponse;
|
import com.github.dockerjava.api.command.CreateContainerResponse;
|
||||||
import com.github.dockerjava.api.command.InspectContainerResponse;
|
|
||||||
import com.github.dockerjava.api.command.ListContainersCmd;
|
import com.github.dockerjava.api.command.ListContainersCmd;
|
||||||
import com.github.dockerjava.api.command.ListImagesCmd;
|
import com.github.dockerjava.api.command.ListImagesCmd;
|
||||||
import com.github.dockerjava.api.command.WaitContainerResultCallback;
|
import com.github.dockerjava.api.command.WaitContainerResultCallback;
|
||||||
import com.github.dockerjava.api.model.Image;
|
import com.github.dockerjava.api.model.Image;
|
||||||
|
import com.github.dockerjava.api.model.SearchItem;
|
||||||
import com.github.dockerjava.core.DefaultDockerClientConfig;
|
import com.github.dockerjava.core.DefaultDockerClientConfig;
|
||||||
import com.github.dockerjava.core.DockerClientConfig;
|
import com.github.dockerjava.core.DockerClientConfig;
|
||||||
import com.github.dockerjava.core.DockerClientImpl;
|
import com.github.dockerjava.core.DockerClientImpl;
|
||||||
@ -74,7 +74,7 @@ public class Docker {
|
|||||||
|
|
||||||
public static void deleteContainer(String id) {
|
public static void deleteContainer(String id) {
|
||||||
Collection<String> stringifiedId = Arrays.asList(id);
|
Collection<String> stringifiedId = Arrays.asList(id);
|
||||||
System.out.println(id);
|
//System.out.println(id);
|
||||||
System.out.println(stringifiedId);
|
System.out.println(stringifiedId);
|
||||||
List<com.github.dockerjava.api.model.Container> containerQuery = dockerClient.listContainersCmd().withShowAll(false).withIdFilter(stringifiedId).exec();
|
List<com.github.dockerjava.api.model.Container> containerQuery = dockerClient.listContainersCmd().withShowAll(false).withIdFilter(stringifiedId).exec();
|
||||||
//apparently listContainersCmd returns a bunch of garbled crap, hence the less ideal toString/contains
|
//apparently listContainersCmd returns a bunch of garbled crap, hence the less ideal toString/contains
|
||||||
@ -93,7 +93,6 @@ public class Docker {
|
|||||||
dockerClient.stopContainerCmd(id).exec();
|
dockerClient.stopContainerCmd(id).exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
//System.out.println(containerQuery);
|
|
||||||
dockerClient.removeContainerCmd(id).exec();
|
dockerClient.removeContainerCmd(id).exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,10 +134,15 @@ public class Docker {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String createContainer(String imgid) {
|
public static String createContainer(String name, String imgid) {
|
||||||
//String containerid = dockerClient.createContainerCmd(imgid).exec();
|
//String containerid = dockerClient.createContainerCmd(imgid).exec();
|
||||||
WaitContainerResultCallback resultCallback = new WaitContainerResultCallback();
|
WaitContainerResultCallback resultCallback = new WaitContainerResultCallback();
|
||||||
CreateContainerResponse createContainerResponse = dockerClient.createContainerCmd(imgid).exec();
|
CreateContainerResponse createContainerResponse = dockerClient
|
||||||
|
.createContainerCmd(imgid)
|
||||||
|
.withName(name)
|
||||||
|
.withTty(true)
|
||||||
|
.withAttachStdin(true)
|
||||||
|
.exec();
|
||||||
dockerClient.waitContainerCmd(createContainerResponse.getId()).exec(resultCallback);
|
dockerClient.waitContainerCmd(createContainerResponse.getId()).exec(resultCallback);
|
||||||
try {
|
try {
|
||||||
resultCallback.awaitCompletion();
|
resultCallback.awaitCompletion();
|
||||||
@ -153,24 +157,49 @@ public class Docker {
|
|||||||
return(containerid);
|
return(containerid);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String deleteShell(String user, String id) {
|
public static String createShell(String user, String os, Integer count) {
|
||||||
|
String name1 = user + "_" + os;
|
||||||
|
String name = name1 + "_" + count;
|
||||||
|
String imageid = null;
|
||||||
|
List<Image> imageQuery = Docker.getImages(user + ":" + os);
|
||||||
|
|
||||||
|
System.out.printf("Image query: %s\n", imageQuery);
|
||||||
|
|
||||||
|
if (imageQuery.isEmpty()) {
|
||||||
|
System.out.println("No result, building new image.\n");
|
||||||
|
imageid = Docker.buildImage(user, os, count);
|
||||||
|
}
|
||||||
|
if (! imageQuery.isEmpty()) {
|
||||||
|
System.out.println("Found existing image.\n");
|
||||||
|
Image image = imageQuery.get(0);
|
||||||
|
imageid = image.getId();
|
||||||
|
}
|
||||||
|
|
||||||
|
String containerid = createContainer(name, imageid);
|
||||||
|
System.out.printf("Initialized shell with image ID %s and container ID %s\n", imageid, containerid);
|
||||||
|
return(containerid);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Integer deleteShell(String user, String id) {
|
||||||
Docker.deleteContainer(id);
|
Docker.deleteContainer(id);
|
||||||
List<Image> images = Docker.getImages(user);
|
List<Image> images = Docker.getImages(user);
|
||||||
for (Image image : images) {
|
for (Image image : images) {
|
||||||
System.out.println(image.getLabels());
|
|
||||||
String imageid = image.getId();
|
String imageid = image.getId();
|
||||||
System.out.println(imageid);
|
System.out.println(imageid);
|
||||||
try {
|
try {
|
||||||
|
try {
|
||||||
|
Thread.sleep(200);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
Docker.deleteImage(imageid);
|
Docker.deleteImage(imageid);
|
||||||
System.out.println("Removed.");
|
System.out.println("Removed.");
|
||||||
} catch (com.github.dockerjava.api.exception.ConflictException exception) {
|
} catch (com.github.dockerjava.api.exception.ConflictException exception) {
|
||||||
System.out.println("Still being used, skipping.");
|
System.out.println("Still being used, skipping.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
return(null);
|
||||||
return("foo");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -158,7 +158,7 @@ public class WebApplication {
|
|||||||
System.out.printf("Deletion triggered for ID %s by %s (%s)\n", id, userid, username);
|
System.out.printf("Deletion triggered for ID %s by %s (%s)\n", id, userid, username);
|
||||||
|
|
||||||
//Docker.deleteContainer(id);
|
//Docker.deleteContainer(id);
|
||||||
Docker.deleteShell(username, id);
|
Docker.deleteShell(username, id); //to-do: move to separate mapping
|
||||||
|
|
||||||
return("redirect:/portal");
|
return("redirect:/portal");
|
||||||
}
|
}
|
||||||
@ -220,6 +220,36 @@ public class WebApplication {
|
|||||||
return("redirect:/portal");
|
return("redirect:/portal");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@PostMapping(path="/frontend/shell/add",consumes=MediaType.APPLICATION_FORM_URLENCODED_VALUE)
|
||||||
|
public static String addShell(@RequestBody MultiValueMap<String, String> body, HttpServletRequest request, RedirectAttributes redirectAttributes) {
|
||||||
|
KeycloakAuthenticationToken principal = (KeycloakAuthenticationToken) request.getUserPrincipal();
|
||||||
|
String username = null;
|
||||||
|
String userid = principal.getName();
|
||||||
|
IDToken token = principal.getAccount().getKeycloakSecurityContext().getIdToken();
|
||||||
|
Map<String, Object> customClaims = token.getOtherClaims();
|
||||||
|
username = String.valueOf(customClaims.get("username"));
|
||||||
|
String os = (String) body.getFirst("osChoice");
|
||||||
|
|
||||||
|
System.out.printf("New shell with OS %s requested by %s (%s)\n", os, userid, username);
|
||||||
|
|
||||||
|
Random rand = new Random();
|
||||||
|
Integer randomInt = rand.nextInt(9999999-1111);
|
||||||
|
Integer count = randomInt;
|
||||||
|
|
||||||
|
try {
|
||||||
|
String containerid = Docker.createShell(username, os, count);
|
||||||
|
String returnmessage = "Success - spawned shell " + username + "_" + os + "_" + count + " - internal ID: " + containerid;
|
||||||
|
redirectAttributes.addFlashAttribute("message", returnmessage);
|
||||||
|
} catch (Exception exception) {
|
||||||
|
redirectAttributes.addFlashAttribute("message", "Success!");
|
||||||
|
String returnmessage = "Error - failed to build image :-(";
|
||||||
|
redirectAttributes.addFlashAttribute("message", returnmessage);
|
||||||
|
System.out.println(exception);
|
||||||
|
}
|
||||||
|
|
||||||
|
return("redirect:/portal");
|
||||||
|
}
|
||||||
|
|
||||||
@GetMapping(path = "/logout")
|
@GetMapping(path = "/logout")
|
||||||
public String logout(HttpServletRequest request) throws ServletException {
|
public String logout(HttpServletRequest request) throws ServletException {
|
||||||
request.logout();
|
request.logout();
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
Hello, <span th:text="${username}"></span>.
|
Hello, <span th:text="${username}"></span>.
|
||||||
</h2>
|
</h2>
|
||||||
<h3>Generate new throw-away shell:</h3>
|
<h3>Generate new throw-away shell:</h3>
|
||||||
<form th:object="${osChoice}" th:id="request_pseudoform" action="#" th:action="@{'/frontend/container/add'}" th:method="post" th:os="${osChoice}" th:onsubmit="return confirm('You are about to generate a shell with the OS ' + this.getAttribute('osoption') + ' - please be patient after you confirm, as the generation may take a short while.');">
|
<form th:object="${osChoice}" th:id="request_pseudoform" action="#" th:action="@{'/frontend/shell/add'}" th:method="post" th:os="${osChoice}" th:onsubmit="return confirm('You are about to generate a shell with the OS ' + this.getAttribute('osoption') + ' - please be patient after you confirm, as the generation may take a short while.');">
|
||||||
<select class="form-control" th:object="${osChoice}" name="osChoice">
|
<select class="form-control" th:object="${osChoice}" name="osChoice">
|
||||||
<option value="">Select operating system ...</option>
|
<option value="">Select operating system ...</option>
|
||||||
<option
|
<option
|
||||||
|
Loading…
Reference in New Issue
Block a user