aws-ssh 1.0.1 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. checksums.yaml +5 -5
  2. data/bin/aws-ssh +34 -25
  3. data/bin/awssh +1 -0
  4. metadata +22 -10
  5. data/bin/awssh +0 -162
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 78ca737b88d4a338e7f18dfab077b2fe7948d1ba
4
- data.tar.gz: 3b14eb94c34a986a0afe5412e5167681ad599b93
2
+ SHA256:
3
+ metadata.gz: 95f7d7c849326eabeacf2f9e3010424fdae6d1791983070726fd371926e9a284
4
+ data.tar.gz: 87e154a952299dc9f7eb7cb46bb69114ed5e684643f1ad4e33cdf45e9fe3d015
5
5
  SHA512:
6
- metadata.gz: 7643046e0babf3bd28ee73ebc595148929dd14524aa02992c4b1e91c05f385d31b65521c43470181af647cb0082689eb8aada2567fe21f580a364064dcfbd78b
7
- data.tar.gz: fe55c550ecda8d8dfdd1577a06b1ca7a97becce04299218d6d332f95bf1708d4f251b02a2b5c686d4e6a1da3c0913ad01236672e885a58c824d9da719922d83a
6
+ metadata.gz: e0bc9261566eb918f77afab42fdf859b9a61261de226c913ab161dcf78f89213d83b01dc971770146280c2dc1f5354ffb4f00f032139f2b32234a9cedd4065bf
7
+ data.tar.gz: 03220f46695d3ee3c98781d046906532c0acc5e29f1b843dab914f9d392d78156975d0cc18eed34c07098cf5d22089ba71dd37b988f1244253f0bb92fa1bbe11
data/bin/aws-ssh CHANGED
@@ -1,16 +1,17 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require 'slop'
4
- require 'aws-sdk'
4
+ require 'aws-sdk-ec2'
5
5
  require 'yaml'
6
6
 
7
- module AWSSH
7
+ module AWSSSH
8
8
  class Runner
9
9
  DEFAULT_OPTIONS = {
10
10
  'user' => ENV['user'],
11
11
  'format' => 'ssh',
12
12
  'verbose' => false
13
13
  }
14
+ AWS_CONFIG_KEYS = [:profile, :region]
14
15
 
15
16
  attr_accessor :host_regex
16
17
 
@@ -23,43 +24,43 @@ module AWSSH
23
24
  shout "Options: #{cli.to_h.inspect}"
24
25
  shout "Defaults: #{defaults.inspect}"
25
26
 
26
- Aws.config.merge!(profile: cli[:profile], region: cli[:region])
27
+ Aws.config.merge!(cli.to_h.select { |key| AWS_CONFIG_KEYS.include?(key) })
27
28
 
28
- if cli['show-only']
29
- print_output
30
- else
31
- ssh!
32
- end
29
+ cli['show-only'] ? print_output : ssh!
33
30
  end
34
31
 
35
32
  def cli
36
33
  @cli ||= Slop.parse do |o|
37
34
  o.banner = <<-USAGE
38
- awssh - a tool that makes easy to ssh into AWS EC2 servers
35
+ aws-ssh - a tool that makes easy to ssh into AWS EC2 servers
39
36
 
40
- Usage: awssh [hostname regex]
37
+ Usage: aws-ssh [hostname regex]
41
38
 
42
39
  Examples:
43
- $ awssh prod.*app2
40
+ $ aws-ssh prod.*app2
44
41
  ... will SSH into the instance and you will see:
45
42
  user@prod-rails-app4~$
46
43
 
47
- $ awssh --show-only --stack qa -u worker
44
+ $ aws-ssh --show-only --stack qa -u worker
48
45
  ... will show all instances registered in QA stack of Opsworks
49
46
  ssh worker@10.20.30.40 => MyApp QA - qa-rails-app
50
47
  ssh worker@10.20.30.41 => MyApp QA - qa-sidekiq
51
48
 
52
49
  # All hosts in one-line (suitable for CSSH):
53
50
  worker@10.20.30.40 worker@10.20.30.41
