awsssh 2.1.0 → 2.1.1

Sign up to get free protection for your applications and to get access to all the features.
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: