Commit 0b63f4f9 authored by Mitchell Hashimoto's avatar Mitchell Hashimoto

Merge pull request #1132 from rasa/1123-use-local-vboxguestadditions-iso

virtualbox: use local VBoxGuestAdditions.iso by default
parents 34834057 7736151a
...@@ -25,6 +25,9 @@ type Driver interface { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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. ...@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment