tendermint/config/config.go

137 lines
2.7 KiB
Go
Raw Normal View History

2014-06-06 11:57:22 -07:00
package config
import (
2014-07-01 14:50:24 -07:00
"encoding/json"
"errors"
2014-07-12 14:52:31 -07:00
"flag"
2014-07-01 14:50:24 -07:00
"fmt"
"io/ioutil"
"log"
"os"
"path/filepath"
"strings"
//"crypto/rand"
//"encoding/hex"
2014-06-06 11:57:22 -07:00
)
/* Global & initialization */
2014-07-16 13:15:18 -07:00
var RootDir string
2014-06-06 11:57:22 -07:00
var Config Config_
2014-10-07 00:43:34 -07:00
func setFlags(printHelp *bool) {
2014-07-12 14:52:31 -07:00
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)")
2014-10-22 17:20:44 -07:00
flag.StringVar(&Config.SeedNode, "seed", Config.SeedNode, "Address of seed node")
2014-07-12 14:52:31 -07:00
}
2014-06-06 11:57:22 -07:00
2014-10-07 00:43:34 -07:00
func ParseFlags() {
2014-07-16 13:15:18 -07:00
RootDir = os.Getenv("TMROOT")
if RootDir == "" {
RootDir = os.Getenv("HOME") + "/.tendermint"
}
configFile := RootDir + "/config.json"
2014-07-01 14:50:24 -07:00
// 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)
}
2014-07-12 14:52:31 -07:00
// try to parse arg flags, which can override file configuration.
var printHelp bool
2014-10-07 00:43:34 -07:00
setFlags(&printHelp)
2014-07-12 14:52:31 -07:00
flag.Parse()
if printHelp {
flag.PrintDefaults()
os.Exit(0)
}
2014-06-06 11:57:22 -07:00
}
/* Default configuration */
var defaultConfig = Config_{
2014-10-22 17:20:44 -07:00
Network: "tendermint_testnet0",
LAddr: "0.0.0.0:0",
SeedNode: "",
2014-07-01 14:50:24 -07:00
Db: DbConfig{
Type: "level",
2014-07-16 13:15:18 -07:00
Dir: RootDir + "/data",
2014-07-01 14:50:24 -07:00
},
Twilio: TwilioConfig{},
2014-06-06 11:57:22 -07:00
}
/* Configuration types */
type Config_ struct {
2014-10-22 17:20:44 -07:00
Network string
LAddr string
SeedNode string
Db DbConfig
Twilio TwilioConfig
2014-06-06 11:57:22 -07:00
}
type TwilioConfig struct {
2014-07-01 14:50:24 -07:00
Sid string
Token string
From string
To string
MinInterval int
2014-06-06 11:57:22 -07:00
}
type DbConfig struct {
2014-07-01 14:50:24 -07:00
Type string
Dir string
2014-06-06 11:57:22 -07:00
}
func (cfg *Config_) validate() error {
2014-08-10 16:35:08 -07:00
if cfg.Network == "" {
cfg.Network = defaultConfig.Network
}
if cfg.LAddr == "" {
cfg.LAddr = defaultConfig.LAddr
2014-07-01 14:50:24 -07:00
}
2014-10-22 17:20:44 -07:00
if cfg.SeedNode == "" {
cfg.SeedNode = defaultConfig.SeedNode
2014-07-01 14:50:24 -07:00
}
if cfg.Db.Type == "" {
return errors.New("Db.Type must be set")
}
return nil
2014-06-06 11:57:22 -07:00
}
func (cfg *Config_) bytes() []byte {
2014-07-08 15:33:26 -07:00
configBytes, err := json.MarshalIndent(cfg, "", "\t")
2014-07-01 14:50:24 -07:00
if err != nil {
panic(err)
}
return configBytes
2014-06-06 11:57:22 -07:00
}
func (cfg *Config_) write(configFile string) {
2014-07-01 14:50:24 -07:00
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)
}
2014-06-06 11:57:22 -07:00
}