flags.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package main
  2. import (
  3. "errors"
  4. "flag"
  5. "fmt"
  6. "os"
  7. "path/filepath"
  8. "strconv"
  9. "strings"
  10. "dev.hexasoftware.com/hxs/cloudmount/internal/core"
  11. )
  12. func parseFlags(config *core.Config) (err error) {
  13. var mountoptsFlag string
  14. flag.StringVar(&config.Type, "t", config.Type, "which cloud service to use [gdrive]")
  15. flag.BoolVar(&config.Daemonize, "d", false, "Run app in background")
  16. flag.BoolVar(&config.VerboseLog, "v", false, "Verbose log")
  17. flag.StringVar(&config.HomeDir, "w", config.HomeDir, "Work dir, path that holds configurations")
  18. flag.DurationVar(&config.RefreshTime, "r", config.RefreshTime, "Timed cloud synchronization interval [if applied]")
  19. flag.StringVar(&mountoptsFlag, "o", "", "uid,gid ex: -o uid=1000,gid=0 ")
  20. flag.Usage = func() {
  21. fmt.Fprintf(os.Stderr, "\n")
  22. fmt.Fprintf(os.Stderr, "Usage: %s [options] [<source>] <directory>\n\n", os.Args[0])
  23. fmt.Fprintf(os.Stderr, "Source: can be json/yaml configuration file usually with credentials or cloud specific configuration\n\n")
  24. fmt.Fprintf(os.Stderr, "Options:\n")
  25. flag.PrintDefaults()
  26. fmt.Fprintf(os.Stderr, "\n")
  27. }
  28. flag.Parse()
  29. if flag.NArg() < 1 {
  30. flag.Usage()
  31. //fmt.Println("Usage:\n gdrivemount [-d] [-v] <SRC/CONFIG> <MOUNTPOINT>")
  32. return errors.New("Missing parameter")
  33. }
  34. if flag.NArg() == 1 {
  35. config.Source = filepath.Join(config.HomeDir, config.Type+".json")
  36. config.Target = flag.Arg(0)
  37. } else {
  38. config.Source = flag.Arg(0)
  39. config.Target = flag.Arg(1)
  40. }
  41. /////////////////////////////////////
  42. // Parse mount opts
  43. /////////////////
  44. pmountopts := strings.Split(mountoptsFlag, ",")
  45. mountopts := map[string]string{}
  46. for _, v := range pmountopts {
  47. if keyindex := strings.Index(v, "="); keyindex != -1 {
  48. key := strings.TrimSpace(v[:keyindex])
  49. value := strings.TrimSpace(v[keyindex+1:])
  50. mountopts[key] = value
  51. }
  52. }
  53. /////////////////////////////////////
  54. // Use mount opts
  55. ///////////////
  56. uidStr, ok := mountopts["uid"]
  57. if ok {
  58. uid, err := strconv.Atoi(uidStr)
  59. if err != nil {
  60. panic(err)
  61. }
  62. config.UID = uint32(uid)
  63. }
  64. gidStr, ok := mountopts["gid"]
  65. if ok {
  66. gid, err := strconv.Atoi(gidStr)
  67. if err != nil {
  68. panic(err)
  69. }
  70. config.GID = uint32(gid)
  71. }
  72. return
  73. }