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.
@@ -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