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,487 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
|
3
|
+
# Author:: AJ Christensen (<aj@opscode.com>)
|
|
4
|
+
# Copyright:: Copyright (c) 2008 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/mixin/deep_merge'
|
|
21
|
+
require 'chef/log'
|
|
22
|
+
|
|
23
|
+
class Chef
|
|
24
|
+
class Node
|
|
25
|
+
class Attribute
|
|
26
|
+
HIDDEN_ATTRIBUES = [:@override, :@attribute, :@default, :@normal, :@automatic]
|
|
27
|
+
|
|
28
|
+
attr_accessor :normal,
|
|
29
|
+
:default,
|
|
30
|
+
:override,
|
|
31
|
+
:automatic,
|
|
32
|
+
:current_normal,
|
|
33
|
+
:current_default,
|
|
34
|
+
:current_override,
|
|
35
|
+
:current_automatic,
|
|
36
|
+
:auto_vivifiy_on_read,
|
|
37
|
+
:set_unless_value_present,
|
|
38
|
+
:set_type
|
|
39
|
+
|
|
40
|
+
include Enumerable
|
|
41
|
+
|
|
42
|
+
def initialize(normal, default, override, automatic, state=[])
|
|
43
|
+
@normal = normal
|
|
44
|
+
@current_normal = normal
|
|
45
|
+
@default = default
|
|
46
|
+
@current_default = default
|
|
47
|
+
@override = override
|
|
48
|
+
@current_override = override
|
|
49
|
+
@automatic = automatic
|
|
50
|
+
@current_automatic = automatic
|
|
51
|
+
@current_nesting_level = state
|
|
52
|
+
@auto_vivifiy_on_read = false
|
|
53
|
+
@set_unless_value_present = false
|
|
54
|
+
@set_type = nil
|
|
55
|
+
@has_been_read = false
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def attribute
|
|
59
|
+
normal
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def attribute=(value)
|
|
63
|
+
normal = value
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def set_type_hash
|
|
67
|
+
case @set_type
|
|
68
|
+
when :normal
|
|
69
|
+
@normal
|
|
70
|
+
when :override
|
|
71
|
+
@override
|
|
72
|
+
when :default
|
|
73
|
+
@default
|
|
74
|
+
when :automatic
|
|
75
|
+
@automatic
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Reset our internal current_nesting_level to the top of every tree
|
|
80
|
+
def reset
|
|
81
|
+
@current_normal = @normal
|
|
82
|
+
@current_default = @default
|
|
83
|
+
@current_override = @override
|
|
84
|
+
@current_automatic = @automatic
|
|
85
|
+
@has_been_read = false
|
|
86
|
+
@current_nesting_level = []
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def [](key)
|
|
90
|
+
@current_nesting_level << key
|
|
91
|
+
|
|
92
|
+
# We set this to so that we can cope with ||= as a setting.
|
|
93
|
+
# See the comments in []= for more details.
|
|
94
|
+
@has_been_read = true
|
|
95
|
+
|
|
96
|
+
# If we have a set type, our destiny is to write
|
|
97
|
+
if @set_type
|
|
98
|
+
a_value = @set_type == :automatic ? value_or_descend(current_automatic, key, auto_vivifiy_on_read) : nil
|
|
99
|
+
o_value = @set_type == :override ? value_or_descend(current_override, key, auto_vivifiy_on_read) : nil
|
|
100
|
+
n_value = @set_type == :normal ? value_or_descend(current_normal, key, auto_vivifiy_on_read) : nil
|
|
101
|
+
d_value = @set_type == :default ? value_or_descend(current_default, key, auto_vivifiy_on_read) : nil
|
|
102
|
+
|
|
103
|
+
determine_value(a_value, o_value, n_value, d_value)
|
|
104
|
+
# Our destiny is only to read, so we get the full list.
|
|
105
|
+
else
|
|
106
|
+
a_value = value_or_descend(current_automatic, key)
|
|
107
|
+
o_value = value_or_descend(current_override, key)
|
|
108
|
+
n_value = value_or_descend(current_normal, key)
|
|
109
|
+
d_value = value_or_descend(current_default, key)
|
|
110
|
+
|
|
111
|
+
determine_value(a_value, o_value, n_value, d_value)
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def has_key?(key)
|
|
116
|
+
return true if component_has_key?(@default,key)
|
|
117
|
+
return true if component_has_key?(@automatic,key)
|
|
118
|
+
return true if component_has_key?(@normal,key)
|
|
119
|
+
return true if component_has_key?(@override,key)
|
|
120
|
+
false
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
alias :attribute? :has_key?
|
|
124
|
+
alias :include? :has_key?
|
|
125
|
+
alias :key? :has_key?
|
|
126
|
+
alias :member? :has_key?
|
|
127
|
+
|
|
128
|
+
def each(&block)
|
|
129
|
+
get_keys.each do |key|
|
|
130
|
+
value = determine_value(
|
|
131
|
+
get_value(automatic, key),
|
|
132
|
+
get_value(override, key),
|
|
133
|
+
get_value(normal, key),
|
|
134
|
+
get_value(default, key)
|
|
135
|
+
)
|
|
136
|
+
block.call([key, value])
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def each_pair(&block)
|
|
141
|
+
get_keys.each do |key|
|
|
142
|
+
value = determine_value(
|
|
143
|
+
get_value(automatic, key),
|
|
144
|
+
get_value(override, key),
|
|
145
|
+
get_value(normal, key),
|
|
146
|
+
get_value(default, key)
|
|
147
|
+
)
|
|
148
|
+
block.call(key, value)
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def each_attribute(&block)
|
|
153
|
+
get_keys.each do |key|
|
|
154
|
+
value = determine_value(
|
|
155
|
+
get_value(automatic, key),
|
|
156
|
+
get_value(override, key),
|
|
157
|
+
get_value(normal, key),
|
|
158
|
+
get_value(default, key)
|
|
159
|
+
)
|
|
160
|
+
block.call(key, value)
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def each_key(&block)
|
|
165
|
+
get_keys.each do |key|
|
|
166
|
+
block.call(key)
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def each_value(&block)
|
|
171
|
+
get_keys.each do |key|
|
|
172
|
+
value = determine_value(
|
|
173
|
+
get_value(automatic, key),
|
|
174
|
+
get_value(override, key),
|
|
175
|
+
get_value(normal, key),
|
|
176
|
+
get_value(default, key)
|
|
177
|
+
)
|
|
178
|
+
block.call(value)
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def empty?
|
|
183
|
+
get_keys.empty?
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
def fetch(key, default_value=nil, &block)
|
|
187
|
+
if get_keys.include? key
|
|
188
|
+
determine_value(
|
|
189
|
+
get_value(automatic, key),
|
|
190
|
+
get_value(override, key),
|
|
191
|
+
get_value(normal, key),
|
|
192
|
+
get_value(default, key)
|
|
193
|
+
)
|
|
194
|
+
elsif default_value
|
|
195
|
+
default_value
|
|
196
|
+
elsif block_given?
|
|
197
|
+
block.call(key)
|
|
198
|
+
else
|
|
199
|
+
raise IndexError, "Key #{key} does not exist"
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
# Writing this method hurts me a little bit.
|
|
204
|
+
#
|
|
205
|
+
# TODO: Refactor all this stuff so this kind of horror is no longer needed
|
|
206
|
+
#
|
|
207
|
+
# We have invented a new kind of duck-typing, we call it Madoff typing.
|
|
208
|
+
# We just lie and hope we die before you recognize our scheme. :)
|
|
209
|
+
def kind_of?(klass)
|
|
210
|
+
if klass == Hash || klass == Mash || klass == Chef::Node::Attribute
|
|
211
|
+
true
|
|
212
|
+
else
|
|
213
|
+
false
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
def has_value?(value)
|
|
218
|
+
self.any? do |k,v|
|
|
219
|
+
value == v
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
alias :value? :has_value?
|
|
224
|
+
|
|
225
|
+
def index(value)
|
|
226
|
+
index = self.find do |h|
|
|
227
|
+
value == h[1]
|
|
228
|
+
end
|
|
229
|
+
index.first if index.is_a? Array || nil
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
def values
|
|
233
|
+
self.collect { |h| h[1] }
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
def size
|
|
237
|
+
self.collect{}.length
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
alias :length :size
|
|
241
|
+
|
|
242
|
+
def get_keys
|
|
243
|
+
keys
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
def keys
|
|
247
|
+
tkeys = current_automatic ? current_automatic.keys : []
|
|
248
|
+
[ current_override, current_normal, current_default ].each do |attr_hash|
|
|
249
|
+
if attr_hash
|
|
250
|
+
attr_hash.keys.each do |key|
|
|
251
|
+
tkeys << key unless tkeys.include?(key)
|
|
252
|
+
end
|
|
253
|
+
end
|
|
254
|
+
end
|
|
255
|
+
tkeys
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
def get_value(data_hash, key)
|
|
259
|
+
last = nil
|
|
260
|
+
|
|
261
|
+
if @current_nesting_level.length == 0
|
|
262
|
+
if data_hash.has_key?(key) && ! data_hash[key].nil?
|
|
263
|
+
return data_hash[key]
|
|
264
|
+
else
|
|
265
|
+
return nil
|
|
266
|
+
end
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
0.upto(@current_nesting_level.length) do |i|
|
|
270
|
+
if i == 0
|
|
271
|
+
last = auto_vivifiy(data_hash, @current_nesting_level[i])
|
|
272
|
+
elsif i == @current_nesting_level.length
|
|
273
|
+
fk = last[@current_nesting_level[i - 1]]
|
|
274
|
+
if fk.has_key?(key) && ! fk[key].nil?
|
|
275
|
+
return fk[key]
|
|
276
|
+
else
|
|
277
|
+
return nil
|
|
278
|
+
end
|
|
279
|
+
else
|
|
280
|
+
last = auto_vivifiy(last[@current_nesting_level[i - 1]], @current_nesting_level[i])
|
|
281
|
+
end
|
|
282
|
+
end
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
def hash_and_not_cna?(to_check)
|
|
286
|
+
(! to_check.kind_of?(Chef::Node::Attribute)) && to_check.respond_to?(:has_key?)
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
def determine_value(a_value, o_value, n_value, d_value)
|
|
290
|
+
if hash_and_not_cna?(a_value)
|
|
291
|
+
value = {}
|
|
292
|
+
value = Chef::Mixin::DeepMerge.merge(value, d_value) if hash_and_not_cna?(d_value)
|
|
293
|
+
value = Chef::Mixin::DeepMerge.merge(value, n_value) if hash_and_not_cna?(n_value)
|
|
294
|
+
value = Chef::Mixin::DeepMerge.merge(value, o_value) if hash_and_not_cna?(o_value)
|
|
295
|
+
value = Chef::Mixin::DeepMerge.merge(value, a_value)
|
|
296
|
+
value
|
|
297
|
+
elsif hash_and_not_cna?(o_value)
|
|
298
|
+
value = {}
|
|
299
|
+
value = Chef::Mixin::DeepMerge.merge(value, d_value) if hash_and_not_cna?(d_value)
|
|
300
|
+
value = Chef::Mixin::DeepMerge.merge(value, n_value) if hash_and_not_cna?(n_value)
|
|
301
|
+
value = Chef::Mixin::DeepMerge.merge(value, o_value)
|
|
302
|
+
value
|
|
303
|
+
elsif hash_and_not_cna?(n_value)
|
|
304
|
+
value = {}
|
|
305
|
+
value = Chef::Mixin::DeepMerge.merge(value, d_value) if hash_and_not_cna?(d_value)
|
|
306
|
+
value = Chef::Mixin::DeepMerge.merge(value, n_value)
|
|
307
|
+
value
|
|
308
|
+
elsif hash_and_not_cna?(d_value)
|
|
309
|
+
d_value
|
|
310
|
+
else
|
|
311
|
+
return a_value if ! a_value.nil?
|
|
312
|
+
return o_value if ! o_value.nil?
|
|
313
|
+
return n_value if ! n_value.nil?
|
|
314
|
+
return d_value if ! d_value.nil?
|
|
315
|
+
return nil
|
|
316
|
+
end
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
def []=(key, value)
|
|
320
|
+
# If we don't have one, then we'll pretend we're normal
|
|
321
|
+
@set_type ||= :normal
|
|
322
|
+
|
|
323
|
+
if set_unless_value_present
|
|
324
|
+
if get_value(set_type_hash, key) != nil
|
|
325
|
+
Chef::Log.debug("Not setting #{@current_nesting_level.join("/")}/#{key} to #{value.inspect} because it has a #{@set_type} value already")
|
|
326
|
+
return false
|
|
327
|
+
end
|
|
328
|
+
end
|
|
329
|
+
|
|
330
|
+
# If we have been read, and the key we are writing is the same
|
|
331
|
+
# as our parent, we have most like been ||='ed. So we need to
|
|
332
|
+
# just rewind a bit.
|
|
333
|
+
#
|
|
334
|
+
# In practice, these objects are single use - this is just
|
|
335
|
+
# supporting one more single-use style.
|
|
336
|
+
@current_nesting_level.pop if @has_been_read && @current_nesting_level.last == key
|
|
337
|
+
|
|
338
|
+
set_value(set_type_hash, key, value)
|
|
339
|
+
value
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
def set_value(data_hash, key, value)
|
|
343
|
+
last = nil
|
|
344
|
+
|
|
345
|
+
# If there is no current_nesting_level, just set the value
|
|
346
|
+
if @current_nesting_level.length == 0
|
|
347
|
+
data_hash[key] = value
|
|
348
|
+
return data_hash
|
|
349
|
+
end
|
|
350
|
+
|
|
351
|
+
# Walk all the previous places we have been
|
|
352
|
+
0.upto(@current_nesting_level.length) do |i|
|
|
353
|
+
# If we are the first, we are top level, and should vivifiy the data_hash
|
|
354
|
+
if i == 0
|
|
355
|
+
last = auto_vivifiy(data_hash, @current_nesting_level[i])
|
|
356
|
+
# If we are one past the last current_nesting_level, we are adding a key to that hash with a value
|
|
357
|
+
elsif i == @current_nesting_level.length
|
|
358
|
+
last[@current_nesting_level[i - 1]][key] = value
|
|
359
|
+
# Otherwise, we're auto-vivifiy-ing an interim mash
|
|
360
|
+
else
|
|
361
|
+
last = auto_vivifiy(last[@current_nesting_level[i - 1]], @current_nesting_level[i])
|
|
362
|
+
end
|
|
363
|
+
end
|
|
364
|
+
data_hash
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
def auto_vivifiy_on_read?
|
|
368
|
+
auto_vivifiy_on_read
|
|
369
|
+
end
|
|
370
|
+
|
|
371
|
+
def auto_vivifiy(data_hash, key)
|
|
372
|
+
if data_hash.has_key?(key)
|
|
373
|
+
unless data_hash[key].respond_to?(:has_key?)
|
|
374
|
+
raise ArgumentError, "You tried to set a nested key, where the parent is not a hash-like object: #{@current_nesting_level.join("/")}/#{key} " unless auto_vivifiy_on_read
|
|
375
|
+
end
|
|
376
|
+
else
|
|
377
|
+
data_hash[key] = Mash.new
|
|
378
|
+
end
|
|
379
|
+
data_hash
|
|
380
|
+
end
|
|
381
|
+
|
|
382
|
+
def value_or_descend(data_hash, key, auto_vivifiy=false)
|
|
383
|
+
if auto_vivifiy
|
|
384
|
+
hash_to_vivifiy = auto_vivifiy(data_hash, key)
|
|
385
|
+
data_hash[key] = hash_to_vivifiy[key]
|
|
386
|
+
else
|
|
387
|
+
return nil if data_hash == nil
|
|
388
|
+
return nil unless data_hash.has_key?(key)
|
|
389
|
+
end
|
|
390
|
+
|
|
391
|
+
if data_hash[key].respond_to?(:has_key?)
|
|
392
|
+
cna = Chef::Node::Attribute.new(@normal, @default, @override, @automatic, @current_nesting_level)
|
|
393
|
+
cna.current_normal = current_normal.nil? ? Mash.new : current_normal[key]
|
|
394
|
+
cna.current_default = current_default.nil? ? Mash.new : current_default[key]
|
|
395
|
+
cna.current_override = current_override.nil? ? Mash.new : current_override[key]
|
|
396
|
+
cna.current_automatic = current_automatic.nil? ? Mash.new : current_automatic[key]
|
|
397
|
+
cna.auto_vivifiy_on_read = auto_vivifiy_on_read
|
|
398
|
+
cna.set_unless_value_present = set_unless_value_present
|
|
399
|
+
cna.set_type = set_type
|
|
400
|
+
cna
|
|
401
|
+
else
|
|
402
|
+
data_hash[key]
|
|
403
|
+
end
|
|
404
|
+
end
|
|
405
|
+
|
|
406
|
+
# Fetches or sets the value, depending on if any arguments are given.
|
|
407
|
+
# ==== Fetching
|
|
408
|
+
# If no arguments are given, fetches the value:
|
|
409
|
+
# node.network
|
|
410
|
+
# => {network data}
|
|
411
|
+
# Getters will find either a string or symbol key.
|
|
412
|
+
# ==== Setting
|
|
413
|
+
# If arguments are given, a value will be set. Both normal setter and DSL
|
|
414
|
+
# style setters are allowed:
|
|
415
|
+
# node.foo = "bar"
|
|
416
|
+
# node.foo("bar")
|
|
417
|
+
# Both set node[:foo] = "bar"
|
|
418
|
+
def method_missing(symbol, *args)
|
|
419
|
+
if args.empty?
|
|
420
|
+
if key?(symbol)
|
|
421
|
+
self[symbol]
|
|
422
|
+
elsif key?(symbol.to_s)
|
|
423
|
+
self[symbol.to_s]
|
|
424
|
+
elsif auto_vivifiy_on_read?
|
|
425
|
+
self[symbol] = Mash.new
|
|
426
|
+
self[symbol]
|
|
427
|
+
else
|
|
428
|
+
raise ArgumentError, "Attribute #{symbol} is not defined!" unless auto_vivifiy_on_read
|
|
429
|
+
end
|
|
430
|
+
else
|
|
431
|
+
key_to_set = symbol.to_s[/^(.+)=$/, 1] || symbol
|
|
432
|
+
self[key_to_set] = (args.length == 1 ? args[0] : args)
|
|
433
|
+
end
|
|
434
|
+
end
|
|
435
|
+
|
|
436
|
+
def inspect
|
|
437
|
+
determine_value(current_automatic, current_override, current_normal, current_default)
|
|
438
|
+
|
|
439
|
+
"#<#{self.class} " << instance_variables.map{|iv|
|
|
440
|
+
iv.to_s + '=' + (HIDDEN_ATTRIBUES.include?(iv.to_sym) ? "{...}" : instance_variable_get(iv).inspect)
|
|
441
|
+
}.join(', ') << ">"
|
|
442
|
+
end
|
|
443
|
+
|
|
444
|
+
def to_hash
|
|
445
|
+
result = determine_value(current_automatic, current_override, current_normal, current_default)
|
|
446
|
+
if result.class == Hash
|
|
447
|
+
result
|
|
448
|
+
else
|
|
449
|
+
result.to_hash
|
|
450
|
+
end
|
|
451
|
+
end
|
|
452
|
+
|
|
453
|
+
def delete(key)
|
|
454
|
+
[@automatic, @override, @normal, @default].inject(nil) do |return_value, attrs|
|
|
455
|
+
deleted_value = delete_from_component(attrs, key)
|
|
456
|
+
return_value || deleted_value
|
|
457
|
+
end
|
|
458
|
+
end
|
|
459
|
+
|
|
460
|
+
def delete_from_component(component_attrs, key)
|
|
461
|
+
# get the Hash-like object at the current nesting level:
|
|
462
|
+
nested_attrs = value_at_current_nesting(component_attrs, key)
|
|
463
|
+
|
|
464
|
+
if nested_attrs.respond_to?(:delete)
|
|
465
|
+
nested_attrs.delete(key)
|
|
466
|
+
else
|
|
467
|
+
nil
|
|
468
|
+
end
|
|
469
|
+
end
|
|
470
|
+
|
|
471
|
+
def component_has_key?(component_attrs,key)
|
|
472
|
+
# get the Hash-like object at the current nesting level:
|
|
473
|
+
nested_attrs = value_at_current_nesting(component_attrs, key)
|
|
474
|
+
nested_attrs.respond_to?(:key?) && nested_attrs.key?(key)
|
|
475
|
+
end
|
|
476
|
+
|
|
477
|
+
def value_at_current_nesting(component_attrs, key)
|
|
478
|
+
@current_nesting_level.inject(component_attrs) do |subtree, intermediate_key|
|
|
479
|
+
# if the intermediate value isn't a hash or doesn't have the intermediate key,
|
|
480
|
+
# it can't have the bottom-level key we're looking for.
|
|
481
|
+
(subtree.respond_to?(:key?) && subtree[intermediate_key]) or (return false)
|
|
482
|
+
end
|
|
483
|
+
end
|
|
484
|
+
|
|
485
|
+
end
|
|
486
|
+
end
|
|
487
|
+
end
|