madscience 0.0.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 (151) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.madscience_gem_location +0 -0
  4. data/Cheffile +9 -0
  5. data/Cheffile.lock +34 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +9 -0
  8. data/README.md +126 -0
  9. data/Rakefile +1 -0
  10. data/TODO +17 -0
  11. data/bin/madscience +90 -0
  12. data/cookbooks/apt/CHANGELOG.md +183 -0
  13. data/cookbooks/apt/README.md +255 -0
  14. data/cookbooks/apt/attributes/default.rb +29 -0
  15. data/cookbooks/apt/files/default/apt-proxy-v2.conf +50 -0
  16. data/cookbooks/apt/libraries/helpers.rb +49 -0
  17. data/cookbooks/apt/libraries/matchers.rb +17 -0
  18. data/cookbooks/apt/libraries/network.rb +31 -0
  19. data/cookbooks/apt/metadata.json +54 -0
  20. data/cookbooks/apt/metadata.rb +34 -0
  21. data/cookbooks/apt/providers/preference.rb +63 -0
  22. data/cookbooks/apt/providers/repository.rb +150 -0
  23. data/cookbooks/apt/recipes/cacher-client.rb +81 -0
  24. data/cookbooks/apt/recipes/cacher-ng.rb +43 -0
  25. data/cookbooks/apt/recipes/default.rb +91 -0
  26. data/cookbooks/apt/resources/preference.rb +32 -0
  27. data/cookbooks/apt/resources/repository.rb +43 -0
  28. data/cookbooks/apt/templates/debian-6.0/acng.conf.erb +173 -0
  29. data/cookbooks/apt/templates/default/01proxy.erb +5 -0
  30. data/cookbooks/apt/templates/default/acng.conf.erb +275 -0
  31. data/cookbooks/apt/templates/ubuntu-10.04/acng.conf.erb +269 -0
  32. data/cookbooks/chef_handler/CHANGELOG.md +44 -0
  33. data/cookbooks/chef_handler/README.md +103 -0
  34. data/cookbooks/chef_handler/attributes/default.rb +30 -0
  35. data/cookbooks/chef_handler/files/default/handlers/README +1 -0
  36. data/cookbooks/chef_handler/libraries/matchers.rb +29 -0
  37. data/cookbooks/chef_handler/metadata.json +29 -0
  38. data/cookbooks/chef_handler/metadata.rb +7 -0
  39. data/cookbooks/chef_handler/providers/default.rb +97 -0
  40. data/cookbooks/chef_handler/recipes/default.rb +33 -0
  41. data/cookbooks/chef_handler/recipes/json_file.rb +28 -0
  42. data/cookbooks/chef_handler/resources/default.rb +34 -0
  43. data/cookbooks/dmg/CHANGELOG.md +75 -0
  44. data/cookbooks/dmg/README.md +143 -0
  45. data/cookbooks/dmg/attributes/default.rb +20 -0
  46. data/cookbooks/dmg/metadata.json +30 -0
  47. data/cookbooks/dmg/metadata.rb +9 -0
  48. data/cookbooks/dmg/providers/package.rb +91 -0
  49. data/cookbooks/dmg/recipes/default.rb +18 -0
  50. data/cookbooks/dmg/resources/package.rb +37 -0
  51. data/cookbooks/vagrant/Berksfile +2 -0
  52. data/cookbooks/vagrant/CHANGELOG.md +7 -0
  53. data/cookbooks/vagrant/README.md +146 -0
  54. data/cookbooks/vagrant/TESTING.md +25 -0
  55. data/cookbooks/vagrant/attributes/default.rb +22 -0
  56. data/cookbooks/vagrant/metadata.rb +14 -0
  57. data/cookbooks/vagrant/providers/plugin.rb +50 -0
  58. data/cookbooks/vagrant/recipes/debian.rb +9 -0
  59. data/cookbooks/vagrant/recipes/default.rb +34 -0
  60. data/cookbooks/vagrant/recipes/fedora.rb +1 -0
  61. data/cookbooks/vagrant/recipes/mac_os_x.rb +7 -0
  62. data/cookbooks/vagrant/recipes/rhel.rb +9 -0
  63. data/cookbooks/vagrant/recipes/uninstall_gem.rb +7 -0
  64. data/cookbooks/vagrant/recipes/windows.rb +5 -0
  65. data/cookbooks/vagrant/resources/plugin.rb +8 -0
  66. data/cookbooks/virtualbox/README.md +167 -0
  67. data/cookbooks/virtualbox/attributes/default.rb +32 -0
  68. data/cookbooks/virtualbox/attributes/user.rb +22 -0
  69. data/cookbooks/virtualbox/attributes/webportal.rb +22 -0
  70. data/cookbooks/virtualbox/attributes/webservice.rb +24 -0
  71. data/cookbooks/virtualbox/files/ubuntu/machines_enabled +1 -0
  72. data/cookbooks/virtualbox/files/ubuntu/vboxcontrol +104 -0
  73. data/cookbooks/virtualbox/libraries/helpers.rb +30 -0
  74. data/cookbooks/virtualbox/metadata.rb +16 -0
  75. data/cookbooks/virtualbox/recipes/default.rb +70 -0
  76. data/cookbooks/virtualbox/recipes/systemservice.rb +56 -0
  77. data/cookbooks/virtualbox/recipes/user.rb +39 -0
  78. data/cookbooks/virtualbox/recipes/webportal.rb +58 -0
  79. data/cookbooks/virtualbox/recipes/webservice.rb +44 -0
  80. data/cookbooks/virtualbox/templates/ubuntu/config.erb +3 -0
  81. data/cookbooks/virtualbox/templates/ubuntu/config.php.erb +183 -0
  82. data/cookbooks/virtualbox/templates/ubuntu/vbox.cfg.erb +51 -0
  83. data/cookbooks/windows/CHANGELOG.md +268 -0
  84. data/cookbooks/windows/README.md +665 -0
  85. data/cookbooks/windows/attributes/default.rb +23 -0
  86. data/cookbooks/windows/files/default/handlers/windows_reboot_handler.rb +76 -0
  87. data/cookbooks/windows/libraries/feature_base.rb +59 -0
  88. data/cookbooks/windows/libraries/matchers.rb +450 -0
  89. data/cookbooks/windows/libraries/powershell_helper.rb +59 -0
  90. data/cookbooks/windows/libraries/powershell_out.rb +79 -0
  91. data/cookbooks/windows/libraries/registry_helper.rb +357 -0
  92. data/cookbooks/windows/libraries/version.rb +206 -0
  93. data/cookbooks/windows/libraries/windows_architecture_helper.rb +86 -0
  94. data/cookbooks/windows/libraries/windows_helper.rb +88 -0
  95. data/cookbooks/windows/libraries/windows_privileged.rb +94 -0
  96. data/cookbooks/windows/metadata.json +31 -0
  97. data/cookbooks/windows/metadata.rb +9 -0
  98. data/cookbooks/windows/providers/auto_run.rb +32 -0
  99. data/cookbooks/windows/providers/batch.rb +62 -0
  100. data/cookbooks/windows/providers/feature_dism.rb +64 -0
  101. data/cookbooks/windows/providers/feature_powershell.rb +38 -0
  102. data/cookbooks/windows/providers/feature_servermanagercmd.rb +47 -0
  103. data/cookbooks/windows/providers/package.rb +252 -0
  104. data/cookbooks/windows/providers/pagefile.rb +153 -0
  105. data/cookbooks/windows/providers/path.rb +35 -0
  106. data/cookbooks/windows/providers/printer.rb +100 -0
  107. data/cookbooks/windows/providers/printer_port.rb +102 -0
  108. data/cookbooks/windows/providers/reboot.rb +31 -0
  109. data/cookbooks/windows/providers/registry.rb +72 -0
  110. data/cookbooks/windows/providers/shortcut.rb +56 -0
  111. data/cookbooks/windows/providers/task.rb +128 -0
  112. data/cookbooks/windows/providers/zipfile.rb +91 -0
  113. data/cookbooks/windows/recipes/default.rb +34 -0
  114. data/cookbooks/windows/recipes/reboot_handler.rb +32 -0
  115. data/cookbooks/windows/resources/auto_run.rb +30 -0
  116. data/cookbooks/windows/resources/batch.rb +36 -0
  117. data/cookbooks/windows/resources/feature.rb +44 -0
  118. data/cookbooks/windows/resources/package.rb +46 -0
  119. data/cookbooks/windows/resources/pagefile.rb +29 -0
  120. data/cookbooks/windows/resources/path.rb +28 -0
  121. data/cookbooks/windows/resources/printer.rb +41 -0
  122. data/cookbooks/windows/resources/printer_port.rb +40 -0
  123. data/cookbooks/windows/resources/reboot.rb +29 -0
  124. data/cookbooks/windows/resources/registry.rb +34 -0
  125. data/cookbooks/windows/resources/shortcut.rb +35 -0
  126. data/cookbooks/windows/resources/task.rb +50 -0
  127. data/cookbooks/windows/resources/zipfile.rb +33 -0
  128. data/cookbooks/yum/CHANGELOG.md +212 -0
  129. data/cookbooks/yum/README.md +268 -0
  130. data/cookbooks/yum/attributes/main.rb +97 -0
  131. data/cookbooks/yum/libraries/matchers.rb +27 -0
  132. data/cookbooks/yum/metadata.json +34 -0
  133. data/cookbooks/yum/metadata.rb +13 -0
  134. data/cookbooks/yum/providers/globalconfig.rb +37 -0
  135. data/cookbooks/yum/providers/repository.rb +85 -0
  136. data/cookbooks/yum/recipes/default.rb +34 -0
  137. data/cookbooks/yum/resources/globalconfig.rb +105 -0
  138. data/cookbooks/yum/resources/repository.rb +63 -0
  139. data/cookbooks/yum/templates/default/main.erb +251 -0
  140. data/cookbooks/yum/templates/default/repo.erb +109 -0
  141. data/lib/madscience/version.rb +3 -0
  142. data/lib/madscience.rb +5 -0
  143. data/madscience.gemspec +44 -0
  144. data/new_gem_version.rb +6 -0
  145. data/node-data.json +3 -0
  146. data/site-cookbooks/madscience-vagrant-cookbook/CHANGELOG.md +13 -0
  147. data/site-cookbooks/madscience-vagrant-cookbook/README.md +53 -0
  148. data/site-cookbooks/madscience-vagrant-cookbook/metadata.rb +17 -0
  149. data/site-cookbooks/madscience-vagrant-cookbook/recipes/default.rb +87 -0
  150. data/solo.rb +6 -0
  151. metadata +337 -0
