github.com/rentongzhang/docker@v1.8.2-rc1/pkg/sockets/unix_socket.go (about)

     1  // +build linux
     2  
     3  package sockets
     4  
     5  import (
     6  	"fmt"
     7  	"net"
     8  	"os"
     9  	"strconv"
    10  	"syscall"
    11  
    12  	"github.com/Sirupsen/logrus"
    13  	"github.com/docker/docker/pkg/listenbuffer"
    14  	"github.com/opencontainers/runc/libcontainer/user"
    15  )
    16  
    17  func NewUnixSocket(path, group string, activate <-chan struct{}) (net.Listener, error) {
    18  	if err := syscall.Unlink(path); err != nil && !os.IsNotExist(err) {
    19  		return nil, err
    20  	}
    21  	mask := syscall.Umask(0777)
    22  	defer syscall.Umask(mask)
    23  	l, err := listenbuffer.NewListenBuffer("unix", path, activate)
    24  	if err != nil {
    25  		return nil, err
    26  	}
    27  	if err := setSocketGroup(path, group); err != nil {
    28  		l.Close()
    29  		return nil, err
    30  	}
    31  	if err := os.Chmod(path, 0660); err != nil {
    32  		l.Close()
    33  		return nil, err
    34  	}
    35  	return l, nil
    36  }
    37  
    38  func setSocketGroup(path, group string) error {
    39  	if group == "" {
    40  		return nil
    41  	}
    42  	if err := changeGroup(path, group); err != nil {
    43  		if group != "docker" {
    44  			return err
    45  		}
    46  		logrus.Debugf("Warning: could not change group %s to docker: %v", path, err)
    47  	}
    48  	return nil
    49  }
    50  
    51  func changeGroup(path string, nameOrGid string) error {
    52  	gid, err := lookupGidByName(nameOrGid)
    53  	if err != nil {
    54  		return err
    55  	}
    56  	logrus.Debugf("%s group found. gid: %d", nameOrGid, gid)
    57  	return os.Chown(path, 0, gid)
    58  }
    59  
    60  func lookupGidByName(nameOrGid string) (int, error) {
    61  	groupFile, err := user.GetGroupPath()
    62  	if err != nil {
    63  		return -1, err
    64  	}
    65  	groups, err := user.ParseGroupFileFilter(groupFile, func(g user.Group) bool {
    66  		return g.Name == nameOrGid || strconv.Itoa(g.Gid) == nameOrGid
    67  	})
    68  	if err != nil {
    69  		return -1, err
    70  	}
    71  	if groups != nil && len(groups) > 0 {
    72  		return groups[0].Gid, nil
    73  	}
    74  	gid, err := strconv.Atoi(nameOrGid)
    75  	if err == nil {
    76  		logrus.Warnf("Could not find GID %d", gid)
    77  		return gid, nil
    78  	}
    79  	return -1, fmt.Errorf("Group %s not found", nameOrGid)
    80  }