hmac problems.

This commit is contained in:
Kalzu Rekku
2026-04-18 20:02:51 +03:00
parent b59cb16c66
commit 4e7c62987a
2 changed files with 103 additions and 5 deletions

View File

@@ -1,6 +1,9 @@
package main package main
import ( import (
"encoding/json"
"flag"
"fmt"
"log" "log"
"os" "os"
"os/signal" "os/signal"
@@ -8,16 +11,63 @@ import (
"kattila-agent/api" "kattila-agent/api"
"kattila-agent/config" "kattila-agent/config"
"kattila-agent/network"
"kattila-agent/reporter" "kattila-agent/reporter"
"kattila-agent/security" "kattila-agent/security"
) )
func main() { 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...") log.Println("Kattila Agent starting...")
config.LoadConfig() 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() 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) api.StartServer(reporter.HandleRelay)
reporter.StartLoop() reporter.StartLoop()

View File

@@ -9,6 +9,7 @@ import (
"log" "log"
"net" "net"
"net/http" "net/http"
"os"
"strings" "strings"
"time" "time"
@@ -30,11 +31,10 @@ func StartLoop() {
}() }()
} }
func doReport() { func BuildReport() (*models.Report, models.SystemData, error) {
data, err := network.GatherSystemData() data, err := network.GatherSystemData()
if err != nil { if err != nil {
log.Printf("reporter: gather error: %v", err) return nil, data, fmt.Errorf("gather error: %v", err)
return
} }
tickCounter++ tickCounter++
@@ -53,14 +53,62 @@ func doReport() {
} }
report.HMAC = security.SignPayload(report.Data) 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 { if err != nil {
log.Printf("reporter: direct push failed (%v). Attempting relay scan...", err) 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 { func pushToManager(report models.Report) error {
body, _ := json.Marshal(report) body, _ := json.Marshal(report)
url := strings.TrimRight(config.Cfg.ManagerURL, "/") + "/status/updates" url := strings.TrimRight(config.Cfg.ManagerURL, "/") + "/status/updates"