awskeyring 0.1.1 → 0.2.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
  SHA1:
3
- metadata.gz: 1643974c4cbfea33a3a2388ee0a26ca035561b69
4
- data.tar.gz: f2c4c855e383f24bbeac967b19b6c47880638ab1
3
+ metadata.gz: 1e905b5fccdebddbc839f898423c513e8c3c3475
4
+ data.tar.gz: da11dceb9c06415e01647a2de7512103df2d951d
5
5
  SHA512:
6
- metadata.gz: 9bc85b2fae258fdc80f0b5466caf8bfff34fcaa9d6b8440744812177feb0c35381b84be69bb53f38019518168b937eadcc53a3197c12e42cbdbd2972ee3a8751
7
- data.tar.gz: 96c1704c005c2c304c76cb8613b6a0982e6a508482b22e792149abcd8780c8d76ff01a49581ccc0a70b8e251103e39729161d7a9319cfb8a805f98d2b86b3888
6
+ metadata.gz: 6c6b3db63fda21933153f5eb38be4a24e07701709c3d893b71c5266d8faca9b0385060dbdde6bac3ebad69d42077e8ae1e6199a74996e996be37f12883f299f8
7
+ data.tar.gz: d7db72c1d2f8a1d33508c113a5b8866dc48c5fc53017a89b9b14d8e7dae05d48e4ee1d8ac0f69d83d4041e48e3fbadb26f3847824c7240666ae2525018715c1d
data/CHANGELOG.md CHANGED
@@ -1,6 +1,13 @@
1
1
  # Change Log
2
2
 
