knife-windows 0.5.14 → 0.5.15

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.
@@ -1,68 +1,68 @@
1
- @rem
2
- @rem Author:: Seth Chisamore (<schisamo@opscode.com>)
3
- @rem Copyright:: Copyright (c) 2011 Opscode, Inc.
4
- @rem License:: Apache License, Version 2.0
5
- @rem
6
- @rem Licensed under the Apache License, Version 2.0 (the "License");
7
- @rem you may not use this file except in compliance with the License.
8
- @rem You may obtain a copy of the License at
9
- @rem
10
- @rem http://www.apache.org/licenses/LICENSE-2.0
11
- @rem
12
- @rem Unless required by applicable law or agreed to in writing, software
13
- @rem distributed under the License is distributed on an "AS IS" BASIS,
14
- @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- @rem See the License for the specific language governing permissions and
16
- @rem limitations under the License.
17
- @rem
18
-
19
- <%= "SETX HTTP_PROXY \"#{knife_config[:bootstrap_proxy]}\"" if knife_config[:bootstrap_proxy] %>
20
- mkdir C:\chef
21
-
22
- > C:\chef\wget.vbs (
23
- <%= win_wget %>
24
- )
25
-
26
- cscript /nologo C:\chef\wget.vbs /url:http://files.rubyforge.vm.bytemark.co.uk/rubyinstaller/rubyinstaller-1.8.7-p334.exe /path:%TEMP%\rubyinstaller.exe
27
- %TEMP%\rubyinstaller.exe /verysilent /dir="C:\ruby" /tasks="assocfiles,modpath"
28
-
29
- @rem Install the Ruby Dev Kit so we compile us some native gems
30
- cscript /nologo C:\chef\wget.vbs /url:http://cloud.github.com/downloads/oneclick/rubyinstaller/DevKit-tdm-32-4.5.1-20101214-1400-sfx.exe /path:%TEMP%\rubydevkit.exe
31
- mkdir C:\DevKit
32
- copy %TEMP%\rubydevkit.exe C:\DevKit
33
- cmd.exe /C C:\DevKit\rubydevkit.exe -y
34
-
35
- @rem update path during bootstrap session
36
- SET PATH=%PATH%;C:\ruby\bin
37
-
38
- cmd.exe /C ruby c:/DevKit/dk.rb init
39
- cmd.exe /C ruby c:/DevKit/dk.rb install
40
-
41
- cmd.exe /C gem install win32-api win32-service --platform=mswin32
42
- cmd.exe /C gem install win32-open3 rdp-ruby-wmi windows-api windows-pr --no-rdoc --no-ri --verbose
43
-
44
- @rem Install Chef gems separately to prevent 'failed to allocate memory' errors
45
- cmd.exe /C gem install ohai --no-rdoc --no-ri --verbose
46
- cmd.exe /C gem install chef --no-rdoc --no-ri --verbose <%= bootstrap_version_string %>
47
-
48
- > C:\chef\validation.pem (
49
- <%= validation_key %>
50
- )
51
-
52
- <% if @config[:encrypted_data_bag_secret] -%>
53
- > C:\chef\encrypted_data_bag_secret (
54
- <%= encrypted_data_bag_secret %>
55
- )
56
- <% end -%>
57
-
58
- > C:\chef\client.rb (
59
- echo.require 'win32ole'
60
- echo.WIN32OLE.codepage = WIN32OLE::CP_UTF8
61
- <%= config_content %>
62
- )
63
-
64
- > C:\chef\first-boot.json (
65
- <%= run_list %>
66
- )
67
-
68
- <%= start_chef %>
1
+ @rem
2
+ @rem Author:: Seth Chisamore (<schisamo@opscode.com>)
3
+ @rem Copyright:: Copyright (c) 2011 Opscode, Inc.
4
+ @rem License:: Apache License, Version 2.0
5
+ @rem
6
+ @rem Licensed under the Apache License, Version 2.0 (the "License");
7
+ @rem you may not use this file except in compliance with the License.
8
+ @rem You may obtain a copy of the License at
9
+ @rem
10
+ @rem http://www.apache.org/licenses/LICENSE-2.0
11
+ @rem
12
+ @rem Unless required by applicable law or agreed to in writing, software
13
+ @rem distributed under the License is distributed on an "AS IS" BASIS,
14
+ @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ @rem See the License for the specific language governing permissions and
16
+ @rem limitations under the License.
17
+ @rem
18
+
19
+ <%= "SETX HTTP_PROXY \"#{knife_config[:bootstrap_proxy]}\"" if knife_config[:bootstrap_proxy] %>
20
+ mkdir C:\chef
21
+
22
+ > C:\chef\wget.vbs (
23
+ <%= win_wget %>
24
+ )
25
+
26
+ cscript /nologo C:\chef\wget.vbs /url:http://files.rubyforge.vm.bytemark.co.uk/rubyinstaller/rubyinstaller-1.8.7-p334.exe /path:%TEMP%\rubyinstaller.exe
27
+ %TEMP%\rubyinstaller.exe /verysilent /dir="C:\ruby" /tasks="assocfiles,modpath"
28
+
29
+ @rem Install the Ruby Dev Kit so we compile us some native gems
30
+ cscript /nologo C:\chef\wget.vbs /url:http://cloud.github.com/downloads/oneclick/rubyinstaller/DevKit-tdm-32-4.5.1-20101214-1400-sfx.exe /path:%TEMP%\rubydevkit.exe
31
+ mkdir C:\DevKit
32
+ copy %TEMP%\rubydevkit.exe C:\DevKit
33
+ cmd.exe /C C:\DevKit\rubydevkit.exe -y
34
+
35
+ @rem update path during bootstrap session
36
+ SET PATH=%PATH%;C:\ruby\bin
37
+
38
+ cmd.exe /C ruby c:/DevKit/dk.rb init
39
+ cmd.exe /C ruby c:/DevKit/dk.rb install
40
+
41
+ cmd.exe /C gem install win32-api win32-service --platform=mswin32
42
+ cmd.exe /C gem install win32-open3 rdp-ruby-wmi windows-api windows-pr --no-rdoc --no-ri --verbose
43
+
44
+ @rem Install Chef gems separately to prevent failed to allocate memory errors
45
+ cmd.exe /C gem install ohai --no-rdoc --no-ri --verbose
46
+ cmd.exe /C gem install chef --no-rdoc --no-ri --verbose <%= bootstrap_version_string %>
47
+
48
+ > C:\chef\validation.pem (
49
+ <%= validation_key %>
50
+ )
51
+
52
+ <% if @config[:encrypted_data_bag_secret] -%>
53
+ > C:\chef\encrypted_data_bag_secret (
54
+ <%= encrypted_data_bag_secret %>
55
+ )
56
+ <% end -%>
57
+
58
+ > C:\chef\client.rb (
59
+ echo.require "win32ole"
60
+ echo.WIN32OLE.codepage = WIN32OLE::CP_UTF8
61
+ <%= config_content %>
62
+ )
63
+
64
+ > C:\chef\first-boot.json (
65
+ <%= run_list %>
66
+ )
67
+
68
+ <%= start_chef %>
@@ -1,196 +1,196 @@
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
- require 'chef/knife'
20
- require 'chef/encrypted_data_bag_item'
21
- require 'chef/knife/core/windows_bootstrap_context'
22
-
23
- class Chef
24
- class Knife
25
- module BootstrapWindowsBase
26
-
27
- # :nodoc:
28
- # Would prefer to do this in a rational way, but can't be done b/c of
29
- # Mixlib::CLI's design :(
30
- def self.included(includer)
31
- includer.class_eval do
32
-
33
- deps do
34
- require 'readline'
35
- require 'chef/json_compat'
36
- end
37
-
38
- option :chef_node_name,
39
- :short => "-N NAME",
40
- :long => "--node-name NAME",
41
- :description => "The Chef node name for your new node"
42
-
43
- option :prerelease,
44
- :long => "--prerelease",
45
- :description => "Install the pre-release chef gems"
46
-
47
- option :bootstrap_version,
48
- :long => "--bootstrap-version VERSION",
49
- :description => "The version of Chef to install",
50
- :proc => Proc.new { |v| Chef::Config[:knife][:bootstrap_version] = v }
51
-
52
- option :bootstrap_proxy,
53
- :long => "--bootstrap-proxy PROXY_URL",
54
- :description => "The proxy server for the node being bootstrapped",
55
- :proc => Proc.new { |p| Chef::Config[:knife][:bootstrap_proxy] = p }
56
-
57
- option :bootstrap_no_proxy,
58
- :long => "--bootstrap-no-proxy ",
59
- :description => "Avoid a proxy server for the given addresses",
60
- :proc => Proc.new { |np| Chef::Config[:knife][:bootstrap_no_proxy] = np }
61
-
62
- option :distro,
63
- :short => "-d DISTRO",
64
- :long => "--distro DISTRO",
65
- :description => "Bootstrap a distro using a template",
66
- :default => "windows-chef-client-msi"
67
-
68
- option :template_file,
69
- :long => "--template-file TEMPLATE",
70
- :description => "Full path to location of template to use",
71
- :default => false
72
-
73
- option :run_list,
74
- :short => "-r RUN_LIST",
75
- :long => "--run-list RUN_LIST",
76
- :description => "Comma separated list of roles/recipes to apply",
77
- :proc => lambda { |o| o.split(",") },
78
- :default => []
79
-
80
- option :first_boot_attributes,
81
- :short => "-j JSON_ATTRIBS",
82
- :long => "--json-attributes",
83
- :description => "A JSON string to be added to the first run of chef-client",
84
- :proc => lambda { |o| JSON.parse(o) },
85
- :default => {}
86
-
87
- option :encrypted_data_bag_secret,
88
- :short => "-s SECRET",
89
- :long => "--secret ",
90
- :description => "The secret key to use to decrypt data bag item values. Will be rendered on the node at c:/chef/encrypted_data_bag_secret and set in the rendered client config.",
91
- :default => false
92
-
93
- option :encrypted_data_bag_secret_file,
94
- :long => "--secret-file SECRET_FILE",
95
- :description => "A file containing the secret key to use to encrypt data bag item values. Will be rendered on the node at c:/chef/encrypted_data_bag_secret and set in the rendered client config."
96
-
97
- end
98
- end
99
-
100
- # TODO: This should go away when CHEF-2193 is fixed
101
- def load_template(template=nil)
102
- # Are we bootstrapping using an already shipped template?
103
- if config[:template_file]
104
- bootstrap_files = config[:template_file]
105
- else
106
- bootstrap_files = []
107
- bootstrap_files << File.join(File.dirname(__FILE__), 'bootstrap', "#{config[:distro]}.erb")
108
- bootstrap_files << File.join(Dir.pwd, ".chef", "bootstrap", "#{config[:distro]}.erb")
109
- bootstrap_files << File.join(ENV['HOME'], '.chef', 'bootstrap', "#{config[:distro]}.erb")
110
- bootstrap_files << Gem.find_files(File.join("chef","knife","bootstrap","#{config[:distro]}.erb"))
111
- bootstrap_files.flatten!
112
- end
113
-
114
- template = Array(bootstrap_files).find do |bootstrap_template|
115
- Chef::Log.debug("Looking for bootstrap template in #{File.dirname(bootstrap_template)}")
116
- ::File.exists?(bootstrap_template)
117
- end
118
-
119
- unless template
120
- ui.info("Can not find bootstrap definition for #{config[:distro]}")
121
- raise Errno::ENOENT
122
- end
123
-
124
- Chef::Log.debug("Found bootstrap template in #{File.dirname(template)}")
125
-
126
- IO.read(template).chomp
127
- end
128
-
129
- def render_template(template=nil)
130
- if config[:encrypted_data_bag_secret_file]
131
- config[:encrypted_data_bag_secret] = Chef::EncryptedDataBagItem.load_secret(config[:encrypted_data_bag_secret_file])
132
- end
133
- context = Knife::Core::WindowsBootstrapContext.new(config, config[:run_list], Chef::Config)
134
- Erubis::Eruby.new(template).evaluate(context)
135
- end
136
-
137
- def bootstrap(proto=nil)
138
-
139
- validate_name_args!
140
-
141
- @node_name = Array(@name_args).first
142
- # back compat--templates may use this setting:
143
- config[:server_name] = @node_name
144
-
145
- STDOUT.sync = STDERR.sync = true
146
-
147
- ui.info("Bootstrapping Chef on #{ui.color(@node_name, :bold)}")
148
- # create a bootstrap.bat file on the node
149
- # we have to run the remote commands in 2047 char chunks
150
- create_bootstrap_bat_command do |command_chunk, chunk_num|
151
- begin
152
- render_command_result = run_command("cmd.exe /C echo \"Rendering #{bootstrap_bat_file} chunk #{chunk_num}\" && #{command_chunk}")
153
- ui.error("Batch render command returned #{render_command_result}") if render_command_result != 0
154
- render_command_result
155
- rescue SystemExit => e
156
- raise unless e.success?
157
- end
158
- end
159
-
160
- # execute the bootstrap.bat file
161
- bootstrap_command_result = run_command(bootstrap_command)
162
- ui.error("Bootstrap command returned #{bootstrap_command_result}") if bootstrap_command_result != 0
163
- bootstrap_command_result
164
- end
165
-
166
- def bootstrap_command
167
- @bootstrap_command ||= "cmd.exe /C #{bootstrap_bat_file}"
168
- end
169
-
170
- def create_bootstrap_bat_command(&block)
171
- bootstrap_bat = []
172
- chunk_num = 0
173
- render_template(load_template(config[:bootstrap_template])).each_line do |line|
174
- # escape WIN BATCH special chars
175
- line.gsub!(/[(<|>)^]/).each{|m| "^#{m}"}
176
- # windows commands are limited to 2047 characters
177
- if((bootstrap_bat + [line]).join(" && ").size > 2047 )
178
- yield bootstrap_bat.join(" && "), chunk_num += 1
179
- bootstrap_bat = []
180
- end
181
- bootstrap_bat << ">> #{bootstrap_bat_file} (echo.#{line.chomp.strip})"
182
- end
183
- yield bootstrap_bat.join(" && "), chunk_num += 1
184
- end
185
-
186
- def bootstrap_bat_file
187
- @bootstrap_bat_file ||= "\"%TEMP%\\bootstrap-#{Process.pid}-#{Time.now.to_i}.bat\""
188
- end
189
-
190
- def locate_config_value(key)
191
- key = key.to_sym
192
- Chef::Config[:knife][key] || config[key]
193
- end
194
- end
195
- end
196
- end
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
+ require 'chef/knife'
20
+ require 'chef/encrypted_data_bag_item'
21
+ require 'chef/knife/core/windows_bootstrap_context'
22
+
23
+ class Chef
24
+ class Knife
25
+ module BootstrapWindowsBase
26
+
27
+ # :nodoc:
28
+ # Would prefer to do this in a rational way, but can't be done b/c of
29
+ # Mixlib::CLI's design :(
30
+ def self.included(includer)
31
+ includer.class_eval do
32
+
33
+ deps do
34
+ require 'readline'
35
+ require 'chef/json_compat'
36
+ end
37
+
38
+ option :chef_node_name,
39
+ :short => "-N NAME",
40
+ :long => "--node-name NAME",
41
+ :description => "The Chef node name for your new node"
42
+
43
+ option :prerelease,
44
+ :long => "--prerelease",
45
+ :description => "Install the pre-release chef gems"
46
+
47
+ option :bootstrap_version,
48
+ :long => "--bootstrap-version VERSION",
49
+ :description => "The version of Chef to install",
50
+ :proc => Proc.new { |v| Chef::Config[:knife][:bootstrap_version] = v }
51
+
52
+ option :bootstrap_proxy,
53
+ :long => "--bootstrap-proxy PROXY_URL",
54
+ :description => "The proxy server for the node being bootstrapped",
55
+ :proc => Proc.new { |p| Chef::Config[:knife][:bootstrap_proxy] = p }
56
+
57
+ option :bootstrap_no_proxy,
58
+ :long => "--bootstrap-no-proxy ",
59
+ :description => "Avoid a proxy server for the given addresses",
60
+ :proc => Proc.new { |np| Chef::Config[:knife][:bootstrap_no_proxy] = np }
61
+
62
+ option :distro,
63
+ :short => "-d DISTRO",
64
+ :long => "--distro DISTRO",
65
+ :description => "Bootstrap a distro using a template",
66
+ :default => "windows-chef-client-msi"
67
+
68
+ option :template_file,
69
+ :long => "--template-file TEMPLATE",
70
+ :description => "Full path to location of template to use",
71
+ :default => false
72
+
73
+ option :run_list,
74
+ :short => "-r RUN_LIST",
75
+ :long => "--run-list RUN_LIST",
76
+ :description => "Comma separated list of roles/recipes to apply",
77
+ :proc => lambda { |o| o.split(",") },
78
+ :default => []
79
+
80
+ option :first_boot_attributes,
81
+ :short => "-j JSON_ATTRIBS",
82
+ :long => "--json-attributes",
83
+ :description => "A JSON string to be added to the first run of chef-client",
84
+ :proc => lambda { |o| JSON.parse(o) },
85
+ :default => {}
86
+
87
+ option :encrypted_data_bag_secret,
88
+ :short => "-s SECRET",
89
+ :long => "--secret ",
90
+ :description => "The secret key to use to decrypt data bag item values. Will be rendered on the node at c:/chef/encrypted_data_bag_secret and set in the rendered client config.",
91
+ :default => false
92
+
93
+ option :encrypted_data_bag_secret_file,
94
+ :long => "--secret-file SECRET_FILE",
95
+ :description => "A file containing the secret key to use to encrypt data bag item values. Will be rendered on the node at c:/chef/encrypted_data_bag_secret and set in the rendered client config."
96
+
97
+ end
98
+ end
99
+
100
+ # TODO: This should go away when CHEF-2193 is fixed
101
+ def load_template(template=nil)
102
+ # Are we bootstrapping using an already shipped template?
103
+ if config[:template_file]
104
+ bootstrap_files = config[:template_file]
105
+ else
106
+ bootstrap_files = []
107
+ bootstrap_files << File.join(File.dirname(__FILE__), 'bootstrap', "#{config[:distro]}.erb")
108
+ bootstrap_files << File.join(Dir.pwd, ".chef", "bootstrap", "#{config[:distro]}.erb")
109
+ bootstrap_files << File.join(ENV['HOME'], '.chef', 'bootstrap', "#{config[:distro]}.erb")
110
+ bootstrap_files << Gem.find_files(File.join("chef","knife","bootstrap","#{config[:distro]}.erb"))
111
+ bootstrap_files.flatten!
112
+ end
113
+
114
+ template = Array(bootstrap_files).find do |bootstrap_template|
115
+ Chef::Log.debug("Looking for bootstrap template in #{File.dirname(bootstrap_template)}")
116
+ ::File.exists?(bootstrap_template)
117
+ end
118
+
119
+ unless template
120
+ ui.info("Can not find bootstrap definition for #{config[:distro]}")
121
+ raise Errno::ENOENT
122
+ end
123
+
124
+ Chef::Log.debug("Found bootstrap template in #{File.dirname(template)}")
125
+
126
+ IO.read(template).chomp
127
+ end
128
+
129
+ def render_template(template=nil)
130
+ if config[:encrypted_data_bag_secret_file]
131
+ config[:encrypted_data_bag_secret] = Chef::EncryptedDataBagItem.load_secret(config[:encrypted_data_bag_secret_file])
132
+ end
133
+ context = Knife::Core::WindowsBootstrapContext.new(config, config[:run_list], Chef::Config)
134
+ Erubis::Eruby.new(template).evaluate(context)
135
+ end
136
+
137
+ def bootstrap(proto=nil)
138
+
139
+ validate_name_args!
140
+
141
+ @node_name = Array(@name_args).first
142
+ # back compat--templates may use this setting:
143
+ config[:server_name] = @node_name
144
+
145
+ STDOUT.sync = STDERR.sync = true
146
+
147
+ ui.info("Bootstrapping Chef on #{ui.color(@node_name, :bold)}")
148
+ # create a bootstrap.bat file on the node
149
+ # we have to run the remote commands in 2047 char chunks
150
+ create_bootstrap_bat_command do |command_chunk, chunk_num|
151
+ begin
152
+ render_command_result = run_command(%Q!cmd.exe /C echo "Rendering #{bootstrap_bat_file} chunk #{chunk_num}" && #{command_chunk}!)
153
+ ui.error("Batch render command returned #{render_command_result}") if render_command_result != 0
154
+ render_command_result
155
+ rescue SystemExit => e
156
+ raise unless e.success?
157
+ end
158
+ end
159
+
160
+ # execute the bootstrap.bat file
161
+ bootstrap_command_result = run_command(bootstrap_command)
162
+ ui.error("Bootstrap command returned #{bootstrap_command_result}") if bootstrap_command_result != 0
163
+ bootstrap_command_result
164
+ end
165
+
166
+ def bootstrap_command
167
+ @bootstrap_command ||= "cmd.exe /C #{bootstrap_bat_file}"
168
+ end
169
+
170
+ def create_bootstrap_bat_command(&block)
171
+ bootstrap_bat = []
172
+ chunk_num = 0
173
+ render_template(load_template(config[:bootstrap_template])).each_line do |line|
174
+ # escape WIN BATCH special chars
175
+ line.gsub!(/[(<|>)^]/).each{|m| "^#{m}"}
176
+ # windows commands are limited to 2047 characters
177
+ if((bootstrap_bat + [line]).join(" && ").size > 2047 )
178
+ yield bootstrap_bat.join(" && "), chunk_num += 1
179
+ bootstrap_bat = []
180
+ end
181
+ bootstrap_bat << ">> #{bootstrap_bat_file} (echo.#{line.chomp.strip})"
182
+ end
183
+ yield bootstrap_bat.join(" && "), chunk_num += 1
184
+ end
185
+
186
+ def bootstrap_bat_file
187
+ @bootstrap_bat_file ||= "\"%TEMP%\\bootstrap-#{Process.pid}-#{Time.now.to_i}.bat\""
188
+ end
189
+
190
+ def locate_config_value(key)
191
+ key = key.to_sym
192
+ Chef::Config[:knife][key] || config[key]
193
+ end
194
+ end
195
+ end
196
+ end