diff --git a/Makefile b/Makefile index 1a06482..903b7a3 100644 --- a/Makefile +++ b/Makefile @@ -19,7 +19,7 @@ release: clean deps ## Generate releases for unix systems do \ echo "Building $$os-$$arch"; \ mkdir -p build/webhook-$$os-$$arch/; \ - GOOS=$$os GOARCH=$$arch go build -o build/webhook-$$os-$$arch/webhook; \ + CGO_ENABLED=0 GOOS=$$os GOARCH=$$arch go build -o build/webhook-$$os-$$arch/webhook; \ tar cz -C build -f build/webhook-$$os-$$arch.tar.gz webhook-$$os-$$arch; \ done \ done diff --git a/README.md b/README.md index c9b43a5..279c494 100644 --- a/README.md +++ b/README.md @@ -18,9 +18,9 @@ If you use Mattermost or Slack, you can set up an "Outgoing webhook integration" Everything else is the responsibility of the command's author. ## Not what you're looking for? -| hookdoo | hookdeck | +| hookdoo | hookdeck | | :-: | :-: | -| Scriptable webhook gateway to safely run your custom builds, deploys, and proxy scripts on your servers. | Inspect, monitor and replay webhooks without the back and forth troubleshooting. | +| Scriptable webhook gateway to safely run your custom builds, deploys, and proxy scripts on your servers. | An event gateway to reliably ingest, verify, queue, transform, filter, inspect, monitor, and replay webhooks. | # Getting started diff --git a/docs/Hook-Examples.md b/docs/Hook-Examples.md index 7d07932..1b01ea4 100644 --- a/docs/Hook-Examples.md +++ b/docs/Hook-Examples.md @@ -498,7 +498,8 @@ A reference to the second item in the array would look like this: [ { "id": "sendgrid", - "execute-command": "{{ .Hookecho }}", + "execute-command": "/root/my-server/deployment.sh", + "command-working-directory": "/root/my-server", "trigger-rule": { "match": { "type": "value", diff --git a/images/hookdeck-black.svg b/images/hookdeck-black.svg new file mode 100644 index 0000000..962b07d --- /dev/null +++ b/images/hookdeck-black.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/images/hookdeck-white.svg b/images/hookdeck-white.svg new file mode 100644 index 0000000..19afbbf --- /dev/null +++ b/images/hookdeck-white.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/internal/hook/hook.go b/internal/hook/hook.go index 6699eeb..394dd79 100644 --- a/internal/hook/hook.go +++ b/internal/hook/hook.go @@ -13,12 +13,12 @@ import ( "errors" "fmt" "hash" - "io/ioutil" "log" "math" "net" "net/textproto" "os" + "path" "reflect" "regexp" "strconv" @@ -750,14 +750,18 @@ func (h *Hooks) LoadFromFile(path string, asTemplate bool) error { } // parse hook file for hooks - file, e := ioutil.ReadFile(path) + file, e := os.ReadFile(path) if e != nil { return e } if asTemplate { - funcMap := template.FuncMap{"getenv": getenv} + funcMap := template.FuncMap{ + "cat": cat, + "credential": credential, + "getenv": getenv, + } tmpl, err := template.New("hooks").Funcs(funcMap).Parse(string(file)) if err != nil { @@ -956,3 +960,27 @@ func compare(a, b string) bool { func getenv(s string) string { return os.Getenv(s) } + +// cat provides a template function to retrieve content of files +// Similarly to getenv, if no file is found, it returns the empty string +func cat(s string) string { + data, e := os.ReadFile(s) + + if e != nil { + return "" + } + + return strings.TrimSuffix(string(data), "\n") +} + +// credential provides a template function to retreive secrets using systemd's LoadCredential mechanism +func credential(s string) string { + dir := getenv("CREDENTIALS_DIRECTORY") + + // If no credential directory is found, fallback to the env variable + if dir == "" { + return getenv(s) + } + + return cat(path.Join(dir, s)) +}