harbr 0.1.14 → 0.1.16

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b6403e6f31e693d85891c96c75d6d388db414b2043f6e1e54448e21979e53324
4
- data.tar.gz: 30f7b53039791666793e383cdb79b3744d8017cb04ff82e44ff9c49947fb3fb0
3
+ metadata.gz: c3b7fa88e79e3aacebe05805dffd35ddb90b46208cbf11dfc75c14ab0e9be2ed
4
+ data.tar.gz: fe47d47fcb32a979fd13727fe99b87def6b7a2fe5cfd262c5b22ff4305ac6700
5
5
  SHA512:
6
- metadata.gz: b0bd8ca385781dcf3b36094f731de874a031e00eabbf97af7e4b220ad40b1f1324e2e789643fbf1ef48467ff52cb7f982b9a25892c53297a19b2905e5227080d
7
- data.tar.gz: 2e0ff891cb6e26fbcb3f97f902da8f769752d6c7c67e683af9118e1eb47688b16516de5150bf6fe20c37a1724e321413f83058d473d77b749d7baaae44f73802
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
- config["http"]["routers"]["#{name}-router"] = {
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" => "letsencrypt" # Specify the certificate resolver for TLS
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
@@ -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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Harbr
4
- VERSION = "0.1.14"
4
+ VERSION = "0.1.16"
5
5
  end
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.14
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-17 00:00:00.000000000 Z
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"