ec2ssh 1.0.3 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --order rand
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm use 1.9.3
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.8.7
4
+ - ree-1.8.7-2012.02
5
+ - 1.9.3
6
+ - 2.0.0
7
+ script: 'bundle exec rspec spec'
data/ChangeLog.md ADDED
@@ -0,0 +1,21 @@
1
+ # Change Log
2
+ ## 2.0.0
3
+
4
+ * Add dotfile (.ec2ssh); supports multiple aws keys with `$ ec2ssh update --aws-key keyname` option.
5
+ Thanks to @kentaro #3
6
+
7
+ * Replace a gem `ktheory-right_aws` with `aws-sdk`.
8
+
9
+ * Write tests.
10
+
11
+ ## 1.0.3
12
+
13
+ * Surpress thor warnings. Thanks to @mururu #1, @sanemat #2
14
+
15
+ ## 1.0.2
16
+
17
+ * Fix bug: Blank HostName is created if there're some "stopped" instances.
18
+
19
+ ## 1.0.1
20
+
21
+ * First Release.
data/Gemfile CHANGED
@@ -1,3 +1,8 @@
1
- source :rubygems
1
+ source 'https://rubygems.org'
2
2
  gemspec
3
3
 
4
+ gem 'rspec', '~> 2.12'
5
+ gem 'guard-rspec', '~> 2.4'
6
+ gem 'webmock', '~> 1.9'
7
+ gem 'rb-fsevent', '~> 0.9.1'
8
+ gem 'timecop', '~> 0.5'
data/Gemfile.lock CHANGED
@@ -1,25 +1,66 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ec2ssh (1.0.2)
4
+ ec2ssh (2.0.0)
5
+ aws-sdk (~> 1.8)
5
6
  highline (~> 1.6)
6
- ktheory-right_aws (~> 2.0.3)
7
7
  thor (~> 0.14.6)
8
8
 
9
9
  GEM
10
- remote: http://rubygems.org/
10
+ remote: https://rubygems.org/
11
11
  specs:
12
- highline (1.6.1)
13
- ktheory-right_aws (2.0.3)
14
- right_http_connection (>= 1.2.1)
15
- right_http_connection (1.2.4)
12
+ addressable (2.3.2)
13
+ aws-sdk (1.8.1.3)
14
+ json (~> 1.4)
15
+ nokogiri (>= 1.4.4)
16
+ uuidtools (~> 2.1)
17
+ coderay (1.0.8)
18
+ crack (0.3.2)
19
+ diff-lcs (1.1.3)
20
+ guard (1.6.2)
21
+ listen (>= 0.6.0)
22
+ lumberjack (>= 1.0.2)
23
+ pry (>= 0.9.10)
24
+ terminal-table (>= 1.4.3)
25
+ thor (>= 0.14.6)
26
+ guard-rspec (2.4.0)
27
+ guard (>= 1.1)
28
+ rspec (~> 2.11)
29
+ highline (1.6.15)
30
+ json (1.7.7)
31
+ listen (0.7.2)
32
+ lumberjack (1.0.2)
33
+ method_source (0.8.1)
34
+ nokogiri (1.5.6)
35
+ pry (0.9.12)
36
+ coderay (~> 1.0.5)
37
+ method_source (~> 0.8)
38
+ slop (~> 3.4)
39
+ rb-fsevent (0.9.2)
40
+ rspec (2.12.0)
41
+ rspec-core (~> 2.12.0)
42
+ rspec-expectations (~> 2.12.0)
43
+ rspec-mocks (~> 2.12.0)
44
+ rspec-core (2.12.2)
45
+ rspec-expectations (2.12.1)
46
+ diff-lcs (~> 1.1.3)
47
+ rspec-mocks (2.12.2)
48
+ slop (3.4.3)
49
+ terminal-table (1.4.5)
16
50
  thor (0.14.6)
51
+ timecop (0.5.9.1)
52
+ uuidtools (2.1.3)
53
+ webmock (1.9.0)
54
+ addressable (>= 2.2.7)
55
+ crack (>= 0.1.7)
17
56
 
18
57
  PLATFORMS
