harbr 0.1.14 → 0.1.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/! +177 -0
- data/exe/harbr +0 -2
- data/lib/harbr/job.rb +6 -4
- data/lib/harbr/next/job.rb +5 -1
- data/lib/harbr/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c3b7fa88e79e3aacebe05805dffd35ddb90b46208cbf11dfc75c14ab0e9be2ed
|
4
|
+
data.tar.gz: fe47d47fcb32a979fd13727fe99b87def6b7a2fe5cfd262c5b22ff4305ac6700
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 051e22a069c3685557e2728447488e19594526f8abd32ccf67525a383bcd85b9b7fefc6a50a1c031a63d8a2b9cea20c11014079ff9ee13d2ffdc810082915c19
|
7
|
+
data.tar.gz: b5da151591c407020b096dd9c4cdaa089e3f05d3db511f3aae72a5f90ddf44078b3adab3c6a9096d909ed3cefe14b7550cf38ab4f508d89e6f86f265f8012b3d
|
data/!
ADDED
@@ -0,0 +1,177 @@
|
|
1
|
+
require 'harbr'
|
2
|
+
module Harbr
|
3
|
+
class Job
|
4
|
+
include SuckerPunch::Job
|
5
|
+
|
6
|
+
def highest_numbered_directory(path)
|
7
|
+
directories = Dir.glob("#{path}/*").select { |entry| File.directory?(entry) }
|
8
|
+
directories.max_by { |entry| entry[/\d+/].to_i }
|
9
|
+
end
|
10
|
+
|
11
|
+
def get_container_name(path)
|
12
|
+
File.basename(path)
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
def create_traefik_config(containers)
|
17
|
+
config = {
|
18
|
+
"http" => {
|
19
|
+
"routers" => {
|
20
|
+
"traefik-dashboard" => {
|
21
|
+
"rule" => "Host(`traefik.harbr.zero2one.ee`)",
|
22
|
+
"service" => "api@internal",
|
23
|
+
"tls" => {} # Enable TLS for the dashboard
|
24
|
+
}
|
25
|
+
},
|
26
|
+
"services" => {}
|
27
|
+
}
|
28
|
+
}
|
29
|
+
|
30
|
+
containers.each do |container|
|
31
|
+
container.ip = "127.0.0.1"
|
32
|
+
name = container.name.gsub(".", "-")
|
33
|
+
|
34
|
+
# Create the router with TLS enabled
|
35
|
+
config["http"]["routers"]["#{name}-router"] = {
|
36
|
+
"rule" => "Host(`#{container.host_header}`)",
|
37
|
+
"service" => "#{name}-service",
|
38
|
+
"tls" => {
|
39
|
+
"certResolver" => "letsencrypt" # Specify the certificate resolver for TLS
|
40
|
+
}
|
41
|
+
}
|
42
|
+
|
43
|
+
# Create the service
|
44
|
+
config["http"]["services"]["#{name}-service"] = {
|
45
|
+
"loadBalancer" => {
|
46
|
+
"servers" => [{"url" => "http://#{container.ip}:#{container.port}"}]
|
47
|
+
}
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
File.write("/etc/traefik/harbr.toml", TomlRB.dump(config))
|
53
|
+
puts "Traefik configuration written to /etc/traefik/harbr.toml"
|
54
|
+
end
|
55
|
+
|
56
|
+
def collate_containers(name,host,port)
|
57
|
+
|
58
|
+
containers = Harbr::Container::Repository.new
|
59
|
+
container = containers.find_by_header(host)
|
60
|
+
|
61
|
+
if container.nil?
|
62
|
+
container = Harbr::Container.new
|
63
|
+
container.name = name
|
64
|
+
container.host_header =host
|
65
|
+
container.ip = "127.0.0.1"
|
66
|
+
container.port = port
|
67
|
+
containers.create(container)
|
68
|
+
else
|
69
|
+
container.port = port
|
70
|
+
containers.update(container)
|
71
|
+
end
|
72
|
+
containers.all
|
73
|
+
end
|
74
|
+
|
75
|
+
|
76
|
+
module Runit
|
77
|
+
|
78
|
+
class Run
|
79
|
+
def initialize(container, port)
|
80
|
+
@container_name = container
|
81
|
+
@port = port
|
82
|
+
end
|
83
|
+
|
84
|
+
def to_s
|
85
|
+
script_template = <<~SCRIPT
|
86
|
+
#!/bin/sh
|
87
|
+
exec 2>&1
|
88
|
+
cd /var/harbr/containers/#{@container_name}/current
|
89
|
+
exec ./exe/run #{@port} live
|
90
|
+
SCRIPT
|
91
|
+
end
|
92
|
+
|
93
|
+
def link
|
94
|
+
"ln -s /etc/sv/harbr/#{@container_name} /etc/service/#{@container_name}"
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
|
99
|
+
class Finish
|
100
|
+
def initialize(port)
|
101
|
+
@port = port
|
102
|
+
end
|
103
|
+
|
104
|
+
def to_s
|
105
|
+
script_template = <<~SCRIPT
|
106
|
+
#!/bin/sh
|
107
|
+
sleep 3
|
108
|
+
`lsof -i :#{@port} | awk 'NR!=1 {print $2}' | xargs kill`
|
109
|
+
SCRIPT
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
class Log
|
114
|
+
def initialize(container)
|
115
|
+
@container_name = container
|
116
|
+
end
|
117
|
+
|
118
|
+
def to_s
|
119
|
+
script_template = <<~SCRIPT
|
120
|
+
#!/bin/sh
|
121
|
+
exec svlogd -tt /var/log/harbr/#{@container_name}
|
122
|
+
SCRIPT
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
128
|
+
|
129
|
+
def write_to_file(path, contents)
|
130
|
+
File.open(path, 'w') do |file|
|
131
|
+
file.write(contents)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def load_manifest(container, version)
|
136
|
+
manifest_path = "/var/harbr/containers/#{container}/versions/#{version}/config/manifest.yml"
|
137
|
+
raise "Manifest not found at #{manifest_path}" unless File.exist?(manifest_path)
|
138
|
+
manifest_data = YAML.load_file(manifest_path)
|
139
|
+
OpenStruct.new(manifest_data)
|
140
|
+
end
|
141
|
+
|
142
|
+
def perform(name,version)
|
143
|
+
|
144
|
+
Dir.chdir "/var/harbr/containers/#{name}/versions/#{version}" do
|
145
|
+
|
146
|
+
`bundle config set --local path 'vendor/bundle'`
|
147
|
+
manifest = load_manifest(name, version)
|
148
|
+
port = `port assign #{manifest.port}`.strip
|
149
|
+
system "sv stop #{name}" if File.exist?("/etc/service/#{name}")
|
150
|
+
system 'bundle install'
|
151
|
+
|
152
|
+
|
153
|
+
`mkdir -p /etc/sv/harbr/#{name}`
|
154
|
+
`mkdir -p /etc/sv/harbr/#{name}/log`
|
155
|
+
`mkdir -p /var/log/harbr/#{name}`
|
156
|
+
|
157
|
+
write_to_file "/etc/sv/harbr/#{name}/run", Runit::Run.new(name, port).to_s
|
158
|
+
write_to_file "/etc/sv/harbr/#{name}/finish", Runit::Finish.new(port).to_s
|
159
|
+
write_to_file "/etc/sv/harbr/#{name}/log/run", Runit::Log.new(name).to_s
|
160
|
+
|
161
|
+
`chmod +x /etc/sv/harbr/#{name}/run`
|
162
|
+
`chmod +x /etc/sv/harbr/#{name}/log/run`
|
163
|
+
`chmod +x /etc/sv/harbr/#{name}/finish`
|
164
|
+
|
165
|
+
system "ln -sf /var/harbr/containers/#{name}/versions/#{version} /var/harbr/containers/#{name}/current"
|
166
|
+
system "ln -sf /etc/sv/harbr/#{name} /etc/service/#{name}"
|
167
|
+
|
168
|
+
containers = collate_containers(name, manifest.host, port)
|
169
|
+
create_traefik_config(containers)
|
170
|
+
puts "process #{version} of #{name}"
|
171
|
+
end
|
172
|
+
|
173
|
+
end
|
174
|
+
|
175
|
+
end
|
176
|
+
|
177
|
+
end
|
data/exe/harbr
CHANGED
@@ -193,8 +193,6 @@ desc "peek CONTAINER", "Peek in a given container"
|
|
193
193
|
/(?<next>. * -> (?<path>.*))/.match(`ls -l /var/harbr/containers/#{name}/next`)
|
194
194
|
`rm -r current`
|
195
195
|
`ln -sf #{$2} current`
|
196
|
-
`rsync -av /var/dddr/#{name}/live /var/dddr/#{name}/next`
|
197
|
-
puts "sync live data to next"
|
198
196
|
`sv restart #{name}`
|
199
197
|
end
|
200
198
|
end
|
data/lib/harbr/job.rb
CHANGED
@@ -31,12 +31,14 @@ module Harbr
|
|
31
31
|
container.ip = "127.0.0.1"
|
32
32
|
name = container.name.gsub(".", "-")
|
33
33
|
|
34
|
-
# Create the router with TLS enabled
|
35
|
-
|
34
|
+
# Create the router with TLS enabled and specific format
|
35
|
+
router_key = "#{name}-router-secure"
|
36
|
+
config["http"]["routers"][router_key] = {
|
36
37
|
"rule" => "Host(`#{container.host_header}`)",
|
37
38
|
"service" => "#{name}-service",
|
39
|
+
"entryPoints" => ["https"],
|
38
40
|
"tls" => {
|
39
|
-
"certResolver" => "
|
41
|
+
"certResolver" => "myresolver" # Use a custom certificate resolver
|
40
42
|
}
|
41
43
|
}
|
42
44
|
|
@@ -48,7 +50,7 @@ module Harbr
|
|
48
50
|
}
|
49
51
|
end
|
50
52
|
|
51
|
-
|
53
|
+
# Write the configuration to a TOML file
|
52
54
|
File.write("/etc/traefik/harbr.toml", TomlRB.dump(config))
|
53
55
|
puts "Traefik configuration written to /etc/traefik/harbr.toml"
|
54
56
|
end
|
data/lib/harbr/next/job.rb
CHANGED
@@ -51,7 +51,7 @@ module Harbr
|
|
51
51
|
end
|
52
52
|
|
53
53
|
puts config
|
54
|
-
|
54
|
+
|
55
55
|
File.write("/etc/traefik/harbr.toml", TomlRB.dump(config))
|
56
56
|
puts "Traefik configuration written to /etc/traefik/harbr.toml"
|
57
57
|
|
@@ -206,6 +206,10 @@ module Harbr
|
|
206
206
|
|
207
207
|
system "ln -sf /var/harbr/containers/#{name}/versions/#{version} /var/harbr/containers/#{name}/next"
|
208
208
|
system "ln -sf /etc/sv/harbr/#{name}/next /etc/service/next.#{name}"
|
209
|
+
|
210
|
+
`rsync -av /var/dddr/#{name}/live /var/dddr/#{name}/next`
|
211
|
+
puts "sync live data to next"
|
212
|
+
|
209
213
|
system "sv restart next.#{name}"
|
210
214
|
end
|
211
215
|
|
data/lib/harbr/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: harbr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.16
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Delaney Kuldvee Burke
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-12-
|
11
|
+
date: 2023-12-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: listen
|
@@ -118,6 +118,7 @@ executables:
|
|
118
118
|
extensions: []
|
119
119
|
extra_rdoc_files: []
|
120
120
|
files:
|
121
|
+
- "!"
|
121
122
|
- ".data/development/Harbr::Port.dir"
|
122
123
|
- ".data/development/Harbr::Port.pag"
|
123
124
|
- ".rspec"
|