2020-07-24 13:54:03 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"flag"
|
|
|
|
"fmt"
|
|
|
|
"os"
|
2020-11-13 12:19:33 +00:00
|
|
|
"strings"
|
2020-07-24 13:54:03 +00:00
|
|
|
|
2020-11-13 12:19:33 +00:00
|
|
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
2020-07-24 13:54:03 +00:00
|
|
|
"github.com/nspcc-dev/neofs-node/misc"
|
|
|
|
"github.com/nspcc-dev/neofs-node/pkg/innerring"
|
|
|
|
"github.com/nspcc-dev/neofs-node/pkg/util/grace"
|
|
|
|
"github.com/nspcc-dev/neofs-node/pkg/util/logger"
|
|
|
|
"github.com/nspcc-dev/neofs-node/pkg/util/profiler"
|
2020-10-13 15:40:35 +00:00
|
|
|
"go.uber.org/zap"
|
2020-07-24 13:54:03 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
// ErrorReturnCode returns when application crashed at initialization stage
|
|
|
|
ErrorReturnCode = 1
|
|
|
|
|
|
|
|
// SuccessReturnCode returns when application closed without panic
|
|
|
|
SuccessReturnCode = 0
|
|
|
|
)
|
|
|
|
|
|
|
|
func exitErr(err error) {
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
os.Exit(ErrorReturnCode)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
configFile := flag.String("config", "", "path to config")
|
2020-11-13 12:19:33 +00:00
|
|
|
validators := flag.String("vote", "", "hex encoded public keys split with comma")
|
2020-07-24 13:54:03 +00:00
|
|
|
versionFlag := flag.Bool("version", false, "neofs-ir node version")
|
|
|
|
flag.Parse()
|
|
|
|
|
|
|
|
if *versionFlag {
|
|
|
|
fmt.Println("version:", misc.Version)
|
|
|
|
os.Exit(SuccessReturnCode)
|
|
|
|
}
|
|
|
|
|
|
|
|
cfg, err := newConfig(*configFile)
|
|
|
|
exitErr(err)
|
|
|
|
|
|
|
|
log, err := logger.NewLogger(cfg)
|
|
|
|
exitErr(err)
|
|
|
|
|
|
|
|
ctx := grace.NewGracefulContext(log)
|
2020-10-13 15:40:35 +00:00
|
|
|
intErr := make(chan error) // internal inner ring errors
|
2020-07-24 13:54:03 +00:00
|
|
|
|
|
|
|
pprof := profiler.NewProfiler(log, cfg)
|
|
|
|
prometheus := profiler.NewMetrics(log, cfg)
|
|
|
|
|
|
|
|
innerRing, err := innerring.New(ctx, log, cfg)
|
|
|
|
if err != nil {
|
|
|
|
exitErr(err)
|
|
|
|
}
|
|
|
|
|
2020-11-13 12:19:33 +00:00
|
|
|
if len(*validators) != 0 {
|
|
|
|
validatorKeys, err := parsePublicKeysFromString(*validators)
|
|
|
|
exitErr(err)
|
|
|
|
|
|
|
|
err = innerRing.InitAndVoteForSidechainValidator(validatorKeys)
|
|
|
|
exitErr(err)
|
|
|
|
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2020-07-24 13:54:03 +00:00
|
|
|
// start pprof if enabled
|
|
|
|
if pprof != nil {
|
|
|
|
pprof.Start(ctx)
|
|
|
|
defer pprof.Stop()
|
|
|
|
}
|
|
|
|
|
|
|
|
// start prometheus if enabled
|
|
|
|
if prometheus != nil {
|
|
|
|
prometheus.Start(ctx)
|
|
|
|
defer prometheus.Stop()
|
|
|
|
}
|
|
|
|
|
|
|
|
// start inner ring
|
2020-10-13 15:40:35 +00:00
|
|
|
err = innerRing.Start(ctx, intErr)
|
2020-07-24 13:54:03 +00:00
|
|
|
if err != nil {
|
|
|
|
exitErr(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
log.Info("application started")
|
|
|
|
|
2020-10-13 15:40:35 +00:00
|
|
|
select {
|
|
|
|
case <-ctx.Done():
|
|
|
|
case err := <-intErr:
|
|
|
|
// todo: restart application instead of shutdown
|
|
|
|
log.Info("internal error", zap.String("msg", err.Error()))
|
|
|
|
}
|
2020-07-24 13:54:03 +00:00
|
|
|
|
|
|
|
innerRing.Stop()
|
|
|
|
|
|
|
|
log.Info("application stopped")
|
|
|
|
}
|
2020-11-13 12:19:33 +00:00
|
|
|
|
|
|
|
func parsePublicKeysFromString(argument string) ([]keys.PublicKey, error) {
|
|
|
|
publicKeysString := strings.Split(argument, ",")
|
|
|
|
|
|
|
|
return innerring.ParsePublicKeysFromStrings(publicKeysString)
|
|
|
|
}
|