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,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,129 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Nuo Yan <nuo@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/provider/service/init'
|
|
20
|
+
|
|
21
|
+
class Chef::Provider::Service::Windows < Chef::Provider::Service::Init
|
|
22
|
+
|
|
23
|
+
def initialize(new_resource, run_context)
|
|
24
|
+
super
|
|
25
|
+
@init_command = "sc"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def load_current_resource
|
|
29
|
+
@current_resource = Chef::Resource::Service.new(@new_resource.name)
|
|
30
|
+
@current_resource.service_name(@new_resource.service_name)
|
|
31
|
+
status = IO.popen("#{@init_command} query #{@new_resource.service_name}").entries
|
|
32
|
+
raise Chef::Exceptions::Exec, "Service #{@new_resource.service_name} does not exist.\n#{status.join}\n" if status[0].include?("FAILED 1060")
|
|
33
|
+
|
|
34
|
+
begin
|
|
35
|
+
started = status[3].include?("4")
|
|
36
|
+
@current_resource.running started
|
|
37
|
+
|
|
38
|
+
start_type = IO.popen("#{@init_command} qc #{@new_resource.service_name}").entries[4]
|
|
39
|
+
@current_resource.enabled(start_type.include?('2') || start_type.include?('3') ? true : false)
|
|
40
|
+
|
|
41
|
+
Chef::Log.debug "#{@new_resource}: running: #{@current_resource.running}"
|
|
42
|
+
rescue StandardError
|
|
43
|
+
raise Chef::Exceptions::Exec
|
|
44
|
+
rescue Chef::Exceptions::Exec
|
|
45
|
+
Chef::Log.debug "Failed to determine the current status of the service, assuming it is not running"
|
|
46
|
+
@current_resource.running false
|
|
47
|
+
nil
|
|
48
|
+
end
|
|
49
|
+
@current_resource
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def start_service
|
|
53
|
+
begin
|
|
54
|
+
result = if @new_resource.start_command
|
|
55
|
+
Chef::Log.debug "starting service using the given start_command"
|
|
56
|
+
IO.popen(@new_resource.start_command).readlines
|
|
57
|
+
else
|
|
58
|
+
IO.popen("#{@init_command} start #{@new_resource.service_name}").readlines
|
|
59
|
+
end
|
|
60
|
+
Chef::Log.debug result.join
|
|
61
|
+
result[3].include?('4') || result.include?('2') ? true : false
|
|
62
|
+
rescue
|
|
63
|
+
Chef::Log.debug "Failed to start service #{@new_resource.service_name}"
|
|
64
|
+
false
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def stop_service
|
|
69
|
+
begin
|
|
70
|
+
Chef::Log.debug "stopping service using the given stop_command"
|
|
71
|
+
result = if @new_resource.stop_command
|
|
72
|
+
IO.popen(@new_resource.stop_command).readlines
|
|
73
|
+
else
|
|
74
|
+
IO.popen("#{@init_command} stop #{@new_resource.service_name}").readlines
|
|
75
|
+
end
|
|
76
|
+
Chef::Log.debug result.join
|
|
77
|
+
result[3].include?('1')
|
|
78
|
+
rescue
|
|
79
|
+
Chef::Log.debug "Failed to stop service #{@new_resource.service_name}"
|
|
80
|
+
false
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def restart_service
|
|
85
|
+
begin
|
|
86
|
+
if @new_resource.restart_command
|
|
87
|
+
Chef::Log.debug "restarting service using the given restart_command"
|
|
88
|
+
result = IO.popen(@new_resource.restart_command).readlines
|
|
89
|
+
Chef::Log.debug result.join
|
|
90
|
+
else
|
|
91
|
+
Chef::Log.debug IO.popen("#{@init_command} stop #{@new_resource.service_name}").readlines.join
|
|
92
|
+
sleep 1
|
|
93
|
+
result = IO.popen("#{@init_command} start #{@new_resource.service_name}").readlines
|
|
94
|
+
Chef::Log.debug result.join
|
|
95
|
+
end
|
|
96
|
+
result[3].include?('4') || result.include?('2')
|
|
97
|
+
rescue
|
|
98
|
+
Chef::Log.debug "Failed to restart service #{@new_resource.service_name}"
|
|
99
|
+
false
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def enable_service()
|
|
104
|
+
begin
|
|
105
|
+
Chef::Log.debug result = IO.popen("#{@init_command} config #{@new_resource.service_name} start= #{determine_startup_type}").readlines.join
|
|
106
|
+
result.include?('SUCCESS')
|
|
107
|
+
rescue
|
|
108
|
+
Chef::Log.debug "Failed to enable service #{@new_resource.service_name}"
|
|
109
|
+
false
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def disable_service()
|
|
114
|
+
begin
|
|
115
|
+
Chef::Log.debug result = IO.popen("#{@init_command} config #{@new_resource.service_name} start= disabled").readlines.join
|
|
116
|
+
result.include?('SUCCESS')
|
|
117
|
+
rescue
|
|
118
|
+
Chef::Log.debug "Failed to disable service #{@new_resource.service_name}"
|
|
119
|
+
false
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
private
|
|
124
|
+
|
|
125
|
+
def determine_startup_type
|
|
126
|
+
{:automatic => 'auto', :mannual => 'demand'}[@new_resource.startup_type]
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
end
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: AJ Christensen (<aj@hjksolutions.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/mixin/command'
|
|
20
|
+
require 'chef/provider'
|
|
21
|
+
|
|
22
|
+
class Chef
|
|
23
|
+
class Provider
|
|
24
|
+
class Service < Chef::Provider
|
|
25
|
+
|
|
26
|
+
include Chef::Mixin::Command
|
|
27
|
+
|
|
28
|
+
def initialize(new_resource, run_context)
|
|
29
|
+
super
|
|
30
|
+
@enabled = nil
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def action_enable
|
|
34
|
+
if @current_resource.enabled
|
|
35
|
+
Chef::Log.debug("#{@new_resource}: not enabling, already enabled")
|
|
36
|
+
else
|
|
37
|
+
Chef::Log.debug("#{@new_resource}: attempting to enable")
|
|
38
|
+
if enable_service
|
|
39
|
+
@new_resource.updated_by_last_action(true)
|
|
40
|
+
Chef::Log.info("#{@new_resource}: enabled successfully")
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def action_disable
|
|
46
|
+
if @current_resource.enabled
|
|
47
|
+
Chef::Log.debug("#{@new_resource}: attempting to disable")
|
|
48
|
+
if disable_service
|
|
49
|
+
@new_resource.updated_by_last_action(true)
|
|
50
|
+
Chef::Log.info("#{@new_resource}: disabled successfully")
|
|
51
|
+
end
|
|
52
|
+
else
|
|
53
|
+
Chef::Log.debug("#{@new_resource}: not disabling, already disabled")
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def action_start
|
|
58
|
+
unless @current_resource.running
|
|
59
|
+
Chef::Log.debug("#{@new_resource}: attempting to start")
|
|
60
|
+
if start_service
|
|
61
|
+
@new_resource.updated_by_last_action(true)
|
|
62
|
+
Chef::Log.info("Started service #{@new_resource} successfully")
|
|
63
|
+
end
|
|
64
|
+
else
|
|
65
|
+
Chef::Log.debug("#{@new_resource}: not starting, already running")
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def action_stop
|
|
70
|
+
if @current_resource.running
|
|
71
|
+
Chef::Log.debug("#{@new_resource}: attempting to stop")
|
|
72
|
+
if stop_service
|
|
73
|
+
@new_resource.updated_by_last_action(true)
|
|
74
|
+
Chef::Log.info("#{@new_resource}: stopped successfully")
|
|
75
|
+
end
|
|
76
|
+
else
|
|
77
|
+
Chef::Log.debug("#{@new_resource}: not stopping, already stopped")
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def action_restart
|
|
82
|
+
Chef::Log.debug("#{@new_resource}: attempting to restart")
|
|
83
|
+
if restart_service
|
|
84
|
+
@new_resource.updated_by_last_action(true)
|
|
85
|
+
Chef::Log.info("#{@new_resource}: restarted successfully")
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def action_reload
|
|
90
|
+
unless (@new_resource.supports[:reload] || @new_resource.reload_command)
|
|
91
|
+
raise Chef::Exceptions::UnsupportedAction, "#{self.to_s} does not support :reload"
|
|
92
|
+
end
|
|
93
|
+
if @current_resource.running
|
|
94
|
+
Chef::Log.debug("#{@new_resource}: attempting to reload")
|
|
95
|
+
if reload_service
|
|
96
|
+
@new_resource.updated_by_last_action(true)
|
|
97
|
+
Chef::Log.info("#{@new_resource}: reloaded successfully")
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def enable_service
|
|
103
|
+
raise Chef::Exceptions::UnsupportedAction, "#{self.to_s} does not support :enable"
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def disable_service
|
|
107
|
+
raise Chef::Exceptions::UnsupportedAction, "#{self.to_s} does not support :disable"
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def start_service
|
|
111
|
+
raise Chef::Exceptions::UnsupportedAction, "#{self.to_s} does not support :start"
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def stop_service
|
|
115
|
+
raise Chef::Exceptions::UnsupportedAction, "#{self.to_s} does not support :stop"
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def restart_service
|
|
119
|
+
raise Chef::Exceptions::UnsupportedAction, "#{self.to_s} does not support :restart"
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def reload_service
|
|
123
|
+
raise Chef::Exceptions::UnsupportedAction, "#{self.to_s} does not support :restart"
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|