19
58
  ruby
20
59
 
21
60
  DEPENDENCIES
22
61
  ec2ssh!
23
- highline (~> 1.6)
24
- ktheory-right_aws (~> 2.0.3)
25
- thor (~> 0.14.6)
62
+ guard-rspec (~> 2.4)
63
+ rb-fsevent (~> 0.9.1)
64
+ rspec (~> 2.12)
65
+ timecop (~> 0.5)
66
+ webmock (~> 1.9)
data/Guardfile ADDED
@@ -0,0 +1,9 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard 'rspec' do
5
+ watch(%r{^spec/.+_spec\.rb$})
6
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
7
+ watch('spec/spec_helper.rb') { "spec" }
8
+ end
9
+
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2013 Issei Naruta
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,93 @@
1
+ # Introduction
2
+ ec2ssh is a ssh_config manager for amazonaws ec2.
3
+ `ec2ssh` command adds `Host` descriptions to ssh_config (~/.ssh/config default). 'Name' tag of instances are used as `Host` descriptions.
4
+
5
+ # How to use
6
+ ### 1. Set 'Name' tag to your instances
7
+ eg. Tag 'app-server-1' as 'Name' to an instance i-xxxxx in us-west-1 region.
8
+
9
+ ### 2. Install ec2ssh
10
+
11
+ ```
12
+ $ gem install ec2ssh
13
+ ```
14
+
15
+ ### 3. Execute `ec2ssh init`
16
+
17
+ ```
18
+ $ ec2ssh init
19
+ ```
20
+
21
+ ### 4. Edit `.ec2ssh`
22
+
23
+ ```
24
+ $ vi ~/.ec2ssh
25
+ ---
26
+ path: /path/to/ssh_config
27
+ access_key_id: YOUR_ACCESS_KEY_ID
28
+ secret_access_key: YOUR_SECRET_ACCESS_KEY
29
+ regions:
30
+ - ap-northeast-1
31
+ ```
32
+
33
+ ### 5. Execute `ec2ssh update`
34
+
35
+ ```
36
+ $ ec2ssh update
37
+ ```
38
+ Then host-names of your instances are generated and wrote to .ssh/config
39
+
40
+ ### 6. And you can ssh to your instances with your tagged name.
41
+
42
+ ```
43
+ $ ssh app-server-1.us-west-1
44
+ ```
45
+
46
+ # Commands
47
+ ```
48
+ $ ec2ssh help [TASK] # Describe available tasks or one specific task
49
+ $ ec2ssh init # Add ec2ssh mark to ssh_config
50
+ $ ec2ssh update # Update ec2 hosts list in ssh_config
51
+ $ ec2ssh remove # Remove ec2ssh mark from ssh_config
52
+ ```
53
+
54
+ Each command can use `--path` option to set ssh_config path. The default is "~/.ssh/config"
55
+
56
+ ```
57
+ $ ec2ssh init --path=/path/to/ssh_config
58
+ ```
59
+
60
+ # ssh_config and mark lines
61
+ `ec2ssh init` command inserts mark lines your `.ssh/config` such as:
62
+
63
+ ```
64
+ ### EC2SSH BEGIN ###
65
+ # Generated by ec2ssh http://github.com/mirakui/ec2ssh
66
+ # DO NOT edit this block!
67
+ # Updated Sun Dec 05 00:00:14 +0900 2010
68
+ ### EC2SSH END ###
69
+ ```
70
+
71
+ `ec2ssh update` command inserts 'Host' descriptions between 'BEGIN' line and 'END' line.
72
+
73
+ ```
74
+ ### EC2SSH BEGIN ###
75
+ # Generated by ec2ssh http://github.com/mirakui/ec2ssh
76
+ # DO NOT edit this block!
77
+ # Updated Sun Dec 05 00:00:14 +0900 2010
78
+ Host app-server-1.us-west-1
79
+ HostName ec2-xxx-xxx-xxx-xxx.us-west-1.compute.amazonaws.com
80
+ Host db-server-1.ap-southeast-1
81
+ HostName ec2-xxx-xxx-xxx-xxx.ap-southeast-1.compute.amazonaws.com
82
+ :
83
+ :
84
+ ### EC2SSH END ###
85
+ ```
86
+
87
+ `ec2ssh remove` command removes the mark lines.
88
+
89
+ # Notice
90
+ `ec2ssh` command updates your `.ssh/config` file default. You should make a backup of it.
91
+
92
+ # License
93
+ ec2ssh is released under the MIT license.
data/bin/ec2ssh CHANGED
@@ -1,3 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
- require 'ec2ssh'
2
+ $: << File.expand_path('../../lib', __FILE__)
3
+ require 'ec2ssh/cli'
3
4
  Ec2ssh::CLI.start
data/ec2ssh.gemspec CHANGED
@@ -6,16 +6,16 @@ Gem::Specification.new do |s|
6
6
  s.name = "ec2ssh"
7
7
  s.version = Ec2ssh::VERSION
8
8
  s.platform = Gem::Platform::RUBY
9
- s.authors = ["mirakui"]
10
- s.email = ["mirakui@tsuyabu.in"]
9
+ s.authors = ["Issei Naruta"]
10
+ s.email = ["mimitako@gmail.com"]
11
11
  s.homepage = "http://github.com/mirakui/ec2ssh"
12
12
  s.summary = %q{A ssh_config manager for AWS EC2}
13
- s.description = %q{A ssh_config manager for AWS EC2}
13
+ s.description = %q{ec2ssh is a ssh_config manager for AWS EC2}
14
14
 
15
15
  s.rubyforge_project = "ec2ssh"
16
16
  s.add_dependency "thor", "~> 0.14.6"
17
17
  s.add_dependency "highline", "~> 1.6"
18
- s.add_dependency "ktheory-right_aws", "~> 2.0.3"
18
+ s.add_dependency 'aws-sdk', '~> 1.8'
19
19
 
20
20
  s.files = `git ls-files`.split("\n")
21
21
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
data/lib/ec2ssh/cli.rb CHANGED
@@ -1,67 +1,76 @@
1
1
  require 'thor'
2
- require 'right_aws'
3
2
  require 'highline'
3
+ require 'ec2ssh/hosts'
4
+ require 'ec2ssh/ssh_config'
5
+ require 'ec2ssh/dotfile'
4
6
 
5
7
  module Ec2ssh
6
8
  class CLI < Thor
7
- path_option = [:path, {:banner => "/path/to/ssh_config", :default=>"#{ENV['HOME']}/.ssh/config"}]
9
+ class_option :path, :banner => "/path/to/ssh_config"
10
+ class_option :dotfile, :banner => '$HOME/.ec2ssh', :default => "#{ENV['HOME']}/.ec2ssh"
8
11
 
9
12
  desc "init", "Add ec2ssh mark to ssh_config"
10
- method_option *path_option
11
13
  def init
12
- config = Config.new(options.path)
14
+ config = SshConfig.new(config_path)
13
15
  if config.mark_exist?
14
- red "Marker already exists on #{options.path}"
15
- return
16
+ red "Marker already exists on #{config_path}"
17
+ else
18
+ config.append_mark!
19
+ green "Added mark to #{config_path}"
16
20
  end
17
- config.append_mark!
18
- green "Added mark to #{options.path}"
21
+ dotfile = Dotfile.update_or_create(options.dotfile, 'path' => options.path)
22
+ yellow "Please check and edit #{options.dotfile} before run `ec2ssh update`"
19
23
  end
20
24
 
21
25
  desc "update", "Update ec2 hosts list in ssh_config"
22
- method_option *path_option
26
+ method_option :aws_key, :banner => 'aws key name', :default => 'default'
23
27
  def update
24
- config = Config.new(options.path)
28
+ config = SshConfig.new(config_path)
25
29
  unless config.mark_exist?
26
- red "Marker not found on #{options.path}"
27
- red "Execute '#{$0} init --path=#{options.path}' first!"
30
+ red "Marker not found on #{config_path}"
31
+ red "Execute '#{$0} init --path=/path/to/ssh_config' first!"
28
32
  return
29
33
  end
30
- hosts = Hosts.new.all
31
34
  config_str = config.wrap(hosts.map{|h|<<-END}.join)