51
+
52
+ The config file .aws-ssh is looked up in following directories:
53
+ ./ (current directory)
54
+ ~/ ($HOME directory)
54
55
  USAGE
55
56
 
56
57
  o.separator "Options:"
57
- o.string '-s', '--stack', 'stack name regex. E.g: `-s prod` will match "Production" stack name'
58
- o.string '-p', '--profile', 'AWS config profile name. Default: profile set in .awssh file', default: defaults['profile']
59
- o.string '-r', '--region', 'region. E.g: us-east-1. Default: region set in .awssh file', default: defaults['region']
60
- o.string '-u', '--user', 'SSH username to use. Default: user set in .awssh file or current machine user', default: defaults['user']
58
+ o.string '-s', '--stack', 'AWS OpsWorks Stack name regex. E.g: `-s prod` will match "Production" stack name'
59
+ o.string '-p', '--profile', 'AWS config profile name. Default: profile set in .aws-ssh file', default: defaults['profile']
60
+ o.string '-r', '--region', 'AWS region. E.g: us-east-1. Default: region set in .aws-ssh file', default: defaults['region']
61
+ o.string '-u', '--user', 'SSH username to use. Default: user set in .aws-ssh file or current machine user', default: defaults['user']
61
62
  o.bool '-so', '--show-only', 'Only show the matched hosts instead of ssh. Default: false', default: false
62
- o.bool '-cs', '--csensitive', 'Uses case-sensitive for regex matching. Default: false', default: false
63
+ o.bool '-cs', '--csensitive', 'Use case-sensitive for regex matching. Default: false', default: false
63
64
  o.bool '-v', '--verbose', 'Verbose mode. Default: false', default: false
64
65
  o.on '--help', 'Shows help' do
65
66
  puts o
@@ -69,16 +70,18 @@ Examples:
69
70
  end
70
71
 
71
72
  def ssh!
72
- if instances.size > 1
73
+ if instances.empty?
74
+ exit_error! "No hostname matched."
75
+ elsif instances.size > 1
73
76
  print_output
74
- exit_error! "\nMultiple hostnames matched. Please be more specific in hostnames regex or use the last output line to use CSSH.\n"
77
+ exit_error! "\nMultiple hostnames matched. Please be more specific in hostnames regex or use the last output line to use CSSH."
75
78
  end
76
79
  exec "ssh #{connection_string(instances.first)}"
77
80
  end
78
81
 
79
82
  def print_output
80
83
  instances.each do |i|
81
- puts "ssh #{connection_string(i)} \t => #{i.name}"
84
+ puts "ssh #{connection_string(i).ljust(30, ' ')} => #{i.name}"
82
85
  end
83
86
  puts "\n# All hosts in one-line (suitable for CSSH):"
84
87
  puts instances.map { |i| connection_string(i) }.join(' ')
@@ -90,8 +93,13 @@ Examples:
90
93
 
91
94
  def defaults
92
95
  @defaults ||= begin
93
- defaults = File.exist?('.awssh') ? YAML.load_file('.awssh') : {}
94
- DEFAULT_OPTIONS.merge(defaults)
96
+ if File.exist?('.awssh') || File.exist?("#{ENV['HOME']}/.awssh")
97
+ puts 'WARNING: please rename the config file .awssh to .aws-ssh'
98
+ exit(1)
99
+ end
100
+ defaults = YAML.load_file('.aws-ssh') if File.exist?('.aws-ssh')
101
+ defaults ||= YAML.load_file("#{ENV['HOME']}/.aws-ssh") if File.exist?("#{ENV['HOME']}/.aws-ssh")
102
+ DEFAULT_OPTIONS.merge(defaults) if defaults
95
103
  end
96
104
  end
97
105
 
@@ -105,6 +113,7 @@ Examples:
105
113
 
106
114
  def exit_error!(msg)
107
115
  $stderr.puts msg
116
+ $stderr.puts
108
117
  exit(1)
109
118
  end
110
119
 
@@ -140,8 +149,8 @@ Examples:
140
149
  next unless word_match?(instance.stack_name, stack_regex, case_sensitive)
141
150
  end
142
151
  if host_regex
