mkit 0.6.2 → 0.7.0

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.
@@ -1,20 +1,38 @@
1
1
  require 'pty'
2
2
  require 'mkit/status'
3
+ require "mkit/cmd/shell_client"
3
4
 
4
5
  #
5
6
  # https://docs.docker.com/engine/reference/commandline/events
6
7
  require 'mkit/app/helpers/docker_helper'
7
8
  module MKIt
9
+ class StopThread < RuntimeError; end
10
+
8
11
  class DockerListener
9
12
  include MKIt::DockerHelper
10
13
 
11
14
  def initialize
12
- @consumers = []
15
+ @queue = Queue.new
16
+ @listener = ShellClient.new(command: "docker events --format '{{json .}}'")
13
17
  end
14
18
 
15
- def register_consumer(consumer:)
19
+ def enqueue(msg)
20
+ @queue << msg
16
21
  end
17
22
 
23
+ def start
24
+ @consumer.run if register_consumer
25
+ register_listener
26
+ end
27
+
28
+ def stop
29
+ @listener.unregister if @listener
30
+ @consumer.raise StopThread.new
31
+ MKItLogger.info("docker listener stopped")
32
+ end
33
+
34
+ private
35
+
18
36
  def parse_message(msg)
19
37
  action = msg['Action'].to_sym
20
38
  type = msg['Type'].to_sym
@@ -45,15 +63,17 @@ module MKIt
45
63
  MKItLogger.debug(" #{type} #{action} <<TODO>>")
46
64
  end
47
65
  else
48
- MKItLogger.warn("docker <<#{type}>> <#{action}> received: #{msg}. But I don't know anything about pod #{pod_id}")
66
+ MKItLogger.warn("docker <<#{type}>> <#{action}> received: #{msg}. But I don't know anything about pod #{pod_id}/#{pod_name}")
49
67
  end
50
68
  when :network
51
69
  pod_id = msg.Actor.Attributes.container
52
- pod = Pod.find_by(pod_id: pod_id)
70
+ inspect = inspect_instance(pod_id).to_o
71
+ pod_name = inspect.Name[1..]
72
+ pod = Pod.find_by(name: pod_name)
53
73
  unless pod.nil?
54
74
  case action
55
75
  when :connect
56
- MKItLogger.info("docker network #{action} received: #{msg}")
76
+ MKItLogger.info("docker network #{action} received: #{msg} for pod #{pod_name}")
57
77
  pod.update_ip
58
78
  pod.save
59
79
  when :disconnect
@@ -62,35 +82,36 @@ module MKIt
62
82
  MKItLogger.debug(" #{type} #{action} <<TODO>>")
63
83
  end
64
84
  else
65
- MKItLogger.warn("docker <<#{type}>> <#{action}> received: #{msg}. But I don't know anything about pod #{pod_id}")
85
+ MKItLogger.warn("docker <<#{type}>> <#{action}> received: #{msg}. But I don't know anything about pod #{pod_id}/#{pod_name}")
66
86
  end
67
87
  else
68
88
  MKItLogger.info("\t#{type} #{action} <<unknown>>")
69
89
  end
70
90
  end
71
91
 
72
- def start
73
- @thread ||= Thread.new {
74
- cmd = "docker events --format '{{json .}}'"
75
- begin
76
- PTY.spawn( cmd ) do |stdout, stdin, pid|
77
- begin
78
- stdout.each { |line| parse_message JSON.parse(line).to_o }
79
- rescue Errno::EIO
80
- MKItLogger.warn("Errno:EIO error, but this probably just means " +
81
- "that the process has finished giving output")
82
- end
92
+ def register_consumer
93
+ return false unless @consumer.nil?
94
+
95
+ @consumer = Thread.new do
96
+ running = true
97
+ while running
98
+ begin
99
+ parse_message(@queue.pop)
100
+ rescue StopThread
101
+ running = false
102
+ MKItLogger.info("docker consumer ended")
103
+ rescue => e
104
+ MKItLogger.error("error while consuming docker notification: #{e}", e.message, e.backtrace.join("\n"))
83
105
  end
84
- rescue PTY::ChildExited
85
- MKItLogger.warn("docker event listener process exited!")
86
106
  end
87
- }
88
- @thread.run
89
- MKItLogger.info("docker listener started")
107
+ end
108
+ true
90
109
  end
91
- def stop
92
- @thread.exit if @thread
93
- MKItLogger.info("docker listener stopped")
110
+
111
+ def register_listener
112
+ @listener.register do |stdout, stdin, pid|
113
+ stdout.each { |line| enqueue JSON.parse(line).to_o }
114
+ end
94
115
  end
95
116
  end
96
117
  end
