82ab4b0983
This also adds some generic handling of stale umounts. Fuse returns immediately and does not indicate that the mounter has finished writing to the backend. The process finding is sort of hacky as I could not find a better way to get to the PID from a fuse mount.
70 lines
1.4 KiB
Go
70 lines
1.4 KiB
Go
package s3
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
|
|
"context"
|
|
|
|
goofysApi "github.com/kahing/goofys/api"
|
|
)
|
|
|
|
const (
|
|
goofysCmd = "goofys"
|
|
defaultRegion = "us-east-1"
|
|
)
|
|
|
|
// Implements Mounter
|
|
type goofysMounter struct {
|
|
bucket string
|
|
endpoint string
|
|
region string
|
|
accessKeyID string
|
|
secretAccessKey string
|
|
}
|
|
|
|
func newGoofysMounter(bucket string, cfg *Config) (Mounter, error) {
|
|
region := cfg.Region
|
|
// if endpoint is set we need a default region
|
|
if region == "" && cfg.Endpoint != "" {
|
|
region = defaultRegion
|
|
}
|
|
return &goofysMounter{
|
|
bucket: bucket,
|
|
endpoint: cfg.Endpoint,
|
|
region: region,
|
|
accessKeyID: cfg.AccessKeyID,
|
|
secretAccessKey: cfg.SecretAccessKey,
|
|
}, nil
|
|
}
|
|
|
|
func (goofys *goofysMounter) Format() error {
|
|
return nil
|
|
}
|
|
|
|
func (goofys *goofysMounter) Mount(targetPath string) error {
|
|
goofysCfg := &goofysApi.Config{
|
|
MountPoint: targetPath,
|
|
Endpoint: goofys.endpoint,
|
|
Region: goofys.region,
|
|
DirMode: 0755,
|
|
FileMode: 0644,
|
|
MountOptions: map[string]string{
|
|
"allow_other": "",
|
|
},
|
|
}
|
|
|
|
os.Setenv("AWS_ACCESS_KEY_ID", goofys.accessKeyID)
|
|
os.Setenv("AWS_SECRET_ACCESS_KEY", goofys.secretAccessKey)
|
|
|
|
_, _, err := goofysApi.Mount(context.Background(), goofys.bucket, goofysCfg)
|
|
|
|
if err != nil {
|
|
return fmt.Errorf("Error mounting via goofys: %s", err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (goofys *goofysMounter) Unmount(targetPath string) error {
|
|
return fuseUnmount(targetPath, goofysCmd)
|
|
}
|