1
0
mirror of https://github.com/rancher/os.git synced 2025-09-03 15:54:24 +00:00

Refactor configuration

This commit is contained in:
Darren Shepherd
2015-02-17 14:31:20 -07:00
parent 11a11ca3d1
commit f47ea34ac4
7 changed files with 133 additions and 109 deletions

View File

@@ -1,4 +1,4 @@
package user package systemdocker
import ( import (
"os" "os"
@@ -6,9 +6,10 @@ import (
"syscall" "syscall"
log "github.com/Sirupsen/logrus" log "github.com/Sirupsen/logrus"
"github.com/rancherio/os/config"
) )
func SystemDocker() { func Main() {
var newEnv []string var newEnv []string
for _, env := range os.Environ() { for _, env := range os.Environ() {
if !strings.HasPrefix(env, "DOCKER_HOST=") { 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" os.Args[0] = "/usr/bin/docker"
if err := syscall.Exec(os.Args[0], os.Args, newEnv); err != nil { if err := syscall.Exec(os.Args[0], os.Args, newEnv); err != nil {

View File

@@ -1,7 +1,6 @@
package config package config
import ( import (
"encoding/json"
"io/ioutil" "io/ioutil"
"os" "os"
"regexp" "regexp"
@@ -10,9 +9,11 @@ import (
log "github.com/Sirupsen/logrus" log "github.com/Sirupsen/logrus"
"github.com/rancherio/os/util" "github.com/rancherio/os/util"
"gopkg.in/yaml.v2"
) )
const ( const (
VERSION = "0.0.1"
CONSOLE_CONTAINER = "console" CONSOLE_CONTAINER = "console"
DOCKER_BIN = "/usr/bin/docker" DOCKER_BIN = "/usr/bin/docker"
DOCKER_SYSTEM_HOST = "unix:///var/run/system-docker.sock" DOCKER_SYSTEM_HOST = "unix:///var/run/system-docker.sock"
@@ -22,45 +23,49 @@ const (
SYS_INIT = "/sbin/init-sys" SYS_INIT = "/sbin/init-sys"
USER_INIT = "/sbin/init-user" USER_INIT = "/sbin/init-user"
MODULES_ARCHIVE = "/modules.tar" MODULES_ARCHIVE = "/modules.tar"
DEBUG = true DEBUG = false
) )
type InitFunc func(*Config) error type InitFunc func(*Config) error
type ContainerConfig struct { type ContainerConfig struct {
Id string `json:"id,omitempty"` Id string `yaml:"id,omitempty"`
Cmd []string `json:"run,omitempty"` Cmd string `yaml:"run,omitempty"`
//Config *runconfig.Config `json:"-"` //Config *runconfig.Config `yaml:"-"`
//HostConfig *runconfig.HostConfig `json:"-"` //HostConfig *runconfig.HostConfig `yaml:"-"`
} }
type Config struct { type Config struct {
//BootstrapContainers []ContainerConfig `json:"bootstrapContainers,omitempty"` //BootstrapContainers []ContainerConfig `yaml:"bootstrapContainers,omitempty"`
//UserContainers []ContainerConfig `json:"userContainser,omitempty"` //UserContainers []ContainerConfig `yaml:"userContainser,omitempty"`
ConsoleContainer string `json:"consoleContainer,omitempty"` Debug bool `yaml:"debug,omitempty"`
Debug bool `json:"debug,omitempty"` Disable []string `yaml:"disable,omitempty"`
Disable []string `json:"disable,omitempty"` Dns []string `yaml:"dns,omitempty"`
Dns []string `json:"dns,omitempty"` Rescue bool `yaml:"rescue,omitempty"`
Rescue bool `json:"rescue,omitempty"` RescueContainer *ContainerConfig `yaml:"rescue_container,omitempty"`
RescueContainer ContainerConfig `json:"rescueContainer,omitempty"` State ConfigState `yaml:"state,omitempty"`
State ConfigState `json:"state,omitempty"` SystemContainers []ContainerConfig `yaml:"system_containers,omitempty"`
SystemContainers []ContainerConfig `json:"systemContainers,omitempty"` SystemDockerArgs []string `yaml:"system_docker_args,flow,omitempty"`
SystemDockerArgs []string `json:"systemDockerArgs,omitempty"` Modules []string `yaml:"modules,omitempty"`
Modules []string `json:"modules,omitempty"`
} }
type ConfigState struct { type ConfigState struct {
FsType string `json:"fsType,omitempty"` FsType string `yaml:"fstype"`
Dev string `json:"dev,omitempty"` Dev string `yaml:"dev"`
Required bool `json:"required,omitempty"` Required bool `yaml:"required"`
} }
func (c *Config) Dump() string { func (c *Config) ClearReadOnly() {
content, err := json.MarshalIndent(c, "", " ") c.SystemContainers = []ContainerConfig{}
if err == nil { c.RescueContainer = nil
return string(content) }
func (c *Config) Dump() (string, error) {
content, err := yaml.Marshal(c)
if err != nil {
return "", err
} else { } 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 { func (c *Config) merge(values map[string]interface{}) error {
// Lazy way to assign values to *Config // Lazy way to assign values to *Config
override, err := json.Marshal(values) override, err := yaml.Marshal(values)
if err != nil { if err != nil {
return err return err
} }
return json.Unmarshal(override, c) return yaml.Unmarshal(override, c)
} }
func (c *Config) readCmdline() error { func (c *Config) readCmdline() error {

View File

@@ -16,83 +16,71 @@ func NewConfig() *Config {
Modules: []string{}, Modules: []string{},
SystemContainers: []ContainerConfig{ SystemContainers: []ContainerConfig{
{ {
Cmd: []string{ Cmd: "--name=system-state " +
"--name", "system-state", "--net=none " +
"--net", "none", "--read-only " +
"--read-only",
"state", "state",
},
}, },
{ {
Cmd: []string{ Cmd: "--name=udev " +
"--name", "udev", "--net=none " +
"--net", "none", "--privileged " +
"--privileged", "--rm " +
"--rm", "-v=/dev:/host/dev " +
"--volume", "/dev:/host/dev", "-v=/lib/modules:/lib/modules:ro " +
"--volume", "/lib/modules:/lib/modules:ro",
"udev", "udev",
},
}, },
{ {
Cmd: []string{ Cmd: "--name=network " +
"--name", "network", "--cap-add=NET_ADMIN " +
"--cap-add", "NET_ADMIN", "--net=host " +
"--net", "host", "--rm " +
"--rm",
"network", "network",
},
}, },
{ {
Cmd: []string{ Cmd: "--name=userdocker " +
"--name", "userdocker", "-d " +
"-d", "--restart=always " +
"--restart", "always", "--pid=host " +
"--pid", "host", "--net=host " +
"--net", "host", "--privileged " +
"--privileged", "-v=/lib/modules:/lib/modules:ro " +
"--volume", "/lib/modules:/lib/modules:ro", "-v=/usr/bin/docker:/usr/bin/docker:ro " +
"--volume", "/usr/bin/docker:/usr/bin/docker:ro", "--volumes-from=system-state " +
"--volumes-from", "system-state",
"userdocker", "userdocker",
},
}, },
{ {
Cmd: []string{ Cmd: "--name=console " +
"--name", "console", "-d " +
"-d", "--rm " +
"--rm", "--privileged " +
"--privileged", "-v=/lib/modules:/lib/modules:ro " +
"--volume", "/lib/modules:/lib/modules:ro", "-v=/usr/bin/docker:/usr/bin/docker:ro " +
"--volume", "/usr/bin/docker:/usr/bin/docker:ro", "-v=/init:/usr/bin/system-docker:ro " +
"--volume", "/init:/usr/bin/system-docker:ro", "-v=/init:/usr/bin/respawn:ro " +
"--volume", "/init:/usr/bin/respawn:ro", "-v=/var/run/docker.sock:/var/run/system-docker.sock:ro " +
"--volume", "/var/run/docker.sock:/var/run/system-docker.sock:ro", "-v=/init:/sbin/poweroff:ro " +
"--volume", "/init:/sbin/poweroff:ro", "-v=/init:/sbin/reboot:ro " +
"--volume", "/init:/sbin/reboot:ro", "-v=/init:/sbin/halt:ro " +
"--volume", "/init:/sbin/halt:ro", "--volumes-from=system-state " +
"--volumes-from", "system-state", "--net=host " +
"--net", "host", "--pid=host " +
"--pid", "host",
"console", "console",
},
}, },
}, },
RescueContainer: ContainerConfig{ RescueContainer: &ContainerConfig{
Cmd: []string{ Cmd: "--name=rescue " +
"--name", "rescue", "-d " +
"-d", "--rm " +
"--rm", "--privileged " +
"--privileged", "-v=/lib/modules:/lib/modules:ro " +
"--volume", "/lib/modules:/lib/modules:ro", "-v=/usr/bin/docker:/usr/bin/docker:ro " +
"--volume", "/usr/bin/docker:/usr/bin/docker:ro", "-v=/init:/usr/bin/system-docker:ro " +
"--volume", "/init:/usr/bin/system-docker:ro", "-v=/init:/usr/bin/respawn:ro " +
"--volume", "/init:/usr/bin/respawn:ro", "-v=/var/run/docker.sock:/var/run/system-docker.sock:ro " +
"--volume", "/var/run/docker.sock:/var/run/system-docker.sock:ro", "--net=host " +
"--net", "host", "--pid=host " +
"--pid", "host",
"rescue", "rescue",
},
}, },
} }
} }

View File

@@ -9,8 +9,10 @@ import (
"os" "os"
"strings" "strings"
log "github.com/Sirupsen/logrus"
flag "github.com/docker/docker/pkg/mflag" flag "github.com/docker/docker/pkg/mflag"
"github.com/docker/docker/runconfig" "github.com/docker/docker/runconfig"
shlex "github.com/flynn/go-shlex"
dockerClient "github.com/fsouza/go-dockerclient" dockerClient "github.com/fsouza/go-dockerclient"
"github.com/rancherio/os/config" "github.com/rancherio/os/config"
"github.com/rancherio/os/util" "github.com/rancherio/os/util"
@@ -38,7 +40,7 @@ func getHash(containerCfg *config.ContainerConfig) (string, error) {
w := util.NewErrorWriter(hash) w := util.NewErrorWriter(hash)
w.Write([]byte(containerCfg.Id)) w.Write([]byte(containerCfg.Id))
w.Write([]byte(strings.Join(containerCfg.Cmd, ":"))) w.Write([]byte(containerCfg.Cmd))
if w.Err != nil { if w.Err != nil {
return "", w.Err return "", w.Err
@@ -126,13 +128,19 @@ func (c *Container) Parse() *Container {
flDetach := flags.Bool([]string{"d", "-detach"}, false, "") flDetach := flags.Bool([]string{"d", "-detach"}, false, "")
flName := flags.String([]string{"#name", "-name"}, "", "") 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.Name = *flName
c.detach = *flDetach c.detach = *flDetach
c.remove = *flRemove c.remove = *flRemove
if len(c.containerCfg.Id) == 0 { if c.containerCfg.Id == "" {
c.containerCfg.Id = c.Name c.containerCfg.Id = c.Name
} }

View File

@@ -263,7 +263,10 @@ func RunInit() error {
} }
if cfg.Debug { if cfg.Debug {
log.Debugf("Config: %s", cfg.Dump()) cfgString, _ := cfg.Dump()
if cfgString != "" {
log.Debugf("Config: %s", cfgString)
}
} }
return err return err

41
main.go
View File

@@ -2,27 +2,46 @@ package main
import ( import (
"os" "os"
"strings"
log "github.com/Sirupsen/logrus" log "github.com/Sirupsen/logrus"
"github.com/docker/docker/pkg/reexec" "github.com/docker/docker/pkg/reexec"
"github.com/rancherio/os/cmd/control"
"github.com/rancherio/os/cmd/systemdocker"
osInit "github.com/rancherio/os/init" osInit "github.com/rancherio/os/init"
"github.com/rancherio/os/power" "github.com/rancherio/os/power"
"github.com/rancherio/os/respawn" "github.com/rancherio/os/respawn"
"github.com/rancherio/os/sysinit" "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() { func main() {
reexec.Register("init", osInit.MainInit) registerCmd("/init", osInit.MainInit)
reexec.Register("/init", osInit.MainInit) registerCmd("/sbin/init-sys", sysinit.SysInit)
reexec.Register("./init", osInit.MainInit) registerCmd("/usr/bin/system-docker", systemdocker.Main)
reexec.Register("/sbin/init-sys", sysinit.SysInit) registerCmd("/sbin/poweroff", power.PowerOff)
reexec.Register("/usr/bin/system-docker", user.SystemDocker) registerCmd("/sbin/reboot", power.Reboot)
reexec.Register("system-docker", user.SystemDocker) registerCmd("/sbin/halt", power.Halt)
reexec.Register("poweroff", power.PowerOff) registerCmd("/usr/bin/respawn", respawn.Main)
reexec.Register("reboot", power.Reboot) registerCmd("/usr/sbin/rancherctl", control.Main)
reexec.Register("halt", power.Halt)
reexec.Register("respawn", respawn.Main)
if !reexec.Init() { if !reexec.Init() {
log.Fatalf("Failed to find an entry point for %s", os.Args[0]) log.Fatalf("Failed to find an entry point for %s", os.Args[0])
} }

View File

@@ -118,7 +118,7 @@ func runContainers(cfg *config.Config) error {
containerConfigs := cfg.SystemContainers containerConfigs := cfg.SystemContainers
if cfg.Rescue { if cfg.Rescue {
log.Debug("Running rescue container") log.Debug("Running rescue container")
containerConfigs = []config.ContainerConfig{cfg.RescueContainer} containerConfigs = []config.ContainerConfig{*cfg.RescueContainer}
} }
for _, containerConfig := range containerConfigs { for _, containerConfig := range containerConfigs {
@@ -130,7 +130,7 @@ func runContainers(cfg *config.Config) error {
continue continue
} }
if containerConfig.Id == cfg.ConsoleContainer { if containerConfig.Id == config.CONSOLE_CONTAINER {
if util.IsRunningInTty() { if util.IsRunningInTty() {
container.Config.Tty = true container.Config.Tty = true
container.Config.AttachStdin = true container.Config.AttachStdin = true