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,124 @@
|
|
|
1
|
+
# Author:: Daniel DeLeo (<dan@kallistec.com>)
|
|
2
|
+
# Copyright:: Copyright (c) 2009 Daniel DeLeo
|
|
3
|
+
# License:: Apache License, Version 2.0
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
#
|
|
17
|
+
|
|
18
|
+
class Chef
|
|
19
|
+
class ResourceCollection
|
|
20
|
+
class StepableIterator
|
|
21
|
+
|
|
22
|
+
def self.for_collection(new_collection)
|
|
23
|
+
instance = new(new_collection)
|
|
24
|
+
instance
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
attr_accessor :collection
|
|
28
|
+
attr_reader :position
|
|
29
|
+
|
|
30
|
+
def initialize(collection=[])
|
|
31
|
+
@position = 0
|
|
32
|
+
@paused = false
|
|
33
|
+
@collection = collection
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def size
|
|
37
|
+
collection.size
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def each(&block)
|
|
41
|
+
reset_iteration(block)
|
|
42
|
+
@iterator_type = :element
|
|
43
|
+
iterate
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def each_index(&block)
|
|
47
|
+
reset_iteration(block)
|
|
48
|
+
@iterator_type = :index
|
|
49
|
+
iterate
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def each_with_index(&block)
|
|
53
|
+
reset_iteration(block)
|
|
54
|
+
@iterator_type = :element_with_index
|
|
55
|
+
iterate
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def paused?
|
|
59
|
+
@paused
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def pause
|
|
63
|
+
@paused = true
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def resume
|
|
67
|
+
@paused = false
|
|
68
|
+
iterate
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def rewind
|
|
72
|
+
@position = 0
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def skip_back(skips=1)
|
|
76
|
+
@position -= skips
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def skip_forward(skips=1)
|
|
80
|
+
@position += skips
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def step
|
|
84
|
+
return nil if @position == size
|
|
85
|
+
call_iterator_block
|
|
86
|
+
@position += 1
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def iterate_on(iteration_type, &block)
|
|
90
|
+
@iterator_type = iteration_type
|
|
91
|
+
@iterator_block = block
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
private
|
|
95
|
+
|
|
96
|
+
def reset_iteration(iterator_block)
|
|
97
|
+
@iterator_block = iterator_block
|
|
98
|
+
@position = 0
|
|
99
|
+
@paused = false
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def iterate
|
|
103
|
+
while @position < size && !paused?
|
|
104
|
+
step
|
|
105
|
+
end
|
|
106
|
+
collection
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def call_iterator_block
|
|
110
|
+
case @iterator_type
|
|
111
|
+
when :element
|
|
112
|
+
@iterator_block.call(collection[@position])
|
|
113
|
+
when :index
|
|
114
|
+
@iterator_block.call(@position)
|
|
115
|
+
when :element_with_index
|
|
116
|
+
@iterator_block.call(collection[@position], @position)
|
|
117
|
+
else
|
|
118
|
+
raise "42error: someone forgot to set @iterator_type, wtf?"
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2008 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 'chef/mixin/from_file'
|
|
20
|
+
require 'chef/mixin/params_validate'
|
|
21
|
+
|
|
22
|
+
class Chef
|
|
23
|
+
class ResourceDefinition
|
|
24
|
+
|
|
25
|
+
include Chef::Mixin::FromFile
|
|
26
|
+
include Chef::Mixin::ParamsValidate
|
|
27
|
+
|
|
28
|
+
attr_accessor :name, :params, :recipe, :node
|
|
29
|
+
|
|
30
|
+
def initialize(node=nil)
|
|
31
|
+
@name = nil
|
|
32
|
+
@params = Hash.new
|
|
33
|
+
@recipe = nil
|
|
34
|
+
@node = node
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def define(resource_name, prototype_params=nil, &block)
|
|
38
|
+
unless resource_name.kind_of?(Symbol)
|
|
39
|
+
raise ArgumentError, "You must use a symbol when defining a new resource!"
|
|
40
|
+
end
|
|
41
|
+
@name = resource_name
|
|
42
|
+
if prototype_params
|
|
43
|
+
unless prototype_params.kind_of?(Hash)
|
|
44
|
+
raise ArgumentError, "You must pass a hash as the prototype parameters for a definition."
|
|
45
|
+
end
|
|
46
|
+
@params = prototype_params
|
|
47
|
+
end
|
|
48
|
+
if Kernel.block_given?
|
|
49
|
+
@recipe = block
|
|
50
|
+
else
|
|
51
|
+
raise ArgumentError, "You must pass a block to a definition."
|
|
52
|
+
end
|
|
53
|
+
true
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# When we do the resource definition, we're really just setting new values for
|
|
57
|
+
# the paramaters we prototyped at the top. This method missing is as simple as
|
|
58
|
+
# it gets.
|
|
59
|
+
def method_missing(symbol, *args)
|
|
60
|
+
@params[symbol] = args.length == 1 ? args[0] : args
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def to_s
|
|
64
|
+
"#{name.to_s}"
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2008 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 'chef/mixin/from_file'
|
|
20
|
+
require 'chef/resource_definition'
|
|
21
|
+
|
|
22
|
+
class Chef
|
|
23
|
+
class ResourceDefinitionList
|
|
24
|
+
include Chef::Mixin::FromFile
|
|
25
|
+
|
|
26
|
+
attr_accessor :defines
|
|
27
|
+
|
|
28
|
+
def initialize
|
|
29
|
+
@defines = Hash.new
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def define(resource_name, prototype_params=nil, &block)
|
|
33
|
+
@defines[resource_name] = ResourceDefinition.new
|
|
34
|
+
@defines[resource_name].define(resource_name, prototype_params, &block)
|
|
35
|
+
true
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Daniel DeLeo (<dan@opscode.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 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 'chef/resource/apt_package'
|
|
20
|
+
require 'chef/resource/bash'
|
|
21
|
+
require 'chef/resource/breakpoint'
|
|
22
|
+
require 'chef/resource/cookbook_file'
|
|
23
|
+
require 'chef/resource/cron'
|
|
24
|
+
require 'chef/resource/csh'
|
|
25
|
+
require 'chef/resource/deploy'
|
|
26
|
+
require 'chef/resource/deploy_revision'
|
|
27
|
+
require 'chef/resource/directory'
|
|
28
|
+
require 'chef/resource/dpkg_package'
|
|
29
|
+
require 'chef/resource/easy_install_package'
|
|
30
|
+
require 'chef/resource/env'
|
|
31
|
+
require 'chef/resource/erl_call'
|
|
32
|
+
require 'chef/resource/execute'
|
|
33
|
+
require 'chef/resource/file'
|
|
34
|
+
require 'chef/resource/freebsd_package'
|
|
35
|
+
require 'chef/resource/gem_package'
|
|
36
|
+
require 'chef/resource/git'
|
|
37
|
+
require 'chef/resource/group'
|
|
38
|
+
require 'chef/resource/http_request'
|
|
39
|
+
require 'chef/resource/ifconfig'
|
|
40
|
+
require 'chef/resource/link'
|
|
41
|
+
require 'chef/resource/log'
|
|
42
|
+
require 'chef/resource/macports_package'
|
|
43
|
+
require 'chef/resource/mdadm'
|
|
44
|
+
require 'chef/resource/mount'
|
|
45
|
+
require 'chef/resource/ohai'
|
|
46
|
+
require 'chef/resource/package'
|
|
47
|
+
require 'chef/resource/pacman_package'
|
|
48
|
+
require 'chef/resource/perl'
|
|
49
|
+
require 'chef/resource/portage_package'
|
|
50
|
+
require 'chef/resource/python'
|
|
51
|
+
require 'chef/resource/remote_directory'
|
|
52
|
+
require 'chef/resource/remote_file'
|
|
53
|
+
require 'chef/resource/rpm_package'
|
|
54
|
+
require 'chef/resource/route'
|
|
55
|
+
require 'chef/resource/ruby'
|
|
56
|
+
require 'chef/resource/ruby_block'
|
|
57
|
+
require 'chef/resource/scm'
|
|
58
|
+
require 'chef/resource/script'
|
|
59
|
+
require 'chef/resource/service'
|
|
60
|
+
require 'chef/resource/subversion'
|
|
61
|
+
require 'chef/resource/template'
|
|
62
|
+
require 'chef/resource/timestamped_deploy'
|
|
63
|
+
require 'chef/resource/user'
|
|
64
|
+
require 'chef/resource/yum_package'
|
data/lib/chef/rest.rb
ADDED
|
@@ -0,0 +1,386 @@
|
|
|
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
|
+
# Copyright:: Copyright (c) 2009, 2010 Opscode, Inc.
|
|
8
|
+
# License:: Apache License, Version 2.0
|
|
9
|
+
#
|
|
10
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
11
|
+
# you may not use this file except in compliance with the License.
|
|
12
|
+
# You may obtain a copy of the License at
|
|
13
|
+
#
|
|
14
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
15
|
+
#
|
|
16
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
17
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
18
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
19
|
+
# See the License for the specific language governing permissions and
|
|
20
|
+
# limitations under the License.
|
|
21
|
+
#
|
|
22
|
+
|
|
23
|
+
require 'net/https'
|
|
24
|
+
require 'uri'
|
|
25
|
+
require 'chef/json_compat'
|
|
26
|
+
require 'tempfile'
|
|
27
|
+
require 'chef/api_client'
|
|
28
|
+
require 'chef/rest/auth_credentials'
|
|
29
|
+
require 'chef/rest/rest_request'
|
|
30
|
+
require 'chef/monkey_patches/string'
|
|
31
|
+
|
|
32
|
+
class Chef
|
|
33
|
+
# == Chef::REST
|
|
34
|
+
# Chef's custom REST client with built-in JSON support and RSA signed header
|
|
35
|
+
# authentication.
|
|
36
|
+
class REST
|
|
37
|
+
attr_reader :auth_credentials
|
|
38
|
+
attr_accessor :url, :cookies, :sign_on_redirect, :redirect_limit
|
|
39
|
+
|
|
40
|
+
# Create a REST client object. The supplied +url+ is used as the base for
|
|
41
|
+
# all subsequent requests. For example, when initialized with a base url
|
|
42
|
+
# http://localhost:4000, a call to +get_rest+ with 'nodes' will make an
|
|
43
|
+
# HTTP GET request to http://localhost:4000/nodes
|
|
44
|
+
def initialize(url, client_name=Chef::Config[:node_name], signing_key_filename=Chef::Config[:client_key], options={})
|
|
45
|
+
@url = url
|
|
46
|
+
@cookies = CookieJar.instance
|
|
47
|
+
@default_headers = options[:headers] || {}
|
|
48
|
+
@auth_credentials = AuthCredentials.new(client_name, signing_key_filename)
|
|
49
|
+
@sign_on_redirect, @sign_request = true, true
|
|
50
|
+
@redirects_followed = 0
|
|
51
|
+
@redirect_limit = 10
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def signing_key_filename
|
|
55
|
+
@auth_credentials.key_file
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def client_name
|
|
59
|
+
@auth_credentials.client_name
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def signing_key
|
|
63
|
+
@auth_credentials.raw_key
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Register the client
|
|
67
|
+
def register(name=Chef::Config[:node_name], destination=Chef::Config[:client_key])
|
|
68
|
+
if (File.exists?(destination) && !File.writable?(destination))
|
|
69
|
+
raise Chef::Exceptions::CannotWritePrivateKey, "I cannot write your private key to #{destination} - check permissions?"
|
|
70
|
+
end
|
|
71
|
+
nc = Chef::ApiClient.new
|
|
72
|
+
nc.name(name)
|
|
73
|
+
|
|
74
|
+
catch(:done) do
|
|
75
|
+
retries = config[:client_registration_retries] || 5
|
|
76
|
+
0.upto(retries) do |n|
|
|
77
|
+
begin
|
|
78
|
+
response = nc.save(true, true)
|
|
79
|
+
Chef::Log.debug("Registration response: #{response.inspect}")
|
|
80
|
+
raise Chef::Exceptions::CannotWritePrivateKey, "The response from the server did not include a private key!" unless response.has_key?("private_key")
|
|
81
|
+
# Write out the private key
|
|
82
|
+
::File.open(destination, "w") {|f|
|
|
83
|
+
f.chmod(0600)
|
|
84
|
+
f.print(response["private_key"])
|
|
85
|
+
}
|
|
86
|
+
throw :done
|
|
87
|
+
rescue IOError
|
|
88
|
+
raise Chef::Exceptions::CannotWritePrivateKey, "I cannot write your private key to #{destination}"
|
|
89
|
+
rescue Net::HTTPFatalError => e
|
|
90
|
+
Chef::Log.warn("Failed attempt #{n} of #{retries+1} on client creation")
|
|
91
|
+
raise unless e.response.code == "500"
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
true
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# Send an HTTP GET request to the path
|
|
100
|
+
#
|
|
101
|
+
# Using this method to +fetch+ a file is considered deprecated.
|
|
102
|
+
#
|
|
103
|
+
# === Parameters
|
|
104
|
+
# path:: The path to GET
|
|
105
|
+
# raw:: Whether you want the raw body returned, or JSON inflated. Defaults
|
|
106
|
+
# to JSON inflated.
|
|
107
|
+
def get_rest(path, raw=false, headers={})
|
|
108
|
+
if raw
|
|
109
|
+
streaming_request(create_url(path), headers)
|
|
110
|
+
else
|
|
111
|
+
api_request(:GET, create_url(path), headers)
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# Send an HTTP DELETE request to the path
|
|
116
|
+
def delete_rest(path, headers={})
|
|
117
|
+
api_request(:DELETE, create_url(path), headers)
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# Send an HTTP POST request to the path
|
|
121
|
+
def post_rest(path, json, headers={})
|
|
122
|
+
api_request(:POST, create_url(path), headers, json)
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# Send an HTTP PUT request to the path
|
|
126
|
+
def put_rest(path, json, headers={})
|
|
127
|
+
api_request(:PUT, create_url(path), headers, json)
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
# Streams a download to a tempfile, then yields the tempfile to a block.
|
|
131
|
+
# After the download, the tempfile will be closed and unlinked.
|
|
132
|
+
# If you rename the tempfile, it will not be deleted.
|
|
133
|
+
# Beware that if the server streams infinite content, this method will
|
|
134
|
+
# stream it until you run out of disk space.
|
|
135
|
+
def fetch(path, headers={})
|
|
136
|
+
streaming_request(create_url(path), headers) {|tmp_file| yield tmp_file }
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def create_url(path)
|
|
140
|
+
if path =~ /^(http|https):\/\//
|
|
141
|
+
URI.parse(path)
|
|
142
|
+
else
|
|
143
|
+
URI.parse("#{@url}/#{path}")
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def sign_requests?
|
|
148
|
+
auth_credentials.sign_requests? && @sign_request
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# ==== DEPRECATED
|
|
152
|
+
# Use +api_request+ instead
|
|
153
|
+
#--
|
|
154
|
+
# Actually run an HTTP request. First argument is the HTTP method,
|
|
155
|
+
# which should be one of :GET, :PUT, :POST or :DELETE. Next is the
|
|
156
|
+
# URL, then an object to include in the body (which will be converted with
|
|
157
|
+
# .to_json). The limit argument is unused, it is present for backwards
|
|
158
|
+
# compatibility. Configure the redirect limit with #redirect_limit=
|
|
159
|
+
# instead.
|
|
160
|
+
#
|
|
161
|
+
# Typically, you won't use this method -- instead, you'll use one of
|
|
162
|
+
# the helper methods (get_rest, post_rest, etc.)
|
|
163
|
+
#
|
|
164
|
+
# Will return the body of the response on success.
|
|
165
|
+
def run_request(method, url, headers={}, data=false, limit=nil, raw=false)
|
|
166
|
+
json_body = data ? Chef::JSONCompat.to_json(data) : nil
|
|
167
|
+
headers = build_headers(method, url, headers, json_body, raw)
|
|
168
|
+
|
|
169
|
+
tf = nil
|
|
170
|
+
|
|
171
|
+
retriable_rest_request(method, url, json_body, headers) do |rest_request|
|
|
172
|
+
|
|
173
|
+
res = rest_request.call do |response|
|
|
174
|
+
if raw
|
|
175
|
+
tf = stream_to_tempfile(url, response)
|
|
176
|
+
else
|
|
177
|
+
response.read_body
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
if res.kind_of?(Net::HTTPSuccess)
|
|
182
|
+
if res['content-type'] =~ /json/
|
|
183
|
+
response_body = res.body.chomp
|
|
184
|
+
Chef::JSONCompat.from_json(response_body)
|
|
185
|
+
else
|
|
186
|
+
if method == :HEAD
|
|
187
|
+
true
|
|
188
|
+
elsif raw
|
|
189
|
+
tf
|
|
190
|
+
else
|
|
191
|
+
res.body
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
elsif res.kind_of?(Net::HTTPFound) or res.kind_of?(Net::HTTPMovedPermanently)
|
|
195
|
+
follow_redirect {run_request(:GET, create_url(res['location']), {}, false, nil, raw)}
|
|
196
|
+
elsif res.kind_of?(Net::HTTPNotModified)
|
|
197
|
+
false
|
|
198
|
+
else
|
|
199
|
+
if res['content-type'] =~ /json/
|
|
200
|
+
exception = Chef::JSONCompat.from_json(res.body)
|
|
201
|
+
msg = "HTTP Request Returned #{res.code} #{res.message}: "
|
|
202
|
+
msg << (exception["error"].respond_to?(:join) ? exception["error"].join(", ") : exception["error"].to_s)
|
|
203
|
+
Chef::Log.warn(msg)
|
|
204
|
+
end
|
|
205
|
+
res.error!
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
# Runs an HTTP request to a JSON API. File Download not supported.
|
|
211
|
+
def api_request(method, url, headers={}, data=false)
|
|
212
|
+
json_body = data ? Chef::JSONCompat.to_json(data) : nil
|
|
213
|
+
headers = build_headers(method, url, headers, json_body)
|
|
214
|
+
|
|
215
|
+
retriable_rest_request(method, url, json_body, headers) do |rest_request|
|
|
216
|
+
response = rest_request.call {|r| r.read_body}
|
|
217
|
+
|
|
218
|
+
if response.kind_of?(Net::HTTPSuccess)
|
|
219
|
+
if response['content-type'] =~ /json/
|
|
220
|
+
Chef::JSONCompat.from_json(response.body.chomp)
|
|
221
|
+
else
|
|
222
|
+
Chef::Log.warn("Expected JSON response, but got content-type '#{response['content-type']}'")
|
|
223
|
+
response.body
|
|
224
|
+
end
|
|
225
|
+
elsif redirect_location = redirected_to(response)
|
|
226
|
+
follow_redirect {api_request(:GET, create_url(redirect_location))}
|
|
227
|
+
else
|
|
228
|
+
if response['content-type'] =~ /json/
|
|
229
|
+
exception = Chef::JSONCompat.from_json(response.body)
|
|
230
|
+
msg = "HTTP Request Returned #{response.code} #{response.message}: "
|
|
231
|
+
msg << (exception["error"].respond_to?(:join) ? exception["error"].join(", ") : exception["error"].to_s)
|
|
232
|
+
Chef::Log.warn(msg)
|
|
233
|
+
end
|
|
234
|
+
response.error!
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
# Makes a streaming download request. <b>Doesn't speak JSON.</b>
|
|
240
|
+
# Streams the response body to a tempfile. If a block is given, it's
|
|
241
|
+
# passed to Tempfile.open(), which means that the tempfile will automatically
|
|
242
|
+
# be unlinked after the block is executed.
|
|
243
|
+
#
|
|
244
|
+
# If no block is given, the tempfile is returned, which means it's up to
|
|
245
|
+
# you to unlink the tempfile when you're done with it.
|
|
246
|
+
def streaming_request(url, headers, &block)
|
|
247
|
+
headers = build_headers(:GET, url, headers, nil, true)
|
|
248
|
+
retriable_rest_request(:GET, url, nil, headers) do |rest_request|
|
|
249
|
+
tempfile = nil
|
|
250
|
+
response = rest_request.call do |r|
|
|
251
|
+
if block_given? && r.kind_of?(Net::HTTPSuccess)
|
|
252
|
+
begin
|
|
253
|
+
tempfile = stream_to_tempfile(url, r, &block)
|
|
254
|
+
yield tempfile
|
|
255
|
+
ensure
|
|
256
|
+
tempfile.close!
|
|
257
|
+
end
|
|
258
|
+
else
|
|
259
|
+
tempfile = stream_to_tempfile(url, r)
|
|
260
|
+
end
|
|
261
|
+
end
|
|
262
|
+
if response.kind_of?(Net::HTTPSuccess)
|
|
263
|
+
tempfile
|
|
264
|
+
elsif redirect_location = redirected_to(response)
|
|
265
|
+
# TODO: test tempfile unlinked when following redirects.
|
|
266
|
+
tempfile && tempfile.close!
|
|
267
|
+
follow_redirect {streaming_request(create_url(redirect_location), {}, &block)}
|
|
268
|
+
else
|
|
269
|
+
tempfile && tempfile.close!
|
|
270
|
+
response.error!
|
|
271
|
+
end
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
def retriable_rest_request(method, url, req_body, headers)
|
|
276
|
+
rest_request = Chef::REST::RESTRequest.new(method, url, req_body, headers)
|
|
277
|
+
|
|
278
|
+
Chef::Log.debug("Sending HTTP Request via #{method} to #{url.host}:#{url.port}#{rest_request.path}")
|
|
279
|
+
|
|
280
|
+
http_attempts = 0
|
|
281
|
+
|
|
282
|
+
begin
|
|
283
|
+
http_attempts += 1
|
|
284
|
+
|
|
285
|
+
res = yield rest_request
|
|
286
|
+
|
|
287
|
+
rescue Errno::ECONNREFUSED
|
|
288
|
+
if http_retry_count - http_attempts + 1 > 0
|
|
289
|
+
Chef::Log.error("Connection refused connecting to #{url.host}:#{url.port} for #{rest_request.path}, retry #{http_attempts}/#{http_retry_count}")
|
|
290
|
+
sleep(http_retry_delay)
|
|
291
|
+
retry
|
|
292
|
+
end
|
|
293
|
+
raise Errno::ECONNREFUSED, "Connection refused connecting to #{url.host}:#{url.port} for #{rest_request.path}, giving up"
|
|
294
|
+
rescue Timeout::Error
|
|
295
|
+
if http_retry_count - http_attempts + 1 > 0
|
|
296
|
+
Chef::Log.error("Timeout connecting to #{url.host}:#{url.port} for #{rest_request.path}, retry #{http_attempts}/#{http_retry_count}")
|
|
297
|
+
sleep(http_retry_delay)
|
|
298
|
+
retry
|
|
299
|
+
end
|
|
300
|
+
raise Timeout::Error, "Timeout connecting to #{url.host}:#{url.port} for #{rest_request.path}, giving up"
|
|
301
|
+
rescue Net::HTTPServerException
|
|
302
|
+
if res.kind_of?(Net::HTTPForbidden)
|
|
303
|
+
if http_retry_count - http_attempts + 1 > 0
|
|
304
|
+
Chef::Log.error("Received 403 Forbidden against #{url.host}:#{url.port} for #{rest_request.path}, retry #{http_attempts}/#{http_retry_count}")
|
|
305
|
+
sleep(http_retry_delay)
|
|
306
|
+
retry
|
|
307
|
+
end
|
|
308
|
+
end
|
|
309
|
+
raise
|
|
310
|
+
end
|
|
311
|
+
end
|
|
312
|
+
|
|
313
|
+
def authentication_headers(method, url, json_body=nil)
|
|
314
|
+
request_params = {:http_method => method, :path => url.path, :body => json_body, :host => "#{url.host}:#{url.port}"}
|
|
315
|
+
request_params[:body] ||= ""
|
|
316
|
+
auth_credentials.signature_headers(request_params)
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
def http_retry_delay
|
|
320
|
+
config[:http_retry_delay]
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
def http_retry_count
|
|
324
|
+
config[:http_retry_count]
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
def config
|
|
328
|
+
Chef::Config
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
def follow_redirect
|
|
332
|
+
raise Chef::Exceptions::RedirectLimitExceeded if @redirects_followed >= redirect_limit
|
|
333
|
+
@redirects_followed += 1
|
|
334
|
+
Chef::Log.debug("Following redirect #{@redirects_followed}/#{redirect_limit}")
|
|
335
|
+
if @sign_on_redirect
|
|
336
|
+
yield
|
|
337
|
+
else
|
|
338
|
+
@sign_request = false
|
|
339
|
+
yield
|
|
340
|
+
end
|
|
341
|
+
ensure
|
|
342
|
+
@redirects_followed = 0
|
|
343
|
+
@sign_request = true
|
|
344
|
+
end
|
|
345
|
+
|
|
346
|
+
private
|
|
347
|
+
|
|
348
|
+
def redirected_to(response)
|
|
349
|
+
if response.kind_of?(Net::HTTPFound) || response.kind_of?(Net::HTTPMovedPermanently)
|
|
350
|
+
response['location']
|
|
351
|
+
else
|
|
352
|
+
nil
|
|
353
|
+
end
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
def build_headers(method, url, headers={}, json_body=false, raw=false)
|
|
357
|
+
headers = @default_headers.merge(headers)
|
|
358
|
+
headers['Accept'] = "application/json" unless raw
|
|
359
|
+
headers["Content-Type"] = 'application/json' if json_body
|
|
360
|
+
headers['Content-Length'] = json_body.bytesize.to_s if json_body
|
|
361
|
+
headers.merge!(authentication_headers(method, url, json_body)) if sign_requests?
|
|
362
|
+
headers
|
|
363
|
+
end
|
|
364
|
+
|
|
365
|
+
def stream_to_tempfile(url, response)
|
|
366
|
+
tf = Tempfile.open("chef-rest")
|
|
367
|
+
if RUBY_PLATFORM =~ /mswin|mingw32|windows/
|
|
368
|
+
tf.binmode #required for binary files on Windows platforms
|
|
369
|
+
end
|
|
370
|
+
Chef::Log.debug("Streaming download from #{url.to_s} to tempfile #{tf.path}")
|
|
371
|
+
# Stolen from http://www.ruby-forum.com/topic/166423
|
|
372
|
+
# Kudos to _why!
|
|
373
|
+
size, total = 0, response.header['Content-Length'].to_i
|
|
374
|
+
response.read_body do |chunk|
|
|
375
|
+
tf.write(chunk)
|
|
376
|
+
size += chunk.size
|
|
377
|
+
end
|
|
378
|
+
tf.close
|
|
379
|
+
tf
|
|
380
|
+
rescue Exception
|
|
381
|
+
tf.close!
|
|
382
|
+
raise
|
|
383
|
+
end
|
|
384
|
+
|
|
385
|
+
end
|
|
386
|
+
end
|