func RunInit() error { var cfg config.CloudConfig os.Setenv("PATH", "/sbin:/usr/sbin:/usr/bin") // Magic setting to tell Docker to do switch_root and not pivot_root os.Setenv("DOCKER_RAMDISK", "true") initFuncs := []config.InitFunc{ func(cfg *config.CloudConfig) error { return dockerlaunch.PrepareFs(&mountConfig) }, func(cfg *config.CloudConfig) error { newCfg, err := config.LoadConfig() if err == nil { newCfg, err = config.LoadConfig() } if err == nil { *cfg = *newCfg } if cfg.Rancher.Debug { cfgString, err := config.Dump(false, true) if err != nil { log.WithFields(log.Fields{"err": err}).Error("Error serializing config") } else { log.Debugf("Config: %s", cfgString) } } return err }, loadModules, tryMountAndBootstrap, func(cfg *config.CloudConfig) error { return cfg.Reload() }, loadModules, sysInit, } if err := config.RunInitFuncs(&cfg, initFuncs); err != nil { return err } launchConfig, args := getLaunchConfig(&cfg, &cfg.Rancher.SystemDocker) log.Info("Launching System Docker") _, err := dockerlaunch.LaunchDocker(launchConfig, config.DOCKER_BIN, args...) return err }
func configGet(c *cli.Context) { arg := c.Args().Get(0) if arg == "" { return } cfg, err := config.LoadConfig() if err != nil { log.WithFields(log.Fields{"err": err}).Fatal("config get: failed to load config") } val, err := cfg.Get(arg) if err != nil { log.WithFields(log.Fields{"cfg": cfg, "key": arg, "val": val, "err": err}).Fatal("config get: failed to retrieve value") } printYaml := false switch val.(type) { case []interface{}: printYaml = true case map[interface{}]interface{}: printYaml = true } if printYaml { bytes, err := yaml.Marshal(val) if err != nil { log.Fatal(err) } fmt.Println(string(bytes)) } else { fmt.Println(val) } }
func reload(c *cli.Context) { _, err := config.LoadConfig() if err != nil { log.Fatal(err) } containers := map[string]*docker.Container{} //parseContainers(cfg) toStart := make([]*docker.Container, 0, len(c.Args())) for _, id := range c.Args() { if container, ok := containers[id]; ok { toStart = append(toStart, container.Stage()) } } var firstErr error for _, c := range toStart { err := c.Start().Err if err != nil { log.Errorf("Failed to start %s : %v", c.ContainerCfg.Id, err) if firstErr != nil { firstErr = err } } } if firstErr != nil { log.Fatal(firstErr) } }
func Generate(generateServer bool, outDir string, hostnames []string) error { cfg, err := config.LoadConfig() if err != nil { return err } if outDir == "" { return fmt.Errorf("out directory (-d, --dir) not specified") } caCertPath := filepath.Join(outDir, "ca.pem") caKeyPath := filepath.Join(outDir, "ca-key.pem") certPath := filepath.Join(outDir, "cert.pem") keyPath := filepath.Join(outDir, "key.pem") if generateServer { certPath = filepath.Join(outDir, "server-cert.pem") keyPath = filepath.Join(outDir, "server-key.pem") } if _, err := os.Stat(outDir); os.IsNotExist(err) { if err := os.MkdirAll(outDir, 0700); err != nil { return err } } if err := writeCaCerts(cfg, caCertPath, caKeyPath); err != nil { return err } return writeCerts(generateServer, hostnames, cfg, certPath, keyPath, caCertPath, caKeyPath) }
func generate(c *cli.Context) error { cfg, err := config.LoadConfig() if err != nil { return err } generateServer := c.Bool("server") outDir := c.String("dir") if outDir == "" { return fmt.Errorf("out directory (-d, --dir) not specified") } caCertPath := filepath.Join(outDir, "ca.pem") caKeyPath := filepath.Join(outDir, "ca-key.pem") certPath := filepath.Join(outDir, "cert.pem") keyPath := filepath.Join(outDir, "key.pem") if generateServer { certPath = filepath.Join(outDir, "server-cert.pem") keyPath = filepath.Join(outDir, "server-key.pem") } if _, err := os.Stat(outDir); os.IsNotExist(err) { if err := os.MkdirAll(outDir, 0700); err != nil { return err } } if err := writeCaCerts(cfg, caCertPath, caKeyPath); err != nil { return err } hostnames := c.StringSlice("hostname") return writeCerts(generateServer, hostnames, cfg, certPath, keyPath, caCertPath, caKeyPath) }
func envAction(c *cli.Context) { cfg, err := config.LoadConfig() if err != nil { log.Fatal(err) } args := c.Args() if len(args) == 0 { return } osEnv := os.Environ() envMap := make(map[string]string, len(cfg.Rancher.Environment)+len(osEnv)) for k, v := range cfg.Rancher.Environment { envMap[k] = v } for k, v := range util.KVPairs2Map(osEnv) { envMap[k] = v } if cmd, err := exec.LookPath(args[0]); err != nil { log.Fatal(err) } else { args[0] = cmd } if err := syscall.Exec(args[0], args, util.Map2KVPairs(envMap)); err != nil { log.Fatal(err) } }
func configGet(c *cli.Context) { arg := c.Args().Get(0) if arg == "" { return } cfg, err := config.LoadConfig() if err != nil { log.Fatal(err) } val, err := cfg.Get(arg) if err != nil { log.Fatal(err) } printYaml := false switch val.(type) { case []interface{}: printYaml = true case map[interface{}]interface{}: printYaml = true } if printYaml { bytes, err := yaml.Marshal(val) if err != nil { log.Fatal(err) } fmt.Println(string(bytes)) } else { fmt.Println(val) } }
func SysInit() error { cfg, err := config.LoadConfig() if err != nil { return err } _, err = config.ChainCfgFuncs(cfg, loadImages, func(cfg *config.CloudConfig) (*config.CloudConfig, error) { p, err := compose.GetProject(cfg, false) if err != nil { return cfg, err } return cfg, p.Up() }, func(cfg *config.CloudConfig) (*config.CloudConfig, error) { syscall.Sync() return cfg, nil }, func(cfg *config.CloudConfig) (*config.CloudConfig, error) { log.Infof("RancherOS %s started", config.VERSION) return cfg, nil }) return err }
func enable(c *cli.Context) { changed := false cfg, err := config.LoadConfig() if err != nil { log.Fatal(err) } for _, service := range c.Args() { if val, ok := cfg.Rancher.ServicesInclude[service]; !ok || !val { if strings.HasPrefix(service, "/") && !strings.HasPrefix(service, "/var/lib/rancher/conf") { log.Fatalf("ERROR: Service should be in path /var/lib/rancher/conf") } if _, err := compose.LoadServiceResource(service, true, cfg); err != nil { log.Fatalf("could not load service %s", service) } cfg.Rancher.ServicesInclude[service] = true changed = true } } if changed { if err := cfg.Set("rancher.services_include", cfg.Rancher.ServicesInclude); err != nil { log.Fatal(err) } } }
func runImport(c *cli.Context) { var input io.ReadCloser var err error input = os.Stdin cfg, err := config.LoadConfig() if err != nil { log.Fatal(err) } inputFile := c.String("input") if inputFile != "" { input, err = os.Open(inputFile) if err != nil { log.Fatal(err) } defer input.Close() } bytes, err := ioutil.ReadAll(input) if err != nil { log.Fatal(err) } err = cfg.Import(bytes) if err != nil { log.Fatal(err) } }
func (p *projectFactory) Create(c *cli.Context) (*project.Project, error) { cfg, err := config.LoadConfig() if err != nil { return nil, err } return compose.GetProject(cfg) }
func getUpgradeUrl() (string, error) { cfg, err := config.LoadConfig() if err != nil { return "", err } return cfg.Upgrade.Url, nil }
func Main() { args := os.Args if len(args) > 1 { fmt.Println("call " + args[0] + " to load network config from rancher.yml config file") return } cfg, err := config.LoadConfig() if err != nil { log.Fatal(err) } ApplyNetworkConfigs(&cfg.Network) }
func currentDatasource() (datasource.Datasource, error) { cfg, err := rancherConfig.LoadConfig() if err != nil { log.Fatalf("Failed to read rancher config %v", err) } dss := getDatasources(cfg) if len(dss) == 0 { return nil, nil } ds := selectDatasource(dss) return ds, nil }
func Main() { args := os.Args if len(args) > 1 { fmt.Println("call " + args[0] + " to load network config from cloud-config.yml") return } cfg, err := config.LoadConfig() if err != nil { log.Fatal(err) } if err := netconf.ApplyNetworkConfigs(&cfg.Rancher.Network); err != nil { log.Fatal(err) } }
func currentDatasource() (datasource.Datasource, error) { cfg, err := rancherConfig.LoadConfig() if err != nil { log.WithFields(log.Fields{"err": err}).Error("Failed to read rancher config") return nil, err } dss := getDatasources(cfg) if len(dss) == 0 { return nil, nil } ds := selectDatasource(dss) return ds, nil }
func Main() { cfg, err := config.LoadConfig() if err != nil { log.Fatal(err) } if len(os.Args) == 1 { if err := enter(cfg); err != nil { log.Fatal(err) } } else { if err := main(cfg); err != nil { log.Fatal(err) } } }
func merge(c *cli.Context) { bytes, err := ioutil.ReadAll(os.Stdin) if err != nil { log.Fatal(err) } cfg, err := config.LoadConfig() if err != nil { log.Fatal(err) } err = cfg.Merge(bytes) if err != nil { log.Fatal(err) } }
func configSet(c *cli.Context) { key := c.Args().Get(0) value := c.Args().Get(1) if key == "" { return } cfg, err := config.LoadConfig() if err != nil { log.Fatal(err) } err = cfg.Set(key, value) if err != nil { log.Fatal(err) } }
func CreateService(cfg *config.CloudConfig, name string, serviceConfig *project.ServiceConfig) (project.Service, error) { if cfg == nil { var err error cfg, err = config.LoadConfig() if err != nil { return nil, err } } p, err := RunServiceSet("once", cfg, map[string]*project.ServiceConfig{ name: serviceConfig, }) if err != nil { return nil, err } return p.CreateService(name) }
func installAction(c *cli.Context) { if c.Args().Present() { log.Fatalf("invalid arguments %v", c.Args()) } device := c.String("device") if device == "" { log.Fatal("Can not proceed without -d <dev> specified") } image := c.String("image") cfg, err := config.LoadConfig() if err != nil { log.WithFields(log.Fields{"err": err}).Fatal("ros install: failed to load config") } if image == "" { image = cfg.Rancher.Upgrade.Image + ":" + config.VERSION } installType := c.String("install-type") if installType == "" { log.Info("No install type specified...defaulting to generic") installType = "generic" } cloudConfig := c.String("cloud-config") if cloudConfig == "" { log.Warn("Cloud-config not provided: you might need to provide cloud-config on boot with ssh_authorized_keys") } else { uc := "/opt/user_config.yml" if err := util.FileCopy(cloudConfig, uc); err != nil { log.WithFields(log.Fields{"cloudConfig": cloudConfig}).Fatal("Failed to copy cloud-config") } cloudConfig = uc } force := c.Bool("force") reboot := !c.Bool("no-reboot") if err := runInstall(cfg, image, installType, cloudConfig, device, force, reboot); err != nil { log.WithFields(log.Fields{"err": err}).Fatal("Failed to run install") } }
func del(c *cli.Context) { changed := false cfg, err := config.LoadConfig() if err != nil { log.Fatal(err) } for _, service := range c.Args() { if _, ok := cfg.Rancher.ServicesInclude[service]; !ok { continue } delete(cfg.Rancher.ServicesInclude, service) changed = true } if changed { if err = cfg.Set("rancher.services_include", cfg.Rancher.ServicesInclude); err != nil { log.Fatal(err) } } }
func SysInit() error { cfg, err := config.LoadConfig() if err != nil { return err } initFuncs := []config.InitFunc{ loadImages, runContainers, func(cfg *config.Config) error { syscall.Sync() return nil }, func(cfg *config.Config) error { log.Infof("RancherOS %s started", config.VERSION) return nil }, tailConsole, } return config.RunInitFuncs(cfg, initFuncs) }
func disable(c *cli.Context) { changed := false cfg, err := config.LoadConfig() if err != nil { logrus.Fatal(err) } for _, service := range c.Args() { if _, ok := cfg.Rancher.ServicesInclude[service]; !ok { continue } cfg.Rancher.ServicesInclude[service] = false changed = true } if changed { if err = cfg.Save(); err != nil { logrus.Fatal(err) } } }
func SysInit() error { cfg, err := config.LoadConfig() if err != nil { return err } initFuncs := []config.InitFunc{ loadImages, func(cfg *config.CloudConfig) error { return compose.RunServices(cfg) }, func(cfg *config.CloudConfig) error { syscall.Sync() return nil }, func(cfg *config.CloudConfig) error { log.Infof("RancherOS %s started", config.VERSION) return nil }, } return config.RunInitFuncs(cfg, initFuncs) }
func list(c *cli.Context) { cfg, err := config.LoadConfig() if err != nil { log.Fatal(err) } clone := make(map[string]bool) for service, enabled := range cfg.Rancher.ServicesInclude { clone[service] = enabled } services, err := util.GetServices(cfg.Rancher.Repositories.ToArray()) if err != nil { log.Fatalf("Failed to get services: %v", err) } for _, service := range services { if enabled, ok := clone[service]; ok { delete(clone, service) if enabled { fmt.Printf("enabled %s\n", service) } else { fmt.Printf("disabled %s\n", service) } } else { fmt.Printf("disabled %s\n", service) } } for service, enabled := range clone { if enabled { fmt.Printf("enabled %s\n", service) } else { fmt.Printf("disabled %s\n", service) } } }
func newCoreServiceProject(cfg *config.CloudConfig, network bool) (*project.Project, error) { projectEvents := make(chan project.ProjectEvent) enabled := map[interface{}]interface{}{} p, err := newProject("os", cfg) if err != nil { return nil, err } p.AddListener(project.NewDefaultListener(p)) p.AddListener(projectEvents) p.ReloadCallback = func() error { var err error cfg, err = config.LoadConfig() if err != nil { return err } enabled = addServices(p, enabled, cfg.Rancher.Services) for service, serviceEnabled := range cfg.Rancher.ServicesInclude { if _, ok := enabled[service]; ok || !serviceEnabled { continue } bytes, err := LoadServiceResource(service, network, cfg) if err != nil { if err == util.ErrNoNetwork { log.Debugf("Can not load %s, networking not enabled", service) } else { log.Errorf("Failed to load %s : %v", service, err) } continue } err = p.Load(bytes) if err != nil { log.Errorf("Failed to load %s : %v", service, err) continue } enabled[service] = service } return nil } go func() { for event := range projectEvents { if event.Event == project.CONTAINER_STARTED && event.ServiceName == "network" { network = true } } }() err = p.ReloadCallback() if err != nil { log.Errorf("Failed to reload os: %v", err) return nil, err } return p, nil }
func RunInit() error { var cfg config.Config os.Setenv("PATH", "/sbin:/usr/sbin:/usr/bin") os.Setenv("DOCKER_RAMDISK", "true") initFuncs := []config.InitFunc{ func(cfg *config.Config) error { return createDirs(dirs...) }, func(cfg *config.Config) error { log.Info("Setting up mounts") return createMounts(mounts...) }, func(cfg *config.Config) error { newCfg, err := config.LoadConfig() if err == nil { newCfg, err = config.LoadConfig() } if err == nil { *cfg = *newCfg } if cfg.Debug { cfgString, _ := config.Dump(false, true) if cfgString != "" { log.Debugf("Config: %s", cfgString) } } return err }, mountCgroups, func(cfg *config.Config) error { return createSymlinks(cfg, symlinks) }, createGroups, extractModules, loadModules, setResolvConf, setupSystemBridge, bootstrap, mountState, func(cfg *config.Config) error { return cfg.Reload() }, loadModules, setResolvConf, func(cfg *config.Config) error { return createDirs(postDirs...) }, func(cfg *config.Config) error { return createMounts(postMounts...) }, touchSocket, // Disable R/O root write now to support updating modules //remountRo, sysInit, } if err := config.RunInitFuncs(&cfg, initFuncs); err != nil { return err } return execDocker(&cfg) }