diff options
author | maride <maride@darknebu.la> | 2018-08-21 18:49:59 +0200 |
---|---|---|
committer | maride <maride@darknebu.la> | 2018-08-21 18:49:59 +0200 |
commit | 07294af77f4b088f67efafbeee79e7ddd0eeac84 (patch) | |
tree | 161c510ef65f1051deda57679ba9d3ca404d046e /src/container.go | |
parent | f35350d2691007a1b52c3b1e16794ec74702cd0d (diff) |
Feature: Start and stop challenge containers
Diffstat (limited to 'src/container.go')
-rw-r--r-- | src/container.go | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/src/container.go b/src/container.go new file mode 100644 index 0000000..73912bf --- /dev/null +++ b/src/container.go @@ -0,0 +1,70 @@ +package main + +import ( + "context" + "github.com/docker/docker/client" + "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types" + "fmt" + "time" +) + +type ChallengeContainer struct { + Challenge *Challenge + ContainerID string + IP string +} + +var ( + dockerCtx context.Context + dockerCli *client.Client +) + +// Starts the container and returns its address and containerID if successful +func (cc ChallengeContainer) startContainer() (address string, containerID string, err error) { + // Set up our context if there is none already set up + if dockerCtx == nil { + dockerCtx = context.Background() + } + + // Set up our Docker CLI connection if there is not already one + if dockerCli == nil { + dockerCli, err = client.NewEnvClient() + + if err != nil { + return "", "", err + } + } + + // Create container + resp, err := dockerCli.ContainerCreate(dockerCtx, &container.Config{ + Image: cc.Challenge.Container, + Env: []string{fmt.Sprintf("FLAG=%s", cc.Challenge.Flag)}, + Tty: false, + }, nil, nil, "") + + if err != nil { + return "", "", err + } + + // Start container + err = dockerCli.ContainerStart(dockerCtx, resp.ID, types.ContainerStartOptions{}) + if err != nil { + return "", "", err + } + + // Get IP Address of that container + inspectJSON, err := dockerCli.ContainerInspect(dockerCtx, resp.ID) + if err != nil { + return "", "", err + } + + // Return IP, Container ID and error + return inspectJSON.NetworkSettings.IPAddress, resp.ID,nil +} + +// Stops the container with a timeout of one second +func (cc ChallengeContainer) stopContainer() { + timeout := time.Second + dockerCli.ContainerStop(dockerCtx, cc.ContainerID, &timeout) +} |