vagrant-vbguest 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/Readme.md CHANGED
@@ -4,31 +4,63 @@
4
4
 
5
5
  ## Installation
6
6
 
7
- Requires vagrant 0.9.0
7
+ Requires vagrant 0.9.4 or later
8
8
 
9
9
  gem install vagrant-vbguest
10
10
 
11
- Compatibly for vagrant 0.8 is provided by version 0.0.3
11
+ or, using vagrant's gem wrapper
12
+
13
+ vagrant gem install vagrant-vbguest
14
+
15
+ Compatibly for vagrant 0.8 is provided by version 0.0.3 (which lacks a bunch of new options)
12
16
 
13
17
  ## Configuration / Usage
14
18
 
15
- In your `Vagrantfile`:
19
+ If you're lucky, `vagrant-vbguest` does not require any configurations.
20
+ Hoever, here is an example for your `Vagrantfile`:
16
21
 
17
22
  Vagrant::Config.run do |config|
18
23
  # we will try to autodetect this path.
19
- # However, if we cannot or you have a special one you may pass it here
20
- config.vbguest.iso_path = '/Applications/VirtualBox.app/Contents/MacOS/VBoxGuestAdditions.iso'
24
+ # However, if we cannot or you have a special one you may pass it like:
25
+ # config.vbguest.iso_path = "#{ENV['HOME']}/Downloads/VBoxGuestAdditions.iso"
26
+ # or
27
+ # config.vbguest.iso_path = "http://company.server/VirtualBox/$VBOX_VERSION/VBoxGuestAdditions.iso"
21
28
 
22
29
  # set auto_update to false, if do NOT want to check the correct additions
23
- # version on each 'vagrant up' (default: true)
30
+ # version when booting this machine
24
31
  config.vbguest.auto_update = false
32
+
33
+ # do NOT download the iso file from a webserver
34
+ config.vbguest.no_remote = true
25
35
  end
26
36
 
37
+ ### Config options
38
+
39
+ * `iso_path` : The full path or URL to the VBoxGuestAdditions.iso file. <br/>
40
+ The `iso_path` may contain the optional placeholder `$VBOX_VERSION` for the detected version (e.g. `4.1.8`).
41
+ The URI for the actual iso download reads: `http://download.virtualbox.org/virtualbox/$VBOX_VERSION/VBoxGuestAdditions_$VBOX_VERSION.iso`<br/>
42
+ vbguest will try to autodetect the best option for your system. WTF? see below.
43
+ * `auto_update` (Boolean, dafault: `true`) : Whether to check the correct additions version on each start (where start is _not_ resuming a box).
44
+ * `no_install` (Boolean, default: `false`) : Whether to check the correct additions version only. This will warn you about version mis-matches, but will not try to install anything.
45
+ * `no_remote` (Boolean, default: `false`) : Whether to _not_ download the iso file from a remote location. This includes any `http` location!
46
+
47
+ ### ISO autodetection
48
+
49
+ `vagrant-vbguest` will try to autodetect a VirtualBox GuestAdditions iso file on your system, which usually matches your installed version of VirtualBox.
50
+ If it cannot find one, it downloads one from the web (virtualbox.org). Those places will be checked in order:
51
+
52
+ 1. Checks your VirualBox "Virtual Media Maganger" for a DVD called "VBoxGuestAdditions.iso"
53
+ 2. Guess by your operating system:
54
+ * for linux : `/usr/share/virtualbox/VBoxGuestAdditions.iso`
55
+ * for Mac : `/Applications/VirtualBox.app/Contents/MacOS/VBoxGuestAdditions.iso`
56
+ * for Windows : `%PROGRAMFILES%/Oracle/VirtualBox/VBoxGuestAdditions.iso`
57
+
27
58
  You may also run the installer manually:
28
59
 
29
- $ vagrant vbguest [vm-name] [-f|--force]
60
+ $ vagrant vbguest [vm-name] [-f|--force] [-I|--no-install] [-R|--no-remote] [--iso VBoxGuestAdditions.iso]
30
61
 
31
62
  ## Knows Issues
