From 99ce95198bcb4323a686d9782f6ba6b2fb4cb7e8 Mon Sep 17 00:00:00 2001 From: Shawn Neal Date: Fri, 25 Apr 2014 10:17:00 -0700 Subject: [PATCH] First pass at integrating new WinRM elevated execution wrapper - Removed a lot of the Windows special casing from Chef runs - Don't attempt to use @config.binary_env since we don't properly pass this along to Chef --- .../chef/command_builder_windows.rb | 84 ++++--------------- .../chef/provisioner/chef_client.rb | 3 +- .../chef/provisioner/chef_solo.rb | 3 +- 3 files changed, 21 insertions(+), 69 deletions(-) diff --git a/plugins/provisioners/chef/command_builder_windows.rb b/plugins/provisioners/chef/command_builder_windows.rb index 8bd4f972e..f8add1931 100644 --- a/plugins/provisioners/chef/command_builder_windows.rb +++ b/plugins/provisioners/chef/command_builder_windows.rb @@ -1,82 +1,32 @@ -require "tempfile" - -require "vagrant/util/template_renderer" - module VagrantPlugins module Chef class CommandBuilderWindows < CommandBuilder def build_command - binary_path = "chef-#{@client_type}" - if @config.binary_path - binary_path = File.join(@config.binary_path, binary_path) - binary_path.gsub!("/", "\\") - binary_path = "c:#{binary_path}" if binary_path.start_with?("\\") - end - - chef_arguments = "-c #{provisioning_path("#{@client_type}.rb")}" - chef_arguments << " -j #{provisioning_path("dna.json")}" - chef_arguments << " #{@config.arguments}" if @config.arguments - - command_env = "" - command_env = "#{@config.binary_env} " if @config.binary_env - - task_ps1_path = provisioning_path("cheftask.ps1") - - opts = { - user: @machine.config.winrm.username, - pass: @machine.config.winrm.password, - chef_arguments: chef_arguments, - chef_binary_path: "#{command_env}#{binary_path}", - chef_stdout_log: provisioning_path("chef-#{@client_type}.log"), - chef_stderr_log: provisioning_path("chef-#{@client_type}.err.log"), - chef_task_exitcode: provisioning_path('cheftask.exitcode'), - chef_task_running: provisioning_path('cheftask.running'), - chef_task_ps1: task_ps1_path, - chef_task_run_ps1: provisioning_path('cheftaskrun.ps1'), - chef_task_xml: provisioning_path('cheftask.xml'), - } - - # Upload the files we'll need - render_and_upload( - "cheftaskrun.ps1", opts[:chef_task_run_ps1], opts) - render_and_upload( - "cheftask.xml", opts[:chef_task_xml], opts) - render_and_upload( - "cheftask.ps1", opts[:chef_task_ps1], opts) - - return <<-EOH - $old = Get-ExecutionPolicy; - Set-ExecutionPolicy Unrestricted -force; - #{task_ps1_path}; - Set-ExecutionPolicy $old -force - EOH + "#{chef_binary_path} #{chef_arguments}" end protected - def provisioning_path(file) - path = "#{@config.provisioning_path}/#{file}" - path.gsub!("/", "\\") - path = "c:#{path}" if path.start_with?("\\") - path + def chef_binary_path + binary_path = "chef-#{@client_type}" + binary_path = win_path(File.join(@config.binary_path, binary_path)) if @config.binary_path + binary_path end - def render_and_upload(template, dest, opts) - path = File.expand_path("../scripts/#{template}", __FILE__) - data = Vagrant::Util::TemplateRenderer.render(path, options) + def chef_arguments + chef_arguments = "-c #{provisioning_path("#{@client_type}.rb")}" + chef_arguments << " -j #{provisioning_path("dna.json")}" + chef_arguments << " #{@config.arguments}" if @config.arguments + chef_arguments.strip + end - file = Tempfile.new("vagrant-chef") - file.binmode - file.write(data) - file.fsync - file.close + def provisioning_path(file) + win_path(File.join(@config.provisioning_path, file)) + end - @machine.communicate.upload(file.path, dest) - ensure - if file - file.close - file.unlink - end + def win_path(path) + path.gsub!("/", "\\") + "c:#{path}" if path.start_with?("\\") end end end diff --git a/plugins/provisioners/chef/provisioner/chef_client.rb b/plugins/provisioners/chef/provisioner/chef_client.rb index 1de5f5d16..50bf04c37 100644 --- a/plugins/provisioners/chef/provisioner/chef_client.rb +++ b/plugins/provisioners/chef/provisioner/chef_client.rb @@ -75,7 +75,8 @@ module VagrantPlugins @machine.ui.info I18n.t("vagrant.provisioners.chef.running_client_again") end - exit_status = @machine.communicate.sudo(command, :error_check => false) do |type, data| + opts = { error_check: false, elevated: true } + exit_status = @machine.communicate.sudo(command, opts) do |type, data| # Output the data with the proper color based on the stream. color = type == :stdout ? :green : :red diff --git a/plugins/provisioners/chef/provisioner/chef_solo.rb b/plugins/provisioners/chef/provisioner/chef_solo.rb index 99037c1f0..38e5d56e0 100644 --- a/plugins/provisioners/chef/provisioner/chef_solo.rb +++ b/plugins/provisioners/chef/provisioner/chef_solo.rb @@ -151,7 +151,8 @@ module VagrantPlugins @machine.ui.info I18n.t("vagrant.provisioners.chef.running_solo_again") end - exit_status = @machine.communicate.sudo(command, :error_check => false) do |type, data| + opts = { error_check: false, elevated: true } + exit_status = @machine.communicate.sudo(command, opts) do |type, data| # Output the data with the proper color based on the stream. color = type == :stdout ? :green : :red