mu 5.7.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (117) hide show
  1. data/Mu_Gem.html +1591 -0
  2. data/bin/mu +11 -0
  3. data/lib/mu.rb +65 -0
  4. data/lib/mu/api/ddt.rb +233 -0
  5. data/lib/mu/api/homepage.rb +54 -0
  6. data/lib/mu/api/muapi.rb +231 -0
  7. data/lib/mu/api/netconfig.rb +233 -0
  8. data/lib/mu/api/scale.rb +199 -0
  9. data/lib/mu/api/system.rb +40 -0
  10. data/lib/mu/client.rb +31 -0
  11. data/lib/mu/command.rb +28 -0
  12. data/lib/mu/command/api.rb +95 -0
  13. data/lib/mu/command/cmd_appid.rb +486 -0
  14. data/lib/mu/command/cmd_cli.rb +151 -0
  15. data/lib/mu/command/cmd_ddt.rb +449 -0
  16. data/lib/mu/command/cmd_homepage.rb +146 -0
  17. data/lib/mu/command/cmd_muapi.rb +361 -0
  18. data/lib/mu/command/cmd_netconfig.rb +262 -0
  19. data/lib/mu/command/cmd_runscale.rb +533 -0
  20. data/lib/mu/command/cmd_runscenario.rb +258 -0
  21. data/lib/mu/command/cmd_runverify.rb +336 -0
  22. data/lib/mu/command/cmd_scale.rb +333 -0
  23. data/lib/mu/command/cmd_system.rb +127 -0
  24. data/lib/mu/command/curl.rb +246 -0
  25. data/lib/mu/command/help.rb +29 -0
  26. data/lib/mu/curl/error.rb +54 -0
  27. data/lib/mu/curl/verify.rb +137 -0
  28. data/lib/mu/helper.rb +55 -0
  29. data/lib/mu/http_helper.rb +232 -0
  30. data/rdoc/classes/Mu.html +305 -0
  31. data/rdoc/classes/Mu/Client.html +265 -0
  32. data/rdoc/classes/Mu/Command.html +208 -0
  33. data/rdoc/classes/Mu/Command/API.html +524 -0
  34. data/rdoc/classes/Mu/Command/Cmd_appid.html +934 -0
  35. data/rdoc/classes/Mu/Command/Cmd_cli.html +515 -0
  36. data/rdoc/classes/Mu/Command/Cmd_ddt.html +1169 -0
  37. data/rdoc/classes/Mu/Command/Cmd_homepage.html +489 -0
  38. data/rdoc/classes/Mu/Command/Cmd_muapi.html +968 -0
  39. data/rdoc/classes/Mu/Command/Cmd_netconfig.html +743 -0
  40. data/rdoc/classes/Mu/Command/Cmd_runscale.html +970 -0
  41. data/rdoc/classes/Mu/Command/Cmd_runscenario.html +530 -0
  42. data/rdoc/classes/Mu/Command/Cmd_runverify.html +621 -0
  43. data/rdoc/classes/Mu/Command/Cmd_scale.html +939 -0
  44. data/rdoc/classes/Mu/Command/Cmd_system.html +426 -0
  45. data/rdoc/classes/Mu/Command/Curl.html +524 -0
  46. data/rdoc/classes/Mu/Command/Help.html +166 -0
  47. data/rdoc/classes/Mu/Curl.html +116 -0
  48. data/rdoc/classes/Mu/Curl/Error.html +157 -0
  49. data/rdoc/classes/Mu/Curl/Error/Authorize.html +178 -0
  50. data/rdoc/classes/Mu/Curl/Error/Connect.html +149 -0
  51. data/rdoc/classes/Mu/Curl/Error/DNS.html +113 -0
  52. data/rdoc/classes/Mu/Curl/Error/Region.html +160 -0
  53. data/rdoc/classes/Mu/Curl/Error/Status.html +149 -0
  54. data/rdoc/classes/Mu/Curl/Error/Timeout.html +149 -0
  55. data/rdoc/classes/Mu/Curl/Verify.html +282 -0
  56. data/rdoc/classes/Mu/Curl/Verify/Request.html +227 -0
  57. data/rdoc/classes/Mu/Curl/Verify/Response.html +187 -0
  58. data/rdoc/classes/Mu/Curl/Verify/Result.html +188 -0
  59. data/rdoc/classes/Mu/Ddt.html +914 -0
  60. data/rdoc/classes/Mu/Helper.html +308 -0
  61. data/rdoc/classes/Mu/Homepage.html +377 -0
  62. data/rdoc/classes/Mu/HttpHelper.html +639 -0
  63. data/rdoc/classes/Mu/Muapi.html +816 -0
  64. data/rdoc/classes/Mu/Netconfig.html +781 -0
  65. data/rdoc/classes/Mu/Scale.html +832 -0
  66. data/rdoc/classes/Mu/System.html +281 -0
  67. data/rdoc/classes/Object.html +148 -0
  68. data/rdoc/classes/TCTestMu.html +1793 -0
  69. data/rdoc/classes/Test.html +107 -0
  70. data/rdoc/classes/Test/Unit.html +107 -0
  71. data/rdoc/classes/Test/Unit/TestCase.html +113 -0
  72. data/rdoc/created.rid +1 -0
  73. data/rdoc/files/lib/mu/api/ddt_rb.html +101 -0
  74. data/rdoc/files/lib/mu/api/homepage_rb.html +101 -0
  75. data/rdoc/files/lib/mu/api/muapi_rb.html +101 -0
  76. data/rdoc/files/lib/mu/api/netconfig_rb.html +101 -0
  77. data/rdoc/files/lib/mu/api/scale_rb.html +101 -0
  78. data/rdoc/files/lib/mu/api/system_rb.html +101 -0
  79. data/rdoc/files/lib/mu/client_rb.html +101 -0
  80. data/rdoc/files/lib/mu/command/api_rb.html +101 -0
  81. data/rdoc/files/lib/mu/command/cmd_appid_rb.html +119 -0
  82. data/rdoc/files/lib/mu/command/cmd_cli_rb.html +108 -0
  83. data/rdoc/files/lib/mu/command/cmd_ddt_rb.html +117 -0
  84. data/rdoc/files/lib/mu/command/cmd_homepage_rb.html +115 -0
  85. data/rdoc/files/lib/mu/command/cmd_muapi_rb.html +116 -0
  86. data/rdoc/files/lib/mu/command/cmd_netconfig_rb.html +116 -0
  87. data/rdoc/files/lib/mu/command/cmd_runscale_rb.html +119 -0
  88. data/rdoc/files/lib/mu/command/cmd_runscenario_rb.html +115 -0
  89. data/rdoc/files/lib/mu/command/cmd_runverify_rb.html +117 -0
  90. data/rdoc/files/lib/mu/command/cmd_scale_rb.html +115 -0
  91. data/rdoc/files/lib/mu/command/cmd_system_rb.html +116 -0
  92. data/rdoc/files/lib/mu/command/curl_rb.html +101 -0
  93. data/rdoc/files/lib/mu/command/help_rb.html +101 -0
  94. data/rdoc/files/lib/mu/command_rb.html +107 -0
  95. data/rdoc/files/lib/mu/curl/error_rb.html +101 -0
  96. data/rdoc/files/lib/mu/curl/verify_rb.html +101 -0
  97. data/rdoc/files/lib/mu/helper_rb.html +101 -0
  98. data/rdoc/files/lib/mu/http_helper_rb.html +101 -0
  99. data/rdoc/files/lib/mu_rb.html +121 -0
  100. data/rdoc/files/test/helper_rb.html +112 -0
  101. data/rdoc/files/test/tc_test_mu_rb.html +111 -0
  102. data/rdoc/fr_class_index.html +68 -0
  103. data/rdoc/fr_file_index.html +55 -0
  104. data/rdoc/fr_method_index.html +374 -0
  105. data/rdoc/index.html +24 -0
  106. data/rdoc/rdoc-style.css +208 -0
  107. data/test/data/app_id_stats.csv +1 -0
  108. data/test/data/data_cgi.msl +94 -0
  109. data/test/data/data_cgi.xml +322 -0
  110. data/test/data/default_test.csv +3 -0
  111. data/test/data/ftp_with_channel.xml +1643 -0
  112. data/test/data/irc.xml +3837 -0
  113. data/test/data/scale_configuration.json +25 -0
  114. data/test/data/test_data_cgi_error.xml +35 -0
  115. data/test/helper.rb +18 -0
  116. data/test/tc_test_mu.rb +716 -0
  117. metadata +322 -0
