docker-event-handler/main.go

105 lines
2.2 KiB
Go
Raw Permalink Normal View History

2022-03-22 19:27:39 +01:00
package main
import (
2022-03-25 12:40:13 +01:00
"git.ztn.sh/gwendolyn/docker-event-handler/events"
"git.ztn.sh/gwendolyn/docker-event-handler/handlers"
2022-03-25 12:17:05 +01:00
"context"
2022-03-22 19:27:39 +01:00
"log"
"os"
"strconv"
"time"
"github.com/docker/docker/api/types"
2022-03-24 21:51:50 +01:00
dockerEvents "github.com/docker/docker/api/types/events"
2022-03-25 12:17:05 +01:00
"github.com/docker/docker/api/types/filters"
2022-03-22 19:27:39 +01:00
"github.com/docker/docker/client"
2022-03-25 12:17:05 +01:00
"gopkg.in/ini.v1"
2022-03-22 19:27:39 +01:00
)
type Configuration struct {
2022-03-24 21:51:50 +01:00
handlers []handlers.Handler
2022-03-22 19:27:39 +01:00
}
2022-03-24 21:51:50 +01:00
func handleEvent(dockerClient *client.Client, event dockerEvents.Message, handlers []handlers.Handler) {
e := events.Make(event, dockerClient)
2022-03-22 19:27:39 +01:00
2022-03-24 21:51:50 +01:00
if e == nil {
2022-03-22 19:27:39 +01:00
return
}
2022-03-24 21:51:50 +01:00
log.Printf("%T%+v", e, e)
2022-03-22 19:27:39 +01:00
for _, handler := range handlers {
2022-03-24 21:51:50 +01:00
if handler.Matches(e) {
err := handler.Invoke(e)
2022-03-22 19:27:39 +01:00
if err != nil {
log.Printf("error invoking handler: %v", err)
}
}
}
}
func readConfiguration(path string) (Configuration, error) {
var config Configuration
cfg, err := ini.LoadSources(ini.LoadOptions{
AllowNonUniqueSections: true,
AllowShadows: true,
}, path)
if err != nil {
return config, err
}
for _, section := range cfg.Sections() {
2022-03-24 21:51:50 +01:00
if section.Name() == "DEFAULT" {
continue
}
handler, err := handlers.ReadFromConfig(section)
if err != nil {
return config, err
2022-03-22 19:27:39 +01:00
}
2022-03-24 21:51:50 +01:00
config.handlers = append(config.handlers, handler)
2022-03-22 19:27:39 +01:00
}
return config, nil
}
func main() {
configPath := "/etc/docker-event-handler.conf"
if len(os.Args) > 1 {
if len(os.Args) > 2 {
log.Fatal("too many arguments")
}
configPath = os.Args[1]
}
config, err := readConfiguration(configPath)
if err != nil {
log.Fatal("configuration parsing failed", err)
}
dockerClient, err := client.NewClientWithOpts(client.WithAPIVersionNegotiation())
if err != nil {
log.Fatal("docker connection failed", err)
}
evs, errs := dockerClient.Events(context.TODO(), types.EventsOptions{
Since: strconv.FormatInt(time.Now().Unix(), 10),
Filters: filters.NewArgs(
2022-03-24 21:51:50 +01:00
filters.Arg("type", dockerEvents.ContainerEventType),
filters.Arg("type", dockerEvents.NetworkEventType),
filters.Arg("type", dockerEvents.VolumeEventType),
2022-03-22 19:27:39 +01:00
),
})
for {
select {
case err := <-errs:
log.Fatal("event stream failed", err)
case event := <-evs:
handleEvent(dockerClient, event, config.handlers)
}
}
}