1
0
mirror of https://github.com/rancher/os.git synced 2025-05-20 22:09:50 +00:00
os/cmd/sysinit/sysinit.go

226 lines
4.6 KiB
Go
Raw Normal View History

2015-02-09 04:38:37 +00:00
package sysinit
import (
"os"
"os/exec"
"path"
2015-02-17 05:27:32 +00:00
"syscall"
2015-02-09 04:38:37 +00:00
log "github.com/Sirupsen/logrus"
dockerClient "github.com/fsouza/go-dockerclient"
"github.com/rancherio/os/config"
"github.com/rancherio/os/docker"
initPkg "github.com/rancherio/os/init"
2015-02-14 16:37:11 +00:00
"github.com/rancherio/os/util"
2015-02-09 04:38:37 +00:00
)
2015-02-19 20:58:29 +00:00
func Main() {
2015-02-09 04:38:37 +00:00
if err := sysInit(); err != nil {
log.Fatal(err)
}
}
func importImage(client *dockerClient.Client, name, fileName string) error {
file, err := os.Open(fileName)
if err != nil {
return err
}
defer file.Close()
log.Debugf("Importing image for %s", fileName)
repo, tag := dockerClient.ParseRepositoryTag(name)
return client.ImportImage(dockerClient.ImportImageOptions{
Source: "-",
Repository: repo,
Tag: tag,
InputStream: file,
})
}
func hasImage(name string) bool {
stamp := path.Join(initPkg.STATE, name)
if _, err := os.Stat(stamp); os.IsNotExist(err) {
return false
}
return true
}
func findImages(cfg *config.Config) ([]string, error) {
2015-02-17 08:18:48 +00:00
log.Debugf("Looking for images at %s", config.IMAGES_PATH)
2015-02-09 04:38:37 +00:00
result := []string{}
2015-02-17 08:18:48 +00:00
dir, err := os.Open(config.IMAGES_PATH)
2015-02-09 04:38:37 +00:00
if os.IsNotExist(err) {
log.Debugf("Not loading images, %s does not exist")
return result, nil
}
if err != nil {
return nil, err
}
defer dir.Close()
files, err := dir.Readdirnames(0)
if err != nil {
return nil, err
}
for _, fileName := range files {
2015-02-17 08:18:48 +00:00
if ok, _ := path.Match(config.IMAGES_PATTERN, fileName); ok {
2015-02-09 04:38:37 +00:00
log.Debugf("Found %s", fileName)
result = append(result, fileName)
}
}
return result, nil
}
func loadImages(cfg *config.Config) error {
images, err := findImages(cfg)
if err != nil || len(images) == 0 {
return err
}
2015-02-19 18:27:23 +00:00
client, err := docker.NewSystemClient()
2015-02-09 04:38:37 +00:00
if err != nil {
return err
}
for _, image := range images {
if hasImage(image) {
continue
}
2015-02-17 08:18:48 +00:00
inputFileName := path.Join(config.IMAGES_PATH, image)
2015-02-09 04:38:37 +00:00
input, err := os.Open(inputFileName)
if err != nil {
return err
}
defer input.Close()
2015-02-21 07:34:23 +00:00
log.Infof("Loading images from %s", inputFileName)
2015-02-09 04:38:37 +00:00
err = client.LoadImage(dockerClient.LoadImageOptions{
InputStream: input,
})
2015-02-21 07:34:23 +00:00
log.Infof("Done loading images from %s", inputFileName)
2015-02-09 04:38:37 +00:00
if err != nil {
return err
}
}
return nil
}
func runContainersFrom(startFrom string, cfg *config.Config, containerConfigs []config.ContainerConfig) error {
foundStart := false
2015-02-09 04:38:37 +00:00
2015-02-21 07:34:23 +00:00
for i, containerConfig := range containerConfigs {
2015-02-19 18:27:23 +00:00
container := docker.NewContainer(config.DOCKER_SYSTEM_HOST, &containerConfig)
2015-02-14 16:37:11 +00:00
if util.Contains(cfg.Disable, containerConfig.Id) {
2015-02-21 07:34:23 +00:00
log.Infof("%s is disabled : %v", containerConfig.Id, cfg.Disable)
2015-02-14 16:37:11 +00:00
continue
}
//if containerConfig.Id == config.CONSOLE_CONTAINER {
// if util.IsRunningInTty() {
// container.Config.Tty = true
// container.Config.AttachStdin = true
// container.Config.AttachStdout = true
// container.Config.AttachStderr = true
// }
//}
if foundStart || startFrom == "" {
log.Infof("Running [%d/%d] %s", i+1, len(containerConfigs), containerConfig.Id)
container.StartAndWait()
if container.Err != nil {
log.Errorf("Failed to run %v: %v", containerConfig.Id, container.Err)
}
if containerConfig.ReloadConfig {
log.Info("Reloading configuration")
err := cfg.Reload()
if err != nil {
return err
}
2015-02-14 16:37:11 +00:00
return runContainersFrom(containerConfig.Id, cfg, cfg.SystemContainers)
}
} else if startFrom == containerConfig.Id {
foundStart = true
2015-02-09 04:38:37 +00:00
}
}
return nil
}
func runContainers(cfg *config.Config) error {
containerConfigs := cfg.SystemContainers
if cfg.Rescue {
log.Debug("Running rescue container")
containerConfigs = []config.ContainerConfig{*cfg.RescueContainer}
}
return runContainersFrom("", cfg, containerConfigs)
}
2015-03-15 05:21:22 +00:00
func tailConsole(cfg *config.Config) error {
if !cfg.Console.Tail {
return nil
}
2015-02-14 16:37:11 +00:00
2015-03-15 05:21:22 +00:00
client, err := docker.NewSystemClient()
if err != nil {
return err
}
for _, container := range cfg.SystemContainers {
if container.Id != config.CONSOLE_CONTAINER {
continue
}
2015-02-14 16:37:11 +00:00
2015-03-15 05:21:22 +00:00
c := docker.NewContainer(config.DOCKER_SYSTEM_HOST, &container).Lookup()
if c.Err != nil {
continue
}
log.Infof("Tailing console : %s", c.Name)
return client.Logs(dockerClient.LogsOptions{
Container: c.Name,
Stdout: true,
Stderr: true,
Follow: true,
OutputStream: os.Stdout,
ErrorStream: os.Stderr,
})
}
log.Error("Console not found")
return nil
2015-02-14 16:37:11 +00:00
}
2015-02-09 04:38:37 +00:00
func sysInit() error {
cfg, err := config.LoadConfig()
if err != nil {
return err
}
initFuncs := []config.InitFunc{
loadImages,
runContainers,
2015-02-17 05:27:32 +00:00
func(cfg *config.Config) error {
syscall.Sync()
return nil
},
2015-03-15 05:21:22 +00:00
tailConsole,
2015-02-09 04:38:37 +00:00
}
return config.RunInitFuncs(cfg, initFuncs)
}