solutious-stella 0.5.5 → 0.6.0

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.
Files changed (83) hide show
  1. data/CHANGES.txt +39 -2
  2. data/LICENSE.txt +19 -0
  3. data/README.rdoc +85 -0
  4. data/Rakefile +54 -59
  5. data/bin/example_test.rb +82 -0
  6. data/bin/example_webapp.rb +63 -0
  7. data/lib/{stella/logger.rb → logger.rb} +6 -11
  8. data/lib/stella.rb +76 -58
  9. data/lib/stella/clients.rb +161 -0
  10. data/lib/stella/command/base.rb +4 -24
  11. data/lib/stella/command/form.rb +36 -0
  12. data/lib/stella/command/get.rb +44 -0
  13. data/lib/stella/common.rb +53 -0
  14. data/lib/stella/crypto.rb +88 -0
  15. data/lib/stella/data/domain.rb +2 -2
  16. data/lib/stella/data/http.rb +164 -36
  17. data/lib/stella/environment.rb +66 -0
  18. data/lib/stella/functest.rb +105 -0
  19. data/lib/stella/loadtest.rb +186 -0
  20. data/lib/{utils → stella}/stats.rb +16 -20
  21. data/lib/stella/testplan.rb +237 -0
  22. data/lib/stella/testrunner.rb +64 -0
  23. data/lib/storable.rb +280 -0
  24. data/lib/threadify.rb +171 -0
  25. data/lib/timeunits.rb +65 -0
  26. data/lib/util/httputil.rb +266 -0
  27. data/stella.gemspec +69 -0
  28. data/tryouts/drb/drb_test.rb +65 -0
  29. data/tryouts/drb/open4.rb +19 -0
  30. data/tryouts/drb/slave.rb +27 -0
  31. data/tryouts/oo_tryout.rb +30 -0
  32. metadata +39 -107
  33. data/README.textile +0 -162
  34. data/bin/stella +0 -12
  35. data/bin/stella.bat +0 -12
  36. data/lib/daemonize.rb +0 -56
  37. data/lib/pcaplet.rb +0 -180
  38. data/lib/stella/adapter/ab.rb +0 -337
  39. data/lib/stella/adapter/base.rb +0 -106
  40. data/lib/stella/adapter/httperf.rb +0 -305
  41. data/lib/stella/adapter/pcap_watcher.rb +0 -221
  42. data/lib/stella/adapter/proxy_watcher.rb +0 -76
  43. data/lib/stella/adapter/siege.rb +0 -341
  44. data/lib/stella/cli.rb +0 -258
  45. data/lib/stella/cli/agents.rb +0 -73
  46. data/lib/stella/cli/base.rb +0 -55
  47. data/lib/stella/cli/language.rb +0 -18
  48. data/lib/stella/cli/localtest.rb +0 -78
  49. data/lib/stella/cli/sysinfo.rb +0 -16
  50. data/lib/stella/cli/watch.rb +0 -278
  51. data/lib/stella/command/localtest.rb +0 -358
  52. data/lib/stella/response.rb +0 -85
  53. data/lib/stella/storable.rb +0 -201
  54. data/lib/stella/support.rb +0 -276
  55. data/lib/stella/sysinfo.rb +0 -257
  56. data/lib/stella/test/definition.rb +0 -79
  57. data/lib/stella/test/run/summary.rb +0 -70
  58. data/lib/stella/test/stats.rb +0 -114
  59. data/lib/stella/text.rb +0 -64
  60. data/lib/stella/text/resource.rb +0 -38
  61. data/lib/utils/crypto-key.rb +0 -84
  62. data/lib/utils/domainutil.rb +0 -47
  63. data/lib/utils/escape.rb +0 -302
  64. data/lib/utils/fileutil.rb +0 -78
  65. data/lib/utils/httputil.rb +0 -266
  66. data/lib/utils/mathutil.rb +0 -15
  67. data/lib/utils/textgraph.rb +0 -267
  68. data/lib/utils/timerutil.rb +0 -58
  69. data/lib/win32/Console.rb +0 -970
  70. data/lib/win32/Console/ANSI.rb +0 -305
  71. data/support/kvm.h +0 -91
  72. data/support/ruby-pcap-takuma-notes.txt +0 -19
  73. data/support/ruby-pcap-takuma-patch.txt +0 -30
  74. data/support/text/en.yaml +0 -80
  75. data/support/text/nl.yaml +0 -7
  76. data/support/useragents.txt +0 -75
  77. data/tests/01-util_test.rb +0 -0
  78. data/tests/02-stella-util_test.rb +0 -42
  79. data/tests/10-stella_test.rb +0 -104
  80. data/tests/11-stella-storable_test.rb +0 -68
  81. data/tests/60-stella-command_test.rb +0 -248
  82. data/tests/80-stella-cli_test.rb +0 -45
  83. data/tests/spec-helper.rb +0 -31
