Skip to content

Instantly share code, notes, and snippets.

@markbates
Last active November 1, 2018 18:34
Show Gist options
  • Select an option

  • Save markbates/93f8bd139997b1273aad4bf59ab6d6f9 to your computer and use it in GitHub Desktop.

Select an option

Save markbates/93f8bd139997b1273aad4bf59ab6d6f9 to your computer and use it in GitHub Desktop.

Revisions

  1. markbates revised this gist Nov 1, 2018. 5 changed files with 47 additions and 43 deletions.
    7 changes: 3 additions & 4 deletions client-app.go
    Original file line number Diff line number Diff line change
    @@ -4,17 +4,16 @@ import (
    "fmt"
    "net/http"

    // _ "github.com/gobuffalo/buffalo"

    _ "github.com/gobuffalo/buffalo"
    "github.com/gobuffalo/packr/v2"
    "github.com/markbates/s3packr/s3packr"
    )

    func main() {
    box := packr.NewBox("../mysite/templates")
    box := packr.New("my templates", "../mysite/templates")
    box.DefaultResolver = s3packr.NewResolver()

    http.Handle("/", http.FileServer(box))
    fmt.Println("listening on :3000")
    http.ListenAndServe(":3000", nil)
    }
    }
    5 changes: 5 additions & 0 deletions main.go
    Original file line number Diff line number Diff line change
    @@ -4,19 +4,24 @@ import (
    "log"
    "os"

    "github.com/gobuffalo/logger"
    "github.com/gobuffalo/packr/v2/jam/parser"
    "github.com/gobuffalo/packr/v2/plog"
    "github.com/markbates/s3packr/s3packr"
    )

    func main() {
    plog.Logger = logger.New(logger.DebugLevel)
    paths := os.Args[1:]
    if len(paths) == 0 {
    paths = []string{"."}
    }

    ps, err := parser.NewFromRoots(paths, &parser.RootsOptions{})
    if err != nil {
    log.Fatal(err)
    }

    boxes, err := ps.Run()
    if err != nil {
    log.Fatal(err)
    6 changes: 2 additions & 4 deletions s3packr-resolver.go
    Original file line number Diff line number Diff line change
    @@ -15,7 +15,7 @@ type Resolver struct {

    func NewResolver() resolver.Resolver {
    return Resolver{
    Disk: &resolver.Disk{Root: bucket},
    Disk: &resolver.Disk{Root: "."},
    }
    }

    @@ -37,9 +37,7 @@ func (r Resolver) Resolve(box string, path string) (file.File, error) {

    f, err := r.Disk.Resolve(box, path)
    if err != nil {
    // couldn't find it on s3, check on disk
    rr := &resolver.Disk{Root: "."}
    return rr.Resolve(box, path)
    return f, errors.WithStack(err)
    }
    return f, nil
    }
    3 changes: 2 additions & 1 deletion s3packr-s3packr.go
    Original file line number Diff line number Diff line change
    @@ -5,10 +5,11 @@ import (
    "fmt"
    "io"
    "path/filepath"
    "strings"
    )

    func Key(s string) string {
    h := sha1.New()
    io.WriteString(h, s)
    io.WriteString(h, strings.ToLower(s))
    return fmt.Sprintf("%x%s", h.Sum(nil), filepath.Ext(s))
    }
    69 changes: 35 additions & 34 deletions s3packr-store.go
    Original file line number Diff line number Diff line change
    @@ -19,39 +19,64 @@ import (
    "github.com/pkg/errors"
    )

    const bucket = "/Users/markbates/Desktop/s3store"

    var _ store.Store = &S3Store{}

    type S3Store struct {
    *store.Disk
    }

    func New(box *parser.Box) *S3Store {
    return &S3Store{
    Disk: store.NewDisk(box.AbsPath, box.Package),
    }
    }

    type S3Store struct {
    *store.Disk
    }

    func (s *S3Store) Pack(box *parser.Box) error {
    plog.Debug(s, "Pack", "box", box)

    // walk the box and save it all to s3
    return filepath.Walk(box.AbsPath, func(path string, info os.FileInfo, err error) error {
    if info.IsDir() {
    return nil
    }
    return s.upload(box.Name, path)
    })
    }

    func (s *S3Store) upload(box string, path string) error {
    return withBucket(func(ctx context.Context, buck *blob.Bucket) error {
    w, err := buck.NewWriter(ctx, Key(box+path), &blob.WriterOptions{
    ContentType: "application/octet-stream",
    })
    if err != nil {
    return errors.WithStack(err)
    }
    defer w.Close()

    f, err := os.Open(path)
    if err != nil {
    return errors.WithStack(err)
    }
    defer f.Close()

    _, err = io.Copy(w, f)
    if err != nil {
    return errors.WithStack(err)
    }
    return nil
    })
    }

    func withBucket(fn func(context.Context, *blob.Bucket) error) error {
    ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    defer cancel()

    key := envy.Get("AWS_ACCESS_KEY", envy.Get("S3_KEY", ""))
    secret := envy.Get("AWS_ACCESS_SECRET", envy.Get("S3_SECRET", ""))
    key, err := envy.MustGet("S3_KEY")
    if err != nil {
    return errors.WithStack(err)
    }
    secret, err := envy.MustGet("S3_SECRET")
    if err != nil {
    return errors.WithStack(err)
    }

    config := aws.NewConfig()
    config.Region = aws.String("us-east-1")
    @@ -71,27 +96,3 @@ func withBucket(fn func(context.Context, *blob.Bucket) error) error {

    return fn(ctx, buck)
    }

    func (s *S3Store) upload(box string, path string) error {
    return withBucket(func(ctx context.Context, buck *blob.Bucket) error {
    w, err := buck.NewWriter(ctx, Key(box+path), &blob.WriterOptions{
    ContentType: "application/octet-stream",
    })
    if err != nil {
    return errors.WithStack(err)
    }
    defer w.Close()

    f, err := os.Open(path)
    if err != nil {
    return errors.WithStack(err)
    }
    defer f.Close()

    _, err = io.Copy(w, f)
    if err != nil {
    return errors.WithStack(err)
    }
    return nil
    })
    }
  2. markbates revised this gist Oct 30, 2018. 1 changed file with 20 additions and 0 deletions.
    20 changes: 20 additions & 0 deletions client-app.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,20 @@
    package main

    import (
    "fmt"
    "net/http"

    // _ "github.com/gobuffalo/buffalo"

    "github.com/gobuffalo/packr/v2"
    "github.com/markbates/s3packr/s3packr"
    )

    func main() {
    box := packr.NewBox("../mysite/templates")
    box.DefaultResolver = s3packr.NewResolver()

    http.Handle("/", http.FileServer(box))
    fmt.Println("listening on :3000")
    http.ListenAndServe(":3000", nil)
    }
  3. markbates revised this gist Oct 30, 2018. No changes.
  4. markbates created this gist Oct 30, 2018.
    31 changes: 31 additions & 0 deletions main.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,31 @@
    package main

    import (
    "log"
    "os"

    "github.com/gobuffalo/packr/v2/jam/parser"
    "github.com/markbates/s3packr/s3packr"
    )

    func main() {
    paths := os.Args[1:]
    if len(paths) == 0 {
    paths = []string{"."}
    }
    ps, err := parser.NewFromRoots(paths, &parser.RootsOptions{})
    if err != nil {
    log.Fatal(err)
    }
    boxes, err := ps.Run()
    if err != nil {
    log.Fatal(err)
    }

    for _, box := range boxes {
    s3 := s3packr.New(box)
    if err := s3.Pack(box); err != nil {
    log.Fatal(err)
    }
    }
    }
    45 changes: 45 additions & 0 deletions s3packr-resolver.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,45 @@
    package s3packr

    import (
    "context"

    "github.com/gobuffalo/packr/v2/file"
    "github.com/gobuffalo/packr/v2/file/resolver"
    "github.com/google/go-cloud/blob"
    "github.com/pkg/errors"
    )

    type Resolver struct {
    *resolver.Disk
    }

    func NewResolver() resolver.Resolver {
    return Resolver{
    Disk: &resolver.Disk{Root: bucket},
    }
    }

    func (r Resolver) Resolve(box string, path string) (file.File, error) {
    var f file.File
    key := Key(box + path)
    withBucket(func(ctx context.Context, buck *blob.Bucket) error {
    r, err := buck.NewReader(ctx, key)
    if err != nil {
    return errors.WithStack(err)
    }
    defer r.Close()
    f, err = file.NewFileR(path, r)
    return err
    })
    if f != nil {
    return f, nil
    }

    f, err := r.Disk.Resolve(box, path)
    if err != nil {
    // couldn't find it on s3, check on disk
    rr := &resolver.Disk{Root: "."}
    return rr.Resolve(box, path)
    }
    return f, nil
    }
    14 changes: 14 additions & 0 deletions s3packr-s3packr.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,14 @@
    package s3packr

    import (
    "crypto/sha1"
    "fmt"
    "io"
    "path/filepath"
    )

    func Key(s string) string {
    h := sha1.New()
    io.WriteString(h, s)
    return fmt.Sprintf("%x%s", h.Sum(nil), filepath.Ext(s))
    }
    97 changes: 97 additions & 0 deletions s3packr-store.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,97 @@
    package s3packr

    import (
    "context"
    "io"
    "os"
    "path/filepath"
    "time"

    "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/gobuffalo/envy"
    "github.com/gobuffalo/packr/v2/jam/parser"
    "github.com/gobuffalo/packr/v2/jam/store"
    "github.com/gobuffalo/packr/v2/plog"
    "github.com/google/go-cloud/blob"
    "github.com/google/go-cloud/blob/s3blob"
    "github.com/pkg/errors"
    )

    const bucket = "/Users/markbates/Desktop/s3store"

    var _ store.Store = &S3Store{}

    func New(box *parser.Box) *S3Store {
    return &S3Store{
    Disk: store.NewDisk(box.AbsPath, box.Package),
    }
    }

    type S3Store struct {
    *store.Disk
    }

    func (s *S3Store) Pack(box *parser.Box) error {
    plog.Debug(s, "Pack", "box", box)

    // walk the box and save it all to s3
    return filepath.Walk(box.AbsPath, func(path string, info os.FileInfo, err error) error {
    if info.IsDir() {
    return nil
    }
    return s.upload(box.Name, path)
    })

    }

    func withBucket(fn func(context.Context, *blob.Bucket) error) error {
    ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    defer cancel()

    key := envy.Get("AWS_ACCESS_KEY", envy.Get("S3_KEY", ""))
    secret := envy.Get("AWS_ACCESS_SECRET", envy.Get("S3_SECRET", ""))

    config := aws.NewConfig()
    config.Region = aws.String("us-east-1")
    config.Credentials = credentials.NewStaticCredentialsFromCreds(credentials.Value{
    AccessKeyID: key,
    SecretAccessKey: secret,
    })
    sess, err := session.NewSession(config)
    if err != nil {
    return errors.WithStack(err)
    }

    buck, err := s3blob.OpenBucket(ctx, sess, "s3packr-demo")
    if err != nil {
    return errors.WithStack(err)
    }

    return fn(ctx, buck)
    }

    func (s *S3Store) upload(box string, path string) error {
    return withBucket(func(ctx context.Context, buck *blob.Bucket) error {
    w, err := buck.NewWriter(ctx, Key(box+path), &blob.WriterOptions{
    ContentType: "application/octet-stream",
    })
    if err != nil {
    return errors.WithStack(err)
    }
    defer w.Close()

    f, err := os.Open(path)
    if err != nil {
    return errors.WithStack(err)
    }
    defer f.Close()

    _, err = io.Copy(w, f)
    if err != nil {
    return errors.WithStack(err)
    }
    return nil
    })
    }