TrueCar-chef 0.10.0.beta.3
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.
- data/LICENSE +201 -0
- data/README.rdoc +171 -0
- data/bin/chef-client +26 -0
- data/bin/chef-solo +25 -0
- data/bin/knife +26 -0
- data/bin/shef +34 -0
- data/distro/README +2 -0
- data/distro/arch/etc/conf.d/chef-client.conf +5 -0
- data/distro/arch/etc/conf.d/chef-server-webui.conf +10 -0
- data/distro/arch/etc/conf.d/chef-server.conf +10 -0
- data/distro/arch/etc/conf.d/chef-solr-indexer.conf +8 -0
- data/distro/arch/etc/conf.d/chef-solr.conf +8 -0
- data/distro/arch/etc/rc.d/chef-client +76 -0
- data/distro/arch/etc/rc.d/chef-server +78 -0
- data/distro/arch/etc/rc.d/chef-server-webui +78 -0
- data/distro/arch/etc/rc.d/chef-solr +78 -0
- data/distro/arch/etc/rc.d/chef-solr-indexer +78 -0
- data/distro/common/man/man1/chef-indexer.1 +42 -0
- data/distro/common/man/man1/chef-server-webui.1 +106 -0
- data/distro/common/man/man1/chef-server.1 +107 -0
- data/distro/common/man/man1/chef-solr-indexer.1 +55 -0
- data/distro/common/man/man1/chef-solr.1 +55 -0
- data/distro/common/man/man8/chef-client.8 +63 -0
- data/distro/common/man/man8/chef-solo.8 +57 -0
- data/distro/common/man/man8/chef-solr-rebuild.8 +37 -0
- data/distro/common/man/man8/knife.8 +1349 -0
- data/distro/common/man/man8/shef.8 +45 -0
- data/distro/common/markdown/README +3 -0
- data/distro/common/markdown/knife.mkd +865 -0
- data/distro/debian/etc/default/chef-client +4 -0
- data/distro/debian/etc/default/chef-server +9 -0
- data/distro/debian/etc/default/chef-server-webui +9 -0
- data/distro/debian/etc/default/chef-solr +8 -0
- data/distro/debian/etc/default/chef-solr-indexer +7 -0
- data/distro/debian/etc/init.d/chef-client +175 -0
- data/distro/debian/etc/init.d/chef-server +122 -0
- data/distro/debian/etc/init.d/chef-server-webui +123 -0
- data/distro/debian/etc/init.d/chef-solr +176 -0
- data/distro/debian/etc/init.d/chef-solr-indexer +176 -0
- data/distro/debian/etc/init/chef-client.conf +17 -0
- data/distro/debian/etc/init/chef-server-webui.conf +17 -0
- data/distro/debian/etc/init/chef-server.conf +17 -0
- data/distro/debian/etc/init/chef-solr-indexer.conf +17 -0
- data/distro/debian/etc/init/chef-solr.conf +17 -0
- data/distro/redhat/etc/init.d/chef-client +106 -0
- data/distro/redhat/etc/init.d/chef-server +112 -0
- data/distro/redhat/etc/init.d/chef-server-webui +112 -0
- data/distro/redhat/etc/init.d/chef-solr +104 -0
- data/distro/redhat/etc/init.d/chef-solr-indexer +104 -0
- data/distro/redhat/etc/logrotate.d/chef-client +8 -0
- data/distro/redhat/etc/logrotate.d/chef-server +8 -0
- data/distro/redhat/etc/logrotate.d/chef-server-webui +8 -0
- data/distro/redhat/etc/logrotate.d/chef-solr +8 -0
- data/distro/redhat/etc/logrotate.d/chef-solr-indexer +8 -0
- data/distro/redhat/etc/sysconfig/chef-client +15 -0
- data/distro/redhat/etc/sysconfig/chef-server +14 -0
- data/distro/redhat/etc/sysconfig/chef-server-webui +14 -0
- data/distro/redhat/etc/sysconfig/chef-solr +8 -0
- data/distro/redhat/etc/sysconfig/chef-solr-indexer +7 -0
- data/lib/chef.rb +40 -0
- data/lib/chef/api_client.rb +264 -0
- data/lib/chef/application.rb +137 -0
- data/lib/chef/application/agent.rb +18 -0
- data/lib/chef/application/client.rb +242 -0
- data/lib/chef/application/knife.rb +169 -0
- data/lib/chef/application/solo.rb +217 -0
- data/lib/chef/applications.rb +4 -0
- data/lib/chef/certificate.rb +194 -0
- data/lib/chef/checksum.rb +182 -0
- data/lib/chef/checksum_cache.rb +189 -0
- data/lib/chef/client.rb +362 -0
- data/lib/chef/config.rb +244 -0
- data/lib/chef/cookbook/chefignore.rb +66 -0
- data/lib/chef/cookbook/cookbook_collection.rb +45 -0
- data/lib/chef/cookbook/cookbook_version_loader.rb +151 -0
- data/lib/chef/cookbook/file_system_file_vendor.rb +56 -0
- data/lib/chef/cookbook/file_vendor.rb +48 -0
- data/lib/chef/cookbook/metadata.rb +592 -0
- data/lib/chef/cookbook/remote_file_vendor.rb +87 -0
- data/lib/chef/cookbook/syntax_check.rb +136 -0
- data/lib/chef/cookbook_loader.rb +103 -0
- data/lib/chef/cookbook_site_streaming_uploader.rb +244 -0
- data/lib/chef/cookbook_uploader.rb +125 -0
- data/lib/chef/cookbook_version.rb +979 -0
- data/lib/chef/cookbook_version_selector.rb +163 -0
- data/lib/chef/couchdb.rb +247 -0
- data/lib/chef/daemon.rb +172 -0
- data/lib/chef/data_bag.rb +223 -0
- data/lib/chef/data_bag_item.rb +267 -0
- data/lib/chef/encrypted_data_bag_item.rb +126 -0
- data/lib/chef/environment.rb +386 -0
- data/lib/chef/exceptions.rb +153 -0
- data/lib/chef/file_access_control.rb +140 -0
- data/lib/chef/file_cache.rb +218 -0
- data/lib/chef/handler.rb +206 -0
- data/lib/chef/handler/json_file.rb +58 -0
- data/lib/chef/index_queue.rb +29 -0
- data/lib/chef/index_queue/amqp_client.rb +116 -0
- data/lib/chef/index_queue/consumer.rb +76 -0
- data/lib/chef/index_queue/indexable.rb +109 -0
- data/lib/chef/json_compat.rb +52 -0
- data/lib/chef/knife.rb +424 -0
- data/lib/chef/knife/bootstrap.rb +185 -0
- data/lib/chef/knife/bootstrap/archlinux-gems.erb +47 -0
- data/lib/chef/knife/bootstrap/centos5-gems.erb +41 -0
- data/lib/chef/knife/bootstrap/client-install.vbs +80 -0
- data/lib/chef/knife/bootstrap/fedora13-gems.erb +38 -0
- data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +32 -0
- data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +46 -0
- data/lib/chef/knife/bootstrap/windows-gems.erb +34 -0
- data/lib/chef/knife/client_bulk_delete.rb +43 -0
- data/lib/chef/knife/client_create.rb +73 -0
- data/lib/chef/knife/client_delete.rb +48 -0
- data/lib/chef/knife/client_edit.rb +48 -0
- data/lib/chef/knife/client_list.rb +43 -0
- data/lib/chef/knife/client_reregister.rb +59 -0
- data/lib/chef/knife/client_show.rb +53 -0
- data/lib/chef/knife/configure.rb +136 -0
- data/lib/chef/knife/configure_client.rb +52 -0
- data/lib/chef/knife/cookbook_bulk_delete.rb +61 -0
- data/lib/chef/knife/cookbook_create.rb +274 -0
- data/lib/chef/knife/cookbook_delete.rb +149 -0
- data/lib/chef/knife/cookbook_download.rb +134 -0
- data/lib/chef/knife/cookbook_list.rb +50 -0
- data/lib/chef/knife/cookbook_metadata.rb +102 -0
- data/lib/chef/knife/cookbook_metadata_from_file.rb +44 -0
- data/lib/chef/knife/cookbook_show.rb +101 -0
- data/lib/chef/knife/cookbook_site_download.rb +58 -0
- data/lib/chef/knife/cookbook_site_list.rb +56 -0
- data/lib/chef/knife/cookbook_site_search.rb +51 -0
- data/lib/chef/knife/cookbook_site_share.rb +114 -0
- data/lib/chef/knife/cookbook_site_show.rb +57 -0
- data/lib/chef/knife/cookbook_site_unshare.rb +56 -0
- data/lib/chef/knife/cookbook_site_vendor.rb +145 -0
- data/lib/chef/knife/cookbook_test.rb +82 -0
- data/lib/chef/knife/cookbook_upload.rb +146 -0
- data/lib/chef/knife/data_bag_create.rb +94 -0
- data/lib/chef/knife/data_bag_delete.rb +51 -0
- data/lib/chef/knife/data_bag_edit.rb +94 -0
- data/lib/chef/knife/data_bag_from_file.rb +85 -0
- data/lib/chef/knife/data_bag_list.rb +46 -0
- data/lib/chef/knife/data_bag_show.rb +81 -0
- data/lib/chef/knife/environment_create.rb +53 -0
- data/lib/chef/knife/environment_delete.rb +45 -0
- data/lib/chef/knife/environment_edit.rb +45 -0
- data/lib/chef/knife/environment_from_file.rb +39 -0
- data/lib/chef/knife/environment_list.rb +42 -0
- data/lib/chef/knife/environment_show.rb +46 -0
- data/lib/chef/knife/exec.rb +51 -0
- data/lib/chef/knife/index_rebuild.rb +50 -0
- data/lib/chef/knife/node_bulk_delete.rb +46 -0
- data/lib/chef/knife/node_create.rb +50 -0
- data/lib/chef/knife/node_delete.rb +47 -0
- data/lib/chef/knife/node_edit.rb +163 -0
- data/lib/chef/knife/node_from_file.rb +45 -0
- data/lib/chef/knife/node_list.rb +46 -0
- data/lib/chef/knife/node_run_list_add.rb +67 -0
- data/lib/chef/knife/node_run_list_remove.rb +48 -0
- data/lib/chef/knife/node_show.rb +62 -0
- data/lib/chef/knife/recipe_list.rb +33 -0
- data/lib/chef/knife/role_bulk_delete.rb +47 -0
- data/lib/chef/knife/role_create.rb +55 -0
- data/lib/chef/knife/role_delete.rb +47 -0
- data/lib/chef/knife/role_edit.rb +48 -0
- data/lib/chef/knife/role_from_file.rb +49 -0
- data/lib/chef/knife/role_list.rb +43 -0
- data/lib/chef/knife/role_show.rb +54 -0
- data/lib/chef/knife/search.rb +123 -0
- data/lib/chef/knife/ssh.rb +318 -0
- data/lib/chef/knife/status.rb +90 -0
- data/lib/chef/knife/subcommand_loader.rb +101 -0
- data/lib/chef/knife/tag_create.rb +31 -0
- data/lib/chef/knife/tag_delete.rb +31 -0
- data/lib/chef/knife/tag_list.rb +29 -0
- data/lib/chef/knife/ui.rb +227 -0
- data/lib/chef/knife/windows_bootstrap.rb +157 -0
- data/lib/chef/log.rb +39 -0
- data/lib/chef/mash.rb +211 -0
- data/lib/chef/mixin/check_helper.rb +31 -0
- data/lib/chef/mixin/checksum.rb +32 -0
- data/lib/chef/mixin/command.rb +221 -0
- data/lib/chef/mixin/command/unix.rb +215 -0
- data/lib/chef/mixin/command/windows.rb +76 -0
- data/lib/chef/mixin/convert_to_class_name.rb +63 -0
- data/lib/chef/mixin/create_path.rb +56 -0
- data/lib/chef/mixin/deep_merge.rb +225 -0
- data/lib/chef/mixin/deprecation.rb +65 -0
- data/lib/chef/mixin/from_file.rb +50 -0
- data/lib/chef/mixin/language.rb +165 -0
- data/lib/chef/mixin/language_include_attribute.rb +61 -0
- data/lib/chef/mixin/language_include_recipe.rb +52 -0
- data/lib/chef/mixin/params_validate.rb +225 -0
- data/lib/chef/mixin/recipe_definition_dsl_core.rb +81 -0
- data/lib/chef/mixin/shell_out.rb +40 -0
- data/lib/chef/mixin/template.rb +95 -0
- data/lib/chef/mixin/xml_escape.rb +140 -0
- data/lib/chef/mixins.rb +15 -0
- data/lib/chef/monkey_patches/dir.rb +36 -0
- data/lib/chef/monkey_patches/numeric.rb +7 -0
- data/lib/chef/monkey_patches/regexp.rb +34 -0
- data/lib/chef/monkey_patches/string.rb +28 -0
- data/lib/chef/monkey_patches/tempfile.rb +64 -0
- data/lib/chef/nil_argument.rb +3 -0
- data/lib/chef/node.rb +661 -0
- data/lib/chef/node/attribute.rb +487 -0
- data/lib/chef/openid_registration.rb +187 -0
- data/lib/chef/platform.rb +409 -0
- data/lib/chef/provider.rb +124 -0
- data/lib/chef/provider/breakpoint.rb +36 -0
- data/lib/chef/provider/cookbook_file.rb +101 -0
- data/lib/chef/provider/cron.rb +186 -0
- data/lib/chef/provider/cron/solaris.rb +195 -0
- data/lib/chef/provider/deploy.rb +320 -0
- data/lib/chef/provider/deploy/revision.rb +80 -0
- data/lib/chef/provider/deploy/timestamped.rb +33 -0
- data/lib/chef/provider/directory.rb +72 -0
- data/lib/chef/provider/env.rb +152 -0
- data/lib/chef/provider/env/windows.rb +75 -0
- data/lib/chef/provider/erl_call.rb +100 -0
- data/lib/chef/provider/execute.rb +60 -0
- data/lib/chef/provider/file.rb +222 -0
- data/lib/chef/provider/git.rb +221 -0
- data/lib/chef/provider/group.rb +133 -0
- data/lib/chef/provider/group/aix.rb +70 -0
- data/lib/chef/provider/group/dscl.rb +121 -0
- data/lib/chef/provider/group/gpasswd.rb +53 -0
- data/lib/chef/provider/group/groupadd.rb +81 -0
- data/lib/chef/provider/group/pw.rb +84 -0
- data/lib/chef/provider/group/usermod.rb +57 -0
- data/lib/chef/provider/group/windows.rb +79 -0
- data/lib/chef/provider/http_request.rb +122 -0
- data/lib/chef/provider/ifconfig.rb +132 -0
- data/lib/chef/provider/link.rb +161 -0
- data/lib/chef/provider/log.rb +54 -0
- data/lib/chef/provider/mdadm.rb +91 -0
- data/lib/chef/provider/mount.rb +117 -0
- data/lib/chef/provider/mount/mount.rb +232 -0
- data/lib/chef/provider/mount/windows.rb +80 -0
- data/lib/chef/provider/ohai.rb +41 -0
- data/lib/chef/provider/package.rb +160 -0
- data/lib/chef/provider/package/apt.rb +110 -0
- data/lib/chef/provider/package/dpkg.rb +112 -0
- data/lib/chef/provider/package/easy_install.rb +136 -0
- data/lib/chef/provider/package/freebsd.rb +123 -0
- data/lib/chef/provider/package/macports.rb +105 -0
- data/lib/chef/provider/package/pacman.rb +101 -0
- data/lib/chef/provider/package/portage.rb +135 -0
- data/lib/chef/provider/package/rpm.rb +101 -0
- data/lib/chef/provider/package/rubygems.rb +462 -0
- data/lib/chef/provider/package/solaris.rb +127 -0
- data/lib/chef/provider/package/yum-dump.py +128 -0
- data/lib/chef/provider/package/yum.rb +261 -0
- data/lib/chef/provider/package/zypper.rb +133 -0
- data/lib/chef/provider/remote_directory.rb +138 -0
- data/lib/chef/provider/remote_file.rb +119 -0
- data/lib/chef/provider/route.rb +195 -0
- data/lib/chef/provider/ruby_block.rb +33 -0
- data/lib/chef/provider/script.rb +55 -0
- data/lib/chef/provider/service.rb +128 -0
- data/lib/chef/provider/service/arch.rb +109 -0
- data/lib/chef/provider/service/debian.rb +130 -0
- data/lib/chef/provider/service/freebsd.rb +156 -0
- data/lib/chef/provider/service/gentoo.rb +54 -0
- data/lib/chef/provider/service/init.rb +71 -0
- data/lib/chef/provider/service/insserv.rb +52 -0
- data/lib/chef/provider/service/redhat.rb +60 -0
- data/lib/chef/provider/service/simple.rb +118 -0
- data/lib/chef/provider/service/solaris.rb +85 -0
- data/lib/chef/provider/service/upstart.rb +192 -0
- data/lib/chef/provider/service/windows.rb +146 -0
- data/lib/chef/provider/subversion.rb +194 -0
- data/lib/chef/provider/template.rb +105 -0
- data/lib/chef/provider/user.rb +187 -0
- data/lib/chef/provider/user/dscl.rb +280 -0
- data/lib/chef/provider/user/pw.rb +113 -0
- data/lib/chef/provider/user/useradd.rb +137 -0
- data/lib/chef/provider/user/windows.rb +124 -0
- data/lib/chef/providers.rb +93 -0
- data/lib/chef/recipe.rb +128 -0
- data/lib/chef/resource.rb +530 -0
- data/lib/chef/resource/apt_package.rb +34 -0
- data/lib/chef/resource/bash.rb +33 -0
- data/lib/chef/resource/breakpoint.rb +35 -0
- data/lib/chef/resource/cookbook_file.rb +45 -0
- data/lib/chef/resource/cron.rb +188 -0
- data/lib/chef/resource/csh.rb +33 -0
- data/lib/chef/resource/deploy.rb +371 -0
- data/lib/chef/resource/deploy_revision.rb +35 -0
- data/lib/chef/resource/directory.rb +76 -0
- data/lib/chef/resource/dpkg_package.rb +34 -0
- data/lib/chef/resource/easy_install_package.rb +57 -0
- data/lib/chef/resource/env.rb +58 -0
- data/lib/chef/resource/erl_call.rb +83 -0
- data/lib/chef/resource/execute.rb +127 -0
- data/lib/chef/resource/file.rb +99 -0
- data/lib/chef/resource/freebsd_package.rb +35 -0
- data/lib/chef/resource/gem_package.rb +53 -0
- data/lib/chef/resource/git.rb +37 -0
- data/lib/chef/resource/group.rb +70 -0
- data/lib/chef/resource/http_request.rb +61 -0
- data/lib/chef/resource/ifconfig.rb +134 -0
- data/lib/chef/resource/link.rb +78 -0
- data/lib/chef/resource/log.rb +62 -0
- data/lib/chef/resource/macports_package.rb +29 -0
- data/lib/chef/resource/mdadm.rb +82 -0
- data/lib/chef/resource/mount.rb +135 -0
- data/lib/chef/resource/ohai.rb +40 -0
- data/lib/chef/resource/package.rb +80 -0
- data/lib/chef/resource/pacman_package.rb +33 -0
- data/lib/chef/resource/perl.rb +33 -0
- data/lib/chef/resource/portage_package.rb +33 -0
- data/lib/chef/resource/python.rb +33 -0
- data/lib/chef/resource/remote_directory.rb +109 -0
- data/lib/chef/resource/remote_file.rb +83 -0
- data/lib/chef/resource/route.rb +135 -0
- data/lib/chef/resource/rpm_package.rb +34 -0
- data/lib/chef/resource/ruby.rb +33 -0
- data/lib/chef/resource/ruby_block.rb +40 -0
- data/lib/chef/resource/scm.rb +147 -0
- data/lib/chef/resource/script.rb +60 -0
- data/lib/chef/resource/service.rb +160 -0
- data/lib/chef/resource/solaris_package.rb +36 -0
- data/lib/chef/resource/subversion.rb +36 -0
- data/lib/chef/resource/template.rb +69 -0
- data/lib/chef/resource/timestamped_deploy.rb +31 -0
- data/lib/chef/resource/user.rb +130 -0
- data/lib/chef/resource/yum_package.rb +43 -0
- data/lib/chef/resource_collection.rb +217 -0
- data/lib/chef/resource_collection/stepable_iterator.rb +124 -0
- data/lib/chef/resource_definition.rb +67 -0
- data/lib/chef/resource_definition_list.rb +38 -0
- data/lib/chef/resources.rb +64 -0
- data/lib/chef/rest.rb +386 -0
- data/lib/chef/rest/auth_credentials.rb +71 -0
- data/lib/chef/rest/cookie_jar.rb +31 -0
- data/lib/chef/rest/rest_request.rb +188 -0
- data/lib/chef/role.rb +341 -0
- data/lib/chef/run_context.rb +126 -0
- data/lib/chef/run_list.rb +165 -0
- data/lib/chef/run_list/run_list_expansion.rb +193 -0
- data/lib/chef/run_list/run_list_item.rb +92 -0
- data/lib/chef/run_list/versioned_recipe_list.rb +68 -0
- data/lib/chef/run_status.rb +121 -0
- data/lib/chef/runner.rb +99 -0
- data/lib/chef/sandbox.rb +153 -0
- data/lib/chef/search/query.rb +65 -0
- data/lib/chef/shef.rb +326 -0
- data/lib/chef/shef/ext.rb +569 -0
- data/lib/chef/shef/model_wrapper.rb +120 -0
- data/lib/chef/shef/shef_rest.rb +28 -0
- data/lib/chef/shef/shef_session.rb +284 -0
- data/lib/chef/shell_out.rb +238 -0
- data/lib/chef/shell_out/unix.rb +223 -0
- data/lib/chef/shell_out/windows.rb +98 -0
- data/lib/chef/solr_query.rb +187 -0
- data/lib/chef/solr_query/lucene.treetop +150 -0
- data/lib/chef/solr_query/lucene_nodes.rb +285 -0
- data/lib/chef/solr_query/query_transform.rb +65 -0
- data/lib/chef/solr_query/solr_http_request.rb +118 -0
- data/lib/chef/streaming_cookbook_uploader.rb +201 -0
- data/lib/chef/tasks/chef_repo.rake +256 -0
- data/lib/chef/util/file_edit.rb +122 -0
- data/lib/chef/util/windows.rb +56 -0
- data/lib/chef/util/windows/net_group.rb +101 -0
- data/lib/chef/util/windows/net_use.rb +121 -0
- data/lib/chef/util/windows/net_user.rb +198 -0
- data/lib/chef/util/windows/volume.rb +59 -0
- data/lib/chef/version.rb +23 -0
- data/lib/chef/version_class.rb +70 -0
- data/lib/chef/version_constraint.rb +116 -0
- data/lib/chef/webui_user.rb +231 -0
- metadata +600 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Seth Falcon (<seth@opscode.com>)
|
|
3
|
+
# Copyright:: Copyright 2010 Opscode, Inc.
|
|
4
|
+
# License:: Apache License, Version 2.0
|
|
5
|
+
#
|
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
# you may not use this file except in compliance with the License.
|
|
8
|
+
# You may obtain a copy of the License at
|
|
9
|
+
#
|
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
#
|
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
# See the License for the specific language governing permissions and
|
|
16
|
+
# limitations under the License.
|
|
17
|
+
#
|
|
18
|
+
|
|
19
|
+
require 'base64'
|
|
20
|
+
require 'openssl'
|
|
21
|
+
require 'chef/data_bag_item'
|
|
22
|
+
require 'yaml'
|
|
23
|
+
|
|
24
|
+
# An EncryptedDataBagItem represents a read-only data bag item where
|
|
25
|
+
# all values, except for the value associated with the id key, have
|
|
26
|
+
# been encrypted.
|
|
27
|
+
#
|
|
28
|
+
# EncrypedDataBagItem can be used in recipes to decrypt data bag item
|
|
29
|
+
# members.
|
|
30
|
+
#
|
|
31
|
+
# Data bag item values are assumed to have been encrypted using the
|
|
32
|
+
# default symmetric encryption provided by Encryptor.encrypt where
|
|
33
|
+
# values are converted to YAML prior to encryption.
|
|
34
|
+
#
|
|
35
|
+
# If the shared secret is not specified at initialization or load,
|
|
36
|
+
# then the contents of the file referred to in
|
|
37
|
+
# Chef::Config[:encrypted_data_bag_secret] will be used as the
|
|
38
|
+
# secret. The default path is /etc/chef/encrypted_data_bag_secret
|
|
39
|
+
#
|
|
40
|
+
# EncryptedDataBagItem is intended to provide a means to avoid storing
|
|
41
|
+
# data bag items in the clear on the Chef server. This provides some
|
|
42
|
+
# protection against a breach of the Chef server or of Chef server
|
|
43
|
+
# backup data. Because the secret must be stored in the clear on any
|
|
44
|
+
# node needing access to an EncryptedDataBagItem, this approach
|
|
45
|
+
# provides no protection of data bag items from actors with access to
|
|
46
|
+
# such nodes in the infrastructure.
|
|
47
|
+
#
|
|
48
|
+
class Chef::EncryptedDataBagItem
|
|
49
|
+
DEFAULT_SECRET_FILE = "/etc/chef/encrypted_data_bag_secret"
|
|
50
|
+
ALGORITHM = 'aes-256-cbc'
|
|
51
|
+
|
|
52
|
+
def initialize(enc_hash, secret)
|
|
53
|
+
@enc_hash = enc_hash
|
|
54
|
+
@secret = secret
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def [](key)
|
|
58
|
+
value = @enc_hash[key]
|
|
59
|
+
if key == "id"
|
|
60
|
+
value
|
|
61
|
+
else
|
|
62
|
+
self.class.decrypt_value(value, @secret)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def []=(key, value)
|
|
67
|
+
raise ArgumentError, "assignment not supported for #{self.class}"
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def to_hash
|
|
71
|
+
@enc_hash.keys.inject({}) { |hash, key| hash[key] = self[key]; hash }
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def self.from_plain_hash(plain_hash, secret)
|
|
75
|
+
self.new(self.encrypt_data_bag_item(plain_hash, secret), secret)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def self.encrypt_data_bag_item(plain_hash, secret)
|
|
79
|
+
plain_hash.inject({}) do |h, (key, val)|
|
|
80
|
+
h[key] = if key != "id"
|
|
81
|
+
self.encrypt_value(val, secret)
|
|
82
|
+
else
|
|
83
|
+
val
|
|
84
|
+
end
|
|
85
|
+
h
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def self.load(data_bag, name, secret = nil)
|
|
90
|
+
path = "data/#{data_bag}/#{name}"
|
|
91
|
+
raw_hash = Chef::DataBagItem.load(data_bag, name)
|
|
92
|
+
secret = secret || self.load_secret
|
|
93
|
+
self.new(raw_hash, secret)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def self.encrypt_value(value, key)
|
|
97
|
+
Base64.encode64(self.cipher(:encrypt, value.to_yaml, key))
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def self.decrypt_value(value, key)
|
|
101
|
+
YAML.load(self.cipher(:decrypt, Base64.decode64(value), key))
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def self.load_secret(path=nil)
|
|
105
|
+
path = path || Chef::Config[:encrypted_data_bag_secret] || DEFAULT_SECRET_FILE
|
|
106
|
+
if !File.exists?(path)
|
|
107
|
+
raise Errno::ENOENT, "file not found '#{path}'"
|
|
108
|
+
end
|
|
109
|
+
secret = IO.read(path).strip
|
|
110
|
+
if secret.size < 1
|
|
111
|
+
raise ArgumentError, "invalid zero length secret in '#{path}'"
|
|
112
|
+
end
|
|
113
|
+
secret
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
protected
|
|
117
|
+
|
|
118
|
+
def self.cipher(direction, data, key)
|
|
119
|
+
cipher = OpenSSL::Cipher::Cipher.new(ALGORITHM)
|
|
120
|
+
cipher.send(direction)
|
|
121
|
+
cipher.pkcs5_keyivgen(key)
|
|
122
|
+
ans = cipher.update(data)
|
|
123
|
+
ans << cipher.final
|
|
124
|
+
ans
|
|
125
|
+
end
|
|
126
|
+
end
|
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Stephen Delano (<stephen@opscode.com>)
|
|
3
|
+
# Author:: Seth Falcon (<seth@opscode.com>)
|
|
4
|
+
# Copyright:: Copyright 2010-2011 Opscode, Inc.
|
|
5
|
+
# License:: Apache License, Version 2.0
|
|
6
|
+
#
|
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
# you may not use this file except in compliance with the License.
|
|
9
|
+
# You may obtain a copy of the License at
|
|
10
|
+
#
|
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
#
|
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
# See the License for the specific language governing permissions and
|
|
17
|
+
# limitations under the License.
|
|
18
|
+
#
|
|
19
|
+
|
|
20
|
+
require 'chef/config'
|
|
21
|
+
require 'chef/mixin/params_validate'
|
|
22
|
+
require 'chef/couchdb'
|
|
23
|
+
require 'chef/index_queue'
|
|
24
|
+
require 'chef/version_constraint'
|
|
25
|
+
|
|
26
|
+
class Chef
|
|
27
|
+
class Environment
|
|
28
|
+
|
|
29
|
+
DEFAULT = "default"
|
|
30
|
+
|
|
31
|
+
include Chef::Mixin::ParamsValidate
|
|
32
|
+
include Chef::Mixin::FromFile
|
|
33
|
+
include Chef::IndexQueue::Indexable
|
|
34
|
+
|
|
35
|
+
COMBINED_COOKBOOK_CONSTRAINT = /(.+)(?:[\s]+)((?:#{Chef::VersionConstraint::OPS.join('|')})(?:[\s]+).+)$/.freeze
|
|
36
|
+
|
|
37
|
+
attr_accessor :couchdb, :couchdb_rev
|
|
38
|
+
attr_reader :couchdb_id
|
|
39
|
+
|
|
40
|
+
DESIGN_DOCUMENT = {
|
|
41
|
+
"version" => 1,
|
|
42
|
+
"language" => "javascript",
|
|
43
|
+
"views" => {
|
|
44
|
+
"all" => {
|
|
45
|
+
"map" => <<-EOJS
|
|
46
|
+
function(doc) {
|
|
47
|
+
if (doc.chef_type == "environment") {
|
|
48
|
+
emit(doc.name, doc);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
EOJS
|
|
52
|
+
},
|
|
53
|
+
"all_id" => {
|
|
54
|
+
"map" => <<-EOJS
|
|
55
|
+
function(doc) {
|
|
56
|
+
if (doc.chef_type == "environment") {
|
|
57
|
+
emit(doc.name, doc.name);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
EOJS
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
def initialize(couchdb=nil)
|
|
66
|
+
@name = ''
|
|
67
|
+
@description = ''
|
|
68
|
+
@attributes = Mash.new
|
|
69
|
+
@cookbook_versions = Hash.new
|
|
70
|
+
@couchdb_rev = nil
|
|
71
|
+
@couchdb_id = nil
|
|
72
|
+
@couchdb = couchdb || Chef::CouchDB.new
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def couchdb_id=(value)
|
|
76
|
+
@couchdb_id = value
|
|
77
|
+
self.index_id = value
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def chef_server_rest
|
|
81
|
+
Chef::REST.new(Chef::Config[:chef_server_url])
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def self.chef_server_rest
|
|
85
|
+
Chef::REST.new(Chef::Config[:chef_server_url])
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def name(arg=nil)
|
|
89
|
+
set_or_return(
|
|
90
|
+
:name,
|
|
91
|
+
arg,
|
|
92
|
+
{ :regex => /^[\-[:alnum:]_]+$/, :kind_of => String }
|
|
93
|
+
)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def description(arg=nil)
|
|
97
|
+
set_or_return(
|
|
98
|
+
:description,
|
|
99
|
+
arg,
|
|
100
|
+
:kind_of => String
|
|
101
|
+
)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def attributes(arg=nil)
|
|
105
|
+
set_or_return(
|
|
106
|
+
:attributes,
|
|
107
|
+
arg,
|
|
108
|
+
:kind_of => Hash
|
|
109
|
+
)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def cookbook_versions(arg=nil)
|
|
113
|
+
set_or_return(
|
|
114
|
+
:cookbook_versions,
|
|
115
|
+
arg,
|
|
116
|
+
{
|
|
117
|
+
:kind_of => Hash,
|
|
118
|
+
:callbacks => {
|
|
119
|
+
"should be a valid set of cookbook version requirements" => lambda { |cv| Chef::Environment.validate_cookbook_versions(cv) }
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
)
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def cookbook(cookbook, version)
|
|
126
|
+
validate({
|
|
127
|
+
:version => version
|
|
128
|
+
},{
|
|
129
|
+
:version => {
|
|
130
|
+
:callbacks => { "should be a valid version requirement" => lambda { |v| Chef::Environment.validate_cookbook_version(v) } }
|
|
131
|
+
}
|
|
132
|
+
})
|
|
133
|
+
@cookbook_versions[cookbook] = version
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def to_hash
|
|
137
|
+
result = {
|
|
138
|
+
"name" => @name,
|
|
139
|
+
"description" => @description,
|
|
140
|
+
"cookbook_versions" => @cookbook_versions,
|
|
141
|
+
"json_class" => self.class.name,
|
|
142
|
+
"chef_type" => "environment",
|
|
143
|
+
"attributes" => @attributes
|
|
144
|
+
}
|
|
145
|
+
result["_rev"] = couchdb_rev if couchdb_rev
|
|
146
|
+
result
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def to_json(*a)
|
|
150
|
+
to_hash.to_json(*a)
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
def update_from!(o)
|
|
154
|
+
description(o.description)
|
|
155
|
+
cookbook_versions(o.cookbook_versions)
|
|
156
|
+
attributes(o.attributes)
|
|
157
|
+
self
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def update_from_params(params)
|
|
161
|
+
# reset because everything we need will be in the params, this is necessary because certain constraints
|
|
162
|
+
# may have been removed in the params and need to be removed from cookbook_versions as well.
|
|
163
|
+
bkup_cb_versions = cookbook_versions
|
|
164
|
+
cookbook_versions(Hash.new)
|
|
165
|
+
valid = true
|
|
166
|
+
|
|
167
|
+
begin
|
|
168
|
+
name(params[:name])
|
|
169
|
+
rescue Chef::Exceptions::ValidationFailed => e
|
|
170
|
+
invalid_fields[:name] = e.message
|
|
171
|
+
valid = false
|
|
172
|
+
end
|
|
173
|
+
description(params[:description])
|
|
174
|
+
|
|
175
|
+
unless params[:cookbook_version].nil?
|
|
176
|
+
params[:cookbook_version].each do |index, cookbook_constraint_spec|
|
|
177
|
+
unless (cookbook_constraint_spec.nil? || cookbook_constraint_spec.size == 0)
|
|
178
|
+
valid = valid && update_cookbook_constraint_from_param(index, cookbook_constraint_spec)
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
unless params[:attributes].nil? || params[:attributes].size == 0
|
|
184
|
+
attributes(Chef::JSONCompat.from_json(params[:attributes]))
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
valid = validate_required_attrs_present && valid
|
|
188
|
+
cookbook_versions(bkup_cb_versions) unless valid # restore the old cookbook_versions if valid is false
|
|
189
|
+
valid
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
def update_cookbook_constraint_from_param(index, cookbook_constraint_spec)
|
|
193
|
+
valid = true
|
|
194
|
+
md = cookbook_constraint_spec.match(COMBINED_COOKBOOK_CONSTRAINT)
|
|
195
|
+
if md.nil? || md[2].nil?
|
|
196
|
+
valid = false
|
|
197
|
+
add_cookbook_constraint_error(index, cookbook_constraint_spec)
|
|
198
|
+
elsif self.class.validate_cookbook_version(md[2])
|
|
199
|
+
cookbook_versions[md[1]] = md[2]
|
|
200
|
+
else
|
|
201
|
+
valid = false
|
|
202
|
+
add_cookbook_constraint_error(index, cookbook_constraint_spec)
|
|
203
|
+
end
|
|
204
|
+
valid
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
def add_cookbook_constraint_error(index, cookbook_constraint_spec)
|
|
208
|
+
invalid_fields[:cookbook_version] ||= {}
|
|
209
|
+
invalid_fields[:cookbook_version][index] = "#{cookbook_constraint_spec} is not a valid cookbook constraint"
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
def invalid_fields
|
|
213
|
+
@invalid_fields ||= {}
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
def validate_required_attrs_present
|
|
217
|
+
if name.nil? || name.size == 0
|
|
218
|
+
invalid_fields[:name] ||= "name cannot be empty"
|
|
219
|
+
false
|
|
220
|
+
else
|
|
221
|
+
true
|
|
222
|
+
end
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
def self.json_create(o)
|
|
227
|
+
environment = new
|
|
228
|
+
environment.name(o["name"])
|
|
229
|
+
environment.description(o["description"])
|
|
230
|
+
environment.cookbook_versions(o["cookbook_versions"])
|
|
231
|
+
environment.attributes(o["attributes"])
|
|
232
|
+
environment.couchdb_rev = o["_rev"] if o.has_key?("_rev")
|
|
233
|
+
environment.couchdb_id = o["_id"] if o.has_key?("_id")
|
|
234
|
+
environment
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
def self.cdb_list(inflate=false, couchdb=nil)
|
|
238
|
+
es = (couchdb || Chef::CouchDB.new).list("environments", inflate)
|
|
239
|
+
lookup = (inflate ? "value" : "key")
|
|
240
|
+
es["rows"].collect { |e| e[lookup] }
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
def self.list(inflate=false)
|
|
244
|
+
if inflate
|
|
245
|
+
# TODO: index the environments and use search to inflate - don't inflate for now :(
|
|
246
|
+
chef_server_rest.get_rest("environments")
|
|
247
|
+
else
|
|
248
|
+
chef_server_rest.get_rest("environments")
|
|
249
|
+
end
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
def self.cdb_load(name, couchdb=nil)
|
|
253
|
+
(couchdb || Chef::CouchDB.new).load("environment", name)
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
def self.load(name)
|
|
257
|
+
chef_server_rest.get_rest("environments/#{name}")
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
def self.exists?(name, couchdb)
|
|
261
|
+
begin
|
|
262
|
+
self.cdb_load(name, couchdb)
|
|
263
|
+
rescue Chef::Exceptions::CouchDBNotFound
|
|
264
|
+
nil
|
|
265
|
+
end
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
def cdb_destroy
|
|
269
|
+
couchdb.delete("environment", @name, couchdb_rev)
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
def destroy
|
|
273
|
+
chef_server_rest.delete_rest("environments/#{@name}")
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
def cdb_save
|
|
277
|
+
self.couchdb_rev = couchdb.store("environment", @name, self)["rev"]
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
def save
|
|
281
|
+
begin
|
|
282
|
+
chef_server_rest.put_rest("environments/#{@name}", self)
|
|
283
|
+
rescue Net::HTTPServerException => e
|
|
284
|
+
raise e unless e.response.code == "404"
|
|
285
|
+
chef_server_rest.post_rest("environments", self)
|
|
286
|
+
end
|
|
287
|
+
self
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
def create
|
|
291
|
+
chef_server_rest.post_rest("environments", self)
|
|
292
|
+
self
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
# Set up our CouchDB design document
|
|
296
|
+
def self.create_design_document(couchdb=nil)
|
|
297
|
+
(couchdb || Chef::CouchDB.new).create_design_document("environments", DESIGN_DOCUMENT)
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
# Loads the set of Chef::CookbookVersion objects available to a given environment
|
|
301
|
+
# === Returns
|
|
302
|
+
# Hash
|
|
303
|
+
# i.e.
|
|
304
|
+
# {
|
|
305
|
+
# "cookbook_name" => [ Chef::CookbookVersion ... ] ## the array of CookbookVersions is sorted highest to lowest
|
|
306
|
+
# }
|
|
307
|
+
#
|
|
308
|
+
# There will be a key for every cookbook. If no CookbookVersions
|
|
309
|
+
# are available for the specified environment the value will be an
|
|
310
|
+
# empty list.
|
|
311
|
+
#
|
|
312
|
+
def self.cdb_load_filtered_cookbook_versions(name, couchdb=nil)
|
|
313
|
+
version_constraints = cdb_load(name, couchdb).cookbook_versions.inject({}) {|res, (k,v)| res[k] = Chef::VersionConstraint.new(v); res}
|
|
314
|
+
|
|
315
|
+
# inject all cookbooks into the hash while filtering out restricted versions, then sort the individual arrays
|
|
316
|
+
cookbook_list = Chef::CookbookVersion.cdb_list(true, couchdb)
|
|
317
|
+
|
|
318
|
+
filtered_list = cookbook_list.inject({}) do |res, cookbook|
|
|
319
|
+
# FIXME: should cookbook.version return a Chef::Version?
|
|
320
|
+
version = Chef::Version.new(cookbook.version)
|
|
321
|
+
requirement_satisfied = version_constraints.has_key?(cookbook.name) ? version_constraints[cookbook.name].include?(version) : true
|
|
322
|
+
# we want a key for every cookbook, even if no versions are available
|
|
323
|
+
res[cookbook.name] ||= []
|
|
324
|
+
res[cookbook.name] << cookbook if requirement_satisfied
|
|
325
|
+
res
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
sorted_list = filtered_list.inject({}) do |res, (cookbook_name, versions)|
|
|
329
|
+
res[cookbook_name] = versions.sort.reverse
|
|
330
|
+
res
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
sorted_list
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
def self.cdb_load_filtered_recipe_list(name, couchdb=nil)
|
|
337
|
+
cdb_load_filtered_cookbook_versions(name, couchdb).map do |cb_name, cb|
|
|
338
|
+
cb.first.recipe_filenames_by_name.keys.map do |recipe|
|
|
339
|
+
case recipe
|
|
340
|
+
when DEFAULT
|
|
341
|
+
cb_name
|
|
342
|
+
else
|
|
343
|
+
"#{cb_name}::#{recipe}"
|
|
344
|
+
end
|
|
345
|
+
end
|
|
346
|
+
end.flatten
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
def self.load_filtered_recipe_list(environment)
|
|
350
|
+
chef_server_rest.get_rest("environments/#{environment}/recipes")
|
|
351
|
+
end
|
|
352
|
+
|
|
353
|
+
def to_s
|
|
354
|
+
@name
|
|
355
|
+
end
|
|
356
|
+
|
|
357
|
+
def self.validate_cookbook_versions(cv)
|
|
358
|
+
return false unless cv.kind_of?(Hash)
|
|
359
|
+
cv.each do |cookbook, version|
|
|
360
|
+
return false unless Chef::Environment.validate_cookbook_version(version)
|
|
361
|
+
end
|
|
362
|
+
true
|
|
363
|
+
end
|
|
364
|
+
|
|
365
|
+
def self.validate_cookbook_version(version)
|
|
366
|
+
begin
|
|
367
|
+
Chef::VersionConstraint.new version
|
|
368
|
+
true
|
|
369
|
+
rescue ArgumentError
|
|
370
|
+
false
|
|
371
|
+
end
|
|
372
|
+
end
|
|
373
|
+
|
|
374
|
+
def self.create_default_environment(couchdb=nil)
|
|
375
|
+
couchdb = couchdb || Chef::CouchDB.new
|
|
376
|
+
begin
|
|
377
|
+
Chef::Environment.cdb_load('_default', couchdb)
|
|
378
|
+
rescue Chef::Exceptions::CouchDBNotFound
|
|
379
|
+
env = Chef::Environment.new(couchdb)
|
|
380
|
+
env.name '_default'
|
|
381
|
+
env.description 'The default Chef environment'
|
|
382
|
+
env.cdb_save
|
|
383
|
+
end
|
|
384
|
+
end
|
|
385
|
+
end
|
|
386
|
+
end
|