prof 0.29.3
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.
- 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
|