init.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. package lxc
  2. import (
  3. "fmt"
  4. "github.com/dotcloud/docker/execdriver"
  5. "github.com/dotcloud/docker/pkg/netlink"
  6. "github.com/dotcloud/docker/utils"
  7. "github.com/syndtr/gocapability/capability"
  8. "net"
  9. "os"
  10. "strconv"
  11. "strings"
  12. "syscall"
  13. )
  14. func setupHostname(args *execdriver.InitArgs) error {
  15. hostname := getEnv(args, "HOSTNAME")
  16. if hostname == "" {
  17. return nil
  18. }
  19. return setHostname(hostname)
  20. }
  21. // Setup networking
  22. func setupNetworking(args *execdriver.InitArgs) error {
  23. if args.Ip != "" {
  24. // eth0
  25. iface, err := net.InterfaceByName("eth0")
  26. if err != nil {
  27. return fmt.Errorf("Unable to set up networking: %v", err)
  28. }
  29. ip, ipNet, err := net.ParseCIDR(args.Ip)
  30. if err != nil {
  31. return fmt.Errorf("Unable to set up networking: %v", err)
  32. }
  33. if err := netlink.NetworkLinkAddIp(iface, ip, ipNet); err != nil {
  34. return fmt.Errorf("Unable to set up networking: %v", err)
  35. }
  36. if err := netlink.NetworkSetMTU(iface, args.Mtu); err != nil {
  37. return fmt.Errorf("Unable to set MTU: %v", err)
  38. }
  39. if err := netlink.NetworkLinkUp(iface); err != nil {
  40. return fmt.Errorf("Unable to set up networking: %v", err)
  41. }
  42. // loopback
  43. iface, err = net.InterfaceByName("lo")
  44. if err != nil {
  45. return fmt.Errorf("Unable to set up networking: %v", err)
  46. }
  47. if err := netlink.NetworkLinkUp(iface); err != nil {
  48. return fmt.Errorf("Unable to set up networking: %v", err)
  49. }
  50. }
  51. if args.Gateway != "" {
  52. gw := net.ParseIP(args.Gateway)
  53. if gw == nil {
  54. return fmt.Errorf("Unable to set up networking, %s is not a valid gateway IP", args.Gateway)
  55. }
  56. if err := netlink.AddDefaultGw(gw); err != nil {
  57. return fmt.Errorf("Unable to set up networking: %v", err)
  58. }
  59. }
  60. return nil
  61. }
  62. // Setup working directory
  63. func setupWorkingDirectory(args *execdriver.InitArgs) error {
  64. if args.WorkDir == "" {
  65. return nil
  66. }
  67. if err := syscall.Chdir(args.WorkDir); err != nil {
  68. return fmt.Errorf("Unable to change dir to %v: %v", args.WorkDir, err)
  69. }
  70. return nil
  71. }
  72. // Takes care of dropping privileges to the desired user
  73. func changeUser(args *execdriver.InitArgs) error {
  74. if args.User == "" {
  75. return nil
  76. }
  77. userent, err := utils.UserLookup(args.User)
  78. if err != nil {
  79. return fmt.Errorf("Unable to find user %v: %v", args.User, err)
  80. }
  81. uid, err := strconv.Atoi(userent.Uid)
  82. if err != nil {
  83. return fmt.Errorf("Invalid uid: %v", userent.Uid)
  84. }
  85. gid, err := strconv.Atoi(userent.Gid)
  86. if err != nil {
  87. return fmt.Errorf("Invalid gid: %v", userent.Gid)
  88. }
  89. if err := syscall.Setgid(gid); err != nil {
  90. return fmt.Errorf("setgid failed: %v", err)
  91. }
  92. if err := syscall.Setuid(uid); err != nil {
  93. return fmt.Errorf("setuid failed: %v", err)
  94. }
  95. return nil
  96. }
  97. func setupCapabilities(args *execdriver.InitArgs) error {
  98. if args.Privileged {
  99. return nil
  100. }
  101. drop := []capability.Cap{
  102. capability.CAP_SETPCAP,
  103. capability.CAP_SYS_MODULE,
  104. capability.CAP_SYS_RAWIO,
  105. capability.CAP_SYS_PACCT,
  106. capability.CAP_SYS_ADMIN,
  107. capability.CAP_SYS_NICE,
  108. capability.CAP_SYS_RESOURCE,
  109. capability.CAP_SYS_TIME,
  110. capability.CAP_SYS_TTY_CONFIG,
  111. capability.CAP_MKNOD,
  112. capability.CAP_AUDIT_WRITE,
  113. capability.CAP_AUDIT_CONTROL,
  114. capability.CAP_MAC_OVERRIDE,
  115. capability.CAP_MAC_ADMIN,
  116. }
  117. c, err := capability.NewPid(os.Getpid())
  118. if err != nil {
  119. return err
  120. }
  121. c.Unset(capability.CAPS|capability.BOUNDS, drop...)
  122. if err := c.Apply(capability.CAPS | capability.BOUNDS); err != nil {
  123. return err
  124. }
  125. return nil
  126. }
  127. func getEnv(args *execdriver.InitArgs, key string) string {
  128. for _, kv := range args.Env {
  129. parts := strings.SplitN(kv, "=", 2)
  130. if parts[0] == key && len(parts) == 2 {
  131. return parts[1]
  132. }
  133. }
  134. return ""
  135. }