awskeyring 0.1.1 → 0.2.0

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