super-test 1.0.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGE.txt +9 -0
- data/README.txt +13 -0
- data/bin/idb +19 -0
- data/bin/ii +113 -0
- data/bin/istart_mock +36 -0
- data/bin/istop_mock +16 -0
- data/bin/kk +181 -0
- data/bin/rubyatp +42 -0
- data/bin/start_mock +36 -0
- data/bin/stop_mock +16 -0
- data/bin/xgo +45 -0
- data/conf/conf.rb +11 -0
- data/conf/db03.yml +31 -0
- data/conf/db13.yml +37 -0
- data/conf/db19.yml +33 -0
- data/conf/online.yml +32 -0
- data/conf/super_test.yml +40 -0
- data/conf/system.yml +26 -0
- data/conf/sz00.yml +31 -0
- data/conf/sz06.yml +34 -0
- data/conf/wise00.yml +11 -0
- data/data/case.house +0 -0
- data/data/char.house +0 -0
- data/data/images/Bluehills.jpg +0 -0
- data/data/images/Sunset.jpg +0 -0
- data/data/images/Waterlilies.jpg +0 -0
- data/data/images/Winter.jpg +0 -0
- data/data/query.house +18595 -0
- data/data/user.house +8 -0
- data/lib/action/module/check_action.rb +58 -0
- data/lib/action/module/cnnt_action.rb +161 -0
- data/lib/action/module/datacenter_action.rb +48 -0
- data/lib/action/module/http_pack_helper.rb +163 -0
- data/lib/action/module/httpserver_action.rb +297 -0
- data/lib/action/module/inc.rb +21 -0
- data/lib/action/module/mcpack_action.rb +57 -0
- data/lib/action/module/sql_action.rb +84 -0
- data/lib/action/module/ssh_action.rb +37 -0
- data/lib/action/system/user_action.rb +180 -0
- data/lib/common/appium_helper.rb +217 -0
- data/lib/common/atp_helper.rb +74 -0
- data/lib/common/atp_report.rb +344 -0
- data/lib/common/data_house.rb +405 -0
- data/lib/common/data_model.rb +87 -0
- data/lib/common/http/assert_helper.rb +343 -0
- data/lib/common/http/fix_hpricot.rb +118 -0
- data/lib/common/http/html_helper.rb +362 -0
- data/lib/common/http/http_helper.rb +469 -0
- data/lib/common/http/multipart.rb +81 -0
- data/lib/common/isandbox_helper.rb +195 -0
- data/lib/common/json_helper.rb +43 -0
- data/lib/common/mock_helper.rb +168 -0
- data/lib/common/mtop_helper.rb +141 -0
- data/lib/common/myconf_helper.rb +49 -0
- data/lib/common/mylog_helper.rb +77 -0
- data/lib/common/pairwise.rb +121 -0
- data/lib/common/query_house.rb +89 -0
- data/lib/common/report_helper.rb +97 -0
- data/lib/common/robot_helper.rb +85 -0
- data/lib/common/socket/check.rb +325 -0
- data/lib/common/socket/conf_modifier.rb +149 -0
- data/lib/common/socket/context.rb +55 -0
- data/lib/common/socket/data.rb +392 -0
- data/lib/common/socket/data_helper.rb +41 -0
- data/lib/common/socket/env.rb +317 -0
- data/lib/common/socket/inc.rb +24 -0
- data/lib/common/socket/log.rb +213 -0
- data/lib/common/socket/log4s.rb +58 -0
- data/lib/common/socket/log_helper.rb +332 -0
- data/lib/common/socket/my_sql.rb +77 -0
- data/lib/common/socket/net.rb +74 -0
- data/lib/common/socket/network.rb +115 -0
- data/lib/common/socket/rlib/conf_modifier.rb +130 -0
- data/lib/common/socket/rlib/data_helper.rb +33 -0
- data/lib/common/socket/rlib/log_helper.rb +303 -0
- data/lib/common/socket/rlib/process_helper.rb +91 -0
- data/lib/common/socket/stub.rb +276 -0
- data/lib/common/socket/util.rb +266 -0
- data/lib/patterns/inc.rb +10 -0
- data/lib/patterns/mc_base_pattern.rb +474 -0
- data/lib/patterns/some_pattern.rb +145 -0
- data/lib/super_test.rb +114 -0
- data/log/super_test.log +0 -0
- data/log/super_test.log.wf +0 -0
- data/test/cover_me.rb +6 -0
- data/tool/jenny +0 -0
- data/tool/mcsend/mcsend2 +0 -0
- data/tool/mcsend/mcsend2_shead +0 -0
- data/tool/mcserver/conf/mcserver.conf +77 -0
- data/tool/mcserver/conf/mcserverauthip +17 -0
- data/tool/mcserver/mcserver +0 -0
- data/tool/mcserver/mcserver_trans +0 -0
- data/tool/mysql +0 -0
- data/tool/net/mcsend/mcsend +0 -0
- data/tool/net/mcsend/mcsend_trans +0 -0
- data/tool/net/mcsend/nshead.data +7 -0
- data/tool/net/mcsend/res_nshead.data +7 -0
- data/tool/net/my_client/my_client +0 -0
- data/tool/net/tsclient/client.tcl +205 -0
- data/tool/others/kk +190 -0
- data/tool/others/rubyatp +42 -0
- data/tool/others/supertest_install.sh +34 -0
- data/tool/trip/idb +0 -0
- data/tool/ts-agent/nshead.bft +12 -0
- data/tool/ts-agent/server.conf +10 -0
- data/tool/ts-agent/server.tcl +376 -0
- metadata +275 -0
@@ -0,0 +1,91 @@
|
|
1
|
+
#$LOAD_PATH << File.join(File.dirname(__FILE__), '../')
|
2
|
+
#!/usr/bin/env ruby
|
3
|
+
# coding: utf-8
|
4
|
+
|
5
|
+
#require 'log4s'
|
6
|
+
#============================================================
|
7
|
+
# This class suply local process related mehtods
|
8
|
+
# Author:: chenjie
|
9
|
+
# Date:: 2009-4-30
|
10
|
+
#============================================================
|
11
|
+
class ProcessHelper
|
12
|
+
|
13
|
+
# 用supervise启动单个模块进程
|
14
|
+
# - module_name module name, e.g.: appui
|
15
|
+
# - super_path default "/home/space/space"
|
16
|
+
# - sample Env.start_process("/home/space/space", "loadspace.sh")
|
17
|
+
# return true/false
|
18
|
+
def ProcessHelper.start_process(module_name,super_path="/home/space/space/", child_path="./bin/")
|
19
|
+
cmd_str = "cd #{super_path}; nohup #{child_path}#{module_name} >/dev/null 2>&1 &"
|
20
|
+
# $log.debug "start process: "+cmd_str
|
21
|
+
system "#{cmd_str}"
|
22
|
+
|
23
|
+
sleep 2
|
24
|
+
if ProcessHelper.is_process_running?(module_name) then
|
25
|
+
# $log.debug "process #{module_name} is running"
|
26
|
+
return true
|
27
|
+
else
|
28
|
+
# $log.debug "process #{module_name} is not running"
|
29
|
+
return false
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# killall方式杀死进程
|
34
|
+
# execute killall to kill a process, if the process is supervised, then it will restart
|
35
|
+
# return: void
|
36
|
+
def ProcessHelper.kill_process(module_name)
|
37
|
+
cmd_str = "killall -9 #{module_name}"
|
38
|
+
# $log.debug "kill process cmd = #{cmd_str}"
|
39
|
+
`#{cmd_str}`
|
40
|
+
sleep 1
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
# 判断进程是否正在运行
|
45
|
+
# return true/false
|
46
|
+
def ProcessHelper.is_process_running?(module_name)
|
47
|
+
res = `pstree | grep #{module_name} | wc -l`
|
48
|
+
if res.to_i > 0 then
|
49
|
+
return true
|
50
|
+
else
|
51
|
+
return false
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# 获取模块进程的线程数
|
56
|
+
# - module_name
|
57
|
+
# return thead number or 0(process not running)
|
58
|
+
def ProcessHelper.get_thread_num(module_name)
|
59
|
+
str = `pstree | grep #{module_name}`
|
60
|
+
mdata = str.scan /.*---(\d+).*/
|
61
|
+
if mdata.size > 0 then
|
62
|
+
return mdata[0][0].to_i
|
63
|
+
else
|
64
|
+
return 0
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
if ARGV.length > 0 then
|
71
|
+
case ARGV[0]
|
72
|
+
when "start_process"
|
73
|
+
module_name = ARGV[1]
|
74
|
+
super_path = ARGV[2]
|
75
|
+
puts ProcessHelper.start_process(module_name, super_path)
|
76
|
+
|
77
|
+
when "kill_process"
|
78
|
+
module_name = ARGV[1]
|
79
|
+
puts ProcessHelper.kill_process(module_name)
|
80
|
+
|
81
|
+
when "is_process_running?"
|
82
|
+
module_name = ARGV[1]
|
83
|
+
puts ProcessHelper.is_process_running?(module_name)
|
84
|
+
|
85
|
+
when "get_thread_num"
|
86
|
+
module_name = ARGV[1]
|
87
|
+
puts ProcessHelper.get_thread_num(module_name)
|
88
|
+
else
|
89
|
+
puts "ProcessHelper: bad method name? #{ARGV[0]}"
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,276 @@
|
|
1
|
+
$LOAD_PATH << File.join(File.dirname(__FILE__), '.')
|
2
|
+
$LOAD_PATH << File.join(File.dirname(__FILE__), '../conf/')
|
3
|
+
#!/usr/bin/env ruby
|
4
|
+
# coding: utf-8
|
5
|
+
# author: chenjie
|
6
|
+
# data: 2009-7-13
|
7
|
+
|
8
|
+
require 'conf'
|
9
|
+
require 'context'
|
10
|
+
require 'env'
|
11
|
+
|
12
|
+
#========================================================
|
13
|
+
# 下游桩相关的服务
|
14
|
+
#========================================================
|
15
|
+
|
16
|
+
module Stub
|
17
|
+
include Env
|
18
|
+
|
19
|
+
# === 功能
|
20
|
+
# 启动1到多个下游桩
|
21
|
+
# === 参数
|
22
|
+
# - phash: 参数hash
|
23
|
+
# - return:如果启动失败,抛出异常
|
24
|
+
#
|
25
|
+
# === Example
|
26
|
+
#
|
27
|
+
# start_stub 'stub1'=>9998, 'stub2'=>9999
|
28
|
+
def start_stub phash
|
29
|
+
clear_context
|
30
|
+
|
31
|
+
#load into mem
|
32
|
+
stubs = []
|
33
|
+
ports = []
|
34
|
+
actions = []
|
35
|
+
heads = []
|
36
|
+
files = []
|
37
|
+
phash.each_pair{|key, value|
|
38
|
+
stubs << key
|
39
|
+
ports << value
|
40
|
+
|
41
|
+
#by default
|
42
|
+
actions << 0
|
43
|
+
heads << ""
|
44
|
+
files << ""
|
45
|
+
}
|
46
|
+
|
47
|
+
Context.set :STUBS, stubs
|
48
|
+
Context.set :STUB_PORTS, ports
|
49
|
+
Context.set :STUB_ACTIONS, actions
|
50
|
+
Context.set :STUB_HEADS, heads
|
51
|
+
Context.set :STUB_FILES, files
|
52
|
+
|
53
|
+
|
54
|
+
#modify server.conf
|
55
|
+
save_to_conf
|
56
|
+
|
57
|
+
#start server
|
58
|
+
#cmd_str = "cd #{STUB_PATH}; nohup ts-agent -f server.tcl >/dev/null 2>&1 &"
|
59
|
+
cmd_str = "cd #{STUB_PATH}; nohup ts-agent -f server.tcl &"
|
60
|
+
system "#{cmd_str}"
|
61
|
+
|
62
|
+
sleep 1
|
63
|
+
|
64
|
+
#TODO get it's background pid?
|
65
|
+
end
|
66
|
+
|
67
|
+
# ===功能
|
68
|
+
# 停止前一次启动的下游桩,需要上下文支持
|
69
|
+
# ===example
|
70
|
+
# stop_stub
|
71
|
+
def stop_stub
|
72
|
+
`killall -9 ts-agent`
|
73
|
+
clear_context
|
74
|
+
|
75
|
+
sleep 1
|
76
|
+
#TODO kill just by pid
|
77
|
+
end
|
78
|
+
|
79
|
+
# ===功能
|
80
|
+
# 设置下游桩的工作模式
|
81
|
+
# ===参数
|
82
|
+
# - phash: 参数hash
|
83
|
+
#
|
84
|
+
# === Example
|
85
|
+
#
|
86
|
+
# set_stub_action 'stub1'=>1, 'stub2'=>2
|
87
|
+
# set_stub_action 'stub2'=>2
|
88
|
+
def set_stub_action phash
|
89
|
+
phash.each_pair{|key, value|
|
90
|
+
#get idx
|
91
|
+
idx = get_idx_by_name key, Context.get(:STUBS)
|
92
|
+
|
93
|
+
#modify context according to the idx
|
94
|
+
actions = Context.get :STUB_ACTIONS
|
95
|
+
actions[idx] = value
|
96
|
+
Context.set :STUB_ACTIONS, actions
|
97
|
+
}
|
98
|
+
|
99
|
+
save_actions
|
100
|
+
end
|
101
|
+
|
102
|
+
# ===功能
|
103
|
+
# 设置下游桩的响应头
|
104
|
+
# ===参数
|
105
|
+
# - phash: 参数hash
|
106
|
+
#
|
107
|
+
# === Example
|
108
|
+
#
|
109
|
+
# set_stub_file 'stub1'=>'/home/.../head1', 'stub2'=>'/home/.../head2'
|
110
|
+
# set_stub_file 'stub1'=>'/home/.../head1'
|
111
|
+
def set_stub_head phash
|
112
|
+
phash.each_pair{|key, value|
|
113
|
+
#get idx
|
114
|
+
idx = get_idx_by_name key, Context.get(:STUBS)
|
115
|
+
|
116
|
+
#modify context according to the idx
|
117
|
+
heads = Context.get :STUB_HEADS
|
118
|
+
heads[idx] = value
|
119
|
+
Context.set :STUB_HEADS, heads
|
120
|
+
}
|
121
|
+
|
122
|
+
save_heads
|
123
|
+
end
|
124
|
+
|
125
|
+
# ===功能
|
126
|
+
# 设置下游桩的响应文件
|
127
|
+
# ===参数
|
128
|
+
# - phash: 参数hash
|
129
|
+
#
|
130
|
+
# === Example
|
131
|
+
#
|
132
|
+
# set_stub_file 'stub1'=>'/home/.../data1', 'stub2'=>'/home/.../data2'
|
133
|
+
# set_stub_file 'stub1'=>'/home/.../data1'
|
134
|
+
def set_stub_file phash
|
135
|
+
phash.each_pair{|key, value|
|
136
|
+
#get idx
|
137
|
+
idx = get_idx_by_name key, Context.get(:STUBS)
|
138
|
+
|
139
|
+
#modify context according to the idx
|
140
|
+
files = Context.get :STUB_FILES
|
141
|
+
files[idx] = value
|
142
|
+
Context.set :STUB_FILES, files
|
143
|
+
}
|
144
|
+
|
145
|
+
save_files
|
146
|
+
end
|
147
|
+
|
148
|
+
|
149
|
+
private
|
150
|
+
# ===功能
|
151
|
+
# 清理上下文中保存的所有stub相关内容
|
152
|
+
# :STUBS, :STUB_PORTS, :STUB_ACTIONS, :STUB_FILES
|
153
|
+
# ===example
|
154
|
+
# clear_context
|
155
|
+
def clear_context
|
156
|
+
$log.info "clearing context for stubs..."
|
157
|
+
Context.delete :STUBS
|
158
|
+
Context.delete :STUB_PORTS
|
159
|
+
Context.delete :STUB_ACTIONSa
|
160
|
+
Context.delete :STUB_HEADS
|
161
|
+
Context.delete :STUB_FILES
|
162
|
+
end
|
163
|
+
|
164
|
+
# ===功能
|
165
|
+
# 将数组序列化成以','隔开的字符串
|
166
|
+
# ===example
|
167
|
+
# str = arr_to_s array
|
168
|
+
def arr_to_s arr
|
169
|
+
if arr == nil
|
170
|
+
return ''
|
171
|
+
end
|
172
|
+
|
173
|
+
str = ""
|
174
|
+
for i in 0..arr.size-1 do
|
175
|
+
if i == 0
|
176
|
+
str = arr[0]
|
177
|
+
else
|
178
|
+
str = "#{str}, #{arr[i]}"
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
str
|
183
|
+
end
|
184
|
+
|
185
|
+
# ===功能
|
186
|
+
# 获取指定stub在上下文数组中的索引号
|
187
|
+
# ===参数
|
188
|
+
# - stub_name : stub名称
|
189
|
+
# - stubs : the stubs array
|
190
|
+
# return: sucess -> idx in stubs array, fail -> -1
|
191
|
+
# ===example
|
192
|
+
# get_idx_by_name "name1", stubs
|
193
|
+
def get_idx_by_name stub_name, stubs
|
194
|
+
if ( (stubs == nil) || (stubs.size == 0) )
|
195
|
+
return -1
|
196
|
+
end
|
197
|
+
|
198
|
+
idx = 0
|
199
|
+
stubs.each{|stub|
|
200
|
+
if stub == stub_name
|
201
|
+
return idx
|
202
|
+
end
|
203
|
+
|
204
|
+
idx += 1
|
205
|
+
}
|
206
|
+
|
207
|
+
return -1
|
208
|
+
end
|
209
|
+
|
210
|
+
def save_stubs
|
211
|
+
stubs_str = arr_to_s(Context.get :STUBS)
|
212
|
+
$log.debug "saving stub conf: stubs=>#{stubs_str}"
|
213
|
+
modify_conf '127.0.0.1', USERNAME, PASSWORD, "#{STUB_PATH}server.conf", {'stubs'=>stubs_str}
|
214
|
+
end
|
215
|
+
|
216
|
+
def save_ports
|
217
|
+
ports_str = arr_to_s(Context.get :STUB_PORTS)
|
218
|
+
$log.debug "saving stub conf: ports=>#{ports_str}"
|
219
|
+
modify_conf '127.0.0.1', USERNAME, PASSWORD, "#{STUB_PATH}server.conf", {'ports'=>ports_str}
|
220
|
+
end
|
221
|
+
|
222
|
+
def save_actions
|
223
|
+
actions_str = arr_to_s(Context.get :STUB_ACTIONS)
|
224
|
+
$log.debug "saving stub conf: actions=>#{actions_str}"
|
225
|
+
modify_conf '127.0.0.1', USERNAME, PASSWORD, "#{STUB_PATH}server.conf", {'actions'=>actions_str}
|
226
|
+
end
|
227
|
+
|
228
|
+
def save_heads
|
229
|
+
heads_str = arr_to_s(Context.get :STUB_HEADS)
|
230
|
+
$log.debug "saving stub conf: heads=>#{heads_str}"
|
231
|
+
modify_conf '127.0.0.1', USERNAME, PASSWORD, "#{STUB_PATH}server.conf", {'heads'=>heads_str}
|
232
|
+
end
|
233
|
+
|
234
|
+
def save_files
|
235
|
+
files_str = arr_to_s(Context.get :STUB_FILES)
|
236
|
+
$log.debug "saving stub conf: files=>#{files_str}"
|
237
|
+
modify_conf '127.0.0.1', USERNAME, PASSWORD, "#{STUB_PATH}server.conf", {'files'=>files_str}
|
238
|
+
end
|
239
|
+
|
240
|
+
# ===功能
|
241
|
+
# 将上下文中的桩相关内容持久化到server.conf文件中
|
242
|
+
# ===example
|
243
|
+
# save_to_conf
|
244
|
+
def save_to_conf
|
245
|
+
save_stubs
|
246
|
+
save_ports
|
247
|
+
save_actions
|
248
|
+
save_heads
|
249
|
+
save_files
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
|
254
|
+
if __FILE__ == $0
|
255
|
+
require 'test/unit'
|
256
|
+
require "#{File.dirname(__FILE__)}/../conf/conf"
|
257
|
+
|
258
|
+
class StubTest < Test::Unit::TestCase
|
259
|
+
include Stub
|
260
|
+
def no_test_start_stub
|
261
|
+
start_stub 'stub1'=>11111, 'stub2'=>22222
|
262
|
+
end
|
263
|
+
|
264
|
+
def no_test_arr_to_s
|
265
|
+
puts arr_to_s ["stub1", "stub2"]
|
266
|
+
end
|
267
|
+
|
268
|
+
def no_test_get_idx_by_name
|
269
|
+
puts get_idx_by_name "stub2", ['stub1', 'stub2', 'stub3']
|
270
|
+
puts get_idx_by_name "stub4", ['stub1', 'stub2', 'stub3']
|
271
|
+
puts get_idx_by_name "stub2", []
|
272
|
+
puts get_idx_by_name "stub2", nil
|
273
|
+
|
274
|
+
end
|
275
|
+
end
|
276
|
+
end
|
@@ -0,0 +1,266 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# coding: utf-8
|
3
|
+
$LOAD_PATH << File.join(File.dirname(__FILE__), '.')
|
4
|
+
$LOAD_PATH << File.join(File.dirname(__FILE__), '../conf/')
|
5
|
+
#require 'log4s'
|
6
|
+
require 'conf'
|
7
|
+
|
8
|
+
|
9
|
+
#============================================================
|
10
|
+
# 基础库辅助类
|
11
|
+
# Author:: chenjie
|
12
|
+
# Data:: 2009-4-30
|
13
|
+
#============================================================
|
14
|
+
class Util
|
15
|
+
|
16
|
+
# ===功能
|
17
|
+
# 判断传入ip是否是本机ip
|
18
|
+
# return: true/false
|
19
|
+
# ===example
|
20
|
+
# Util.is_localhost? "10.4.34.23"
|
21
|
+
def Util.is_localhost? ip
|
22
|
+
#get localhost ip
|
23
|
+
local_ip = `hostname -i`.chomp
|
24
|
+
|
25
|
+
if ( (ip == nil) || (ip == local_ip) || (ip == "127.0.0.1") || (ip == "localhost") ) then
|
26
|
+
return true
|
27
|
+
else
|
28
|
+
return false
|
29
|
+
end
|
30
|
+
end
|
31
|
+
=begin
|
32
|
+
# get the data value from the staf returned string like below:
|
33
|
+
# - staf_str
|
34
|
+
# {
|
35
|
+
# Return Code: 0
|
36
|
+
# Key : <None>
|
37
|
+
# Files : [
|
38
|
+
# {
|
39
|
+
# Return Code: 0
|
40
|
+
# Data : 10555005
|
41
|
+
# }
|
42
|
+
# ]
|
43
|
+
# }
|
44
|
+
# will return the data value 10555005,and return empty array if fail
|
45
|
+
#
|
46
|
+
# return the data value string array
|
47
|
+
def Util.get_staf_data(staf_str)
|
48
|
+
data = Array.new
|
49
|
+
flag = false
|
50
|
+
|
51
|
+
|
52
|
+
staf_str.split("\n").each{|line|
|
53
|
+
if flag == false then
|
54
|
+
mdata = line.strip.scan(/^Data.*:(.*)/)
|
55
|
+
if mdata.size > 0 then
|
56
|
+
flag = true
|
57
|
+
data<<mdata[0][0].to_s.strip.chomp
|
58
|
+
end
|
59
|
+
else
|
60
|
+
#get all the data below until "}"
|
61
|
+
s = line.strip.chomp
|
62
|
+
if s == "}" then
|
63
|
+
return data
|
64
|
+
else
|
65
|
+
if s.length > 0 then
|
66
|
+
data << s
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
}
|
71
|
+
|
72
|
+
return data
|
73
|
+
end
|
74
|
+
|
75
|
+
# 执行staf命令
|
76
|
+
# - host remote machine ip
|
77
|
+
# - cmdstr shell cmd string
|
78
|
+
# return data segment string
|
79
|
+
def Util.exe_staf_cmd(host, cmdstr)
|
80
|
+
staf_cmd = "staf #{host} process start shell command 'source ~/.bash_profile && #{cmdstr}' WAIT RETURNSTDOUT STDERRTOSTDOUT"
|
81
|
+
$log.debug "STAF_CMD=#{staf_cmd}"
|
82
|
+
res = `#{staf_cmd}`
|
83
|
+
$log.debug "STAF_RES=#{res}"
|
84
|
+
return Util.get_staf_data(res)
|
85
|
+
end
|
86
|
+
=end
|
87
|
+
|
88
|
+
|
89
|
+
# ===功能
|
90
|
+
# 返回指定机器的lib路径, 执行staf命令相关
|
91
|
+
# - ip 目标机器ip, string
|
92
|
+
# return string, 目标机器上部署的lib路径
|
93
|
+
# ===example
|
94
|
+
# Util.get_lib_path host
|
95
|
+
def Util.get_lib_path host, user=USERNAME, password=PASSWORD
|
96
|
+
if Util.is_localhost? host then
|
97
|
+
return LIB_ROOT
|
98
|
+
else
|
99
|
+
cmd_str = "echo $HOME"
|
100
|
+
home = Util.exe_ssh_cmd! host, cmd_str, user, password
|
101
|
+
#return "#{home}/tools/app-test/search/space/module-test/lib/"
|
102
|
+
return "#{home}/tools/rlib/"
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
# ===功能
|
107
|
+
# 在远程机器上执行命令
|
108
|
+
# 封装Net::SSH::Connection::Session.exe!
|
109
|
+
# Same as exec, except this will block until the command finishes
|
110
|
+
# ===example
|
111
|
+
# Util.exe_ssh_cmd! host, "killall -9 friend"
|
112
|
+
def Util.exe_ssh_cmd! host, cmd_str, user=USERNAME, password=PASSWORD
|
113
|
+
ssh_cmd = "source ~/.bash_profile && #{cmd_str}"
|
114
|
+
$log.debug "SSH CMD = #{ssh_cmd}"
|
115
|
+
res = ''
|
116
|
+
Net::SSH.start(host, user, :password=>password) do |session|
|
117
|
+
res = session.exec! ssh_cmd
|
118
|
+
end
|
119
|
+
res = res.to_s.strip.chomp
|
120
|
+
$log.debug "SSH CMD RES = #{res}"
|
121
|
+
return res
|
122
|
+
end
|
123
|
+
|
124
|
+
# ===功能
|
125
|
+
# 在远程机器上执行命令
|
126
|
+
# 封装Net::SSH::Connection::Session.exe
|
127
|
+
# "Note that this method returns immediately, and requires an event loop (see Session#loop) in order for the command to actually execute."
|
128
|
+
# ===example
|
129
|
+
# Util.exe_ssh_cmd host, "ls"
|
130
|
+
def Util.exe_ssh_cmd host, cmd_str, user=USERNAME, password=PASSWORD
|
131
|
+
ssh_cmd = "source ~/.bash_profile && #{cmd_str}"
|
132
|
+
$log.debug "SSH CMD = #{ssh_cmd}"
|
133
|
+
res = ''
|
134
|
+
Net::SSH.start(host, user, :password=>password) do |session|
|
135
|
+
res = session.exec ssh_cmd
|
136
|
+
end
|
137
|
+
res = res.to_s.strip.chomp
|
138
|
+
$log.debug "SSH CMD RES = #{res}"
|
139
|
+
return res
|
140
|
+
end
|
141
|
+
|
142
|
+
# ===功能
|
143
|
+
#返回本机IP(非127.0.0.1)
|
144
|
+
# ===example
|
145
|
+
# lip = Util.get_local_ip
|
146
|
+
def Util.get_local_ip
|
147
|
+
ip = `hostname -i`
|
148
|
+
return ip
|
149
|
+
end
|
150
|
+
|
151
|
+
# ===功能
|
152
|
+
# scp远端文件到本机
|
153
|
+
# ===example
|
154
|
+
# Util.download host, remote, local
|
155
|
+
def Util.download host, remote_path, local_path, user=USERNAME, password=PASSWORD
|
156
|
+
Net::SCP.start(host, user, :password=>password) do | scp |
|
157
|
+
scp.download! remote_path, local_path
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
# ===功能
|
162
|
+
# scp本机文件到远端
|
163
|
+
# ===example
|
164
|
+
# Util.upload host, local, remote
|
165
|
+
def Util.upload host, local_path, remote_path, user=USERNAME, password=PASSWORD
|
166
|
+
Net::SCP.start(host, user, :password=>password) do | scp |
|
167
|
+
scp.upload! local_path, remote_path
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
# ===功能
|
172
|
+
# scp文件从机器a到机器b
|
173
|
+
# 如果远程多层子目录不存在则自动的进行创建
|
174
|
+
# ===example
|
175
|
+
# Util.scpfromto hosta, remotea, hostb, remoteb, usera, passa, userb, passb
|
176
|
+
def Util.scpfromto host_a, remote_path_a, host_b, remote_path_b, user_a, password_a, user_b, password_b
|
177
|
+
sfix = Util.suffix
|
178
|
+
local_path="/tmp/localfile.#{sfix}"
|
179
|
+
Net::SCP.start(host_a, user_a, :password=>password_a) do | scp |
|
180
|
+
scp.download! remote_path_a, local_path do |ch, name, sent, total|
|
181
|
+
print "."
|
182
|
+
end
|
183
|
+
puts ""
|
184
|
+
end
|
185
|
+
if(remote_path_b=~/(\/.*)\/[^\/]*/)
|
186
|
+
puts "Make sure dir exist #{$1}"
|
187
|
+
`mkdir -p #{$1}`
|
188
|
+
end
|
189
|
+
Net::SCP.start(host_b, user_b, :password=>password_b) do | scp |
|
190
|
+
scp.upload! local_path, remote_path_b do |ch, name, sent, total|
|
191
|
+
print "."
|
192
|
+
end
|
193
|
+
puts ""
|
194
|
+
end
|
195
|
+
File.delete(local_path)
|
196
|
+
end
|
197
|
+
|
198
|
+
# ===功能
|
199
|
+
# scp文件夹从机器a到机器b
|
200
|
+
# 如果远程多层子目录不存在则自动的进行创建
|
201
|
+
# ===example
|
202
|
+
# Util.scpfromtod hosta, remotea, hostb, remoteb, usera, passa, userb, passb
|
203
|
+
def Util.scpfromtod host_a, remote_path_a, host_b, remote_path_b, user_a, password_a, user_b, password_b
|
204
|
+
sfix = Util.suffix
|
205
|
+
dirname = `basename #{remote_path_b}`.chop!
|
206
|
+
local_path="/tmp/localfile.#{sfix}"
|
207
|
+
Net::SCP.start(host_a, user_a, :password=>password_a) do | scp |
|
208
|
+
scp.download! remote_path_a, local_path, :recursive=>"yes" do |ch, name, sent, total|
|
209
|
+
print "."
|
210
|
+
end
|
211
|
+
puts ""
|
212
|
+
end
|
213
|
+
if(remote_path_b=~/(\/.*)\/[^\/]*/)
|
214
|
+
puts "Make sure dir exist #{$1}"
|
215
|
+
`mkdir -p #{$1}`
|
216
|
+
end
|
217
|
+
Net::SCP.start(host_b, user_b, :password=>password_b) do | scp |
|
218
|
+
scp.upload! local_path+"/#{dirname}", remote_path_b, :recursive=>"yes" do |ch, name, sent, total|
|
219
|
+
print "."
|
220
|
+
end
|
221
|
+
puts ""
|
222
|
+
end
|
223
|
+
#Dir.rmdir(local_path)
|
224
|
+
`rm -fr #{local_path}`
|
225
|
+
end
|
226
|
+
|
227
|
+
# ===功能
|
228
|
+
# 获取文件,操作文件,放回文件
|
229
|
+
# ===example
|
230
|
+
# Util.change_in_local host, remotepath
|
231
|
+
def Util.change_in_local host, remote_path, user=USERNAME, password=PASSWORD
|
232
|
+
sfix = Util.suffix
|
233
|
+
local_path="/tmp/localfile.#{sfix}"
|
234
|
+
Util.download host, remote_path, local_path, user, password
|
235
|
+
yield local_path
|
236
|
+
Util.upload host, local_path, remote_path, user, password
|
237
|
+
File.delete(local_path)
|
238
|
+
end
|
239
|
+
|
240
|
+
# ===功能
|
241
|
+
# 获取全局唯一的后缀
|
242
|
+
# ===example
|
243
|
+
# su = Util.suffix
|
244
|
+
def Util.suffix
|
245
|
+
return "#{Time.now.tv_sec}#{Time.now.tv_usec}"
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
249
|
+
|
250
|
+
if __FILE__ == $0 then
|
251
|
+
require 'test/unit'
|
252
|
+
class UtilTest < Test::Unit::TestCase
|
253
|
+
def no_test_ssh_cmd!
|
254
|
+
puts Util.exe_ssh_cmd! '10.241.14.56', 'ls'
|
255
|
+
puts Util.exe_ssh_cmd! '10.241.14.56', 'cd app-test/search/space/module-test/lib/data/ && ruby data_helper.rb file_exist? data_helper.rb'
|
256
|
+
end
|
257
|
+
|
258
|
+
def no_test_get_lib_path
|
259
|
+
puts Util.get_lib_path '10.241.14.56'
|
260
|
+
end
|
261
|
+
|
262
|
+
def test_get_local_ip
|
263
|
+
puts Util.get_local_ip
|
264
|
+
end
|
265
|
+
end
|
266
|
+
end
|