6
"github.com/spf13/cobra"
7
"github.com/spf13/viper"
8
"github.com/wal-g/tracelog"
9
"github.com/wal-g/wal-g/internal"
10
conf "github.com/wal-g/wal-g/internal/config"
11
"github.com/wal-g/wal-g/internal/databases/postgres"
12
"github.com/wal-g/wal-g/internal/multistorage"
13
"github.com/wal-g/wal-g/internal/multistorage/policies"
17
backupFetchShortDescription = "Fetches a backup from storage"
18
maskFlagDescription = `Fetches only files which path relative to destination_directory
19
matches given shell file pattern.
20
For information about pattern syntax view: https://golang.org/pkg/path/filepath/#Match`
21
restoreSpecDescription = "Path to file containing tablespace restore specification"
22
reverseDeltaUnpackDescription = "Unpack delta backups in reverse order (beta feature)"
23
skipRedundantTarsDescription = "Skip tars with no useful data (requires reverse delta unpack)"
24
targetUserDataDescription = "Fetch storage backup which has the specified user data"
25
restoreOnlyDescription = `[Experimental] Downloads only databases or tables specified by passed names.
26
Separate parameters with comma. Use 'database' or 'database/namespace.table' as a parameter ('public' namespace can be omitted).
27
Sets reverse delta unpack & skip redundant tars options automatically. Always downloads system databases and tables.`
32
var reverseDeltaUnpack bool
33
var skipRedundantTars bool
34
var fetchTargetUserData string
35
var partialRestoreArgs []string
37
var backupFetchCmd = &cobra.Command{
38
Use: "backup-fetch destination_directory [backup_name | --target-user-data <data>]",
39
Short: backupFetchShortDescription, // TODO : improve description
40
Args: cobra.RangeArgs(1, 2),
41
Run: func(cmd *cobra.Command, args []string) {
42
internal.ConfigureLimiters()
44
if fetchTargetUserData == "" {
45
fetchTargetUserData = viper.GetString(conf.FetchTargetUserDataSetting)
47
targetBackupSelector, err := createTargetFetchBackupSelector(cmd, args, fetchTargetUserData)
48
tracelog.ErrorLogger.FatalOnError(err)
50
storage, err := postgres.ConfigureMultiStorage(false)
51
tracelog.ErrorLogger.FatalOnError(err)
53
rootFolder := multistorage.SetPolicies(storage.RootFolder(), policies.UniteAllStorages)
54
if targetStorage == "" {
55
rootFolder, err = multistorage.UseAllAliveStorages(rootFolder)
57
rootFolder, err = multistorage.UseSpecificStorage(targetStorage, rootFolder)
59
tracelog.ErrorLogger.FatalOnError(err)
60
tracelog.InfoLogger.Printf("Backup to fetch will be searched in storages: %v", multistorage.UsedStorages(rootFolder))
62
if partialRestoreArgs != nil {
63
skipRedundantTars = true
64
reverseDeltaUnpack = true
66
reverseDeltaUnpack = reverseDeltaUnpack || viper.GetBool(conf.UseReverseUnpackSetting)
67
skipRedundantTars = skipRedundantTars || viper.GetBool(conf.SkipRedundantTarsSetting)
69
var extractProv postgres.ExtractProvider
71
if partialRestoreArgs != nil {
72
extractProv = postgres.NewExtractProviderDBSpec(partialRestoreArgs)
74
extractProv = postgres.ExtractProviderImpl{}
77
var pgFetcher internal.Fetcher
78
if reverseDeltaUnpack {
79
pgFetcher = postgres.GetFetcherNew(args[0], fileMask, restoreSpec, skipRedundantTars, extractProv)
81
pgFetcher = postgres.GetFetcherOld(args[0], fileMask, restoreSpec, extractProv)
84
internal.HandleBackupFetch(rootFolder, targetBackupSelector, pgFetcher)
88
// create the BackupSelector to select the backup to fetch
89
func createTargetFetchBackupSelector(cmd *cobra.Command,
90
args []string, targetUserData string) (internal.BackupSelector, error) {
96
backupSelector, err := internal.NewTargetBackupSelector(targetUserData, targetName, postgres.NewGenericMetaFetcher())
98
fmt.Println(cmd.UsageString())
101
return backupSelector, nil
105
backupFetchCmd.Flags().StringVar(&fileMask, "mask", "", maskFlagDescription)
106
backupFetchCmd.Flags().StringVar(&restoreSpec, "restore-spec", "", restoreSpecDescription)
107
backupFetchCmd.Flags().BoolVar(&reverseDeltaUnpack, "reverse-unpack",
108
false, reverseDeltaUnpackDescription)
109
backupFetchCmd.Flags().BoolVar(&skipRedundantTars, "skip-redundant-tars",
110
false, skipRedundantTarsDescription)
111
backupFetchCmd.Flags().StringVar(&fetchTargetUserData, "target-user-data",
112
"", targetUserDataDescription)
113
backupFetchCmd.Flags().StringSliceVar(&partialRestoreArgs, "restore-only",
114
nil, restoreOnlyDescription)
115
backupFetchCmd.Flags().StringVar(&targetStorage, "target-storage",
116
"", targetStorageDescription)
118
Cmd.AddCommand(backupFetchCmd)