blob: 4453ed74445507d51fc83b7ca0afa45e7f15322c [file] [log] [blame]
Tim Windelschmidt6d33a432025-02-04 14:34:25 +01001// Copyright The Monogon Project Authors.
2// SPDX-License-Identifier: Apache-2.0
3
Tim Windelschmidt7006caf2024-02-27 16:49:39 +01004package main
5
6import (
7 _ "embed"
Tim Windelschmidt0b4fb8c2024-09-18 17:34:23 +02008 "fmt"
Tim Windelschmidt7006caf2024-02-27 16:49:39 +01009 "log"
10
11 "github.com/spf13/cobra"
12
13 "source.monogon.dev/metropolis/cli/metroctl/core"
Jan Schär5fdca562025-04-14 11:33:29 +000014 "source.monogon.dev/osbase/oci"
Tim Windelschmidt7006caf2024-02-27 16:49:39 +010015)
16
17var genusbCmd = &cobra.Command{
18 Use: "genusb target",
19 Short: "Generates a Metropolis installer disk or image.",
Jan Schär5fdca562025-04-14 11:33:29 +000020 Example: "metroctl install --image=metropolis-v0.1 genusb /dev/sdx",
Tim Windelschmidtfc6e1cf2024-09-18 17:34:07 +020021 Args: PrintUsageOnWrongArgs(cobra.ExactArgs(1)), // One positional argument: the target
Tim Windelschmidt0b4fb8c2024-09-18 17:34:23 +020022 RunE: func(cmd *cobra.Command, args []string) error {
23 params, err := makeNodeParams()
24 if err != nil {
25 return err
26 }
Tim Windelschmidt7006caf2024-02-27 16:49:39 +010027
Tim Windelschmidt0b4fb8c2024-09-18 17:34:23 +020028 installerPath, err := cmd.Flags().GetString("installer")
29 if err != nil {
30 return err
31 }
Tim Windelschmidt7006caf2024-02-27 16:49:39 +010032
Jan Schär5fdca562025-04-14 11:33:29 +000033 installer, err := externalFile("installer", "_main/metropolis/installer/kernel.efi", &installerPath)
Tim Windelschmidt0b4fb8c2024-09-18 17:34:23 +020034 if err != nil {
35 return err
36 }
Jan Schär5fdca562025-04-14 11:33:29 +000037 imagePathResolved, err := external("image", "_main/metropolis/node/oci_image", imagePath)
Tim Windelschmidt0b4fb8c2024-09-18 17:34:23 +020038 if err != nil {
39 return err
40 }
Jan Schär5fdca562025-04-14 11:33:29 +000041 image, err := oci.ReadLayout(imagePathResolved)
42 if err != nil {
43 return fmt.Errorf("failed to read OS image: %w", err)
44 }
Tim Windelschmidt7006caf2024-02-27 16:49:39 +010045
Tim Windelschmidt0b4fb8c2024-09-18 17:34:23 +020046 installerImageArgs := core.MakeInstallerImageArgs{
47 TargetPath: args[0],
48 Installer: installer,
49 NodeParams: params,
Jan Schär5fdca562025-04-14 11:33:29 +000050 Image: image,
Tim Windelschmidt0b4fb8c2024-09-18 17:34:23 +020051 }
Tim Windelschmidt7006caf2024-02-27 16:49:39 +010052
Tim Windelschmidt0b4fb8c2024-09-18 17:34:23 +020053 log.Printf("Generating installer image (this can take a while, see issues/92).")
54 if err := core.MakeInstallerImage(installerImageArgs); err != nil {
55 return fmt.Errorf("failed to create installer: %w", err)
56 }
57 return nil
58 },
Tim Windelschmidt7006caf2024-02-27 16:49:39 +010059}
60
61func init() {
62 genusbCmd.Flags().StringP("installer", "i", "", "Path to the Metropolis installer to use when installing")
63 installCmd.AddCommand(genusbCmd)
64}