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,221 @@
|
|
|
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/log'
|
|
20
|
+
require 'chef/exceptions'
|
|
21
|
+
require 'tmpdir'
|
|
22
|
+
require 'fcntl'
|
|
23
|
+
require 'etc'
|
|
24
|
+
|
|
25
|
+
class Chef
|
|
26
|
+
module Mixin
|
|
27
|
+
module Command
|
|
28
|
+
extend self
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
if RUBY_PLATFORM =~ /mswin|mingw32|windows/
|
|
32
|
+
require 'chef/mixin/command/windows'
|
|
33
|
+
include ::Chef::Mixin::Command::Windows
|
|
34
|
+
extend ::Chef::Mixin::Command::Windows
|
|
35
|
+
else
|
|
36
|
+
require 'chef/mixin/command/unix'
|
|
37
|
+
include ::Chef::Mixin::Command::Unix
|
|
38
|
+
extend ::Chef::Mixin::Command::Unix
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# If command is a block, returns true if the block returns true, false if it returns false.
|
|
42
|
+
# ("Only run this resource if the block is true")
|
|
43
|
+
#
|
|
44
|
+
# If the command is not a block, executes the command. If it returns any status other than
|
|
45
|
+
# 0, it returns false (clearly, a 0 status code is true)
|
|
46
|
+
#
|
|
47
|
+
# === Parameters
|
|
48
|
+
# command<Block>, <String>:: A block to check, or a string to execute
|
|
49
|
+
#
|
|
50
|
+
# === Returns
|
|
51
|
+
# true:: Returns true if the block is true, or if the command returns 0
|
|
52
|
+
# false:: Returns false if the block is false, or if the command returns a non-zero exit code.
|
|
53
|
+
def only_if(command, args = {})
|
|
54
|
+
if command.kind_of?(Proc)
|
|
55
|
+
chdir_or_tmpdir(args[:cwd]) do
|
|
56
|
+
res = command.call
|
|
57
|
+
unless res
|
|
58
|
+
return false
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
else
|
|
62
|
+
status = run_command({:command => command, :ignore_failure => true}.merge(args))
|
|
63
|
+
if status.exitstatus != 0
|
|
64
|
+
return false
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
true
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# If command is a block, returns false if the block returns true, true if it returns false.
|
|
71
|
+
# ("Do not run this resource if the block is true")
|
|
72
|
+
#
|
|
73
|
+
# If the command is not a block, executes the command. If it returns a 0 exitstatus, returns false.
|
|
74
|
+
# ("Do not run this resource if the command returns 0")
|
|
75
|
+
#
|
|
76
|
+
# === Parameters
|
|
77
|
+
# command<Block>, <String>:: A block to check, or a string to execute
|
|
78
|
+
#
|
|
79
|
+
# === Returns
|
|
80
|
+
# true:: Returns true if the block is false, or if the command returns a non-zero exit status.
|
|
81
|
+
# false:: Returns false if the block is true, or if the command returns a 0 exit status.
|
|
82
|
+
def not_if(command, args = {})
|
|
83
|
+
if command.kind_of?(Proc)
|
|
84
|
+
chdir_or_tmpdir(args[:cwd]) do
|
|
85
|
+
res = command.call
|
|
86
|
+
if res
|
|
87
|
+
return false
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
else
|
|
91
|
+
status = run_command({:command => command, :ignore_failure => true}.merge(args))
|
|
92
|
+
if status.exitstatus == 0
|
|
93
|
+
return false
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
true
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# === Parameters
|
|
100
|
+
# args<Hash>: A number of required and optional arguments
|
|
101
|
+
# command<String>, <Array>: A complete command with options to execute or a command and options as an Array
|
|
102
|
+
# creates<String>: The absolute path to a file that prevents the command from running if it exists
|
|
103
|
+
# cwd<String>: Working directory to execute command in, defaults to Dir.tmpdir
|
|
104
|
+
# timeout<String>: How many seconds to wait for the command to execute before timing out
|
|
105
|
+
# returns<String>: The single exit value command is expected to return, otherwise causes an exception
|
|
106
|
+
# ignore_failure<Boolean>: Whether to raise an exception on failure, or just return the status
|
|
107
|
+
# output_on_failure<Boolean>: Return output in raised exception regardless of Log.level
|
|
108
|
+
#
|
|
109
|
+
# user<String>: The UID or user name of the user to execute the command as
|
|
110
|
+
# group<String>: The GID or group name of the group to execute the command as
|
|
111
|
+
# environment<Hash>: Pairs of environment variable names and their values to set before execution
|
|
112
|
+
#
|
|
113
|
+
# === Returns
|
|
114
|
+
# Returns the exit status of args[:command]
|
|
115
|
+
def run_command(args={})
|
|
116
|
+
command_output = ""
|
|
117
|
+
|
|
118
|
+
args[:ignore_failure] ||= false
|
|
119
|
+
args[:output_on_failure] ||= false
|
|
120
|
+
|
|
121
|
+
# TODO: This is the wrong place for this responsibility.
|
|
122
|
+
if args.has_key?(:creates)
|
|
123
|
+
if File.exists?(args[:creates])
|
|
124
|
+
Chef::Log.debug("Skipping #{args[:command]} - creates #{args[:creates]} exists.")
|
|
125
|
+
return false
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
status, stdout, stderr = output_of_command(args[:command], args)
|
|
130
|
+
command_output << "STDOUT: #{stdout}"
|
|
131
|
+
command_output << "STDERR: #{stderr}"
|
|
132
|
+
handle_command_failures(status, command_output, args)
|
|
133
|
+
|
|
134
|
+
status
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def output_of_command(command, args)
|
|
138
|
+
Chef::Log.debug("Executing #{command}")
|
|
139
|
+
stderr_string, stdout_string, status = "", "", nil
|
|
140
|
+
|
|
141
|
+
exec_processing_block = lambda do |pid, stdin, stdout, stderr|
|
|
142
|
+
stdout_string, stderr_string = stdout.string.chomp, stderr.string.chomp
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
args[:cwd] ||= Dir.tmpdir
|
|
146
|
+
unless ::File.directory?(args[:cwd])
|
|
147
|
+
raise Chef::Exceptions::Exec, "#{args[:cwd]} does not exist or is not a directory"
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
Dir.chdir(args[:cwd]) do
|
|
151
|
+
if args[:timeout]
|
|
152
|
+
begin
|
|
153
|
+
Timeout.timeout(args[:timeout]) do
|
|
154
|
+
status = popen4(command, args, &exec_processing_block)
|
|
155
|
+
end
|
|
156
|
+
rescue Timeout::Error => e
|
|
157
|
+
Chef::Log.error("#{command} exceeded timeout #{args[:timeout]}")
|
|
158
|
+
raise(e)
|
|
159
|
+
end
|
|
160
|
+
else
|
|
161
|
+
status = popen4(command, args, &exec_processing_block)
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
Chef::Log.debug("---- Begin output of #{command} ----")
|
|
165
|
+
Chef::Log.debug("STDOUT: #{stdout_string}")
|
|
166
|
+
Chef::Log.debug("STDERR: #{stderr_string}")
|
|
167
|
+
Chef::Log.debug("---- End output of #{command} ----")
|
|
168
|
+
Chef::Log.debug("Ran #{command} returned #{status.exitstatus}")
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
return status, stdout_string, stderr_string
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def handle_command_failures(status, command_output, opts={})
|
|
175
|
+
unless opts[:ignore_failure]
|
|
176
|
+
opts[:returns] ||= 0
|
|
177
|
+
unless Array(opts[:returns]).include?(status.exitstatus)
|
|
178
|
+
# if the log level is not debug, through output of command when we fail
|
|
179
|
+
output = ""
|
|
180
|
+
if Chef::Log.level == :debug || opts[:output_on_failure]
|
|
181
|
+
output << "\n---- Begin output of #{opts[:command]} ----\n"
|
|
182
|
+
output << command_output.to_s
|
|
183
|
+
output << "\n---- End output of #{opts[:command]} ----\n"
|
|
184
|
+
end
|
|
185
|
+
raise Chef::Exceptions::Exec, "#{opts[:command]} returned #{status.exitstatus}, expected #{opts[:returns]}#{output}"
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
# Call #run_command but set LC_ALL to the system's current environment so it doesn't get changed to C.
|
|
191
|
+
#
|
|
192
|
+
# === Parameters
|
|
193
|
+
# args<Hash>: A number of required and optional arguments that will be handed out to #run_command
|
|
194
|
+
#
|
|
195
|
+
# === Returns
|
|
196
|
+
# Returns the result of #run_command
|
|
197
|
+
def run_command_with_systems_locale(args={})
|
|
198
|
+
args[:environment] ||= {}
|
|
199
|
+
args[:environment]["LC_ALL"] = ENV["LC_ALL"]
|
|
200
|
+
run_command args
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
# def popen4(cmd, args={}, &b)
|
|
204
|
+
# @@os_handler.popen4(cmd, args, &b)
|
|
205
|
+
# end
|
|
206
|
+
|
|
207
|
+
# module_function :popen4
|
|
208
|
+
|
|
209
|
+
def chdir_or_tmpdir(dir, &block)
|
|
210
|
+
dir ||= Dir.tmpdir
|
|
211
|
+
unless File.directory?(dir)
|
|
212
|
+
raise Chef::Exceptions::Exec, "#{dir} does not exist or is not a directory"
|
|
213
|
+
end
|
|
214
|
+
Dir.chdir(dir) do
|
|
215
|
+
block.call
|
|
216
|
+
end
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
end
|
|
@@ -0,0 +1,215 @@
|
|
|
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
|
+
class Chef
|
|
20
|
+
module Mixin
|
|
21
|
+
module Command
|
|
22
|
+
module Unix
|
|
23
|
+
# This is taken directly from Ara T Howard's Open4 library, and then
|
|
24
|
+
# modified to suit the needs of Chef. Any bugs here are most likely
|
|
25
|
+
# my own, and not Ara's.
|
|
26
|
+
#
|
|
27
|
+
# The original appears in external/open4.rb in its unmodified form.
|
|
28
|
+
#
|
|
29
|
+
# Thanks Ara!
|
|
30
|
+
def popen4(cmd, args={}, &b)
|
|
31
|
+
|
|
32
|
+
# Waitlast - this is magic.
|
|
33
|
+
#
|
|
34
|
+
# Do we wait for the child process to die before we yield
|
|
35
|
+
# to the block, or after? That is the magic of waitlast.
|
|
36
|
+
#
|
|
37
|
+
# By default, we are waiting before we yield the block.
|
|
38
|
+
args[:waitlast] ||= false
|
|
39
|
+
|
|
40
|
+
args[:user] ||= nil
|
|
41
|
+
unless args[:user].kind_of?(Integer)
|
|
42
|
+
args[:user] = Etc.getpwnam(args[:user]).uid if args[:user]
|
|
43
|
+
end
|
|
44
|
+
args[:group] ||= nil
|
|
45
|
+
unless args[:group].kind_of?(Integer)
|
|
46
|
+
args[:group] = Etc.getgrnam(args[:group]).gid if args[:group]
|
|
47
|
+
end
|
|
48
|
+
args[:environment] ||= {}
|
|
49
|
+
|
|
50
|
+
# Default on C locale so parsing commands output can be done
|
|
51
|
+
# independently of the node's default locale.
|
|
52
|
+
# "LC_ALL" could be set to nil, in which case we also must ignore it.
|
|
53
|
+
unless args[:environment].has_key?("LC_ALL")
|
|
54
|
+
args[:environment]["LC_ALL"] = "C"
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
pw, pr, pe, ps = IO.pipe, IO.pipe, IO.pipe, IO.pipe
|
|
58
|
+
|
|
59
|
+
verbose = $VERBOSE
|
|
60
|
+
begin
|
|
61
|
+
$VERBOSE = nil
|
|
62
|
+
ps.last.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)
|
|
63
|
+
|
|
64
|
+
cid = fork {
|
|
65
|
+
pw.last.close
|
|
66
|
+
STDIN.reopen pw.first
|
|
67
|
+
pw.first.close
|
|
68
|
+
|
|
69
|
+
pr.first.close
|
|
70
|
+
STDOUT.reopen pr.last
|
|
71
|
+
pr.last.close
|
|
72
|
+
|
|
73
|
+
pe.first.close
|
|
74
|
+
STDERR.reopen pe.last
|
|
75
|
+
pe.last.close
|
|
76
|
+
|
|
77
|
+
STDOUT.sync = STDERR.sync = true
|
|
78
|
+
|
|
79
|
+
if args[:group]
|
|
80
|
+
Process.egid = args[:group]
|
|
81
|
+
Process.gid = args[:group]
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
if args[:user]
|
|
85
|
+
Process.euid = args[:user]
|
|
86
|
+
Process.uid = args[:user]
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
args[:environment].each do |key,value|
|
|
90
|
+
ENV[key] = value
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
if args[:umask]
|
|
94
|
+
umask = ((args[:umask].respond_to?(:oct) ? args[:umask].oct : args[:umask].to_i) & 007777)
|
|
95
|
+
File.umask(umask)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
begin
|
|
99
|
+
if cmd.kind_of?(Array)
|
|
100
|
+
exec(*cmd)
|
|
101
|
+
else
|
|
102
|
+
exec(cmd)
|
|
103
|
+
end
|
|
104
|
+
raise 'forty-two'
|
|
105
|
+
rescue Exception => e
|
|
106
|
+
Marshal.dump(e, ps.last)
|
|
107
|
+
ps.last.flush
|
|
108
|
+
end
|
|
109
|
+
ps.last.close unless (ps.last.closed?)
|
|
110
|
+
exit!
|
|
111
|
+
}
|
|
112
|
+
ensure
|
|
113
|
+
$VERBOSE = verbose
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
[pw.first, pr.last, pe.last, ps.last].each{|fd| fd.close}
|
|
117
|
+
|
|
118
|
+
begin
|
|
119
|
+
e = Marshal.load ps.first
|
|
120
|
+
raise(Exception === e ? e : "unknown failure!")
|
|
121
|
+
rescue EOFError # If we get an EOF error, then the exec was successful
|
|
122
|
+
42
|
|
123
|
+
ensure
|
|
124
|
+
ps.first.close
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
pw.last.sync = true
|
|
128
|
+
|
|
129
|
+
pi = [pw.last, pr.first, pe.first]
|
|
130
|
+
|
|
131
|
+
if b
|
|
132
|
+
begin
|
|
133
|
+
if args[:waitlast]
|
|
134
|
+
b[cid, *pi]
|
|
135
|
+
# send EOF so that if the child process is reading from STDIN
|
|
136
|
+
# it will actually finish up and exit
|
|
137
|
+
pi[0].close_write
|
|
138
|
+
Process.waitpid2(cid).last
|
|
139
|
+
else
|
|
140
|
+
# This took some doing.
|
|
141
|
+
# The trick here is to close STDIN
|
|
142
|
+
# Then set our end of the childs pipes to be O_NONBLOCK
|
|
143
|
+
# Then wait for the child to die, which means any IO it
|
|
144
|
+
# wants to do must be done - it's dead. If it isn't,
|
|
145
|
+
# it's because something totally skanky is happening,
|
|
146
|
+
# and we don't care.
|
|
147
|
+
o = StringIO.new
|
|
148
|
+
e = StringIO.new
|
|
149
|
+
|
|
150
|
+
pi[0].close
|
|
151
|
+
|
|
152
|
+
stdout = pi[1]
|
|
153
|
+
stderr = pi[2]
|
|
154
|
+
|
|
155
|
+
stdout.sync = true
|
|
156
|
+
stderr.sync = true
|
|
157
|
+
|
|
158
|
+
stdout.fcntl(Fcntl::F_SETFL, pi[1].fcntl(Fcntl::F_GETFL) | Fcntl::O_NONBLOCK)
|
|
159
|
+
stderr.fcntl(Fcntl::F_SETFL, pi[2].fcntl(Fcntl::F_GETFL) | Fcntl::O_NONBLOCK)
|
|
160
|
+
|
|
161
|
+
stdout_finished = false
|
|
162
|
+
stderr_finished = false
|
|
163
|
+
|
|
164
|
+
results = nil
|
|
165
|
+
|
|
166
|
+
while !stdout_finished || !stderr_finished
|
|
167
|
+
begin
|
|
168
|
+
channels_to_watch = []
|
|
169
|
+
channels_to_watch << stdout if !stdout_finished
|
|
170
|
+
channels_to_watch << stderr if !stderr_finished
|
|
171
|
+
ready = IO.select(channels_to_watch, nil, nil, 1.0)
|
|
172
|
+
rescue Errno::EAGAIN
|
|
173
|
+
ensure
|
|
174
|
+
results = Process.waitpid2(cid, Process::WNOHANG)
|
|
175
|
+
if results
|
|
176
|
+
stdout_finished = true
|
|
177
|
+
stderr_finished = true
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
if ready && ready.first.include?(stdout)
|
|
182
|
+
line = results ? stdout.gets(nil) : stdout.gets
|
|
183
|
+
if line
|
|
184
|
+
o.write(line)
|
|
185
|
+
else
|
|
186
|
+
stdout_finished = true
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
if ready && ready.first.include?(stderr)
|
|
190
|
+
line = results ? stderr.gets(nil) : stderr.gets
|
|
191
|
+
if line
|
|
192
|
+
e.write(line)
|
|
193
|
+
else
|
|
194
|
+
stderr_finished = true
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
results = Process.waitpid2(cid) unless results
|
|
199
|
+
o.rewind
|
|
200
|
+
e.rewind
|
|
201
|
+
b[cid, pi[0], o, e]
|
|
202
|
+
results.last
|
|
203
|
+
end
|
|
204
|
+
ensure
|
|
205
|
+
pi.each{|fd| fd.close unless fd.closed?}
|
|
206
|
+
end
|
|
207
|
+
else
|
|
208
|
+
[cid, pw.last, pr.first, pe.first]
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
end
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2008 Opscode, Inc.
|
|
4
|
+
# Author:: Doug MacEachern (<dougm@vmware.com>)
|
|
5
|
+
# Copyright:: Copyright (c) 2010 VMware, 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
|
+
if RUBY_VERSION =~ /^1\.8/
|
|
22
|
+
require 'win32/open3'
|
|
23
|
+
else
|
|
24
|
+
require 'open3'
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
class Chef
|
|
28
|
+
module Mixin
|
|
29
|
+
module Command
|
|
30
|
+
module Windows
|
|
31
|
+
def popen4(cmd, args={}, &b)
|
|
32
|
+
|
|
33
|
+
# By default, we are waiting before we yield the block.
|
|
34
|
+
args[:waitlast] ||= false
|
|
35
|
+
|
|
36
|
+
#XXX :user, :group, :environment support?
|
|
37
|
+
|
|
38
|
+
Open4.popen4(cmd) do |stdin,stdout,stderr,cid|
|
|
39
|
+
if b
|
|
40
|
+
if args[:waitlast]
|
|
41
|
+
b[cid, stdin, stdout, stderr]
|
|
42
|
+
# send EOF so that if the child process is reading from STDIN
|
|
43
|
+
# it will actually finish up and exit
|
|
44
|
+
stdin.close_write
|
|
45
|
+
else
|
|
46
|
+
o = StringIO.new
|
|
47
|
+
e = StringIO.new
|
|
48
|
+
|
|
49
|
+
stdin.close
|
|
50
|
+
|
|
51
|
+
stdout.sync = true
|
|
52
|
+
stderr.sync = true
|
|
53
|
+
|
|
54
|
+
line = stdout.gets(nil)
|
|
55
|
+
if line
|
|
56
|
+
o.write(line)
|
|
57
|
+
end
|
|
58
|
+
line = stderr.gets(nil)
|
|
59
|
+
if line
|
|
60
|
+
e.write(line)
|
|
61
|
+
end
|
|
62
|
+
o.rewind
|
|
63
|
+
e.rewind
|
|
64
|
+
b[cid, stdin, o, e]
|
|
65
|
+
end
|
|
66
|
+
else
|
|
67
|
+
[cid, stdin, stdout, stderr]
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
$?
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|