Files
HellreigN/agent/internal/monitor/docker/impl.go
T

59 lines
1.4 KiB
Go

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
}
}