32
35
  Host #{h[:host]}
33
36
  HostName #{h[:dns_name]}
34
37
  END
35
38
  config.replace! config_str
36
39
  yellow config_str
37
- green "Updated #{hosts.size} hosts on #{options.path}"
38
- rescue AwsEnvNotDefined
39
- red <<-END
40
- Set environment variables to access AWS such as:
41
- export AMAZON_ACCESS_KEY_ID="..."
42
- export AMAZON_SECRET_ACCESS_KEY="..."
43
- END
40
+ green "Updated #{hosts.size} hosts on #{config_path}"
41
+ rescue AwsEnvNotDefined, AwsKeyNotFound
42
+ red "Set aws keys at #{options.dotfile}"
44
43
  end
45
44
 
46
45
  desc "remove", "Remove ec2ssh mark from ssh_config"
47
- method_option *path_option
48
46
  def remove
49
- config = Config.new(options.path)
47
+ config = SshConfig.new(config_path)
50
48
  unless config.mark_exist?
51
- red "Marker not found on #{options.path}"
49
+ red "Marker not found on #{config_path}"
52
50
  return
53
51
  end
54
52
  config.replace! ""
55
- green "Removed mark from #{options.path}"
53
+ green "Removed mark from #{config_path}"
56
54
  end
57
55
 
58
- private
59
- def hl
60
- @hl ||= HighLine.new
61
- end
56
+ no_tasks do
57
+ def hl
58
+ @hl ||= HighLine.new
59
+ end
60
+
61
+ def hosts
62
+ @hosts ||= Hosts.new(dotfile, options.aws_key).all
63
+ end
64
+
65
+ def dotfile
66
+ @dotfile ||= Dotfile.load(options.dotfile)
67
+ end
68
+
69
+ def config_path
70
+ options.path || dotfile['path'] || "#{$ENV['HOME']}/.ssh/config"
71
+ end
62
72
 
63
- [:red,:green,:yellow].each do |col|
64
- no_tasks do
73
+ [:red,:green,:yellow].each do |col|
65
74
  define_method(col) do |str|
66
75
  puts hl.color(str, col)
67
76
  end
@@ -0,0 +1,49 @@
1
+ require 'yaml'
2
+
3
+ module Ec2ssh
4
+ class AwsKeyNotFound < StandardError; end
5
+ class Dotfile
6
+ def initialize(config={})
7
+ @config = {
8
+ 'path' => "~/.ssh/config",
9
+ 'aws_keys' => {
10
+ 'default' => {
11
+ 'access_key_id' => ENV['AMAZON_ACCESS_KEY_ID'],
12
+ 'secret_access_key' => ENV['AMAZON_SECRET_ACCESS_KEY']
13
+ }
14
+ },
15
+ 'regions' => %w(ap-northeast-1),
16
+ }.merge(config)
17
+ end
18
+
19
+ def self.load(path)
20
+ new YAML.load(open(path).read)
21
+ end
22
+
23
+ def save(path)
24
+ open(path, 'w') {|f| f.write @config.to_yaml }
25
+ end
26
+
27
+ def self.update_or_create(path, config={})
28
+ dotfile = if File.exist?(path)
29
+ Dotfile.load(path)
30
+ else
31
+ new
32
+ end
33
+ dotfile.update(config)
34
+ dotfile.save(path)
35
+ end
36
+
37
+ def [](key)
38
+ @config[key]
39
+ end
40
+
41
+ def aws_key(keyname)
42
+ self['aws_keys'][keyname] or raise AwsKeyNotFound
43
+ end
44
+
45
+ def update(config)
46
+ @config = @config.merge config
47
+ end
48
+ end
49
+ end
data/lib/ec2ssh/hosts.rb CHANGED
@@ -1,35 +1,42 @@
1
+ require 'aws-sdk'
2
+ require 'ec2ssh/dotfile'
3
+
1
4
  module Ec2ssh
2
5
  class AwsEnvNotDefined < StandardError; end
3
6
  class Hosts
