in s3plugin/restore.go [57:112]
func RestoreDirectory(c *cli.Context) error {
start := time.Now()
totalBytes := int64(0)
config, sess, err := readConfigAndStartSession(c)
if err != nil {
return err
}
dirName := c.Args().Get(1)
bucket := config.Options.Bucket
gplog.Verbose("Restore Directory '%s' from S3", dirName)
gplog.Verbose("S3 Location = s3://%s/%s", bucket, dirName)
gplog.Info("dirKey = %s\n", dirName)
_ = os.MkdirAll(dirName, 0775)
client := s3.New(sess)
params := &s3.ListObjectsV2Input{Bucket: &bucket, Prefix: &dirName}
bucketObjectsList, _ := client.ListObjectsV2(params)
numFiles := 0
for _, key := range bucketObjectsList.Contents {
var filename string
if strings.HasSuffix(*key.Key, "/") {
// Got a directory
continue
}
if strings.Contains(*key.Key, "/") {
// split
s3FileFullPathList := strings.Split(*key.Key, "/")
filename = s3FileFullPathList[len(s3FileFullPathList)-1]
}
filePath := dirName + "/" + filename
file, err := os.Create(filePath)
if err != nil {
return err
}
bytes, elapsed, err := downloadFile(sess, config, bucket, *key.Key, file)
_ = file.Close()
if err != nil {
fileErr := os.Remove(filename)
if fileErr != nil {
gplog.Error(fileErr.Error())
}
return err
}
totalBytes += bytes
numFiles++
gplog.Info("Downloaded %d bytes for %s in %v", bytes,
filepath.Base(*key.Key), elapsed.Round(time.Millisecond))
}
gplog.Info("Downloaded %d files (%d bytes) in %v\n",
numFiles, totalBytes, time.Since(start).Round(time.Millisecond))
return nil
}