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.
Files changed (6) hide show
  1. checksums.yaml +8 -8
  2. data/README.md +32 -22
  3. data/awsssh.gemspec +4 -3
  4. data/bin/awsssh +1 -1
  5. data/lib/awsssh.rb +132 -148
  6. metadata +17 -3
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MDM3MTZlNjg5OWM0YzMyMjkzMzdjYzQzNTAyOWJkODkzZjA5YzAxNQ==
4
+ YTMzY2U5MjNjMDU2ZDlmNGMyN2E3MDcxNThhMzA5OGY4OTRjMzRmZg==
5
5
  data.tar.gz: !binary |-
6
- MGE1NjAxYWIzZDE2YTRjMjlhNWY2YzM5OGM2ZDFjODhjMjE3OWQwZg==
6
+ Y2NhM2I3NGY0ZTk1OTYxODFkMDhhMWUwM2QzZTgwZDNhMzhiOTI3OQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MmQ4MjRkNGUzNjUxMjVhNmQxNjllYzQ3Yjg5NGExZDRjYzA2OTQ4YzA4MTVl
10
- OTE0OTliYWE1MDQwODJhMzRlNGQ1ZTYxZjEzN2YzODI5OTE5YmQ0YjhjZDhm
11
- NmU5M2Y3ODIxOWY5MTM5Mzc3MWUxNDFhOGM5OGQwM2RlM2Q4ZmM=
9
+ ZDQyYjY1MjBiNDBmZmIwZjRjNjYzM2JlNGVkMzM4ZWUyMGQxZTYzMWVjNGJm
10
+ OTA2N2JjNDAyZTI1YTQ0ZGVkYjZlMGQwOGQxMzRhNDliYmM4ZTY1NDg0N2I0
11
+ ZDMyYzVmMDRmMzRkNmJhMzk4ZWJkNTVmMjY1MjY3ZTcyNmRmOWU=
12
12
  data.tar.gz: !binary |-
13
- OGE5NzdiM2FhYjE3MWIyOGI3OGNhZGZjNWVjNGI2M2JiM2ZlYzU5NzFiM2U2
14
- ZGUwOGY5ZTg3YzM1Y2U1MWJkYWZkYjE3YjM5ZmE3OWMwMTFlNDg5ZjRjMGM3
15
- Y2YwZTM2NmMxODczNDg0YjQyOGFhMDRhYTQ3OTA5YTkwNzVmNDc=
13
+ MzY5YmYzZjc2Mjk3NDA0MjBjNTgyM2M3ZTY4MDRhODk1MzYwY2U4ZmRhNzQw
14
+ NzAwNDgyM2Q5YjJlNmVhOTZlNGY4MzFhNzkzMDM5NDA0Njg1ZThhZDY4ZDQ3
15
+ M2M3YmY2ZjRlN2ZlNDU5MTljZGNkYzEyZmI1ODE4ZGNlZTBkYzc=
data/README.md CHANGED
@@ -1,43 +1,53 @@
1
1
  # AWSSSH
2
2
 
3
- Im [Mitarbeiterhandbuch](https://employeeapps.infopark.de/manual/03_Security) sind SSH-Configurationen vorgegeben, mit denen man alle AWS-EC2s abfängt.
4
- Da ich aber nicht jedesmal nachschauen will, wie der Public-DNS Name einer instance ist, will ich das weiterhin in meiner ssh config pflegen und habe dort einträge wie:
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
- ```Host sihl-live1
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
- 1. Herunterladen
14
- 2. an die Stelle verschieben, an der es am ende liegen soll
15
- 3. wenn bei 2. nicht /usr/* angegeben ist `rake install` ausführen. Das erstellt ein Link in `/usr/local/bin`
10
+ Mitlerweile ist aus `awsssh` ein richtiges gem geworden.
11
+
12
+ 1. `gem install awsssh`
16
13
 
17
14
  ### Configurationen
18
- 1. Das zum Umschalten der AWS Config muss das script über `awscfg <kundenname>` aufrufbar sein.
19
- 2. Die Konfigurationsdateien müssen unter `/Users/<username>/.aws/` liegen.
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 sihl-live1`
23
+ `awsssh -s kunde-live-1`
28
24
 
29
25
  ## Hilfe
30
26
 
31
- `awsssh --help`<br>
27
+ `awsssh help`<br>
32
28
  Zeigt die Hilfe an
33
29
 
34
- ## Inhalte
30
+ ## Kontakt
35
31
 
36
- `Gemfile`: zum installieren aller benötigten gems<br>
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
- ## Kontakt
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
- Sebastian Thiele <[mailto:sebastian.thiele@infopark.de]>
52
+ **earlier**
53
+ * Some experiences
@@ -1,9 +1,9 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'awsssh'
3
- s.version = '2.1.0'
4
- s.date = '2014-02-27'
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 EC3 instace"
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
@@ -2,4 +2,4 @@
2
2
 
3
3
  require "awsssh"
4
4
 
5
- Awsssh.new.do_start()
5
+ Awsssh.start(ARGV)
@@ -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
- def do_start
14
- if ARGV[0] == "--list-accounts"
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 ARGV[0] == "--list-servers" && !ARGV[1].nil?
17
- list_servers(ARGV[1])
18
- elsif !ARGV[0].nil? && ARGV[0][0,2] != "--"
19
- connect ARGV[0]
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
- # Renders the Help
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
- # List stacks for a account
50
- #
51
- # * *Args* :
52
- # - +account+ -> Account name
53
- #
54
- # * *Returns* :
55
- # - [Array] StackIDs
56
-
57
- def list_stacks(account)
58
- ow = awscfg(account)
59
- stacks = ow.client.describe_stacks[:stacks]
60
- stack_ids = []
61
- stacks.each do |stack|
62
- stack_ids << stack[:stack_id]
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
- # Lists all AWS Accounts
87
- #
88
- # * *Returns* :
89
- # - [String]
90
- # This are the known AWS Accounts:
91
- # - account
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
- def list_accounts
94
- length = 30
95
- puts "This are the known AWS Accounts:"
96
- config_files = Dir.entries(CONFIG_DIR)
97
- config_files.each do |file|
98
- if file[0,CONF_FILE.length] == CONF_FILE
99
- file_part = file.split("_")
100
- unless file_part.last.nil?
101
- printf "\t- %-#{length}s\n", file_part[2]
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
- def server_name(stack)
118
- stack[:instances].each do |instance|
119
- printf "\t- %-20s %s\n", instance[:hostname], instance[:status]
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
- def list_servers(account)
131
- stacks = list_stacks account
132
- stacks.each do |stack_id|
133
- stack = read_stack stack_id, account
134
- server_name stack
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
- # Establish the connection
140
- #
141
- # * *Args* :
142
- # - +server+ -> Server name
143
- #
144
-
145
- def connect(server)
146
- host = server.split("-")
147
- public_dns = nil
148
- stack_ids = list_stacks host[0]
149
- stack_ids.each do |stack_id|
150
- stack = read_stack(stack_id, host[0])
151
- stack.instances.each do |i|
152
- if i[:hostname] == server
153
- public_dns = i[:public_dns]
154
- break
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
- if public_dns.nil?
161
- puts "Server '#{server}' not found. Try ssh"
162
- exec "ssh #{server}"
163
- exit -1
164
- end
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
- end
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.0
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-02-27 00:00:00.000000000 Z
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
- description: This will connects you with an EC3 instace
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: