knife-windows 0.5.14 → 0.5.15

Sign up to get free protection for your applications and to get access to all the features.
@@ -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