hiera-backend-trocla 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.8.7
4
+ - 1.9.3
5
+ - 2.0.0-p647
6
+ - 2.1.7
7
+ - 2.2.3
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in hiera-backend-trocla.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 Andreas Zuber
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,116 @@
1
+ # Hiera Backend for Trocla
2
+
3
+ [![Build Status](https://travis-ci.org/ZeroPointEnergy/hiera-backend-trocla.svg)](https://travis-ci.org/ZeroPointEnergy/hiera-backend-trocla)
4
+
5
+ This is a simple hiera backend to retrieve passwords from trocla.
6
+
7
+ The idea of this backend is to enable you to use secrets from trocla
8
+ directly from your hiera data via interpolation tokens.
9
+
10
+ ## Installation
11
+
12
+ Simply install the gem and hiera will find it automatically
13
+
14
+ $ gem install hiera-backend-trocla
15
+
16
+ ## Usage
17
+
18
+ Add the backend to your hiera.yaml to use it.
19
+
20
+ :backends:
21
+ - 'trocla'
22
+ - 'yaml'
23
+ :hierarchy:
24
+ - 'defaults'
25
+ :yaml:
26
+ :datadir: '/path/to/your/hieradata'
27
+ :trocla:
28
+ :config: '/path/to/your/troclarc.yaml'
29
+
30
+ There are two different methods to lookup a password in trocla. trocla_lookup and trocla_hierarchy
31
+
32
+ ### trocla_lookup
33
+
34
+ trocla_lookup will simply lookup the password for a specified key and completely ignore
35
+ the hierarchy defined in the hiera configuration. If the password does not exist it will
36
+ create one.
37
+
38
+ The trocla hiera backend will resolve all the variables which start with "trocla_lookup::"
39
+
40
+ The second part of the variable is used to describe the format, the last part is the variable
41
+ to lookup in trocla.
42
+
43
+ torcla_lookup::format::myvar
44
+
45
+ You can use the backend via interpolation tokens like this:
46
+
47
+ myapp::database::password: "%{hiera('trocla_lookup::plain::myapp_mysql_password')}"
48
+
49
+ mysql::server::users:
50
+ 'someuser@localhost':
51
+ ensure: 'present'
52
+ password_hash: "%{hiera('trocla_lookup::mysql::myapp_mysql_password')}"
53
+
54
+ ### trocla_hierarchy
55
+
56
+ trocla_hierarchy will lookup the key in the hierarchy defined in your hiera configuration.
57
+ It will simply prefix all the variables with 'hiera/source/key' where source is one of
58
+ the interpolated strings defined in the hierarchy section.
59
+
60
+ It will try to find a password on every level in your hierarchy first. After that it will
61
+ create a password on the first hierarchy level by default. You can overwrite the level it
62
+ should create the password with the key 'order_override' in the trocla_options hash.
63
+
64
+ This is useful if you require different key for different nodes or on any other hierarchy level
65
+ you desire.
66
+
67
+ If you have a hierarchy defined like this:
68
+
69
+ :hierarchy:
70
+ - "nodes/%{::clientcert}"
71
+ - "roles/%{::role}"
72
+ - defaults
73
+
74
+ And you want to create a different password on the roles level, so that nodes within the
75
+ same role will get the same password you can set the 'order_override' like this:
76
+
77
+ trocla_options::my_special_key:
78
+ order_override: "roles/%{::role}"
79
+
80
+ The format to lookup a password this way is the same as with 'trocla_lookup':
81
+
82
+ trocla_hierarchy::format::myvar
83
+
84
+ Here is how you would use that in hiera:
85
+
86
+ mysql::server::root_password: "%{hiera('trocla_hierarchy::plain::mysql_root')}"
87
+
88
+ ### options hash
89
+
90
+ Trocla takes a hash of options which provides information for the password creation. This
91
+ options can be set directly in hiera globally or for every key. You can also specify options
92
+ specifically for a password format. However, keep in mind that it will only use the options
93
+ of the format which is used first to retrieve a password for a key, because thats when the
94
+ password is generated.
95
+
96
+ trocla_options:
97
+ length: 16
98
+ some_other_global_setting: bla
99
+ mysql:
100
+ length: 32
101
+
102
+ trocla_options::some_key:
103
+ plain:
104
+ length: 64
105
+ order_override: "roles/%{::role}"
106
+
107
+ Some formats may require options to be set for creating passwords, like the
108
+ postgresql format. Check the trocla documentation for available options.
109
+
110
+ ## Contributing
111
+
112
+ 1. Fork it
113
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
114
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
115
+ 4. Push to the branch (`git push origin my-new-feature`)
116
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new('spec')
5
+
6
+ task :default => :spec
7
+ task :test => :spec
8
+
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'hiera/backend/trocla/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "hiera-backend-trocla"
8
+ spec.version = Hiera::Backend::Trocla::VERSION
9
+ spec.authors = ["Andreas Zuber"]
10
+ spec.email = ["zuber@puzzle.ch"]
11
+ spec.description = %q{This is a hiera backend for the trocla password storage tool}
12
+ spec.summary = %q{This is a hiera backend for the trocla password storage tool}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "hiera"
24
+ spec.add_development_dependency "rspec"
25
+ spec.add_development_dependency "simplecov"
26
+
27
+ spec.add_dependency "trocla"
28
+ end
@@ -0,0 +1,7 @@
1
+ class Hiera
2
+ module Backend
3
+ class Trocla
4
+ VERSION = "0.0.1"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ require 'hiera/backend/trocla/version'
2
+
3
+ class Hiera
4
+ module Backend
5
+ class Trocla
6
+
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,95 @@
1
+ require 'hiera/backend/trocla'
2
+ require 'trocla'
3
+
4
+ class Hiera
5
+ module Backend
6
+ class Trocla_backend
7
+
8
+ def initialize
9
+ Hiera.debug('Hiera Trocla backend starting')
10
+ begin
11
+ require 'trocla'
12
+ rescue
13
+ require 'rubygems'
14
+ require 'trocla'
15
+ end
16
+
17
+ @trocla_conf = Config[:trocla] && Config[:trocla][:config]
18
+ @trocla = ::Trocla.new(@trocla_conf)
19
+ end
20
+
21
+ def lookup(key, scope, order_override, resolution_type)
22
+ # return immediately if this is no trocla lookup
23
+ return nil unless key[/^trocla_lookup::/] or key[/^trocla_hierarchy::/]
24
+
25
+ method, format, trocla_key = key.split('::', 3)
26
+
27
+ case method
28
+ when 'trocla_lookup'
29
+ trocla_lookup(trocla_key, format, scope, order_override)
30
+ when 'trocla_hierarchy'
31
+ trocla_hierarchy(trocla_key, format, scope, order_override)
32
+ end
33
+ end
34
+
35
+ # This is a simple lookup which will return a password for the key
36
+ def trocla_lookup(trocla_key, format, scope, order_override)
37
+ opts = options(trocla_key, format, scope, order_override)
38
+ @trocla.password(trocla_key, format, opts)
39
+ end
40
+
41
+ def trocla_hierarchy(trocla_key, format, scope, order_override)
42
+ get_password_from_hierarchy(trocla_key, format, scope, order_override) ||
43
+ set_password_in_hierarchy(trocla_key, format, scope, order_override)
44
+ end
45
+
46
+ # Try to retrieve a password from a hierarchy
47
+ def get_password_from_hierarchy(trocla_key, format, scope, order_override)
48
+ answer = nil
49
+ Backend.datasources(scope, order_override) do |source|
50
+ key = hierarchical_key(source, trocla_key)
51
+ answer = @trocla.get_password(key, format)
52
+ break unless answer.nil?
53
+ end
54
+ return answer
55
+ end
56
+
57
+ # Set the password in the hierarchy at the top level or whatever
58
+ # level is specified in the options hash with 'order_override'
59
+ def set_password_in_hierarchy(trocla_key, format, scope, order_override)
60
+ opts = options(trocla_key, format, scope, order_override)
61
+ answer = nil
62
+ Backend.datasources(scope, opts['order_override']) do |source|
63
+ key = hierarchical_key(source, trocla_key)
64
+ answer = @trocla.password(key, format, opts)
65
+ break unless answer.nil?
66
+ end
67
+ return answer
68
+ end
69
+
70
+ def hierarchical_key(source, trocla_key)
71
+ "hiera/#{source}/#{trocla_key}"
72
+ end
73
+
74
+ # returns global options for password generation
75
+ def global_options(format, scope, order_override)
76
+ g_options = Backend.lookup('trocla_options', {}, scope, order_override, :hash)
77
+ g_options.merge(g_options[format] || {})
78
+ end
79
+
80
+ # returns per key options for password generation
81
+ def key_options(trocla_key, format, scope, order_override)
82
+ k_options = Backend.lookup('trocla_options::' + trocla_key, {}, scope, order_override, :hash)
83
+ k_options.merge(k_options[format] || {})
84
+ end
85
+
86
+ # retrieve options hash and merge the format specific settings into the defaults
87
+ def options(trocla_key, format, scope, order_override)
88
+ g_options = global_options(format, scope, order_override)
89
+ k_options = key_options(trocla_key, format, scope, order_override)
90
+ g_options.merge(k_options)
91
+ end
92
+
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,12 @@
1
+ :backends:
2
+ - 'trocla'
3
+ - 'yaml'
4
+ :hierarchy:
5
+ - "nodes/%{::clientcert}"
6
+ - "roles/%{::role}"
7
+ - 'defaults'
8
+ :yaml:
9
+ :datadir: 'spec/config/hieradata'
10
+ :trocla:
11
+ :config: 'spec/config/troclarc.yaml'
12
+ :logger: 'noop'
@@ -0,0 +1,25 @@
1
+ # fixtures for options tests
2
+ trocla_options:
3
+ length: 16
4
+ mysql:
5
+ length: 32
6
+
7
+ trocla_options::special_length:
8
+ plain:
9
+ length: 64
10
+
11
+ # fixtures for trocla_lookup tests
12
+ normal_var: "test"
13
+ var_with_password: "%{hiera('trocla_lookup::plain::my_secret_password')}"
14
+ var_with_password2: "%{hiera('trocla_lookup::plain::my_secret_password.example.com')}"
15
+ var_with_invalid_format: "%{hiera('trocla_lookup::unexisting::my_secret_password')}"
16
+
17
+ # fixtures for trocla_hiera tests
18
+ trocla_options::not_node_specific:
19
+ order_override: 'defaults'
20
+
21
+ trocla_options::same_role:
22
+ order_override: "role/%{::role}"
23
+
24
+ trocla_options::different_role:
25
+ order_override: "role/%{::role}"
@@ -0,0 +1 @@
1
+ adapter: :Memory
@@ -0,0 +1,90 @@
1
+ require 'spec_helper'
2
+ require 'hiera'
3
+
4
+ describe Hiera::Backend::Trocla do
5
+
6
+ before :each do
7
+ @hiera = Hiera.new(:config => "spec/config/hiera.yaml")
8
+ end
9
+
10
+ describe 'trocla_lookup' do
11
+ it 'will create a new password and return the same password on the second lookup' do
12
+ password1 = @hiera.lookup('trocla_lookup::plain::my_secret_password', nil, nil)
13
+ password2 = @hiera.lookup('trocla_lookup::plain::my_secret_password', nil, nil)
14
+ expect(password1).to eq(password2)
15
+ end
16
+
17
+ it 'will create different passwords for each key' do
18
+ password1 = @hiera.lookup('trocla_lookup::plain::my_secret_password', nil, nil)
19
+ password2 = @hiera.lookup('trocla_lookup::plain::my_secret_password2', nil, nil)
20
+ expect(password1).not_to eq(password2)
21
+ end
22
+
23
+ it 'will return the correct password if retrieved via interpolation' do
24
+ password = @hiera.lookup('trocla_lookup::plain::my_secret_password', nil, nil)
25
+ expect(@hiera.lookup('var_with_password', nil, nil)).to eq(password)
26
+ end
27
+
28
+ it 'will not influence normal lookups' do
29
+ expect(@hiera.lookup('normal_var', nil, nil)).to eq('test')
30
+ end
31
+
32
+ it 'will return nil if the format is not valid' do
33
+ expect{@hiera.lookup('trocla_lookup::unexisting::my_secret_password', nil, nil)}.to raise_error StandardError
34
+ expect{@hiera.lookup('var_with_invalid_format', nil, nil)}.to raise_error StandardError
35
+ end
36
+ end
37
+
38
+ describe 'trocla_hierarchy' do
39
+ it 'will return a different password for two different nodes' do
40
+ scope1 = {'::clientcert' => 'node01.example.com'}
41
+ password1 = @hiera.lookup('trocla_hierarchy::plain::node_specific', nil, scope1)
42
+ scope2 = {'::clientcert' => 'node02.example.com'}
43
+ password2 = @hiera.lookup('trocla_hierarchy::plain::node_specific', nil, scope2)
44
+ expect(password1).not_to eq(password2)
45
+ end
46
+
47
+ it 'will return a different password for two different nodes' do
48
+ scope1 = {'::clientcert' => 'node01.example.com'}
49
+ password1 = @hiera.lookup('trocla_hierarchy::plain::not_node_specific', nil, scope1)
50
+ scope2 = {'::clientcert' => 'node02.example.com'}
51
+ password2 = @hiera.lookup('trocla_hierarchy::plain::not_node_specific', nil, scope2)
52
+ expect(password1).to eq(password2)
53
+ end
54
+
55
+ it 'will return the same password for both nodes in the same role' do
56
+ scope1 = {'::clientcert' => 'node01.example.com', '::role' => 'same'}
57
+ password1 = @hiera.lookup('trocla_hierarchy::plain::same_role', nil, scope1)
58
+ scope2 = {'::clientcert' => 'node02.example.com', '::role' => 'same'}
59
+ password2 = @hiera.lookup('trocla_hierarchy::plain::same_role', nil, scope2)
60
+ expect(password1).to eq(password2)
61
+ end
62
+
63
+ it 'will return different passwords for nodes in different roles' do
64
+ scope1 = {'::clientcert' => 'node01.example.com', '::role' => 'role1'}
65
+ password1 = @hiera.lookup('trocla_hierarchy::plain::different_role', nil, scope1)
66
+ scope2 = {'::clientcert' => 'node02.example.com', '::role' => 'role2'}
67
+ password2 = @hiera.lookup('trocla_hierarchy::plain::different_role', nil, scope2)
68
+ expect(password1).not_to eq(password2)
69
+ end
70
+ end
71
+
72
+ describe 'options hash merging' do
73
+ it 'will crate a password with the default length' do
74
+ password = @hiera.lookup('trocla_lookup::plain::default_length', nil, nil)
75
+ expect(password.length).to eq(16)
76
+ end
77
+
78
+ it 'will create a password with the length for mysql format' do
79
+ mysql_password = @hiera.lookup('trocla_lookup::mysql::mysql_length', nil, nil)
80
+ password = @hiera.lookup('trocla_lookup::plain::mysql_length', nil, nil)
81
+ expect(password.length).to eq(32)
82
+ end
83
+
84
+ it 'will create a password with the length defined for the key' do
85
+ password = @hiera.lookup('trocla_lookup::plain::special_length', nil, nil)
86
+ expect(password.length).to eq(64)
87
+ end
88
+ end
89
+
90
+ end
@@ -0,0 +1,106 @@
1
+ require 'simplecov'
2
+ SimpleCov.start do
3
+ add_filter '/spec/'
4
+ add_filter '/.bundle/'
5
+ add_filter '/vendor/'
6
+ end
7
+
8
+
9
+ require 'hiera/backend/trocla'
10
+
11
+ # This file was generated by the `rspec --init` command. Conventionally, all
12
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
13
+ # The generated `.rspec` file contains `--require spec_helper` which will cause
14
+ # this file to always be loaded, without a need to explicitly require it in any
15
+ # files.
16
+ #
17
+ # Given that it is always loaded, you are encouraged to keep this file as
18
+ # light-weight as possible. Requiring heavyweight dependencies from this file
19
+ # will add to the boot time of your test suite on EVERY test run, even for an
20
+ # individual file that may not need all of that loaded. Instead, consider making
21
+ # a separate helper file that requires the additional dependencies and performs
22
+ # the additional setup, and require it from the spec files that actually need
23
+ # it.
24
+ #
25
+ # The `.rspec` file also contains a few flags that are not defaults but that
26
+ # users commonly want.
27
+ #
28
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
29
+ RSpec.configure do |config|
30
+ # rspec-expectations config goes here. You can use an alternate
31
+ # assertion/expectation library such as wrong or the stdlib/minitest
32
+ # assertions if you prefer.
33
+ config.expect_with :rspec do |expectations|
34
+ # This option will default to `true` in RSpec 4. It makes the `description`
35
+ # and `failure_message` of custom matchers include text for helper methods
36
+ # defined using `chain`, e.g.:
37
+ # be_bigger_than(2).and_smaller_than(4).description
38
+ # # => "be bigger than 2 and smaller than 4"
39
+ # ...rather than:
40
+ # # => "be bigger than 2"
41
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
42
+ end
43
+
44
+ # rspec-mocks config goes here. You can use an alternate test double
45
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
46
+ config.mock_with :rspec do |mocks|
47
+ # Prevents you from mocking or stubbing a method that does not exist on
48
+ # a real object. This is generally recommended, and will default to
49
+ # `true` in RSpec 4.
50
+ mocks.verify_partial_doubles = true
51
+ end
52
+
53
+ # The settings below are suggested to provide a good initial experience
54
+ # with RSpec, but feel free to customize to your heart's content.
55
+ =begin
56
+ # These two settings work together to allow you to limit a spec run
57
+ # to individual examples or groups you care about by tagging them with
58
+ # `:focus` metadata. When nothing is tagged with `:focus`, all examples
59
+ # get run.
60
+ config.filter_run :focus
61
+ config.run_all_when_everything_filtered = true
62
+
63
+ # Allows RSpec to persist some state between runs in order to support
64
+ # the `--only-failures` and `--next-failure` CLI options. We recommend
65
+ # you configure your source control system to ignore this file.
66
+ config.example_status_persistence_file_path = "spec/examples.txt"
67
+
68
+ # Limits the available syntax to the non-monkey patched syntax that is
69
+ # recommended. For more details, see:
70
+ # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
71
+ # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
72
+ # - http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3#new__config_option_to_disable_rspeccore_monkey_patching
73
+ config.disable_monkey_patching!
74
+
75
+ # This setting enables warnings. It's recommended, but in some cases may
76
+ # be too noisy due to issues in dependencies.
77
+ config.warnings = true
78
+
79
+ # Many RSpec users commonly either run the entire suite or an individual
80
+ # file, and it's useful to allow more verbose output when running an
81
+ # individual spec file.
82
+ if config.files_to_run.one?
83
+ # Use the documentation formatter for detailed output,
84
+ # unless a formatter has already been configured
85
+ # (e.g. via a command-line flag).
86
+ config.default_formatter = 'doc'
87
+ end
88
+
89
+ # Print the 10 slowest examples and example groups at the
90
+ # end of the spec run, to help surface which specs are running
91
+ # particularly slow.
92
+ config.profile_examples = 10
93
+
94
+ # Run specs in random order to surface order dependencies. If you find an
95
+ # order dependency and want to debug it, you can fix the order by providing
96
+ # the seed, which is printed after each run.
97
+ # --seed 1234
98
+ config.order = :random
99
+
100
+ # Seed global randomization in this process using the `--seed` CLI option.
101
+ # Setting this allows you to use `--seed` to deterministically reproduce
102
+ # test failures related to randomization by passing the same `--seed` value
103
+ # as the one that triggered the failure.
104
+ Kernel.srand config.seed
105
+ =end
106
+ end
metadata ADDED
@@ -0,0 +1,169 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hiera-backend-trocla
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Andreas Zuber
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2015-11-12 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '1.3'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '1.3'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: hiera
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rspec
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: simplecov
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: trocla
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ description: This is a hiera backend for the trocla password storage tool
111
+ email:
112
+ - zuber@puzzle.ch
113
+ executables: []
114
+ extensions: []
115
+ extra_rdoc_files: []
116
+ files:
117
+ - .gitignore
118
+ - .rspec
119
+ - .travis.yml
120
+ - Gemfile
121
+ - LICENSE.txt
122
+ - README.md
123
+ - Rakefile
124
+ - hiera-backend-trocla.gemspec
125
+ - lib/hiera/backend/trocla.rb
126
+ - lib/hiera/backend/trocla/version.rb
127
+ - lib/hiera/backend/trocla_backend.rb
128
+ - spec/config/hiera.yaml
129
+ - spec/config/hieradata/defaults.yaml
130
+ - spec/config/troclarc.yaml
131
+ - spec/hiera/backend/trocla_spec.rb
132
+ - spec/spec_helper.rb
133
+ homepage: ''
134
+ licenses:
135
+ - MIT
136
+ post_install_message:
137
+ rdoc_options: []
138
+ require_paths:
139
+ - lib
140
+ required_ruby_version: !ruby/object:Gem::Requirement
141
+ none: false
142
+ requirements:
143
+ - - ! '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ segments:
147
+ - 0
148
+ hash: -2728931727301270266
149
+ required_rubygems_version: !ruby/object:Gem::Requirement
150
+ none: false
151
+ requirements:
152
+ - - ! '>='
153
+ - !ruby/object:Gem::Version
154
+ version: '0'
155
+ segments:
156
+ - 0
157
+ hash: -2728931727301270266
158
+ requirements: []
159
+ rubyforge_project:
160
+ rubygems_version: 1.8.23
161
+ signing_key:
162
+ specification_version: 3
163
+ summary: This is a hiera backend for the trocla password storage tool
164
+ test_files:
165
+ - spec/config/hiera.yaml
166
+ - spec/config/hieradata/defaults.yaml
167
+ - spec/config/troclarc.yaml
168
+ - spec/hiera/backend/trocla_spec.rb
169
+ - spec/spec_helper.rb