hammer_cli 0.10.0 → 0.10.1
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 +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>
|