github.com/tsuna/docker@v1.7.0-rc3/pkg/plugins/discovery.go (about) 1 package plugins 2 3 import ( 4 "errors" 5 "fmt" 6 "io/ioutil" 7 "net/url" 8 "os" 9 "path/filepath" 10 "strings" 11 ) 12 13 const defaultLocalRegistry = "/usr/share/docker/plugins" 14 15 var ( 16 ErrNotFound = errors.New("Plugin not found") 17 ) 18 19 type Registry interface { 20 Plugins() ([]*Plugin, error) 21 Plugin(name string) (*Plugin, error) 22 } 23 24 type LocalRegistry struct { 25 path string 26 } 27 28 func newLocalRegistry(path string) *LocalRegistry { 29 if len(path) == 0 { 30 path = defaultLocalRegistry 31 } 32 33 return &LocalRegistry{path} 34 } 35 36 func (l *LocalRegistry) Plugin(name string) (*Plugin, error) { 37 filepath := filepath.Join(l.path, name) 38 specpath := filepath + ".spec" 39 if fi, err := os.Stat(specpath); err == nil { 40 return readPluginInfo(specpath, fi) 41 } 42 socketpath := filepath + ".sock" 43 if fi, err := os.Stat(socketpath); err == nil { 44 return readPluginInfo(socketpath, fi) 45 } 46 return nil, ErrNotFound 47 } 48 49 func readPluginInfo(path string, fi os.FileInfo) (*Plugin, error) { 50 name := strings.Split(fi.Name(), ".")[0] 51 52 if fi.Mode()&os.ModeSocket != 0 { 53 return &Plugin{ 54 Name: name, 55 Addr: "unix://" + path, 56 }, nil 57 } 58 59 content, err := ioutil.ReadFile(path) 60 if err != nil { 61 return nil, err 62 } 63 addr := strings.TrimSpace(string(content)) 64 65 u, err := url.Parse(addr) 66 if err != nil { 67 return nil, err 68 } 69 70 if len(u.Scheme) == 0 { 71 return nil, fmt.Errorf("Unknown protocol") 72 } 73 74 return &Plugin{ 75 Name: name, 76 Addr: addr, 77 }, nil 78 }