ec2ssh 2.0.3 → 2.0.4

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/ChangeLog.md CHANGED
@@ -1,4 +1,8 @@
1
1
  # Change Log
2
+ ## 2.0.4
3
+
4
+ * Store multiple hosts info per `--aws_key` (#8)
5
+
2
6
  ## 2.0.3
3
7
 
4
8
  * Fix bug: Fix undefined method `empty?` when aws keys not set
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ec2ssh (2.0.0)
4
+ ec2ssh (2.0.3)
5
5
  aws-sdk (~> 1.8)
6
6
  highline (~> 1.6)
7
7
  thor (~> 0.14.6)
@@ -10,7 +10,7 @@ GEM
10
10
  remote: https://rubygems.org/
11
11
  specs:
12
12
  addressable (2.3.2)
13
- aws-sdk (1.8.1.3)
13
+ aws-sdk (1.8.5)
14
14
  json (~> 1.4)
15
15
  nokogiri (>= 1.4.4)
16
16
  uuidtools (~> 2.1)
@@ -26,12 +26,12 @@ GEM
26
26
  guard-rspec (2.4.0)
27
27
  guard (>= 1.1)
28
28
  rspec (~> 2.11)
29
- highline (1.6.15)
29
+ highline (1.6.17)
30
30
  json (1.7.7)
31
31
  listen (0.7.2)
32
32
  lumberjack (1.0.2)
33
33
  method_source (0.8.1)
34
- nokogiri (1.5.6)
34
+ nokogiri (1.5.9)
35
35
  pry (0.9.12)
36
36
  coderay (~> 1.0.5)
37
37
  method_source (~> 0.8)
data/lib/ec2ssh/cli.rb CHANGED
@@ -25,16 +25,16 @@ module Ec2ssh
25
25
  desc "update", "Update ec2 hosts list in ssh_config"
26
26
  method_option :aws_key, :banner => 'aws key name', :default => 'default'
27
27
  def update
28
- config = SshConfig.new(config_path)
28
+ config = SshConfig.new(config_path, options.aws_key)
29
29
  unless config.mark_exist?
30
30
  red "Marker not found on #{config_path}"
31
31
  red "Execute '#{$0} init --path=/path/to/ssh_config' first!"
32
32
  return
33
33
  end
34
- config_str = config.wrap(hosts.map{|h|<<-END}.join)
35
- Host #{h[:host]}
36
- HostName #{h[:dns_name]}
37
- END
34
+
35
+ config.parse!
36
+ sections = merge_sections(config)
37
+ config_str = config.wrap(sections.join("\n"))
38
38
  config.replace! config_str
39
39
  yellow config_str
40
40
  green "Updated #{hosts.size} hosts on #{config_path}"
@@ -81,6 +81,32 @@ Host #{h[:host]}
81
81
  puts hl.color(str, col)
82
82
  end
83
83
  end
84
+
85
+ def merge_sections(config)
86
+ section_str = hosts.map { |h| <<-END }.join
87
+ Host #{h[:host]}
88
+ HostName #{h[:dns_name]}
89
+ END
90
+ config.sections[options.aws_key] ||= SshConfig::Section.new(
91
+ options.aws_key,
92
+ section_str
93
+ )
94
+
95
+ sections = config.sections.values.map do |section|
96
+ if (
97
+ # section is matched
98
+ (section.name == options.aws_key) ||
99
+
100
+ # for backward compatibility
101
+ (config.sections.size == 1 && options.aws_key != 'default')
102
+ )
103
+ section.name = options.aws_key
104
+ section.replace!(section_str)
105
+ end
106
+
107
+ section.to_s
108
+ end
109
+ end
84
110
  end
85
111
  end
86
112
  end
@@ -6,10 +6,31 @@ module Ec2ssh
6
6
  HEADER = "### EC2SSH BEGIN ###"
7
7
  FOOTER = "### EC2SSH END ###"
8
8
 
9
- attr_reader :path
9
+ attr_reader :path, :sections
10
10
 
11
- def initialize(path=nil)
12
- @path = Pathname(path || "#{ENV['HOME']}/.ssh/config")
11
+ def initialize(path=nil, aws_key='default')
12
+ @path = Pathname(path || "#{ENV['HOME']}/.ssh/config")
13
+ @aws_key = aws_key
14
+ @sections = {}
15
+ end
16
+
17
+ def parse!
18
+ return unless mark_exist?
19
+ ec2_config = config_src.match(/#{HEADER}\n(.*)#{FOOTER}/m).to_s
20
+
21
+ current_section = 'default'
22
+ @sections[current_section] = Section.new('default')
23
+
24
+ ec2_config.split(/\n+/).each do |line|
25
+ if line =~ /#{Section::HEADER} (.+)/
26
+ current_section = $1
27
+ @sections[current_section] ||= Section.new(current_section)
28
+ elsif line =~ /^#/ # ignore
29
+ elsif line =~ /^$/ # ignore
30
+ else
31
+ @sections[current_section].append("#{line}\n")
32
+ end
33
+ end
13
34
  end
14
35
 
15
36
  def append_mark!
@@ -49,5 +70,36 @@ module Ec2ssh
49
70
  #{FOOTER}
50
71
  END
51
72
  end
73
+
74
+ class Section
75
+ HEADER = "# section:"
76
+
77
+ attr_accessor :name
78
+ attr_reader :text
79
+
80
+ def initialize(name, text = '')
81
+ @name = name
82
+ @text = text
83
+ end
84
+
85
+ def append(text)
86
+ @text << text
87
+ end
88
+
89
+ def replace!(text)
90
+ @text = text
91
+ end
92
+
93
+ def to_s
94
+ if text.empty?
95
+ ""
96
+ else
97
+ <<-EOS
98
+ #{HEADER} #{@name}
99
+ #{@text}
100
+ EOS
101
+ end
102
+ end
103
+ end
52
104
  end
53
105
  end
@@ -1,3 +1,3 @@
1
1
  module Ec2ssh
2
- VERSION = '2.0.3'
2
+ VERSION = '2.0.4'
3
3
  end
@@ -8,8 +8,8 @@ describe Ec2ssh::CLI do
8
8
  cls.class_eval do
9
9
  def all
10
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'},
11
+ {:host => 'db-01.ap-northeast-1', :dns_name => 'ec2-1-1-1-1.ap-northeast-1.ec2.amazonaws.com'},
12
+ {:host => 'db-02.ap-northeast-1', :dns_name => 'ec2-1-1-1-2.ap-northeast-1.ec2.amazonaws.com'},
13
13
  ]
14
14
  end
15
15
  end
@@ -73,11 +73,13 @@ Host foo.bar.com
73
73
  # Generated by ec2ssh http://github.com/mirakui/ec2ssh
74
74
  # DO NOT edit this block!
75
75
  # Updated 2013-01-01T00:00:00+00:00
76
- Host db-01
76
+ # section: default
77
+ Host db-01.ap-northeast-1
77
78
  HostName ec2-1-1-1-1.ap-northeast-1.ec2.amazonaws.com
78
- Host db-02
79
+ Host db-02.ap-northeast-1
79
80
  HostName ec2-1-1-1-2.ap-northeast-1.ec2.amazonaws.com
80
81
 
82
+
81
83
  ### EC2SSH END ###
82
84
  END
83
85
  end
@@ -102,11 +104,13 @@ END
102
104
  context do
103
105
  let(:keyname) { 'default' }
104
106
  it { should =~ /Updated 2 hosts/ }
107
+ it { should =~ /# section: default/ }
105
108
  end
106
109
 
107
110
  context do
108
111
  let(:keyname) { 'key1' }
109
112
  it { should =~ /Updated 2 hosts/ }
113
+ it { should =~ /# section: key1/ }
110
114
  end
111
115
 
112
116
  context do
@@ -115,6 +119,41 @@ END
115
119
  end
116
120
  end
117
121
 
122
+ describe '#update with aws-keys option in multiple times' do
123
+ before do
124
+ silence(:stdout) do
125
+ cli.start %W[init --path #{ssh_config_path} --dotfile #{dotfile_path}]
126
+ end
127
+ dotfile = Ec2ssh::Dotfile.load(dotfile_path)
128
+ dotfile['aws_keys']['key1'] = {
129
+ 'access_key_id' => 'ACCESS_KEY_ID',
130
+ 'secret_access_key' => 'SECRET_ACCESS_KEY'
131
+ }
132
+ dotfile['aws_keys']['key2'] = {
133
+ 'access_key_id' => 'ACCESS_KEY_ID',
134
+ 'secret_access_key' => 'SECRET_ACCESS_KEY'
135
+ }
136
+ @output = capture(:stdout) do
137
+ cli.start %W[update --path #{ssh_config_path} --dotfile #{dotfile_path} --aws-key key1]
138
+ cli.start %W[update --path #{ssh_config_path} --dotfile #{dotfile_path} --aws-key #{keyname}]
139
+ end
140
+ end
141
+
142
+ subject { @output }
143
+
144
+ context 'when updated by the same key' do
145
+ let(:keyname) { 'key1' }
146
+ it { subject.should =~ /# section: key1/ }
147
+ it { subject.should_not =~ /# section: key2/ }
148
+ end
149
+
150
+ context 'when updated by different key' do
151
+ let(:keyname) { 'key2' }
152
+ it { subject.should =~ /# section: key1/ }
153
+ it { subject.should =~ /# section: key2/ }
154
+ end
155
+ end
156
+
118
157
  describe '#remove' do
119
158
  before do
120
159
  silence(:stdout) do
@@ -0,0 +1,125 @@
1
+ require 'spec_helper'
2
+ require 'ec2ssh/ssh_config'
3
+
4
+ describe Ec2ssh::SshConfig do
5
+ describe '#parse!' do
6
+ context 'when no section exists' do
7
+ let(:path) { path = tmp_dir.join('ssh_config') }
8
+ subject { described_class.new(path) }
9
+
10
+ before do
11
+ path.open('w') {|f| f.write <<-END }
12
+ ### EC2SSH BEGIN ###
13
+ # Generated by ec2ssh http://github.com/mirakui/ec2ssh
14
+ # DO NOT edit this block!
15
+ # Updated 2013-01-01T00:00:00+00:00
16
+ Host db-01.ap-northeast-1
17
+ HostName ec2-1-1-1-1.ap-northeast-1.ec2.amazonaws.com
18
+
19
+ ### EC2SSH END ###
20
+ END
21
+ subject.parse!
22
+ end
23
+
24
+ it { expect(subject.sections.size).to be == 1 }
25
+ it { expect(subject.sections['default']).to be_an_instance_of Ec2ssh::SshConfig::Section }
26
+ end
27
+
28
+ context 'when a section exists' do
29
+ let(:path) { path = tmp_dir.join('ssh_config') }
30
+ subject { described_class.new(path) }
31
+
32
+ before do
33
+ path = tmp_dir.join('ssh_config')
34
+ path.open('w') {|f| f.write <<-END }
35
+ Host foo.bar.com
36
+ HostName 1.2.3.4
37
+ ### EC2SSH BEGIN ###
38
+ # Generated by ec2ssh http://github.com/mirakui/ec2ssh
39
+ # DO NOT edit this block!
40
+ # Updated 2013-01-01T00:00:00+00:00
41
+ # section: foo
42
+ Host db-01.ap-northeast-1
43
+ HostName ec2-1-1-1-1.ap-northeast-1.ec2.amazonaws.com
44
+
45
+ ### EC2SSH END ###
46
+ END
47
+ subject.parse!
48
+ end
49
+
50
+ it { expect(subject.sections.size).to be == 2 }
51
+ it { expect(subject.sections['foo']).to be_an_instance_of Ec2ssh::SshConfig::Section }
52
+ end
53
+
54
+ context 'when multiple sections exist' do
55
+ let(:path) { path = tmp_dir.join('ssh_config') }
56
+ subject { described_class.new(path) }
57
+
58
+ before do
59
+ path = tmp_dir.join('ssh_config')
60
+ path.open('w') {|f| f.write <<-END }
61
+ Host foo.bar.com
62
+ HostName 1.2.3.4
63
+ ### EC2SSH BEGIN ###
64
+ # Generated by ec2ssh http://github.com/mirakui/ec2ssh
65
+ # DO NOT edit this block!
66
+ # Updated 2013-01-01T00:00:00+00:00
67
+ # section: foo
68
+ Host db-01.ap-northeast-1
69
+ HostName ec2-1-1-1-1.ap-northeast-1.ec2.amazonaws.com
70
+ # section: bar
71
+ Host db-02.ap-northeast-1
72
+ HostName ec2-1-1-1-2.ap-northeast-1.ec2.amazonaws.com
73
+
74
+ ### EC2SSH END ###
75
+ END
76
+ subject.parse!
77
+ end
78
+
79
+ it { expect(subject.sections.size).to be == 3 }
80
+ it { expect(subject.sections['foo']).to be_an_instance_of Ec2ssh::SshConfig::Section }
81
+ it { expect(subject.sections['bar']).to be_an_instance_of Ec2ssh::SshConfig::Section }
82
+ end
83
+ end
84
+
85
+ describe Ec2ssh::SshConfig::Section do
86
+ describe '#append' do
87
+ let(:section) { Ec2ssh::SshConfig::Section.new('test') }
88
+ before { section.append('foo') }
89
+
90
+ it { expect(section.text).to eq 'foo' }
91
+ end
92
+
93
+ describe '#replace' do
94
+ let(:section) { Ec2ssh::SshConfig::Section.new('test', 'foo') }
95
+ before { section.replace!('bar') }
96
+
97
+ it { expect(section.text).to eq 'bar' }
98
+ end
99
+
100
+ describe '#to_s' do
101
+ context 'when no text given' do
102
+ let(:section) { Ec2ssh::SshConfig::Section.new('test') }
103
+
104
+ it { expect(section.to_s).to eq '' }
105
+ end
106
+
107
+ context 'when empty text given' do
108
+ let(:section) { Ec2ssh::SshConfig::Section.new('test', '') }
109
+
110
+ it { expect(section.to_s).to eq '' }
111
+ end
112
+
113
+ context 'when some text given' do
114
+ let(:section) { Ec2ssh::SshConfig::Section.new('test', 'foo') }
115
+
116
+ it {
117
+ expect(section.to_s).to eq <<EOS
118
+ # section: test
119
+ foo
120
+ EOS
121
+ }
122
+ end
123
+ end
124
+ end
125
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ec2ssh
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.3
4
+ version: 2.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-07 00:00:00.000000000 Z
12
+ date: 2013-04-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: thor
@@ -86,6 +86,7 @@ files:
86
86
  - lib/ec2ssh/ssh_config.rb
87
87
  - lib/ec2ssh/version.rb
88
88
  - spec/lib/ec2ssh/cli_spec.rb
89
+ - spec/lib/ec2ssh/ssh_config_spec.rb
89
90
  - spec/spec_helper.rb
90
91
  homepage: http://github.com/mirakui/ec2ssh
91
92
  licenses: []
@@ -113,5 +114,6 @@ specification_version: 3
113
114
  summary: A ssh_config manager for AWS EC2
114
115
  test_files:
115
116
  - spec/lib/ec2ssh/cli_spec.rb
117
+ - spec/lib/ec2ssh/ssh_config_spec.rb
116
118
  - spec/spec_helper.rb
117
119
  has_rdoc: