Bläddra i källkod

Moved flags from core to main

luis 7 år sedan
förälder
incheckning
ea7b8047e6
7 ändrade filer med 115 tillägg och 88 borttagningar
  1. 13 0
      SPEC.md
  2. 71 0
      flags.go
  3. 14 76
      internal/core/core.go
  4. 4 2
      internal/fs/gdrivefs/client.go
  5. 3 3
      internal/fs/gdrivefs/gdrivefs.go
  6. 10 7
      main.go
  7. BIN
      test/cloudmount

+ 13 - 0
SPEC.md

@@ -10,4 +10,17 @@ fs/gdrivefs
  * Fetch FuseHandler
 
 
+Make usage something like this:
+
+```bash
+	cloudfs source.json destfolder
+
+```
+
+
+Core should not care about flags, only config
+
+main should care about flags
+
+
 

+ 71 - 0
flags.go

@@ -0,0 +1,71 @@
+package main
+
+import (
+	"errors"
+	"flag"
+	"fmt"
+	"os"
+	"strconv"
+	"strings"
+
+	"dev.hexasoftware.com/hxs/cloudmount/internal/core"
+)
+
+func parseFlags(config *core.Config) (err error) {
+	var mountoptsFlag string
+
+	flag.StringVar(&config.CloudFSDriver, "t", "gdrive", "which cloud service to use [gdrive]")
+	flag.BoolVar(&config.Daemonize, "d", false, "Run app in background")
+	flag.BoolVar(&config.VerboseLog, "v", false, "Verbose log")
+	flag.StringVar(&config.HomeDir, "w", config.HomeDir, "Work dir, path that holds configurations")
+
+	flag.StringVar(&mountoptsFlag, "o", "", "-o [opts]  uid,gid")
+
+	flag.Usage = func() {
+		fmt.Fprintf(os.Stderr, "Usage: %s [options] MOUNTPOINT\n\n", os.Args[0])
+		fmt.Fprintf(os.Stderr, "Options:\n")
+		flag.PrintDefaults()
+		fmt.Fprintf(os.Stderr, "\n")
+	}
+	flag.Parse()
+
+	if len(flag.Args()) < 1 {
+		flag.Usage()
+		//fmt.Println("Usage:\n gdrivemount [-d] [-v] MOUNTPOINT")
+		return errors.New("Missing parameter")
+	}
+	/////////////////////////////////////
+	// Parse mount opts
+	/////////////////
+	pmountopts := strings.Split(mountoptsFlag, ",")
+	mountopts := map[string]string{}
+	for _, v := range pmountopts {
+		if keyindex := strings.Index(v, "="); keyindex != -1 {
+			key := strings.TrimSpace(v[:keyindex])
+			value := strings.TrimSpace(v[keyindex+1:])
+			mountopts[key] = value
+		}
+	}
+
+	/////////////////////////////////////
+	// Use mount opts
+	///////////////
+	uidStr, ok := mountopts["uid"]
+	if ok {
+		uid, err := strconv.Atoi(uidStr)
+		if err != nil {
+			panic(err)
+		}
+		config.UID = uint32(uid)
+	}
+
+	gidStr, ok := mountopts["gid"]
+	if ok {
+		gid, err := strconv.Atoi(gidStr)
+		if err != nil {
+			panic(err)
+		}
+		config.GID = uint32(gid)
+	}
+	return
+}

+ 14 - 76
internal/core/core.go

