1
0
mirror of https://github.com/rancher/os.git synced 2025-06-24 05:57:03 +00:00
os/init/bootstrap.go

129 lines
2.3 KiB
Go
Raw Normal View History

package init
import (
"os"
"os/exec"
"syscall"
log "github.com/Sirupsen/logrus"
"github.com/rancherio/os/config"
"github.com/rancherio/os/util"
"github.com/rancherio/rancher-compose/project"
)
func autoformat(cfg *config.Config) error {
if len(cfg.State.Autoformat) == 0 || util.ResolveDevice(cfg.State.Dev) != "" {
return nil
}
var format string
outer:
for _, dev := range cfg.State.Autoformat {
log.Infof("Checking %s to auto-format", dev)
if _, err := os.Stat(dev); os.IsNotExist(err) {
continue
}
f, err := os.Open(dev)
if err != nil {
return err
}
defer f.Close()
buffer := make([]byte, 1048576, 1048576)
c, err := f.Read(buffer)
if err != nil {
return err
}
if c != 1048576 {
log.Infof("%s not right size", dev)
continue
}
for _, b := range buffer {
if b != 0 {
log.Infof("%s not empty", dev)
continue outer
}
}
format = dev
break
}
if format != "" {
log.Infof("Auto formatting : %s", format)
return runServices("autoformat", cfg, map[string]*project.ServiceConfig{
"autoformat": {
Net: "none",
Privileged: true,
Image: "autoformat",
Command: format,
},
"udev": cfg.BootstrapContainers["udev"],
})
}
return nil
}
func runBootstrapContainers(cfg *config.Config) error {
return runServices("bootstrap", cfg, cfg.BootstrapContainers)
}
func startDocker(cfg *config.Config) (chan interface{}, error) {
for _, d := range []string{config.DOCKER_SYSTEM_HOST, "/var/run"} {
err := os.MkdirAll(d, 0700)
if err != nil {
return nil, err
}
}
cmd := exec.Command(cfg.SystemDocker.Args[0], cfg.SystemDocker.Args[1:]...)
if cfg.Debug {
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
}
err := cmd.Start()
if err != nil {
return nil, err
}
c := make(chan interface{})
go func() {
<-c
cmd.Process.Signal(syscall.SIGTERM)
cmd.Wait()
c <- struct{}{}
}()
return c, nil
}
func stopDocker(c chan interface{}) error {
c <- struct{}{}
<-c
return os.RemoveAll(config.DOCKER_SYSTEM_HOME)
}
func bootstrap(cfg *config.Config) error {
log.Info("Starting bootstrap")
c, err := startDocker(cfg)
if err != nil {
return err
}
initFuncs := []config.InitFunc{
loadImages,
runBootstrapContainers,
autoformat,
}
defer stopDocker(c)
return config.RunInitFuncs(cfg, initFuncs)
}