Skip to content

Commit dc90c6a

Browse files
committed
fix volume plugin compatibility
1 parent e60a752 commit dc90c6a

File tree

2 files changed

+250
-1
lines changed

2 files changed

+250
-1
lines changed

netshare/netshare-old.go

Lines changed: 249 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,249 @@
1+
package netshare
2+
3+
import (
4+
"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"
9+
"os"
10+
"path/filepath"
11+
"strconv"
12+
)
13+
14+
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 = `
45+
docker-volume-netshare (NFS V3/4, AWS EFS and CIFS Volume Driver Plugin)
46+
47+
Provides docker volume support for NFS v3 and 4, EFS as well as CIFS. This plugin can be run multiple times to
48+
support different mount types.
49+
50+
== Version: %s - Built: %s ==
51+
`
52+
)
53+
54+
var (
55+
rootCmd = &cobra.Command{
56+
Use: "docker-volume-netshare",
57+
Short: "NFS and CIFS - Docker volume driver plugin",
58+
Long: NetshareHelp,
59+
PersistentPreRun: setupLogger,
60+
}
61+
62+
cifsCmd = &cobra.Command{
63+
Use: "cifs",
64+
Short: "run plugin in CIFS mode",
65+
Run: execCIFS,
66+
}
67+
68+
nfsCmd = &cobra.Command{
69+
Use: "nfs",
70+
Short: "run plugin in NFS mode",
71+
Run: execNFS,
72+
}
73+
74+
efsCmd = &cobra.Command{
75+
Use: "efs",
76+
Short: "run plugin in AWS EFS mode",
77+
Run: execEFS,
78+
}
79+
80+
cephCmd = &cobra.Command{
81+
Use: "ceph",
82+
Short: "run plugin in Ceph mode",
83+
Run: execCEPH,
84+
}
85+
86+
versionCmd = &cobra.Command{
87+
Use: "version",
88+
Short: "Display current version and build date",
89+
Run: func(cmd *cobra.Command, args []string) {
90+
fmt.Printf("\nVersion: %s - Built: %s\n\n", Version, BuildDate)
91+
},
92+
}
93+
baseDir = ""
94+
Version string = ""
95+
BuildDate string = ""
96+
)
97+
98+
func Execute() {
99+
setupFlags()
100+
rootCmd.Long = fmt.Sprintf(NetshareHelp, Version, BuildDate)
101+
rootCmd.AddCommand(versionCmd, cifsCmd, nfsCmd, efsCmd, cephCmd)
102+
rootCmd.Execute()
103+
}
104+
105+
func setupFlags() {
106+
rootCmd.PersistentFlags().StringVar(&baseDir, BasedirFlag, filepath.Join(volume.DefaultDockerRootDirectory, PluginAlias), "Mounted volume base directory")
107+
rootCmd.PersistentFlags().Bool(TCPFlag, false, "Bind to TCP rather than Unix sockets. Can also be set via NETSHARE_TCP_ENABLED")
108+
rootCmd.PersistentFlags().String(PortFlag, ":8877", "TCP Port if --tcp flag is true. :PORT for all interfaces or ADDRESS:PORT to bind.")
109+
rootCmd.PersistentFlags().Bool(VerboseFlag, false, "Turns on verbose logging")
110+
111+
cifsCmd.Flags().StringP(UsernameFlag, "u", "", "Username to use for mounts. Can also set environment NETSHARE_CIFS_USERNAME")
112+
cifsCmd.Flags().StringP(PasswordFlag, "p", "", "Password to use for mounts. Can also set environment NETSHARE_CIFS_PASSWORD")
113+
cifsCmd.Flags().StringP(DomainFlag, "d", "", "Domain to use for mounts. Can also set environment NETSHARE_CIFS_DOMAIN")
114+
cifsCmd.Flags().StringP(SecurityFlag, "s", "", "Security mode to use for mounts (mount.cifs's sec option). Can also set environment NETSHARE_CIFS_SECURITY.")
115+
cifsCmd.Flags().StringP(NetRCFlag, "", os.Getenv("HOME"), "The default .netrc location. Default is the user.home directory")
116+
cifsCmd.Flags().StringP(OptionsFlag, "o", "", "Options passed to Cifs mounts (ex: nounix,uid=433)")
117+
118+
nfsCmd.Flags().IntP(VersionFlag, "v", 4, "NFS Version to use [3 | 4]. Can also be set with NETSHARE_NFS_VERSION")
119+
nfsCmd.Flags().StringP(OptionsFlag, "o", "", fmt.Sprintf("Options passed to nfs mounts (ex: %s)", drivers.DefaultNfsV3))
120+
121+
efsCmd.Flags().String(AvailZoneFlag, "", "AWS Availability zone [default: \"\", looks up via metadata]")
122+
efsCmd.Flags().String(NameServerFlag, "", "Custom DNS nameserver. [default \"\", uses /etc/resolv.conf]")
123+
efsCmd.Flags().Bool(NoResolveFlag, false, "Indicates EFS mount sources are IP Addresses vs File System ID")
124+
125+
cephCmd.Flags().StringP(NameFlag, "n", "admin", "Username to use for ceph mount.")
126+
cephCmd.Flags().StringP(SecretFlag, "s", "NoneProvided", "Password to use for Ceph Mount.")
127+
cephCmd.Flags().StringP(ContextFlag, "c", "system_u:object_r:tmp_t:s0", "SELinux Context of Ceph Mount.")
128+
cephCmd.Flags().StringP(CephMount, "m", "10.0.0.1", "Address of Ceph source mount.")
129+
cephCmd.Flags().StringP(CephPort, "p", "6789", "Port to use for ceph mount.")
130+
cephCmd.Flags().StringP(ServerMount, "S", "/mnt/ceph", "Directory to use as ceph local mount.")
131+
cephCmd.Flags().StringP(OptionsFlag, "o", "", "Options passed to Ceph mounts ")
132+
}
133+
134+
func setupLogger(cmd *cobra.Command, args []string) {
135+
if verbose, _ := cmd.Flags().GetBool(VerboseFlag); verbose {
136+
log.SetLevel(log.DebugLevel)
137+
} else {
138+
log.SetLevel(log.InfoLevel)
139+
}
140+
}
141+
142+
func execCEPH(cmd *cobra.Command, args []string) {
143+
username, _ := cmd.Flags().GetString(NameFlag)
144+
password, _ := cmd.Flags().GetString(SecretFlag)
145+
context, _ := cmd.Flags().GetString(ContextFlag)
146+
cephmount, _ := cmd.Flags().GetString(CephMount)
147+
cephport, _ := cmd.Flags().GetString(CephPort)
148+
servermount, _ := cmd.Flags().GetString(ServerMount)
149+
cephopts, _ := cmd.Flags().GetString(CephOpts)
150+
151+
if len(username) > 0 {
152+
username = "name=" + username
153+
}
154+
if len(password) > 0 {
155+
password = "secret=" + password
156+
}
157+
if len(context) > 0 {
158+
context = "context=" + "\"" + context + "\""
159+
}
160+
d := drivers.NewCephDriver(rootForType(drivers.CEPH), username, password, context, cephmount, cephport, servermount, cephopts)
161+
start(drivers.CEPH, d)
162+
}
163+
164+
func execNFS(cmd *cobra.Command, args []string) {
165+
version, _ := cmd.Flags().GetInt(VersionFlag)
166+
if os.Getenv(EnvNfsVers) != "" {
167+
if v, err := strconv.Atoi(os.Getenv(EnvNfsVers)); err == nil {
168+
if v == 3 || v == 4 {
169+
version = v
170+
}
171+
}
172+
}
173+
options, _ := cmd.Flags().GetString(OptionsFlag)
174+
d := drivers.NewNFSDriver(rootForType(drivers.NFS), version, options)
175+
startOutput(fmt.Sprintf("NFS Version %d :: options: '%s'", version, options))
176+
start(drivers.NFS, d)
177+
}
178+
179+
func execEFS(cmd *cobra.Command, args []string) {
180+
az, _ := cmd.Flags().GetString(AvailZoneFlag)
181+
resolve, _ := cmd.Flags().GetBool(NoResolveFlag)
182+
ns, _ := cmd.Flags().GetString(NameServerFlag)
183+
d := drivers.NewEFSDriver(rootForType(drivers.EFS), az, ns, !resolve)
184+
startOutput(fmt.Sprintf("EFS :: availability-zone: %s, resolve: %v, ns: %s", az, resolve, ns))
185+
start(drivers.EFS, d)
186+
}
187+
188+
func execCIFS(cmd *cobra.Command, args []string) {
189+
user := typeOrEnv(cmd, UsernameFlag, EnvSambaUser)
190+
pass := typeOrEnv(cmd, PasswordFlag, EnvSambaPass)
191+
domain := typeOrEnv(cmd, DomainFlag, EnvSambaWG)
192+
security := typeOrEnv(cmd, SecurityFlag, EnvSambaSec)
193+
netrc, _ := cmd.Flags().GetString(NetRCFlag)
194+
options, _ := cmd.Flags().GetString(OptionsFlag)
195+
196+
creds := drivers.NewCifsCredentials(user, pass, domain, security)
197+
198+
d := drivers.NewCIFSDriver(rootForType(drivers.CIFS), creds, netrc, options)
199+
if len(user) > 0 {
200+
startOutput(fmt.Sprintf("CIFS :: %s, opts: %s", creds, options))
201+
} else {
202+
startOutput(fmt.Sprintf("CIFS :: netrc: %s, opts: %s", netrc, options))
203+
}
204+
start(drivers.CIFS, d)
205+
}
206+
207+
func startOutput(info string) {
208+
log.Infof("== docker-volume-netshare :: Version: %s - Built: %s ==", Version, BuildDate)
209+
log.Infof("Starting %s", info)
210+
}
211+
212+
func typeOrEnv(cmd *cobra.Command, flag, envname string) string {
213+
val, _ := cmd.Flags().GetString(flag)
214+
if val == "" {
215+
val = os.Getenv(envname)
216+
}
217+
return val
218+
}
219+
220+
func rootForType(dt drivers.DriverType) string {
221+
return filepath.Join(baseDir, dt.String())
222+
}
223+
224+
func start(dt drivers.DriverType, driver volume.Driver) {
225+
h := volume.NewHandler(driver)
226+
if isTCPEnabled() {
227+
addr := os.Getenv(EnvTCPAddr)
228+
if addr == "" {
229+
addr, _ = rootCmd.PersistentFlags().GetString(PortFlag)
230+
}
231+
fmt.Println(h.ServeTCP(dt.String(), addr, nil))
232+
} else {
233+
fmt.Println(h.ServeUnix("", int(dt)))
234+
}
235+
}
236+
237+
func isTCPEnabled() bool {
238+
if tcp, _ := rootCmd.PersistentFlags().GetBool(TCPFlag); tcp {
239+
return tcp
240+
}
241+
242+
if os.Getenv(EnvTCP) != "" {
243+
ev, _ := strconv.ParseBool(os.Getenv(EnvTCP))
244+
fmt.Println(ev)
245+
246+
return ev
247+
}
248+
return false
249+
}

netshare/netshare.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ func start(dt drivers.DriverType, driver volume.Driver) {
230230
}
231231
fmt.Println(h.ServeTCP(dt.String(), addr, nil))
232232
} else {
233-
fmt.Println(h.ServeUnix("", int(dt)))
233+
fmt.Println(h.ServeUnix(dt.String(), 0))
234234
}
235235
}
236236

0 commit comments

Comments
 (0)