Files
kopia/cli/command_repository_connect.go
Jarek Kowalski ad4b222939 cli: added support for copying (or moving) snapshot history (#703)
Both source and destination can be specified using user@host,
@host or user@host:/path where destination values override the
corresponding parts of the source, so both targeted
and mass copying is supported.

Supported combinations are:

Source:             Destination         Behavior
---------------------------------------------------
@host1              @host2              copy snapshots from all users of host1
user1@host1         @host2              copy all snapshots to user1@host2
user1@host1         user2@host2         copy all snapshots to user2@host2
user1@host1:/path1  @host2              copy to user1@host2:/path1
user1@host1:/path1  user2@host2         copy to user2@host2:/path1
user1@host1:/path1  user2@host2:/path2  copy snapshots from single path

When --move is specified, the matching source snapshots are also deleted.

* cli: upgraded kingpin to latest version (not tagged)

This allows using `EnableFileExpansion` to disable treating
arguments prefixed with "@" as file includes.
2020-12-04 16:34:55 -08:00

86 lines
3.4 KiB
Go

package cli
import (
"context"
"time"
"github.com/alecthomas/kingpin"
"github.com/pkg/errors"
"github.com/kopia/kopia/repo"
"github.com/kopia/kopia/repo/blob"
"github.com/kopia/kopia/repo/content"
)
var (
connectCommand = repositoryCommands.Command("connect", "Connect to a repository.")
connectPersistCredentials bool
connectCacheDirectory string
connectMaxCacheSizeMB int64
connectMaxMetadataCacheSizeMB int64
connectMaxListCacheDuration time.Duration
connectHostname string
connectUsername string
connectCheckForUpdates bool
connectReadonly bool
connectDescription string
)
func setupConnectOptions(cmd *kingpin.CmdClause) {
// Set up flags shared between 'create' and 'connect'. Note that because those flags are used by both command
// we must use *Var() methods, otherwise one of the commands would always get default flag values.
cmd.Flag("persist-credentials", "Persist credentials").Default("true").BoolVar(&connectPersistCredentials)
cmd.Flag("cache-directory", "Cache directory").PlaceHolder("PATH").StringVar(&connectCacheDirectory)
cmd.Flag("content-cache-size-mb", "Size of local content cache").PlaceHolder("MB").Default("5000").Int64Var(&connectMaxCacheSizeMB)
cmd.Flag("metadata-cache-size-mb", "Size of local metadata cache").PlaceHolder("MB").Default("5000").Int64Var(&connectMaxMetadataCacheSizeMB)
cmd.Flag("max-list-cache-duration", "Duration of index cache").Default("600s").Hidden().DurationVar(&connectMaxListCacheDuration)
cmd.Flag("override-hostname", "Override hostname used by this repository connection").Hidden().StringVar(&connectHostname)
cmd.Flag("override-username", "Override username used by this repository connection").Hidden().StringVar(&connectUsername)
cmd.Flag("check-for-updates", "Periodically check for Kopia updates on GitHub").Default("true").Envar(checkForUpdatesEnvar).BoolVar(&connectCheckForUpdates)
cmd.Flag("readonly", "Make repository read-only to avoid accidental changes").BoolVar(&connectReadonly)
cmd.Flag("description", "Human-readable description of the repository").StringVar(&connectDescription)
}
func connectOptions() *repo.ConnectOptions {
return &repo.ConnectOptions{
PersistCredentials: connectPersistCredentials,
CachingOptions: content.CachingOptions{
CacheDirectory: connectCacheDirectory,
MaxCacheSizeBytes: connectMaxCacheSizeMB << 20, //nolint:gomnd
MaxMetadataCacheSizeBytes: connectMaxMetadataCacheSizeMB << 20, //nolint:gomnd
MaxListCacheDurationSec: int(connectMaxListCacheDuration.Seconds()),
},
ClientOptions: repo.ClientOptions{
Hostname: connectHostname,
Username: connectUsername,
ReadOnly: connectReadonly,
Description: connectDescription,
},
}
}
func init() {
setupConnectOptions(connectCommand)
}
func runConnectCommandWithStorage(ctx context.Context, st blob.Storage) error {
password, err := getPasswordFromFlags(ctx, false, false)
if err != nil {
return errors.Wrap(err, "getting password")
}
return runConnectCommandWithStorageAndPassword(ctx, st, password)
}
func runConnectCommandWithStorageAndPassword(ctx context.Context, st blob.Storage, password string) error {
configFile := repositoryConfigFileName()
if err := repo.Connect(ctx, configFile, st, password, connectOptions()); err != nil {
return err
}
log(ctx).Infof("Connected to repository.")
maybeInitializeUpdateCheck(ctx)
return nil
}