From d1559098772cddfe0024ca9f6ae729d566be893e Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Thu, 21 Sep 2017 22:05:02 -0700 Subject: [PATCH] Add proper daemonize support for minfs. (#55) --- fs/config.go | 37 ++++++++++++++++++----------- fs/fs.go | 35 ++++++++++++++++------------ fs/notification.go | 58 ++++++++++------------------------------------ minfs.go | 28 +++++++++++++++++++++- mount.minfs | 2 +- 5 files changed, 83 insertions(+), 77 deletions(-) diff --git a/fs/config.go b/fs/config.go index 9008cfb..3d97b30 100644 --- a/fs/config.go +++ b/fs/config.go @@ -33,13 +33,14 @@ type Config struct { bucket string basePath string - cache string - accountID string - accessKey string - secretKey string - target *url.URL - mountpoint string - debug bool + cache string + accountID string + accessKey string + secretKey string + secretToken string + target *url.URL + mountpoint string + debug bool uid uint32 gid uint32 @@ -48,9 +49,10 @@ type Config struct { // AccessConfig - access credentials and version of `config.json`. type AccessConfig struct { - Version string `json:"version"` - AccessKey string `json:"accessKey"` - SecretKey string `json:"secretKey"` + Version string `json:"version"` + AccessKey string `json:"accessKey"` + SecretKey string `json:"secretKey"` + SecretToken string `json:"secretToken"` } // InitMinFSConfig - Initialize MinFS configuration file. @@ -64,9 +66,10 @@ func InitMinFSConfig() (*AccessConfig, error) { if os.IsNotExist(err) { console.Println("Initializing config.json for the first time, please update your access credentials.") ac := &AccessConfig{ - Version: "1", - AccessKey: os.Getenv("MINFS_ACCESS_KEY"), - SecretKey: os.Getenv("MINFS_SECRET_KEY"), + Version: "1", + AccessKey: os.Getenv("MINFS_ACCESS_KEY"), + SecretKey: os.Getenv("MINFS_SECRET_KEY"), + SecretToken: os.Getenv("MINFS_SECRET_TOKEN"), } acBytes, jerr := json.Marshal(ac) if jerr != nil { @@ -90,10 +93,16 @@ func InitMinFSConfig() (*AccessConfig, error) { // Override if access keys are set through env. accessKey := os.Getenv("MINFS_ACCESS_KEY") secretKey := os.Getenv("MINFS_SECRET_KEY") - if accessKey != "" && secretKey != "" { + secretToken := os.Getenv("MINFS_SECRET_TOKEN") + if accessKey != "" { ac.AccessKey = accessKey + } + if secretKey != "" { ac.SecretKey = secretKey } + if secretToken != "" { + ac.SecretToken = secretToken + } return ac, nil } diff --git a/fs/fs.go b/fs/fs.go index 5cfac57..3bf86a5 100644 --- a/fs/fs.go +++ b/fs/fs.go @@ -32,6 +32,7 @@ import ( "github.com/minio/minfs/meta" "github.com/minio/minio-go" + "github.com/minio/minio-go/pkg/credentials" "bazil.org/fuse" "bazil.org/fuse/fs" @@ -170,34 +171,38 @@ func (mfs *MinFS) Serve() (err error) { } mfs.log.Println("Initializing minio client...") - host := mfs.config.target.Host - access := mfs.config.accessKey - secret := mfs.config.secretKey - secure := mfs.config.target.Scheme == "https" - mfs.api, err = minio.NewV4(host, access, secret, secure) + + var ( + host = mfs.config.target.Host + access = mfs.config.accessKey + secret = mfs.config.secretKey + token = mfs.config.secretToken + secure = mfs.config.target.Scheme == "https" + ) + + creds := credentials.NewStaticV4(access, secret, token) + mfs.api, err = minio.NewWithCredentials(host, creds, secure, "") if err != nil { return err } + // Validate if the bucket is valid and accessible. exists, err := mfs.api.BucketExists(mfs.config.bucket) if err != nil { return err } if !exists { - return minio.ErrorResponse{ - BucketName: mfs.config.bucket, - Code: "NoSuchBucket", - Message: "The specified bucket does not exist", + mfs.log.Println("Bucket doesn't not exist... attempting to create") + if err = mfs.api.MakeBucket(mfs.config.bucket, ""); err != nil { + return err } } // Set notifications - /* - mfs.log.Println("Starting monitoring server...") - if err = mfs.startNotificationListener(); err != nil { - return err - } - */ + // mfs.log.Println("Starting monitoring server...") + // if err = mfs.startNotificationListener(); err != nil { + // return err + // } if err = mfs.startSync(); err != nil { return err diff --git a/fs/notification.go b/fs/notification.go index 63e981c..9891932 100644 --- a/fs/notification.go +++ b/fs/notification.go @@ -17,13 +17,11 @@ package minfs import ( - "fmt" "net/url" "os" "path" - "time" + "strings" - "github.com/minio/minfs/meta" minio "github.com/minio/minio-go" ) @@ -45,28 +43,16 @@ func (mfs *MinFS) startNotificationListener() error { if err != nil { panic(err) } - - defer tx.Rollback() - for _, record := range notificationInfo.Records { key, e := url.QueryUnescape(record.S3.Object.Key) if e != nil { - fmt.Print("Error:", err) + mfs.log.Println("Error:", err) + tx.Rollback() continue } dir, file := path.Split(key) - b := tx.Bucket("minio/") - if dir != "" { - v, err := b.CreateBucketIfNotExists(dir) - if err != nil { - fmt.Print("Error:", err) - continue - } - b = v - } - var d *Dir if dir == "" { d = &Dir{ @@ -88,35 +74,14 @@ func (mfs *MinFS) startNotificationListener() error { } } - var f interface{} - if err := b.Get(file, &f); err == nil { - } else if !meta.IsNoSuchObject(err) { - fmt.Println("Error:", err) - continue - } else if i, err := mfs.NextSequence(tx); err != nil { - fmt.Println("Error:", err) - continue - } else { - objMeta := record.S3.Object - lastModified := time.Now().UTC() - f = &File{ - dir: d, - mfs: mfs, - Size: uint64(objMeta.Size), - Inode: i, - UID: mfs.config.uid, - GID: mfs.config.gid, - Mode: mfs.config.mode, - Path: file, - Chgtime: lastModified, - Crtime: lastModified, - Mtime: lastModified, - Atime: lastModified, - ETag: objMeta.ETag, - } - - if err := f.(*File).store(tx); err != nil { - fmt.Println("Error:", err) + if strings.HasPrefix(record.EventName, "s3:ObjectCreated:") { + if err = d.storeFile(d.bucket(tx), tx, file, minio.ObjectInfo{ + Key: record.S3.Object.Key, + Size: record.S3.Object.Size, + ETag: record.S3.Object.ETag, + }); err != nil { + tx.Rollback() + mfs.log.Println("Error:", err) continue } } @@ -125,6 +90,7 @@ func (mfs *MinFS) startNotificationListener() error { // Commit the transaction and check for error. if err := tx.Commit(); err != nil { + tx.Rollback() panic(err) } case <-mfs.listenerDoneCh: diff --git a/minfs.go b/minfs.go index fb410a8..664d696 100644 --- a/minfs.go +++ b/minfs.go @@ -16,8 +16,34 @@ package main // import "github.com/minio/minfs" -import minfs "github.com/minio/minfs/cmd" +import ( + "log" + "os" + + minfs "github.com/minio/minfs/cmd" + daemon "github.com/sevlyar/go-daemon" +) func main() { + dctx := &daemon.Context{ + PidFileName: "/var/log/minfs.pid", + PidFilePerm: 0644, + LogFileName: "/var/log/minfs.log", + LogFilePerm: 0640, + WorkDir: "./", + Umask: 027, + Args: os.Args, + } + + d, err := dctx.Reborn() + if err != nil { + log.Fatalln("Unable to run: ", err) + } + if d != nil { + return + } + defer dctx.Release() + + // daemon business logic starts here minfs.Main() } diff --git a/mount.minfs b/mount.minfs index af9a707..5d3614d 100755 --- a/mount.minfs +++ b/mount.minfs @@ -19,7 +19,7 @@ _init () start_minfs () { cmd_line=$(echo "$cmd_line $mount_opts $minio_endpoint $mount_point"); - $cmd_line & + $cmd_line } print_usage ()