parent
89c143bd3c
commit
58fd5aec61
|
@ -25,6 +25,9 @@ type Driver interface {
|
|||
// Import a VM
|
||||
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.
|
||||
IsRunning(string) (bool, error)
|
||||
|
||||
|
|
|
@ -40,6 +40,35 @@ func (d *VBox42Driver) Delete(name string) error {
|
|||
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 {
|
||||
args := []string{
|
||||
"import", path,
|
||||
|
|
|
@ -19,6 +19,9 @@ type DriverMock struct {
|
|||
ImportOpts string
|
||||
ImportErr error
|
||||
|
||||
IsoCalled bool
|
||||
IsoErr error
|
||||
|
||||
IsRunningName string
|
||||
IsRunningReturn bool
|
||||
IsRunningErr error
|
||||
|
@ -60,6 +63,11 @@ func (d *DriverMock) Import(name, path, opts string) error {
|
|||
return d.ImportErr
|
||||
}
|
||||
|
||||
func (d *DriverMock) Iso() (string, error) {
|
||||
d.IsoCalled = true
|
||||
return "", d.IsoErr
|
||||
}
|
||||
|
||||
func (d *DriverMock) IsRunning(name string) (bool, error) {
|
||||
d.Lock()
|
||||
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
|
||||
var checksum string
|
||||
|
||||
if s.GuestAdditionsSHA256 != "" {
|
||||
checksum = s.GuestAdditionsSHA256
|
||||
} else {
|
||||
checksum, action = s.downloadAdditionsSHA256(state, version, additionsName)
|
||||
if action != multistep.ActionContinue {
|
||||
return action
|
||||
}
|
||||
}
|
||||
checksumType := "sha256"
|
||||
|
||||
// Use the provided source (URL or file path) or generate it
|
||||
url := s.GuestAdditionsURL
|
||||
|
@ -86,11 +79,29 @@ func (s *StepDownloadGuestAdditions) Run(state multistep.StateBag) multistep.Ste
|
|||
return multistep.ActionHalt
|
||||
}
|
||||
} else {
|
||||
url, err = driver.Iso()
|
||||
|
||||
if err == nil {
|
||||
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)
|
||||
if err != nil {
|
||||
|
@ -104,7 +115,7 @@ func (s *StepDownloadGuestAdditions) Run(state multistep.StateBag) multistep.Ste
|
|||
|
||||
downStep := &common.StepDownload{
|
||||
Checksum: checksum,
|
||||
ChecksumType: "sha256",
|
||||
ChecksumType: checksumType,
|
||||
Description: "Guest additions",
|
||||
ResultKey: "guest_additions_path",
|
||||
Url: []string{url},
|
||||
|
|
Loading…
Reference in New Issue