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  }