hammer_cli 0.10.0 → 0.10.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/hammer +2 -1
- data/config/cli_config.template.yml +1 -1
- data/doc/release_notes.md +4 -0
- data/lib/hammer_cli/ca_cert_fetcher.rb +43 -28
- data/lib/hammer_cli/ca_cert_manager.rb +71 -0
- data/lib/hammer_cli/ssloptions.rb +7 -0
- data/lib/hammer_cli/version.rb +1 -1
- data/locale/ca/LC_MESSAGES/hammer-cli.mo +0 -0
- data/locale/de/LC_MESSAGES/hammer-cli.mo +0 -0
- data/locale/en/LC_MESSAGES/hammer-cli.mo +0 -0
- data/locale/en_GB/LC_MESSAGES/hammer-cli.mo +0 -0
- data/locale/es/LC_MESSAGES/hammer-cli.mo +0 -0
- data/locale/fr/LC_MESSAGES/hammer-cli.mo +0 -0
- data/locale/it/LC_MESSAGES/hammer-cli.mo +0 -0
- data/locale/ja/LC_MESSAGES/hammer-cli.mo +0 -0
- data/locale/ko/LC_MESSAGES/hammer-cli.mo +0 -0
- data/locale/pt_BR/LC_MESSAGES/hammer-cli.mo +0 -0
- data/locale/ru/LC_MESSAGES/hammer-cli.mo +0 -0
- data/locale/zh_CN/LC_MESSAGES/hammer-cli.mo +0 -0
- data/locale/zh_TW/LC_MESSAGES/hammer-cli.mo +0 -0
- data/man/hammer.1.gz +0 -0
- data/test/reports/TEST-Fields-ContainerField-display-.xml +7 -0
- data/test/reports/TEST-Fields-ContainerField-display-blank-is-allowed.xml +15 -0
- data/test/reports/TEST-Fields-ContainerField-display-blank-is-not-allowed.xml +15 -0
- data/test/reports/TEST-Fields-ContainerField.xml +7 -0
- data/test/reports/TEST-Fields-Field-display-.xml +7 -0
- data/test/reports/TEST-Fields-Field-display-blank-is-allowed.xml +11 -0
- data/test/reports/TEST-Fields-Field-display-blank-is-not-allowed.xml +11 -0
- data/test/reports/TEST-Fields-Field-hide-blank-.xml +11 -0
- data/test/reports/TEST-Fields-Field-parameters.xml +9 -0
- data/test/reports/TEST-Fields-Field.xml +13 -0
- data/test/reports/TEST-HammerCLI-AbstractCommand-build-options.xml +15 -0
- data/test/reports/TEST-HammerCLI-AbstractCommand-exception-handler.xml +13 -0
- data/test/reports/TEST-HammerCLI-AbstractCommand-logging.xml +21 -0
- data/test/reports/TEST-HammerCLI-AbstractCommand-option-builder.xml +11 -0
- data/test/reports/TEST-HammerCLI-AbstractCommand-options.xml +11 -0
- data/test/reports/TEST-HammerCLI-AbstractCommand-output.xml +19 -0
- data/test/reports/TEST-HammerCLI-AbstractCommand-subcommand-behavior-remove-subcommand.xml +11 -0
- data/test/reports/TEST-HammerCLI-AbstractCommand-subcommand-behavior-subcommand-.xml +13 -0
- data/test/reports/TEST-HammerCLI-AbstractCommand-subcommand-behavior-subcommand.xml +11 -0
- data/test/reports/TEST-HammerCLI-AbstractCommand-subcommand-behavior.xml +7 -0
- data/test/reports/TEST-HammerCLI-AbstractCommand.xml +11 -0
- data/test/reports/TEST-HammerCLI-Apipie-Command-options.xml +11 -0
- data/test/reports/TEST-HammerCLI-Apipie-Command-resource-defined.xml +9 -0
- data/test/reports/TEST-HammerCLI-Apipie-Command-setting-resources.xml +19 -0
- data/test/reports/TEST-HammerCLI-Apipie-Command.xml +9 -0
- data/test/reports/TEST-HammerCLI-Apipie-OptionBuilder-aliasing-resources.xml +13 -0
- data/test/reports/TEST-HammerCLI-Apipie-OptionBuilder-filtering-options.xml +15 -0
- data/test/reports/TEST-HammerCLI-Apipie-OptionBuilder-required-options.xml +11 -0
- data/test/reports/TEST-HammerCLI-Apipie-OptionBuilder-setting-correct-normalizers.xml +9 -0
- data/test/reports/TEST-HammerCLI-Apipie-OptionBuilder-with-hash-params.xml +11 -0
- data/test/reports/TEST-HammerCLI-Apipie-OptionBuilder-with-one-simple-param.xml +15 -0
- data/test/reports/TEST-HammerCLI-Apipie-OptionBuilder.xml +7 -0
- data/test/reports/TEST-HammerCLI-Completer-command-completion.xml +29 -0
- data/test/reports/TEST-HammerCLI-Completer-option-value-completion.xml +17 -0
- data/test/reports/TEST-HammerCLI-Completer-subcommand-completion.xml +19 -0
- data/test/reports/TEST-HammerCLI-Completer.xml +7 -0
- data/test/reports/TEST-HammerCLI-CompleterLine-line-complete.xml +25 -0
- data/test/reports/TEST-HammerCLI-CompleterLine-splitting-words.xml +29 -0
- data/test/reports/TEST-HammerCLI-CompleterLine.xml +7 -0
- data/test/reports/TEST-HammerCLI-CompleterWord-complete-.xml +23 -0
- data/test/reports/TEST-HammerCLI-CompleterWord-quote.xml +15 -0
- data/test/reports/TEST-HammerCLI-CompleterWord-quoted-.xml +13 -0
- data/test/reports/TEST-HammerCLI-CompleterWord.xml +7 -0
- data/test/reports/TEST-HammerCLI-Connection.xml +21 -0
- data/test/reports/TEST-HammerCLI-ExceptionHandler.xml +21 -0
- data/test/reports/TEST-HammerCLI-I18n.xml +11 -0
- data/test/reports/TEST-HammerCLI-MainCommand-loading-context-password.xml +11 -0
- data/test/reports/TEST-HammerCLI-MainCommand-loading-context-username.xml +11 -0
- data/test/reports/TEST-HammerCLI-MainCommand-loading-context-verbose.xml +9 -0
- data/test/reports/TEST-HammerCLI-MainCommand-loading-context.xml +7 -0
- data/test/reports/TEST-HammerCLI-MainCommand.xml +7 -0
- data/test/reports/TEST-HammerCLI-Modules-find-by-name.xml +13 -0
- data/test/reports/TEST-HammerCLI-Modules-load-a-module-module-not-found.xml +13 -0
- data/test/reports/TEST-HammerCLI-Modules-load-a-module-module-runtime-exception.xml +13 -0
- data/test/reports/TEST-HammerCLI-Modules-load-a-module-success.xml +15 -0
- data/test/reports/TEST-HammerCLI-Modules-load-a-module.xml +7 -0
- data/test/reports/TEST-HammerCLI-Modules-load-all-modules.xml +9 -0
- data/test/reports/TEST-HammerCLI-Modules-names.xml +13 -0
- data/test/reports/TEST-HammerCLI-Modules.xml +7 -0
- data/test/reports/TEST-HammerCLI-OptionBuilderContainer.0.xml +7 -0
- data/test/reports/TEST-HammerCLI-OptionBuilderContainer.xml +11 -0
- data/test/reports/TEST-HammerCLI-Options-Normalizers-abstract.xml +9 -0
- data/test/reports/TEST-HammerCLI-Options-Normalizers-bool.xml +31 -0
- data/test/reports/TEST-HammerCLI-Options-Normalizers-datetime.xml +17 -0
- data/test/reports/TEST-HammerCLI-Options-Normalizers-enum.xml +15 -0
- data/test/reports/TEST-HammerCLI-Options-Normalizers-enumlist.xml +21 -0
- data/test/reports/TEST-HammerCLI-Options-Normalizers-json-input.xml +15 -0
- data/test/reports/TEST-HammerCLI-Options-Normalizers-key-value-list.xml +17 -0
- data/test/reports/TEST-HammerCLI-Options-Normalizers-list.xml +15 -0
- data/test/reports/TEST-HammerCLI-Options-Normalizers.xml +7 -0
- data/test/reports/TEST-HammerCLI-Options-OptionDefinition-context.xml +9 -0
- data/test/reports/TEST-HammerCLI-Options-OptionDefinition-formatters.xml +11 -0
- data/test/reports/TEST-HammerCLI-Options-OptionDefinition.xml +7 -0
- data/test/reports/TEST-HammerCLI-Output-Adapter-Abstract-error-messages.xml +15 -0
- data/test/reports/TEST-HammerCLI-Output-Adapter-Abstract-messages.xml +11 -0
- data/test/reports/TEST-HammerCLI-Output-Adapter-Abstract-test-data-for-field.xml +15 -0
- data/test/reports/TEST-HammerCLI-Output-Adapter-Abstract.xml +17 -0
- data/test/reports/TEST-HammerCLI-Output-Adapter-Base-print-collection-show-ids.xml +9 -0
- data/test/reports/TEST-HammerCLI-Output-Adapter-Base-print-collection.xml +27 -0
- data/test/reports/TEST-HammerCLI-Output-Adapter-Base.xml +7 -0
- data/test/reports/TEST-HammerCLI-Output-Adapter-CSValues-print-collection-formatters.xml +11 -0
- data/test/reports/TEST-HammerCLI-Output-Adapter-CSValues-print-collection-handle-fields-with-collections.xml +13 -0
- data/test/reports/TEST-HammerCLI-Output-Adapter-CSValues-print-collection-handle-fields-with-containers.xml +11 -0
- data/test/reports/TEST-HammerCLI-Output-Adapter-CSValues-print-collection-handle-ids.xml +11 -0
- data/test/reports/TEST-HammerCLI-Output-Adapter-CSValues-print-collection.xml +11 -0
- data/test/reports/TEST-HammerCLI-Output-Adapter-CSValues-print-message.xml +11 -0
- data/test/reports/TEST-HammerCLI-Output-Adapter-CSValues.xml +7 -0
- data/test/reports/TEST-HammerCLI-Output-Adapter-Table-print-collection-column-width.xml +15 -0
- data/test/reports/TEST-HammerCLI-Output-Adapter-Table-print-collection-formatters.xml +11 -0
- data/test/reports/TEST-HammerCLI-Output-Adapter-Table-print-collection-handle-ids.xml +11 -0
- data/test/reports/TEST-HammerCLI-Output-Adapter-Table-print-collection-sort-columns.xml +9 -0
- data/test/reports/TEST-HammerCLI-Output-Adapter-Table-print-collection.xml +11 -0
- data/test/reports/TEST-HammerCLI-Output-Adapter-Table.xml +7 -0
- data/test/reports/TEST-HammerCLI-Output-Definition-empty-.xml +11 -0
- data/test/reports/TEST-HammerCLI-Output-Definition.xml +11 -0
- data/test/reports/TEST-HammerCLI-Output-Dsl-collection.xml +13 -0
- data/test/reports/TEST-HammerCLI-Output-Dsl-custom-fields.xml +11 -0
- data/test/reports/TEST-HammerCLI-Output-Dsl-fields.xml +15 -0
- data/test/reports/TEST-HammerCLI-Output-Dsl-label.xml +13 -0
- data/test/reports/TEST-HammerCLI-Output-Dsl-path-definition.xml +13 -0
- data/test/reports/TEST-HammerCLI-Output-Dsl.xml +9 -0
- data/test/reports/TEST-HammerCLI-Output-FieldFilter.xml +13 -0
- data/test/reports/TEST-HammerCLI-Output-Formatters-BooleanFormatter.xml +11 -0
- data/test/reports/TEST-HammerCLI-Output-Formatters-ColorFormatter.xml +9 -0
- data/test/reports/TEST-HammerCLI-Output-Formatters-DateFormatter.xml +11 -0
- data/test/reports/TEST-HammerCLI-Output-Formatters-FieldFormatter.xml +13 -0
- data/test/reports/TEST-HammerCLI-Output-Formatters-FormatterContainer.xml +13 -0
- data/test/reports/TEST-HammerCLI-Output-Formatters-FormatterLibrary.xml +11 -0
- data/test/reports/TEST-HammerCLI-Output-Formatters-KeyValueFormatter.xml +13 -0
- data/test/reports/TEST-HammerCLI-Output-Formatters-ListFormatter.xml +13 -0
- data/test/reports/TEST-HammerCLI-Output-Formatters-LongTextFormatter.xml +13 -0
- data/test/reports/TEST-HammerCLI-Output-Output-adapters.xml +17 -0
- data/test/reports/TEST-HammerCLI-Output-Output-data.xml +15 -0
- data/test/reports/TEST-HammerCLI-Output-Output-formatters.xml +9 -0
- data/test/reports/TEST-HammerCLI-Output-Output-messages.xml +19 -0
- data/test/reports/TEST-HammerCLI-Output-Output.xml +7 -0
- data/test/reports/TEST-HammerCLI-Output-RecordCollection.xml +13 -0
- data/test/reports/TEST-HammerCLI-Settings-load-from-paths.xml +15 -0
- data/test/reports/TEST-HammerCLI-Settings.xml +25 -0
- data/test/reports/TEST-HammerCLI-ShellHistory-loading-old-history.xml +11 -0
- data/test/reports/TEST-HammerCLI-ShellHistory-saving-history.xml +15 -0
- data/test/reports/TEST-HammerCLI-ShellHistory.xml +7 -0
- data/test/reports/TEST-MiniTest-Spec.xml +7 -0
- data/test/reports/TEST-String-camelize.xml +11 -0
- data/test/reports/TEST-String-formatting.xml +17 -0
- data/test/reports/TEST-String-indent.xml +11 -0
- data/test/reports/TEST-String-interactive-.xml +13 -0
- data/test/reports/TEST-String.xml +7 -0
- data/test/reports/TEST-constraints-HammerCLI-Validator-AllConstraint-exist-.xml +13 -0
- data/test/reports/TEST-constraints-HammerCLI-Validator-AllConstraint.xml +7 -0
- data/test/reports/TEST-constraints-HammerCLI-Validator-AnyConstraint-exist-.xml +13 -0
- data/test/reports/TEST-constraints-HammerCLI-Validator-AnyConstraint.xml +7 -0
- data/test/reports/TEST-constraints-HammerCLI-Validator-BaseConstraint-exist-.xml +9 -0
- data/test/reports/TEST-constraints-HammerCLI-Validator-BaseConstraint-rejected.xml +13 -0
- data/test/reports/TEST-constraints-HammerCLI-Validator-BaseConstraint-required.xml +13 -0
- data/test/reports/TEST-constraints-HammerCLI-Validator-BaseConstraint.xml +7 -0
- data/test/reports/TEST-constraints.xml +7 -0
- data/test/unit/apipie/api_connection_test.rb +1 -0
- data/test/unit/ca_cert_manager_test.rb +64 -0
- data/test/unit/fixtures/certs/ca_cert.pem +21 -0
- metadata +327 -48
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a51bb0421b077ec5f6b58516eb36bfb36593543a
|
4
|
+
data.tar.gz: e10795cc718d474a9b71e084472c2e9455bcc208
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 177b9fe7bcfc57623a87fe32890a44ffe8ce2ed9c25bdcde061c87670fb8a1a6e5cf5993046262eabbf993984621e119fda6ec72ce880531f998893da80c6a9d
|
7
|
+
data.tar.gz: 37f64d084f60e2e87fa99ac7f1b2ffe670a7577ec715e349439dce07432d9deee7e2193b16be8b35c896d75777a7dd0e55360b2c8e529b2ffbebb8adf2ac2df4
|
data/bin/hammer
CHANGED
@@ -125,7 +125,8 @@ require 'hammer_cli'
|
|
125
125
|
|
126
126
|
if preparser.fetch_ca_cert
|
127
127
|
require 'hammer_cli/ca_cert_fetcher'
|
128
|
-
|
128
|
+
ca_path = HammerCLI::SSLOptions.get_options[:ssl_ca_path]
|
129
|
+
exit HammerCLI::CACertFetcher.new.fetch_ca_cert(preparser.fetch_ca_cert, ca_path)
|
129
130
|
end
|
130
131
|
|
131
132
|
# load modules set in config
|
data/doc/release_notes.md
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
Release notes
|
2
2
|
=============
|
3
3
|
|
4
|
+
### 0.10.1 (2017-04-24)
|
5
|
+
* Require apipie-bindings >= 0.2.0 ([#19083](http://projects.theforeman.org/issues/19083))
|
6
|
+
* Install server CA cert without root access ([#19083](http://projects.theforeman.org/issues/19083))
|
7
|
+
|
4
8
|
### 0.10.0 (2017-03-28)
|
5
9
|
* Defaults match on option switch name (#233) ([#17920](http://projects.theforeman.org/issues/17920))
|
6
10
|
* Add support for client certificate authentication ([#12401](http://projects.theforeman.org/issues/12401))
|
@@ -1,39 +1,66 @@
|
|
1
|
+
require 'hammer_cli/ca_cert_manager'
|
1
2
|
module HammerCLI
|
2
3
|
class CACertFetcher
|
3
|
-
def
|
4
|
-
CACertFetcher.new.fetch_ca_cert(host)
|
5
|
-
end
|
6
|
-
|
7
|
-
def fetch_ca_cert(host)
|
4
|
+
def fetch_ca_cert(service_uri, ca_path)
|
8
5
|
begin
|
9
|
-
uri = URI.parse(
|
6
|
+
uri = URI.parse(service_uri)
|
7
|
+
raise URI::InvalidURIError.new(_("Unable to find hostname in #{service_uri}")) if uri.host.nil?
|
8
|
+
raise URI::InvalidURIError.new(scheme_error(uri)) unless uri.scheme == 'https'
|
9
|
+
ca_cert_manager = HammerCLI::CACertManager.new(ca_path)
|
10
|
+
raw_cert = HammerCLI::CACertDownloader.new.download(uri)
|
11
|
+
cert_file = ca_cert_manager.cert_file_name(uri)
|
12
|
+
ca_cert_manager.store_ca_cert(raw_cert, cert_file)
|
10
13
|
|
11
|
-
|
12
|
-
|
14
|
+
rh_install_path = "/etc/pki/ca-trust/source/anchors/"
|
15
|
+
rh_update_cmd = "update-ca-trust"
|
16
|
+
deb_install_path = "/usr/local/share/ca-certificates/"
|
17
|
+
deb_update_cmd = "update-ca-certificates"
|
18
|
+
cert_file = ca_cert_manager.cert_file_name(uri)
|
13
19
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
20
|
+
puts _("CA certificate for #{service_uri} was stored to #{cert_file}")
|
21
|
+
puts _("Now hammer can use the downloaded certificate to verify SSL connection to the server.")
|
22
|
+
puts
|
23
|
+
puts _("Be aware that hammer cannot verify whether the certificate is correct and you should verify its authenticity.")
|
24
|
+
puts
|
25
|
+
puts _("You can display the certificate content with")
|
26
|
+
puts " $ openssl x509 -text -in #{cert_file}"
|
27
|
+
puts
|
19
28
|
|
20
|
-
|
29
|
+
cert_install_msg = _("As root you can also install the certificate and update the system-wide list of trusted CA certificates as follows:") + "\n"
|
30
|
+
|
31
|
+
if File.directory?(rh_install_path)
|
32
|
+
puts cert_install_msg
|
33
|
+
puts " $ install #{cert_file} #{rh_install_path}"
|
34
|
+
puts " $ #{rh_update_cmd}"
|
35
|
+
elsif File.directory?(deb_install_path)
|
36
|
+
puts cert_install_msg
|
37
|
+
puts " $ install #{cert_file} #{deb_install_path}"
|
38
|
+
puts " $ #{deb_update_cmd}"
|
39
|
+
end
|
40
|
+
puts
|
21
41
|
return HammerCLI::EX_OK
|
42
|
+
|
43
|
+
rescue URI::InvalidURIError => e
|
44
|
+
$stderr.puts _("Couldn't parse URI '%s'.") % service_uri
|
45
|
+
$stderr.puts e.message
|
46
|
+
return HammerCLI::EX_SOFTWARE
|
22
47
|
rescue StandardError => e
|
48
|
+
logger = Logging.logger['CACertFetcher']
|
23
49
|
msg = [_('Fetching the CA certificate failed:')]
|
24
50
|
|
25
51
|
if e.is_a?(OpenSSL::SSL::SSLError) && e.message.include?('unknown protocol')
|
26
52
|
msg << _('The service at the given URI does not accept SSL connections')
|
27
|
-
msg << scheme_error
|
53
|
+
msg << scheme_error if uri.scheme == 'http'
|
28
54
|
else
|
29
55
|
msg << e.message
|
30
56
|
end
|
31
57
|
$stderr.puts msg.join("\n")
|
58
|
+
logger.error(e.backtrace.join("\n "))
|
32
59
|
return HammerCLI::EX_SOFTWARE
|
33
60
|
end
|
34
61
|
end
|
35
62
|
|
36
|
-
|
63
|
+
private
|
37
64
|
|
38
65
|
def scheme_error(uri)
|
39
66
|
_("Perhaps you meant to connect to '%s'?") % uri_to_https(uri)
|
@@ -51,17 +78,5 @@ module HammerCLI
|
|
51
78
|
end
|
52
79
|
https_uri
|
53
80
|
end
|
54
|
-
|
55
|
-
def get_ca_cert(hostname, port)
|
56
|
-
noverify_ssl_connection = OpenSSL::SSL::SSLSocket.new(TCPSocket.new(hostname, port), noverify_ssl_context)
|
57
|
-
noverify_ssl_connection.connect
|
58
|
-
noverify_ssl_connection.peer_cert_chain.last
|
59
|
-
end
|
60
|
-
|
61
|
-
def noverify_ssl_context
|
62
|
-
noverify_ssl_context = OpenSSL::SSL::SSLContext.new
|
63
|
-
noverify_ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
64
|
-
noverify_ssl_context
|
65
|
-
end
|
66
81
|
end
|
67
82
|
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
module HammerCLI
|
4
|
+
class CACertManager
|
5
|
+
attr_reader :ca_path
|
6
|
+
|
7
|
+
def initialize(ca_path)
|
8
|
+
@ca_path = ca_path
|
9
|
+
end
|
10
|
+
|
11
|
+
def store_ca_cert(raw_cert, cert_file)
|
12
|
+
ensure_ca_path_exist
|
13
|
+
File.write(cert_file, raw_cert)
|
14
|
+
hash = cert_hash(raw_cert)
|
15
|
+
create_link(hash, cert_file)
|
16
|
+
cert_file
|
17
|
+
end
|
18
|
+
|
19
|
+
def cert_hash(raw_cert)
|
20
|
+
cert = OpenSSL::X509::Certificate.new(raw_cert)
|
21
|
+
subject = OpenSSL::X509::Name.new(cert.subject)
|
22
|
+
subject.hash
|
23
|
+
end
|
24
|
+
|
25
|
+
def create_link(hash, cert_file)
|
26
|
+
ensure_ca_path_exist
|
27
|
+
cert_link = File.join(ca_path, "#{hash.to_s(16)}.%s")
|
28
|
+
count = 0
|
29
|
+
# increase hash index if file or link to different target already exist
|
30
|
+
while plain_file?(cert_link % count) || link_to_different_target?(cert_link % count, cert_file) do
|
31
|
+
count += 1
|
32
|
+
end
|
33
|
+
File.symlink(cert_file, cert_link % count) unless File.symlink?(cert_link % count)
|
34
|
+
end
|
35
|
+
|
36
|
+
def cert_file_name(uri)
|
37
|
+
File.join(ca_path, "#{uri.host}.pem")
|
38
|
+
end
|
39
|
+
|
40
|
+
protected
|
41
|
+
|
42
|
+
|
43
|
+
def ensure_ca_path_exist
|
44
|
+
FileUtils.mkpath(ca_path) unless File.directory?(ca_path)
|
45
|
+
end
|
46
|
+
|
47
|
+
def plain_file?(path)
|
48
|
+
File.exist?(path) && !File.symlink?(path)
|
49
|
+
end
|
50
|
+
|
51
|
+
def link_to_different_target?(path, target)
|
52
|
+
File.symlink?(path) && File.expand_path(File.readlink(path)) != File.expand_path(target)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
class CACertDownloader
|
57
|
+
def download(uri)
|
58
|
+
noverify_ssl_connection = OpenSSL::SSL::SSLSocket.new(TCPSocket.new(uri.host, uri.port), noverify_ssl_context)
|
59
|
+
noverify_ssl_connection.connect
|
60
|
+
noverify_ssl_connection.peer_cert_chain.last
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
def noverify_ssl_context
|
66
|
+
noverify_ssl_context = OpenSSL::SSL::SSLContext.new
|
67
|
+
noverify_ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
68
|
+
noverify_ssl_context
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
module HammerCLI
|
2
2
|
class SSLOptions
|
3
|
+
DEFAULT_SSL_CA_PATH = "~/.hammer/certs"
|
4
|
+
|
3
5
|
def initialize(settings = HammerCLI::Settings, logger = Logging.logger['SSLoptions'])
|
4
6
|
@settings = settings
|
5
7
|
@logger = logger
|
@@ -17,6 +19,11 @@ module HammerCLI
|
|
17
19
|
end
|
18
20
|
ssl_options.merge!(cert_key_options)
|
19
21
|
|
22
|
+
ssl_options[:ssl_ca_path] = DEFAULT_SSL_CA_PATH if ssl_options[:ssl_ca_path].nil?
|
23
|
+
[:ssl_ca_file, :ssl_ca_path].each do |opt|
|
24
|
+
ssl_options[opt] = File.expand_path(ssl_options[opt]) unless ssl_options[opt].nil?
|
25
|
+
end
|
26
|
+
|
20
27
|
# enable ssl verification
|
21
28
|
ssl_options[:verify_ssl] = true if ssl_options[:verify_ssl].nil?
|
22
29
|
@logger.debug("SSL options: #{ApipieBindings::Utils::inspect_data(ssl_options)}")
|
data/lib/hammer_cli/version.rb
CHANGED
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/man/hammer.1.gz
CHANGED
Binary file
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<testsuite name="Fields::ContainerField::display?::blank is allowed" tests="4" time="0.000514044" failures="0" errors="0" skipped="0" assertions="4">
|
3
|
+
<testcase name="test_0001_returns false the value is nil" time="0.000160735" assertions="1">
|
4
|
+
</testcase>
|
5
|
+
<testcase name="test_0003_returns false the value is empty hash" time="5.924e-05" assertions="1">
|
6
|
+
</testcase>
|
7
|
+
<testcase name="test_0004_returns true when there is some data under the path" time="5.1533e-05" assertions="1">
|
8
|
+
</testcase>
|
9
|
+
<testcase name="test_0002_returns false the value is empty array" time="4.7909e-05" assertions="1">
|
10
|
+
</testcase>
|
11
|
+
<system-out>
|
12
|
+
</system-out>
|
13
|
+
<system-err>
|
14
|
+
</system-err>
|
15
|
+
</testsuite>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<testsuite name="Fields::ContainerField::display?::blank is not allowed" tests="4" time="0.00050542" failures="0" errors="0" skipped="0" assertions="4">
|
3
|
+
<testcase name="test_0001_returns false the value is nil" time="0.000104095" assertions="1">
|
4
|
+
</testcase>
|
5
|
+
<testcase name="test_0004_returns true when there is some data under the path" time="5.5074e-05" assertions="1">
|
6
|
+
</testcase>
|
7
|
+
<testcase name="test_0002_returns false the value is empty array" time="4.9163e-05" assertions="1">
|
8
|
+
</testcase>
|
9
|
+
<testcase name="test_0003_returns false the value is empty hash" time="4.4524e-05" assertions="1">
|
10
|
+
</testcase>
|
11
|
+
<system-out>
|
12
|
+
</system-out>
|
13
|
+
<system-err>
|
14
|
+
</system-err>
|
15
|
+
</testsuite>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<testsuite name="Fields::Field::display?::blank is allowed" tests="2" time="0.000346718" failures="0" errors="0" skipped="0" assertions="2">
|
3
|
+
<testcase name="test_0002_returns true when there is some data under the path" time="9.5291e-05" assertions="1">
|
4
|
+
</testcase>
|
5
|
+
<testcase name="test_0001_returns false the value is nil" time="5.3478e-05" assertions="1">
|
6
|
+
</testcase>
|
7
|
+
<system-out>
|
8
|
+
</system-out>
|
9
|
+
<system-err>
|
10
|
+
</system-err>
|
11
|
+
</testsuite>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<testsuite name="Fields::Field::display?::blank is not allowed" tests="2" time="0.000332031" failures="0" errors="0" skipped="0" assertions="2">
|
3
|
+
<testcase name="test_0002_returns true when there is some data under the path" time="8.2527e-05" assertions="1">
|
4
|
+
</testcase>
|
5
|
+
<testcase name="test_0001_returns false the value is nil" time="5.4331e-05" assertions="1">
|
6
|
+
</testcase>
|
7
|
+
<system-out>
|
8
|
+
</system-out>
|
9
|
+
<system-err>
|
10
|
+
</system-err>
|
11
|
+
</testsuite>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<testsuite name="Fields::Field::hide_blank?" tests="2" time="0.000327248" failures="0" errors="0" skipped="0" assertions="2">
|
3
|
+
<testcase name="test_0001_defaults to false" time="7.399e-05" assertions="1">
|
4
|
+
</testcase>
|
5
|
+
<testcase name="test_0002_can be set to true in the constructor" time="5.3648e-05" assertions="1">
|
6
|
+
</testcase>
|
7
|
+
<system-out>
|
8
|
+
</system-out>
|
9
|
+
<system-err>
|
10
|
+
</system-err>
|
11
|
+
</testsuite>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<testsuite name="Fields::Field::parameters" tests="1" time="0.000281758" failures="0" errors="0" skipped="0" assertions="1">
|
3
|
+
<testcase name="test_0001_returns all parameters passed to a filed" time="0.00010987" assertions="1">
|
4
|
+
</testcase>
|
5
|
+
<system-out>
|
6
|
+
</system-out>
|
7
|
+
<system-err>
|
8
|
+
</system-err>
|
9
|
+
</testsuite>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<testsuite name="Fields::Field" tests="3" time="0.000378872" failures="0" errors="0" skipped="0" assertions="3">
|
3
|
+
<testcase name="test_0001_stores label from constructor" time="8.5904e-05" assertions="1">
|
4
|
+
</testcase>
|
5
|
+
<testcase name="test_0002_stores path from constructor" time="5.3075e-05" assertions="1">
|
6
|
+
</testcase>
|
7
|
+
<testcase name="test_0003_default path should be empty array" time="4.294e-05" assertions="1">
|
8
|
+
</testcase>
|
9
|
+
<system-out>
|
10
|
+
</system-out>
|
11
|
+
<system-err>
|
12
|
+
</system-err>
|
13
|
+
</testsuite>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<testsuite name="HammerCLI::AbstractCommand::build options" tests="4" time="0.001351635" failures="0" errors="0" skipped="0" assertions="4">
|
3
|
+
<testcase name="test_0004_accepts block" time="0.000477899" assertions="1">
|
4
|
+
</testcase>
|
5
|
+
<testcase name="test_0003_passes params to the builders" time="0.00028496" assertions="1">
|
6
|
+
</testcase>
|
7
|
+
<testcase name="test_0002_should skip options that already exist" time="0.000216207" assertions="1">
|
8
|
+
</testcase>
|
9
|
+
<testcase name="test_0001_should use option builder" time="0.000177748" assertions="1">
|
10
|
+
</testcase>
|
11
|
+
<system-out>
|
12
|
+
</system-out>
|
13
|
+
<system-err>
|
14
|
+
</system-err>
|
15
|
+
</testsuite>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<testsuite name="HammerCLI::AbstractCommand::exception handler" tests="3" time="0.001065241" failures="0" errors="0" skipped="0" assertions="5">
|
3
|
+
<testcase name="test_0003_should return instance of exception handler class defined deeper in a module hierrarchy" time="0.00029177" assertions="2">
|
4
|
+
</testcase>
|
5
|
+
<testcase name="test_0002_should return instance of exception handler class defined in a module" time="0.000228844" assertions="2">
|
6
|
+
</testcase>
|
7
|
+
<testcase name="test_0001_should return instance of hammer cli exception handler by default" time="0.000359925" assertions="1">
|
8
|
+
</testcase>
|
9
|
+
<system-out>
|
10
|
+
</system-out>
|
11
|
+
<system-err>
|
12
|
+
</system-err>
|
13
|
+
</testsuite>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<testsuite name="HammerCLI::AbstractCommand::logging" tests="7" time="0.005629746" failures="0" errors="0" skipped="0" assertions="12">
|
3
|
+
<testcase name="test_0007_should have logger.watch colorized output switch in settings" time="0.001215608" assertions="2">
|
4
|
+
</testcase>
|
5
|
+
<testcase name="test_0003_should have logger named by the class by default" time="0.00071257" assertions="2">
|
6
|
+
</testcase>
|
7
|
+
<testcase name="test_0002_password should be hidden in logs" time="0.000708892" assertions="1">
|
8
|
+
</testcase>
|
9
|
+
<testcase name="test_0004_should have logger that accepts custom name" time="0.000841507" assertions="2">
|
10
|
+
</testcase>
|
11
|
+
<testcase name="test_0005_should have logger that can inspect object" time="0.000748318" assertions="2">
|
12
|
+
</testcase>
|
13
|
+
<testcase name="test_0001_should log what has been executed" time="0.000352436" assertions="1">
|
14
|
+
</testcase>
|
15
|
+
<testcase name="test_0006_should have logger.watch output without colors" time="0.000799178" assertions="2">
|
16
|
+
</testcase>
|
17
|
+
<system-out>
|
18
|
+
</system-out>
|
19
|
+
<system-err>
|
20
|
+
</system-err>
|
21
|
+
</testsuite>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<testsuite name="HammerCLI::AbstractCommand::option builder" tests="2" time="0.000349776" failures="0" errors="0" skipped="0" assertions="2">
|
3
|
+
<testcase name="test_0001_uses builder container as default" time="9.1626e-05" assertions="1">
|
4
|
+
</testcase>
|
5
|
+
<testcase name="test_0002_Default builder container is empty" time="4.5179e-05" assertions="1">
|
6
|
+
</testcase>
|
7
|
+
<system-out>
|
8
|
+
</system-out>
|
9
|
+
<system-err>
|
10
|
+
</system-err>
|
11
|
+
</testsuite>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<testsuite name="HammerCLI::AbstractCommand::options" tests="2" time="0.000433705" failures="0" errors="0" skipped="0" assertions="2">
|
3
|
+
<testcase name="test_0002_should set options' formatters" time="0.000197632" assertions="1">
|
4
|
+
</testcase>
|
5
|
+
<testcase name="test_0001_should create instances of hammer options" time="5.6937e-05" assertions="1">
|
6
|
+
</testcase>
|
7
|
+
<system-out>
|
8
|
+
</system-out>
|
9
|
+
<system-err>
|
10
|
+
</system-err>
|
11
|
+
</testsuite>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<testsuite name="HammerCLI::AbstractCommand::output" tests="6" time="0.000637574" failures="0" errors="0" skipped="0" assertions="6">
|
3
|
+
<testcase name="test_0006_can define fields" time="0.000126013" assertions="1">
|
4
|
+
</testcase>
|
5
|
+
<testcase name="test_0005_can append existing definition without passing a block" time="6.2427e-05" assertions="1">
|
6
|
+
</testcase>
|
7
|
+
<testcase name="test_0001_should define adapter" time="5.3792e-05" assertions="1">
|
8
|
+
</testcase>
|
9
|
+
<testcase name="test_0004_can append existing definition" time="5.6941e-05" assertions="1">
|
10
|
+
</testcase>
|
11
|
+
<testcase name="test_0002_should provide instance of output with default adapter set" time="5.4734e-05" assertions="1">
|
12
|
+
</testcase>
|
13
|
+
<testcase name="test_0003_should hold instance of output definition" time="5.7944e-05" assertions="1">
|
14
|
+
</testcase>
|
15
|
+
<system-out>
|
16
|
+
</system-out>
|
17
|
+
<system-err>
|
18
|
+
</system-err>
|
19
|
+
</testsuite>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<testsuite name="HammerCLI::AbstractCommand::subcommand behavior::remove_subcommand" tests="2" time="0.001167359" failures="0" errors="0" skipped="0" assertions="2">
|
3
|
+
<testcase name="test_0002_should write a message to log when removing subcommand" time="0.000669956" assertions="1">
|
4
|
+
</testcase>
|
5
|
+
<testcase name="test_0001_should remove the subcommand" time="0.000316383" assertions="1">
|
6
|
+
</testcase>
|
7
|
+
<system-out>
|
8
|
+
</system-out>
|
9
|
+
<system-err>
|
10
|
+
</system-err>
|
11
|
+
</testsuite>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<testsuite name="HammerCLI::AbstractCommand::subcommand behavior::subcommand!" tests="3" time="0.001481618" failures="0" errors="0" skipped="0" assertions="10">
|
3
|
+
<testcase name="test_0001_should replace commands with the same name" time="0.000501831" assertions="4">
|
4
|
+
</testcase>
|
5
|
+
<testcase name="test_0003_should add the subcommand" time="0.000336002" assertions="4">
|
6
|
+
</testcase>
|
7
|
+
<testcase name="test_0002_should write a message to log when replacing subcommand" time="0.00044575" assertions="2">
|
8
|
+
</testcase>
|
9
|
+
<system-out>
|
10
|
+
</system-out>
|
11
|
+
<system-err>
|
12
|
+
</system-err>
|
13
|
+
</testsuite>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<testsuite name="HammerCLI::AbstractCommand::subcommand behavior::subcommand" tests="2" time="0.000599816" failures="0" errors="0" skipped="0" assertions="5">
|
3
|
+
<testcase name="test_0001_should throw an exception for conflicting commands" time="0.000221174" assertions="1">
|
4
|
+
</testcase>
|
5
|
+
<testcase name="test_0002_should add the subcommand" time="0.000199028" assertions="4">
|
6
|
+
</testcase>
|
7
|
+
<system-out>
|
8
|
+
</system-out>
|
9
|
+
<system-err>
|
10
|
+
</system-err>
|
11
|
+
</testsuite>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<testsuite name="HammerCLI::AbstractCommand" tests="2" time="0.00037477" failures="0" errors="0" skipped="0" assertions="2">
|
3
|
+
<testcase name="test_0001_should inherit command_name" time="9.8291e-05" assertions="1">
|
4
|
+
</testcase>
|
5
|
+
<testcase name="test_0002_should inherit output definition" time="0.000103826" assertions="1">
|
6
|
+
</testcase>
|
7
|
+
<system-out>
|
8
|
+
</system-out>
|
9
|
+
<system-err>
|
10
|
+
</system-err>
|
11
|
+
</testsuite>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<testsuite name="HammerCLI::Apipie::Command::options" tests="2" time="0.000493282" failures="0" errors="0" skipped="0" assertions="2">
|
3
|
+
<testcase name="test_0001_should collect method options from given options" time="0.000190569" assertions="1">
|
4
|
+
</testcase>
|
5
|
+
<testcase name="test_0002_should collect method options from methods" time="0.000108589" assertions="1">
|
6
|
+
</testcase>
|
7
|
+
<system-out>
|
8
|
+
</system-out>
|
9
|
+
<system-err>
|
10
|
+
</system-err>
|
11
|
+
</testsuite>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<testsuite name="HammerCLI::Apipie::Command::resource defined" tests="1" time="0.001214277" failures="0" errors="0" skipped="0" assertions="1">
|
3
|
+
<testcase name="test_0001_should perform a call to api when resource is defined" time="0.001036574" assertions="1">
|
4
|
+
</testcase>
|
5
|
+
<system-out>
|
6
|
+
</system-out>
|
7
|
+
<system-err>
|
8
|
+
</system-err>
|
9
|
+
</testsuite>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<testsuite name="HammerCLI::Apipie::Command::setting resources" tests="6" time="0.00156057" failures="0" errors="0" skipped="0" assertions="18">
|
3
|
+
<testcase name="test_0005_looks up resource in the class' modules" time="0.000118112" assertions="2">
|
4
|
+
</testcase>
|
5
|
+
<testcase name="test_0002_should set resource alone" time="0.000380061" assertions="4">
|
6
|
+
</testcase>
|
7
|
+
<testcase name="test_0004_inherits action from a parent class" time="7.3797e-05" assertions="2">
|
8
|
+
</testcase>
|
9
|
+
<testcase name="test_0006_looks up resource in the superclass" time="6.228e-05" assertions="2">
|
10
|
+
</testcase>
|
11
|
+
<testcase name="test_0001_should set resource and action together" time="0.000357962" assertions="4">
|
12
|
+
</testcase>
|
13
|
+
<testcase name="test_0003_should set resource and action alone" time="0.000357822" assertions="4">
|
14
|
+
</testcase>
|
15
|
+
<system-out>
|
16
|
+
</system-out>
|
17
|
+
<system-err>
|
18
|
+
</system-err>
|
19
|
+
</testsuite>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<testsuite name="HammerCLI::Apipie::Command" tests="1" time="0.001103687" failures="0" errors="0" skipped="0" assertions="1">
|
3
|
+
<testcase name="test_0001_should raise exception when no action is defined" time="0.000928014" assertions="1">
|
4
|
+
</testcase>
|
5
|
+
<system-out>
|
6
|
+
</system-out>
|
7
|
+
<system-err>
|
8
|
+
</system-err>
|
9
|
+
</testsuite>
|