143
- next unless word_match?(instance.hostname, host_regex, case_sensitive)
144
- next unless word_match?(instance.name, host_regex, case_sensitive)
152
+ next unless word_match?(instance.hostname, host_regex, case_sensitive) ||
153
+ word_match?(instance.name, host_regex, case_sensitive)
145
154
  end
146
155
 
147
156
  instance
@@ -159,4 +168,4 @@ Examples:
159
168
  end
160
169
  end
161
170
 
162
- AWSSH::Runner.new.run
171
+ AWSSSH::Runner.new.run
data/bin/awssh ADDED
@@ -0,0 +1 @@
1
+ bin/aws-ssh
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aws-ssh
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rafael Sales
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-18 00:00:00.000000000 Z
11
+ date: 2022-01-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: slop
@@ -25,31 +25,45 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '4'
27
27
  - !ruby/object:Gem::Dependency
28
- name: aws-sdk
28
+ name: aws-sdk-ec2
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '2'
33
+ version: '1'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '2'
40
+ version: '1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: nokogiri
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 1.11.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 1.11.0
41
55
  description: A tool that makes easy to ssh into AWS EC2 servers
42
56
  email:
43
57
  - rafaelcds@gmail.com
44
58
  executables:
45
- - awssh
46
59
  - aws-ssh
60
+ - awssh
47
61
  extensions: []
48
62
  extra_rdoc_files: []
49
63
  files:
50
64
  - bin/aws-ssh
51
65
  - bin/awssh
52
- homepage: https://github.com/buzzstarter/aws-ssh
66
+ homepage: https://github.com/rafaelsales/aws-ssh
53
67
  licenses:
54
68
  - MIT
55
69
  metadata: {}
@@ -68,10 +82,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
68
82
  - !ruby/object:Gem::Version
69
83
  version: '0'
70
84
  requirements: []
71
- rubyforge_project:
72
- rubygems_version: 2.4.3
85
+ rubygems_version: 3.0.3.1
73
86
  signing_key:
74
87
  specification_version: 4
75
88
  summary: A tool that makes easy to ssh into AWS EC2 servers
76
89
  test_files: []
