From 399ab86d60647e4c224d8d7ee5dd2809d865d479 Mon Sep 17 00:00:00 2001 From: Fabio Rehm Date: Tue, 26 Mar 2013 21:45:20 -0300 Subject: [PATCH] Add action for clearing forwarded ports --- .../action/clear_forwarded_ports.rb | 47 +++++++++++++++++++ .../unit/action/clear_forwarded_ports_spec.rb | 42 +++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 lib/vagrant-lxc/action/clear_forwarded_ports.rb create mode 100644 spec/unit/action/clear_forwarded_ports_spec.rb diff --git a/lib/vagrant-lxc/action/clear_forwarded_ports.rb b/lib/vagrant-lxc/action/clear_forwarded_ports.rb new file mode 100644 index 0000000..44c0586 --- /dev/null +++ b/lib/vagrant-lxc/action/clear_forwarded_ports.rb @@ -0,0 +1,47 @@ +module Vagrant + module LXC + module Action + class ClearForwardedPorts + def initialize(app, env) + @app = app + @logger = Log4r::Logger.new("vagrant::lxc::action::clear_forwarded_ports") + end + + def call(env) + @env = env + + 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 "sudo pkill -9 -P #{pid}" + end + + remove_redir_pids + end + + @app.call env + end + + protected + + def redir_pids + @redir_pids = Dir[@env[:machine].data_dir.join('pids').to_s + "/redir_*.pid"].map do |file| + File.read(file).strip.chomp + end + end + + def is_redir_pid?(pid) + `ps -o cmd= #{pid}`.strip.chomp =~ /redir/ + end + + def remove_redir_pids + Dir[@env[:machine].data_dir.join('pids').to_s + "/redir_*.pid"].each do |file| + File.delete file + end + end + end + end + end +end diff --git a/spec/unit/action/clear_forwarded_ports_spec.rb b/spec/unit/action/clear_forwarded_ports_spec.rb new file mode 100644 index 0000000..4dcc997 --- /dev/null +++ b/spec/unit/action/clear_forwarded_ports_spec.rb @@ -0,0 +1,42 @@ +require 'unit_helper' + +require 'vagrant-lxc/action/clear_forwarded_ports' + +describe Vagrant::LXC::Action::ClearForwardedPorts do + let(:app) { mock(:app, call: true) } + let(:env) { {machine: machine, ui: stub(info: true)} } + let(:machine) { mock(:machine, data_dir: data_dir) } + let!(:data_dir) { Pathname.new(Dir.mktmpdir) } + let(:pids_dir) { data_dir.join('pids') } + let(:pid) { 'a-pid' } + let(:pid_cmd) { 'redir' } + + subject { described_class.new(app, env) } + + before do + pids_dir.mkdir + pids_dir.join('redir_1234.pid').open('w') { |f| f.write(pid) } + subject.stub(system: true, :` => pid_cmd) + subject.call(env) + end + + after { FileUtils.rm_rf data_dir.to_s } + + it 'removes all files under pid directory' do + Dir[pids_dir.to_s + "/redir_*.pid"].should be_empty + end + + context 'with a valid redir pid' do + it 'kills known processes' do + subject.should have_received(:system).with("sudo pkill -9 -P #{pid}") + end + end + + context 'with an invalid pid' do + let(:pid_cmd) { 'sudo ls' } + + it 'does not kill the process' do + subject.should_not have_received(:system).with("sudo pkill -9 -P #{pid}") + end + end +end