metropolis/cli/metroctl: refactor to use RunE instead of log.Fatal

Change-Id: Id5ca65980816e1715a8f08afcdf712292117012a
Reviewed-on: https://review.monogon.dev/c/monogon/+/3441
Reviewed-by: Lorenz Brun <lorenz@monogon.tech>
Tested-by: Jenkins CI
diff --git a/metropolis/cli/metroctl/cmd_install_usb.go b/metropolis/cli/metroctl/cmd_install_usb.go
index fcbcfa2..e1a22a4 100644
--- a/metropolis/cli/metroctl/cmd_install_usb.go
+++ b/metropolis/cli/metroctl/cmd_install_usb.go
@@ -2,6 +2,7 @@
 
 import (
 	_ "embed"
+	"fmt"
 	"log"
 
 	"github.com/spf13/cobra"
@@ -14,31 +15,39 @@
 	Short:   "Generates a Metropolis installer disk or image.",
 	Example: "metroctl install --bundle=metropolis-v0.1.zip genusb /dev/sdx",
 	Args:    PrintUsageOnWrongArgs(cobra.ExactArgs(1)), // One positional argument: the target
-	Run:     doGenUSB,
-}
+	RunE: func(cmd *cobra.Command, args []string) error {
+		params, err := makeNodeParams()
+		if err != nil {
+			return err
+		}
 
-func doGenUSB(cmd *cobra.Command, args []string) {
-	params := makeNodeParams()
+		installerPath, err := cmd.Flags().GetString("installer")
+		if err != nil {
+			return err
+		}
 
-	installerPath, err := cmd.Flags().GetString("installer")
-	if err != nil {
-		log.Fatal(err)
-	}
+		installer, err := external("installer", "_main/metropolis/installer/kernel.efi", &installerPath)
+		if err != nil {
+			return err
+		}
+		bundle, err := external("bundle", "_main/metropolis/node/bundle.zip", bundlePath)
+		if err != nil {
+			return err
+		}
 
-	installer := external("installer", "_main/metropolis/installer/kernel.efi", &installerPath)
-	bundle := external("bundle", "_main/metropolis/node/bundle.zip", bundlePath)
+		installerImageArgs := core.MakeInstallerImageArgs{
+			TargetPath: args[0],
+			Installer:  installer,
+			NodeParams: params,
+			Bundle:     bundle,
+		}
 
-	installerImageArgs := core.MakeInstallerImageArgs{
-		TargetPath: args[0],
-		Installer:  installer,
-		NodeParams: params,
-		Bundle:     bundle,
-	}
-
-	log.Printf("Generating installer image (this can take a while, see issues/92).")
-	if err := core.MakeInstallerImage(installerImageArgs); err != nil {
-		log.Fatalf("Failed to create installer: %v", err)
-	}
+		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() {