hmac problems.
This commit is contained in:
@@ -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()
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user