harbr 0.1.15 → 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.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/! +177 -0
  3. data/lib/harbr/job.rb +6 -4
  4. data/lib/harbr/version.rb +1 -1
  5. metadata +3 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3f345eaf0f70c89329590f16bf4a5519b3d01cc40c7e7479b330cc1ac037116d
4
- data.tar.gz: fdc6aa3f3b6dcea219b2b9994c7329220cd1f90e50a5393d3871acf2ccf5d328
3
+ metadata.gz: c3b7fa88e79e3aacebe05805dffd35ddb90b46208cbf11dfc75c14ab0e9be2ed
4
+ data.tar.gz: fe47d47fcb32a979fd13727fe99b87def6b7a2fe5cfd262c5b22ff4305ac6700
5
5
  SHA512:
6
- metadata.gz: d2520c4d357f925991f5efd6ddcc281139eaa2df976627ee6885209898b22252e863fb186b1e092d89c6fdea2f866918c985171eeef3c23787977e01b0cffe96
7
- data.tar.gz: ae5a64396191a2dd97924a79a55e5d9aa5843904b3639ecfa57e256e85ca5dac5be05a7f32336886546a08b64e3b9bd1acf263f672e5690152636d618b465a71
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/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
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.15"
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.15
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"