unix_socket.go 1.7 KB

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