return command output, pass whole payload as json to the command

This commit is contained in:
Adnan Hajdarevic 2015-06-06 14:19:52 +02:00
parent f1ebc440a4
commit 9c545a745f
4 changed files with 94 additions and 44 deletions

View file

@ -1,4 +1,4 @@
//+build windows
//+build !windows
package main
@ -38,6 +38,7 @@ var (
key = flag.String("key", "key.pem", "path to the HTTPS certificate private key pem file")
watcher *fsnotify.Watcher
signals chan os.Signal
hooks hook.Hooks
)
@ -154,7 +155,7 @@ func hookHandler(w http.ResponseWriter, r *http.Request) {
contentType := r.Header.Get("Content-Type")
if strings.HasPrefix(contentType, "application/json") {
if strings.Contains(contentType, "json") {
decoder := json.NewDecoder(strings.NewReader(string(body)))
decoder.UseNumber()
@ -163,7 +164,7 @@ func hookHandler(w http.ResponseWriter, r *http.Request) {
if err != nil {
log.Printf("error parsing JSON payload %+v\n", err)
}
} else if strings.HasPrefix(contentType, "application/x-www-form-urlencoded") {
} else if strings.Contains(contentType, "form") {
fd, err := url.ParseQuery(string(body))
if err != nil {
log.Printf("error parsing form payload %+v\n", err)
@ -173,16 +174,18 @@ func hookHandler(w http.ResponseWriter, r *http.Request) {
}
// handle hook
for _, hook := range matchedHooks {
hook.ParseJSONParameters(&headers, &query, &payload)
for _, h := range matchedHooks {
h.ParseJSONParameters(&headers, &query, &payload)
if h.TriggerRule == nil || h.TriggerRule != nil && h.TriggerRule.Evaluate(&headers, &query, &payload, &body) {
log.Printf("%s hook triggered successfully\n", h.ID)
if hook.TriggerRule == nil || hook.TriggerRule != nil && hook.TriggerRule.Evaluate(&headers, &query, &payload, &body) {
log.Printf("%s hook triggered successfully\n", hook.ID)
go handleHook(hook, &headers, &query, &payload, &body)
// send the hook defined response message
fmt.Fprintf(w, hook.ResponseMessage)
if !h.CaptureCommandOutput {
go handleHook(h, &headers, &query, &payload, &body)
fmt.Fprintf(w, h.ResponseMessage)
} else {
response := handleHook(h, &headers, &query, &payload, &body)
fmt.Fprintf(w, response)
}
return
}
@ -199,22 +202,35 @@ func hookHandler(w http.ResponseWriter, r *http.Request) {
}
}
func handleHook(hook *hook.Hook, headers, query, payload *map[string]interface{}, body *[]byte) {
cmd := exec.Command(hook.ExecuteCommand)
cmd.Args = hook.ExtractCommandArguments(headers, query, payload)
cmd.Dir = hook.CommandWorkingDirectory
func handleHook(h *hook.Hook, headers, query, payload *map[string]interface{}, body *[]byte) string {
cmd := exec.Command(h.ExecuteCommand)
cmd.Args = h.ExtractCommandArguments(headers, query, payload)
cmd.Dir = h.CommandWorkingDirectory
log.Printf("executing %s (%s) with arguments %s using %s as cwd\n", hook.ExecuteCommand, cmd.Path, cmd.Args, cmd.Dir)
log.Printf("executing %s (%s) with arguments %s using %s as cwd\n", h.ExecuteCommand, cmd.Path, cmd.Args, cmd.Dir)
out, err := cmd.Output()
out, err := cmd.CombinedOutput()
log.Printf("stdout: %s\n", out)
log.Printf("command output: %s\n", out)
var errorResponse string
if err != nil {
log.Printf("stderr: %+v\n", err)
log.Printf("error occurred: %+v\n", err)
errorResponse = fmt.Sprintf("%+v", err)
}
log.Printf("finished handling %s\n", hook.ID)
log.Printf("finished handling %s\n", h.ID)
var response []byte
response, err = json.Marshal(&hook.CommandStatusResponse{ResponseMessage: h.ResponseMessage, Output: string(out), Error: errorResponse})
if err != nil {
log.Printf("error marshalling response: %+v", err)
return h.ResponseMessage
}
return string(response)
}
func reloadHooks() {