aws_ssh 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 309d8060f416544bfc2f694b9e52e9a1d0959c88
4
+ data.tar.gz: f10639efda3bfb3d036886b865559320471dba4d
5
+ SHA512:
6
+ metadata.gz: 08db6a7f98e7e501c61c84dddf558c3614f46866d0d1a634750a85811d8b3f57abaef5cef29a062f7be69cb4b1674b248e9836e68709578ab73b92feffbf756c
7
+ data.tar.gz: 44c0e9cb3d52f917c6d548c96650ec837352067ddc96cb244b3ee68d23d578f628285fa4a6bbae313ce3a49d6fc34627fc633da8bd542701c20ce4f5b96ff4c9
data/.gitignore ADDED
@@ -0,0 +1 @@
1
+ *.gem
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,21 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ aws-sdk (1.56.0)
5
+ aws-sdk-v1 (= 1.56.0)
6
+ aws-sdk-v1 (1.56.0)
7
+ json (~> 1.4)
8
+ nokogiri (>= 1.4.4)
9
+ colorize (0.7.3)
10
+ json (1.8.1)
11
+ mini_portile (0.6.0)
12
+ nokogiri (1.6.3.1)
13
+ mini_portile (= 0.6.0)
14
+
15
+ PLATFORMS
16
+ ruby
17
+
18
+ DEPENDENCIES
19
+ aws-sdk
20
+ colorize
21
+ json
data/README.md ADDED
@@ -0,0 +1,65 @@
1
+ # AWS SSH Extension #
2
+
3
+ If you have a lot of services running over a multitude of instances, or if you just don't want to have to remember IP addresses, this tool will work for you.
4
+
5
+ ## Requirements ##
6
+
7
+ It does assume that you are using SSH key based authentication to access the servers and have a correctly configured environment. This means a current ~/.ssh/config that has relevant proxy settings etc along with AWS environment vars (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION)
8
+
9
+ Ruby, version 2.0 onwards, is required along with the standard bundler gem.
10
+
11
+ At the moment, this code is only tested with bash based shells.
12
+
13
+ ## AWS Configuration ##
14
+
15
+ Before you install this code, please be aware you may need to add some information to your ec2 instances. This code makes use of the "tags" key / value data available for each instance.
16
+
17
+ I think this will be easier to explain by example:
18
+
19
+ <img src="http://i.imgur.com/kvgHbr1.png" width="100%">
20
+ Above is an ec2 instance setup to run both website and blog services (website.blog) in production and staging (production.staging).
21
+
22
+ <img src="http://i.imgur.com/2psCejI.png" width="100%">
23
+ This ec2 instance is just the website running in production.
24
+
25
+ What values you have for environment and service are free form, so if you prefer to use "prod" instead of "production", you can.
26
+
27
+ You can also have as many services and environments as you like, they just have to be seperated by a full stop (.).
28
+
29
+ ## Install ##
30
+
31
+
32
+ ### Uninstall ###
33
+
34
+
35
+ ## Usage ##
36
+
37
+ Once installed you will need to make an SSH call to a service like:
38
+
39
+ ssh $environment_$service
40
+ or
41
+ ssh $service_$environment
42
+
43
+ In the case or examples above, that would be:
44
+
45
+ ssh production_website
46
+ or
47
+ ssh website_production
48
+
49
+ To be even more useful, it will also add the instance name, so:
50
+
51
+ ssh websites
52
+
53
+ would work as well
54
+
55
+ If you have tab completion available, even better.
56
+
57
+ ### SSH User ###
58
+
59
+ By default "deploy" is used as the ssh user. You can override this in the command as you are running it:
60
+
61
+ ssh my-user@website_production
62
+
63
+ Or, to save remembering, you can add a "user" tag to your instance and that will be loaded in
64
+
65
+
data/aws_ssh.gemspec ADDED
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "aws_ssh/version"
5
+ require "aws_ssh/cmds"
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = "aws_ssh"
9
+ spec.version = AWS_SSH::VERSION
10
+ spec.authors = ["Charles Marshall"]
11
+ spec.email = ["cm56marshall@gmail.com"]
12
+ spec.summary = %q{ Autogenerates an SSH config file built from and AWS environment }
13
+ spec.description = %q{ Autogenerates an SSH config file built from and AWS environment }
14
+ spec.homepage = "https://github.com/charlesmarshall/aws_ssh"
15
+ spec.license = "MIT"
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "colorize", "~> 0.7"
22
+ spec.add_dependency "bundler", "~> 1.5"
23
+ spec.add_dependency "json", "~> 1.8"
24
+ spec.add_dependency "aws-sdk", "~> 1.5"
25
+
26
+ spec.post_install_message = "Gem installed.\nTo configure for use, run: #{AWS_SSH::SETUP_CMD}\nBefore removing gem, run: #{AWS_SSH::TEARDOWN_CMD}\n\nThank you!"
27
+
28
+ end
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+ lib = File.expand_path(File.dirname(__FILE__) + '/../lib')
4
+ $LOAD_PATH.unshift(lib) if File.directory?(lib) && !$LOAD_PATH.include?(lib)
5
+
6
+ require 'aws_ssh'
7
+
8
+ ssh = AWS_SSH::Run.new
9
+ ssh.generate
data/bin/aws_ssh_setup ADDED
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+ lib = File.expand_path(File.dirname(__FILE__) + '/../lib')
4
+ $LOAD_PATH.unshift(lib) if File.directory?(lib) && !$LOAD_PATH.include?(lib)
5
+
6
+ require 'aws_ssh'
7
+ require "colorize"
8
+ # run the config setup
9
+ runner = AWS_SSH::Setup.new
10
+ puts ""
11
+ puts "Configuring...".colorize(:green)
12
+ result = runner.run
13
+ if ! result.nil?
14
+ puts ""
15
+ puts "Configuration completed.".colorize(:green)
16
+ puts ""
17
+ else
18
+ puts ""
19
+ puts "Configuration failed.".colorize(:red)
20
+ puts ""
21
+ end
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+ lib = File.expand_path(File.dirname(__FILE__) + '/../lib')
4
+ $LOAD_PATH.unshift(lib) if File.directory?(lib) && !$LOAD_PATH.include?(lib)
5
+
6
+ require 'aws_ssh'
7
+ require "colorize"
8
+ # run the config setup
9
+ runner = AWS_SSH::Teardown.new
10
+ puts ""
11
+ puts "Removing...".colorize(:green)
12
+ result = runner.run
13
+ if ! result.nil?
14
+ puts ""
15
+ puts "Removal completed, you can uninstall the gem.".colorize(:green)
16
+ puts ""
17
+ else
18
+ puts ""
19
+ puts "Removal failed.".colorize(:red)
20
+ puts ""
21
+ end
@@ -0,0 +1,7 @@
1
+ require "aws_ssh/files"
2
+ module AWS_SSH
3
+ GENERATE_CMD="aws_ssh_generate"
4
+ SETUP_CMD="aws_ssh_setup"
5
+ TEARDOWN_CMD="aws_ssh_teardown"
6
+ MERGE_CMD='cat ~/.ssh/' + AWS_SSH::BASE_HOSTS_FILE + ' ~/.ssh/' + AWS_SSH::HOSTS_FILE + ' > ~/.ssh/config'
7
+ end
@@ -0,0 +1,114 @@
1
+ require 'json'
2
+ require 'aws-sdk'
3
+
4
+ module AWS_SSH
5
+ class EC2
6
+ ### ssh config file values
7
+ attr_accessor :User
8
+ attr_accessor :StrictHostKeyChecking
9
+ attr_accessor :UserKnownHostsFile
10
+ attr_accessor :LogLevel
11
+ ### class values
12
+ # aws api object
13
+ attr_accessor :api
14
+ # suffix of the key to use
15
+ attr_accessor :ssh_key_suffix
16
+ # auto generated ssh config_file
17
+ attr_accessor :ssh_config_file
18
+ # value used as seperater in the tags
19
+ attr_accessor :seperator
20
+
21
+ def initialize
22
+ self.env_error_check
23
+ self.default_values
24
+ end
25
+
26
+ def env_error_check
27
+ if ENV['AWS_ACCESS_KEY_ID'].nil? || ENV['AWS_SECRET_ACCESS_KEY'].nil? || ENV['AWS_REGION'].nil?
28
+ raise MissingAWS_CONFIG, "Missing AWS config data from the ENV."
29
+ end
30
+ end
31
+
32
+ def default_values
33
+ @User = "deploy"
34
+ @StrictHostKeyChecking = "no"
35
+ @UserKnownHostsFile = "/dev/null"
36
+ @LogLevel = "quiet"
37
+
38
+ @seperator = "."
39
+ @ssh_key_suffix = "pem"
40
+ @api = AWS::EC2.new(access_key_id: ENV['AWS_ACCESS_KEY_ID'], secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'], region: ENV['AWS_REGION'])
41
+ end
42
+
43
+
44
+ def instances
45
+ instances = []
46
+ # normal instances
47
+ @api.instances.each{|i| instances.push(i)}
48
+ # vpc based insatnces
49
+ @api.vpcs.each{|v| v.instances.each{|vi| instances.push(vi)} }
50
+ return instances
51
+ end
52
+
53
+
54
+ def instance_data(instance)
55
+ tags = instance.tags.to_h
56
+ return {
57
+ :name => if tags["Name"].nil? then nil else tags["Name"].to_s.strip end,
58
+ :user => if tags["user"].nil? then @User else tags["user"].to_s.strip end,
59
+ :envs => if tags["environment"].nil? then nil else tags["environment"].split(@seperator) end,
60
+ :services => if tags["service"].nil? then nil else tags["service"].split(@seperator) end,
61
+ :ip => instance.private_ip_address,
62
+ :key => instance.key_name,
63
+ :key_file => ENV['HOME']+"/.ssh/"+instance.key_name+"."+@ssh_key_suffix
64
+ }
65
+ end
66
+
67
+ def instance_names(info)
68
+ names = []
69
+ if ! info[:name].nil? then names.push(info[:name]) end
70
+ if ! info[:envs].nil? && ! info[:services].nil?
71
+ info[:envs].each do |e|
72
+ info[:services].each do |s|
73
+ names.push("#{e}_#{s}")
74
+ names.push("#{s}_#{e}")
75
+ end
76
+ end
77
+ end
78
+ return names
79
+ end
80
+
81
+ def hosts
82
+ hosts = {}
83
+ self.instances.select!{|i| i.status.to_s == "running"}.each do |i|
84
+ info = self.instance_data(i)
85
+ if File.exists?(info[:key_file])
86
+ self.instance_names(info).each{ |h| hosts[h] = info}
87
+ end
88
+ end
89
+ return hosts
90
+ end
91
+
92
+
93
+ def write
94
+ # loop over hash and generate string
95
+ config = "\n\n# Custom generated list from AWS on #{Time.now}\n\n"
96
+ dir = ENV['HOME']+"/.ssh/"
97
+ sshfile = dir+AWS_SSH::HOSTS_FILE
98
+ File.open(sshfile, "w"){ |file| file.write(config)}
99
+ self.hosts.each do |name, host|
100
+ config += "Host #{name}\n"
101
+ config += " HostName #{host[:ip].to_s}\n"
102
+ config += " User #{host[:user].to_s}\n"
103
+ config += " IdentityFile ~/.ssh/#{host[:key].to_s}.#{@ssh_key_suffix}\n"
104
+ config += " StrictHostKeyChecking #{@StrictHostKeyChecking}\n"
105
+ config += " UserKnownHostsFile #{@UserKnownHostsFile}\n"
106
+ config += " LogLevel #{@LogLevel}\n"
107
+ config += "\n\n"
108
+ end
109
+ # write to file
110
+ File.open(sshfile, "w"){ |file| file.write(config)}
111
+ end
112
+
113
+ end
114
+ end
@@ -0,0 +1,4 @@
1
+ module AWS_SSH
2
+ class MissingAWS_CONFIG < Exception
3
+ end
4
+ end
@@ -0,0 +1,5 @@
1
+ module AWS_SSH
2
+ ALIAS_FILE=".aws_alias"
3
+ HOSTS_FILE="config.aws"
4
+ BASE_HOSTS_FILE="config.base"
5
+ end
@@ -0,0 +1,21 @@
1
+ require "aws_ssh/files"
2
+ module AWS_SSH
3
+ class Run
4
+ def generate
5
+ config = AWS_SSH::HOSTS_FILE
6
+ # 4 hour cache
7
+ if (File.exists?(config) && File.mtime(config) < (Time.now - (60*60*4) )) || ! File.exists?(config)
8
+ self.force
9
+ end
10
+ end
11
+
12
+ def force
13
+ ec2 = EC2.new
14
+ ec2.write
15
+ end
16
+
17
+ def merge
18
+ `#{AWS_SSH::MERGE_CMD}`
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,103 @@
1
+ require 'colorize'
2
+ require "aws_ssh/files"
3
+ require "aws_ssh/terminal_formats"
4
+ require "aws_ssh/version"
5
+ require 'fileutils'
6
+ require "aws_ssh/runner"
7
+
8
+ module AWS_SSH
9
+ class Setup
10
+ attr_accessor :profile
11
+
12
+ # all vars are required
13
+ def env
14
+ return ( ENV['AWS_ACCESS_KEY_ID'] && ENV['AWS_SECRET_ACCESS_KEY'] && ENV['AWS_REGION'] && ENV['SHELL'] && ENV['HOME'])
15
+ end
16
+
17
+ def shell
18
+ shell = ENV['SHELL']
19
+ last = shell.rindex("/")+1
20
+ len = shell.length-1
21
+ return shell[last..len]
22
+ end
23
+
24
+ def self.shells(home, shell)
25
+ ["#{home}/.#{shell}rc", "#{home}/.#{shell}_profile", "#{home}/.profile"]
26
+ end
27
+
28
+ def profile
29
+ home = ENV['HOME']
30
+ shell = self.shell
31
+ @profile = nil
32
+ # check for automated locations
33
+ if ! shell.nil?
34
+ possibles = AWS_SSH::Setup.shells(home, shell)
35
+ possibles.each {|p| if @profile.nil? && File.exists?(p) then @profile = p end }
36
+ end
37
+
38
+ end
39
+
40
+ # create the alias file
41
+ def alias
42
+ msg = "# This is an automatically generated file; do not edit.\n# Created at #{Time.now}\n# Created by aws_ssh #{AWS_SSH::VERSION}\n"
43
+ cmd = 'alias ssh="' + AWS_SSH::GENERATE_CMD + ' ; '+AWS_SSH::MERGE_CMD+ '; ssh"'
44
+ filename=ENV['HOME']+"/"+AWS_SSH::ALIAS_FILE
45
+ File.open(filename, 'w') { |file| file.write(msg+cmd) }
46
+ return File.exists?(filename)
47
+ end
48
+ # move any current ssh config file to a base file
49
+ def create_base
50
+ origin = "#{ENV['HOME']}/.ssh/config"
51
+ dest = "#{ENV['HOME']}/.ssh/#{AWS_SSH::BASE_HOSTS_FILE}"
52
+ if File.exists?(origin)
53
+ FileUtils.mv(origin, dest)
54
+ end
55
+ end
56
+
57
+ def add_to_profile
58
+ if ! @profile.nil?
59
+ contents = File.open(@profile, 'rb') {|file| file.read}
60
+ # remove any current references and add new one in
61
+ contents = contents.gsub(". ~/#{AWS_SSH::ALIAS_FILE}", "").chomp + "\n" + ". ~/#{AWS_SSH::ALIAS_FILE}"
62
+ File.open(@profile, 'w') { |file| file.write(contents) }
63
+ end
64
+ end
65
+
66
+ def run
67
+
68
+ if !self.env
69
+ printf(AWS_SSH::FORMAT_FATAL, "Environment failed", "\u2620")
70
+ return nil
71
+ else
72
+ printf(AWS_SSH::FORMAT_OK, "Environment vars", "\u2713")
73
+ end
74
+
75
+ self.profile
76
+ if @profile.nil?
77
+ printf(AWS_SSH::FORMAT_FATAL, "Shell profile failed", "\u2620")
78
+ return nil
79
+ else
80
+ printf(AWS_SSH::FORMAT_OK, "Shell profile found", "\u2713")
81
+ end
82
+
83
+ if self.alias
84
+ printf(AWS_SSH::FORMAT_OK, "Alias file created ", "\u2713")
85
+ else
86
+ printf(AWS_SSH::FORMAT_FATAL, "Alias file creation failed", "\u2620")
87
+ return nil
88
+ end
89
+
90
+ self.create_base
91
+ printf(AWS_SSH::FORMAT_OK, "Base SSH file created ", "\u2713")
92
+ self.add_to_profile
93
+ printf(AWS_SSH::FORMAT_OK, "Alias added to shell ", "\u2713")
94
+
95
+ run = AWS_SSH::Run.new
96
+ run.force
97
+ run.merge
98
+ printf(AWS_SSH::FORMAT_OK, "Completed first run", "\u2713")
99
+ return true
100
+ end
101
+
102
+ end
103
+ end
@@ -0,0 +1,84 @@
1
+ require 'colorize'
2
+ require "aws_ssh/files"
3
+ require "aws_ssh/terminal_formats"
4
+ require "aws_ssh/version"
5
+ require 'fileutils'
6
+ require "aws_ssh/runner"
7
+
8
+ module AWS_SSH
9
+ class Teardown < Setup
10
+ attr_accessor :profile
11
+
12
+
13
+ def self.shells(home, shell)
14
+ ["#{home}/.#{shell}rc", "#{home}/.#{shell}_profile", "#{home}/.profile"]
15
+ end
16
+
17
+ def profile
18
+ home = ENV['HOME']
19
+ shell = self.shell
20
+ @profile = nil
21
+ # check for automated locations
22
+ if ! shell.nil?
23
+ possibles = AWS_SSH::Setup.shells(home, shell)
24
+ possibles.each {|p| if @profile.nil? && File.exists?(p) then @profile = p end }
25
+ end
26
+
27
+ end
28
+
29
+ # create the alias file
30
+ def alias
31
+ filename=ENV['HOME']+"/"+AWS_SSH::ALIAS_FILE
32
+ if File.exists?(filename)
33
+ FileUtils.rm(filename)
34
+ end
35
+ return !File.exists?(filename)
36
+ end
37
+ #
38
+ def swap_base
39
+ origin = "#{ENV['HOME']}/.ssh/config"
40
+ dest = "#{ENV['HOME']}/.ssh/#{AWS_SSH::BASE_HOSTS_FILE}"
41
+ if File.exists?(dest)
42
+ FileUtils.mv(dest, origin)
43
+ end
44
+ extra = "#{ENV['HOME']}/.ssh/#{AWS_SSH::HOSTS_FILE}"
45
+ if File.exists?(extra)
46
+ FileUtils.rm(extra)
47
+ end
48
+ end
49
+
50
+ def remove_from_profile
51
+ if ! @profile.nil?
52
+ contents = File.open(@profile, 'rb') {|file| file.read}
53
+ # remove any current references and add new one in
54
+ contents = contents.gsub(". ~/#{AWS_SSH::ALIAS_FILE}", "").chomp + "\n"
55
+ File.open(@profile, 'w') { |file| file.write(contents) }
56
+ end
57
+ end
58
+
59
+ def run
60
+ self.profile
61
+ if @profile.nil?
62
+ printf(AWS_SSH::FORMAT_FATAL, "Shell profile failed", "\u2620")
63
+ return nil
64
+ else
65
+ printf(AWS_SSH::FORMAT_OK, "Shell profile found", "\u2713")
66
+ end
67
+
68
+ if self.alias
69
+ printf(AWS_SSH::FORMAT_OK, "Alias file removed ", "\u2713")
70
+ else
71
+ printf(AWS_SSH::FORMAT_FATAL, "Alias removal failed", "\u2620")
72
+ return nil
73
+ end
74
+
75
+ self.swap_base
76
+ printf(AWS_SSH::FORMAT_OK, "Base SSH file reverted ", "\u2713")
77
+ self.remove_from_profile
78
+ printf(AWS_SSH::FORMAT_OK, "Alias removed from shell ", "\u2713")
79
+
80
+ return true
81
+ end
82
+
83
+ end
84
+ end
@@ -0,0 +1,5 @@
1
+ module AWS_SSH
2
+ FORMAT_OK="\e[0;32m%#-30s\t%5s\e[0m\n"
3
+ FORMAT_ERROR="\e[33;40m%#-30s\t%5s\e[0m\n"
4
+ FORMAT_FATAL="\e[0;31m%#-30s\t%5s\e[0m\n"
5
+ end
@@ -0,0 +1,3 @@
1
+ module AWS_SSH
2
+ VERSION="0.1.0"
3
+ end
data/lib/aws_ssh.rb ADDED
@@ -0,0 +1,14 @@
1
+ require "aws_ssh/version"
2
+
3
+
4
+ module AWS_SSH
5
+ require "aws_ssh/exceptions"
6
+ require "aws_ssh/files"
7
+ require "aws_ssh/cmds"
8
+ require "aws_ssh/terminal_formats"
9
+ require "aws_ssh/ec2"
10
+ require "aws_ssh/setup"
11
+ require "aws_ssh/teardown"
12
+ require "aws_ssh/runner"
13
+
14
+ end
metadata ADDED
@@ -0,0 +1,126 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: aws_ssh
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Charles Marshall
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-10-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: colorize
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.7'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.5'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.5'
41
+ - !ruby/object:Gem::Dependency
42
+ name: json
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.8'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.8'
55
+ - !ruby/object:Gem::Dependency
56
+ name: aws-sdk
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.5'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.5'
69
+ description: " Autogenerates an SSH config file built from and AWS environment "
70
+ email:
71
+ - cm56marshall@gmail.com
72
+ executables:
73
+ - aws_ssh_generate
74
+ - aws_ssh_setup
75
+ - aws_ssh_teardown
76
+ extensions: []
77
+ extra_rdoc_files: []
78
+ files:
79
+ - ".gitignore"
80
+ - Gemfile
81
+ - Gemfile.lock
82
+ - README.md
83
+ - aws_ssh.gemspec
84
+ - bin/aws_ssh_generate
85
+ - bin/aws_ssh_setup
86
+ - bin/aws_ssh_teardown
87
+ - lib/aws_ssh.rb
88
+ - lib/aws_ssh/cmds.rb
89
+ - lib/aws_ssh/ec2.rb
90
+ - lib/aws_ssh/exceptions.rb
91
+ - lib/aws_ssh/files.rb
92
+ - lib/aws_ssh/runner.rb
93
+ - lib/aws_ssh/setup.rb
94
+ - lib/aws_ssh/teardown.rb
95
+ - lib/aws_ssh/terminal_formats.rb
96
+ - lib/aws_ssh/version.rb
97
+ homepage: https://github.com/charlesmarshall/aws_ssh
98
+ licenses:
99
+ - MIT
100
+ metadata: {}
101
+ post_install_message: |-
102
+ Gem installed.
103
+ To configure for use, run: aws_ssh_setup
104
+ Before removing gem, run: aws_ssh_teardown
105
+
106
+ Thank you!
107
+ rdoc_options: []
108
+ require_paths:
109
+ - lib
110
+ required_ruby_version: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ required_rubygems_version: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ requirements: []
121
+ rubyforge_project:
122
+ rubygems_version: 2.2.2
123
+ signing_key:
124
+ specification_version: 4
125
+ summary: Autogenerates an SSH config file built from and AWS environment
126
+ test_files: []