@@ -0,0 +1,29 @@
1
+ require "mkit/cmd/shell_client"
2
+
3
+ module MKIt
4
+ class DockerLogListener < MKIt::ShellClient
5
+
6
+ def initialize(pod, ws, options: {})
7
+ @pod = pod
8
+ @ws = ws
9
+ command = "docker logs"
10
+ command += " -f" if options[:follow] == 'true'
11
+ command += " -n #{options[:nr_lines]}" if options[:nr_lines]
12
+ command += " #{@pod.name}"
13
+ super(command: command)
14
+ end
15
+
16
+ def register
17
+ super do |stdout, stdin, pid|
18
+ stdout.each {
19
+ |line| @ws.send(line.strip!)
20
+ }
21
+ end
22
+ end
23
+
24
+ def close
25
+ @ws.close_websocket unless @ws.nil?
26
+ end
27
+ end
28
+ end
29
+
data/lib/mkit/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module MKIt
2
- VERSION = "0.6.2"
2
+ VERSION = "0.7.0"
3
3
  end
4
4
 
data/lib/mkit.rb CHANGED
@@ -9,6 +9,7 @@ require 'ostruct'
9
9
  require 'timeout'
10
10
  require 'net/http'
11
11
  require 'sinatra/base'
12
+ require 'sinatra-websocket'
12
13
  require 'mkit/config/environment'
13
14
  require 'mkit/app/mkit_server'
14
15
  require 'mkit/config/load_default_configs'
data/mkit.gemspec CHANGED
@@ -32,8 +32,9 @@ Gem::Specification.new do |s|
32
32
  s.add_runtime_dependency 'rubydns', '~> 2.0', '>= 2.0.2'
33
33
  s.add_runtime_dependency 'sinatra', '~> 3.0', '>= 3.0.5'
34
34
  s.add_runtime_dependency 'sinatra-activerecord', '~> 2.0', '>= 2.0.26'
35
+ s.add_runtime_dependency 'sinatra-websocket', '~> 0.3', '>= 0.3.1'
35
36
  s.add_runtime_dependency 'sqlite3', '~> 1.5', '>= 1.5.4'
36
- s.add_runtime_dependency 'standalone_migrations', '~> 7.1', '>= 7.1.0'
37
+ s.add_runtime_dependency 'standalone_migrations', '~> 7.1', '< 7.2.0'
37
38
  s.add_runtime_dependency 'thin', '~> 1.8', '>= 1.8.1'
38
39
  s.add_runtime_dependency 'text-table', '~> 1.2', '>= 1.2.4'
39
40
  end
@@ -11,6 +11,6 @@ service:
11
11
  MINIO_ACCESS_KEY: minio
12
12
  MINIO_SECRET_KEY: minio123
13
13
  volumes:
14
- #- docker://minio_data:/data
15
- - /tmp/minio_data:/data
14
+ - docker://minio_data:/data
15
+ #- /tmp/minio_data:/data
16
16
 
@@ -0,0 +1,32 @@
1
+ service:
2
+ name: soketi
3
+ image: quay.io/soketi/soketi:0.17-16-alpine
4
+ # image: giovannedev/soketi:latest
5
+ ports:
6
+ #- 80:6001:http:round_robin
7
+ - 6001:6001:tcp:round_robin
8
+ - 6002:6001:tcp:round_robin:ssl
9
+ - 9601:9601:tcp:round_robin
10
+ resources:
11
+ max_replicas: 1
12
+ min_replicas: 1
13
+ environment:
14
+ SOKETI_PORT: 6001
15
+ SOKETI_METRICS_SERVER_PORT: 9601
16
+ SOKETI_DEBUG: 1
17
+ SOKETI_MODE: full
18
+ SOKETI_APP_ID: app-id
19
+ SOKETI_APP_KEY: app-key
20
+ SOKETI_APP_SECRET: app-secret
21
+ # PUSHER_HOST: 127.0.0.1
22
+ # PUSHER_PORT: 6001
23
+ # PUSHER_SCHEME: http # or https
24
+ SOKETI_PORT: 6001
25
+ SOKETI_SCHEME: http # or https
26
+ METRICS_SERVER_PORT: 9601
27
+ SOKETI_DEFAULT_APP_ENABLED: true
28
+ SOKETI_DEFAULT_APP_ENABLE_CLIENT_MESSAGES: true
29
+ DEFAULT_APP_ENABLE_CLIENT_MESSAGES: true
30
+ #SOKETI_DB_REDIS_HOST: redis
31
+ #SOKETI_DB_REDIS_PORT: 6379
32
+ #SOKETI_DB_REDIS_PASSWORD: password
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mkit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vasco Santos
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-03-08 00:00:00.000000000 Z
11
+ date: 2024-12-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: async-dns
@@ -230,6 +230,26 @@ dependencies:
230
230
  - - ">="
