diff --git a/go.mod b/go.mod index 3ffd270..8a2974c 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,7 @@ module github.com/status-im/go-s3up go 1.17 + +require github.com/aws/aws-sdk-go v1.42.32 + +require github.com/jmespath/go-jmespath v0.4.0 // indirect diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..52b7357 --- /dev/null +++ b/go.sum @@ -0,0 +1,17 @@ +github.com/aws/aws-sdk-go v1.42.32 h1:YRe7du5KeSa2jHKEccOSL6/1fNM1Qaj0JqSGTdmtaws= +github.com/aws/aws-sdk-go v1.42.32/go.mod h1:OGr6lGMAKGlG9CVrYnWYDKIyb829c6EVBRjxqjmPepc= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/main.go b/main.go new file mode 100644 index 0000000..97a2d85 --- /dev/null +++ b/main.go @@ -0,0 +1,97 @@ +package main + +import ( + "flag" + "fmt" + "log" + "os" + "strings" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/credentials" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/s3" +) + +var l *log.Logger + +var ( + target string + acl string + bucket string + region string + endpoint string + keyid string + secret string +) + +const helpMessage string = ` +This is a simple S3-compatible upload CLI tool. + +` + +func envVar(key string, defaultVal string) string { + if val, ok := os.LookupEnv(key); ok { + return val + } + return defaultVal +} + +func flagsInit() { + defaultUsage := flag.Usage + flag.Usage = func() { + fmt.Printf(strings.Trim(helpMessage, "\t ")) + defaultUsage() + } + + flag.StringVar(&target, "target", "", "Path of file to upload.") + flag.StringVar(&acl, "acl", "private", "Type of permission for file.") + flag.StringVar(&bucket, "bucket", "", "Name of bucket to upload to.") + flag.StringVar(®ion, "region", envVar("AWS_DEFAULT_REGION", "ams3"), "Name of region to upload to.") + flag.StringVar(&endpoint, "endpoint", envVar("AWS_DEFAULT_ENDPOINT", "ams3.digitaloceanspaces.com"), "S3 API endpoint.") + flag.StringVar(&keyid, "keyid", envVar("AWS_ACCESS_KEY_ID", ""), "API key ID.") + flag.StringVar(&secret, "secret", envVar("AWS_SECRET_ACCESS_KEY", ""), "API secret key.") + flag.Parse() +} + +func main() { + l = log.New(os.Stderr, "", log.Lshortfile) + + flagsInit() + + if len(keyid) == 0 { + l.Println("Provide -keyid flag or AWS_ACCESS_KEY_ID env var") + os.Exit(1) + } + if len(secret) == 0 { + l.Println("Provide -secret flag or AWS_SECRET_ACCESS_KEY env var") + os.Exit(1) + } + + s3Config := &aws.Config{ + Credentials: credentials.NewStaticCredentials(keyid, secret, ""), + Endpoint: aws.String(endpoint), + Region: aws.String(region), + } + + newSession := session.New(s3Config) + s3Client := s3.New(newSession) + + file, err := os.Open(target) + if err != nil { + l.Println("Failed to open file: ", err) + os.Exit(1) + } + + object := s3.PutObjectInput{ + Bucket: aws.String(bucket), + Key: aws.String(target), + ACL: aws.String(acl), + Body: file, + } + + _, err = s3Client.PutObject(&object) + if err != nil { + fmt.Println(err.Error()) + } +}