cabal 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +11 -0
- data/.rspec +2 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +3 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +108 -0
- data/Rakefile +1 -0
- data/cabal.gemspec +35 -0
- data/exe/cabal +5 -0
- data/lib/cabal.rb +8 -0
- data/lib/cabal/cli.rb +60 -0
- data/lib/cabal/client.rb +60 -0
- data/lib/cabal/commands/key.rb +32 -0
- data/lib/cabal/commands/ssh.rb +36 -0
- data/lib/cabal/ssh.rb +54 -0
- data/lib/cabal/version.rb +3 -0
- metadata +246 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: cecf9ec3105375d57486f38da51b9b6de9550c52
|
4
|
+
data.tar.gz: a7b000ae04cc6b66b6217d498f948e6e979b3e7a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 55952970940db72b4e2e2836bea5885b26f7339a63f556d573dadcb21027370b58d90a2efb9f0580f4d48c2f9be75899dea0979e711fb812e4d83c4df66e0387
|
7
|
+
data.tar.gz: 04d16fe8c29d116e9606c35df5fe942a50ffd841726dedf9086ed8bd7cf1bf15eaaf2d2caf99134035a8805f3cb3c408d4345818c7ca3a008f4847b879aea940
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
cabal
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.2.2
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2015 Dennis Walters
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all 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,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
# Cabal #
|
2
|
+
|
3
|
+
Cabal is a simple system for SSH key distribution and consumption. This is a CLI application that allows one to consume those keys.
|
4
|
+
|
5
|
+
## Installation ##
|
6
|
+
|
7
|
+
```ruby
|
8
|
+
$ gem install cabal
|
9
|
+
```
|
10
|
+
|
11
|
+
## Usage ##
|
12
|
+
|
13
|
+
To get started, you'll need to create `.cabal.yml` in your user's home directory, and you'll need to provide at least the URL of your Cabal::API. If you plan to use the `ssh` command to connect to a server that has an authorized Cabal key, you'll also need to specify your access key and secret key:
|
14
|
+
|
15
|
+
```yaml
|
16
|
+
---
|
17
|
+
:url: http://your-cabal-hostname/path/to/the/api
|
18
|
+
:access_key: your-access-key
|
19
|
+
:secret_key: your-secret-key
|
20
|
+
```
|
21
|
+
|
22
|
+
### Getting Help ###
|
23
|
+
|
24
|
+
The `cabal` application provides some nicely-formatted help on the command line. To access the help, provided that you've created your `~/.cabal.yml`, run the following:
|
25
|
+
|
26
|
+
```
|
27
|
+
cabal help
|
28
|
+
```
|
29
|
+
|
30
|
+
That will output something like this:
|
31
|
+
|
32
|
+
```
|
33
|
+
NAME
|
34
|
+
cabal - An interface to the Cabal API
|
35
|
+
|
36
|
+
SYNOPSIS
|
37
|
+
cabal [global options] command [command options] [arguments...]
|
38
|
+
|
39
|
+
VERSION
|
40
|
+
0.2.0
|
41
|
+
|
42
|
+
GLOBAL OPTIONS
|
43
|
+
--help - Show this message
|
44
|
+
--version - Display the program version
|
45
|
+
|
46
|
+
COMMANDS
|
47
|
+
help - Shows a list of commands or help for one command
|
48
|
+
key - Get the public key for a cluster
|
49
|
+
ssh - Connect to a node on a cluster
|
50
|
+
```
|
51
|
+
|
52
|
+
To get help on a specific command, you can `cabal help command` (ie `cabal help key`).
|
53
|
+
|
54
|
+
### Getting A Public Key ###
|
55
|
+
|
56
|
+
***To learn more, check out `cabal help key`***
|
57
|
+
|
58
|
+
This is an unprivileged call, so you won't actually need an access key or a secret key. This is more for somebody that wants to use the cabal cli utility to rather than curl or the like to grab a public key from the API to install as an authorized key on their servers.
|
59
|
+
|
60
|
+
To get a public key for a cluster named "totallyarealcluster," you'd do the following:
|
61
|
+
|
62
|
+
```
|
63
|
+
cabal key totallyarealcluster
|
64
|
+
```
|
65
|
+
|
66
|
+
Only one key can be retrieved per call, but we process all of the arguments as part of the cluster name. In short, all of the following variations have the same result:
|
67
|
+
|
68
|
+
```
|
69
|
+
cabal key "Totally a real cluster"
|
70
|
+
cabal key "totally a real cluster"
|
71
|
+
cabal key Totally a real clusteR
|
72
|
+
cabal key totallyarealcluster
|
73
|
+
```
|
74
|
+
|
75
|
+
### Connecting To A Server ###
|
76
|
+
|
77
|
+
***To learn more, check out `cabal help ssh`***
|
78
|
+
|
79
|
+
This is a privileged call, so you need an access key and a secret key in your configuration file.
|
80
|
+
|
81
|
+
To connect to a server that has an authorized key that was generated by your Cabal API, you'll do the following (providing the cluster name for the key is "totallyarealcluster"):
|
82
|
+
|
83
|
+
```
|
84
|
+
cabal ssh -c totallyarealcluster user@hostname
|
85
|
+
```
|
86
|
+
|
87
|
+
This basically does the following:
|
88
|
+
|
89
|
+
* Retrieves the private key for "totallyarealcluster"
|
90
|
+
* Adds the private key as an identity in your ssh-agent
|
91
|
+
* Connects you to the server, forwarding your ssh-agent
|
92
|
+
* Removes the key and **ALL** ssh-agent identities on disconnect
|
93
|
+
|
94
|
+
## Development ##
|
95
|
+
|
96
|
+
Branches and releases for this project are managed by [git-flow](https://github.com/nvie/gitflow).
|
97
|
+
|
98
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment.
|
99
|
+
|
100
|
+
## Contributing ##
|
101
|
+
|
102
|
+
**Note: Please base all feature branches on the `develop` branch.**
|
103
|
+
|
104
|
+
1. Fork it ( https://github.com/engineyard/cabal/fork )
|
105
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
106
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
107
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
108
|
+
5. Create a new Pull Request against the `develop` branch
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/cabal.gemspec
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'cabal/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "cabal"
|
8
|
+
spec.version = Cabal::VERSION
|
9
|
+
spec.authors = ["Dennis Walters"]
|
10
|
+
spec.email = ["dwalters@engineyard.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{Retrieve SSH keys from the Cabal API}
|
13
|
+
spec.homepage = "https://github.com/engineyard/cabal"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features|Procfile|config.ru|bin|config|mock)/?}) }
|
17
|
+
spec.bindir = "exe"
|
18
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency 'bundler', '~> 1.9'
|
22
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
23
|
+
spec.add_development_dependency 'aruba', '~> 0.9'
|
24
|
+
spec.add_development_dependency 'rspec', "~> 3.3"
|
25
|
+
spec.add_development_dependency 'yard', '~> 0.8.7'
|
26
|
+
spec.add_development_dependency 'factis', '~> 1.0'
|
27
|
+
spec.add_development_dependency 'simplecov', '~> 0.10'
|
28
|
+
spec.add_development_dependency 'webmock', '~> 1.22'
|
29
|
+
spec.add_development_dependency 'cabal-api', '~> 0.1'
|
30
|
+
|
31
|
+
spec.add_runtime_dependency 'cabal-util', '~> 0.1'
|
32
|
+
spec.add_runtime_dependency 'gli', '~> 2.13'
|
33
|
+
spec.add_runtime_dependency 'oj', '~> 2.12'
|
34
|
+
spec.add_runtime_dependency 'faraday', '~> 0.9'
|
35
|
+
end
|
data/exe/cabal
ADDED
data/lib/cabal.rb
ADDED
data/lib/cabal/cli.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'gli'
|
2
|
+
require 'yaml'
|
3
|
+
require 'cabal'
|
4
|
+
require 'cabal/commands/key'
|
5
|
+
require 'cabal/commands/ssh'
|
6
|
+
|
7
|
+
module Cabal
|
8
|
+
class CLI
|
9
|
+
include GLI::App
|
10
|
+
|
11
|
+
attr_reader :stdin, :stdout, :stderr, :kernel, :argv
|
12
|
+
|
13
|
+
def initialize(argv, stdin=STDIN, stdout=STDOUT, stderr=STDERR, kernel=Kernel)
|
14
|
+
@argv, @stdin, @stdout, @stderr, @kernel = argv, stdin, stdout, stderr, kernel
|
15
|
+
end
|
16
|
+
|
17
|
+
def register_command(command)
|
18
|
+
command.bootstrap(self)
|
19
|
+
end
|
20
|
+
|
21
|
+
def cabal_yml
|
22
|
+
File.expand_path(File.join(ENV['HOME'], '.cabal.yml'))
|
23
|
+
end
|
24
|
+
|
25
|
+
def execute!
|
26
|
+
unless File.exist?(cabal_yml)
|
27
|
+
stderr.puts "Please create your config in #{cabal_yml}"
|
28
|
+
exit(1)
|
29
|
+
end
|
30
|
+
|
31
|
+
program_desc 'An interface to the Cabal API'
|
32
|
+
version Cabal::VERSION
|
33
|
+
subcommand_option_handling :normal
|
34
|
+
arguments :strict
|
35
|
+
|
36
|
+
pre do |global,command,options,args|
|
37
|
+
if File.exist?(cabal_yml)
|
38
|
+
config = YAML.load(File.read(cabal_yml))
|
39
|
+
global.merge!(config)
|
40
|
+
true
|
41
|
+
else
|
42
|
+
stderr.puts "Please create #{cabal_yml} and try again"
|
43
|
+
false
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
post do |global,command,options,args|
|
48
|
+
end
|
49
|
+
|
50
|
+
on_error do |exception|
|
51
|
+
true
|
52
|
+
end
|
53
|
+
|
54
|
+
register_command(Cabal::Commands::Key)
|
55
|
+
register_command(Cabal::Commands::SSH)
|
56
|
+
|
57
|
+
kernel.exit run(argv)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
data/lib/cabal/client.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'oj'
|
3
|
+
|
4
|
+
module Cabal
|
5
|
+
class Client
|
6
|
+
attr_reader :api_base
|
7
|
+
|
8
|
+
def initialize(options = {})
|
9
|
+
@api_base = "#{options[:api_base]}/v2"
|
10
|
+
@access_key = options[:access_key]
|
11
|
+
@secret_key = options[:secret_key]
|
12
|
+
@connector = Faraday.new(url: api_base) do |faraday|
|
13
|
+
faraday.request :url_encoded
|
14
|
+
faraday.adapter Faraday.default_adapter
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def private_key(cluster_name)
|
19
|
+
get("private-key/#{URI.encode(cluster_name)}")['private_ssh_key']
|
20
|
+
end
|
21
|
+
|
22
|
+
def public_key(cluster_name)
|
23
|
+
get("key/#{URI.encode(cluster_name)}")['public_ssh_key']
|
24
|
+
end
|
25
|
+
|
26
|
+
def get(endpoint, authenticated = nil)
|
27
|
+
response = connector.get {|req|
|
28
|
+
req.url endpoint
|
29
|
+
req.headers['Content-Type'] = 'application/json'
|
30
|
+
req.headers['Accept'] = 'application/json'
|
31
|
+
req.headers['Authorization'] = authorization
|
32
|
+
}
|
33
|
+
case response.status
|
34
|
+
when 200
|
35
|
+
Oj.load(response.body)
|
36
|
+
when 404
|
37
|
+
raise "Cabal::Client::NotFoundError"
|
38
|
+
when 401
|
39
|
+
raise "Cabal::Client::UnauthorizedError"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
def access_key
|
45
|
+
@access_key
|
46
|
+
end
|
47
|
+
|
48
|
+
def secret_key
|
49
|
+
@secret_key
|
50
|
+
end
|
51
|
+
|
52
|
+
def authorization
|
53
|
+
"#{access_key}:#{secret_key}"
|
54
|
+
end
|
55
|
+
|
56
|
+
def connector
|
57
|
+
@connector
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Cabal
|
2
|
+
module Commands
|
3
|
+
module Key
|
4
|
+
def self.bootstrap(obj)
|
5
|
+
obj.instance_eval do
|
6
|
+
desc 'Get the public key for a cluster'
|
7
|
+
long_desc <<-KEYDESC
|
8
|
+
In order to allow logins for Cabal users, you'll need to retrieve
|
9
|
+
a public SSH key for your cluster.
|
10
|
+
KEYDESC
|
11
|
+
|
12
|
+
arg 'cluster name'
|
13
|
+
command :key do |c|
|
14
|
+
c.action do |global_options, options, args|
|
15
|
+
unless global_options[:url]
|
16
|
+
stderr.puts "#{cabal_yml} must contain a :url: definition"
|
17
|
+
exit(1)
|
18
|
+
end
|
19
|
+
|
20
|
+
client = Cabal::Client.new(
|
21
|
+
api_base: global_options[:url],
|
22
|
+
access_key: global_options[:access_key],
|
23
|
+
secret_key: global_options[:secret_key],
|
24
|
+
)
|
25
|
+
stdout.puts client.public_key(args.join(' '))
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'cabal/ssh'
|
2
|
+
|
3
|
+
module Cabal
|
4
|
+
module Commands
|
5
|
+
module SSH
|
6
|
+
def self.bootstrap(obj)
|
7
|
+
obj.instance_eval do
|
8
|
+
desc 'Connect to a node on a cluster'
|
9
|
+
long_desc <<-SSHDESC
|
10
|
+
SSHDESC
|
11
|
+
|
12
|
+
arg 'ssh signature'
|
13
|
+
command :ssh do |c|
|
14
|
+
c.desc 'The name of the cluster'
|
15
|
+
c.arg_name 'cluster'
|
16
|
+
c.flag [:c, :cluster]
|
17
|
+
c.action do |global_options, options, args|
|
18
|
+
unless global_options[:access_key] && global_options[:secret_key]
|
19
|
+
stderr.puts "You must have an access key and secret key"
|
20
|
+
exit(1)
|
21
|
+
end
|
22
|
+
|
23
|
+
client = Cabal::Client.new(
|
24
|
+
api_base: global_options[:url],
|
25
|
+
access_key: global_options[:access_key],
|
26
|
+
secret_key: global_options[:secret_key]
|
27
|
+
)
|
28
|
+
|
29
|
+
Cabal::SSH.connect(options[:cluster], args.shift, client)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/cabal/ssh.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'cabal/util'
|
2
|
+
require 'cabal/client'
|
3
|
+
require 'tempfile'
|
4
|
+
require 'securerandom'
|
5
|
+
require 'uri'
|
6
|
+
require 'fileutils'
|
7
|
+
|
8
|
+
module Cabal
|
9
|
+
class SSH
|
10
|
+
def self.connect(cluster, ssh_signature, client)
|
11
|
+
new(cluster, ssh_signature, client).connect
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize(cluster, ssh_signature, client)
|
15
|
+
@cluster = cluster
|
16
|
+
@ssh_signature = ssh_signature
|
17
|
+
@client = client
|
18
|
+
@key_file = Tempfile.new(SecureRandom.hex(8))
|
19
|
+
end
|
20
|
+
|
21
|
+
def connect
|
22
|
+
private_key = client.private_key(cluster)
|
23
|
+
@key_file = Tempfile.new(SecureRandom.hex(8))
|
24
|
+
key_file.write(private_key)
|
25
|
+
key_file.close
|
26
|
+
|
27
|
+
begin
|
28
|
+
FileUtils.chmod(0700, key_file.path)
|
29
|
+
Kernel.system("ssh-add #{key_file.path} > /dev/null 2>&1")
|
30
|
+
Kernel.system("ssh -A #{ssh_signature}")
|
31
|
+
ensure
|
32
|
+
Kernel.system("ssh-add -D > /dev/null 2>&1")
|
33
|
+
key_file.unlink
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
def key_file
|
39
|
+
@key_file
|
40
|
+
end
|
41
|
+
|
42
|
+
def ssh_signature
|
43
|
+
@ssh_signature
|
44
|
+
end
|
45
|
+
|
46
|
+
def client
|
47
|
+
@client
|
48
|
+
end
|
49
|
+
|
50
|
+
def cluster
|
51
|
+
@cluster
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
metadata
ADDED
@@ -0,0 +1,246 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cabal
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.4.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Dennis Walters
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-10-15 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.9'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.9'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: aruba
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0.9'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0.9'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.3'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3.3'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: yard
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.8.7
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.8.7
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: factis
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '1.0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: simplecov
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0.10'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0.10'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: webmock
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '1.22'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '1.22'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: cabal-api
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0.1'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0.1'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: cabal-util
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0.1'
|
146
|
+
type: :runtime
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0.1'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: gli
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '2.13'
|
160
|
+
type: :runtime
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - "~>"
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '2.13'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: oj
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - "~>"
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '2.12'
|
174
|
+
type: :runtime
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - "~>"
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '2.12'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: faraday
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - "~>"
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '0.9'
|
188
|
+
type: :runtime
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - "~>"
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '0.9'
|
195
|
+
description:
|
196
|
+
email:
|
197
|
+
- dwalters@engineyard.com
|
198
|
+
executables:
|
199
|
+
- cabal
|
200
|
+
extensions: []
|
201
|
+
extra_rdoc_files: []
|
202
|
+
files:
|
203
|
+
- ".gitignore"
|
204
|
+
- ".rspec"
|
205
|
+
- ".ruby-gemset"
|
206
|
+
- ".ruby-version"
|
207
|
+
- ".travis.yml"
|
208
|
+
- Gemfile
|
209
|
+
- LICENSE.txt
|
210
|
+
- README.md
|
211
|
+
- Rakefile
|
212
|
+
- cabal.gemspec
|
213
|
+
- exe/cabal
|
214
|
+
- lib/cabal.rb
|
215
|
+
- lib/cabal/cli.rb
|
216
|
+
- lib/cabal/client.rb
|
217
|
+
- lib/cabal/commands/key.rb
|
218
|
+
- lib/cabal/commands/ssh.rb
|
219
|
+
- lib/cabal/ssh.rb
|
220
|
+
- lib/cabal/version.rb
|
221
|
+
homepage: https://github.com/engineyard/cabal
|
222
|
+
licenses:
|
223
|
+
- MIT
|
224
|
+
metadata: {}
|
225
|
+
post_install_message:
|
226
|
+
rdoc_options: []
|
227
|
+
require_paths:
|
228
|
+
- lib
|
229
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
230
|
+
requirements:
|
231
|
+
- - ">="
|
232
|
+
- !ruby/object:Gem::Version
|
233
|
+
version: '0'
|
234
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
235
|
+
requirements:
|
236
|
+
- - ">="
|
237
|
+
- !ruby/object:Gem::Version
|
238
|
+
version: '0'
|
239
|
+
requirements: []
|
240
|
+
rubyforge_project:
|
241
|
+
rubygems_version: 2.4.7
|
242
|
+
signing_key:
|
243
|
+
specification_version: 4
|
244
|
+
summary: Retrieve SSH keys from the Cabal API
|
245
|
+
test_files: []
|
246
|
+
has_rdoc:
|