vagrant/plugins/commands/winrm/command.rb

70 lines
1.8 KiB
Ruby

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
raise Vagrant::Errors::WinRMInvalidCommunicator
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