@@ -0,0 +1,44 @@
1
+
2
+ require 'httpclient'
3
+
4
+ require 'util/httputil'
5
+
6
+ require 'stella/command/base'
7
+ require 'stella/data/http'
8
+
9
+ # NOTE: Not working
10
+
11
+ #
12
+ #
13
+ module Stella::Command #:nodoc: all
14
+ class Get < Drydock::Command #:nodoc: all
15
+ include Stella::Command::Base
16
+
17
+ attr_accessor :raw
18
+ attr_accessor :uri
19
+ attr_accessor :proxy
20
+
21
+ def run
22
+ @req ||= req
23
+ raise "No request defined" unless @req
24
+
25
+ c = (@proxy) ? HTTPClient.new(@proxy) : HTTPClient.new
26
+ c.get @req.uri, @req.headers
27
+ end
28
+
29
+ def read_raw
30
+ Stella.info("Enter the raw GET request:")
31
+ @raw = gets
32
+ while raw !~ /^#{$/}$/
33
+ val = gets
34
+ @raw << val if val
35
+ end
36
+ @raw
37
+ end
38
+
39
+ def req
40
+
41
+ end
42
+
43
+ end
44
+ end
@@ -0,0 +1,53 @@
1
+
2
+
3
+ module Stella
4
+ module Common
5
+ class Auth
6
+ attr_accessor :type
7
+ attr_accessor :user
8
+ attr_accessor :pass
9
+ attr_accessor :port
10
+ def initialize(type, user, pass=nil, port=nil)
11
+ @uri = type
12
+ @user = user
13
+ @pass = pass if pass
14
+ @port = port if port
15
+ end
16
+ end
17
+ class Proxy
18
+ attr_accessor :uri
19
+ attr_accessor :user
20
+ attr_accessor :pass
21
+ def initialize(uri, user=nil, pass=nil)
22
+ @uri = uri
23
+ @user = user if user
24
+ @pass = pass if pass
25
+ end
26
+ end
27
+ class Machine
28
+ attr_accessor :host
29
+ attr_accessor :port
30
+ attr_accessor :role
31
+ attr_accessor :ssh
32
+
33
+ def initialize(*args)
34
+ raise "You must at least a hostname or IP address" if args.empty?
35
+ if args.first.is_a? String
36
+ @host, @port = args.first.split(":")
37
+ else
38
+ @host, @port, @role = args.flatten
39
+ end
40
+ @role ||= "app"
41
+ @port = @port.to_i if @port
42
+ end
43
+ def to_s
44
+ str = "#{@host}"
45
+ str << ":#{@port}" if @port
46
+ str
47
+ end
48
+ end
49
+ end
50
+ end
51
+
52
+
53
+
@@ -0,0 +1,88 @@
1
+ require 'base64'
2
+
3
+ if RUBY_PLATFORM !~ /java/
4
+ require 'openssl'
5
+ else
6
+ module JRuby #:nodoc:
7
+ module OpenSSL #:nodoc:
8
+ GEM_ONLY = false unless defined?(GEM_ONLY)
9
+ end
10
+ end
11
+
12
+ if JRuby::OpenSSL::GEM_ONLY
13
+ require 'jruby/openssl/gem'
14
+ else
15
+ module OpenSSL #:nodoc:all
16
+ class OpenSSLError < StandardError; end
17
+ # These require the gem
18
+ %w[
19
+ ASN1
20
+ BN
21
+ Cipher
22
+ Config
23
+ Netscape
24
+ PKCS7
25
+ PKey
26
+ Random
27
+ SSL
28
+ X509
29
+ ].each {|c| autoload c, "jruby/openssl/gem"}
30
+ end
31
+ require "jruby/openssl/builtin"
32
+ end
33
+ end
34
+
35
+ # A small collection of helper methods for dealing with RSA keys.
36
+ module Stella::Crypto
37
+ VERSION = 1.0
38
+
39
+ def self.create_keys(bits = 2048)
40
+ pk = OpenSSL::PKey::RSA.new(bits)
41
+ end
42
+
43
+ @@digest = OpenSSL::Digest::Digest.new("sha1")
44
+ def self.sign(secret, string)
45
+ sig = OpenSSL::HMAC.hexdigest(@@digest, secret, string).strip
46
+ #sig.gsub(/\+/, "%2b")
47
+ end
48
+ def self.aws_sign(secret, string)
49
+ Base64.encode64(self.sign(secret, string)).strip
50
+ end
51
+
52
+ # A class which represents an RSA or DSA key.
53
+ class Key
54
+ attr_reader :data, :key
55
+
56
+ # Create an instance of Crypto::Key with the provided rsa or dsa
57
+ # public or private key data.
58
+ def initialize(data)
59
+ @data = data
60
+ @public = (data =~ /^-----BEGIN (RSA|DSA) PRIVATE KEY-----$/).nil?
61
+ @key = OpenSSL::PKey::RSA.new(@data)
62
+ end
63
+
64
+ # Create an instance of Crypto::Key using a key file.
65
+ # key = Crypto::Key.from_file('path/2/id_rsa')
66
+ def self.from_file(filename)
67
+ self.new File.read( filename )
68
+ end
69
+
70
+ # Encrypt and base64 encode the given text.
71
+ def encrypt(text)
72
+ Base64.encode64(@key.send("#{type}_encrypt", text))
73
+ end
74
+
75
+ # Decrypt the given base64 encoded text.
76
+ def decrypt(text)
77
+ @key.send("#{type}_decrypt", Base64.decode64(text))
78
+ end
79
+
80
+ def private?(); !@public; end
81
+ def public?(); @public; end
82
+
83
+ def type
84
+ @public ? :public : :private
85
+ end
86
+ end
87
+ end
88
+
@@ -1,7 +1,7 @@
1
1
 
2
2
 
3
3
  module Stella::Data
4
- class DomainRequest < Stella::Storable
4
+ class DomainRequest < Storable
5
5
  attr_accessor :dns_data
6
6
  attr_reader :raw_data
7
7
 
@@ -40,7 +40,7 @@ module Stella::Data
40
40
 
41
41
  end
42
42
 
43
- class DomainResponse < Stella::Storable
43
+ class DomainResponse < Storable
44
44
  attr_accessor :dns_data
45
45
  attr_reader :raw_data
46
46
 
@@ -1,5 +1,6 @@
1
1
 
2
- require 'utils/httputil'
2
+ require 'storable'
3
+ require 'util/httputil'
3
4
  require 'base64'
4
5
 
5
6
  module Stella::Data
@@ -7,7 +8,7 @@ module Stella::Data
7
8
  # TODO: Implement HTTPHeaders. We should be printing untouched headers.
8
9
  # HTTPUtil should split the HTTP event lines and that's it. Replace
9
10
  # parse_header_body with split_header_body
10
- class HTTPHeaders < Stella::Storable
11
+ class HTTPHeaders < Storable
11
12
  attr_reader :raw_data
12
13
 
13
14
  def to_s
@@ -16,41 +17,125 @@ module Stella::Data
16
17
 
17
18
  end
18
19
 
19
- class HTTPRequest < Stella::Storable
20
+ class HTTPBody < Storable
21
+ field :content_type
22
+ field :form_param
23
+ field :content
24
+
25
+ def has_content?
26
+ !@content.nil?
27
+ end
28
+
29
+ end
30
+
31
+ class HTTPRequest < Storable
32
+ # A string representing a raw HTTP request
20
33
  attr_reader :raw_data
21
34
 
35
+ # A hash containing blocks to be executed depending on the HTTP response status.
36
+ # The hash keys are numeric HTTP Status Codes.
37
+ #
38
+ # 200 => { ... }
39
+ # 304 => { ... }
40
+ # 500 => { ... }
41
+ #
42
+ attr_accessor :response_handler
43
+
44
+ field :name
45
+ field :stella_id
46
+ field :unique_id
22
47
  field :time => DateTime
23
- field :client_ip => String
24
- field :server_ip => String
25
- field :header => String
26
- field :uri => String
27
- field :body => String
28
- field :method => String
29
- field :http_version => String
48
+ field :client_ip
49
+ field :server_ip
50
+ field :header
51
+ field :uri
52
+ field :params
53
+ field :body
54
+ field :http_method
55
+ field :http_version
56
+
30
57
 
31
58
  def has_body?
32
- @body && !@body.nil & !@body.empty?
59
+ !@body.nil? && !@body.empty?
33
60
  end
34
61
  def has_request?
35
62
  false
36
63
  end
37
- def has_response?
38
- (@response && @response.status && !@response.status.nil?)
64
+
65
+ def initialize (uri_str, method="GET", version="1.1")
66
+ @uri = (uri_str.is_a? String) ? URI.parse(uri_str) : uri
67
+ @http_method = method
68
+ @http_version = version
69
+ @headers = {}
70
+ @params = {}
71
+ @response_handler = {}
72
+ @time = Time.now
73
+ @stella_id = Stella::Crypto.sign(time.to_i.to_s, "#{@http_method}/#{@uri}/#{@params}")
74
+ @unique_id = nil
75
+ @body = HTTPBody.new
39
76
  end
40
77
 
41
- def initialize(raw_data=nil)
78
+ def set_unique_id(seasoning=rand)
79
+ @unique_id = Stella::Crypto.sign(rand.to_s + seasoning.to_s, "#{@http_method}/#{@uri}/#{@params}")
80
+ end
81
+
82
+
83
+ def from_raw(raw_data=nil)
42
84
  @raw_data = raw_data
43
- if @raw_data
44
- @method, @http_version, @uri, @header, @body = HTTPUtil::parse_http_request(raw_data)
85
+ @http_method, @http_version, @uri, @header, @body = self.parse(@raw_data)
86
+ @time = DateTime.now
87
+ end
88
+
89
+ def self.parse(raw)
90
+ return unless raw
91
+ HTTPUtil::parse_http_request(raw, @uri.host, @uri.port)
92
+ end
93
+
94
+
95
+ def add_header(*args)
96
+ name, value = (args[0].is_a? Hash) ? args[0].to_a.flatten : args
97
+ @headers[name.to_s] ||= []
98
+ @headers[name.to_s] << value
99
+ end
100
+ def add_param(*args)
101
+ name, value = (args[0].is_a? Hash) ? args[0].to_a.flatten : args
102
+
103
+ # BUG: This auto-array shit is causing a problem where the one request
104
+ # will set the param and then next will set it again and it becomes
105
+ # an array.
106
+ #if @params[name.to_s] && !@params[name.to_s].is_a?(Array)
107
+ # @params[name.to_s] = [@params[name.to_s]]
108
+ #else
109
+ # @params[name.to_s] = ""
110
+ #end
111
+
112
+ @params[name.to_s] = value.to_s
113
+ end
114
+
115
+ def add_response_handler(*args, &b)
116
+ args << 200 if args.empty?
117
+ args.each do |status|
118
+ @response_handler[status] = b
45
119
  end
46
- @response = Stella::Data::HTTPResponse.new
47
120
  end
48
121
 
49
- def uri
50
- @uri.host = @server_ip.to_s if @uri && (@uri.host == 'unknown' || @uri.host.empty?)
51
- @uri
122
+ # +content+ can be literal content or a file path
123
+ def add_body(content, form_param=nil, content_type=nil)
124
+ @body = Stella::Data::HTTPBody.new
125
+
126
+ @body.form_param = form_param if form_param
127
+ @body.content_type = content_type if content_type
128
+
129
+ if File.exists?(content)
130
+ @body.content = File.new(content)
131
+ @body.content_type ||= "application/x-www-form-urlencoded"
132
+ else
133
+ @body.content = content
134
+ end
135
+
52
136
  end
53
137
 
138
+
54
139
  def body
55
140
  return nil unless @body
56
141
  @body
@@ -58,26 +143,35 @@ module Stella::Data
58
143
  end
59
144
 
60
145
 
61
-
62
- def inspect
146
+ def headers
147
+ return [] unless header
63
148
  headers = []
64
149
  header.each_pair do |n,v|
65
- headers << "#{n.to_s.gsub('_', '-')}: #{v[0]}"
150
+ headers << [n.to_s.gsub('_', '-'), v[0]]
66
151
  end