3
- ## [v0.1.1](https://github.com/vibrato/awskeyring/tree/v0.1.1) (2018-03-26)
3
+ ## [v0.2.0](https://github.com/vibrato/awskeyring/tree/v0.2.0) (2018-04-05)
4
+ [Full Changelog](https://github.com/vibrato/awskeyring/compare/v0.1.1...v0.2.0)
5
+
6
+ **Implemented enhancements:**
7
+
8
+ - Add AWS CLI credential\_process compatible JSON output [\#16](https://github.com/vibrato/awskeyring/pull/16) ([tristanmorgan](https://github.com/tristanmorgan))
9
+
10
+ ## [v0.1.1](https://github.com/vibrato/awskeyring/tree/v0.1.1) (2018-03-25)
4
11
  [Full Changelog](https://github.com/vibrato/awskeyring/compare/v0.1.0...v0.1.1)
5
12
 
6
13
  **Merged pull requests:**
data/README.md CHANGED
@@ -32,13 +32,19 @@ Now your keys are stored safely in the macOS keychain. To print environment vari
32
32
 
33
33
  awskeyring env personal-aws
34
34
 
35
- See below and in the wiki for more details on usage.
35
+ Alternatively you can create a profile using the credential_process config variable. See the [AWS CLI Config docs](http://docs.aws.amazon.com/cli/latest/topic/config-vars.html#cli-aws-help-config-vars) for more details on this config option.
36
+
37
+ [profile personal]
38
+ region = us-west-1
39
+ credential_process = awskeyring json personal-aws
40
+
41
+ See below and in the [wiki](https://github.com/vibrato/awskeyring/wiki) for more details on usage.
36
42
 
37
43
  ## Installation
38
44
 
39
45
  Install it with:
40
46
 
41
- $ gem install awskeyring
47
+ $ gem install awskeyring --user-install
42
48
 
43
49
  ## Usage
44
50
 
@@ -53,6 +59,7 @@ The CLI is using [Thor](http://whatisthor.com) with help provided interactively.
53
59
  awskeyring exec ACCOUNT command... # Execute a COMMAND with the environment set for an ACCOUNT
54
60
  awskeyring help [COMMAND] # Describe available commands or one specific command
55
61
  awskeyring initialise # Initialises a new KEYCHAIN
62
+ awskeyring json ACCOUNT # Outputs AWS CLI compatible JSON for an ACCOUNT
56
63
  awskeyring list # Prints a list of accounts in the keyring
57
64
  awskeyring list-role # Prints a list of roles in the keyring
58
65
  awskeyring remove ACCOUNT # Removes an ACCOUNT from the keyring
@@ -73,7 +80,7 @@ To set your environment easily the following bash function helps:
73
80
 
74
81
  After checking out the repo, run `bundle update` to install dependencies. Then, run `rake` to run the tests. Run `bundle exec awskeyring` to use the gem in this directory, ignoring other installed copies of this gem.
75
82
 
76
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
83
+ To install this gem onto your local machine, run `bundle exec rake install`.
77
84
 
78
85
  ## Contributing
79
86
 
@@ -49,7 +49,7 @@ module Awskeyring
49
49
  )
50
50
  end
51
51
  rescue Aws::STS::Errors::AccessDenied => err
52
- puts err.to_s
52
+ warn err.to_s
53
53
  exit 1
54
54
  end
55
55
 
@@ -61,6 +61,24 @@ module Awskeyring
61
61
  }
62
62
  end
63
63
 
64
+ # Genarates AWS CLI compatible JSON
65
+ # see credential_process in AWS Docs
66
+ #
67
+ # @param [String] key The aws_access_key_id
68
+ # @param [String] secret The aws_secret_access_key
69
+ # @param [String] token The aws_session_token
70
+ # @param [String] expiry expiry time
71
+ # @return [String] credential_process json
72
+ def self.get_cred_json(key:, secret:, token:, expiry:)
73
+ JSON.pretty_generate(
74
+ Version: 1,
75
+ AccessKeyId: key,
76
+ SecretAccessKey: secret,
77
+ SessionToken: token,
78
+ Expiration: expiry
79
+ )
80
+ end
81
+
64
82
  # Retrieves an AWS Console login url
65
83
  #
66
84
  # @param [String] key The aws_access_key_id
@@ -1,4 +1,4 @@
1
1
  module Awskeyring
2
2
  # The Gems version number
3
- VERSION = '0.1.1'.freeze
3
+ VERSION = '0.2.0'.freeze
4
4
  end
data/lib/awskeyring.rb CHANGED
@@ -162,11 +162,13 @@ module Awskeyring # rubocop:disable Metrics/ModuleLength
162
162
  def self.get_valid_creds(account:)
163
163
  cred, temp_cred = get_valid_item_pair(account: account)
164
164
  token = temp_cred.password unless temp_cred.nil?
165
+ expiry = temp_cred.attributes[:account].to_i unless temp_cred.nil?
165
166
  {
166
167
  account: account,
167
168
  key: cred.attributes[:account],
168
169
  secret: cred.password,
169
- token: token
170
+ token: token,
171
+ expiry: expiry
170
172
  }
171
173
  end
172
174
 
@@ -76,6 +76,22 @@ class AwskeyringCommand < Thor # rubocop:disable Metrics/ClassLength
76
76
  )
77
77
  end
78
78
 
79
+ desc 'json ACCOUNT', 'Outputs AWS CLI compatible JSON for an ACCOUNT'
80
+ # Print JSON for use with credential_process
81
+ def json(account = nil)
82
+ account = ask_check(
83
+ existing: account, message: 'account name', validator: Awskeyring::Validate.method(:account_name)
84
+ )
85
+ cred = Awskeyring.get_valid_creds(account: account)
86
+ expiry = Time.at(cred[:expiry]) unless cred[:expiry].nil?
87
+ puts Awskeyring::Awsapi.get_cred_json(
88
+ key: cred[:key],
89
+ secret: cred[:secret],
90
+ token: cred[:token],
91
+ expiry: expiry || Time.new + 3600
92
+ )
93
+ end
94
+
79
95
  desc 'exec ACCOUNT command...', 'Execute a COMMAND with the environment set for an ACCOUNT'
80
96
  # execute an external command with env set
81
97
  def exec(account, *command)
@@ -166,12 +182,23 @@ class AwskeyringCommand < Thor # rubocop:disable Metrics/ClassLength
166
182
 
167
183
  desc 'rotate ACCOUNT', 'Rotate access keys for an ACCOUNT'
168
184
  # rotate Account keys
169
- def rotate(account = nil)
185
+ def rotate(account = nil) # rubocop:disable Metrics/MethodLength
170
186
  account = ask_check(
171
187
  existing: account, message: 'account name', validator: Awskeyring::Validate.method(:account_name)
172
188
  )
173
189
  item_hash = Awskeyring.get_account_hash(account: account)
174
- new_key = Awskeyring::Awsapi.rotate(account: item_hash[:account], key: item_hash[:key], secret: item_hash[:secret])
190
+
191
+ begin
192
+ new_key = Awskeyring::Awsapi.rotate(
193
+ account: item_hash[:account],
194
+ key: item_hash[:key],
195
+ secret: item_hash[:secret]
196
+ )
197
+ rescue Aws::Errors::ServiceError => err
198
+ warn err.to_s
199
+ exit 1
200
+ end
201
+
175
202
  Awskeyring.update_account(
176
203
  account: account,
177
204
  key: new_key[:key],
@@ -216,15 +243,20 @@ class AwskeyringCommand < Thor # rubocop:disable Metrics/ClassLength
216
243
  item_hash = Awskeyring.get_account_hash(account: account)
217
244
  role_arn = Awskeyring.get_role_arn(role_name: role) if role
218
245
 
219
- new_creds = Awskeyring::Awsapi.get_token(
220
- code: code,
221
- role_arn: role_arn,
222
- duration: duration,
223
- mfa: item_hash[:mfa],
224
- key: item_hash[:key],
225
- secret: item_hash[:secret],
226
- user: ENV['USER']
227
- )
246
+ begin
247
+ new_creds = Awskeyring::Awsapi.get_token(
248
+ code: code,
249
+ role_arn: role_arn,
250
+ duration: duration,
251
+ mfa: item_hash[:mfa],
252
+ key: item_hash[:key],
253
+ secret: item_hash[:secret],
254
+ user: ENV['USER']
255
+ )
256
+ rescue Aws::Errors::ServiceError => err
257
+ warn err.to_s
258
+ exit 1
259
+ end
228
260
 
229
261
  Awskeyring.add_token(
230
262
  account: account,
@@ -241,7 +273,7 @@ class AwskeyringCommand < Thor # rubocop:disable Metrics/ClassLength
241
273
  desc 'console ACCOUNT', 'Open the AWS Console for the ACCOUNT'
242
274
  method_option :path, type: :string, aliases: '-p', desc: 'The service PATH to open.'
243
275
  # Open the AWS Console
244
- def console(account = nil)
276
+ def console(account = nil) # rubocop:disable Metrics/MethodLength
245
277
  account = ask_check(
246
278
  existing: account, message: 'account name', validator: Awskeyring::Validate.method(:account_name)
247
279
  )
@@ -249,13 +281,18 @@ class AwskeyringCommand < Thor # rubocop:disable Metrics/ClassLength
249
281
 
250
282
  path = options[:path] || 'console'
251
283
 
252
- login_url = Awskeyring::Awsapi.get_login_url(
253
- key: cred[:key],
254
- secret: cred[:secret],
255
- token: cred[:token],
256
- path: path,
257
- user: ENV['USER']
258
- )
284
+ begin
285
+ login_url = Awskeyring::Awsapi.get_login_url(
286
+ key: cred[:key],
287
+ secret: cred[:secret],
288
+ token: cred[:token],
289
+ path: path,
290
+ user: ENV['USER']
291
+ )
292
+ rescue Aws::Errors::ServiceError => err
293
+ warn err.to_s
294
+ exit 1
295
+ end
259
296
 
260
297
  pid = Process.spawn("open \"#{login_url}\"")
261
298
  Process.wait pid
@@ -329,8 +366,8 @@ class AwskeyringCommand < Thor # rubocop:disable Metrics/ClassLength
329
366
  begin
330
367
  value = ask_missing(existing: existing, message: message, secure: secure, optional: optional)
331
368
  value = validator.call(value) unless value.empty? && optional
332
- rescue RuntimeError => e
333
- warn e.message
369
+ rescue RuntimeError => err
370
+ warn err.message
334
371
  existing = nil
335
372
  retry unless (retries -= 1).zero?
336
373
  exit 1
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: awskeyring
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tristan Morgan
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-03-25 00:00:00.000000000 Z
11
+ date: 2018-04-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-iam