package config import ( "encoding/json" "errors" "flag" "fmt" "io/ioutil" "log" "os" "path/filepath" "strings" //"crypto/rand" //"encoding/hex" ) /* Global & initialization */ var RootDir string var Config Config_ func initFlags(printHelp *bool) { flag.BoolVar(printHelp, "help", false, "Print this help message.") flag.StringVar(&Config.LAddr, "laddr", Config.LAddr, "Listen address. (0.0.0.0:0 means any interface, any port)") flag.StringVar(&Config.Seed, "seed", Config.Seed, "Address of seed node") } func init() { RootDir = os.Getenv("TMROOT") if RootDir == "" { RootDir = os.Getenv("HOME") + "/.tendermint" } configFile := RootDir + "/config.json" // try to read configuration. if missing, write default configBytes, err := ioutil.ReadFile(configFile) if err != nil { defaultConfig.write(configFile) fmt.Println("Config file written to config.json. Please edit & run again") os.Exit(1) return } // try to parse configuration. on error, die Config = Config_{} err = json.Unmarshal(configBytes, &Config) if err != nil { log.Panicf("Invalid configuration file %s: %v", configFile, err) } err = Config.validate() if err != nil { log.Panicf("Invalid configuration file %s: %v", configFile, err) } // try to parse arg flags, which can override file configuration. var printHelp bool initFlags(&printHelp) flag.Parse() if printHelp { fmt.Println("----------------------------------") flag.PrintDefaults() fmt.Println("----------------------------------") os.Exit(0) } } /* Default configuration */ var defaultConfig = Config_{ LAddr: "0.0.0.0:0", Seed: "", Db: DbConfig{ Type: "level", Dir: RootDir + "/data", }, Twilio: TwilioConfig{}, } /* Configuration types */ type Config_ struct { LAddr string Seed string Db DbConfig Twilio TwilioConfig } type TwilioConfig struct { Sid string Token string From string To string MinInterval int } type DbConfig struct { Type string Dir string } func (cfg *Config_) validate() error { if cfg.LAddr == "" { cfg.LAddr = defaultConfig.LAddr } if cfg.Seed == "" { cfg.Seed = defaultConfig.Seed } if cfg.Db.Type == "" { return errors.New("Db.Type must be set") } return nil } func (cfg *Config_) bytes() []byte { configBytes, err := json.MarshalIndent(cfg, "", "\t") if err != nil { panic(err) } return configBytes } func (cfg *Config_) write(configFile string) { if strings.Index(configFile, "/") != -1 { err := os.MkdirAll(filepath.Dir(configFile), 0700) if err != nil { panic(err) } } err := ioutil.WriteFile(configFile, cfg.bytes(), 0600) if err != nil { panic(err) } } /* TODO: generate priv/pub keys func generateKeys() string { bytes := &[30]byte{} rand.Read(bytes[:]) return hex.EncodeToString(bytes[:]) } */