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,54 @@
1
+ #
2
+ # Author:: Cary Penniman (<cary@rightscale.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
+
21
+ class Provider
22
+
23
+ class Log
24
+
25
+ # Chef log provider, allows logging to chef's logs from recipes
26
+ class ChefLog < Chef::Provider
27
+
28
+ # No concept of a 'current' resource for logs, this is a no-op
29
+ #
30
+ # === Return
31
+ # true:: Always return true
32
+ def load_current_resource
33
+ true
34
+ end
35
+
36
+ # Write the log to Chef's log
37
+ #
38
+ # === Return
39
+ # true:: Always return true
40
+ def action_write
41
+ Chef::Log.send(@new_resource.level, @new_resource.name)
42
+ @new_resource.updated_by_last_action(true)
43
+ end
44
+
45
+ end
46
+
47
+ end
48
+
49
+ end
50
+
51
+ end
52
+
53
+
54
+
@@ -0,0 +1,91 @@
1
+ #
2
+ # Author:: Joe Williams (<joe@joetify.com>)
3
+ # Copyright:: Copyright (c) 2009 Joe Williams
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/shell_out'
21
+ require 'chef/provider'
22
+
23
+ class Chef
24
+ class Provider
25
+ class Mdadm < Chef::Provider
26
+
27
+ #include Chef::Mixin::Command
28
+ include Chef::Mixin::ShellOut
29
+
30
+ def popen4
31
+ raise Exception, "deprecated, bitches"
32
+ end
33
+
34
+ def load_current_resource
35
+ @current_resource = Chef::Resource::Mdadm.new(@new_resource.name)
36
+ @current_resource.raid_device(@new_resource.raid_device)
37
+ Chef::Log.debug("#{@new_resource} checking for software raid device #{@current_resource.raid_device}")
38
+
39
+ mdadm = shell_out!("mdadm --detail --scan")
40
+ exists = mdadm.stdout.include?(@new_resource.raid_device)
41
+ #exists = false
42
+ # popen4(command) do |pid, stdin, stdout, stderr|
43
+ # stdout.each do |line|
44
+ # if line.include? @new_resource.raid_device
45
+ # exists = true
46
+ # end
47
+ # end
48
+ # end
49
+ @current_resource.exists(exists)
50
+ end
51
+
52
+ def action_create
53
+ unless @current_resource.exists
54
+ command = "yes | mdadm --create #{@new_resource.raid_device} --chunk=#{@new_resource.chunk} --level #{@new_resource.level} --raid-devices #{@new_resource.devices.length} #{@new_resource.devices.join(" ")}"
55
+ Chef::Log.debug("#{@new_resource} mdadm command: #{command}")
56
+ #pid, stdin, stdout, stderr = popen4(command)
57
+ shell_out!(command)
58
+ Chef::Log.info("#{@new_resource} created raid device (#{@new_resource.raid_device})")
59
+ @new_resource.updated_by_last_action(true)
60
+ else
61
+ Chef::Log.debug("#{@new_resource} raid device already exists, skipping create (#{@new_resource.raid_device})")
62
+ end
63
+ end
64
+
65
+ def action_assemble
66
+ unless @current_resource.exists
67
+ command = "yes | mdadm --assemble #{@new_resource.raid_device} #{@new_resource.devices.join(" ")}"
68
+ Chef::Log.debug("#{@new_resource} mdadm command: #{command}")
69
+ shell_out!(command)
70
+ Chef::Log.info("#{@new_resource} assembled raid device (#{@new_resource.raid_device})")
71
+ @new_resource.updated_by_last_action(true)
72
+ else
73
+ Chef::Log.debug("#{@new_resource} raid device already exists, skipping assemble (#{@new_resource.raid_device})")
74
+ end
75
+ end
76
+
77
+ def action_stop
78
+ if @current_resource.exists
79
+ command = "yes | mdadm --stop #{@new_resource.raid_device}"
80
+ Chef::Log.debug("#{@new_resource} mdadm command: #{command}")
81
+ shell_out!(command)
82
+ Chef::Log.info("#{@new_resource} stopped raid device (#{@new_resource.raid_device})")
83
+ @new_resource.updated_by_last_action(true)
84
+ else
85
+ Chef::Log.debug("#{@new_resource} raid device doesn't exist (#{@new_resource.raid_device}) - not stopping")
86
+ end
87
+ end
88
+
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,114 @@
1
+ #
2
+ # Author:: Joshua Timberman (<joshua@opscode.com>)
3
+ # Copyright:: Copyright (c) 2009 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/log'
20
+ require 'chef/mixin/command'
21
+ require 'chef/provider'
22
+
23
+ class Chef
24
+ class Provider
25
+ class Mount < Chef::Provider
26
+
27
+ include Chef::Mixin::Command
28
+
29
+ def action_mount
30
+ unless @current_resource.mounted
31
+ status = $testrun || mount_fs()
32
+ if status
33
+ @new_resource.updated_by_last_action(true)
34
+ Chef::Log.info("#{@new_resource} mounted")
35
+ end
36
+ else
37
+ Chef::Log.debug("#{@new_resource} is already mounted")
38
+ end
39
+ end
40
+
41
+ def action_umount
42
+ if @current_resource.mounted
43
+ status = $testrun || umount_fs()
44
+ if status
45
+ @new_resource.updated_by_last_action(true)
46
+ Chef::Log.info("#{@new_resource} unmounted")
47
+ end
48
+ else
49
+ Chef::Log.debug("#{@new_resource} is already unmounted")
50
+ end
51
+ end
52
+
53
+ def action_remount
54
+ unless @new_resource.supports[:remount]
55
+ raise Chef::Exceptions::UnsupportedAction, "#{self.to_s} does not support :remount"
56
+ else
57
+ if @current_resource.mounted
58
+ status = $testrun || remount_fs()
59
+ if status
60
+ @new_resource.updated_by_last_action(true)
61
+ Chef::Log.info("#{@new_resource} remounted")
62
+ end
63
+ else
64
+ Chef::Log.debug("#{@new_resource} not mounted, nothing to remount")
65
+ end
66
+ end
67
+ end
68
+
69
+ def action_enable
70
+ unless @current_resource.enabled
71
+ status = $testrun || enable_fs
72
+ if status
73
+ @new_resource.updated_by_last_action(true)
74
+ Chef::Log.info("#{@new_resource} enabled")
75
+ else
76
+ Chef::Log.debug("#{@new_resource} already enabled")
77
+ end
78
+ end
79
+ end
80
+
81
+ def action_disable
82
+ if @current_resource.enabled
83
+ status = $testrun || disable_fs
84
+ if status
85
+ @new_resource.updated_by_last_action(true)
86
+ Chef::Log.info("#{@new_resource} disabled")
87
+ else
88
+ Chef::Log.debug("#{@new_resource} already disabled")
89
+ end
90
+ end
91
+ end
92
+
93
+ def mount_fs
94
+ raise Chef::Exceptions::UnsupportedAction, "#{self.to_s} does not support :mount"
95
+ end
96
+
97
+ def umount_fs
98
+ raise Chef::Exceptions::UnsupportedAction, "#{self.to_s} does not support :umount"
99
+ end
100
+
101
+ def remount_fs
102
+ raise Chef::Exceptions::UnsupportedAction, "#{self.to_s} does not support :remount"
103
+ end
104
+
105
+ def enable_fs
106
+ raise Chef::Exceptions::UnsupportedAction, "#{self.to_s} does not support :enable"
107
+ end
108
+
109
+ def disable_fs
110
+ raise Chef::Exceptions::UnsupportedAction, "#{self.to_s} does not support :disable"
111
+ end
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,240 @@
1
+ #
2
+ # Author:: Joshua Timberman (<joshua@opscode.com>)
3
+ # Copyright:: Copyright (c) 2009 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/mount'
20
+ require 'chef/log'
21
+ require 'chef/mixin/shell_out'
22
+
23
+ class Chef
24
+ class Provider
25
+ class Mount
26
+ class Mount < Chef::Provider::Mount
27
+ include Chef::Mixin::ShellOut
28
+
29
+ def initialize(new_resource, run_context)
30
+ super
31
+ @real_device = nil
32
+ end
33
+ attr_accessor :real_device
34
+
35
+ def load_current_resource
36
+ @current_resource = Chef::Resource::Mount.new(@new_resource.name)
37
+ @current_resource.mount_point(@new_resource.mount_point)
38
+ @current_resource.device(@new_resource.device)
39
+ mounted?
40
+ enabled?
41
+ end
42
+
43
+ def mountable?
44
+ # only check for existence of non-remote devices
45
+ if (device_should_exist? && !::File.exists?(device_real) )
46
+ raise Chef::Exceptions::Mount, "Device #{@new_resource.device} does not exist"
47
+ elsif( !::File.exists?(@new_resource.mount_point) )
48
+ raise Chef::Exceptions::Mount, "Mount point #{@new_resource.mount_point} does not exist"
49
+ end
50
+ return true
51
+ end
52
+
53
+ def enabled?
54
+ # Check to see if there is a entry in /etc/fstab. Last entry for a volume wins.
55
+ enabled = false
56
+ ::File.foreach("/etc/fstab") do |line|
57
+ case line
58
+ when /^[#\s]/
59
+ next
60
+ when /^#{device_fstab_regex}\s+#{Regexp.escape(@new_resource.mount_point)}\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/
61
+ enabled = true
62
+ @current_resource.fstype($1)
63
+ @current_resource.options($2)
64
+ @current_resource.dump($3.to_i)
65
+ @current_resource.pass($4.to_i)
66
+ Chef::Log.debug("Found mount #{device_fstab} to #{@new_resource.mount_point} in /etc/fstab")
67
+ next
68
+ when /^[\/\w]+\s+#{Regexp.escape(@new_resource.mount_point)}\s+/
69
+ enabled = false
70
+ Chef::Log.debug("Found conflicting mount point #{@new_resource.mount_point} in /etc/fstab")
71
+ end
72
+ end
73
+ @current_resource.enabled(enabled)
74
+ end
75
+
76
+ def mounted?
77
+ mounted = false
78
+ shell_out!("mount").stdout.each_line do |line|
79
+ case line
80
+ when /^#{device_mount_regex}\s+on\s+#{Regexp.escape(@new_resource.mount_point)}/
81
+ mounted = true
82
+ Chef::Log.debug("Special device #{device_logstring} mounted as #{@new_resource.mount_point}")
83
+ when /^([\/\w])+\son\s#{Regexp.escape(@new_resource.mount_point)}\s+/
84
+ mounted = false
85
+ Chef::Log.debug("Special device #{$~[1]} mounted as #{@new_resource.mount_point}")
86
+ end
87
+ end
88
+ @current_resource.mounted(mounted)
89
+ end
90
+
91
+ def mount_fs
92
+ unless @current_resource.mounted
93
+ mountable?
94
+ command = "mount -t #{@new_resource.fstype}"
95
+ command << " -o #{@new_resource.options.join(',')}" unless @new_resource.options.nil? || @new_resource.options.empty?
96
+ command << case @new_resource.device_type
97
+ when :device
98
+ " #{device_real}"
99
+ when :label
100
+ " -L #{@new_resource.device}"
101
+ when :uuid
102
+ " -U #{@new_resource.device}"
103
+ end
104
+ command << " #{@new_resource.mount_point}"
105
+ shell_out!(command)
106
+ Chef::Log.debug("#{@new_resource} is mounted at #{@new_resource.mount_point}")
107
+ else
108
+ Chef::Log.debug("#{@new_resource} is already mounted at #{@new_resource.mount_point}")
109
+ end
110
+ end
111
+
112
+ def umount_fs
113
+ if @current_resource.mounted
114
+ shell_out!("umount #{@new_resource.mount_point}")
115
+ Chef::Log.debug("#{@new_resource} is no longer mounted at #{@new_resource.mount_point}")
116
+ else
117
+ Chef::Log.debug("#{@new_resource} is not mounted at #{@new_resource.mount_point}")
118
+ end
119
+ end
120
+
121
+ def remount_fs
122
+ if @current_resource.mounted and @new_resource.supports[:remount]
123
+ shell_out!("mount -o remount #{@new_resource.mount_point}")
124
+ @new_resource.updated_by_last_action(true)
125
+ Chef::Log.debug("#{@new_resource} is remounted at #{@new_resource.mount_point}")
126
+ elsif @current_resource.mounted
127
+ umount_fs
128
+ sleep 1
129
+ mount_fs
130
+ else
131
+ Chef::Log.debug("#{@new_resource} is not mounted at #{@new_resource.mount_point} - nothing to do")
132
+ end
133
+ end
134
+
135
+ def enable_fs
136
+ if @current_resource.enabled && mount_options_unchanged?
137
+ Chef::Log.debug("#{@new_resource} is already enabled - nothing to do")
138
+ return nil
139
+ end
140
+
141
+ if @current_resource.enabled
142
+ # The current options don't match what we have, so
143
+ # disable, then enable.
144
+ disable_fs
145
+ end
146
+ ::File.open("/etc/fstab", "a") do |fstab|
147
+ fstab.puts("#{device_fstab} #{@new_resource.mount_point} #{@new_resource.fstype} #{@new_resource.options.nil? ? "defaults" : @new_resource.options.join(",")} #{@new_resource.dump} #{@new_resource.pass}")
148
+ Chef::Log.debug("#{@new_resource} is enabled at #{@new_resource.mount_point}")
149
+ end
150
+ end
151
+
152
+ def disable_fs
153
+ if @current_resource.enabled
154
+ contents = []
155
+
156
+ found = false
157
+ ::File.readlines("/etc/fstab").reverse_each do |line|
158
+ if !found && line =~ /^#{device_fstab_regex}\s+#{Regexp.escape(@new_resource.mount_point)}/
159
+ found = true
160
+ Chef::Log.debug("#{@new_resource} is removed from fstab")
161
+ next
162
+ else
163
+ contents << line
164
+ end
165
+ end
166
+
167
+ ::File.open("/etc/fstab", "w") do |fstab|
168
+ contents.reverse_each { |line| fstab.puts line}
169
+ end
170
+ else
171
+ Chef::Log.debug("#{@new_resource} is not enabled - nothing to do")
172
+ end
173
+ end
174
+
175
+ def device_should_exist?
176
+ @new_resource.device !~ /:/ && @new_resource.device !~ /\/\// && @new_resource.device != "tmpfs" && @new_resource.fstype != 'fuse'
177
+ end
178
+
179
+ private
180
+
181
+ def device_fstab
182
+ case @new_resource.device_type
183
+ when :device
184
+ @new_resource.device
185
+ when :label
186
+ "LABEL=#{@new_resource.device}"
187
+ when :uuid
188
+ "UUID=#{@new_resource.device}"
189
+ end
190
+ end
191
+
192
+ def device_real
193
+ if @real_device == nil
194
+ if @new_resource.device_type == :device
195
+ @real_device = @new_resource.device
196
+ else
197
+ @real_device = ""
198
+ status = popen4("/sbin/findfs #{device_fstab}") do |pid, stdin, stdout, stderr|
199
+ device_line = stdout.first # stdout.first consumes
200
+ @real_device = device_line.chomp unless device_line.nil?
201
+ end
202
+ end
203
+ end
204
+ @real_device
205
+ end
206
+
207
+ def device_logstring
208
+ case @new_resource.device_type
209
+ when :device
210
+ "#{device_real}"
211
+ when :label
212
+ "#{device_real} with label #{@new_resource.device}"
213
+ when :uuid
214
+ "#{device_real} with uuid #{@new_resource.device}"
215
+ end
216
+ end
217
+
218
+ def device_mount_regex
219
+ ::File.symlink?(device_real) ? "(?:#{Regexp.escape(device_real)})|(?:#{Regexp.escape(::File.readlink(device_real))})" : Regexp.escape(device_real)
220
+ end
221
+
222
+ def device_fstab_regex
223
+ if @new_resource.device_type == :device
224
+ device_mount_regex
225
+ else
226
+ device_fstab
227
+ end
228
+ end
229
+
230
+ def mount_options_unchanged?
231
+ @current_resource.fstype == @new_resource.fstype and
232
+ @current_resource.options == @new_resource.options and
233
+ @current_resource.dump == @new_resource.dump and
234
+ @current_resource.pass == @new_resource.pass
235
+ end
236
+
237
+ end
238
+ end
239
+ end
240
+ end