From: Antonio Terceiro Date: Wed, 22 Oct 2014 09:40:14 -0200 Subject: Use a private temporary dir Without this vagrant will clutter $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/tempfile.rb | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 lib/vagrant/util/tempfile.rb diff --git a/lib/vagrant/box.rb b/lib/vagrant/box.rb index cd839ee..65eee88 100644 --- a/lib/vagrant/box.rb +++ b/lib/vagrant/box.rb @@ -9,6 +9,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 @@ -118,7 +119,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 07f3b18..a806ba5 100644 --- a/lib/vagrant/util.rb +++ b/lib/vagrant/util.rb @@ -8,6 +8,7 @@ module Vagrant autoload :Retryable, 'vagrant/util/retryable' autoload :SafeExec, 'vagrant/util/safe_exec' autoload :StackedProcRunner, 'vagrant/util/stacked_proc_runner' + autoload :Tempfile, 'vagrant/util/tempfile' autoload :TemplateRenderer, 'vagrant/util/template_renderer' autoload :StringBlockEditor, 'vagrant/util/string_block_editor' autoload :Subprocess, 'vagrant/util/subprocess' 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