awshark 1.4.0 → 1.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 944b9d2229c69abfd14fae195f1ba6ffad83e48b1f8a6d8b250ba1958a600330
4
- data.tar.gz: d1b9886e347b3eb551f765f1788e556751aca04b17ae95e034d9b4ffbd83936b
3
+ metadata.gz: 1f20abce36658043c8b046859575b969365fd56528b3a786ca71e3009b078909
4
+ data.tar.gz: 75631cf5ad34c594571a1f46297d3fa23c8da384c4789c43ea857a4ab09b972c
5
5
  SHA512:
6
- metadata.gz: 348b4502d6989094798ad96470f219d2207bbf1acaeef6aeaffde67ae1d25a10efc371f6bf9c7f00a0ba64b5c0fc137bf40379bb49b547792038eee73baec9b5
7
- data.tar.gz: 3b014bab2c44409f4c1c25f3359f7fc8f4ce6d00e7b1c0fcc9ac286f287e91b3309e0b51b3c29720a32668fdae636fb53e94c618e2507b3086b6e47710afa2cd
6
+ metadata.gz: e75070ff5ad3295b994b9408edc5e448a205a413278b9dc6d2cae3b891840a976f6f5b0ccd9d8d4b9f6ba85fdf081ad1b3c83727712bea4228cb5248e659019b
7
+ data.tar.gz: aa0feb28170116e34cab5a60ca8e60cfd6a6b76c9def7aaf78709aaa28a3475d2067bc39e76c9303481304ef11a757f69a54ebd4fdb9a0e1ce9cedf84c98d778
data/.rubocop.yml CHANGED
@@ -4,7 +4,7 @@
4
4
  # See https://docs.rubocop.org/rubocop/configuration
5
5
 
6
6
  AllCops:
7
- TargetRubyVersion: 2.6
7
+ TargetRubyVersion: 2.7
8
8
  Exclude:
9
9
  - 'bin/*'
10
10
  - 'tmp/*'
data/CHANGELOG.md CHANGED
@@ -1,7 +1,11 @@
1
1
  ## Changelog
2
2
 
3
+ #### 1.5.0
4
+ - [new] add `awshark ssm list` to list AWS Parameter Store secrets
5
+ - [new] add `awshark ssm deploy` to update AWS Parameter Store secrets
6
+
3
7
  #### 1.4.0
4
- - [new] add `awshark cf save` to save Cloud Formation templates as file
8
+ - [new] add `awshark cf save` to save AWS Cloud Formation templates as file
5
9
 
6
10
  #### 1.3.0
7
11
  - [new] add `awshark ec2 authorize` and `unauthorize`
data/awshark.gemspec CHANGED
@@ -27,7 +27,7 @@ Gem::Specification.new do |spec|
27
27
  spec.bindir = 'exe'
28
28
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
29
29
  spec.require_paths = ['lib']
30
- spec.required_ruby_version = '>= 2.6'
30
+ spec.required_ruby_version = '>= 2.7'
31
31
 
32
32
  spec.add_dependency 'activesupport'
33
33
  spec.add_dependency 'aws-sdk-cloudformation'
@@ -11,7 +11,7 @@ module Awshark
11
11
  exit(0)
12
12
  end
13
13
 
14
- setup_aws_credentials(options)
14
+ setup_aws_credentials(cli_options)
15
15
  end
16
16
 
17
17
  private
data/lib/awshark/cli.rb CHANGED
@@ -7,6 +7,7 @@ require 'awshark/ec2/subcommand'
7
7
  require 'awshark/ecs/subcommand'
8
8
  require 'awshark/rds/subcommand'
9
9
  require 'awshark/s3/subcommand'
10
+ require 'awshark/ssm/subcommand'
10
11
 
11
12
  module Awshark
12
13
  class Cli < Thor
@@ -15,6 +16,7 @@ module Awshark
15
16
  map '-v' => :version
16
17
 
17
18
  class_option :help, type: :boolean, desc: 'Prints this help'
19
+ class_option :region, type: :string, desc: 'AWS region'
18
20
 
19
21
  desc 'cf COMMAND', 'Run CloudFormation command'
20
22
  subcommand 'cf', Awshark::CloudFormation::Subcommand
@@ -31,6 +33,9 @@ module Awshark
31
33
  desc 's3 COMMAND', 'Run CloudFormation command'
32
34
  subcommand 's3', Awshark::S3::Subcommand
33
35
 
36
+ desc 'ssm COMMAND', 'Run SSM command'
37
+ subcommand 'ssm', Awshark::Ssm::Subcommand
38
+
34
39
  desc 'version', 'Displays current version of AwsShark'
35
40
  long_desc <<-LONGDESC
