blob: 4453ed74445507d51fc83b7ca0afa45e7f15322c [file] [log] [blame]
// Copyright The Monogon Project Authors.
// SPDX-License-Identifier: Apache-2.0
package main
import (
_ "embed"
"fmt"
"log"
"github.com/spf13/cobra"
"source.monogon.dev/metropolis/cli/metroctl/core"
"source.monogon.dev/osbase/oci"
)
var genusbCmd = &cobra.Command{
Use: "genusb target",
Short: "Generates a Metropolis installer disk or image.",
Example: "metroctl install --image=metropolis-v0.1 genusb /dev/sdx",
Args: PrintUsageOnWrongArgs(cobra.ExactArgs(1)), // One positional argument: the target
RunE: func(cmd *cobra.Command, args []string) error {
params, err := makeNodeParams()
if err != nil {
return err
}
installerPath, err := cmd.Flags().GetString("installer")
if err != nil {
return err
}
installer, err := externalFile("installer", "_main/metropolis/installer/kernel.efi", &installerPath)
if err != nil {
return err
}
imagePathResolved, err := external("image", "_main/metropolis/node/oci_image", imagePath)
if err != nil {
return err
}
image, err := oci.ReadLayout(imagePathResolved)
if err != nil {
return fmt.Errorf("failed to read OS image: %w", err)
}
installerImageArgs := core.MakeInstallerImageArgs{
TargetPath: args[0],
Installer: installer,
NodeParams: params,
Image: image,
}
log.Printf("Generating installer image (this can take a while, see issues/92).")
if err := core.MakeInstallerImage(installerImageArgs); err != nil {
return fmt.Errorf("failed to create installer: %w", err)
}
return nil
},
}
func init() {
genusbCmd.Flags().StringP("installer", "i", "", "Path to the Metropolis installer to use when installing")
installCmd.AddCommand(genusbCmd)
}