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,109 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Daniel DeLeo (<dan@kallistec.com>)
|
|
3
|
+
# Author:: Seth Falcon (<seth@opscode.com>)
|
|
4
|
+
# Copyright:: Copyright (c) 2009 Daniel DeLeo
|
|
5
|
+
# Copyright:: Copyright (c) 2010 Opscode, Inc.
|
|
6
|
+
# License:: Apache License, Version 2.0
|
|
7
|
+
#
|
|
8
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
9
|
+
# you may not use this file except in compliance with the License.
|
|
10
|
+
# You may obtain a copy of the License at
|
|
11
|
+
#
|
|
12
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
13
|
+
#
|
|
14
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
15
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
16
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
17
|
+
# See the License for the specific language governing permissions and
|
|
18
|
+
# limitations under the License.
|
|
19
|
+
#
|
|
20
|
+
require 'chef/json_compat'
|
|
21
|
+
|
|
22
|
+
class Chef
|
|
23
|
+
module IndexQueue
|
|
24
|
+
module Indexable
|
|
25
|
+
|
|
26
|
+
module ClassMethods
|
|
27
|
+
|
|
28
|
+
def index_object_type(explicit_type_name=nil)
|
|
29
|
+
@index_object_type = explicit_type_name.to_s if explicit_type_name
|
|
30
|
+
@index_object_type
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Resets all metadata used for indexing to nil. Used for testing
|
|
34
|
+
def reset_index_metadata!
|
|
35
|
+
@index_object_type = nil
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def self.included(including_class)
|
|
41
|
+
including_class.send(:extend, ClassMethods)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
attr_accessor :index_id
|
|
45
|
+
|
|
46
|
+
def index_object_type
|
|
47
|
+
self.class.index_object_type || Mixin::ConvertToClassName.snake_case_basename(self.class.name)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def with_indexer_metadata(indexer_metadata={})
|
|
51
|
+
# changing input param symbol keys to strings, as the keys in hash that goes to solr are expected to be strings [cb]
|
|
52
|
+
# Ruby 1.9 hates you, cb [dan]
|
|
53
|
+
with_metadata = {}
|
|
54
|
+
indexer_metadata.each_key do |key|
|
|
55
|
+
with_metadata[key.to_s] = indexer_metadata[key]
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
with_metadata["type"] ||= self.index_object_type
|
|
59
|
+
with_metadata["id"] ||= self.index_id
|
|
60
|
+
with_metadata["database"] ||= Chef::Config[:couchdb_database]
|
|
61
|
+
with_metadata["item"] ||= self.to_hash
|
|
62
|
+
with_metadata["enqueued_at"] ||= Time.now.utc.to_i
|
|
63
|
+
|
|
64
|
+
raise ArgumentError, "Type, Id, or Database missing in index operation: #{with_metadata.inspect}" if (with_metadata["id"].nil? or with_metadata["type"].nil?)
|
|
65
|
+
with_metadata
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def add_to_index(metadata={})
|
|
69
|
+
Chef::Log.debug("pushing item to index queue for addition: #{self.with_indexer_metadata(metadata)}")
|
|
70
|
+
object_with_metadata = with_indexer_metadata(metadata)
|
|
71
|
+
obj_id = object_with_metadata["id"]
|
|
72
|
+
obj = {:action => :add, :payload => self.with_indexer_metadata(metadata)}
|
|
73
|
+
|
|
74
|
+
publish_object(obj_id, obj)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def delete_from_index(metadata={})
|
|
78
|
+
Chef::Log.debug("pushing item to index queue for deletion: #{self.with_indexer_metadata(metadata)}")
|
|
79
|
+
object_with_metadata = with_indexer_metadata(metadata)
|
|
80
|
+
obj_id = object_with_metadata["id"]
|
|
81
|
+
obj = {:action => :delete, :payload => self.with_indexer_metadata(metadata)}
|
|
82
|
+
|
|
83
|
+
publish_object(obj_id, obj)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
private
|
|
87
|
+
|
|
88
|
+
# Uses the publisher to update the object's queue. If
|
|
89
|
+
# Chef::Config[:persistent_queue] is true, the update is wrapped
|
|
90
|
+
# in a transaction.
|
|
91
|
+
def publish_object(object_id, object)
|
|
92
|
+
publisher = AmqpClient.instance
|
|
93
|
+
begin
|
|
94
|
+
publisher.amqp_client.tx_select if Chef::Config[:persistent_queue]
|
|
95
|
+
publisher.queue_for_object(object_id) do |queue|
|
|
96
|
+
queue.publish(Chef::JSONCompat.to_json(object), :persistent => Chef::Config[:persistent_queue])
|
|
97
|
+
end
|
|
98
|
+
publisher.amqp_client.tx_commit if Chef::Config[:persistent_queue]
|
|
99
|
+
rescue
|
|
100
|
+
publisher.amqp_client.tx_rollback if Chef::Config[:persistent_queue]
|
|
101
|
+
raise
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
true
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Tim Hinderliter (<tim@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
|
+
# Wrapper class for interacting with JSON.
|
|
19
|
+
|
|
20
|
+
require 'json'
|
|
21
|
+
|
|
22
|
+
class Chef
|
|
23
|
+
class JSONCompat
|
|
24
|
+
JSON_MAX_NESTING = 1000
|
|
25
|
+
|
|
26
|
+
class <<self
|
|
27
|
+
# See CHEF-1292/PL-538. Increase the max nesting for JSON, which defaults
|
|
28
|
+
# to 19, and isn't enough for some (for example, a Node within a Node)
|
|
29
|
+
# structures.
|
|
30
|
+
def opts_add_max_nesting(opts)
|
|
31
|
+
if opts.nil? || !opts.has_key?(:max_nesting)
|
|
32
|
+
opts = opts.nil? ? Hash.new : opts.clone
|
|
33
|
+
opts[:max_nesting] = JSON_MAX_NESTING
|
|
34
|
+
end
|
|
35
|
+
opts
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Just call the JSON gem's parse method with a modified :max_nesting field
|
|
39
|
+
def from_json(source, opts = {})
|
|
40
|
+
::JSON.parse(source, opts_add_max_nesting(opts))
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def to_json(obj, opts = nil)
|
|
44
|
+
obj.to_json(opts_add_max_nesting(opts))
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def to_json_pretty(obj, opts = nil)
|
|
48
|
+
::JSON.pretty_generate(obj, opts_add_max_nesting(opts))
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
data/lib/chef/knife.rb
ADDED
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
|
3
|
+
# Author:: Christopher Brown (<cb@opscode.com>)
|
|
4
|
+
# Copyright:: Copyright (c) 2009 Opscode, Inc.
|
|
5
|
+
# License:: Apache License, Version 2.0
|
|
6
|
+
#
|
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
# you may not use this file except in compliance with the License.
|
|
9
|
+
# You may obtain a copy of the License at
|
|
10
|
+
#
|
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
#
|
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
# See the License for the specific language governing permissions and
|
|
17
|
+
# limitations under the License.
|
|
18
|
+
#
|
|
19
|
+
|
|
20
|
+
require 'forwardable'
|
|
21
|
+
require 'chef/version'
|
|
22
|
+
require 'mixlib/cli'
|
|
23
|
+
require 'chef/mixin/convert_to_class_name'
|
|
24
|
+
require 'chef/knife/subcommand_loader'
|
|
25
|
+
require 'chef/knife/ui'
|
|
26
|
+
|
|
27
|
+
require 'pp'
|
|
28
|
+
|
|
29
|
+
class Chef
|
|
30
|
+
class Knife
|
|
31
|
+
include Mixlib::CLI
|
|
32
|
+
extend Chef::Mixin::ConvertToClassName
|
|
33
|
+
extend Forwardable
|
|
34
|
+
|
|
35
|
+
# Backwards Compat:
|
|
36
|
+
# Ideally, we should not vomit all of these methods into this base class;
|
|
37
|
+
# instead, they should be accessed by hitting the ui object directly.
|
|
38
|
+
def_delegator :@ui, :stdout
|
|
39
|
+
def_delegator :@ui, :stderr
|
|
40
|
+
def_delegator :@ui, :stdin
|
|
41
|
+
def_delegator :@ui, :msg
|
|
42
|
+
def_delegator :@ui, :ask_question
|
|
43
|
+
def_delegator :@ui, :pretty_print
|
|
44
|
+
def_delegator :@ui, :output
|
|
45
|
+
def_delegator :@ui, :format_list_for_display
|
|
46
|
+
def_delegator :@ui, :format_for_display
|
|
47
|
+
def_delegator :@ui, :format_cookbook_list_for_display
|
|
48
|
+
def_delegator :@ui, :edit_data
|
|
49
|
+
def_delegator :@ui, :edit_object
|
|
50
|
+
def_delegator :@ui, :confirm
|
|
51
|
+
|
|
52
|
+
attr_accessor :name_args
|
|
53
|
+
attr_reader :ui
|
|
54
|
+
|
|
55
|
+
def self.ui
|
|
56
|
+
@ui ||= Chef::Knife::UI.new(STDOUT, STDERR, STDIN, {})
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def self.msg(msg="")
|
|
60
|
+
ui.msg(msg)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def self.reset_subcommands!
|
|
64
|
+
@@subcommands = {}
|
|
65
|
+
@subcommands_by_category = nil
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def self.inherited(subclass)
|
|
69
|
+
unless subclass.unnamed?
|
|
70
|
+
subcommands[subclass.snake_case_name] = subclass
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Explicitly set the category for the current command to +new_category+
|
|
75
|
+
# The category is normally determined from the first word of the command
|
|
76
|
+
# name, but some commands make more sense using two or more words
|
|
77
|
+
# ===Arguments
|
|
78
|
+
# new_category::: A String to set the category to (see examples)
|
|
79
|
+
# ===Examples:
|
|
80
|
+
# Data bag commands would be in the 'data' category by default. To put them
|
|
81
|
+
# in the 'data bag' category:
|
|
82
|
+
# category('data bag')
|
|
83
|
+
def self.category(new_category)
|
|
84
|
+
@category = new_category
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def self.subcommand_category
|
|
88
|
+
@category || snake_case_name.split('_').first unless unnamed?
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def self.snake_case_name
|
|
92
|
+
convert_to_snake_case(name.split('::').last) unless unnamed?
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Does this class have a name? (Classes created via Class.new don't)
|
|
96
|
+
def self.unnamed?
|
|
97
|
+
name.nil? || name.empty?
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def self.subcommand_loader
|
|
101
|
+
@subcommand_loader ||= Knife::SubcommandLoader.new(chef_config_dir)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def self.load_commands
|
|
105
|
+
subcommand_loader.load_commands
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def self.subcommands
|
|
109
|
+
@@subcommands ||= {}
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def self.subcommands_by_category
|
|
113
|
+
unless @subcommands_by_category
|
|
114
|
+
@subcommands_by_category = Hash.new { |hash, key| hash[key] = [] }
|
|
115
|
+
subcommands.each do |snake_cased, klass|
|
|
116
|
+
@subcommands_by_category[klass.subcommand_category] << snake_cased
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
@subcommands_by_category
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# Print the list of subcommands knife knows about. If +preferred_category+
|
|
123
|
+
# is given, only subcommands in that category are shown
|
|
124
|
+
def self.list_commands(preferred_category=nil)
|
|
125
|
+
load_commands
|
|
126
|
+
category_desc = preferred_category ? preferred_category + " " : ''
|
|
127
|
+
msg "Available #{category_desc}subcommands: (for details, knife SUB-COMMAND --help)\n\n"
|
|
128
|
+
|
|
129
|
+
if preferred_category && subcommands_by_category.key?(preferred_category)
|
|
130
|
+
commands_to_show = {preferred_category => subcommands_by_category[preferred_category]}
|
|
131
|
+
else
|
|
132
|
+
commands_to_show = subcommands_by_category
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
commands_to_show.sort.each do |category, commands|
|
|
136
|
+
msg "** #{category.upcase} COMMANDS **"
|
|
137
|
+
commands.each do |command|
|
|
138
|
+
msg subcommands[command].banner if subcommands[command]
|
|
139
|
+
end
|
|
140
|
+
msg
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
# Run knife for the given +args+ (ARGV), adding +options+ to the list of
|
|
145
|
+
# CLI options that the subcommand knows how to handle.
|
|
146
|
+
# ===Arguments
|
|
147
|
+
# args::: usually ARGV
|
|
148
|
+
# options::: A Mixlib::CLI option parser hash. These +options+ are how
|
|
149
|
+
# subcommands know about global knife CLI options
|
|
150
|
+
def self.run(args, options={})
|
|
151
|
+
load_commands
|
|
152
|
+
subcommand_class = subcommand_class_from(args)
|
|
153
|
+
subcommand_class.options = options.merge!(subcommand_class.options)
|
|
154
|
+
subcommand_class.load_deps
|
|
155
|
+
instance = subcommand_class.new(args)
|
|
156
|
+
instance.configure_chef
|
|
157
|
+
instance.run
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def self.guess_category(args)
|
|
161
|
+
category_words = args.select {|arg| arg =~ /^([[:alnum:]]|_)+$/ }
|
|
162
|
+
matching_category = nil
|
|
163
|
+
while (!matching_category) && (!category_words.empty?)
|
|
164
|
+
candidate_category = category_words.join(' ')
|
|
165
|
+
matching_category = candidate_category if subcommands_by_category.key?(candidate_category)
|
|
166
|
+
matching_category || category_words.pop
|
|
167
|
+
end
|
|
168
|
+
matching_category
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
def self.subcommand_class_from(args)
|
|
172
|
+
command_words = args.select {|arg| arg =~ /^([[:alnum:]]|_)+$/ }
|
|
173
|
+
subcommand_class = nil
|
|
174
|
+
|
|
175
|
+
while ( !subcommand_class ) && ( !command_words.empty? )
|
|
176
|
+
snake_case_class_name = command_words.join("_")
|
|
177
|
+
unless subcommand_class = subcommands[snake_case_class_name]
|
|
178
|
+
command_words.pop
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
subcommand_class || subcommand_not_found!(args)
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def self.deps(&block)
|
|
185
|
+
@dependency_loader = block
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def self.load_deps
|
|
189
|
+
@dependency_loader && @dependency_loader.call
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
private
|
|
193
|
+
|
|
194
|
+
# :nodoc:
|
|
195
|
+
# Error out and print usage. probably becuase the arguments given by the
|
|
196
|
+
# user could not be resolved to a subcommand.
|
|
197
|
+
def self.subcommand_not_found!(args)
|
|
198
|
+
unless want_help?(args)
|
|
199
|
+
ui.fatal("Cannot find sub command for: '#{args.join(' ')}'")
|
|
200
|
+
end
|
|
201
|
+
list_commands(guess_category(args))
|
|
202
|
+
exit 10
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
# :nodoc:
|
|
206
|
+
# TODO: duplicated with chef/application/knife
|
|
207
|
+
# all logic should be removed from that and Chef::Knife should own it.
|
|
208
|
+
def self.want_help?(args)
|
|
209
|
+
(args.any? { |arg| arg =~ /^(:?(:?\-\-)?help|\-h)$/})
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
@@chef_config_dir = nil
|
|
213
|
+
|
|
214
|
+
# search upward from current_dir until .chef directory is found
|
|
215
|
+
def self.chef_config_dir
|
|
216
|
+
if @@chef_config_dir.nil? # share this with subclasses
|
|
217
|
+
@@chef_config_dir = false
|
|
218
|
+
full_path = Dir.pwd.split(File::SEPARATOR)
|
|
219
|
+
(full_path.length - 1).downto(0) do |i|
|
|
220
|
+
canidate_directory = File.join(full_path[0..i] + [".chef" ])
|
|
221
|
+
if File.exist?(canidate_directory) && File.directory?(canidate_directory)
|
|
222
|
+
@@chef_config_dir = canidate_directory
|
|
223
|
+
break
|
|
224
|
+
end
|
|
225
|
+
end
|
|
226
|
+
end
|
|
227
|
+
@@chef_config_dir
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
public
|
|
232
|
+
|
|
233
|
+
# Create a new instance of the current class configured for the given
|
|
234
|
+
# arguments and options
|
|
235
|
+
def initialize(argv=[])
|
|
236
|
+
super() # having to call super in initialize is the most annoying anti-pattern :(
|
|
237
|
+
@ui = Chef::Knife::UI.new(STDOUT, STDERR, STDIN, config)
|
|
238
|
+
|
|
239
|
+
command_name_words = self.class.snake_case_name.split('_')
|
|
240
|
+
|
|
241
|
+
# Mixlib::CLI ignores the embedded name_args
|
|
242
|
+
@name_args = parse_options(argv)
|
|
243
|
+
@name_args.reject! { |name_arg| command_name_words.delete(name_arg) }
|
|
244
|
+
|
|
245
|
+
# knife node run_list add requires that we have extra logic to handle
|
|
246
|
+
# the case that command name words could be joined by an underscore :/
|
|
247
|
+
command_name_words = command_name_words.join('_')
|
|
248
|
+
@name_args.reject! { |name_arg| command_name_words == name_arg }
|
|
249
|
+
|
|
250
|
+
if config[:help]
|
|
251
|
+
msg opt_parser
|
|
252
|
+
exit 1
|
|
253
|
+
end
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
def parse_options(args)
|
|
257
|
+
super
|
|
258
|
+
rescue OptionParser::InvalidOption => e
|
|
259
|
+
puts "Error: " + e.to_s
|
|
260
|
+
show_usage
|
|
261
|
+
exit(1)
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
def configure_chef
|
|
265
|
+
unless config[:config_file]
|
|
266
|
+
if self.class.chef_config_dir
|
|
267
|
+
candidate_config = File.expand_path('knife.rb',self.class.chef_config_dir)
|
|
268
|
+
config[:config_file] = candidate_config if File.exist?(candidate_config)
|
|
269
|
+
end
|
|
270
|
+
# If we haven't set a config yet and $HOME is set, and the home
|
|
271
|
+
# knife.rb exists, use it:
|
|
272
|
+
if (!config[:config_file]) && ENV['HOME'] && File.exist?(File.join(ENV['HOME'], '.chef', 'knife.rb'))
|
|
273
|
+
config[:config_file] = File.join(ENV['HOME'], '.chef', 'knife.rb')
|
|
274
|
+
end
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
# Don't try to load a knife.rb if it doesn't exist.
|
|
278
|
+
if config[:config_file]
|
|
279
|
+
Chef::Config.from_file(config[:config_file])
|
|
280
|
+
else
|
|
281
|
+
# ...but do log a message if no config was found.
|
|
282
|
+
self.msg("No knife configuration file found")
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
Chef::Config[:log_level] = config[:log_level] if config[:log_level]
|
|
286
|
+
Chef::Config[:log_location] = config[:log_location] if config[:log_location]
|
|
287
|
+
Chef::Config[:node_name] = config[:node_name] if config[:node_name]
|
|
288
|
+
Chef::Config[:client_key] = config[:client_key] if config[:client_key]
|
|
289
|
+
Chef::Config[:chef_server_url] = config[:chef_server_url] if config[:chef_server_url]
|
|
290
|
+
Chef::Config[:environment] = config[:environment] if config[:environment]
|
|
291
|
+
|
|
292
|
+
# Expand a relative path from the config directory. Config from command
|
|
293
|
+
# line should already be expanded, and absolute paths will be unchanged.
|
|
294
|
+
if Chef::Config[:client_key] && config[:config_file]
|
|
295
|
+
Chef::Config[:client_key] = File.expand_path(Chef::Config[:client_key], File.dirname(config[:config_file]))
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
Mixlib::Log::Formatter.show_time = false
|
|
299
|
+
Chef::Log.init(Chef::Config[:log_location])
|
|
300
|
+
Chef::Log.level(Chef::Config[:log_level] || :error)
|
|
301
|
+
|
|
302
|
+
Chef::Log.debug("Using configuration from #{config[:config_file]}")
|
|
303
|
+
|
|
304
|
+
if Chef::Config[:node_name].nil?
|
|
305
|
+
raise ArgumentError, "No user specified, pass via -u or specifiy 'node_name' in #{config[:config_file] ? config[:config_file] : "~/.chef/knife.rb"}"
|
|
306
|
+
end
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
def show_usage
|
|
311
|
+
stdout.puts("USAGE: " + self.opt_parser.to_s)
|
|
312
|
+
end
|
|
313
|
+
|
|
314
|
+
def load_from_file(klass, from_file, bag=nil)
|
|
315
|
+
relative_path = ""
|
|
316
|
+
if klass == Chef::Role
|
|
317
|
+
relative_path = "roles"
|
|
318
|
+
elsif klass == Chef::Node
|
|
319
|
+
relative_path = "nodes"
|
|
320
|
+
elsif klass == Chef::DataBagItem
|
|
321
|
+
relative_path = "data_bags/#{bag}"
|
|
322
|
+
elsif klass == Chef::Environment
|
|
323
|
+
relative_path = "environments"
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
relative_file = File.expand_path(File.join(Dir.pwd, relative_path, from_file))
|
|
327
|
+
filename = nil
|
|
328
|
+
|
|
329
|
+
if file_exists_and_is_readable?(from_file)
|
|
330
|
+
filename = from_file
|
|
331
|
+
elsif file_exists_and_is_readable?(relative_file)
|
|
332
|
+
filename = relative_file
|
|
333
|
+
else
|
|
334
|
+
ui.fatal("Cannot find file #{from_file}")
|
|
335
|
+
exit 30
|
|
336
|
+
end
|
|
337
|
+
|
|
338
|
+
case from_file
|
|
339
|
+
when /\.(js|json)$/
|
|
340
|
+
Chef::JSONCompat.from_json(IO.read(filename))
|
|
341
|
+
when /\.rb$/
|
|
342
|
+
r = klass.new
|
|
343
|
+
r.from_file(filename)
|
|
344
|
+
r
|
|
345
|
+
else
|
|
346
|
+
ui.fatal("File must end in .js, .json, or .rb")
|
|
347
|
+
exit 30
|
|
348
|
+
end
|
|
349
|
+
end
|
|
350
|
+
|
|
351
|
+
def file_exists_and_is_readable?(file)
|
|
352
|
+
File.exists?(file) && File.readable?(file)
|
|
353
|
+
end
|
|
354
|
+
|
|
355
|
+
def create_object(object, pretty_name=nil, &block)
|
|
356
|
+
output = edit_data(object)
|
|
357
|
+
|
|
358
|
+
if Kernel.block_given?
|
|
359
|
+
output = block.call(output)
|
|
360
|
+
else
|
|
361
|
+
output.save
|
|
362
|
+
end
|
|
363
|
+
|
|
364
|
+
pretty_name ||= output
|
|
365
|
+
|
|
366
|
+
self.msg("Created (or updated) #{pretty_name}")
|
|
367
|
+
|
|
368
|
+
output(output) if config[:print_after]
|
|
369
|
+
end
|
|
370
|
+
|
|
371
|
+
def delete_object(klass, name, delete_name=nil, &block)
|
|
372
|
+
confirm("Do you really want to delete #{name}")
|
|
373
|
+
|
|
374
|
+
if Kernel.block_given?
|
|
375
|
+
object = block.call
|
|
376
|
+
else
|
|
377
|
+
object = klass.load(name)
|
|
378
|
+
object.destroy
|
|
379
|
+
end
|
|
380
|
+
|
|
381
|
+
output(format_for_display(object)) if config[:print_after]
|
|
382
|
+
|
|
383
|
+
obj_name = delete_name ? "#{delete_name}[#{name}]" : object
|
|
384
|
+
self.msg("Deleted #{obj_name}!")
|
|
385
|
+
end
|
|
386
|
+
|
|
387
|
+
def bulk_delete(klass, fancy_name, delete_name=nil, list=nil, regex=nil, &block)
|
|
388
|
+
object_list = list ? list : klass.list(true)
|
|
389
|
+
|
|
390
|
+
if regex
|
|
391
|
+
to_delete = Hash.new
|
|
392
|
+
object_list.each_key do |object|
|
|
393
|
+
next if regex && object !~ /#{regex}/
|
|
394
|
+
to_delete[object] = object_list[object]
|
|
395
|
+
end
|
|
396
|
+
else
|
|
397
|
+
to_delete = object_list
|
|
398
|
+
end
|
|
399
|
+
|
|
400
|
+
output(format_list_for_display(to_delete))
|
|
401
|
+
|
|
402
|
+
confirm("Do you really want to delete the above items")
|
|
403
|
+
|
|
404
|
+
to_delete.each do |name, object|
|
|
405
|
+
if Kernel.block_given?
|
|
406
|
+
block.call(name, object)
|
|
407
|
+
else
|
|
408
|
+
object.destroy
|
|
409
|
+
end
|
|
410
|
+
output(format_for_display(object)) if config[:print_after]
|
|
411
|
+
self.msg("Deleted #{fancy_name} #{name}")
|
|
412
|
+
end
|
|
413
|
+
end
|
|
414
|
+
|
|
415
|
+
def rest
|
|
416
|
+
@rest ||= begin
|
|
417
|
+
require 'chef/rest'
|
|
418
|
+
Chef::REST.new(Chef::Config[:chef_server_url])
|
|
419
|
+
end
|
|
420
|
+
end
|
|
421
|
+
|
|
422
|
+
end
|
|
423
|
+
end
|
|
424
|
+
|