Shell expiry logic
Signed-off-by: Georg Pfuetzenreuter <mail@georg-pfuetzenreuter.net>
This commit is contained in:
parent
8e1aae70fc
commit
dfa58b2cb5
3
.gitignore
vendored
3
.gitignore
vendored
@ -31,3 +31,6 @@ build/
|
|||||||
|
|
||||||
### VS Code ###
|
### VS Code ###
|
||||||
.vscode/
|
.vscode/
|
||||||
|
|
||||||
|
### Vim ###
|
||||||
|
.metals/
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package net.libertacasa.pubsh.web;
|
package net.libertacasa.pubsh.web;
|
||||||
|
|
||||||
import java.time.Duration;
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
|
|
||||||
import org.springframework.boot.CommandLineRunner;
|
import org.springframework.boot.CommandLineRunner;
|
||||||
@ -10,20 +9,32 @@ import org.springframework.context.annotation.Configuration;
|
|||||||
import com.github.kagkarlsson.scheduler.Scheduler;
|
import com.github.kagkarlsson.scheduler.Scheduler;
|
||||||
import com.github.kagkarlsson.scheduler.task.Task;
|
import com.github.kagkarlsson.scheduler.task.Task;
|
||||||
import com.github.kagkarlsson.scheduler.task.helper.Tasks;
|
import com.github.kagkarlsson.scheduler.task.helper.Tasks;
|
||||||
import static com.github.kagkarlsson.scheduler.task.schedule.Schedules.fixedDelay;
|
//import static com.github.kagkarlsson.scheduler.task.schedule.Schedules.fixedDelay;
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
public class SchedulerBean {
|
public class SchedulerBean {
|
||||||
|
|
||||||
@Bean
|
// @Bean
|
||||||
Task<Void> recurringSampleTask(CounterService counter) {
|
// Task<Void> recurringSampleTask(CounterService counter) {
|
||||||
return Tasks
|
// return Tasks
|
||||||
.recurring("recurring-sample-task", fixedDelay(Duration.ofMinutes(1)))
|
// .recurring("recurring-sample-task", fixedDelay(Duration.ofMinutes(1)))
|
||||||
.execute((instance, ctx) -> {
|
// .execute((instance, ctx) -> {
|
||||||
System.out.printf("Recurring testing task. Instance: %s, ctx: %s\n", instance, ctx);
|
// System.out.printf("Recurring testing task. Instance: %s, ctx: %s\n", instance, ctx);
|
||||||
CounterService.increase();
|
// CounterService.increase();
|
||||||
});
|
// });
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public static Task<Void> shellRemovalTask() {
|
||||||
|
|
||||||
|
return Tasks.oneTime("shell-removal")
|
||||||
|
.execute((instance, ctx) -> {
|
||||||
|
System.out.printf("Running container removal task - Instance: %s, ctx: %s\n", instance, ctx);
|
||||||
|
String username = instance.getId().split("&")[0];
|
||||||
|
String containerid = instance.getId().split("&")[1];
|
||||||
|
Docker.deleteShell(username, containerid);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
Task<Void> sampleOneTimeTask() {
|
Task<Void> sampleOneTimeTask() {
|
||||||
@ -33,6 +44,7 @@ public class SchedulerBean {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// keeping this as a quick way to check if the scheduler booted up after an application restart
|
||||||
@Bean
|
@Bean
|
||||||
CommandLineRunner executeOnStartup(Scheduler scheduler, Task<Void> sampleOneTimeTask) {
|
CommandLineRunner executeOnStartup(Scheduler scheduler, Task<Void> sampleOneTimeTask) {
|
||||||
System.out.println("Scheduling one-shot testing task to execute now.");
|
System.out.println("Scheduling one-shot testing task to execute now.");
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package net.libertacasa.pubsh.web;
|
package net.libertacasa.pubsh.web;
|
||||||
|
|
||||||
import java.security.Principal;
|
import java.security.Principal;
|
||||||
|
import java.time.Instant;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -13,6 +14,7 @@ import org.keycloak.adapters.KeycloakDeployment;
|
|||||||
import org.keycloak.adapters.RefreshableKeycloakSecurityContext;
|
import org.keycloak.adapters.RefreshableKeycloakSecurityContext;
|
||||||
import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken;
|
import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken;
|
||||||
import org.keycloak.representations.IDToken;
|
import org.keycloak.representations.IDToken;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.boot.SpringApplication;
|
import org.springframework.boot.SpringApplication;
|
||||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
import org.springframework.http.MediaType;
|
import org.springframework.http.MediaType;
|
||||||
@ -28,10 +30,19 @@ import org.springframework.web.bind.annotation.RequestBody;
|
|||||||
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
|
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
|
||||||
import com.github.dockerjava.api.model.Container;
|
import com.github.dockerjava.api.model.Container;
|
||||||
import com.github.dockerjava.api.model.Image;
|
import com.github.dockerjava.api.model.Image;
|
||||||
|
import com.github.kagkarlsson.scheduler.Scheduler;
|
||||||
|
|
||||||
@SpringBootApplication
|
@SpringBootApplication
|
||||||
@Controller
|
@Controller
|
||||||
public class WebApplication {
|
public class WebApplication {
|
||||||
|
|
||||||
|
//private final CounterService counter;
|
||||||
|
private static Scheduler scheduler;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public void Scheduler(Scheduler scheduler) {
|
||||||
|
WebApplication.scheduler = scheduler;
|
||||||
|
}
|
||||||
|
|
||||||
static ArrayList<String> availableOs = new ArrayList<String>();
|
static ArrayList<String> availableOs = new ArrayList<String>();
|
||||||
|
|
||||||
@ -228,15 +239,18 @@ public class WebApplication {
|
|||||||
Map<String, Object> customClaims = token.getOtherClaims();
|
Map<String, Object> customClaims = token.getOtherClaims();
|
||||||
username = String.valueOf(customClaims.get("username"));
|
username = String.valueOf(customClaims.get("username"));
|
||||||
String os = (String) body.getFirst("osChoice");
|
String os = (String) body.getFirst("osChoice");
|
||||||
|
Integer expiry = (Integer) Integer.parseInt(body.getFirst("expiry"));
|
||||||
|
|
||||||
System.out.printf("New shell with OS %s requested by %s (%s)\n", os, userid, username);
|
System.out.printf("New shell with OS %s requested by %s (%s)\n", os, userid, username);
|
||||||
|
|
||||||
Random rand = new Random();
|
Random rand = new Random();
|
||||||
Integer randomInt = rand.nextInt(9999999-1111);
|
Integer randomInt = rand.nextInt(9999999-1111);
|
||||||
Integer count = randomInt;
|
Integer count = randomInt;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
String containerid = Docker.createShell(username, os, count);
|
String containerid = Docker.createShell(username, os, count);
|
||||||
|
String instanceid = username + "&" + containerid;
|
||||||
|
scheduler.schedule(SchedulerBean.shellRemovalTask().instance(instanceid), Instant.now().plusSeconds(expiry));
|
||||||
String returnmessage = "Success - spawned shell " + username + "_" + os + "_" + count + " - internal ID: " + containerid;
|
String returnmessage = "Success - spawned shell " + username + "_" + os + "_" + count + " - internal ID: " + containerid;
|
||||||
redirectAttributes.addFlashAttribute("message", returnmessage);
|
redirectAttributes.addFlashAttribute("message", returnmessage);
|
||||||
} catch (Exception exception) {
|
} catch (Exception exception) {
|
||||||
@ -244,6 +258,7 @@ public class WebApplication {
|
|||||||
String returnmessage = "Error - failed to build image :-(";
|
String returnmessage = "Error - failed to build image :-(";
|
||||||
redirectAttributes.addFlashAttribute("message", returnmessage);
|
redirectAttributes.addFlashAttribute("message", returnmessage);
|
||||||
System.out.println(exception);
|
System.out.println(exception);
|
||||||
|
//exception.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
return("redirect:/portal");
|
return("redirect:/portal");
|
||||||
|
@ -18,6 +18,11 @@
|
|||||||
th:attr="value=${osoption}"
|
th:attr="value=${osoption}"
|
||||||
th:text="${osoption}"></option>
|
th:text="${osoption}"></option>
|
||||||
</select>
|
</select>
|
||||||
|
<select class="form-control" th:object="${expiry}" name="expiry">
|
||||||
|
<option value="">Select expiry ...</option>
|
||||||
|
<option th:value="5" th:attr="value=5" th:text="5"></option>
|
||||||
|
<option th:value="10" th:attr="value=10" th:text="10"></option>
|
||||||
|
</select>
|
||||||
<button class="btn btn-primary" th:id="request_submission" th:type="submit">Generate</button>
|
<button class="btn btn-primary" th:id="request_submission" th:type="submit">Generate</button>
|
||||||
</form>
|
</form>
|
||||||
<div th:if="${attribute01 != null}" th:text="${attribute01}"></div>
|
<div th:if="${attribute01 != null}" th:text="${attribute01}"></div>
|
||||||
|
Loading…
Reference in New Issue
Block a user