adminix 0.1.23 → 0.1.24
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/adminix.gemspec +1 -1
- data/lib/adminix/service.rb +3 -3
- data/lib/adminix/version.rb +1 -1
- data/lib/adminix/watcher.rb +28 -74
- data/lib/adminix.rb +0 -1
- metadata +4 -5
- data/lib/adminix/websocket_client.rb +0 -90
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 323d686c0df911e68419b1d4a094d07517fc1728
|
4
|
+
data.tar.gz: b0b3a2c75899feceaa21a2e2cab960475293edbf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '061087a77def56a10ad4f6c47284d609da99a36783ab271a57e3f488176470ef170dee6ff14f2faf05b5444d37b7f09034c7f132cc3dcdf571e36862a766005a'
|
7
|
+
data.tar.gz: 8c803731f17b32992c68714e9675e5611c5d7df6a2e149faf6375add59a8281e455af6f8f2170ab66cb61d08b8af8335e35b391a4dbb7ee883e2e42ac33845ee
|
data/adminix.gemspec
CHANGED
@@ -31,7 +31,7 @@ Gem::Specification.new do |spec|
|
|
31
31
|
spec.require_paths = ["lib"]
|
32
32
|
|
33
33
|
spec.add_dependency "eventmachine", "1.2.3"
|
34
|
-
spec.add_dependency "
|
34
|
+
spec.add_dependency "action_cable_client", "2.0.0"
|
35
35
|
spec.add_dependency "sinatra", "1.4.8"
|
36
36
|
|
37
37
|
spec.add_development_dependency "bundler", "~> 1.14"
|
data/lib/adminix/service.rb
CHANGED
@@ -24,7 +24,7 @@ module Adminix
|
|
24
24
|
}
|
25
25
|
end
|
26
26
|
|
27
|
-
def sync(
|
27
|
+
def sync(ws_client, data)
|
28
28
|
@process_id = data['process_id']
|
29
29
|
config.commands = data['commands'] || []
|
30
30
|
|
@@ -32,7 +32,7 @@ module Adminix
|
|
32
32
|
commands_queue.each do |q|
|
33
33
|
if q['status'] != 'processed'
|
34
34
|
res = execute_command(q['command_key'], q['process_id'], q['args'] || {})
|
35
|
-
|
35
|
+
ws_client.perform(:task_completed, res)
|
36
36
|
end
|
37
37
|
end
|
38
38
|
end
|
@@ -60,7 +60,7 @@ module Adminix
|
|
60
60
|
end
|
61
61
|
|
62
62
|
def fetch_options
|
63
|
-
uri = URI.parse("#{config.host}/v1/services/#{id}/options")
|
63
|
+
uri = URI.parse("#{config.host}/api/v1/services/#{id}/options")
|
64
64
|
request = Net::HTTP::Get.new(uri)
|
65
65
|
request["Authorization"] = "Bearer #{config.secret_key}"
|
66
66
|
|
data/lib/adminix/version.rb
CHANGED
data/lib/adminix/watcher.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require "eventmachine"
|
2
|
-
require "
|
2
|
+
require "action_cable_client"
|
3
3
|
|
4
4
|
module Adminix
|
5
5
|
class Watcher
|
@@ -9,51 +9,51 @@ module Adminix
|
|
9
9
|
if options[:stop_daemon]
|
10
10
|
watcher.stop
|
11
11
|
else
|
12
|
-
|
13
|
-
watcher.start
|
14
|
-
else
|
15
|
-
watcher.run!
|
16
|
-
end
|
12
|
+
options[:daemonize] ? watcher.start : watcher.run!
|
17
13
|
end
|
18
14
|
end
|
19
15
|
|
20
16
|
SYNC_PERIOD = 5.freeze
|
21
|
-
|
17
|
+
DEFAULT_WEBSOCKET_HOST = 'wss://api.adminix.io/websocket'.freeze
|
22
18
|
SERVICE_CHANNEL = 'ServiceChannel'.freeze
|
23
19
|
|
24
20
|
def initialize(opts)
|
25
|
-
@socket_url = opts[:websocket_host] || ENV['ADMINIX_WEBSOCKET_HOST'] || WEBSOCKET_HOST
|
26
|
-
@socket_url = "#{@socket_url}?secret_key=#{config.secret_key}"
|
27
|
-
@service = Service.instance
|
28
|
-
@client = nil
|
29
21
|
@pid_full = '/tmp/adminix.pid'
|
22
|
+
@service = Service.instance
|
23
|
+
|
24
|
+
@ws_client = nil
|
25
|
+
ws_path = opts[:websocket_host] || ENV['ADMINIX_WEBSOCKET_HOST'] || DEFAULT_WEBSOCKET_HOST
|
26
|
+
@ws_uri = "#{ws_path}?secret_key=#{config.secret_key}"
|
27
|
+
@ws_channel = { channel: 'ServiceChannel', service_id: @service.id }
|
30
28
|
end
|
31
29
|
|
32
30
|
def run!
|
33
31
|
trap_signal
|
34
32
|
|
35
33
|
EventMachine.run do
|
36
|
-
@
|
37
|
-
|
34
|
+
@ws_client = ActionCableClient.new(@ws_uri, @ws_channel)
|
35
|
+
@ws_client.connected do |msg|
|
36
|
+
puts 'Connection established'
|
38
37
|
end
|
39
|
-
|
40
|
-
|
41
|
-
|
38
|
+
@ws_client.disconnected do
|
39
|
+
system.log 'Disconnected. Reconnecting...'
|
40
|
+
sleep(2)
|
41
|
+
@ws_client.connect!
|
42
|
+
end
|
43
|
+
@ws_client.received do |msg|
|
44
|
+
message = msg['message'] || {}
|
45
|
+
case message['type']
|
46
|
+
when 'restart' then @service.restart!
|
47
|
+
when 'sync' then @service.sync(@ws_client, message['data'])
|
48
|
+
end
|
42
49
|
end
|
43
|
-
|
50
|
+
|
44
51
|
EventMachine.add_periodic_timer(SYNC_PERIOD) do
|
45
|
-
|
52
|
+
@ws_client.perform(:sync, @service.to_cable) if @ws_client.subscribed?
|
46
53
|
end
|
47
54
|
end
|
48
55
|
end
|
49
56
|
|
50
|
-
def publish_message(action, data)
|
51
|
-
identifier = { channel: SERVICE_CHANNEL, service_id: @service.id }
|
52
|
-
data = { action: action, data: data }
|
53
|
-
|
54
|
-
@client.publish(identifier, data)
|
55
|
-
end
|
56
|
-
|
57
57
|
def get_pid
|
58
58
|
if File.exists?(@pid_full)
|
59
59
|
file = File.new(@pid_full, "r")
|
@@ -106,61 +106,15 @@ module Adminix
|
|
106
106
|
|
107
107
|
private
|
108
108
|
|
109
|
-
def config
|
110
|
-
Config.instance
|
111
|
-
end
|
112
|
-
|
113
|
-
def system
|
114
|
-
System.instance
|
115
|
-
end
|
116
|
-
|
117
|
-
def on_message_receive(client, message)
|
118
|
-
case message['type']
|
119
|
-
when 'welcome'
|
120
|
-
system.log 'Connected to channel'
|
121
|
-
on_success_connect(client)
|
122
|
-
when 'ping'
|
123
|
-
#system.log 'ping from server'
|
124
|
-
# do something
|
125
|
-
else
|
126
|
-
# do something
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
def on_disconnect(client)
|
131
|
-
system.log 'Disconnected. Reconnecting...'
|
132
|
-
client.connect do |message|
|
133
|
-
system.log message
|
134
|
-
on_message_receive(client, message)
|
135
|
-
end
|
136
|
-
|
137
|
-
#EventMachine.stop_event_loop
|
138
|
-
end
|
139
|
-
|
140
|
-
def on_success_connect(client)
|
141
|
-
client.subscribe(channel: SERVICE_CHANNEL, service_id: @service.id) do |message|
|
142
|
-
type = message['type'] || message['message']['type']
|
143
|
-
data = message['message']['data'] rescue {}
|
144
|
-
on_service_message_receive(type, data)
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
def on_service_message_receive(type, data)
|
149
|
-
case type
|
150
|
-
when 'confirm_subscription'
|
151
|
-
when 'restart'
|
152
|
-
@service.restart!
|
153
|
-
when 'sync'
|
154
|
-
@service.sync(self, data)
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
109
|
def trap_signal
|
159
110
|
Signal.trap("SIGINT") do
|
160
111
|
system.log "Stopping..."
|
161
112
|
EventMachine.stop
|
162
113
|
end
|
163
114
|
end
|
115
|
+
|
116
|
+
def config() Config.instance end
|
117
|
+
def system() System.instance end
|
164
118
|
end
|
165
119
|
end
|
166
120
|
|
data/lib/adminix.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: adminix
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.24
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christian Dyl
|
@@ -25,19 +25,19 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 1.2.3
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: action_cable_client
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - '='
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.
|
33
|
+
version: 2.0.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - '='
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0.
|
40
|
+
version: 2.0.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: sinatra
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -165,7 +165,6 @@ files:
|
|
165
165
|
- lib/adminix/system.rb
|
166
166
|
- lib/adminix/version.rb
|
167
167
|
- lib/adminix/watcher.rb
|
168
|
-
- lib/adminix/websocket_client.rb
|
169
168
|
- views/daemon_scripts/upstart.conf.erb
|
170
169
|
homepage: http://adminix.io
|
171
170
|
licenses:
|
@@ -1,90 +0,0 @@
|
|
1
|
-
require 'json'
|
2
|
-
|
3
|
-
module Adminix
|
4
|
-
class WebsocketClient
|
5
|
-
attr_accessor :client
|
6
|
-
attr_accessor :connected
|
7
|
-
attr_accessor :connection_handler
|
8
|
-
attr_accessor :channel_handlers
|
9
|
-
attr_accessor :disconnect_handler
|
10
|
-
attr_accessor :url
|
11
|
-
|
12
|
-
def initialize(url, &disconnect_handler)
|
13
|
-
self.url = url
|
14
|
-
self.disconnect_handler = disconnect_handler
|
15
|
-
end
|
16
|
-
|
17
|
-
def connect(&block)
|
18
|
-
self.connection_handler = block
|
19
|
-
self.channel_handlers = {}
|
20
|
-
self.client = EventMachine::WebSocketClient.connect(url)
|
21
|
-
client.callback do
|
22
|
-
system.log "Connected WebSocket to #{url}."
|
23
|
-
self.connected = true
|
24
|
-
end
|
25
|
-
client.stream do |raw|
|
26
|
-
message = parse_message(raw.to_s)
|
27
|
-
if message['identifier']
|
28
|
-
channel_handlers[message['identifier'].to_json].call(message)
|
29
|
-
else
|
30
|
-
connection_handler.call(message)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
client.disconnect do
|
34
|
-
self.connected = false
|
35
|
-
disconnect_handler.call
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def subscribe(identifier, &block)
|
40
|
-
push(create_subscribe_message(identifier))
|
41
|
-
channel_handlers[identifier.to_json] = block
|
42
|
-
end
|
43
|
-
|
44
|
-
def push(msg)
|
45
|
-
client.send_msg(msg)
|
46
|
-
end
|
47
|
-
|
48
|
-
def publish(identifier, data)
|
49
|
-
msg = create_publish_message(identifier, data)
|
50
|
-
# puts "PUSHING: #{msg}"
|
51
|
-
push(msg)
|
52
|
-
end
|
53
|
-
|
54
|
-
def create_publish_message(identifier, data)
|
55
|
-
message = {
|
56
|
-
command: 'message',
|
57
|
-
identifier: identifier
|
58
|
-
}
|
59
|
-
message[:data] = data.to_json if data
|
60
|
-
message[:identifier] = message[:identifier].to_json
|
61
|
-
message.to_json
|
62
|
-
end
|
63
|
-
|
64
|
-
def create_subscribe_message(identifier)
|
65
|
-
message = {
|
66
|
-
command: 'subscribe',
|
67
|
-
identifier: identifier.to_json
|
68
|
-
}
|
69
|
-
# message[:identifier].merge!(data) if data
|
70
|
-
# message[:data] = data.to_json if data
|
71
|
-
# message[:identifier] = message[:identifier].to_json
|
72
|
-
# puts message
|
73
|
-
message.to_json
|
74
|
-
end
|
75
|
-
|
76
|
-
def parse_message(message)
|
77
|
-
result = JSON.parse(message)
|
78
|
-
result['identifier'] = JSON.parse(result['identifier']) if result['identifier']
|
79
|
-
result['data'] = JSON.parse(result['data']) if result['data']
|
80
|
-
result
|
81
|
-
end
|
82
|
-
|
83
|
-
private
|
84
|
-
|
85
|
-
def system
|
86
|
-
System.instance
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|