github.com/cloudfoundry-attic/ltc@v0.0.0-20151123212628-098adc7919fc/cell-helpers/s3tool/main.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "io" 6 "os" 7 8 "github.com/aws/aws-sdk-go/aws" 9 "github.com/aws/aws-sdk-go/aws/credentials" 10 "github.com/aws/aws-sdk-go/aws/session" 11 "github.com/aws/aws-sdk-go/service/s3" 12 ) 13 14 func main() { 15 args := os.Args[1:] 16 var action string 17 18 if len(args) >= 1 { 19 action = args[0] 20 } 21 22 switch action { 23 case "delete": 24 deleteAction(args[1:]) 25 case "get": 26 getAction(args[1:]) 27 case "put": 28 putAction(args[1:]) 29 default: 30 fmt.Println("Usage: s3tool [get|put|delete] arguments...") 31 os.Exit(3) 32 } 33 } 34 35 func deleteAction(args []string) { 36 if len(args) != 5 { 37 fmt.Println("Usage: s3tool delete s3AccessKey s3SecretKey s3Bucket s3Region s3Path") 38 os.Exit(3) 39 } 40 41 accessKey, secretKey, bucket, region, path := args[0], args[1], args[2], args[3], args[4] 42 43 client := connect(accessKey, secretKey, region) 44 45 if _, err := client.DeleteObject(&s3.DeleteObjectInput{ 46 Bucket: aws.String(bucket), 47 Key: aws.String(path), 48 }); err != nil { 49 fmt.Printf("Error deleting s3://%s/%s: %s\n", bucket, path, err) 50 os.Exit(2) 51 } 52 53 fmt.Printf("Deleted s3://%s/%s.\n", bucket, path) 54 } 55 56 func getAction(args []string) { 57 if len(args) != 6 { 58 fmt.Println("Usage: s3tool get s3AccessKey s3SecretKey s3Bucket s3Region s3Path destinationFilePath") 59 os.Exit(3) 60 } 61 62 accessKey, secretKey, bucket, region, path, destPath := args[0], args[1], args[2], args[3], args[4], args[5] 63 64 client := connect(accessKey, secretKey, region) 65 66 output, err := client.GetObject(&s3.GetObjectInput{ 67 Bucket: aws.String(bucket), 68 Key: aws.String(path), 69 }) 70 if err != nil { 71 fmt.Printf("Error downloading s3://%s/%s: %s\n", bucket, path, err) 72 os.Exit(2) 73 } 74 75 destFile, err := os.OpenFile(destPath, os.O_RDWR|os.O_CREATE, 0644) 76 if err != nil { 77 fmt.Printf("Error opening %s: %s\n", destPath, err) 78 os.Exit(2) 79 } 80 defer destFile.Close() 81 82 if _, err := io.Copy(destFile, output.Body); err != nil { 83 fmt.Printf("Error writing response to %s: %s\n", destPath, err) 84 os.Exit(2) 85 } 86 87 fmt.Printf("Downloaded s3://%s/%s to %s.\n", bucket, path, destPath) 88 } 89 90 func putAction(args []string) { 91 if len(args) != 6 { 92 fmt.Println("Usage: s3tool put s3AccessKey s3SecretKey s3Bucket s3Region s3Path fileToUpload") 93 os.Exit(3) 94 } 95 96 accessKey, secretKey, bucket, region, path, sourcePath := args[0], args[1], args[2], args[3], args[4], args[5] 97 98 client := connect(accessKey, secretKey, region) 99 100 sourceFile, err := os.OpenFile(sourcePath, os.O_RDONLY, 0444) 101 if err != nil { 102 fmt.Printf("Error opening %s: %s\n", sourcePath, err) 103 os.Exit(2) 104 } 105 defer sourceFile.Close() 106 107 if _, err := client.PutObject(&s3.PutObjectInput{ 108 Bucket: aws.String(bucket), 109 Key: aws.String(path), 110 Body: sourceFile, 111 }); err != nil { 112 fmt.Printf("Error uploading %s: %s\n", sourcePath, err) 113 os.Exit(2) 114 } 115 116 fmt.Printf("Uploaded %s to s3://%s/%s.\n", sourcePath, bucket, path) 117 } 118 119 func connect(accessKey, secretKey, region string) *s3.S3 { 120 client := s3.New(session.New(&aws.Config{ 121 Credentials: credentials.NewStaticCredentials(accessKey, secretKey, ""), 122 Region: aws.String(region), 123 S3ForcePathStyle: aws.Bool(true), 124 })) 125 126 if override := os.Getenv("AWS_ENDPOINT_OVERRIDE"); override != "" { 127 client.Endpoint = override 128 } 129 130 return client 131 }