36
41
  Displays current version of AwsShark.
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Awshark
4
+ module Ssm
5
+ class Client
6
+ def list_secrets(application:)
7
+ response = client.get_parameters_by_path({
8
+ path: application,
9
+ recursive: true,
10
+ with_decryption: true
11
+ })
12
+ response.parameters
13
+ end
14
+
15
+ def update_secrets(application:, secrets:)
16
+ flat_secrets = flatten_hash(secrets)
17
+
18
+ flat_secrets.each_pair do |key, value|
19
+ params = {
20
+ name: "/#{application}/#{key.downcase}",
21
+ value: value,
22
+ type: 'SecureString', # accepts String, StringList, SecureString
23
+ tier: 'Standard' # accepts Standard, Advanced, Intelligent-Tiering
24
+ }
25
+
26
+ loop do
27
+ client.put_parameter(params.merge(overwrite: true))
28
+ puts "Updated secrets for: #{params[:name]}"
29
+
30
+ break
31
+ rescue Aws::SSM::Errors::ThrottlingException
32
+ puts 'Aws::SSM::Errors::ThrottlingException... retrying'
33
+ sleep 1
34
+ end
35
+ end
36
+ end
37
+
38
+ private
39
+
40
+ def client
41
+ @client ||= Aws::SSM::Client.new
42
+ end
43
+
44
+ # helper function
45
+ def flatten_hash(hash, prefix = nil)
46
+ hash.each_with_object({}) do |(key, value), rslt|
47
+ if value.is_a?(Hash)
48
+ rslt.merge!(flatten_hash(value, "#{prefix}#{key}_"))
49
+ else
50
+ rslt["#{prefix}#{key}"] = value
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'aws-sdk-ssm'
4
+
5
+ require 'awshark/ssm/client'
6
+
7
+ module Awshark
8
+ module Ssm
9
+ class Subcommand < Thor
10
+ include Awshark::ClassOptions
11
+
12
+ class_option :stage, type: :string, desc: 'Stage of the configuration'
13
+
14
+ desc 'list', 'Lists Parameter Store secrets'
15
+ long_desc <<-LONGDESC
16
+ List AWS Parameter Store secrets of specific path.
17
+
18
+ awshark ssm list PARAMETER_PATH
19
+
20
+ Examples:
21
+
22
+ awshark ssm list /ticketing-api
23
+ LONGDESC
24
+ def list(parameter_path)
25
+ process_class_options
26
+
27
+ raise GracefulFail, 'PARAMETER_PATH must begin with a "/"' if parameter_path[0] != '/'
28
+
29
+ puts "Parameter Store #{parameter_path.inspect} in #{::Aws.config[:region]}:"
30
+
31
+ parameters = ssm_client.list_secrets(application: parameter_path)
32
+
33
+ parameters.each do |param|
34
+ printf " %-60<name>s %<value>s\n", { name: param.name, value: param.value }
35
+ end
36
+ rescue GracefulFail => e
37
+ puts e.message
38
+ end
39
+
40
+ desc 'deploy', 'Updates Parameter Store secrets'
41
+ long_desc <<-LONGDESC
42
+ Updates AWS Parameter Store secrets from a file "secrets.yml".
43
+ It assumes the directory is the name of the application.
44
+
45
+ awshark ssm deploy DIRECTORY --stage=STAGE
46
+
47
+ Examples:
48
+
49
+ awshark ssm deploy aws/ticketing-api --stage=staging
50
+ LONGDESC
51
+ def deploy(directory)
52
+ process_class_options
53
+
54
+ secrets_path = File.join(directory, 'secrets.yml')
55
+ raise GracefulFail, "File #{secrets_path} does not exist." unless File.exist?(secrets_path)
56
+
57
+ app_name = directory.split('/').last
58
+ stage = options['stage']
59
+
60
+ secrets = YAML.load_file(secrets_path)[stage]
61
+ raise GracefulFail, "No secrets found for stage '#{stage}' in #{secrets_path}." if secrets.nil?
62
+
63
+ ssm_client.update_secrets(application: "#{app_name}-#{stage}", secrets: secrets)
64
+ rescue GracefulFail => e
65
+ puts e.message
66
+ end
67
+
68
+ private
69
+
70
+ def ssm_client
71
+ @ssm_client ||= Awshark::Ssm::Client.new
72
+ end
73
+ end
74
+ end
75
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Awshark
4
- VERSION = '1.4.0'
4
+ VERSION = '1.5.0'
5
5
  end
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.0
4
+ version: 1.5.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: 2022-05-10 00:00:00.000000000 Z
11
+ date: 2023-01-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -283,6 +283,8 @@ files:
283
283
  - lib/awshark/s3/configuration.rb
284
284
  - lib/awshark/s3/manager.rb
285
285
  - lib/awshark/s3/subcommand.rb
286
+ - lib/awshark/ssm/client.rb
287
+ - lib/awshark/ssm/subcommand.rb
286
288
  - lib/awshark/sts/configuration.rb
287
289
  - lib/awshark/version.rb
288
290
  homepage: https://github.com/jdahlke/awshark
@@ -300,14 +302,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
300
302
  requirements:
301
303
  - - ">="
302
304
  - !ruby/object:Gem::Version
303
- version: '2.6'
305
+ version: '2.7'
304
306
  required_rubygems_version: !ruby/object:Gem::Requirement
305
307
  requirements:
306
308
  - - ">="
307
309
  - !ruby/object:Gem::Version
308
310
  version: '0'
309
311
  requirements: []
310
- rubygems_version: 3.0.3.1
312
+ rubygems_version: 3.3.26
311
313
  signing_key:
312
314
  specification_version: 4
313
315
  summary: Custom CLI for for AWS related tasks