Skip to content

Commit 25a237d

Browse files
committed
Rename 'container' to 'service'; roll versions
1 parent b324216 commit 25a237d

7 files changed

Lines changed: 60 additions & 40 deletions

File tree

app/assets/javascripts/problems.coffee

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ setup_hooks = ->
77
if !document.getElementById('new_hint')
88
return
99

10+
$(document).on 'confirm:complete', (evt, answer) ->
11+
if evt.target.value == "Start VM" && answer
12+
evt.target.value = "Starting..."
13+
1014
$('.filter').keyup ->
1115
rex = new RegExp($(this).val(), 'i')
1216
$('.searchable tr').hide()

app/controllers/problems_controller.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,12 +163,12 @@ def start_stack
163163
challenge["user_id"] = current_user.id
164164
challenge["problem_id"] = @problem.id
165165
challenge["network"] = @problem.network
166-
challenge["containers"] = @problem.stack
166+
challenge["services"] = @problem.stack
167167
challenge["lifespan"] = lifespan.to_s
168168

169-
CreateStackJob.perform_later challenge
170169
DestroyStackJob.set(wait: lifespan.minutes)
171170
.perform_later(challenge)
171+
CreateStackJob.perform_now challenge
172172

173173
redirect_to @problem
174174
else

app/jobs/create_stack_job.rb

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ class CreateStackJob < DockerApiJob
55
# user_id
66
# problem_id
77
# network
8-
# containers
8+
# services
99
# lifespan
1010
def perform(challenge)
1111
check_existing(challenge)
@@ -14,16 +14,16 @@ def perform(challenge)
1414

1515
private
1616
def check_existing(challenge)
17-
containers = docker_get_containers(challenge)
17+
services = docker_get_services(challenge)
1818
networks = docker_get_networks(challenge)
1919

2020
# If this user already has a stack initiated, reset it
21-
if networks.length > 0 or containers.length > 0
21+
if networks.length > 0 or services.length > 0
2222
user_id = challenge['user_id']
2323
User.find(user_id).update_attribute(:container_id, '')
2424
User.find(user_id).update_attribute(:stack_expiry, DateTime.now)
2525
User.find(user_id).update_attribute(:problem_id, -1)
26-
delete_stack(containers, networks)
26+
delete_stack(services, networks)
2727
end
2828
end
2929

@@ -34,7 +34,8 @@ def create_stack(challenge)
3434
network['Labels'] = {
3535
"user_id" => "#{challenge['user_id']}",
3636
"problem_id" => "#{challenge['problem_id']}",
37-
"lifetime" => "#{challenge['lifespan']}"
37+
"lifetime" => "#{challenge['lifespan']}",
38+
"hackthearch" => "This network was generated by HackTheArch"
3839
}
3940
res = docker_post_request('/networks/create', network.to_json)
4041
network_id = JSON(res.body)["Id"]
@@ -43,43 +44,44 @@ def create_stack(challenge)
4344
raise Exception.new("Couldn't create challenge network.")
4445
end
4546

46-
# Then build containers
47-
containers = JSON(challenge['containers'])
48-
containers.each do |container|
47+
# Then build services
48+
services = JSON(challenge['services'])
49+
services.each do |service|
4950

50-
if container['Labels'].nil?
51-
container['Labels'] = {}
51+
if service['Labels'].nil?
52+
service['Labels'] = {}
5253
end
5354

54-
container['Labels']["user_id"] = "#{challenge['user_id']}"
55-
container['Labels']["problem_id"] = "#{challenge['problem_id']}"
56-
container['Labels']["lifetime"] = "#{challenge['lifespan']}"
55+
service['Labels']["user_id"] = "#{challenge['user_id']}"
56+
service['Labels']["problem_id"] = "#{challenge['problem_id']}"
57+
service['Labels']["lifetime"] = "#{challenge['lifespan']}"
58+
service['Labels']["hackthearch"] = "This service was generated by HackTheArch"
5759

