awshark 1.2.0 → 1.3.0
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 +4 -4
- data/.rubocop.yml +1 -1
- data/CHANGELOG.md +3 -0
- data/lib/awshark/class_options.rb +26 -0
- data/lib/awshark/cli.rb +11 -12
- data/lib/awshark/{subcommands/cloud_formation.rb → cloud_formation/subcommand.rb} +3 -3
- data/lib/awshark/concerns/logging.rb +9 -0
- data/lib/awshark/ec2/configuration.rb +14 -0
- data/lib/awshark/ec2/instance.rb +1 -1
- data/lib/awshark/ec2/manager.rb +2 -6
- data/lib/awshark/ec2/security_group.rb +76 -0
- data/lib/awshark/ec2/security_rule.rb +42 -0
- data/lib/awshark/ec2/subcommand.rb +107 -0
- data/lib/awshark/{subcommands/ecs.rb → ecs/subcommand.rb} +3 -3
- data/lib/awshark/{subcommands/rds.rb → rds/subcommand.rb} +3 -3
- data/lib/awshark/{subcommands/s3.rb → s3/subcommand.rb} +3 -3
- data/lib/awshark/version.rb +1 -1
- data/lib/awshark.rb +4 -0
- metadata +12 -8
- data/lib/awshark/subcommands/class_options.rb +0 -28
- data/lib/awshark/subcommands/ec2.rb +0 -38
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8f014eaddd54562cad6064bc0b28a9fde800b7144f3be26e4af11f02a99d1f13
|
4
|
+
data.tar.gz: 258b5c71b20180623ca66646d4081c38d8c14e590a1b2a2773193523423dc614
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 42970eec188f9fe6a4f561a2d42b01387b08c98f26ee93e0352d83f1fda165f119ae09909fbbb62c80e5380ca259a8d667bb46cf416e742db333051da4891204
|
7
|
+
data.tar.gz: ecf2602e7bb5cf37ebd508d3bb95d44eff004214f38bb6fa19475ee38d6b094093c6572c17acb3d48ca59d6b018a39129019d450e80aa7a6db4d84d0cc4b7c17
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Awshark
|
4
|
+
module ClassOptions
|
5
|
+
def process_class_options
|
6
|
+
command = current_command_chain.last
|
7
|
+
cli_options = options.merge(parent_options || {}).symbolize_keys
|
8
|
+
|
9
|
+
if cli_options[:help]
|
10
|
+
respond_to?(command) ? help(command) : help
|
11
|
+
exit(0)
|
12
|
+
end
|
13
|
+
|
14
|
+
setup_aws_credentials(options)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def setup_aws_credentials(options)
|
20
|
+
profile_resolver = ProfileResolver.new(options)
|
21
|
+
|
22
|
+
::Aws.config[:region] = profile_resolver.region
|
23
|
+
::Aws.config[:credentials] = profile_resolver.credentials
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/awshark/cli.rb
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'awshark/profile_resolver'
|
4
|
-
|
5
|
-
require 'awshark/
|
6
|
-
require 'awshark/
|
7
|
-
require 'awshark/
|
8
|
-
require 'awshark/
|
9
|
-
require 'awshark/
|
10
|
-
require 'awshark/subcommands/s3'
|
4
|
+
require 'awshark/class_options'
|
5
|
+
require 'awshark/cloud_formation/subcommand'
|
6
|
+
require 'awshark/ec2/subcommand'
|
7
|
+
require 'awshark/ecs/subcommand'
|
8
|
+
require 'awshark/rds/subcommand'
|
9
|
+
require 'awshark/s3/subcommand'
|
11
10
|
|
12
11
|
module Awshark
|
13
12
|
class Cli < Thor
|
@@ -18,19 +17,19 @@ module Awshark
|
|
18
17
|
class_option :help, type: :boolean, desc: 'Prints this help'
|
19
18
|
|
20
19
|
desc 'cf COMMAND', 'Run CloudFormation command'
|
21
|
-
subcommand 'cf', Awshark::
|
20
|
+
subcommand 'cf', Awshark::CloudFormation::Subcommand
|
22
21
|
|
23
22
|
desc 'ec2 COMMAND', 'Run EC2 command'
|
24
|
-
subcommand 'ec2', Awshark::
|
23
|
+
subcommand 'ec2', Awshark::Ec2::Subcommand
|
25
24
|
|
26
25
|
desc 'ecs COMMAND', 'Run ECS command'
|
27
|
-
subcommand 'ecs', Awshark::
|
26
|
+
subcommand 'ecs', Awshark::Ecs::Subcommand
|
28
27
|
|
29
28
|
desc 'rds COMMAND', 'Run RDS command'
|
30
|
-
subcommand 'rds', Awshark::
|
29
|
+
subcommand 'rds', Awshark::Rds::Subcommand
|
31
30
|
|
32
31
|
desc 's3 COMMAND', 'Run CloudFormation command'
|
33
|
-
subcommand 's3', Awshark::
|
32
|
+
subcommand 's3', Awshark::S3::Subcommand
|
34
33
|
|
35
34
|
desc 'version', 'Displays current version of AwsShark'
|
36
35
|
long_desc <<-LONGDESC
|
@@ -14,9 +14,9 @@ require 'awshark/cloud_formation/stack_events'
|
|
14
14
|
require 'awshark/cloud_formation/template'
|
15
15
|
|
16
16
|
module Awshark
|
17
|
-
module
|
18
|
-
class
|
19
|
-
include Awshark::
|
17
|
+
module CloudFormation
|
18
|
+
class Subcommand < Thor
|
19
|
+
include Awshark::ClassOptions
|
20
20
|
|
21
21
|
class_option :bucket, type: :string, desc: 'S3 bucket for template'
|
22
22
|
class_option :iam, type: :boolean, desc: 'Needs IAM capabilities'
|
data/lib/awshark/ec2/instance.rb
CHANGED
data/lib/awshark/ec2/manager.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Awshark
|
4
|
-
module
|
4
|
+
module Ec2
|
5
5
|
class Manager
|
6
6
|
def all_instances
|
7
7
|
return @all_instances if defined?(@all_instances)
|
@@ -29,11 +29,7 @@ module Awshark
|
|
29
29
|
private
|
30
30
|
|
31
31
|
def client
|
32
|
-
|
33
|
-
end
|
34
|
-
|
35
|
-
def region
|
36
|
-
Aws.config[:region] || 'eu-central-1'
|
32
|
+
Awshark.config.ec2.client
|
37
33
|
end
|
38
34
|
end
|
39
35
|
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Awshark
|
4
|
+
module Ec2
|
5
|
+
class SecurityGroup
|
6
|
+
include Logging
|
7
|
+
|
8
|
+
attr_reader :security_group_id, :username
|
9
|
+
|
10
|
+
def initialize(id:, username:)
|
11
|
+
validate!(:id, id)
|
12
|
+
validate!(:username, username)
|
13
|
+
|
14
|
+
@security_group_id = id
|
15
|
+
@username = username
|
16
|
+
end
|
17
|
+
|
18
|
+
def authorize(ip:, ports:)
|
19
|
+
ports.each do |port|
|
20
|
+
ip_rule = SecurityRule.new(
|
21
|
+
ip: ip,
|
22
|
+
from_port: port,
|
23
|
+
to_port: port,
|
24
|
+
description: username
|
25
|
+
)
|
26
|
+
client.authorize_security_group_ingress(
|
27
|
+
group_id: security_group_id,
|
28
|
+
ip_permissions: [ip_rule.to_hash]
|
29
|
+
)
|
30
|
+
logger.info "Created ingress rule in for #{ip_rule.cidr_ip}, port #{port}."
|
31
|
+
rescue Aws::EC2::Errors::InvalidPermissionDuplicate
|
32
|
+
logger.warn "An ingress rule for #{ip} and port #{port} exists."
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def unauthorize
|
37
|
+
return if my_ingress_rules.empty?
|
38
|
+
|
39
|
+
client.revoke_security_group_ingress(
|
40
|
+
group_id: security_group_id,
|
41
|
+
ip_permissions: my_ingress_rules
|
42
|
+
)
|
43
|
+
logger.info "Removed all ingress rules for #{username}."
|
44
|
+
end
|
45
|
+
|
46
|
+
def my_ingress_rules
|
47
|
+
return @my_ingress_rules if defined?(@my_ingress_rules)
|
48
|
+
|
49
|
+
response = client.describe_security_groups(group_ids: [security_group_id])
|
50
|
+
return [] if response.security_groups.empty?
|
51
|
+
|
52
|
+
security_group = response.security_groups.first
|
53
|
+
security_rules = security_group.ip_permissions.map do |ip_permission|
|
54
|
+
SecurityRule.new(ip_permission)
|
55
|
+
end
|
56
|
+
|
57
|
+
@my_ingress_rules = security_rules.map do |rule|
|
58
|
+
rule.ip_ranges.keep_if { |ip_range| ip_range.description == username }
|
59
|
+
rule.ip_ranges.any? ? rule.to_hash : nil
|
60
|
+
end
|
61
|
+
|
62
|
+
@my_ingress_rules.compact!
|
63
|
+
end
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
def client
|
68
|
+
Awshark.config.ec2.client
|
69
|
+
end
|
70
|
+
|
71
|
+
def validate!(name, value)
|
72
|
+
raise ArgumentError, "Argument #{name} cannot be empty" if value.blank?
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Awshark
|
4
|
+
module Ec2
|
5
|
+
class SecurityRule
|
6
|
+
attr_reader :ip_protocol, :ip_ranges, :from_port, :to_port
|
7
|
+
|
8
|
+
def initialize(args)
|
9
|
+
if args.is_a?(Aws::EC2::Types::IpPermission)
|
10
|
+
@ip_protocol = args.ip_protocol
|
11
|
+
@ip_ranges = args.ip_ranges
|
12
|
+
@from_port = args.from_port
|
13
|
+
@to_port = args.to_port
|
14
|
+
else
|
15
|
+
ip = args.fetch(:ip)
|
16
|
+
description = args.fetch(:description)
|
17
|
+
@ip_protocol = args.fetch(:ip_protocol, 'tcp')
|
18
|
+
@ip_ranges = [OpenStruct.new({ cidr_ip: "#{ip}/32", description: description })]
|
19
|
+
@from_port = args.fetch(:from_port)
|
20
|
+
@to_port = args.fetch(:to_port)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def cidr_ip
|
25
|
+
ip_ranges[0].cidr_ip
|
26
|
+
end
|
27
|
+
|
28
|
+
def description
|
29
|
+
ip_ranges[0].description
|
30
|
+
end
|
31
|
+
|
32
|
+
def to_hash
|
33
|
+
{
|
34
|
+
ip_protocol: ip_protocol,
|
35
|
+
from_port: from_port,
|
36
|
+
to_port: to_port,
|
37
|
+
ip_ranges: ip_ranges.map(&:to_h)
|
38
|
+
}
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'aws-sdk-ec2'
|
4
|
+
|
5
|
+
require 'awshark/ec2/instance'
|
6
|
+
require 'awshark/ec2/manager'
|
7
|
+
require 'awshark/ec2/security_group'
|
8
|
+
require 'awshark/ec2/security_rule'
|
9
|
+
|
10
|
+
module Awshark
|
11
|
+
module Ec2
|
12
|
+
class Subcommand < Thor
|
13
|
+
include Awshark::ClassOptions
|
14
|
+
|
15
|
+
desc 'list', 'List all EC2 instances'
|
16
|
+
long_desc <<-LONGDESC
|
17
|
+
List all EC2 instances in a region
|
18
|
+
|
19
|
+
Example:
|
20
|
+
awshark ec2 list STATE
|
21
|
+
|
22
|
+
LONGDESC
|
23
|
+
def list(state = 'running')
|
24
|
+
process_class_options
|
25
|
+
|
26
|
+
instances = manager.public_send("#{state}_instances")
|
27
|
+
instances = instances.sort_by(&:name)
|
28
|
+
|
29
|
+
instances.each do |i|
|
30
|
+
args = { name: i.name, type: i.type, public_dns: i.public_dns_name, state: i.state }
|
31
|
+
printf "%-40<name>s %-12<type>s %-60<public_dns>s %<state>s\n", args
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
desc 'authorize', 'Authorises your IP to access AWS'
|
36
|
+
long_desc <<-LONGDESC
|
37
|
+
Adds your IP address to the security group to allow direct access to the VPCs.
|
38
|
+
|
39
|
+
Example:
|
40
|
+
awshark ec2 authorize
|
41
|
+
|
42
|
+
LONGDESC
|
43
|
+
option :ports,
|
44
|
+
type: :string,
|
45
|
+
desc: 'Ports to register. Only uses ports from 1 to 65535.',
|
46
|
+
default: '443'
|
47
|
+
option :security_group,
|
48
|
+
type: :string,
|
49
|
+
required: true,
|
50
|
+
desc: 'Security group to allow access to.'
|
51
|
+
option :username,
|
52
|
+
type: :string,
|
53
|
+
desc: 'Ports to register. Only uses ports from 1 to 65535.'
|
54
|
+
def authorize
|
55
|
+
process_class_options
|
56
|
+
|
57
|
+
group = Ec2::SecurityGroup.new(id: security_group_id, username: username)
|
58
|
+
group.authorize(ip: my_ip, ports: ports)
|
59
|
+
end
|
60
|
+
|
61
|
+
desc 'unauthorize', 'Removes your IP from access to AWS'
|
62
|
+
long_desc <<-LONGDESC
|
63
|
+
Removes all your ingress rules from the home office security group in the VPCs.
|
64
|
+
|
65
|
+
Example:
|
66
|
+
awshark ec2 unauthorize
|
67
|
+
|
68
|
+
LONGDESC
|
69
|
+
option :security_group,
|
70
|
+
type: :string,
|
71
|
+
required: true,
|
72
|
+
desc: 'Security group to remove access from.'
|
73
|
+
option :username,
|
74
|
+
type: :string,
|
75
|
+
desc: 'Ports to register. Only uses ports from 1 to 65535.'
|
76
|
+
def unauthorize
|
77
|
+
process_class_options
|
78
|
+
|
79
|
+
group = Ec2::SecurityGroup.new(id: security_group_id, username: username)
|
80
|
+
group.unauthorize
|
81
|
+
end
|
82
|
+
|
83
|
+
private
|
84
|
+
|
85
|
+
def manager
|
86
|
+
@manager ||= Ec2::Manager.new
|
87
|
+
end
|
88
|
+
|
89
|
+
def my_ip
|
90
|
+
@my_ip ||= `curl -s https://api.ipify.org`.strip
|
91
|
+
end
|
92
|
+
|
93
|
+
def ports
|
94
|
+
result = options[:ports].split(',').map(&:to_i)
|
95
|
+
result.select { |port| (1..65_535).cover?(port) }
|
96
|
+
end
|
97
|
+
|
98
|
+
def security_group_id
|
99
|
+
options[:security_group].strip
|
100
|
+
end
|
101
|
+
|
102
|
+
def username
|
103
|
+
options[:username].presence || `whoami`.strip
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -7,9 +7,9 @@ require 'awshark/ecs/cluster'
|
|
7
7
|
require 'awshark/ecs/manager'
|
8
8
|
|
9
9
|
module Awshark
|
10
|
-
module
|
11
|
-
class
|
12
|
-
include Awshark::
|
10
|
+
module Ecs
|
11
|
+
class Subcommand < Thor
|
12
|
+
include Awshark::ClassOptions
|
13
13
|
|
14
14
|
desc 'list', 'list ECS tasks'
|
15
15
|
long_desc <<-LONGDESC
|
@@ -6,9 +6,9 @@ require 'awshark/rds/check_reservations'
|
|
6
6
|
require 'awshark/rds/manager'
|
7
7
|
|
8
8
|
module Awshark
|
9
|
-
module
|
10
|
-
class
|
11
|
-
include Awshark::
|
9
|
+
module Rds
|
10
|
+
class Subcommand < Thor
|
11
|
+
include Awshark::ClassOptions
|
12
12
|
|
13
13
|
desc 'check', 'Check RDS reservations'
|
14
14
|
long_desc <<-LONGDESC
|
@@ -9,9 +9,9 @@ require 'awshark/s3/bucket'
|
|
9
9
|
require 'awshark/s3/manager'
|
10
10
|
|
11
11
|
module Awshark
|
12
|
-
module
|
13
|
-
class
|
14
|
-
include Awshark::
|
12
|
+
module S3
|
13
|
+
class Subcommand < Thor
|
14
|
+
include Awshark::ClassOptions
|
15
15
|
include ActiveSupport::NumberHelper
|
16
16
|
|
17
17
|
desc 'list', 'List S3 bucket statistics'
|
data/lib/awshark/version.rb
CHANGED
data/lib/awshark.rb
CHANGED
@@ -6,7 +6,9 @@ require 'thor'
|
|
6
6
|
require 'yaml'
|
7
7
|
|
8
8
|
require 'awshark/version'
|
9
|
+
require 'awshark/concerns/logging'
|
9
10
|
require 'awshark/cloud_formation/configuration'
|
11
|
+
require 'awshark/ec2/configuration'
|
10
12
|
require 'awshark/ecs/configuration'
|
11
13
|
require 'awshark/s3/configuration'
|
12
14
|
require 'awshark/sts/configuration'
|
@@ -17,12 +19,14 @@ module Awshark
|
|
17
19
|
def self.config
|
18
20
|
@config ||= begin
|
19
21
|
cf = CloudFormation::Configuration.new
|
22
|
+
ec2 = Ec2::Configuration.new
|
20
23
|
ecs = Ecs::Configuration.new
|
21
24
|
s3 = S3::Configuration.new
|
22
25
|
sts = Sts::Configuration.new
|
23
26
|
|
24
27
|
OpenStruct.new(
|
25
28
|
cloud_formation: cf,
|
29
|
+
ec2: ec2,
|
26
30
|
ecs: ecs,
|
27
31
|
s3: s3,
|
28
32
|
sts: sts
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: awshark
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joergen Dahlke
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-01-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -252,6 +252,7 @@ files:
|
|
252
252
|
- exe/awshark
|
253
253
|
- gems.rb
|
254
254
|
- lib/awshark.rb
|
255
|
+
- lib/awshark/class_options.rb
|
255
256
|
- lib/awshark/cli.rb
|
256
257
|
- lib/awshark/cloud_formation/configuration.rb
|
257
258
|
- lib/awshark/cloud_formation/file_loading.rb
|
@@ -260,26 +261,29 @@ files:
|
|
260
261
|
- lib/awshark/cloud_formation/parameters.rb
|
261
262
|
- lib/awshark/cloud_formation/stack.rb
|
262
263
|
- lib/awshark/cloud_formation/stack_events.rb
|
264
|
+
- lib/awshark/cloud_formation/subcommand.rb
|
263
265
|
- lib/awshark/cloud_formation/template.rb
|
266
|
+
- lib/awshark/concerns/logging.rb
|
267
|
+
- lib/awshark/ec2/configuration.rb
|
264
268
|
- lib/awshark/ec2/instance.rb
|
265
269
|
- lib/awshark/ec2/manager.rb
|
270
|
+
- lib/awshark/ec2/security_group.rb
|
271
|
+
- lib/awshark/ec2/security_rule.rb
|
272
|
+
- lib/awshark/ec2/subcommand.rb
|
266
273
|
- lib/awshark/ecs/cluster.rb
|
267
274
|
- lib/awshark/ecs/configuration.rb
|
268
275
|
- lib/awshark/ecs/manager.rb
|
276
|
+
- lib/awshark/ecs/subcommand.rb
|
269
277
|
- lib/awshark/profile_resolver.rb
|
270
278
|
- lib/awshark/rds/check_reservations.rb
|
271
279
|
- lib/awshark/rds/manager.rb
|
280
|
+
- lib/awshark/rds/subcommand.rb
|
272
281
|
- lib/awshark/s3/artifact.rb
|
273
282
|
- lib/awshark/s3/bucket.rb
|
274
283
|
- lib/awshark/s3/configuration.rb
|
275
284
|
- lib/awshark/s3/manager.rb
|
285
|
+
- lib/awshark/s3/subcommand.rb
|
276
286
|
- lib/awshark/sts/configuration.rb
|
277
|
-
- lib/awshark/subcommands/class_options.rb
|
278
|
-
- lib/awshark/subcommands/cloud_formation.rb
|
279
|
-
- lib/awshark/subcommands/ec2.rb
|
280
|
-
- lib/awshark/subcommands/ecs.rb
|
281
|
-
- lib/awshark/subcommands/rds.rb
|
282
|
-
- lib/awshark/subcommands/s3.rb
|
283
287
|
- lib/awshark/version.rb
|
284
288
|
homepage: https://github.com/jdahlke/awshark
|
285
289
|
licenses:
|
@@ -1,28 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Awshark
|
4
|
-
module Subcommands
|
5
|
-
module ClassOptions
|
6
|
-
def process_class_options
|
7
|
-
command = current_command_chain.last
|
8
|
-
cli_options = options.merge(parent_options || {}).symbolize_keys
|
9
|
-
|
10
|
-
if cli_options[:help]
|
11
|
-
respond_to?(command) ? help(command) : help
|
12
|
-
exit(0)
|
13
|
-
end
|
14
|
-
|
15
|
-
setup_aws_credentials(options)
|
16
|
-
end
|
17
|
-
|
18
|
-
private
|
19
|
-
|
20
|
-
def setup_aws_credentials(options)
|
21
|
-
profile_resolver = ProfileResolver.new(options)
|
22
|
-
|
23
|
-
::Aws.config[:region] = profile_resolver.region
|
24
|
-
::Aws.config[:credentials] = profile_resolver.credentials
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'aws-sdk-ec2'
|
4
|
-
|
5
|
-
require 'awshark/ec2/instance'
|
6
|
-
require 'awshark/ec2/manager'
|
7
|
-
|
8
|
-
module Awshark
|
9
|
-
module Subcommands
|
10
|
-
class EC2 < Thor
|
11
|
-
include Awshark::Subcommands::ClassOptions
|
12
|
-
|
13
|
-
desc 'list', 'List all EC2 instances'
|
14
|
-
long_desc <<-LONGDESC
|
15
|
-
List all EC2 instances in a region
|
16
|
-
|
17
|
-
Example: `awshark ec2 list STATE`
|
18
|
-
LONGDESC
|
19
|
-
def list(state = 'running')
|
20
|
-
process_class_options
|
21
|
-
|
22
|
-
instances = manager.public_send("#{state}_instances")
|
23
|
-
instances = instances.sort_by(&:name)
|
24
|
-
|
25
|
-
instances.each do |i|
|
26
|
-
args = { name: i.name, type: i.type, public_dns: i.public_dns_name, state: i.state }
|
27
|
-
printf "%-40<name>s %-12<type>s %-60<public_dns>s %<state>s\n", args
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
private
|
32
|
-
|
33
|
-
def manager
|
34
|
-
@manager ||= Awshark::EC2::Manager.new
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|