conjur-cli 2.1.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.
- data/.gitignore +17 -0
- data/.project +18 -0
- data/.rvmrc +1 -0
- data/Gemfile +10 -0
- data/LICENSE +22 -0
- data/README.md +29 -0
- data/Rakefile +18 -0
- data/bin/conjur +5 -0
- data/conjur.gemspec +26 -0
- data/lib/conjur.rb +2 -0
- data/lib/conjur/authn.rb +62 -0
- data/lib/conjur/cli.rb +66 -0
- data/lib/conjur/command.rb +42 -0
- data/lib/conjur/command/assets.rb +60 -0
- data/lib/conjur/command/authn.rb +38 -0
- data/lib/conjur/command/groups.rb +35 -0
- data/lib/conjur/command/hosts.rb +33 -0
- data/lib/conjur/command/permissions.rb +48 -0
- data/lib/conjur/command/resources.rb +86 -0
- data/lib/conjur/command/roles.rb +64 -0
- data/lib/conjur/command/secrets.rb +26 -0
- data/lib/conjur/command/users.rb +32 -0
- data/lib/conjur/command/variables.rb +54 -0
- data/lib/conjur/config.rb +29 -0
- data/lib/conjur/version.rb +3 -0
- data/spec/command/authn_spec.rb +15 -0
- data/spec/spec_helper.rb +16 -0
- metadata +189 -0
data/.gitignore
ADDED
data/.project
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<projectDescription>
|
3
|
+
<name>conjur-cli</name>
|
4
|
+
<comment></comment>
|
5
|
+
<projects>
|
6
|
+
</projects>
|
7
|
+
<buildSpec>
|
8
|
+
<buildCommand>
|
9
|
+
<name>com.aptana.ide.core.unifiedBuilder</name>
|
10
|
+
<arguments>
|
11
|
+
</arguments>
|
12
|
+
</buildCommand>
|
13
|
+
</buildSpec>
|
14
|
+
<natures>
|
15
|
+
<nature>com.aptana.ruby.core.rubynature</nature>
|
16
|
+
<nature>com.aptana.projects.webnature</nature>
|
17
|
+
</natures>
|
18
|
+
</projectDescription>
|
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm use 1.9.3@conjur-cli --create
|
data/Gemfile
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
# Specify your gem's dependencies in conjur.gemspec
|
4
|
+
gemspec
|
5
|
+
|
6
|
+
gem 'slosilo', git: 'https://github.com/inscitiv/slosilo.git'
|
7
|
+
gem 'conjur-api', git: 'https://github.com/inscitiv/api-ruby.git', branch: 'master'
|
8
|
+
gem 'conjur-asset-environment', git: 'https://inscitiv-ops-dev:Me5aswes@github.com/inscitiv/conjur-asset-environment', branch: 'master'
|
9
|
+
gem 'conjur-asset-deployment', git: 'https://inscitiv-ops-dev:Me5aswes@github.com/inscitiv/conjur-asset-deployment', branch: 'master'
|
10
|
+
gem 'conjur-asset-cmi-study', git: 'https://inscitiv-ops-dev:Me5aswes@github.com/inscitiv/conjur-asset-cmi-study', branch: 'master'
|
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Rafał Rzepecki
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# Conjur
|
2
|
+
|
3
|
+
TODO: Write a gem description
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'conjur'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install conjur
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
TODO: Write usage instructions here
|
22
|
+
|
23
|
+
## Contributing
|
24
|
+
|
25
|
+
1. Fork it
|
26
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
27
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
28
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
29
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
require "bundler/gem_tasks"
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rspec/core/rake_task'
|
6
|
+
RSpec::Core::RakeTask.new(:spec)
|
7
|
+
rescue LoadError
|
8
|
+
$stderr.puts "RSpec Rake tasks not available in environment #{ENV['RACK_ENV']}"
|
9
|
+
end
|
10
|
+
|
11
|
+
task :jenkins do
|
12
|
+
if ENV['BUILD_NUMBER']
|
13
|
+
File.write('build_number', ENV['BUILD_NUMBER'])
|
14
|
+
end
|
15
|
+
require 'ci/reporter/rake/rspec'
|
16
|
+
Rake::Task["ci:setup:rspec"].invoke
|
17
|
+
Rake::Task["spec"].invoke
|
18
|
+
end
|
data/bin/conjur
ADDED
data/conjur.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/conjur/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Rafa\305\202 Rzepecki", "Kevin Gilpin"]
|
6
|
+
gem.email = ["divided.mind@gmail.com", "kevin.gilpin@inscitiv.com",]
|
7
|
+
gem.summary = %q{Conjur command line interface}
|
8
|
+
gem.homepage = ""
|
9
|
+
|
10
|
+
gem.files = `git ls-files`.split($\) + Dir['build_number']
|
11
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
12
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
13
|
+
gem.name = "conjur-cli"
|
14
|
+
gem.require_paths = ["lib"]
|
15
|
+
gem.version = Conjur::VERSION
|
16
|
+
|
17
|
+
gem.add_dependency 'conjur-api'
|
18
|
+
gem.add_dependency 'gli'
|
19
|
+
gem.add_dependency 'highline'
|
20
|
+
gem.add_dependency 'netrc'
|
21
|
+
|
22
|
+
gem.add_runtime_dependency 'cas_rest_client'
|
23
|
+
|
24
|
+
gem.add_development_dependency 'rspec'
|
25
|
+
gem.add_development_dependency 'simplecov'
|
26
|
+
end
|
data/lib/conjur.rb
ADDED
data/lib/conjur/authn.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'highline'
|
2
|
+
require 'conjur/api'
|
3
|
+
require 'netrc'
|
4
|
+
|
5
|
+
module Conjur::Authn
|
6
|
+
class << self
|
7
|
+
def login(options = {})
|
8
|
+
delete_credentials
|
9
|
+
get_credentials(options)
|
10
|
+
end
|
11
|
+
|
12
|
+
def delete_credentials
|
13
|
+
netrc.delete host
|
14
|
+
netrc.save
|
15
|
+
end
|
16
|
+
|
17
|
+
def host
|
18
|
+
Conjur::Authn::API.host
|
19
|
+
end
|
20
|
+
|
21
|
+
def netrc
|
22
|
+
@netrc ||= Netrc.read
|
23
|
+
end
|
24
|
+
|
25
|
+
def get_credentials(options = {})
|
26
|
+
@credentials ||= (read_credentials || fetch_credentials(options))
|
27
|
+
end
|
28
|
+
|
29
|
+
def read_credentials
|
30
|
+
netrc[host]
|
31
|
+
end
|
32
|
+
|
33
|
+
def fetch_credentials(options = {})
|
34
|
+
ask_for_credentials(options)
|
35
|
+
write_credentials
|
36
|
+
end
|
37
|
+
|
38
|
+
def write_credentials
|
39
|
+
netrc[host] = @credentials
|
40
|
+
netrc.save
|
41
|
+
@credentials
|
42
|
+
end
|
43
|
+
|
44
|
+
def ask_for_credentials(options = {})
|
45
|
+
raise "No credentials provided or found" if options[:noask]
|
46
|
+
|
47
|
+
hl = HighLine.new
|
48
|
+
user = options[:username] || hl.ask("Enter your username to log into Conjur: ")
|
49
|
+
pass = options[:password] || hl.ask("Please enter your password (it will not be echoed): "){ |q| q.echo = false }
|
50
|
+
api_key = if cas_server = options[:"cas-server"]
|
51
|
+
Conjur::API.login_cas(user, pass, cas_server)
|
52
|
+
else
|
53
|
+
Conjur::API.login(user, pass)
|
54
|
+
end
|
55
|
+
@credentials = [user, api_key]
|
56
|
+
end
|
57
|
+
|
58
|
+
def connect(cls = Conjur::API, options = {})
|
59
|
+
cls.new_from_key(*get_credentials(options))
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
data/lib/conjur/cli.rb
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'gli'
|
2
|
+
require 'conjur/config'
|
3
|
+
|
4
|
+
module Conjur
|
5
|
+
class CLI
|
6
|
+
extend GLI::App
|
7
|
+
|
8
|
+
class << self
|
9
|
+
def load_config
|
10
|
+
[ File.join("/etc", "conjur.conf"), ( ENV['CONJURRC'] || File.join(ENV['HOME'], ".conjurrc") ) ].each do |f|
|
11
|
+
if File.exists?(f)
|
12
|
+
$stderr.puts "Loading #{f}"
|
13
|
+
Conjur::Config.merge YAML.load(IO.read(f))
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
load_config
|
20
|
+
|
21
|
+
ENV['CONJUR_ENV'] = Config[:env] if Config[:env]
|
22
|
+
ENV['CONJUR_STACK'] = Config[:stack] if Config[:stack]
|
23
|
+
|
24
|
+
Conjur::Config.plugins.each do |plugin|
|
25
|
+
require "conjur-asset-#{plugin}"
|
26
|
+
end
|
27
|
+
|
28
|
+
commands_from 'conjur/command'
|
29
|
+
|
30
|
+
$stderr.puts "Using host #{Conjur::Authn::API.host}"
|
31
|
+
|
32
|
+
pre do |global,command,options,args|
|
33
|
+
require 'active_support/core_ext'
|
34
|
+
options.delete_if{|k,v| v.blank?}
|
35
|
+
options.symbolize_keys!
|
36
|
+
|
37
|
+
if as_group = options.delete(:"as-group")
|
38
|
+
group = Conjur::Command.api.group(as_group)
|
39
|
+
role = Conjur::Command.api.role(group.roleid)
|
40
|
+
exit_now!("Group '#{as_group}' doesn't exist, or you don't have permission to use it") unless role.exists?
|
41
|
+
options[:"ownerid"] = group.roleid
|
42
|
+
end
|
43
|
+
if as_role = options.delete(:"as-role")
|
44
|
+
role = Conjur::Command.api.role(as_role)
|
45
|
+
exit_now!("Role '#{as_role}' does not exist, or you don't have permission to use it") unless role.exists?
|
46
|
+
options[:"ownerid"] = role.id
|
47
|
+
end
|
48
|
+
|
49
|
+
true
|
50
|
+
end
|
51
|
+
|
52
|
+
on_error do |exception|
|
53
|
+
if exception.is_a?(GLI::StandardException)
|
54
|
+
# pass
|
55
|
+
elsif exception.is_a?(RestClient::Exception)
|
56
|
+
begin
|
57
|
+
body = JSON.parse(exception.response.body)
|
58
|
+
$stderr.puts body['error']
|
59
|
+
rescue
|
60
|
+
$stderr.puts exception.response.body if exception.response
|
61
|
+
end
|
62
|
+
end
|
63
|
+
true
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Conjur
|
2
|
+
class Command
|
3
|
+
class << self
|
4
|
+
attr_accessor :prefix
|
5
|
+
|
6
|
+
def method_missing *a
|
7
|
+
Conjur::CLI.send *a
|
8
|
+
end
|
9
|
+
|
10
|
+
def command name, *a, &block
|
11
|
+
Conjur::CLI.command "#{prefix}:#{name}", *a, &block
|
12
|
+
end
|
13
|
+
|
14
|
+
def require_arg(args, name)
|
15
|
+
args.shift or raise "Missing parameter: #{name}"
|
16
|
+
end
|
17
|
+
|
18
|
+
def api
|
19
|
+
Conjur::Authn.connect
|
20
|
+
end
|
21
|
+
|
22
|
+
def acting_as_option(command)
|
23
|
+
command.arg_name 'Perform all actions as the specified Group'
|
24
|
+
command.flag [:"as-group"]
|
25
|
+
|
26
|
+
command.arg_name 'Perform all actions as the specified Role'
|
27
|
+
command.flag [:"as-role"]
|
28
|
+
end
|
29
|
+
|
30
|
+
def display(obj, options = {})
|
31
|
+
str = if obj.respond_to?(:attributes)
|
32
|
+
JSON.pretty_generate obj.attributes
|
33
|
+
elsif obj.respond_to?(:id)
|
34
|
+
obj.id
|
35
|
+
else
|
36
|
+
JSON.pretty_generate obj
|
37
|
+
end
|
38
|
+
puts str
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'conjur/authn'
|
2
|
+
require 'conjur/command'
|
3
|
+
|
4
|
+
class Conjur::Command::Assets < Conjur::Command
|
5
|
+
self.prefix = :asset
|
6
|
+
|
7
|
+
desc "Create an asset"
|
8
|
+
arg_name "kind id"
|
9
|
+
command :create do |c|
|
10
|
+
acting_as_option(c)
|
11
|
+
|
12
|
+
c.action do |global_options, options, args|
|
13
|
+
kind = require_arg(args, 'kind')
|
14
|
+
|
15
|
+
m = "create_#{kind}"
|
16
|
+
record = if api.method(m).arity == 1
|
17
|
+
id = args.shift
|
18
|
+
if id
|
19
|
+
options[:id] = id
|
20
|
+
end
|
21
|
+
api.send(m, options)
|
22
|
+
else
|
23
|
+
id = require_arg(args, 'id')
|
24
|
+
api.send(m, id, options)
|
25
|
+
end
|
26
|
+
display(record, options)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
desc "Show an asset"
|
31
|
+
arg_name "kind id"
|
32
|
+
command :show do |c|
|
33
|
+
c.action do |global_options,options,args|
|
34
|
+
kind = require_arg(args, "kind")
|
35
|
+
id = require_arg(args, "resource-id")
|
36
|
+
display api.send(kind, id).attributes
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
desc "Checks for the existance of an asset"
|
41
|
+
arg_name "kind id"
|
42
|
+
command :exists do |c|
|
43
|
+
c.action do |global_options,options,args|
|
44
|
+
kind = require_arg(args, "kind")
|
45
|
+
id = require_arg(args, "id")
|
46
|
+
puts api.send(kind, id).exists?
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
desc "List an asset"
|
51
|
+
arg_name "kind"
|
52
|
+
command :list do |c|
|
53
|
+
c.action do |global_options,options,args|
|
54
|
+
kind = require_arg(args, "kind")
|
55
|
+
api.send(kind.pluralize).each do |e|
|
56
|
+
display(e, options)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'conjur/authn'
|
2
|
+
require 'conjur/command'
|
3
|
+
|
4
|
+
class Conjur::Command::Authn < Conjur::Command
|
5
|
+
self.prefix = :authn
|
6
|
+
|
7
|
+
desc "Logs in and caches credentials to netrc"
|
8
|
+
long_desc <<-DESC
|
9
|
+
After successful login, subsequent commands automatically use the cached credentials. To switch users, login again using the new user credentials.
|
10
|
+
To erase credentials, use the authn:logout command.
|
11
|
+
|
12
|
+
If specified, the CAS server URL should be in the form https://<hostname>/v1.
|
13
|
+
It should be running the CAS RESTful services at the /v1 path
|
14
|
+
(or other path as specified by this argument).
|
15
|
+
DESC
|
16
|
+
command :login do |c|
|
17
|
+
c.arg_name 'username'
|
18
|
+
c.flag [:u,:username]
|
19
|
+
|
20
|
+
c.arg_name 'password'
|
21
|
+
c.flag [:p,:password]
|
22
|
+
|
23
|
+
c.arg_name 'CAS server'
|
24
|
+
c.desc 'Specifies a CAS server URL to use for login'
|
25
|
+
c.flag [:"cas-server"]
|
26
|
+
|
27
|
+
c.action do |global_options,options,args|
|
28
|
+
Conjur::Authn.login(options)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
desc "Logs out"
|
33
|
+
command :logout do |c|
|
34
|
+
c.action do
|
35
|
+
Conjur::Authn.delete_credentials
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'conjur/authn'
|
2
|
+
require 'conjur/command'
|
3
|
+
|
4
|
+
class Conjur::Command::Groups < Conjur::Command
|
5
|
+
self.prefix = :group
|
6
|
+
|
7
|
+
desc "Create a new group"
|
8
|
+
arg_name "id"
|
9
|
+
command :create do |c|
|
10
|
+
acting_as_option(c)
|
11
|
+
|
12
|
+
c.action do |global_options,options,args|
|
13
|
+
id = require_arg(args, 'id')
|
14
|
+
|
15
|
+
group = api.create_group(id, options)
|
16
|
+
puts "Created #{group}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
desc "Add a new group member"
|
21
|
+
arg_name "group"
|
22
|
+
arg_name "member"
|
23
|
+
command :"members:add" do |c|
|
24
|
+
c.desc "Grant with admin option"
|
25
|
+
c.switch [:a, :admin]
|
26
|
+
|
27
|
+
c.action do |global_options,options,args|
|
28
|
+
group = require_arg(args, 'group')
|
29
|
+
member = require_arg(args, 'member')
|
30
|
+
|
31
|
+
group = api.group(group)
|
32
|
+
api.role(group.roleid).grant_to member, !!options[:admin]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'conjur/authn'
|
2
|
+
require 'conjur/command'
|
3
|
+
|
4
|
+
class Conjur::Command::Hosts < Conjur::Command
|
5
|
+
self.prefix = :host
|
6
|
+
|
7
|
+
desc "Create a new host"
|
8
|
+
arg_name "host"
|
9
|
+
command :create do |c|
|
10
|
+
c.arg_name "password"
|
11
|
+
c.flag [:p,:password]
|
12
|
+
|
13
|
+
acting_as_option(c)
|
14
|
+
|
15
|
+
c.action do |global_options,options,args|
|
16
|
+
id = args.shift
|
17
|
+
options[:id] = id if id
|
18
|
+
display api.create_host(options), options
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
desc "Enroll a new host into conjur"
|
23
|
+
arg_name "host"
|
24
|
+
command :enroll do |c|
|
25
|
+
c.action do |global_options, options, args|
|
26
|
+
id = require_arg(args, 'host')
|
27
|
+
enrollment_url = api.host(id).enrollment_url
|
28
|
+
puts enrollment_url
|
29
|
+
$stderr.puts "On the target host, please execute the following command:"
|
30
|
+
$stderr.puts "sudo true && curl -L #{enrollment_url} | sudo bash"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'conjur/authn'
|
2
|
+
require 'conjur/command'
|
3
|
+
|
4
|
+
class Conjur::Command::Resources < Conjur::Command
|
5
|
+
self.prefix = :permission
|
6
|
+
|
7
|
+
desc "Grants permission on a resource to a role"
|
8
|
+
arg_name "resource-kind"
|
9
|
+
arg_name "resource-id"
|
10
|
+
arg_name "role"
|
11
|
+
arg_name "privilege"
|
12
|
+
command :grant do |c|
|
13
|
+
c.desc "Whether to give the grant option"
|
14
|
+
c.switch :grant
|
15
|
+
|
16
|
+
c.action do |global_options,options,args|
|
17
|
+
kind = args.shift or raise "Missing parameter: resource-kind"
|
18
|
+
resource_id = args.shift or raise "Missing parameter: resource-id"
|
19
|
+
role = args.shift or raise "Missing parameter: role"
|
20
|
+
privilege = args.shift or raise "Missing parameter: privilege"
|
21
|
+
resource = api.resource(kind, resource_id)
|
22
|
+
options = {}
|
23
|
+
options[:grant_option] = true if options[:grant]
|
24
|
+
resource.permit privilege, role, options
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "Check whether a role has a privilege on a resource"
|
29
|
+
arg_name "resource-kind"
|
30
|
+
arg_name "resource-id"
|
31
|
+
arg_name "role"
|
32
|
+
arg_name "privilege"
|
33
|
+
command :check do |c|
|
34
|
+
c.action do |global_options,options,args|
|
35
|
+
kind = args.shift or raise "Missing parameter: resource-kind"
|
36
|
+
resource_id = args.shift or raise "Missing parameter: resource-id"
|
37
|
+
role = args.shift or raise "Missing parameter: role"
|
38
|
+
privilege = args.shift or raise "Missing parameter: privilege"
|
39
|
+
role = api.role(role)
|
40
|
+
begin
|
41
|
+
role.permitted? kind, resource_id, privilege
|
42
|
+
puts "true"
|
43
|
+
rescue RestClient::ResourceNotFound
|
44
|
+
puts "false"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'conjur/authn'
|
2
|
+
require 'conjur/command'
|
3
|
+
|
4
|
+
class Conjur::Command::Resources < Conjur::Command
|
5
|
+
self.prefix = :resource
|
6
|
+
|
7
|
+
desc "Create a new resource"
|
8
|
+
arg_name "kind resource-id"
|
9
|
+
command :create do |c|
|
10
|
+
acting_as_option(c)
|
11
|
+
|
12
|
+
c.action do |global_options,options,args|
|
13
|
+
kind = require_arg(args, "kind")
|
14
|
+
id = require_arg(args, "resource-id")
|
15
|
+
resource = api.resource(kind, id)
|
16
|
+
resource.create(options)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
desc "Show a resource"
|
21
|
+
arg_name "kind resource-id"
|
22
|
+
command :show do |c|
|
23
|
+
c.action do |global_options,options,args|
|
24
|
+
kind = require_arg(args, "kind")
|
25
|
+
id = require_arg(args, "resource-id")
|
26
|
+
display api.resource(kind, id).attributes
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
desc "Determines whether a resource exists"
|
31
|
+
arg_name "kind resource-id"
|
32
|
+
command :exists do |c|
|
33
|
+
c.action do |global_options,options,args|
|
34
|
+
kind = require_arg(args, "kind")
|
35
|
+
id = require_arg(args, "resource-id")
|
36
|
+
resource = api.resource(kind, id)
|
37
|
+
puts resource.exists?
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
desc "Grant a privilege on a resource"
|
42
|
+
arg_name "kind resource-id role privilege"
|
43
|
+
command :permit do |c|
|
44
|
+
c.action do |global_options,options,args|
|
45
|
+
kind = require_arg(args, "kind")
|
46
|
+
id = require_arg(args, "resource-id")
|
47
|
+
role = require_arg(args, "role")
|
48
|
+
privilege = require_arg(args, "privilege")
|
49
|
+
api.resource(kind, id).permit privilege, role
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
desc "Revoke a privilege on a resource"
|
54
|
+
arg_name "kind resource-id role privilege"
|
55
|
+
command :deny do |c|
|
56
|
+
c.action do |global_options,options,args|
|
57
|
+
kind = require_arg(args, "kind")
|
58
|
+
id = require_arg(args, "resource-id")
|
59
|
+
role = require_arg(args, "role")
|
60
|
+
privilege = require_arg(args, "privilege")
|
61
|
+
api.resource(kind, id).deny privilege, role
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
desc "Grant ownership on a resource to a new owner"
|
66
|
+
arg_name "kind resource-id owner"
|
67
|
+
command :give do |c|
|
68
|
+
c.action do |global_options,options,args|
|
69
|
+
kind = require_arg(args, "kind")
|
70
|
+
id = require_arg(args, "resource-id")
|
71
|
+
owner = require_arg(args, "owner")
|
72
|
+
api.resource(kind, id).give_to owner
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
desc "List roles with a specified permission on the resource"
|
77
|
+
arg_name "kind resource-id permission"
|
78
|
+
command :permitted_roles do |c|
|
79
|
+
c.action do |global_options,options,args|
|
80
|
+
kind = require_arg(args, "kind")
|
81
|
+
id = require_arg(args, "resource-id")
|
82
|
+
permission = require_arg(args, "permission")
|
83
|
+
display api.resource(kind, id).permitted_roles(permission)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'conjur/authn'
|
2
|
+
require 'conjur/command'
|
3
|
+
|
4
|
+
class Conjur::Command::Roles < Conjur::Command
|
5
|
+
self.prefix = :role
|
6
|
+
|
7
|
+
desc "Create a new role"
|
8
|
+
arg_name "role"
|
9
|
+
command :create do |c|
|
10
|
+
acting_as_option(c)
|
11
|
+
|
12
|
+
c.action do |global_options,options,args|
|
13
|
+
id = require_arg(args, 'role')
|
14
|
+
role = api.role(id)
|
15
|
+
role.create(options)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
desc "Determines whether a role exists"
|
20
|
+
arg_name "role"
|
21
|
+
command :exists do |c|
|
22
|
+
c.action do |global_options,options,args|
|
23
|
+
id = require_arg(args, 'role')
|
24
|
+
role = api.role(id)
|
25
|
+
puts role.exists?
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
desc "Lists role memberships"
|
30
|
+
arg_name "role"
|
31
|
+
command :memberships do |c|
|
32
|
+
c.action do |global_options,options,args|
|
33
|
+
role = args.shift || api.username
|
34
|
+
display api.role(role).all.map(&:id)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
desc "Grant a role to another role. You must have admin permission on the granting role."
|
39
|
+
arg_name "role"
|
40
|
+
arg_name "member"
|
41
|
+
command :grant_to do |c|
|
42
|
+
c.desc "Whether to grant with admin option"
|
43
|
+
c.switch :admin
|
44
|
+
|
45
|
+
c.action do |global_options,options,args|
|
46
|
+
id = require_arg(args, 'role')
|
47
|
+
member = require_arg(args, 'member')
|
48
|
+
role = api.role(id)
|
49
|
+
role.grant_to member, options[:admin]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
desc "Revoke a role from another role."
|
54
|
+
arg_name "role"
|
55
|
+
arg_name "member"
|
56
|
+
command :revoke_from do |c|
|
57
|
+
c.action do |global_options,options,args|
|
58
|
+
id = require_arg(args, 'role')
|
59
|
+
member = require_arg(args, 'member')
|
60
|
+
role = api.role(id)
|
61
|
+
role.revoke_from member
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'conjur/authn'
|
2
|
+
require 'conjur/command'
|
3
|
+
|
4
|
+
class Conjur::Command::Secrets < Conjur::Command
|
5
|
+
self.prefix = :secret
|
6
|
+
|
7
|
+
desc "Create and store a secret"
|
8
|
+
arg_name "secret"
|
9
|
+
command :create do |c|
|
10
|
+
acting_as_option(c)
|
11
|
+
|
12
|
+
c.action do |global_options,options,args|
|
13
|
+
secret = args.shift or raise "Missing parameter: secret"
|
14
|
+
display api.create_secret(secret, options), options
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
desc "Retrieve a secret"
|
19
|
+
arg_name "id"
|
20
|
+
command :value do |c|
|
21
|
+
c.action do |global_options,options,args|
|
22
|
+
id = args.shift or raise "Missing parameter: id"
|
23
|
+
puts api.secret(id).value
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'conjur/authn'
|
2
|
+
require 'conjur/command'
|
3
|
+
|
4
|
+
class Conjur::Command::Users < Conjur::Command
|
5
|
+
self.prefix = :user
|
6
|
+
|
7
|
+
desc "Create a new user"
|
8
|
+
arg_name "login"
|
9
|
+
command :create do |c|
|
10
|
+
c.desc "Prompt for a password for the user"
|
11
|
+
c.switch [:p,:password]
|
12
|
+
|
13
|
+
acting_as_option(c)
|
14
|
+
|
15
|
+
c.action do |global_options,options,args|
|
16
|
+
login = require_arg(args, 'login')
|
17
|
+
|
18
|
+
opts = options.slice(:ownerid)
|
19
|
+
if options[:p]
|
20
|
+
hl = HighLine.new
|
21
|
+
password = hl.ask("Enter the password (it will not be echoed): "){ |q| q.echo = false }
|
22
|
+
confirmation = hl.ask("Confirm the password: "){ |q| q.echo = false }
|
23
|
+
|
24
|
+
raise "Password does not match confirmation" unless password == confirmation
|
25
|
+
|
26
|
+
opts[:password] = password
|
27
|
+
end
|
28
|
+
|
29
|
+
display api.create_user(login, opts)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'conjur/authn'
|
2
|
+
require 'conjur/command'
|
3
|
+
|
4
|
+
class Conjur::Command::Variables < Conjur::Command
|
5
|
+
self.prefix = :variable
|
6
|
+
|
7
|
+
desc "Create and store a variable"
|
8
|
+
command :create do |c|
|
9
|
+
c.arg_name "mime_type"
|
10
|
+
c.flag [:m, :"mime-type"]
|
11
|
+
|
12
|
+
c.arg_name "kind"
|
13
|
+
c.flag [:k, :"kind"]
|
14
|
+
|
15
|
+
acting_as_option(c)
|
16
|
+
|
17
|
+
c.action do |global_options,options,args|
|
18
|
+
var = api.create_variable(options[:m], options[:k], options)
|
19
|
+
display(var, options)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
desc "Show a variable"
|
24
|
+
arg_name "id"
|
25
|
+
command :show do |c|
|
26
|
+
c.action do |global_options,options,args|
|
27
|
+
id = require_arg(args, 'id')
|
28
|
+
display(api.variable(id), options)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
desc "Add a value"
|
33
|
+
arg_name "variable value"
|
34
|
+
command :"values:add" do |c|
|
35
|
+
c.action do |global_options,options,args|
|
36
|
+
id = require_arg(args, 'variable')
|
37
|
+
value = args.shift || STDIN.read
|
38
|
+
|
39
|
+
api.variable(id).add_value(value)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
desc "Get a value"
|
44
|
+
arg_name "variable"
|
45
|
+
command :value do |c|
|
46
|
+
c.desc "Version number"
|
47
|
+
c.flag [:v, :version]
|
48
|
+
|
49
|
+
c.action do |global_options,options,args|
|
50
|
+
id = require_arg(args, 'variable')
|
51
|
+
puts api.variable(id).value(options[:version])
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Conjur
|
2
|
+
class Config
|
3
|
+
@@attributes = {}
|
4
|
+
|
5
|
+
class << self
|
6
|
+
def inspect
|
7
|
+
@@attributes.inspect
|
8
|
+
end
|
9
|
+
|
10
|
+
def plugins
|
11
|
+
plugins = @@attributes['plugins']
|
12
|
+
if plugins
|
13
|
+
plugins.is_a?(Array) ? plugins : plugins.split(',')
|
14
|
+
else
|
15
|
+
[]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def merge(a)
|
20
|
+
a = {} unless a
|
21
|
+
@@attributes.merge!(a)
|
22
|
+
end
|
23
|
+
|
24
|
+
def [](key)
|
25
|
+
@@attributes[key.to_s]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'tempfile'
|
3
|
+
|
4
|
+
describe Conjur::Command::Authn do
|
5
|
+
let(:netrcfile) { Tempfile.new 'authtest' }
|
6
|
+
before do
|
7
|
+
Conjur::Auth.stub netrc: Netrc.read(netrcfile.path)
|
8
|
+
end
|
9
|
+
describe_command 'auth:logout' do
|
10
|
+
it "deletes credentials" do
|
11
|
+
Conjur::Auth.should_receive :delete_credentials
|
12
|
+
invoke
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "bundler/setup"
|
3
|
+
|
4
|
+
require "simplecov"
|
5
|
+
SimpleCov.start
|
6
|
+
|
7
|
+
module RSpec::Core::DSL
|
8
|
+
def describe_command name, *a, &block
|
9
|
+
describe name, *a do
|
10
|
+
let(:invoke) { Conjur::Cli.run [name] }
|
11
|
+
instance_eval &block
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
require 'conjur/cli'
|
metadata
ADDED
@@ -0,0 +1,189 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: conjur-cli
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2.1.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Rafał Rzepecki
|
9
|
+
- Kevin Gilpin
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2013-03-29 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: conjur-api
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ! '>='
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: '0'
|
31
|
+
- !ruby/object:Gem::Dependency
|
32
|
+
name: gli
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
35
|
+
requirements:
|
36
|
+
- - ! '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
type: :runtime
|
40
|
+
prerelease: false
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ! '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: highline
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: netrc
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ! '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
type: :runtime
|
72
|
+
prerelease: false
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
- !ruby/object:Gem::Dependency
|
80
|
+
name: cas_rest_client
|
81
|
+
requirement: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ! '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
type: :runtime
|
88
|
+
prerelease: false
|
89
|
+
version_requirements: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
- !ruby/object:Gem::Dependency
|
96
|
+
name: rspec
|
97
|
+
requirement: !ruby/object:Gem::Requirement
|
98
|
+
none: false
|
99
|
+
requirements:
|
100
|
+
- - ! '>='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
type: :development
|
104
|
+
prerelease: false
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
none: false
|
107
|
+
requirements:
|
108
|
+
- - ! '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: simplecov
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
115
|
+
requirements:
|
116
|
+
- - ! '>='
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
119
|
+
type: :development
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
none: false
|
123
|
+
requirements:
|
124
|
+
- - ! '>='
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '0'
|
127
|
+
description:
|
128
|
+
email:
|
129
|
+
- divided.mind@gmail.com
|
130
|
+
- kevin.gilpin@inscitiv.com
|
131
|
+
executables:
|
132
|
+
- conjur
|
133
|
+
extensions: []
|
134
|
+
extra_rdoc_files: []
|
135
|
+
files:
|
136
|
+
- .gitignore
|
137
|
+
- .project
|
138
|
+
- .rvmrc
|
139
|
+
- Gemfile
|
140
|
+
- LICENSE
|
141
|
+
- README.md
|
142
|
+
- Rakefile
|
143
|
+
- bin/conjur
|
144
|
+
- conjur.gemspec
|
145
|
+
- lib/conjur.rb
|
146
|
+
- lib/conjur/authn.rb
|
147
|
+
- lib/conjur/cli.rb
|
148
|
+
- lib/conjur/command.rb
|
149
|
+
- lib/conjur/command/assets.rb
|
150
|
+
- lib/conjur/command/authn.rb
|
151
|
+
- lib/conjur/command/groups.rb
|
152
|
+
- lib/conjur/command/hosts.rb
|
153
|
+
- lib/conjur/command/permissions.rb
|
154
|
+
- lib/conjur/command/resources.rb
|
155
|
+
- lib/conjur/command/roles.rb
|
156
|
+
- lib/conjur/command/secrets.rb
|
157
|
+
- lib/conjur/command/users.rb
|
158
|
+
- lib/conjur/command/variables.rb
|
159
|
+
- lib/conjur/config.rb
|
160
|
+
- lib/conjur/version.rb
|
161
|
+
- spec/command/authn_spec.rb
|
162
|
+
- spec/spec_helper.rb
|
163
|
+
homepage: ''
|
164
|
+
licenses: []
|
165
|
+
post_install_message:
|
166
|
+
rdoc_options: []
|
167
|
+
require_paths:
|
168
|
+
- lib
|
169
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
170
|
+
none: false
|
171
|
+
requirements:
|
172
|
+
- - ! '>='
|
173
|
+
- !ruby/object:Gem::Version
|
174
|
+
version: '0'
|
175
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
176
|
+
none: false
|
177
|
+
requirements:
|
178
|
+
- - ! '>='
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
181
|
+
requirements: []
|
182
|
+
rubyforge_project:
|
183
|
+
rubygems_version: 1.8.24
|
184
|
+
signing_key:
|
185
|
+
specification_version: 3
|
186
|
+
summary: Conjur command line interface
|
187
|
+
test_files:
|
188
|
+
- spec/command/authn_spec.rb
|
189
|
+
- spec/spec_helper.rb
|