microwave 0.1004.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.
Files changed (206) hide show
  1. data/LICENSE +201 -0
  2. data/README.rdoc +102 -0
  3. data/bin/chef-solo +25 -0
  4. data/lib/chef.rb +41 -0
  5. data/lib/chef/application.rb +147 -0
  6. data/lib/chef/application/solo.rb +181 -0
  7. data/lib/chef/applications.rb +1 -0
  8. data/lib/chef/checksum.rb +83 -0
  9. data/lib/chef/checksum_cache.rb +189 -0
  10. data/lib/chef/client.rb +325 -0
  11. data/lib/chef/config.rb +152 -0
  12. data/lib/chef/cookbook/chefignore.rb +66 -0
  13. data/lib/chef/cookbook/cookbook_collection.rb +45 -0
  14. data/lib/chef/cookbook/cookbook_version_loader.rb +173 -0
  15. data/lib/chef/cookbook/file_system_file_vendor.rb +56 -0
  16. data/lib/chef/cookbook/file_vendor.rb +48 -0
  17. data/lib/chef/cookbook/metadata.rb +629 -0
  18. data/lib/chef/cookbook/syntax_check.rb +136 -0
  19. data/lib/chef/cookbook_loader.rb +121 -0
  20. data/lib/chef/cookbook_version.rb +786 -0
  21. data/lib/chef/cookbook_version_selector.rb +151 -0
  22. data/lib/chef/environment.rb +267 -0
  23. data/lib/chef/exceptions.rb +150 -0
  24. data/lib/chef/file_access_control.rb +144 -0
  25. data/lib/chef/file_cache.rb +218 -0
  26. data/lib/chef/handler.rb +206 -0
  27. data/lib/chef/handler/error_report.rb +33 -0
  28. data/lib/chef/handler/json_file.rb +58 -0
  29. data/lib/chef/json_compat.rb +52 -0
  30. data/lib/chef/log.rb +39 -0
  31. data/lib/chef/mash.rb +211 -0
  32. data/lib/chef/mixin/check_helper.rb +31 -0
  33. data/lib/chef/mixin/checksum.rb +32 -0
  34. data/lib/chef/mixin/command.rb +221 -0
  35. data/lib/chef/mixin/command/unix.rb +215 -0
  36. data/lib/chef/mixin/command/windows.rb +76 -0
  37. data/lib/chef/mixin/convert_to_class_name.rb +63 -0
  38. data/lib/chef/mixin/create_path.rb +57 -0
  39. data/lib/chef/mixin/deep_merge.rb +225 -0
  40. data/lib/chef/mixin/deprecation.rb +65 -0
  41. data/lib/chef/mixin/from_file.rb +50 -0
  42. data/lib/chef/mixin/get_source_from_package.rb +42 -0
  43. data/lib/chef/mixin/language.rb +125 -0
  44. data/lib/chef/mixin/language_include_attribute.rb +61 -0
  45. data/lib/chef/mixin/language_include_recipe.rb +52 -0
  46. data/lib/chef/mixin/params_validate.rb +225 -0
  47. data/lib/chef/mixin/recipe_definition_dsl_core.rb +78 -0
  48. data/lib/chef/mixin/shell_out.rb +41 -0
  49. data/lib/chef/mixin/template.rb +95 -0
  50. data/lib/chef/mixin/xml_escape.rb +140 -0
  51. data/lib/chef/mixins.rb +15 -0
  52. data/lib/chef/monkey_patches/dir.rb +36 -0
  53. data/lib/chef/monkey_patches/numeric.rb +15 -0
  54. data/lib/chef/monkey_patches/object.rb +9 -0
  55. data/lib/chef/monkey_patches/regexp.rb +34 -0
  56. data/lib/chef/monkey_patches/string.rb +49 -0
  57. data/lib/chef/monkey_patches/tempfile.rb +64 -0
  58. data/lib/chef/nil_argument.rb +3 -0
  59. data/lib/chef/node.rb +469 -0
  60. data/lib/chef/node/attribute.rb +487 -0
  61. data/lib/chef/platform.rb +409 -0
  62. data/lib/chef/provider.rb +124 -0
  63. data/lib/chef/provider/breakpoint.rb +31 -0
  64. data/lib/chef/provider/cookbook_file.rb +100 -0
  65. data/lib/chef/provider/cron.rb +186 -0
  66. data/lib/chef/provider/cron/solaris.rb +195 -0
  67. data/lib/chef/provider/deploy.rb +343 -0
  68. data/lib/chef/provider/deploy/revision.rb +80 -0
  69. data/lib/chef/provider/deploy/timestamped.rb +33 -0
  70. data/lib/chef/provider/directory.rb +72 -0
  71. data/lib/chef/provider/env.rb +152 -0
  72. data/lib/chef/provider/env/windows.rb +75 -0
  73. data/lib/chef/provider/erl_call.rb +101 -0
  74. data/lib/chef/provider/execute.rb +66 -0
  75. data/lib/chef/provider/file.rb +222 -0
  76. data/lib/chef/provider/git.rb +243 -0
  77. data/lib/chef/provider/group.rb +133 -0
  78. data/lib/chef/provider/group/aix.rb +70 -0
  79. data/lib/chef/provider/group/dscl.rb +121 -0
  80. data/lib/chef/provider/group/gpasswd.rb +53 -0
  81. data/lib/chef/provider/group/groupadd.rb +81 -0
  82. data/lib/chef/provider/group/pw.rb +84 -0
  83. data/lib/chef/provider/group/suse.rb +53 -0
  84. data/lib/chef/provider/group/usermod.rb +57 -0
  85. data/lib/chef/provider/group/windows.rb +79 -0
  86. data/lib/chef/provider/ifconfig.rb +134 -0
  87. data/lib/chef/provider/link.rb +164 -0
  88. data/lib/chef/provider/log.rb +54 -0
  89. data/lib/chef/provider/mdadm.rb +91 -0
  90. data/lib/chef/provider/mount.rb +114 -0
  91. data/lib/chef/provider/mount/mount.rb +240 -0
  92. data/lib/chef/provider/mount/windows.rb +81 -0
  93. data/lib/chef/provider/ohai.rb +42 -0
  94. data/lib/chef/provider/package.rb +163 -0
  95. data/lib/chef/provider/package/apt.rb +135 -0
  96. data/lib/chef/provider/package/dpkg.rb +115 -0
  97. data/lib/chef/provider/package/easy_install.rb +136 -0
  98. data/lib/chef/provider/package/freebsd.rb +125 -0
  99. data/lib/chef/provider/package/macports.rb +105 -0
  100. data/lib/chef/provider/package/pacman.rb +101 -0
  101. data/lib/chef/provider/package/portage.rb +135 -0
  102. data/lib/chef/provider/package/rpm.rb +104 -0
  103. data/lib/chef/provider/package/rubygems.rb +465 -0
  104. data/lib/chef/provider/package/solaris.rb +130 -0
  105. data/lib/chef/provider/package/yum-dump.py +286 -0
  106. data/lib/chef/provider/package/yum.rb +1128 -0
  107. data/lib/chef/provider/package/zypper.rb +144 -0
  108. data/lib/chef/provider/remote_directory.rb +137 -0
  109. data/lib/chef/provider/route.rb +193 -0
  110. data/lib/chef/provider/ruby_block.rb +34 -0
  111. data/lib/chef/provider/script.rb +55 -0
  112. data/lib/chef/provider/service.rb +122 -0
  113. data/lib/chef/provider/service/arch.rb +116 -0
  114. data/lib/chef/provider/service/debian.rb +130 -0
  115. data/lib/chef/provider/service/freebsd.rb +154 -0
  116. data/lib/chef/provider/service/gentoo.rb +53 -0
  117. data/lib/chef/provider/service/init.rb +71 -0
  118. data/lib/chef/provider/service/insserv.rb +52 -0
  119. data/lib/chef/provider/service/redhat.rb +60 -0
  120. data/lib/chef/provider/service/simple.rb +120 -0
  121. data/lib/chef/provider/service/solaris.rb +85 -0
  122. data/lib/chef/provider/service/systemd.rb +102 -0
  123. data/lib/chef/provider/service/upstart.rb +198 -0
  124. data/lib/chef/provider/service/windows.rb +146 -0
  125. data/lib/chef/provider/subversion.rb +197 -0
  126. data/lib/chef/provider/template.rb +104 -0
  127. data/lib/chef/provider/user.rb +186 -0
  128. data/lib/chef/provider/user/dscl.rb +280 -0
  129. data/lib/chef/provider/user/pw.rb +113 -0
  130. data/lib/chef/provider/user/useradd.rb +137 -0
  131. data/lib/chef/provider/user/windows.rb +124 -0
  132. data/lib/chef/providers.rb +93 -0
  133. data/lib/chef/recipe.rb +129 -0
  134. data/lib/chef/resource.rb +584 -0
  135. data/lib/chef/resource/apt_package.rb +34 -0
  136. data/lib/chef/resource/bash.rb +33 -0
  137. data/lib/chef/resource/breakpoint.rb +35 -0
  138. data/lib/chef/resource/cookbook_file.rb +45 -0
  139. data/lib/chef/resource/cron.rb +188 -0
  140. data/lib/chef/resource/csh.rb +33 -0
  141. data/lib/chef/resource/deploy.rb +380 -0
  142. data/lib/chef/resource/deploy_revision.rb +40 -0
  143. data/lib/chef/resource/directory.rb +89 -0
  144. data/lib/chef/resource/dpkg_package.rb +34 -0
  145. data/lib/chef/resource/easy_install_package.rb +57 -0
  146. data/lib/chef/resource/env.rb +58 -0
  147. data/lib/chef/resource/erl_call.rb +83 -0
  148. data/lib/chef/resource/execute.rb +127 -0
  149. data/lib/chef/resource/file.rb +112 -0
  150. data/lib/chef/resource/freebsd_package.rb +35 -0
  151. data/lib/chef/resource/gem_package.rb +53 -0
  152. data/lib/chef/resource/git.rb +46 -0
  153. data/lib/chef/resource/group.rb +70 -0
  154. data/lib/chef/resource/ifconfig.rb +134 -0
  155. data/lib/chef/resource/link.rb +105 -0
  156. data/lib/chef/resource/log.rb +62 -0
  157. data/lib/chef/resource/macports_package.rb +29 -0
  158. data/lib/chef/resource/mdadm.rb +82 -0
  159. data/lib/chef/resource/mount.rb +134 -0
  160. data/lib/chef/resource/ohai.rb +40 -0
  161. data/lib/chef/resource/package.rb +80 -0
  162. data/lib/chef/resource/pacman_package.rb +33 -0
  163. data/lib/chef/resource/perl.rb +33 -0
  164. data/lib/chef/resource/portage_package.rb +33 -0
  165. data/lib/chef/resource/python.rb +33 -0
  166. data/lib/chef/resource/remote_directory.rb +109 -0
  167. data/lib/chef/resource/route.rb +135 -0
  168. data/lib/chef/resource/rpm_package.rb +34 -0
  169. data/lib/chef/resource/ruby.rb +33 -0
  170. data/lib/chef/resource/ruby_block.rb +40 -0
  171. data/lib/chef/resource/scm.rb +147 -0
  172. data/lib/chef/resource/script.rb +60 -0
  173. data/lib/chef/resource/service.rb +160 -0
  174. data/lib/chef/resource/solaris_package.rb +36 -0
  175. data/lib/chef/resource/subversion.rb +36 -0
  176. data/lib/chef/resource/template.rb +69 -0
  177. data/lib/chef/resource/timestamped_deploy.rb +31 -0
  178. data/lib/chef/resource/user.rb +130 -0
  179. data/lib/chef/resource/yum_package.rb +63 -0
  180. data/lib/chef/resource_collection.rb +217 -0
  181. data/lib/chef/resource_collection/stepable_iterator.rb +124 -0
  182. data/lib/chef/resource_definition.rb +67 -0
  183. data/lib/chef/resource_definition_list.rb +38 -0
  184. data/lib/chef/resources.rb +62 -0
  185. data/lib/chef/role.rb +225 -0
  186. data/lib/chef/run_context.rb +126 -0
  187. data/lib/chef/run_list.rb +161 -0
  188. data/lib/chef/run_list/run_list_expansion.rb +159 -0
  189. data/lib/chef/run_list/run_list_item.rb +92 -0
  190. data/lib/chef/run_list/versioned_recipe_list.rb +68 -0
  191. data/lib/chef/run_status.rb +121 -0
  192. data/lib/chef/runner.rb +105 -0
  193. data/lib/chef/shell_out.rb +250 -0
  194. data/lib/chef/shell_out/unix.rb +223 -0
  195. data/lib/chef/shell_out/windows.rb +98 -0
  196. data/lib/chef/tasks/chef_repo.rake +330 -0
  197. data/lib/chef/util/file_edit.rb +122 -0
  198. data/lib/chef/util/windows.rb +56 -0
  199. data/lib/chef/util/windows/net_group.rb +101 -0
  200. data/lib/chef/util/windows/net_use.rb +121 -0
  201. data/lib/chef/util/windows/net_user.rb +198 -0
  202. data/lib/chef/util/windows/volume.rb +59 -0
  203. data/lib/chef/version.rb +23 -0
  204. data/lib/chef/version_class.rb +70 -0
  205. data/lib/chef/version_constraint.rb +116 -0
  206. metadata +493 -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,102 @@