32
63
 
33
64
  * The installer script, which mounts and runs the GuestAdditions Installer Binary, works on linux only. Most likely it will run on most unix-like plattform.
34
- * The installer script requires a directory `/mnt` on the host system
65
+ * The installer script requires a directory `/mnt` on the host system
66
+ * On multi vm boxes, the iso file will be downloaded for each vm
@@ -1,5 +1,6 @@
1
1
  require 'vagrant'
2
2
  require "vagrant-vbguest/config"
3
+ require "vagrant-vbguest/download"
3
4
  require "vagrant-vbguest/installer"
4
5
  require 'vagrant-vbguest/command'
5
6
  require 'vagrant-vbguest/middleware'
@@ -9,11 +9,24 @@ module VagrantVbguest
9
9
  def execute
10
10
  options = {}
11
11
  opts = OptionParser.new do |opts|
12
- opts.banner = "Usage: vagrant vbguest [vm-name] [-f|--force]"
12
+ puts opts.inspect
13
+ opts.banner = "Usage: vagrant vbguest [vm-name] [-f|--force] [-I|--no-install] [-R|--no-remote] [--iso VBoxGuestAdditions.iso]"
13
14
  opts.separator ""
14
15
 
15
- opts.on("-f", "--force", "Whether to force the installation") do |f|
16
- options[:force] = f
16
+ opts.on("-f", "--force", "Whether to force the installation") do
17
+ options[:force] = true
18
+ end
19
+
20
+ opts.on("--no-install", "-I", "Only check for the installed version. Do not attempt to install anything") do
21
+ options[:no_install] = true
22
+ end
23
+
24
+ opts.on("--no-remote", "-R", "Do not attempt do download the iso file from a webserver") do
25
+ options[:no_remote] = true
26
+ end
27
+
28
+ opts.on("--iso file_or_uri", "Full path or URI to the VBoxGuestAdditions.iso") do |file_or_uri|
29
+ options[:iso_path] = file_or_uri
17
30
  end
18
31
  end
19
32
 
@@ -5,32 +5,55 @@ module VagrantVbguest
5
5
  class Config < Vagrant::Config::Base
6
6
  attr_accessor :iso_path
7
7
  attr_accessor :auto_update
8
+ attr_accessor :no_install
9
+ attr_accessor :no_remote
8
10
 
9
- def initialize
10
- super
11
- @auto_update = true
12
- autodetect_iso!
13
- end
14
-
11
+ def iso_path; @iso_path ||= autodetect_iso; end
12
+ def auto_update; @auto_update.nil? ? (@auto_update = true) : @auto_update; end
13
+ def no_remote; @no_remote.nil? ? (@no_remote = false) : @no_remote; end
14
+ def no_install; @no_install.nil? ? (@no_install = false): @no_install; end
15
+
15
16
  def validate(env, errors)
16
- errors.add(I18n.t("vagrant.plugins.vbguest.missing_iso_path")) unless iso_path && iso_path.is_a?(String) && File.exists?(iso_path)
17
+ errors.add(I18n.t("vagrant.plugins.vbguest.missing_iso_path")) unless iso_path && iso_path.is_a?(String)
17
18
  end
18
19
 
19
20
  # explicit hash, to get symbols in hash keys
20
21
  def to_hash
21
22
  {
22
23
  :iso_path => iso_path,
23
- :auto_update => auto_update
24
+ :auto_update => auto_update,
25
+ :no_install => no_install,
26
+ :no_remote => no_remote
24
27
  }
25
28
  end
26
29
 
27
30
  protected
28
31
 
29
- def autodetect_iso!
32
+ def autodetect_iso
33
+ media_magager_iso || guess_iso || web_iso
34
+ end
35
+
36
+ def media_magager_iso
30
37
  dvd = VirtualBox::DVD.all.find do |d|
31
38
  !!(d.location =~ /VBoxGuestAdditions.iso$/)
32
39
  end
