Files
kattila.status/agent/main.go
2026-04-18 20:02:51 +03:00

81 lines
1.9 KiB
Go

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...")
}