diff --git a/lib/vagrant-lxc/action/clear_forwarded_ports.rb b/lib/vagrant-lxc/action/clear_forwarded_ports.rb index 48dbe5b..bf6d1b3 100644 --- a/lib/vagrant-lxc/action/clear_forwarded_ports.rb +++ b/lib/vagrant-lxc/action/clear_forwarded_ports.rb @@ -13,9 +13,13 @@ module Vagrant if redir_pids.any? env[:ui].info I18n.t("vagrant.actions.vm.clear_forward_ports.deleting") redir_pids.each do |pid| - next unless is_redir_pid?(pid) - @logger.debug "Killing pid #{pid}" - system "pkill -TERM -P #{pid}" + next unless is_redir_pid?(pid[0]) + @logger.debug "Killing pid #{pid[0]}" + if pid[1] + system "sudo pkill -TERM -P #{pid[0]}" + else + system "pkill -TERM -P #{pid[0]}" + end end @logger.info "Removing redir pids files" @@ -31,7 +35,9 @@ module Vagrant def redir_pids @redir_pids = Dir[@env[:machine].data_dir.join('pids').to_s + "/redir_*.pid"].map do |file| - File.read(file).strip.chomp + port_number = file.split(/[^\d]/).join + privileged_port = true if Integer(port_number) > 1024 + a = [ File.read(file).strip.chomp , privileged_port ] end end diff --git a/lib/vagrant-lxc/action/forward_ports.rb b/lib/vagrant-lxc/action/forward_ports.rb index 5bc4efe..afad40c 100644 --- a/lib/vagrant-lxc/action/forward_ports.rb +++ b/lib/vagrant-lxc/action/forward_ports.rb @@ -79,8 +79,11 @@ module Vagrant params = %W( --lport=#{host_port} --caddr=#{guest_ip} --cport=#{guest_port} ) params.unshift "--laddr=#{host_ip}" if host_ip params << '--syslog' if ENV['REDIR_LOG'] - redir_cmd = "redir #{params.join(' ')} 2>/dev/null" - + if host_port < 1024 + redir_cmd = "sudo redir #{params.join(' ')} 2>/dev/null" + else + redir_cmd = "redir #{params.join(' ')} 2>/dev/null" + end @logger.debug "Forwarding port with `#{redir_cmd}`" spawn redir_cmd end diff --git a/spec/unit/action/clear_forwarded_ports_spec.rb b/spec/unit/action/clear_forwarded_ports_spec.rb index 7f98e23..182ac3c 100644 --- a/spec/unit/action/clear_forwarded_ports_spec.rb +++ b/spec/unit/action/clear_forwarded_ports_spec.rb @@ -29,7 +29,7 @@ describe Vagrant::LXC::Action::ClearForwardedPorts do context 'with a valid redir pid' do it 'kills known processes' do - expect(subject).to have_received(:system).with("pkill -TERM -P #{pid}") + expect(subject).to have_received(:system).with("sudo pkill -TERM -P #{pid}") end end @@ -37,7 +37,7 @@ describe Vagrant::LXC::Action::ClearForwardedPorts do let(:pid_cmd) { 'sudo ls' } it 'does not kill the process' do - expect(subject).not_to have_received(:system).with("pkill -TERM -P #{pid}") + expect(subject).not_to have_received(:system).with("sudo pkill -TERM -P #{pid}") end end end diff --git a/spec/unit/action/sudo_forward_ports_spec.rb b/spec/unit/action/sudo_forward_ports_spec.rb new file mode 100644 index 0000000..77602ae --- /dev/null +++ b/spec/unit/action/sudo_forward_ports_spec.rb @@ -0,0 +1,77 @@ +require 'unit_helper' + +require 'tmpdir' +require 'vagrant-lxc/provider' +require 'vagrant-lxc/action/forward_ports' + +describe Vagrant::LXC::Action::ForwardPorts do + let(:app) { double(:app, call: true) } + let(:env) { {machine: machine, ui: double(info: true, warn: true)} } + let(:machine) { double(:machine) } + let!(:data_dir) { Pathname.new(Dir.mktmpdir) } + let(:provider) { double(Vagrant::LXC::Provider, ssh_info: {host: container_ip}) } + let(:host_ip) { '127.0.0.1' } + let(:host_port) { 80 } + let(:guest_port) { 80 } + let(:container_ip) { '10.0.1.234' } + let(:pid) { 'a-pid' } + let(:forward_conf) { {guest: guest_port, host: host_port, host_ip: host_ip} } + let(:networks) { [[:other_config, {}], [:forwarded_port, forward_conf]] } + + subject { described_class.new(app, env) } + + before do + machine.stub_chain(:config, :vm, :networks).and_return(networks) + machine.stub(provider: provider, data_dir: data_dir) + + subject.stub(exec: true) + subject.stub(spawn: pid) + end + + after { FileUtils.rm_rf data_dir.to_s } + + it 'forwards ports using redir' do + subject.stub(system: true) + subject.call(env) + expect(subject).to have_received(:spawn).with( + "sudo redir --laddr=#{host_ip} --lport=#{host_port} --caddr=#{container_ip} --cport=#{guest_port} 2>/dev/null" + ) + end + + it 'skips --laddr parameter if host_ip is nil' do + forward_conf.delete(:host_ip) + subject.stub(system: true) + subject.call(env) + expect(subject).to have_received(:spawn).with( + "sudo redir --lport=#{host_port} --caddr=#{container_ip} --cport=#{guest_port} 2>/dev/null" + ) + end + + it 'skips --laddr parameter if host_ip is a blank string' do + forward_conf[:host_ip] = ' ' + subject.stub(system: true) + subject.call(env) + expect(subject).to have_received(:spawn).with( + "sudo redir --lport=#{host_port} --caddr=#{container_ip} --cport=#{guest_port} 2>/dev/null" + ) + end + + it "stores redir pids on machine's data dir" do + subject.stub(system: true) + subject.call(env) + pid_file = data_dir.join('pids', "redir_#{host_port}.pid").read + expect(pid_file).to eq(pid) + end + + it 'allows disabling a previously forwarded port' do + forward_conf[:disabled] = true + subject.stub(system: true) + subject.call(env) + expect(subject).not_to have_received(:spawn) + end + + it 'raises RedirNotInstalled error if `redir` is not installed' do + subject.stub(system: false) + expect { subject.call(env) }.to raise_error(Vagrant::LXC::Errors::RedirNotInstalled) + end +end