33
- @iso_path = dvd.location if dvd
40
+ dvd ? dvd.location : nil
41
+ end
42
+
43
+ def guess_iso
44
+ guess_path = if Vagrant::Util::Platform.linux?
45
+ "/usr/share/virtualbox/VBoxGuestAdditions.iso"
46
+ elsif Vagrant::Util::Platform.darwin?
47
+ "/Applications/VirtualBox.app/Contents/MacOS/VBoxGuestAdditions.iso"
48
+ elsif Vagrant::Util::Platform.windows?
49
+ File.join((ENV["PROGRAM_FILES"] || ENV["PROGRAMFILES"]), "/Oracle/VirtualBox/VBoxGuestAdditions.iso")
50
+ end
51
+ File.exists?(guess_path) ? guess_path : nil
34
52
  end
53
+
54
+ def web_iso
55
+ "http://download.virtualbox.org/virtualbox/$VBOX_VERSION/VBoxGuestAdditions_$VBOX_VERSION.iso" unless !no_remote
56
+ end
57
+
35
58
  end
36
59
  end
@@ -0,0 +1,83 @@
1
+ module VagrantVbguest
2
+
3
+ # This implementation is based on Action::Box::Download by vagrant
4
+ #
5
+ # This adoption does not run as a action/middleware, but is called manually
6
+ #
7
+ # MIT License - Mitchell Hashimoto and John Bender - https://github.com/mitchellh/vagrant
8
+ #
9
+ #
10
+ #
11
+ class Download
12
+
13
+ BASENAME = "vbguest"
14
+
15
+ include Vagrant::Util
16
+
17
+ attr_reader :temp_path
18
+
19
+ def initialize(env)
20
+ @env = env
21
+ @env["download.classes"] ||= []
22
+ @env["download.classes"] += [Vagrant::Downloaders::HTTP, Vagrant::Downloaders::File]
23
+ @downloader = nil
24
+ end
25
+
26
+ def instantiate_downloader
27
+ # Assign to a temporary variable since this is easier to type out,
28
+ # since it is used so many times.
29
+ classes = @env["download.classes"]
30
+
31
+ # Find the class to use.
32
+ classes.each_index do |i|
33
+ klass = classes[i]
34
+
35
+ # Use the class if it matches the given URI or if this
36
+ # is the last class...
37
+ if classes.length == (i + 1) || klass.match?(@env[:iso_url])
38
+ @env[:ui].info I18n.t("vagrant.plugins.vbguest.download.with", :class => klass.to_s)
39
+ @downloader = klass.new(@env[:ui])
40
+ break
41
+ end
42
+ end
43
+
44
+ # This line should never be reached, but we'll keep this here
45
+ # just in case for now.
46
+ raise Errors::BoxDownloadUnknownType if !@downloader
47
+
48
+ @downloader.prepare(@env[:iso_url])
49
+ true
50
+ end
51
+
52
+ def download
53
+ if instantiate_downloader
54
+ with_tempfile do |tempfile|
55
+ download_to(tempfile)
56
+ @temp_path = @env["download.temp_path"] = tempfile.path
57
+ end
58
+ end
59
+ end
60
+
61
+ def cleanup
62
+ if temp_path && File.exist?(temp_path)
63
+ @env[:ui].info I18n.t("vagrant.plugins.vbguest.download.cleaning")
64
+ File.unlink(temp_path)
65
+ end
66
+ end
67
+
68
+ def with_tempfile
69
+ File.open(iso_temp_path, Platform.tar_file_options) do |tempfile|
70
+ yield tempfile
71
+ end
72
+ end
73
+
74
+ def iso_temp_path
75
+ @env[:tmp_path].join(BASENAME + Time.now.to_i.to_s)
76
+ end
77
+
78
+ def download_to(f)
79
+ @downloader.download!(@env[:iso_url], f)
80
+ end
81
+
82
+ end
83
+ end
@@ -5,8 +5,13 @@ module VagrantVbguest
5
5
  class Installer
6
6
 
7
7
  def initialize(vm, options = {})
8
+ @env = {
9
+ :ui => vm.ui,
10
+ :tmp_path => vm.env.tmp_path
11
+ }
8
12
  @vm = vm
