Class: VagrantVbguest::Installers::Base

Inherits:
Object
  • Object
show all
Includes:
Helpers::VmCompatible
Defined in:
lib/vagrant-vbguest/installers/base.rb

Overview

This is the base class all installers must inherit from It defines the basic structure of an Installer and should never be used directly

Direct Known Subclasses

Linux

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Helpers::VmCompatible

#communicate, #driver, included

Constructor Details

#initialize(vm, options = nil) ⇒ Base

Returns a new instance of Base.



44
45
46
47
48
49
50
# File 'lib/vagrant-vbguest/installers/base.rb', line 44

def initialize(vm, options=nil)
  @vm = vm
  @env = vm.env
  @options = options

  @host = VagrantVbguest::Hosts::VirtualBox.new(vm, options)
end

Instance Attribute Details

#envObject (readonly)

Returns the value of attribute env.



42
43
44
# File 'lib/vagrant-vbguest/installers/base.rb', line 42

def env
  @env
end

#hostObject (readonly)

Returns the value of attribute host.



42
43
44
# File 'lib/vagrant-vbguest/installers/base.rb', line 42

def host
  @host
end

#optionsObject (readonly)

Returns the value of attribute options.



42
43
44
# File 'lib/vagrant-vbguest/installers/base.rb', line 42

def options
  @options
end

#vmObject (readonly)

Returns the value of attribute vm.



42
43
44
# File 'lib/vagrant-vbguest/installers/base.rb', line 42

def vm
  @vm
end

Class Method Details

.distro(vm) ⇒ Symbol

A helper method to cache the result of Vagrant::Guest::Base#distro_dispatch which speeds up Installer detection runs a lot, when having lots of Linux based Installer classes to check.

Returns:

  • (Symbol)

    One of ‘:debian`, `:ubuntu`, `:gentoo`, `:fedora`, `:redhat`, `:suse`, `:arch`, `:windows`, `:amazon`

See Also:

  • {Vagrant{Vagrant::Guest{Vagrant::Guest::Linux{Vagrant::Guest::Linux#distro_dispatch}


37
38
39
40
# File 'lib/vagrant-vbguest/installers/base.rb', line 37

def self.distro(vm)
  @@distro ||= {}
  @@distro[ vm_id(vm) ] ||= distro_name vm
end

.match?(vm) ⇒ Boolean

Tests whether this installer class is applicable to the current environment. Usually, testing for a specific OS. Subclasses must override this method and return ‘true` if they wish to handle.

