Track server connectivity target

This commit is contained in:
benya
2026-06-05 14:09:01 +03:00
parent 7a613bb407
commit 70f78772b8
5 changed files with 109 additions and 9 deletions
+42 -3
View File
@@ -10,7 +10,9 @@ import (
"flag"
"fmt"
"io"
"net"
"net/http"
"net/url"
"os"
"os/exec"
"os/signal"
@@ -266,7 +268,7 @@ func heartbeatOnce(ctx context.Context, client *http.Client, cfg config) error {
body := map[string]any{
"device_id": cfg.DeviceID,
"inventory": buildInventory(cfg),
"metrics": buildMetrics(cfg.CheckTargets),
"metrics": buildMetrics(cfg),
}
var resp heartbeatResponse
if err := postJSON(ctx, client, cfg.ServerURL+"/api/agent/heartbeat", cfg.DeviceToken, body, &resp); err != nil {
@@ -300,7 +302,8 @@ func (cfg config) displayHostname() string {
return hostnameValue() + strings.TrimSpace(cfg.HostnameSuffix)
}
func buildMetrics(targets []string) map[string]any {
func buildMetrics(cfg config) map[string]any {
serverTarget := serverCheckTarget(cfg.ServerURL)
return map[string]any{
"system": jsonObjectOrEmpty(commandOutput("ubus", "call", "system", "info")),
"loadavg": strings.TrimSpace(readFileString("/proc/loadavg")),
@@ -308,10 +311,46 @@ func buildMetrics(targets []string) map[string]any {
"memory": memoryInfo(),
"disk": diskInfo(),
"interface_counters": interfaceCounters(),
"connectivity_checks": connectivityChecks(targets),
"connectivity_checks": connectivityChecks(effectiveCheckTargets(cfg.CheckTargets, serverTarget)),
"server_check_target": serverTarget,
}
}
func effectiveCheckTargets(targets []string, serverTarget string) []string {
result := make([]string, 0, len(targets)+1)
seen := map[string]bool{}
for _, target := range targets {
target = strings.TrimSpace(target)
if target == "" || seen[target] {
continue
}
result = append(result, target)
seen[target] = true
}
if serverTarget != "" && !seen[serverTarget] {
result = append(result, serverTarget)
}
return result
}
func serverCheckTarget(serverURL string) string {
parsed, err := url.Parse(strings.TrimSpace(serverURL))
if err != nil {
return ""
}
host := parsed.Hostname()
if host == "" {
host = parsed.Host
}
if host == "" {
return ""
}
if ip := net.ParseIP(host); ip != nil {
return ip.String()
}
return strings.TrimSpace(host)
}
func processCommand(ctx context.Context, client *http.Client, cfg config, cmd command) {
output, exitCode := runCommand(ctx, cfg, cmd)
status := "completed"
+27
View File
@@ -78,3 +78,30 @@ rtt min/avg/max/mdev = 10.100/11.200/12.300/0.100 ms`
t.Fatalf("expected avg latency 11.2, got %v", latency)
}
}
func TestServerCheckTarget(t *testing.T) {
tests := map[string]string{
"http://10.10.10.10:18082": "10.10.10.10",
"https://rmm.daemonlord.ru": "rmm.daemonlord.ru",
"http://[2001:db8::1]:18082": "2001:db8::1",
"http://127.0.0.1:8080/path": "127.0.0.1",
"not a valid url": "",
}
for input, want := range tests {
if got := serverCheckTarget(input); got != want {
t.Fatalf("serverCheckTarget(%q) = %q, want %q", input, got, want)
}
}
}
func TestEffectiveCheckTargetsAddsServerTarget(t *testing.T) {
got := effectiveCheckTargets([]string{"1.1.1.1", "10.10.10.10", "1.1.1.1"}, "10.10.10.10")
if len(got) != 2 || got[0] != "1.1.1.1" || got[1] != "10.10.10.10" {
t.Fatalf("unexpected targets: %#v", got)
}
got = effectiveCheckTargets([]string{"1.1.1.1"}, "10.10.10.10")
if len(got) != 2 || got[1] != "10.10.10.10" {
t.Fatalf("expected server target to be appended, got %#v", got)
}
}