func main() { flag.Parse() stage1initcommon.InitDebug(debug) log, diag, _ = rktlog.NewLogSet("app-start", debug) if !debug { diag.SetOutput(ioutil.Discard) } appName, err := types.NewACName(flagApp) if err != nil { log.FatalE("invalid app name", err) } enterCmd := stage1common.PrepareEnterCmd(false) args := enterCmd args = append(args, "/usr/bin/systemctl") args = append(args, "start") args = append(args, appName.String()) cmd := exec.Cmd{ Path: args[0], Args: args, } if out, err := cmd.CombinedOutput(); err != nil { log.Fatalf("%q failed to start:\n%s", appName, out) } os.Exit(0) }
func main() { flag.Parse() stage1initcommon.InitDebug(debug) log, diag, _ = rktlog.NewLogSet("app-add", debug) if !debug { diag.SetOutput(ioutil.Discard) } uuid, err := types.NewUUID(flagUUID) if err != nil { log.FatalE("UUID is missing or malformed", err) } appName, err := types.NewACName(flagApp) if err != nil { log.FatalE("invalid app name", err) } root := "." p, err := stage1types.LoadPod(root, uuid) if err != nil { log.FatalE("failed to load pod", err) } flavor, _, err := stage1initcommon.GetFlavor(p) if err != nil { log.FatalE("failed to get stage1 flavor", err) } insecureOptions := stage1initcommon.Stage1InsecureOptions{ DisablePaths: disablePaths, DisableCapabilities: disableCapabilities, DisableSeccomp: disableSeccomp, } ra := p.Manifest.Apps.Get(*appName) if ra == nil { log.Fatalf("failed to find app %q", *appName) } binPath, err := stage1initcommon.FindBinPath(p, ra) if err != nil { log.FatalE("failed to find bin path", err) } if ra.App.WorkingDirectory == "" { ra.App.WorkingDirectory = "/" } enterCmd := stage1common.PrepareEnterCmd(false) stage1initcommon.AppAddMounts(p, ra, enterCmd) // when using host cgroups, make the subgroup writable by pod systemd if flavor != "kvm" { err = prepareAppCgroups(p, ra, enterCmd) if err != nil { log.FatalE("error preparing cgroups", err) } } // write service files w := stage1initcommon.NewUnitWriter(p) w.AppUnit(ra, binPath, privateUsers, insecureOptions, unit.NewUnitOption("Unit", "Before", "halt.target"), unit.NewUnitOption("Unit", "Conflicts", "halt.target"), unit.NewUnitOption("Service", "StandardOutput", "journal+console"), unit.NewUnitOption("Service", "StandardError", "journal+console"), ) w.AppReaperUnit(ra.Name, binPath) if err := w.Error(); err != nil { log.FatalE("error generating app units", err) } // stage2 environment is ready at this point, but systemd does not know // about the new application yet args := enterCmd args = append(args, "/usr/bin/systemctl") args = append(args, "daemon-reload") cmd := exec.Cmd{ Path: args[0], Args: args, } if out, err := cmd.CombinedOutput(); err != nil { log.Fatalf("%q failed at daemon-reload:\n%s", appName, out) } os.Exit(0) }