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, Windows

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

#cleanup(opts, &block) ⇒ Object

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



242
243
244
245
246
247
248
249
250
# File 'lib/vagrant-vbguest/installers/base.rb', line 242

def cleanup(opts, &block)
  unless options[:no_cleanup]
    @host.cleanup

    opts = (opts || {}).merge(:error_check => false)
    block ||= proc { |type, data| env.ui.error(data.chomp, :prefix => false) }
    communicate.execute("test -f #{tmp_path} && rm #{tmp_path}", opts, &block)
  end
end

#guest_version(reload = false) ⇒ Gem::Version

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 earlier call.

Returns:

  • (Gem::Version)

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



155
156
157
158
159
# File 'lib/vagrant-vbguest/installers/base.rb', line 155

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

  @guest_version = VagrantVbguest::Version(@host.read_guest_additions_version)
end

#host_version(reload = false) ⇒ Gem::Version

Determinates the host (eg VirtualBox) version

Parameters:

  • reload (Boolean) (defaults to: false)

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

Returns:

  • (Gem::Version)

    The version code of the host provider



165
166
167
168
169
# File 'lib/vagrant-vbguest/installers/base.rb', line 165

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

  @host_version = VagrantVbguest::Version(@host.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_optionsObject



184
185
186
# File 'lib/vagrant-vbguest/installers/base.rb', line 184

def installer_options
  options[:installer_options] || {}
end

#installer_version(path_to_installer) ⇒ Gem::Version

Determinates the version of the GuestAdditions installer in use

Returns:

  • (Gem::Version)

    The version code of the GuestAdditions installer



175
176
177
178
179
180
181
182
# File 'lib/vagrant-vbguest/installers/base.rb', line 175

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

#iso_fileObject Also known as: additions_file



222
223
224
# File 'lib/vagrant-vbguest/installers/base.rb', line 222

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

#provides_vboxadd_tools?Boolean

Does the guest installer provide tooling to manually start or rebuild guest additions?

Returns:

  • (Boolean)


137
138
139
# File 'lib/vagrant-vbguest/installers/base.rb', line 137

def provides_vboxadd_tools?
  false
end

#reboot_after_install?Boolean

This manipulate the run-list of a the vbguest machine.

Returns:

  • (Boolean)


130
131
132
# File 'lib/vagrant-vbguest/installers/base.rb', line 130

def reboot_after_install?
  false
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 being 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*



235
236
237
238
# File 'lib/vagrant-vbguest/installers/base.rb', line 235

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

#vboxadd_tools_available?Boolean

Is the tooling to manually start or rebuild guest additions installed on the guest?

Returns:

  • (Boolean)

Raises:

  • (NotImplementedError)


144
145
146
# File 'lib/vagrant-vbguest/installers/base.rb', line 144

def vboxadd_tools_available?
  raise NotImplementedError
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.



214
215
216
217
218
# File 'lib/vagrant-vbguest/installers/base.rb', line 214

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.



191
192
193
194
195
196
# File 'lib/vagrant-vbguest/installers/base.rb', line 191

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.



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

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