mbailey-chef 0.9.12.1
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 +172 -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/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 +832 -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 +7 -0
- data/distro/debian/etc/default/chef-solr-indexer +7 -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/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 +177 -0
- data/distro/debian/etc/init.d/chef-solr-indexer +176 -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/api_client.rb +264 -0
- data/lib/chef/application/agent.rb +18 -0
- data/lib/chef/application/client.rb +246 -0
- data/lib/chef/application/knife.rb +171 -0
- data/lib/chef/application/solo.rb +215 -0
- data/lib/chef/application.rb +127 -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 +173 -0
- data/lib/chef/client.rb +304 -0
- data/lib/chef/config.rb +240 -0
- data/lib/chef/cookbook/cookbook_collection.rb +44 -0
- data/lib/chef/cookbook/file_system_file_vendor.rb +54 -0
- data/lib/chef/cookbook/file_vendor.rb +48 -0
- data/lib/chef/cookbook/metadata/version.rb +87 -0
- data/lib/chef/cookbook/metadata.rb +500 -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 +227 -0
- data/lib/chef/cookbook_site_streaming_uploader.rb +244 -0
- data/lib/chef/cookbook_uploader.rb +103 -0
- data/lib/chef/cookbook_version.rb +930 -0
- data/lib/chef/couchdb.rb +239 -0
- data/lib/chef/daemon.rb +172 -0
- data/lib/chef/data_bag.rb +215 -0
- data/lib/chef/data_bag_item.rb +228 -0
- data/lib/chef/exceptions.rb +66 -0
- data/lib/chef/file_access_control.rb +140 -0
- data/lib/chef/file_cache.rb +218 -0
- data/lib/chef/handler/json_file.rb +58 -0
- data/lib/chef/handler.rb +206 -0
- data/lib/chef/index_queue/amqp_client.rb +113 -0
- data/lib/chef/index_queue/consumer.rb +76 -0
- data/lib/chef/index_queue/indexable.rb +76 -0
- data/lib/chef/index_queue.rb +29 -0
- data/lib/chef/knife/bootstrap/archlinux-gems.erb +44 -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 +43 -0
- data/lib/chef/knife/bootstrap/windows-gems.erb +34 -0
- data/lib/chef/knife/bootstrap.rb +181 -0
- data/lib/chef/knife/client_bulk_delete.rb +40 -0
- data/lib/chef/knife/client_create.rb +70 -0
- data/lib/chef/knife/client_delete.rb +45 -0
- data/lib/chef/knife/client_edit.rb +45 -0
- data/lib/chef/knife/client_list.rb +40 -0
- data/lib/chef/knife/client_reregister.rb +56 -0
- data/lib/chef/knife/client_show.rb +50 -0
- data/lib/chef/knife/configure.rb +140 -0
- data/lib/chef/knife/configure_client.rb +52 -0
- data/lib/chef/knife/cookbook_bulk_delete.rb +58 -0
- data/lib/chef/knife/cookbook_create.rb +209 -0
- data/lib/chef/knife/cookbook_delete.rb +143 -0
- data/lib/chef/knife/cookbook_download.rb +130 -0
- data/lib/chef/knife/cookbook_list.rb +41 -0
- data/lib/chef/knife/cookbook_metadata.rb +82 -0
- data/lib/chef/knife/cookbook_metadata_from_file.rb +40 -0
- data/lib/chef/knife/cookbook_show.rb +98 -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 +109 -0
- data/lib/chef/knife/cookbook_site_show.rb +57 -0
- data/lib/chef/knife/cookbook_site_unshare.rb +52 -0
- data/lib/chef/knife/cookbook_site_vendor.rb +133 -0
- data/lib/chef/knife/cookbook_test.rb +82 -0
- data/lib/chef/knife/cookbook_upload.rb +95 -0
- data/lib/chef/knife/data_bag_create.rb +59 -0
- data/lib/chef/knife/data_bag_delete.rb +48 -0
- data/lib/chef/knife/data_bag_edit.rb +50 -0
- data/lib/chef/knife/data_bag_from_file.rb +44 -0
- data/lib/chef/knife/data_bag_list.rb +43 -0
- data/lib/chef/knife/data_bag_show.rb +41 -0
- data/lib/chef/knife/ec2_instance_data.rb +46 -0
- data/lib/chef/knife/ec2_server_create.rb +216 -0
- data/lib/chef/knife/ec2_server_delete.rb +90 -0
- data/lib/chef/knife/ec2_server_list.rb +88 -0
- data/lib/chef/knife/exec.rb +52 -0
- data/lib/chef/knife/index_rebuild.rb +51 -0
- data/lib/chef/knife/node_bulk_delete.rb +43 -0
- data/lib/chef/knife/node_create.rb +47 -0
- data/lib/chef/knife/node_delete.rb +44 -0
- data/lib/chef/knife/node_edit.rb +44 -0
- data/lib/chef/knife/node_from_file.rb +42 -0
- data/lib/chef/knife/node_list.rb +41 -0
- data/lib/chef/knife/node_run_list_add.rb +64 -0
- data/lib/chef/knife/node_run_list_remove.rb +45 -0
- data/lib/chef/knife/node_show.rb +54 -0
- data/lib/chef/knife/rackspace_server_create.rb +156 -0
- data/lib/chef/knife/rackspace_server_delete.rb +57 -0
- data/lib/chef/knife/rackspace_server_list.rb +59 -0
- data/lib/chef/knife/recipe_list.rb +32 -0
- data/lib/chef/knife/role_bulk_delete.rb +44 -0
- data/lib/chef/knife/role_create.rb +52 -0
- data/lib/chef/knife/role_delete.rb +44 -0
- data/lib/chef/knife/role_edit.rb +45 -0
- data/lib/chef/knife/role_from_file.rb +46 -0
- data/lib/chef/knife/role_list.rb +40 -0
- data/lib/chef/knife/role_show.rb +51 -0
- data/lib/chef/knife/search.rb +94 -0
- data/lib/chef/knife/slicehost_images_list.rb +53 -0
- data/lib/chef/knife/slicehost_server_create.rb +103 -0
- data/lib/chef/knife/slicehost_server_delete.rb +61 -0
- data/lib/chef/knife/slicehost_server_list.rb +64 -0
- data/lib/chef/knife/ssh.rb +328 -0
- data/lib/chef/knife/status.rb +87 -0
- data/lib/chef/knife/terremark_server_create.rb +152 -0
- data/lib/chef/knife/terremark_server_delete.rb +87 -0
- data/lib/chef/knife/terremark_server_list.rb +77 -0
- data/lib/chef/knife/windows_bootstrap.rb +154 -0
- data/lib/chef/knife.rb +522 -0
- data/lib/chef/log.rb +61 -0
- data/lib/chef/mixin/check_helper.rb +31 -0
- data/lib/chef/mixin/checksum.rb +32 -0
- data/lib/chef/mixin/command/unix.rb +215 -0
- data/lib/chef/mixin/command/windows.rb +72 -0
- data/lib/chef/mixin/command.rb +220 -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/find_preferred_file.rb +92 -0
- data/lib/chef/mixin/from_file.rb +50 -0
- data/lib/chef/mixin/language.rb +156 -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 +38 -0
- data/lib/chef/mixin/template.rb +95 -0
- data/lib/chef/mixin/xml_escape.rb +140 -0
- data/lib/chef/mixins.rb +16 -0
- data/lib/chef/monkey_patches/dir.rb +36 -0
- data/lib/chef/monkey_patches/string.rb +28 -0
- data/lib/chef/monkey_patches/tempfile.rb +64 -0
- data/lib/chef/node/attribute.rb +465 -0
- data/lib/chef/node.rb +601 -0
- data/lib/chef/openid_registration.rb +187 -0
- data/lib/chef/platform.rb +371 -0
- data/lib/chef/provider/breakpoint.rb +36 -0
- data/lib/chef/provider/cookbook_file.rb +100 -0
- data/lib/chef/provider/cron/solaris.rb +195 -0
- data/lib/chef/provider/cron.rb +186 -0
- data/lib/chef/provider/deploy/revision.rb +73 -0
- data/lib/chef/provider/deploy/timestamped.rb +33 -0
- data/lib/chef/provider/deploy.rb +319 -0
- data/lib/chef/provider/directory.rb +72 -0
- data/lib/chef/provider/env/windows.rb +75 -0
- data/lib/chef/provider/env.rb +152 -0
- data/lib/chef/provider/erl_call.rb +72 -0
- data/lib/chef/provider/execute.rb +58 -0
- data/lib/chef/provider/file.rb +213 -0
- data/lib/chef/provider/git.rb +211 -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 +78 -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/group.rb +133 -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/mount.rb +232 -0
- data/lib/chef/provider/mount/windows.rb +80 -0
- data/lib/chef/provider/mount.rb +117 -0
- data/lib/chef/provider/ohai.rb +41 -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 +114 -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 +124 -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 +222 -0
- data/lib/chef/provider/package/zypper.rb +133 -0
- data/lib/chef/provider/package.rb +160 -0
- data/lib/chef/provider/remote_directory.rb +140 -0
- data/lib/chef/provider/remote_file.rb +120 -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/arch.rb +109 -0
- data/lib/chef/provider/service/debian.rb +105 -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/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 +129 -0
- data/lib/chef/provider/service.rb +128 -0
- data/lib/chef/provider/subversion.rb +159 -0
- data/lib/chef/provider/template.rb +105 -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/provider/user.rb +187 -0
- data/lib/chef/provider.rb +124 -0
- data/lib/chef/providers.rb +91 -0
- data/lib/chef/recipe.rb +130 -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 +41 -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 +92 -0
- data/lib/chef/resource/freebsd_package.rb +35 -0
- data/lib/chef/resource/gem_package.rb +49 -0
- data/lib/chef/resource/git.rb +36 -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 +146 -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.rb +523 -0
- data/lib/chef/resource_collection/stepable_iterator.rb +124 -0
- data/lib/chef/resource_collection.rb +217 -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/auth_credentials.rb +78 -0
- data/lib/chef/rest/cookie_jar.rb +31 -0
- data/lib/chef/rest/rest_request.rb +188 -0
- data/lib/chef/rest.rb +394 -0
- data/lib/chef/role.rb +287 -0
- data/lib/chef/run_context.rb +110 -0
- data/lib/chef/run_list/run_list_expansion.rb +172 -0
- data/lib/chef/run_list/run_list_item.rb +78 -0
- data/lib/chef/run_list.rb +150 -0
- data/lib/chef/run_status.rb +121 -0
- data/lib/chef/runner.rb +107 -0
- data/lib/chef/sandbox.rb +153 -0
- data/lib/chef/search/query.rb +60 -0
- data/lib/chef/shef/ext.rb +568 -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 +271 -0
- data/lib/chef/shef.rb +325 -0
- data/lib/chef/shell_out.rb +413 -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/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/util/windows.rb +56 -0
- data/lib/chef/version.rb +21 -0
- data/lib/chef/webui_user.rb +231 -0
- data/lib/chef.rb +39 -0
- metadata +533 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Author:: Daniel DeLeo (<dan@opscode.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2010 Opscode, Inc.
|
|
4
|
+
# License:: Apache License, Version 2.0
|
|
5
|
+
#
|
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
# you may not use this file except in compliance with the License.
|
|
8
|
+
# You may obtain a copy of the License at
|
|
9
|
+
#
|
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
#
|
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
# See the License for the specific language governing permissions and
|
|
16
|
+
# limitations under the License.
|
|
17
|
+
#
|
|
18
|
+
|
|
19
|
+
require 'chef/mixin/convert_to_class_name'
|
|
20
|
+
require 'chef/mixin/language'
|
|
21
|
+
|
|
22
|
+
module Shef
|
|
23
|
+
class ModelWrapper
|
|
24
|
+
|
|
25
|
+
include Chef::Mixin::ConvertToClassName
|
|
26
|
+
|
|
27
|
+
attr_reader :model_symbol
|
|
28
|
+
|
|
29
|
+
def initialize(model_class, symbol=nil)
|
|
30
|
+
@model_class = model_class
|
|
31
|
+
@model_symbol = symbol || convert_to_snake_case(model_class.name, "Chef").to_sym
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def search(query)
|
|
35
|
+
return all if query.to_s == "all"
|
|
36
|
+
results = []
|
|
37
|
+
Chef::Search::Query.new.search(@model_symbol, format_query(query)) do |obj|
|
|
38
|
+
if block_given?
|
|
39
|
+
results << yield(obj)
|
|
40
|
+
else
|
|
41
|
+
results << obj
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
results
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
alias :find :search
|
|
48
|
+
|
|
49
|
+
def all(&block)
|
|
50
|
+
all_objects = list_objects
|
|
51
|
+
block_given? ? all_objects.map(&block) : all_objects
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
alias :list :all
|
|
55
|
+
|
|
56
|
+
def show(obj_id)
|
|
57
|
+
@model_class.load(obj_id)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
alias :load :show
|
|
61
|
+
|
|
62
|
+
def transform(what_to_transform, &block)
|
|
63
|
+
if what_to_transform == :all
|
|
64
|
+
objects_to_transform = list_objects
|
|
65
|
+
else
|
|
66
|
+
objects_to_transform = search(what_to_transform)
|
|
67
|
+
end
|
|
68
|
+
objects_to_transform.each do |obj|
|
|
69
|
+
if result = yield(obj)
|
|
70
|
+
obj.save
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
alias :bulk_edit :transform
|
|
76
|
+
|
|
77
|
+
private
|
|
78
|
+
|
|
79
|
+
# paper over inconsistencies in the model classes APIs, and return the objects
|
|
80
|
+
# the user wanted instead of the URI=>object stuff
|
|
81
|
+
def list_objects
|
|
82
|
+
objects = @model_class.method(:list).arity == 0? @model_class.list : @model_class.list(true)
|
|
83
|
+
objects.map { |obj| Array(obj).find {|o| o.kind_of?(@model_class)} }
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def format_query(query)
|
|
87
|
+
if query.respond_to?(:keys)
|
|
88
|
+
query.map { |key, value| "#{key}:#{value}" }.join(" AND ")
|
|
89
|
+
else
|
|
90
|
+
query
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
class NamedDataBagWrapper < ModelWrapper
|
|
96
|
+
|
|
97
|
+
def initialize(databag_name)
|
|
98
|
+
@model_symbol = @databag_name = databag_name
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
alias :list :all
|
|
103
|
+
|
|
104
|
+
def show(item)
|
|
105
|
+
Chef::DataBagItem.load(@databag_name, item)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
private
|
|
109
|
+
|
|
110
|
+
def list_objects
|
|
111
|
+
all_items = []
|
|
112
|
+
Chef::Search::Query.new.search(@databag_name) do |item|
|
|
113
|
+
all_items << item
|
|
114
|
+
end
|
|
115
|
+
all_items
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Author:: Daniel DeLeo (<dan@opscode.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2010 Opscode, Inc.
|
|
4
|
+
# License:: Apache License, Version 2.0
|
|
5
|
+
#
|
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
# you may not use this file except in compliance with the License.
|
|
8
|
+
# You may obtain a copy of the License at
|
|
9
|
+
#
|
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
#
|
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
# See the License for the specific language governing permissions and
|
|
16
|
+
# limitations under the License.
|
|
17
|
+
#
|
|
18
|
+
|
|
19
|
+
module Shef
|
|
20
|
+
class ShefREST < Chef::REST
|
|
21
|
+
|
|
22
|
+
alias :get :get_rest
|
|
23
|
+
alias :put :put_rest
|
|
24
|
+
alias :post :post_rest
|
|
25
|
+
alias :delete :delete_rest
|
|
26
|
+
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,271 @@
|
|
|
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 'chef/recipe'
|
|
20
|
+
require 'chef/run_context'
|
|
21
|
+
require 'chef/config'
|
|
22
|
+
require 'chef/client'
|
|
23
|
+
require 'chef/cookbook/cookbook_collection'
|
|
24
|
+
require 'chef/cookbook_loader'
|
|
25
|
+
|
|
26
|
+
module Shef
|
|
27
|
+
class ShefSession
|
|
28
|
+
include Singleton
|
|
29
|
+
|
|
30
|
+
def self.session_type(type=nil)
|
|
31
|
+
@session_type = type if type
|
|
32
|
+
@session_type
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
attr_accessor :node, :compile, :recipe, :run_context
|
|
36
|
+
attr_reader :node_attributes, :client
|
|
37
|
+
def initialize
|
|
38
|
+
@node_built = false
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def node_built?
|
|
42
|
+
!!@node_built
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def reset!
|
|
46
|
+
loading do
|
|
47
|
+
rebuild_node
|
|
48
|
+
@node = client.node
|
|
49
|
+
shorten_node_inspect
|
|
50
|
+
Shef::Extensions.extend_context_node(@node)
|
|
51
|
+
rebuild_context
|
|
52
|
+
node.consume_attributes(node_attributes) if node_attributes
|
|
53
|
+
@recipe = Chef::Recipe.new(nil, nil, run_context)
|
|
54
|
+
Shef::Extensions.extend_context_recipe(@recipe)
|
|
55
|
+
@node_built = true
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def node_attributes=(attrs)
|
|
60
|
+
@node_attributes = attrs
|
|
61
|
+
@node.consume_attributes(@node_attributes)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def resource_collection
|
|
65
|
+
run_context.resource_collection
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def run_context
|
|
69
|
+
@run_context || rebuild_context
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def definitions
|
|
73
|
+
nil
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def cookbook_loader
|
|
77
|
+
nil
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def save_node
|
|
81
|
+
raise "Not Supported! #{self.class.name} doesn't support #save_node, maybe you need to run shef in client mode?"
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def rebuild_context
|
|
85
|
+
raise "Not Implemented! :rebuild_collection should be implemented by subclasses"
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
private
|
|
89
|
+
|
|
90
|
+
def loading
|
|
91
|
+
show_loading_progress
|
|
92
|
+
begin
|
|
93
|
+
yield
|
|
94
|
+
rescue => e
|
|
95
|
+
loading_complete(false)
|
|
96
|
+
raise e
|
|
97
|
+
else
|
|
98
|
+
loading_complete(true)
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def show_loading_progress
|
|
103
|
+
print "Loading"
|
|
104
|
+
@loading = true
|
|
105
|
+
@dot_printer = Thread.new do
|
|
106
|
+
while @loading
|
|
107
|
+
print "."
|
|
108
|
+
sleep 0.5
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def loading_complete(success)
|
|
114
|
+
@loading = false
|
|
115
|
+
@dot_printer.join
|
|
116
|
+
msg = success ? "done.\n\n" : "epic fail!\n\n"
|
|
117
|
+
print msg
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def shorten_node_inspect
|
|
121
|
+
def @node.inspect
|
|
122
|
+
"<Chef::Node:0x#{self.object_id.to_s(16)} @name=\"#{self.name}\">"
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def rebuild_node
|
|
127
|
+
raise "Not Implemented! :rebuild_node should be implemented by subclasses"
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
class StandAloneSession < ShefSession
|
|
133
|
+
|
|
134
|
+
session_type :standalone
|
|
135
|
+
|
|
136
|
+
def rebuild_context
|
|
137
|
+
@run_context = Chef::RunContext.new(@node, {}) # no recipes
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
private
|
|
141
|
+
|
|
142
|
+
def rebuild_node
|
|
143
|
+
Chef::Config[:solo] = true
|
|
144
|
+
@client = Chef::Client.new
|
|
145
|
+
@client.run_ohai
|
|
146
|
+
@client.build_node
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
class SoloSession < ShefSession
|
|
152
|
+
|
|
153
|
+
session_type :solo
|
|
154
|
+
|
|
155
|
+
def definitions
|
|
156
|
+
@run_context.definitions
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def rebuild_context
|
|
160
|
+
@run_context = Chef::RunContext.new(@node, Chef::CookbookCollection.new(Chef::CookbookLoader.new))
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
private
|
|
164
|
+
|
|
165
|
+
def rebuild_node
|
|
166
|
+
# Tell the client we're chef solo so it won't try to contact the server
|
|
167
|
+
Chef::Config[:solo] = true
|
|
168
|
+
@client = Chef::Client.new
|
|
169
|
+
@client.run_ohai
|
|
170
|
+
@client.build_node
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
class ClientSession < SoloSession
|
|
176
|
+
|
|
177
|
+
session_type :solo
|
|
178
|
+
|
|
179
|
+
def save_node
|
|
180
|
+
@client.save_node
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
private
|
|
184
|
+
|
|
185
|
+
def rebuild_node
|
|
186
|
+
# Make sure the client knows this is not chef solo
|
|
187
|
+
Chef::Config[:solo] = false
|
|
188
|
+
@client = Chef::Client.new
|
|
189
|
+
@client.run_ohai
|
|
190
|
+
@client.register
|
|
191
|
+
@client.build_node
|
|
192
|
+
|
|
193
|
+
@client.sync_cookbooks
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
class DoppelGangerClient < Chef::Client
|
|
199
|
+
|
|
200
|
+
attr_reader :node_name
|
|
201
|
+
|
|
202
|
+
def initialize(node_name)
|
|
203
|
+
@node_name = node_name
|
|
204
|
+
@ohai = Ohai::System.new
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
# Run the very smallest amount of ohai we can get away with and still
|
|
208
|
+
# hope to have things work. Otherwise we're not very good doppelgangers
|
|
209
|
+
def run_ohai
|
|
210
|
+
@ohai.require_plugin('os')
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
# DoppelGanger implementation of build_node. preserves as many of the node's
|
|
214
|
+
# attributes, and does not save updates to the server
|
|
215
|
+
def build_node
|
|
216
|
+
Chef::Log.debug("Building node object for #{@node_name}")
|
|
217
|
+
|
|
218
|
+
@node = Chef::Node.find_or_create(node_name)
|
|
219
|
+
|
|
220
|
+
ohai_data = @ohai.data.merge(@node.automatic_attrs)
|
|
221
|
+
|
|
222
|
+
@node.consume_external_attrs(ohai_data,nil)
|
|
223
|
+
@node.reset_defaults_and_overrides
|
|
224
|
+
|
|
225
|
+
@node
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
def register
|
|
229
|
+
@rest = Chef::REST.new(Chef::Config[:chef_server_url], Chef::Config[:node_name], Chef::Config[:client_key])
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
class DoppelGangerSession < ClientSession
|
|
235
|
+
|
|
236
|
+
session_type "doppelganger client"
|
|
237
|
+
|
|
238
|
+
def save_node
|
|
239
|
+
puts "A doppelganger should think twice before saving the node"
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
def assume_identity(node_name)
|
|
243
|
+
Chef::Config[:doppelganger] = @node_name = node_name
|
|
244
|
+
reset!
|
|
245
|
+
rescue Exception => e
|
|
246
|
+
puts "#{e.class.name}: #{e.message}"
|
|
247
|
+
puts Array(e.backtrace).join("\n")
|
|
248
|
+
puts
|
|
249
|
+
puts "* " * 40
|
|
250
|
+
puts "failed to assume the identity of node '#{node_name}', resetting"
|
|
251
|
+
puts "* " * 40
|
|
252
|
+
puts
|
|
253
|
+
Chef::Config[:doppelganger] = false
|
|
254
|
+
@node_built = false
|
|
255
|
+
Shef.session
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
def rebuild_node
|
|
259
|
+
# Make sure the client knows this is not chef solo
|
|
260
|
+
Chef::Config[:solo] = false
|
|
261
|
+
@client = DoppelGangerClient.new(@node_name)
|
|
262
|
+
@client.run_ohai
|
|
263
|
+
@client.register
|
|
264
|
+
@client.build_node
|
|
265
|
+
|
|
266
|
+
@client.sync_cookbooks
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
end
|
data/lib/chef/shef.rb
ADDED
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
# Author:: Daniel DeLeo (<dan@kallistec.com>)
|
|
2
|
+
# Copyright:: Copyright (c) 2009 Daniel DeLeo
|
|
3
|
+
# License:: Apache License, Version 2.0
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
#
|
|
17
|
+
|
|
18
|
+
require "singleton"
|
|
19
|
+
require "pp"
|
|
20
|
+
require "etc"
|
|
21
|
+
require "mixlib/cli"
|
|
22
|
+
|
|
23
|
+
require 'chef/version'
|
|
24
|
+
require "chef/client"
|
|
25
|
+
require "chef/config"
|
|
26
|
+
|
|
27
|
+
require "chef/shef/shef_session"
|
|
28
|
+
require "chef/shef/ext"
|
|
29
|
+
|
|
30
|
+
# = Shef
|
|
31
|
+
# Shef is Chef in an IRB session. Shef can interact with a Chef server via the
|
|
32
|
+
# REST API, and run and debug recipes interactively.
|
|
33
|
+
module Shef
|
|
34
|
+
LEADERS = Hash.new("")
|
|
35
|
+
LEADERS[Chef::Recipe] = ":recipe"
|
|
36
|
+
LEADERS[Chef::Node] = ":attributes"
|
|
37
|
+
|
|
38
|
+
class << self
|
|
39
|
+
attr_accessor :client_type
|
|
40
|
+
attr_accessor :options
|
|
41
|
+
attr_accessor :env
|
|
42
|
+
attr_writer :editor
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Start the irb REPL with shef's customizations
|
|
46
|
+
def self.start
|
|
47
|
+
setup_logger
|
|
48
|
+
# FUGLY HACK: irb gives us no other choice.
|
|
49
|
+
irb_help = [:help, :irb_help, IRB::ExtendCommandBundle::NO_OVERRIDE]
|
|
50
|
+
IRB::ExtendCommandBundle.instance_variable_get(:@ALIASES).delete(irb_help)
|
|
51
|
+
|
|
52
|
+
parse_opts
|
|
53
|
+
|
|
54
|
+
# HACK: this duplicates the functions of IRB.start, but we have to do it
|
|
55
|
+
# to get access to the main object before irb starts.
|
|
56
|
+
::IRB.setup(nil)
|
|
57
|
+
|
|
58
|
+
irb = IRB::Irb.new
|
|
59
|
+
|
|
60
|
+
init(irb.context.main)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
irb_conf[:IRB_RC].call(irb.context) if irb_conf[:IRB_RC]
|
|
64
|
+
irb_conf[:MAIN_CONTEXT] = irb.context
|
|
65
|
+
|
|
66
|
+
trap("SIGINT") do
|
|
67
|
+
irb.signal_handle
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
catch(:IRB_EXIT) do
|
|
71
|
+
irb.eval_input
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def self.setup_logger
|
|
76
|
+
Chef::Config[:log_level] ||= :warn
|
|
77
|
+
Chef::Log.init(STDERR)
|
|
78
|
+
Mixlib::Authentication::Log.logger = Ohai::Log.logger = Chef::Log.logger
|
|
79
|
+
Chef::Log.level = Chef::Config[:log_level] || :warn
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# Shef assumes it's running whenever it is defined
|
|
83
|
+
def self.running?
|
|
84
|
+
true
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Set the irb_conf object to something other than IRB.conf
|
|
88
|
+
# usful for testing.
|
|
89
|
+
def self.irb_conf=(conf_hash)
|
|
90
|
+
@irb_conf = conf_hash
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def self.irb_conf
|
|
94
|
+
@irb_conf || IRB.conf
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def self.configure_irb
|
|
98
|
+
irb_conf[:HISTORY_FILE] = "~/.shef_history"
|
|
99
|
+
irb_conf[:SAVE_HISTORY] = 1000
|
|
100
|
+
|
|
101
|
+
irb_conf[:IRB_RC] = lambda do |conf|
|
|
102
|
+
m = conf.main
|
|
103
|
+
|
|
104
|
+
conf.prompt_c = "chef#{leader(m)} > "
|
|
105
|
+
conf.return_format = " => %s \n"
|
|
106
|
+
conf.prompt_i = "chef#{leader(m)} > "
|
|
107
|
+
conf.prompt_n = "chef#{leader(m)} ?> "
|
|
108
|
+
conf.prompt_s = "chef#{leader(m)}%l> "
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def self.leader(main_object)
|
|
113
|
+
env_string = Shef.env ? " (#{Shef.env})" : ""
|
|
114
|
+
LEADERS[main_object.class] + env_string
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def self.session
|
|
118
|
+
unless client_type.instance.node_built?
|
|
119
|
+
puts "Session type: #{client_type.session_type}"
|
|
120
|
+
client_type.instance.reset!
|
|
121
|
+
end
|
|
122
|
+
client_type.instance
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def self.init(main)
|
|
126
|
+
parse_json
|
|
127
|
+
configure_irb
|
|
128
|
+
|
|
129
|
+
session # trigger ohai run + session load
|
|
130
|
+
|
|
131
|
+
session.node.consume_attributes(@json_attribs)
|
|
132
|
+
|
|
133
|
+
Extensions.extend_context_object(main)
|
|
134
|
+
|
|
135
|
+
main.version
|
|
136
|
+
puts
|
|
137
|
+
|
|
138
|
+
puts "run `help' for help, `exit' or ^D to quit."
|
|
139
|
+
puts
|
|
140
|
+
puts "Ohai2u#{greeting}!"
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def self.greeting
|
|
144
|
+
" #{Etc.getlogin}@#{Shef.session.node.fqdn}"
|
|
145
|
+
rescue NameError
|
|
146
|
+
""
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def self.parse_json
|
|
150
|
+
# HACK: copied verbatim from chef/application/client, because it's not
|
|
151
|
+
# reusable as written there :(
|
|
152
|
+
if Chef::Config[:json_attribs]
|
|
153
|
+
begin
|
|
154
|
+
json_io = open(Chef::Config[:json_attribs])
|
|
155
|
+
rescue SocketError => error
|
|
156
|
+
fatal!("I cannot connect to #{Chef::Config[:json_attribs]}", 2)
|
|
157
|
+
rescue Errno::ENOENT => error
|
|
158
|
+
fatal!("I cannot find #{Chef::Config[:json_attribs]}", 2)
|
|
159
|
+
rescue Errno::EACCES => error
|
|
160
|
+
fatal!("Permissions are incorrect on #{Chef::Config[:json_attribs]}. Please chmod a+r #{Chef::Config[:json_attribs]}", 2)
|
|
161
|
+
rescue Exception => error
|
|
162
|
+
fatal!("Got an unexpected error reading #{Chef::Config[:json_attribs]}: #{error.message}", 2)
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
begin
|
|
166
|
+
@json_attribs = JSON.parse(json_io.read)
|
|
167
|
+
rescue JSON::ParserError => error
|
|
168
|
+
fatal!("Could not parse the provided JSON file (#{Chef::Config[:json_attribs]})!: " + error.message, 2)
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def self.fatal!(message, exit_status)
|
|
174
|
+
Chef::Log.fatal(message)
|
|
175
|
+
exit exit_status
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def self.client_type
|
|
179
|
+
type = Shef::StandAloneSession
|
|
180
|
+
type = Shef::SoloSession if Chef::Config[:shef_solo]
|
|
181
|
+
type = Shef::ClientSession if Chef::Config[:client]
|
|
182
|
+
type = Shef::DoppelGangerSession if Chef::Config[:doppelganger]
|
|
183
|
+
type
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
def self.parse_opts
|
|
187
|
+
@options = Options.new
|
|
188
|
+
@options.parse_opts
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
def self.editor
|
|
192
|
+
@editor || Chef::Config[:editor] || ENV['EDITOR']
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
class Options
|
|
196
|
+
include Mixlib::CLI
|
|
197
|
+
|
|
198
|
+
def self.footer(text=nil)
|
|
199
|
+
@footer = text if text
|
|
200
|
+
@footer
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
banner("shef #{Chef::VERSION}\n\nUsage: shef [NAMED_CONF] (OPTIONS)")
|
|
204
|
+
|
|
205
|
+
footer(<<-FOOTER)
|
|
206
|
+
When no CONFIG is specified, shef attempts to load a default configuration file:
|
|
207
|
+
* If a NAMED_CONF is given, shef will load ~/.chef/NAMED_CONF/shef.rb
|
|
208
|
+
* If no NAMED_CONF is given shef will load ~/.chef/shef.rb if it exists
|
|
209
|
+
* Shef falls back to loading /etc/chef/client.rb or /etc/chef/solo.rb if -z or
|
|
210
|
+
-s options are given and no shef.rb can be found.
|
|
211
|
+
FOOTER
|
|
212
|
+
|
|
213
|
+
option :config_file,
|
|
214
|
+
:short => "-c CONFIG",
|
|
215
|
+
:long => "--config CONFIG",
|
|
216
|
+
:description => "The configuration file to use"
|
|
217
|
+
|
|
218
|
+
option :help,
|
|
219
|
+
:short => "-h",
|
|
220
|
+
:long => "--help",
|
|
221
|
+
:description => "Show this message",
|
|
222
|
+
:on => :tail,
|
|
223
|
+
:boolean => true,
|
|
224
|
+
:proc => proc { print_help }
|
|
225
|
+
|
|
226
|
+
option :log_level,
|
|
227
|
+
:short => "-l LOG_LEVEL",
|
|
228
|
+
:long => '--log-level LOG_LEVEL',
|
|
229
|
+
:description => "Set the logging level",
|
|
230
|
+
:proc => proc { |level| Chef::Log.level = level.to_sym }
|
|
231
|
+
|
|
232
|
+
option :standalone,
|
|
233
|
+
:short => "-a",
|
|
234
|
+
:long => "--standalone",
|
|
235
|
+
:description => "standalone shef session",
|
|
236
|
+
:default => true,
|
|
237
|
+
:boolean => true
|
|
238
|
+
|
|
239
|
+
option :shef_solo,
|
|
240
|
+
:short => "-s",
|
|
241
|
+
:long => "--solo",
|
|
242
|
+
:description => "chef-solo shef session",
|
|
243
|
+
:boolean => true,
|
|
244
|
+
:proc => proc {Chef::Config[:solo] = true}
|
|
245
|
+
|
|
246
|
+
option :client,
|
|
247
|
+
:short => "-z",
|
|
248
|
+
:long => "--client",
|
|
249
|
+
:description => "chef-client shef session",
|
|
250
|
+
:boolean => true
|
|
251
|
+
|
|
252
|
+
option :json_attribs,
|
|
253
|
+
:short => "-j JSON_ATTRIBS",
|
|
254
|
+
:long => "--json-attributes JSON_ATTRIBS",
|
|
255
|
+
:description => "Load attributes from a JSON file or URL",
|
|
256
|
+
:proc => nil
|
|
257
|
+
|
|
258
|
+
option :chef_server_url,
|
|
259
|
+
:short => "-S CHEFSERVERURL",
|
|
260
|
+
:long => "--server CHEFSERVERURL",
|
|
261
|
+
:description => "The chef server URL",
|
|
262
|
+
:proc => nil
|
|
263
|
+
|
|
264
|
+
option :version,
|
|
265
|
+
:short => "-v",
|
|
266
|
+
:long => "--version",
|
|
267
|
+
:description => "Show chef version",
|
|
268
|
+
:boolean => true,
|
|
269
|
+
:proc => lambda {|v| puts "Chef: #{::Chef::VERSION}"},
|
|
270
|
+
:exit => 0
|
|
271
|
+
|
|
272
|
+
def self.print_help
|
|
273
|
+
instance = new
|
|
274
|
+
instance.parse_options([])
|
|
275
|
+
puts instance.opt_parser
|
|
276
|
+
puts
|
|
277
|
+
puts footer
|
|
278
|
+
puts
|
|
279
|
+
exit 1
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
def self.setup!
|
|
283
|
+
self.new.parse_opts
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
def parse_opts
|
|
287
|
+
remainder = parse_options
|
|
288
|
+
environment = remainder.first
|
|
289
|
+
# We have to nuke ARGV to make sure irb's option parser never sees it.
|
|
290
|
+
# otherwise, IRB complains about command line switches it doesn't recognize.
|
|
291
|
+
ARGV.clear
|
|
292
|
+
config[:config_file] = config_file_for_shef_mode(environment)
|
|
293
|
+
config_msg = config[:config_file] || "none (standalone shef session)"
|
|
294
|
+
puts "loading configuration: #{config_msg}"
|
|
295
|
+
Chef::Config.from_file(config[:config_file]) if !config[:config_file].nil? && File.exists?(config[:config_file]) && File.readable?(config[:config_file])
|
|
296
|
+
Chef::Config.merge!(config)
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
private
|
|
300
|
+
|
|
301
|
+
def config_file_for_shef_mode(environment)
|
|
302
|
+
if config[:config_file]
|
|
303
|
+
config[:config_file]
|
|
304
|
+
elsif environment
|
|
305
|
+
Shef.env = environment
|
|
306
|
+
config_file_to_try = ::File.join(ENV['HOME'], '.chef', environment, 'shef.rb')
|
|
307
|
+
unless ::File.exist?(config_file_to_try)
|
|
308
|
+
puts "could not find shef config for environment #{environment} at #{config_file_to_try}"
|
|
309
|
+
exit 1
|
|
310
|
+
end
|
|
311
|
+
config_file_to_try
|
|
312
|
+
elsif ENV['HOME'] && ::File.exist?(File.join(ENV['HOME'], '.chef', 'shef.rb'))
|
|
313
|
+
File.join(ENV['HOME'], '.chef', 'shef.rb')
|
|
314
|
+
elsif config[:solo]
|
|
315
|
+
"/etc/chef/solo.rb"
|
|
316
|
+
elsif config[:client]
|
|
317
|
+
"/etc/chef/client.rb"
|
|
318
|
+
else
|
|
319
|
+
nil
|
|
320
|
+
end
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
end
|