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
data/lib/chef/handler.rb
ADDED
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Author:: Adam Jacob (<adam@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
|
+
require 'chef/client'
|
|
19
|
+
require 'forwardable'
|
|
20
|
+
|
|
21
|
+
class Chef
|
|
22
|
+
# == Chef::Handler
|
|
23
|
+
# The base class for an Exception or Notification Handler. Create your own
|
|
24
|
+
# handler by subclassing Chef::Handler. When a Chef run fails with an
|
|
25
|
+
# uncaught Exception, Chef will set the +run_status+ on your handler and call
|
|
26
|
+
# +report+
|
|
27
|
+
#
|
|
28
|
+
# ===Example:
|
|
29
|
+
#
|
|
30
|
+
# require 'net/smtp'
|
|
31
|
+
#
|
|
32
|
+
# module MyOrg
|
|
33
|
+
# class OhNoes < Chef::Handler
|
|
34
|
+
#
|
|
35
|
+
# def report
|
|
36
|
+
# # Create the email message
|
|
37
|
+
# message = "From: Your Name <your@mail.address>\n"
|
|
38
|
+
# message << "To: Destination Address <someone@example.com>\n"
|
|
39
|
+
# message << "Subject: Chef Run Failure\n"
|
|
40
|
+
# message << "Date: #{Time.now.rfc2822}\n\n"
|
|
41
|
+
#
|
|
42
|
+
# # The Node is available as +node+
|
|
43
|
+
# message << "Chef run failed on #{node.name}\n"
|
|
44
|
+
# # +run_status+ is a value object with all of the run status data
|
|
45
|
+
# message << "#{run_status.formatted_exception}\n"
|
|
46
|
+
# # Join the backtrace lines. Coerce to an array just in case.
|
|
47
|
+
# message << Array(backtrace).join("\n")
|
|
48
|
+
#
|
|
49
|
+
# # Send the email
|
|
50
|
+
# Net::SMTP.start('your.smtp.server', 25) do |smtp|
|
|
51
|
+
# smtp.send_message message, 'from@address', 'to@address'
|
|
52
|
+
# end
|
|
53
|
+
# end
|
|
54
|
+
#
|
|
55
|
+
# end
|
|
56
|
+
# end
|
|
57
|
+
#
|
|
58
|
+
class Handler
|
|
59
|
+
|
|
60
|
+
# The list of currently configured report handlers
|
|
61
|
+
def self.report_handlers
|
|
62
|
+
Array(Chef::Config[:report_handlers])
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Run the report handlers. This will usually be called by a notification
|
|
66
|
+
# from Chef::Client
|
|
67
|
+
def self.run_report_handlers(run_status)
|
|
68
|
+
Chef::Log.info("Running report handlers")
|
|
69
|
+
report_handlers.each do |handler|
|
|
70
|
+
handler.run_report_safely(run_status)
|
|
71
|
+
end
|
|
72
|
+
Chef::Log.info("Report handlers complete")
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Wire up a notification to run the report handlers if the chef run
|
|
76
|
+
# succeeds.
|
|
77
|
+
Chef::Client.when_run_completes_successfully do |run_status|
|
|
78
|
+
run_report_handlers(run_status)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# The list of currently configured exception handlers
|
|
82
|
+
def self.exception_handlers
|
|
83
|
+
Array(Chef::Config[:exception_handlers])
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Run the exception handlers. Usually will be called by a notification
|
|
87
|
+
# from Chef::Client when the run fails.
|
|
88
|
+
def self.run_exception_handlers(run_status)
|
|
89
|
+
Chef::Log.error("Running exception handlers")
|
|
90
|
+
exception_handlers.each do |handler|
|
|
91
|
+
handler.run_report_safely(run_status)
|
|
92
|
+
end
|
|
93
|
+
Chef::Log.error("Exception handlers complete")
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Wire up a notification to run the exception handlers if the chef run fails.
|
|
97
|
+
Chef::Client.when_run_fails do |run_status|
|
|
98
|
+
run_exception_handlers(run_status)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
extend Forwardable
|
|
102
|
+
|
|
103
|
+
# The Chef::RunStatus object containing data about the Chef run.
|
|
104
|
+
attr_reader :run_status
|
|
105
|
+
|
|
106
|
+
##
|
|
107
|
+
# :method: start_time
|
|
108
|
+
#
|
|
109
|
+
# The time the chef run started
|
|
110
|
+
def_delegator :@run_status, :start_time
|
|
111
|
+
|
|
112
|
+
##
|
|
113
|
+
# :method: end_time
|
|
114
|
+
#
|
|
115
|
+
# The time the chef run ended
|
|
116
|
+
def_delegator :@run_status, :end_time
|
|
117
|
+
|
|
118
|
+
##
|
|
119
|
+
# :method: elapsed_time
|
|
120
|
+
#
|
|
121
|
+
# The time elapsed between the start and finish of the chef run
|
|
122
|
+
def_delegator :@run_status, :elapsed_time
|
|
123
|
+
|
|
124
|
+
##
|
|
125
|
+
# :method: run_context
|
|
126
|
+
#
|
|
127
|
+
# The Chef::RunContext object used by the chef run
|
|
128
|
+
def_delegator :@run_status, :run_context
|
|
129
|
+
|
|
130
|
+
##
|
|
131
|
+
# :method: exception
|
|
132
|
+
#
|
|
133
|
+
# The uncaught Exception that terminated the chef run, or nil if the run
|
|
134
|
+
# completed successfully
|
|
135
|
+
def_delegator :@run_status, :exception
|
|
136
|
+
|
|
137
|
+
##
|
|
138
|
+
# :method: backtrace
|
|
139
|
+
#
|
|
140
|
+
# The backtrace captured by the uncaught exception that terminated the chef
|
|
141
|
+
# run, or nil if the run completed successfully
|
|
142
|
+
def_delegator :@run_status, :backtrace
|
|
143
|
+
|
|
144
|
+
##
|
|
145
|
+
# :method: node
|
|
146
|
+
#
|
|
147
|
+
# The Chef::Node for this client run
|
|
148
|
+
def_delegator :@run_status, :node
|
|
149
|
+
|
|
150
|
+
##
|
|
151
|
+
# :method: all_resources
|
|
152
|
+
#
|
|
153
|
+
# An Array containing all resources in the chef run's resource_collection
|
|
154
|
+
def_delegator :@run_status, :all_resources
|
|
155
|
+
|
|
156
|
+
##
|
|
157
|
+
# :method: updated_resources
|
|
158
|
+
#
|
|
159
|
+
# An Array containing all resources that were updated during the chef run
|
|
160
|
+
def_delegator :@run_status, :updated_resources
|
|
161
|
+
|
|
162
|
+
##
|
|
163
|
+
# :method: success?
|
|
164
|
+
#
|
|
165
|
+
# Was the chef run successful? True if the chef run did not raise an
|
|
166
|
+
# uncaught exception
|
|
167
|
+
def_delegator :@run_status, :success?
|
|
168
|
+
|
|
169
|
+
##
|
|
170
|
+
# :method: failed?
|
|
171
|
+
#
|
|
172
|
+
# Did the chef run fail? True if the chef run raised an uncaught exception
|
|
173
|
+
def_delegator :@run_status, :failed?
|
|
174
|
+
|
|
175
|
+
# The main entry point for report handling. Subclasses should override this
|
|
176
|
+
# method with their own report handling logic.
|
|
177
|
+
def report
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
# Runs the report handler, rescuing and logging any errors it may cause.
|
|
181
|
+
# This ensures that all handlers get a chance to run even if one fails.
|
|
182
|
+
# This method should not be overridden by subclasses unless you know what
|
|
183
|
+
# you're doing.
|
|
184
|
+
def run_report_safely(run_status)
|
|
185
|
+
run_report_unsafe(run_status)
|
|
186
|
+
rescue Exception => e
|
|
187
|
+
Chef::Log.error("Report handler #{self.class.name} raised #{e.inspect}")
|
|
188
|
+
Array(e.backtrace).each { |line| Chef::Log.error(line) }
|
|
189
|
+
ensure
|
|
190
|
+
@run_status = nil
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
# Runs the report handler without any error handling. This method should
|
|
194
|
+
# not be used directly except in testing.
|
|
195
|
+
def run_report_unsafe(run_status)
|
|
196
|
+
@run_status = run_status
|
|
197
|
+
report
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
# Return the Hash representation of the run_status
|
|
201
|
+
def data
|
|
202
|
+
@run_status.to_hash
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
end
|
|
206
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Adam Jacob (<adam@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/handler'
|
|
20
|
+
require 'chef/resource/directory'
|
|
21
|
+
|
|
22
|
+
class Chef
|
|
23
|
+
class Handler
|
|
24
|
+
class JsonFile < ::Chef::Handler
|
|
25
|
+
|
|
26
|
+
attr_reader :config
|
|
27
|
+
|
|
28
|
+
def initialize(config={})
|
|
29
|
+
@config = config
|
|
30
|
+
@config[:path] ||= "/var/chef/reports"
|
|
31
|
+
@config
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def report
|
|
35
|
+
if exception
|
|
36
|
+
Chef::Log.error("Creating JSON exception report")
|
|
37
|
+
else
|
|
38
|
+
Chef::Log.info("Creating JSON run report")
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
build_report_dir
|
|
42
|
+
savetime = Time.now.strftime("%Y%m%d%H%M%S")
|
|
43
|
+
File.open(File.join(config[:path], "chef-run-report-#{savetime}.json"), "w") do |file|
|
|
44
|
+
file.puts Chef::JSONCompat.to_json_pretty(data)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def build_report_dir
|
|
49
|
+
unless File.exists?(config[:path])
|
|
50
|
+
FileUtils.mkdir_p(config[:path])
|
|
51
|
+
File.chmod(00700, config[:path])
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Daniel DeLeo (<dan@kallistec.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2009 Daniel DeLeo
|
|
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 "singleton"
|
|
20
|
+
require "bunny"
|
|
21
|
+
|
|
22
|
+
require "chef/index_queue/amqp_client"
|
|
23
|
+
require "chef/index_queue/indexable"
|
|
24
|
+
require "chef/index_queue/consumer"
|
|
25
|
+
|
|
26
|
+
class Chef
|
|
27
|
+
module IndexQueue
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Daniel DeLeo (<dan@kallistec.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2009 Daniel DeLeo
|
|
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 IndexQueue
|
|
21
|
+
class AmqpClient
|
|
22
|
+
VNODES = 1024
|
|
23
|
+
|
|
24
|
+
include Singleton
|
|
25
|
+
|
|
26
|
+
def initialize
|
|
27
|
+
reset!
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def reset!
|
|
31
|
+
@amqp_client && amqp_client.connected? && amqp_client.stop
|
|
32
|
+
@amqp_client = nil
|
|
33
|
+
@exchange = nil
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def stop
|
|
37
|
+
@amqp_client && @amqp_client.stop
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def amqp_client
|
|
41
|
+
unless @amqp_client
|
|
42
|
+
begin
|
|
43
|
+
@amqp_client = Bunny.new(amqp_opts)
|
|
44
|
+
Chef::Log.debug "Starting AMQP connection with client settings: #{@amqp_client.inspect}"
|
|
45
|
+
@amqp_client.start
|
|
46
|
+
@amqp_client.qos(:prefetch_count => 1)
|
|
47
|
+
rescue Bunny::ServerDownError => e
|
|
48
|
+
Chef::Log.fatal "Could not connect to rabbitmq. Is it running, reachable, and configured correctly?"
|
|
49
|
+
raise e
|
|
50
|
+
rescue Bunny::ProtocolError => e
|
|
51
|
+
Chef::Log.fatal "Connection to rabbitmq refused. Check your rabbitmq configuration and chef's amqp* settings"
|
|
52
|
+
raise e
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
@amqp_client
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def exchange
|
|
59
|
+
@exchange ||= amqp_client.exchange("chef-indexer", :durable => true, :type => :fanout)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def disconnected!
|
|
63
|
+
Chef::Log.error("Disconnected from the AMQP Broker (RabbitMQ)")
|
|
64
|
+
@amqp_client = nil
|
|
65
|
+
reset!
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def queue_for_object(obj_id)
|
|
69
|
+
retries = 0
|
|
70
|
+
vnode_tag = obj_id_to_int(obj_id) % VNODES
|
|
71
|
+
begin
|
|
72
|
+
yield amqp_client.queue("vnode-#{vnode_tag}", :passive => false, :durable => true, :exclusive => false, :auto_delete => false)
|
|
73
|
+
rescue Bunny::ServerDownError, Bunny::ConnectionError, Errno::ECONNRESET
|
|
74
|
+
disconnected!
|
|
75
|
+
if (retries += 1) < 2
|
|
76
|
+
Chef::Log.info("Attempting to reconnect to the AMQP broker")
|
|
77
|
+
retry
|
|
78
|
+
else
|
|
79
|
+
Chef::Log.fatal("Could not re-connect to the AMQP broker, giving up")
|
|
80
|
+
raise
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
private
|
|
86
|
+
|
|
87
|
+
# Sometimes object ids are "proper" UUIDs, like "64bc00eb-120b-b6a2-ec0e-34fc90d151be"
|
|
88
|
+
# and sometimes they omit the dashes, like "64bc00eb120bb6a2ec0e34fc90d151be"
|
|
89
|
+
# UUIDTools uses different methods to parse the different styles.
|
|
90
|
+
def obj_id_to_int(obj_id)
|
|
91
|
+
UUIDTools::UUID.parse(obj_id).to_i
|
|
92
|
+
rescue ArgumentError
|
|
93
|
+
UUIDTools::UUID.parse_hexdigest(obj_id).to_i
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def durable_queue?
|
|
97
|
+
!!Chef::Config[:amqp_consumer_id]
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def consumer_id
|
|
101
|
+
Chef::Config[:amqp_consumer_id] || UUIDTools::UUID.random_create.to_s
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def amqp_opts
|
|
105
|
+
{ :spec => '08',
|
|
106
|
+
:host => Chef::Config[:amqp_host],
|
|
107
|
+
:port => Chef::Config[:amqp_port],
|
|
108
|
+
:user => Chef::Config[:amqp_user],
|
|
109
|
+
:pass => Chef::Config[:amqp_pass],
|
|
110
|
+
:vhost => Chef::Config[:amqp_vhost]}
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Daniel DeLeo (<dan@kallistec.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2009 Daniel DeLeo
|
|
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 IndexQueue
|
|
21
|
+
module Consumer
|
|
22
|
+
module ClassMethods
|
|
23
|
+
def expose(*methods)
|
|
24
|
+
@exposed_methods = Array(@exposed_methods)
|
|
25
|
+
@exposed_methods += methods
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def exposed_methods
|
|
29
|
+
@exposed_methods || []
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def whitelisted?(method_name)
|
|
33
|
+
exposed_methods.include?(method_name)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def self.included(including_class)
|
|
38
|
+
including_class.send(:extend, ClassMethods)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def run
|
|
42
|
+
Chef::Log.debug("Starting Index Queue Consumer")
|
|
43
|
+
AmqpClient.instance.queue # triggers connection setup
|
|
44
|
+
|
|
45
|
+
begin
|
|
46
|
+
AmqpClient.instance.queue.subscribe(:ack => true, :timeout => false) do |message|
|
|
47
|
+
call_action_for_message(message)
|
|
48
|
+
end
|
|
49
|
+
rescue Bunny::ConnectionError, Errno::ECONNRESET, Bunny::ServerDownError
|
|
50
|
+
AmqpClient.instance.disconnected!
|
|
51
|
+
Chef::Log.warn "Connection to rabbitmq lost. attempting to reconnect"
|
|
52
|
+
sleep 1
|
|
53
|
+
retry
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
alias :start :run
|
|
57
|
+
|
|
58
|
+
def call_action_for_message(message)
|
|
59
|
+
amqp_payload = Chef::JSONCompat.from_json(message[:payload], :create_additions => false, :max_nesting => false)
|
|
60
|
+
action = amqp_payload["action"].to_sym
|
|
61
|
+
app_payload = amqp_payload["payload"]
|
|
62
|
+
assert_method_whitelisted(action)
|
|
63
|
+
send(action, app_payload)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
private
|
|
67
|
+
|
|
68
|
+
def assert_method_whitelisted(method_name)
|
|
69
|
+
unless self.class.whitelisted?(method_name)
|
|
70
|
+
raise ArgumentError, "non-exposed method #{method_name} called via index queue"
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|