docker-event-handler/handlers/handler.go

81 lines
1.5 KiB
Go

package handlers
import (
"git.ztn.sh/gwendolyn/docker-event-handler/events"
"bytes"
"errors"
"fmt"
"os/exec"
"text/template"
"github.com/google/shlex"
"github.com/ryanuber/go-glob"
"gopkg.in/ini.v1"
)
func ReadFromConfig(section *ini.Section) (Handler, error) {
switch section.Name() {
case "Container":
return readContainerFromConfig(section)
case "Network":
return readNetworkFromConfig(section)
case "Volume":
return readVolumeFromConfig(section)
default:
return nil, errors.New(fmt.Sprintf("unknown section %v", section.Name()))
}
}
type Handler interface {
Matches(event events.Event) bool
Invoke(event events.Event) error
}
func stringListMatches(list []string, subject string) bool {
if len(list) == 0 {
return true
}
for _, pattern := range list {
if glob.Glob(pattern, subject) {
return true
}
}
return false
}
func labelsMatch(want map[string]*string, has map[string]string) bool {
for key, val := range want {
actualVal, exists := has[key]
if !exists {
return false
}
if val != nil {
if actualVal != *val {
return false
}
}
}
return true
}
func runTemplatedScript(template *template.Template, data interface{}) error {
var cmdBuf bytes.Buffer
err := template.Execute(&cmdBuf, data)
if err != nil {
return err
}
parts, err := shlex.Split(cmdBuf.String())
if err != nil {
return err
}
if len(parts) < 1 {
return errors.New("no handler given")
}
name := parts[0]
args := parts[1:]
return exec.Command(name, args...).Run()
}