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