44 lines
1.3 KiB
Ruby
44 lines
1.3 KiB
Ruby
require "log4r"
|
|
|
|
require "vagrant/util/ssh"
|
|
|
|
module Vagrant
|
|
module Action
|
|
module Builtin
|
|
# This class will run a single command on the remote machine and will
|
|
# mirror the output to the UI. The resulting exit status of the command
|
|
# will exist in the `:ssh_run_exit_status` key in the environment.
|
|
class SSHRun
|
|
def initialize(app, env)
|
|
@app = app
|
|
@logger = Log4r::Logger.new("vagrant::action::builtin::ssh_run")
|
|
end
|
|
|
|
def call(env)
|
|
# Grab the SSH info from the machine
|
|
info = env[:machine].ssh_info
|
|
|
|
# If the result is nil, then the machine is telling us that it is
|
|
# not yet ready for SSH, so we raise this exception.
|
|
raise Errors::SSHNotReady if info.nil?
|
|
|
|
if info[:private_key_path]
|
|
# Check the SSH key permissions
|
|
Util::SSH.check_key_permissions(Pathname.new(info[:private_key_path]))
|
|
end
|
|
|
|
# Execute!
|
|
command = env[:ssh_run_command]
|
|
opts = env[:ssh_opts] || {}
|
|
opts[:extra_args] = ["-t", command]
|
|
opts[:subprocess] = true
|
|
env[:ssh_run_exit_status] = Util::SSH.exec(info, opts)
|
|
|
|
# Call the next middleware
|
|
@app.call(env)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|