harbr 0.1.15 → 0.1.16

Sign up to get free protection for your applications and to get access to all the features.
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"