58-
# Make sure the container is reachable by its designed name
59-
container['Networks'] = [{
60+
# Make sure the service is reachable by its designed name
61+
service['Networks'] = [{
6062
"Target": network_id,
6163
"Aliases": [
62-
container['Name'],
63-
container['Name'].gsub("-","."),
64+
service['Name'],
65+
service['Name'].gsub("-","."),
6466
]
6567
}]
6668

6769
# find entrypoint
6870
is_entry = false
69-
if container['Name'].downcase == "entrypoint"
71+
if service['Name'].downcase == "entrypoint"
7072
is_entry = true
7173
end
7274

73-
# Add user_id to container name for identification
74-
container_name = container['Name']
75-
container['Name'] = "hta-#{container_name}-#{challenge['user_id']}"
75+
# Add user_id to service name for identification
76+
service_name = service['Name']
77+
service['Name'] = "hta-#{service_name}-#{challenge['user_id']}"
7678

77-
res = docker_post_request('/services/create', container.to_json)
79+
res = docker_post_request('/services/create', service.to_json)
7880
if res.code != '201'
79-
raise Exception.new("Couldn't create challenge containers.")
81+
raise Exception.new("Couldn't create challenge services.")
8082
end
8183

82-
# If container is entry point, assign to user
84+
# If service is entry point, assign to user
8385
if is_entry
8486
id = JSON(res.body)["ID"]
8587
User.find(challenge['user_id']).update_attribute(:container_id, id)

app/jobs/destroy_stack_job.rb

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,26 @@ class DestroyStackJob < DockerApiJob
22
queue_as :default
33

44
def perform(challenge)
5-
containers = docker_get_containers(challenge)
5+
services = docker_get_services(challenge)
66
networks = docker_get_networks(challenge)
77

88
# If stack hasn't exceeded its lifetime, then it probably has it's own
99
# delayed job to clean it up
10-
if get_age(containers.first) > challenge['lifespan'].to_f
10+
if get_age(services.first) > challenge['lifespan'].to_f
1111

1212
user_id = challenge['user_id']
1313
User.find(user_id).update_attribute(:container_id, '')
1414
User.find(user_id).update_attribute(:stack_expiry, DateTime.now)
1515
User.find(user_id).update_attribute(:problem_id, -1)
16-
delete_stack(containers, networks)
16+
delete_stack(services, networks)
1717

1818
end
1919
end
2020

2121
private
22-
def get_age(container)
23-
if container
24-
((Time.now() - Time.parse(container['CreatedAt'])) / 60) + 10
22+
def get_age(service)
23+
if service
24+
((Time.now() - Time.parse(service['CreatedAt'])) / 60) + 10
2525
else
2626
return Float::INFINITY
2727
end

app/jobs/docker_api_job.rb

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,22 @@ class DockerApiJob < ApplicationJob
77
@@socket_path = "/var/run/docker.sock"
88

99
protected
10-
# Returns array of containers for assessment
11-
def docker_get_containers(assessment)
10+
# Get all services
11+
def docker_get_hta_services()
12+
filter = Hash.new(0)
13+
filter['label'] = ["hackthearch"]
14+
query = URI.encode_www_form('filters' => filter.to_json)
15+
16+
res = docker_get_request("/services?#{query}")
17+
18+
if res.code == '200'
19+
return JSON(res.body)
20+
end
21+
raise Exception.new("HTTP #{res.code} communicating with Docker!")
22+
end
23+
24+
# Returns array of services for assessment
25+
def docker_get_services(assessment)
1226
filter = Hash.new(0)
1327
filter['label'] = ["user_id=#{assessment['user_id']}"]
1428
query = URI.encode_www_form('filters' => filter.to_json)
@@ -35,9 +49,9 @@ def docker_get_networks(assessment)
3549
raise Exception.new("HTTP #{res.code} communicating with Docker!")
3650
end
3751

38-
def delete_stack(containers, networks)
52+
def delete_stack(services, networks)
3953

40-
containers.each do |service|
54+
services.each do |service|
4155
docker_delete_service(service['ID'])
4256
end
4357

@@ -85,7 +99,7 @@ def docker_post_request(path, params)
8599
end
86100

87101
# If auth token exists, use it:
88-
auth = "/run/secrets/registry_auth"
102+
auth = "/run/secrets/REGISTRY_AUTH"
89103
if File.exist?(auth) || File.symlink?(auth)
90104
request["X-Registry-Auth"] = Base64.encode64(File.read(auth, 'r'))
91105
end

app/views/problems/_problem.html.erb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
<% if swarm_services_enabled? && !(@problem.stack.nil? || @problem.stack.empty?) %>
2020
<%= content_tag :span, class: 'pull-right' do %>
2121
<% if (current_user.problem_id == @problem.id && @active_stack) %>
22-
<%= content_tag(:h4, "Challenge Activated ", style: "display:inline") %>
22+
<%= content_tag(:h4, "Challenge Activated", style: "display:inline;padding-right:10px") %>
2323
<% if @problem.vnc %>
2424
<%= link_to "VNC", nil, id: "vnc_link", class: "btn btn-primary", disabled: :true, target: "_blank" %>
2525
<% end %>

docker-bake.hcl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ target "web" {
1010
driver = "docker-container"
1111
tags = ["docker.io/paullj1/hackthearch:latest",
1212
"docker.io/paullj1/hackthearch:2.4" ,
13-
"docker.io/paullj1/hackthearch:2.4.0" ]
13+
"docker.io/paullj1/hackthearch:2.4.1" ]
1414
platforms = ["linux/amd64", "linux/arm64", "linux/arm/v6", "linux/arm/v7"]
1515
}
1616

@@ -20,7 +20,7 @@ target "webconsole" {
2020
output = ["type=registry"]
2121
driver = "docker-container"
2222
tags = ["docker.io/paullj1/webconsole:latest",
23-
"docker.io/paullj1/webconsole:1.0.1"]
23+
"docker.io/paullj1/webconsole:1.1.0"]
2424
platforms = ["linux/amd64", "linux/arm64"]
2525
}
2626

0 commit comments

Comments
 (0)