81 lines
1.5 KiB
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()
|
|
}
|