77
- has_rdoc:
data/bin/awssh DELETED
@@ -1,162 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'slop'
4
- require 'aws-sdk'
5
- require 'yaml'
6
-
7
- module AWSSH
8
- class Runner
9
- DEFAULT_OPTIONS = {
10
- 'user' => ENV['user'],
11
- 'format' => 'ssh',
12
- 'verbose' => false
13
- }
14
-
15
- attr_accessor :host_regex
16
-
17
- def run
18
- self.host_regex = cli.args.first
19
- exit_error! 'AWS Region not set' unless cli[:region]
20
- exit_error! 'AWS Profile not set' unless cli[:profile]
21
-
22
- shout "Hostname: #{host_regex}"
23
- shout "Options: #{cli.to_h.inspect}"
24
- shout "Defaults: #{defaults.inspect}"
25
-
26
- Aws.config.merge!(profile: cli[:profile], region: cli[:region])
27
-
28
- if cli['show-only']
29
- print_output
30
- else
31
- ssh!
32
- end
33
- end
34
-
35
- def cli
36
- @cli ||= Slop.parse do |o|
37
- o.banner = <<-USAGE
38
- awssh - a tool that makes easy to ssh into AWS EC2 servers
39
-
40
- Usage: awssh [hostname regex]
41
-
42
- Examples:
43
- $ awssh prod.*app2
44
- ... will SSH into the instance and you will see:
45
- user@prod-rails-app4~$
46
-
47
- $ awssh --show-only --stack qa -u worker
48
- ... will show all instances registered in QA stack of Opsworks
49
- ssh worker@10.20.30.40 => MyApp QA - qa-rails-app
50
- ssh worker@10.20.30.41 => MyApp QA - qa-sidekiq
51
-
52
- # All hosts in one-line (suitable for CSSH):
53
- worker@10.20.30.40 worker@10.20.30.41
54
- USAGE
55
-
56
- o.separator "Options:"
57
- o.string '-s', '--stack', 'stack name regex. E.g: `-s prod` will match "Production" stack name'
58
- o.string '-p', '--profile', 'AWS config profile name. Default: profile set in .awssh file', default: defaults['profile']
59
- o.string '-r', '--region', 'region. E.g: us-east-1. Default: region set in .awssh file', default: defaults['region']
60
- o.string '-u', '--user', 'SSH username to use. Default: user set in .awssh file or current machine user', default: defaults['user']
61
- o.bool '-so', '--show-only', 'Only show the matched hosts instead of ssh. Default: false', default: false
62
- o.bool '-cs', '--csensitive', 'Uses case-sensitive for regex matching. Default: false', default: false
63
- o.bool '-v', '--verbose', 'Verbose mode. Default: false', default: false
64
- o.on '--help', 'Shows help' do
65
- puts o
66
- exit
67
- end
68
- end
69
- end
70
-
71
- def ssh!
72
- if instances.size > 1
73
- print_output
74
- exit_error! "\nMultiple hostnames matched. Please be more specific in hostnames regex or use the last output line to use CSSH.\n"
75
- end
76
- exec "ssh #{connection_string(instances.first)}"
77
- end
78
-
79
- def print_output
80
- instances.each do |i|
81
- puts "ssh #{connection_string(i)} \t => #{i.name}"
82
- end
83
- puts "\n# All hosts in one-line (suitable for CSSH):"
84
- puts instances.map { |i| connection_string(i) }.join(' ')
85
- end
86
-
87
- def connection_string(instance)
88
- "#{cli[:user]}@#{instance.ip}"
89
- end
90
-
91
- def defaults
92
- @defaults ||= begin
93
- defaults = File.exist?('.awssh') ? YAML.load_file('.awssh') : {}
94
- DEFAULT_OPTIONS.merge(defaults)
95
- end
96
- end
97
-
98
- def instances
99
- @instances ||= AWSEC2.new.instances(host_regex, cli[:stack], cli[:csensitive]).select do |i|
100
- shout "Instance #{i.name} is not part of an Opsworks Stack" unless i.stack_name
101
- shout "Instance #{i.name} not running. Current state: #{i.state}" unless i.running?
102
- i.running?
103
- end
104
- end
105
-
106
- def exit_error!(msg)
107
- $stderr.puts msg
108
- exit(1)
109
- end
110
-
111
- def shout(msg)
112
- puts "[DEBUG] #{msg}" if cli.verbose?
113
- end
114
- end
115
-
116
- EC2Instance = Struct.new(:name, :hostname, :stack_name, :state, :ip) do
117
- def initialize(instance)
118
- name = extract_tag(instance, 'Name')
119
- hostname = extract_tag(instance, 'opsworks:instance')
120
- stack_name = extract_tag(instance, 'opsworks:stack')
121
-
122
- super(name, hostname, stack_name, instance.state.name, instance.public_ip_address)
123
- end
124
-
125
- def running?
126
- state == 'running'
127
- end
128
-
129
- def extract_tag(instance, tag)
130
- tag = instance.tags.find { |t| t.key == tag }
131
- tag ? tag.value : nil
132
- end
133
- end
134
-
135
- class AWSEC2
136
- def instances(host_regex, stack_regex, case_sensitive)
137
- ec2.describe_instances.reservations.map(&:instances).flatten.map do |instance_data|
138
- instance = EC2Instance.new(instance_data)
139
- if stack_regex
140
- next unless word_match?(instance.stack_name, stack_regex, case_sensitive)
141
- end
142
- if host_regex
143
- next unless word_match?(instance.hostname, host_regex, case_sensitive)
144
- next unless word_match?(instance.name, host_regex, case_sensitive)
145
- end
146
-
147
- instance
148
- end.compact.sort_by(&:name)
149
- end
150
-
151
- def ec2
152
- @ec2 ||= Aws::EC2::Client.new
153
- end
154
-
155
- def word_match?(value, regex_str, case_sensitive)
156
- regex = case_sensitive ? /#{regex_str}/ : /#{regex_str}/i
157
- !!(value =~ regex)
158
- end
159
- end
160
- end
161
-
162
- AWSSH::Runner.new.run