flags.go 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package main
  2. import (
  3. "errors"
  4. "flag"
  5. "fmt"
  6. "os"
  7. "path/filepath"
  8. "dev.hexasoftware.com/hxs/cloudmount/internal/core"
  9. "dev.hexasoftware.com/hxs/cloudmount/internal/coreutil"
  10. )
  11. func parseFlags(config *core.Config) (err error) {
  12. var mountoptsFlag string
  13. flag.StringVar(&config.Type, "t", config.Type, "which cloud service to use [gdrive]")
  14. flag.BoolVar(&config.Daemonize, "d", false, "Run app in background")
  15. flag.BoolVar(&config.VerboseLog, "v", false, "Verbose log")
  16. flag.BoolVar(&config.Verbose2Log, "vv", false, "Extra 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", "", fmt.Sprintf("%v", config.Options))
  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. fileExt := filepath.Ext(os.Args[0])
  30. if fileExt != "" {
  31. if config.Type != "" {
  32. log.Fatal("Cannot specify -t when type is specified in executable name")
  33. }
  34. config.Type = fileExt[1:]
  35. }
  36. if flag.NArg() < 1 {
  37. flag.Usage()
  38. //fmt.Println("Usage:\n gdrivemount [-d] [-v] <SRC/CONFIG> <MOUNTPOINT>")
  39. return errors.New("Missing parameter")
  40. }
  41. if flag.NArg() == 1 {
  42. config.Source = filepath.Join(config.HomeDir, config.Type+".yaml")
  43. config.Target = flag.Arg(0)
  44. } else {
  45. config.Source = flag.Arg(0)
  46. config.Target = flag.Arg(1)
  47. }
  48. if config.Verbose2Log {
  49. config.VerboseLog = true
  50. }
  51. // Read fs type from config file
  52. sourceType := struct {
  53. Type string `json:"type"`
  54. }{}
  55. coreutil.ParseConfig(config.Source, &sourceType)
  56. if sourceType.Type != "" {
  57. if config.Type != "" && sourceType.Type != config.Type {
  58. log.Fatalf("ERR: service mismatch <source> specifies '%s' while flag -t is '%s'", sourceType.Type, config.Type)
  59. }
  60. config.Type = sourceType.Type
  61. }
  62. if config.Type == "" {
  63. log.Fatalf("ERR: Missing -t param, unknown file system")
  64. }
  65. err = coreutil.ParseOptions(mountoptsFlag, &config.Options)
  66. if err != nil {
  67. log.Fatal("ERR: Invalid syntax parsing mount options")
  68. }
  69. return
  70. }