package main import ( "encoding/json" "flag" "fmt" "log" "os" "os/signal" "syscall" "kattila-agent/api" "kattila-agent/config" "kattila-agent/network" "kattila-agent/reporter" "kattila-agent/security" ) func main() { dumpFlag := flag.String("dump", "", "Run data collection once and write the JSON report to the specified file, then exit") discoverFlag := flag.Bool("discover", false, "Run relay peer discovery to find active Kattila peers and output the results, then exit") sysinfoFlag := flag.Bool("sysinfo", false, "Gather system data and print as formatted JSON to stdout, then exit") flag.Parse() log.Println("Kattila Agent starting...") config.LoadConfig() if *sysinfoFlag { data, err := network.GatherSystemData() if err != nil { log.Fatalf("Failed to gather system data: %v", err) } encoded, err := json.MarshalIndent(data, "", " ") if err != nil { log.Fatalf("Failed to encode system data: %v", err) } fmt.Println(string(encoded)) os.Exit(0) } if *discoverFlag { log.Println("Starting peer discovery...") peers, err := reporter.DiscoverPeers() if err != nil { log.Fatalf("Peer discovery failed: %v", err) } if len(peers) == 0 { log.Println("No active peers found.") } else { log.Printf("Found %d active peer(s):", len(peers)) for _, p := range peers { log.Println(" -", p) } } os.Exit(0) } security.StartKeyPoller() if *dumpFlag != "" { log.Printf("Dumping report to %s...", *dumpFlag) err := reporter.ExportReportToFile(*dumpFlag) if err != nil { log.Fatalf("Failed to dump report: %v", err) } log.Println("Report dumped successfully.") os.Exit(0) } api.StartServer(reporter.HandleRelay) reporter.StartLoop() // Wait for termination signal sigChan := make(chan os.Signal, 1) signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) <-sigChan log.Println("Kattila Agent shutting down...") }