Accountant: Inventar, where, Checkmk, Abrechnung

This commit is contained in:
br committed 2026-10-18 17:08:58 +02:00
1 parent 9f16148cde
commit dd93277750
59 files changed
+7522 -113

No files matched your search

+18 -8
View File
@@ -17,6 +17,7 @@ import (
"fmt"
"io"
"log/slog"
"net"
"net/http"
"os"
"path/filepath"
@@ -42,6 +43,7 @@ type Config struct {
Token string // Einladung, nur beim ersten Start
NodeID string // Default aus dem Hostnamen
Hostname string // Default os.Hostname()
FQDN string // Default automatisch (detectFQDN); nur Information für das Inventar
DockerSocket string // Default /var/run/docker.sock; "none" schaltet Docker ab
BackendHost string // Adresse, unter der der Ingress die Dienste erreicht
@@ -65,6 +67,7 @@ type Agent struct {
signer *auth.Signer
id Identity
serverURL string // tatsächlich genutzte Adresse (Override oder node.json)
fqdn string // in Run ermittelt
mu sync.Mutex
fileSpecs []ServiceSpec
@@ -144,6 +147,7 @@ func (a *Agent) Run(ctx context.Context) error {
if err != nil {
return err
}
a.fqdn = detectFQDN(ctx, net.DefaultResolver, a.cfg.FQDN, a.cfg.Hostname, host)
hc := a.httpClient()
a.runCtx = ctx
// Abgebrochener Schlüsselwechsel? Vor dem Verbinden abschließen.
@@ -153,7 +157,7 @@ func (a *Agent) Run(ctx context.Context) error {
}
}
a.log.Info("Agent gestartet", "node", a.id.NodeID, "server", a.serverURL, "backend", host,
"docker", a.cfg.DockerSocket, "config_dir", a.cfg.ConfigDir)
"fqdn", a.fqdn, "docker", a.cfg.DockerSocket, "config_dir", a.cfg.ConfigDir)
trigger := make(chan struct{}, 1)
kick := func() {
@@ -235,23 +239,28 @@ func (a *Agent) sendLoop(ctx context.Context, hc *http.Client, host string, trig
// gesendet (sonst würden alle Container-Routen entfernt).
func (a *Agent) collect(ctx context.Context, host string) (registry.NodeState, error) {
state := registry.NodeState{Workloads: []registry.Workload{}}
var client *docker.Client
if a.dockerAvailable() {
client := &docker.Client{Socket: a.cfg.DockerSocket}
client = &docker.Client{Socket: a.cfg.DockerSocket}
containers, err := client.List(ctx)
if err != nil {
return state, err
}
// Gestoppte Container nennen in der Liste keine Ports.
// Startzeit und Health stehen nur in den Details; gestoppte Container
// nennen ihre Ports ebenfalls nur dort.
for i, c := range containers {
if c.State == "running" || !enabled(c.Labels) {
if !enabled(c.Labels) {
continue
}
ports, err := client.PortBindings(ctx, c.ID)
d, err := client.Inspect(ctx, c.ID)
if err != nil {
a.log.Debug("Portzuordnung nicht lesbar", "container", c.Name(), "err", err)
continue // inzwischen entfernt o. Ä. → Workloads warnt
a.log.Debug("Container-Details nicht lesbar", "container", c.Name(), "err", err)
continue // inzwischen entfernt o. Ä. → Workloads warnt ggf.
}
containers[i].StartedAt, containers[i].Health = d.StartedAt, d.Health
if c.State != "running" {
containers[i].Ports = d.Ports
}
containers[i].Ports = ports
}
ws, down, warnings := Workloads(containers, host)
for _, w := range warnings {
@@ -265,6 +274,7 @@ func (a *Agent) collect(ctx context.Context, host string) (registry.NodeState, e
a.mu.Unlock()
state.Workloads = append(state.Workloads, FileWorkloads(specs, host)...)
state.DownServices = append(state.DownServices, a.health.down()...)
state.Host = a.hostInfo(ctx, client)
return state, nil
}