Guest User

Untitled

a guest
Jul 6th, 2020
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 3.24 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "encoding/gob"
  5.     "fmt"
  6.     "log"
  7.     "os"
  8.     "time"
  9.  
  10.     "github.com/aws/aws-sdk-go/aws"
  11.     "github.com/aws/aws-sdk-go/aws/session"
  12.     "github.com/aws/aws-sdk-go/service/s3"
  13.     "github.com/aws/aws-sdk-go/service/s3/s3manager"
  14. )
  15.  
  16. type fileRecord struct {
  17.     FileName string
  18.     MTime    time.Time
  19. }
  20.  
  21. type allFiles []fileRecord
  22.  
  23. var pfile = new(allFiles)
  24. var filesInProcess []fileRecord
  25.  
  26. // Usage: go run bucket.go BUCKET_NAME
  27. func main() {
  28.     if len(os.Args) != 2 {
  29.         exitErrorf("Bucket name required\nUsage: %s bucket_name",
  30.             os.Args[0])
  31.     }
  32.  
  33.     bucket := os.Args[1]
  34.  
  35.     // credentials from the shared credentials file ~/.aws/credentials.
  36.     sess, err := session.NewSession(&aws.Config{
  37.         Region: aws.String("us-east-1")},
  38.     )
  39.  
  40.     // Create S3 service client
  41.     svc := s3.New(sess)
  42.  
  43.     // Get the list of items
  44.     resp, err := svc.ListObjectsV2(&s3.ListObjectsV2Input{
  45.         Bucket: aws.String(bucket),
  46.         Prefix: aws.String("weak/")})
  47.     if err != nil {
  48.         exitErrorf("Unable to list items in bucket %q, %v", bucket, err)
  49.     }
  50.  
  51.     workingDir, err := os.Getwd()
  52.     if err != nil {
  53.         log.Println(err)
  54.     }
  55.  
  56.     // load file log
  57.     inProcessLog := workingDir + "/inProcessFiles"
  58.     if fileExists(inProcessLog) {
  59.         err = readGob(inProcessLog, pfile)
  60.         if err != nil {
  61.             fmt.Println(err)
  62.         } else {
  63.             for _, v := range *pfile {
  64.                 filesInProcess = append(filesInProcess, fileRecord{v.FileName, v.MTime})
  65.             }
  66.         }
  67.     }
  68.  
  69.     // process files
  70.     for _, item := range resp.Contents {
  71.         if !(fileExists(workingDir + "/" + *item.Key)) {
  72.             filesInProcess = append(filesInProcess, fileRecord{*item.Key, *item.LastModified})
  73.             downloadS3Objects(bucket, item, sess)
  74.         } else {
  75.             fmt.Printf("We already have %s.\n", *item.Key)
  76.         }
  77.     }
  78.     err = writeGob(inProcessLog, filesInProcess)
  79.     if err != nil {
  80.         fmt.Println(err)
  81.     }
  82.  
  83.     fmt.Println("Found", len(resp.Contents), "items in bucket", bucket)
  84.     fmt.Println("")
  85. }
  86.  
  87. func exitErrorf(msg string, args ...interface{}) {
  88.     fmt.Fprintf(os.Stderr, msg+"\n", args...)
  89.     os.Exit(1)
  90. }
  91.  
  92. func downloadS3Objects(bucket string, item *s3.Object, sess *session.Session) {
  93.     file, err := os.Create(*item.Key)
  94.     if err != nil {
  95.         exitErrorf("Unable to open file %q, %v", item, err)
  96.     }
  97.  
  98.     defer file.Close()
  99.  
  100.     downloader := s3manager.NewDownloader(sess)
  101.  
  102.     numBytes, err := downloader.Download(file,
  103.         &s3.GetObjectInput{
  104.             Bucket: aws.String(bucket),
  105.             Key:    aws.String(*item.Key),
  106.         })
  107.     if err != nil {
  108.         exitErrorf("Unable to download item %q, %v", item, err)
  109.     }
  110.  
  111.     fmt.Println("Downloaded", file.Name(), numBytes, "bytes")
  112. }
  113.  
  114. func writeGob(filePath string, object interface{}) error {
  115.     file, err := os.Create(filePath)
  116.     if err != nil {
  117.         exitErrorf("Unable to open file %q, %v", filePath, err)
  118.     }
  119.  
  120.     defer file.Close()
  121.  
  122.     encoder := gob.NewEncoder(file)
  123.     encoder.Encode(object)
  124.     return err
  125. }
  126.  
  127. func readGob(filePath string, object interface{}) error {
  128.     file, err := os.Open(filePath)
  129.  
  130.     if err != nil {
  131.         exitErrorf("Unable to open file %q, %v", filePath, err)
  132.     }
  133.  
  134.     defer file.Close()
  135.     decoder := gob.NewDecoder(file)
  136.     err = decoder.Decode(object)
  137.  
  138.     return err
  139. }
  140.  
  141. func fileExists(filename string) bool {
  142.     info, err := os.Stat(filename)
  143.     if os.IsNotExist(err) {
  144.         return false
  145.     }
  146.     return !info.IsDir()
  147. }
Add Comment
Please, Sign In to add comment