package docker import ( "context" "gitea.d3m0k1d.ru/d3m0k1d/HellreigN/agent/internal/models" "gitea.d3m0k1d.ru/d3m0k1d/HellreigN/agent/internal/monitor" "github.com/moby/moby/api/types/container" moby "github.com/moby/moby/client" "github.com/samber/lo" ) var _ monitor.ServiceMonitor = new(DockerMonitor) type DockerMonitor struct{} func New() *DockerMonitor { return &DockerMonitor{} } func (self *DockerMonitor) CheckServices(ctx context.Context) ([]models.Service, error) { client, err := moby.New(moby.FromEnv) if err != nil { return nil, err } ctrs, err := client.ContainerList(ctx, moby.ContainerListOptions{ Size: false, All: false, Limit: 0, Filters: moby.Filters{}, Latest: false, }) if err != nil { return nil, err } return lo.Map(ctrs.Items, func(item container.Summary, _ int) models.Service { return models.Service{ Name: lo.If(len(item.Names) > 0, item.Names[0]).Else(item.ID), Status: mapContainerState(string(item.State)), } }), nil } // mapContainerState maps Docker container states to unified ServiceStatus. func mapContainerState(state string) models.ServiceStatus { switch state { case "running": return models.StatusRunning case "exited", "dead": return models.StatusStopped case "paused": return models.StatusDegraded case "restarting", "created", "removing": return models.StatusPending default: return models.StatusUnknown } }