Skip to content
This repository was archived by the owner on Feb 27, 2018. It is now read-only.

Commit dca1cfe

Browse files
Sven DowideitSven Dowideit
authored andcommitted
Merge pull request #222 from SvenDowideit/fix-windows-vbox-path
Fix windows vbox path, and dockerport forward off by default.
2 parents 6ce2d30 + d017998 commit dca1cfe

7 files changed

Lines changed: 106 additions & 48 deletions

File tree

cmds.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,10 @@ func cmdUp() error {
101101
func cmdConfig() error {
102102
dir, err := cfgDir(".boot2docker")
103103
if err != nil {
104-
return fmt.Errorf("Error working out Profile file location: %s", err)
104+
return fmt.Errorf("Error working out Profile file location: %s\n", err)
105105
}
106106
filename := cfgFilename(dir)
107-
fmt.Printf("boot2docker profile filename: %s", filename)
107+
fmt.Printf("boot2docker profile filename: %s\n", filename)
108108
fmt.Println(printConfig())
109109
return nil
110110
}
@@ -113,10 +113,10 @@ func cmdConfig() error {
113113
func cmdSave() error {
114114
m, err := driver.GetMachine(&B2D)
115115
if err != nil {
116-
return fmt.Errorf("Failed to get machine %q: %s", B2D.VM, err)
116+
return fmt.Errorf("Failed to get machine %q: %s\n", B2D.VM, err)
117117
}
118118
if err := m.Save(); err != nil {
119-
return fmt.Errorf("Failed to save machine %q: %s", B2D.VM, err)
119+
return fmt.Errorf("Failed to save machine %q: %s\n", B2D.VM, err)
120120
}
121121
return nil
122122
}

config.go

Lines changed: 34 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -83,26 +83,45 @@ func config() (*flag.FlagSet, error) {
8383
flags := flag.NewFlagSet(os.Args[0], flag.ContinueOnError)
8484
flags.Usage = func() { usageLong(flags) }
8585

86+
// Find out which driver we're usng and add its flags
87+
flags.StringVar(&B2D.Driver, "driver", "virtualbox", "hypervisor driver.")
88+
flags.BoolVarP(&B2D.Verbose, "verbose", "v", false, "display verbose command invocations.")
89+
90+
if err := flags.Parse([]string{}); err != nil {
91+
return nil, err
92+
}
93+
// Over-ride from the profile file
94+
filename := cfgFilename(B2D.Dir)
95+
if _, err := os.Lstat(filename); err == nil {
96+
if _, err := toml.DecodeFile(filename, &B2D); err != nil {
97+
return nil, err
98+
}
99+
}
100+
// for cmd==ssh only:
101+
// only pass the params up to and including the `ssh` command - after that,
102+
// there might be other -flags that are destined for the ssh cmd
103+
sshIdx := 1
104+
for sshIdx < len(os.Args) && os.Args[sshIdx-1] != "ssh" {
105+
sshIdx++
106+
}
107+
// Command-line overrides profile config.
108+
if err := flags.Parse(os.Args[1:sshIdx]); err != nil {
109+
return nil, err
110+
}
111+
if B2D.Verbose {
112+
fmt.Printf("Using %s driver\n", B2D.Driver)
113+
}
114+
driver.ConfigFlags(&B2D, flags)
115+
116+
// Add the generic flags
117+
86118
flags.StringVar(&B2D.VM, "vm", "boot2docker-vm", "virtual machine name.")
87119
// removed for now, requires re-parsing a new config file which is too messy
88120
//flags.StringVarP(&B2D.Dir, "dir", "d", dir, "boot2docker config directory.")
89121
B2D.Dir = dir
90122
flags.StringVar(&B2D.ISO, "iso", filepath.Join(dir, "boot2docker.iso"), "path to boot2docker ISO image.")
91-
flags.StringVar(&B2D.VMDK, "basevmdk", "", "Path to VMDK to use as base for persistent partition")
92-
vbm := "VBoxManage"
93-
if runtime.GOOS == "windows" {
94-
p := "C:\\Program Files\\Oracle\\VirtualBox"
95-
if t := os.Getenv("VBOX_INSTALL_PATH"); t != "" {
96-
p = t
97-
} else if t = os.Getenv("VBOX_MSI_INSTALL_PATH"); t != "" {
98-
p = t
99-
}
100-
vbm = filepath.Join(p, "VBoxManage.exe")
101-
}
123+
102124
flags.BoolVarP(&B2D.Init, "init", "i", false, "auto initialize vm instance.")
103-
flags.StringVar(&B2D.VBM, "vbm", vbm, "path to VirtualBox management utility.")
104-
flags.BoolVarP(&B2D.Verbose, "verbose", "v", false, "display verbose command invocations.")
105-
flags.StringVar(&B2D.Driver, "driver", "virtualbox", "hypervisor driver.")
106125
flags.StringVar(&B2D.SSH, "ssh", "ssh", "path to SSH client utility.")
107126
flags.StringVar(&B2D.SSHGen, "ssh-keygen", "ssh-keygen", "path to ssh-keygen utility.")
108127

@@ -132,22 +151,14 @@ func config() (*flag.FlagSet, error) {
132151
return nil, err
133152
}
134153
// Over-ride from the profile file
135-
filename := cfgFilename(B2D.Dir)
136154
if _, err := os.Lstat(filename); err == nil {
137155
if _, err := toml.DecodeFile(filename, &B2D); err != nil {
138156
return nil, err
139157
}
140158
}
141159

142-
// for cmd==ssh only:
143-
// only pass the params up to and including the `ssh` command - after that,
144-
// there might be other -flags that are destined for the ssh cmd
145-
i := 1
146-
for i < len(os.Args) && os.Args[i-1] != "ssh" {
147-
i++
148-
}
149160
// Command-line overrides profile config.
150-
if err := flags.Parse(os.Args[1:i]); err != nil {
161+
if err := flags.Parse(os.Args[1:sshIdx]); err != nil {
151162
return nil, err
152163
}
153164

driver/config.go

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
package driver
22

3-
import "net"
3+
import (
4+
"fmt"
5+
flag "github.com/ogier/pflag"
6+
"net"
7+
)
48

59
// Machine config.
610
type MachineConfig struct {
711
// Gereral flags.
812
Init bool
913
Verbose bool
10-
VBM string
1114
Driver string
1215

1316
// basic config
@@ -17,7 +20,6 @@ type MachineConfig struct {
1720
VM string // virtual machine name
1821
Dir string // boot2docker directory
1922
ISO string // boot2docker ISO image path
20-
VMDK string // base VMDK to use as persistent disk
2123
DiskSize uint // VM disk image size (MB)
2224
Memory uint // VM memory size (MB)
2325

@@ -37,3 +39,28 @@ type MachineConfig struct {
3739
Serial bool
3840
SerialFile string
3941
}
42+
43+
type ConfigFunc func(B2D *MachineConfig, flags *flag.FlagSet) error
44+
45+
var configs map[string]ConfigFunc // optional map of driver ConfigFunc
46+
47+
func init() {
48+
configs = make(map[string]ConfigFunc)
49+
}
50+
51+
// optional - allows a driver to add its own commandline parameters
52+
func RegisterConfig(driver string, configFunc ConfigFunc) error {
53+
if _, exists := configs[driver]; exists {
54+
return fmt.Errorf("Driver already registered %s", driver)
55+
}
56+
configs[driver] = configFunc
57+
58+
return nil
59+
}
60+
61+
func ConfigFlags(B2D *MachineConfig, flags *flag.FlagSet) error {
62+
if configFunc, exists := configs[B2D.Driver]; exists {
63+
return configFunc(B2D, flags)
64+
}
65+
return nil
66+
}

virtualbox/disk.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ func MakeDiskImage(dest string, size uint, r io.Reader) error {
1515
cmd := exec.Command(VBM, "convertfromraw", "stdin", dest,
1616
fmt.Sprintf("%d", sizeBytes), "--format", "VMDK")
1717

18-
if Verbose {
18+
if verbose {
1919
cmd.Stdout = os.Stdout
2020
cmd.Stderr = os.Stderr
2121
}

virtualbox/machine.go

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"time"
1616

1717
"github.com/boot2docker/boot2docker-cli/driver"
18+
flag "github.com/ogier/pflag"
1819
)
1920

2021
type Flag int
@@ -38,22 +39,51 @@ const (
3839
F_accelerate3d
3940
)
4041

42+
var (
43+
VBM string // Path to VBoxManage utility.
44+
VMDK string // base VMDK to use as persistent disk.
45+
verbose bool // Verbose mode (Local copy of B2D.Verbose).
46+
)
47+
4148
func init() {
4249
if err := driver.Register("virtualbox", InitFunc); err != nil {
4350
fmt.Fprintf(os.Stderr, "Failed to initialize driver. Error : %s", err.Error())
4451
os.Exit(1)
4552
}
53+
if err := driver.RegisterConfig("virtualbox", ConfigFlags); err != nil {
54+
fmt.Fprintf(os.Stderr, "Failed to initialize driver config. Error : %s", err.Error())
55+
os.Exit(1)
56+
}
4657
}
4758

4859
// Initialize the Machine.
4960
func InitFunc(mc *driver.MachineConfig) (driver.Machine, error) {
61+
verbose = mc.Verbose
62+
5063
m, err := GetMachine(mc.VM)
5164
if err != nil && mc.Init {
5265
return CreateMachine(mc)
5366
}
5467
return m, err
5568
}
5669

70+
func ConfigFlags(B2D *driver.MachineConfig, flags *flag.FlagSet) error {
71+
flags.StringVar(&VMDK, "basevmdk", "", "Path to VMDK to use as base for persistent partition")
72+
vbm := "VBoxManage"
73+
if runtime.GOOS == "windows" {
74+
p := "C:\\Program Files\\Oracle\\VirtualBox"
75+
if t := os.Getenv("VBOX_INSTALL_PATH"); t != "" {
76+
p = t
77+
} else if t = os.Getenv("VBOX_MSI_INSTALL_PATH"); t != "" {
78+
p = t
79+
}
80+
vbm = filepath.Join(p, "VBoxManage.exe")
81+
}
82+
flags.StringVar(&VBM, "vbm", vbm, "path to VirtualBox management utility.")
83+
84+
return nil
85+
}
86+
5787
// Convert bool to "on"/"off"
5888
func bool2string(b bool) string {
5989
if b {
@@ -387,7 +417,7 @@ func CreateMachine(mc *driver.MachineConfig) (*Machine, error) {
387417
// Set NIC #1 to use NAT
388418
m.SetNIC(1, driver.NIC{Network: driver.NICNetNAT, Hardware: driver.VirtIO})
389419
pfRules := map[string]driver.PFRule{
390-
"ssh": {Proto: driver.PFTCP, HostIP: net.ParseIP("127.0.0.1"), HostPort: mc.SSHPort, GuestPort: driver.SSHPort},
420+
"ssh": {Proto: driver.PFTCP, HostIP: net.ParseIP("127.0.0.1"), HostPort: mc.SSHPort, GuestPort: driver.SSHPort},
391421
}
392422
if mc.DockerPort > 0 {
393423
pfRules["docker"] = driver.PFRule{Proto: driver.PFTCP, HostIP: net.ParseIP("127.0.0.1"), HostPort: mc.DockerPort, GuestPort: driver.DockerPort}
@@ -425,8 +455,8 @@ func CreateMachine(mc *driver.MachineConfig) (*Machine, error) {
425455
return m, err
426456
}
427457

428-
if mc.VMDK != "" {
429-
if err := copyDiskImage(diskImg, mc.VMDK); err != nil {
458+
if VMDK != "" {
459+
if err := copyDiskImage(diskImg, VMDK); err != nil {
430460
return m, err
431461
}
432462
} else {

virtualbox/vbm.go

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,12 @@ import (
99
"os/exec"
1010
"path/filepath"
1111
"regexp"
12-
"runtime"
1312
"strings"
1413

1514
"github.com/boot2docker/boot2docker-cli/driver"
1615
)
1716

18-
var (
19-
VBM string // Path to VBoxManage utility.
20-
Verbose bool // Verbose mode.
21-
)
22-
2317
func init() {
24-
VBM = "VBoxManage"
25-
if p := os.Getenv("VBOX_INSTALL_PATH"); p != "" && runtime.GOOS == "windows" {
26-
VBM = filepath.Join(p, "VBoxManage.exe")
27-
}
2818
}
2919

3020
var (
@@ -42,7 +32,7 @@ var (
4232

4333
func vbm(args ...string) error {
4434
cmd := exec.Command(VBM, args...)
45-
if Verbose {
35+
if verbose {
4636
cmd.Stdout = os.Stdout
4737
cmd.Stderr = os.Stderr
4838
log.Printf("executing: %v %v", VBM, strings.Join(args, " "))
@@ -58,7 +48,7 @@ func vbm(args ...string) error {
5848

5949
func vbmOut(args ...string) (string, error) {
6050
cmd := exec.Command(VBM, args...)
61-
if Verbose {
51+
if verbose {
6252
cmd.Stderr = os.Stderr
6353
log.Printf("executing: %v %v", VBM, strings.Join(args, " "))
6454
}
@@ -74,7 +64,7 @@ func vbmOut(args ...string) (string, error) {
7464

7565
func vbmOutErr(args ...string) (string, string, error) {
7666
cmd := exec.Command(VBM, args...)
77-
if Verbose {
67+
if verbose {
7868
log.Printf("executing: %v %v", VBM, strings.Join(args, " "))
7969
}
8070
var stdout bytes.Buffer

virtualbox/vbm_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import (
55
)
66

77
func init() {
8-
Verbose = true
8+
verbose = true
99
}
1010

1111
func TestVBMOut(t *testing.T) {

0 commit comments

Comments
 (0)