Skip to content

Commit f174938

Browse files
committed
Merge branch 'master' of github.com:ContainX/docker-volume-netshare
2 parents 4916843 + 4963f54 commit f174938

File tree

4 files changed

+106
-58
lines changed

4 files changed

+106
-58
lines changed

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,8 @@ See example:
115115
password somepass
116116
domain optional
117117
security optional
118+
fileMode optional
119+
dirMode optional
118120
```
119121

120122
**2. Run the plugin**
@@ -146,7 +148,7 @@ options and other info can be eliminated when running a container.
146148
This will create a new volume via the Docker daemon which will call `Create` in netshare passing in the corresponding user, pass and domain info.
147149

148150
```
149-
$ docker volume create -d cifs --name cifshost/share --opt username=user --opt password=pass --opt domain=domain --opt security=security
151+
$ docker volume create -d cifs --name cifshost/share --opt username=user --opt password=pass --opt domain=domain --opt security=security --opt fileMode=0777 --opt dirMode=0777
150152
```
151153

152154
**3. Launch a container**

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: 43 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ import (
55
"os"
66
"path/filepath"
77
"strconv"
8+
"github.com/dmaj/docker-volume-netshare/netshare/drivers"
9+
log "github.com/Sirupsen/logrus"
10+
"github.com/docker/go-plugins-helpers/volume"
11+
"github.com/spf13/cobra"
812
"syscall"
913

1014
"github.com/ContainX/docker-volume-netshare/netshare/drivers"
@@ -14,36 +18,40 @@ import (
1418
)
1519

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

@@ -192,10 +202,12 @@ func execCIFS(cmd *cobra.Command, args []string) {
192202
pass := typeOrEnv(cmd, PasswordFlag, EnvSambaPass)
193203
domain := typeOrEnv(cmd, DomainFlag, EnvSambaWG)
194204
security := typeOrEnv(cmd, SecurityFlag, EnvSambaSec)
205+
fileMode := typeOrEnv(cmd, FileModeFlag, EnvSambaFileMode)
206+
dirMode := typeOrEnv(cmd, DirModeFlag, EnvSambaDirMode)
195207
netrc, _ := cmd.Flags().GetString(NetRCFlag)
196208
options, _ := cmd.Flags().GetString(OptionsFlag)
197209

198-
creds := drivers.NewCifsCredentials(user, pass, domain, security)
210+
creds := drivers.NewCifsCredentials(user, pass, domain, security, fileMode, dirMode)
199211

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

0 commit comments

Comments
 (0)