cosmos-sdk/cmd/commands/start.go

132 lines
2.9 KiB
Go
Raw Normal View History

package commands
2017-01-28 18:12:58 -08:00
import (
"errors"
2017-01-29 21:27:57 -08:00
"os"
"path"
2017-01-28 18:12:58 -08:00
"github.com/urfave/cli"
"github.com/tendermint/abci/server"
cmn "github.com/tendermint/go-common"
2017-01-29 11:41:21 -08:00
cfg "github.com/tendermint/go-config"
//logger "github.com/tendermint/go-logger"
2017-01-28 18:12:58 -08:00
eyes "github.com/tendermint/merkleeyes/client"
2017-01-29 11:41:21 -08:00
tmcfg "github.com/tendermint/tendermint/config/tendermint"
"github.com/tendermint/tendermint/node"
"github.com/tendermint/tendermint/proxy"
tmtypes "github.com/tendermint/tendermint/types"
"github.com/tendermint/basecoin/app"
2017-01-30 08:16:00 -08:00
"github.com/tendermint/basecoin/types"
2017-01-28 18:12:58 -08:00
)
2017-01-29 11:41:21 -08:00
var config cfg.Config
2017-01-28 18:12:58 -08:00
const EyesCacheSize = 10000
var StartCmd = cli.Command{
Name: "start",
Usage: "Start basecoin",
ArgsUsage: "",
Action: func(c *cli.Context) error {
return cmdStart(c)
},
Flags: []cli.Flag{
2017-01-30 06:27:02 -08:00
AddrFlag,
EyesFlag,
DirFlag,
InProcTMFlag,
ChainIDFlag,
},
}
2017-01-30 08:16:00 -08:00
type plugin struct {
2017-02-07 13:10:17 -08:00
name string
newPlugin func() types.Plugin
2017-01-30 08:16:00 -08:00
}
var plugins = []plugin{}
// RegisterStartPlugin is used to enable a plugin
2017-02-07 13:10:17 -08:00
func RegisterStartPlugin(name string, newPlugin func() types.Plugin) {
plugins = append(plugins, plugin{name: name, newPlugin: newPlugin})
2017-01-30 08:16:00 -08:00
}
2017-01-28 18:12:58 -08:00
func cmdStart(c *cli.Context) error {
// Connect to MerkleEyes
var eyesCli *eyes.Client
if c.String("eyes") == "local" {
2017-01-29 21:27:57 -08:00
eyesCli = eyes.NewLocalClient(path.Join(c.String("dir"), "merkleeyes.db"), EyesCacheSize)
2017-01-28 18:12:58 -08:00
} else {
var err error
eyesCli, err = eyes.NewClient(c.String("eyes"))
if err != nil {
return errors.New("connect to MerkleEyes: " + err.Error())
}
}
// Create Basecoin app
2017-01-29 11:41:21 -08:00
basecoinApp := app.NewBasecoin(eyesCli)
2017-01-29 20:06:14 -08:00
// register all 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-01-29 21:27:57 -08:00
// If genesis file exists, set key-value options
genesisFile := path.Join(c.String("dir"), "genesis.json")
if _, err := os.Stat(genesisFile); err == nil {
err := basecoinApp.LoadGenesis(genesisFile)
2017-01-28 18:12:58 -08:00
if err != nil {
return errors.New(cmn.Fmt("%+v", err))
}
}
2017-01-29 11:41:21 -08:00
if c.Bool("in-proc") {
startTendermint(c, basecoinApp)
} else {
startBasecoinABCI(c, basecoinApp)
}
return nil
}
func startBasecoinABCI(c *cli.Context, basecoinApp *app.Basecoin) error {
// Start the ABCI listener
svr, err := server.NewServer(c.String("address"), "socket", basecoinApp)
2017-01-28 18:12:58 -08:00
if err != nil {
return errors.New("create listener: " + err.Error())
}
// Wait forever
cmn.TrapSignal(func() {
// Cleanup
svr.Stop()
})
return nil
2017-01-29 11:41:21 -08:00
}
func startTendermint(c *cli.Context, basecoinApp *app.Basecoin) {
// Get configuration
config = tmcfg.GetConfig("")
// logger.SetLogLevel("notice") //config.GetString("log_level"))
// parseFlags(config, args[1:]) // Command line overrides
// Create & start tendermint node
privValidatorFile := config.GetString("priv_validator_file")
privValidator := tmtypes.LoadOrGenPrivValidator(privValidatorFile)
n := node.NewNode(config, privValidator, proxy.NewLocalClientCreator(basecoinApp))
n.Start()
// Wait forever
cmn.TrapSignal(func() {
// Cleanup
n.Stop()
})
2017-01-28 18:12:58 -08:00
}