9
13
  @options = options
14
+ @iso_path = nil
10
15
  end
11
16
 
12
17
  def run!
@@ -20,15 +25,17 @@ module VagrantVbguest
20
25
  raise Vagrant::Errors::VMNotRunningError if @vm.state != :running
21
26
 
22
27
  if @options[:auto_update]
28
+
23
29
  @vm.ui.success(I18n.t("vagrant.plugins.vbguest.guest_ok", :version => guest_version)) unless needs_update?
30
+ @vm.ui.warn(I18n.t("vagrant.plugins.vbguest.check_failed", :host => vb_version, :guest => guest_version)) if @options[:no_install]
24
31
 
25
- if @options[:force] || needs_update?
32
+ if @options[:force] || (!@options[:no_install] && needs_update?)
26
33
  @vm.ui.warn(I18n.t("vagrant.plugins.vbguest.installing#{@options[:force] ? '_forced' : ''}", :host => vb_version, :guest => guest_version))
27
34
 
28
35
  # :TODO:
29
36
  # the whole installation process should be put into own classes
30
37
  # like the vagrant system loading
31
- if i_script = installer_script
38
+ if (i_script = installer_script)
32
39
  @vm.ui.info(I18n.t("vagrant.plugins.vbguest.start_copy_iso", :from => iso_path, :to => iso_destination))
33
40
  @vm.channel.upload(iso_path, iso_destination)
34
41
 
@@ -52,8 +59,9 @@ module VagrantVbguest
52
59
  $stdout.puts
53
60
  end
54
61
  end
55
-
56
62
  end
63
+ ensure
64
+ cleanup
57
65
  end
58
66
 
59
67
  def needs_update?
@@ -73,14 +81,14 @@ module VagrantVbguest
73
81
  plattform = @vm.guest.distro_dispatch
74
82
  case plattform
75
83
  when :debian, :ubuntu
76
- return File.expand_path("../../../files/setup_debian.sh", __FILE__)
84
+ File.expand_path("../../../files/setup_debian.sh", __FILE__)
77
85
  when :gentoo, :redhat, :suse, :arch, :linux
78
86
  @vm.ui.warn(I18n.t("vagrant.plugins.vbguest.generic_install_script_for_plattform", :plattform => plattform.to_s))
79
- return File.expand_path("../../../files/setup_linux.sh", __FILE__)
87
+ File.expand_path("../../../files/setup_linux.sh", __FILE__)
88
+ else
89
+ @vm.ui.error(I18n.t("vagrant.plugins.vbguest.no_install_script_for_plattform", :plattform => plattform.to_s))
90
+ nil
80
91
  end
81
- @vm.ui.error(I18n.t("vagrant.plugins.vbguest.no_install_script_for_plattform", :plattform => plattform.to_s))
82
-
83
- nil
84
92
  end
85
93
 
86
94
  def installer_destination
@@ -92,8 +100,26 @@ module VagrantVbguest
92
100
  end
93
101
 
94
102
  def iso_path
95
- @options[:iso_path]
103
+ @iso_path ||= begin
104
+ @env[:iso_url] ||= @options[:iso_path].gsub '$VBOX_VERSION', vb_version
105
+
106
+ if local_iso?
107
+ @env[:iso_url]
108
+ else
109
+ @download = VagrantVbguest::Download.new(@env)
110
+ @download.download
111
+ @download.temp_path
112
+ end
113
+ end
96
114
  end
97
- end
98
115
 
99
- end
116
+ def local_iso?
117
+ ::File.file?(@env[:iso_url])
118
+ end
119
+
120
+ def cleanup
121
+ @download.cleanup if @download
122
+ end
123
+
124
+ end
125
+ end
@@ -1,3 +1,3 @@
1
1
  module VagrantVbguest
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
data/locales/en.yml CHANGED
@@ -3,10 +3,22 @@ en:
3
3
  plugins:
4
4
  vbguest:
5
5
  guest_ok: "Detected Virtualbox Guest Additions %{version} --- OK."
