mirror of
				https://github.com/bjdgyc/anylink.git
				synced 2025-11-01 00:59:34 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			132 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			132 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 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
 | ||
| }
 |