prof 0.29.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LEGAL +13 -0
- data/lib/prof/cloud_foundry.rb +145 -0
- data/lib/prof/environment/cloud_foundry.rb +150 -0
- data/lib/prof/environment/pcf_drinks.rb +156 -0
- data/lib/prof/environment_manager.rb +93 -0
- data/lib/prof/external_spec/helpers/capybara.rb +58 -0
- data/lib/prof/external_spec/helpers/debug.rb +53 -0
- data/lib/prof/external_spec/helpers/file_helper.rb +35 -0
- data/lib/prof/external_spec/helpers/product_path.rb +23 -0
- data/lib/prof/external_spec/shared_examples/deployment.rb +23 -0
- data/lib/prof/external_spec/shared_examples/ops_manager_upgrade.rb +32 -0
- data/lib/prof/external_spec/shared_examples/service.rb +105 -0
- data/lib/prof/external_spec/shared_examples/service_broker.rb +25 -0
- data/lib/prof/external_spec/spec_helper.rb +35 -0
- data/lib/prof/marketplace_service.rb +20 -0
- data/lib/prof/matchers/metadata.rb +180 -0
- data/lib/prof/matchers/only_support_ssl_with_cipher_set.rb +102 -0
- data/lib/prof/matchers/ssl.rb +67 -0
- data/lib/prof/matchers/tile_configuration.rb +47 -0
- data/lib/prof/ops_manager/rails_500_error.rb +15 -0
- data/lib/prof/ops_manager/web_app_internals/page/checkbox_field.rb +38 -0
- data/lib/prof/ops_manager/web_app_internals/page/click_field.rb +40 -0
- data/lib/prof/ops_manager/web_app_internals/page/dashboard.rb +100 -0
- data/lib/prof/ops_manager/web_app_internals/page/flash_message.rb +53 -0
- data/lib/prof/ops_manager/web_app_internals/page/form.rb +130 -0
- data/lib/prof/ops_manager/web_app_internals/page/form_error.rb +43 -0
- data/lib/prof/ops_manager/web_app_internals/page/form_field.rb +51 -0
- data/lib/prof/ops_manager/web_app_internals/page/form_fields.rb +35 -0
- data/lib/prof/ops_manager/web_app_internals/page/installation_progress.rb +149 -0
- data/lib/prof/ops_manager/web_app_internals/page/login.rb +53 -0
- data/lib/prof/ops_manager/web_app_internals/page/modal.rb +85 -0
- data/lib/prof/ops_manager/web_app_internals/page/rails_500.rb +41 -0
- data/lib/prof/ops_manager/web_app_internals/page/select_field.rb +27 -0
- data/lib/prof/ops_manager/web_app_internals/page/tile_settings.rb +105 -0
- data/lib/prof/ops_manager/web_app_internals.rb +63 -0
- data/lib/prof/ops_manager.rb +141 -0
- data/lib/prof/ops_manager_log_fetcher.rb +30 -0
- data/lib/prof/product.rb +59 -0
- data/lib/prof/pushed_test_app.rb +40 -0
- data/lib/prof/service_instance.rb +21 -0
- data/lib/prof/ssh_gateway.rb +104 -0
- data/lib/prof/ssl/check.rb +79 -0
- data/lib/prof/ssl/cipher_set.rb +56 -0
- data/lib/prof/ssl/result.rb +27 -0
- data/lib/prof/ssl/results.rb +74 -0
- data/lib/prof/test_app.rb +19 -0
- data/lib/prof/tile.rb +25 -0
- data/lib/prof/uaa_client.rb +66 -0
- data/lib/prof/version.rb +13 -0
- metadata +403 -0
data/lib/prof/product.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
# Copyright (c) 2014-2015 Pivotal Software, Inc.
|
2
|
+
# All rights reserved.
|
3
|
+
# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
4
|
+
# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
5
|
+
# PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
6
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
7
|
+
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
8
|
+
# USE OR OTHER DEALINGS IN THE SOFTWARE.
|
9
|
+
#
|
10
|
+
|
11
|
+
require 'yaml'
|
12
|
+
require 'zip'
|
13
|
+
|
14
|
+
module Prof
|
15
|
+
class Product
|
16
|
+
class InvalidProductPathError < StandardError; end
|
17
|
+
|
18
|
+
attr_reader :path
|
19
|
+
|
20
|
+
def initialize(path:)
|
21
|
+
raise InvalidProductPathError, "Invalid path given: '#{path}'" unless path && File.exist?(path)
|
22
|
+
@path = File.expand_path(path)
|
23
|
+
end
|
24
|
+
|
25
|
+
def name
|
26
|
+
metadata.fetch('name')
|
27
|
+
end
|
28
|
+
|
29
|
+
def version
|
30
|
+
metadata.fetch('product_version')
|
31
|
+
end
|
32
|
+
|
33
|
+
def to_s
|
34
|
+
"#{name} v#{version}"
|
35
|
+
end
|
36
|
+
|
37
|
+
def file
|
38
|
+
File.open(path)
|
39
|
+
end
|
40
|
+
|
41
|
+
def ==(other)
|
42
|
+
self.class == other.class &&
|
43
|
+
self.path == other.path
|
44
|
+
end
|
45
|
+
alias_method :eql?, :==
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def metadata
|
50
|
+
@metadata ||= begin
|
51
|
+
yaml = Zip::File.open(path) do |zip_file|
|
52
|
+
entry = zip_file.glob('metadata/*').first
|
53
|
+
entry.get_input_stream.read
|
54
|
+
end
|
55
|
+
YAML.load(yaml)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# Copyright (c) 2014-2015 Pivotal Software, Inc.
|
2
|
+
# All rights reserved.
|
3
|
+
# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
4
|
+
# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
5
|
+
# PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
6
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
7
|
+
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
8
|
+
# USE OR OTHER DEALINGS IN THE SOFTWARE.
|
9
|
+
#
|
10
|
+
|
11
|
+
require 'faraday'
|
12
|
+
require 'faraday_middleware'
|
13
|
+
|
14
|
+
module Prof
|
15
|
+
class PushedTestApp
|
16
|
+
def initialize(opts = {})
|
17
|
+
@name = opts.fetch(:name)
|
18
|
+
@url = opts.fetch(:url)
|
19
|
+
end
|
20
|
+
|
21
|
+
attr_reader :name, :url
|
22
|
+
|
23
|
+
def write(key, value)
|
24
|
+
app_connection.put("/testdata/key/#{key}/value/#{value}")
|
25
|
+
end
|
26
|
+
|
27
|
+
def read(key)
|
28
|
+
app_connection.get("/testdata/key/#{key}").body
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def app_connection
|
34
|
+
Faraday.new(url: url, ssl: { verify: false }) do |faraday|
|
35
|
+
faraday.response :json, content_type: /\bjson$/
|
36
|
+
faraday.adapter Faraday.default_adapter
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# Copyright (c) 2014-2015 Pivotal Software, Inc.
|
2
|
+
# All rights reserved.
|
3
|
+
# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
4
|
+
# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
5
|
+
# PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
6
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
7
|
+
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
8
|
+
# USE OR OTHER DEALINGS IN THE SOFTWARE.
|
9
|
+
#
|
10
|
+
|
11
|
+
require 'securerandom'
|
12
|
+
|
13
|
+
module Prof
|
14
|
+
class ServiceInstance
|
15
|
+
def initialize(name = "cf-service-#{SecureRandom.hex(4)}")
|
16
|
+
@name = name
|
17
|
+
end
|
18
|
+
|
19
|
+
attr_reader :name
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
# Copyright (c) 2014-2015 Pivotal Software, Inc.
|
2
|
+
# All rights reserved.
|
3
|
+
# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
4
|
+
# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
5
|
+
# PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
6
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
7
|
+
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
8
|
+
# USE OR OTHER DEALINGS IN THE SOFTWARE.
|
9
|
+
#
|
10
|
+
|
11
|
+
require 'net/ssh'
|
12
|
+
require 'net/ssh/gateway'
|
13
|
+
require 'net/scp'
|
14
|
+
require 'uri'
|
15
|
+
|
16
|
+
module Prof
|
17
|
+
class SshGateway
|
18
|
+
def initialize(gateway_host:, gateway_username:, gateway_password: nil, ssh_key: nil)
|
19
|
+
@gateway_host = gateway_host
|
20
|
+
@gateway_username = gateway_username
|
21
|
+
@gateway_password = gateway_password
|
22
|
+
@ssh_key = ssh_key
|
23
|
+
@forwards = {}
|
24
|
+
end
|
25
|
+
|
26
|
+
def execute_on(host, cmd, options = {})
|
27
|
+
user = options.fetch(:user, 'vcap')
|
28
|
+
password = options.fetch(:password, 'c1oudc0w')
|
29
|
+
run_as_root = options.fetch(:root, false)
|
30
|
+
discard_stderr = options.fetch(:discard_stderr, false)
|
31
|
+
|
32
|
+
cmd = "echo -e \"#{password}\\n\" | sudo -S #{cmd}" if run_as_root
|
33
|
+
cmd << ' 2>/dev/null' if discard_stderr
|
34
|
+
|
35
|
+
ssh_gateway_options = {
|
36
|
+
password: password,
|
37
|
+
paranoid: false
|
38
|
+
}
|
39
|
+
|
40
|
+
ssh_gateway_options[:key_data] = [@ssh_key] unless @ssh_key.nil?
|
41
|
+
|
42
|
+
ssh_gateway.ssh(
|
43
|
+
host,
|
44
|
+
user,
|
45
|
+
ssh_gateway_options,
|
46
|
+
) do |ssh|
|
47
|
+
ssh.exec!(cmd)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def scp_to(host, local_path, remote_path, options = {})
|
52
|
+
with_port_forwarded_to(host, 22) do |local_port|
|
53
|
+
options[:port] = local_port
|
54
|
+
options[:user] ||= 'vcap'
|
55
|
+
options[:password] ||= 'c1oudc0w'
|
56
|
+
Net::SCP.start('127.0.0.1', options.fetch(:user), options) do |scp|
|
57
|
+
scp.upload! local_path, remote_path
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def scp_from(host, remote_path, local_path, options = {})
|
63
|
+
with_port_forwarded_to(host, 22) do |local_port|
|
64
|
+
options[:port] = local_port
|
65
|
+
options[:user] ||= 'vcap'
|
66
|
+
options[:password] ||= 'c1oudc0w'
|
67
|
+
Net::SCP.start('127.0.0.1', options.fetch(:user), options) do |scp|
|
68
|
+
scp.download! remote_path, local_path
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def with_port_forwarded_to(remote_host, remote_port, &block)
|
74
|
+
ssh_gateway.open(remote_host, remote_port, &block)
|
75
|
+
end
|
76
|
+
|
77
|
+
private
|
78
|
+
|
79
|
+
attr_reader :gateway_username, :gateway_password, :forwards
|
80
|
+
|
81
|
+
def ssh_agent
|
82
|
+
@ssh_agent ||= Net::SSH::Authentication::Agent.connect
|
83
|
+
end
|
84
|
+
|
85
|
+
def gateway_host
|
86
|
+
URI(@gateway_host).host || @gateway_host
|
87
|
+
end
|
88
|
+
|
89
|
+
def ssh_gateway
|
90
|
+
@ssh_gateway ||= Net::SSH::Gateway.new(
|
91
|
+
gateway_host,
|
92
|
+
gateway_username,
|
93
|
+
password: gateway_password,
|
94
|
+
paranoid: false
|
95
|
+
)
|
96
|
+
rescue Net::SSH::AuthenticationFailed
|
97
|
+
message = [
|
98
|
+
"Failed to connect to #{gateway_host}, with #{gateway_username}:#{gateway_password}.",
|
99
|
+
"The ssh-agent has #{ssh_agent.identities.size} identities. Please either add a key, or correct password"
|
100
|
+
].join(' ')
|
101
|
+
raise Net::SSH::AuthenticationFailed, message
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# Copyright (c) 2014-2015 Pivotal Software, Inc.
|
2
|
+
# All rights reserved.
|
3
|
+
# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
4
|
+
# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
5
|
+
# PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
6
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
7
|
+
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
8
|
+
# USE OR OTHER DEALINGS IN THE SOFTWARE.
|
9
|
+
#
|
10
|
+
|
11
|
+
require 'prof/ssl/result'
|
12
|
+
require 'prof/ssl/results'
|
13
|
+
|
14
|
+
require 'uri'
|
15
|
+
require 'net/http'
|
16
|
+
require 'openssl'
|
17
|
+
require 'ostruct'
|
18
|
+
|
19
|
+
module Prof
|
20
|
+
module SSL
|
21
|
+
class Check
|
22
|
+
def initialize(url, proxy=nil)
|
23
|
+
@url = URI.parse(url)
|
24
|
+
@proxy = proxy || OpenStruct.new(:http_host => nil, :http_address => nil)
|
25
|
+
end
|
26
|
+
|
27
|
+
def results
|
28
|
+
Results.new(protocols.map { |protocol| check_protocol(protocol) })
|
29
|
+
end
|
30
|
+
|
31
|
+
def protocols
|
32
|
+
@protocols ||= OpenSSL::SSL::SSLContext::METHODS.reject { |m|
|
33
|
+
/_(client|server)$/ =~ m.to_s
|
34
|
+
}.reject { |m|
|
35
|
+
m == :SSLv23
|
36
|
+
}
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
attr_reader :url, :proxy
|
42
|
+
|
43
|
+
def port
|
44
|
+
url.port
|
45
|
+
end
|
46
|
+
|
47
|
+
def host
|
48
|
+
url.host
|
49
|
+
end
|
50
|
+
|
51
|
+
def check_protocol(protocol)
|
52
|
+
cipher_names(protocol).map { |cipher_name| check_cipher(protocol, cipher_name) }
|
53
|
+
end
|
54
|
+
|
55
|
+
def cipher_names(protocol)
|
56
|
+
OpenSSL::SSL::SSLContext.new(protocol).ciphers.map(&:first)
|
57
|
+
end
|
58
|
+
|
59
|
+
def check_cipher(protocol, cipher_name)
|
60
|
+
request = http_request
|
61
|
+
request.ssl_version = protocol
|
62
|
+
request.ciphers = cipher_name
|
63
|
+
begin
|
64
|
+
request.get('/')
|
65
|
+
Result.new(protocol, cipher_name, true)
|
66
|
+
rescue OpenSSL::SSL::SSLError, Errno::ECONNRESET
|
67
|
+
Result.new(protocol, cipher_name, false)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def http_request
|
72
|
+
request = Net::HTTP.new(host, port, proxy.http_host, proxy.http_port)
|
73
|
+
request.use_ssl = true
|
74
|
+
request.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
75
|
+
request
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# Copyright (c) 2014-2015 Pivotal Software, Inc.
|
2
|
+
# All rights reserved.
|
3
|
+
# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
4
|
+
# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
5
|
+
# PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
6
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
7
|
+
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
8
|
+
# USE OR OTHER DEALINGS IN THE SOFTWARE.
|
9
|
+
#
|
10
|
+
|
11
|
+
module Prof
|
12
|
+
module SSL
|
13
|
+
class CipherSet
|
14
|
+
def initialize(supported_ciphers: [], supported_protocols: [])
|
15
|
+
@supported_ciphers = supported_ciphers
|
16
|
+
@supported_protocols = supported_protocols
|
17
|
+
end
|
18
|
+
|
19
|
+
attr_reader :supported_ciphers, :supported_protocols
|
20
|
+
|
21
|
+
# This list is based on the Mozilla Modern cipher list https://wiki.mozilla.org/Security/Server_Side_TLS 2015-02-05
|
22
|
+
# we have removed some of the supported ciphers due to the version of openssl used on the stemcel:
|
23
|
+
##'ECDHE-ECDSA-AES128-GCM-SHA256'
|
24
|
+
#'ECDHE-ECDSA-AES256-GCM-SHA384'
|
25
|
+
#'DHE-DSS-AES128-GCM-SHA256'
|
26
|
+
#'kEDH+AESGCM'
|
27
|
+
#'ECDHE-ECDSA-AES128-SHA256'
|
28
|
+
#'ECDHE-ECDSA-AES128-SHA'
|
29
|
+
#'ECDHE-ECDSA-AES256-SHA384'
|
30
|
+
#'ECDHE-ECDSA-AES256-SHA'
|
31
|
+
#'DHE-DSS-AES128-SHA256'
|
32
|
+
#'DHE-DSS-AES256-SHA'
|
33
|
+
#
|
34
|
+
# It appears the nginx will enable DHE-RSA-AES256-GCM-SHA384 when ECDHE-RSA-AES256-GCM-SHA384 is specified
|
35
|
+
# We believe DHE-RSA-AES256-GCM-SHA384 to be strong, but it is not part of the official mozilla modern lists.
|
36
|
+
# This has been added to the list of our supported ciphers
|
37
|
+
PIVOTAL_MODERN = new(
|
38
|
+
supported_ciphers: [
|
39
|
+
'ECDHE-RSA-AES128-GCM-SHA256',
|
40
|
+
'ECDHE-RSA-AES256-GCM-SHA384',
|
41
|
+
'DHE-RSA-AES128-GCM-SHA256',
|
42
|
+
'ECDHE-RSA-AES128-SHA256',
|
43
|
+
'ECDHE-RSA-AES128-SHA',
|
44
|
+
'ECDHE-RSA-AES256-SHA384',
|
45
|
+
'ECDHE-RSA-AES256-SHA',
|
46
|
+
'DHE-RSA-AES128-SHA256',
|
47
|
+
'DHE-RSA-AES128-SHA',
|
48
|
+
'DHE-RSA-AES256-SHA256',
|
49
|
+
'DHE-RSA-AES256-SHA',
|
50
|
+
'DHE-RSA-AES256-GCM-SHA384'
|
51
|
+
],
|
52
|
+
supported_protocols: [:TLSv1_2, :TLSv1_1]
|
53
|
+
)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# Copyright (c) 2014-2015 Pivotal Software, Inc.
|
2
|
+
# All rights reserved.
|
3
|
+
# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
4
|
+
# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
5
|
+
# PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
6
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
7
|
+
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
8
|
+
# USE OR OTHER DEALINGS IN THE SOFTWARE.
|
9
|
+
#
|
10
|
+
|
11
|
+
module Prof
|
12
|
+
module SSL
|
13
|
+
class Result
|
14
|
+
def initialize(protocol, cipher, supported)
|
15
|
+
@protocol = protocol
|
16
|
+
@cipher = String(cipher)
|
17
|
+
@supported = supported
|
18
|
+
end
|
19
|
+
|
20
|
+
attr_reader :protocol, :cipher
|
21
|
+
|
22
|
+
def supported?
|
23
|
+
@supported
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# Copyright (c) 2014-2015 Pivotal Software, Inc.
|
2
|
+
# All rights reserved.
|
3
|
+
# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
4
|
+
# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
5
|
+
# PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
6
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
7
|
+
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
8
|
+
# USE OR OTHER DEALINGS IN THE SOFTWARE.
|
9
|
+
#
|
10
|
+
|
11
|
+
module Prof
|
12
|
+
module SSL
|
13
|
+
class Results
|
14
|
+
def initialize(results)
|
15
|
+
@results = Array(results).flatten
|
16
|
+
end
|
17
|
+
|
18
|
+
def supports_protocol?(protocol)
|
19
|
+
results_for_protocol(protocol).any?(&:supported?)
|
20
|
+
end
|
21
|
+
|
22
|
+
def supports_cipher_set?(cipher_set)
|
23
|
+
expected_ciphers = cipher_set.supported_ciphers
|
24
|
+
expected_protocols = cipher_set.supported_protocols
|
25
|
+
|
26
|
+
# 1. Every cipher in the set must exist in the results
|
27
|
+
valid = expected_ciphers.all? { |expected_cipher| supported_ciphers.include? expected_cipher }
|
28
|
+
|
29
|
+
# 2. No Ciphers exists in the results but not the cipher set
|
30
|
+
valid &= supported_ciphers.all? { |supported_cipher| expected_ciphers.include? supported_cipher }
|
31
|
+
|
32
|
+
# 3. No protocols in the cipher set that are not supported
|
33
|
+
valid &= expected_protocols.all? { |expected_protocol| supported_protocols.include? expected_protocol }
|
34
|
+
|
35
|
+
# 4. No protocols supported that are not in the cipher set
|
36
|
+
valid &= supported_protocols.all? { |supported_protocol| expected_protocols.include? supported_protocol }
|
37
|
+
end
|
38
|
+
|
39
|
+
def protocols
|
40
|
+
results.map(&:protocol).uniq
|
41
|
+
end
|
42
|
+
|
43
|
+
def supported_ciphers
|
44
|
+
@supported_ciphers ||= supported_results.map(&:cipher).uniq
|
45
|
+
end
|
46
|
+
|
47
|
+
def supported_protocols
|
48
|
+
@supported_protocols ||= supported_results.map(&:protocol).uniq
|
49
|
+
end
|
50
|
+
|
51
|
+
def unsupported_protocols
|
52
|
+
protocols - supported_protocols
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
attr_reader :results
|
58
|
+
|
59
|
+
def supported_results
|
60
|
+
results.select(&:supported?)
|
61
|
+
end
|
62
|
+
|
63
|
+
def unsupported_results
|
64
|
+
results - supported_results
|
65
|
+
end
|
66
|
+
|
67
|
+
def results_for_protocol(protocol)
|
68
|
+
results.select do |result|
|
69
|
+
result.protocol == protocol
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# Copyright (c) 2014-2015 Pivotal Software, Inc.
|
2
|
+
# All rights reserved.
|
3
|
+
# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
4
|
+
# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
5
|
+
# PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
6
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
7
|
+
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
8
|
+
# USE OR OTHER DEALINGS IN THE SOFTWARE.
|
9
|
+
#
|
10
|
+
|
11
|
+
module Prof
|
12
|
+
class TestApp
|
13
|
+
def initialize(opts = {})
|
14
|
+
@path = opts.fetch(:path)
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_reader :path
|
18
|
+
end
|
19
|
+
end
|
data/lib/prof/tile.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# Copyright (c) 2014-2015 Pivotal Software, Inc.
|
2
|
+
# All rights reserved.
|
3
|
+
# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
4
|
+
# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
5
|
+
# PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
6
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
7
|
+
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
8
|
+
# USE OR OTHER DEALINGS IN THE SOFTWARE.
|
9
|
+
#
|
10
|
+
|
11
|
+
module Prof
|
12
|
+
class Tile
|
13
|
+
def initialize(name:, version: nil, guid: nil)
|
14
|
+
@name = name
|
15
|
+
@version = version
|
16
|
+
@guid = guid
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_s
|
20
|
+
version ? "#{name} v#{version}" : name
|
21
|
+
end
|
22
|
+
|
23
|
+
attr_reader :name, :version, :guid
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# Copyright (c) 2014-2015 Pivotal Software, Inc.
|
2
|
+
# All rights reserved.
|
3
|
+
# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
4
|
+
# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
5
|
+
# PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
6
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
7
|
+
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
8
|
+
# USE OR OTHER DEALINGS IN THE SOFTWARE.
|
9
|
+
#
|
10
|
+
|
11
|
+
require 'uaa'
|
12
|
+
|
13
|
+
module Prof
|
14
|
+
class UAAClient
|
15
|
+
def initialize(system_domain, cloud_controller_username, cloud_controller_password)
|
16
|
+
@system_domain = system_domain
|
17
|
+
@cloud_controller_username = cloud_controller_username
|
18
|
+
@cloud_controller_password = cloud_controller_password
|
19
|
+
end
|
20
|
+
|
21
|
+
def register_user(user)
|
22
|
+
scim.add(:user, scim_info(user))
|
23
|
+
end
|
24
|
+
|
25
|
+
def unregister_user(user)
|
26
|
+
scim.delete(:user, scim.id(:user, user.username))
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
attr_reader :system_domain, :cloud_controller_username, :cloud_controller_password
|
32
|
+
|
33
|
+
def scim_info(user)
|
34
|
+
{
|
35
|
+
userName: user.username,
|
36
|
+
password: user.password,
|
37
|
+
emails: [{value: user.email}]
|
38
|
+
}
|
39
|
+
end
|
40
|
+
|
41
|
+
def scim
|
42
|
+
CF::UAA::Scim.new(
|
43
|
+
uaa_url,
|
44
|
+
auth_header,
|
45
|
+
skip_ssl_validation: true
|
46
|
+
)
|
47
|
+
end
|
48
|
+
|
49
|
+
def auth_header
|
50
|
+
token_issuer.client_credentials_grant.auth_header
|
51
|
+
end
|
52
|
+
|
53
|
+
def token_issuer
|
54
|
+
CF::UAA::TokenIssuer.new(
|
55
|
+
uaa_url,
|
56
|
+
cloud_controller_username,
|
57
|
+
cloud_controller_password,
|
58
|
+
skip_ssl_validation: true
|
59
|
+
)
|
60
|
+
end
|
61
|
+
|
62
|
+
def uaa_url
|
63
|
+
"https://uaa.#{system_domain}"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/lib/prof/version.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
# Copyright (c) 2014-2015 Pivotal Software, Inc.
|
2
|
+
# All rights reserved.
|
3
|
+
# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
4
|
+
# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
5
|
+
# PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
6
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
7
|
+
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
8
|
+
# USE OR OTHER DEALINGS IN THE SOFTWARE.
|
9
|
+
#
|
10
|
+
|
11
|
+
module Prof
|
12
|
+
VERSION = '0.29.3'
|
13
|
+
end
|