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,31 @@
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
+ class Chef
20
+ class Provider
21
+ class Breakpoint < Chef::Provider
22
+
23
+ def load_current_resource
24
+ end
25
+
26
+ def action_break
27
+ end
28
+
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,100 @@
1
+ #
2
+ # Author:: Daniel DeLeo (<dan@opscode.com>)
3
+ # Copyright:: Copyright (c) 2010 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'chef/file_access_control'
20
+ require 'chef/provider/file'
21
+ require 'tempfile'
22
+
23
+ class Chef
24
+ class Provider
25
+ class CookbookFile < Chef::Provider::File
26
+
27
+ def load_current_resource
28
+ @current_resource = Chef::Resource::CookbookFile.new(@new_resource.name)
29
+ @new_resource.path.gsub!(/\\/, "/") # for Windows
30
+ @current_resource.path(@new_resource.path)
31
+ @current_resource
32
+ end
33
+
34
+ def action_create
35
+ assert_enclosing_directory_exists!
36
+ if file_cache_location && content_stale?
37
+ Chef::Log.debug("#{@new_resource} has new contents")
38
+ backup_new_resource
39
+ Tempfile.open(::File.basename(@new_resource.name)) do |staging_file|
40
+ Chef::Log.debug("#{@new_resource} staging #{file_cache_location} to #{staging_file.path}")
41
+ staging_file.close
42
+ stage_file_to_tmpdir(staging_file.path)
43
+ FileUtils.mv(staging_file.path, @new_resource.path)
44
+ end
45
+ Chef::Log.info("#{@new_resource} created file #{@new_resource.path}")
46
+ @new_resource.updated_by_last_action(true)
47
+ else
48
+ set_all_access_controls(@new_resource.path)
49
+ end
50
+ @new_resource.updated_by_last_action?
51
+ end
52
+
53
+ def action_create_if_missing
54
+ if ::File.exists?(@new_resource.path)
55
+ Chef::Log.debug("#{@new_resource} exists at #{@new_resource.path} taking no action.")
56
+ else
57
+ action_create
58
+ end
59
+ end
60
+
61
+ def file_cache_location
62
+ @file_cache_location ||= begin
63
+ cookbook = run_context.cookbook_collection[resource_cookbook]
64
+ cookbook.preferred_filename_on_disk_location(node, :files, @new_resource.source, @new_resource.path)
65
+ end
66
+ end
67
+
68
+ # Determine the cookbook to get the file from. If new resource sets an
69
+ # explicit cookbook, use it, otherwise fall back to the implicit cookbook
70
+ # i.e., the cookbook the resource was declared in.
71
+ def resource_cookbook
72
+ @new_resource.cookbook || @new_resource.cookbook_name
73
+ end
74
+
75
+ # Copy the file from the cookbook cache to a temporary location and then
76
+ # set its file access control settings.
77
+ def stage_file_to_tmpdir(staging_file_location)
78
+ FileUtils.cp(file_cache_location, staging_file_location)
79
+ set_all_access_controls(staging_file_location)
80
+ end
81
+
82
+ def set_all_access_controls(file)
83
+ access_controls = Chef::FileAccessControl.new(@new_resource, file)
84
+ access_controls.set_all
85
+ @new_resource.updated_by_last_action(access_controls.modified?)
86
+ end
87
+
88
+ def backup_new_resource
89
+ if ::File.exists?(@new_resource.path)
90
+ backup @new_resource.path
91
+ end
92
+ end
93
+
94
+ def content_stale?
95
+ ( ! ::File.exist?(@new_resource.path)) || ( ! compare_content)
96
+ end
97
+
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,186 @@
1
+ #
2
+ # Author:: Bryan McLellan (btm@loftninjas.org)
3
+ # Copyright:: Copyright (c) 2009 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/log'
20
+ require 'chef/mixin/command'
21
+ require 'chef/provider'
22
+
23
+ class Chef
24
+ class Provider
25
+ class Cron < Chef::Provider
26
+ include Chef::Mixin::Command
27
+
28
+ CRON_PATTERN = /([-0-9*,\/]+)\s([-0-9*,\/]+)\s([-0-9*,\/]+)\s([-0-9*,\/]+)\s([-0-9*,\/]+)\s(.*)/
29
+
30
+ def initialize(new_resource, run_context)
31
+ super(new_resource, run_context)
32
+ @cron_exists = false
33
+ @cron_empty = false
34
+ end
35
+ attr_accessor :cron_exists, :cron_empty
36
+
37
+ def load_current_resource
38
+ crontab_lines = []
39
+ @current_resource = Chef::Resource::Cron.new(@new_resource.name)
40
+ @current_resource.user(@new_resource.user)
41
+ status = popen4("crontab -l -u #{@new_resource.user}") do |pid, stdin, stdout, stderr|
42
+ stdout.each_line { |line| crontab_lines << line }
43
+ end
44
+ if status.exitstatus > 1
45
+ raise Chef::Exceptions::Cron, "Error determining state of #{@new_resource.name}, exit: #{status.exitstatus}"
46
+ elsif status.exitstatus == 0
47
+ cron_found = false
48
+ crontab_lines.each do |line|
49
+ case line.chomp
50
+ when "# Chef Name: #{@new_resource.name}"
51
+ Chef::Log.debug("Found cron '#{@new_resource.name}'")
52
+ cron_found = true
53
+ @cron_exists = true
54
+ next
55
+ when /^MAILTO=(\S*)/
56
+ @current_resource.mailto($1) if cron_found
57
+ next
58
+ when /^PATH=(\S*)/
59
+ @current_resource.path($1) if cron_found
60
+ next
61
+ when /^SHELL=(\S*)/
62
+ @current_resource.shell($1) if cron_found
63
+ next
64
+ when /^HOME=(\S*)/
65
+ @current_resource.home($1) if cron_found
66
+ next
67
+ when CRON_PATTERN
68
+ if cron_found
69
+ @current_resource.minute($1)
70
+ @current_resource.hour($2)
71
+ @current_resource.day($3)
72
+ @current_resource.month($4)
73
+ @current_resource.weekday($5)
74
+ @current_resource.command($6)
75
+ cron_found=false
76
+ end
77
+ next
78
+ else
79
+ next
80
+ end
81
+ end
82
+ Chef::Log.debug("Cron '#{@new_resource.name}' not found") unless @cron_exists
83
+ elsif status.exitstatus == 1
84
+ Chef::Log.debug("Cron empty for '#{@new_resource.user}'")
85
+ @cron_empty = true
86
+ end
87
+
88
+ @current_resource
89
+ end
90
+
91
+ def compare_cron
92
+ [ :minute, :hour, :day, :month, :weekday, :command, :mailto, :path, :shell, :home ].any? do |cron_var|
93
+ !@new_resource.send(cron_var).nil? && @new_resource.send(cron_var) != @current_resource.send(cron_var)
94
+ end
95
+ end
96
+
97
+ def action_create
98
+ crontab = String.new
99
+ newcron = String.new
100
+ cron_found = false
101
+
102
+ newcron << "# Chef Name: #{new_resource.name}\n"
103
+ [ :mailto, :path, :shell, :home ].each do |v|
104
+ newcron << "#{v.to_s.upcase}=#{@new_resource.send(v)}\n" if @new_resource.send(v)
105
+ end
106
+ newcron << "#{@new_resource.minute} #{@new_resource.hour} #{@new_resource.day} #{@new_resource.month} #{@new_resource.weekday} #{@new_resource.command}\n"
107
+
108
+ if @cron_exists
109
+ unless compare_cron
110
+ Chef::Log.debug("Skipping existing cron entry '#{@new_resource.name}'")
111
+ return
112
+ end
113
+ status = popen4("crontab -l -u #{@new_resource.user}") do |pid, stdin, stdout, stderr|
114
+ stdout.each_line do |line|
115
+ case line.chomp
116
+ when "# Chef Name: #{@new_resource.name}"
117
+ cron_found = true
118
+ next
119
+ when CRON_PATTERN
120
+ if cron_found
121
+ cron_found = false
122
+ crontab << newcron
123
+ next
124
+ end
125
+ else
126
+ next if cron_found
127
+ end
128
+ crontab << line
129
+ end
130
+ end
131
+
132
+ status = $testrun || popen4("crontab -u #{@new_resource.user} -", :waitlast => true) do |pid, stdin, stdout, stderr|
133
+ crontab.each_line { |line| stdin.puts "#{line}" }
134
+ end
135
+ Chef::Log.info("#{@new_resource} updated crontab entry")
136
+ @new_resource.updated_by_last_action(true)
137
+ else
138
+ unless @cron_empty
139
+ status = popen4("crontab -l -u #{@new_resource.user}") do |pid, stdin, stdout, stderr|
140
+ stdout.each { |line| crontab << line }
141
+ end
142
+ end
143
+
144
+ crontab << newcron
145
+
146
+ status = $testrun || popen4("crontab -u #{@new_resource.user} -", :waitlast => true) do |pid, stdin, stdout, stderr|
147
+ crontab.each_line { |line| stdin.puts "#{line}" }
148
+ end
149
+ Chef::Log.info("#{@new_resource} added crontab entry")
150
+ @new_resource.updated_by_last_action(true)
151
+ end
152
+ end
153
+
154
+ def action_delete
155
+ if @cron_exists
156
+ crontab = String.new
157
+ cron_found = false
158
+ status = popen4("crontab -l -u #{@new_resource.user}") do |pid, stdin, stdout, stderr|
159
+ stdout.each_line do |line|
160
+ case line.chomp
161
+ when "# Chef Name: #{@new_resource.name}"
162
+ cron_found = true
163
+ next
164
+ when CRON_PATTERN
165
+ if cron_found
166
+ cron_found = false
167
+ next
168
+ end
169
+ else
170
+ next if cron_found
171
+ end
172
+ crontab << line
173
+ end
174
+ end
175
+
176
+ status = $testrun || popen4("crontab -u #{@new_resource.user} -", :waitlast => true) do |pid, stdin, stdout, stderr|
177
+ crontab.each_line { |line| stdin.puts "#{line}" }
178
+ end
179
+ Chef::Log.info("#{@new_resource} deleted crontab entry")
180
+ @new_resource.updated_by_last_action(true)
181
+ end
182
+ end
183
+
184
+ end
185
+ end
186
+ end
@@ -0,0 +1,195 @@
1
+ #
2
+ # Author:: Bryan McLellan (btm@loftninjas.org)
3
+ # Author:: Toomas Pelberg (toomasp@gmx.net)
4
+ # Copyright:: Copyright (c) 2009 Bryan McLellan
5
+ # Copyright:: Copyright (c) 2010 Toomas Pelberg
6
+ # License:: Apache License, Version 2.0
7
+ #
8
+ # Licensed under the Apache License, Version 2.0 (the "License");
9
+ # you may not use this file except in compliance with the License.
10
+ # You may obtain a copy of the License at
11
+ #
12
+ # http://www.apache.org/licenses/LICENSE-2.0
13
+ #
14
+ # Unless required by applicable law or agreed to in writing, software
15
+ # distributed under the License is distributed on an "AS IS" BASIS,
16
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ # See the License for the specific language governing permissions and
18
+ # limitations under the License.
19
+ #
20
+
21
+ require 'chef/log'
22
+ require 'chef/mixin/command'
23
+ require 'chef/provider'
24
+
25
+ class Chef
26
+ class Provider
27
+ class Cron
28
+ class Solaris < Chef::Provider::Cron
29
+ include Chef::Mixin::Command
30
+
31
+ CRON_PATTERN = /([-0-9*,\/]+)\s([-0-9*,\/]+)\s([-0-9*,\/]+)\s([-0-9*,\/]+)\s([-0-9*,\/]+)\s(.*)/
32
+
33
+ def initialize(new_resource, run_context)
34
+ super(new_resource, run_context)
35
+ @cron_exists = false
36
+ @cron_empty = false
37
+ end
38
+ attr_accessor :cron_exists, :cron_empty
39
+
40
+ def load_current_resource
41
+ crontab_lines = []
42
+ @current_resource = Chef::Resource::Cron.new(@new_resource.name)
43
+ @current_resource.user(@new_resource.user)
44
+ status = popen4("crontab -l #{@new_resource.user}") do |pid, stdin, stdout, stderr|
45
+ stdout.each_line { |line| crontab_lines << line }
46
+ end
47
+ if status.exitstatus > 1
48
+ raise Chef::Exceptions::Cron, "Error determining state of #{@new_resource.name}, exit: #{status.exitstatus}"
49
+ elsif status.exitstatus == 0
50
+ cron_found = false
51
+ crontab_lines.each do |line|
52
+ case line.chomp
53
+ when "# Chef Name: #{@new_resource.name}"
54
+ Chef::Log.debug("#{@new_resource} found cron '#{@new_resource.name}'")
55
+ cron_found = true
56
+ @cron_exists = true
57
+ next
58
+ when /^MAILTO=(\S*)/
59
+ @current_resource.mailto($1) if cron_found
60
+ next
61
+ when /^PATH=(\S*)/
62
+ @current_resource.path($1) if cron_found
63
+ next
64
+ when /^SHELL=(\S*)/
65
+ @current_resource.shell($1) if cron_found
66
+ next
67
+ when /^HOME=(\S*)/
68
+ @current_resource.home($1) if cron_found
69
+ next
70
+ when CRON_PATTERN
71
+ if cron_found
72
+ @current_resource.minute($1)
73
+ @current_resource.hour($2)
74
+ @current_resource.day($3)
75
+ @current_resource.month($4)
76
+ @current_resource.weekday($5)
77
+ @current_resource.command($6)
78
+ cron_found=false
79
+ end
80
+ next
81
+ else
82
+ next
83
+ end
84
+ end
85
+ Chef::Log.debug("#{@new_resource} cron '#{@new_resource.name}' not found") unless @cron_exists
86
+ elsif status.exitstatus == 1
87
+ Chef::Log.debug("#{@new_resource} cron empty for '#{@new_resource.user}'")
88
+ @cron_empty = true
89
+ end
90
+
91
+ @current_resource
92
+ end
93
+
94
+ def compare_cron
95
+ [ :minute, :hour, :day, :month, :weekday, :command, :mailto, :path, :shell, :home ].any? do |cron_var|
96
+ !@new_resource.send(cron_var).nil? && @new_resource.send(cron_var) != @current_resource.send(cron_var)
97
+ end
98
+ end
99
+
100
+ def write_crontab(crontab)
101
+ tempcron = Tempfile.new("chef-cron")
102
+ tempcron << crontab
103
+ tempcron.flush
104
+ tempcron.chmod(0644)
105
+ status = run_command(:command => "/usr/bin/crontab #{tempcron.path}",:user => @new_resource.user)
106
+ if(status == 0)
107
+ @new_resource.updated_by_last_action(true)
108
+ else
109
+ @new_resource.updated_by_last_action(false)
110
+ end
111
+ tempcron.close!
112
+ return status
113
+ end
114
+
115
+ def action_create
116
+ crontab = String.new
117
+ newcron = String.new
118
+ cron_found = false
119
+
120
+ newcron << "# Chef Name: #{new_resource.name}\n"
121
+ [ :mailto, :path, :shell, :home ].each do |v|
122
+ newcron << "#{v.to_s.upcase}=#{@new_resource.send(v)}\n" if @new_resource.send(v)
123
+ end
124
+ newcron << "#{@new_resource.minute} #{@new_resource.hour} #{@new_resource.day} #{@new_resource.month} #{@new_resource.weekday} #{@new_resource.command}\n"
125
+
126
+ if @cron_exists
127
+ unless compare_cron
128
+ Chef::Log.debug("#{@new_resource} skipping existing cron entry '#{@new_resource.name}'")
129
+ return
130
+ end
131
+ status = popen4("crontab -l #{@new_resource.user}") do |pid, stdin, stdout, stderr|
132
+ stdout.each_line do |line|
133
+ case line.chomp
134
+ when "# Chef Name: #{@new_resource.name}"
135
+ cron_found = true
136
+ next
137
+ when CRON_PATTERN
138
+ if cron_found
139
+ cron_found = false
140
+ crontab << newcron
141
+ next
142
+ end
143
+ else
144
+ next if cron_found
145
+ end
146
+ crontab << line
147
+ end
148
+ end
149
+
150
+ status = write_crontab(crontab)
151
+ Chef::Log.info("#{@new_resource} updated crontab entry")
152
+ else
153
+ unless @cron_empty
154
+ status = popen4("crontab -l #{@new_resource.user}") do |pid, stdin, stdout, stderr|
155
+ stdout.each { |line| crontab << line }
156
+ end
157
+ end
158
+
159
+ crontab << newcron
160
+ status = write_crontab(crontab)
161
+ Chef::Log.info("#{@new_resource} added crontab entry")
162
+ end
163
+ end
164
+
165
+ def action_delete
166
+ if @cron_exists
167
+ crontab = String.new
168
+ cron_found = false
169
+ status = popen4("crontab -l #{@new_resource.user}") do |pid, stdin, stdout, stderr|
170
+ stdout.each_line do |line|
171
+ case line.chomp
172
+ when "# Chef Name: #{@new_resource.name}"
173
+ cron_found = true
174
+ next
175
+ when CRON_PATTERN
176
+ if cron_found
177
+ cron_found = false
178
+ next
179
+ end
180
+ else
181
+ next if cron_found
182
+ end
183
+ crontab << line
184
+ end
185
+ end
186
+
187
+ status = write_crontab(crontab)
188
+ Chef::Log.info("#{@new_resource} deleted crontab entry")
189
+ end
190
+ end
191
+
192
+ end
193
+ end
194
+ end
195
+ end