dango 0.0.21 → 0.0.22
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.
- data/Manifest.txt +1 -0
- data/lib/dango/client_framework.rb +1 -1
- data/lib/dango/framework_base.rb +10 -9
- data/lib/dango/monitor/dango_monitor_client.rb +8 -7
- data/lib/dango/monitor/server_monitor_action.rb +119 -0
- data/lib/dango/server_framework.rb +44 -93
- data/lib/dango/socket_list.rb +5 -5
- data/lib/dango/tester/dango_tester_client.rb +16 -1
- data/lib/dango/version.rb +1 -1
- metadata +3 -2
data/Manifest.txt
CHANGED
@@ -7,6 +7,7 @@ lib/dango/server_framework.rb
|
|
7
7
|
lib/dango/mutex_socket_list.rb
|
8
8
|
lib/dango/socket_list.rb
|
9
9
|
lib/dango/monitor/dango_monitor_client.rb
|
10
|
+
lib/dango/monitor/server_monitor_action.rb
|
10
11
|
lib/dango/script/dango_server.rb
|
11
12
|
lib/dango/shared/memory_store.rb
|
12
13
|
lib/dango/tasks/dango_rake.rb
|
@@ -31,7 +31,7 @@ class DangoClientFramework
|
|
31
31
|
# メイン処理
|
32
32
|
def initialize(env, config = nil)
|
33
33
|
if !config
|
34
|
-
config = YAML.load(open("dango/config/#{env}.yml", "rb"){|fh| fh.read})
|
34
|
+
config = YAML.load(open("#{RAILS_ROOT}/dango/config/#{env}.yml", "rb"){|fh| fh.read})
|
35
35
|
end
|
36
36
|
|
37
37
|
@config = config
|
data/lib/dango/framework_base.rb
CHANGED
@@ -54,6 +54,7 @@ class DangoFrameworkTimeoutError < DangoFrameworkError; end
|
|
54
54
|
class DangoFrameworkConnectionError < DangoFrameworkError; end
|
55
55
|
class DangoFrameworkReadNoDataError < DangoFrameworkError; end
|
56
56
|
class DangoFrameworkFlashPolicyError < DangoFrameworkError; end
|
57
|
+
class DangoFrameworkMonitorSecurityError < DangoFrameworkError; end
|
57
58
|
|
58
59
|
# エラー出力用モジュール
|
59
60
|
module ErrorMessage
|
@@ -119,9 +120,9 @@ module DangoFrameworkModule
|
|
119
120
|
Dir.mkdir(log_dir) if !File.exist?(log_dir)
|
120
121
|
@cs_logger = Logger.new(@log_file)
|
121
122
|
@cs_logger.level = @log_level
|
122
|
-
|
123
|
-
@cs_logger.datetime_format = "aaaaa"
|
124
|
-
@cs_logger.progname = "
|
123
|
+
@cs_logger.datetime_format = "%Y-%m-%dT%H:%M:%S"
|
124
|
+
# @cs_logger.datetime_format = "aaaaa"
|
125
|
+
@cs_logger.progname = "toid=#{Thread.current.object_id}"
|
125
126
|
end
|
126
127
|
end
|
127
128
|
@cs_logger
|
@@ -137,16 +138,16 @@ module DangoFrameworkModule
|
|
137
138
|
# size_str = sock.readpartial(CommMaxDigit + 1)
|
138
139
|
# size_str = sock.sysread(CommMaxDigit + 1)
|
139
140
|
size_str = sock.recv(CommMaxDigit + 1)
|
140
|
-
rescue EOFError, Errno::ECONNRESET
|
141
|
+
rescue EOFError, Errno::ECONNRESET, Errno::ETIMEDOUT
|
141
142
|
# EOFErrorはその接続終了時の切断と思われるのでDangoFrameworkConnectionErrorにしない
|
142
143
|
#raise(DangoFrameworkError, "failed to read sock for EOF reached.\n#{error_message($!, 'u')}")
|
143
|
-
raise(DangoFrameworkError, "failed to read sock for EOF reached (and so on). #{$!.class}
|
144
|
+
raise(DangoFrameworkError, "failed to read sock for EOF reached (and so on). #{$!.class} toid=#{Thread.current.object_id}")
|
144
145
|
rescue
|
145
|
-
raise(DangoFrameworkConnectionError, "failed to read sock.
|
146
|
+
raise(DangoFrameworkConnectionError, "failed to read sock. toid=#{Thread.current.object_id}\n#{error_message($!, 'u')}")
|
146
147
|
end
|
147
148
|
|
148
149
|
if size_str == ""
|
149
|
-
raise(DangoFrameworkReadNoDataError, "
|
150
|
+
raise(DangoFrameworkReadNoDataError, "toid=#{Thread.current.object_id}:size_str=#{size_str.inspect}")
|
150
151
|
end
|
151
152
|
|
152
153
|
## Flash のpolicyファイルだった場合(特殊)
|
@@ -162,7 +163,7 @@ module DangoFrameworkModule
|
|
162
163
|
|
163
164
|
## データが小さすぎる場合
|
164
165
|
if size == nil || size == 0
|
165
|
-
raise(DangoFrameworkConnectionError, "
|
166
|
+
raise(DangoFrameworkConnectionError, "toid=#{Thread.current.object_id}:size=#{size}:size_str=#{size_str.inspect}")
|
166
167
|
end
|
167
168
|
|
168
169
|
## データが大きすぎる場合
|
@@ -209,7 +210,7 @@ module DangoFrameworkModule
|
|
209
210
|
data = Marshal.load(ret_data)
|
210
211
|
end
|
211
212
|
rescue
|
212
|
-
raise(DangoFrameworkConnectionError, "data parse error
|
213
|
+
raise(DangoFrameworkConnectionError, "data parse error.#{$!.class}\nret_data=#{ret_data}")
|
213
214
|
end
|
214
215
|
end
|
215
216
|
|
@@ -17,8 +17,9 @@ class DangoMonitorClient < DangoClientFramework
|
|
17
17
|
ConnTimeout = 6
|
18
18
|
|
19
19
|
def initialize()
|
20
|
-
env = ENV['RAILS_ENV'] || 'development'
|
21
|
-
|
20
|
+
@env = ENV['RAILS_ENV'] || 'development'
|
21
|
+
config = YAML.load(open("#{RAILS_ROOT}/dango/config/#{@env}.yml", "rb"){|fh| fh.read})
|
22
|
+
super(@env, config)
|
22
23
|
end
|
23
24
|
|
24
25
|
public
|
@@ -26,7 +27,7 @@ class DangoMonitorClient < DangoClientFramework
|
|
26
27
|
# 起動処理
|
27
28
|
def cs_client_init
|
28
29
|
# ログ出力情報
|
29
|
-
@connection_client_log_file = "log/dango_monitor_#{
|
30
|
+
@connection_client_log_file = "#{RAILS_ROOT}/log/dango_monitor_#{@env}.log"
|
30
31
|
@connection_client_log_level = Logger::DEBUG
|
31
32
|
end
|
32
33
|
|
@@ -36,9 +37,9 @@ class DangoMonitorClient < DangoClientFramework
|
|
36
37
|
|
37
38
|
# サーバーの全情報取得
|
38
39
|
def get_all_info
|
39
|
-
cs_logger.debug "DangoMonitorClient:get_all_info"
|
40
|
+
cs_logger.debug "DangoMonitorClient:get_all_info:#{ENV['RAILS_ROOT']}"
|
40
41
|
begin
|
41
|
-
ret_obj = cs_client_send_receive_data('
|
42
|
+
ret_obj = cs_client_send_receive_data('_monitor_all_info', {})
|
42
43
|
rescue DangoFrameworkConnectionError
|
43
44
|
raise("monitor_all_info Connection error")
|
44
45
|
rescue DangoFrameworkTimeoutError
|
@@ -52,7 +53,7 @@ class DangoMonitorClient < DangoClientFramework
|
|
52
53
|
def server_reload
|
53
54
|
cs_logger.debug "DangoMonitorClient:server_reload"
|
54
55
|
begin
|
55
|
-
ret_obj = cs_client_send_receive_data('
|
56
|
+
ret_obj = cs_client_send_receive_data('_monitor_server_reload', {})
|
56
57
|
rescue DangoFrameworkConnectionError
|
57
58
|
raise("monitor_server_reload Connection error")
|
58
59
|
rescue DangoFrameworkTimeoutError
|
@@ -66,7 +67,7 @@ class DangoMonitorClient < DangoClientFramework
|
|
66
67
|
def send_system_message(message = "")
|
67
68
|
cs_logger.debug "DangoMonitorClient:send_system_message"
|
68
69
|
begin
|
69
|
-
ret_obj = cs_client_send_receive_data('
|
70
|
+
ret_obj = cs_client_send_receive_data('_monitor_send_system_message', {:message=>message})
|
70
71
|
rescue DangoFrameworkConnectionError
|
71
72
|
raise("monitor_send_system_message Connection error")
|
72
73
|
rescue DangoFrameworkTimeoutError
|
@@ -0,0 +1,119 @@
|
|
1
|
+
#!ruby -Ku
|
2
|
+
|
3
|
+
=begin
|
4
|
+
= Dangoサーバーのメンテナンス用サーバー側機能
|
5
|
+
=end
|
6
|
+
|
7
|
+
require 'ipaddr'
|
8
|
+
|
9
|
+
# メインクラス
|
10
|
+
class ServerMonitorAction
|
11
|
+
def initialize(parent, config, sock, ret_obj)
|
12
|
+
@parent = parent
|
13
|
+
@config = config
|
14
|
+
|
15
|
+
@cs_logger = @parent.cs_logger
|
16
|
+
@shared = @parent.shared
|
17
|
+
@session = @parent.session
|
18
|
+
@socket_list = @parent.socket_list
|
19
|
+
@session_list = @parent.session_list
|
20
|
+
|
21
|
+
# アクション名
|
22
|
+
action_name = ret_obj["action"].to_s
|
23
|
+
|
24
|
+
cs_check_monitor_error(sock, action_name)
|
25
|
+
|
26
|
+
if action_name == '_monitor_all_info' # メンテナンスアクション名なら
|
27
|
+
cs_server_monitor_all_info(ret_obj)
|
28
|
+
|
29
|
+
elsif action_name == '_monitor_server_reload' # メンテナンスアクション名なら
|
30
|
+
cs_server_monitor_server_reload(ret_obj)
|
31
|
+
|
32
|
+
elsif action_name == '_monitor_send_system_message' # メンテナンスアクション名なら
|
33
|
+
cs_server_monitor_send_system_message(ret_obj)
|
34
|
+
|
35
|
+
else
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
attr_reader(:cs_logger, :shared, :session, :socket_list, :session_list)
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
# メンテナンスコマンド:エラーの場合
|
44
|
+
def cs_check_monitor_error(sock, action_name)
|
45
|
+
peerhost, peeraddr = sock.peeraddr[2, 2]
|
46
|
+
backdoor_host = @config['server']['backdoor_host']
|
47
|
+
cs_logger.debug "cs_check_monitor_error:peerhost=#{peerhost.inspect} peeraddr=#{peeraddr.inspect} backdoor_host=#{backdoor_host.inspect}"
|
48
|
+
|
49
|
+
match = false
|
50
|
+
if peerhost == backdoor_host # ホスト名で書いてある時の一致確認
|
51
|
+
match = true
|
52
|
+
else
|
53
|
+
begin # IPアドレスの一致確認
|
54
|
+
# match = true if IPAddr.new(backdoor_host).include?(peeraddr)
|
55
|
+
if IPAddr.new(backdoor_host).include?(IPAddr.new(peeraddr))
|
56
|
+
match = true
|
57
|
+
end
|
58
|
+
rescue
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
if !match
|
63
|
+
notice_name = "return_" + action_name
|
64
|
+
send_obj = {'code'=>1, 'message'=>"error your ip address"}
|
65
|
+
@parent.cs_server_send_data(session[:sid], notice_name, send_obj, :type=>2)
|
66
|
+
raise(DangoFrameworkMonitorSecurityError)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# メンテナンスコマンド:サーバーからクライアントへのデータ送信
|
71
|
+
def cs_server_monitor_all_info(ret_obj)
|
72
|
+
cs_logger.debug "cs_server_monitor_all_info:#{ret_obj.inspect}"
|
73
|
+
all_info = {
|
74
|
+
'shareds' => shared.to_hash,
|
75
|
+
'socket_list' => socket_list.keys,
|
76
|
+
'session_list' => session_list,
|
77
|
+
|
78
|
+
'server_start_time' => @parent.start_time.strftime("%Y-%m-%d %H:%M:%S"),
|
79
|
+
'up_time' => Time.now - @parent.start_time,
|
80
|
+
|
81
|
+
'recv_count' => @parent.recv_count, # 受信回数
|
82
|
+
'send_count' => @parent.send_count, # 送信回数
|
83
|
+
'recv_fail_count' => @parent.recv_fail_count, # 受信失敗回数
|
84
|
+
'send_fail_count' => @parent.send_fail_count, # 送信失敗回数
|
85
|
+
# 'dummy' => "dummy "*1000, # ダミー情報
|
86
|
+
}
|
87
|
+
|
88
|
+
send_obj = {'code'=>0, 'all_info'=>all_info}
|
89
|
+
@parent.cs_server_send_data(session[:sid], 'return__monitor_all_info', send_obj, :type=>2)
|
90
|
+
end
|
91
|
+
|
92
|
+
# メンテナンスコマンド:サーバーデータ再読み込み
|
93
|
+
def cs_server_monitor_server_reload(ret_obj)
|
94
|
+
cs_logger.debug "cs_server_monitor_server_reload"
|
95
|
+
@server_reload = true
|
96
|
+
cs_logger.debug "@server_reload=#{@server_reload.inspect}"
|
97
|
+
send_obj = {'code'=>0, 'message'=>'success'}
|
98
|
+
@parent.cs_server_send_data(session[:sid], 'return__monitor_server_reload', send_obj, :type=>2)
|
99
|
+
end
|
100
|
+
|
101
|
+
# メンテナンスコマンド:接続者全員へメッセージ送信
|
102
|
+
def cs_server_monitor_send_system_message(ret_obj)
|
103
|
+
cs_logger.debug "cs_server_monitor_send_system_message:#{ret_obj.inspect}"
|
104
|
+
|
105
|
+
# 全員へ_notice_system_messageを通知
|
106
|
+
socket_list.keys.each do |sid|
|
107
|
+
next if session[:sid] == sid
|
108
|
+
send_obj = { "message" => ret_obj["message"] }
|
109
|
+
@parent.cs_server_send_data(sid, '_notice_system_message', send_obj)
|
110
|
+
end
|
111
|
+
|
112
|
+
send_obj = {'code'=>0, }
|
113
|
+
@parent.cs_server_send_data(session[:sid], 'return__monitor_send_system_message', send_obj, :type=>2)
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
117
|
+
|
118
|
+
|
119
|
+
|
@@ -5,18 +5,18 @@
|
|
5
5
|
=end
|
6
6
|
|
7
7
|
require 'gserver'
|
8
|
-
require 'ipaddr'
|
9
8
|
require 'digest/md5'
|
10
9
|
|
11
10
|
require "dango/framework_base"
|
12
11
|
require "dango/socket_list"
|
13
12
|
require "dango/mutex_socket_list"
|
13
|
+
require "dango/monitor/server_monitor_action"
|
14
14
|
|
15
15
|
# フレームワーククラス
|
16
16
|
class DangoServerFramework
|
17
17
|
include DangoFrameworkModule
|
18
18
|
|
19
|
-
SendReceiveSleepIntervalSec = 0.
|
19
|
+
SendReceiveSleepIntervalSec = 0.2 # データ送信後の順の際のタイムアウトチェック間隔秒
|
20
20
|
SendReceiveTimeoutDefaultSec = 2.0 # データ送受信時のデフォルトタイムアウト秒数
|
21
21
|
SendTimeoutSec = 10.0 # データ送受信時の送信のタイムアウト秒数
|
22
22
|
HeratBeatIntervalSec = 60.0 # S=>Cのハートビートの送信タイミング
|
@@ -82,6 +82,7 @@ class DangoServerFramework
|
|
82
82
|
|
83
83
|
open("tmp/pids/dango.pid", "wb"){|fh| fh.write Process.pid.to_s }
|
84
84
|
|
85
|
+
session_init() # セッション情報の初期化
|
85
86
|
shared_init() # 共有メモリを初期化
|
86
87
|
notice_shared_init() # 通知共有メモリを初期化
|
87
88
|
socket_list_init() # ソケット一覧を初期化
|
@@ -180,14 +181,15 @@ class DangoServerFramework
|
|
180
181
|
# gserverのserveメソッド:スレッド開始処理
|
181
182
|
def thread_main(sock)
|
182
183
|
cs_logger.debug "thread_main:start"
|
183
|
-
cs_logger.debug "#{sock} is accepted.
|
184
|
+
cs_logger.debug "#{sock} is accepted. thread.current=#{Thread.current.object_id} sock_id=#{sock.object_id}"
|
184
185
|
|
185
186
|
begin
|
186
187
|
sock.binmode
|
187
188
|
sock.sync = true
|
188
189
|
|
189
|
-
|
190
|
-
sid =
|
190
|
+
sid = Thread.current.object_id.deep_dup
|
191
|
+
# sid = sock.object_id
|
192
|
+
session[:sid] = sid
|
191
193
|
socket_list.add(sid, sock)
|
192
194
|
mutex_socket_list.add(sid)
|
193
195
|
|
@@ -245,17 +247,8 @@ class DangoServerFramework
|
|
245
247
|
# cs_logger.debug "action_name=#{action_name} #{Time.now_to_s}"
|
246
248
|
action_name_is_response(ret_obj)
|
247
249
|
|
248
|
-
elsif action_name == '
|
249
|
-
|
250
|
-
cs_server_monitor_all_info(ret_obj)
|
251
|
-
|
252
|
-
elsif action_name == 'monitor_server_reload' # メンテナンスアクション名なら
|
253
|
-
cs_check_monitor_error(sock, "return_monitor_server_reload")
|
254
|
-
cs_server_monitor_server_reload(ret_obj)
|
255
|
-
|
256
|
-
elsif action_name == 'monitor_send_system_message' # メンテナンスアクション名なら
|
257
|
-
cs_check_monitor_error(sock, "return_monitor_send_system_message")
|
258
|
-
cs_server_monitor_send_system_message(ret_obj)
|
250
|
+
elsif action_name[0, 9] == '_monitor_' # メンテナンスアクション名なら
|
251
|
+
ServerMonitorAction.new(self, @config, sock, ret_obj)
|
259
252
|
|
260
253
|
else # メンテナンスコマンド以外のユーザーアクション名なら
|
261
254
|
cs_logger.debug "action_name=#{action_name} #{sid} #{Time.now_to_s}"
|
@@ -273,23 +266,26 @@ class DangoServerFramework
|
|
273
266
|
end # loop
|
274
267
|
|
275
268
|
rescue DangoFrameworkFlashPolicyError
|
276
|
-
cs_logger.debug "Flash policy file send. #{
|
269
|
+
cs_logger.debug "Flash policy file send. #{sid} #{Time.now_to_s}"
|
270
|
+
|
271
|
+
rescue DangoFrameworkMonitorSecurityError
|
272
|
+
cs_logger.debug "Monitor Security Error #{sid} #{Time.now_to_s}"
|
277
273
|
|
278
274
|
rescue DangoFrameworkReadNoDataError
|
279
|
-
cs_logger.debug "read no data. maybe client closed. #{
|
275
|
+
cs_logger.debug "read no data. maybe client closed. #{sid} #{Time.now_to_s}"
|
280
276
|
|
281
277
|
rescue DangoFrameworkConnectionError
|
282
278
|
@recv_fail_count += 1 if @recv_fail_count # 受信失敗回数カウント
|
283
|
-
cs_logger.debug "connection error. #{
|
279
|
+
cs_logger.debug "connection error. #{sid} #{Time.now_to_s}\n#{error_message($!, 'u')}"
|
284
280
|
|
285
281
|
rescue DangoFrameworkError
|
286
|
-
cs_logger.debug "DangoFrameworkError. #{
|
282
|
+
cs_logger.debug "DangoFrameworkError. #{sid} #{Time.now_to_s}\n#{error_message($!, 'u')}"
|
287
283
|
|
288
284
|
rescue Exception
|
289
|
-
cs_logger.error "Exception #{
|
285
|
+
cs_logger.error "Exception #{sid} #{Time.now_to_s} #{error_message($!, 'u')}"
|
290
286
|
|
291
287
|
ensure
|
292
|
-
cs_logger.debug "#{sock.inspect}
|
288
|
+
cs_logger.debug "#{sock.inspect} sock_id=#{sock.object_id} #{sid} is gone"
|
293
289
|
|
294
290
|
@mutex_proc_thread.synchronize do
|
295
291
|
begin
|
@@ -297,13 +293,19 @@ class DangoServerFramework
|
|
297
293
|
rescue
|
298
294
|
cs_logger.error "#{error_message($!, 'u')}"
|
299
295
|
ensure
|
300
|
-
socket_list.delete(
|
301
|
-
|
296
|
+
socket_list.delete(sid) # ソケットリストから削除
|
297
|
+
begin
|
298
|
+
sock.close if !sock.closed? # ソケットを閉じる
|
299
|
+
rescue IOError
|
300
|
+
cs_logger.debug "IOError #{sock} #{sid}"
|
301
|
+
end
|
302
302
|
|
303
|
-
cs_logger.debug "#{sock.inspect}
|
303
|
+
cs_logger.debug "#{sock.inspect} sock_id=#{sock.object_id} #{sid} is gone 2"
|
304
304
|
end
|
305
|
+
|
305
306
|
end
|
306
307
|
|
308
|
+
session_del()
|
307
309
|
end
|
308
310
|
end
|
309
311
|
|
@@ -347,6 +349,8 @@ class DangoServerFramework
|
|
347
349
|
@send_fail_count = 0 # 送信失敗回数
|
348
350
|
end
|
349
351
|
|
352
|
+
attr_reader(:start_time, :recv_count, :send_count, :recv_fail_count, :send_fail_count)
|
353
|
+
|
350
354
|
def cs_server_init # 初期設定
|
351
355
|
end
|
352
356
|
|
@@ -451,12 +455,24 @@ class DangoServerFramework
|
|
451
455
|
attr_accessor(:notice_shared)
|
452
456
|
|
453
457
|
# セッション
|
454
|
-
|
458
|
+
def session_init # セッション情報の初期化
|
459
|
+
@session_list = {}
|
455
460
|
end
|
456
461
|
def session
|
457
|
-
|
462
|
+
if !Thread.current[:session]
|
463
|
+
Thread.current[:session] = {}
|
464
|
+
@session_list[Thread.current.object_id] = Thread.current[:session]
|
465
|
+
end
|
458
466
|
Thread.current[:session]
|
467
|
+
# sid = Thread.current.object_id
|
468
|
+
# @session[sid] = Session.new if !@session[sid]
|
469
|
+
# @session[sid]
|
459
470
|
end
|
471
|
+
def session_del # セッション情報の初期化
|
472
|
+
@session_list.delete(Thread.current.object_id)
|
473
|
+
end
|
474
|
+
|
475
|
+
attr_reader(:session_list)
|
460
476
|
|
461
477
|
# ソケットとIDの対応
|
462
478
|
def socket_list_init
|
@@ -512,7 +528,7 @@ class DangoServerFramework
|
|
512
528
|
end
|
513
529
|
|
514
530
|
rescue
|
515
|
-
cs_logger.error "Exception
|
531
|
+
cs_logger.error "Exception heart_beat_thread_start #{Time.now_to_s} #{error_message($!, 'u')}"
|
516
532
|
end
|
517
533
|
end
|
518
534
|
end
|
@@ -612,71 +628,6 @@ class DangoServerFramework
|
|
612
628
|
self
|
613
629
|
end
|
614
630
|
|
615
|
-
# メンテナンスコマンド:エラーの場合
|
616
|
-
def cs_check_monitor_error(sock, return_command)
|
617
|
-
peerhost, peeraddr = sock.peeraddr[2, 2]
|
618
|
-
backdoor_host = @config['server']['backdoor_host']
|
619
|
-
match = false
|
620
|
-
if peerhost == backdoor_host # ホスト名で書いてある時の一致確認
|
621
|
-
match = true
|
622
|
-
else
|
623
|
-
begin # IPアドレスの一致確認
|
624
|
-
match = true if IPAddr.new(peeraddr) == IPAddr.new(backdoor_host)
|
625
|
-
rescue
|
626
|
-
end
|
627
|
-
end
|
628
|
-
|
629
|
-
if !match
|
630
|
-
send_obj = {'code'=>1, 'message'=>"error your ip address"}
|
631
|
-
cs_server_send_data(session[:sid], return_command, send_obj, :type=>2)
|
632
|
-
raise(DangoFrameworkError)
|
633
|
-
end
|
634
|
-
end
|
635
|
-
|
636
|
-
# メンテナンスコマンド:サーバーからクライアントへのデータ送信
|
637
|
-
def cs_server_monitor_all_info(ret_obj)
|
638
|
-
all_info = {
|
639
|
-
'shareds' => shared.to_hash,
|
640
|
-
'socket_list' => socket_list.keys,
|
641
|
-
|
642
|
-
'server_start_time' => @start_time.strftime("%Y-%m-%d %H:%M:%S"),
|
643
|
-
'up_time' => Time.now - @start_time,
|
644
|
-
|
645
|
-
'recv_count' => @recv_count, # 受信回数
|
646
|
-
'send_count' => @send_count, # 送信回数
|
647
|
-
'recv_fail_count' => @recv_fail_count, # 受信失敗回数
|
648
|
-
'send_fail_count' => @send_fail_count, # 送信失敗回数
|
649
|
-
# 'dummy' => "dummy "*1000, # ダミー情報
|
650
|
-
}
|
651
|
-
|
652
|
-
send_obj = {'code'=>0, 'all_info'=>all_info}
|
653
|
-
cs_server_send_data(session[:sid], 'return_monitor_all_info', send_obj, :type=>2)
|
654
|
-
end
|
655
|
-
|
656
|
-
# メンテナンスコマンド:サーバーデータ再読み込み
|
657
|
-
def cs_server_monitor_server_reload(ret_obj)
|
658
|
-
cs_logger.debug "cs_server_monitor_server_reload"
|
659
|
-
@server_reload = true
|
660
|
-
cs_logger.debug "@server_reload=#{@server_reload.inspect}"
|
661
|
-
send_obj = {'code'=>0, 'message'=>'success'}
|
662
|
-
cs_server_send_data(session[:sid], 'return_monitor_server_reload', send_obj, :type=>2)
|
663
|
-
end
|
664
|
-
|
665
|
-
# メンテナンスコマンド:接続者全員へメッセージ送信
|
666
|
-
def cs_server_monitor_send_system_message(ret_obj)
|
667
|
-
cs_logger.debug "cs_server_monitor_send_system_message:#{ret_obj.inspect}"
|
668
|
-
|
669
|
-
# 全員へ_notice_system_messageを通知
|
670
|
-
socket_list.keys.each do |sid|
|
671
|
-
next if session[:sid] == sid
|
672
|
-
send_obj = { "message" => ret_obj["message"] }
|
673
|
-
cs_server_send_data(sid, '_notice_system_message', send_obj)
|
674
|
-
end
|
675
|
-
|
676
|
-
send_obj = {'code'=>0, }
|
677
|
-
cs_server_send_data(session[:sid], 'return_monitor_send_system_message', send_obj, :type=>2)
|
678
|
-
end
|
679
|
-
|
680
631
|
# 必要に応じて追加するメソッド
|
681
632
|
def method_missing(name, *args)
|
682
633
|
if name.to_s =~ /^cs_receive_action_notice_shared_(.+)/ # 共有メモリ変更通知なら
|
data/lib/dango/socket_list.rb
CHANGED
@@ -21,23 +21,23 @@ class SocketList
|
|
21
21
|
|
22
22
|
def add(key, sock)
|
23
23
|
@sl_mutex.synchronize do
|
24
|
-
raise("already exist key(#{key})") if @sl_hash.has_key?(key)
|
25
|
-
raise("sock(#{sock.
|
24
|
+
raise("already exist key(#{key.inspect})") if @sl_hash.has_key?(key)
|
25
|
+
raise("sock(#{sock.inspect}) is not Socket") if sock.kind_of?(Socket)
|
26
26
|
@sl_hash[key] = sock
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
30
|
def [](key)
|
31
31
|
@sl_mutex.synchronize do
|
32
|
-
raise("not exist key(#{key})") if ! @sl_hash.has_key?(key)
|
32
|
+
raise("not exist key(#{key.inspect})") if ! @sl_hash.has_key?(key)
|
33
33
|
@sl_hash[key]
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
37
|
def []=(key, sock)
|
38
38
|
@sl_mutex.synchronize do
|
39
|
-
raise("not exist key(#{key})") if ! @sl_hash.has_key?(key)
|
40
|
-
raise("sock(#{sock.
|
39
|
+
raise("not exist key(#{key.inspect})") if ! @sl_hash.has_key?(key)
|
40
|
+
raise("sock(#{sock.inspect}) is not Socket") if sock.kind_of?(Socket)
|
41
41
|
@sl_hash[key] = sock
|
42
42
|
end
|
43
43
|
end
|
@@ -9,6 +9,9 @@ require 'thread'
|
|
9
9
|
|
10
10
|
# テスタークラス
|
11
11
|
class DangoTesterClient
|
12
|
+
ConnectionRetryTimes = 10 # 接続リトライ回数
|
13
|
+
ConnectionRetryIntervalSec = 3 # 接続リトライ時の間隔病数
|
14
|
+
|
12
15
|
# テスターのイニシャライズ
|
13
16
|
def initialize
|
14
17
|
@client_conns = {}
|
@@ -26,7 +29,19 @@ class DangoTesterClient
|
|
26
29
|
env = "development"
|
27
30
|
|
28
31
|
# 接続
|
29
|
-
client_conn =
|
32
|
+
client_conn = nil
|
33
|
+
ConnectionRetryTimes.times do |i|
|
34
|
+
begin
|
35
|
+
client_conn = TestClient.new(env, config, c_name)
|
36
|
+
break
|
37
|
+
rescue
|
38
|
+
client_conn = nil
|
39
|
+
raise("connection error for retry times over.") if i == ConnectionRetryTimes - 1
|
40
|
+
puts "connection failed. sleep #{ConnectionRetryIntervalSec}"
|
41
|
+
sleep ConnectionRetryIntervalSec
|
42
|
+
end
|
43
|
+
end
|
44
|
+
raise("connection error.") if ! client_conn
|
30
45
|
|
31
46
|
# client_nameメソッド作成とclient_nameを定義
|
32
47
|
client_conn.client_name = c_name
|
data/lib/dango/version.rb
CHANGED
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
|
|
3
3
|
specification_version: 1
|
4
4
|
name: dango
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.0.
|
7
|
-
date: 2007-10-
|
6
|
+
version: 0.0.22
|
7
|
+
date: 2007-10-29 00:00:00 +09:00
|
8
8
|
summary: Realtime communications network framework for Ruby and Flash on Rails.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -38,6 +38,7 @@ files:
|
|
38
38
|
- lib/dango/mutex_socket_list.rb
|
39
39
|
- lib/dango/socket_list.rb
|
40
40
|
- lib/dango/monitor/dango_monitor_client.rb
|
41
|
+
- lib/dango/monitor/server_monitor_action.rb
|
41
42
|
- lib/dango/script/dango_server.rb
|
42
43
|
- lib/dango/shared/memory_store.rb
|
43
44
|
- lib/dango/tasks/dango_rake.rb
|