vagrant/plugins/commands/winrm/command.rb
Chris Roberts ea25996b21
Update Vagrant behavior outside of installers
Remove customized require behaviors and modify the bin executable
to check for missing tools that Vagrant expects to exist when
running outside of an installer.
2025-04-02 11:40:17 -07:00

71 lines
1.9 KiB
Ruby

# Copyright (c) HashiCorp, Inc.
# SPDX-License-Identifier: BUSL-1.1
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