2018-10-04 20:13:27 +00:00
|
|
|
require 'optparse'
|
|
|
|
|
|
|
|
require "vagrant/util/safe_puts"
|
|
|
|
|
|
|
|
module VagrantPlugins
|
|
|
|
module CommandWinRM
|
|
|
|
class Command < Vagrant.plugin("2", :command)
|
|
|
|
include Vagrant::Util::SafePuts
|
|
|
|
|
|
|
|
def self.synopsis
|
|
|
|
"executes commands on a machine via WinRM"
|
|
|
|
end
|
|
|
|
|
|
|
|
def execute
|
|
|
|
options = {
|
|
|
|
command: [],
|
|
|
|
shell: :powershell
|
|
|
|
}
|
|
|
|
|
|
|
|
opts = OptionParser.new do |o|
|
|
|
|
o.banner = "Usage: vagrant winrm [options] [name|id]"
|
|
|
|
o.separator ""
|
|
|
|
o.separator "Options:"
|
|
|
|
o.separator ""
|
|
|
|
|
|
|
|
o.on("-c", "--command COMMAND", "Execute a WinRM command directly") do |c|
|
|
|
|
options[:command] << c
|
|
|
|
end
|
|
|
|
|
|
|
|
o.on("-e", "--elevated", "Run with elevated credentials") do |e|
|
|
|
|
options[:elevated] = true
|
|
|
|
end
|
|
|
|
|
|
|
|
o.on("-s", "--shell SHELL", [:powershell, :cmd], "Use specified shell (powershell, cmd)") do |s|
|
|
|
|
options[:shell] = s
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
argv = parse_options(opts)
|
|
|
|
return if !argv
|
|
|
|
|
|
|
|
with_target_vms(argv, single_target: true) do |machine|
|
|
|
|
if machine.config.vm.communicator != :winrm
|
2018-10-08 21:30:11 +00:00
|
|
|
raise Vagrant::Errors::WinRMInvalidCommunicator
|
2018-10-04 20:13:27 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
opts = {
|
|
|
|
shell: options[:shell],
|
|
|
|
elevated: !!options[:elevated]
|
|
|
|
}
|
|
|
|
|
|
|
|
options[:command].each do |cmd|
|
|
|
|
begin
|
|
|
|
machine.communicate.execute(cmd, opts) do |type, data|
|
|
|
|
io = type == :stderr ? $stderr : $stdout
|
|
|
|
safe_puts(data, io: io, printer: :print)
|
|
|
|
end
|
|
|
|
rescue VagrantPlugins::CommunicatorWinRM::Errors::WinRMBadExitStatus
|
|
|
|
return 1
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# Success, exit status 0
|
|
|
|
0
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|