rootcmd.go 3.39 KB
Newer Older
duanjinfei's avatar
duanjinfei committed
1 2 3
package main

import (
duanjinfei's avatar
duanjinfei committed
4
	"example.com/m/conf"
duanjinfei's avatar
duanjinfei committed
5
	"example.com/m/log"
duanjinfei's avatar
duanjinfei committed
6
	"example.com/m/models"
duanjinfei's avatar
duanjinfei committed
7
	"example.com/m/nm"
duanjinfei's avatar
duanjinfei committed
8
	"example.com/m/utils"
duanjinfei's avatar
duanjinfei committed
9
	"fmt"
duanjinfei's avatar
duanjinfei committed
10
	"github.com/astaxie/beego"
duanjinfei's avatar
duanjinfei committed
11
	"github.com/fsnotify/fsnotify"
duanjinfei's avatar
duanjinfei committed
12
	"github.com/spf13/cobra"
duanjinfei's avatar
duanjinfei committed
13
	"github.com/spf13/viper"
duanjinfei's avatar
duanjinfei committed
14
	"os"
duanjinfei's avatar
duanjinfei committed
15
	"strings"
duanjinfei's avatar
duanjinfei committed
16 17 18
)

var (
duanjinfei's avatar
duanjinfei committed
19 20
	rewardAddr, externalIp, opSys string
	debug                         bool
duanjinfei's avatar
duanjinfei committed
21 22
)

duanjinfei's avatar
duanjinfei committed
23
func init() {
duanjinfei's avatar
duanjinfei committed
24 25
	RootCmd.PersistentFlags().StringVarP(&rewardAddr, "reward", "r", "", "please enter a reward address")
	RootCmd.PersistentFlags().StringVarP(&externalIp, "externalIp", "e", "", "please enter server external ip address")
duanjinfei's avatar
duanjinfei committed
26
	RootCmd.PersistentFlags().StringVarP(&opSys, "opSys", "s", "", "please enter you op sys name : win、linux")
duanjinfei's avatar
duanjinfei committed
27
	RootCmd.PersistentFlags().BoolVarP(&debug, "debug", "d", false, "set log level debug")
duanjinfei's avatar
duanjinfei committed
28 29 30
	cobra.OnInitialize(initConfig)
}

duanjinfei's avatar
duanjinfei committed
31 32
// RootCmd represents the base command when called without any subcommands
var RootCmd = &cobra.Command{
duanjinfei's avatar
duanjinfei committed
33
	Use:   "miner",
duanjinfei's avatar
duanjinfei committed
34 35 36
	Short: "The miner command-line interface",
	Long:  ``,
	Run: func(cmd *cobra.Command, args []string) {
duanjinfei's avatar
duanjinfei committed
37 38 39 40 41 42
		if opSys != "" {
			if !conf.GetConfig().SetOpSys(opSys) {
				log.Error("Enter op sys no support")
				return
			}
		}
duanjinfei's avatar
duanjinfei committed
43
		conf.GetConfig().SetExternalIp(externalIp)
duanjinfei's avatar
duanjinfei committed
44
		log.Info("Enter reward address:", rewardAddr)
duanjinfei's avatar
duanjinfei committed
45 46 47 48 49
		if debug {
			log.InitLog(log.LogConfig{Path: "logs", Level: "debug", Save: 3})
		} else {
			log.InitLog(log.LogConfig{Path: "logs", Level: "info", Save: 3})
		}
duanjinfei's avatar
duanjinfei committed
50 51 52 53 54 55 56 57 58 59 60 61
		if rewardAddr != "" {
			isSetBenefit := conf.GetConfig().SetBenefitAddress(rewardAddr)
			if !isSetBenefit {
				log.Error("Please set right reward address")
				return
			}
			fileBenefitAcc, _ := utils.ReadBenefitFile()
			if fileBenefitAcc != nil && len(fileBenefitAcc) > 0 {
				nm.HistoryBenefitAcc = fileBenefitAcc
			}
			isExist := false
			for _, acc := range nm.HistoryBenefitAcc {
duanjinfei's avatar
duanjinfei committed
62
				if strings.ToLower(acc.Address) == strings.ToLower(rewardAddr) {
duanjinfei's avatar
duanjinfei committed
63 64 65 66 67 68 69 70 71 72 73
					isExist = true
				}
			}
			if !isExist {
				nm.HistoryBenefitAcc = append(nm.HistoryBenefitAcc, &models.BenefitAddressStruct{Address: rewardAddr, IsDel: false})
				err := utils.WriteBenefitFile(nm.HistoryBenefitAcc)
				if err != nil {
					log.Error("WriteBenefitFile failed with error:", err)
					return
				}
			}
duanjinfei's avatar
duanjinfei committed
74
			go nm.StartMonitor()
duanjinfei's avatar
duanjinfei committed
75
		}
duanjinfei's avatar
duanjinfei committed
76
		beego.Run()
duanjinfei's avatar
duanjinfei committed
77 78 79
	},
}

duanjinfei's avatar
duanjinfei committed
80 81 82 83 84 85 86 87 88 89 90 91
func initConfig() {
	// 设置配置文件的名称(不包含扩展名)
	viper.SetConfigName("config")

	// 设置配置文件的类型
	viper.SetConfigType("json")

	// 设置配置文件所在的目录
	viper.AddConfigPath(".")

	viper.AutomaticEnv()

duanjinfei's avatar
duanjinfei committed
92 93 94 95 96 97 98 99 100 101 102 103 104 105
	viper.WatchConfig()

	viper.OnConfigChange(func(e fsnotify.Event) {
		// 配置文件发生变更之后会调用的回调函数
		log.Warn("The configuration file has been modified...........")
		err := viper.Unmarshal(conf.GetConfig())
		if err != nil {
			log.WithError(err).Error("Viper unmarshal cfg error:")
			panic(fmt.Errorf("Viper unmarshal conf failed, err:%s \n", err))
		}
		conf.GetConfig().UpdateFiledInfo()
		log.Info("Config file changed success:", e.Name)
	})

duanjinfei's avatar
duanjinfei committed
106 107
	// 读取配置文件
	if err := viper.ReadInConfig(); err != nil {
duanjinfei's avatar
duanjinfei committed
108
		panic(fmt.Errorf("Error reading config file: %s ", err.Error()))
duanjinfei's avatar
duanjinfei committed
109 110
	}

duanjinfei's avatar
duanjinfei committed
111
	err := viper.Unmarshal(conf.GetConfig())
duanjinfei's avatar
duanjinfei committed
112 113
	if err != nil {
		// handle error
duanjinfei's avatar
duanjinfei committed
114 115
		log.Error("Viper unmarshal cfg error:", err)
		panic("Viper unmarshal cfg error")
duanjinfei's avatar
duanjinfei committed
116
	}
duanjinfei's avatar
duanjinfei committed
117
	conf.GetConfig().UpdateFiledInfo()
duanjinfei's avatar
duanjinfei committed
118 119 120 121 122 123 124 125
}

func Execute() {
	if err := RootCmd.Execute(); err != nil {
		log.Error("root cmd execute failed", err)
		os.Exit(-1)
	}
}