Skip to content

Commit 65b6f42

Browse files
author
Dieter Maier
committed
Add file_mode, dir_mode + bugfix for lost data on mounts
1 parent 6bc0d74 commit 65b6f42

File tree

3 files changed

+104
-61
lines changed

3 files changed

+104
-61
lines changed

main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package main
22

33
import (
4-
"github.com/ContainX/docker-volume-netshare/netshare"
4+
"github.com/dmaj/docker-volume-netshare/netshare"
55
)
66

77
var VERSION string = ""

netshare/drivers/cifs.go

Lines changed: 59 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,46 +3,55 @@ package drivers
33
import (
44
"bytes"
55
"fmt"
6+
"path/filepath"
7+
"strings"
8+
69
log "github.com/Sirupsen/logrus"
710
"github.com/dickeyxxx/netrc"
811
"github.com/docker/go-plugins-helpers/volume"
9-
"os"
10-
"path/filepath"
11-
"strings"
1212
)
1313

14+
// Constants defining driver paremeters
1415
const (
1516
UsernameOpt = "username"
1617
PasswordOpt = "password"
1718
DomainOpt = "domain"
1819
SecurityOpt = "security"
20+
FileModeOpt = "fileMode"
21+
DirModeOpt = "dirMode"
1922
CifsOpts = "cifsopts"
2023
)
2124

