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,87 @@
|
|
|
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
|
+
|
|
19
|
+
require 'chef/cookbook/file_vendor'
|
|
20
|
+
|
|
21
|
+
class Chef
|
|
22
|
+
class Cookbook
|
|
23
|
+
# == Chef::Cookbook::RemoteFileVendor
|
|
24
|
+
# This FileVendor loads files by either fetching them from the local cache, or
|
|
25
|
+
# if not available, loading them from the remote server.
|
|
26
|
+
class RemoteFileVendor < FileVendor
|
|
27
|
+
|
|
28
|
+
def initialize(manifest, rest)
|
|
29
|
+
@manifest = manifest
|
|
30
|
+
@cookbook_name = @manifest[:cookbook_name]
|
|
31
|
+
@rest = rest
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Implements abstract base's requirement. It looks in the
|
|
35
|
+
# Chef::Config.cookbook_path file hierarchy for the requested
|
|
36
|
+
# file.
|
|
37
|
+
def get_filename(filename)
|
|
38
|
+
if filename =~ /([^\/]+)\/(.+)$/
|
|
39
|
+
segment = $1
|
|
40
|
+
else
|
|
41
|
+
raise "get_filename: Cannot determine segment/filename for incoming filename #{filename}"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
raise "No such segment #{segment} in cookbook #{@cookbook_name}" unless @manifest[segment]
|
|
45
|
+
found_manifest_record = @manifest[segment].find {|manifest_record| manifest_record[:path] == filename }
|
|
46
|
+
raise "No such file #{filename} in #{@cookbook_name}" unless found_manifest_record
|
|
47
|
+
|
|
48
|
+
cache_filename = File.join("cookbooks", @cookbook_name, found_manifest_record['path'])
|
|
49
|
+
|
|
50
|
+
# update valid_cache_entries so the upstream cache cleaner knows what
|
|
51
|
+
# we've used.
|
|
52
|
+
validate_cached_copy(cache_filename)
|
|
53
|
+
|
|
54
|
+
current_checksum = nil
|
|
55
|
+
if Chef::FileCache.has_key?(cache_filename)
|
|
56
|
+
current_checksum = Chef::CookbookVersion.checksum_cookbook_file(Chef::FileCache.load(cache_filename, false))
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# If the checksums are different between on-disk (current) and on-server
|
|
60
|
+
# (remote, per manifest), do the update. This will also execute if there
|
|
61
|
+
# is no current checksum.
|
|
62
|
+
if current_checksum != found_manifest_record['checksum']
|
|
63
|
+
raw_file = @rest.get_rest(found_manifest_record[:url], true)
|
|
64
|
+
|
|
65
|
+
Chef::Log.info("Storing updated #{cache_filename} in the cache.")
|
|
66
|
+
Chef::FileCache.move_to(raw_file.path, cache_filename)
|
|
67
|
+
else
|
|
68
|
+
Chef::Log.debug("Not storing #{cache_filename}, as the cache is up to date.")
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
full_path_cache_filename = Chef::FileCache.load(cache_filename, false)
|
|
72
|
+
|
|
73
|
+
# return the filename, not the contents (second argument= false)
|
|
74
|
+
full_path_cache_filename
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def validate_cached_copy(cache_filename)
|
|
78
|
+
valid_cache_entries[cache_filename] = true
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def valid_cache_entries
|
|
82
|
+
Chef::CookbookVersion.valid_cache_entries
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
@@ -0,0 +1,136 @@
|
|
|
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/checksum_cache'
|
|
20
|
+
require 'chef/mixin/shell_out'
|
|
21
|
+
|
|
22
|
+
class Chef
|
|
23
|
+
class Cookbook
|
|
24
|
+
# == Chef::Cookbook::SyntaxCheck
|
|
25
|
+
# Encapsulates the process of validating the ruby syntax of files in Chef
|
|
26
|
+
# cookbooks.
|
|
27
|
+
class SyntaxCheck
|
|
28
|
+
include Chef::Mixin::ShellOut
|
|
29
|
+
|
|
30
|
+
attr_reader :cookbook_path
|
|
31
|
+
|
|
32
|
+
# Creates a new SyntaxCheck given the +cookbook_name+ and a +cookbook_path+.
|
|
33
|
+
# If no +cookbook_path+ is given, +Chef::Config.cookbook_path+ is used.
|
|
34
|
+
def self.for_cookbook(cookbook_name, cookbook_path=nil)
|
|
35
|
+
cookbook_path ||= Chef::Config.cookbook_path
|
|
36
|
+
unless cookbook_path
|
|
37
|
+
raise ArgumentError, "Cannot find cookbook #{cookbook_name} unless Chef::Config.cookbook_path is set or an explicit cookbook path is given"
|
|
38
|
+
end
|
|
39
|
+
new(File.join(cookbook_path, cookbook_name.to_s))
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Create a new SyntaxCheck object
|
|
43
|
+
# === Arguments
|
|
44
|
+
# cookbook_path::: the (on disk) path to the cookbook
|
|
45
|
+
def initialize(cookbook_path)
|
|
46
|
+
@cookbook_path = cookbook_path
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def cache
|
|
50
|
+
Chef::ChecksumCache.instance
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def ruby_files
|
|
54
|
+
Dir[File.join(cookbook_path, '**', '*.rb')]
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def untested_ruby_files
|
|
58
|
+
ruby_files.reject do |file|
|
|
59
|
+
if validated?(file)
|
|
60
|
+
Chef::Log.debug("ruby file #{file} is unchanged, skipping syntax check")
|
|
61
|
+
true
|
|
62
|
+
else
|
|
63
|
+
false
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def template_files
|
|
69
|
+
Dir[File.join(cookbook_path, '**', '*.erb')]
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def untested_template_files
|
|
73
|
+
template_files.reject do |file|
|
|
74
|
+
if validated?(file)
|
|
75
|
+
Chef::Log.debug("template #{file} is unchanged, skipping syntax check")
|
|
76
|
+
true
|
|
77
|
+
else
|
|
78
|
+
false
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def validated?(file)
|
|
84
|
+
!!cache.lookup_checksum(cache_key(file), File.stat(file))
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def validated(file)
|
|
88
|
+
cache.generate_checksum(cache_key(file), file, File.stat(file))
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def cache_key(file)
|
|
92
|
+
@cache_keys ||= {}
|
|
93
|
+
@cache_keys[file] ||= cache.generate_key(file, "chef-test")
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def validate_ruby_files
|
|
97
|
+
untested_ruby_files.each do |ruby_file|
|
|
98
|
+
return false unless validate_ruby_file(ruby_file)
|
|
99
|
+
validated(ruby_file)
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def validate_templates
|
|
104
|
+
untested_template_files.each do |template|
|
|
105
|
+
return false unless validate_template(template)
|
|
106
|
+
validated(template)
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def validate_template(erb_file)
|
|
111
|
+
Chef::Log.debug("Testing template #{erb_file} for syntax errors...")
|
|
112
|
+
result = shell_out("sh -c 'erubis -x #{erb_file} | ruby -c'")
|
|
113
|
+
result.error!
|
|
114
|
+
true
|
|
115
|
+
rescue Chef::Exceptions::ShellCommandFailed
|
|
116
|
+
file_relative_path = erb_file[/^#{Regexp.escape(cookbook_path+File::Separator)}(.*)/, 1]
|
|
117
|
+
Chef::Log.fatal("Erb template #{file_relative_path} has a syntax error:")
|
|
118
|
+
result.stderr.each_line { |l| Chef::Log.fatal(l.chomp) }
|
|
119
|
+
false
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def validate_ruby_file(ruby_file)
|
|
123
|
+
Chef::Log.debug("Testing #{ruby_file} for syntax errors...")
|
|
124
|
+
result = shell_out("ruby -c #{ruby_file}")
|
|
125
|
+
result.error!
|
|
126
|
+
true
|
|
127
|
+
rescue Chef::Exceptions::ShellCommandFailed
|
|
128
|
+
file_relative_path = ruby_file[/^#{Regexp.escape(cookbook_path+File::Separator)}(.*)/, 1]
|
|
129
|
+
Chef::Log.fatal("Cookbook file #{file_relative_path} has a ruby syntax error:")
|
|
130
|
+
result.stderr.each_line { |l| Chef::Log.fatal(l.chomp) }
|
|
131
|
+
false
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
|
3
|
+
# Author:: Christopher Walters (<cw@opscode.com>)
|
|
4
|
+
# Author:: Daniel DeLeo (<dan@kallistec.com>)
|
|
5
|
+
# Copyright:: Copyright (c) 2008 Opscode, Inc.
|
|
6
|
+
# Copyright:: Copyright (c) 2009 Daniel DeLeo
|
|
7
|
+
# License:: Apache License, Version 2.0
|
|
8
|
+
#
|
|
9
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
10
|
+
# you may not use this file except in compliance with the License.
|
|
11
|
+
# You may obtain a copy of the License at
|
|
12
|
+
#
|
|
13
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
14
|
+
#
|
|
15
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
16
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
17
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
18
|
+
# See the License for the specific language governing permissions and
|
|
19
|
+
# limitations under the License.
|
|
20
|
+
|
|
21
|
+
require 'chef/config'
|
|
22
|
+
require 'chef/cookbook_version'
|
|
23
|
+
require 'chef/cookbook/metadata'
|
|
24
|
+
|
|
25
|
+
class Chef
|
|
26
|
+
class CookbookLoader
|
|
27
|
+
|
|
28
|
+
attr_accessor :cookbook, :metadata
|
|
29
|
+
|
|
30
|
+
include Enumerable
|
|
31
|
+
|
|
32
|
+
def initialize()
|
|
33
|
+
@cookbooks_by_name = Mash.new
|
|
34
|
+
@metadata = Hash.new
|
|
35
|
+
@ignore_regexes = Hash.new { |hsh, key| hsh[key] = Array.new }
|
|
36
|
+
load_cookbooks
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def load_cookbooks
|
|
40
|
+
cookbook_settings = Hash.new
|
|
41
|
+
[Chef::Config.cookbook_path].flatten.each do |cb_path|
|
|
42
|
+
cb_path = File.expand_path(cb_path)
|
|
43
|
+
Dir[File.join(cb_path, "*")].each do |cookbook|
|
|
44
|
+
next unless File.directory?(cookbook)
|
|
45
|
+
cookbook_name = File.basename(cookbook).to_sym
|
|
46
|
+
unless cookbook_settings.has_key?(cookbook_name)
|
|
47
|
+
cookbook_settings[cookbook_name] = {
|
|
48
|
+
:attribute_filenames => Hash.new,
|
|
49
|
+
:definition_filenames => Hash.new,
|
|
50
|
+
:recipe_filenames => Hash.new,
|
|
51
|
+
:template_filenames => Hash.new,
|
|
52
|
+
:file_filenames => Hash.new,
|
|
53
|
+
:library_filenames => Hash.new,
|
|
54
|
+
:resource_filenames => Hash.new,
|
|
55
|
+
:provider_filenames => Hash.new,
|
|
56
|
+
:root_filenames => Hash.new,
|
|
57
|
+
:metadata_filenames => Array.new
|
|
58
|
+
}
|
|
59
|
+
end
|
|
60
|
+
ignore_regexes = load_ignore_file(File.join(cookbook, "ignore"))
|
|
61
|
+
@ignore_regexes[cookbook_name].concat(ignore_regexes)
|
|
62
|
+
|
|
63
|
+
load_files_unless_basename(
|
|
64
|
+
File.join(cookbook, "attributes", "*.rb"),
|
|
65
|
+
cookbook_settings[cookbook_name][:attribute_filenames]
|
|
66
|
+
)
|
|
67
|
+
load_files_unless_basename(
|
|
68
|
+
File.join(cookbook, "definitions", "*.rb"),
|
|
69
|
+
cookbook_settings[cookbook_name][:definition_filenames]
|
|
70
|
+
)
|
|
71
|
+
load_files_unless_basename(
|
|
72
|
+
File.join(cookbook, "recipes", "*.rb"),
|
|
73
|
+
cookbook_settings[cookbook_name][:recipe_filenames]
|
|
74
|
+
)
|
|
75
|
+
load_files_unless_basename(
|
|
76
|
+
File.join(cookbook, "libraries", "*.rb"),
|
|
77
|
+
cookbook_settings[cookbook_name][:library_filenames]
|
|
78
|
+
)
|
|
79
|
+
load_cascading_files(
|
|
80
|
+
"*",
|
|
81
|
+
File.join(cookbook, "templates"),
|
|
82
|
+
cookbook_settings[cookbook_name][:template_filenames]
|
|
83
|
+
)
|
|
84
|
+
load_cascading_files(
|
|
85
|
+
"*",
|
|
86
|
+
File.join(cookbook, "files"),
|
|
87
|
+
cookbook_settings[cookbook_name][:file_filenames]
|
|
88
|
+
)
|
|
89
|
+
load_cascading_files(
|
|
90
|
+
"*.rb",
|
|
91
|
+
File.join(cookbook, "resources"),
|
|
92
|
+
cookbook_settings[cookbook_name][:resource_filenames]
|
|
93
|
+
)
|
|
94
|
+
load_cascading_files(
|
|
95
|
+
"*.rb",
|
|
96
|
+
File.join(cookbook, "providers"),
|
|
97
|
+
cookbook_settings[cookbook_name][:provider_filenames]
|
|
98
|
+
)
|
|
99
|
+
load_files(
|
|
100
|
+
"*",
|
|
101
|
+
cookbook,
|
|
102
|
+
cookbook_settings[cookbook_name][:root_filenames]
|
|
103
|
+
)
|
|
104
|
+
cookbook_settings[cookbook_name][:root_dir] = cookbook
|
|
105
|
+
if File.exists?(File.join(cookbook, "metadata.json"))
|
|
106
|
+
cookbook_settings[cookbook_name][:metadata_filenames] << File.join(cookbook, "metadata.json")
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
empty = cookbook_settings[cookbook_name].inject(true) do |all_empty, files|
|
|
110
|
+
all_empty && files.last.empty?
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
if empty
|
|
114
|
+
Chef::Log.warn "found a directory #{cookbook_name} in the cookbook path, but it contains no cookbook files. skipping."
|
|
115
|
+
cookbook_settings.delete(cookbook_name)
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
remove_ignored_files_from(cookbook_settings)
|
|
120
|
+
|
|
121
|
+
cookbook_settings.each_key do |cookbook|
|
|
122
|
+
@cookbooks_by_name[cookbook] = Chef::CookbookVersion.new(cookbook)
|
|
123
|
+
@cookbooks_by_name[cookbook].root_dir = cookbook_settings[cookbook][:root_dir]
|
|
124
|
+
@cookbooks_by_name[cookbook].attribute_filenames = cookbook_settings[cookbook][:attribute_filenames].values
|
|
125
|
+
@cookbooks_by_name[cookbook].definition_filenames = cookbook_settings[cookbook][:definition_filenames].values
|
|
126
|
+
@cookbooks_by_name[cookbook].recipe_filenames = cookbook_settings[cookbook][:recipe_filenames].values
|
|
127
|
+
@cookbooks_by_name[cookbook].template_filenames = cookbook_settings[cookbook][:template_filenames].values
|
|
128
|
+
@cookbooks_by_name[cookbook].file_filenames = cookbook_settings[cookbook][:file_filenames].values
|
|
129
|
+
@cookbooks_by_name[cookbook].library_filenames = cookbook_settings[cookbook][:library_filenames].values
|
|
130
|
+
@cookbooks_by_name[cookbook].resource_filenames = cookbook_settings[cookbook][:resource_filenames].values
|
|
131
|
+
@cookbooks_by_name[cookbook].provider_filenames = cookbook_settings[cookbook][:provider_filenames].values
|
|
132
|
+
@cookbooks_by_name[cookbook].root_filenames = cookbook_settings[cookbook][:root_filenames].values
|
|
133
|
+
@cookbooks_by_name[cookbook].metadata_filenames = cookbook_settings[cookbook][:metadata_filenames]
|
|
134
|
+
@metadata[cookbook] = Chef::Cookbook::Metadata.new(@cookbooks_by_name[cookbook])
|
|
135
|
+
cookbook_settings[cookbook][:metadata_filenames].each do |meta_json|
|
|
136
|
+
begin
|
|
137
|
+
@metadata[cookbook].from_json(IO.read(meta_json))
|
|
138
|
+
rescue JSON::ParserError
|
|
139
|
+
Chef::Log.fatal("Couldn't parse JSON in " + meta_json)
|
|
140
|
+
raise
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
@cookbooks_by_name[cookbook].metadata = @metadata[cookbook]
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def [](cookbook)
|
|
148
|
+
if @cookbooks_by_name.has_key?(cookbook.to_sym)
|
|
149
|
+
@cookbooks_by_name[cookbook.to_sym]
|
|
150
|
+
else
|
|
151
|
+
raise ArgumentError, "Cannot find a cookbook named #{cookbook.to_s}; did you forget to add metadata to a cookbook? (http://wiki.opscode.com/display/chef/Metadata)"
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def has_key?(cookbook_name)
|
|
156
|
+
@cookbooks_by_name.has_key?(cookbook_name)
|
|
157
|
+
end
|
|
158
|
+
alias :cookbook_exists? :has_key?
|
|
159
|
+
|
|
160
|
+
def each
|
|
161
|
+
@cookbooks_by_name.keys.sort { |a,b| a.to_s <=> b.to_s }.each do |cname|
|
|
162
|
+
yield(cname, @cookbooks_by_name[cname])
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def cookbook_names
|
|
167
|
+
@cookbooks_by_name.keys.sort
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def values
|
|
171
|
+
@cookbooks_by_name.values
|
|
172
|
+
end
|
|
173
|
+
alias :cookbooks :values
|
|
174
|
+
|
|
175
|
+
private
|
|
176
|
+
|
|
177
|
+
def load_ignore_file(ignore_file)
|
|
178
|
+
results = Array.new
|
|
179
|
+
if File.exists?(ignore_file) && File.readable?(ignore_file)
|
|
180
|
+
IO.foreach(ignore_file) do |line|
|
|
181
|
+
next if line =~ /^#/
|
|
182
|
+
next if line =~ /^\w*$/
|
|
183
|
+
line.chomp!
|
|
184
|
+
results << Regexp.new(line)
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
results
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
def remove_ignored_files_from(cookbook_settings)
|
|
191
|
+
file_types_to_inspect = [ :attribute_filenames, :definition_filenames, :recipe_filenames, :template_filenames,
|
|
192
|
+
:file_filenames, :library_filenames, :resource_filenames, :provider_filenames]
|
|
193
|
+
|
|
194
|
+
@ignore_regexes.each do |cookbook_name, regexes|
|
|
195
|
+
regexes.each do |regex|
|
|
196
|
+
settings = cookbook_settings[cookbook_name]
|
|
197
|
+
file_types_to_inspect.each do |file_type|
|
|
198
|
+
settings[file_type].delete_if { |uniqname, fullpath| fullpath.match(regex) }
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
def load_files(file_glob, base_path, result_hash, recursive=false)
|
|
205
|
+
rm_base_path = /^#{Regexp.escape(base_path)}\/(.+)$/
|
|
206
|
+
file_spec = [base_path]
|
|
207
|
+
file_spec << "**" if recursive
|
|
208
|
+
file_spec << file_glob
|
|
209
|
+
# To handle dotfiles like .ssh
|
|
210
|
+
Dir.glob(File.join(file_spec), File::FNM_DOTMATCH).each do |file|
|
|
211
|
+
next if File.directory?(file)
|
|
212
|
+
result_hash[rm_base_path.match(file)[1]] = file
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
def load_cascading_files(file_glob, base_path, result_hash)
|
|
217
|
+
load_files(file_glob, base_path, result_hash, true)
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
def load_files_unless_basename(file_glob, result_hash)
|
|
221
|
+
Dir[file_glob].each do |file|
|
|
222
|
+
result_hash[File.basename(file)] = file
|
|
223
|
+
end
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
end
|
|
227
|
+
end
|