From 413cceb1eb9fe32c8b4d9975530afa38bbfbc1eb Mon Sep 17 00:00:00 2001 From: Markus Graf Date: Thu, 26 Mar 2026 21:04:11 +0100 Subject: [PATCH] feat(06-02): wire --config flag and config.Load into CLI pipeline - Add configPath string var and --config flag to Cobra command - Import config and synth packages in main.go - Call config.Load(configPath) in run() before capture (D-11 fail fast) - Change runLiveMode and runPcapMode signatures to accept freqCfgs map - Pass freqCfgs to encode.RunSynthesis in both live and pcap modes --- cmd/netsynth/main.go | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/cmd/netsynth/main.go b/cmd/netsynth/main.go index 03c1de7..07f9be2 100644 --- a/cmd/netsynth/main.go +++ b/cmd/netsynth/main.go @@ -16,7 +16,9 @@ import ( "github.com/netsynth/netsynth/aggregate" "github.com/netsynth/netsynth/capture" "github.com/netsynth/netsynth/classify" + "github.com/netsynth/netsynth/config" "github.com/netsynth/netsynth/encode" + "github.com/netsynth/netsynth/synth" ) var ( @@ -26,6 +28,7 @@ var ( outputPath string bpfFilter string // NEW: --filter flag (CAPT-05) readPath string // NEW: --read flag (CAPT-06) + configPath string // NEW: --config flag (CFG-03) ) func main() { @@ -42,6 +45,7 @@ func main() { rootCmd.Flags().StringVarP(&outputPath, "output", "o", "", "Output MP3 file path (default: netsynth-.mp3)") rootCmd.Flags().StringVar(&bpfFilter, "filter", "", "BPF filter expression (tcpdump syntax, e.g. \"port 53\")") rootCmd.Flags().StringVar(&readPath, "read", "", "Read packets from pcap file instead of live capture") + rootCmd.Flags().StringVar(&configPath, "config", "", "Path to TOML config file (default: auto-discover)") if err := rootCmd.Execute(); err != nil { os.Exit(1) @@ -79,6 +83,12 @@ func run(cmd *cobra.Command, args []string) error { } } + // Load config (CFG-01 through CFG-05, D-11: fail fast before capture) + freqCfgs, err := config.Load(configPath) + if err != nil { + return err + } + // Resolve output path if outputPath == "" { if readPath != "" { @@ -89,13 +99,13 @@ func run(cmd *cobra.Command, args []string) error { } if readPath != "" { - return runPcapMode(cmd) + return runPcapMode(cmd, freqCfgs) } - return runLiveMode(cmd) + return runLiveMode(cmd, freqCfgs) } // runLiveMode runs the live packet capture pipeline. -func runLiveMode(cmd *cobra.Command) error { +func runLiveMode(cmd *cobra.Command, freqCfgs map[classify.TrafficClass]synth.FreqConfig) error { // Set up signal handling (Ctrl+C) ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) defer stop() @@ -144,7 +154,7 @@ func runLiveMode(cmd *cobra.Command) error { // D-07: Encoding status line fmt.Fprintf(os.Stderr, "Encoding %d windows to %s...\n", len(collectedSnapshots), outputPath) encodeStart := time.Now() - if err := encode.RunSynthesis(collectedSnapshots, outputPath); err != nil { + if err := encode.RunSynthesis(collectedSnapshots, outputPath, freqCfgs); err != nil { return fmt.Errorf("synthesis failed: %w", err) } encodeElapsed := time.Since(encodeStart) @@ -161,7 +171,7 @@ func runLiveMode(cmd *cobra.Command) error { } // runPcapMode runs the pcap file processing pipeline (CAPT-06). -func runPcapMode(cmd *cobra.Command) error { +func runPcapMode(cmd *cobra.Command, freqCfgs map[classify.TrafficClass]synth.FreqConfig) error { // D-06: bookend start message fmt.Fprintf(os.Stderr, "Reading %s...\n", readPath) @@ -212,7 +222,7 @@ func runPcapMode(cmd *cobra.Command) error { // Encode fmt.Fprintf(os.Stderr, "Encoding %d windows to %s...\n", len(collectedSnapshots), outputPath) encodeStart := time.Now() - if err := encode.RunSynthesis(collectedSnapshots, outputPath); err != nil { + if err := encode.RunSynthesis(collectedSnapshots, outputPath, freqCfgs); err != nil { return fmt.Errorf("synthesis failed: %w", err) } encodeElapsed := time.Since(encodeStart)