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) }