From 252dabe27ed060ef943e45a45cf16c611959707f Mon Sep 17 00:00:00 2001 From: VeerChaurasia Date: Wed, 25 Sep 2024 17:48:37 +0530 Subject: [PATCH] Implmented CLI --- cmd/main.go | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++- go.mod | 1 + go.sum | 4 ++ 3 files changed, 139 insertions(+), 2 deletions(-) diff --git a/cmd/main.go b/cmd/main.go index cc8b1e8..b761471 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -1,9 +1,141 @@ package main import ( - "fmt" + "context" + "flag" + + "os" + "os/signal" + "path/filepath" + "sync" + "syscall" + + "github.com/BlocSoc-iitr/selene/config" + "github.com/BlocSoc-iitr/selene/client" + "github.com/BlocSoc-iitr/selene/utils" + + "github.com/sirupsen/logrus" ) func main() { - fmt.Println("hello selene") + cliConfig := parseFlags() + + setupLogging() + + cfg := getConfig(cliConfig) + + cl, err := client.NewClient(cfg) + if err != nil { + logrus.Fatalf("Failed to create client: %v", err) + } + + if err := cl.Start(); err != nil { + logrus.Fatalf("Failed to start client: %v", err) + } + + registerShutdownHandler(cl) + + // Block forever + select {} +} + +func ParseFlags() *config.CliConfig { + cliConfig := &config.CliConfig{} + + flag.StringVar(cliConfig.ExecutionRpc, "execution-rpc", "", "Execution RPC URL") + flag.StringVar(cliConfig.ConsensusRpc, "consensus-rpc", "", "Consensus RPC URL") + flag.StringVar(cliConfig.RpcBindIp, "rpc-bind-ip", "", "RPC bind IP address") + + var rpcPort uint + flag.UintVar(&rpcPort, "rpc-port", 0, "RPC port") + if rpcPort != 0 { + port := uint16(rpcPort) + cliConfig.RpcPort = &port + } + + flag.StringVar(cliConfig.DataDir, "data-dir", "", "Data directory") + flag.StringVar(cliConfig.Fallback, "fallback", "", "Fallback URL") + + var loadExternalFallback bool + flag.BoolVar(&loadExternalFallback, "load-external-fallback", false, "Load external fallback") + cliConfig.LoadExternalFallback = &loadExternalFallback + + var strictCheckpointAge bool + flag.BoolVar(&strictCheckpointAge, "strict-checkpoint-age", false, "Strict checkpoint age") + cliConfig.StrictCheckpointAge = &strictCheckpointAge + + var checkpoint string + flag.StringVar(&checkpoint, "checkpoint", "", "Checkpoint") + if checkpoint != "" { + checkpointBytes, err := utils.Hex_str_to_bytes(checkpoint) + if err != nil { + logrus.Fatalf("Failed to parse checkpoint: %v", err) + } + cliConfig.Checkpoint = &checkpointBytes + } + + flag.Parse() + + return cliConfig +} + +func SetupLogging() { + logrus.SetFormatter(&logrus.TextFormatter{ + FullTimestamp: true, + }) + logrus.SetLevel(logrus.InfoLevel) +} + +func getConfig(cliConfig *config.CliConfig) *config.Config { + homeDir, err := os.UserHomeDir() + if err != nil { + logrus.Fatalf("Failed to get home directory: %v", err) + } + + configPath := filepath.Join(homeDir, ".selene", "config.toml") + network := "mainnet" // You might want to make this configurable + + cfg := config.Config{}.FromFile(&configPath, &network, cliConfig) + + return &cfg } + +func RegisterShutdownHandler(cl *client.Client) { + var shutdownCounter int + var mu sync.Mutex + + c := make(chan os.Signal, 1) + signal.Notify(c, os.Interrupt, syscall.SIGTERM) + + go func() { + for sig := range c { + mu.Lock() + shutdownCounter++ + counter := shutdownCounter + mu.Unlock() + + if counter == 3 { + logrus.Info("Forced shutdown") + os.Exit(0) + } + + logrus.Infof("Shutting down... press ctrl-c %d more times to force quit", 3-counter) + + if counter == 1 { + go func() { + if err := cl.Shutdown(context.Background()); err != nil { + logrus.Errorf("Error during shutdown: %v", err) + } + os.Exit(0) + }() + } + + if sig == syscall.SIGTERM { + if err := cl.Shutdown(context.Background()); err != nil { + logrus.Errorf("Error during shutdown: %v", err) + } + os.Exit(0) + } + } + }() +} \ No newline at end of file diff --git a/go.mod b/go.mod index d3224ef..381cd3e 100644 --- a/go.mod +++ b/go.mod @@ -28,6 +28,7 @@ require ( github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.11.0 // indirect github.com/spf13/cast v1.6.0 // indirect diff --git a/go.sum b/go.sum index 602c81c..934afc9 100644 --- a/go.sum +++ b/go.sum @@ -48,6 +48,8 @@ github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6ke github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= @@ -63,6 +65,7 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= @@ -88,6 +91,7 @@ golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8 golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=