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,85 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Toomas Pelberg (<toomasp@gmx.net>)
|
|
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/provider/service'
|
|
20
|
+
require 'chef/mixin/command'
|
|
21
|
+
|
|
22
|
+
class Chef
|
|
23
|
+
class Provider
|
|
24
|
+
class Service
|
|
25
|
+
class Solaris < Chef::Provider::Service
|
|
26
|
+
|
|
27
|
+
def initialize(new_resource, run_context=nil)
|
|
28
|
+
super
|
|
29
|
+
@init_command = "/usr/sbin/svcadm"
|
|
30
|
+
@status_command = "/bin/svcs -l"
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def load_current_resource
|
|
34
|
+
@current_resource = Chef::Resource::Service.new(@new_resource.name)
|
|
35
|
+
@current_resource.service_name(@new_resource.service_name)
|
|
36
|
+
unless ::File.exists? "/bin/svcs"
|
|
37
|
+
raise Chef::Exceptions::Service, "/bin/svcs does not exist!"
|
|
38
|
+
end
|
|
39
|
+
@status = service_status.enabled
|
|
40
|
+
@current_resource
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def enable_service
|
|
44
|
+
run_command(:command => "#{@init_command} enable #{@new_resource.service_name}")
|
|
45
|
+
return service_status.enabled
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def disable_service
|
|
49
|
+
run_command(:command => "#{@init_command} disable #{@new_resource.service_name}")
|
|
50
|
+
return service_status.enabled
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
alias_method :stop_service, :disable_service
|
|
54
|
+
alias_method :start_service, :enable_service
|
|
55
|
+
|
|
56
|
+
def reload_service
|
|
57
|
+
run_command(:command => "#{@init_command} refresh #{@new_resource.service_name}")
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def restart_service
|
|
61
|
+
disable_service
|
|
62
|
+
return enable_service
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def service_status
|
|
66
|
+
status = popen4("#{@status_command} #{@current_resource.service_name}") do |pid, stdin, stdout, stderr|
|
|
67
|
+
stdout.each do |line|
|
|
68
|
+
case line
|
|
69
|
+
when /state\s+online/
|
|
70
|
+
@current_resource.enabled(true)
|
|
71
|
+
@current_resource.running(true)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
unless @current_resource.enabled
|
|
76
|
+
@current_resource.enabled(false)
|
|
77
|
+
@current_resource.running(false)
|
|
78
|
+
end
|
|
79
|
+
@current_resource
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Bryan McLellan <btm@loftninjas.org>
|
|
3
|
+
# Copyright:: Copyright (c) 2010 Bryan McLellan
|
|
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/service'
|
|
20
|
+
require 'chef/provider/service/simple'
|
|
21
|
+
require 'chef/mixin/command'
|
|
22
|
+
require 'chef/util/file_edit'
|
|
23
|
+
|
|
24
|
+
class Chef
|
|
25
|
+
class Provider
|
|
26
|
+
class Service
|
|
27
|
+
class Upstart < Chef::Provider::Service::Simple
|
|
28
|
+
UPSTART_STATE_FORMAT = /\w+ \(?(\w+)\)?[\/ ](\w+)/
|
|
29
|
+
|
|
30
|
+
# Upstart does more than start or stop a service, creating multiple 'states' [1] that a service can be in.
|
|
31
|
+
# In chef, when we ask a service to start, we expect it to have started before performing the next step
|
|
32
|
+
# since we have top down dependencies. Which is to say we may follow witha resource next that requires
|
|
33
|
+
# that service to be running. According to [2] we can trust that sending a 'goal' such as start will not
|
|
34
|
+
# return until that 'goal' is reached, or some error has occured.
|
|
35
|
+
#
|
|
36
|
+
# [1] http://upstart.ubuntu.com/wiki/JobStates
|
|
37
|
+
# [2] http://www.netsplit.com/2008/04/27/upstart-05-events/
|
|
38
|
+
|
|
39
|
+
def initialize(new_resource, run_context)
|
|
40
|
+
# TODO: re-evaluate if this is needed after integrating cookbook fix
|
|
41
|
+
raise ArgumentError, "run_context cannot be nil" unless run_context
|
|
42
|
+
super
|
|
43
|
+
|
|
44
|
+
run_context.node
|
|
45
|
+
|
|
46
|
+
platform, version = Chef::Platform.find_platform_and_version(run_context.node)
|
|
47
|
+
if platform == "ubuntu" && (8.04..9.04).include?(version.to_f)
|
|
48
|
+
@upstart_job_dir = "/etc/event.d"
|
|
49
|
+
@upstart_conf_suffix = ""
|
|
50
|
+
else
|
|
51
|
+
@upstart_job_dir = "/etc/init"
|
|
52
|
+
@upstart_conf_suffix = ".conf"
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def load_current_resource
|
|
57
|
+
@current_resource = Chef::Resource::Service.new(@new_resource.name)
|
|
58
|
+
@current_resource.service_name(@new_resource.service_name)
|
|
59
|
+
|
|
60
|
+
# Get running/stopped state
|
|
61
|
+
# We do not support searching for a service via ps when using upstart since status is a native
|
|
62
|
+
# upstart function. We will however support status_command in case someone wants to do something special.
|
|
63
|
+
if @new_resource.status_command
|
|
64
|
+
Chef::Log.debug("#{@new_resource} you have specified a status command, running..")
|
|
65
|
+
|
|
66
|
+
begin
|
|
67
|
+
if run_command_with_systems_locale(:command => @new_resource.status_command) == 0
|
|
68
|
+
@current_resource.running true
|
|
69
|
+
end
|
|
70
|
+
rescue Chef::Exceptions::Exec
|
|
71
|
+
@current_resource.running false
|
|
72
|
+
nil
|
|
73
|
+
end
|
|
74
|
+
else
|
|
75
|
+
begin
|
|
76
|
+
if upstart_state == "running"
|
|
77
|
+
@current_resource.running true
|
|
78
|
+
else
|
|
79
|
+
@current_resource.running false
|
|
80
|
+
end
|
|
81
|
+
rescue Chef::Exceptions::Exec
|
|
82
|
+
@current_resource.running false
|
|
83
|
+
nil
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Get enabled/disabled state by reading job configuration file
|
|
88
|
+
if ::File.exists?("#{@upstart_job_dir}/#{@new_resource.service_name}#{@upstart_conf_suffix}")
|
|
89
|
+
Chef::Log.debug("#{@new_resource}: found #{@upstart_job_dir}/#{@new_resource.service_name}#{@upstart_conf_suffix}")
|
|
90
|
+
::File.open("#{@upstart_job_dir}/#{@new_resource.service_name}#{@upstart_conf_suffix}",'r') do |file|
|
|
91
|
+
while line = file.gets
|
|
92
|
+
case line
|
|
93
|
+
when /^start on/
|
|
94
|
+
Chef::Log.debug("#{@new_resource}: enabled: #{line.chomp}")
|
|
95
|
+
@current_resource.enabled true
|
|
96
|
+
break
|
|
97
|
+
when /^#start on/
|
|
98
|
+
Chef::Log.debug("#{@new_resource}: disabled: #{line.chomp}")
|
|
99
|
+
@current_resource.enabled false
|
|
100
|
+
break
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
else
|
|
105
|
+
Chef::Log.debug("#{@new_resource}: did not find #{@upstart_job_dir}/#{@new_resource.service_name}#{@upstart_conf_suffix}")
|
|
106
|
+
@current_resource.enabled false
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
@current_resource
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def start_service
|
|
113
|
+
# Calling start on a service that is already started will return 1
|
|
114
|
+
# Our 'goal' when we call start is to ensure the service is started
|
|
115
|
+
if @current_resource.running
|
|
116
|
+
Chef::Log.debug("#{@new_resource}: Already running, not starting")
|
|
117
|
+
else
|
|
118
|
+
if @new_resource.start_command
|
|
119
|
+
super
|
|
120
|
+
else
|
|
121
|
+
run_command_with_systems_locale(:command => "/sbin/start #{@new_resource.service_name}")
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def stop_service
|
|
127
|
+
# Calling stop on a service that is already stopped will return 1
|
|
128
|
+
# Our 'goal' when we call stop is to ensure the service is stopped
|
|
129
|
+
unless @current_resource.running
|
|
130
|
+
Chef::Log.debug("#{@new_resource}: Not running, not stopping")
|
|
131
|
+
else
|
|
132
|
+
if @new_resource.stop_command
|
|
133
|
+
super
|
|
134
|
+
else
|
|
135
|
+
run_command_with_systems_locale(:command => "/sbin/stop #{@new_resource.service_name}")
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def restart_service
|
|
141
|
+
if @new_resource.restart_command
|
|
142
|
+
super
|
|
143
|
+
else
|
|
144
|
+
run_command_with_systems_locale(:command => "/sbin/restart #{@new_resource.service_name}")
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def reload_service
|
|
149
|
+
if @new_resource.reload_command
|
|
150
|
+
super
|
|
151
|
+
else
|
|
152
|
+
# upstart >= 0.6.3-4 supports reload (HUP)
|
|
153
|
+
run_command_with_systems_locale(:command => "/sbin/reload #{@new_resource.service_name}")
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# https://bugs.launchpad.net/upstart/+bug/94065
|
|
158
|
+
|
|
159
|
+
def enable_service
|
|
160
|
+
Chef::Log.warn("#{@new_resource}: upstart lacks inherent support for enabling services, editing job config file")
|
|
161
|
+
conf = Chef::Util::FileEdit.new("#{@upstart_job_dir}/#{@new_resource.service_name}#{@upstart_conf_suffix}")
|
|
162
|
+
conf.search_file_replace(/^#start on/, "start on")
|
|
163
|
+
conf.write_file
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def disable_service
|
|
167
|
+
Chef::Log.warn("#{@new_resource}: upstart lacks inherent support for disabling services, editing job config file")
|
|
168
|
+
conf = Chef::Util::FileEdit.new("#{@upstart_job_dir}/#{@new_resource.service_name}#{@upstart_conf_suffix}")
|
|
169
|
+
conf.search_file_replace(/^start on/, "#start on")
|
|
170
|
+
conf.write_file
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def upstart_state
|
|
174
|
+
command = "/sbin/status #{@new_resource.service_name}"
|
|
175
|
+
status = popen4(command) do |pid, stdin, stdout, stderr|
|
|
176
|
+
stdout.each_line do |line|
|
|
177
|
+
# rsyslog stop/waiting
|
|
178
|
+
# service goal/state
|
|
179
|
+
# OR
|
|
180
|
+
# rsyslog (stop) waiting
|
|
181
|
+
# service (goal) state
|
|
182
|
+
line =~ UPSTART_STATE_FORMAT
|
|
183
|
+
data = Regexp.last_match
|
|
184
|
+
return data[2]
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
end
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Nuo Yan <nuo@opscode.com>
|
|
3
|
+
# Author:: Bryan McLellan <btm@loftninjas.org>
|
|
4
|
+
# Copyright:: Copyright (c) 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
|
+
# pick up popen4 from chef/mixin/command/windows
|
|
21
|
+
require 'chef/mixin/command'
|
|
22
|
+
require 'chef/provider/service/simple'
|
|
23
|
+
|
|
24
|
+
class Chef::Provider::Service::Windows < Chef::Provider::Service::Simple
|
|
25
|
+
|
|
26
|
+
def initialize(new_resource, run_context)
|
|
27
|
+
super
|
|
28
|
+
@init_command = "sc"
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def io_popen(command)
|
|
32
|
+
io = IO.popen(command)
|
|
33
|
+
entries = io.readlines
|
|
34
|
+
io.close
|
|
35
|
+
entries
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def load_current_resource
|
|
39
|
+
@current_resource = Chef::Resource::Service.new(@new_resource.name)
|
|
40
|
+
@current_resource.service_name(@new_resource.service_name)
|
|
41
|
+
begin
|
|
42
|
+
# Check if service is running
|
|
43
|
+
status = popen4("#{@init_command} query #{@new_resource.service_name}") do |pid, stdin, stdout, stderr|
|
|
44
|
+
stdout.each_line do |line|
|
|
45
|
+
raise Chef::Exceptions::Service, "Service #{@new_resource.service_name} does not exist.\n#{stdout}\n" if line =~ /FAILED 1060/
|
|
46
|
+
@current_resource.running true if line =~/RUNNING/
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Check if service is enabled
|
|
51
|
+
status = popen4("#{@init_command} qc #{@new_resource.service_name}") do |pid, stdin, stdout, stderr|
|
|
52
|
+
stdout.each_line do |line|
|
|
53
|
+
raise Chef::Exceptions::Service, "Service #{@new_resource.service_name} does not exist.\n#{stdout}\n" if line =~ /FAILED 1060/
|
|
54
|
+
@current_resource.enabled true if line =~/AUTO_START/
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
Chef::Log.debug "#{@new_resource}: running: #{@current_resource.running}"
|
|
59
|
+
rescue Exception => e
|
|
60
|
+
raise Chef::Exceptions::Service, "Exception determining state of service #{@new_resource.service_name}: #{e.message}"
|
|
61
|
+
end
|
|
62
|
+
@current_resource
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def start_service
|
|
66
|
+
begin
|
|
67
|
+
if @new_resource.start_command
|
|
68
|
+
popen4(@new_resource.start_command) do |pid, stdin, stdout, stderr|
|
|
69
|
+
Chef::Log.debug stdout.readlines
|
|
70
|
+
end
|
|
71
|
+
else
|
|
72
|
+
popen4("#{@init_command} start #{@new_resource.service_name}") do |pid, stdin, stdout, stderr|
|
|
73
|
+
output = stdout.readlines
|
|
74
|
+
Chef::Log.debug output.join
|
|
75
|
+
output.join =~ /RUNNING/ || output.join =~ /START_PENDING/ ? true : false
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
rescue Exception => e
|
|
79
|
+
raise Chef::Exceptions::Service, "Failed to start service #{@new_resource.service_name}: #{e.message}"
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def stop_service
|
|
84
|
+
begin
|
|
85
|
+
if @new_resource.stop_command
|
|
86
|
+
Chef::Log.debug "stopping service using the given stop_command"
|
|
87
|
+
popen4(@new_resource.stop_command) do |pid, stdin, stdout, stderr|
|
|
88
|
+
Chef::Log.debug stdout.readlines
|
|
89
|
+
end
|
|
90
|
+
else
|
|
91
|
+
popen4("#{@init_command} stop #{@new_resource.service_name}") do |pid, stdin, stdout, stderr|
|
|
92
|
+
output = stdout.readlines
|
|
93
|
+
Chef::Log.debug output.join
|
|
94
|
+
raise Chef::Exceptions::Service, "Service #{@new_resource.service_name} has dependencies and cannot be stopped.\n" if output.join =~ /FAILED 1051/
|
|
95
|
+
output.join =~ /1/
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
rescue Exception => e
|
|
99
|
+
raise Chef::Exceptions::Service, "Failed to start service #{@new_resource.service_name}: #{e.message}"
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def restart_service
|
|
104
|
+
begin
|
|
105
|
+
if @new_resource.restart_command
|
|
106
|
+
Chef::Log.debug "restarting service using the given restart_command"
|
|
107
|
+
popen4(@new_resource.restart_command) do |pid, stdin, stdout, stderr|
|
|
108
|
+
Chef::Log.debug stdout.readlines
|
|
109
|
+
end
|
|
110
|
+
else
|
|
111
|
+
stop_service
|
|
112
|
+
sleep 1
|
|
113
|
+
start_service
|
|
114
|
+
end
|
|
115
|
+
rescue Exception => e
|
|
116
|
+
raise Chef::Exceptions::Service, "Failed to start service #{@new_resource.service_name}: #{e.message}"
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def enable_service()
|
|
121
|
+
begin
|
|
122
|
+
popen4("#{@init_command} config #{@new_resource.service_name} start= #{determine_startup_type}") do |pid, stdin, stdout, stderr|
|
|
123
|
+
stdout.readlines.join =~ /SUCCESS/
|
|
124
|
+
end
|
|
125
|
+
rescue Exception => e
|
|
126
|
+
raise Chef::Exceptions::Service, "Failed to start service #{@new_resource.service_name}: #{e.message}"
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def disable_service()
|
|
131
|
+
begin
|
|
132
|
+
popen4("#{@init_command} config #{@new_resource.service_name} start= disabled") do |pid, stdin, stdout, stderr|
|
|
133
|
+
stdout.readlines.join =~ /SUCCESS/
|
|
134
|
+
end
|
|
135
|
+
rescue Exception => e
|
|
136
|
+
raise Chef::Exceptions::Service, "Failed to start service #{@new_resource.service_name}: #{e.message}"
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
private
|
|
141
|
+
|
|
142
|
+
def determine_startup_type
|
|
143
|
+
{:automatic => 'auto', :mannual => 'demand'}[@new_resource.startup_type]
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
end
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Daniel DeLeo (<dan@kallistec.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
|
+
|
|
20
|
+
require 'chef/log'
|
|
21
|
+
require 'chef/provider'
|
|
22
|
+
require 'chef/mixin/command'
|
|
23
|
+
require 'fileutils'
|
|
24
|
+
|
|
25
|
+
class Chef
|
|
26
|
+
class Provider
|
|
27
|
+
class Subversion < Chef::Provider
|
|
28
|
+
|
|
29
|
+
include Chef::Mixin::Command
|
|
30
|
+
|
|
31
|
+
def load_current_resource
|
|
32
|
+
@current_resource = Chef::Resource::Subversion.new(@new_resource.name)
|
|
33
|
+
|
|
34
|
+
unless [:export, :force_export].include?(@new_resource.action.first)
|
|
35
|
+
if current_revision = find_current_revision
|
|
36
|
+
@current_resource.revision current_revision
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def action_checkout
|
|
42
|
+
assert_target_directory_valid!
|
|
43
|
+
if target_dir_non_existant_or_empty?
|
|
44
|
+
run_command(run_options(:command => checkout_command))
|
|
45
|
+
@new_resource.updated_by_last_action(true)
|
|
46
|
+
else
|
|
47
|
+
Chef::Log.info "Taking no action, checkout destination #{@new_resource.destination} already exists or is a non-empty directory"
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def action_export
|
|
52
|
+
assert_target_directory_valid!
|
|
53
|
+
if target_dir_non_existant_or_empty?
|
|
54
|
+
run_command(run_options(:command => export_command))
|
|
55
|
+
@new_resource.updated_by_last_action(true)
|
|
56
|
+
else
|
|
57
|
+
Chef::Log.info "Taking no action, export destination #{@new_resource.destination} already exists or is a non-empty directory"
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def action_force_export
|
|
62
|
+
assert_target_directory_valid!
|
|
63
|
+
run_command(run_options(:command => export_command))
|
|
64
|
+
@new_resource.updated_by_last_action(true)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def action_sync
|
|
68
|
+
assert_target_directory_valid!
|
|
69
|
+
if ::File.exist?(::File.join(@new_resource.destination, ".svn"))
|
|
70
|
+
current_rev = find_current_revision
|
|
71
|
+
Chef::Log.debug "#{@new_resource} current revision: #{current_rev} target revision: #{revision_int}"
|
|
72
|
+
unless current_revision_matches_target_revision?
|
|
73
|
+
run_command(run_options(:command => sync_command))
|
|
74
|
+
Chef::Log.info "#{@new_resource} updated to revision: #{revision_int}"
|
|
75
|
+
@new_resource.updated_by_last_action(true)
|
|
76
|
+
end
|
|
77
|
+
else
|
|
78
|
+
action_checkout
|
|
79
|
+
@new_resource.updated_by_last_action(true)
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def sync_command
|
|
84
|
+
Chef::Log.info "Updating working copy #{@new_resource.destination} to revision #{@new_resource.revision}"
|
|
85
|
+
scm :update, @new_resource.svn_arguments, verbose, authentication, "-r#{revision_int}", @new_resource.destination
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def checkout_command
|
|
89
|
+
Chef::Log.info "checking out #{@new_resource.repository} at revision #{@new_resource.revision} to #{@new_resource.destination}"
|
|
90
|
+
scm :checkout, @new_resource.svn_arguments, verbose, authentication,
|
|
91
|
+
"-r#{revision_int}", @new_resource.repository, @new_resource.destination
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def export_command
|
|
95
|
+
Chef::Log.info "exporting #{@new_resource.repository} at revision #{@new_resource.revision} to #{@new_resource.destination}"
|
|
96
|
+
args = ["--force"]
|
|
97
|
+
args << @new_resource.svn_arguments << verbose << authentication <<
|
|
98
|
+
"-r#{revision_int}" << @new_resource.repository << @new_resource.destination
|
|
99
|
+
scm :export, *args
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# If the specified revision isn't an integer ("HEAD" for example), look
|
|
103
|
+
# up the revision id by asking the server
|
|
104
|
+
# If the specified revision is an integer, trust it.
|
|
105
|
+
def revision_int
|
|
106
|
+
@revision_int ||= begin
|
|
107
|
+
if @new_resource.revision =~ /^\d+$/
|
|
108
|
+
@new_resource.revision
|
|
109
|
+
else
|
|
110
|
+
command = scm(:info, @new_resource.repository, @new_resource.svn_info_args, authentication, "-r#{@new_resource.revision}")
|
|
111
|
+
status, svn_info, error_message = output_of_command(command, run_options)
|
|
112
|
+
handle_command_failures(status, "STDOUT: #{svn_info}\nSTDERR: #{error_message}")
|
|
113
|
+
extract_revision_info(svn_info)
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
alias :revision_slug :revision_int
|
|
119
|
+
|
|
120
|
+
def find_current_revision
|
|
121
|
+
return nil unless ::File.exist?(::File.join(@new_resource.destination, ".svn"))
|
|
122
|
+
command = scm(:info)
|
|
123
|
+
status, svn_info, error_message = output_of_command(command, run_options(:cwd => cwd))
|
|
124
|
+
|
|
125
|
+
unless [0,1].include?(status.exitstatus)
|
|
126
|
+
handle_command_failures(status, "STDOUT: #{svn_info}\nSTDERR: #{error_message}")
|
|
127
|
+
end
|
|
128
|
+
extract_revision_info(svn_info)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def current_revision_matches_target_revision?
|
|
132
|
+
(!@current_resource.revision.nil?) && (revision_int.strip.to_i == @current_resource.revision.strip.to_i)
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def run_options(run_opts={})
|
|
136
|
+
run_opts[:user] = @new_resource.user if @new_resource.user
|
|
137
|
+
run_opts[:group] = @new_resource.group if @new_resource.group
|
|
138
|
+
run_opts
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
private
|
|
142
|
+
|
|
143
|
+
def cwd
|
|
144
|
+
@new_resource.destination
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def verbose
|
|
148
|
+
"-q"
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def extract_revision_info(svn_info)
|
|
152
|
+
begin
|
|
153
|
+
repo_attrs = YAML.load(svn_info)
|
|
154
|
+
rescue ArgumentError
|
|
155
|
+
# YAML doesn't appreciate input like "svn: '/tmp/deploydir' is not a working copy\n"
|
|
156
|
+
return nil
|
|
157
|
+
end
|
|
158
|
+
raise "Could not parse `svn info` data: #{svn_info}" unless repo_attrs.kind_of?(Hash)
|
|
159
|
+
rev = (repo_attrs['Last Changed Rev'] || repo_attrs['Revision']).to_s
|
|
160
|
+
Chef::Log.debug "Resolved revision #{@new_resource.revision} to #{rev}"
|
|
161
|
+
rev
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
# If a username is configured for the SCM, return the command-line
|
|
165
|
+
# switches for that. Note that we don't need to return the password
|
|
166
|
+
# switch, since Capistrano will check for that prompt in the output
|
|
167
|
+
# and will respond appropriately.
|
|
168
|
+
def authentication
|
|
169
|
+
return "" unless @new_resource.svn_username
|
|
170
|
+
result = "--username #{@new_resource.svn_username} "
|
|
171
|
+
result << "--password #{@new_resource.svn_password} "
|
|
172
|
+
result
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def scm(*args)
|
|
176
|
+
['svn', *args].compact.join(" ")
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
# TODO these methods are the same as the git provider...need to REFACTOR
|
|
180
|
+
# ...the subversion and git providers should extend from the same parent
|
|
181
|
+
def assert_target_directory_valid!
|
|
182
|
+
target_parent_directory = ::File.dirname(@new_resource.destination)
|
|
183
|
+
unless ::File.directory?(target_parent_directory)
|
|
184
|
+
msg = "Cannot clone #{@new_resource} to #{@new_resource.destination}, the enclosing directory #{target_parent_directory} does not exist"
|
|
185
|
+
raise Chef::Exceptions::MissingParentDirectory, msg
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def target_dir_non_existant_or_empty?
|
|
190
|
+
!::File.exist?(@new_resource.destination) || Dir.entries(@new_resource.destination).sort == ['.','..']
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
end
|