This method will be called only when an Installer detection is run. It is ignored, when passing an Installer class directly as an config (‘installer`) option.

Parameters:

  • vm (Vagrant::VM)

Returns:

  • (Boolean)


26
27
28
# File 'lib/vagrant-vbguest/installers/base.rb', line 26

def self.match?(vm)
  false
end

Instance Method Details

#cleanupObject

A helper method to delete the uploaded GuestAdditions iso file from the guest box



208
209
210
211
212
213
214
215
# File 'lib/vagrant-vbguest/installers/base.rb', line 208

def cleanup
  unless options[:no_cleanup]
    @host.cleanup
    communicate.execute("test -f #{tmp_path} && rm #{tmp_path}", :error_check => false) do |type, data|
      env.ui.error(data.chomp, :prefix => false)
    end
  end
end

#guest_version(reload = false) ⇒ String

Determinates the GuestAdditions version installed on the guest system.

Parameters:

  • reload (Boolean) (defaults to: false)

    Whether to read the value again or use the cached value form an erlier call.

Returns:

  • (String)

    The version code of the VirtualBox Guest Additions available on the guest, or ‘nil` if none installed.



134
135
136
137
138
139
140
141
# File 'lib/vagrant-vbguest/installers/base.rb', line 134

def guest_version(reload=false)
  return @guest_version if @guest_version && !reload

  guest_version = @host.read_guest_additions_version
  guest_version = !guest_version ? nil : guest_version[/\d+\.\d+\.\d+/]

  @guest_version = guest_version
end

#install(opts = nil) {|type, data| ... } ⇒ Object

Handles the installation process. All necessary steps for an installation must be defined here. This includes uploading the iso into the box, mounting, installing and cleaning up. The path to the local iso file should be obtained by calling iso_file Subclasses must override this method!

Parameters:

  • opts (Hash) (defaults to: nil)

    Optional options Hash wich meight get passed to Vagrant::Communication::SSH#execute and firends

Yields:

  • (type, data)

    Takes a Block like Vagrant::Communication::Base#execute for realtime output of the command being executed

Yield Parameters:

  • type (String)

    Type of the output, ‘:stdout`, `:stderr`, etc.

  • data (String)

    Data for the given output.



78
79
# File 'lib/vagrant-vbguest/installers/base.rb', line 78

def install(opts=nil, &block)
end

#installer_version(path_to_installer) ⇒ String

Determinates the version of the GuestAdditions installer in use

Returns:

  • (String)

    The version code of the GuestAdditions installer



147
148
149
150
151
152
153
154
155
# File 'lib/vagrant-vbguest/installers/base.rb', line 147

def installer_version(path_to_installer)
  version = nil
  communicate.sudo("#{path_to_installer} --info", :error_check => false) do |type, data|
    if (v = data.to_s.match(/\AIdentification.*\s(\d+\.\d+.\d+)/i))
      version = v[1]
    end
  end
  version
end

#iso_fileObject Also known as: additions_file



188
189
190
# File 'lib/vagrant-vbguest/installers/base.rb', line 188

def iso_file
  @host.additions_file
end

#mount_pointString

The mountpoint path Subclasses shall override this method, if they need to mount the uploaded file!

Returns:

  • (String)


64
65
# File 'lib/vagrant-vbguest/installers/base.rb', line 64

def mount_point
end

#rebuild(opts = nil) {|type, data| ... } ⇒ Object

Handels the rebuild of allready running GuestAdditions It may happen, that the guest has the correct GuestAdditions version running, but not the kernel module is not running. This method should perform a rebuild or try to reload the kernel module without the GuestAdditions iso file. If there is no way of rebuidling or reloading the GuestAdditions on a specific system, this method should left empty. Subclasses should override this method.

Parameters:

  • opts (Hash) (defaults to: nil)

    Optional options Hash wich meight get passed to Vagrant::Communication::SSH#execute and firends

Yields:

  • (type, data)

    Takes a Block like Vagrant::Communication::Base#execute for realtime output of the command being executed

Yield Parameters:

  • type (String)

    Type of the output, ‘:stdout`, `:stderr`, etc.

  • data (String)

    Data for the given output.



95
96
# File 'lib/vagrant-vbguest/installers/base.rb', line 95

def rebuild(opts=nil, &block)
end

#running?(opts = nil, &block) ⇒ Boolean

Determinates if the GuestAdditions kernel module is loaded. This method tests if there is a working GuestAdditions kernel module. If there is none, #rebuild is beeing called. If there is no way of telling if there is a working GuestAddition for a specific system, this method should return ‘true`. Subclasses should override this method.

Returns:

  • (Boolean)

    ‘true` if the kernel module is loaded (and thus seems to work), `false` otherwise.



123
124
125
# File 'lib/vagrant-vbguest/installers/base.rb', line 123

def running?(opts=nil, &block)
  true
end

#start(opts = nil) {|type, data| ... } ⇒ Object

Restarts the allready installed GuestAdditions It may happen, that the guest has the correct GuestAdditions version installed, but for some reason are not (yet) runnig. This method should execute the GuestAdditions system specific init script in order to start it manually. If there is no way of doing this on a specific system, this method should left empty. Subclasses should override this method.

Parameters:

  • opts (Hash) (defaults to: nil)

    Optional options Hash wich meight get passed to Vagrant::Communication::SSH#execute and firends

Yields:

  • (type, data)

    Takes a Block like Vagrant::Communication::Base#execute for realtime output of the command being executed

Yield Parameters:

  • type (String)

    Type of the output, ‘:stdout`, `:stderr`, etc.

  • data (String)

    Data for the given output.



111
112
# File 'lib/vagrant-vbguest/installers/base.rb', line 111

def start(opts=nil, &block)
end

#tmp_pathString

The absolute file path of the GuestAdditions iso file should be uploaded into the guest. Subclasses must override this method!

Returns:

  • (String)


57
58
# File 'lib/vagrant-vbguest/installers/base.rb', line 57

def tmp_path
end

#upload(file) ⇒ Object

A helper method to handle the GuestAdditions iso file upload into the guest box. The file will uploaded to the location given by the temp_path method.

Examples:

Default upload

upload(file)

Parameters:

  • file (String)

    Path of the file to upload to the +tmp_path*



201
202
203
204
# File 'lib/vagrant-vbguest/installers/base.rb', line 201

def upload(file)
  env.ui.info(I18n.t("vagrant_vbguest.start_copy_iso", :from => file, :to => tmp_path))
  communicate.upload(file, tmp_path)
end

#yield_installation_error_warning(path_to_installer) ⇒ Object Also known as: yield_installation_waring

Helper to yield a warning message to the user in the event that the installer returned a non-zero exit status. Because lack of a window system will cause this result in VirtualBox 4.2.8+, we don’t want to kill the entire boot process, but we do want to make sure the user knows there could be a problem. The message includles the installer version.



181
182
183
184
# File 'lib/vagrant-vbguest/installers/base.rb', line 181

def yield_installation_error_warning(path_to_installer)
  @env.ui.warn I18n.t("vagrant_vbguest.install_error",
    :installer_version => installer_version(path_to_installer) || I18n.t("vagrant_vbguest.unknown"))
end

#yield_installation_warning(path_to_installer) ⇒ Object

Helper to yield a warning message to the user, that the installation will start now. The message includes the host and installer version strings.



160
161
162
163
164
# File 'lib/vagrant-vbguest/installers/base.rb', line 160

def yield_installation_warning(path_to_installer)
  @env.ui.warn I18n.t("vagrant_vbguest.installing#{@options[:force] ? '_forced' : ''}",
    :guest_version     => (guest_version || I18n.t("vagrant_vbguest.unknown")),
    :installer_version => installer_version(path_to_installer) || I18n.t("vagrant_vbguest.unknown"))
end

#yield_rebuild_warningObject

Helper to yield a warning message to the user, that the installation will be rebuild using the installed GuestAdditions. The message includes the host and installer version strings.



169
170
171
172
173
# File 'lib/vagrant-vbguest/installers/base.rb', line 169

def yield_rebuild_warning
  @env.ui.warn I18n.t("vagrant_vbguest.rebuild#{@options[:force] ? '_forced' : ''}",
    :guest_version => guest_version(true),
    :host_version => @host.version)
end