diff options
| author | Georg Pfuetzenreuter | 2022-05-06 18:25:22 +0200 | 
|---|---|---|
| committer | Georg Pfuetzenreuter | 2022-05-06 18:25:22 +0200 | 
| commit | 20d049ea10c14eb335014b5c8d150f55bf437377 (patch) | |
| tree | b0f1fdef1a3ef7c3700c68349de9e50a9468531c /src | |
| parent | 65688954c9f4a0393d58c695c12712707f47c527 (diff) | |
| download | pubsh-web-20d049ea10c14eb335014b5c8d150f55bf437377.tar.gz pubsh-web-20d049ea10c14eb335014b5c8d150f55bf437377.tar.bz2 pubsh-web-20d049ea10c14eb335014b5c8d150f55bf437377.zip | |
Checkpoint
Signed-off-by: Georg Pfuetzenreuter <mail@georg-pfuetzenreuter.net>
Diffstat (limited to 'src')
| -rw-r--r-- | src/main/java/net/libertacasa/pubsh/web/API.java | 5 | ||||
| -rw-r--r-- | src/main/java/net/libertacasa/pubsh/web/Docker.java | 17 | ||||
| -rw-r--r-- | src/main/java/net/libertacasa/pubsh/web/WebApplication.java | 40 | ||||
| -rw-r--r-- | src/main/resources/templates/portal.html | 44 | 
4 files changed, 81 insertions, 25 deletions
| diff --git a/src/main/java/net/libertacasa/pubsh/web/API.java b/src/main/java/net/libertacasa/pubsh/web/API.java index 501fbc6..d14197e 100644 --- a/src/main/java/net/libertacasa/pubsh/web/API.java +++ b/src/main/java/net/libertacasa/pubsh/web/API.java @@ -14,13 +14,16 @@ import org.springframework.web.bind.annotation.GetMapping;  import org.springframework.web.bind.annotation.PathVariable;  import org.springframework.web.bind.annotation.RequestParam;  import org.springframework.web.bind.annotation.RestController; +import java.util.Random;  @RestController  public class API {  	@GetMapping("/hello")  	public String hello(@RequestParam(value = "name", defaultValue = "World") String name) { -		return String.format("Hello %s!", name); +		Random rand = new Random(); +		Integer randomInt = rand.nextInt(100-10); +		return String.format("Hello %s! Your random number is %s!", name, randomInt);  	}  	@DeleteMapping("/backend/container/delete/{id}") diff --git a/src/main/java/net/libertacasa/pubsh/web/Docker.java b/src/main/java/net/libertacasa/pubsh/web/Docker.java index 536a80e..1460bb3 100644 --- a/src/main/java/net/libertacasa/pubsh/web/Docker.java +++ b/src/main/java/net/libertacasa/pubsh/web/Docker.java @@ -1,11 +1,15 @@  package net.libertacasa.pubsh.web; +import java.io.File;  import java.time.Duration;  import java.util.Arrays;  import java.util.Collection; +import java.util.HashSet;  import java.util.List; +import java.util.Set;  import java.util.stream.Collectors;  import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.command.BuildImageResultCallback;  import com.github.dockerjava.api.command.InspectExecResponse.Container;  import com.github.dockerjava.api.command.ListContainersCmd;  import com.github.dockerjava.api.model.Image; @@ -77,4 +81,17 @@ public class Docker {  		dockerClient.removeContainerCmd(id).exec();  	} +	public static String buildImage(String targetUser, String osChoice, Integer count) { +		String dockerfile = "classpath:docker/Dockerfile-" + osChoice; +		String tag = targetUser + ":sh" + count;  +		Set<String> tags = new HashSet<String>(); +		tags.add(tag); +		String imgid = dockerClient.buildImageCmd() +				.withDockerfile(new File(dockerfile)) +				.withPull(false).withNoCache(false).withTags(tags) +				.exec(new BuildImageResultCallback()).awaitImageId(); +		 +		return(imgid); +	} +  } diff --git a/src/main/java/net/libertacasa/pubsh/web/WebApplication.java b/src/main/java/net/libertacasa/pubsh/web/WebApplication.java index faef657..ca6ea7e 100644 --- a/src/main/java/net/libertacasa/pubsh/web/WebApplication.java +++ b/src/main/java/net/libertacasa/pubsh/web/WebApplication.java @@ -1,6 +1,7 @@  package net.libertacasa.pubsh.web;  import java.security.Principal; +import java.util.ArrayList;  import java.util.List;  import java.util.Map; @@ -21,12 +22,15 @@ import org.springframework.ui.Model;  import org.springframework.web.bind.annotation.DeleteMapping;  //import org.springframework.web.bind.annotation.DeleteMapping;  import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute;  //import org.springframework.web.bind.annotation.PathVariable;  import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping;  import org.springframework.web.servlet.mvc.support.RedirectAttributes;  import com.github.dockerjava.api.model.Container;  import com.github.dockerjava.api.model.Image; +import java.util.Random;  @SpringBootApplication @@ -81,7 +85,17 @@ public class WebApplication {        //System.out.println(containers);        model.addAttribute("docker_images", images); -      model.addAttribute("docker_containers", containers);       +      model.addAttribute("docker_containers", containers); +       +      ArrayList<String> availableOs = new ArrayList<String>(); +      availableOs.add("archlinux"); +      availableOs.add("opensuse-leap"); +      availableOs.add("opensuse-tumbleweed"); +      availableOs.add("ubuntu"); +      model.addAttribute("availableOs", availableOs); +      model.addAttribute("osChoice", new String()); +       +              return("portal");  	} @@ -104,6 +118,30 @@ public class WebApplication {  		return("redirect:/portal");  	} +	@PostMapping("/frontend/container/add") +	public static String addContainer(@PathVariable String osChoice, HttpServletRequest request, Model model) { +	     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")); +	      +	     model.addAttribute("osChoice", osChoice); +	      +	      +	     System.out.printf("New container with OS %s requested by %s (%s)", osChoice, userid, username); +	      +	     Random rand = new Random(); +	     Integer randomInt = rand.nextInt(9999999-1111); +	     Integer count = randomInt; +	      +	     //Docker.buildImage(username, osChoice, count); +	      +	      +	     return("redirect:/portal"); +	} +	  	@GetMapping(path = "/logout")  	public String logout(HttpServletRequest request) throws ServletException {  	  request.logout(); diff --git a/src/main/resources/templates/portal.html b/src/main/resources/templates/portal.html index 9947bde..eb3c765 100644 --- a/src/main/resources/templates/portal.html +++ b/src/main/resources/templates/portal.html @@ -8,14 +8,30 @@  			Hello, <span th:text="${username}"></span>.  		</h1>  		<div th:if="${attribute01 != null}" th:text="${attribute01}"></div> -		<h2>Docker Images:</h2> +		<h2>Available Docker Images:</h2>  		<table>  		<tr th:each="image: ${docker_images}" th:if="${image.repoTags[0] != '<none>:<none>'}">  			<td th:text="${image.repoTags[0]}" />  			<td th:text="${image.created}" />  		</tr>  		</table> -		<h2>Docker Containers:</h2>     	 +		 +		<h2>Generate new throw-away shell:</h2> +			<select th:field="*{availableOs}" class="form-control" id="osChoice" name="osChoice"> +			    <option value="">Select operating system ...</option> +			    <option  +			        th:each="osoption : ${availableOs}"  +			        th:value="${osoption}"  +			        th:text="${osoption}"></option>		 +			</select> +			<form th:object="${osChoice}" 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('os') + ' - please be patient after you confirm, as the generation may take a short while.');"> +			<button class="btn btn-primary" id="request_submission" type="submit">Generate</button> +			</form> +		 +		 +		 +		 +		<h2>Existing Containers:</h2>     	  		<table>  		<tr th:each="container: ${docker_containers}">  		    <td th:text="${container.names[0]}" /> @@ -44,27 +60,9 @@  		</tr>  		</table>		 -		 -		<!--h4>We are currently running <span th:text="${docker_containercount}"></span> containers.</h4--> -		 -		<!--table class="table table-striped"> -			<thead> -				<tr> -					<th>ID</th> -					<th>Name</th> -					<th>Address</th> -					<th>Service Rendered</th> -				</tr> -			</thead> -			<tbody> -				<tr th:each="customer : ${customers}"> -					<td th:text="${customer.id}">Text ...</td> -					<td th:text="${customer.name}">Text ...</td> -					<td th:text="${customer.address}">Text ...</td> -					<td th:text="${customer.serviceRendered}">Text...</td> -				</tr> -			</tbody> -		</table--> + + +  		<!--div id="pagefoot" th:include="layout :: footerFragment">Footer</div-->  		<p></p>  		<a href="/logout">Logout</a> | 
