@@ -3,46 +3,55 @@ package drivers
33import (
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
1415const (
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
2934type CifsCreds struct {
3035 user string
3136 pass string
3237 domain string
3338 security string
39+ fileMode string
40+ dirMode string
3441}
3542
3643func (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}
0 commit comments