class Vagrant::LXC::SudoWrapper
Attributes
wrapper_path[R]
Public Class Methods
dest_path()
click to toggle source
# File lib/vagrant-lxc/sudo_wrapper.rb, line 9 def self.dest_path "/usr/share/vagrant/gems/gems/vagrant-lxc-1.4.1/scripts/vagrant-lxc-wrapper" end
new(privileged: true)
click to toggle source
# File lib/vagrant-lxc/sudo_wrapper.rb, line 13 def initialize(privileged: true) @wrapper_path = Pathname.new(SudoWrapper.dest_path).exist? && SudoWrapper.dest_path || nil @privileged = privileged @logger = Log4r::Logger.new("vagrant::lxc::sudo_wrapper") end
Public Instance Methods
run(*command)
click to toggle source
# File lib/vagrant-lxc/sudo_wrapper.rb, line 19 def run(*command) options = command.last.is_a?(Hash) ? command.last : {} # Avoid running LXC commands with a restrictive umask. # Otherwise disasters occur, like the container root directory # having permissions `rwxr-x---` which prevents the `vagrant` # user from accessing its own home directory; among other # problems, SSH cannot then read `authorized_keys`! old_mask = File.umask File.umask(old_mask & 022) # allow all `r` and `x` bits begin if @privileged if @wrapper_path && !options[:no_wrapper] command.unshift @wrapper_path execute *(['sudo'] + command) else execute *(['sudo', '/usr/bin/env'] + command) end else execute *(['/usr/bin/env'] + command) end ensure File.umask(old_mask) end end
Private Instance Methods
execute(*command, &block)
click to toggle source
TODO: Review code below this line, it was pretty much a copy and
paste from VirtualBox base driver and has no tests
# File lib/vagrant-lxc/sudo_wrapper.rb, line 50 def execute(*command, &block) # Get the options hash if it exists opts = {} opts = command.pop if command.last.is_a?(Hash) tries = 0 tries = 3 if opts[:retryable] sleep = opts.fetch(:sleep, 1) # Variable to store our execution result r = nil retryable(:on => LXC::Errors::ExecuteError, :tries => tries, :sleep => sleep) do # Execute the command r = raw(*command, &block) # If the command was a failure, then raise an exception that is # nicely handled by Vagrant. if r.exit_code != 0 if @interrupted raise LXC::Errors::SubprocessInterruptError, command.inspect else raise LXC::Errors::ExecuteError, command: command.inspect, stderr: r.stderr, stdout: r.stdout, exitcode: r.exit_code end end end # Return the output, making sure to replace any Windows-style # newlines with Unix-style. stdout = r.stdout.gsub("\r\n", "\n") if opts[:show_stderr] { :stdout => stdout, :stderr => r.stderr.gsub("\r\n", "\n") } else stdout end end
raw(*command, &block)
click to toggle source
# File lib/vagrant-lxc/sudo_wrapper.rb, line 89 def raw(*command, &block) int_callback = lambda do @interrupted = true @logger.info("Interrupted.") end # Append in the options for subprocess command << { :notify => [:stdout, :stderr] } Vagrant::Util::Busy.busy(int_callback) do Vagrant::Util::Subprocess.execute(*command, &block) end end