pomelo-citrus-admin 0.0.1
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 +7 -0
- data/README.md +20 -0
- data/Rakefile +0 -0
- data/citrus-admin.gemspec +34 -0
- data/lib/citrus-admin.rb +21 -0
- data/lib/citrus-admin/client/client.rb +142 -0
- data/lib/citrus-admin/console_service.rb +374 -0
- data/lib/citrus-admin/master_agent.rb +607 -0
- data/lib/citrus-admin/modules/console_module.rb +35 -0
- data/lib/citrus-admin/modules/monitor_log.rb +45 -0
- data/lib/citrus-admin/modules/process_info.rb +45 -0
- data/lib/citrus-admin/modules/system_info.rb +45 -0
- data/lib/citrus-admin/modules/watch_server.rb +45 -0
- data/lib/citrus-admin/monitor_agent.rb +166 -0
- data/lib/citrus-admin/util/protocol.rb +83 -0
- data/lib/citrus-admin/util/utils.rb +63 -0
- data/lib/citrus-admin/version.rb +7 -0
- data/spec/agent_spec.rb +424 -0
- data/spec/console_service_spec.rb +246 -0
- data/spec/spec_helper.rb +18 -0
- metadata +178 -0
@@ -0,0 +1,35 @@
|
|
1
|
+
# Author:: MinixLi (gmail: MinixLi1986)
|
2
|
+
# Homepage:: http://citrus.inspawn.com
|
3
|
+
# Date:: 21 July 2014
|
4
|
+
|
5
|
+
module CitrusAdmin
|
6
|
+
# ConsoleModules
|
7
|
+
#
|
8
|
+
#
|
9
|
+
module ConsoleModules
|
10
|
+
# ConsoleModule
|
11
|
+
#
|
12
|
+
#
|
13
|
+
class ConsoleModule
|
14
|
+
#
|
15
|
+
#
|
16
|
+
#
|
17
|
+
def self.inherited subclass
|
18
|
+
class << subclass
|
19
|
+
attr_reader :module_id
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
attr_reader :type, :delay, :interval
|
24
|
+
|
25
|
+
#
|
26
|
+
#
|
27
|
+
#
|
28
|
+
def initialize
|
29
|
+
@type = ''
|
30
|
+
@delay = 0
|
31
|
+
@interval = 0
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# Author:: MinixLi (gmail: MinixLi1986)
|
2
|
+
# Homepage:: http://citrus.inspawn.com
|
3
|
+
# Date:: 19 July 2014
|
4
|
+
|
5
|
+
require 'citrus-admin/modules/console_module'
|
6
|
+
|
7
|
+
module CitrusAdmin
|
8
|
+
# ConsoleModules
|
9
|
+
#
|
10
|
+
#
|
11
|
+
module ConsoleModules
|
12
|
+
# MonitorLog
|
13
|
+
#
|
14
|
+
#
|
15
|
+
class MonitorLog < ConsoleModule
|
16
|
+
|
17
|
+
@module_id = 'monitor_log'
|
18
|
+
|
19
|
+
#
|
20
|
+
#
|
21
|
+
# @param [Hash] args
|
22
|
+
# @param [Object] console_service
|
23
|
+
def initialize args={}, console_service
|
24
|
+
end
|
25
|
+
|
26
|
+
# Monitor handler
|
27
|
+
#
|
28
|
+
#
|
29
|
+
def monitor_handler
|
30
|
+
end
|
31
|
+
|
32
|
+
# Master handler
|
33
|
+
#
|
34
|
+
#
|
35
|
+
def master_handler
|
36
|
+
end
|
37
|
+
|
38
|
+
# Client handler
|
39
|
+
#
|
40
|
+
#
|
41
|
+
def client_handler
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# Author:: MinixLi (gmail: MinixLi1986)
|
2
|
+
# Homepage:: http://citrus.inspawn.com
|
3
|
+
# Date:: 19 July 2014
|
4
|
+
|
5
|
+
require 'citrus-admin/modules/console_module'
|
6
|
+
|
7
|
+
module CitrusAdmin
|
8
|
+
# ConsoleModules
|
9
|
+
#
|
10
|
+
#
|
11
|
+
module ConsoleModules
|
12
|
+
# ProcessInfo
|
13
|
+
#
|
14
|
+
#
|
15
|
+
class ProcessInfo < ConsoleModule
|
16
|
+
|
17
|
+
@module_id = 'process_info'
|
18
|
+
|
19
|
+
#
|
20
|
+
#
|
21
|
+
# @param [Hash] args
|
22
|
+
# @param [Object] console_service
|
23
|
+
def initialize args={}, console_service
|
24
|
+
end
|
25
|
+
|
26
|
+
# Monitor handler
|
27
|
+
#
|
28
|
+
#
|
29
|
+
def monitor_handler
|
30
|
+
end
|
31
|
+
|
32
|
+
# Master handler
|
33
|
+
#
|
34
|
+
#
|
35
|
+
def master_handler
|
36
|
+
end
|
37
|
+
|
38
|
+
# Client handler
|
39
|
+
#
|
40
|
+
#
|
41
|
+
def client_handler
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# Author:: MinixLi (gmail: MinixLi1986)
|
2
|
+
# Homepage:: http://citrus.inspawn.com
|
3
|
+
# Date:: 19 July 2014
|
4
|
+
|
5
|
+
require 'citrus-admin/modules/console_module'
|
6
|
+
|
7
|
+
module CitrusAdmin
|
8
|
+
# ConsoleModules
|
9
|
+
#
|
10
|
+
#
|
11
|
+
module ConsoleModules
|
12
|
+
# SystemInfo
|
13
|
+
#
|
14
|
+
#
|
15
|
+
class SystemInfo < ConsoleModule
|
16
|
+
|
17
|
+
@module_id = 'system_info'
|
18
|
+
|
19
|
+
#
|
20
|
+
#
|
21
|
+
# @param [Hash] args
|
22
|
+
# @param [Object] console_service
|
23
|
+
def initialize args={}, console_service
|
24
|
+
end
|
25
|
+
|
26
|
+
# Monitor handler
|
27
|
+
#
|
28
|
+
#
|
29
|
+
def monitor_handler
|
30
|
+
end
|
31
|
+
|
32
|
+
# Master handler
|
33
|
+
#
|
34
|
+
#
|
35
|
+
def master_handler
|
36
|
+
end
|
37
|
+
|
38
|
+
# Client handler
|
39
|
+
#
|
40
|
+
#
|
41
|
+
def client_handler
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# Author:: MinixLi (gmail: MinixLi1986)
|
2
|
+
# Homepage:: http://citrus.inspawn.com
|
3
|
+
# Date:: 8 July 2014
|
4
|
+
|
5
|
+
require 'citrus-admin/modules/console_module'
|
6
|
+
|
7
|
+
module CitrusAdmin
|
8
|
+
# ConsoleModules
|
9
|
+
#
|
10
|
+
#
|
11
|
+
module ConsoleModules
|
12
|
+
# WatchServer
|
13
|
+
#
|
14
|
+
#
|
15
|
+
class WatchServer < ConsoleModule
|
16
|
+
|
17
|
+
@module_id = 'watch_server'
|
18
|
+
|
19
|
+
#
|
20
|
+
#
|
21
|
+
# @param [Hash] args
|
22
|
+
# @param [Object] console_service
|
23
|
+
def initialize args={}, console_service
|
24
|
+
end
|
25
|
+
|
26
|
+
# Monitor handler
|
27
|
+
#
|
28
|
+
#
|
29
|
+
def monitor_handler
|
30
|
+
end
|
31
|
+
|
32
|
+
# Master handler
|
33
|
+
#
|
34
|
+
#
|
35
|
+
def master_handler
|
36
|
+
end
|
37
|
+
|
38
|
+
# Client handler
|
39
|
+
#
|
40
|
+
#
|
41
|
+
def client_handler
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,166 @@
|
|
1
|
+
# Author:: MinixLi (gmail: MinixLi1986)
|
2
|
+
# Homepage:: http://citrus.inspawn.com
|
3
|
+
# Date:: 9 July 2014
|
4
|
+
|
5
|
+
module CitrusAdmin
|
6
|
+
# MonitorAgent
|
7
|
+
#
|
8
|
+
#
|
9
|
+
class MonitorAgent
|
10
|
+
include Protocol
|
11
|
+
include Utils::EventEmitter
|
12
|
+
|
13
|
+
# Create a new monitor agent
|
14
|
+
#
|
15
|
+
# @param [Hash] args Options
|
16
|
+
#
|
17
|
+
# @option args [Object] :console_service
|
18
|
+
# @option args [String] :server_id
|
19
|
+
# @option args [String] :server_type
|
20
|
+
# @option args [Object] :server_info
|
21
|
+
def initialize args={}
|
22
|
+
@console_service = args[:console_service]
|
23
|
+
@server_id = args[:server_id]
|
24
|
+
@server_type = args[:server_type]
|
25
|
+
@server_info = args[:server_info]
|
26
|
+
@req_id = 1
|
27
|
+
@callbacks = {}
|
28
|
+
@state = :state_inited
|
29
|
+
end
|
30
|
+
|
31
|
+
# Register and connect to master server
|
32
|
+
#
|
33
|
+
# @param [Integer] port
|
34
|
+
# @param [String] host
|
35
|
+
def connect port, host, &block
|
36
|
+
if @state != :state_inited
|
37
|
+
return
|
38
|
+
end
|
39
|
+
begin
|
40
|
+
@ws = WebSocket::EventMachine::Client.connect :uri => 'ws://' + host + ':' + port.to_s
|
41
|
+
@ws.onopen {
|
42
|
+
@state = :state_connected
|
43
|
+
event = 'register'
|
44
|
+
msg = {
|
45
|
+
:type => 'monitor',
|
46
|
+
:server_id => @server_id,
|
47
|
+
:server_type => @server_type,
|
48
|
+
:server_info => @server_info,
|
49
|
+
:pid => Process.pid
|
50
|
+
}
|
51
|
+
@console_service.auth_server.call(msg, @console_service.env) { |token|
|
52
|
+
msg[:token] = token
|
53
|
+
@ws.send [event, msg].to_json
|
54
|
+
}
|
55
|
+
}
|
56
|
+
@ws.onmessage { |msg, type|
|
57
|
+
begin
|
58
|
+
event, msg = parse msg
|
59
|
+
case event
|
60
|
+
when 'register'
|
61
|
+
process_register_msg msg, &block
|
62
|
+
when 'monitor'
|
63
|
+
process_monitor_msg msg
|
64
|
+
else
|
65
|
+
end
|
66
|
+
rescue => err
|
67
|
+
end
|
68
|
+
}
|
69
|
+
@ws.onclose { |code, reason|
|
70
|
+
@state = :state_closed
|
71
|
+
emit 'close'
|
72
|
+
}
|
73
|
+
@ws.onerror { |err|
|
74
|
+
if @state == :state_inited
|
75
|
+
block_given? and yield err
|
76
|
+
else
|
77
|
+
emit 'error', err
|
78
|
+
end
|
79
|
+
}
|
80
|
+
rescue => err
|
81
|
+
block_given? and yield err
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# Close the monitor agent
|
86
|
+
def close
|
87
|
+
return if @state == :state_closed
|
88
|
+
@state = :state_closed
|
89
|
+
@ws.close
|
90
|
+
end
|
91
|
+
|
92
|
+
# Request master server with callback
|
93
|
+
#
|
94
|
+
# @param [String] module_id
|
95
|
+
# @param [Object] msg
|
96
|
+
def request module_id, msg, block
|
97
|
+
if @state != :state_registered
|
98
|
+
return
|
99
|
+
end
|
100
|
+
req_id = @req_id
|
101
|
+
@req_id += 1
|
102
|
+
@callbacks[req_id] = block
|
103
|
+
@ws.send ['monitor', compose_request(req_id, module_id, msg)].to_json
|
104
|
+
end
|
105
|
+
|
106
|
+
# Notify master server without callback
|
107
|
+
#
|
108
|
+
# @param [String] module_id
|
109
|
+
# @param [Object] msg
|
110
|
+
def notify module_id, msg
|
111
|
+
if @state != :state_registered
|
112
|
+
return
|
113
|
+
end
|
114
|
+
@ws.send ['monitor', compose_request(nil, module_id, msg)].to_json
|
115
|
+
end
|
116
|
+
|
117
|
+
private
|
118
|
+
|
119
|
+
# Process register message
|
120
|
+
#
|
121
|
+
# @param [Object] msg
|
122
|
+
#
|
123
|
+
# @private
|
124
|
+
def process_register_msg msg, &block
|
125
|
+
if msg && msg[:code] == PRO_OK
|
126
|
+
@state = :state_registered
|
127
|
+
block_given? and yield
|
128
|
+
else
|
129
|
+
emit 'close'
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
# Process monitor message
|
134
|
+
#
|
135
|
+
# @param [Object] msg
|
136
|
+
#
|
137
|
+
# @private
|
138
|
+
def process_monitor_msg msg, &block
|
139
|
+
return unless @state == :state_registered
|
140
|
+
if msg[:command]
|
141
|
+
# command from master server
|
142
|
+
@console_service.command(msg[:command], msg[:module_id], msg[:body]) { |err, res|
|
143
|
+
# notify should not have a callback
|
144
|
+
}
|
145
|
+
else
|
146
|
+
if resp_id = msg[:resp_id]
|
147
|
+
# response from master server
|
148
|
+
if !callback = @callbacks[resp_id]
|
149
|
+
return
|
150
|
+
end
|
151
|
+
@callbacks.delete resp_id
|
152
|
+
callback.call msg[:err], msg[:body]
|
153
|
+
return
|
154
|
+
end
|
155
|
+
# request from master server
|
156
|
+
@console_service.execute(msg[:module_id], 'monitor_handler', msg[:body]) { |err, res|
|
157
|
+
if is_request? msg
|
158
|
+
@ws.send ['monitor', compose_response(msg, err, res)].to_json
|
159
|
+
else
|
160
|
+
# notify should not have a callback
|
161
|
+
end
|
162
|
+
}
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
# Author:: MinixLi (gmail: MinixLi1986)
|
2
|
+
# Homepage:: http://citrus.inspawn.com
|
3
|
+
# Date:: 9 July 2014
|
4
|
+
|
5
|
+
module CitrusAdmin
|
6
|
+
# Protocol
|
7
|
+
#
|
8
|
+
#
|
9
|
+
module Protocol
|
10
|
+
#
|
11
|
+
#
|
12
|
+
#
|
13
|
+
PRO_OK = 1
|
14
|
+
PRO_FAIL = -1
|
15
|
+
|
16
|
+
# Componse request
|
17
|
+
#
|
18
|
+
# @param [Integer] req_id
|
19
|
+
# @param [String] module_id
|
20
|
+
# @param [Object] body
|
21
|
+
def compose_request req_id, module_id, body
|
22
|
+
if req_id
|
23
|
+
# request message
|
24
|
+
{ :req_id => req_id, :module_id => module_id, :body => body }
|
25
|
+
else
|
26
|
+
# notify message
|
27
|
+
{ :module_id => module_id, :body => body }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# Compose response
|
32
|
+
#
|
33
|
+
# @param [Object] msg
|
34
|
+
# @param [Object] err
|
35
|
+
# @param [Object] res
|
36
|
+
def compose_response msg, err, res
|
37
|
+
return nil unless msg[:req_id]
|
38
|
+
{ :resp_id => msg[:req_id], :err => clone_error(err), :body => res }
|
39
|
+
end
|
40
|
+
|
41
|
+
# Compose command
|
42
|
+
#
|
43
|
+
# @param [Integer] req_id
|
44
|
+
# @param [String] command
|
45
|
+
# @param [String] module_id
|
46
|
+
# @param [Object] body
|
47
|
+
def compose_command req_id, command, module_id, body
|
48
|
+
if req_id
|
49
|
+
# command message
|
50
|
+
{ :req_id => req_id, :command => command, :module_id => module_id, :body => body }
|
51
|
+
else
|
52
|
+
{ :command => command, :module_id => module_id, :body => body }
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# Parse message
|
57
|
+
#
|
58
|
+
# @param [String] msg
|
59
|
+
def parse msg
|
60
|
+
begin
|
61
|
+
JSON.parse msg, { :symbolize_names => true }
|
62
|
+
rescue => err
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# Determine if a message is a request
|
67
|
+
#
|
68
|
+
# @param [Object] msg
|
69
|
+
def is_request? msg
|
70
|
+
msg && msg[:req_id]
|
71
|
+
end
|
72
|
+
|
73
|
+
# Clone error
|
74
|
+
#
|
75
|
+
# @private
|
76
|
+
def clone_error origin
|
77
|
+
if origin.is_a? Exception
|
78
|
+
return { :msg => origin.message, :stack => nil }
|
79
|
+
end
|
80
|
+
return origin
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|