1
0
mirror of https://github.com/amir20/dozzle.git synced 2025-12-21 13:23:07 +01:00
Files
dozzle/internal/support/cli/clients.go
2025-02-13 13:31:25 -08:00

62 lines
2.2 KiB
Go

package cli
import (
"context"
"embed"
"github.com/amir20/dozzle/internal/container"
"github.com/amir20/dozzle/internal/docker"
container_support "github.com/amir20/dozzle/internal/support/container"
docker_support "github.com/amir20/dozzle/internal/support/docker"
"github.com/rs/zerolog/log"
)
func CreateMultiHostService(embeddedCerts embed.FS, args Args) *docker_support.MultiHostService {
var clients []container_support.ClientService
if len(args.RemoteHost) > 0 {
log.Info().Msg(`Consider using Dozzle's remote agent to manage remote hosts. See https://dozzle.dev/guide/agent for more information`)
}
for _, remoteHost := range args.RemoteHost {
host, err := container.ParseConnection(remoteHost)
if err != nil {
log.Fatal().Err(err).Interface("host", remoteHost).Msg("Could not parse remote host")
}
log.Info().Interface("host", host).Msg("Adding remote host")
if client, err := docker.NewRemoteClient(host); err == nil {
ctx, cancel := context.WithTimeout(context.Background(), args.Timeout)
defer cancel()
if _, err := client.ListContainers(ctx, args.Filter); err == nil {
clients = append(clients, docker_support.NewDockerClientService(client, args.Filter))
} else {
log.Warn().Err(err).Interface("host", host).Msg("Could not connect to remote host")
}
} else {
log.Warn().Err(err).Interface("host", host).Msg("Could not create remote client")
}
}
localClient, err := docker.NewLocalClient(args.Hostname)
if err == nil {
ctx, cancel := context.WithTimeout(context.Background(), args.Timeout)
defer cancel()
_, err := localClient.ListContainers(ctx, args.Filter)
if err != nil {
log.Debug().Err(err).Msg("Could not connect to local Docker Engine")
} else {
log.Debug().Msg("Adding local Docker Engine")
clients = append(clients, docker_support.NewDockerClientService(localClient, args.Filter))
}
go StartEvent(args, "server", localClient, "")
}
certs, err := ReadCertificates(embeddedCerts)
if err != nil {
log.Fatal().Err(err).Msg("Could not read certificates")
}
clientManager := docker_support.NewRetriableClientManager(args.RemoteAgent, args.Timeout, certs, clients...)
return docker_support.NewMultiHostService(clientManager, args.Timeout)
}