diff --git a/components/engine/pkg/listeners/group_unix.go b/components/engine/pkg/listeners/group_unix.go new file mode 100644 index 0000000000..183a0eb9d3 --- /dev/null +++ b/components/engine/pkg/listeners/group_unix.go @@ -0,0 +1,32 @@ +// +build !windows + +package listeners + +import ( + "fmt" + "strconv" + + "github.com/opencontainers/runc/libcontainer/user" + "github.com/pkg/errors" +) + +func lookupGID(name string) (int, error) { + groupFile, err := user.GetGroupPath() + if err != nil { + return -1, errors.Wrap(err, "error looking up groups") + } + groups, err := user.ParseGroupFileFilter(groupFile, func(g user.Group) bool { + return g.Name == name || strconv.Itoa(g.Gid) == name + }) + if err != nil { + return -1, errors.Wrapf(err, "error parsing groups for %s", name) + } + if groups != nil && len(groups) > 0 { + return groups[0].Gid, nil + } + gid, err := strconv.Atoi(name) + if err == nil { + return gid, nil + } + return -1, fmt.Errorf("group %s not found", name) +} diff --git a/components/engine/pkg/listeners/listeners_solaris.go b/components/engine/pkg/listeners/listeners_solaris.go index ff833e3741..58e43a0ac2 100644 --- a/components/engine/pkg/listeners/listeners_solaris.go +++ b/components/engine/pkg/listeners/listeners_solaris.go @@ -18,7 +18,11 @@ func Init(proto, addr, socketGroup string, tlsConfig *tls.Config) (ls []net.List } ls = append(ls, l) case "unix": - l, err := sockets.NewUnixSocket(addr, socketGroup) + gid, err := lookupGID(socketGroup) + if err != nil { + return nil, err + } + l, err := sockets.NewUnixSocket(addr, gid) if err != nil { return nil, fmt.Errorf("can't create unix socket %s: %v", addr, err) } diff --git a/components/engine/pkg/listeners/listeners_unix.go b/components/engine/pkg/listeners/listeners_unix.go index 6799b8d6ff..3e7bfcb1ec 100644 --- a/components/engine/pkg/listeners/listeners_unix.go +++ b/components/engine/pkg/listeners/listeners_unix.go @@ -31,10 +31,9 @@ func Init(proto, addr, socketGroup string, tlsConfig *tls.Config) ([]net.Listene } ls = append(ls, l) case "unix": - - gid, err := strconv.Atoi(socketGroup) + gid, err := lookupGID(socketGroup) if err != nil { - return nil, fmt.Errorf("failed to parse socket group id: should be a number: %v", socketGroup) + return nil, err } l, err := sockets.NewUnixSocket(addr, gid) if err != nil {