knife-briefcase 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +17 -0
- data/.travis.yml +13 -0
- data/CHANGELOG.md +6 -0
- data/CONTRIBUTING.md +43 -0
- data/Gemfile +13 -0
- data/LICENSE.txt +22 -0
- data/README.md +83 -0
- data/Thorfile +60 -0
- data/knife-briefcase.gemspec +32 -0
- data/lib/chef/knife/briefcase_delete.rb +14 -0
- data/lib/chef/knife/briefcase_get.rb +34 -0
- data/lib/chef/knife/briefcase_list.rb +10 -0
- data/lib/chef/knife/briefcase_put.rb +32 -0
- data/lib/chef/knife/briefcase_reload.rb +45 -0
- data/lib/knife-briefcase.rb +5 -0
- data/lib/knife-briefcase/knife.rb +69 -0
- data/lib/knife-briefcase/version.rb +3 -0
- data/spec/chef/knife/briefcase_delete_spec.rb +44 -0
- data/spec/chef/knife/briefcase_get_spec.rb +43 -0
- data/spec/chef/knife/briefcase_list_spec.rb +17 -0
- data/spec/chef/knife/briefcase_put_spec.rb +60 -0
- data/spec/chef/knife/briefcase_reload_spec.rb +32 -0
- data/spec/fixtures/.gitignore +1 -0
- data/spec/fixtures/briefcase.pem +27 -0
- data/spec/fixtures/gnupg.1/.gitignore +1 -0
- data/spec/fixtures/gnupg.1/pubring.gpg +0 -0
- data/spec/fixtures/gnupg.1/secring.gpg +0 -0
- data/spec/fixtures/gnupg.1/trustdb.gpg +0 -0
- data/spec/fixtures/gnupg.2/.gitignore +1 -0
- data/spec/fixtures/gnupg.2/pubring.gpg +0 -0
- data/spec/fixtures/gnupg.2/secring.gpg +0 -0
- data/spec/fixtures/gnupg.2/trustdb.gpg +0 -0
- data/spec/fixtures/gnupg.without-1/.gitignore +1 -0
- data/spec/fixtures/gnupg.without-1/pubring.gpg +0 -0
- data/spec/fixtures/gnupg.without-1/secring.gpg +0 -0
- data/spec/fixtures/gnupg.without-1/trustdb.gpg +0 -0
- data/spec/fixtures/gnupg/.gitignore +1 -0
- data/spec/fixtures/gnupg/pubring.gpg +0 -0
- data/spec/fixtures/gnupg/secring.gpg +0 -0
- data/spec/fixtures/gnupg/trustdb.gpg +0 -0
- data/spec/fixtures/knife.rb +4 -0
- data/spec/knife-briefcase/version_spec.rb +11 -0
- data/spec/knife_helper.rb +140 -0
- data/spec/smoke_spec.rb +9 -0
- data/spec/spec_helper.rb +62 -0
- metadata +271 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
MjI5YTE4YzQ3OTk0ZTA2MjA5OGFhMTFkODJmNTAxYzk0ZWUwMTY2MA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
YTVmMGZiMGRkYTAwYjg1NzBjNzhiZGFhYmFjNmE5ZmE1NDc2ODk2Yw==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
NDRkMmJkMWFlNDFjM2Q3YzcyNGQ5MGUyZDA2MDYxNzU0MDg0ZDVjNDhiNzM1
|
10
|
+
YTU2OWRmNDMyMThhOGQzMTgzYTA4NTMzMzE0MTlhOWM4OWJiZDBjNDRjYmUz
|
11
|
+
YTg5YjJjZDA0OGQ1NDJjZmUwZjgzYWRhZmM3YTdmZmM2MGE1YWU=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
MDE5Zjk0Y2ZiNWZmMTY4MjNhZGM1NWM0YzI4MjFkY2M4OTdlZjVhZDgwYmEy
|
14
|
+
NmY1YWVjYzdlNTBmY2Q2ZmMxM2ZlNDM1MWE5MjQ0MDMyZDYyOGI3MWRiNjYx
|
15
|
+
NzdmYjU0NGY3MDZhODY5OGVlZjQ4Yzk2MzRmYTlhODY4ODY1NTI=
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
---
|
2
|
+
bundler_args: --without development_workstation
|
3
|
+
script: bundle exec thor spec:ci
|
4
|
+
rvm:
|
5
|
+
- 1.9.3
|
6
|
+
- 2.0.0
|
7
|
+
notifications:
|
8
|
+
hipchat:
|
9
|
+
secure: ! 'f83Ygzt9/IIABIe7W0lVEifCw7PIbrHiqQt/JTAawb0G10NgG2Svui9+fMj2
|
10
|
+
|
11
|
+
Byz4WPy0L4wOQ6YS8rV4Tv7tKjioSpUfkXClDlCLG0rFUEh4i/EsWVV+8NJ7
|
12
|
+
|
13
|
+
9ju8aksblSo22OaFGd8ufUPYEhMY/05m/wAVAyxtVqZGANXrPYc='
|
data/CHANGELOG.md
ADDED
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
# Contributing
|
2
|
+
|
3
|
+
## Developing
|
4
|
+
|
5
|
+
1. Fork the repository on GitHub
|
6
|
+
2. Create your feature branch (`git checkout -b feature/awesomeness`)
|
7
|
+
3. Create your changes.
|
8
|
+
* Add test cases in `spec/`. It's best if you first write a failing
|
9
|
+
test case, commit it, and then fix it in next commit - this makes
|
10
|
+
the whole change easier to review.
|
11
|
+
* Document your changes.
|
12
|
+
4. Commit your changes (`git commit -am 'Add more awesomeness'`)
|
13
|
+
5. Push to the branch (`git push -u origin feature/awesomeness`)
|
14
|
+
6. Create new Pull Request on GitHub
|
15
|
+
|
16
|
+
## Testing
|
17
|
+
|
18
|
+
### Install what's needed
|
19
|
+
|
20
|
+
Make sure you have [http://gembundler.com/](Gem Bundler) version 1.3
|
21
|
+
or greater installed. If in doubt, just use [http://rvm.io/](RVM) or
|
22
|
+
[http://rbenv.org/](rbenv).
|
23
|
+
|
24
|
+
$ gem install bundler
|
25
|
+
|
26
|
+
Clone the project:
|
27
|
+
|
28
|
+
$ git clone git://github.com/3ofcoins/knife-briefcase.git
|
29
|
+
|
30
|
+
Then, run:
|
31
|
+
|
32
|
+
$ cd knife-briefcase
|
33
|
+
$ bundle install
|
34
|
+
|
35
|
+
Bundler will install all the needed gems and their dependencies.
|
36
|
+
|
37
|
+
### Running tests
|
38
|
+
|
39
|
+
$ bundle exec thor spec
|
40
|
+
|
41
|
+
To generate test coverage report, tell it to Thor
|
42
|
+
|
43
|
+
$ bundle exec thor spec --coverage
|
data/Gemfile
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
gemspec
|
4
|
+
|
5
|
+
# Helpers used with development, but not needed in runtime, build
|
6
|
+
# time, or for tests.
|
7
|
+
group :development_workstation do
|
8
|
+
gem 'awesome_print'
|
9
|
+
gem 'pry'
|
10
|
+
gem 'pry-debugger'
|
11
|
+
gem 'pry-rescue'
|
12
|
+
gem 'pry-stack_explorer'
|
13
|
+
end
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Maciej Pasternacki <maciej@3ofcoins.net>
|
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,83 @@
|
|
1
|
+
# Knife Briefcase
|
2
|
+
|
3
|
+
This gem is [Knife](http://docs.opscode.com/knife.html) plugin for
|
4
|
+
[Opscode Chef](http://www.opscode.com/chef/) that stores GPG-encrypted
|
5
|
+
content for people in chef server's data bag.
|
6
|
+
|
7
|
+
Its intended use is to share infrastructure-related secrets (such as
|
8
|
+
encrypted data bag secret files, SSL private keys, passwords, etc.)
|
9
|
+
among the infrastructure team.
|
10
|
+
|
11
|
+
This may or may not work nicely with
|
12
|
+
[git-annex](http://git-annex.branchable.com/) via
|
13
|
+
[_hook_ special remote](http://git-annex.branchable.com/special_remotes/hook/).
|
14
|
+
|
15
|
+
## Installation
|
16
|
+
|
17
|
+
Add this line to your Chef repository's Gemfile:
|
18
|
+
|
19
|
+
gem 'knife-briefcase', :git => 'git://github.com/3ofcoins/knife-briefcase/'
|
20
|
+
|
21
|
+
Or install it yourself:
|
22
|
+
|
23
|
+
$ gem build knife-briefcase.gemspec
|
24
|
+
$ gem install knife-briefcase*.gem
|
25
|
+
|
26
|
+
## Usage
|
27
|
+
|
28
|
+
`knife briefcase put NAME [FILE]` -- encrypts and signs named `FILE`
|
29
|
+
or stdin, and saves it in the data bag with ID `NAME`.
|
30
|
+
|
31
|
+
`knife briefcase get NAME [FILE]` -- gets `NAME` from the data bag,
|
32
|
+
checks signature, decrypts, and shows the contents on standard output,
|
33
|
+
or saves it to `FILE` if provided.
|
34
|
+
|
35
|
+
`knife briefcase list` -- lists encrypted items in the data bag.
|
36
|
+
|
37
|
+
`knife briefcase delete NAME [NAME [...]]` -- deletes listed `NAME`s
|
38
|
+
from the data bag.
|
39
|
+
|
40
|
+
> **TODO: it may be good to refuse to delete files that the user is
|
41
|
+
> unable to encrypt.** User is able to delete them anyway, using
|
42
|
+
> `knife data bag delete`, but it shouldn't be allowed via `knife
|
43
|
+
> briefcase` command.
|
44
|
+
|
45
|
+
`knife briefcase reload [NAME [NAME [...]]]` -- downloads and decrypts
|
46
|
+
listed items, re-encrypts and re-signs them, and saves the
|
47
|
+
re-encrypted content back. If no names are provided, all the items are
|
48
|
+
re-encrypted. This should be called when briefcase holders list is
|
49
|
+
changed, to allow added user to decrypt bag - or to prevent further
|
50
|
+
access by removed user.
|
51
|
+
|
52
|
+
## Configuration
|
53
|
+
|
54
|
+
Following `knife.rb` settings are used:
|
55
|
+
|
56
|
+
- `briefcase_holders` -- array of e-mail addresses that will be GPG
|
57
|
+
recipients of the data
|
58
|
+
- `briefcase_signers` -- e-mail address (or array of e-mail
|
59
|
+
addresses) that will be used to sign encrypted content
|
60
|
+
- `briefcase_data_bag` -- name of the data bag that will be used by
|
61
|
+
default to hold encrypted content. If not provided, `briefcase`
|
62
|
+
data bag will be used. The data bag name can be overriden on
|
63
|
+
command line.
|
64
|
+
|
65
|
+
### Example configuration
|
66
|
+
|
67
|
+
```ruby
|
68
|
+
briefcase_signers `git config --get user.email`.strip
|
69
|
+
briefcase_holders [
|
70
|
+
'alice@myproject.com',
|
71
|
+
'bob@myproject.com',
|
72
|
+
'claire@myproject.com',
|
73
|
+
'dave@myproject.com',
|
74
|
+
'erin@myproject.com' ]
|
75
|
+
```
|
76
|
+
|
77
|
+
## Contributing
|
78
|
+
|
79
|
+
See the [CONTRIBUTING.md](CONTRIBUTING.md) file
|
80
|
+
|
81
|
+
------------------------------------------------------------------------------
|
82
|
+
|
83
|
+
[![Build Status](https://travis-ci.org/3ofcoins/knife-briefcase.png?branch=master)](https://travis-ci.org/3ofcoins/knife-briefcase)
|
data/Thorfile
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
$:.push File.expand_path('../lib', __FILE__)
|
2
|
+
require 'rubygems'
|
3
|
+
|
4
|
+
require 'bundler/setup'
|
5
|
+
|
6
|
+
require 'rake/testtask'
|
7
|
+
require 'thor/rake_compat'
|
8
|
+
|
9
|
+
class Default < Thor
|
10
|
+
class Gem < Thor
|
11
|
+
namespace :gem
|
12
|
+
|
13
|
+
include Thor::RakeCompat
|
14
|
+
Bundler::GemHelper.install_tasks
|
15
|
+
|
16
|
+
desc "build", "Build knife-briefcase-#{KnifeBriefcase::VERSION}.gem into the pkg directory"
|
17
|
+
def build
|
18
|
+
Rake::Task["build"].execute
|
19
|
+
end
|
20
|
+
|
21
|
+
desc "release", "Create tag v#{KnifeBriefcase::VERSION} and build and push knife-briefcase-#{KnifeBriefcase::VERSION}.gem to Rubygems"
|
22
|
+
def release
|
23
|
+
Rake::Task["release"].execute
|
24
|
+
end
|
25
|
+
|
26
|
+
desc "install", "Build and install knife-briefcase-#{KnifeBriefcase::VERSION}.gem into system gems"
|
27
|
+
def install
|
28
|
+
Rake::Task["install"].execute
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class Test < Thor
|
33
|
+
namespace :test
|
34
|
+
default_command :all
|
35
|
+
|
36
|
+
include Thor::RakeCompat
|
37
|
+
|
38
|
+
Rake::TestTask.new :spec do |task|
|
39
|
+
task.libs << 'spec'
|
40
|
+
task.test_files = FileList['spec/**/*_spec.rb']
|
41
|
+
end
|
42
|
+
|
43
|
+
desc 'spec', 'Run specs'
|
44
|
+
def spec
|
45
|
+
Rake::Task['spec'].execute
|
46
|
+
end
|
47
|
+
|
48
|
+
desc 'all', 'Run all tests'
|
49
|
+
def all
|
50
|
+
invoke(:spec)
|
51
|
+
end
|
52
|
+
|
53
|
+
desc 'ci', 'Run all tests for continuous integration'
|
54
|
+
def ci
|
55
|
+
ENV['CI'] = 'true'
|
56
|
+
invoke(:all)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# -*- mode: ruby; coding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'knife-briefcase/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "knife-briefcase"
|
8
|
+
spec.version = KnifeBriefcase::VERSION
|
9
|
+
spec.authors = ["Maciej Pasternacki"]
|
10
|
+
spec.email = ["maciej@pasternacki.net"]
|
11
|
+
spec.description = 'Knife plugin to store GPG-encrypted data in Chef data bag'
|
12
|
+
spec.summary = spec.description
|
13
|
+
spec.homepage = "https://github.com/3ofcoins/knife-briefcase/"
|
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_dependency "chef"
|
22
|
+
spec.add_dependency "gpgme"
|
23
|
+
spec.add_dependency "highline"
|
24
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
25
|
+
spec.add_development_dependency "chef-zero"
|
26
|
+
spec.add_development_dependency "minitest"
|
27
|
+
spec.add_development_dependency "mocha"
|
28
|
+
spec.add_development_dependency "ridley"
|
29
|
+
spec.add_development_dependency "simplecov"
|
30
|
+
spec.add_development_dependency "thor", "~> 0.18.1"
|
31
|
+
spec.add_development_dependency "wrong", ">= 0.7.0"
|
32
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'knife-briefcase/knife'
|
2
|
+
|
3
|
+
class Chef::Knife::BriefcaseDelete < Chef::Knife
|
4
|
+
include KnifeBriefcase::Knife
|
5
|
+
banner "knife briefcase delete NAME [NAME [...]]"
|
6
|
+
|
7
|
+
def run
|
8
|
+
@name_args.each do |item_name|
|
9
|
+
delete_object(Chef::DataBagItem, item_name, 'briefcase_item') do
|
10
|
+
rest.delete_rest("data/#{data_bag_name}/#{item_name}")
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'knife-briefcase/knife'
|
2
|
+
|
3
|
+
class Chef::Knife::BriefcaseGet < Chef::Knife
|
4
|
+
include KnifeBriefcase::Knife
|
5
|
+
banner "knife briefcase get NAME [FILE]"
|
6
|
+
|
7
|
+
def run
|
8
|
+
encrypted = Chef::DataBagItem.load(data_bag_name, @name_args[0]).
|
9
|
+
raw_data['content']
|
10
|
+
|
11
|
+
begin
|
12
|
+
crypto.verify(GPGME::Data.from_str(encrypted)) do |sig|
|
13
|
+
if sig.valid?
|
14
|
+
Chef::Log.info(sig.to_s)
|
15
|
+
else
|
16
|
+
Chef::Log.error(sig.to_s)
|
17
|
+
exit 1 # TODO: --force
|
18
|
+
end
|
19
|
+
end
|
20
|
+
rescue
|
21
|
+
Chef::Log.error("Cannot verify signature: #{$!}")
|
22
|
+
exit 1
|
23
|
+
end
|
24
|
+
|
25
|
+
if file
|
26
|
+
crypto.decrypt(GPGME::Data.from_str(encrypted), :output => File.open(file, 'w+'))
|
27
|
+
else
|
28
|
+
stdout.write(crypto.decrypt(GPGME::Data.from_str(encrypted)))
|
29
|
+
end
|
30
|
+
rescue GPGME::Error::DecryptFailed
|
31
|
+
Chef::Log.fatal("Decryption failed")
|
32
|
+
exit 1
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'knife-briefcase/knife'
|
2
|
+
|
3
|
+
class Chef::Knife::BriefcasePut < Chef::Knife
|
4
|
+
include KnifeBriefcase::Knife
|
5
|
+
banner "knife briefcase put NAME [FILE]"
|
6
|
+
|
7
|
+
def run
|
8
|
+
encrypted = crypto.encrypt( GPGME::Data.from_io(file ? File.open(file) : stdin),
|
9
|
+
:recipients => recipients,
|
10
|
+
:sign => !!signers,
|
11
|
+
:signers => signers,
|
12
|
+
:always_trust => true)
|
13
|
+
|
14
|
+
begin
|
15
|
+
rest.post_rest("data", { "name" => data_bag_name })
|
16
|
+
ui.info("Created data_bag[#{data_bag_name}]")
|
17
|
+
rescue Net::HTTPServerException => e
|
18
|
+
raise unless e.to_s =~ /^409/
|
19
|
+
ui.info("data_bag[#{data_bag_name}] already exists")
|
20
|
+
end
|
21
|
+
|
22
|
+
item = Chef::DataBagItem.from_hash(
|
23
|
+
'id' => item_name, 'content' => encrypted.to_s )
|
24
|
+
item.data_bag(data_bag_name)
|
25
|
+
begin
|
26
|
+
rest.post_rest("data/#{data_bag_name}", item)
|
27
|
+
rescue Net::HTTPServerException => e
|
28
|
+
raise unless e.to_s =~ /^409/
|
29
|
+
rest.put_rest("data/#{data_bag_name}/#{item_name}", item)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'knife-briefcase/knife'
|
2
|
+
|
3
|
+
class Chef::Knife::BriefcaseReload < Chef::Knife
|
4
|
+
include KnifeBriefcase::Knife
|
5
|
+
banner "knife briefcase reload [NAME [NAME [...]]]"
|
6
|
+
|
7
|
+
def run
|
8
|
+
item_names = if @name_args.empty?
|
9
|
+
Chef::DataBag.list(data_bag_name).keys
|
10
|
+
else
|
11
|
+
@name_args
|
12
|
+
end
|
13
|
+
|
14
|
+
item_names.each do |item_name|
|
15
|
+
encrypted = Chef::DataBagItem.load(data_bag_name, item_name).raw_data['content']
|
16
|
+
|
17
|
+
begin
|
18
|
+
crypto.verify(GPGME::Data.from_str(encrypted)) do |sig|
|
19
|
+
if sig.valid?
|
20
|
+
Chef::Log.info(sig.to_s)
|
21
|
+
else
|
22
|
+
Chef::Log.error(sig.to_s)
|
23
|
+
exit 1 # TODO: --force
|
24
|
+
end
|
25
|
+
end
|
26
|
+
rescue
|
27
|
+
Chef::Log.error("Cannot verify signature: #{$!}")
|
28
|
+
exit 1
|
29
|
+
end
|
30
|
+
|
31
|
+
recrypted = crypto.encrypt(
|
32
|
+
crypto.decrypt(GPGME::Data.from_str(encrypted)),
|
33
|
+
|
34
|
+
:recipients => recipients,
|
35
|
+
:sign => !!signers,
|
36
|
+
:signers => signers,
|
37
|
+
:always_trust => true)
|
38
|
+
|
39
|
+
item = Chef::DataBagItem.from_hash(
|
40
|
+
'id' => item_name, 'content' => recrypted.to_s )
|
41
|
+
item.data_bag(data_bag_name)
|
42
|
+
rest.put_rest("data/#{data_bag_name}/#{item_name}", item)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|