@@ -2,9 +2,7 @@ package core
 
 import (
 	"context"
-	"errors"
 	"flag"
-	"fmt"
 	"log"
 	"os"
 	"os/signal"
@@ -12,7 +10,6 @@ import (
 	"path/filepath"
 	"runtime"
 	"strconv"
-	"strings"
 	"syscall"
 
 	"dev.hexasoftware.com/hxs/prettylog"
@@ -31,10 +28,7 @@ type Core struct {
 
 // New create a New cloudmount core
 func New() *Core {
-	return &Core{Drivers: map[string]DriverFactory{}}
-}
 
-func (c *Core) Init() (err error) {
 	// TODO: friendly panics
 	usr, err := user.Current()
 	if err != nil {
@@ -50,19 +44,22 @@ func (c *Core) Init() (err error) {
 		panic(gid)
 	}
 
-	// Defaults
-	c.Config = Config{
-		HomeDir:    filepath.Join(usr.HomeDir, ".cloudmount"),
-		UID:        uint32(uid),
-		GID:        uint32(gid),
-		VerboseLog: false,
-		Daemonize:  false,
-	}
-	err = c.parseFlags()
-	if err != nil {
-		return err
+	return &Core{
+		Drivers: map[string]DriverFactory{},
+		Config: Config{
+			HomeDir:    filepath.Join(usr.HomeDir, ".cloudmount"),
+			UID:        uint32(uid),
+			GID:        uint32(gid),
+			VerboseLog: false,
+			Daemonize:  false,
+		},
 	}
 
+}
+
+// Init to be run after configuration
+func (c *Core) Init() (err error) {
+
 	fsFactory, ok := c.Drivers[c.Config.CloudFSDriver]
 	if !ok {
 		log.Fatal("CloudFS not supported")
@@ -73,65 +70,6 @@ func (c *Core) Init() (err error) {
 	return
 }
 
-func (c *Core) parseFlags() (err error) {
-	var mountoptsFlag string
-
-	flag.StringVar(&c.Config.CloudFSDriver, "t", "gdrive", "which cloud service to use [gdrive]")
-	flag.BoolVar(&c.Config.Daemonize, "d", false, "Run app in background")
-	flag.BoolVar(&c.Config.VerboseLog, "v", false, "Verbose log")
-	flag.StringVar(&c.Config.HomeDir, "w", c.Config.HomeDir, "Work dir, path that holds configurations")
-
-	flag.StringVar(&mountoptsFlag, "o", "", "-o [opts]  uid,gid")
-
-	flag.Usage = func() {
-		fmt.Fprintf(os.Stderr, "Usage: %s [options] MOUNTPOINT\n\n", os.Args[0])
-		fmt.Fprintf(os.Stderr, "Options:\n")
-		flag.PrintDefaults()
-		fmt.Fprintf(os.Stderr, "\n")
-	}
-	flag.Parse()
-
-	if len(flag.Args()) < 1 {
-		flag.Usage()
-		//fmt.Println("Usage:\n gdrivemount [-d] [-v] MOUNTPOINT")
-		return errors.New("Missing parameter")
-	}
-	/////////////////////////////////////
-	// Parse mount opts
-	/////////////////
-	pmountopts := strings.Split(mountoptsFlag, ",")
-	mountopts := map[string]string{}
-	for _, v := range pmountopts {
-		keypart := strings.Split(v, "=")
-		if len(keypart) != 2 {
-			continue
-		}
-		mountopts[keypart[0]] = keypart[1]
-	}
-
-	/////////////////////////////////////
-	// Use mount opts
-	///////////////
-	uidStr, ok := mountopts["uid"]
-	if ok {
-		uid, err := strconv.Atoi(uidStr)
-		if err != nil {
-			panic(err)
-		}
-		c.Config.UID = uint32(uid)
-	}
-
-	gidStr, ok := mountopts["gid"]
-	if ok {
-		gid, err := strconv.Atoi(gidStr)
-		if err != nil {
-			panic(err)
-		}
-		c.Config.GID = uint32(gid)
-	}
-	return
-}
-
 func (c *Core) Mount() {
 
 	// Start Selected driveFS

+ 4 - 2
internal/fs/gdrivefs/client.go

@@ -1,3 +1,5 @@
+// Oauth2 google api for Drive api
+
 package gdrivefs
 
 import (
@@ -32,7 +34,7 @@ func (d *GDriveFS) getClient(ctx context.Context, config *oauth2.Config) *http.C
 }
 
 func (d *GDriveFS) tokenCacheFile() (string, error) {
-	tokenCacheDir := d.core.Config.HomeDir
+	tokenCacheDir := d.config.HomeDir
 
 	err := os.MkdirAll(tokenCacheDir, 0700)
 
@@ -100,7 +102,7 @@ func (d *GDriveFS) saveToken(file string, token *oauth2.Token) {
 // Init driveService
 func (d *GDriveFS) initClient() {
 
-	configPath := d.core.Config.HomeDir
+	configPath := d.config.HomeDir
 
 	ctx := context.Background() // Context from GDriveFS
 

+ 3 - 3
internal/fs/gdrivefs/gdrivefs.go

@@ -22,7 +22,7 @@ import (
 )
 
 var (
-	log = prettylog.New("gdrivemount")
+	log = prettylog.New("gdrivefs")
 )
 
 type Handle struct {
@@ -37,7 +37,7 @@ type Handle struct {
 type GDriveFS struct {
 	fuseutil.NotImplementedFileSystem // Defaults
 
-	core   *core.Core // Core Config instead?
+	config *core.Config //core   *core.Core // Core Config instead?
 	client *drive.Service
 	//root   *FileEntry // hiearchy reference
 	root *FileContainer
@@ -55,7 +55,7 @@ type GDriveFS struct {
 func New(core *core.Core) core.Driver {
 
 	fs := &GDriveFS{
-		core:        core,
+		config:      &core.Config,
 		fileHandles: map[fuseops.HandleID]*Handle{},
 		handleMU:    &sync.Mutex{},
 	}

+ 10 - 7
main.go

@@ -11,15 +11,14 @@ import (
 
 	"os/exec"
 
-	"dev.hexasoftware.com/hxs/prettylog"
-
 	"dev.hexasoftware.com/hxs/cloudmount/internal/core"
 	"dev.hexasoftware.com/hxs/cloudmount/internal/fs/gdrivefs"
+	"dev.hexasoftware.com/hxs/prettylog"
 )
 
 var (
 	Name = "cloudmount"
-	log  = prettylog.New("main")
+	log  = prettylog.New(Name)
 )
 
 func main() {
@@ -27,12 +26,16 @@ func main() {
 	prettylog.Global()
 
 	// getClient
-	fmt.Printf("%s-%s\n", Name, Version)
+	log.Printf("%s-%s\n", Name, Version)
 
 	core := core.New()
 	core.Drivers["gdrive"] = gdrivefs.New
 
-	err := core.Init()
+	if err := parseFlags(&core.Config); err != nil {
+		log.Fatalln(err)
+	}
+
+	err := core.Init() // Before daemon, because might require interactivity
 	if err != nil {
 		log.Println("Err:", err)
 		return
@@ -51,8 +54,8 @@ func main() {
 		}
 
 		cmd := exec.Command(os.Args[0], subArgs...)
-		cmd.Stdout = os.Stdout
-		cmd.Stderr = os.Stderr
+		//cmd.Stdout = os.Stdout
+		//cmd.Stderr = os.Stderr
 		cmd.Start()
 		fmt.Println("[PID]", cmd.Process.Pid)
 		os.Exit(0)

BIN
test/cloudmount