opsicle 0.9.0 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/opsicle/commands/ssh.rb +22 -7
- data/lib/opsicle/version.rb +1 -1
- data/spec/opsicle/commands/ssh_spec.rb +40 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4e1ae90db98327bdf981f1d0fc69b7488d091a68
|
4
|
+
data.tar.gz: c591e7f2567cfc9f5eb15e4f83762b29a7b54c08
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bbebdecd44667c6f4533f3466eb2674afd75456d35f07d6c6e4cf80f134ed8866e0bcc81f8405b7ab1446a592addec81b631ad2ea0770ba634a98643e96c4049
|
7
|
+
data.tar.gz: f5f7997debb53669e4ee64010a763448c16ffc282ddbe69daabe0479068370e51bfc56fe401e36b16ff5075a1a0dfc626da9b5d44db5d811cb59937e22490a5b
|
data/lib/opsicle/commands/ssh.rb
CHANGED
@@ -7,21 +7,18 @@ module Opsicle
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def execute(options={})
|
10
|
+
|
10
11
|
if instances.length == 1
|
11
12
|
choice = 1
|
12
13
|
else
|
13
14
|
Output.say "Choose an Opsworks instance:"
|
14
|
-
instances.
|
15
|
-
Output.say "#{
|
15
|
+
instances.each_with_index do |instance, index|
|
16
|
+
Output.say "#{index+1}) #{instance[:hostname]}"
|
16
17
|
end
|
17
18
|
choice = Output.ask("? ", Integer) { |q| q.in = 1..instances.length }
|
18
19
|
end
|
19
20
|
|
20
|
-
|
21
|
-
ssh_command = " \"#{options[:"ssh-cmd"].gsub(/'/){ %q(\') }}\"" if options[:"ssh-cmd"] #escape single quotes
|
22
|
-
ssh_options = "#{options[:"ssh-opts"]} " if options[:"ssh-opts"]
|
23
|
-
|
24
|
-
command = "ssh #{ssh_options}#{ssh_username}@#{instance_ip}#{ssh_command}"
|
21
|
+
command = ssh_command(instances[choice-1], options)
|
25
22
|
|
26
23
|
Output.say_verbose "Executing shell command: #{command}"
|
27
24
|
system(command)
|
@@ -33,8 +30,26 @@ module Opsicle
|
|
33
30
|
.select { |instance| instance[:status].to_s == 'online'}
|
34
31
|
end
|
35
32
|
|
33
|
+
def public_ips
|
34
|
+
instances.map{|instance| instance[:elastic_ip] || instance[:public_ip] }.compact
|
35
|
+
end
|
36
|
+
|
36
37
|
def ssh_username
|
37
38
|
client.api_call(:describe_my_user_profile)[:user_profile][:ssh_username]
|
38
39
|
end
|
40
|
+
|
41
|
+
def ssh_command(instance, options={})
|
42
|
+
ssh_command = " \"#{options[:"ssh-cmd"].gsub(/'/){ %q(\') }}\"" if options[:"ssh-cmd"] #escape single quotes
|
43
|
+
ssh_options = options[:"ssh-opts"] ? "#{options[:"ssh-opts"]} " : ""
|
44
|
+
if instance_ip = instance[:elastic_ip] || instance[:public_ip]
|
45
|
+
ssh_string = "#{ssh_username}@#{instance_ip}"
|
46
|
+
else
|
47
|
+
ssh_string = "#{ssh_username}@#{public_ips.sample} ssh #{instance[:private_ip]}"
|
48
|
+
ssh_options.concat('-A -t ')
|
49
|
+
end
|
50
|
+
|
51
|
+
"ssh #{ssh_options}#{ssh_string}#{ssh_command}"
|
52
|
+
end
|
53
|
+
|
39
54
|
end
|
40
55
|
end
|
data/lib/opsicle/version.rb
CHANGED
@@ -68,6 +68,14 @@ module Opsicle
|
|
68
68
|
subject.execute({ :"ssh-opts" => '-p 234', :"ssh-cmd" => 'cd /srv/www'})
|
69
69
|
end
|
70
70
|
|
71
|
+
it "executes sshs through an instance with a public_ip to get to one with a private_ip" do
|
72
|
+
allow(subject).to receive(:instances) {[
|
73
|
+
{ hostname: "host1", elastic_ip: "123.123.123.123" },
|
74
|
+
{ hostname: "host2", private_ip: "789.789.789.789" }
|
75
|
+
]}
|
76
|
+
expect(subject).to receive(:system).with("ssh -A -t mrderpyman2014@123.123.123.123 ssh 789.789.789.789")
|
77
|
+
subject.execute
|
78
|
+
end
|
71
79
|
end
|
72
80
|
|
73
81
|
context "#client" do
|
@@ -94,5 +102,37 @@ module Opsicle
|
|
94
102
|
end
|
95
103
|
end
|
96
104
|
|
105
|
+
context "#public_ips" do
|
106
|
+
it "selects all EIPs and then public_ip on the stack" do
|
107
|
+
allow(subject).to receive(:instances) {[
|
108
|
+
{ hostname: "host1", elastic_ip: "123.123.123.123", public_ip: "123.345.567.789"},
|
109
|
+
{ hostname: "host2", public_ip: "456.456.456.456" },
|
110
|
+
{ hostname: "host2", private_ip: "789.789.789.789" },
|
111
|
+
]}
|
112
|
+
expect(subject.public_ips).to eq(["123.123.123.123","456.456.456.456"])
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
context "#ssh_command" do
|
117
|
+
before do
|
118
|
+
allow(subject).to receive(:ssh_username) {"mrderpyman2014"}
|
119
|
+
allow(subject).to receive(:instances) {[
|
120
|
+
{ hostname: "host1", elastic_ip: "123.123.123.123" },
|
121
|
+
{ hostname: "host2", private_ip: "789.789.789.789" }
|
122
|
+
]}
|
123
|
+
end
|
124
|
+
it "creates the proper ssh_command for an instance with a public/elastic ip" do
|
125
|
+
expect(subject.ssh_command({elastic_ip: "123.123.123.123" })).to eq("ssh mrderpyman2014@123.123.123.123")
|
126
|
+
end
|
127
|
+
it "creates the proper ssh_command for an instance with a private ip" do
|
128
|
+
expect(subject.ssh_command({private_ip: "789.789.789.789" })).to eq("ssh -A -t mrderpyman2014@123.123.123.123 ssh 789.789.789.789")
|
129
|
+
end
|
130
|
+
it "properly adds ssh options to the ssh_command for an isntance with a public ip" do
|
131
|
+
expect(subject.ssh_command({elastic_ip: "123.123.123.123" }, { :"ssh-opts" => "-c"})).to eq("ssh -c mrderpyman2014@123.123.123.123")
|
132
|
+
end
|
133
|
+
it "properly adds ssh options to the ssh_command for an isntance with a private ip" do
|
134
|
+
expect(subject.ssh_command({private_ip: "789.789.789.789"}, { :"ssh-opts" => "-c"} )).to eq("ssh -c -A -t mrderpyman2014@123.123.123.123 ssh 789.789.789.789")
|
135
|
+
end
|
136
|
+
end
|
97
137
|
end
|
98
138
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opsicle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Fleener
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-01-
|
12
|
+
date: 2015-01-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: aws-sdk
|
@@ -249,7 +249,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
249
249
|
version: '0'
|
250
250
|
requirements: []
|
251
251
|
rubyforge_project:
|
252
|
-
rubygems_version: 2.
|
252
|
+
rubygems_version: 2.2.2
|
253
253
|
signing_key:
|
254
254
|
specification_version: 4
|
255
255
|
summary: An opsworks specific abstraction on top of the aws sdk
|