cosmos-sdk/cmd/commands/start.go

163 lines
4.1 KiB
Go
Raw Normal View History

package commands
2017-01-28 18:12:58 -08:00
import (
"fmt"
2017-01-29 21:27:57 -08:00
"os"
"path"
2017-01-28 18:12:58 -08:00
2017-04-15 09:07:27 -07:00
"github.com/pkg/errors"
"github.com/spf13/cobra"
"github.com/spf13/viper"
2017-01-28 18:12:58 -08:00
"github.com/tendermint/abci/server"
eyes "github.com/tendermint/merkleeyes/client"
"github.com/tendermint/tmlibs/cli"
cmn "github.com/tendermint/tmlibs/common"
2017-05-01 07:03:54 -07:00
"github.com/tendermint/tmlibs/log"
2017-01-29 11:41:21 -08:00
"github.com/tendermint/tendermint/config"
2017-01-29 11:41:21 -08:00
"github.com/tendermint/tendermint/node"
"github.com/tendermint/tendermint/proxy"
2017-05-12 12:47:18 -07:00
"github.com/tendermint/tendermint/types"
2017-01-29 11:41:21 -08:00
"github.com/tendermint/basecoin/app"
2017-01-28 18:12:58 -08:00
)
var StartCmd = &cobra.Command{
Use: "start",
Short: "Start basecoin",
2017-04-15 09:07:27 -07:00
RunE: startCmd,
}
//flags
var (
addrFlag string
eyesFlag string
dirFlag string
withoutTendermintFlag bool
)
2017-01-30 08:16:00 -08:00
// TODO: move to config file
const EyesCacheSize = 10000
func init() {
flags := []Flag2Register{
{&addrFlag, "address", "tcp://0.0.0.0:46658", "Listen address"},
{&eyesFlag, "eyes", "local", "MerkleEyes address, or 'local' for embedded"},
{&dirFlag, "dir", ".", "Root directory"},
2017-04-17 18:28:03 -07:00
{&withoutTendermintFlag, "without-tendermint", false, "Run Tendermint in-process with the App"},
}
RegisterFlags(StartCmd, flags)
2017-01-30 08:16:00 -08:00
}
2017-04-15 09:07:27 -07:00
func startCmd(cmd *cobra.Command, args []string) error {
rootDir := viper.GetString(cli.HomeFlag)
2017-01-28 18:12:58 -08:00
// Connect to MerkleEyes
var eyesCli *eyes.Client
if eyesFlag == "local" {
eyesCli = eyes.NewLocalClient(path.Join(rootDir, "data", "merkleeyes.db"), EyesCacheSize)
2017-01-28 18:12:58 -08:00
} else {
var err error
eyesCli, err = eyes.NewClient(eyesFlag)
2017-01-28 18:12:58 -08:00
if err != nil {
2017-04-15 09:07:27 -07:00
return errors.Errorf("Error connecting to MerkleEyes: %v\n", err)
2017-01-28 18:12:58 -08:00
}
}
// Create Basecoin app
2017-01-29 11:41:21 -08:00
basecoinApp := app.NewBasecoin(eyesCli)
2017-05-01 07:03:54 -07:00
basecoinApp.SetLogger(logger.With("module", "app"))
2017-01-29 20:06:14 -08:00
2017-02-13 14:04:49 -08:00
// register IBC plugn
basecoinApp.RegisterPlugin(NewIBCPlugin())
// register all other plugins
2017-01-30 08:16:00 -08:00
for _, p := range plugins {
2017-02-07 13:10:17 -08:00
basecoinApp.RegisterPlugin(p.newPlugin())
2017-01-29 15:32:38 -08:00
}
2017-03-14 14:28:49 -07:00
// if chain_id has not been set yet, load the genesis.
// else, assume it's been loaded
if basecoinApp.GetState().GetChainID() == "" {
// If genesis file exists, set key-value options
genesisFile := path.Join(rootDir, "genesis.json")
2017-03-14 14:28:49 -07:00
if _, err := os.Stat(genesisFile); err == nil {
err := basecoinApp.LoadGenesis(genesisFile)
if err != nil {
2017-04-15 09:07:27 -07:00
return errors.Errorf("Error in LoadGenesis: %v\n", err)
2017-03-14 14:28:49 -07:00
}
} else {
fmt.Printf("No genesis file at %s, skipping...\n", genesisFile)
2017-01-28 18:12:58 -08:00
}
}
2017-03-18 17:48:48 -07:00
chainID := basecoinApp.GetState().GetChainID()
if withoutTendermintFlag {
2017-05-01 07:03:54 -07:00
logger.Info("Starting Basecoin without Tendermint", "chain_id", chainID)
// run just the abci app/server
2017-04-15 09:07:27 -07:00
return startBasecoinABCI(basecoinApp)
} else {
2017-05-01 07:03:54 -07:00
logger.Info("Starting Basecoin with Tendermint", "chain_id", chainID)
// start the app with tendermint in-process
return startTendermint(rootDir, basecoinApp)
2017-01-29 11:41:21 -08:00
}
}
2017-04-15 09:07:27 -07:00
func startBasecoinABCI(basecoinApp *app.Basecoin) error {
2017-01-29 11:41:21 -08:00
// Start the ABCI listener
svr, err := server.NewServer(addrFlag, "socket", basecoinApp)
2017-01-28 18:12:58 -08:00
if err != nil {
2017-04-15 09:07:27 -07:00
return errors.Errorf("Error creating listener: %v\n", err)
2017-01-28 18:12:58 -08:00
}
2017-05-01 07:03:54 -07:00
svr.SetLogger(logger.With("module", "abci-server"))
svr.Start()
2017-01-28 18:12:58 -08:00
// Wait forever
cmn.TrapSignal(func() {
// Cleanup
svr.Stop()
})
2017-04-15 09:07:27 -07:00
return nil
2017-01-29 11:41:21 -08:00
}
func getTendermintConfig() (*config.Config, error) {
cfg := config.DefaultConfig()
err := viper.Unmarshal(cfg)
if err != nil {
return nil, err
}
cfg.SetRoot(cfg.RootDir)
config.EnsureRoot(cfg.RootDir)
return cfg, nil
}
func startTendermint(dir string, basecoinApp *app.Basecoin) error {
cfg, err := getTendermintConfig()
if err != nil {
return err
}
2017-05-01 07:03:54 -07:00
2017-05-17 03:46:08 -07:00
// TODO: parse the log level from the config properly (multi modules)
// but some tm code must be refactored for better usability
lvl, err := log.AllowLevel(cfg.LogLevel)
2017-05-13 09:11:06 -07:00
if err != nil {
return err
2017-05-01 07:03:54 -07:00
}
2017-05-17 03:46:08 -07:00
tmLogger := log.NewFilter(logger, lvl)
2017-01-29 11:41:21 -08:00
// Create & start tendermint node
2017-05-01 07:03:54 -07:00
privValidator := types.LoadOrGenPrivValidator(cfg.PrivValidatorFile(), tmLogger)
n := node.NewNode(cfg, privValidator, proxy.NewLocalClientCreator(basecoinApp), tmLogger.With("module", "node"))
2017-01-29 11:41:21 -08:00
_, err = n.Start()
2017-03-18 17:48:48 -07:00
if err != nil {
2017-04-17 18:28:03 -07:00
return err
2017-03-18 17:48:48 -07:00
}
2017-01-29 11:41:21 -08:00
2017-05-12 12:47:18 -07:00
// Trap signal, run forever.
n.RunForever()
2017-04-15 09:07:27 -07:00
return nil
2017-01-28 18:12:58 -08:00
}