Browse code

Do group lookup in listeners package

This used to be handled by go-connections, but now it only takes a group
ID (int).

Signed-off-by: Brian Goff <cpuguy83@gmail.com>

Brian Goff authored on 2017/02/10 06:34:36
Showing 3 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,32 @@
0
+// +build !windows
1
+
2
+package listeners
3
+
4
+import (
5
+	"fmt"
6
+	"strconv"
7
+
8
+	"github.com/opencontainers/runc/libcontainer/user"
9
+	"github.com/pkg/errors"
10
+)
11
+
12
+func lookupGID(name string) (int, error) {
13
+	groupFile, err := user.GetGroupPath()
14
+	if err != nil {
15
+		return -1, errors.Wrap(err, "error looking up groups")
16
+	}
17
+	groups, err := user.ParseGroupFileFilter(groupFile, func(g user.Group) bool {
18
+		return g.Name == name || strconv.Itoa(g.Gid) == name
19
+	})
20
+	if err != nil {
21
+		return -1, errors.Wrapf(err, "error parsing groups for %s", name)
22
+	}
23
+	if groups != nil && len(groups) > 0 {
24
+		return groups[0].Gid, nil
25
+	}
26
+	gid, err := strconv.Atoi(name)
27
+	if err == nil {
28
+		return gid, nil
29
+	}
30
+	return -1, fmt.Errorf("group %s not found", name)
31
+}
... ...
@@ -18,7 +18,11 @@ func Init(proto, addr, socketGroup string, tlsConfig *tls.Config) (ls []net.List
18 18
 		}
19 19
 		ls = append(ls, l)
20 20
 	case "unix":
21
-		l, err := sockets.NewUnixSocket(addr, socketGroup)
21
+		gid, err := lookupGID(socketGroup)
22
+		if err != nil {
23
+			return nil, err
24
+		}
25
+		l, err := sockets.NewUnixSocket(addr, gid)
22 26
 		if err != nil {
23 27
 			return nil, fmt.Errorf("can't create unix socket %s: %v", addr, err)
24 28
 		}
... ...
@@ -31,10 +31,9 @@ func Init(proto, addr, socketGroup string, tlsConfig *tls.Config) ([]net.Listene
31 31
 		}
32 32
 		ls = append(ls, l)
33 33
 	case "unix":
34
-
35
-		gid, err := strconv.Atoi(socketGroup)
34
+		gid, err := lookupGID(socketGroup)
36 35
 		if err != nil {
37
-			return nil, fmt.Errorf("failed to parse socket group id: should be a number: %v", socketGroup)
36
+			return nil, err
38 37
 		}
39 38
 		l, err := sockets.NewUnixSocket(addr, gid)
40 39
 		if err != nil {