scout 5.3.5 → 5.4.4.alpha
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/.gitignore +6 -0
- data/CHANGELOG +0 -12
- data/Gemfile +4 -0
- data/README +8 -0
- data/Rakefile +6 -108
- data/bin/scout +1 -0
- data/lib/scout.rb +5 -4
- data/lib/scout/command.rb +11 -12
- data/lib/scout/command/install.rb +1 -1
- data/lib/scout/command/run.rb +13 -1
- data/lib/scout/command/sign.rb +2 -8
- data/lib/scout/command/stream.rb +50 -0
- data/lib/scout/command/test.rb +1 -1
- data/lib/scout/daemon_spawn.rb +215 -0
- data/lib/scout/plugin.rb +20 -1
- data/lib/scout/server.rb +16 -111
- data/lib/scout/server_base.rb +100 -0
- data/lib/scout/streamer.rb +162 -0
- data/lib/scout/streamer_control.rb +43 -0
- data/lib/scout/version.rb +3 -0
- data/scout.gemspec +27 -0
- data/test/plugins/disk_usage.rb +86 -0
- data/test/scout_test.rb +598 -0
- data/vendor/pusher-gem/Gemfile +2 -0
- data/vendor/pusher-gem/LICENSE +20 -0
- data/vendor/pusher-gem/README.md +80 -0
- data/vendor/pusher-gem/Rakefile +11 -0
- data/vendor/pusher-gem/examples/async_message.rb +28 -0
- data/vendor/pusher-gem/lib/pusher.rb +107 -0
- data/vendor/pusher-gem/lib/pusher/channel.rb +154 -0
- data/vendor/pusher-gem/lib/pusher/request.rb +107 -0
- data/vendor/pusher-gem/pusher.gemspec +28 -0
- data/vendor/pusher-gem/spec/channel_spec.rb +274 -0
- data/vendor/pusher-gem/spec/pusher_spec.rb +87 -0
- data/vendor/pusher-gem/spec/spec_helper.rb +13 -0
- data/vendor/ruby-hmac/History.txt +15 -0
- data/vendor/ruby-hmac/Manifest.txt +11 -0
- data/vendor/ruby-hmac/README.md +41 -0
- data/vendor/ruby-hmac/Rakefile +23 -0
- data/vendor/ruby-hmac/lib/hmac-md5.rb +11 -0
- data/vendor/ruby-hmac/lib/hmac-rmd160.rb +11 -0
- data/vendor/ruby-hmac/lib/hmac-sha1.rb +11 -0
- data/vendor/ruby-hmac/lib/hmac-sha2.rb +25 -0
- data/vendor/ruby-hmac/lib/hmac.rb +118 -0
- data/vendor/ruby-hmac/lib/ruby_hmac.rb +2 -0
- data/vendor/ruby-hmac/ruby-hmac.gemspec +33 -0
- data/vendor/ruby-hmac/test/test_hmac.rb +89 -0
- data/vendor/signature/.document +5 -0
- data/vendor/signature/.gitignore +21 -0
- data/vendor/signature/Gemfile +3 -0
- data/vendor/signature/Gemfile.lock +29 -0
- data/vendor/signature/LICENSE +20 -0
- data/vendor/signature/README.md +55 -0
- data/vendor/signature/Rakefile +2 -0
- data/vendor/signature/VERSION +1 -0
- data/vendor/signature/lib/signature.rb +142 -0
- data/vendor/signature/lib/signature/version.rb +3 -0
- data/vendor/signature/signature.gemspec +22 -0
- data/vendor/signature/spec/signature_spec.rb +176 -0
- data/vendor/signature/spec/spec_helper.rb +10 -0
- data/vendor/util/lib/core_extensions.rb +60 -0
- metadata +120 -84
- data/AUTHORS +0 -4
- data/COPYING +0 -340
- data/INSTALL +0 -18
- data/TODO +0 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.1.1
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
require 'hmac-sha2'
|
|
2
|
+
|
|
3
|
+
module Signature
|
|
4
|
+
class AuthenticationError < RuntimeError; end
|
|
5
|
+
|
|
6
|
+
class Token
|
|
7
|
+
attr_reader :key, :secret
|
|
8
|
+
|
|
9
|
+
def initialize(key, secret)
|
|
10
|
+
@key, @secret = key, secret
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def sign(request)
|
|
14
|
+
request.sign(self)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
class Request
|
|
19
|
+
attr_accessor :path, :query_hash
|
|
20
|
+
|
|
21
|
+
# http://www.w3.org/TR/NOTE-datetime
|
|
22
|
+
ISO8601 = "%Y-%m-%dT%H:%M:%SZ"
|
|
23
|
+
|
|
24
|
+
def initialize(method, path, query)
|
|
25
|
+
raise ArgumentError, "Expected string" unless path.kind_of?(String)
|
|
26
|
+
raise ArgumentError, "Expected hash" unless query.kind_of?(Hash)
|
|
27
|
+
|
|
28
|
+
query_hash = {}
|
|
29
|
+
auth_hash = {}
|
|
30
|
+
query.each do |key, v|
|
|
31
|
+
k = key.to_s.downcase
|
|
32
|
+
k[0..4] == 'auth_' ? auth_hash[k] = v : query_hash[k] = v
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
@method = method.upcase
|
|
36
|
+
@path, @query_hash, @auth_hash = path, query_hash, auth_hash
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def sign(token)
|
|
40
|
+
@auth_hash = {
|
|
41
|
+
:auth_version => "1.0",
|
|
42
|
+
:auth_key => token.key,
|
|
43
|
+
:auth_timestamp => Time.now.to_i.to_s
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
@auth_hash[:auth_signature] = signature(token)
|
|
47
|
+
|
|
48
|
+
return @auth_hash
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Authenticates the request with a token
|
|
52
|
+
#
|
|
53
|
+
# Timestamp check: Unless timestamp_grace is set to nil (which will skip
|
|
54
|
+
# the timestamp check), an exception will be raised if timestamp is not
|
|
55
|
+
# supplied or if the timestamp provided is not within timestamp_grace of
|
|
56
|
+
# the real time (defaults to 10 minutes)
|
|
57
|
+
#
|
|
58
|
+
# Signature check: Raises an exception if the signature does not match the
|
|
59
|
+
# computed value
|
|
60
|
+
#
|
|
61
|
+
def authenticate_by_token!(token, timestamp_grace = 600)
|
|
62
|
+
validate_version!
|
|
63
|
+
validate_timestamp!(timestamp_grace)
|
|
64
|
+
validate_signature!(token)
|
|
65
|
+
true
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def authenticate_by_token(token, timestamp_grace = 600)
|
|
69
|
+
authenticate_by_token!(token, timestamp_grace)
|
|
70
|
+
rescue AuthenticationError
|
|
71
|
+
false
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def authenticate(timestamp_grace = 600, &block)
|
|
75
|
+
key = @auth_hash['auth_key']
|
|
76
|
+
raise AuthenticationError, "Authentication key required" unless key
|
|
77
|
+
token = yield key
|
|
78
|
+
unless token && token.secret
|
|
79
|
+
raise AuthenticationError, "Invalid authentication key"
|
|
80
|
+
end
|
|
81
|
+
authenticate_by_token!(token, timestamp_grace)
|
|
82
|
+
return token
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def auth_hash
|
|
86
|
+
raise "Request not signed" unless @auth_hash && @auth_hash[:auth_signature]
|
|
87
|
+
@auth_hash
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
private
|
|
91
|
+
|
|
92
|
+
def signature(token)
|
|
93
|
+
HMAC::SHA256.hexdigest(token.secret, string_to_sign)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def string_to_sign
|
|
97
|
+
[@method, @path, parameter_string].join("\n")
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def parameter_string
|
|
101
|
+
param_hash = @query_hash.merge(@auth_hash || {})
|
|
102
|
+
|
|
103
|
+
# Convert keys to lowercase strings
|
|
104
|
+
hash = {}; param_hash.each { |k,v| hash[k.to_s.downcase] = v }
|
|
105
|
+
|
|
106
|
+
# Exclude signature from signature generation!
|
|
107
|
+
hash.delete("auth_signature")
|
|
108
|
+
|
|
109
|
+
hash.keys.sort.map { |k| "#{k}=#{hash[k]}" }.join("&")
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def validate_version!
|
|
113
|
+
version = @auth_hash["auth_version"]
|
|
114
|
+
raise AuthenticationError, "Version required" unless version
|
|
115
|
+
raise AuthenticationError, "Version not supported" unless version == '1.0'
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def validate_timestamp!(grace)
|
|
119
|
+
return true if grace.nil?
|
|
120
|
+
|
|
121
|
+
timestamp = @auth_hash["auth_timestamp"]
|
|
122
|
+
error = (timestamp.to_i - Time.now.to_i).abs
|
|
123
|
+
raise AuthenticationError, "Timestamp required" unless timestamp
|
|
124
|
+
if error >= grace
|
|
125
|
+
raise AuthenticationError, "Timestamp expired: Given timestamp "\
|
|
126
|
+
"(#{Time.at(timestamp.to_i).utc.strftime(ISO8601)}) "\
|
|
127
|
+
"not within #{grace}s of server time "\
|
|
128
|
+
"(#{Time.now.utc.strftime(ISO8601)})"
|
|
129
|
+
end
|
|
130
|
+
return true
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def validate_signature!(token)
|
|
134
|
+
unless @auth_hash["auth_signature"] == signature(token)
|
|
135
|
+
raise AuthenticationError, "Invalid signature: you should have "\
|
|
136
|
+
"sent HmacSHA256Hex(#{string_to_sign.inspect}, your_secret_key)"\
|
|
137
|
+
", but you sent #{@auth_hash["auth_signature"].inspect}"
|
|
138
|
+
end
|
|
139
|
+
return true
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
|
3
|
+
require "signature/version"
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |s|
|
|
6
|
+
s.name = "signature"
|
|
7
|
+
s.version = Signature::VERSION
|
|
8
|
+
s.platform = Gem::Platform::RUBY
|
|
9
|
+
s.authors = ["Martyn Loughran"]
|
|
10
|
+
s.email = ["me@mloughran.com"]
|
|
11
|
+
s.homepage = "http://github.com/mloughran/signature"
|
|
12
|
+
s.summary = %q{Simple key/secret based authentication for apis}
|
|
13
|
+
s.description = %q{Simple key/secret based authentication for apis}
|
|
14
|
+
|
|
15
|
+
s.files = `git ls-files`.split("\n")
|
|
16
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
|
17
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
|
18
|
+
s.require_paths = ["lib"]
|
|
19
|
+
|
|
20
|
+
s.add_dependency "ruby-hmac"
|
|
21
|
+
s.add_development_dependency "rspec", "~> 2.0.0"
|
|
22
|
+
end
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
require File.expand_path('../spec_helper', __FILE__)
|
|
2
|
+
|
|
3
|
+
describe Signature do
|
|
4
|
+
before :each do
|
|
5
|
+
Time.stub!(:now).and_return(Time.at(1234))
|
|
6
|
+
|
|
7
|
+
@token = Signature::Token.new('key', 'secret')
|
|
8
|
+
|
|
9
|
+
@request = Signature::Request.new('POST', '/some/path', {
|
|
10
|
+
"query" => "params",
|
|
11
|
+
"go" => "here"
|
|
12
|
+
})
|
|
13
|
+
@signature = @request.sign(@token)[:auth_signature]
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "should generate base64 encoded signature from correct key" do
|
|
17
|
+
@request.send(:string_to_sign).should == "POST\n/some/path\nauth_key=key&auth_timestamp=1234&auth_version=1.0&go=here&query=params"
|
|
18
|
+
@signature.should == '3b237953a5ba6619875cbb2a2d43e8da9ef5824e8a2c689f6284ac85bc1ea0db'
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "should make auth_hash available after request is signed" do
|
|
22
|
+
request = Signature::Request.new('POST', '/some/path', {
|
|
23
|
+
"query" => "params"
|
|
24
|
+
})
|
|
25
|
+
lambda {
|
|
26
|
+
request.auth_hash
|
|
27
|
+
}.should raise_error('Request not signed')
|
|
28
|
+
|
|
29
|
+
request.sign(@token)
|
|
30
|
+
request.auth_hash.should == {
|
|
31
|
+
:auth_signature => "da078fcedd72941b6c873caa40d0d6b2000ebfc700cee802b128dd20f72e74e9",
|
|
32
|
+
:auth_version => "1.0",
|
|
33
|
+
:auth_key => "key",
|
|
34
|
+
:auth_timestamp => '1234'
|
|
35
|
+
}
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "should cope with symbol keys" do
|
|
39
|
+
@request.query_hash = {
|
|
40
|
+
:query => "params",
|
|
41
|
+
:go => "here"
|
|
42
|
+
}
|
|
43
|
+
@request.sign(@token)[:auth_signature].should == @signature
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it "should cope with upcase keys (keys are lowercased before signing)" do
|
|
47
|
+
@request.query_hash = {
|
|
48
|
+
"Query" => "params",
|
|
49
|
+
"GO" => "here"
|
|
50
|
+
}
|
|
51
|
+
@request.sign(@token)[:auth_signature].should == @signature
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "should use the path to generate signature" do
|
|
55
|
+
@request.path = '/some/other/path'
|
|
56
|
+
@request.sign(@token)[:auth_signature].should_not == @signature
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it "should use the query string keys to generate signature" do
|
|
60
|
+
@request.query_hash = {
|
|
61
|
+
"other" => "query"
|
|
62
|
+
}
|
|
63
|
+
@request.sign(@token)[:auth_signature].should_not == @signature
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it "should use the query string values to generate signature" do
|
|
67
|
+
@request.query_hash = {
|
|
68
|
+
"key" => "notfoo",
|
|
69
|
+
"other" => 'bar'
|
|
70
|
+
}
|
|
71
|
+
@request.sign(@token)[:signature].should_not == @signature
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
describe "verification" do
|
|
75
|
+
before :each do
|
|
76
|
+
Time.stub!(:now).and_return(Time.at(1234))
|
|
77
|
+
@request.sign(@token)
|
|
78
|
+
@params = @request.query_hash.merge(@request.auth_hash)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
it "should verify requests" do
|
|
82
|
+
request = Signature::Request.new('POST', '/some/path', @params)
|
|
83
|
+
request.authenticate_by_token(@token).should == true
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
it "should raise error if signature is not correct" do
|
|
87
|
+
@params[:auth_signature] = 'asdf'
|
|
88
|
+
request = Signature::Request.new('POST', '/some/path', @params)
|
|
89
|
+
lambda {
|
|
90
|
+
request.authenticate_by_token!(@token)
|
|
91
|
+
}.should raise_error('Invalid signature: you should have sent HmacSHA256Hex("POST\n/some/path\nauth_key=key&auth_timestamp=1234&auth_version=1.0&go=here&query=params", your_secret_key), but you sent "asdf"')
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
it "should raise error if timestamp not available" do
|
|
95
|
+
@params.delete(:auth_timestamp)
|
|
96
|
+
request = Signature::Request.new('POST', '/some/path', @params)
|
|
97
|
+
lambda {
|
|
98
|
+
request.authenticate_by_token!(@token)
|
|
99
|
+
}.should raise_error('Timestamp required')
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
it "should raise error if timestamp has expired (default of 600s)" do
|
|
103
|
+
request = Signature::Request.new('POST', '/some/path', @params)
|
|
104
|
+
Time.stub!(:now).and_return(Time.at(1234 + 599))
|
|
105
|
+
request.authenticate_by_token!(@token).should == true
|
|
106
|
+
Time.stub!(:now).and_return(Time.at(1234 - 599))
|
|
107
|
+
request.authenticate_by_token!(@token).should == true
|
|
108
|
+
Time.stub!(:now).and_return(Time.at(1234 + 600))
|
|
109
|
+
lambda {
|
|
110
|
+
request.authenticate_by_token!(@token)
|
|
111
|
+
}.should raise_error("Timestamp expired: Given timestamp (1970-01-01T00:20:34Z) not within 600s of server time (1970-01-01T00:30:34Z)")
|
|
112
|
+
Time.stub!(:now).and_return(Time.at(1234 - 600))
|
|
113
|
+
lambda {
|
|
114
|
+
request.authenticate_by_token!(@token)
|
|
115
|
+
}.should raise_error("Timestamp expired: Given timestamp (1970-01-01T00:20:34Z) not within 600s of server time (1970-01-01T00:10:34Z)")
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
it "should be possible to customize the timeout grace period" do
|
|
119
|
+
grace = 10
|
|
120
|
+
request = Signature::Request.new('POST', '/some/path', @params)
|
|
121
|
+
Time.stub!(:now).and_return(Time.at(1234 + grace - 1))
|
|
122
|
+
request.authenticate_by_token!(@token, grace).should == true
|
|
123
|
+
Time.stub!(:now).and_return(Time.at(1234 + grace))
|
|
124
|
+
lambda {
|
|
125
|
+
request.authenticate_by_token!(@token, grace)
|
|
126
|
+
}.should raise_error("Timestamp expired: Given timestamp (1970-01-01T00:20:34Z) not within 10s of server time (1970-01-01T00:20:44Z)")
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
it "should be possible to skip timestamp check by passing nil" do
|
|
130
|
+
request = Signature::Request.new('POST', '/some/path', @params)
|
|
131
|
+
Time.stub!(:now).and_return(Time.at(1234 + 1000))
|
|
132
|
+
request.authenticate_by_token!(@token, nil).should == true
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
it "should check that auth_version is supplied" do
|
|
136
|
+
@params.delete(:auth_version)
|
|
137
|
+
request = Signature::Request.new('POST', '/some/path', @params)
|
|
138
|
+
lambda {
|
|
139
|
+
request.authenticate_by_token!(@token)
|
|
140
|
+
}.should raise_error('Version required')
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
it "should check that auth_version equals 1.0" do
|
|
144
|
+
@params[:auth_version] = '1.1'
|
|
145
|
+
request = Signature::Request.new('POST', '/some/path', @params)
|
|
146
|
+
lambda {
|
|
147
|
+
request.authenticate_by_token!(@token)
|
|
148
|
+
}.should raise_error('Version not supported')
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
describe "when used with optional block" do
|
|
152
|
+
it "should optionally take a block which yields the signature" do
|
|
153
|
+
request = Signature::Request.new('POST', '/some/path', @params)
|
|
154
|
+
request.authenticate do |key|
|
|
155
|
+
key.should == @token.key
|
|
156
|
+
@token
|
|
157
|
+
end.should == @token
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
it "should raise error if no auth_key supplied to request" do
|
|
161
|
+
@params.delete(:auth_key)
|
|
162
|
+
request = Signature::Request.new('POST', '/some/path', @params)
|
|
163
|
+
lambda {
|
|
164
|
+
request.authenticate { |key| nil }
|
|
165
|
+
}.should raise_error('Authentication key required')
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
it "should raise error if block returns nil (i.e. key doesn't exist)" do
|
|
169
|
+
request = Signature::Request.new('POST', '/some/path', @params)
|
|
170
|
+
lambda {
|
|
171
|
+
request.authenticate { |key| nil }
|
|
172
|
+
}.should raise_error('Invalid authentication key')
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
require 'uri'
|
|
2
|
+
|
|
3
|
+
class String #:nodoc:
|
|
4
|
+
def snake_case
|
|
5
|
+
return self.downcase if self =~ /^[A-Z]+$/
|
|
6
|
+
self.gsub(/([A-Z]+)(?=[A-Z][a-z]?)|\B[A-Z]/, '_\&') =~ /_*(.*)/
|
|
7
|
+
return $+.downcase
|
|
8
|
+
end unless method_defined?(:snake_case)
|
|
9
|
+
end # class String
|
|
10
|
+
|
|
11
|
+
class Hash #:nodoc:
|
|
12
|
+
# @return <String> This hash as a query string
|
|
13
|
+
#
|
|
14
|
+
# @example
|
|
15
|
+
# { :name => "Bob",
|
|
16
|
+
# :address => {
|
|
17
|
+
# :street => '111 Ruby Ave.',
|
|
18
|
+
# :city => 'Ruby Central',
|
|
19
|
+
# :phones => ['111-111-1111', '222-222-2222']
|
|
20
|
+
# }
|
|
21
|
+
# }.to_params
|
|
22
|
+
# #=> "name=Bob&address[city]=Ruby Central&address[phones][]=111-111-1111&address[phones][]=222-222-2222&address[street]=111 Ruby Ave."
|
|
23
|
+
def to_params
|
|
24
|
+
params = self.map { |k,v| normalize_param(k,v) }.join
|
|
25
|
+
params.chop! # trailing &
|
|
26
|
+
params
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# @param key<Object> The key for the param.
|
|
30
|
+
# @param value<Object> The value for the param.
|
|
31
|
+
#
|
|
32
|
+
# @return <String> This key value pair as a param
|
|
33
|
+
#
|
|
34
|
+
# @example normalize_param(:name, "Bob Jones") #=> "name=Bob%20Jones&"
|
|
35
|
+
def normalize_param(key, value)
|
|
36
|
+
param = ''
|
|
37
|
+
stack = []
|
|
38
|
+
|
|
39
|
+
if value.is_a?(Array)
|
|
40
|
+
param << value.map { |element| normalize_param("#{key}[]", element) }.join
|
|
41
|
+
elsif value.is_a?(Hash)
|
|
42
|
+
stack << [key,value]
|
|
43
|
+
else
|
|
44
|
+
param << "#{key}=#{URI.encode(value.to_s, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))}&"
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
stack.each do |parent, hash|
|
|
48
|
+
hash.each do |key, value|
|
|
49
|
+
if value.is_a?(Hash)
|
|
50
|
+
stack << ["#{parent}[#{key}]", value]
|
|
51
|
+
else
|
|
52
|
+
param << normalize_param("#{parent}[#{key}]", value)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
param
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
end
|
metadata
CHANGED
|
@@ -1,59 +1,77 @@
|
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: scout
|
|
3
|
-
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 5.
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 5.4.4.alpha
|
|
5
|
+
prerelease: 6
|
|
5
6
|
platform: ruby
|
|
6
|
-
authors:
|
|
7
|
-
-
|
|
7
|
+
authors:
|
|
8
|
+
- Andre Lewis
|
|
9
|
+
- Derek Haynes
|
|
10
|
+
- James Edward Gray II
|
|
8
11
|
autorequire:
|
|
9
12
|
bindir: bin
|
|
10
13
|
cert_chain: []
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
dependencies:
|
|
15
|
-
- !ruby/object:Gem::Dependency
|
|
14
|
+
date: 2011-12-09 00:00:00.000000000 Z
|
|
15
|
+
dependencies:
|
|
16
|
+
- !ruby/object:Gem::Dependency
|
|
16
17
|
name: elif
|
|
18
|
+
requirement: &70156034409200 !ruby/object:Gem::Requirement
|
|
19
|
+
none: false
|
|
20
|
+
requirements:
|
|
21
|
+
- - ! '>='
|
|
22
|
+
- !ruby/object:Gem::Version
|
|
23
|
+
version: '0'
|
|
17
24
|
type: :runtime
|
|
18
|
-
|
|
19
|
-
version_requirements:
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
- !ruby/object:Gem::Version
|
|
23
|
-
version: "0"
|
|
24
|
-
version:
|
|
25
|
-
description: |
|
|
26
|
-
Scout makes monitoring and reporting on your web applications as flexible and simple as possible.
|
|
25
|
+
prerelease: false
|
|
26
|
+
version_requirements: *70156034409200
|
|
27
|
+
description: ! 'Scout makes monitoring and reporting on your web applications as flexible
|
|
28
|
+
and simple as possible.
|
|
27
29
|
|
|
30
|
+
'
|
|
28
31
|
email: support@scoutapp.com
|
|
29
|
-
executables:
|
|
32
|
+
executables:
|
|
30
33
|
- scout
|
|
31
34
|
extensions: []
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
-
|
|
35
|
-
- COPYING
|
|
36
|
-
- README
|
|
37
|
-
- INSTALL
|
|
38
|
-
- TODO
|
|
35
|
+
extra_rdoc_files: []
|
|
36
|
+
files:
|
|
37
|
+
- .gitignore
|
|
39
38
|
- CHANGELOG
|
|
39
|
+
- Gemfile
|
|
40
40
|
- LICENSE
|
|
41
|
-
|
|
41
|
+
- README
|
|
42
|
+
- Rakefile
|
|
43
|
+
- bin/scout
|
|
44
|
+
- data/cacert.pem
|
|
45
|
+
- data/code_id_rsa.pub
|
|
46
|
+
- data/gpl-2.0.txt
|
|
47
|
+
- data/lgpl-2.1.txt
|
|
48
|
+
- lib/scout.rb
|
|
49
|
+
- lib/scout/command.rb
|
|
42
50
|
- lib/scout/command/install.rb
|
|
43
51
|
- lib/scout/command/run.rb
|
|
44
52
|
- lib/scout/command/sign.rb
|
|
53
|
+
- lib/scout/command/stream.rb
|
|
45
54
|
- lib/scout/command/test.rb
|
|
46
55
|
- lib/scout/command/troubleshoot.rb
|
|
47
|
-
- lib/scout/
|
|
56
|
+
- lib/scout/daemon_spawn.rb
|
|
48
57
|
- lib/scout/plugin.rb
|
|
49
58
|
- lib/scout/plugin_options.rb
|
|
50
59
|
- lib/scout/scout_logger.rb
|
|
51
60
|
- lib/scout/server.rb
|
|
52
|
-
- lib/scout.rb
|
|
53
|
-
-
|
|
54
|
-
-
|
|
55
|
-
-
|
|
56
|
-
-
|
|
61
|
+
- lib/scout/server_base.rb
|
|
62
|
+
- lib/scout/streamer.rb
|
|
63
|
+
- lib/scout/streamer_control.rb
|
|
64
|
+
- lib/scout/version.rb
|
|
65
|
+
- scout.gemspec
|
|
66
|
+
- test/plugins/disk_usage.rb
|
|
67
|
+
- test/scout_test.rb
|
|
68
|
+
- vendor/json_pure/CHANGES
|
|
69
|
+
- vendor/json_pure/COPYING
|
|
70
|
+
- vendor/json_pure/GPL
|
|
71
|
+
- vendor/json_pure/README
|
|
72
|
+
- vendor/json_pure/Rakefile
|
|
73
|
+
- vendor/json_pure/TODO
|
|
74
|
+
- vendor/json_pure/VERSION
|
|
57
75
|
- vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkComparison.log
|
|
58
76
|
- vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_fast-autocorrelation.dat
|
|
59
77
|
- vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_fast.dat
|
|
@@ -93,8 +111,6 @@ files:
|
|
|
93
111
|
- vendor/json_pure/benchmarks/parser_benchmark.rb
|
|
94
112
|
- vendor/json_pure/bin/edit_json.rb
|
|
95
113
|
- vendor/json_pure/bin/prettify_json.rb
|
|
96
|
-
- vendor/json_pure/CHANGES
|
|
97
|
-
- vendor/json_pure/COPYING
|
|
98
114
|
- vendor/json_pure/data/example.json
|
|
99
115
|
- vendor/json_pure/data/index.html
|
|
100
116
|
- vendor/json_pure/data/prototype.js
|
|
@@ -105,29 +121,26 @@ files:
|
|
|
105
121
|
- vendor/json_pure/ext/json/ext/parser/parser.c
|
|
106
122
|
- vendor/json_pure/ext/json/ext/parser/parser.h
|
|
107
123
|
- vendor/json_pure/ext/json/ext/parser/parser.rl
|
|
108
|
-
- vendor/json_pure/GPL
|
|
109
124
|
- vendor/json_pure/install.rb
|
|
110
|
-
- vendor/json_pure/lib/json
|
|
111
|
-
- vendor/json_pure/lib/json/add/rails.rb
|
|
125
|
+
- vendor/json_pure/lib/json.rb
|
|
112
126
|
- vendor/json_pure/lib/json/Array.xpm
|
|
113
|
-
- vendor/json_pure/lib/json/common.rb
|
|
114
|
-
- vendor/json_pure/lib/json/editor.rb
|
|
115
|
-
- vendor/json_pure/lib/json/ext.rb
|
|
116
127
|
- vendor/json_pure/lib/json/FalseClass.xpm
|
|
117
128
|
- vendor/json_pure/lib/json/Hash.xpm
|
|
118
|
-
- vendor/json_pure/lib/json/json.xpm
|
|
119
129
|
- vendor/json_pure/lib/json/Key.xpm
|
|
120
130
|
- vendor/json_pure/lib/json/NilClass.xpm
|
|
121
131
|
- vendor/json_pure/lib/json/Numeric.xpm
|
|
122
|
-
- vendor/json_pure/lib/json/pure/generator.rb
|
|
123
|
-
- vendor/json_pure/lib/json/pure/parser.rb
|
|
124
|
-
- vendor/json_pure/lib/json/pure.rb
|
|
125
132
|
- vendor/json_pure/lib/json/String.xpm
|
|
126
133
|
- vendor/json_pure/lib/json/TrueClass.xpm
|
|
134
|
+
- vendor/json_pure/lib/json/add/core.rb
|
|
135
|
+
- vendor/json_pure/lib/json/add/rails.rb
|
|
136
|
+
- vendor/json_pure/lib/json/common.rb
|
|
137
|
+
- vendor/json_pure/lib/json/editor.rb
|
|
138
|
+
- vendor/json_pure/lib/json/ext.rb
|
|
139
|
+
- vendor/json_pure/lib/json/json.xpm
|
|
140
|
+
- vendor/json_pure/lib/json/pure.rb
|
|
141
|
+
- vendor/json_pure/lib/json/pure/generator.rb
|
|
142
|
+
- vendor/json_pure/lib/json/pure/parser.rb
|
|
127
143
|
- vendor/json_pure/lib/json/version.rb
|
|
128
|
-
- vendor/json_pure/lib/json.rb
|
|
129
|
-
- vendor/json_pure/Rakefile
|
|
130
|
-
- vendor/json_pure/README
|
|
131
144
|
- vendor/json_pure/tests/fixtures/fail1.json
|
|
132
145
|
- vendor/json_pure/tests/fixtures/fail10.json
|
|
133
146
|
- vendor/json_pure/tests/fixtures/fail11.json
|
|
@@ -166,48 +179,71 @@ files:
|
|
|
166
179
|
- vendor/json_pure/tests/test_json_generate.rb
|
|
167
180
|
- vendor/json_pure/tests/test_json_rails.rb
|
|
168
181
|
- vendor/json_pure/tests/test_json_unicode.rb
|
|
169
|
-
- vendor/json_pure/TODO
|
|
170
182
|
- vendor/json_pure/tools/fuzz.rb
|
|
171
183
|
- vendor/json_pure/tools/server.rb
|
|
172
|
-
- vendor/
|
|
173
|
-
-
|
|
174
|
-
-
|
|
175
|
-
-
|
|
176
|
-
-
|
|
177
|
-
-
|
|
178
|
-
-
|
|
179
|
-
-
|
|
180
|
-
-
|
|
181
|
-
|
|
184
|
+
- vendor/pusher-gem/Gemfile
|
|
185
|
+
- vendor/pusher-gem/LICENSE
|
|
186
|
+
- vendor/pusher-gem/README.md
|
|
187
|
+
- vendor/pusher-gem/Rakefile
|
|
188
|
+
- vendor/pusher-gem/examples/async_message.rb
|
|
189
|
+
- vendor/pusher-gem/lib/pusher.rb
|
|
190
|
+
- vendor/pusher-gem/lib/pusher/channel.rb
|
|
191
|
+
- vendor/pusher-gem/lib/pusher/request.rb
|
|
192
|
+
- vendor/pusher-gem/pusher.gemspec
|
|
193
|
+
- vendor/pusher-gem/spec/channel_spec.rb
|
|
194
|
+
- vendor/pusher-gem/spec/pusher_spec.rb
|
|
195
|
+
- vendor/pusher-gem/spec/spec_helper.rb
|
|
196
|
+
- vendor/ruby-hmac/History.txt
|
|
197
|
+
- vendor/ruby-hmac/Manifest.txt
|
|
198
|
+
- vendor/ruby-hmac/README.md
|
|
199
|
+
- vendor/ruby-hmac/Rakefile
|
|
200
|
+
- vendor/ruby-hmac/lib/hmac-md5.rb
|
|
201
|
+
- vendor/ruby-hmac/lib/hmac-rmd160.rb
|
|
202
|
+
- vendor/ruby-hmac/lib/hmac-sha1.rb
|
|
203
|
+
- vendor/ruby-hmac/lib/hmac-sha2.rb
|
|
204
|
+
- vendor/ruby-hmac/lib/hmac.rb
|
|
205
|
+
- vendor/ruby-hmac/lib/ruby_hmac.rb
|
|
206
|
+
- vendor/ruby-hmac/ruby-hmac.gemspec
|
|
207
|
+
- vendor/ruby-hmac/test/test_hmac.rb
|
|
208
|
+
- vendor/signature/.document
|
|
209
|
+
- vendor/signature/.gitignore
|
|
210
|
+
- vendor/signature/Gemfile
|
|
211
|
+
- vendor/signature/Gemfile.lock
|
|
212
|
+
- vendor/signature/LICENSE
|
|
213
|
+
- vendor/signature/README.md
|
|
214
|
+
- vendor/signature/Rakefile
|
|
215
|
+
- vendor/signature/VERSION
|
|
216
|
+
- vendor/signature/lib/signature.rb
|
|
217
|
+
- vendor/signature/lib/signature/version.rb
|
|
218
|
+
- vendor/signature/signature.gemspec
|
|
219
|
+
- vendor/signature/spec/signature_spec.rb
|
|
220
|
+
- vendor/signature/spec/spec_helper.rb
|
|
221
|
+
- vendor/util/lib/core_extensions.rb
|
|
182
222
|
homepage: http://scoutapp.com
|
|
183
223
|
licenses: []
|
|
184
|
-
|
|
185
224
|
post_install_message:
|
|
186
|
-
rdoc_options:
|
|
187
|
-
|
|
188
|
-
- Scout Client Documentation
|
|
189
|
-
- --main
|
|
190
|
-
- README
|
|
191
|
-
require_paths:
|
|
225
|
+
rdoc_options: []
|
|
226
|
+
require_paths:
|
|
192
227
|
- lib
|
|
193
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
228
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
229
|
+
none: false
|
|
230
|
+
requirements:
|
|
231
|
+
- - ! '>='
|
|
232
|
+
- !ruby/object:Gem::Version
|
|
233
|
+
version: '0'
|
|
234
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
235
|
+
none: false
|
|
236
|
+
requirements:
|
|
237
|
+
- - ! '>'
|
|
238
|
+
- !ruby/object:Gem::Version
|
|
239
|
+
version: 1.3.1
|
|
205
240
|
requirements: []
|
|
206
|
-
|
|
207
241
|
rubyforge_project: scout
|
|
208
|
-
rubygems_version: 1.
|
|
242
|
+
rubygems_version: 1.8.10
|
|
209
243
|
signing_key:
|
|
210
244
|
specification_version: 3
|
|
211
|
-
summary:
|
|
212
|
-
|
|
213
|
-
|
|
245
|
+
summary: Web-based monitoring, reporting, and alerting for your servers, clusters,
|
|
246
|
+
and applications.
|
|
247
|
+
test_files:
|
|
248
|
+
- test/plugins/disk_usage.rb
|
|
249
|
+
- test/scout_test.rb
|