capistrano-ssh-agent 0.0.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5d3e8cc5d12269f8aa8a757bae27765b38efb379
4
+ data.tar.gz: 2c705d0126103905d58d70bb1b7b7467f7f59393
5
+ SHA512:
6
+ metadata.gz: db30855c96f83102e2e8c465b8d634831e60b4d1f8c7616bb82e93e4b26dc30b4a8c762f48d01da45f5d92602f4e7a9f8b6ed53c3ff17a912962288ede15f3db
7
+ data.tar.gz: 7252c3eda9fa25dbf27120f8a4f7bd1178c3c3cb0364fe21e17153642628348c59852742252fe4b130bf64c4efbc9ed01c1a07bb61479b810f351debc56b2ac6
File without changes
@@ -0,0 +1,19 @@
1
+ Copyright (C) 2014 Bruno Sutic
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the "Software"),
5
+ to deal in the Software without restriction, including without limitation
6
+ the rights to use, copy, modify, merge, publish, distribute, sublicense,
7
+ and/or sell copies of the Software, and to permit persons to whom the
8
+ Software is furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included
11
+ in all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
14
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
15
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
16
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
17
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
18
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
19
+ OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,113 @@
1
+ # Capistrano::SshAgent
2
+
3
+ This plugin helps you setup and debug `ssh-agent` forwarding for Capistrano
4
+ deployment.
5
+
6
+ It's created to complement the official [capistrano authentication guide](http://capistranorb.com/documentation/getting-started/authentication-and-authorisation/).
7
+
8
+ The following is presumed:
9
+ - you're using `git`
10
+ - you want to use passwordless ssh login to the servers
11
+ - you want to use the `ssh-agent` forwarding strategy for checking out code in
12
+ the remote repository (btw. good choice, it's a least hassle)
13
+
14
+ The plugin will report errors (and offer steps to solution) if you deviate from
15
+ this configuration. The above assumptions should hold true for 98% users.
16
+
17
+ `capistrano-ssh-agent` works only with Capistrano **3+**.
18
+
19
+ ### Who should use it?
20
+
21
+ If you have enough knowldge/experience with `ssh` tool and you're sure you have
22
+ `ssh-agent` forwarding working for your server, feel free to uninstall this
23
+ plugin.
24
+
25
+ The plugin is made for beginners and users that are not sure if their setup is
26
+ good, so they want to confirm or debug it.
27
+
28
+ ### Installation
29
+
30
+ Put the following in your application's `Gemfile`:
31
+
32
+ group :development do
33
+ gem 'capistrano', '~> 3.1'
34
+ gem 'capistrano-ssh-agent'
35
+ end
36
+
37
+ Then run in the console:
38
+
39
+ $ bundle install
40
+
41
+ Put the following in `Capfile` file:
42
+
43
+ require 'capistrano/ssh_agent'
44
+
45
+ ### Usage
46
+
47
+ This plugin is intended to be used **before** any deployment task.
48
+
49
+ In the console run:
50
+
51
+ $ bundle exec cap production check_ssh_agent
52
+
53
+ The plugin will perform a number of checks and output a report at the end.
54
+
55
+ **Solving Errors**
56
+
57
+ In case there are errors in your setup, specific instructions for next
58
+ steps will be provided in report output.
59
+
60
+ **Important:** errors should be tackled in the order of their output. So, if
61
+ you got errors 2, 5 and 7 in the report, start by solving error 2.
62
+
63
+ It is very probable that "solving" one or two initial errors will actually make
64
+ everything work. A lot of the checks are inter-dependent. So don't be
65
+ discouraged if you see a lot of the errors in the beginning.
66
+
67
+ Once you solved a problem, run the `check_ssh_agent` task again to see the
68
+ progress.
69
+
70
+ Repeat the process until `check_ssh_agent` task reports success for all the
71
+ tasks. You're ok with proceeding with the deployment then.
72
+
73
+ ### Which checks are performed?
74
+
75
+ 1. checks that you're using `git` repository protocol
76
+ 2. checks that ssh private key file exists locally
77
+ 3. checks if `ssh-agent` process is running locally
78
+ 4. checks that `ssh-add` process can communicate with `ssh-agent`
79
+ 5. checks that ssh private keys are loaded to `ssh-agent`
80
+ 6. checks that remote code repository is accessible from local machine
81
+ 7. checks passwordless ssh login is used for all servers
82
+ 8. checks `forward_agent` capistrano option is set to `true` for all servers
83
+ 9. checks `ssh-agent` is actually forwared to all the servers
84
+ 10. checks remote code repository is accessible from all the servers
85
+
86
+ You'll see the results for all the checks in the output of `check_ssh_agent`
87
+ task.
88
+
89
+ ### More Capistrano automation?
90
+
91
+ If you'd like to streamline your Capistrano deploys, you might want to check
92
+ these zero-configuration, plug-n-play plugins:
93
+
94
+ - [capistrano-unicorn-nginx](https://github.com/bruno-/capistrano-unicorn-nginx)<br/>
95
+ no-configuration unicorn and nginx setup with sensible defaults
96
+ - [capistrano-postgresql](https://github.com/bruno-/capistrano-postgresql)<br/>
97
+ plugin that automates postgresql configuration and setup
98
+ - [capistrano-rbenv-install](https://github.com/bruno-/capistrano-rbenv-install)<br/>
99
+ would you like Capistrano to install rubies for you automatically?
100
+ - [capistrano-safe-deploy-to](https://github.com/bruno-/capistrano-safe-deploy-to)<br/>
101
+ if you're annoyed that Capistrano does **not** create a deployment path for the
102
+ app on the server (default `/var/www/myapp`), this is what you need!
103
+
104
+ ### Contributing and bug reports
105
+
106
+ If you got stuck at some point and really can't find a solution, please open a
107
+ [github issue](/issues) and maybe I can help you.
108
+
109
+ Also, I can use your problem to improve this plugin.
110
+
111
+ ### License
112
+
113
+ [MIT](LICENSE.md)
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,30 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'capistrano/ssh_agent/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = 'capistrano-ssh-agent'
8
+ gem.version = Capistrano::SshAgent::VERSION
9
+ gem.authors = ['Bruno Sutic']
10
+ gem.email = ['bruno.sutic@gmail.com']
11
+ gem.description = <<-EOF.gsub(/^\s+/, '')
12
+ This plugin helps you setup and debug `ssh-agent` forwarding for Capistrano
13
+ deployment.
14
+
15
+ It peforms a number of checks on the local machine as well as on the
16
+ servers. Report output with suggested next steps is provided in case there
17
+ are any errors with the setup.
18
+ EOF
19
+ gem.summary = 'This plugin helps you setup and debug `ssh-agent` forwarding for Capistrano deployment.'
20
+ gem.homepage = 'https://github.com/bruno-/capistrano-ssh-agent'
21
+
22
+ gem.license = 'MIT'
23
+
24
+ gem.files = `git ls-files`.split($/)
25
+ gem.require_paths = ['lib']
26
+
27
+ gem.add_dependency 'capistrano', '>= 3.1'
28
+
29
+ gem.add_development_dependency 'rake'
30
+ end
File without changes
@@ -0,0 +1 @@
1
+ load File.expand_path("../tasks/ssh_agent.rake", __FILE__)
@@ -0,0 +1,21 @@
1
+ require_relative 'report'
2
+
3
+ module Capistrano
4
+ module SshAgent
5
+ module HelperMethods
6
+
7
+ def initalize_report
8
+ @report = Capistrano::SshAgent::Report.new
9
+ end
10
+
11
+ def report_error_for(task_name, hosts=nil)
12
+ @report.report_error_for(task_name, hosts)
13
+ end
14
+
15
+ def print_report
16
+ @report.print
17
+ end
18
+
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,63 @@
1
+ require_relative 'report/messages'
2
+
3
+ module Capistrano
4
+ module SshAgent
5
+ class Report
6
+
7
+ include Capistrano::SshAgent::Report::Messages
8
+
9
+ def initialize
10
+ @report_messages = default_messages
11
+ end
12
+
13
+ def report_error_for(key, hosts=nil)
14
+ error_message = send(key + "_error", hosts)
15
+ set_error(key.to_sym, error_message)
16
+ end
17
+
18
+ def print
19
+ print_header
20
+ @report_messages.each_with_index do |(key, message), index|
21
+ print_message(index + 1, message)
22
+ end
23
+ print_footer
24
+ end
25
+
26
+ private
27
+
28
+ def set_error(key, message)
29
+ @report_messages[key] = [ :error, message ]
30
+ end
31
+
32
+ def has_errors?
33
+ @report_messages.any? {|key, value| value[0] == :error }
34
+ end
35
+
36
+ def print_header
37
+ puts
38
+ puts "SSH agent forwarding report"
39
+ puts "---------------------------"
40
+ puts
41
+ end
42
+
43
+ def print_message(index, message)
44
+ puts "#{index}. [#{message[0]}] #{message[1]}"
45
+ puts
46
+ end
47
+
48
+ def print_footer
49
+ puts "----------------------"
50
+ puts
51
+ if has_errors?
52
+ puts "It seems SSH agent forwarding is not set up correctly."
53
+ puts "Follow the suggested steps described in error messages."
54
+ puts "Errors (if more than one) are ordered by importance, so always start with the first one."
55
+ else
56
+ puts "It seems SSH agent forwarding is set up correctly!"
57
+ puts "You can continue with the deployment process."
58
+ end
59
+ end
60
+
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,171 @@
1
+ module Capistrano
2
+ module SshAgent
3
+ class Report
4
+ module Messages
5
+
6
+ def default_messages
7
+ {
8
+ config_repo_url: [
9
+ :success, '`repo_url` setting ok'
10
+ ],
11
+ config_repo_url: [
12
+ :success, '`repo_url` setting ok'
13
+ ],
14
+ local_private_key_exists: [
15
+ :success, 'ssh private key file exists'
16
+ ],
17
+ local_agent_running_env_var: [
18
+ :success, '`ssh-agent` process seems to be running locally'
19
+ ],
20
+ local_agent_running_ssh_add: [
21
+ :success, '`ssh-agent` process recognized by `ssh-add` command'
22
+ ],
23
+ local_keys_added_to_agent: [
24
+ :success, 'ssh private keys added to `ssh-agent`'
25
+ ],
26
+ local_repo_access: [
27
+ :success, 'application repository accessible from local machine'
28
+ ],
29
+ config_password: [
30
+ :success, 'all hosts using passwordless login'
31
+ ],
32
+ config_agent_forwarding: [
33
+ :success, '`forward_agent` ok for all hosts'
34
+ ],
35
+ remote_agent_running: [
36
+ :success, 'ssh agent successfully forwarded to remote hosts'
37
+ ],
38
+ remote_repo_access: [
39
+ :success, 'application repository accessible from remote hosts'
40
+ ]
41
+ }
42
+ end
43
+
44
+ def config_repo_url_error(_)
45
+ <<-EOF.gsub(/^\s+/, '')
46
+ It seems the git repository url in `repo_url` setting uses https
47
+ protocol. Https protocol prompts for password and so git protocol
48
+ should be used.
49
+
50
+ Actions:
51
+ - change `repo_url` setting in `config/deploy.rb` file to use git protocol.
52
+ Example for github: `git@github.com:username/repo.git`
53
+ EOF
54
+ end
55
+
56
+ def config_password_error(hosts)
57
+ msg = "It seems Capistrano connects to the following hosts using password login:\n"
58
+ msg << hosts.map(&:to_s).join(', ')
59
+ msg.concat "\n"
60
+ msg.concat <<-EOF.gsub(/^\s+/, '')
61
+ It is strongly suggested to use passwordless ssh login.
62
+
63
+ Actions:
64
+ - make sure you're *not* using password to connect to any of the servers.
65
+ - remove any password setting from `ssh_options` in Capistrano stage files
66
+ (e.g. `config/deploy/production.rb`).
67
+ By removing password configuration - the default, passwordless ssh
68
+ connection will be used.
69
+ - setup passwordless ssh connection
70
+ http://askubuntu.com/questions/4830/easiest-way-to-copy-ssh-keys-to-another-machine/4833#4833
71
+ EOF
72
+ end
73
+
74
+ def config_agent_forwarding_error(hosts)
75
+ msg = "It seems Capistrano connects without ssh agent forwarding to the following hosts:\n"
76
+ msg << hosts.join(', ')
77
+ msg.concat "\n"
78
+ msg.concat <<-EOF.gsub(/^\s+/, '')
79
+ Actions:
80
+ - make sure Capistrano uses the default ssh option for `forward_agent`.
81
+ Just remove any `forward_agent` setting from the stage file (e.g.
82
+ `config/deploy/production.rb`) and the default, `true` value will be used.
83
+ EOF
84
+ end
85
+
86
+ def local_private_key_exists_error(_)
87
+ <<-EOF.gsub(/^\s+/, '')
88
+ Uh, oh. It seems you do not have ssh private keys generated, or they're
89
+ not located in standard location.
90
+
91
+ Actions:
92
+ - here's a good guide how to generate ssh private keys and set them
93
+ up with github
94
+ https://help.github.com/articles/generating-ssh-keys
95
+ EOF
96
+ end
97
+
98
+ def local_agent_running_env_var_error(_)
99
+ <<-EOF.gsub(/^\s+/, '')
100
+ It seems `ssh-agent` is not running on local machine.
101
+
102
+ Actions:
103
+ - follow this guide
104
+ http://mah.everybody.org/docs/ssh
105
+ EOF
106
+ end
107
+
108
+ def local_agent_running_ssh_add_error(_)
109
+ <<-EOF.gsub(/^\s+/, '')
110
+ It seems ssh-add cannot make a connection with ssh-agent process
111
+ on local machine.
112
+
113
+ Actions:
114
+ - are you sure all the previous checks are passing? Make sure all
115
+ the above checks are successful before trying to make this one
116
+ pass
117
+ - try adding ssh keys to ssh-agent by executing
118
+ $ ssh-add ~/.ssh/id_rsa
119
+ - if the above does not work follow this guide to setup ssh-agent process
120
+ http://mah.everybody.org/docs/ssh
121
+ EOF
122
+ end
123
+
124
+ def local_keys_added_to_agent_error(_)
125
+ <<-EOF.gsub(/^\s+/, '')
126
+ It seems local ssh-agent process has no loaded keys.
127
+
128
+ Actions:
129
+ - add ssh private key to ssh-agent with this command
130
+ $ ssh-add /path/to/ssh_private_key
131
+ If ssh private key is in a standard location, then you most likely need this
132
+ $ ssh-add ~/.ssh/id_rsa
133
+ EOF
134
+ end
135
+
136
+ def local_repo_access_error(_)
137
+ <<-EOF.gsub(/^\s+/, '')
138
+ It seems git application repository cannot be accessed from local machine.
139
+
140
+ Actions:
141
+ - here's a guide to setting passwordless access to github repositories.
142
+ You should most likely follow just steps 3 and 4 from the guide if
143
+ all the previous checks are successful.
144
+ https://help.github.com/articles/generating-ssh-keys#step-3-add-your-ssh-key-to-github
145
+ EOF
146
+ end
147
+
148
+ def remote_agent_running_error(hosts)
149
+ msg = "It seems Capistrano did not succeed in making ssh agent forwarding for these hosts:\n"
150
+ msg << hosts.join(', ')
151
+ msg.concat "\n"
152
+ msg.concat <<-EOF.gsub(/^\s+/, '')
153
+ Actions:
154
+ - make sure all the previous checks pass
155
+ EOF
156
+ end
157
+
158
+ def remote_repo_access_error(hosts)
159
+ msg = "It seems Capistrano cannot access application git repository from these hosts:\n"
160
+ msg << hosts.join(', ')
161
+ msg.concat "\n"
162
+ msg.concat <<-EOF.gsub(/^\s+/, '')
163
+ Actions:
164
+ - make sure all the previous checks pass. That should make this one work too.
165
+ EOF
166
+ end
167
+
168
+ end
169
+ end
170
+ end
171
+ end
@@ -0,0 +1,5 @@
1
+ module Capistrano
2
+ module SshAgent
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,123 @@
1
+ require 'capistrano/ssh_agent/helper_methods'
2
+
3
+ include Capistrano::SshAgent::HelperMethods
4
+
5
+ namespace :ssh_agent do
6
+
7
+ namespace :config do
8
+
9
+ task :git do
10
+ unless fetch(:scm) == :git
11
+ puts 'It seems you are NOT using git as a Capistrano strategy. At the moment capistrano-ssh-agent supports only git.'
12
+ puts 'Please change `scm` setting to `:git`.'
13
+ exit 1
14
+ end
15
+ end
16
+
17
+ task :repo_url do
18
+ if fetch(:repo_url) =~ /^http/
19
+ report_error_for('config_repo_url')
20
+ end
21
+ end
22
+
23
+ task :password do
24
+ hosts = []
25
+ on release_roles :all do
26
+ if host.netssh_options[:password]
27
+ hosts << host
28
+ end
29
+ end
30
+ report_error_for('config_password', hosts) if hosts.any?
31
+ end
32
+
33
+ task :agent_forwarding do
34
+ hosts = []
35
+ on release_roles :all do
36
+ unless host.netssh_options[:forward_agent]
37
+ hosts << host
38
+ end
39
+ end
40
+ report_error_for('config_agent_forwarding', hosts) if hosts.any?
41
+ end
42
+
43
+ end
44
+
45
+ namespace :local do
46
+
47
+ task :private_key_exists do
48
+ specified_keys = fetch(:ssh_options, {})[:keys] || ''
49
+ unless File.exists?(File.expand_path('~/.ssh/id_rsa')) ||
50
+ File.exists?(File.expand_path('~/.ssh/id_dsa')) ||
51
+ File.exists?(specified_keys)
52
+ report_error_for('local_private_key_exists')
53
+ end
54
+ end
55
+
56
+ task :agent_running_env_var do
57
+ unless ENV.include?('SSH_AUTH_SOCK')
58
+ report_error_for('local_agent_running_env_var')
59
+ end
60
+ end
61
+
62
+ task :agent_running_ssh_add do
63
+ if !system('ssh-add -l') && $? == 2
64
+ report_error_for('local_agent_running_ssh_add')
65
+ end
66
+ end
67
+
68
+ task :keys_added_to_agent do
69
+ if !system('ssh-add -l') && $? == 1
70
+ report_error_for('local_keys_added_to_agent')
71
+ end
72
+ end
73
+
74
+ task :repo_access do
75
+ unless system({ 'GIT_ASKPASS' => '/bin/echo' }, "git ls-remote #{fetch(:repo_url)}")
76
+ report_error_for('local_repo_access')
77
+ end
78
+ end
79
+
80
+ end
81
+
82
+ namespace :remote do
83
+
84
+ task :agent_running do
85
+ hosts = []
86
+ on release_roles :all do
87
+ if capture(:echo, '$SSH_AUTH_SOCK').empty?
88
+ hosts << host
89
+ end
90
+ end
91
+ report_error_for('remote_agent_running', hosts) if hosts.any?
92
+ end
93
+
94
+ task repo_access: :'git:wrapper' do
95
+ hosts = []
96
+ on release_roles :all do
97
+ with fetch(:git_environmental_variables) do
98
+ hosts << host unless strategy.check
99
+ end
100
+ end
101
+ report_error_for('remote_repo_access', hosts) if hosts.any?
102
+ end
103
+
104
+ end
105
+
106
+ end
107
+
108
+ desc 'Perform ssh agent checks'
109
+ task :check_ssh_agent do
110
+ initalize_report
111
+ invoke 'ssh_agent:config:git'
112
+ invoke 'ssh_agent:config:repo_url'
113
+ invoke 'ssh_agent:config:password'
114
+ invoke 'ssh_agent:config:agent_forwarding'
115
+ invoke 'ssh_agent:local:private_key_exists'
116
+ invoke 'ssh_agent:local:agent_running_env_var'
117
+ invoke 'ssh_agent:local:agent_running_ssh_add'
118
+ invoke 'ssh_agent:local:keys_added_to_agent'
119
+ invoke 'ssh_agent:local:repo_access'
120
+ invoke 'ssh_agent:remote:agent_running'
121
+ invoke 'ssh_agent:remote:repo_access'
122
+ print_report
123
+ end
metadata ADDED
@@ -0,0 +1,90 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: capistrano-ssh-agent
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Bruno Sutic
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-04-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: capistrano
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '3.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '3.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: |
42
+ This plugin helps you setup and debug `ssh-agent` forwarding for Capistrano
43
+ deployment.
44
+ It peforms a number of checks on the local machine as well as on the
45
+ servers. Report output with suggested next steps is provided in case there
46
+ are any errors with the setup.
47
+ email:
48
+ - bruno.sutic@gmail.com
49
+ executables: []
50
+ extensions: []
51
+ extra_rdoc_files: []
52
+ files:
53
+ - CHANGELOG.md
54
+ - LICENSE.md
55
+ - README.md
56
+ - Rakefile
57
+ - capistrano-ssh-agent.gemspec
58
+ - lib/capistrano-ssh-agent.rb
59
+ - lib/capistrano/ssh_agent.rb
60
+ - lib/capistrano/ssh_agent/helper_methods.rb
61
+ - lib/capistrano/ssh_agent/report.rb
62
+ - lib/capistrano/ssh_agent/report/messages.rb
63
+ - lib/capistrano/ssh_agent/version.rb
64
+ - lib/capistrano/tasks/ssh_agent.rake
65
+ homepage: https://github.com/bruno-/capistrano-ssh-agent
66
+ licenses:
67
+ - MIT
68
+ metadata: {}
69
+ post_install_message:
70
+ rdoc_options: []
71
+ require_paths:
72
+ - lib
73
+ required_ruby_version: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ required_rubygems_version: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ requirements: []
84
+ rubyforge_project:
85
+ rubygems_version: 2.1.5
86
+ signing_key:
87
+ specification_version: 4
88
+ summary: This plugin helps you setup and debug `ssh-agent` forwarding for Capistrano
89
+ deployment.
90
+ test_files: []