mirror of
https://github.com/hashicorp/packer.git
synced 2026-09-26 01:34:00 -04:00
this regroups the calls of tmp func calls into one package. the tmp pkg allows to store tmp files under a common directory for easier managment Squashed commit of the following: commit74b674c015Merge:fc94b571466001525dAuthor: Matthew Patton <[email protected]> Date: Fri Nov 2 02:02:38 2018 -0400 Merge branch 'remove_TMPDIR_docs' of github.com:tb3088/packer into remove_TMPDIR_docs commitfc94b57142Author: Matthew Patton <[email protected]> Date: Fri Nov 2 01:42:38 2018 -0400 update tests to honor configured temporary directory commit5a562359f4Author: Matthew Patton <[email protected]> Date: Thu Nov 1 18:52:38 2018 -0400 sync straggler to refactor. implement tests at packer/configfile instead of buried in docker. commit9d5a4a0935Author: Matthew Patton <[email protected]> Date: Thu Nov 1 15:39:46 2018 -0400 insert URL to GoLang API for os.TempDir() commitfbae4c2e05Author: Matthew Patton <[email protected]> Date: Thu Nov 1 07:41:29 2018 -0400 revise documentation to match code commit3590fae8bdAuthor: Matthew Patton <[email protected]> Date: Thu Nov 1 07:21:59 2018 -0400 refacter config_file. replace all hard-coded os.TempDir with wrapper commitd5c5306a97Author: Matthew Patton <[email protected]> Date: Wed Oct 31 20:11:36 2018 -0400 close massive file overwrite hole with TempDir commit0a72297da8Author: Matthew Patton <[email protected]> Date: Wed Oct 31 01:06:00 2018 -0400 adjust var declaration scope commit20f68228b6Author: Matthew Patton <[email protected]> Date: Wed Oct 31 00:54:35 2018 -0400 use mktemp() equivalent to create temporary directory commitc73ebe3d83Author: Matthew Patton <[email protected]> Date: Tue Oct 30 20:40:58 2018 -0400 remove extraneous variable declaration, fix FOR loop commit63549b8bd7Author: Matthew Patton <[email protected]> Date: Tue Oct 30 19:30:44 2018 -0400 match styistic convension with rest of docs commit9761010749Author: Matthew Patton <[email protected]> Date: Tue Oct 30 19:08:39 2018 -0400 revert dangling config file change commit95159afbc0Author: Matthew Patton <[email protected]> Date: Fri Dec 29 23:53:43 2017 -0500 replace invalid TMPDIR variable wth PACKER_TMP_DIR. update ConfigTmpDir() to try common temporary paths first and only write to configDir() as a last resort. commit66001525d7Author: Matthew Patton <[email protected]> Date: Fri Nov 2 01:42:38 2018 -0400 update tests to honor configured temporary directory commite9b6adefeaAuthor: Matthew Patton <[email protected]> Date: Thu Nov 1 18:52:38 2018 -0400 sync straggler to refactor. implement tests at packer/configfile instead of buried in docker. commit852113ed07Author: Matthew Patton <[email protected]> Date: Thu Nov 1 15:39:46 2018 -0400 insert URL to GoLang API for os.TempDir() commit54add38d1dAuthor: Matthew Patton <[email protected]> Date: Thu Nov 1 07:41:29 2018 -0400 revise documentation to match code commit6b5b8f6d4eAuthor: Matthew Patton <[email protected]> Date: Thu Nov 1 07:21:59 2018 -0400 refacter config_file. replace all hard-coded os.TempDir with wrapper commitc22092c601Author: Matthew Patton <[email protected]> Date: Wed Oct 31 20:11:36 2018 -0400 close massive file overwrite hole with TempDir commit7a73045091Author: Matthew Patton <[email protected]> Date: Wed Oct 31 01:06:00 2018 -0400 adjust var declaration scope commit0f2933adb6Author: Matthew Patton <[email protected]> Date: Wed Oct 31 00:54:35 2018 -0400 use mktemp() equivalent to create temporary directory commitd74839ede0Author: Matthew Patton <[email protected]> Date: Tue Oct 30 20:40:58 2018 -0400 remove extraneous variable declaration, fix FOR loop commiteb65416619Author: Matthew Patton <[email protected]> Date: Tue Oct 30 19:30:44 2018 -0400 match styistic convension with rest of docs commitacaa2b31edAuthor: Matthew Patton <[email protected]> Date: Tue Oct 30 19:08:39 2018 -0400 revert dangling config file change commite573fde668Author: Matthew Patton <[email protected]> Date: Fri Dec 29 23:53:43 2017 -0500 replace invalid TMPDIR variable wth PACKER_TMP_DIR. update ConfigTmpDir() to try common temporary paths first and only write to configDir() as a last resort. commit39a9874afcMerge:8a413cfe83315812c2Author: Matthew Patton <[email protected]> Date: Tue Oct 30 18:19:26 2018 -0400 Merge branch 'master' of https://github.com/hashicorp/packer into prestine commit8a413cfe83Merge:e07491de54e14710a6Author: Matthew Patton <[email protected]> Date: Mon Oct 1 20:18:10 2018 -0400 Merge remote-tracking branch 'upstream/master' into prestine commite07491de59Merge:42610a35da1fa35dffAuthor: Matthew Patton <[email protected]> Date: Tue Aug 21 13:26:19 2018 -0400 Merge remote-tracking branch 'upstream/master' into prestine commit42610a35d5Merge:5298142da0d63cf7bcAuthor: Matthew Patton <[email protected]> Date: Tue Jun 19 22:45:05 2018 -0400 Merge remote-tracking branch 'upstream/master' into prestine commit5298142da6Merge:7bb110bc79d9736552Author: Matthew Patton <[email protected]> Date: Mon Jun 11 15:10:09 2018 -0400 Merge remote-tracking branch 'upstream/master' into prestine commit7bb110bc74Merge:a61c869ca6189d66e7Author: Matthew Patton <[email protected]> Date: Wed May 9 23:41:22 2018 -0400 Merge remote-tracking branch 'upstream/master' into prestine commita61c869ca7Merge:098101dd94be5f072cAuthor: Matthew Patton <[email protected]> Date: Fri May 4 10:13:04 2018 -0400 Merge remote-tracking branch 'upstream/master' into prestine commit098101dd99Merge:fefaf0fa6554b2b4a5Author: Matthew Patton <[email protected]> Date: Tue May 1 20:52:30 2018 -0400 Merge branch 'EOL-handling' into prestine Co-Authored-By: Matthew Patton <[email protected]>
134 lines
3.0 KiB
Go
134 lines
3.0 KiB
Go
package common
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"io"
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"github.com/hashicorp/packer/helper/multistep"
|
|
"github.com/hashicorp/packer/packer"
|
|
"github.com/hashicorp/packer/packer/tmp"
|
|
)
|
|
|
|
// This step attaches the ISO to the virtual machine.
|
|
//
|
|
// Uses:
|
|
// driver Driver
|
|
// ui packer.Ui
|
|
// vmName string
|
|
//
|
|
// Produces:
|
|
type StepAttachFloppy struct {
|
|
floppyPath string
|
|
}
|
|
|
|
func (s *StepAttachFloppy) Run(_ context.Context, state multistep.StateBag) multistep.StepAction {
|
|
// Determine if we even have a floppy disk to attach
|
|
var floppyPath string
|
|
if floppyPathRaw, ok := state.GetOk("floppy_path"); ok {
|
|
floppyPath = floppyPathRaw.(string)
|
|
} else {
|
|
log.Println("No floppy disk, not attaching.")
|
|
return multistep.ActionContinue
|
|
}
|
|
|
|
// VirtualBox is really dumb and can't figure out the format of the file
|
|
// without an extension, so we need to add the "vfd" extension to the
|
|
// floppy.
|
|
floppyPath, err := s.copyFloppy(floppyPath)
|
|
if err != nil {
|
|
state.Put("error", fmt.Errorf("Error preparing floppy: %s", err))
|
|
return multistep.ActionHalt
|
|
}
|
|
|
|
driver := state.Get("driver").(Driver)
|
|
ui := state.Get("ui").(packer.Ui)
|
|
vmName := state.Get("vmName").(string)
|
|
|
|
ui.Say("Attaching floppy disk...")
|
|
|
|
// Create the floppy disk controller
|
|
command := []string{
|
|
"storagectl", vmName,
|
|
"--name", "Floppy Controller",
|
|
"--add", "floppy",
|
|
}
|
|
if err := driver.VBoxManage(command...); err != nil {
|
|
state.Put("error", fmt.Errorf("Error creating floppy controller: %s", err))
|
|
return multistep.ActionHalt
|
|
}
|
|
|
|
// Attach the floppy to the controller
|
|
command = []string{
|
|
"storageattach", vmName,
|
|
"--storagectl", "Floppy Controller",
|
|
"--port", "0",
|
|
"--device", "0",
|
|
"--type", "fdd",
|
|
"--medium", floppyPath,
|
|
}
|
|
if err := driver.VBoxManage(command...); err != nil {
|
|
state.Put("error", fmt.Errorf("Error attaching floppy: %s", err))
|
|
return multistep.ActionHalt
|
|
}
|
|
|
|
// Track the path so that we can unregister it from VirtualBox later
|
|
s.floppyPath = floppyPath
|
|
|
|
return multistep.ActionContinue
|
|
}
|
|
|
|
func (s *StepAttachFloppy) Cleanup(state multistep.StateBag) {
|
|
if s.floppyPath == "" {
|
|
return
|
|
}
|
|
|
|
// Delete the floppy disk
|
|
defer os.Remove(s.floppyPath)
|
|
|
|
driver := state.Get("driver").(Driver)
|
|
vmName := state.Get("vmName").(string)
|
|
|
|
command := []string{
|
|
"storageattach", vmName,
|
|
"--storagectl", "Floppy Controller",
|
|
"--port", "0",
|
|
"--device", "0",
|
|
"--medium", "none",
|
|
}
|
|
|
|
if err := driver.VBoxManage(command...); err != nil {
|
|
log.Printf("Error unregistering floppy: %s", err)
|
|
}
|
|
}
|
|
|
|
func (s *StepAttachFloppy) copyFloppy(path string) (string, error) {
|
|
tempdir, err := tmp.Dir("virtualbox")
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
floppyPath := filepath.Join(tempdir, "floppy.vfd")
|
|
f, err := os.Create(floppyPath)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
defer f.Close()
|
|
|
|
sourceF, err := os.Open(path)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
defer sourceF.Close()
|
|
|
|
log.Printf("Copying floppy to temp location: %s", floppyPath)
|
|
if _, err := io.Copy(f, sourceF); err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return floppyPath, nil
|
|
}
|