lsjson: add --encrypted to show encrypted name #1765
This commit is contained in:
parent
0861207ace
commit
acae10cd6f
1 changed files with 42 additions and 10 deletions
|
@ -3,10 +3,12 @@ package lsjson
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/ncw/rclone/backend/crypt"
|
||||||
"github.com/ncw/rclone/cmd"
|
"github.com/ncw/rclone/cmd"
|
||||||
"github.com/ncw/rclone/cmd/ls/lshelp"
|
"github.com/ncw/rclone/cmd/ls/lshelp"
|
||||||
"github.com/ncw/rclone/fs"
|
"github.com/ncw/rclone/fs"
|
||||||
|
@ -17,9 +19,10 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
recurse bool
|
recurse bool
|
||||||
showHash bool
|
showHash bool
|
||||||
noModTime bool
|
showEncrypted bool
|
||||||
|
noModTime bool
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -27,16 +30,18 @@ func init() {
|
||||||
commandDefintion.Flags().BoolVarP(&recurse, "recursive", "R", false, "Recurse into the listing.")
|
commandDefintion.Flags().BoolVarP(&recurse, "recursive", "R", false, "Recurse into the listing.")
|
||||||
commandDefintion.Flags().BoolVarP(&showHash, "hash", "", false, "Include hashes in the output (may take longer).")
|
commandDefintion.Flags().BoolVarP(&showHash, "hash", "", false, "Include hashes in the output (may take longer).")
|
||||||
commandDefintion.Flags().BoolVarP(&noModTime, "no-modtime", "", false, "Don't read the modification time (can speed things up).")
|
commandDefintion.Flags().BoolVarP(&noModTime, "no-modtime", "", false, "Don't read the modification time (can speed things up).")
|
||||||
|
commandDefintion.Flags().BoolVarP(&showEncrypted, "encrypted", "M", false, "Show the encrypted names.")
|
||||||
}
|
}
|
||||||
|
|
||||||
// lsJSON in the struct which gets marshalled for each line
|
// lsJSON in the struct which gets marshalled for each line
|
||||||
type lsJSON struct {
|
type lsJSON struct {
|
||||||
Path string
|
Path string
|
||||||
Name string
|
Name string
|
||||||
Size int64
|
Encrypted string `json:",omitempty"`
|
||||||
ModTime Timestamp //`json:",omitempty"`
|
Size int64
|
||||||
IsDir bool
|
ModTime Timestamp //`json:",omitempty"`
|
||||||
Hashes map[string]string `json:",omitempty"`
|
IsDir bool
|
||||||
|
Hashes map[string]string `json:",omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Timestamp a time in RFC3339 format with Nanosecond precision secongs
|
// Timestamp a time in RFC3339 format with Nanosecond precision secongs
|
||||||
|
@ -67,14 +72,17 @@ The output is an array of Items, where each Item looks like this
|
||||||
"IsDir" : false,
|
"IsDir" : false,
|
||||||
"ModTime" : "2017-05-31T16:15:57.034468261+01:00",
|
"ModTime" : "2017-05-31T16:15:57.034468261+01:00",
|
||||||
"Name" : "file.txt",
|
"Name" : "file.txt",
|
||||||
|
"Encrypted" : "v0qpsdq8anpci8n929v3uu9338",
|
||||||
"Path" : "full/path/goes/here/file.txt",
|
"Path" : "full/path/goes/here/file.txt",
|
||||||
"Size" : 6
|
"Size" : 6
|
||||||
}
|
}
|
||||||
|
|
||||||
If --hash is not specified the the Hashes property won't be emitted.
|
If --hash is not specified the Hashes property won't be emitted.
|
||||||
|
|
||||||
If --no-modtime is specified then ModTime will be blank.
|
If --no-modtime is specified then ModTime will be blank.
|
||||||
|
|
||||||
|
If --encrypted is not specified the Encrypted won't be emitted.
|
||||||
|
|
||||||
The Path field will only show folders below the remote path being listed.
|
The Path field will only show folders below the remote path being listed.
|
||||||
If "remote:path" contains the file "subfolder/file.txt", the Path for "file.txt"
|
If "remote:path" contains the file "subfolder/file.txt", the Path for "file.txt"
|
||||||
will be "subfolder/file.txt", not "remote:path/subfolder/file.txt".
|
will be "subfolder/file.txt", not "remote:path/subfolder/file.txt".
|
||||||
|
@ -88,6 +96,20 @@ can be processed line by line as each item is written one to a line.
|
||||||
Run: func(command *cobra.Command, args []string) {
|
Run: func(command *cobra.Command, args []string) {
|
||||||
cmd.CheckArgs(1, 1, command, args)
|
cmd.CheckArgs(1, 1, command, args)
|
||||||
fsrc := cmd.NewFsSrc(args)
|
fsrc := cmd.NewFsSrc(args)
|
||||||
|
var cipher crypt.Cipher
|
||||||
|
if showEncrypted {
|
||||||
|
fsInfo, configName, _, err := fs.ParseRemote(args[0])
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf(err.Error())
|
||||||
|
}
|
||||||
|
if fsInfo.Name != "crypt" {
|
||||||
|
log.Fatalf("The remote needs to be of type \"crypt\"")
|
||||||
|
}
|
||||||
|
cipher, err = crypt.NewCipher(configName)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf(err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
cmd.Run(false, false, command, func() error {
|
cmd.Run(false, false, command, func() error {
|
||||||
fmt.Println("[")
|
fmt.Println("[")
|
||||||
first := true
|
first := true
|
||||||
|
@ -106,6 +128,16 @@ can be processed line by line as each item is written one to a line.
|
||||||
if !noModTime {
|
if !noModTime {
|
||||||
item.ModTime = Timestamp(entry.ModTime())
|
item.ModTime = Timestamp(entry.ModTime())
|
||||||
}
|
}
|
||||||
|
if cipher != nil {
|
||||||
|
switch entry.(type) {
|
||||||
|
case fs.Directory:
|
||||||
|
item.Encrypted = cipher.EncryptDirName(path.Base(entry.Remote()))
|
||||||
|
case fs.Object:
|
||||||
|
item.Encrypted = cipher.EncryptFileName(path.Base(entry.Remote()))
|
||||||
|
default:
|
||||||
|
fs.Errorf(nil, "Unknown type %T in listing", entry)
|
||||||
|
}
|
||||||
|
}
|
||||||
switch x := entry.(type) {
|
switch x := entry.(type) {
|
||||||
case fs.Directory:
|
case fs.Directory:
|
||||||
item.IsDir = true
|
item.IsDir = true
|
||||||
|
|
Loading…
Reference in a new issue