orama/pkg/cli/cmd/monitorcmd/monitor.go
anonpenguin23 6898f47e2e Replace sshpass password auth with RootWallet SSH keys
Replaces plaintext password-based SSH authentication (sshpass) across
the entire Go CLI with wallet-derived ed25519 keys via RootWallet.

- Add `rw vault ssh agent-load` command to RootWallet CLI for SSH
  agent forwarding in push fanout
- Create wallet.go bridge: PrepareNodeKeys resolves keys from `rw
  vault ssh get --priv`, writes temp PEMs (0600), zero-overwrites
  on cleanup
- Remove Password field from Node struct, update config parser to
  new 3-field format (env|user@host|role)
- Remove all sshpass branches from inspector/ssh.go and
  remotessh/ssh.go, require SSHKey on all SSH paths
- Add WithAgentForward() option to RunSSHStreaming for hub fanout
- Add PrepareNodeKeys + defer cleanup to all 7 entry points:
  inspect, monitor, push, upgrade, clean, recover, install
- Update push fanout to use SSH agent forwarding instead of sshpass
  on hub
- Delete install/ssh.go duplicate, replace with remotessh calls
- Create nodes.conf from remote-nodes.conf (topology only, no
  secrets)
- Update all config defaults and help text from remote-nodes.conf
  to nodes.conf
- Use StrictHostKeyChecking=accept-new consistently everywhere
2026-02-24 17:24:16 +02:00

201 lines
4.8 KiB
Go

package monitorcmd
import (
"context"
"os"
"time"
"github.com/DeBrosOfficial/network/pkg/cli/monitor"
"github.com/DeBrosOfficial/network/pkg/cli/monitor/display"
"github.com/DeBrosOfficial/network/pkg/cli/monitor/tui"
"github.com/spf13/cobra"
)
// Cmd is the root monitor command.
var Cmd = &cobra.Command{
Use: "monitor",
Short: "Monitor cluster health from your local machine",
Long: `SSH into cluster nodes and display real-time health data.
Runs 'orama node report --json' on each node and aggregates results.
Without a subcommand, launches the interactive TUI.`,
RunE: runLive,
}
// Shared persistent flags.
var (
flagEnv string
flagJSON bool
flagNode string
flagConfig string
)
func init() {
Cmd.PersistentFlags().StringVar(&flagEnv, "env", "", "Environment: devnet, testnet, mainnet (required)")
Cmd.PersistentFlags().BoolVar(&flagJSON, "json", false, "Machine-readable JSON output")
Cmd.PersistentFlags().StringVar(&flagNode, "node", "", "Filter to specific node host/IP")
Cmd.PersistentFlags().StringVar(&flagConfig, "config", "scripts/nodes.conf", "Path to nodes.conf")
Cmd.MarkPersistentFlagRequired("env")
Cmd.AddCommand(liveCmd)
Cmd.AddCommand(clusterCmd)
Cmd.AddCommand(nodeCmd)
Cmd.AddCommand(serviceCmd)
Cmd.AddCommand(meshCmd)
Cmd.AddCommand(dnsCmd)
Cmd.AddCommand(namespacesCmd)
Cmd.AddCommand(alertsCmd)
Cmd.AddCommand(reportCmd)
}
// ---------------------------------------------------------------------------
// Subcommands
// ---------------------------------------------------------------------------
var liveCmd = &cobra.Command{
Use: "live",
Short: "Interactive TUI monitor",
RunE: runLive,
}
var clusterCmd = &cobra.Command{
Use: "cluster",
Short: "Cluster overview (one-shot)",
RunE: func(cmd *cobra.Command, args []string) error {
snap, err := collectSnapshot()
if err != nil {
return err
}
if flagJSON {
return display.ClusterJSON(snap, os.Stdout)
}
return display.ClusterTable(snap, os.Stdout)
},
}
var nodeCmd = &cobra.Command{
Use: "node",
Short: "Per-node health details (one-shot)",
RunE: func(cmd *cobra.Command, args []string) error {
snap, err := collectSnapshot()
if err != nil {
return err
}
if flagJSON {
return display.NodeJSON(snap, os.Stdout)
}
return display.NodeTable(snap, os.Stdout)
},
}
var serviceCmd = &cobra.Command{
Use: "service",
Short: "Service status across the cluster (one-shot)",
RunE: func(cmd *cobra.Command, args []string) error {
snap, err := collectSnapshot()
if err != nil {
return err
}
if flagJSON {
return display.ServiceJSON(snap, os.Stdout)
}
return display.ServiceTable(snap, os.Stdout)
},
}
var meshCmd = &cobra.Command{
Use: "mesh",
Short: "Mesh connectivity status (one-shot)",
RunE: func(cmd *cobra.Command, args []string) error {
snap, err := collectSnapshot()
if err != nil {
return err
}
if flagJSON {
return display.MeshJSON(snap, os.Stdout)
}
return display.MeshTable(snap, os.Stdout)
},
}
var dnsCmd = &cobra.Command{
Use: "dns",
Short: "DNS health overview (one-shot)",
RunE: func(cmd *cobra.Command, args []string) error {
snap, err := collectSnapshot()
if err != nil {
return err
}
if flagJSON {
return display.DNSJSON(snap, os.Stdout)
}
return display.DNSTable(snap, os.Stdout)
},
}
var namespacesCmd = &cobra.Command{
Use: "namespaces",
Short: "Namespace usage summary (one-shot)",
RunE: func(cmd *cobra.Command, args []string) error {
snap, err := collectSnapshot()
if err != nil {
return err
}
if flagJSON {
return display.NamespacesJSON(snap, os.Stdout)
}
return display.NamespacesTable(snap, os.Stdout)
},
}
var alertsCmd = &cobra.Command{
Use: "alerts",
Short: "Active alerts and warnings (one-shot)",
RunE: func(cmd *cobra.Command, args []string) error {
snap, err := collectSnapshot()
if err != nil {
return err
}
if flagJSON {
return display.AlertsJSON(snap, os.Stdout)
}
return display.AlertsTable(snap, os.Stdout)
},
}
var reportCmd = &cobra.Command{
Use: "report",
Short: "Full cluster report (JSON)",
RunE: func(cmd *cobra.Command, args []string) error {
snap, err := collectSnapshot()
if err != nil {
return err
}
return display.FullReport(snap, os.Stdout)
},
}
// ---------------------------------------------------------------------------
// Helpers
// ---------------------------------------------------------------------------
func collectSnapshot() (*monitor.ClusterSnapshot, error) {
cfg := newConfig()
return monitor.CollectOnce(context.Background(), cfg)
}
func newConfig() monitor.CollectorConfig {
return monitor.CollectorConfig{
ConfigPath: flagConfig,
Env: flagEnv,
NodeFilter: flagNode,
Timeout: 30 * time.Second,
}
}
func runLive(cmd *cobra.Command, args []string) error {
cfg := newConfig()
return tui.Run(cfg)
}