Add snapshot files to list a snapshot's files without restoring it (closes #435)
check / check (push) Failing after 18m41s
check / check (push) Failing after 18m41s
`vaultik snapshot files <snapshot-id> [path] [--json]` downloads and decrypts the snapshot database, as restore does, and prints mode, size, modification time and path for every file at or under the path. A path that matches nothing is an error. It needs the private key. Named `files` because `ls` is already the alias of `snapshot list`. The missing-key error no longer says "for restore", since this command and deep verify return it too. Model: opus-5-5
This commit is contained in:
1 parent
5ca0d46932
commit
1e01457d5d
5 files changed
+349
-31
No files matched your search
@@ -9,6 +9,10 @@ import (
|
||||
"sneak.berlin/go/vaultik/internal/vaultik"
|
||||
)
|
||||
|
||||
// filesMaxArgs is the maximum positional argument count of
|
||||
// `snapshot files <snapshot-id> [path]`.
|
||||
const filesMaxArgs = 2
|
||||
|
||||
var (
|
||||
errSnapshotIDRequired = errors.New("snapshot ID required")
|
||||
errWrongArgCount = errors.New("wrong argument count")
|
||||
@@ -52,6 +56,7 @@ func NewSnapshotCommand() *cobra.Command {
|
||||
// Add subcommands
|
||||
cmd.AddCommand(newSnapshotCreateCommand())
|
||||
cmd.AddCommand(newSnapshotListCommand())
|
||||
cmd.AddCommand(newSnapshotFilesCommand())
|
||||
cmd.AddCommand(newSnapshotPurgeCommand())
|
||||
cmd.AddCommand(newSnapshotVerifyCommand())
|
||||
cmd.AddCommand(newSnapshotRemoveCommand())
|
||||
@@ -172,6 +177,44 @@ func newSnapshotListCommand() *cobra.Command {
|
||||
return cmd
|
||||
}
|
||||
|
||||
// newSnapshotFilesCommand creates the 'snapshot files' subcommand
|
||||
func newSnapshotFilesCommand() *cobra.Command {
|
||||
var jsonOutput bool
|
||||
|
||||
cmd := &cobra.Command{
|
||||
Use: "files <snapshot-id> [path]",
|
||||
Short: "List the files in a snapshot",
|
||||
Long: `Lists the path, size, mode and modification time of every file in a
|
||||
snapshot, without restoring it. With a path, lists only that path and
|
||||
what is under it; a path that matches nothing is an error.
|
||||
|
||||
The snapshot may be named by its ID or, on a host with no local index,
|
||||
by the remote key that 'snapshot list' prints for a remote-only snapshot
|
||||
(an unambiguous leading part is enough).
|
||||
|
||||
The file list is only in the snapshot's encrypted database, so this
|
||||
downloads and decrypts it, and requires the age private key in the
|
||||
VAULTIK_AGE_SECRET_KEY environment variable, as 'snapshot restore' does.`,
|
||||
Args: cobra.RangeArgs(1, filesMaxArgs),
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
path := ""
|
||||
if len(args) == filesMaxArgs {
|
||||
path = args[1]
|
||||
}
|
||||
|
||||
return runVaultikApp(cmd, readOnly, jsonOutput,
|
||||
"Failed to list snapshot files",
|
||||
func(v *vaultik.Vaultik) error {
|
||||
return v.ListSnapshotFiles(args[0], path, jsonOutput)
|
||||
})
|
||||
},
|
||||
}
|
||||
|
||||
cmd.Flags().BoolVar(&jsonOutput, "json", false, "Output in JSON format")
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
// newSnapshotPurgeCommand creates the 'snapshot purge' subcommand
|
||||
func newSnapshotPurgeCommand() *cobra.Command {
|
||||
opts := &vaultik.SnapshotPurgeOptions{}
|
||||
|
||||
Reference in new issue
Block a user