awsssh 2.1.0 → 2.1.1
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.
- checksums.yaml +8 -8
- data/README.md +32 -22
- data/awsssh.gemspec +4 -3
- data/bin/awsssh +1 -1
- data/lib/awsssh.rb +132 -148
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YTMzY2U5MjNjMDU2ZDlmNGMyN2E3MDcxNThhMzA5OGY4OTRjMzRmZg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
Y2NhM2I3NGY0ZTk1OTYxODFkMDhhMWUwM2QzZTgwZDNhMzhiOTI3OQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZDQyYjY1MjBiNDBmZmIwZjRjNjYzM2JlNGVkMzM4ZWUyMGQxZTYzMWVjNGJm
|
10
|
+
OTA2N2JjNDAyZTI1YTQ0ZGVkYjZlMGQwOGQxMzRhNDliYmM4ZTY1NDg0N2I0
|
11
|
+
ZDMyYzVmMDRmMzRkNmJhMzk4ZWJkNTVmMjY1MjY3ZTcyNmRmOWU=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MzY5YmYzZjc2Mjk3NDA0MjBjNTgyM2M3ZTY4MDRhODk1MzYwY2U4ZmRhNzQw
|
14
|
+
NzAwNDgyM2Q5YjJlNmVhOTZlNGY4MzFhNzkzMDM5NDA0Njg1ZThhZDY4ZDQ3
|
15
|
+
M2M3YmY2ZjRlN2ZlNDU5MTljZGNkYzEyZmI1ODE4ZGNlZTBkYzc=
|
data/README.md
CHANGED
@@ -1,43 +1,53 @@
|
|
1
1
|
# AWSSSH
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
Mit hilfe dieses Gems kann man sich auf alle (bekannten) AWS EC2 Instancen verbinden die man durch seine Configurationen erreichen darf.
|
4
|
+
Momentan ist das beschränkt auf EC2 Instancen, die durch OpsWorks verwaltet werden.
|
5
5
|
|
6
|
-
|
7
|
-
Hostname ec2-54-194-243-71.eu-west-1.compute.amazonaws.com```
|
8
|
-
|
9
|
-
da ein Aufruf von `$ ssh sihl-live1` dann aber die einstellung ignoriert der umweg über dieses script.
|
6
|
+
Da sich die IP und der Public DNS der Server bei jedem Neustart ändern kann fragt dieses Gem immer bei AWS nach der aktuellen IP/DNS Name.
|
10
7
|
|
11
8
|
## Installation
|
12
9
|
|
13
|
-
|
14
|
-
|
15
|
-
|
10
|
+
Mitlerweile ist aus `awsssh` ein richtiges gem geworden.
|
11
|
+
|
12
|
+
1. `gem install awsssh`
|
16
13
|
|
17
14
|
### Configurationen
|
18
|
-
1.
|
19
|
-
|
20
|
-
3. Die Konfigurationsdateien müssen den Namen `aws_config_<kundenname>` heißen.
|
15
|
+
1. Die Konfigurationsdateien müssen unter `/Users/<username>/.aws/` liegen. Wenn dem nicht so ist muss es eine Umgebungsvariable geben, die den Pfad zu den Configurationsdateien beinhaltet: `export ENV['AWSSSH_CONFIG_DIR']=/path/to/configs/`
|
16
|
+
3. Die Konfigurationsdateien müssen den Namen `aws_config_<kundenname>` haben. Wenn dem nicht so ist muss es eine Umgebungsvariable geben, die den Anfang der Configurationsdateien beinhaltet: `export ENV['AWSSSH_CONFIG_FILE']=awsconf_`
|
21
17
|
|
22
18
|
## Aufruf
|
23
19
|
|
24
|
-
`awsssh HOST`
|
20
|
+
`awsssh -s HOST`
|
25
21
|
|
26
22
|
**Beispiel**<br>
|
27
|
-
`awsssh
|
23
|
+
`awsssh -s kunde-live-1`
|
28
24
|
|
29
25
|
## Hilfe
|
30
26
|
|
31
|
-
`awsssh
|
27
|
+
`awsssh help`<br>
|
32
28
|
Zeigt die Hilfe an
|
33
29
|
|
34
|
-
##
|
30
|
+
## Kontakt
|
35
31
|
|
36
|
-
|
37
|
-
`README.md`: diese README<br>
|
38
|
-
`Rakefile`: für die installation<br>
|
39
|
-
`awsssh.rb`: Erstellt die verbidnung (Programmlogik)<br>
|
32
|
+
Sebastian Thiele (@sethiele)
|
40
33
|
|
41
|
-
##
|
34
|
+
## Changelog
|
35
|
+
|
36
|
+
**2014-03-05** - v 2.1.1
|
37
|
+
* [enh] using thor as CLI Class
|
38
|
+
* **New connection call** call `awsssh -s SERVER`
|
39
|
+
* [enh] use a account for connections `awsssh -s SERVER -a ACCOUNT`
|
40
|
+
|
41
|
+
**2014-03-04** - v 2.1.0
|
42
|
+
* [enh] use AWS Ruby SDK
|
43
|
+
* [enh] use ENV variables to access configurations
|
44
|
+
|
45
|
+
**2014-02-27** - v 2.0.1 *the Ronald Fix*
|
46
|
+
* [code] Code optimization
|
47
|
+
* [enh] return a error message if config not found
|
48
|
+
|
49
|
+
**2014-02-14** - v 2.0.0
|
50
|
+
* [enh] first gem version
|
42
51
|
|
43
|
-
|
52
|
+
**earlier**
|
53
|
+
* Some experiences
|
data/awsssh.gemspec
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'awsssh'
|
3
|
-
s.version = '2.1.
|
4
|
-
s.date = '2014-
|
3
|
+
s.version = '2.1.1'
|
4
|
+
s.date = '2014-03-05'
|
5
5
|
s.summary = "Connects you with OpsWorks EC2"
|
6
|
-
s.description = "This will connects you with an
|
6
|
+
s.description = "This will connects you with an EC2 instace"
|
7
7
|
s.authors = ["Sebastian Thiele"]
|
8
8
|
s.email = [%w(Sebastian.Thiele infopark.de).join('@')]
|
9
9
|
s.license = "MIT"
|
@@ -15,4 +15,5 @@ Gem::Specification.new do |s|
|
|
15
15
|
s.add_runtime_dependency "net-ssh", "2.7.0"
|
16
16
|
s.add_runtime_dependency "inifile", "2.0.2"
|
17
17
|
s.add_runtime_dependency "aws-sdk", "1.35.0"
|
18
|
+
s.add_runtime_dependency "thor", "0.18.1"
|
18
19
|
end
|
data/bin/awsssh
CHANGED
data/lib/awsssh.rb
CHANGED
@@ -5,182 +5,166 @@ require 'json'
|
|
5
5
|
require "aws-sdk"
|
6
6
|
# require "pry"
|
7
7
|
require "inifile"
|
8
|
+
require "thor"
|
8
9
|
|
9
|
-
class Awsssh
|
10
|
+
class Awsssh < Thor
|
10
11
|
CONFIG_DIR = ENV['AWSSSH_CONFIG_DIR'] || "/Users/#{ENV['USER']}/.aws/"
|
11
12
|
CONF_FILE = ENV['AWSSSH_CONFIG_FILE'] || "aws_config_"
|
12
13
|
|
13
|
-
|
14
|
-
|
14
|
+
desc "-s SERVER [-a ACCOUNT]", "connect to a server"
|
15
|
+
option :server, :aliases => :s, :desc => "(required) The server name to connect with"
|
16
|
+
option :account, :aliases => :a, :desc => "Specify a account for a connection. Needet if the account don't came from the server name"
|
17
|
+
option :list_accounts, :type => :boolean, :desc => "List all Accounts"
|
18
|
+
option :list_servers, :desc => "List all Servers for a given Account"
|
19
|
+
def connect
|
20
|
+
if options[:server]
|
21
|
+
connecting(options[:server], options[:account])
|
22
|
+
elsif options[:list_accounts]
|
15
23
|
list_accounts
|
16
|
-
elsif
|
17
|
-
list_servers(
|
18
|
-
elsif
|
19
|
-
|
24
|
+
elsif options[:list_servers]
|
25
|
+
list_servers(options[:list_servers])
|
26
|
+
elsif options[:server]
|
27
|
+
connecting(options[:server], options[:account])
|
20
28
|
else
|
21
|
-
help
|
29
|
+
help "connect"
|
22
30
|
end
|
23
31
|
end
|
24
32
|
|
25
|
-
|
26
|
-
|
27
|
-
#
|
28
|
-
# * *Returns* :
|
29
|
-
# - [String]
|
30
|
-
# usage: awsssh [<instance-name>|parameters]
|
31
|
-
# <instance-name> Name of the instance
|
32
|
-
# parameters:
|
33
|
-
# --help This help
|
34
|
-
# --list-accounts List all known AWS Accounts
|
35
|
-
# --list-servers <account> List all Server for an AWS Account
|
36
|
-
|
37
|
-
def help
|
38
|
-
length = 30
|
39
|
-
puts "usage: awsssh [<instance-name>|parameters]"
|
40
|
-
printf "\t %-#{length}s Name of the instance\n", "<instance-name>"
|
41
|
-
puts "parameters:"
|
42
|
-
printf "\t %-#{length}s This help\n", "--help"
|
43
|
-
printf "\t %-#{length}s List all known AWS Accounts\n", "--list-accounts"
|
44
|
-
printf "\t %-#{length}s List all Server for an AWS Account\n", "--list-servers <account>"
|
33
|
+
def help(*args)
|
34
|
+
super("connect")
|
45
35
|
end
|
46
36
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
37
|
+
private
|
38
|
+
##
|
39
|
+
# List stacks for a account
|
40
|
+
#
|
41
|
+
# * *Args* :
|
42
|
+
# - +account+ -> Account name
|
43
|
+
#
|
44
|
+
# * *Returns* :
|
45
|
+
# - [Array] StackIDs
|
46
|
+
def list_stacks(account)
|
47
|
+
ow = awscfg(account)
|
48
|
+
stacks = ow.client.describe_stacks[:stacks]
|
49
|
+
stack_ids = []
|
50
|
+
stacks.each do |stack|
|
51
|
+
stack_ids << stack[:stack_id]
|
52
|
+
end
|
53
|
+
return stack_ids
|
63
54
|
end
|
64
|
-
return stack_ids
|
65
|
-
end
|
66
|
-
|
67
|
-
|
68
|
-
##
|
69
|
-
# Read Stack
|
70
|
-
#
|
71
|
-
# * *Args* :
|
72
|
-
# - +stackid+ -> Stack ID
|
73
|
-
# - +account+ -> Account name
|
74
|
-
#
|
75
|
-
# * *Returns* :
|
76
|
-
# - Stecks JSON
|
77
|
-
#
|
78
55
|
|
79
|
-
def read_stack(stackid, account)
|
80
|
-
ow = awscfg(account)
|
81
|
-
ow.client.describe_instances({:stack_id => stackid})
|
82
|
-
# JSON.parse(`aws opsworks describe-instances --stack-id #{stackid}`)
|
83
|
-
end
|
84
56
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
57
|
+
##
|
58
|
+
# Read Stack
|
59
|
+
#
|
60
|
+
# * *Args* :
|
61
|
+
# - +stackid+ -> Stack ID
|
62
|
+
# - +account+ -> Account name
|
63
|
+
#
|
64
|
+
# * *Returns* :
|
65
|
+
# - Stecks JSON
|
66
|
+
#
|
67
|
+
def read_stack(stackid, account)
|
68
|
+
ow = awscfg(account)
|
69
|
+
ow.client.describe_instances({:stack_id => stackid})
|
70
|
+
# JSON.parse(`aws opsworks describe-instances --stack-id #{stackid}`)
|
71
|
+
end
|
92
72
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
73
|
+
##
|
74
|
+
# Lists all AWS Accounts
|
75
|
+
#
|
76
|
+
# * *Returns* :
|
77
|
+
# - [String]
|
78
|
+
# This are the known AWS Accounts:
|
79
|
+
# - account
|
80
|
+
def list_accounts
|
81
|
+
length = 30
|
82
|
+
puts "This are the known AWS Accounts:"
|
83
|
+
config_files = Dir.entries(CONFIG_DIR)
|
84
|
+
config_files.each do |file|
|
85
|
+
if file[0,CONF_FILE.length] == CONF_FILE
|
86
|
+
file_part = file.split("_")
|
87
|
+
unless file_part.last.nil?
|
88
|
+
printf "\t- %-#{length}s\n", file_part[2]
|
89
|
+
end
|
102
90
|
end
|
103
91
|
end
|
104
92
|
end
|
105
|
-
end
|
106
|
-
|
107
|
-
##
|
108
|
-
# Server Name
|
109
|
-
#
|
110
|
-
# * *Args* :
|
111
|
-
# - +stack+ -> Stack as JSON
|
112
|
-
#
|
113
|
-
# * *Returns* :
|
114
|
-
# - [String]
|
115
|
-
# - <servername> (<status>)
|
116
93
|
|
117
|
-
|
118
|
-
|
119
|
-
|
94
|
+
##
|
95
|
+
# Server Name
|
96
|
+
#
|
97
|
+
# * *Args* :
|
98
|
+
# - +stack+ -> Stack as JSON
|
99
|
+
#
|
100
|
+
# * *Returns* :
|
101
|
+
# - [String]
|
102
|
+
# - <servername> (<status>)
|
103
|
+
def server_name(stack)
|
104
|
+
stack[:instances].each do |instance|
|
105
|
+
printf "\t- %-20s %s\n", instance[:hostname], instance[:status]
|
106
|
+
end
|
120
107
|
end
|
121
|
-
end
|
122
|
-
|
123
|
-
##
|
124
|
-
# List all Servers for a given AWS Account
|
125
|
-
#
|
126
|
-
# * *Args* :
|
127
|
-
# - +account+ -> AWS Account name
|
128
|
-
#
|
129
108
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
109
|
+
##
|
110
|
+
# List all Servers for a given AWS Account
|
111
|
+
#
|
112
|
+
# * *Args* :
|
113
|
+
# - +account+ -> AWS Account name
|
114
|
+
#
|
115
|
+
def list_servers(account)
|
116
|
+
stacks = list_stacks account
|
117
|
+
stacks.each do |stack_id|
|
118
|
+
stack = read_stack stack_id, account
|
119
|
+
server_name stack
|
120
|
+
end
|
135
121
|
end
|
136
|
-
end
|
137
122
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
123
|
+
##
|
124
|
+
# Establish the connection
|
125
|
+
#
|
126
|
+
# * *Args* :
|
127
|
+
# - +server+ -> Server name
|
128
|
+
#
|
129
|
+
def connecting(server, account=nil)
|
130
|
+
public_dns = nil
|
131
|
+
host = server.split("-")
|
132
|
+
ac = account || host[0]
|
133
|
+
stack_ids = list_stacks ac
|
134
|
+
stack_ids.each do |stack_id|
|
135
|
+
stack = read_stack(stack_id, ac)
|
136
|
+
stack.instances.each do |i|
|
137
|
+
if i[:hostname] == server
|
138
|
+
public_dns = i[:public_dns]
|
139
|
+
break
|
140
|
+
end
|
155
141
|
end
|
142
|
+
break unless public_dns.nil?
|
156
143
|
end
|
157
|
-
break unless public_dns.nil?
|
158
|
-
end
|
159
144
|
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
puts "Connecting to #{server} (#{public_dns})"
|
167
|
-
exec "ssh #{public_dns}"
|
145
|
+
if public_dns.nil?
|
146
|
+
puts "Server '#{server}' not found. Try ssh"
|
147
|
+
exec "ssh #{server}"
|
148
|
+
exit -1
|
149
|
+
end
|
168
150
|
|
169
|
-
|
151
|
+
puts "Connecting to #{server} (#{public_dns})"
|
152
|
+
exec "ssh #{public_dns}"
|
170
153
|
|
171
|
-
def awscfg(account)
|
172
|
-
if cnf = IniFile.load(CONFIG_DIR + CONF_FILE + account)['default']
|
173
|
-
return AWS::OpsWorks.new(
|
174
|
-
access_key_id: cnf['aws_access_key_id'],
|
175
|
-
secret_access_key: cnf['aws_secret_access_key'],
|
176
|
-
region: cnf['region']
|
177
|
-
)
|
178
|
-
else
|
179
|
-
puts "No config #{CONF_FILE}#{account} found"
|
180
|
-
exit -1
|
181
154
|
end
|
182
|
-
end
|
183
|
-
|
184
|
-
|
185
155
|
|
156
|
+
def awscfg(account)
|
157
|
+
if cnf = IniFile.load(CONFIG_DIR + CONF_FILE + account)
|
158
|
+
cnf = cnf['default']
|
159
|
+
return AWS::OpsWorks.new(
|
160
|
+
access_key_id: cnf['aws_access_key_id'],
|
161
|
+
secret_access_key: cnf['aws_secret_access_key'],
|
162
|
+
region: cnf['region']
|
163
|
+
)
|
164
|
+
else
|
165
|
+
puts "No config #{CONF_FILE}#{account} found. Maybe use -a to specify a account."
|
166
|
+
exit -1
|
167
|
+
end
|
168
|
+
end
|
169
|
+
default_task :connect
|
186
170
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: awsssh
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.
|
4
|
+
version: 2.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sebastian Thiele
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-03-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: net-ssh
|
@@ -52,7 +52,21 @@ dependencies:
|
|
52
52
|
- - '='
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 1.35.0
|
55
|
-
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: thor
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.18.1
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.18.1
|
69
|
+
description: This will connects you with an EC2 instace
|
56
70
|
email:
|
57
71
|
- Sebastian.Thiele@infopark.de
|
58
72
|
executables:
|