cmd.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. package base
  2. import (
  3. "errors"
  4. "fmt"
  5. "os"
  6. "reflect"
  7. "runtime"
  8. "strings"
  9. "github.com/bjdgyc/anylink/pkg/utils"
  10. "github.com/spf13/cobra"
  11. "github.com/spf13/viper"
  12. )
  13. var (
  14. // 提交id
  15. CommitId string
  16. // pass明文
  17. passwd string
  18. // 生成密钥
  19. secret bool
  20. // 显示版本信息
  21. rev bool
  22. // 输出debug信息
  23. debug bool
  24. // Used for flags.
  25. runSrv bool
  26. linkViper *viper.Viper
  27. rootCmd *cobra.Command
  28. )
  29. // Execute executes the root command.
  30. func execute() {
  31. initCmd()
  32. err := rootCmd.Execute()
  33. if err != nil {
  34. fmt.Println(err)
  35. os.Exit(0)
  36. }
  37. // viper.Debug()
  38. ref := reflect.ValueOf(linkViper)
  39. s := ref.Elem()
  40. ee := s.FieldByName("env")
  41. if ee.Kind() != reflect.Map {
  42. panic("Viper env is err")
  43. }
  44. rr := ee.MapRange()
  45. for rr.Next() {
  46. // fmt.Println(rr.Key(), rr.Value().Index(0))
  47. envs[rr.Key().String()] = rr.Value().Index(0).String()
  48. }
  49. if !runSrv {
  50. os.Exit(0)
  51. }
  52. }
  53. func initCmd() {
  54. linkViper = viper.New()
  55. rootCmd = &cobra.Command{
  56. Use: "anylink",
  57. Short: "AnyLink VPN Server",
  58. Long: `AnyLink is a VPN Server application`,
  59. Run: func(cmd *cobra.Command, args []string) {
  60. // fmt.Println("cmd:", cmd.Use, args)
  61. runSrv = true
  62. },
  63. }
  64. linkViper.SetEnvPrefix("link")
  65. // 基础配置
  66. for _, v := range configs {
  67. if v.Typ == cfgStr {
  68. rootCmd.Flags().StringP(v.Name, v.Short, v.ValStr, v.Usage)
  69. }
  70. if v.Typ == cfgInt {
  71. rootCmd.Flags().IntP(v.Name, v.Short, v.ValInt, v.Usage)
  72. }
  73. if v.Typ == cfgBool {
  74. rootCmd.Flags().BoolP(v.Name, v.Short, v.ValBool, v.Usage)
  75. }
  76. _ = linkViper.BindPFlag(v.Name, rootCmd.Flags().Lookup(v.Name))
  77. _ = linkViper.BindEnv(v.Name)
  78. // viper.SetDefault(v.Name, v.Value)
  79. }
  80. rootCmd.AddCommand(initToolCmd())
  81. cobra.OnInitialize(func() {
  82. linkViper.AutomaticEnv()
  83. conf := linkViper.GetString("conf")
  84. _, err := os.Stat(conf)
  85. if errors.Is(err, os.ErrNotExist) {
  86. // 没有配置文件,不做处理
  87. panic(err)
  88. }
  89. linkViper.SetConfigFile(conf)
  90. err = linkViper.ReadInConfig()
  91. if err != nil {
  92. fmt.Println("Using config file:", err)
  93. }
  94. })
  95. }
  96. func initToolCmd() *cobra.Command {
  97. toolCmd := &cobra.Command{
  98. Use: "tool",
  99. Short: "AnyLink tool",
  100. Long: `AnyLink tool is a application`,
  101. }
  102. toolCmd.Flags().BoolVarP(&rev, "version", "v", false, "display version info")
  103. toolCmd.Flags().BoolVarP(&secret, "secret", "s", false, "generate a random jwt secret")
  104. toolCmd.Flags().StringVarP(&passwd, "passwd", "p", "", "convert the password plaintext")
  105. toolCmd.Flags().BoolVarP(&debug, "debug", "d", false, "list the config viper.Debug() info")
  106. toolCmd.Run = func(cmd *cobra.Command, args []string) {
  107. switch {
  108. case rev:
  109. fmt.Printf("%s v%s build on %s [%s, %s] commit_id(%s) \n",
  110. APP_NAME, APP_VER, runtime.Version(), runtime.GOOS, runtime.GOARCH, CommitId)
  111. case secret:
  112. s, _ := utils.RandSecret(40, 60)
  113. s = strings.Trim(s, "=")
  114. fmt.Printf("Secret:%s\n", s)
  115. case passwd != "":
  116. pass, _ := utils.PasswordHash(passwd)
  117. fmt.Printf("Passwd:%s\n", pass)
  118. case debug:
  119. linkViper.Debug()
  120. default:
  121. fmt.Println("Using [anylink tool -h] for help")
  122. }
  123. }
  124. return toolCmd
  125. }