hamburgerstore 0.1

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 2a69fba01ef358225a501dfd1fdbf4da15d648a3
4
+ data.tar.gz: c0dc8be614f022483eb6a5c9c0c4cfc29f725d2e
5
+ SHA512:
6
+ metadata.gz: 1e2fd5cd46850260f17fefe71029b9a8ce40e4a40806c1a20aebb8f5aee08e1bfe5eb57e1beeebf890c88b2ed9198e137395da48f7f3de26d259e4b6b5113f5b
7
+ data.tar.gz: 7582fbd1fe5c5a0973f36286482f00385e89f76733cfe8154f7093f5775fd447cb02e330fbe127fbf7e8be26e8dfbe35e60e5727970e9ee984d1daa74d3b24df
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'hamburgerstore'
4
+ require 'aws-sdk'
5
+ require 'trollop'
6
+
7
+ SUB_COMMANDS = %w(store retrieve)
8
+ global_opts = Trollop.options do
9
+ opt :region, 'The region to look for the dynamodb in', default: 'us-east-1'
10
+ banner 'utility for storing and retrieving encrypted values
11
+ available commands:
12
+
13
+ store -- store a value in hamerburger store
14
+ retrieve -- retrieve a value from hambuger store
15
+
16
+ use --help with either command for more information.
17
+ '
18
+ stop_on SUB_COMMANDS
19
+ end
20
+
21
+ cmd = ARGV.shift
22
+ cmd_opts =
23
+ case cmd
24
+ when 'store'
25
+ Trollop.options do
26
+ opt :identifier, 'the name of the key associated with the value', required: true, type: String
27
+ opt :keyname, 'the name of the key associated with the value', required: true, type: String
28
+ opt :value, 'the value to be inserted into the keystore (required for store)', required: true, type: String
29
+ opt :kmsid, 'the kms key id to use to encrypt the data (required for store)', required: true, type: String
30
+ opt :table, 'the name of the table to perform the lookup on', required: true, type: String
31
+ end
32
+ when 'retrieve'
33
+ Trollop.options do
34
+ opt :identifier, 'the name of the key associated with the value', required: true, type: String
35
+ opt :keyname, 'the name of the key associated with the value', required: true, type: String
36
+ opt :table, 'the name of the table to perform the lookup on', required: true, type: String
37
+ end
38
+ else
39
+ Trollop.die "usage: hamburgerstore.rb [store|retrieve] [parameters]"
40
+ end
41
+
42
+ hamburger = HamburgerStore.new(table_name: cmd_opts[:table], key_id: cmd_opts[:kmsid], region: global_opts[:region])
43
+
44
+ case cmd
45
+ when 'store'
46
+ hamburger.store(cmd_opts[:identifier], cmd_opts[:keyname], cmd_opts[:value])
47
+ when 'retrieve'
48
+ result = hamburger.retrieve(cmd_opts[:identifier], cmd_opts[:keyname])
49
+ puts result
50
+ else
51
+ fail "unknown subcommand #{cmd}"
52
+ end
@@ -0,0 +1,69 @@
1
+ require 'aws-sdk-resources'
2
+ require 'base64'
3
+
4
+ # Data store for pipeline instance metadata. Nothing to do with hamburgers. Sorry.
5
+ class HamburgerStore
6
+ def encrypt(value)
7
+ encrypted_value = @kms.encrypt(key_id: @key_id, plaintext: value).ciphertext_blob
8
+ Base64.encode64(encrypted_value)
9
+ end
10
+
11
+ def decrypt(value)
12
+ encrypted_value = Base64.decode64(value)
13
+ @kms.decrypt(ciphertext_blob: encrypted_value).plaintext
14
+ end
15
+
16
+ def check_kms(options)
17
+ # fail 'need to specify kms key_id parameter' if options[:key_id].nil?
18
+ @key_id = options[:key_id]
19
+ if options[:kms].nil?
20
+ fail 'need to specify region' if options[:region].nil?
21
+ @kms = Aws::KMS::Client.new region: options[:region]
22
+ else
23
+ @kms = options[:kms]
24
+ end
25
+ end
26
+
27
+ def check_dynamo(options)
28
+ if options[:dynamo].nil?
29
+ fail 'need to specify region' if options[:region].nil?
30
+ @ddb = Aws::DynamoDB::Resource.new region: options[:region]
31
+ else
32
+ @ddb = options[:dynamo]
33
+ end
34
+ end
35
+
36
+ def initialize(options = {})
37
+ check_kms(options)
38
+ check_dynamo(options)
39
+
40
+ fail 'need to specify table_name parameter' if options[:table_name].nil?
41
+ @table = @ddb.table(options[:table_name])
42
+ end
43
+
44
+ def store(identifer, key, value)
45
+ fail 'need to specify kms key_id parameter' if @key_id.nil?
46
+ item = @table.get_item(key: { 'hamburger' => identifer }).item
47
+ item = { 'hamburger' => identifer } if item.nil?
48
+ item[key] = encrypt(value)
49
+ @table.put_item(item: item, return_values: :ALL_OLD)
50
+ end
51
+
52
+ def retrieve(identifier, key)
53
+ item = @table.get_item(key: { 'hamburger' => identifier }).item
54
+ fail "no values for #{identifier}" if item.nil?
55
+ decrypt(item[key])
56
+ end
57
+
58
+ def retrieve_all(identifier)
59
+ encrypted_items = @table.get_item(key: { 'hamburger' => identifier }).item
60
+ hamburger = encrypted_items.delete('hamburger')
61
+ result = { 'hamburger' => hamburger }
62
+ encrypted_items.each_pair do |key, value|
63
+ result[key] = decrypt(value)
64
+ end
65
+ result
66
+ end
67
+ end
68
+
69
+ # store a set of parameters (?)
metadata ADDED
@@ -0,0 +1,84 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hamburgerstore
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ platform: ruby
6
+ authors:
7
+ - Jonny Sywulak
8
+ - Stelligent
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2015-09-28 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: aws-sdk
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '2.1'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '2.1'
28
+ - !ruby/object:Gem::Dependency
29
+ name: trollop
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: 2.1.2
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: 2.1.2
42
+ description: Hambuger Store is an easy, lightweight way to store data about your pipeline
43
+ instances. As you go through your pipeline, you're going to produce a lot of information
44
+ that's relevant to your pipeline instance, and having to store that in a text file
45
+ or pass parameters between jobs can get very unwieldy very quickly. Hamburger Store
46
+ utilizes two AWS services (Dyanmo DB and Key Management Service) to provide an easy
47
+ way to securely store the data your pipeline needs, without the bother of having
48
+ to set it up yourself.
49
+ email: jonny@stelligent.com
50
+ executables:
51
+ - hamburgerstore.rb
52
+ extensions: []
53
+ extra_rdoc_files: []
54
+ files:
55
+ - bin/hamburgerstore.rb
56
+ - lib/hamburgerstore.rb
57
+ homepage: http://www.stelligent.com
58
+ licenses:
59
+ - MIT
60
+ metadata: {}
61
+ post_install_message:
62
+ rdoc_options: []
63
+ require_paths:
64
+ - lib
65
+ - lib
66
+ - bin
67
+ required_ruby_version: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: 2.2.2
72
+ required_rubygems_version: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ requirements: []
78
+ rubyforge_project:
79
+ rubygems_version: 2.4.8
80
+ signing_key:
81
+ specification_version: 4
82
+ summary: Data store for pipeline instance metadata. Nothing to do with hamburgers.
83
+ Sorry.
84
+ test_files: []