| 58 | } |
| 59 | |
| 60 | func systemInitCmd(ctx context.Context, args []string) { |
| 61 | invoked := filepath.Base(os.Args[0]) |
| 62 | flags := flag.NewFlagSet("system-init", flag.ExitOnError) |
| 63 | flags.Usage = func() { |
| 64 | fmt.Printf("USAGE: %s system-init\n\n", invoked) |
| 65 | fmt.Printf("Options:\n") |
| 66 | flags.PrintDefaults() |
| 67 | } |
| 68 | |
| 69 | sock := flags.String("sock", defaultSocket, "Path to containerd socket") |
| 70 | path := flags.String("path", defaultServicesPath, "Path to service configs") |
| 71 | binary := flags.String("containerd", defaultContainerd, "Path to containerd") |
| 72 | |
| 73 | if err := flags.Parse(args); err != nil { |
| 74 | log.Fatal("Unable to parse args") |
| 75 | } |
| 76 | args = flags.Args() |
| 77 | |
| 78 | if len(args) != 0 { |
| 79 | fmt.Println("Unexpected argument") |
| 80 | flags.Usage() |
| 81 | os.Exit(1) |
| 82 | } |
| 83 | |
| 84 | // remove (unlikely) old containerd socket |
| 85 | _ = os.Remove(*sock) |
| 86 | |
| 87 | // look for containerd options |
| 88 | var ctrdArgs []string |
| 89 | var ( |
| 90 | stderr io.Writer = os.Stderr |
| 91 | stdout io.Writer = os.Stdout |
| 92 | ) |
| 93 | if b, err := os.ReadFile(containerdOptsFile); err == nil { |
| 94 | config, err := toml.LoadBytes(b) |
| 95 | if err != nil { |
| 96 | log.Fatalf("error reading toml file %s: %v", containerdOptsFile, err) |
| 97 | } |
| 98 | if config != nil { |
| 99 | // did we have any CLI opts? |
| 100 | cliOptsLine := config.Get("cliopts") |
| 101 | if cliOptsLine != nil { |
| 102 | ctrdArgs = strings.Fields(cliOptsLine.(string)) |
| 103 | } |
| 104 | // stderr? |
| 105 | stderrLine := config.Get("stderr") |
| 106 | if stderrLine != nil { |
| 107 | stderr, err = getWriter(stderrLine.(string)) |
| 108 | if err != nil { |
| 109 | log.Fatal(err) |
| 110 | } |
| 111 | } |
| 112 | stdoutLine := config.Get("stdout") |
| 113 | if stdoutLine != nil { |
| 114 | stdout, err = getWriter(stdoutLine.(string)) |
| 115 | if err != nil { |
| 116 | log.Fatal(err) |
| 117 | } |