Sha256: d7cd2dfd935a86c2abba44478a077947f6bebcf3cd0e9d1f3db9ea62d3baabe9

Contents?: true

Size: 1.93 KB

Versions: 33

Compression:

Stored size: 1.93 KB

Contents

require "log4r"

require "vagrant/util/platform"
require "vagrant/util/ssh"
require "vagrant/util/shell_quote"

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
        # For quick access to the `SSH` class.
        include Vagrant::Util

        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 or the environment
          info = env[:ssh_info]
          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?

          info[:private_key_path] ||= []

          if info[:keys_only] && info[:private_key_path].empty?
            raise Errors::SSHRunRequiresKeys
          end

          # Get the command and wrap it in a login shell
          command = ShellQuote.escape(env[:ssh_run_command], "'")
          command = "#{env[:machine].config.ssh.shell} -c '#{command}'"

          # Execute!
          opts = env[:ssh_opts] || {}
          opts[:extra_args] ||= []

          # Allow the user to specify a tty or non-tty manually, but if they
          # don't then we default to a TTY
          if !opts[:extra_args].include?("-t") &&
              !opts[:extra_args].include?("-T") &&
              env[:tty]
            opts[:extra_args] << "-t"
          end

          opts[:extra_args] << 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

Version data entries

33 entries across 29 versions & 4 rubygems

Version Path
vagrant-unbundled-2.2.6.2 lib/vagrant/action/builtin/ssh_run.rb
vagrant-unbundled-2.2.6.1 lib/vagrant/action/builtin/ssh_run.rb
vagrant-unbundled-2.2.6.0 lib/vagrant/action/builtin/ssh_run.rb
vagrant-unbundled-2.2.5.0 lib/vagrant/action/builtin/ssh_run.rb
vagrant-unbundled-2.2.4.0 lib/vagrant/action/builtin/ssh_run.rb
vagrant-unbundled-2.2.3.0 lib/vagrant/action/builtin/ssh_run.rb
vagrant-unbundled-2.2.2.0 lib/vagrant/action/builtin/ssh_run.rb
vagrant-unbundled-2.2.0.0 lib/vagrant/action/builtin/ssh_run.rb
vagrant-unbundled-2.1.4.0 lib/vagrant/action/builtin/ssh_run.rb
vagrant-unbundled-2.1.2.0 lib/vagrant/action/builtin/ssh_run.rb
vagrant-packet-0.1.2 vendor/bundle/ruby/2.5.0/bundler/gems/vagrant-04f7215b5e3f/lib/vagrant/action/builtin/ssh_run.rb
vagrant-packet-0.1.2 vendor/bundle/ruby/2.3.0/bundler/gems/vagrant-04f7215b5e3f/lib/vagrant/action/builtin/ssh_run.rb
vagrant-packet-0.1.2 vendor/bundle/ruby/2.4.0/bundler/gems/vagrant-04f7215b5e3f/lib/vagrant/action/builtin/ssh_run.rb
vagrant-packet-0.1.1 vendor/bundle/ruby/2.3.0/bundler/gems/vagrant-04f7215b5e3f/lib/vagrant/action/builtin/ssh_run.rb
vagrant-packet-0.1.1 vendor/bundle/ruby/2.5.0/bundler/gems/vagrant-04f7215b5e3f/lib/vagrant/action/builtin/ssh_run.rb
vagrant-packet-0.1.1 vendor/bundle/ruby/2.4.0/bundler/gems/vagrant-04f7215b5e3f/lib/vagrant/action/builtin/ssh_run.rb
vagrant-unbundled-2.1.1.0 lib/vagrant/action/builtin/ssh_run.rb
vagrant-unbundled-2.0.4.0 lib/vagrant/action/builtin/ssh_run.rb
vagrant-unbundled-2.0.3.0 lib/vagrant/action/builtin/ssh_run.rb
vagrant-aws-detiber-0.7.2.pre.4 vendor/bundle/ruby/2.3.0/bundler/gems/vagrant-419afb4dcffe/lib/vagrant/action/builtin/ssh_run.rb