diff --git a/cmd/systemdocker/system-docker.go b/cmd/systemdocker/system-docker.go index 8c4ebb63..256e2e5e 100644 --- a/cmd/systemdocker/system-docker.go +++ b/cmd/systemdocker/system-docker.go @@ -1,4 +1,4 @@ -package user +package systemdocker import ( "os" @@ -6,9 +6,10 @@ import ( "syscall" log "github.com/Sirupsen/logrus" + "github.com/rancherio/os/config" ) -func SystemDocker() { +func Main() { var newEnv []string for _, env := range os.Environ() { if !strings.HasPrefix(env, "DOCKER_HOST=") { @@ -16,7 +17,7 @@ func SystemDocker() { } } - newEnv = append(newEnv, "DOCKER_HOST=unix:///var/run/system-docker.sock") + newEnv = append(newEnv, "DOCKER_HOST="+config.DOCKER_SYSTEM_HOST) os.Args[0] = "/usr/bin/docker" if err := syscall.Exec(os.Args[0], os.Args, newEnv); err != nil { diff --git a/config/config.go b/config/config.go index 0ecf17ed..4df40819 100644 --- a/config/config.go +++ b/config/config.go @@ -1,7 +1,6 @@ package config import ( - "encoding/json" "io/ioutil" "os" "regexp" @@ -10,9 +9,11 @@ import ( log "github.com/Sirupsen/logrus" "github.com/rancherio/os/util" + "gopkg.in/yaml.v2" ) const ( + VERSION = "0.0.1" CONSOLE_CONTAINER = "console" DOCKER_BIN = "/usr/bin/docker" DOCKER_SYSTEM_HOST = "unix:///var/run/system-docker.sock" @@ -22,45 +23,49 @@ const ( SYS_INIT = "/sbin/init-sys" USER_INIT = "/sbin/init-user" MODULES_ARCHIVE = "/modules.tar" - DEBUG = true + DEBUG = false ) type InitFunc func(*Config) error type ContainerConfig struct { - Id string `json:"id,omitempty"` - Cmd []string `json:"run,omitempty"` - //Config *runconfig.Config `json:"-"` - //HostConfig *runconfig.HostConfig `json:"-"` + Id string `yaml:"id,omitempty"` + Cmd string `yaml:"run,omitempty"` + //Config *runconfig.Config `yaml:"-"` + //HostConfig *runconfig.HostConfig `yaml:"-"` } type Config struct { - //BootstrapContainers []ContainerConfig `json:"bootstrapContainers,omitempty"` - //UserContainers []ContainerConfig `json:"userContainser,omitempty"` - ConsoleContainer string `json:"consoleContainer,omitempty"` - Debug bool `json:"debug,omitempty"` - Disable []string `json:"disable,omitempty"` - Dns []string `json:"dns,omitempty"` - Rescue bool `json:"rescue,omitempty"` - RescueContainer ContainerConfig `json:"rescueContainer,omitempty"` - State ConfigState `json:"state,omitempty"` - SystemContainers []ContainerConfig `json:"systemContainers,omitempty"` - SystemDockerArgs []string `json:"systemDockerArgs,omitempty"` - Modules []string `json:"modules,omitempty"` + //BootstrapContainers []ContainerConfig `yaml:"bootstrapContainers,omitempty"` + //UserContainers []ContainerConfig `yaml:"userContainser,omitempty"` + Debug bool `yaml:"debug,omitempty"` + Disable []string `yaml:"disable,omitempty"` + Dns []string `yaml:"dns,omitempty"` + Rescue bool `yaml:"rescue,omitempty"` + RescueContainer *ContainerConfig `yaml:"rescue_container,omitempty"` + State ConfigState `yaml:"state,omitempty"` + SystemContainers []ContainerConfig `yaml:"system_containers,omitempty"` + SystemDockerArgs []string `yaml:"system_docker_args,flow,omitempty"` + Modules []string `yaml:"modules,omitempty"` } type ConfigState struct { - FsType string `json:"fsType,omitempty"` - Dev string `json:"dev,omitempty"` - Required bool `json:"required,omitempty"` + FsType string `yaml:"fstype"` + Dev string `yaml:"dev"` + Required bool `yaml:"required"` } -func (c *Config) Dump() string { - content, err := json.MarshalIndent(c, "", " ") - if err == nil { - return string(content) +func (c *Config) ClearReadOnly() { + c.SystemContainers = []ContainerConfig{} + c.RescueContainer = nil +} + +func (c *Config) Dump() (string, error) { + content, err := yaml.Marshal(c) + if err != nil { + return "", err } else { - return err.Error() + return string(content), err } } @@ -93,11 +98,11 @@ func (c *Config) readArgs() error { func (c *Config) merge(values map[string]interface{}) error { // Lazy way to assign values to *Config - override, err := json.Marshal(values) + override, err := yaml.Marshal(values) if err != nil { return err } - return json.Unmarshal(override, c) + return yaml.Unmarshal(override, c) } func (c *Config) readCmdline() error { diff --git a/config/default.go b/config/default.go index bb0910e6..69888a48 100644 --- a/config/default.go +++ b/config/default.go @@ -16,83 +16,71 @@ func NewConfig() *Config { Modules: []string{}, SystemContainers: []ContainerConfig{ { - Cmd: []string{ - "--name", "system-state", - "--net", "none", - "--read-only", + Cmd: "--name=system-state " + + "--net=none " + + "--read-only " + "state", - }, }, { - Cmd: []string{ - "--name", "udev", - "--net", "none", - "--privileged", - "--rm", - "--volume", "/dev:/host/dev", - "--volume", "/lib/modules:/lib/modules:ro", + Cmd: "--name=udev " + + "--net=none " + + "--privileged " + + "--rm " + + "-v=/dev:/host/dev " + + "-v=/lib/modules:/lib/modules:ro " + "udev", - }, }, { - Cmd: []string{ - "--name", "network", - "--cap-add", "NET_ADMIN", - "--net", "host", - "--rm", + Cmd: "--name=network " + + "--cap-add=NET_ADMIN " + + "--net=host " + + "--rm " + "network", - }, }, { - Cmd: []string{ - "--name", "userdocker", - "-d", - "--restart", "always", - "--pid", "host", - "--net", "host", - "--privileged", - "--volume", "/lib/modules:/lib/modules:ro", - "--volume", "/usr/bin/docker:/usr/bin/docker:ro", - "--volumes-from", "system-state", + Cmd: "--name=userdocker " + + "-d " + + "--restart=always " + + "--pid=host " + + "--net=host " + + "--privileged " + + "-v=/lib/modules:/lib/modules:ro " + + "-v=/usr/bin/docker:/usr/bin/docker:ro " + + "--volumes-from=system-state " + "userdocker", - }, }, { - Cmd: []string{ - "--name", "console", - "-d", - "--rm", - "--privileged", - "--volume", "/lib/modules:/lib/modules:ro", - "--volume", "/usr/bin/docker:/usr/bin/docker:ro", - "--volume", "/init:/usr/bin/system-docker:ro", - "--volume", "/init:/usr/bin/respawn:ro", - "--volume", "/var/run/docker.sock:/var/run/system-docker.sock:ro", - "--volume", "/init:/sbin/poweroff:ro", - "--volume", "/init:/sbin/reboot:ro", - "--volume", "/init:/sbin/halt:ro", - "--volumes-from", "system-state", - "--net", "host", - "--pid", "host", + Cmd: "--name=console " + + "-d " + + "--rm " + + "--privileged " + + "-v=/lib/modules:/lib/modules:ro " + + "-v=/usr/bin/docker:/usr/bin/docker:ro " + + "-v=/init:/usr/bin/system-docker:ro " + + "-v=/init:/usr/bin/respawn:ro " + + "-v=/var/run/docker.sock:/var/run/system-docker.sock:ro " + + "-v=/init:/sbin/poweroff:ro " + + "-v=/init:/sbin/reboot:ro " + + "-v=/init:/sbin/halt:ro " + + "--volumes-from=system-state " + + "--net=host " + + "--pid=host " + "console", - }, }, }, - RescueContainer: ContainerConfig{ - Cmd: []string{ - "--name", "rescue", - "-d", - "--rm", - "--privileged", - "--volume", "/lib/modules:/lib/modules:ro", - "--volume", "/usr/bin/docker:/usr/bin/docker:ro", - "--volume", "/init:/usr/bin/system-docker:ro", - "--volume", "/init:/usr/bin/respawn:ro", - "--volume", "/var/run/docker.sock:/var/run/system-docker.sock:ro", - "--net", "host", - "--pid", "host", + RescueContainer: &ContainerConfig{ + Cmd: "--name=rescue " + + "-d " + + "--rm " + + "--privileged " + + "-v=/lib/modules:/lib/modules:ro " + + "-v=/usr/bin/docker:/usr/bin/docker:ro " + + "-v=/init:/usr/bin/system-docker:ro " + + "-v=/init:/usr/bin/respawn:ro " + + "-v=/var/run/docker.sock:/var/run/system-docker.sock:ro " + + "--net=host " + + "--pid=host " + "rescue", - }, }, } } diff --git a/docker/container.go b/docker/container.go index 7b61e796..1dd8c583 100644 --- a/docker/container.go +++ b/docker/container.go @@ -9,8 +9,10 @@ import ( "os" "strings" + log "github.com/Sirupsen/logrus" flag "github.com/docker/docker/pkg/mflag" "github.com/docker/docker/runconfig" + shlex "github.com/flynn/go-shlex" dockerClient "github.com/fsouza/go-dockerclient" "github.com/rancherio/os/config" "github.com/rancherio/os/util" @@ -38,7 +40,7 @@ func getHash(containerCfg *config.ContainerConfig) (string, error) { w := util.NewErrorWriter(hash) w.Write([]byte(containerCfg.Id)) - w.Write([]byte(strings.Join(containerCfg.Cmd, ":"))) + w.Write([]byte(containerCfg.Cmd)) if w.Err != nil { return "", w.Err @@ -126,13 +128,19 @@ func (c *Container) Parse() *Container { flDetach := flags.Bool([]string{"d", "-detach"}, false, "") flName := flags.String([]string{"#name", "-name"}, "", "") - c.Config, c.HostConfig, _, c.Err = runconfig.Parse(flags, c.containerCfg.Cmd) + args, err := shlex.Split(c.containerCfg.Cmd) + if err != nil { + return c.returnErr(err) + } + + log.Debugf("Parsing [%s]", strings.Join(args, ",")) + c.Config, c.HostConfig, _, c.Err = runconfig.Parse(flags, args) c.Name = *flName c.detach = *flDetach c.remove = *flRemove - if len(c.containerCfg.Id) == 0 { + if c.containerCfg.Id == "" { c.containerCfg.Id = c.Name } diff --git a/init/init.go b/init/init.go index 4b44e65b..ae63c4d5 100644 --- a/init/init.go +++ b/init/init.go @@ -263,7 +263,10 @@ func RunInit() error { } if cfg.Debug { - log.Debugf("Config: %s", cfg.Dump()) + cfgString, _ := cfg.Dump() + if cfgString != "" { + log.Debugf("Config: %s", cfgString) + } } return err diff --git a/main.go b/main.go index 42963ea8..72f317d9 100644 --- a/main.go +++ b/main.go @@ -2,27 +2,46 @@ package main import ( "os" + "strings" log "github.com/Sirupsen/logrus" "github.com/docker/docker/pkg/reexec" + "github.com/rancherio/os/cmd/control" + "github.com/rancherio/os/cmd/systemdocker" osInit "github.com/rancherio/os/init" "github.com/rancherio/os/power" "github.com/rancherio/os/respawn" "github.com/rancherio/os/sysinit" - "github.com/rancherio/os/user" ) +func registerCmd(cmd string, mainFunc func()) { + log.Debugf("Registering main %s", cmd) + reexec.Register(cmd, mainFunc) + + parts := strings.Split(cmd, "/") + if len(parts) == 0 { + return + } + + last := parts[len(parts)-1] + + log.Debugf("Registering main %s", last) + reexec.Register(last, mainFunc) + + log.Debugf("Registering main %s", "./"+last) + reexec.Register("./"+last, mainFunc) +} + func main() { - reexec.Register("init", osInit.MainInit) - reexec.Register("/init", osInit.MainInit) - reexec.Register("./init", osInit.MainInit) - reexec.Register("/sbin/init-sys", sysinit.SysInit) - reexec.Register("/usr/bin/system-docker", user.SystemDocker) - reexec.Register("system-docker", user.SystemDocker) - reexec.Register("poweroff", power.PowerOff) - reexec.Register("reboot", power.Reboot) - reexec.Register("halt", power.Halt) - reexec.Register("respawn", respawn.Main) + registerCmd("/init", osInit.MainInit) + registerCmd("/sbin/init-sys", sysinit.SysInit) + registerCmd("/usr/bin/system-docker", systemdocker.Main) + registerCmd("/sbin/poweroff", power.PowerOff) + registerCmd("/sbin/reboot", power.Reboot) + registerCmd("/sbin/halt", power.Halt) + registerCmd("/usr/bin/respawn", respawn.Main) + registerCmd("/usr/sbin/rancherctl", control.Main) + if !reexec.Init() { log.Fatalf("Failed to find an entry point for %s", os.Args[0]) } diff --git a/sysinit/sysinit.go b/sysinit/sysinit.go index cafdc902..2fae9276 100644 --- a/sysinit/sysinit.go +++ b/sysinit/sysinit.go @@ -118,7 +118,7 @@ func runContainers(cfg *config.Config) error { containerConfigs := cfg.SystemContainers if cfg.Rescue { log.Debug("Running rescue container") - containerConfigs = []config.ContainerConfig{cfg.RescueContainer} + containerConfigs = []config.ContainerConfig{*cfg.RescueContainer} } for _, containerConfig := range containerConfigs { @@ -130,7 +130,7 @@ func runContainers(cfg *config.Config) error { continue } - if containerConfig.Id == cfg.ConsoleContainer { + if containerConfig.Id == config.CONSOLE_CONTAINER { if util.IsRunningInTty() { container.Config.Tty = true container.Config.AttachStdin = true