67
- str = "%s %s HTTP/%s" % [method, uri.to_s, http_version]
68
- str << $/ + headers.join($/)
69
- str << $/ + $/ + body if body
152
+ headers
153
+ end
154
+
155
+ def inspect
156
+ str = "%s %s HTTP/%s" % [http_method, uri.to_s, http_version]
157
+ str << $/ + headers.join($/) unless headers.empty?
158
+ str << $/ + $/ + body.to_s if body
70
159
  str
71
160
  end
72
161
 
73
162
  def to_s
74
- str = "%s: %s %s HTTP/%s" % [time.strftime(NICE_TIME_FORMAT), method, uri.to_s, http_version]
163
+ str = "%s: %s %s HTTP/%s" % [time.strftime(NICE_TIME_FORMAT), http_method, uri.to_s, http_version]
75
164
  str
76
165
  end
77
166
 
167
+ def cookies
168
+ return [] if !header.is_a?(Hash) || header[:Cookie].empty?
169
+ header[:Cookie]
170
+ end
171
+
78
172
  end
79
173
 
80
- class HTTPResponse < Stella::Storable
174
+ class HTTPResponse < Storable
81
175
  attr_reader :raw_data
82
176
 
83
177
  field :time => DateTime
@@ -91,13 +185,16 @@ module Stella::Data
91
185
 
92
186
  def initialize(raw_data=nil)
93
187
  @raw_data = raw_data
94
- if @raw_data
95
- @status, @http_version, @message, @header, @body = HTTPUtil::parse_http_response(@raw_data)
96
- end
188
+ parse(@raw_data)
189
+ end
190
+
191
+ def parse(raw)
192
+ return unless raw
193
+ @status, @http_version, @message, @header, @body = HTTPUtil::parse_http_response(raw)
97
194
  end
98
195
 
99
196
  def has_body?
100
- @body && !@body.nil & !@body.empty?
197
+ !@body.nil? && !@body.empty?
101
198
  end
102
199
  def has_request?
103
200
  false
@@ -106,17 +203,42 @@ module Stella::Data
106
203
  false
107
204
  end
108
205
 
206
+
109
207
  def body
110
208
  return nil unless @body
111
- #Base64.encode64(@body)
112
- (!header || !header[:Content_Type] || header[:Content_Type] !~ /text/) ? '' : @body
209
+ #TODO: Move to HTTPResponse::Body.to_s
210
+ if is_binary?
211
+ "[skipping binary content]"
212
+ elsif is_gzip?
213
+ #require 'zlib'
214
+ #Zlib::Inflate.inflate(@body)
215
+ "[skipping gzip content]"
216
+ else
217
+ @body
218
+ end
113
219
  end
114
220
 
115
- def inspect
221
+ def headers
116
222
  headers = []
117
223
  header.each_pair do |n,v|
118
- headers << "#{n.to_s.gsub('_', '-')}: #{v[0]}"
224
+ headers << [n.to_s.gsub('_', '-'), v[0]]
119
225
  end
226
+ headers
227
+ end
228
+
229
+ def is_binary?
230
+ (!is_text?) == true
231
+ end
232
+
233
+ def is_text?
234
+ (!header[:Content_Type].nil? && (header[:Content_Type][0].is_a? String) && header[:Content_Type][0][/text/] != nil)
235
+ end
236
+
237
+ def is_gzip?
238
+ (!header[:Content_Encoding].nil? && (header[:Content_Encoding][0].is_a? String) && header[:Content_Encoding][0][/gzip/] != nil)
239
+ end
240
+
241
+ def inspect
120
242
  str = "HTTP/%s %s (%s)" % [@http_version, @status, @message]
121
243
  str << $/ + headers.join($/)
122
244
  str << $/ + $/ + body if body
@@ -127,5 +249,11 @@ module Stella::Data
127
249
  str = "%s: HTTP/%s %s (%s)" % [time.strftime(NICE_TIME_FORMAT), @http_version, @status, @message]
128
250
  str
129
251
  end
252
+
253
+
254
+ def cookies
255
+ return [] unless header.is_a?(Array) && !header[:Set_Cookie].empty?
256
+ header[:Set_Cookie]
257
+ end
130
258
  end
131
259
  end