2014-01-31 03:16:42 -07:00
|
|
|
// +build amd64
|
|
|
|
|
2014-01-13 18:36:59 -08:00
|
|
|
package lxc
|
2013-12-18 10:16:26 -08:00
|
|
|
|
|
|
|
import (
|
2014-06-19 11:07:57 -07:00
|
|
|
"fmt"
|
2014-07-10 19:31:01 +00:00
|
|
|
"strings"
|
2013-12-18 10:16:26 -08:00
|
|
|
"syscall"
|
2014-06-19 11:07:57 -07:00
|
|
|
|
2014-07-24 22:19:50 +00:00
|
|
|
"github.com/docker/docker/daemon/execdriver"
|
|
|
|
"github.com/docker/docker/daemon/execdriver/native/template"
|
|
|
|
"github.com/docker/docker/pkg/system"
|
2014-07-24 22:25:29 +00:00
|
|
|
"github.com/docker/libcontainer/namespaces"
|
|
|
|
"github.com/docker/libcontainer/security/capabilities"
|
|
|
|
"github.com/docker/libcontainer/utils"
|
2013-12-18 10:16:26 -08:00
|
|
|
)
|
|
|
|
|
|
|
|
func setHostname(hostname string) error {
|
|
|
|
return syscall.Sethostname([]byte(hostname))
|
|
|
|
}
|
2014-06-19 11:07:57 -07:00
|
|
|
|
|
|
|
func finalizeNamespace(args *execdriver.InitArgs) error {
|
2014-06-19 11:57:09 -07:00
|
|
|
if err := utils.CloseExecFrom(3); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2014-06-19 11:07:57 -07:00
|
|
|
// We use the native drivers default template so that things like caps are consistent
|
|
|
|
// across both drivers
|
|
|
|
container := template.New()
|
|
|
|
|
|
|
|
if !args.Privileged {
|
|
|
|
// drop capabilities in bounding set before changing user
|
2014-06-23 16:43:43 -07:00
|
|
|
if err := capabilities.DropBoundingSet(container.Capabilities); err != nil {
|
2014-06-19 11:07:57 -07:00
|
|
|
return fmt.Errorf("drop bounding set %s", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// preserve existing capabilities while we change users
|
|
|
|
if err := system.SetKeepCaps(); err != nil {
|
|
|
|
return fmt.Errorf("set keep caps %s", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := namespaces.SetupUser(args.User); err != nil {
|
|
|
|
return fmt.Errorf("setup user %s", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if !args.Privileged {
|
|
|
|
if err := system.ClearKeepCaps(); err != nil {
|
|
|
|
return fmt.Errorf("clear keep caps %s", err)
|
|
|
|
}
|
|
|
|
|
2014-07-16 12:14:26 -07:00
|
|
|
var (
|
|
|
|
adds []string
|
|
|
|
drops []string
|
|
|
|
)
|
|
|
|
|
|
|
|
if args.CapAdd != "" {
|
2014-07-16 13:40:10 -07:00
|
|
|
adds = strings.Split(args.CapAdd, ":")
|
2014-07-16 12:14:26 -07:00
|
|
|
}
|
|
|
|
if args.CapDrop != "" {
|
2014-07-16 13:40:10 -07:00
|
|
|
drops = strings.Split(args.CapDrop, ":")
|
2014-07-16 12:14:26 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
caps, err := execdriver.TweakCapabilities(container.Capabilities, adds, drops)
|
2014-07-10 23:38:11 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2014-07-10 19:31:01 +00:00
|
|
|
|
2014-06-19 11:07:57 -07:00
|
|
|
// drop all other capabilities
|
2014-07-10 19:31:01 +00:00
|
|
|
if err := capabilities.DropCapabilities(caps); err != nil {
|
2014-06-19 11:07:57 -07:00
|
|
|
return fmt.Errorf("drop capabilities %s", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-06-19 11:57:09 -07:00
|
|
|
if err := setupWorkingDirectory(args); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2014-06-19 11:07:57 -07:00
|
|
|
return nil
|
|
|
|
}
|