From b8af8e0c98ca1240611ef20074babc90f6800e84 Mon Sep 17 00:00:00 2001 From: anonpenguin23 Date: Fri, 24 Oct 2025 11:13:21 +0300 Subject: [PATCH] Refactor configuration handling in CLI and node package. Updated default config file naming based on node type and enhanced gateway config generation to include bootstrap peers. Improved data directory path handling by expanding environment variables and user home directory. --- cmd/cli/main.go | 43 +++++++++++++++++++++++++++++++++++++------ pkg/node/node.go | 24 +++++++++++++++++++++++- 2 files changed, 60 insertions(+), 7 deletions(-) diff --git a/cmd/cli/main.go b/cmd/cli/main.go index 0399ec0..eff39f4 100644 --- a/cmd/cli/main.go +++ b/cmd/cli/main.go @@ -631,7 +631,7 @@ func handleConfigInit(args []string) { // Parse flags var ( cfgType = "node" - name = "node.yaml" + name = "" // Will be set based on type if not provided id string listenPort = 4001 rqliteHTTPPort = 5001 @@ -700,6 +700,18 @@ func handleConfigInit(args []string) { os.Exit(1) } + // Set default name based on type if not provided + if name == "" { + switch cfgType { + case "bootstrap": + name = "bootstrap.yaml" + case "gateway": + name = "gateway.yaml" + default: + name = "node.yaml" + } + } + // Ensure config directory exists configDir, err := config.EnsureConfigDir() if err != nil { @@ -725,7 +737,7 @@ func handleConfigInit(args []string) { case "bootstrap": configContent = generateBootstrapConfig(name, id, listenPort, rqliteHTTPPort, rqliteRaftPort) case "gateway": - configContent = generateGatewayConfig() + configContent = generateGatewayConfig(bootstrapPeers) } // Write config file @@ -899,12 +911,31 @@ logging: `, nodeID, listenPort, dataDir, dataDir, rqliteHTTPPort, rqliteRaftPort, 4001, rqliteHTTPPort, rqliteRaftPort) } -func generateGatewayConfig() string { - return `listen_addr: ":6001" +func generateGatewayConfig(bootstrapPeers string) string { + var peers []string + if bootstrapPeers != "" { + for _, p := range strings.Split(bootstrapPeers, ",") { + if p = strings.TrimSpace(p); p != "" { + peers = append(peers, p) + } + } + } + + var peersYAML strings.Builder + if len(peers) == 0 { + peersYAML.WriteString(" bootstrap_peers: []") + } else { + peersYAML.WriteString(" bootstrap_peers:\n") + for _, p := range peers { + fmt.Fprintf(&peersYAML, " - \"%s\"\n", p) + } + } + + return fmt.Sprintf(`listen_addr: ":6001" client_namespace: "default" rqlite_dsn: "" -bootstrap_peers: [] -` +%s +`, peersYAML.String()) } func showHelp() { diff --git a/pkg/node/node.go b/pkg/node/node.go index b1e850b..1415471 100644 --- a/pkg/node/node.go +++ b/pkg/node/node.go @@ -6,6 +6,7 @@ import ( mathrand "math/rand" "os" "path/filepath" + "strings" "time" "github.com/libp2p/go-libp2p" @@ -384,6 +385,16 @@ func (n *Node) startLibP2P() error { func (n *Node) loadOrCreateIdentity() (crypto.PrivKey, error) { identityFile := filepath.Join(n.config.Node.DataDir, "identity.key") + // Expand ~ in data directory path + identityFile = os.ExpandEnv(identityFile) + if strings.HasPrefix(identityFile, "~") { + home, err := os.UserHomeDir() + if err != nil { + return nil, fmt.Errorf("failed to determine home directory: %w", err) + } + identityFile = filepath.Join(home, identityFile[1:]) + } + // Try to load existing identity using the shared package if _, err := os.Stat(identityFile); err == nil { info, err := encryption.LoadIdentity(identityFile) @@ -489,8 +500,19 @@ func (n *Node) Stop() error { func (n *Node) Start(ctx context.Context) error { n.logger.Info("Starting network node", zap.String("data_dir", n.config.Node.DataDir)) + // Expand ~ in data directory path + dataDir := n.config.Node.DataDir + dataDir = os.ExpandEnv(dataDir) + if strings.HasPrefix(dataDir, "~") { + home, err := os.UserHomeDir() + if err != nil { + return fmt.Errorf("failed to determine home directory: %w", err) + } + dataDir = filepath.Join(home, dataDir[1:]) + } + // Create data directory - if err := os.MkdirAll(n.config.Node.DataDir, 0755); err != nil { + if err := os.MkdirAll(dataDir, 0755); err != nil { return fmt.Errorf("failed to create data directory: %w", err) }