From 57224ffa79aac59155a0f6a4ad47f224cac736fd Mon Sep 17 00:00:00 2001 From: Niall Sheridan Date: Fri, 13 Jan 2017 00:06:46 +0000 Subject: Use wkfs to manage the lets encrypt cache --- .../nsheridan/autocert-wkfs-cache/cache.go | 85 ++++++++++++++++++++++ vendor/github.com/nsheridan/wkfs/s3/s3.go | 23 +++++- 2 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 vendor/github.com/nsheridan/autocert-wkfs-cache/cache.go (limited to 'vendor/github.com') diff --git a/vendor/github.com/nsheridan/autocert-wkfs-cache/cache.go b/vendor/github.com/nsheridan/autocert-wkfs-cache/cache.go new file mode 100644 index 0000000..e829ef2 --- /dev/null +++ b/vendor/github.com/nsheridan/autocert-wkfs-cache/cache.go @@ -0,0 +1,85 @@ +package wkfscache + +import ( + "os" + "path/filepath" + + "go4.org/wkfs" + + "golang.org/x/crypto/acme/autocert" + "golang.org/x/net/context" +) + +type Cache string + +// Get reads a certificate data from the specified file name. +func (d Cache) Get(ctx context.Context, name string) ([]byte, error) { + name = filepath.Join(string(d), name) + var ( + data []byte + err error + done = make(chan struct{}) + ) + go func() { + data, err = wkfs.ReadFile(name) + close(done) + }() + select { + case <-ctx.Done(): + return nil, ctx.Err() + case <-done: + } + if os.IsNotExist(err) { + return nil, autocert.ErrCacheMiss + } + return data, err +} + +// Put writes the certificate data to the specified file name. +// The file will be created with 0600 permissions. +func (d Cache) Put(ctx context.Context, name string, data []byte) error { + if err := wkfs.MkdirAll(string(d), 0700); err != nil { + return err + } + + done := make(chan struct{}) + var err error + go func() { + defer close(done) + if err := wkfs.WriteFile(filepath.Join(string(d), name), data, 0600); err != nil { + return + } + // prevent overwriting the file if the context was cancelled + if ctx.Err() != nil { + return // no need to set err + } + }() + select { + case <-ctx.Done(): + return ctx.Err() + case <-done: + } + return err +} + +// Delete removes the specified file name. +func (d Cache) Delete(ctx context.Context, name string) error { + name = filepath.Join(string(d), name) + var ( + err error + done = make(chan struct{}) + ) + go func() { + err = wkfs.Remove(name) + close(done) + }() + select { + case <-ctx.Done(): + return ctx.Err() + case <-done: + } + if err != nil && !os.IsNotExist(err) { + return err + } + return nil +} diff --git a/vendor/github.com/nsheridan/wkfs/s3/s3.go b/vendor/github.com/nsheridan/wkfs/s3/s3.go index 19e72a9..de44f93 100644 --- a/vendor/github.com/nsheridan/wkfs/s3/s3.go +++ b/vendor/github.com/nsheridan/wkfs/s3/s3.go @@ -28,6 +28,8 @@ type Options struct { SecretKey string } +var _ wkfs.FileSystem = (*s3FS)(nil) + // Register the /s3/ filesystem as a well-known filesystem. func Register(opts *Options) { if opts == nil { @@ -91,6 +93,12 @@ func (fs *s3FS) Open(name string) (wkfs.File, error) { Key: &fileName, }) if err != nil { + if aerr, ok := err.(awserr.Error); ok { + switch aerr.Code() { + case "NoSuchKey", "NoSuchBucket": + return nil, os.ErrNotExist + } + } return nil, err } defer obj.Body.Close() @@ -131,7 +139,7 @@ func (fs *s3FS) Lstat(name string) (os.FileInfo, error) { } func (fs *s3FS) MkdirAll(path string, perm os.FileMode) error { - _, err := fs.OpenFile(fmt.Sprintf("%s/", filepath.Clean(path)), os.O_CREATE, perm) + _, err := fs.OpenFile(fmt.Sprintf("%s/", filepath.Clean(path)), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, perm) return err } @@ -154,6 +162,19 @@ func (fs *s3FS) OpenFile(name string, flag int, perm os.FileMode) (wkfs.FileWrit return NewS3file(bucket, filename, fs.sc) } +func (fs *s3FS) Remove(name string) error { + var err error + bucket, filename, err := fs.parseName(name) + if err != nil { + return err + } + _, err = fs.sc.DeleteObject(&s3.DeleteObjectInput{ + Bucket: aws.String(bucket), + Key: aws.String(filename), + }) + return err +} + type statInfo struct { name string size int64 -- cgit v1.2.3