@@ -0,0 +1,76 @@
1
+ #
2
+ # Author:: Seth Chisamore (<schisamo@opscode.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
+ class WindowsRebootHandler < Chef::Handler
20
+ include Chef::Mixin::ShellOut
21
+
22
+ def initialize(allow_pending_reboots = true, timeout = 60, reason = "Opscode Chef initiated reboot")
23
+ @allow_pending_reboots = allow_pending_reboots
24
+ @timeout = timeout
25
+ @reason = reason
26
+ end
27
+
28
+ def report
29
+ log_message, reboot = begin
30
+ if reboot_requested?
31
+ ["chef_handler[#{self.class}] requested reboot will occur in #{timeout} seconds", true]
32
+ elsif reboot_pending?
33
+ if @allow_pending_reboots
34
+ ["chef_handler[#{self.class}] reboot pending - automatic reboot will occur in #{timeout} seconds", true]
35
+ else
36
+ ["chef_handler[#{self.class}] reboot pending but handler not configured to act on pending reboots - please reboot node manually", false]
37
+ end
38
+ else
39
+ ["chef_handler[#{self.class}] no reboot requested or pending", false]
40
+ end
41
+ end
42
+
43
+ Chef::Log.warn(log_message)
44
+ shell_out!("shutdown /r /t #{timeout} /c \"#{reason}\"") if reboot
45
+ end
46
+
47
+ private
48
+ # reboot cause CHEF says so:
49
+ # reboot explicitly requested in our cookbook code
50
+ def reboot_requested?
51
+ node.run_state[:reboot_requested] == true
52
+ end
53
+
54
+ # reboot cause WIN says so:
55
+ # reboot pending because of some configuration action we performed
56
+ def reboot_pending?
57
+ # Any files listed here means reboot needed
58
+ (Registry.key_exists?('HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations') &&
59
+ Registry.get_value('HKLM\SYSTEM\CurrentControlSet\Control\Session Manager','PendingFileRenameOperations').any?) ||
60
+ # 1 for any value means reboot pending
61
+ # "9306cdfc-c4a1-4a22-9996-848cb67eddc3"=1
62
+ (Registry.key_exists?('HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired') &&
63
+ Registry.get_values('HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired').select{|v| v[2] == 1 }.any?) ||
64
+ # 1 or 2 for 'Flags' value means reboot pending
65
+ (Registry.key_exists?('HKLM\SOFTWARE\Microsoft\Updates\UpdateExeVolatile') &&
66
+ [1,2].include?(Registry::get_value('HKLM\SOFTWARE\Microsoft\Updates\UpdateExeVolatile','Flags')))
67
+ end
68
+
69
+ def timeout
70
+ node.run_state[:reboot_timeout] || node['windows']['reboot_timeout'] || @timeout
71
+ end
72
+
73
+ def reason
74
+ node.run_state[:reboot_reason] || @reason
75
+ end
76
+ end
@@ -0,0 +1,59 @@
1
+ class Chef
2
+ class Provider
3
+ class WindowsFeature
4
+ module Base
5
+
6
+ def action_install
7
+ unless installed?
8
+ install_feature(@new_resource.feature_name)
9
+ @new_resource.updated_by_last_action(true)
10
+ Chef::Log.info("#{@new_resource} installed feature")
11
+ else
12
+ Chef::Log.debug("#{@new_resource} is already installed - nothing to do")
13
+ end
14
+ end
15
+
16
+ def action_remove
17
+ if installed?
18
+ remove_feature(@new_resource.feature_name)
19
+ @new_resource.updated_by_last_action(true)
20
+ Chef::Log.info("#{@new_resource} removed")
21
+ else
22
+ Chef::Log.debug("#{@new_resource} feature does not exist - nothing to do")
23
+ end
24
+ end
25
+
26
+ def action_delete
27
+ if available?
28
+ delete_feature(@new_resource.feature_name)
29
+ @new_resource.updated_by_last_action(true)
30
+ Chef::Log.info("#{@new_resource} deleted")
31
+ else
32
+ Chef::Log.debug("#{@new_resource} feature is not installed - nothing to do")
33
+ end
34
+ end
35
+
36
+ def install_feature(name)
37
+ raise Chef::Exceptions::UnsupportedAction, "#{self.to_s} does not support :install"
38
+ end
39
+
40
+ def remove_feature(name)
41
+ raise Chef::Exceptions::UnsupportedAction, "#{self.to_s} does not support :remove"
42
+ end
43
+
44
+ def delete_feature(name)
45
+ raise Chef::Exceptions::UnsupportedAction, "#{self.to_s} does not support :delete"
46
+ end
47
+
48
+ def installed?
49
+ raise Chef::Exceptions::Override, "You must override installed? in #{self.to_s}"
50
+ end
51
+
52
+ def available?
53
+ raise Chef::Exceptions::Override, "You must override available? in #{self.to_s}"
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+
@@ -0,0 +1,450 @@
1
+ if defined?(ChefSpec)
2
+
3
+ #
4
+ # Assert that a +windows_package+ resource exists in the Chef run with the
5
+ # action +:install+. Given a Chef Recipe that installs "Node.js" as a
6
+ # +windows_package+:
7
+ #
8
+ # windows_package 'Node.js' do
9
+ # source 'http://nodejs.org/dist/v0.10.26/x64/node-v0.10.26-x64.msi'
10
+ # action :install
11
+ # end
12
+ #
13
+ # The Examples section demonstrates the different ways to test a
14
+ # +windows_package+ resource with ChefSpec.
15
+ #
16
+ # @example Assert that a +windows_package+ was installed
17
+ # expect(chef_run).to install_windows_package('Node.js')
18
+ #
19
+ # @example Assert that a +windows_package+ was _not_ installed
20
+ # expect(chef_run).to_not install_windows_package('7-zip')
21
+ #
22
+ #
23
+ # @param [String, Regex] resource_name
24
+ # the name of the resource to match
25
+ #
26
+ # @return [ChefSpec::Matchers::ResourceMatcher]
27
+ #
28
+ def install_windows_package(resource_name)
29
+ ChefSpec::Matchers::ResourceMatcher.new(:windows_package, :install, resource_name)
30
+ end
31
+
32
+ #
33
+ # Assert that a +windows_package+ resource exists in the Chef run with the
34
+ # action +:remove+. Given a Chef Recipe that removes "Node.js" as a
35
+ # +windows_package+:
36
+ #
37
+ # windows_package 'Node.js' do
38
+ # action :remove
39
+ # end
40
+ #
41
+ # The Examples section demonstrates the different ways to test a
42
+ # +windows_package+ resource with ChefSpec.
43
+ #
44
+ # @example Assert that a +windows_package+ was installed
45
+ # expect(chef_run).to remove_windows_package('Node.js')
46
+ #
47
+ # @example Assert that a +windows_package+ was _not_ removed
48
+ # expect(chef_run).to_not remove_windows_package('7-zip')
49
+ #
50
+ #
51
+ # @param [String, Regex] resource_name
52
+ # the name of the resource to match
53
+ #
54
+ # @return [ChefSpec::Matchers::ResourceMatcher]
55
+ #
56
+ def remove_windows_package(resource_name)
57
+ ChefSpec::Matchers::ResourceMatcher.new(:windows_package, :remove, resource_name)
58
+ end
59
+
60
+
61
+
62
+ #
63
+ # Assert that a +windows_feature+ resource exists in the Chef run with the
64
+ # action +:install+. Given a Chef Recipe that installs "NetFX3" as a
65
+ # +windows_feature+:
66
+ #
67
+ # windows_feature 'NetFX3' do
68
+ # action :install
69
+ # end
70
+ #
71
+ # The Examples section demonstrates the different ways to test a
72
+ # +windows_feature+ resource with ChefSpec.
73
+ #
74
+ # @example Assert that a +windows_feature+ was installed
75
+ # expect(chef_run).to install_windows_feature('NetFX3')
76
+ #
77
+ # @example Assert that a +windows_feature+ was _not_ installed
78
+ # expect(chef_run).to_not install_windows_feature('NetFX3')
79
+ #
80
+ #
81
+ # @param [String, Regex] resource_name
82
+ # the name of the resource to match
83
+ #
84
+ # @return [ChefSpec::Matchers::ResourceMatcher]
85
+ #
86
+ def install_windows_feature(resource_name)
87
+ ChefSpec::Matchers::ResourceMatcher.new(:windows_feature, :install, resource_name)
88
+ end
89
+
90
+ #
91
+ # Assert that a +windows_feature+ resource exists in the Chef run with the
92
+ # action +:remove+. Given a Chef Recipe that removes "NetFX3" as a
93
+ # +windows_feature+:
94
+ #
95
+ # windows_feature 'NetFX3' do
96
+ # action :remove
97
+ # end
98
+ #
99
+ # The Examples section demonstrates the different ways to test a
100
+ # +windows_feature+ resource with ChefSpec.
101
+ #
102
+ # @example Assert that a +windows_feature+ was removed
103
+ # expect(chef_run).to remove_windows_feature('NetFX3')
104
+ #
105
+ #
106
+ # @param [String, Regex] resource_name
107
+ # the name of the resource to match
108
+ #
109
+ # @return [ChefSpec::Matchers::ResourceMatcher]
110
+ #
111
+ def remove_windows_feature(resource_name)
112
+ ChefSpec::Matchers::ResourceMatcher.new(:windows_feature, :remove, resource_name)
113
+ end
114
+
115
+ #
116
+ # Assert that a +windows_feature+ resource exists in the Chef run with the
117
+ # action +:delete+. Given a Chef Recipe that deletes "NetFX3" as a
118
+ # +windows_feature+:
119
+ #
120
+ # windows_feature 'NetFX3' do
121
+ # action :delete
122
+ # end
123
+ #
124
+ # The Examples section demonstrates the different ways to test a
125
+ # +windows_feature+ resource with ChefSpec.
126
+ #
127
+ # @example Assert that a +windows_feature+ was deleted
128
+ # expect(chef_run).to delete_windows_feature('NetFX3')
129
+ #
130
+ #
131
+ # @param [String, Regex] resource_name
132
+ # the name of the resource to match
133
+ #
134
+ # @return [ChefSpec::Matchers::ResourceMatcher]
135
+ #
136
+ def delete_windows_feature(resource_name)
137
+ ChefSpec::Matchers::ResourceMatcher.new(:windows_feature, :delete, resource_name)
138
+ end
139
+
140
+
141
+
142
+ #
143
+ # Assert that a +windows_task+ resource exists in the Chef run with the
144
+ # action +:create+. Given a Chef Recipe that creates "mytask" as a
145
+ # +windows_task+:
146
+ #
147
+ # windows_task 'mytask' do
148
+ # command 'mybatch.bat'
149
+ # action :create
150
+ # end
151
+ #
152
+ # The Examples section demonstrates the different ways to test a
153
+ # +windows_task+ resource with ChefSpec.
154
+ #
155
+ # @example Assert that a +windows_task+ was created
156
+ # expect(chef_run).to create_windows_task('mytask')
157
+ #
158
+ #
159
+ # @param [String, Regex] resource_name
160
+ # the name of the resource to match
161
+ #
162
+ # @return [ChefSpec::Matchers::ResourceMatcher]
163
+ #
164
+ def create_windows_task(resource_name)
165
+ ChefSpec::Matchers::ResourceMatcher.new(:windows_task, :create, resource_name)
166
+ end
167
+
168
+ #
169
+ # Assert that a +windows_task+ resource exists in the Chef run with the
170
+ # action +:delete+. Given a Chef Recipe that deletes "mytask" as a
171
+ # +windows_task+:
172
+ #
173
+ # windows_task 'mytask' do
174
+ # action :delete
175
+ # end
176
+ #
177
+ # The Examples section demonstrates the different ways to test a
178
+ # +windows_task+ resource with ChefSpec.
179
+ #
180
+ # @example Assert that a +windows_task+ was deleted
181
+ # expect(chef_run).to delete_windows_task('mytask')
182
+ #
183
+ #
184
+ # @param [String, Regex] resource_name
185
+ # the name of the resource to match
186
+ #
187
+ # @return [ChefSpec::Matchers::ResourceMatcher]
188
+ #
189
+ def delete_windows_task(resource_name)
190
+ ChefSpec::Matchers::ResourceMatcher.new(:windows_task, :delete, resource_name)
191
+ end
192
+
193
+ #
194
+ # Assert that a +windows_task+ resource exists in the Chef run with the
195
+ # action +:run+. Given a Chef Recipe that runs "mytask" as a
196
+ # +windows_task+:
197
+ #
198
+ # windows_task 'mytask' do
199
+ # action :run
200
+ # end
201
+ #
202
+ # The Examples section demonstrates the different ways to test a
203
+ # +windows_task+ resource with ChefSpec.
204
+ #
205
+ # @example Assert that a +windows_task+ was run
206
+ # expect(chef_run).to run_windows_task('mytask')
207
+ #
208
+ #
209
+ # @param [String, Regex] resource_name
210
+ # the name of the resource to match
211
+ #
212
+ # @return [ChefSpec::Matchers::ResourceMatcher]
213
+ #
214
+ def run_windows_task(resource_name)
215
+ ChefSpec::Matchers::ResourceMatcher.new(:windows_task, :run, resource_name)
216
+ end
217
+
218
+ #
219
+ # Assert that a +windows_task+ resource exists in the Chef run with the
220
+ # action +:change+. Given a Chef Recipe that changes "mytask" as a
221
+ # +windows_task+:
222
+ #
223
+ # windows_task 'mytask' do
224
+ # action :change
225
+ # end
226
+ #
227
+ # The Examples section demonstrates the different ways to test a
228
+ # +windows_task+ resource with ChefSpec.
229
+ #
230
+ # @example Assert that a +windows_task+ was changed
231
+ # expect(chef_run).to change_windows_task('mytask')
232
+ #
233
+ #
234
+ # @param [String, Regex] resource_name
235
+ # the name of the resource to match
236
+ #
237
+ # @return [ChefSpec::Matchers::ResourceMatcher]
238
+ #
239
+ def change_windows_task(resource_name)
240
+ ChefSpec::Matchers::ResourceMatcher.new(:windows_task, :change, resource_name)
241
+ end
242
+
243
+
244
+
245
+ #
246
+ # Assert that a +windows_path+ resource exists in the Chef run with the
247
+ # action +:add+. Given a Chef Recipe that adds "C:\7-Zip" to the Windows
248
+ # PATH env var
249
+ #
250
+ # windows_path 'C:\7-Zip' do
251
+ # action :add
252
+ # end
253
+ #
254
+ # The Examples section demonstrates the different ways to test a
255
+ # +windows_path+ resource with ChefSpec.
256
+ #
257
+ # @example Assert that a +windows_path+ was added
258
+ # expect(chef_run).to add_windows_path('C:\7-Zip')
259
+ #
260
+ #
261
+ # @param [String, Regex] resource_name
262
+ # the name of the resource to match
263
+ #
264
+ # @return [ChefSpec::Matchers::ResourceMatcher]
265
+ #
266
+ def add_windows_path(resource_name)
267
+ ChefSpec::Matchers::ResourceMatcher.new(:windows_path, :add, resource_name)
268
+ end
269
+
270
+ #
271
+ # Assert that a +windows_path+ resource exists in the Chef run with the
272
+ # action +:remove+. Given a Chef Recipe that removes "C:\7-Zip" from the
273
+ # Windows PATH env var
274
+ #
275
+ # windows_path 'C:\7-Zip' do
276
+ # action :remove
277
+ # end
278
+ #
279
+ # The Examples section demonstrates the different ways to test a
280
+ # +windows_path+ resource with ChefSpec.
281
+ #
282
+ # @example Assert that a +windows_path+ was removed
283
+ # expect(chef_run).to remove_windows_path('C:\7-Zip')
284
+ #
285
+ #
286
+ # @param [String, Regex] resource_name
287
+ # the name of the resource to match
288
+ #
289
+ # @return [ChefSpec::Matchers::ResourceMatcher]
290
+ #
291
+ def remove_windows_path(resource_name)
292
+ ChefSpec::Matchers::ResourceMatcher.new(:windows_path, :remove, resource_name)
293
+ end
294
+
295
+
296
+
297
+ #
298
+ # Assert that a +windows_batch+ resource exists in the Chef run with the
299
+ # action +:run+. Given a Chef Recipe that runs a batch script
300
+ #
301
+ # windows_batch "unzip_and_move_ruby" do
302
+ # code <<-EOH
303
+ # 7z.exe x #{Chef::Config[:file_cache_path]}/ruby-1.8.7-p352-i386-mingw32.7z
304
+ # -oC:\\source -r -y
305
+ # xcopy C:\\source\\ruby-1.8.7-p352-i386-mingw32 C:\\ruby /e /y
306
+ # EOH
307
+ # end
308
+ #
309
+ # The Examples section demonstrates the different ways to test a
310
+ # +windows_path+ resource with ChefSpec.
311
+ #
312
+ # @example Assert that a +windows_path+ was removed
313
+ # expect(chef_run).to run_windows_batch('unzip_and_move_ruby')
314
+ #
315
+ #
316
+ # @param [String, Regex] resource_name
317
+ # the name of the resource to match
318
+ #
319
+ # @return [ChefSpec::Matchers::ResourceMatcher]
320
+ #
321
+ def run_windows_batch(resource_name)
322
+ ChefSpec::Matchers::ResourceMatcher.new(:windows_batch, :run, resource_name)
323
+ end
324
+
325
+
326
+
327
+ #
328
+ # Assert that a +windows_pagefile+ resource exists in the Chef run with the
329
+ # action +:set+. Given a Chef Recipe that sets a pagefile
330
+ #
331
+ # windows_pagefile "pagefile" do
332
+ # system_managed true
333
+ # initial_size 1024
334
+ # maximum_size 4096
335
+ # end
336
+ #
337
+ # The Examples section demonstrates the different ways to test a
338
+ # +windows_pagefile+ resource with ChefSpec.
339
+ #
340
+ # @example Assert that a +windows_pagefile+ was set
341
+ # expect(chef_run).to set_windows_pagefile('pagefile').with(
342
+ # initial_size: 1024)
343
+ #
344
+ #
345
+ # @param [String, Regex] resource_name
346
+ # the name of the resource to match
347
+ #
348
+ # @return [ChefSpec::Matchers::ResourceMatcher]
349
+ #
350
+ def set_windows_pagefile(resource_name)
351
+ ChefSpec::Matchers::ResourceMatcher.new(:windows_pagefile, :set, resource_name)
352
+ end
353
+
354
+
355
+
356
+ #
357
+ # Assert that a +windows_zipfile+ resource exists in the Chef run with the
358
+ # action +:unzip+. Given a Chef Recipe that extracts "SysinternalsSuite.zip"
359
+ # to c:/bin
360
+ #
361
+ # windows_zipfile "c:/bin" do
362
+ # source "http://download.sysinternals.com/Files/SysinternalsSuite.zip"
363
+ # action :unzip
364
+ # not_if {::File.exists?("c:/bin/PsExec.exe")}
365
+ # end
366
+ #
367
+ # The Examples section demonstrates the different ways to test a
368
+ # +windows_zipfile+ resource with ChefSpec.
369
+ #
370
+ # @example Assert that a +windows_zipfile+ was unzipped
371
+ # expect(chef_run).to unzip_windows_zipfile_to('c:/bin')
372
+ #
373
+ #
374
+ # @param [String, Regex] resource_name
375
+ # the name of the resource to match
376
+ #
377
+ # @return [ChefSpec::Matchers::ResourceMatcher]
378
+ #
379
+ def unzip_windows_zipfile_to(resource_name)
380
+ ChefSpec::Matchers::ResourceMatcher.new(:windows_zipfile, :unzip, resource_name)
381
+ end
382
+
383
+ #
384
+ # Assert that a +windows_zipfile+ resource exists in the Chef run with the
385
+ # action +:zip+. Given a Chef Recipe that zips "c:/src"
386
+ # to c:/code.zip
387
+ #
388
+ # windows_zipfile "c:/code.zip" do
389
+ # source "c:/src"
390
+ # action :zip
391
+ # end
392
+ #
393
+ # The Examples section demonstrates the different ways to test a
394
+ # +windows_zipfile+ resource with ChefSpec.
395
+ #
396
+ # @example Assert that a +windows_zipfile+ was zipped
397
+ # expect(chef_run).to zip_windows_zipfile_to('c:/code.zip')
398
+ #
399
+ #
400
+ # @param [String, Regex] resource_name
401
+ # the name of the resource to match
402
+ #
403
+ # @return [ChefSpec::Matchers::ResourceMatcher]
404
+ #
405
+ def zip_windows_zipfile_to(resource_name)
406
+ ChefSpec::Matchers::ResourceMatcher.new(:windows_zipfile, :zip, resource_name)
407
+ end
408
+
409
+
410
+ # All the other less commonly used LWRPs
411
+ def create_windows_shortcut(resource_name)
412
+ ChefSpec::Matchers::ResourceMatcher.new(:windows_shortcut, :create, resource_name)
413
+ end
414
+
415
+ def create_windows_auto_run(resource_name)
416
+ ChefSpec::Matchers::ResourceMatcher.new(:windows_auto_run, :create, resource_name)
417
+ end
418
+
419
+ def remove_windows_auto_run(resource_name)
420
+ ChefSpec::Matchers::ResourceMatcher.new(:windows_auto_run, :remove, resource_name)
421
+ end
422
+
423
+ def create_windows_printer(resource_name)
424
+ ChefSpec::Matchers::ResourceMatcher.new(:windows_printer, :create, resource_name)
425
+ end
426
+
427
+ def delete_windows_printer(resource_name)
428
+ ChefSpec::Matchers::ResourceMatcher.new(:windows_printer, :delete, resource_name)
429
+ end
430
+
431
+ def create_windows_printer_port(resource_name)
432
+ ChefSpec::Matchers::ResourceMatcher.new(:windows_printer_port, :create, resource_name)
433
+ end
434
+
435
+ def delete_windows_printer_port(resource_name)
436
+ ChefSpec::Matchers::ResourceMatcher.new(:windows_printer_port, :delete, resource_name)
437
+ end
438
+
439
+ def request_windows_reboot(resource_name)
440
+ ChefSpec::Matchers::ResourceMatcher.new(:windows_reboot, :request, resource_name)
441
+ end
442
+
443
+ def cancel_windows_reboot(resource_name)
444
+ ChefSpec::Matchers::ResourceMatcher.new(:windows_reboot, :cancel, resource_name)
445
+ end
446
+
447
+ def create_windows_shortcut(resource_name)
448
+ ChefSpec::Matchers::ResourceMatcher.new(:windows_shortcut, :create, resource_name)
449
+ end
450
+ end
@@ -0,0 +1,59 @@
1
+ #
2
+ # Author:: Seth Chisamore (<schisamo@opscode.com>)
3
+ # Cookbook Name:: windows
4
+ # Library:: helper
5
+ #
6
+ # Copyright:: 2011, Opscode, Inc.
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/mixin/shell_out'
22
+
23
+ module Powershell
24
+ module Helper
25
+ include Chef::Mixin::ShellOut
26
+
27
+ def powershell_installed?
28
+ !powershell_version.nil?
29
+ end
30
+
31
+ def interpreter
32
+ # force 64-bit powershell from 32-bit ruby process
33
+ if ::File.exist?("#{ENV['WINDIR']}\\sysnative\\WindowsPowershell\\v1.0\\powershell.exe")
34
+ "#{ENV['WINDIR']}\\sysnative\\WindowsPowershell\\v1.0\\powershell.exe"
35
+ elsif ::File.exist?("#{ENV['WINDIR']}\\system32\\WindowsPowershell\\v1.0\\powershell.exe")
36
+ "#{ENV['WINDIR']}\\system32\\WindowsPowershell\\v1.0\\powershell.exe"
37
+ else
38
+ "powershell.exe"
39
+ end
40
+ end
41
+
42
+ def powershell_version
43
+ begin
44
+ cmd = shell_out("#{interpreter} -InputFormat none -Command \"& echo $PSVersionTable.psversion.major\"")
45
+ if cmd.stdout.empty? # PowerShell 1.0 doesn't have a $PSVersionTable
46
+ 1
47
+ else
48
+ if cmd.stdout =~ /^(\d+)/
49
+ $1.to_i
50
+ else
51
+ nil
52
+ end
53
+ end
54
+ rescue Errno::ENOENT
55
+ nil
56
+ end
57
+ end
58
+ end
59
+ end