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,71 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
|
3
|
+
# Author:: Thom May (<thom@clearairturbulence.org>)
|
|
4
|
+
# Author:: Nuo Yan (<nuo@opscode.com>)
|
|
5
|
+
# Author:: Christopher Brown (<cb@opscode.com>)
|
|
6
|
+
# Author:: Christopher Walters (<cw@opscode.com>)
|
|
7
|
+
# Author:: Daniel DeLeo (<dan@opscode.com>)
|
|
8
|
+
# Copyright:: Copyright (c) 2009, 2010 Opscode, Inc.
|
|
9
|
+
# License:: Apache License, Version 2.0
|
|
10
|
+
#
|
|
11
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
12
|
+
# you may not use this file except in compliance with the License.
|
|
13
|
+
# You may obtain a copy of the License at
|
|
14
|
+
#
|
|
15
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
16
|
+
#
|
|
17
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
18
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
19
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
20
|
+
# See the License for the specific language governing permissions and
|
|
21
|
+
# limitations under the License.
|
|
22
|
+
#
|
|
23
|
+
require 'chef/exceptions'
|
|
24
|
+
require 'mixlib/authentication/signedheaderauth'
|
|
25
|
+
|
|
26
|
+
class Chef
|
|
27
|
+
class REST
|
|
28
|
+
class AuthCredentials
|
|
29
|
+
attr_reader :key_file, :client_name, :key, :raw_key
|
|
30
|
+
|
|
31
|
+
def initialize(client_name=nil, key_file=nil)
|
|
32
|
+
@client_name, @key_file = client_name, key_file
|
|
33
|
+
load_signing_key if sign_requests?
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def sign_requests?
|
|
37
|
+
!!key_file
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def signature_headers(request_params={})
|
|
41
|
+
raise ArgumentError, "Cannot sign the request without a client name, check that :node_name is assigned" if client_name.nil?
|
|
42
|
+
Chef::Log.debug("Signing the request as #{client_name}")
|
|
43
|
+
|
|
44
|
+
# params_in = {:http_method => :GET, :path => "/clients", :body => "", :host => "localhost"}
|
|
45
|
+
request_params = request_params.dup
|
|
46
|
+
request_params[:timestamp] = Time.now.utc.iso8601
|
|
47
|
+
request_params[:user_id] = client_name
|
|
48
|
+
host = request_params.delete(:host) || "localhost"
|
|
49
|
+
|
|
50
|
+
sign_obj = Mixlib::Authentication::SignedHeaderAuth.signing_object(request_params)
|
|
51
|
+
signed = sign_obj.sign(key).merge({:host => host})
|
|
52
|
+
signed.inject({}){|memo, kv| memo["#{kv[0].to_s.upcase}"] = kv[1];memo}
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
private
|
|
56
|
+
|
|
57
|
+
def load_signing_key
|
|
58
|
+
@raw_key = IO.read(key_file).strip
|
|
59
|
+
@key = OpenSSL::PKey::RSA.new(@raw_key)
|
|
60
|
+
rescue SystemCallError, IOError => e
|
|
61
|
+
Chef::Log.fatal "Failed to read the private key #{key_file}: #{e.inspect}, #{e.backtrace}"
|
|
62
|
+
raise Chef::Exceptions::PrivateKeyMissing, "I cannot read #{key_file}, which you told me to use to sign requests!"
|
|
63
|
+
rescue OpenSSL::PKey::RSAError
|
|
64
|
+
msg = "The file #{key_file} does not contain a correctly formatted private key.\n"
|
|
65
|
+
msg << "The key file should begin with '-----BEGIN RSA PRIVATE KEY-----' and end with '-----END RSA PRIVATE KEY-----'"
|
|
66
|
+
raise Chef::Exceptions::InvalidPrivateKey, msg
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
|
3
|
+
# Author:: Thom May (<thom@clearairturbulence.org>)
|
|
4
|
+
# Author:: Nuo Yan (<nuo@opscode.com>)
|
|
5
|
+
# Author:: Christopher Brown (<cb@opscode.com>)
|
|
6
|
+
# Author:: Christopher Walters (<cw@opscode.com>)
|
|
7
|
+
# Author:: Daniel DeLeo (<dan@opscode.com>)
|
|
8
|
+
# Copyright:: Copyright (c) 2009, 2010 Opscode, Inc.
|
|
9
|
+
# License:: Apache License, Version 2.0
|
|
10
|
+
#
|
|
11
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
12
|
+
# you may not use this file except in compliance with the License.
|
|
13
|
+
# You may obtain a copy of the License at
|
|
14
|
+
#
|
|
15
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
16
|
+
#
|
|
17
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
18
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
19
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
20
|
+
# See the License for the specific language governing permissions and
|
|
21
|
+
# limitations under the License.
|
|
22
|
+
#
|
|
23
|
+
require 'singleton'
|
|
24
|
+
|
|
25
|
+
class Chef
|
|
26
|
+
class REST
|
|
27
|
+
class CookieJar < Hash
|
|
28
|
+
include Singleton
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
|
3
|
+
# Author:: Thom May (<thom@clearairturbulence.org>)
|
|
4
|
+
# Author:: Nuo Yan (<nuo@opscode.com>)
|
|
5
|
+
# Author:: Christopher Brown (<cb@opscode.com>)
|
|
6
|
+
# Author:: Christopher Walters (<cw@opscode.com>)
|
|
7
|
+
# Author:: Daniel DeLeo (<dan@opscode.com>)
|
|
8
|
+
# Copyright:: Copyright (c) 2009, 2010 Opscode, Inc.
|
|
9
|
+
# License:: Apache License, Version 2.0
|
|
10
|
+
#
|
|
11
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
12
|
+
# you may not use this file except in compliance with the License.
|
|
13
|
+
# You may obtain a copy of the License at
|
|
14
|
+
#
|
|
15
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
16
|
+
#
|
|
17
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
18
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
19
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
20
|
+
# See the License for the specific language governing permissions and
|
|
21
|
+
# limitations under the License.
|
|
22
|
+
#
|
|
23
|
+
require 'uri'
|
|
24
|
+
require 'net/http'
|
|
25
|
+
require 'chef/rest/cookie_jar'
|
|
26
|
+
require 'chef/version'
|
|
27
|
+
|
|
28
|
+
class Chef
|
|
29
|
+
class REST
|
|
30
|
+
class RESTRequest
|
|
31
|
+
attr_reader :method, :url, :headers, :http_client, :http_request
|
|
32
|
+
|
|
33
|
+
def initialize(method, url, req_body, base_headers={})
|
|
34
|
+
@method, @url = method, url
|
|
35
|
+
@request_body = nil
|
|
36
|
+
@cookies = CookieJar.instance
|
|
37
|
+
configure_http_client
|
|
38
|
+
build_headers(base_headers)
|
|
39
|
+
configure_http_request(req_body)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def host
|
|
43
|
+
@url.host
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def port
|
|
47
|
+
@url.port
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def query
|
|
51
|
+
@url.query
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def path
|
|
55
|
+
@url.path.empty? ? "/" : @url.path
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def call
|
|
59
|
+
hide_net_http_bug do
|
|
60
|
+
http_client.request(http_request) do |response|
|
|
61
|
+
store_cookie(response)
|
|
62
|
+
yield response if block_given?
|
|
63
|
+
response
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def config
|
|
69
|
+
Chef::Config
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
private
|
|
73
|
+
|
|
74
|
+
def hide_net_http_bug
|
|
75
|
+
yield
|
|
76
|
+
rescue NoMethodError => e
|
|
77
|
+
# http://redmine.ruby-lang.org/issues/show/2708
|
|
78
|
+
# http://redmine.ruby-lang.org/issues/show/2758
|
|
79
|
+
if e.to_s =~ /#{Regexp.escape(%q|undefined method `closed?' for nil:NilClass|)}/
|
|
80
|
+
Chef::Log.debug("rescued error in http connect, re-raising as Errno::ECONNREFUSED to hide bug in net/http")
|
|
81
|
+
Chef::Log.debug("#{e.class.name}: #{e.to_s}")
|
|
82
|
+
Chef::Log.debug(e.backtrace.join("\n"))
|
|
83
|
+
raise Errno::ECONNREFUSED, "Connection refused attempting to contact #{url.scheme}://#{host}:#{port}"
|
|
84
|
+
else
|
|
85
|
+
raise
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def store_cookie(response)
|
|
90
|
+
if response['set-cookie']
|
|
91
|
+
@cookies["#{host}:#{port}"] = response['set-cookie']
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def build_headers(headers)
|
|
96
|
+
@headers = headers.dup
|
|
97
|
+
# TODO: need to set accept somewhere else
|
|
98
|
+
# headers.merge!('Accept' => "application/json") unless raw
|
|
99
|
+
@headers['X-Chef-Version'] = ::Chef::VERSION
|
|
100
|
+
|
|
101
|
+
if @cookies.has_key?("#{host}:#{port}")
|
|
102
|
+
@headers['Cookie'] = @cookies["#{host}:#{port}"]
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
#adapted from buildr/lib/buildr/core/transports.rb
|
|
107
|
+
def proxy_uri
|
|
108
|
+
proxy = Chef::Config["#{url.scheme}_proxy"]
|
|
109
|
+
proxy = URI.parse(proxy) if String === proxy
|
|
110
|
+
excludes = Chef::Config[:no_proxy].to_s.split(/\s*,\s*/).compact
|
|
111
|
+
excludes = excludes.map { |exclude| exclude =~ /:\d+$/ ? exclude : "#{exclude}:*" }
|
|
112
|
+
return proxy unless excludes.any? { |exclude| File.fnmatch(exclude, "#{host}:#{port}") }
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def configure_http_client
|
|
116
|
+
http_proxy = proxy_uri
|
|
117
|
+
if http_proxy.nil?
|
|
118
|
+
@http_client = Net::HTTP.new(host, port)
|
|
119
|
+
else
|
|
120
|
+
Chef::Log.debug("using #{http_proxy.host}:#{http_proxy.port} for proxy")
|
|
121
|
+
user = Chef::Config["#{url.scheme}_proxy_user"]
|
|
122
|
+
pass = Chef::Config["#{url.scheme}_proxy_pass"]
|
|
123
|
+
@http_client = Net::HTTP.Proxy(http_proxy.host, http_proxy.port, user, pass).new(host, port)
|
|
124
|
+
end
|
|
125
|
+
if url.scheme == "https"
|
|
126
|
+
@http_client.use_ssl = true
|
|
127
|
+
if config[:ssl_verify_mode] == :verify_none
|
|
128
|
+
@http_client.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
|
129
|
+
elsif config[:ssl_verify_mode] == :verify_peer
|
|
130
|
+
@http_client.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
|
131
|
+
end
|
|
132
|
+
if config[:ssl_ca_path]
|
|
133
|
+
unless ::File.exist?(config[:ssl_ca_path])
|
|
134
|
+
raise Chef::Exceptions::ConfigurationError, "The configured ssl_ca_path #{config[:ssl_ca_path]} does not exist"
|
|
135
|
+
end
|
|
136
|
+
@http_client.ca_path = config[:ssl_ca_path]
|
|
137
|
+
elsif config[:ssl_ca_file]
|
|
138
|
+
unless ::File.exist?(config[:ssl_ca_file])
|
|
139
|
+
raise Chef::Exceptions::ConfigurationError, "The configured ssl_ca_file #{config[:ssl_ca_file]} does not exist"
|
|
140
|
+
end
|
|
141
|
+
@http_client.ca_file = config[:ssl_ca_file]
|
|
142
|
+
end
|
|
143
|
+
if (config[:ssl_client_cert] || config[:ssl_client_key])
|
|
144
|
+
unless (config[:ssl_client_cert] && config[:ssl_client_key])
|
|
145
|
+
raise Chef::Exceptions::ConfigurationError, "You must configure ssl_client_cert and ssl_client_key together"
|
|
146
|
+
end
|
|
147
|
+
unless ::File.exists?(config[:ssl_client_cert])
|
|
148
|
+
raise Chef::Exceptions::ConfigurationError, "The configured ssl_client_cert #{config[:ssl_client_cert]} does not exist"
|
|
149
|
+
end
|
|
150
|
+
unless ::File.exists?(config[:ssl_client_key])
|
|
151
|
+
raise Chef::Exceptions::ConfigurationError, "The configured ssl_client_key #{config[:ssl_client_key]} does not exist"
|
|
152
|
+
end
|
|
153
|
+
@http_client.cert = OpenSSL::X509::Certificate.new(::File.read(config[:ssl_client_cert]))
|
|
154
|
+
@http_client.key = OpenSSL::PKey::RSA.new(::File.read(config[:ssl_client_key]))
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
@http_client.read_timeout = config[:rest_timeout]
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def configure_http_request(request_body=nil)
|
|
163
|
+
req_path = "#{path}"
|
|
164
|
+
req_path << "?#{query}" if query
|
|
165
|
+
|
|
166
|
+
@http_request = case method.to_s.downcase
|
|
167
|
+
when "get"
|
|
168
|
+
Net::HTTP::Get.new(req_path, headers)
|
|
169
|
+
when "post"
|
|
170
|
+
Net::HTTP::Post.new(req_path, headers)
|
|
171
|
+
when "put"
|
|
172
|
+
Net::HTTP::Put.new(req_path, headers)
|
|
173
|
+
when "delete"
|
|
174
|
+
Net::HTTP::Delete.new(req_path, headers)
|
|
175
|
+
when "head"
|
|
176
|
+
Net::HTTP::Head.new(req_path, headers)
|
|
177
|
+
else
|
|
178
|
+
raise ArgumentError, "You must provide :GET, :PUT, :POST, :DELETE or :HEAD as the method"
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
@http_request.body = request_body if (request_body && @http_request.request_body_permitted?)
|
|
182
|
+
# Optionally handle HTTP Basic Authentication
|
|
183
|
+
@http_request.basic_auth(url.user, url.password) if url.user
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
end
|
data/lib/chef/role.rb
ADDED
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
|
3
|
+
# Author:: Nuo Yan (<nuo@opscode.com>)
|
|
4
|
+
# Author:: Christopher Brown (<cb@opscode.com>)
|
|
5
|
+
# Copyright:: Copyright (c) 2008 Opscode, Inc.
|
|
6
|
+
# License:: Apache License, Version 2.0
|
|
7
|
+
#
|
|
8
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
9
|
+
# you may not use this file except in compliance with the License.
|
|
10
|
+
# You may obtain a copy of the License at
|
|
11
|
+
#
|
|
12
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
13
|
+
#
|
|
14
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
15
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
16
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
17
|
+
# See the License for the specific language governing permissions and
|
|
18
|
+
# limitations under the License.
|
|
19
|
+
#
|
|
20
|
+
|
|
21
|
+
require 'chef/config'
|
|
22
|
+
require 'chef/mixin/params_validate'
|
|
23
|
+
require 'chef/mixin/from_file'
|
|
24
|
+
require 'chef/couchdb'
|
|
25
|
+
require 'chef/run_list'
|
|
26
|
+
require 'chef/index_queue'
|
|
27
|
+
require 'chef/mash'
|
|
28
|
+
require 'chef/json_compat'
|
|
29
|
+
|
|
30
|
+
class Chef
|
|
31
|
+
class Role
|
|
32
|
+
|
|
33
|
+
include Chef::Mixin::FromFile
|
|
34
|
+
include Chef::Mixin::ParamsValidate
|
|
35
|
+
include Chef::IndexQueue::Indexable
|
|
36
|
+
|
|
37
|
+
DESIGN_DOCUMENT = {
|
|
38
|
+
"version" => 6,
|
|
39
|
+
"language" => "javascript",
|
|
40
|
+
"views" => {
|
|
41
|
+
"all" => {
|
|
42
|
+
"map" => <<-EOJS
|
|
43
|
+
function(doc) {
|
|
44
|
+
if (doc.chef_type == "role") {
|
|
45
|
+
emit(doc.name, doc);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
EOJS
|
|
49
|
+
},
|
|
50
|
+
"all_id" => {
|
|
51
|
+
"map" => <<-EOJS
|
|
52
|
+
function(doc) {
|
|
53
|
+
if (doc.chef_type == "role") {
|
|
54
|
+
emit(doc.name, doc.name);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
EOJS
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
attr_accessor :couchdb_rev, :couchdb
|
|
63
|
+
attr_reader :couchdb_id
|
|
64
|
+
|
|
65
|
+
# Create a new Chef::Role object.
|
|
66
|
+
def initialize(couchdb=nil)
|
|
67
|
+
@name = ''
|
|
68
|
+
@description = ''
|
|
69
|
+
@default_attributes = Mash.new
|
|
70
|
+
@override_attributes = Mash.new
|
|
71
|
+
@env_run_lists = {"_default" => Chef::RunList.new}
|
|
72
|
+
@couchdb_rev = nil
|
|
73
|
+
@couchdb_id = nil
|
|
74
|
+
@couchdb = couchdb || Chef::CouchDB.new
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def couchdb_id=(value)
|
|
78
|
+
@couchdb_id = value
|
|
79
|
+
self.index_id = value
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def chef_server_rest
|
|
83
|
+
Chef::REST.new(Chef::Config[:chef_server_url])
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def self.chef_server_rest
|
|
87
|
+
Chef::REST.new(Chef::Config[:chef_server_url])
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def name(arg=nil)
|
|
91
|
+
set_or_return(
|
|
92
|
+
:name,
|
|
93
|
+
arg,
|
|
94
|
+
:regex => /^[\-[:alnum:]_]+$/
|
|
95
|
+
)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def description(arg=nil)
|
|
99
|
+
set_or_return(
|
|
100
|
+
:description,
|
|
101
|
+
arg,
|
|
102
|
+
:kind_of => String
|
|
103
|
+
)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def run_list(*args)
|
|
107
|
+
if (args.length > 0)
|
|
108
|
+
@env_run_lists["_default"].reset!(args)
|
|
109
|
+
end
|
|
110
|
+
@env_run_lists["_default"]
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
alias_method :recipes, :run_list
|
|
114
|
+
|
|
115
|
+
# For run_list expansion
|
|
116
|
+
def run_list_for(environment)
|
|
117
|
+
if env_run_lists[environment].nil?
|
|
118
|
+
env_run_lists["_default"]
|
|
119
|
+
else
|
|
120
|
+
env_run_lists[environment]
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def active_run_list_for(environment)
|
|
125
|
+
@env_run_lists.has_key?(environment) ? environment : '_default'
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# Per environment run lists
|
|
129
|
+
def env_run_lists(env_run_lists=nil)
|
|
130
|
+
if (!env_run_lists.nil?)
|
|
131
|
+
unless env_run_lists.key?("_default")
|
|
132
|
+
msg = "_default key is required in env_run_lists.\n"
|
|
133
|
+
msg << "(env_run_lists: #{env_run_lists.inspect})"
|
|
134
|
+
raise Chef::Exceptions::InvalidEnvironmentRunListSpecification, msg
|
|
135
|
+
end
|
|
136
|
+
@env_run_lists.clear
|
|
137
|
+
env_run_lists.each { |k,v| @env_run_lists[k] = Chef::RunList.new(*Array(v))}
|
|
138
|
+
end
|
|
139
|
+
@env_run_lists
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
alias :env_run_list :env_run_lists
|
|
143
|
+
|
|
144
|
+
def default_attributes(arg=nil)
|
|
145
|
+
set_or_return(
|
|
146
|
+
:default_attributes,
|
|
147
|
+
arg,
|
|
148
|
+
:kind_of => Hash
|
|
149
|
+
)
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def override_attributes(arg=nil)
|
|
153
|
+
set_or_return(
|
|
154
|
+
:override_attributes,
|
|
155
|
+
arg,
|
|
156
|
+
:kind_of => Hash
|
|
157
|
+
)
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def to_hash
|
|
161
|
+
env_run_lists_without_default = @env_run_lists.dup
|
|
162
|
+
env_run_lists_without_default.delete("_default")
|
|
163
|
+
result = {
|
|
164
|
+
"name" => @name,
|
|
165
|
+
"description" => @description,
|
|
166
|
+
'json_class' => self.class.name,
|
|
167
|
+
"default_attributes" => @default_attributes,
|
|
168
|
+
"override_attributes" => @override_attributes,
|
|
169
|
+
"chef_type" => "role",
|
|
170
|
+
"run_list" => run_list,
|
|
171
|
+
"env_run_lists" => env_run_lists_without_default
|
|
172
|
+
}
|
|
173
|
+
result["_rev"] = couchdb_rev if couchdb_rev
|
|
174
|
+
result
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
# Serialize this object as a hash
|
|
178
|
+
def to_json(*a)
|
|
179
|
+
to_hash.to_json(*a)
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def update_from!(o)
|
|
183
|
+
description(o.description)
|
|
184
|
+
recipes(o.recipes) if defined?(o.recipes)
|
|
185
|
+
default_attributes(o.default_attributes)
|
|
186
|
+
override_attributes(o.override_attributes)
|
|
187
|
+
env_run_lists(o.env_run_lists) unless o.env_run_lists.nil?
|
|
188
|
+
self
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
# Create a Chef::Role from JSON
|
|
192
|
+
def self.json_create(o)
|
|
193
|
+
role = new
|
|
194
|
+
role.name(o["name"])
|
|
195
|
+
role.description(o["description"])
|
|
196
|
+
role.default_attributes(o["default_attributes"])
|
|
197
|
+
role.override_attributes(o["override_attributes"])
|
|
198
|
+
|
|
199
|
+
# _default run_list is in 'run_list' for newer clients, and
|
|
200
|
+
# 'recipes' for older clients.
|
|
201
|
+
env_run_list_hash = {"_default" => (o.has_key?("run_list") ? o["run_list"] : o["recipes"])}
|
|
202
|
+
|
|
203
|
+
# Clients before 0.10 do not include env_run_lists, so only
|
|
204
|
+
# merge if it's there.
|
|
205
|
+
if o["env_run_lists"]
|
|
206
|
+
env_run_list_hash.merge!(o["env_run_lists"])
|
|
207
|
+
end
|
|
208
|
+
role.env_run_lists(env_run_list_hash)
|
|
209
|
+
|
|
210
|
+
role.couchdb_rev = o["_rev"] if o.has_key?("_rev")
|
|
211
|
+
role.index_id = role.couchdb_id
|
|
212
|
+
role.couchdb_id = o["_id"] if o.has_key?("_id")
|
|
213
|
+
role
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
# List all the Chef::Role objects in the CouchDB. If inflate is set to true, you will get
|
|
217
|
+
# the full list of all Roles, fully inflated.
|
|
218
|
+
def self.cdb_list(inflate=false, couchdb=nil)
|
|
219
|
+
rs = (couchdb || Chef::CouchDB.new).list("roles", inflate)
|
|
220
|
+
lookup = (inflate ? "value" : "key")
|
|
221
|
+
rs["rows"].collect { |r| r[lookup] }
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
# Get the list of all roles from the API.
|
|
225
|
+
def self.list(inflate=false)
|
|
226
|
+
if inflate
|
|
227
|
+
response = Hash.new
|
|
228
|
+
Chef::Search::Query.new.search(:role) do |n|
|
|
229
|
+
response[n.name] = n unless n.nil?
|
|
230
|
+
end
|
|
231
|
+
response
|
|
232
|
+
else
|
|
233
|
+
chef_server_rest.get_rest("roles")
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
# Load a role by name from CouchDB
|
|
238
|
+
def self.cdb_load(name, couchdb=nil)
|
|
239
|
+
(couchdb || Chef::CouchDB.new).load("role", name)
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
# Load a role by name from the API
|
|
243
|
+
def self.load(name)
|
|
244
|
+
chef_server_rest.get_rest("roles/#{name}")
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
def self.exists?(rolename, couchdb)
|
|
248
|
+
begin
|
|
249
|
+
self.cdb_load(rolename, couchdb)
|
|
250
|
+
rescue Chef::Exceptions::CouchDBNotFound
|
|
251
|
+
nil
|
|
252
|
+
end
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
def environment(env_name)
|
|
256
|
+
chef_server_rest.get_rest("roles/#{@name}/environments/#{env_name}")
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
def environments
|
|
260
|
+
chef_server_rest.get_rest("roles/#{@name}/environments")
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
# Remove this role from the CouchDB
|
|
264
|
+
def cdb_destroy
|
|
265
|
+
couchdb.delete("role", @name, couchdb_rev)
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
# Remove this role via the REST API
|
|
269
|
+
def destroy
|
|
270
|
+
chef_server_rest.delete_rest("roles/#{@name}")
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
# Save this role to the CouchDB
|
|
274
|
+
def cdb_save
|
|
275
|
+
self.couchdb_rev = couchdb.store("role", @name, self)["rev"]
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
# Save this role via the REST API
|
|
279
|
+
def save
|
|
280
|
+
begin
|
|
281
|
+
chef_server_rest.put_rest("roles/#{@name}", self)
|
|
282
|
+
rescue Net::HTTPServerException => e
|
|
283
|
+
raise e unless e.response.code == "404"
|
|
284
|
+
chef_server_rest.post_rest("roles", self)
|
|
285
|
+
end
|
|
286
|
+
self
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
# Create the role via the REST API
|
|
290
|
+
def create
|
|
291
|
+
chef_server_rest.post_rest("roles", 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("roles", DESIGN_DOCUMENT)
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
# As a string
|
|
301
|
+
def to_s
|
|
302
|
+
"role[#{@name}]"
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
# Load a role from disk - prefers to load the JSON, but will happily load
|
|
306
|
+
# the raw rb files as well.
|
|
307
|
+
def self.from_disk(name, force=nil)
|
|
308
|
+
js_file = File.join(Chef::Config[:role_path], "#{name}.json")
|
|
309
|
+
rb_file = File.join(Chef::Config[:role_path], "#{name}.rb")
|
|
310
|
+
|
|
311
|
+
if File.exists?(js_file) || force == "json"
|
|
312
|
+
Chef::JSONCompat.from_json(IO.read(js_file))
|
|
313
|
+
elsif File.exists?(rb_file) || force == "ruby"
|
|
314
|
+
role = Chef::Role.new
|
|
315
|
+
role.name(name)
|
|
316
|
+
role.from_file(rb_file)
|
|
317
|
+
role
|
|
318
|
+
else
|
|
319
|
+
raise Chef::Exceptions::RoleNotFound, "Role '#{name}' could not be loaded from disk"
|
|
320
|
+
end
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
# Sync all the json roles with couchdb from disk
|
|
324
|
+
def self.sync_from_disk_to_couchdb
|
|
325
|
+
Dir[File.join(Chef::Config[:role_path], "*.json")].each do |role_file|
|
|
326
|
+
short_name = File.basename(role_file, ".json")
|
|
327
|
+
Chef::Log.warn("Loading #{short_name}")
|
|
328
|
+
r = Chef::Role.from_disk(short_name, "json")
|
|
329
|
+
begin
|
|
330
|
+
couch_role = Chef::Role.cdb_load(short_name)
|
|
331
|
+
r.couchdb_rev = couch_role.couchdb_rev
|
|
332
|
+
Chef::Log.debug("Replacing role #{short_name} with data from #{role_file}")
|
|
333
|
+
rescue Chef::Exceptions::CouchDBNotFound
|
|
334
|
+
Chef::Log.debug("Creating role #{short_name} with data from #{role_file}")
|
|
335
|
+
end
|
|
336
|
+
r.cdb_save
|
|
337
|
+
end
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
end
|
|
341
|
+
end
|