From 4e7c62987a73f37a27431c4fcbc236a9d42bef68 Mon Sep 17 00:00:00 2001 From: Kalzu Rekku Date: Sat, 18 Apr 2026 20:02:51 +0300 Subject: [PATCH] hmac problems. --- agent/main.go | 50 ++++++++++++++++++++++++++++++++ agent/reporter/reporter.go | 58 ++++++++++++++++++++++++++++++++++---- 2 files changed, 103 insertions(+), 5 deletions(-) diff --git a/agent/main.go b/agent/main.go index 2fcc8ec..02644a8 100644 --- a/agent/main.go +++ b/agent/main.go @@ -1,6 +1,9 @@ package main import ( + "encoding/json" + "flag" + "fmt" "log" "os" "os/signal" @@ -8,16 +11,63 @@ import ( "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() diff --git a/agent/reporter/reporter.go b/agent/reporter/reporter.go index c82e634..87eb465 100644 --- a/agent/reporter/reporter.go +++ b/agent/reporter/reporter.go @@ -9,6 +9,7 @@ import ( "log" "net" "net/http" + "os" "strings" "time" @@ -30,11 +31,10 @@ func StartLoop() { }() } -func doReport() { +func BuildReport() (*models.Report, models.SystemData, error) { data, err := network.GatherSystemData() if err != nil { - log.Printf("reporter: gather error: %v", err) - return + return nil, data, fmt.Errorf("gather error: %v", err) } tickCounter++ @@ -53,14 +53,62 @@ func doReport() { } report.HMAC = security.SignPayload(report.Data) + return &report, data, nil +} - err = pushToManager(report) +func doReport() { + report, data, err := BuildReport() + if err != nil { + log.Printf("reporter: %v", err) + return + } + + err = pushToManager(*report) if err != nil { log.Printf("reporter: direct push failed (%v). Attempting relay scan...", err) - tryRelay(report, data) + tryRelay(*report, data) } } +func ExportReportToFile(filepath string) error { + report, _, err := BuildReport() + if err != nil { + return err + } + encoded, err := json.MarshalIndent(report, "", " ") + if err != nil { + return err + } + return os.WriteFile(filepath, encoded, 0644) +} + +func DiscoverPeers() ([]string, error) { + data, err := network.GatherSystemData() + if err != nil { + return nil, err + } + + var discovered []string + for _, wg := range data.WGPeers { + for _, allowedRaw := range wg.AllowedIPs { + ip, _, err := net.ParseCIDR(allowedRaw) + if err != nil { + ip = net.ParseIP(allowedRaw) + } + if ip != nil { + ipTarget := ip.String() + log.Printf("reporter: Checking potential peer at %s...", ipTarget) + if pingPeer(ipTarget) { + log.Printf("reporter: Found active Kattila peer at %s", ipTarget) + discovered = append(discovered, ipTarget) + } + } + } + } + return discovered, nil +} + + func pushToManager(report models.Report) error { body, _ := json.Marshal(report) url := strings.TrimRight(config.Cfg.ManagerURL, "/") + "/status/updates"