From: Antonio Terceiro Date: Wed, 22 Oct 2014 09:40:14 -0200 Subject: Use a private temporary directory that is cleanup up on exit This avoids vagrant from cluttering $TMPDIR with dozens of even hundreds of temporary files (~4 per vagrant invocation). --- lib/vagrant/box.rb | 3 ++- lib/vagrant/util.rb | 1 + lib/vagrant/util/caps.rb | 2 +- lib/vagrant/util/platform.rb | 2 +- lib/vagrant/util/tempfile.rb | 39 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 lib/vagrant/util/tempfile.rb diff --git a/lib/vagrant/box.rb b/lib/vagrant/box.rb index 90dc69d..4ee79b9 100644 --- a/lib/vagrant/box.rb +++ b/lib/vagrant/box.rb @@ -12,6 +12,7 @@ require "vagrant/util/downloader" require "vagrant/util/platform" require "vagrant/util/safe_chdir" require "vagrant/util/subprocess" +# require "vagrant/util/tempfile" module Vagrant # Represents a "box," which is a package Vagrant environment that is used @@ -153,7 +154,7 @@ module Vagrant # @param [Hash] download_options Options to pass to the downloader. # @return [BoxMetadata] def load_metadata(download_options={}) - tf = Tempfile.new("vagrant-load-metadata") + tf = Util::Tempfile.new("vagrant-load-metadata") tf.close url = @metadata_url diff --git a/lib/vagrant/util.rb b/lib/vagrant/util.rb index 4b3e0ff..36eb671 100644 --- a/lib/vagrant/util.rb +++ b/lib/vagrant/util.rb @@ -57,6 +57,7 @@ module Vagrant autoload :SilenceWarnings, 'vagrant/util/silence_warnings' autoload :SSH, 'vagrant/util/ssh' autoload :StackedProcRunner, 'vagrant/util/stacked_proc_runner' + autoload :Tempfile, 'vagrant/util/tempfile' autoload :StringBlockEditor, 'vagrant/util/string_block_editor' autoload :Subprocess, 'vagrant/util/subprocess' autoload :TemplateRenderer, 'vagrant/util/template_renderer' diff --git a/lib/vagrant/util/caps.rb b/lib/vagrant/util/caps.rb index 310add3..55afc49 100644 --- a/lib/vagrant/util/caps.rb +++ b/lib/vagrant/util/caps.rb @@ -31,7 +31,7 @@ module Vagrant def ensure_output_iso(file_destination) if file_destination.nil? - tmpfile = Tempfile.new(["vagrant", ".iso"]) + tmpfile = Util::Tempfile.new(["vagrant", ".iso"]) file_destination = Pathname.new(tmpfile.path) tmpfile.close tmpfile.unlink diff --git a/lib/vagrant/util/platform.rb b/lib/vagrant/util/platform.rb index c8658e1..0421c70 100644 --- a/lib/vagrant/util/platform.rb +++ b/lib/vagrant/util/platform.rb @@ -388,7 +388,7 @@ module Vagrant if wsl? # Mark our filesystem with a temporary file having an unique name. - marker = Tempfile.new(Time.now.to_i.to_s) + marker = Util::Tempfile.new(Time.now.to_i.to_s) logger = Log4r::Logger.new("vagrant::util::platform::wsl") # Check for lxrun installation first diff --git a/lib/vagrant/util/tempfile.rb b/lib/vagrant/util/tempfile.rb new file mode 100644 index 0000000..0cbbb53 --- /dev/null +++ b/lib/vagrant/util/tempfile.rb @@ -0,0 +1,39 @@ +require 'fileutils' +require 'tmpdir' + +module Vagrant + module Util + class Tempfile < ::Tempfile + + def initialize(basename) + super(basename, private_tmpdir) + end + + def private_tmpdir + self.class.private_tmpdir + end + + def self.private_tmpdir + @private_tmpdir ||= + begin + user = Etc.getpwuid.name + pid = Process.pid + tmpdir = File.join(Dir.tmpdir, "vagrant-#{user}-#{pid}") + FileUtils.mkdir_p(tmpdir) + FileUtils.chmod(0700, tmpdir) + tmpdir + end + end + + def self.mktmpdir(prefix_suffix) + Dir.mktmpdir(prefix_suffix, private_tmpdir) + end + + + end + end +end + +at_exit do + FileUtils.rm_rf(Vagrant::Util::Tempfile.private_tmpdir) +end