4
- def initialize
5
- @access_key_id = ENV["AMAZON_ACCESS_KEY_ID"].to_s
6
- @secret_access_key = ENV["AMAZON_SECRET_ACCESS_KEY"].to_s
7
- if @access_key_id.length == 0 || @secret_access_key.length == 0
8
- raise AwsEnvNotDefined
7
+ def initialize(dotfile, keyname)
8
+ @dotfile = dotfile
9
+ @ec2 = Hash.new do |h,region|
10
+ key = dotfile.aws_key(keyname)
11
+ raise AwsEnvNotDefined if key['access_key_id'].empty? || key['secret_access_key'].empty?
12
+ h[region] = AWS::EC2.new(
13
+ :ec2_endpoint => "#{region}.ec2.amazonaws.com",
14
+ :access_key_id => key['access_key_id'],
15
+ :secret_access_key => key['secret_access_key']
16
+ )
9
17
  end
10
18
  end
11
19
 
12
20
  def all
13
- ec2 = RightAws::Ec2.new(@access_key_id, @secret_access_key)
14
- regions = ec2.describe_regions
15
- regions.map do |region|
21
+ @dotfile['regions'].map {|region|
16
22
  process_region region
17
- end.flatten
23
+ }.flatten
18
24
  end
19
25
 
20
26
  private
21
- def process_region(region)
22
- ec2 = RightAws::Ec2.new(@access_key_id, @secret_access_key, :region => region)
23
- instance_names = {}
24
- ec2.describe_tags.each do |tag|
25
- next unless tag[:key]=='Name' && tag[:resource_type]=='instance'
26
- instance_names[tag[:resource_id]] = tag[:value]
27
+ def process_region(region)
28
+ instances(region).map {|instance|
29
+ name_tag = instance[:tag_set].find {|tag| tag[:key] == 'Name' }
30
+ next nil if name_tag.nil? || name_tag[:value].empty?
31
+ name = name_tag[:value]
32
+ dns_name = instance[:dns_name] or next nil
33
+ {:host => "#{name}.#{region}", :dns_name => dns_name}
34
+ }.compact.sort {|a,b| a[:host] <=> b[:host] }
35
+ end
36
+
37
+ def instances(region)
38
+ response = @ec2[region].instances.tagged('Name').filtered_request(:describe_instances)
39
+ response[:instance_index].values
27
40
  end
28
- ec2.describe_instances.map do |instance|
29
- instance_name = instance_names[instance[:aws_instance_id]] or next nil
30
- dns_name = instance[:dns_name] or next nil
31
- instance_name.empty? || dns_name.empty? ? nil : {:host => "#{instance_name}.#{region}", :dns_name => dns_name}
32
- end.compact
33
- end
34
41
  end
35
42
  end
@@ -1,7 +1,7 @@
1
1
  require 'pathname'
2
2
 
3
3
  module Ec2ssh
4
- class Config
4
+ class SshConfig
5
5
  HEADER = "### EC2SSH BEGIN ###"
6
6
  FOOTER = "### EC2SSH END ###"
7
7
 
@@ -43,7 +43,7 @@ module Ec2ssh
43
43
  #{HEADER}
44
44
  # Generated by ec2ssh http://github.com/mirakui/ec2ssh
45
45
  # DO NOT edit this block!
46
- # Updated #{Time.now}
46
+ # Updated #{Time.now.iso8601}
47
47
  #{text}
48
48
  #{FOOTER}
49
49
  END
@@ -1,3 +1,3 @@
1
1
  module Ec2ssh
2
- VERSION = '1.0.3'
2
+ VERSION = '2.0.0'
3
3
  end
data/lib/ec2ssh.rb CHANGED
@@ -1,5 +1,2 @@
1
1
  module Ec2ssh
2
- autoload :CLI, "ec2ssh/cli"
3
- autoload :Config, "ec2ssh/config"
4
- autoload :Hosts, "ec2ssh/hosts"
5
2
  end
