Commit 58fd5aec authored by Ross Smith II's avatar Ross Smith II

virtualbox: use local VBoxGuestAdditions.iso by default

fixes #1123
parent 89c143bd
...@@ -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},
......
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