231
231
  - !ruby/object:Gem::Version
232
232
  version: 2.0.26
233
+ - !ruby/object:Gem::Dependency
234
+ name: sinatra-websocket
235
+ requirement: !ruby/object:Gem::Requirement
236
+ requirements:
237
+ - - "~>"
238
+ - !ruby/object:Gem::Version
239
+ version: '0.3'
240
+ - - ">="
241
+ - !ruby/object:Gem::Version
242
+ version: 0.3.1
243
+ type: :runtime
244
+ prerelease: false
245
+ version_requirements: !ruby/object:Gem::Requirement
246
+ requirements:
247
+ - - "~>"
248
+ - !ruby/object:Gem::Version
249
+ version: '0.3'
250
+ - - ">="
251
+ - !ruby/object:Gem::Version
252
+ version: 0.3.1
233
253
  - !ruby/object:Gem::Dependency
234
254
  name: sqlite3
235
255
  requirement: !ruby/object:Gem::Requirement
@@ -257,9 +277,9 @@ dependencies:
257
277
  - - "~>"
258
278
  - !ruby/object:Gem::Version
259
279
  version: '7.1'
260
- - - ">="
280
+ - - "<"
261
281
  - !ruby/object:Gem::Version
262
- version: 7.1.0
282
+ version: 7.2.0
263
283
  type: :runtime
264
284
  prerelease: false
265
285
  version_requirements: !ruby/object:Gem::Requirement
@@ -267,9 +287,9 @@ dependencies:
267
287
  - - "~>"
268
288
  - !ruby/object:Gem::Version
269
289
  version: '7.1'
270
- - - ">="
290
+ - - "<"
271
291
  - !ruby/object:Gem::Version
272
- version: 7.1.0
292
+ version: 7.2.0
273
293
  - !ruby/object:Gem::Dependency
274
294
  name: thin
275
295
  requirement: !ruby/object:Gem::Requirement
@@ -323,7 +343,6 @@ files:
323
343
  - ".github/workflows/publish.yml"
324
344
  - ".rubocop.yml"
325
345
  - Gemfile
326
- - Gemfile.lock
327
346
  - LICENSE
328
347
  - README.md
329
348
  - Rakefile
@@ -361,6 +380,12 @@ files:
361
380
  - lib/mkit/app/templates/docker/docker_run.sh.erb
362
381
  - lib/mkit/app/templates/haproxy/0000_defaults.cfg
363
382
  - lib/mkit/app/templates/haproxy/xapp_haproxy.cfg.erb
383
+ - lib/mkit/client/command_parser.rb
384
+ - lib/mkit/client/commands.yaml
385
+ - lib/mkit/client/http_client.rb
386
+ - lib/mkit/client/mkitd_client.rb
387
+ - lib/mkit/client/websocket_client.rb
388
+ - lib/mkit/cmd/shell_client.rb
364
389
  - lib/mkit/cmd_runner.rb
365
390
  - lib/mkit/config/config.rb
366
391
  - lib/mkit/config/environment.rb
@@ -370,6 +395,7 @@ files:
370
395
  - lib/mkit/config/the_config.yml
371
396
  - lib/mkit/ctypes.rb
372
397
  - lib/mkit/docker_listener.rb
398
+ - lib/mkit/docker_log_listener.rb
373
399
  - lib/mkit/exceptions.rb
374
400
  - lib/mkit/job_manager.rb
375
401
  - lib/mkit/mkit_dns.rb
@@ -401,6 +427,7 @@ files:
401
427
  - samples/apps/redis.yml
402
428
  - samples/daemontools/log/run
403
429
  - samples/daemontools/run
430
+ - samples/soketi.yaml
404
431
  - samples/systemd/mkitd.service
405
432
  homepage: https://github.com/valexsantos/mkit
406
433
  licenses:
data/Gemfile.lock DELETED
@@ -1,140 +0,0 @@
1
- GEM
2
- remote: https://rubygems.org/
3
- specs:
4
- actionpack (7.0.8)
5
- actionview (= 7.0.8)
6
- activesupport (= 7.0.8)
7
- rack (~> 2.0, >= 2.2.4)
8
- rack-test (>= 0.6.3)
9
- rails-dom-testing (~> 2.0)
10
- rails-html-sanitizer (~> 1.0, >= 1.2.0)
11
- actionview (7.0.8)
12
- activesupport (= 7.0.8)
13
- builder (~> 3.1)
14
- erubi (~> 1.4)
15
- rails-dom-testing (~> 2.0)
16
- rails-html-sanitizer (~> 1.1, >= 1.2.0)
17
- activemodel (7.0.8)
18
- activesupport (= 7.0.8)
19
- activerecord (7.0.8)
20
- activemodel (= 7.0.8)
21
- activesupport (= 7.0.8)
22
- activesupport (7.0.8)
23
- concurrent-ruby (~> 1.0, >= 1.0.2)
24
- i18n (>= 1.6, < 2)
25
- minitest (>= 5.1)
26
- tzinfo (~> 2.0)
27
- async (1.31.0)
28
- console (~> 1.10)
29
- nio4r (~> 2.3)
30
- timers (~> 4.1)
31
- async-dns (1.3.0)
32
- async-io (~> 1.15)
33
- async-io (1.38.0)
34
- async
35
- builder (3.2.4)
36
- coderay (1.1.3)
37
- concurrent-ruby (1.2.2)
38
- console (1.23.2)
39
- fiber-annotation
40
- fiber-local
41
- crass (1.0.6)
42
- daemons (1.4.1)
43
- dry-container (0.11.0)
44
- concurrent-ruby (~> 1.0)
45
- erubi (1.12.0)
46
- eventmachine (1.2.7)
47
- fiber-annotation (0.2.0)
48
- fiber-local (1.0.0)
49
- i18n (1.14.1)
50
- concurrent-ruby (~> 1.0)
51
- loofah (2.21.4)
52
- crass (~> 1.0.2)
53
- nokogiri (>= 1.12.0)
54
- method_source (1.0.0)
55
- minitest (5.20.0)
56
- mustermann (3.0.0)
57
- ruby2_keywords (~> 0.0.1)
58
- net-ping (2.0.8)
59
- net_http_unix (0.2.2)
60
- nio4r (2.7.0)
61
- nokogiri (1.15.4-x86_64-darwin)
62
- racc (~> 1.4)
63
- nokogiri (1.15.4-x86_64-linux)
64
- racc (~> 1.4)
65
- pry (0.14.2)
66
- coderay (~> 1.1)
67
- method_source (~> 1.0)
68
- racc (1.7.3)
69
- rack (2.2.8)
70
- rack-protection (3.1.0)
71
- rack (~> 2.2, >= 2.2.4)
72
- rack-test (2.1.0)
73
- rack (>= 1.3)
74
- rails-dom-testing (2.2.0)
75
- activesupport (>= 5.0.0)
76
- minitest
77
- nokogiri (>= 1.6)
78
- rails-html-sanitizer (1.6.0)
79
- loofah (~> 2.21)
80
- nokogiri (~> 1.14)
81
- railties (7.0.8)
82
- actionpack (= 7.0.8)
83
- activesupport (= 7.0.8)
84
- method_source
85
- rake (>= 12.2)
86
- thor (~> 1.0)
87
- zeitwerk (~> 2.5)
88
- rake (13.1.0)
89
- ruby2_keywords (0.0.5)
90
- rubydns (2.0.2)
91
- async-dns (~> 1.0)
92
- sinatra (3.1.0)
93
- mustermann (~> 3.0)
94
- rack (~> 2.2, >= 2.2.4)
95
- rack-protection (= 3.1.0)
96
- tilt (~> 2.0)
97
- sinatra-activerecord (2.0.27)
98
- activerecord (>= 4.1)
99
- sinatra (>= 1.0)
100
- sqlite3 (1.6.8-x86_64-darwin)
101
- sqlite3 (1.6.8-x86_64-linux)
102
- standalone_migrations (7.1.2)
103
- activerecord (>= 6.0.0, < 7.1.0)
104
- nokogiri (~> 1.14)
105
- railties (>= 6.0.0, < 7.1.0)
106
- rake (>= 10.0)
107
- text-table (1.2.4)
108
- thin (1.8.2)
109
- daemons (~> 1.0, >= 1.0.9)
110
- eventmachine (~> 1.0, >= 1.0.4)
111
- rack (>= 1, < 3)
112
- thor (1.3.0)
113
- tilt (2.3.0)
114
- timers (4.3.5)
115
- tzinfo (2.0.6)
116
- concurrent-ruby (~> 1.0)
117
- zeitwerk (2.6.12)
118
-
119
- PLATFORMS
120
- x86_64-darwin-22
121
- x86_64-linux
122
-
123
- DEPENDENCIES
124
- async-dns
125
- dry-container
126
- net-ping
127
- net_http_unix
128
- pry
129
- rack (>= 2.0.6)
130
- rake
131
- rubydns
132
- sinatra
133
- sinatra-activerecord
134
- sqlite3
135
- standalone_migrations
136
- text-table
137
- thin
138
-
139
- BUNDLED WITH
140
- 2.4.10