package cmd import ( "fmt" "git.wntrmute.dev/kyle/arca/internal/config" "git.wntrmute.dev/kyle/arca/internal/udisks" "git.wntrmute.dev/kyle/arca/internal/unlock" "github.com/spf13/cobra" ) var unlockCmd = &cobra.Command{ Use: "unlock ", Short: "Unlock a LUKS volume without mounting", Args: cobra.ExactArgs(1), RunE: runUnlock, ValidArgsFunction: completeDeviceOrAlias, } func init() { rootCmd.AddCommand(unlockCmd) } func runUnlock(cmd *cobra.Command, args []string) error { cfg := config.Load() target := args[0] client, err := udisks.NewClient() if err != nil { return fmt.Errorf("connecting to udisks2: %w", err) } defer client.Close() devCfg := cfg.ResolveDevice(target) dev, err := client.FindDevice(devCfg.UUID, target) if err != nil { return err } // Check if already unlocked. if cleartext, err := client.CleartextDevice(dev); err == nil { fmt.Printf("%s is already unlocked (%s)\n", target, cleartext.DevicePath) return nil } u := unlock.New(client, unlock.Options{ ReadPassphrase: readPassphrase, KeyfilePath: devCfg.Keyfile, }) result, err := u.Unlock(dev, devCfg.Methods) if err != nil { return err } fmt.Printf("Unlocked %s -> %s\n", target, result.Device.DevicePath) return nil }