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,223 @@
|
|
|
1
|
+
class Chef
|
|
2
|
+
class ShellOut
|
|
3
|
+
module Unix
|
|
4
|
+
|
|
5
|
+
# Run the command, writing the command's standard out and standard error
|
|
6
|
+
# to +stdout+ and +stderr+, and saving its exit status object to +status+
|
|
7
|
+
# === Returns
|
|
8
|
+
# returns +self+; +stdout+, +stderr+, +status+, and +exitstatus+ will be
|
|
9
|
+
# populated with results of the command
|
|
10
|
+
# === Raises
|
|
11
|
+
# * Errno::EACCES when you are not privileged to execute the command
|
|
12
|
+
# * Errno::ENOENT when the command is not available on the system (or not
|
|
13
|
+
# in the current $PATH)
|
|
14
|
+
# * Chef::Exceptions::CommandTimeout when the command does not complete
|
|
15
|
+
# within +timeout+ seconds (default: 60s)
|
|
16
|
+
def run_command
|
|
17
|
+
@child_pid = fork_subprocess
|
|
18
|
+
|
|
19
|
+
configure_parent_process_file_descriptors
|
|
20
|
+
propagate_pre_exec_failure
|
|
21
|
+
|
|
22
|
+
@result = nil
|
|
23
|
+
@execution_time = 0
|
|
24
|
+
|
|
25
|
+
# Ruby 1.8.7 and 1.8.6 from mid 2009 try to allocate objects during GC
|
|
26
|
+
# when calling IO.select and IO#read. Some OS Vendors are not interested
|
|
27
|
+
# in updating their ruby packages (Apple, *cough*) and we *have to*
|
|
28
|
+
# make it work. So I give you this epic hack:
|
|
29
|
+
GC.disable
|
|
30
|
+
until @status
|
|
31
|
+
ready = IO.select(open_pipes, nil, nil, READ_WAIT_TIME)
|
|
32
|
+
unless ready
|
|
33
|
+
@execution_time += READ_WAIT_TIME
|
|
34
|
+
if @execution_time >= timeout && !@result
|
|
35
|
+
raise Chef::Exceptions::CommandTimeout, "command timed out:\n#{format_for_exception}"
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
if ready && ready.first.include?(child_stdout)
|
|
40
|
+
read_stdout_to_buffer
|
|
41
|
+
end
|
|
42
|
+
if ready && ready.first.include?(child_stderr)
|
|
43
|
+
read_stderr_to_buffer
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
unless @status
|
|
47
|
+
# make one more pass to get the last of the output after the
|
|
48
|
+
# child process dies
|
|
49
|
+
if results = Process.waitpid2(@child_pid, Process::WNOHANG)
|
|
50
|
+
@status = results.last
|
|
51
|
+
redo
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
self
|
|
56
|
+
rescue Exception
|
|
57
|
+
# do our best to kill zombies
|
|
58
|
+
Process.waitpid2(@child_pid, Process::WNOHANG) rescue nil
|
|
59
|
+
raise
|
|
60
|
+
ensure
|
|
61
|
+
# no matter what happens, turn the GC back on, and hope whatever busted
|
|
62
|
+
# version of ruby we're on doesn't allocate some objects during the next
|
|
63
|
+
# GC run.
|
|
64
|
+
GC.enable
|
|
65
|
+
close_all_pipes
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
private
|
|
69
|
+
|
|
70
|
+
def set_user
|
|
71
|
+
if user
|
|
72
|
+
Process.euid = uid
|
|
73
|
+
Process.uid = uid
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def set_group
|
|
78
|
+
if group
|
|
79
|
+
Process.egid = gid
|
|
80
|
+
Process.gid = gid
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def set_environment
|
|
85
|
+
environment.each do |env_var,value|
|
|
86
|
+
ENV[env_var] = value
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def set_umask
|
|
91
|
+
File.umask(umask) if umask
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def set_cwd
|
|
95
|
+
Dir.chdir(cwd) if cwd
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def initialize_ipc
|
|
99
|
+
@stdout_pipe, @stderr_pipe, @process_status_pipe = IO.pipe, IO.pipe, IO.pipe
|
|
100
|
+
@process_status_pipe.last.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def child_stdout
|
|
104
|
+
@stdout_pipe[0]
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def child_stderr
|
|
108
|
+
@stderr_pipe[0]
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def child_process_status
|
|
112
|
+
@process_status_pipe[0]
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def close_all_pipes
|
|
116
|
+
child_stdout.close unless child_stdout.closed?
|
|
117
|
+
child_stderr.close unless child_stderr.closed?
|
|
118
|
+
child_process_status.close unless child_process_status.closed?
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# replace stdout, and stderr with pipes to the parent, and close the
|
|
122
|
+
# reader side of the error marshaling side channel. Close STDIN so when we
|
|
123
|
+
# exec, the new program will know it's never getting input ever.
|
|
124
|
+
def configure_subprocess_file_descriptors
|
|
125
|
+
process_status_pipe.first.close
|
|
126
|
+
|
|
127
|
+
# HACK: for some reason, just STDIN.close isn't good enough when running
|
|
128
|
+
# under ruby 1.9.2, so make it good enough:
|
|
129
|
+
stdin_reader, stdin_writer = IO.pipe
|
|
130
|
+
stdin_writer.close
|
|
131
|
+
STDIN.reopen stdin_reader
|
|
132
|
+
stdin_reader.close
|
|
133
|
+
|
|
134
|
+
stdout_pipe.first.close
|
|
135
|
+
STDOUT.reopen stdout_pipe.last
|
|
136
|
+
stdout_pipe.last.close
|
|
137
|
+
|
|
138
|
+
stderr_pipe.first.close
|
|
139
|
+
STDERR.reopen stderr_pipe.last
|
|
140
|
+
stderr_pipe.last.close
|
|
141
|
+
|
|
142
|
+
STDOUT.sync = STDERR.sync = true
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def configure_parent_process_file_descriptors
|
|
146
|
+
# Close the sides of the pipes we don't care about
|
|
147
|
+
stdout_pipe.last.close
|
|
148
|
+
stderr_pipe.last.close
|
|
149
|
+
process_status_pipe.last.close
|
|
150
|
+
# Get output as it happens rather than buffered
|
|
151
|
+
child_stdout.sync = true
|
|
152
|
+
child_stderr.sync = true
|
|
153
|
+
|
|
154
|
+
true
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# Some patch levels of ruby in wide use (in particular the ruby 1.8.6 on OSX)
|
|
158
|
+
# segfault when you IO.select a pipe that's reached eof. Weak sauce.
|
|
159
|
+
def open_pipes
|
|
160
|
+
@open_pipes ||= [child_stdout, child_stderr]
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def read_stdout_to_buffer
|
|
164
|
+
while chunk = child_stdout.read_nonblock(READ_SIZE)
|
|
165
|
+
@stdout << chunk
|
|
166
|
+
@live_stream << chunk if @live_stream
|
|
167
|
+
end
|
|
168
|
+
rescue Errno::EAGAIN
|
|
169
|
+
rescue EOFError
|
|
170
|
+
open_pipes.delete_at(0)
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def read_stderr_to_buffer
|
|
174
|
+
while chunk = child_stderr.read_nonblock(READ_SIZE)
|
|
175
|
+
@stderr << chunk
|
|
176
|
+
end
|
|
177
|
+
rescue Errno::EAGAIN
|
|
178
|
+
rescue EOFError
|
|
179
|
+
open_pipes.delete_at(1)
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def fork_subprocess
|
|
183
|
+
initialize_ipc
|
|
184
|
+
|
|
185
|
+
fork do
|
|
186
|
+
configure_subprocess_file_descriptors
|
|
187
|
+
|
|
188
|
+
set_user
|
|
189
|
+
set_group
|
|
190
|
+
set_environment
|
|
191
|
+
set_umask
|
|
192
|
+
set_cwd
|
|
193
|
+
|
|
194
|
+
begin
|
|
195
|
+
command.kind_of?(Array) ? exec(*command) : exec(command)
|
|
196
|
+
|
|
197
|
+
raise 'forty-two' # Should never get here
|
|
198
|
+
rescue Exception => e
|
|
199
|
+
Marshal.dump(e, process_status_pipe.last)
|
|
200
|
+
process_status_pipe.last.flush
|
|
201
|
+
end
|
|
202
|
+
process_status_pipe.last.close unless (process_status_pipe.last.closed?)
|
|
203
|
+
exit!
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
# Attempt to get a Marshaled error from the side-channel.
|
|
208
|
+
# If it's there, un-marshal it and raise. If it's not there,
|
|
209
|
+
# assume everything went well.
|
|
210
|
+
def propagate_pre_exec_failure
|
|
211
|
+
begin
|
|
212
|
+
e = Marshal.load child_process_status
|
|
213
|
+
raise(Exception === e ? e : "unknown failure: #{e.inspect}")
|
|
214
|
+
rescue EOFError # If we get an EOF error, then the exec was successful
|
|
215
|
+
true
|
|
216
|
+
ensure
|
|
217
|
+
child_process_status.close
|
|
218
|
+
end
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
end
|
|
222
|
+
end
|
|
223
|
+
end
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Author:: Daniel DeLeo (<dan@opscode.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2011 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 'timeout'
|
|
20
|
+
if RUBY_VERSION =~ /^1\.8/
|
|
21
|
+
require 'win32/open3'
|
|
22
|
+
else
|
|
23
|
+
require 'open3'
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
class Chef
|
|
27
|
+
class ShellOut
|
|
28
|
+
module Windows
|
|
29
|
+
|
|
30
|
+
#--
|
|
31
|
+
# Missing lots of features from the UNIX version, such as
|
|
32
|
+
# environment, cwd, etc.
|
|
33
|
+
def run_command
|
|
34
|
+
# win32 open4 is really just open3.
|
|
35
|
+
Open3.popen3(@command) do |stdin,stdout,stderr|
|
|
36
|
+
@finished_stdout = false
|
|
37
|
+
@finished_stderr = false
|
|
38
|
+
stdin.close
|
|
39
|
+
stdout.sync = true
|
|
40
|
+
stderr.sync = true
|
|
41
|
+
|
|
42
|
+
# TBH, I really don't know what this will do when it times out.
|
|
43
|
+
# However, I'm powerless to make windows have non-blocking IO, so
|
|
44
|
+
# thread party it is.
|
|
45
|
+
Timeout.timeout(timeout) do
|
|
46
|
+
out_reader = Thread.new do
|
|
47
|
+
loop do
|
|
48
|
+
read_stdout(stdout)
|
|
49
|
+
break if @finished_stdout
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
err_reader = Thread.new do
|
|
53
|
+
loop do
|
|
54
|
+
read_stderr(stderr)
|
|
55
|
+
break if @finished_stderr
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
out_reader.join
|
|
60
|
+
err_reader.join
|
|
61
|
+
|
|
62
|
+
@status = $?
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
self
|
|
67
|
+
|
|
68
|
+
rescue Timeout::Error
|
|
69
|
+
raise Chef::Exceptions::CommandTimeout, "command timed out:\n#{format_for_exception}"
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def read_stdout(stdout)
|
|
73
|
+
return nil if @finished_stdout
|
|
74
|
+
if chunk = stdout.sysread(8096)
|
|
75
|
+
@stdout << chunk
|
|
76
|
+
else
|
|
77
|
+
@finished_stdout = true
|
|
78
|
+
end
|
|
79
|
+
rescue EOFError
|
|
80
|
+
@finished_stdout = true
|
|
81
|
+
rescue Errno::EAGAIN
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def read_stderr(stderr)
|
|
85
|
+
return nil if @finished_stderr
|
|
86
|
+
if chunk = stderr.sysread(8096)
|
|
87
|
+
@stderr << chunk
|
|
88
|
+
else
|
|
89
|
+
@finished_stderr = true
|
|
90
|
+
end
|
|
91
|
+
rescue EOFError
|
|
92
|
+
@finished_stderr = true
|
|
93
|
+
rescue Errno::EAGAIN
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
|
3
|
+
# Author:: Daniel DeLeo (<dan@opscode.com>)
|
|
4
|
+
# Author:: Seth Falcon (<seth@opscode.com>)
|
|
5
|
+
# Copyright:: Copyright (c) 2009-2011 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/mixin/xml_escape'
|
|
22
|
+
require 'chef/log'
|
|
23
|
+
require 'chef/config'
|
|
24
|
+
require 'chef/couchdb'
|
|
25
|
+
require 'chef/solr_query/solr_http_request'
|
|
26
|
+
require 'chef/solr_query/query_transform'
|
|
27
|
+
|
|
28
|
+
class Chef
|
|
29
|
+
class SolrQuery
|
|
30
|
+
|
|
31
|
+
ID_KEY = "X_CHEF_id_CHEF_X"
|
|
32
|
+
DEFAULT_PARAMS = Mash.new(:start => 0, :rows => 1000, :sort => "#{ID_KEY} asc", :wt => 'json', :indent => 'off').freeze
|
|
33
|
+
FILTER_PARAM_MAP = {:database => 'X_CHEF_database_CHEF_X', :type => "X_CHEF_type_CHEF_X", :data_bag => 'data_bag'}
|
|
34
|
+
VALID_PARAMS = [:start,:rows,:sort,:q,:type]
|
|
35
|
+
BUILTIN_SEARCH_TYPES = ["role","node","client","environment"]
|
|
36
|
+
DATA_BAG_ITEM = 'data_bag_item'
|
|
37
|
+
|
|
38
|
+
include Chef::Mixin::XMLEscape
|
|
39
|
+
|
|
40
|
+
attr_accessor :query
|
|
41
|
+
attr_accessor :params
|
|
42
|
+
|
|
43
|
+
# Create a new Query object - takes the solr_url and optional
|
|
44
|
+
# Chef::CouchDB object to inflate objects into.
|
|
45
|
+
def initialize(couchdb = nil)
|
|
46
|
+
@filter_query = {}
|
|
47
|
+
@params = {}
|
|
48
|
+
|
|
49
|
+
if couchdb.nil?
|
|
50
|
+
@database = Chef::Config[:couchdb_database]
|
|
51
|
+
@couchdb = Chef::CouchDB.new(nil, Chef::Config[:couchdb_database])
|
|
52
|
+
else
|
|
53
|
+
unless couchdb.kind_of?(Chef::CouchDB)
|
|
54
|
+
Chef::Log.warn("Passing the database name to Chef::Solr::Query initialization is deprecated. Please pass in the Chef::CouchDB object instead.")
|
|
55
|
+
@database = couchdb
|
|
56
|
+
@couchdb = Chef::CouchDB.new(nil, couchdb)
|
|
57
|
+
else
|
|
58
|
+
@database = couchdb.couchdb_database
|
|
59
|
+
@couchdb = couchdb
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def self.from_params(params, couchdb=nil)
|
|
65
|
+
query = new(couchdb)
|
|
66
|
+
query.params = VALID_PARAMS.inject({}) do |p, param_name|
|
|
67
|
+
p[param_name] = params[param_name] if params.key?(param_name)
|
|
68
|
+
p
|
|
69
|
+
end
|
|
70
|
+
query.update_filter_query_from_params
|
|
71
|
+
query.update_query_from_params
|
|
72
|
+
query
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def filter_by(filter_query_params)
|
|
76
|
+
filter_query_params.each do |key, value|
|
|
77
|
+
@filter_query[FILTER_PARAM_MAP[key]] = value
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def filter_query
|
|
82
|
+
@filter_query.map { |param, value| "+#{param}:#{value}" }.join(' ')
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def filter_by_type(type)
|
|
86
|
+
case type
|
|
87
|
+
when *BUILTIN_SEARCH_TYPES
|
|
88
|
+
filter_by(:type => type)
|
|
89
|
+
else
|
|
90
|
+
filter_by(:type => DATA_BAG_ITEM, :data_bag => type)
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def update_filter_query_from_params
|
|
95
|
+
filter_by(:database => @database)
|
|
96
|
+
filter_by_type(params.delete(:type))
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def update_query_from_params
|
|
100
|
+
original_query = URI.decode(params.delete(:q) || "*:*")
|
|
101
|
+
@query = Chef::SolrQuery::QueryTransform.transform(original_query)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def objects
|
|
105
|
+
if !object_ids.empty?
|
|
106
|
+
@bulk_objects ||= @couchdb.bulk_get(object_ids)
|
|
107
|
+
Chef::Log.debug { "bulk get of objects: #{@bulk_objects.inspect}" }
|
|
108
|
+
@bulk_objects
|
|
109
|
+
else
|
|
110
|
+
[]
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def object_ids
|
|
115
|
+
@object_ids ||= results["response"]["docs"].map { |d| d[ID_KEY] }
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def results
|
|
119
|
+
@results ||= SolrHTTPRequest.select(self.to_hash)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# Search Solr for objects of a given type, for a given query.
|
|
123
|
+
def search
|
|
124
|
+
{ "rows" => objects, "start" => results["response"]["start"],
|
|
125
|
+
"total" => results["response"]["numFound"] }
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def to_hash
|
|
129
|
+
options = DEFAULT_PARAMS.merge(params)
|
|
130
|
+
options[:fq] = filter_query
|
|
131
|
+
options[:q] = @query
|
|
132
|
+
options
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
START_XML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n".freeze
|
|
136
|
+
START_DELETE_BY_QUERY = "<delete><query>".freeze
|
|
137
|
+
END_DELETE_BY_QUERY = "</query></delete>\n".freeze
|
|
138
|
+
COMMIT = "<commit/>\n".freeze
|
|
139
|
+
|
|
140
|
+
def commit(opts={})
|
|
141
|
+
SolrHTTPRequest.update("#{START_XML}#{COMMIT}")
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def delete_database(db)
|
|
145
|
+
query_data = xml_escape("X_CHEF_database_CHEF_X:#{db}")
|
|
146
|
+
xml = "#{START_XML}#{START_DELETE_BY_QUERY}#{query_data}#{END_DELETE_BY_QUERY}"
|
|
147
|
+
SolrHTTPRequest.update(xml)
|
|
148
|
+
commit
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def rebuild_index(db=Chef::Config[:couchdb_database])
|
|
152
|
+
delete_database(db)
|
|
153
|
+
|
|
154
|
+
results = {}
|
|
155
|
+
[Chef::ApiClient, Chef::Node, Chef::Role].each do |klass|
|
|
156
|
+
results[klass.name] = reindex_all(klass) ? "success" : "failed"
|
|
157
|
+
end
|
|
158
|
+
databags = Chef::DataBag.cdb_list(true)
|
|
159
|
+
Chef::Log.info("Reloading #{databags.size.to_s} #{Chef::DataBag} objects into the indexer")
|
|
160
|
+
databags.each { |i| i.add_to_index; i.list(true).each { |x| x.add_to_index } }
|
|
161
|
+
results[Chef::DataBag.name] = "success"
|
|
162
|
+
results
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def reindex_all(klass, metadata={})
|
|
166
|
+
begin
|
|
167
|
+
items = klass.cdb_list(true)
|
|
168
|
+
Chef::Log.info("Reloading #{items.size.to_s} #{klass.name} objects into the indexer")
|
|
169
|
+
items.each { |i| i.add_to_index }
|
|
170
|
+
rescue Net::HTTPServerException => e
|
|
171
|
+
# 404s are okay, there might not be any of that kind of object...
|
|
172
|
+
if e.message =~ /Not Found/
|
|
173
|
+
Chef::Log.warn("Could not load #{klass.name} objects from couch for re-indexing (this is ok if you don't have any of these)")
|
|
174
|
+
return false
|
|
175
|
+
else
|
|
176
|
+
raise e
|
|
177
|
+
end
|
|
178
|
+
rescue Exception => e
|
|
179
|
+
Chef::Log.fatal("Chef encountered an error while attempting to load #{klass.name} objects back into the index")
|
|
180
|
+
raise e
|
|
181
|
+
end
|
|
182
|
+
true
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
end
|
|
187
|
+
end
|