Move console into its own package
Docker-DCO-1.1-Signed-off-by: Michael Crosby <michael@crosbymichael.com> (github: crosbymichael)
This commit is contained in:
parent
cc900b9db8
commit
323ea01c18
2 changed files with 50 additions and 37 deletions
46
libcontainer/console/console.go
Normal file
46
libcontainer/console/console.go
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
// +build linux
|
||||||
|
|
||||||
|
package console
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/dotcloud/docker/pkg/label"
|
||||||
|
"github.com/dotcloud/docker/pkg/system"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"syscall"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Setup initializes the proper /dev/console inside the rootfs path
|
||||||
|
func Setup(rootfs, consolePath, mountLabel string) error {
|
||||||
|
oldMask := system.Umask(0000)
|
||||||
|
defer system.Umask(oldMask)
|
||||||
|
|
||||||
|
stat, err := os.Stat(consolePath)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("stat console %s %s", consolePath, err)
|
||||||
|
}
|
||||||
|
var (
|
||||||
|
st = stat.Sys().(*syscall.Stat_t)
|
||||||
|
dest = filepath.Join(rootfs, "dev/console")
|
||||||
|
)
|
||||||
|
if err := os.Remove(dest); err != nil && !os.IsNotExist(err) {
|
||||||
|
return fmt.Errorf("remove %s %s", dest, err)
|
||||||
|
}
|
||||||
|
if err := os.Chmod(consolePath, 0600); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := os.Chown(consolePath, 0, 0); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := system.Mknod(dest, (st.Mode&^07777)|0600, int(st.Rdev)); err != nil {
|
||||||
|
return fmt.Errorf("mknod %s %s", dest, err)
|
||||||
|
}
|
||||||
|
if err := label.SetFileLabel(consolePath, mountLabel); err != nil {
|
||||||
|
return fmt.Errorf("set file label %s %s", dest, err)
|
||||||
|
}
|
||||||
|
if err := system.Mount(consolePath, dest, "bind", syscall.MS_BIND, ""); err != nil {
|
||||||
|
return fmt.Errorf("bind %s to %s %s", consolePath, dest, err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -6,6 +6,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/dotcloud/docker/pkg/label"
|
"github.com/dotcloud/docker/pkg/label"
|
||||||
"github.com/dotcloud/docker/pkg/libcontainer"
|
"github.com/dotcloud/docker/pkg/libcontainer"
|
||||||
|
"github.com/dotcloud/docker/pkg/libcontainer/console"
|
||||||
"github.com/dotcloud/docker/pkg/libcontainer/security/restrict"
|
"github.com/dotcloud/docker/pkg/libcontainer/security/restrict"
|
||||||
"github.com/dotcloud/docker/pkg/system"
|
"github.com/dotcloud/docker/pkg/system"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
@ -155,40 +156,6 @@ func copyDevNode(rootfs, node string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// setupConsole ensures that the container has a proper /dev/console setup
|
|
||||||
func setupConsole(rootfs, console string, mountLabel string) error {
|
|
||||||
oldMask := system.Umask(0000)
|
|
||||||
defer system.Umask(oldMask)
|
|
||||||
|
|
||||||
stat, err := os.Stat(console)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("stat console %s %s", console, err)
|
|
||||||
}
|
|
||||||
var (
|
|
||||||
st = stat.Sys().(*syscall.Stat_t)
|
|
||||||
dest = filepath.Join(rootfs, "dev/console")
|
|
||||||
)
|
|
||||||
if err := os.Remove(dest); err != nil && !os.IsNotExist(err) {
|
|
||||||
return fmt.Errorf("remove %s %s", dest, err)
|
|
||||||
}
|
|
||||||
if err := os.Chmod(console, 0600); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := os.Chown(console, 0, 0); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := system.Mknod(dest, (st.Mode&^07777)|0600, int(st.Rdev)); err != nil {
|
|
||||||
return fmt.Errorf("mknod %s %s", dest, err)
|
|
||||||
}
|
|
||||||
if err := label.SetFileLabel(console, mountLabel); err != nil {
|
|
||||||
return fmt.Errorf("SetFileLabel Failed %s %s", dest, err)
|
|
||||||
}
|
|
||||||
if err := system.Mount(console, dest, "bind", syscall.MS_BIND, ""); err != nil {
|
|
||||||
return fmt.Errorf("bind %s to %s %s", console, dest, err)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// mountSystem sets up linux specific system mounts like sys, proc, shm, and devpts
|
// mountSystem sets up linux specific system mounts like sys, proc, shm, and devpts
|
||||||
// inside the mount namespace
|
// inside the mount namespace
|
||||||
func mountSystem(rootfs string, container *libcontainer.Container) error {
|
func mountSystem(rootfs string, container *libcontainer.Container) error {
|
||||||
|
@ -205,7 +172,7 @@ func mountSystem(rootfs string, container *libcontainer.Container) error {
|
||||||
|
|
||||||
// setupPtmx adds a symlink to pts/ptmx for /dev/ptmx and
|
// setupPtmx adds a symlink to pts/ptmx for /dev/ptmx and
|
||||||
// finishes setting up /dev/console
|
// finishes setting up /dev/console
|
||||||
func setupPtmx(rootfs, console string, mountLabel string) error {
|
func setupPtmx(rootfs, consolePath, mountLabel string) error {
|
||||||
ptmx := filepath.Join(rootfs, "dev/ptmx")
|
ptmx := filepath.Join(rootfs, "dev/ptmx")
|
||||||
if err := os.Remove(ptmx); err != nil && !os.IsNotExist(err) {
|
if err := os.Remove(ptmx); err != nil && !os.IsNotExist(err) {
|
||||||
return err
|
return err
|
||||||
|
@ -213,8 +180,8 @@ func setupPtmx(rootfs, console string, mountLabel string) error {
|
||||||
if err := os.Symlink("pts/ptmx", ptmx); err != nil {
|
if err := os.Symlink("pts/ptmx", ptmx); err != nil {
|
||||||
return fmt.Errorf("symlink dev ptmx %s", err)
|
return fmt.Errorf("symlink dev ptmx %s", err)
|
||||||
}
|
}
|
||||||
if console != "" {
|
if consolePath != "" {
|
||||||
if err := setupConsole(rootfs, console, mountLabel); err != nil {
|
if err := console.Setup(rootfs, consolePath, mountLabel); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue