Merge pull request #1132 from rasa/1123-use-local-vboxguestadditions-iso
virtualbox: use local VBoxGuestAdditions.iso by default
This commit is contained in:
commit
0b63f4f9dc
|
@ -25,6 +25,9 @@ type Driver interface {
|
||||||
// Import a VM
|
// Import a VM
|
||||||
Import(string, string, string) error
|
Import(string, string, string) error
|
||||||
|
|
||||||
|
// The complete path to the Guest Additions ISO
|
||||||
|
Iso() (string, error)
|
||||||
|
|
||||||
// Checks if the VM with the given name is running.
|
// Checks if the VM with the given name is running.
|
||||||
IsRunning(string) (bool, error)
|
IsRunning(string) (bool, error)
|
||||||
|
|
||||||
|
|
|
@ -40,6 +40,35 @@ func (d *VBox42Driver) Delete(name string) error {
|
||||||
return d.VBoxManage("unregistervm", name, "--delete")
|
return d.VBoxManage("unregistervm", name, "--delete")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *VBox42Driver) Iso() (string, error) {
|
||||||
|
var stdout bytes.Buffer
|
||||||
|
|
||||||
|
cmd := exec.Command(d.VBoxManagePath, "list", "systemproperties")
|
||||||
|
cmd.Stdout = &stdout
|
||||||
|
if err := cmd.Run(); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
DefaultGuestAdditionsRe := regexp.MustCompile("Default Guest Additions ISO:(.*)")
|
||||||
|
|
||||||
|
for _, line := range strings.Split(stdout.String(), "\n") {
|
||||||
|
// Need to trim off CR character when running in windows
|
||||||
|
line = strings.TrimRight(line, "\r")
|
||||||
|
|
||||||
|
matches := DefaultGuestAdditionsRe.FindStringSubmatch(line)
|
||||||
|
if matches == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
isoname := strings.Trim(matches[1], " \r\n")
|
||||||
|
log.Printf("Found Default Guest Additions ISO: %s", isoname)
|
||||||
|
|
||||||
|
return isoname, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return "", fmt.Errorf("Cannot find \"Default Guest Additions ISO\" in vboxmanage output")
|
||||||
|
}
|
||||||
|
|
||||||
func (d *VBox42Driver) Import(name, path, opts string) error {
|
func (d *VBox42Driver) Import(name, path, opts string) error {
|
||||||
args := []string{
|
args := []string{
|
||||||
"import", path,
|
"import", path,
|
||||||
|
|
|
@ -19,6 +19,9 @@ type DriverMock struct {
|
||||||
ImportOpts string
|
ImportOpts string
|
||||||
ImportErr error
|
ImportErr error
|
||||||
|
|
||||||
|
IsoCalled bool
|
||||||
|
IsoErr error
|
||||||
|
|
||||||
IsRunningName string
|
IsRunningName string
|
||||||
IsRunningReturn bool
|
IsRunningReturn bool
|
||||||
IsRunningErr error
|
IsRunningErr error
|
||||||
|
@ -60,6 +63,11 @@ func (d *DriverMock) Import(name, path, opts string) error {
|
||||||
return d.ImportErr
|
return d.ImportErr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *DriverMock) Iso() (string, error) {
|
||||||
|
d.IsoCalled = true
|
||||||
|
return "", d.IsoErr
|
||||||
|
}
|
||||||
|
|
||||||
func (d *DriverMock) IsRunning(name string) (bool, error) {
|
func (d *DriverMock) IsRunning(name string) (bool, error) {
|
||||||
d.Lock()
|
d.Lock()
|
||||||
defer d.Unlock()
|
defer d.Unlock()
|
||||||
|
|
|
@ -62,14 +62,7 @@ func (s *StepDownloadGuestAdditions) Run(state multistep.StateBag) multistep.Ste
|
||||||
// Use provided version or get it from virtualbox.org
|
// Use provided version or get it from virtualbox.org
|
||||||
var checksum string
|
var checksum string
|
||||||
|
|
||||||
if s.GuestAdditionsSHA256 != "" {
|
checksumType := "sha256"
|
||||||
checksum = s.GuestAdditionsSHA256
|
|
||||||
} else {
|
|
||||||
checksum, action = s.downloadAdditionsSHA256(state, version, additionsName)
|
|
||||||
if action != multistep.ActionContinue {
|
|
||||||
return action
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Use the provided source (URL or file path) or generate it
|
// Use the provided source (URL or file path) or generate it
|
||||||
url := s.GuestAdditionsURL
|
url := s.GuestAdditionsURL
|
||||||
|
@ -86,10 +79,28 @@ func (s *StepDownloadGuestAdditions) Run(state multistep.StateBag) multistep.Ste
|
||||||
return multistep.ActionHalt
|
return multistep.ActionHalt
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
url = fmt.Sprintf(
|
url, err = driver.Iso()
|
||||||
"http://download.virtualbox.org/virtualbox/%s/%s",
|
|
||||||
version,
|
if err == nil {
|
||||||
additionsName)
|
checksumType = "none"
|
||||||
|
} else {
|
||||||
|
ui.Error(err.Error())
|
||||||
|
url = fmt.Sprintf(
|
||||||
|
"http://download.virtualbox.org/virtualbox/%s/%s",
|
||||||
|
version,
|
||||||
|
additionsName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if checksumType != "none" {
|
||||||
|
if s.GuestAdditionsSHA256 != "" {
|
||||||
|
checksum = s.GuestAdditionsSHA256
|
||||||
|
} else {
|
||||||
|
checksum, action = s.downloadAdditionsSHA256(state, version, additionsName)
|
||||||
|
if action != multistep.ActionContinue {
|
||||||
|
return action
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
url, err = common.DownloadableURL(url)
|
url, err = common.DownloadableURL(url)
|
||||||
|
@ -104,7 +115,7 @@ func (s *StepDownloadGuestAdditions) Run(state multistep.StateBag) multistep.Ste
|
||||||
|
|
||||||
downStep := &common.StepDownload{
|
downStep := &common.StepDownload{
|
||||||
Checksum: checksum,
|
Checksum: checksum,
|
||||||
ChecksumType: "sha256",
|
ChecksumType: checksumType,
|
||||||
Description: "Guest additions",
|
Description: "Guest additions",
|
||||||
ResultKey: "guest_additions_path",
|
ResultKey: "guest_additions_path",
|
||||||
Url: []string{url},
|
Url: []string{url},
|
||||||
|
|
|
@ -121,8 +121,9 @@ each category, the available options are alphabetized and described.
|
||||||
|
|
||||||
* `guest_additions_url` (string) - The URL to the guest additions ISO
|
* `guest_additions_url` (string) - The URL to the guest additions ISO
|
||||||
to upload. This can also be a file URL if the ISO is at a local path.
|
to upload. This can also be a file URL if the ISO is at a local path.
|
||||||
By default the VirtualBox builder will go and download the proper
|
By default, the VirtualBox builder will attempt to find the guest additions
|
||||||
guest additions ISO from the internet.
|
ISO on the local file system. If it is not available locally, the builder
|
||||||
|
will download the proper guest additions ISO from the internet.
|
||||||
|
|
||||||
* `guest_os_type` (string) - The guest OS type being installed. By default
|
* `guest_os_type` (string) - The guest OS type being installed. By default
|
||||||
this is "other", but you can get _dramatic_ performance improvements by
|
this is "other", but you can get _dramatic_ performance improvements by
|
||||||
|
|
Loading…
Reference in New Issue