github.com/jogo/docker@v1.7.0-rc1/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  }