修改配置方式,支持配置命令、环境变量、配置文件

This commit is contained in:
bjdgyc
2021-04-07 18:31:46 +08:00
parent 7fae5423b7
commit 157001be18
12 changed files with 693 additions and 200 deletions

131
server/base/cmd.go Normal file
View File

@@ -0,0 +1,131 @@
package base
import (
"fmt"
"math/rand"
"os"
"runtime"
"strings"
"time"
"github.com/bjdgyc/anylink/pkg/utils"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)
var (
// 提交id
CommitId string
// 配置文件
cfgFile string
// pass明文
passwd string
// 生成密钥
secret bool
// 显示版本信息
rev bool
// 获取env名称
env bool
// Used for flags.
runSrv bool
rootCmd *cobra.Command
)
// Execute executes the root command.
func execute() {
err := rootCmd.Execute()
if err != nil {
fmt.Println(err)
os.Exit(0)
}
// viper.Debug()
if !runSrv {
os.Exit(0)
}
}
func init() {
rootCmd = &cobra.Command{
Use: "anylink",
Short: "AnyLink VPN Server",
Long: `AnyLink is a VPN Server application`,
Run: func(cmd *cobra.Command, args []string) {
// fmt.Println("cmd", cmd.Use, args)
runSrv = true
},
}
cobra.OnInitialize(func() {
viper.SetConfigFile(cfgFile)
viper.AutomaticEnv()
err := viper.ReadInConfig()
if err != nil {
fmt.Println("Using config file:", err)
}
})
viper.SetEnvPrefix("link")
// 基础配置
rootCmd.Flags().StringVarP(&cfgFile, "config", "c", "./conf/server.toml", "config file")
for _, v := range configs {
if v.Typ == cfgStr {
rootCmd.Flags().String(v.Name, v.ValStr, v.Usage)
}
if v.Typ == cfgInt {
rootCmd.Flags().Int(v.Name, v.ValInt, v.Usage)
}
if v.Typ == cfgBool {
rootCmd.Flags().Bool(v.Name, v.ValBool, v.Usage)
}
_ = viper.BindPFlag(v.Name, rootCmd.Flags().Lookup(v.Name))
_ = viper.BindEnv(v.Name)
// viper.SetDefault(v.Name, v.Value)
}
rootCmd.AddCommand(initToolCmd())
}
func initToolCmd() *cobra.Command {
toolCmd := &cobra.Command{
Use: "tool",
Short: "AnyLink tool",
Long: `AnyLink tool is a application`,
}
toolCmd.Flags().BoolVarP(&rev, "version", "v", false, "display version info")
toolCmd.Flags().BoolVarP(&secret, "secret", "s", false, "generate a random jwt secret")
toolCmd.Flags().StringVarP(&passwd, "passwd", "p", "", "convert the password plaintext")
toolCmd.Flags().BoolVarP(&env, "env", "e", false, "list the config name and env key")
toolCmd.Run = func(cmd *cobra.Command, args []string) {
switch {
case rev:
fmt.Printf("%s v%s build on %s [%s, %s] commit_id(%s) \n",
APP_NAME, APP_VER, runtime.Version(), runtime.GOOS, runtime.GOARCH, CommitId)
case secret:
rand.Seed(time.Now().UnixNano())
s, _ := utils.RandSecret(40, 60)
s = strings.Trim(s, "=")
fmt.Printf("Secret:%s\n", s)
case passwd != "":
pass, _ := utils.PasswordHash(passwd)
fmt.Printf("Passwd:%s\n", pass)
case env:
for k, v := range envs {
fmt.Printf("%s => %s\n", k, v)
}
default:
fmt.Println("Using [anylink tool -h] for help")
}
}
return toolCmd
}