conjur-cli 4.17.0 → 4.18.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -1
- data/bin/conjurize +26 -0
- data/conjur.gemspec +3 -3
- data/features/conjurize.feature +131 -0
- data/features/step_definitions/conjurize_steps.rb +5 -0
- data/features/support/conjur.conf +6 -0
- data/features/support/env.rb +1 -0
- data/lib/conjur/authn.rb +4 -0
- data/lib/conjur/cli.rb +4 -1
- data/lib/conjur/command/hosts.rb +3 -2
- data/lib/conjur/command/policy.rb +2 -1
- data/lib/conjur/command/variables.rb +9 -4
- data/lib/conjur/conjurenv.rb +1 -1
- data/lib/conjur/conjurize.rb +106 -0
- data/lib/conjur/dsl/runner.rb +1 -1
- data/lib/conjur/version.rb +1 -1
- data/spec/command/policy_spec.rb +2 -0
- data/spec/command/variables_spec.rb +31 -6
- data/spec/config_spec.rb +19 -8
- data/spec/env_spec.rb +6 -0
- data/spec/spec_helper.rb +26 -1
- metadata +19 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 72781b9c56ed02155378f270c0c36ca4041870e4
|
4
|
+
data.tar.gz: babddd4db4c6af48e79f68b5efefdaef2af9ae33
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 02429a61b261a87cbb604fea379de4b096431dd6b385df0c3924e637a30ee4e08560867b6e28cc8de1deff349f9c1f156f4a2382ccd4de0bcf45634e1619e6e2
|
7
|
+
data.tar.gz: 26ee97af5b20b8568cac44be5f293d9fb157b80d7ffe3d87d71dd3589df43152f557d89ca71777c0cda57a99256f76e1ae7bc08af8856f17c0ac67d50e5e272c
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,13 @@
|
|
1
|
+
# 4.18.0
|
2
|
+
|
3
|
+
* New `conjurize` command
|
4
|
+
* Deprecate the `host enroll` command
|
5
|
+
* `variable create` command now takes an optional value for the variable after the variable id
|
6
|
+
* Configure "permissive" netrc to allow the `conjur` Unix group to read the `.netrc` or `conjur.identity` file.
|
7
|
+
|
1
8
|
# 4.17.0
|
2
9
|
|
3
|
-
* Support --policy parameter in
|
10
|
+
* Support --policy parameter in `conjur env`
|
4
11
|
* Bugfix: failures on 'variable retire'
|
5
12
|
* Raise a better error in case of missing config
|
6
13
|
|
data/bin/conjurize
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Copyright (C) 2013 Conjur Inc
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of
|
6
|
+
# this software and associated documentation files (the "Software"), to deal in
|
7
|
+
# the Software without restriction, including without limitation the rights to
|
8
|
+
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
9
|
+
# the Software, and to permit persons to whom the Software is furnished to do so,
|
10
|
+
# subject to the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be included in all
|
13
|
+
# copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
17
|
+
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
18
|
+
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
19
|
+
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
20
|
+
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
#
|
22
|
+
|
23
|
+
require 'active_support'
|
24
|
+
require 'conjur/conjurize'
|
25
|
+
|
26
|
+
Conjur::Conjurize.go!
|
data/conjur.gemspec
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
require File.expand_path('../lib/conjur/version', __FILE__)
|
3
3
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
|
-
gem.authors = ["
|
6
|
-
gem.email = ["
|
5
|
+
gem.authors = ["Rafal Rzepecki", "Kevin Gilpin"]
|
6
|
+
gem.email = ["rafal@conjur.net", "kgilpin@conjur.net",]
|
7
7
|
gem.summary = %q{Conjur command line interface}
|
8
8
|
gem.homepage = "https://github.com/conjurinc/cli-ruby"
|
9
9
|
gem.license = 'MIT'
|
@@ -17,7 +17,7 @@ Gem::Specification.new do |gem|
|
|
17
17
|
|
18
18
|
|
19
19
|
gem.add_dependency 'activesupport'
|
20
|
-
gem.add_dependency 'conjur-api', '>=4.
|
20
|
+
gem.add_dependency 'conjur-api', '>=4.11.0'
|
21
21
|
gem.add_dependency 'gli', '>=2.8.0'
|
22
22
|
gem.add_dependency 'highline'
|
23
23
|
gem.add_dependency 'netrc'
|
@@ -0,0 +1,131 @@
|
|
1
|
+
Feature: conjurize program generates install scripts
|
2
|
+
|
3
|
+
Scenario: App just runs
|
4
|
+
When I get help for "conjurize"
|
5
|
+
Then the exit status should be 0
|
6
|
+
And the banner should be present
|
7
|
+
And the banner should document that this app takes options
|
8
|
+
And the following options should be documented:
|
9
|
+
|--version|
|
10
|
+
And the banner should document that this app takes no arguments
|
11
|
+
|
12
|
+
Scenario: Minimal conjurize script
|
13
|
+
When I conjurize ""
|
14
|
+
Then the stdout should contain exactly:
|
15
|
+
"""
|
16
|
+
#!/bin/sh
|
17
|
+
set -e
|
18
|
+
|
19
|
+
# Implementation note: 'tee' is used as a sudo-friendly 'cat' to populate a file with the contents provided below.
|
20
|
+
|
21
|
+
tee /etc/conjur.conf > /dev/null << CONJUR_CONF
|
22
|
+
account: test
|
23
|
+
appliance_url: https://conjur/api
|
24
|
+
cert_file: /etc/conjur-test.pem
|
25
|
+
netrc_path: /etc/conjur.identity
|
26
|
+
plugins: []
|
27
|
+
CONJUR_CONF
|
28
|
+
|
29
|
+
tee /etc/conjur-test.pem > /dev/null << CONJUR_CERT
|
30
|
+
-----BEGIN CERTIFICATE-----
|
31
|
+
MIIDZTCCAk2gAwIBAgIJAMzfPBZBq82XMA0GCSqGSIb3DQEBBQUAMDMxMTAvBgNV
|
32
|
+
BAMTKGVjMi01NC04My05OS0xMzUuY29tcHV0ZS0xLmFtYXpvbmF3cy5jb20wHhcN
|
33
|
+
MTQxMTIxMTUxNDE0WhcNMjQxMTE4MTUxNDE0WjAzMTEwLwYDVQQDEyhlYzItNTQt
|
34
|
+
ODMtOTktMTM1LmNvbXB1dGUtMS5hbWF6b25hd3MuY29tMIIBIjANBgkqhkiG9w0B
|
35
|
+
AQEFAAOCAQ8AMIIBCgKCAQEAlkhRt1pvOkw1JTtvmfa3lHpT00g0lbBnShN5cKI3
|
36
|
+
cT1Na3aGdosPDfn0z+A6GNT2sUcdsc5RLkrZKG2+57B5hyUtdwRoJoTTBqypxJTc
|
37
|
+
vkeMpCrcaeY8Ye0zsoBNaeauXLPobtEV4I6IadJGuT2AKILTJLDYdyV4dg2/zN2z
|
38
|
+
XmW+9FsDs+aJKtWnpBIkvXcCqbaIgRZSxFNeZUF+xDrZdCRm+qkBXZaMFQzLU0BT
|
39
|
+
B239Lmpwp54zsBoTBY9JBS4Atmrwt3YE3JqcIH77GpkgXSx203bYVp0jF3vPxHLU
|
40
|
+
bSqhV9Zw7m6V8uF+jvOdrDiZ33OJN9yx6nS+c7NfOyRgGQIDAQABo3wwejB4BgNV
|
41
|
+
HREEcTBvgglsb2NhbGhvc3SCBmNvbmp1coIVY29uanVyLWRldi5jb25qdXIubmV0
|
42
|
+
ghljb25qdXItZGV2Lml0ZC5jb25qdXIubmV0gihlYzItNTQtODMtOTktMTM1LmNv
|
43
|
+
bXB1dGUtMS5hbWF6b25hd3MuY29tMA0GCSqGSIb3DQEBBQUAA4IBAQB+alzAA3ek
|
44
|
+
o8QrnoDuWOxTqD0XIwzqux6BM/nM4dZX6drr+D0y8QtMKLZNODazvFCJWNHAWWmD
|
45
|
+
FkRudwl3G1Qs56AB+LnQ2jhL5Qf78Rl2vYvdmo8iowEpOBajvzEMLsEaRNmwmSGc
|
46
|
+
yvml0YdVSiMdTdIk58qG84pkmteSX9VYE1IF7xfWb3ji8292fm5q6cgqFLNYx2MI
|
47
|
+
5UyfyroGMJ2ikzTGS64TpCmi/n1sjl2iM+/QmkHVc3KUIdwAY2NttyZ2pZo2J4i6
|
48
|
+
MVs0y+HobWbOKKhyfxpMT59dJxGu21QPbWfQLkHCCOlo2P4z9oku23sbvQQ7CbvS
|
49
|
+
VoykXurdaZo9
|
50
|
+
-----END CERTIFICATE-----
|
51
|
+
CONJUR_CERT
|
52
|
+
|
53
|
+
tee /etc/conjur.identity > /dev/null << CONJUR_IDENTITY
|
54
|
+
machine https://conjur/api/authn
|
55
|
+
login host/ec2/i-eaa5f700
|
56
|
+
password 3a4rb19rpjejr89h6r29kd2fb3808cpy
|
57
|
+
CONJUR_IDENTITY
|
58
|
+
chmod 0600 /etc/conjur.identity
|
59
|
+
|
60
|
+
"""
|
61
|
+
|
62
|
+
Scenario: conjurize with SSH installation
|
63
|
+
When I conjurize "--ssh"
|
64
|
+
Then the stdout should contain exactly:
|
65
|
+
"""
|
66
|
+
#!/bin/sh
|
67
|
+
set -e
|
68
|
+
|
69
|
+
# Implementation note: 'tee' is used as a sudo-friendly 'cat' to populate a file with the contents provided below.
|
70
|
+
|
71
|
+
tee /etc/conjur.conf > /dev/null << CONJUR_CONF
|
72
|
+
account: test
|
73
|
+
appliance_url: https://conjur/api
|
74
|
+
cert_file: /etc/conjur-test.pem
|
75
|
+
netrc_path: /etc/conjur.identity
|
76
|
+
plugins: []
|
77
|
+
CONJUR_CONF
|
78
|
+
|
79
|
+
tee /etc/conjur-test.pem > /dev/null << CONJUR_CERT
|
80
|
+
-----BEGIN CERTIFICATE-----
|
81
|
+
MIIDZTCCAk2gAwIBAgIJAMzfPBZBq82XMA0GCSqGSIb3DQEBBQUAMDMxMTAvBgNV
|
82
|
+
BAMTKGVjMi01NC04My05OS0xMzUuY29tcHV0ZS0xLmFtYXpvbmF3cy5jb20wHhcN
|
83
|
+
MTQxMTIxMTUxNDE0WhcNMjQxMTE4MTUxNDE0WjAzMTEwLwYDVQQDEyhlYzItNTQt
|
84
|
+
ODMtOTktMTM1LmNvbXB1dGUtMS5hbWF6b25hd3MuY29tMIIBIjANBgkqhkiG9w0B
|
85
|
+
AQEFAAOCAQ8AMIIBCgKCAQEAlkhRt1pvOkw1JTtvmfa3lHpT00g0lbBnShN5cKI3
|
86
|
+
cT1Na3aGdosPDfn0z+A6GNT2sUcdsc5RLkrZKG2+57B5hyUtdwRoJoTTBqypxJTc
|
87
|
+
vkeMpCrcaeY8Ye0zsoBNaeauXLPobtEV4I6IadJGuT2AKILTJLDYdyV4dg2/zN2z
|
88
|
+
XmW+9FsDs+aJKtWnpBIkvXcCqbaIgRZSxFNeZUF+xDrZdCRm+qkBXZaMFQzLU0BT
|
89
|
+
B239Lmpwp54zsBoTBY9JBS4Atmrwt3YE3JqcIH77GpkgXSx203bYVp0jF3vPxHLU
|
90
|
+
bSqhV9Zw7m6V8uF+jvOdrDiZ33OJN9yx6nS+c7NfOyRgGQIDAQABo3wwejB4BgNV
|
91
|
+
HREEcTBvgglsb2NhbGhvc3SCBmNvbmp1coIVY29uanVyLWRldi5jb25qdXIubmV0
|
92
|
+
ghljb25qdXItZGV2Lml0ZC5jb25qdXIubmV0gihlYzItNTQtODMtOTktMTM1LmNv
|
93
|
+
bXB1dGUtMS5hbWF6b25hd3MuY29tMA0GCSqGSIb3DQEBBQUAA4IBAQB+alzAA3ek
|
94
|
+
o8QrnoDuWOxTqD0XIwzqux6BM/nM4dZX6drr+D0y8QtMKLZNODazvFCJWNHAWWmD
|
95
|
+
FkRudwl3G1Qs56AB+LnQ2jhL5Qf78Rl2vYvdmo8iowEpOBajvzEMLsEaRNmwmSGc
|
96
|
+
yvml0YdVSiMdTdIk58qG84pkmteSX9VYE1IF7xfWb3ji8292fm5q6cgqFLNYx2MI
|
97
|
+
5UyfyroGMJ2ikzTGS64TpCmi/n1sjl2iM+/QmkHVc3KUIdwAY2NttyZ2pZo2J4i6
|
98
|
+
MVs0y+HobWbOKKhyfxpMT59dJxGu21QPbWfQLkHCCOlo2P4z9oku23sbvQQ7CbvS
|
99
|
+
VoykXurdaZo9
|
100
|
+
-----END CERTIFICATE-----
|
101
|
+
CONJUR_CERT
|
102
|
+
|
103
|
+
tee /etc/conjur.identity > /dev/null << CONJUR_IDENTITY
|
104
|
+
machine https://conjur/api/authn
|
105
|
+
login host/ec2/i-eaa5f700
|
106
|
+
password 3a4rb19rpjejr89h6r29kd2fb3808cpy
|
107
|
+
CONJUR_IDENTITY
|
108
|
+
chmod 0600 /etc/conjur.identity
|
109
|
+
|
110
|
+
curl -L https://www.opscode.com/chef/install.sh | bash
|
111
|
+
chef-solo -r https://github.com/conjur-cookbooks/conjur-ssh/releases/download/v1.2.0/conjur-ssh-v1.2.0.tar.gz -o conjur-ssh
|
112
|
+
|
113
|
+
"""
|
114
|
+
|
115
|
+
Scenario: conjurize with arbitrary cookbook
|
116
|
+
When I conjurize "--conjur-cookbook-url https://example.com --conjur-run-list fry"
|
117
|
+
Then the stdout should contain "chef-solo -r https://example.com -o fry"
|
118
|
+
|
119
|
+
Scenario: conjurize with path to chef-solo
|
120
|
+
When I conjurize "--chef-executable /path/to/chef-solo --conjur-cookbook-url https://example.com --conjur-run-list fry"
|
121
|
+
Then the stdout should contain "/path/to/chef-solo -r https://example.com -o fry"
|
122
|
+
And the stdout should not contain "curl -L https://www.opscode.com/chef/install.sh"
|
123
|
+
|
124
|
+
Scenario: conjurize with sudo-ized commands
|
125
|
+
When I conjurize "--sudo --ssh"
|
126
|
+
Then the stdout should contain "sudo -n tee /etc/conjur.conf > /dev/null << CONJUR_CONF"
|
127
|
+
And the stdout should contain "sudo -n tee /etc/conjur-test.pem > /dev/null << CONJUR_CERT"
|
128
|
+
And the stdout should contain "sudo -n tee /etc/conjur.identity > /dev/null << CONJUR_IDENTITY"
|
129
|
+
And the stdout should contain "sudo -n chmod 0600 /etc/conjur.identity"
|
130
|
+
And the stdout should contain "curl -L https://www.opscode.com/chef/install.sh | sudo -n bash"
|
131
|
+
|
data/features/support/env.rb
CHANGED
data/lib/conjur/authn.rb
CHANGED
@@ -23,6 +23,10 @@ require 'active_support/dependencies/autoload'
|
|
23
23
|
require 'conjur/api'
|
24
24
|
require 'netrc'
|
25
25
|
|
26
|
+
Netrc.configure do |config|
|
27
|
+
config[:allow_permissive_netrc_file] = true
|
28
|
+
end
|
29
|
+
|
26
30
|
module Conjur::Authn
|
27
31
|
autoload :API, 'conjur/authn-api'
|
28
32
|
class << self
|
data/lib/conjur/cli.rb
CHANGED
@@ -32,6 +32,7 @@ module Conjur
|
|
32
32
|
autoload :Command, 'conjur/command'
|
33
33
|
autoload :DSL, 'conjur/dsl/runner'
|
34
34
|
autoload :DSLCommand, 'conjur/command/dsl_command'
|
35
|
+
autoload :VERSION, 'conjur/version'
|
35
36
|
|
36
37
|
module Audit
|
37
38
|
autoload :Follower, 'conjur/audit/follower'
|
@@ -67,7 +68,7 @@ module Conjur
|
|
67
68
|
filename = "conjur-asset-#{plugin}"
|
68
69
|
require filename
|
69
70
|
rescue LoadError
|
70
|
-
warn "Could not load plugin '#{plugin}' specified in your config file.\nMake sure you have the #{filename}
|
71
|
+
warn "Could not load plugin '#{plugin}' specified in your config file.\nMake sure you have the #{filename} gem installed."
|
71
72
|
end
|
72
73
|
end
|
73
74
|
end
|
@@ -85,6 +86,8 @@ module Conjur
|
|
85
86
|
|
86
87
|
init!
|
87
88
|
|
89
|
+
version Conjur::VERSION
|
90
|
+
|
88
91
|
pre do |global,command,options,args|
|
89
92
|
require 'conjur/api'
|
90
93
|
|
data/lib/conjur/command/hosts.rb
CHANGED
@@ -86,9 +86,10 @@ class Conjur::Command::Hosts < Conjur::Command
|
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
89
|
-
hosts.desc "Enroll a new host into conjur"
|
89
|
+
hosts.desc "[Deprecated] Enroll a new host into conjur"
|
90
90
|
hosts.arg_name "host"
|
91
91
|
hosts.command :enroll do |c|
|
92
|
+
hide_docs(c)
|
92
93
|
c.action do |global_options, options, args|
|
93
94
|
id = require_arg(args, 'host')
|
94
95
|
enrollment_url = api.host(id).enrollment_url
|
@@ -108,4 +109,4 @@ class Conjur::Command::Hosts < Conjur::Command
|
|
108
109
|
end
|
109
110
|
end
|
110
111
|
end
|
111
|
-
end
|
112
|
+
end
|
@@ -23,7 +23,7 @@ class Conjur::Command::Variables < Conjur::Command
|
|
23
23
|
desc "Manage variables"
|
24
24
|
command :variable do |var|
|
25
25
|
var.desc "Create and store a variable"
|
26
|
-
var.arg_name "id"
|
26
|
+
var.arg_name "id [value]"
|
27
27
|
var.command :create do |c|
|
28
28
|
c.arg_name "mime_type"
|
29
29
|
c.flag [:m, :"mime-type"], default_value: "text/plain"
|
@@ -32,18 +32,23 @@ class Conjur::Command::Variables < Conjur::Command
|
|
32
32
|
c.flag [:k, :"kind"], default_value: "secret"
|
33
33
|
|
34
34
|
c.arg_name "value"
|
35
|
-
c.desc "Initial value"
|
35
|
+
c.desc "Initial value, which may also be specified as the second command argument after the variable id"
|
36
36
|
c.flag [:v, :"value"]
|
37
37
|
|
38
38
|
acting_as_option(c)
|
39
39
|
|
40
40
|
c.action do |global_options,options,args|
|
41
41
|
id = args.shift
|
42
|
-
options[:id] = id if id
|
43
|
-
|
44
42
|
unless id
|
45
43
|
ActiveSupport::Deprecation.warn "id argument will be required in future releases"
|
46
44
|
end
|
45
|
+
value = args.shift unless args.empty?
|
46
|
+
|
47
|
+
raise "Received extra arguments '#{args.join(' ')}'" unless args.empty?
|
48
|
+
raise "Received conflicting value arguments" if value && options[:value]
|
49
|
+
|
50
|
+
options[:id] = id if id
|
51
|
+
options[:value] ||= value if value
|
47
52
|
|
48
53
|
mime_type = options.delete(:m)
|
49
54
|
kind = options.delete(:k)
|
data/lib/conjur/conjurenv.rb
CHANGED
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'methadone'
|
2
|
+
require 'json'
|
3
|
+
require 'conjur/version.rb'
|
4
|
+
|
5
|
+
module Conjur
|
6
|
+
class Conjurize
|
7
|
+
include Methadone::Main
|
8
|
+
include Methadone::CLILogging
|
9
|
+
|
10
|
+
description <<-DESC
|
11
|
+
Generate a script to install Conjur onto a machine. "conjurize" is designed to be used
|
12
|
+
in a piped execution, along with "conjur host create" and "ssh". For example:
|
13
|
+
|
14
|
+
conjur host create myhost.example.com | tee host.json | conjurize --ssh | ssh myhost.example.com
|
15
|
+
DESC
|
16
|
+
|
17
|
+
version Conjur::VERSION
|
18
|
+
|
19
|
+
main do
|
20
|
+
input = if input_file = options[:f]
|
21
|
+
File.read(input_file)
|
22
|
+
else
|
23
|
+
STDIN.read
|
24
|
+
end
|
25
|
+
host = JSON.parse input
|
26
|
+
|
27
|
+
login = host['id'] or raise "No 'id' field in host JSON"
|
28
|
+
api_key = host['api_key'] or raise "No 'api_key' field in host JSON"
|
29
|
+
|
30
|
+
require 'conjur/cli'
|
31
|
+
if conjur_config = options[:c]
|
32
|
+
Conjur::Config.load [ conjur_config ]
|
33
|
+
else
|
34
|
+
Conjur::Config.load
|
35
|
+
end
|
36
|
+
Conjur::Config.apply
|
37
|
+
|
38
|
+
conjur_cookbook_url = conjur_run_list = nil
|
39
|
+
|
40
|
+
conjur_run_list = options[:"conjur-run-list"]
|
41
|
+
conjur_cookbook_url = options[:"conjur-cookbook-url"]
|
42
|
+
chef_executable = options[:"chef-executable"]
|
43
|
+
|
44
|
+
if options[:ssh]
|
45
|
+
conjur_run_list ||= "conjur-ssh"
|
46
|
+
conjur_cookbook_url ||= "https://github.com/conjur-cookbooks/conjur-ssh/releases/download/v1.2.0/conjur-ssh-v1.2.0.tar.gz"
|
47
|
+
end
|
48
|
+
|
49
|
+
sudo = lambda{|str|
|
50
|
+
[ options[:sudo] ? "sudo -n" : nil, str ].compact.join(" ")
|
51
|
+
}
|
52
|
+
|
53
|
+
header = <<-HEADER
|
54
|
+
#!/bin/sh
|
55
|
+
set -e
|
56
|
+
|
57
|
+
# Implementation note: 'tee' is used as a sudo-friendly 'cat' to populate a file with the contents provided below.
|
58
|
+
HEADER
|
59
|
+
|
60
|
+
configure_conjur = <<-CONFIGURE
|
61
|
+
#{sudo.call 'tee'} /etc/conjur.conf > /dev/null << CONJUR_CONF
|
62
|
+
account: #{Conjur.configuration.account}
|
63
|
+
appliance_url: #{Conjur.configuration.appliance_url}
|
64
|
+
cert_file: /etc/conjur-#{Conjur.configuration.account}.pem
|
65
|
+
netrc_path: /etc/conjur.identity
|
66
|
+
plugins: []
|
67
|
+
CONJUR_CONF
|
68
|
+
|
69
|
+
#{sudo.call 'tee'} /etc/conjur-#{Conjur.configuration.account}.pem > /dev/null << CONJUR_CERT
|
70
|
+
#{File.read(Conjur.configuration.cert_file).strip}
|
71
|
+
CONJUR_CERT
|
72
|
+
|
73
|
+
#{sudo.call 'tee'} /etc/conjur.identity > /dev/null << CONJUR_IDENTITY
|
74
|
+
machine #{Conjur.configuration.appliance_url}/authn
|
75
|
+
login host/#{login}
|
76
|
+
password #{api_key}
|
77
|
+
CONJUR_IDENTITY
|
78
|
+
#{sudo.call 'chmod'} 0600 /etc/conjur.identity
|
79
|
+
CONFIGURE
|
80
|
+
|
81
|
+
install_chef = if conjur_cookbook_url && !chef_executable
|
82
|
+
%Q(curl -L https://www.opscode.com/chef/install.sh | #{sudo.call 'bash'})
|
83
|
+
else
|
84
|
+
nil
|
85
|
+
end
|
86
|
+
|
87
|
+
chef_executable ||= "chef-solo"
|
88
|
+
|
89
|
+
run_chef = if conjur_cookbook_url
|
90
|
+
%Q(#{sudo.call "#{chef_executable} -r #{conjur_cookbook_url} -o #{conjur_run_list}"})
|
91
|
+
else
|
92
|
+
nil
|
93
|
+
end
|
94
|
+
|
95
|
+
puts [ header, configure_conjur, install_chef, run_chef ].compact.join("\n")
|
96
|
+
end
|
97
|
+
|
98
|
+
on("-c CONJUR_CONFIG_FILE", "Overrides defaults (CONJURRC env var, ~/.conjurrc, /etc/conjur.conf).")
|
99
|
+
on("-f HOST_JSON_FILE", "Host login and API key can be read from the output emitted from 'conjur host create'. This data can be obtained from stdin, or from a file.")
|
100
|
+
on("--chef-executable PATH", "If specified, the designated chef-solo executable is used, otherwise Chef is installed on the target machine.")
|
101
|
+
on("--ssh", "Indicates that Conjur SSH should be installed.")
|
102
|
+
on("--sudo", "Indicates that all commands should be run via 'sudo'.")
|
103
|
+
on("--conjur-cookbook-url NAME", "Overrides the default Chef cookbook URL for Conjur SSH.")
|
104
|
+
on("--conjur-run-list RUNLIST", "Overrides the default Chef run list for Conjur SSH.")
|
105
|
+
end
|
106
|
+
end
|
data/lib/conjur/dsl/runner.rb
CHANGED
@@ -20,7 +20,7 @@ module Conjur
|
|
20
20
|
@context['env'] = Conjur.env unless Conjur.env == 'production'
|
21
21
|
@context['stack'] = Conjur.stack unless Conjur.stack == 'v4'
|
22
22
|
@context['appliance_url'] = Conjur.configuration.appliance_url unless Conjur.configuration.appliance_url.nil?
|
23
|
-
@context['ssl_certificate'] = File.read(Conjur
|
23
|
+
@context['ssl_certificate'] = File.read(Conjur.configuration.cert_file) unless Conjur.configuration.cert_file.nil?
|
24
24
|
|
25
25
|
@script = script
|
26
26
|
@filename = filename
|
data/lib/conjur/version.rb
CHANGED
data/spec/command/policy_spec.rb
CHANGED
@@ -22,6 +22,8 @@ describe Conjur::Command::Policy do
|
|
22
22
|
double("resource", exists?: true).as_null_object
|
23
23
|
end
|
24
24
|
before {
|
25
|
+
allow(File).to receive(:read).and_call_original
|
26
|
+
allow(File).to receive(:exists?).and_call_original
|
25
27
|
allow(File).to receive(:exists?).with("policy.rb").and_return true
|
26
28
|
allow(File).to receive(:read).with("policy.rb").and_return "{}"
|
27
29
|
allow_any_instance_of(Conjur::DSL::Runner).to receive(:api).and_return api
|
@@ -2,21 +2,24 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Conjur::Command::Variables, logged_in: true do
|
4
4
|
let(:collection_url) { "https://core.example.com/variables" }
|
5
|
-
|
6
5
|
let(:base_payload) { { mime_type: 'text/json', kind: 'password' } }
|
6
|
+
let(:id) { 'the-id' }
|
7
|
+
let(:variable) { post_response(id) }
|
7
8
|
|
8
9
|
describe_command "variable:create -m text/json -k password" do
|
10
|
+
let(:id) { 'assigned-id' }
|
9
11
|
it "lets the server assign the id" do
|
10
12
|
expect(RestClient::Request).to receive(:execute).with(
|
11
13
|
method: :post,
|
12
14
|
url: collection_url,
|
13
15
|
headers: {},
|
14
16
|
payload: base_payload
|
15
|
-
).and_return(
|
17
|
+
).and_return(variable)
|
16
18
|
|
17
19
|
expect { invoke }.to write({ id: 'assigned-id' }).to(:stdout)
|
18
20
|
end
|
19
21
|
end
|
22
|
+
|
20
23
|
describe_command "variable:create -m text/json -k password the-id" do
|
21
24
|
it "propagates the user-assigned id" do
|
22
25
|
expect(RestClient::Request).to receive(:execute).with(
|
@@ -24,13 +27,37 @@ describe Conjur::Command::Variables, logged_in: true do
|
|
24
27
|
url: collection_url,
|
25
28
|
headers: {},
|
26
29
|
payload: base_payload.merge({ id: 'the-id' })
|
27
|
-
).and_return(
|
30
|
+
).and_return(variable)
|
28
31
|
|
29
32
|
expect { invoke }.to write({ id: 'the-id' }).to(:stdout)
|
30
33
|
end
|
31
34
|
end
|
32
35
|
|
36
|
+
describe_command "variable:create -m text/json -k password the-id the-value" do
|
37
|
+
it "propagates the user-assigned id and value" do
|
38
|
+
expect(RestClient::Request).to receive(:execute).with(
|
39
|
+
method: :post,
|
40
|
+
url: collection_url,
|
41
|
+
headers: {},
|
42
|
+
payload: base_payload.merge({ id: 'the-id', value: 'the-value' })
|
43
|
+
).and_return(variable)
|
33
44
|
|
45
|
+
expect { invoke }.to write({ id: 'the-id' }).to(:stdout)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe_command "variable:create -v the-value-1 the-id the-value-2" do
|
50
|
+
it "complains about conflicting values" do
|
51
|
+
expect { invoke }.to raise_error("Received conflicting value arguments")
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe_command "variable:create the-id -v the-value" do
|
56
|
+
it "complains about extra arguments" do
|
57
|
+
expect { invoke }.to raise_error("Received extra arguments 'the-value'")
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
34
61
|
describe_command "variable:create" do
|
35
62
|
it "provides default values for optional parameters mime_type and kind" do
|
36
63
|
expect(RestClient::Request).to receive(:execute).with(
|
@@ -38,10 +65,8 @@ describe Conjur::Command::Variables, logged_in: true do
|
|
38
65
|
url: collection_url,
|
39
66
|
headers: {},
|
40
67
|
payload: { mime_type: 'text/plain', kind: 'secret'}
|
41
|
-
).and_return(
|
68
|
+
).and_return(variable)
|
42
69
|
expect { invoke }.to write # invoke_silently
|
43
70
|
end
|
44
71
|
end
|
45
|
-
|
46
|
-
|
47
72
|
end
|
data/spec/config_spec.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'spec_helper'
|
1
2
|
require 'conjur/authn'
|
2
3
|
require 'conjur/config'
|
3
4
|
require 'conjur/command/rspec/output_matchers'
|
@@ -107,13 +108,23 @@ describe Conjur::Config do
|
|
107
108
|
end
|
108
109
|
end
|
109
110
|
describe "#apply" do
|
110
|
-
before {
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
111
|
+
before {
|
112
|
+
allow(OpenSSL::SSL::SSLContext::DEFAULT_CERT_STORE).to receive(:add_file)
|
113
|
+
}
|
114
|
+
context "cert_file" do
|
115
|
+
let(:cert_file) { "/path/to/cert.pem" }
|
116
|
+
before {
|
117
|
+
Conjur::Config.class_variable_set("@@attributes", { 'cert_file' => cert_file })
|
118
|
+
}
|
119
|
+
|
120
|
+
it "trusts the cert_file" do
|
121
|
+
expect(OpenSSL::SSL::SSLContext::DEFAULT_CERT_STORE).to receive(:add_file).with cert_file
|
122
|
+
Conjur::Config.apply
|
123
|
+
end
|
124
|
+
it "propagates the cert_file to Configuration.cert_file" do
|
125
|
+
Conjur::Config.apply
|
126
|
+
expect(Conjur.configuration.cert_file).to eq(cert_file)
|
127
|
+
end
|
117
128
|
end
|
118
129
|
|
119
130
|
it "shadows rc with envars" do
|
@@ -121,7 +132,7 @@ describe Conjur::Config do
|
|
121
132
|
ENV['CONJUR_APPLIANCE_URL'] = url
|
122
133
|
load!
|
123
134
|
Conjur::Config.apply
|
124
|
-
expect(Conjur.configuration.appliance_url).to eq
|
135
|
+
expect(Conjur.configuration.appliance_url).to eq(url)
|
125
136
|
end
|
126
137
|
end
|
127
138
|
end
|
data/spec/env_spec.rb
CHANGED
@@ -2,6 +2,12 @@ require 'spec_helper'
|
|
2
2
|
require 'conjur/conjurenv'
|
3
3
|
|
4
4
|
describe Conjur::Env do
|
5
|
+
describe Conjur::Env::ConjurVariable do
|
6
|
+
it "reports a missing value" do
|
7
|
+
var = Conjur::Env::ConjurVariable.new('the-id')
|
8
|
+
expect { var.evaluate nil }.to raise_error "variable the-id exists but doesn't have a value"
|
9
|
+
end
|
10
|
+
end
|
5
11
|
|
6
12
|
describe "#initialize" do
|
7
13
|
|
data/spec/spec_helper.rb
CHANGED
@@ -43,4 +43,29 @@ shared_context "fresh config" do
|
|
43
43
|
Conjur::Config.clear
|
44
44
|
Conjur.configuration = @configuration
|
45
45
|
}
|
46
|
-
end
|
46
|
+
end
|
47
|
+
|
48
|
+
RSpec::Core::DSL.change_global_dsl do
|
49
|
+
def describe_conjurize *argv, &block
|
50
|
+
describe *argv do
|
51
|
+
let(:command) { Conjur::Conjurize }
|
52
|
+
let(:invoke) do
|
53
|
+
command.go!
|
54
|
+
end
|
55
|
+
before {
|
56
|
+
require 'methadone'
|
57
|
+
|
58
|
+
option_parser = OptionParser.new
|
59
|
+
expect(option_parser).to receive(:parse!).with(no_args) do |*args|
|
60
|
+
option_parser.parse! argv
|
61
|
+
end
|
62
|
+
allow(option_parser).to receive(:parse!).and_call_original
|
63
|
+
option_parser_proxy = nil
|
64
|
+
expect(Conjur::Conjurize).to receive(:opts) do |*args|
|
65
|
+
option_parser_proxy ||= Methadone::OptionParserProxy.new(option_parser, command.options)
|
66
|
+
end
|
67
|
+
}
|
68
|
+
instance_eval &block
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: conjur-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.18.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- Rafal Rzepecki
|
8
8
|
- Kevin Gilpin
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-12-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -31,14 +31,14 @@ dependencies:
|
|
31
31
|
requirements:
|
32
32
|
- - '>='
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version: 4.
|
34
|
+
version: 4.11.0
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
39
|
- - '>='
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version: 4.
|
41
|
+
version: 4.11.0
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: gli
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
@@ -223,12 +223,13 @@ dependencies:
|
|
223
223
|
version: 0.0.1
|
224
224
|
description:
|
225
225
|
email:
|
226
|
-
-
|
226
|
+
- rafal@conjur.net
|
227
227
|
- kgilpin@conjur.net
|
228
228
|
executables:
|
229
229
|
- _conjur_completions
|
230
230
|
- _conjur_completions.yaml
|
231
231
|
- conjur
|
232
|
+
- conjurize
|
232
233
|
- jsonfield
|
233
234
|
extensions: []
|
234
235
|
extra_rdoc_files: []
|
@@ -245,8 +246,10 @@ files:
|
|
245
246
|
- bin/_conjur_completions
|
246
247
|
- bin/_conjur_completions.yaml
|
247
248
|
- bin/conjur
|
249
|
+
- bin/conjurize
|
248
250
|
- bin/jsonfield
|
249
251
|
- conjur.gemspec
|
252
|
+
- features/conjurize.feature
|
250
253
|
- features/dsl_context.feature
|
251
254
|
- features/dsl_host_create.feature
|
252
255
|
- features/dsl_ownership.feature
|
@@ -255,9 +258,13 @@ files:
|
|
255
258
|
- features/dsl_role_create.feature
|
256
259
|
- features/dsl_user_create.feature
|
257
260
|
- features/jsonfield.feature
|
261
|
+
- features/step_definitions/conjurize_steps.rb
|
258
262
|
- features/step_definitions/dsl_steps.rb
|
263
|
+
- features/support/conjur-test.pem
|
264
|
+
- features/support/conjur.conf
|
259
265
|
- features/support/env.rb
|
260
266
|
- features/support/hooks.rb
|
267
|
+
- features/support/host.json
|
261
268
|
- lib/conjur.rb
|
262
269
|
- lib/conjur/audit/follower.rb
|
263
270
|
- lib/conjur/authn.rb
|
@@ -290,6 +297,7 @@ files:
|
|
290
297
|
- lib/conjur/command/variables.rb
|
291
298
|
- lib/conjur/config.rb
|
292
299
|
- lib/conjur/conjurenv.rb
|
300
|
+
- lib/conjur/conjurize.rb
|
293
301
|
- lib/conjur/dsl/runner.rb
|
294
302
|
- lib/conjur/identifier_manipulation.rb
|
295
303
|
- lib/conjur/version.rb
|
@@ -340,6 +348,7 @@ signing_key:
|
|
340
348
|
specification_version: 4
|
341
349
|
summary: Conjur command line interface
|
342
350
|
test_files:
|
351
|
+
- features/conjurize.feature
|
343
352
|
- features/dsl_context.feature
|
344
353
|
- features/dsl_host_create.feature
|
345
354
|
- features/dsl_ownership.feature
|
@@ -348,9 +357,13 @@ test_files:
|
|
348
357
|
- features/dsl_role_create.feature
|
349
358
|
- features/dsl_user_create.feature
|
350
359
|
- features/jsonfield.feature
|
360
|
+
- features/step_definitions/conjurize_steps.rb
|
351
361
|
- features/step_definitions/dsl_steps.rb
|
362
|
+
- features/support/conjur-test.pem
|
363
|
+
- features/support/conjur.conf
|
352
364
|
- features/support/env.rb
|
353
365
|
- features/support/hooks.rb
|
366
|
+
- features/support/host.json
|
354
367
|
- spec/authn_spec.rb
|
355
368
|
- spec/command/assets_spec.rb
|
356
369
|
- spec/command/audit_spec.rb
|