ec2ssh 1.0.3 → 2.0.0

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/.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.