1
+ #
2
+ # Author:: Stephen Haynes (<sh@nomitor.com>)
3
+ # Copyright:: Copyright (c) 2011 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/provider/service/simple'
21
+ require 'chef/mixin/command'
22
+
23
+ class Chef::Provider::Service::Systemd < Chef::Provider::Service::Simple
24
+ def load_current_resource
25
+ @current_resource = Chef::Resource::Service.new(@new_resource.name)
26
+ @current_resource.service_name(@new_resource.service_name)
27
+
28
+ if @new_resource.status_command
29
+ Chef::Log.debug("#{@new_resource} you have specified a status command, running..")
30
+
31
+ begin
32
+ if run_command_with_systems_locale(:command => @new_resource.status_command) == 0
33
+ @current_resource.running(true)
34
+ end
35
+ rescue Chef::Exceptions::Exec
36
+ @current_resource.running(false)
37
+ nil
38
+ end
39
+ else
40
+ @current_resource.running(is_active?)
41
+ end
42
+
43
+ @current_resource.enabled(is_enabled?)
44
+ @current_resource
45
+ end
46
+
47
+ def start_service
48
+ if @current_resource.running
49
+ Chef::Log.debug("#{@new_resource} already running, not starting")
50
+ else
51
+ if @new_resource.start_command
52
+ super
53
+ else
54
+ run_command_with_systems_locale(:command => "/bin/systemctl start #{@new_resource.service_name}")
55
+ end
56
+ end
57
+ end
58
+
59
+ def stop_service
60
+ unless @current_resource.running
61
+ Chef::Log.debug("#{@new_resource} not running, not stopping")
62
+ else
63
+ if @new_resource.stop_command
64
+ super
65
+ else
66
+ run_command_with_systems_locale(:command => "/bin/systemctl stop #{@new_resource.service_name}")
67
+ end
68
+ end
69
+ end
70
+
71
+ def restart_service
72
+ if @new_resource.restart_command
73
+ super
74
+ else
75
+ run_command_with_systems_locale(:command => "/bin/systemctl restart #{@new_resource.service_name}")
76
+ end
77
+ end
78
+
79
+ def reload_service
80
+ if @new_resource.reload_command
81
+ super
82
+ else
83
+ run_command_with_systems_locale(:command => "/bin/systemctl reload #{@new_resource.service_name}")
84
+ end
85
+ end
86
+
87
+ def enable_service
88
+ run_command_with_systems_locale(:command => "/bin/systemctl enable #{@new_resource.service_name}")
89
+ end
90
+
91
+ def disable_service
92
+ run_command_with_systems_locale(:command => "/bin/systemctl disable #{@new_resource.service_name}")
93
+ end
94
+
95
+ def is_active?
96
+ run_command_with_systems_locale({:command => "/bin/systemctl is-active #{@new_resource.service_name}", :ignore_failure => true}) == 0
97
+ end
98
+
99
+ def is_enabled?
100
+ run_command_with_systems_locale({:command => "/bin/systemctl is-enabled #{@new_resource.service_name}", :ignore_failure => true}) == 0
101
+ end
102
+ end
@@ -0,0 +1,198 @@
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
+ # Upstart always provides restart functionality so we don't need to mimic it with stop/sleep/start.
144
+ # Older versions of upstart would fail on restart if the service was currently stopped, check for that. LP:430883
145
+ else @new_resource.supports[:restart]
146
+ if @current_resource.running
147
+ run_command_with_systems_locale(:command => "/sbin/restart #{@new_resource.service_name}")
148
+ else
149
+ start_service
150
+ end
151
+ end
152
+ end
153
+
154
+ def reload_service
155
+ if @new_resource.reload_command
156
+ super
157
+ else
158
+ # upstart >= 0.6.3-4 supports reload (HUP)
159
+ run_command_with_systems_locale(:command => "/sbin/reload #{@new_resource.service_name}")
160
+ end
161
+ end
162
+
163
+ # https://bugs.launchpad.net/upstart/+bug/94065
164
+
165
+ def enable_service
166
+ Chef::Log.debug("#{@new_resource} upstart lacks inherent support for enabling services, editing job config file")
167
+ conf = Chef::Util::FileEdit.new("#{@upstart_job_dir}/#{@new_resource.service_name}#{@upstart_conf_suffix}")
168
+ conf.search_file_replace(/^#start on/, "start on")
169
+ conf.write_file
170
+ end
171
+
172
+ def disable_service
173
+ Chef::Log.debug("#{@new_resource} upstart lacks inherent support for disabling services, editing job config file")
174
+ conf = Chef::Util::FileEdit.new("#{@upstart_job_dir}/#{@new_resource.service_name}#{@upstart_conf_suffix}")
175
+ conf.search_file_replace(/^start on/, "#start on")
176
+ conf.write_file
177
+ end
178
+
179
+ def upstart_state
180
+ command = "/sbin/status #{@new_resource.service_name}"
181
+ status = popen4(command) do |pid, stdin, stdout, stderr|
182
+ stdout.each_line do |line|
183
+ # rsyslog stop/waiting
184
+ # service goal/state
185
+ # OR
186
+ # rsyslog (stop) waiting
187
+ # service (goal) state
188
+ line =~ UPSTART_STATE_FORMAT
189
+ data = Regexp.last_match
190
+ return data[2]
191
+ end
192
+ end
193
+ end
194
+
195
+ end
196
+ end
197
+ end
198
+ 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 "#{@new_resource} 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 "#{@new_resource} 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