@@ -0,0 +1,129 @@
1
+ require 'spec_helper'
2
+ require 'ec2ssh/cli'
3
+ require 'ec2ssh/dotfile'
4
+
5
+ describe Ec2ssh::CLI do
6
+ before(:all) do
7
+ Ec2ssh::Hosts.tap do |cls|
8
+ cls.class_eval do
9
+ def all
10
+ [
11
+ {:host => 'db-01', :dns_name => 'ec2-1-1-1-1.ap-northeast-1.ec2.amazonaws.com'},
12
+ {:host => 'db-02', :dns_name => 'ec2-1-1-1-2.ap-northeast-1.ec2.amazonaws.com'},
13
+ ]
14
+ end
15
+ end
16
+ end
17
+ end
18
+ let(:cli) { described_class }
19
+ let(:ssh_config_path) do
20
+ path = tmp_dir.join('ssh_config')
21
+ path.open('w') {|f| f.write <<-END }
22
+ Host foo.bar.com
23
+ HostName 1.2.3.4
24
+ END
25
+ path
26
+ end
27
+ let(:ssh_config_string) { ssh_config_path.read }
28
+ let(:dotfile_path) do
29
+ tmp_dir.join('dot.ec2ssh')
30
+ end
31
+
32
+ around do |example|
33
+ tz = ENV['TZ']
34
+ ENV['TZ'] = 'UTC'
35
+ Timecop.freeze(Time.local(2013,1,1,0,0,0)) { example.call }
36
+ ENV['TZ'] = 'tz'
37
+ end
38
+
39
+ subject { ssh_config_string }
40
+
41
+ describe '#init' do
42
+ before do
43
+ silence(:stdout) { cli.start %W[init --path #{ssh_config_path} --dotfile #{dotfile_path}] }
44
+ end
45
+
46
+ it { should eq(<<-END) }
47
+ Host foo.bar.com
48
+ HostName 1.2.3.4
49
+ ### EC2SSH BEGIN ###
50
+ # Generated by ec2ssh http://github.com/mirakui/ec2ssh
51
+ # DO NOT edit this block!
52
+ # Updated 2013-01-01T00:00:00+00:00
53
+
54
+ ### EC2SSH END ###
55
+ END
56
+ end
57
+
58
+ describe '#update' do
59
+ before do
60
+ silence(:stdout) do
61
+ cli.start %W[init --path #{ssh_config_path} --dotfile #{dotfile_path}]
62
+ cli.start %W[update --path #{ssh_config_path} --dotfile #{dotfile_path}]
63
+ end
64
+ end
65
+
66
+ it { should eq(<<-END) }
67
+ Host foo.bar.com
68
+ HostName 1.2.3.4
69
+ ### EC2SSH BEGIN ###
70
+ # Generated by ec2ssh http://github.com/mirakui/ec2ssh
71
+ # DO NOT edit this block!
72
+ # Updated 2013-01-01T00:00:00+00:00
73
+ Host db-01
74
+ HostName ec2-1-1-1-1.ap-northeast-1.ec2.amazonaws.com
75
+ Host db-02
76
+ HostName ec2-1-1-1-2.ap-northeast-1.ec2.amazonaws.com
77
+
78
+ ### EC2SSH END ###
79
+ END
80
+ end
81
+
82
+ describe '#update with aws-keys option' do
83
+ before do
84
+ silence(:stdout) do
85
+ cli.start %W[init --path #{ssh_config_path} --dotfile #{dotfile_path}]
86
+ end
87
+ dotfile = Ec2ssh::Dotfile.load(dotfile_path)
88
+ dotfile['aws_keys']['key1'] = {
89
+ 'access_key_id' => 'ACCESS_KEY_ID',
90
+ 'secret_access_key' => 'SECRET_ACCESS_KEY'
91
+ }
92
+ @output = capture(:stdout) do
93
+ cli.start %W[update --path #{ssh_config_path} --dotfile #{dotfile_path} --aws-key #{keyname}]
94
+ end
95
+ end
96
+
97
+ subject { @output }
98
+
99
+ context do
100
+ let(:keyname) { 'default' }
101
+ it { should =~ /Updated 2 hosts/ }
102
+ end
103
+
104
+ context do
105
+ let(:keyname) { 'key1' }
106
+ it { should =~ /Updated 2 hosts/ }
107
+ end
108
+
109
+ context do
110
+ let(:keyname) { 'key2' }
111
+ it { should_not =~ /^Updated 2 hosts/ }
112
+ end
113
+ end
114
+
115
+ describe '#remove' do
116
+ before do
117
+ silence(:stdout) do
118
+ cli.start %W[init --path #{ssh_config_path} --dotfile #{dotfile_path}]
119
+ cli.start %W[update --path #{ssh_config_path} --dotfile #{dotfile_path}]
120
+ cli.start %W[remove --path #{ssh_config_path} --dotfile #{dotfile_path}]
121
+ end
122
+ end
123
+
124
+ it { should eq(<<-END) }
125
+ Host foo.bar.com
126
+ HostName 1.2.3.4
127
+ END
128
+ end
129
+ end
@@ -0,0 +1,37 @@
1
+ require 'bundler/setup'
2
+ Bundler.require
3
+
4
+ require 'webmock/rspec'
5
+ require 'pathname'
6
+ require 'stringio'
7
+
8
+ RSpec.configure do |config|
9
+ def capture(stream)
10
+ begin
11
+ stream = stream.to_s
12
+ eval "$#{stream} = StringIO.new"
13
+ yield
14
+ result = eval("$#{stream}").string
15
+ ensure
16
+ eval("$#{stream} = #{stream.upcase}")
17
+ end
18
+
19
+ result
20
+ end
21
+
22
+ def base_dir
23
+ Pathname('../..').expand_path(__FILE__)
24
+ end
25
+
26
+ def tmp_dir
27
+ base_dir.join('tmp')
28
+ end
29
+
30
+ alias :silence :capture
31
+
32
+ config.before(:all) do
33
+ unless tmp_dir.directory?
34
+ tmp_dir.mkdir
35
+ end
36
+ end
37
+ end
metadata CHANGED
@@ -1,21 +1,21 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ec2ssh
3
3
  version: !ruby/object:Gem::Version
4
- hash: 17
4
+ hash: 15
5
5
  prerelease:
6
6
  segments:
7
- - 1
7
+ - 2
8
8
  - 0
9
- - 3
10
- version: 1.0.3
9
+ - 0
10
+ version: 2.0.0
11
11
  platform: ruby
12
12
  authors:
13
- - mirakui
13
+ - Issei Naruta
14
14
  autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2013-02-12 00:00:00 Z
18
+ date: 2013-03-11 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: thor
@@ -49,24 +49,23 @@ dependencies:
49
49
  type: :runtime
50
50
  version_requirements: *id002
51
51
  - !ruby/object:Gem::Dependency
52
- name: ktheory-right_aws
52
+ name: aws-sdk
53
53
  prerelease: false
54
54
  requirement: &id003 !ruby/object:Gem::Requirement
55
55
  none: false
56
56
  requirements:
57
57
  - - ~>
58
58
  - !ruby/object:Gem::Version
59
- hash: 9
59
+ hash: 31
60
60
  segments:
61
- - 2
62
- - 0
63
- - 3
64
- version: 2.0.3
61
+ - 1
62
+ - 8
63
+ version: "1.8"
65
64
  type: :runtime
66
65
  version_requirements: *id003
67
- description: A ssh_config manager for AWS EC2
66
+ description: ec2ssh is a ssh_config manager for AWS EC2
68
67
  email:
69
- - mirakui@tsuyabu.in
68
+ - mimitako@gmail.com
70
69
  executables:
71
70
  - ec2ssh
72
71
  extensions: []
@@ -75,16 +74,25 @@ extra_rdoc_files: []
75
74
 
76
75
  files:
77
76
  - .gitignore
77
+ - .rspec
78
+ - .rvmrc
79
+ - .travis.yml
80
+ - ChangeLog.md
78
81
  - Gemfile
79
82
  - Gemfile.lock
80
- - README.rdoc
83
+ - Guardfile
84
+ - MIT-LICENSE
85
+ - README.md
81
86
  - bin/ec2ssh
82
87
  - ec2ssh.gemspec
83
88
  - lib/ec2ssh.rb
84
89
  - lib/ec2ssh/cli.rb
85
- - lib/ec2ssh/config.rb
90
+ - lib/ec2ssh/dotfile.rb
86
91
  - lib/ec2ssh/hosts.rb
92
+ - lib/ec2ssh/ssh_config.rb
87
93
  - lib/ec2ssh/version.rb
94
+ - spec/lib/ec2ssh/cli_spec.rb
95
+ - spec/spec_helper.rb
88
96
  homepage: http://github.com/mirakui/ec2ssh
89
97
  licenses: []
90
98
 
@@ -114,9 +122,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
114
122
  requirements: []
115
123
 
116
124
  rubyforge_project: ec2ssh
117
- rubygems_version: 1.8.24
125
+ rubygems_version: 1.8.15
118
126
  signing_key:
119
127
  specification_version: 3
120
128
  summary: A ssh_config manager for AWS EC2
121
- test_files: []
122
-
129
+ test_files:
130
+ - spec/lib/ec2ssh/cli_spec.rb
131
+ - spec/spec_helper.rb
data/README.rdoc DELETED
@@ -1,48 +0,0 @@
1
- == Introduction
2
- ec2ssh is a ssh_config manager for amazonaws ec2.
3
- <tt>ec2ssh</tt> command adds <tt>Host</tt> descriptions to ssh_config (~/.ssh/config default). 'Name' tag of instances are used as <tt>Host</tt> descriptions.
4
- == How to use
5
- 1. Set 'Name' tag to your instances
6
- eg. Tag 'app-server-1' as 'Name' to an instance i-xxxxx in us-west-1 region.
7
- 2. install ec2ssh
8
- gem install ec2ssh
9
- 3. Set environment variables "AMAZON_ACCESS_KEY_ID" and "AMAZON_SECRET_ACCESS_KEY"
10
- export AMAZON_ACCESS_KEY_ID="..."
11
- export AMAZON_SECRET_ACCESS_KEY="..."
12
- 4. execute <tt>ec2ssh</tt> init and <tt>update</tt>
13
- ec2ssh init
14
- ec2ssh update
15
- Then host-names of your instances are generated and wrote to .ssh/config
16
- 5. And you can ssh to your instances with your tagged name.
17
- ssh user@app-server-1.us-west-1
18
- == Commands
19
- ec2ssh help [TASK] # Describe available tasks or one specific task
20
- ec2ssh init # Add ec2ssh mark to ssh_config
21
- ec2ssh update # Update ec2 hosts list in ssh_config
22
- ec2ssh remove # Remove ec2ssh mark from ssh_config
23
- Each command can be used <tt>--path</tt> option to set ssh_config path. The default is "~/.ssh/config"
24
- ec2ssh init --path=/path/to/ssh_config
25
- == ssh_config and mark lines
26
- <tt>ec2ssh init</tt> command inserts mark lines your <tt>.ssh/config</tt> such as:
27
- ### EC2SSH BEGIN ###
28
- # Generated by ec2ssh http://github.com/mirakui/ec2ssh
29
- # DO NOT edit this block!
30
- # Updated Sun Dec 05 00:00:14 +0900 2010
31
- ### EC2SSH END ###
32
- <tt>ec2ssh update</tt> command inserts 'Host' descriptions between 'BEGIN' line and 'END' line.
33
- ### EC2SSH BEGIN ###
34
- # Generated by ec2ssh http://github.com/mirakui/ec2ssh
35
- # DO NOT edit this block!
36
- # Updated Sun Dec 05 00:00:14 +0900 2010
37
- Host app-server-1.us-west-1
38
- HostName ec2-xxx-xxx-xxx-xxx.us-west-1.compute.amazonaws.com
39
- Host db-server-1.ap-southeast-1
40
- HostName ec2-xxx-xxx-xxx-xxx.ap-southeast-1.compute.amazonaws.com
41
- :
42
- :
43
- ### EC2SSH END ###
44
- <tt>ec2ssh remove</tt> command removes the mark lines.
45
- == Notice
46
- <tt>ec2ssh</tt> command updates your <tt>.ssh/config</tt> file default. You should make a backup of it.
47
- == License
48
- ec2ssh is released under the MIT license.