6
+ check_failed: "Virtualbox Guest Additions on host: %{host} - guest's version is %{guest}"
6
7
  installing: "Installing Virtualbox Guest Additions %{host} - guest's version is %{guest}"
7
8
  installing_forced: "Forcing installation of Virtualbox Guest Additions %{host} - guest's version is %{guest}"
8
- missing_iso_path: "Could not autodetect the correct location of the Virtualbox Guest Additions ISO File. Or the Path provided is not correct. \nPlease configure using `config.vbguest.iso_path`. \nOn Mac this is most likely: '/Applications/VirtualBox.app/Contents/MacOS/VBoxGuestAdditions.iso' "
9
9
  start_copy_iso: "Copy iso file %{from} into the box %{to}"
10
10
  start_copy_script: "Copy installer file %{from} into the box %{to}"
11
- no_install_script_for_plattform: "Sorry, not shure how to install on a %{plattform} system. Stopping installation."
12
- generic_install_script_for_plattform: "%{plattform} is currently not supported, but i'll try generic linux way ... "
11
+ no_install_script_for_plattform: "Sorry, don't know how to install on a %{plattform} system. Stopping installation."
12
+ generic_install_script_for_plattform: "%{plattform} is currently not supported, but i'll try generic linux way ... "
13
+
14
+ validation_errors:
15
+ missing_iso_path: |-
16
+ Could not autodetect the correct location of the Virtualbox Guest Additions
17
+ ISO File. Please correct or configure using `config.vbguest.iso_path`.
18
+ If you think this is a bug in vbguest and we could guessed the iso_path,
19
+ please file a bug: https://github.com/dotless-de/vagrant-vbguest/issues
20
+
21
+ download:
22
+ with: "Downloading VirtualBox Guest Additions ISO with %{class}..."
23
+ cleaning: "Cleaning up downloaded VirtualBox Guest Additions ISO..."
24
+ unknown_type: "Unknown or unsupported URI type given for VirtualBox Guest Additions ISO download."
@@ -21,7 +21,7 @@ Gem::Specification.new do |s|
21
21
  # s.add_runtime_dependency "rest-client"
22
22
 
23
23
  s.add_dependency "virtualbox", "~> 0.9.1"
24
- s.add_dependency "vagrant", "~> 0.9.0"
24
+ s.add_dependency "vagrant", ">= 0.9.4"
25
25
  s.add_development_dependency "bundler", ">= 1.0.0"
26
26
 
27
27
  s.files = `git ls-files`.split("\n")
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-vbguest
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-31 00:00:00.000000000Z
12
+ date: 2012-03-05 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: virtualbox
16
- requirement: &70099278464040 !ruby/object:Gem::Requirement
16
+ requirement: &70295089810860 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,21 +21,21 @@ dependencies:
21
21
  version: 0.9.1
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70099278464040
24
+ version_requirements: *70295089810860
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: vagrant
27
- requirement: &70099278463460 !ruby/object:Gem::Requirement
27
+ requirement: &70295089810380 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
- - - ~>
30
+ - - ! '>='
31
31
  - !ruby/object:Gem::Version
32
- version: 0.9.0
32
+ version: 0.9.4
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70099278463460
35
+ version_requirements: *70295089810380
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: bundler
38
- requirement: &70099278462900 !ruby/object:Gem::Requirement
38
+ requirement: &70295089809920 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,7 +43,7 @@ dependencies:
43
43
  version: 1.0.0
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70099278462900
46
+ version_requirements: *70295089809920
47
47
  description: A Vagrant plugin wich automatically installs the host's VirtualBox Guest
48
48
  Additions on the guest system.
49
49
  email:
@@ -62,6 +62,7 @@ files:
62
62
  - lib/vagrant-vbguest.rb
63
63
  - lib/vagrant-vbguest/command.rb
64
64
  - lib/vagrant-vbguest/config.rb
65
+ - lib/vagrant-vbguest/download.rb
65
66
  - lib/vagrant-vbguest/installer.rb
66
67
  - lib/vagrant-vbguest/middleware.rb
67
68
  - lib/vagrant-vbguest/version.rb