Skip to content

Commit a8fe84f

Browse files
committed
Issue #41 - support mount options in CIFS driver
1 parent b174191 commit a8fe84f

File tree

5 files changed

+59
-37
lines changed

5 files changed

+59
-37
lines changed

Makefile

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
VERSION = 0.17
1+
VERSION = 0.18
22
GO_FMT = gofmt -s -w -l .
3-
GO_XC = goxc -os="linux" -tasks-="rmbin"
3+
GO_XC = goxc -os="linux" -tasks-="rmbin"
44

55
GOXC_FILE = .goxc.local.json
66

@@ -18,14 +18,14 @@ goxc:
1818
$(shell echo ' "body": "",' >> $(GOXC_FILE))
1919
$(shell echo ' "include": "*.zip,*.tar.gz,*.deb,docker-volume-netshare_$(VERSION)_linux_amd64-bin"' >> $(GOXC_FILE))
2020
$(shell echo ' }\n } \n}' >> $(GOXC_FILE))
21-
$(GO_XC)
21+
$(GO_XC)
2222
cp build/$(VERSION)/linux_amd64/docker-volume-netshare build/$(VERSION)/docker-volume-netshare_$(VERSION)_linux_amd64-bin
2323

2424
deps:
2525
go get
2626

27-
format:
28-
$(GO_FMT)
27+
format:
28+
$(GO_FMT)
2929

3030
bintray:
3131
$(GO_XC) bintray

netshare/drivers/cifs.go

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,40 @@ const (
1616
PasswordOpt = "password"
1717
DomainOpt = "domain"
1818
SecurityOpt = "security"
19+
CifsOpts = "cifsopts"
1920
)
2021

2122
type cifsDriver struct {
2223
volumeDriver
23-
creds *cifsCreds
24-
netrc *netrc.Netrc
24+
creds *CifsCreds
25+
netrc *netrc.Netrc
26+
cifsopts map[string]string
2527
}
2628