@@ -0,0 +1,246 @@
1
+ class Mu
2
+ class Command
3
+ class Curl < Command
4
+ def cmd_help argv
5
+ help
6
+ end
7
+
8
+ def authorize_error e
9
+ base_url = "#{e.scheme}://#{e.host}:#{e.port}"
10
+ puts
11
+ error "You haven't verified that you are the dev/ops for #{e.host}"
12
+ puts
13
+ end
14
+
15
+ def cmd_run argv
16
+ args = parse_cli argv
17
+ if args['help']
18
+ return help
19
+ end
20
+
21
+ if not args['pattern']
22
+ verify args
23
+ return
24
+ end
25
+ end
26
+
27
+ alias_method :cmd_default, :cmd_run
28
+
29
+ private
30
+ def verify args
31
+ begin
32
+ job = ::Mu::Curl::Verify.execute args
33
+ result = job.result
34
+ print_verify_result args, result
35
+ rescue ::Mu::Curl::Error::Authorize => e
36
+ authorize_error e
37
+ rescue ::Mu::Curl::Error::Region => e
38
+ error "#{e.region}: #{e.message}"
39
+ rescue ::Mu::Curl::Error => e
40
+ error e.message
41
+ end
42
+ end
43
+
44
+ def print_verify_result args, result
45
+ rtt = result.duration
46
+ if rtt < 1.0
47
+ rtt = (rtt * 1000).floor.to_s + ' ms';
48
+ else
49
+ rtt = ("%.2f" % rtt) + ' sec';
50
+ end
51
+
52
+ puts "-" * 70
53
+ msg "#{result.region}: Response time of #{rtt}"
54
+ puts "-" * 70
55
+ puts
56
+
57
+ if args['dump-header'] || args['verbose']
58
+ puts "> " + result.request.line
59
+ result.request.headers.each_pair { |k, v| puts "> #{k}: #{v}\r\n" }
60
+ puts
61
+
62
+ content = result.request.content
63
+ if not content.empty?
64
+ if /^[[:print:]]+$/ =~ content
65
+ puts content
66
+ else
67
+ puts Hexy.new(content).to_s
68
+ end
69
+ puts
70
+ end
71
+
72
+ puts "< " + result.response.line
73
+ result.response.headers.each_pair { |k, v| puts "> #{k}: #{v}\r\n" }
74
+ puts
75
+ end
76
+
77
+ content = result.response.content
78
+ if not content.empty?
79
+ if /^[[:print:]]+$/ =~ content
80
+ puts content
81
+ else
82
+ puts Hexy.new(content).to_s
83
+ end
84
+ end
85
+ end
86
+
87
+ def help
88
+ helps = [
89
+ { :short => '-A', :long => '--user-agent', :value => '<string>', :help => 'User-Agent to send to server' },
90
+ { :short => '-b', :long => '--cookie', :value => 'name=<string>', :help => 'Cookie to send to the server (multiple)' },
91
+ { :short => '-d', :long => '--data', :value => '<string>', :help => 'Data to send in a PUT or POST request' },
92
+ { :short => '-D', :long => '--dump-header', :value => '<file>', :help => 'Print the request/response headers' },
93
+ { :short => '-e', :long => '--referer', :value => '<string>', :help => 'Referer URL' },
94
+ { :short => '-h', :long => '--help', :value => '', :help => 'Help on command line options' },
95
+ { :short => '-H', :long => '--header', :value => '<string>', :help => 'Custom header to pass to server' },
96
+ { :short => '-p', :long => '--pattern', :value => '<s>-<e>:<d>', :help => 'Ramp from s to e concurrent requests in d secs' },
97
+ { :short => '-r', :long => '--region', :value => '<string>', :help => 'Choose one of us-east or us-west' },
98
+ { :short => '-s', :long => '--status', :value => '<number>', :help => 'Assert on the HTTP response status code' },
99
+ { :short => '-T', :long => '--timeout', :value => '<ms>', :help => 'Wait time for both connect and responses' },
100
+ { :short => '-u', :long => '--user', :value => '<user[:pass]>', :help => 'User and password for authentication' },
101
+ { :short => '-X', :long => '--request', :value => '<string>', :help => 'Request method to use (GET, HEAD, PUT, etc.)' },
102
+ { :short => '-v', :long => '--verbose', :value => '', :help => 'Print the request/response headers' },
103
+ { :short => '-1', :long => '--tlsv1', :value => '', :help => 'Use TLSv1 (SSL)' },
104
+ { :short => '-2', :long => '--sslv2', :value => '', :help => 'Use SSLv2 (SSL)' },
105
+ { :short => '-3', :long => '--sslv3', :value => '', :help => 'Use SSLv3 (SSL)' }
106
+ ]
107
+
108
+ max_long_size = helps.inject(0) { |memo, obj| [ obj[:long].size, memo ].max }
109
+ max_value_size = helps.inject(0) { |memo, obj| [ obj[:value].size, memo ].max }
110
+ puts
111
+ msg "Usage: mu curl <options> <url>"
112
+ puts
113
+ helps.each do |h|
114
+ msg "%-*s %*s %-*s %s" % [max_long_size, h[:long], 2, h[:short], max_value_size, h[:value], h[:help]]
115
+ end
116
+ puts
117
+ end
118
+
119
+ def parse_cli argv
120
+ hash = Hash.new
121
+ while not argv.empty?
122
+ break if argv.first[0,1] != '-'
123
+
124
+ k = argv.shift
125
+ if [ '-A', '--user-agent' ].member? k
126
+ hash['user-agent'] = shift(k, argv)
127
+ next
128
+ end
129
+
130
+ if [ '-b', '--cookie' ].member? k
131
+ # TODO: support cookie jars
132
+ hash['cookies'] ||= []
133
+ hash['cookies'] << shift(k, argv)
134
+ next
135
+ end
136
+
137
+ if [ '-d', '--data' ].member? k
138
+ # TODO: Read from a file using the @syntax
139
+ hash['content'] ||= Hash.new
140
+ hash['content']['data'] ||= []
141
+ hash['content']['data'] << shift(k, argv)
142
+ next
143
+ end
144
+
145
+ if [ '-D', '--dump-header' ].member? k
146
+ hash['dump-header'] = shift(k, argv)
147
+ next
148
+ end
149
+
150
+ if [ '-e', '--referer'].member? k
151
+ hash['referer'] = shift(k, argv)
152
+ next
153
+ end
154
+
155
+ if [ '-h', '--help' ].member? k
156
+ hash['help'] = true
157
+ next
158
+ end
159
+
160
+ if [ '-H', '--header' ].member? k
161
+ hash['headers'] ||= []
162
+ hash['headers'].push shift(k, argv)
163
+ next
164
+ end
165
+
166
+ if [ '-p', '--pattern' ].member? k
167
+ v = shift(k, argv)
168
+ if not /^(\d+)-(\d+):(\d+)$/ =~ v
169
+ raise "invalid ramp pattern"
170
+ end
171
+ hash['pattern'] = {
172
+ 'iterations' => 1,
173
+ 'intervals' => [{
174
+ 'iterations' => 1,
175
+ 'start' => $1.to_i,
176
+ 'end' => $2.to_i,
177
+ 'duration' => $3.to_i
178
+ }]
179
+ }
180
+ next
181
+ end
182
+
183
+ if [ '-r', '--region' ].member? k
184
+ v = shift(k, argv)
185
+ if !v.include?("us-west") and !v.include?("us-east")
186
+ raise 'region must be one of us-west or us-east'
187
+ end
188
+ hash['region'] = v
189
+ next
190
+ end
191
+
192
+ if [ '-s', '--status' ].member? k
193
+ hash['status'] = shift(k, argv).to_i
194
+ next
195
+ end
196
+
197
+ if [ '-T', '--timeout' ].member? k
198
+ hash['timeout'] = shift(k, argv).to_i
199
+ next
200
+ end
201
+
202
+ if [ '-u', '--user' ].member? k
203
+ hash['user'] = shift(k, argv)
204
+ next
205
+ end
206
+
207
+ if [ '-X', '--request' ].member? k
208
+ hash['request'] = shift(k, argv)
209
+ next
210
+ end
211
+
212
+ if [ '-v', '--verbose' ].member? k
213
+ hash['verbose'] = true
214
+ next
215
+ end
216
+
217
+ if [ '-1', '--tlsv1' ].member? k
218
+ hash['ssl'] = 'tlsv1'
219
+ next
220
+ end
221
+
222
+ if [ '-2', '--sslv2' ].member? k
223
+ hash['ssl'] = 'sslv2'
224
+ next
225
+ end
226
+
227
+ if [ '-3', '--sslv3' ].member? k
228
+ hash['ssl'] = 'sslv2'
229
+ next
230
+ end
231
+
232
+ raise ArgumentError, "Unknown option #{k}"
233
+ end
234
+
235
+ if not hash['help']
236
+ url = argv.shift
237
+ raise 'no URL specified!' if url.nil?
238
+ hash['url'] = url
239
+ end
240
+
241
+ hash
242
+ end
243
+
244
+ end # Curl
245
+ end # Command
246
+ end # Mu
@@ -0,0 +1,29 @@
1
+ class Mu
2
+ class Command
3
+ class Help < Command
4
+ def cmd_default argv
5
+ puts
6
+ puts "Usage: mu <command>:<option>"
7
+ helps = [
8
+ { :cmd => 'mu help', :help => "Display this help" },
9
+ { :cmd => 'mu cmd_appid:help', :help => 'Show help on using the appid application for running multi-host msl files at scale'},
10
+ { :cmd => 'mu cmd_cli:help', :help => 'Show help on using the Mu CLI Api through the command-line' },
11
+ { :cmd => 'mu cmd_ddt:help', :help => 'Show help on using the Studio Verify Api through the command-line' },
12
+ { :cmd => 'mu cmd_homepage:help', :help => 'Show help on using the Homepage Api through the command-line' },
13
+ { :cmd => 'mu cmd_muapi:help', :help => 'Show help on using the Mu Api for fuzzing, templates, backup and archive' },
14
+ { :cmd => 'mu cmd_netconfig:help', :help => 'Show help on using the Netconfig Api through the command-line'},
15
+ { :cmd => 'mu cmd_runscale:help', :help => 'Show help on running the Studio Scale app'},
16
+ { :cmd => 'mu cmd_runscenario:help', :help => 'Show help on running the Scenario Editor Verify app' },
17
+ { :cmd => 'mu cmd_runverify:help', :help => 'Show help on running the Studio Verify app' },
18
+ { :cmd => 'mu cmd_scale:help', :help => 'Show help on using the Scale Api through the command-line' },
19
+ { :cmd => 'mu cmd_system:help', :help => 'Show help on using the System Api through the command-line' },
20
+ ]
21
+ max_cmd_size = helps.inject(0) { |memo, obj| [ obj[:cmd].size, memo ].max } + 4
22
+ helps.each do |h|
23
+ puts "%*s - %s" % [max_cmd_size, h[:cmd], h[:help]]
24
+ end
25
+ puts
26
+ end
27
+ end
28
+ end # Command
29
+ end # Mu
@@ -0,0 +1,54 @@
1
+ class Mu
2
+ module Curl
3
+ class Error < StandardError
4
+ def initialize json={}
5
+ super json['reason'] || "Hmmm, something went wrong. Try again in a little bit?"
6
+ end
7
+
8
+ class Authorize < Error
9
+ attr_reader :scheme, :host, :port, :uuid
10
+
11
+ def initialize json
12
+ @scheme = json['scheme']
13
+ @host = json['host']
14
+ @port = json['port']
15
+ @uuid = json['uuid']
16
+ super
17
+ end
18
+ end
19
+
20
+ class Region < Error
21
+ attr_reader :region
22
+
23
+ def initialize json
24
+ @region = json['region']
25
+ super
26
+ end
27
+ end
28
+
29
+ class DNS < Region
30
+ end
31
+
32
+ class Connect < Region
33
+ def initialize json
34
+ json['reason'] = "Can't connect to this server"
35
+ super
36
+ end
37
+ end
38
+
39
+ class Timeout < Region
40
+ def initialize json
41
+ json['reason'] = "Response timed out. Try increasing --timeout"
42
+ super
43
+ end
44
+ end
45
+
46
+ class Status < Region
47
+ def initialize json
48
+ json['reason'] = "Assertion on status failed"
49
+ super
50
+ end
51
+ end
52
+ end
53
+ end # Curl
54
+ end # Mu
@@ -0,0 +1,137 @@
1
+ class Mu
2
+ module Curl
3
+ class Verify
4
+ class Request
5
+ def self.parse data
6
+ ios = StringIO.new data.unpack('m')[0]
7
+ rqrs = { :line => '', :headers => [], :content => '' }
8
+ while true
9
+ line = ios.readline
10
+ break if not line or line == "\r\n"
11
+ if rqrs[:line].empty?
12
+ rqrs[:line] = line.chomp
13
+ else
14
+ if /^([^:]+):(.*)/ =~ line
15
+ key = $1
16
+ val = $2.strip
17
+ rqrs[:headers] << { :line => line.chomp, :key => key, :val => val }
18
+ end
19
+ end
20
+ end
21
+
22
+ rqrs[:content] = ios.read
23
+ return rqrs
24
+ end
25
+
26
+ attr_reader :line
27
+ attr_reader :method
28
+ attr_reader :url
29
+ attr_reader :headers
30
+ attr_reader :content
31
+
32
+ def initialize json
33
+ rq = Request.parse json['bytes'][0]['data']
34
+ @line = rq[:line]
35
+ @method, @url, _ = rq[:line].split(/\s+/, 3)
36
+ @content = rq[:content]
37
+ @headers = Hash.new
38
+ rq[:headers].each { |h| @headers[h[:key]] = h[:val] }
39
+ end
40
+ end
41
+
42
+ class Response
43
+ attr_reader :line
44
+ attr_reader :status
45
+ attr_reader :message
46
+ attr_reader :headers
47
+ attr_reader :content
48
+
49
+ def initialize json
50
+ rs = Request.parse json['bytes'][1]['data']
51
+ @line = rs[:line]
52
+ _, @status, @message = rs[:line].split(/\s+/, 3)
53
+ @status = @status.to_i
54
+ @content = rs[:content]
55
+ @headers = Hash.new
56
+ rs[:headers].each { |h| @headers[h[:key]] = h[:val] }
57
+ end
58
+ end
59
+
60
+ class Result
61
+ attr_reader :region
62
+ attr_reader :duration
63
+ attr_reader :connect
64
+ attr_reader :request
65
+ attr_reader :response
66
+
67
+ def initialize json
68
+ result = json['result']
69
+ stats = result['statistics']
70
+
71
+ @region = json['region']
72
+ @duration = stats['duration']['avg']
73
+ @connect = stats['steps'][0]['duration']['avg']
74
+ @request = Request.new result
75
+ @response = Response.new result
76
+ end
77
+ end
78
+
79
+ def self.execute args
80
+ args.delete 'pattern'
81
+
82
+ res = Command::API.client.curl args
83
+ if res['error']
84
+ if res['error'] == 'authorize'
85
+ raise Error::Authorize.new(res)
86
+ else
87
+ raise Error.new(res)
88
+ end
89
+ end
90
+
91
+ return self.new(res['job_id'])
92
+ end
93
+
94
+ attr_reader :job_id
95
+
96
+ def initialize job_id
97
+ @job_id = job_id
98
+ end
99
+
100
+ def result
101
+ while true
102
+ sleep 2.0
103
+
104
+ job = Command::API.client.job_status job_id
105
+ if job['error']
106
+ raise Error
107
+ end
108
+
109
+ result = job['result']
110
+ next if job['status'] == 'queued'
111
+ next if job['status'] == 'running' and not result
112
+
113
+ if result['error']
114
+ result['region'] = job['region']
115
+ if result['dns']
116
+ raise Error::DNS.new(result)
117
+ elsif result['step'] == 0
118
+ raise Error::Connect.new(result)
119
+ elsif result['step'] == 2
120
+ raise Error::Timeout.new(result)
121
+ elsif result['assert'] == 0
122
+ raise Error::Status.new(result)
123
+ else
124
+ raise Error
125
+ end
126
+ end
127
+
128
+ return Result.new(job)
129
+ end
130
+ end
131
+
132
+ def abort
133
+ Command::API.client.abort_job job_id rescue nil
134
+ end
135
+ end
136
+ end # Curl
137
+ end # Mu