22-
type cifsDriver struct {
25+
// CifsDriver driver structure
26+
type CifsDriver struct {
2327
volumeDriver
2428
creds *CifsCreds
2529
netrc *netrc.Netrc
2630
cifsopts map[string]string
2731
}
2832

33+
// CifsCreds contains Options for cifs-mount
2934
type CifsCreds struct {
3035
user string
3136
pass string
3237
domain string
3338
security string
39+
fileMode string
40+
dirMode string
3441
}
3542

3643
func (creds *CifsCreds) String() string {
37-
return fmt.Sprintf("creds: { user=%s,pass=****,domain=%s,security=%s }", creds.user, creds.domain, creds.security)
44+
return fmt.Sprintf("creds: { user=%s,pass=****,domain=%s,security=%s, fileMode=%s, dirMode=%s}", creds.user, creds.domain, creds.security, creds.fileMode, creds.dirMode)
3845
}
3946

40-
func NewCifsCredentials(user, pass, domain, security string) *CifsCreds {
41-
return &CifsCreds{user: user, pass: pass, domain: domain, security: security}
47+
// NewCifsCredentials setting the credentials
48+
func NewCifsCredentials(user, pass, domain, security, fileMode, dirMode string) *CifsCreds {
49+
return &CifsCreds{user: user, pass: pass, domain: domain, security: security, fileMode: fileMode, dirMode: dirMode}
4250
}
4351

44-
func NewCIFSDriver(root string, creds *CifsCreds, netrc, cifsopts string) cifsDriver {
45-
d := cifsDriver{
52+
// NewCIFSDriver creating the cifs driver
53+
func NewCIFSDriver(root string, creds *CifsCreds, netrc, cifsopts string) CifsDriver {
54+
d := CifsDriver{
4655
volumeDriver: newVolumeDriver(root),
4756
creds: creds,
4857
netrc: parseNetRC(netrc),
@@ -63,7 +72,8 @@ func parseNetRC(path string) *netrc.Netrc {
6372
return nil
6473
}
6574

66-
func (c cifsDriver) Mount(r volume.MountRequest) volume.Response {
75+
// Mount do the mounting
76+
func (c CifsDriver) Mount(r volume.MountRequest) volume.Response {
6777
c.m.Lock()
6878
defer c.m.Unlock()
6979
hostdir := mountpoint(c.root, r.Name)
@@ -114,7 +124,8 @@ func (c cifsDriver) Mount(r volume.MountRequest) volume.Response {
114124
return volume.Response{Mountpoint: hostdir}
115125
}
116126

117-
func (c cifsDriver) Unmount(r volume.UnmountRequest) volume.Response {
127+
// Unmount do the unmounting
128+
func (c CifsDriver) Unmount(r volume.UnmountRequest) volume.Response {
118129
c.m.Lock()
119130
defer c.m.Unlock()
120131
hostdir := mountpoint(c.root, r.Name)
@@ -137,21 +148,26 @@ func (c cifsDriver) Unmount(r volume.UnmountRequest) volume.Response {
137148

138149
c.mountm.DeleteIfNotManaged(r.Name)
139150

140-
if err := os.RemoveAll(hostdir); err != nil {
141-
return volume.Response{Err: err.Error()}
142-
}
151+
// ToDo:
152+
// This is a bad idea.
153+
// When there is a dangling mount you will lose all your data in the mounted folder
154+
// I didn't understand why you delete all the data ...?
155+
156+
// if err := os.RemoveAll(hostdir); err != nil {
157+
// return volume.Response{Err: err.Error()}
158+
// }
143159

144160
return volume.Response{}
145161
}
146162

147-
func (c cifsDriver) fixSource(name string) string {
163+
func (c CifsDriver) fixSource(name string) string {
148164
if c.mountm.HasOption(name, ShareOpt) {
149165
return "//" + c.mountm.GetOption(name, ShareOpt)
150166
}
151167
return "//" + name
152168
}
153169

154-
func (c cifsDriver) parseHost(name string) string {
170+
func (c CifsDriver) parseHost(name string) string {
155171
n := name
156172
if c.mountm.HasOption(name, ShareOpt) {
157173
n = c.mountm.GetOption(name, ShareOpt)
@@ -164,20 +180,22 @@ func (c cifsDriver) parseHost(name string) string {
164180
return n
165181
}
166182

167-
func (s cifsDriver) mountVolume(name, source, dest string, creds *CifsCreds) error {
183+
func (c CifsDriver) mountVolume(name, source, dest string, creds *CifsCreds) error {
168184
var opts bytes.Buffer
169185
var user = creds.user
170186
var pass = creds.pass
171187
var domain = creds.domain
172188
var security = creds.security
189+
var fileMode = creds.fileMode
190+
var dirMode = creds.dirMode
173191

174-
options := merge(s.mountm.GetOptions(name), s.cifsopts)
192+
options := merge(c.mountm.GetOptions(name), c.cifsopts)
175193
if val, ok := options[CifsOpts]; ok {
176194
opts.WriteString(val + ",")
177195
}
178196

179-
if s.mountm.HasOptions(name) {
180-
mopts := s.mountm.GetOptions(name)
197+
if c.mountm.HasOptions(name) {
198+
mopts := c.mountm.GetOptions(name)
181199
if v, found := mopts[UsernameOpt]; found {
182200
user = v
183201
}
@@ -190,6 +208,12 @@ func (s cifsDriver) mountVolume(name, source, dest string, creds *CifsCreds) err
190208
if v, found := mopts[SecurityOpt]; found {
191209
security = v
192210
}
211+
if v, found := mopts[FileModeOpt]; found {
212+
fileMode = v
213+
}
214+
if v, found := mopts[DirModeOpt]; found {
215+
dirMode = v
216+
}
193217
}
194218

195219
if user != "" {
@@ -209,6 +233,14 @@ func (s cifsDriver) mountVolume(name, source, dest string, creds *CifsCreds) err
209233
opts.WriteString(fmt.Sprintf("sec=%s,", security))
210234
}
211235

236+
if fileMode != "" {
237+
opts.WriteString(fmt.Sprintf("file_mode=%s,", fileMode))
238+
}
239+
240+
if dirMode != "" {
241+
opts.WriteString(fmt.Sprintf("dir_mode=%s,", dirMode))
242+
}
243+
212244
opts.WriteString("rw ")
213245

214246
opts.WriteString(fmt.Sprintf("%s %s", source, dest))
@@ -217,18 +249,20 @@ func (s cifsDriver) mountVolume(name, source, dest string, creds *CifsCreds) err
217249
return run(cmd)
218250
}
219251

220-
func (s cifsDriver) getCreds(host string) *CifsCreds {
221-
log.Debugf("GetCreds: host=%s, netrc=%v", host, s.netrc)
222-
if s.netrc != nil {
223-
m := s.netrc.Machine(host)
252+
func (c CifsDriver) getCreds(host string) *CifsCreds {
253+
log.Debugf("GetCreds: host=%s, netrc=%v", host, c.netrc)
254+
if c.netrc != nil {
255+
m := c.netrc.Machine(host)
224256
if m != nil {
225257
return &CifsCreds{
226258
user: m.Get("username"),
227259
pass: m.Get("password"),
228260
domain: m.Get("domain"),
229261
security: m.Get("security"),
262+
fileMode: m.Get("fileMode"),
263+
dirMode: m.Get("dirMode"),
230264
}
231265
}
232266
}
233-
return s.creds
267+
return c.creds
234268
}

netshare/netshare.go

Lines changed: 44 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2,46 +2,51 @@ package netshare
22

33
import (
44
"fmt"
5-
"github.com/ContainX/docker-volume-netshare/netshare/drivers"
6-
log "github.com/Sirupsen/logrus"
7-
"github.com/docker/go-plugins-helpers/volume"
8-
"github.com/spf13/cobra"
95
"os"
106
"path/filepath"
117
"strconv"
8+
9+
"github.com/dmaj/docker-volume-netshare/netshare/drivers"
10+
log "github.com/Sirupsen/logrus"
11+
"github.com/docker/go-plugins-helpers/volume"
12+
"github.com/spf13/cobra"
1213
)
1314

1415
const (
15-
UsernameFlag = "username"
16-
PasswordFlag = "password"
17-
DomainFlag = "domain"
18-
SecurityFlag = "security"
19-
VersionFlag = "version"
20-
OptionsFlag = "options"
21-
BasedirFlag = "basedir"
22-
VerboseFlag = "verbose"
23-
AvailZoneFlag = "az"
24-
NoResolveFlag = "noresolve"
25-
NetRCFlag = "netrc"
26-
TCPFlag = "tcp"
27-
PortFlag = "port"
28-
NameServerFlag = "nameserver"
29-
NameFlag = "name"
30-
SecretFlag = "secret"
31-
ContextFlag = "context"
32-
CephMount = "sorcemount"
33-
CephPort = "port"
34-
CephOpts = "options"
35-
ServerMount = "servermount"
36-
EnvSambaUser = "NETSHARE_CIFS_USERNAME"
37-
EnvSambaPass = "NETSHARE_CIFS_PASSWORD"
38-
EnvSambaWG = "NETSHARE_CIFS_DOMAIN"
39-
EnvSambaSec = "NETSHARE_CIFS_SECURITY"
40-
EnvNfsVers = "NETSHARE_NFS_VERSION"
41-
EnvTCP = "NETSHARE_TCP_ENABLED"
42-
EnvTCPAddr = "NETSHARE_TCP_ADDR"
43-
PluginAlias = "netshare"
44-
NetshareHelp = `
16+
UsernameFlag = "username"
17+
PasswordFlag = "password"
18+
DomainFlag = "domain"
19+
SecurityFlag = "security"
20+
FileModeFlag = "fileMode"
21+
DirModeFlag = "dirMode"
22+
VersionFlag = "version"
23+
OptionsFlag = "options"
24+
BasedirFlag = "basedir"
25+
VerboseFlag = "verbose"
26+
AvailZoneFlag = "az"
27+
NoResolveFlag = "noresolve"
28+
NetRCFlag = "netrc"
29+
TCPFlag = "tcp"
30+
PortFlag = "port"
31+
NameServerFlag = "nameserver"
32+
NameFlag = "name"
33+
SecretFlag = "secret"
34+
ContextFlag = "context"
35+
CephMount = "sorcemount"
36+
CephPort = "port"
37+
CephOpts = "options"
38+
ServerMount = "servermount"
39+
EnvSambaUser = "NETSHARE_CIFS_USERNAME"
40+
EnvSambaPass = "NETSHARE_CIFS_PASSWORD"
41+
EnvSambaWG = "NETSHARE_CIFS_DOMAIN"
42+
EnvSambaSec = "NETSHARE_CIFS_SECURITY"
43+
EnvSambaFileMode = "NETSHARE_CIFS_FILEMODE"
44+
EnvSambaDirMode = "NETSHARE_CIFS_DIRMODE"
45+
EnvNfsVers = "NETSHARE_NFS_VERSION"
46+
EnvTCP = "NETSHARE_TCP_ENABLED"
47+
EnvTCPAddr = "NETSHARE_TCP_ADDR"
48+
PluginAlias = "netshare"
49+
NetshareHelp = `
4550
docker-volume-netshare (NFS V3/4, AWS EFS and CIFS Volume Driver Plugin)
4651
4752
Provides docker volume support for NFS v3 and 4, EFS as well as CIFS. This plugin can be run multiple times to
@@ -112,6 +117,8 @@ func setupFlags() {
112117
cifsCmd.Flags().StringP(PasswordFlag, "p", "", "Password to use for mounts. Can also set environment NETSHARE_CIFS_PASSWORD")
113118
cifsCmd.Flags().StringP(DomainFlag, "d", "", "Domain to use for mounts. Can also set environment NETSHARE_CIFS_DOMAIN")
114119
cifsCmd.Flags().StringP(SecurityFlag, "s", "", "Security mode to use for mounts (mount.cifs's sec option). Can also set environment NETSHARE_CIFS_SECURITY.")
120+
cifsCmd.Flags().StringP(FileModeFlag, "f", "", "Setting access rights for files (mount.cifs's file_mode option). Can also set environment NETSHARE_CIFS_FILEMODE.")
121+
cifsCmd.Flags().StringP(DirModeFlag, "z", "", "Setting access rights for folders (mount.cifs's dir_mode option). Can also set environment NETSHARE_CIFS_DIRMODE.")
115122
cifsCmd.Flags().StringP(NetRCFlag, "", os.Getenv("HOME"), "The default .netrc location. Default is the user.home directory")
116123
cifsCmd.Flags().StringP(OptionsFlag, "o", "", "Options passed to Cifs mounts (ex: nounix,uid=433)")
117124

@@ -190,10 +197,12 @@ func execCIFS(cmd *cobra.Command, args []string) {
190197
pass := typeOrEnv(cmd, PasswordFlag, EnvSambaPass)
191198
domain := typeOrEnv(cmd, DomainFlag, EnvSambaWG)
192199
security := typeOrEnv(cmd, SecurityFlag, EnvSambaSec)
200+
fileMode := typeOrEnv(cmd, FileModeFlag, EnvSambaFileMode)
201+
dirMode := typeOrEnv(cmd, DirModeFlag, EnvSambaDirMode)
193202
netrc, _ := cmd.Flags().GetString(NetRCFlag)
194203
options, _ := cmd.Flags().GetString(OptionsFlag)
195204

196-
creds := drivers.NewCifsCredentials(user, pass, domain, security)
205+
creds := drivers.NewCifsCredentials(user, pass, domain, security, fileMode, dirMode)
197206

198207
d := drivers.NewCIFSDriver(rootForType(drivers.CIFS), creds, netrc, options)
199208
if len(user) > 0 {

0 commit comments

Comments
 (0)