27-
type cifsCreds struct {
29+
type CifsCreds struct {
2830
user string
2931
pass string
3032
domain string
3133
security string
3234
}
3335

34-
func NewCIFSDriver(root, user, pass, domain, security, netrc string) cifsDriver {
36+
func (creds *CifsCreds) String() string {
37+
return fmt.Sprintf("creds: { user=%s,pass=****,domain=%s,security=%s }", creds.user, creds.domain, creds.security)
38+
}
39+
40+
func NewCifsCredentials(user, pass, domain, security string) *CifsCreds {
41+
return &CifsCreds{user: user, pass: pass, domain: domain, security: security}
42+
}
43+
44+
func NewCIFSDriver(root string, creds *CifsCreds, netrc, cifsopts string) cifsDriver {
3545
d := cifsDriver{
3646
volumeDriver: newVolumeDriver(root),
37-
creds: &cifsCreds{user: user, pass: pass, domain: domain, security: security},
47+
creds: creds,
3848
netrc: parseNetRC(netrc),
49+
cifsopts: map[string]string{},
50+
}
51+
if len(cifsopts) > 0 {
52+
d.cifsopts[CifsOpts] = cifsopts
3953
}
4054
return d
4155
}
@@ -70,7 +84,7 @@ func (c cifsDriver) Mount(r volume.Request) volume.Response {
7084
return volume.Response{Err: err.Error()}
7185
}
7286

73-
if err := c.mountVolume(r.Name, source, hostdir, c.getCreds(host)); err != nil {
87+
if err := c.mountVolume(source, hostdir, c.getCreds(host)); err != nil {
7488
return volume.Response{Err: err.Error()}
7589
}
7690
c.mountm.Add(r.Name, hostdir)
@@ -127,17 +141,20 @@ func (c cifsDriver) parseHost(r volume.Request) string {
127141
return name
128142
}
129143

130-
func (s cifsDriver) mountVolume(name, source, dest string, creds *cifsCreds) error {
144+
func (s cifsDriver) mountVolume(source, dest string, creds *CifsCreds) error {
131145
var opts bytes.Buffer
132-
133-
opts.WriteString("-o ")
134146
var user = creds.user
135147
var pass = creds.pass
136148
var domain = creds.domain
137149
var security = creds.security
138150

139-
if s.mountm.HasOptions(name) {
140-
mopts := s.mountm.GetOptions(name)
151+
options := merge(s.mountm.GetOptions(dest), s.cifsopts)
152+
if val, ok := options[CifsOpts]; ok {
153+
opts.WriteString(val + ",")
154+
}
155+
156+
if s.mountm.HasOptions(dest) {
157+
mopts := s.mountm.GetOptions(dest)
141158
if v, found := mopts[UsernameOpt]; found {
142159
user = v
143160
}
@@ -172,17 +189,17 @@ func (s cifsDriver) mountVolume(name, source, dest string, creds *cifsCreds) err
172189
opts.WriteString("rw ")
173190

174191
opts.WriteString(fmt.Sprintf("%s %s", source, dest))
175-
cmd := fmt.Sprintf("mount -t cifs %s", opts.String())
192+
cmd := fmt.Sprintf("mount -t cifs -o %s", opts.String())
176193
log.Debugf("Executing: %s\n", strings.Replace(cmd, "password="+pass, "password=****", 1))
177194
return run(cmd)
178195
}
179196

180-
func (s cifsDriver) getCreds(host string) *cifsCreds {
197+
func (s cifsDriver) getCreds(host string) *CifsCreds {
181198
log.Debugf("GetCreds: host=%s, netrc=%v", host, s.netrc)
182199
if s.netrc != nil {
183200
m := s.netrc.Machine(host)
184201
if m != nil {
185-
return &cifsCreds{
202+
return &CifsCreds{
186203
user: m.Get("username"),
187204
pass: m.Get("password"),
188205
domain: m.Get("domain"),

netshare/drivers/nfs.go

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ func (n nfsDriver) fixSource(r volume.Request) string {
105105
func (n nfsDriver) mountVolume(source, dest string, version int) error {
106106
var cmd string
107107

108-
options := n.mountOptions(n.mountm.GetOptions(dest))
108+
options := merge(n.mountm.GetOptions(dest), n.nfsopts)
109109
opts := ""
110110
if val, ok := options[NfsOptions]; ok {
111111
opts = val
@@ -135,18 +135,3 @@ func (n nfsDriver) mountVolume(source, dest string, version int) error {
135135
log.Debugf("exec: %s\n", cmd)
136136
return run(cmd)
137137
}
138-
139-
func (n nfsDriver) mountOptions(src map[string]string) map[string]string {
140-
if len(n.nfsopts) == 0 && len(src) == 0 {
141-
return EmptyMap
142-
}
143-
144-
dst := map[string]string{}
145-
for k, v := range n.nfsopts {
146-
dst[k] = v
147-
}
148-
for k, v := range src {
149-
dst[k] = v
150-
}
151-
return dst
152-
}

netshare/drivers/util.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,18 @@ func run(cmd string) error {
3636
}
3737
return nil
3838
}
39+
40+
func merge(src, src2 map[string]string) map[string]string {
41+
if len(src) == 0 && len(src2) == 0 {
42+
return EmptyMap
43+
}
44+
45+
dst := map[string]string{}
46+
for k, v := range src2 {
47+
dst[k] = v
48+
}
49+
for k, v := range src {
50+
dst[k] = v
51+
}
52+
return dst
53+
}

netshare/netshare.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ func setupFlags() {
100100
cifsCmd.Flags().StringP(DomainFlag, "d", "", "Domain to use for mounts. Can also set environment NETSHARE_CIFS_DOMAIN")
101101
cifsCmd.Flags().StringP(SecurityFlag, "s", "", "Security mode to use for mounts (mount.cifs's sec option). Can also set environment NETSHARE_CIFS_SECURITY.")
102102
cifsCmd.Flags().StringP(NetRCFlag, "", os.Getenv("HOME"), "The default .netrc location. Default is the user.home directory")
103+
cifsCmd.Flags().StringP(OptionsFlag, "o", "", "Options passed to Cifs mounts (ex: nounix,uid=433)")
103104

104105
nfsCmd.Flags().IntP(VersionFlag, "v", 4, "NFS Version to use [3 | 4]. Can also be set with NETSHARE_NFS_VERSION")
105106
nfsCmd.Flags().StringP(OptionsFlag, "o", "", fmt.Sprintf("Options passed to nfs mounts (ex: %s)", drivers.DefaultNfsV3))
@@ -147,8 +148,12 @@ func execCIFS(cmd *cobra.Command, args []string) {
147148
domain := typeOrEnv(cmd, DomainFlag, EnvSambaWG)
148149
security := typeOrEnv(cmd, SecurityFlag, EnvSambaSec)
149150
netrc, _ := cmd.Flags().GetString(NetRCFlag)
150-
d := drivers.NewCIFSDriver(rootForType(drivers.CIFS), user, pass, domain, security, netrc)
151-
startOutput(fmt.Sprintf("CIFS :: user: %s, pass: ***, domain: %s, secutity: %s, netrc: %s", user, domain, security, netrc))
151+
options, _ := cmd.Flags().GetString(OptionsFlag)
152+
153+
creds := drivers.NewCifsCredentials(user, pass, domain, security)
154+
155+
d := drivers.NewCIFSDriver(rootForType(drivers.CIFS), creds, netrc, options)
156+
startOutput(fmt.Sprintf("CIFS :: %s, netrc: %s, opts: %s", creds, netrc, options))
152157
start(drivers.CIFS, d)
153158
}
154159

0 commit comments

Comments
 (0)