init.go 3.5 KB

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