Files
kopia/cli/command_repository_status.go
Jarek Kowalski e03971fc59 Upgraded linter to v1.33.0 (#734)
* linter: upgraded to 1.33, disabled some linters

* lint: fixed 'errorlint' errors

This ensures that all error comparisons use errors.Is() or errors.As().
We will be wrapping more errors going forward so it's important that
error checks are not strict everywhere.

Verified that there are no exceptions for errorlint linter which
guarantees that.

* lint: fixed or suppressed wrapcheck errors

* lint: nolintlint and misc cleanups

Co-authored-by: Julio López <julio+gh@kasten.io>
2020-12-21 22:39:22 -08:00

115 lines
3.0 KiB
Go

package cli
import (
"context"
"encoding/json"
"fmt"
"io/ioutil"
"path/filepath"
"reflect"
"github.com/pkg/errors"
"github.com/kopia/kopia/internal/scrubber"
"github.com/kopia/kopia/internal/units"
"github.com/kopia/kopia/repo"
)
var (
statusCommand = repositoryCommands.Command("status", "Display the status of connected repository.")
statusReconnectToken = statusCommand.Flag("reconnect-token", "Display reconnect command").Short('t').Bool()
statusReconnectTokenIncludePassword = statusCommand.Flag("reconnect-token-with-password", "Include password in reconnect token").Short('s').Bool()
)
func runStatusCommand(ctx context.Context, rep repo.Repository) error {
fmt.Printf("Config file: %v\n", repositoryConfigFileName())
fmt.Println()
fmt.Printf("Description: %v\n", rep.ClientOptions().Description)
fmt.Printf("Hostname: %v\n", rep.ClientOptions().Hostname)
fmt.Printf("Username: %v\n", rep.ClientOptions().Username)
fmt.Printf("Read-only: %v\n", rep.ClientOptions().ReadOnly)
dr, ok := rep.(*repo.DirectRepository)
if !ok {
return nil
}
fmt.Println()
ci := dr.Blobs.ConnectionInfo()
fmt.Printf("Storage type: %v\n", ci.Type)
if cjson, err := json.MarshalIndent(scrubber.ScrubSensitiveData(reflect.ValueOf(ci.Config)).Interface(), " ", " "); err == nil {
fmt.Printf("Storage config: %v\n", string(cjson))
}
fmt.Println()
fmt.Printf("Unique ID: %x\n", dr.UniqueID)
fmt.Printf("Hash: %v\n", dr.Content.Format.Hash)
fmt.Printf("Encryption: %v\n", dr.Content.Format.Encryption)
fmt.Printf("Splitter: %v\n", dr.Objects.Format.Splitter)
fmt.Printf("Format version: %v\n", dr.Content.Format.Version)
fmt.Printf("Max pack length: %v\n", units.BytesStringBase2(int64(dr.Content.Format.MaxPackSize)))
if !*statusReconnectToken {
return nil
}
pass := ""
if *statusReconnectTokenIncludePassword {
var err error
pass, err = getPasswordFromFlags(ctx, false, true)
if err != nil {
return errors.Wrap(err, "getting password")
}
}
tok, err := dr.Token(pass)
if err != nil {
return errors.Wrap(err, "error computing repository token")
}
fmt.Printf("\nTo reconnect to the repository use:\n\n$ kopia repository connect from-config --token %v\n\n", tok)
if pass != "" {
fmt.Printf("NOTICE: The token printed above can be trivially decoded to reveal the repository password. Do not store it in an unsecured place.\n")
}
return nil
}
func scanCacheDir(dirname string) (fileCount int, totalFileLength int64, err error) {
entries, err := ioutil.ReadDir(dirname)
if err != nil {
return 0, 0, nil
}
for _, e := range entries {
if e.IsDir() {
subdir := filepath.Join(dirname, e.Name())
c, l, err2 := scanCacheDir(subdir)
if err2 != nil {
return 0, 0, err2
}
fileCount += c
totalFileLength += l
continue
}
fileCount++
totalFileLength += e.Size()
}
return
}
func init() {
statusCommand.Action(repositoryAction(runStatusCommand))
}