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,135 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Ezra Zygmuntowicz (<ezra@engineyard.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2008 Opscode, Inc.
|
|
4
|
+
# License:: Apache License, Version 2.0
|
|
5
|
+
#
|
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
# you may not use this file except in compliance with the License.
|
|
8
|
+
# You may obtain a copy of the License at
|
|
9
|
+
#
|
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
#
|
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
# See the License for the specific language governing permissions and
|
|
16
|
+
# limitations under the License.
|
|
17
|
+
#
|
|
18
|
+
|
|
19
|
+
require 'chef/provider/package'
|
|
20
|
+
require 'chef/mixin/command'
|
|
21
|
+
require 'chef/resource/package'
|
|
22
|
+
|
|
23
|
+
class Chef
|
|
24
|
+
class Provider
|
|
25
|
+
class Package
|
|
26
|
+
class Portage < Chef::Provider::Package
|
|
27
|
+
PACKAGE_NAME_PATTERN = %r{(([^/]+)/)?([^/]+)}
|
|
28
|
+
|
|
29
|
+
def load_current_resource
|
|
30
|
+
@current_resource = Chef::Resource::Package.new(@new_resource.name)
|
|
31
|
+
@current_resource.package_name(@new_resource.package_name)
|
|
32
|
+
|
|
33
|
+
@current_resource.version(nil)
|
|
34
|
+
|
|
35
|
+
_, category_with_slash, category, pkg = %r{^#{PACKAGE_NAME_PATTERN}$}.match(@new_resource.package_name).to_a
|
|
36
|
+
|
|
37
|
+
possibilities = Dir["/var/db/pkg/#{category || "*"}/#{pkg}-*"].map {|d| d.sub(%r{/var/db/pkg/}, "") }
|
|
38
|
+
versions = possibilities.map do |entry|
|
|
39
|
+
if(entry =~ %r{[^/]+/#{Regexp.escape(pkg)}\-(\d[\.\d]*((_(alpha|beta|pre|rc|p)\d*)*)?(-r\d+)?)})
|
|
40
|
+
[$&, $1]
|
|
41
|
+
end
|
|
42
|
+
end.compact
|
|
43
|
+
|
|
44
|
+
if versions.size > 1
|
|
45
|
+
atoms = versions.map {|v| v.first }.sort
|
|
46
|
+
raise Chef::Exceptions::Package, "Multiple packages found for #{@new_resource.package_name}: #{atoms.join(" ")}. Specify a category."
|
|
47
|
+
elsif versions.size == 1
|
|
48
|
+
@current_resource.version(versions.first.last)
|
|
49
|
+
Chef::Log.debug("Got current version #{$1}")
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
@current_resource
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def parse_emerge(package, txt)
|
|
57
|
+
availables = {}
|
|
58
|
+
package_without_category = package.split("/").last
|
|
59
|
+
found_package_name = nil
|
|
60
|
+
|
|
61
|
+
txt.each_line do |line|
|
|
62
|
+
if line =~ /\*\s+#{PACKAGE_NAME_PATTERN}/
|
|
63
|
+
found_package_name = $&.strip
|
|
64
|
+
if found_package_name == package || found_package_name.split("/").last == package_without_category
|
|
65
|
+
availables[found_package_name] = nil
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
if line =~ /Latest version available: (.*)/ && availables.has_key?(found_package_name)
|
|
70
|
+
availables[found_package_name] = $1.strip
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
if availables.size > 1
|
|
75
|
+
# shouldn't happen if a category is specified so just use `package`
|
|
76
|
+
raise Chef::Exceptions::Package, "Multiple emerge results found for #{package}: #{availables.keys.join(" ")}. Specify a category."
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
availables.values.first
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def candidate_version
|
|
83
|
+
return @candidate_version if @candidate_version
|
|
84
|
+
|
|
85
|
+
status = popen4("emerge --color n --nospinner --search #{@new_resource.package_name.split('/').last}") do |pid, stdin, stdout, stderr|
|
|
86
|
+
available, installed = parse_emerge(@new_resource.package_name, stdout.read)
|
|
87
|
+
@candidate_version = available
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
unless status.exitstatus == 0
|
|
91
|
+
raise Chef::Exceptions::Package, "emerge --search failed - #{status.inspect}!"
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
@candidate_version
|
|
95
|
+
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def install_package(name, version)
|
|
100
|
+
pkg = "=#{name}-#{version}"
|
|
101
|
+
|
|
102
|
+
if(version =~ /^\~(.+)/)
|
|
103
|
+
# If we start with a tilde
|
|
104
|
+
pkg = "~#{name}-#{$1}"
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
run_command_with_systems_locale(
|
|
108
|
+
:command => "emerge -g --color n --nospinner --quiet#{expand_options(@new_resource.options)} #{pkg}"
|
|
109
|
+
)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def upgrade_package(name, version)
|
|
113
|
+
install_package(name, version)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def remove_package(name, version)
|
|
117
|
+
if(version)
|
|
118
|
+
pkg = "=#{@new_resource.package_name}-#{version}"
|
|
119
|
+
else
|
|
120
|
+
pkg = "#{@new_resource.package_name}"
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
run_command_with_systems_locale(
|
|
124
|
+
:command => "emerge --unmerge --color n --nospinner --quiet#{expand_options(@new_resource.options)} #{pkg}"
|
|
125
|
+
)
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def purge_package(name, version)
|
|
129
|
+
remove_package(name, version)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Joshua Timberman (<joshua@opscode.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2008 Opscode, Inc.
|
|
4
|
+
# License:: Apache License, Version 2.0
|
|
5
|
+
#
|
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
# you may not use this file except in compliance with the License.
|
|
8
|
+
# You may obtain a copy of the License at
|
|
9
|
+
#
|
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
#
|
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
# See the License for the specific language governing permissions and
|
|
16
|
+
# limitations under the License.
|
|
17
|
+
#
|
|
18
|
+
require 'chef/provider/package'
|
|
19
|
+
require 'chef/mixin/command'
|
|
20
|
+
require 'chef/resource/package'
|
|
21
|
+
|
|
22
|
+
class Chef
|
|
23
|
+
class Provider
|
|
24
|
+
class Package
|
|
25
|
+
class Rpm < Chef::Provider::Package
|
|
26
|
+
|
|
27
|
+
def load_current_resource
|
|
28
|
+
@current_resource = Chef::Resource::Package.new(@new_resource.name)
|
|
29
|
+
@current_resource.package_name(@new_resource.package_name)
|
|
30
|
+
@new_resource.version(nil)
|
|
31
|
+
|
|
32
|
+
if @new_resource.source
|
|
33
|
+
unless ::File.exists?(@new_resource.source)
|
|
34
|
+
raise Chef::Exceptions::Package, "Package #{@new_resource.name} not found: #{@new_resource.source}"
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
Chef::Log.debug("Checking rpm status for #{@new_resource.package_name}")
|
|
38
|
+
status = popen4("rpm -qp --queryformat '%{NAME} %{VERSION}-%{RELEASE}\n' #{@new_resource.source}") do |pid, stdin, stdout, stderr|
|
|
39
|
+
stdout.each do |line|
|
|
40
|
+
case line
|
|
41
|
+
when /([\w\d_.-]+)\s([\w\d_.-]+)/
|
|
42
|
+
@current_resource.package_name($1)
|
|
43
|
+
@new_resource.version($2)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
else
|
|
48
|
+
if Array(@new_resource.action).include?(:install)
|
|
49
|
+
raise Chef::Exceptions::Package, "Source for package #{@new_resource.name} required for action install"
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
Chef::Log.debug("Checking install state for #{@current_resource.package_name}")
|
|
54
|
+
status = popen4("rpm -q --queryformat '%{NAME} %{VERSION}-%{RELEASE}\n' #{@current_resource.package_name}") do |pid, stdin, stdout, stderr|
|
|
55
|
+
stdout.each do |line|
|
|
56
|
+
case line
|
|
57
|
+
when /([\w\d_.-]+)\s([\w\d_.-]+)/
|
|
58
|
+
Chef::Log.debug("Current version is #{$2}")
|
|
59
|
+
@current_resource.version($2)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
unless status.exitstatus == 0 || status.exitstatus == 1
|
|
65
|
+
raise Chef::Exceptions::Package, "rpm failed - #{status.inspect}!"
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
@current_resource
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def install_package(name, version)
|
|
72
|
+
unless @current_resource.version
|
|
73
|
+
run_command_with_systems_locale(
|
|
74
|
+
:command => "rpm #{@new_resource.options} -i #{@new_resource.source}"
|
|
75
|
+
)
|
|
76
|
+
else
|
|
77
|
+
run_command_with_systems_locale(
|
|
78
|
+
:command => "rpm #{@new_resource.options} -U #{@new_resource.source}"
|
|
79
|
+
)
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
alias_method :upgrade_package, :install_package
|
|
84
|
+
|
|
85
|
+
def remove_package(name, version)
|
|
86
|
+
if version
|
|
87
|
+
run_command_with_systems_locale(
|
|
88
|
+
:command => "rpm #{@new_resource.options} -e #{name}-#{version}"
|
|
89
|
+
)
|
|
90
|
+
else
|
|
91
|
+
run_command_with_systems_locale(
|
|
92
|
+
:command => "rpm #{@new_resource.options} -e #{name}"
|
|
93
|
+
)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
@@ -0,0 +1,462 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
|
3
|
+
# Author:: Daniel DeLeo (<dan@opscode.com>)
|
|
4
|
+
# Copyright:: Copyright (c) 2008, 2010 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 'chef/provider/package'
|
|
21
|
+
require 'chef/mixin/command'
|
|
22
|
+
require 'chef/resource/package'
|
|
23
|
+
|
|
24
|
+
# Class methods on Gem are defined in rubygems
|
|
25
|
+
require 'rubygems'
|
|
26
|
+
# Ruby 1.9's gem_prelude can interact poorly with loading the full rubygems
|
|
27
|
+
# explicitly like this. Make sure rubygems/specification is always last in this
|
|
28
|
+
# list
|
|
29
|
+
require 'rubygems/version'
|
|
30
|
+
require 'rubygems/dependency'
|
|
31
|
+
require 'rubygems/spec_fetcher'
|
|
32
|
+
require 'rubygems/platform'
|
|
33
|
+
require 'rubygems/format'
|
|
34
|
+
require 'rubygems/dependency_installer'
|
|
35
|
+
require 'rubygems/uninstaller'
|
|
36
|
+
require 'rubygems/specification'
|
|
37
|
+
|
|
38
|
+
class Chef
|
|
39
|
+
class Provider
|
|
40
|
+
class Package
|
|
41
|
+
class Rubygems < Chef::Provider::Package
|
|
42
|
+
class GemEnvironment
|
|
43
|
+
# HACK: trigger gem config load early. Otherwise it can get lazy
|
|
44
|
+
# loaded during operations where we've set Gem.sources to an
|
|
45
|
+
# alternate value and overwrite it with the defaults.
|
|
46
|
+
Gem.configuration
|
|
47
|
+
|
|
48
|
+
DEFAULT_UNINSTALLER_OPTS = {:ignore => true, :executables => true}
|
|
49
|
+
|
|
50
|
+
##
|
|
51
|
+
# The paths where rubygems should search for installed gems.
|
|
52
|
+
# Implemented by subclasses.
|
|
53
|
+
def gem_paths
|
|
54
|
+
raise NotImplementedError
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
##
|
|
58
|
+
# A rubygems source index containing the list of gemspecs for all
|
|
59
|
+
# available gems in the gem installation.
|
|
60
|
+
# Implemented by subclasses
|
|
61
|
+
# === Returns
|
|
62
|
+
# Gem::SourceIndex
|
|
63
|
+
def gem_source_index
|
|
64
|
+
raise NotImplementedError
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
##
|
|
68
|
+
# Lists the installed versions of +gem_name+, constrained by the
|
|
69
|
+
# version spec in +gem_dep+
|
|
70
|
+
# === Arguments
|
|
71
|
+
# Gem::Dependency +gem_dep+ is a Gem::Dependency object, its version
|
|
72
|
+
# specification constrains which gems are returned.
|
|
73
|
+
# === Returns
|
|
74
|
+
# [Gem::Specification] an array of Gem::Specification objects
|
|
75
|
+
def installed_versions(gem_dep)
|
|
76
|
+
gem_source_index.search(gem_dep)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
##
|
|
80
|
+
# Yields to the provided block with rubygems' source list set to the
|
|
81
|
+
# list provided. Always resets the list when the block returns or
|
|
82
|
+
# raises an exception.
|
|
83
|
+
def with_gem_sources(*sources)
|
|
84
|
+
sources.compact!
|
|
85
|
+
original_sources = Gem.sources
|
|
86
|
+
Gem.sources = sources unless sources.empty?
|
|
87
|
+
yield
|
|
88
|
+
ensure
|
|
89
|
+
Gem.sources = original_sources
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
##
|
|
93
|
+
# Determines the candidate version for a gem from a .gem file on disk
|
|
94
|
+
# and checks if it matches the version contraints in +gem_dependency+
|
|
95
|
+
# === Returns
|
|
96
|
+
# Gem::Version a singular gem version object is returned if the gem
|
|
97
|
+
# is available
|
|
98
|
+
# nil returns nil if the gem on disk doesn't match the
|
|
99
|
+
# version constraints for +gem_dependency+
|
|
100
|
+
def candidate_version_from_file(gem_dependency, source)
|
|
101
|
+
spec = Gem::Format.from_file_by_path(source).spec
|
|
102
|
+
if spec.satisfies_requirement?(gem_dependency)
|
|
103
|
+
logger.debug {"found candidate gem version #{spec.version} from local gem package #{source}"}
|
|
104
|
+
spec.version
|
|
105
|
+
else
|
|
106
|
+
# This is probably going to end badly...
|
|
107
|
+
logger.warn { "The gem package #{source} does not satisfy the requirements #{gem_dependency.to_s}" }
|
|
108
|
+
nil
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
##
|
|
113
|
+
# Finds the newest version that satisfies the constraints of
|
|
114
|
+
# +gem_dependency+. The version is determined from the cache or a
|
|
115
|
+
# round-trip to the server as needed. The architecture and gem
|
|
116
|
+
# sources will be set before making the query.
|
|
117
|
+
# === Returns
|
|
118
|
+
# Gem::Version a singular gem version object is returned if the gem
|
|
119
|
+
# is available
|
|
120
|
+
# nil returns nil if the gem could not be found
|
|
121
|
+
def candidate_version_from_remote(gem_dependency, *sources)
|
|
122
|
+
raise NotImplementedError
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
##
|
|
126
|
+
# Find the newest gem version available from Gem.sources that satisfies
|
|
127
|
+
# the constraints of +gem_dependency+
|
|
128
|
+
def find_newest_remote_version(gem_dependency, *sources)
|
|
129
|
+
# DependencyInstaller sorts the results such that the last one is
|
|
130
|
+
# always the one it considers best.
|
|
131
|
+
spec_with_source = dependency_installer.find_gems_with_sources(gem_dependency).last
|
|
132
|
+
|
|
133
|
+
spec = spec_with_source && spec_with_source[0]
|
|
134
|
+
version = spec && spec_with_source[0].version
|
|
135
|
+
if version
|
|
136
|
+
logger.debug { "Found gem #{spec.name} version #{version} for platform #{spec.platform} from #{spec_with_source[1]}" }
|
|
137
|
+
version
|
|
138
|
+
else
|
|
139
|
+
source_list = sources.compact.empty? ? "[#{Gem.sources.join(', ')}]" : "[#{sources.join(', ')}]"
|
|
140
|
+
logger.warn { "Failed to find gem #{gem_dependency} from #{source_list}" }
|
|
141
|
+
nil
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
##
|
|
146
|
+
# Installs a gem via the rubygems ruby API.
|
|
147
|
+
# === Options
|
|
148
|
+
# :sources rubygems servers to use
|
|
149
|
+
# Other options are passed to Gem::DependencyInstaller.new
|
|
150
|
+
def install(gem_dependency, options={})
|
|
151
|
+
with_gem_sources(*options.delete(:sources)) do
|
|
152
|
+
with_correct_verbosity do
|
|
153
|
+
dependency_installer(options).install(gem_dependency)
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
##
|
|
159
|
+
# Uninstall the gem +gem_name+ via the rubygems ruby API. If
|
|
160
|
+
# +gem_version+ is provided, only that version will be uninstalled.
|
|
161
|
+
# Otherwise, all versions are uninstalled.
|
|
162
|
+
# === Options
|
|
163
|
+
# Options are passed to Gem::Uninstaller.new
|
|
164
|
+
def uninstall(gem_name, gem_version=nil, opts={})
|
|
165
|
+
gem_version ? opts[:version] = gem_version : opts[:all] = true
|
|
166
|
+
with_correct_verbosity do
|
|
167
|
+
uninstaller(gem_name, opts).uninstall
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
##
|
|
172
|
+
# Set rubygems' user interaction to ConsoleUI or SilentUI depending
|
|
173
|
+
# on our current debug level
|
|
174
|
+
def with_correct_verbosity
|
|
175
|
+
Gem::DefaultUserInteraction.ui = Chef::Log.debug? ? Gem::ConsoleUI.new : Gem::SilentUI.new
|
|
176
|
+
yield
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
def dependency_installer(opts={})
|
|
180
|
+
Gem::DependencyInstaller.new(opts)
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
def uninstaller(gem_name, opts={})
|
|
184
|
+
Gem::Uninstaller.new(gem_name, DEFAULT_UNINSTALLER_OPTS.merge(opts))
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
private
|
|
188
|
+
|
|
189
|
+
def logger
|
|
190
|
+
Chef::Log.logger
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
class CurrentGemEnvironment < GemEnvironment
|
|
196
|
+
|
|
197
|
+
def gem_paths
|
|
198
|
+
Gem.path
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
def gem_source_index
|
|
202
|
+
Gem.source_index
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
def candidate_version_from_remote(gem_dependency, *sources)
|
|
206
|
+
with_gem_sources(*sources) do
|
|
207
|
+
find_newest_remote_version(gem_dependency, *sources)
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
class AlternateGemEnvironment < GemEnvironment
|
|
214
|
+
JRUBY_PLATFORM = /(:?universal|x86_64|x86)\-java\-[0-9\.]+/
|
|
215
|
+
|
|
216
|
+
def self.gempath_cache
|
|
217
|
+
@gempath_cache ||= {}
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
def self.platform_cache
|
|
221
|
+
@platform_cache ||= {}
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
include Chef::Mixin::ShellOut
|
|
225
|
+
|
|
226
|
+
attr_reader :gem_binary_location
|
|
227
|
+
|
|
228
|
+
def initialize(gem_binary_location)
|
|
229
|
+
@gem_binary_location = gem_binary_location
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
def gem_paths
|
|
233
|
+
if self.class.gempath_cache.key?(@gem_binary_location)
|
|
234
|
+
self.class.gempath_cache[@gem_binary_location]
|
|
235
|
+
else
|
|
236
|
+
# shellout! is a fork/exec which won't work on windows
|
|
237
|
+
shell_style_paths = shell_out!("#{@gem_binary_location} env gempath").stdout
|
|
238
|
+
# on windows, the path separator is (usually? always?) semicolon
|
|
239
|
+
paths = shell_style_paths.split(::File::PATH_SEPARATOR).map { |path| path.strip }
|
|
240
|
+
self.class.gempath_cache[@gem_binary_location] = paths
|
|
241
|
+
end
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
def gem_source_index
|
|
245
|
+
@source_index ||= Gem::SourceIndex.from_gems_in(*gem_paths.map { |p| p + '/specifications' })
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
##
|
|
249
|
+
# Attempt to detect the correct platform settings for the target gem
|
|
250
|
+
# environment.
|
|
251
|
+
#
|
|
252
|
+
# In practice, this only makes a difference if different versions are
|
|
253
|
+
# available depending on platform, and only if the target gem
|
|
254
|
+
# environment has a radically different platform (i.e., jruby), so we
|
|
255
|
+
# just try to detect jruby and fall back to the current platforms
|
|
256
|
+
# (Gem.platforms) if we don't detect it.
|
|
257
|
+
#
|
|
258
|
+
# === Returns
|
|
259
|
+
# [String|Gem::Platform] returns an array of Gem::Platform-compatible
|
|
260
|
+
# objects, i.e., Strings that are valid for Gem::Platform or actual
|
|
261
|
+
# Gem::Platform objects.
|
|
262
|
+
def gem_platforms
|
|
263
|
+
if self.class.platform_cache.key?(@gem_binary_location)
|
|
264
|
+
self.class.platform_cache[@gem_binary_location]
|
|
265
|
+
else
|
|
266
|
+
gem_environment = shell_out!("#{@gem_binary_location} env").stdout
|
|
267
|
+
if jruby = gem_environment[JRUBY_PLATFORM]
|
|
268
|
+
self.class.platform_cache[@gem_binary_location] = ['ruby', Gem::Platform.new(jruby)]
|
|
269
|
+
else
|
|
270
|
+
self.class.platform_cache[@gem_binary_location] = Gem.platforms
|
|
271
|
+
end
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
def with_gem_platforms(*alt_gem_platforms)
|
|
276
|
+
alt_gem_platforms.flatten!
|
|
277
|
+
original_gem_platforms = Gem.platforms
|
|
278
|
+
Gem.platforms = alt_gem_platforms
|
|
279
|
+
yield
|
|
280
|
+
ensure
|
|
281
|
+
Gem.platforms = original_gem_platforms
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
def candidate_version_from_remote(gem_dependency, *sources)
|
|
285
|
+
with_gem_sources(*sources) do
|
|
286
|
+
with_gem_platforms(*gem_platforms) do
|
|
287
|
+
find_newest_remote_version(gem_dependency, *sources)
|
|
288
|
+
end
|
|
289
|
+
end
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
include Chef::Mixin::ShellOut
|
|
295
|
+
|
|
296
|
+
attr_reader :gem_env
|
|
297
|
+
|
|
298
|
+
def logger
|
|
299
|
+
Chef::Log.logger
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
def initialize(new_resource, run_context=nil)
|
|
303
|
+
super
|
|
304
|
+
if new_resource.gem_binary
|
|
305
|
+
if new_resource.options && new_resource.options.kind_of?(Hash)
|
|
306
|
+
msg = "options cannot be given as a hash when using an explicit gem_binary\n"
|
|
307
|
+
msg << "in #{new_resource} from #{new_resource.source_line}"
|
|
308
|
+
raise ArgumentError, msg
|
|
309
|
+
end
|
|
310
|
+
@gem_env = AlternateGemEnvironment.new(new_resource.gem_binary)
|
|
311
|
+
else
|
|
312
|
+
@gem_env = CurrentGemEnvironment.new
|
|
313
|
+
end
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
def gem_dependency
|
|
317
|
+
Gem::Dependency.new(@new_resource.package_name, @new_resource.version)
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
def source_is_remote?
|
|
321
|
+
return true if @new_resource.source.nil?
|
|
322
|
+
URI.parse(@new_resource.source).absolute?
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
def current_version
|
|
326
|
+
#raise 'todo'
|
|
327
|
+
# If one or more matching versions are installed, the newest of them
|
|
328
|
+
# is the current version
|
|
329
|
+
if !matching_installed_versions.empty?
|
|
330
|
+
gemspec = matching_installed_versions.last
|
|
331
|
+
logger.debug { "Found installed gem #{gemspec.name} version #{gemspec.version} matching #{gem_dependency}"}
|
|
332
|
+
gemspec
|
|
333
|
+
# If no version matching the requirements exists, the latest installed
|
|
334
|
+
# version is the current version.
|
|
335
|
+
elsif !all_installed_versions.empty?
|
|
336
|
+
gemspec = all_installed_versions.last
|
|
337
|
+
logger.debug { "Newest installed version of gem #{gemspec.name} is #{gemspec.version}" }
|
|
338
|
+
gemspec
|
|
339
|
+
else
|
|
340
|
+
logger.debug { "No installed version found for #{gem_dependency.to_s}"}
|
|
341
|
+
nil
|
|
342
|
+
end
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
def matching_installed_versions
|
|
346
|
+
@matching_installed_versions ||= @gem_env.installed_versions(gem_dependency)
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
def all_installed_versions
|
|
350
|
+
@all_installed_versions ||= begin
|
|
351
|
+
@gem_env.installed_versions(Gem::Dependency.new(gem_dependency.name, '>= 0'))
|
|
352
|
+
end
|
|
353
|
+
end
|
|
354
|
+
|
|
355
|
+
def gem_sources
|
|
356
|
+
@new_resource.source ? Array(@new_resource.source) : nil
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
def load_current_resource
|
|
360
|
+
@current_resource = Chef::Resource::Package::GemPackage.new(@new_resource.name)
|
|
361
|
+
@current_resource.package_name(@new_resource.package_name)
|
|
362
|
+
if current_spec = current_version
|
|
363
|
+
@current_resource.version(current_spec.version.to_s)
|
|
364
|
+
end
|
|
365
|
+
@current_resource
|
|
366
|
+
end
|
|
367
|
+
|
|
368
|
+
def candidate_version
|
|
369
|
+
@candidate_version ||= begin
|
|
370
|
+
if target_version_already_installed?
|
|
371
|
+
nil
|
|
372
|
+
elsif source_is_remote?
|
|
373
|
+
@gem_env.candidate_version_from_remote(gem_dependency, *gem_sources).to_s
|
|
374
|
+
else
|
|
375
|
+
@gem_env.candidate_version_from_file(gem_dependency, @new_resource.source).to_s
|
|
376
|
+
end
|
|
377
|
+
end
|
|
378
|
+
end
|
|
379
|
+
|
|
380
|
+
def target_version_already_installed?
|
|
381
|
+
return false unless @current_resource && @current_resource.version
|
|
382
|
+
return false if @current_resource.version.nil?
|
|
383
|
+
# in the future we could support squiggly requirements like "~> 1.2.0"
|
|
384
|
+
# for now, the behavior when using anything other than exact
|
|
385
|
+
# requirements is undefined.
|
|
386
|
+
Gem::Requirement.new(@new_resource.version).satisfied_by?(Gem::Version.new(@current_resource.version))
|
|
387
|
+
end
|
|
388
|
+
|
|
389
|
+
##
|
|
390
|
+
# Installs the gem, using either the gems API or shelling out to `gem`
|
|
391
|
+
# according to the following criteria:
|
|
392
|
+
# 1. Use gems API (Gem::DependencyInstaller) by default
|
|
393
|
+
# 2. shell out to `gem install` when a String of options is given
|
|
394
|
+
# 3. use gems API with options if a hash of options is given
|
|
395
|
+
def install_package(name, version)
|
|
396
|
+
if source_is_remote? && @new_resource.gem_binary.nil?
|
|
397
|
+
if @new_resource.options.nil?
|
|
398
|
+
@gem_env.install(gem_dependency, :sources => gem_sources)
|
|
399
|
+
elsif @new_resource.options.kind_of?(Hash)
|
|
400
|
+
options = @new_resource.options
|
|
401
|
+
options[:sources] = gem_sources
|
|
402
|
+
@gem_env.install(gem_dependency, options)
|
|
403
|
+
else
|
|
404
|
+
install_via_gem_command(name, version)
|
|
405
|
+
end
|
|
406
|
+
elsif @new_resource.gem_binary.nil?
|
|
407
|
+
@gem_env.install(@new_resource.source)
|
|
408
|
+
else
|
|
409
|
+
install_via_gem_command(name,version)
|
|
410
|
+
end
|
|
411
|
+
true
|
|
412
|
+
end
|
|
413
|
+
|
|
414
|
+
def gem_binary_path
|
|
415
|
+
@new_resource.gem_binary || 'gem'
|
|
416
|
+
end
|
|
417
|
+
|
|
418
|
+
def install_via_gem_command(name, version)
|
|
419
|
+
src = @new_resource.source && " --source=#{@new_resource.source} --source=http://rubygems.org"
|
|
420
|
+
shell_out!("#{gem_binary_path} install #{name} -q --no-rdoc --no-ri -v \"#{version}\"#{src}#{opts}", :env=>nil)
|
|
421
|
+
end
|
|
422
|
+
|
|
423
|
+
def upgrade_package(name, version)
|
|
424
|
+
install_package(name, version)
|
|
425
|
+
end
|
|
426
|
+
|
|
427
|
+
def remove_package(name, version)
|
|
428
|
+
if @new_resource.gem_binary.nil?
|
|
429
|
+
if @new_resource.options.nil?
|
|
430
|
+
@gem_env.uninstall(name, version)
|
|
431
|
+
elsif @new_resource.options.kind_of?(Hash)
|
|
432
|
+
@gem_env.uninstall(name, version, @new_resource.options)
|
|
433
|
+
else
|
|
434
|
+
uninstall_via_gem_command(name, version)
|
|
435
|
+
end
|
|
436
|
+
else
|
|
437
|
+
uninstall_via_gem_command(name, version)
|
|
438
|
+
end
|
|
439
|
+
end
|
|
440
|
+
|
|
441
|
+
def uninstall_via_gem_command(name, version)
|
|
442
|
+
if version
|
|
443
|
+
shell_out!("#{gem_binary_path} uninstall #{name} -q -x -I -v \"#{version}\"#{opts}", :env=>nil)
|
|
444
|
+
else
|
|
445
|
+
shell_out!("#{gem_binary_path} uninstall #{name} -q -x -I -a#{opts}", :env=>nil)
|
|
446
|
+
end
|
|
447
|
+
end
|
|
448
|
+
|
|
449
|
+
def purge_package(name, version)
|
|
450
|
+
remove_package(name, version)
|
|
451
|
+
end
|
|
452
|
+
|
|
453
|
+
private
|
|
454
|
+
|
|
455
|
+
def opts
|
|
456
|
+
expand_options(@new_resource.options)
|
|
457
|
+
end
|
|
458
|
+
|
|
459
|
+
end
|
|
460
|
+
end
|
|
461
|
+
end
|
|
462
|
+
end
|