Stream command output to logger
This commit is contained in:
parent
34ae132930
commit
16fed53a7b
46
webhook.go
46
webhook.go
@ -1,9 +1,12 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
@ -12,6 +15,7 @@ import (
|
|||||||
"os/exec"
|
"os/exec"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/adnanh/webhook/hook"
|
"github.com/adnanh/webhook/hook"
|
||||||
@ -401,10 +405,46 @@ func handleHook(h *hook.Hook, rid string, headers, query, payload *map[string]in
|
|||||||
|
|
||||||
log.Printf("[%s] executing %s (%s) with arguments %q and environment %s using %s as cwd\n", rid, h.ExecuteCommand, cmd.Path, cmd.Args, envs, cmd.Dir)
|
log.Printf("[%s] executing %s (%s) with arguments %q and environment %s using %s as cwd\n", rid, h.ExecuteCommand, cmd.Path, cmd.Args, envs, cmd.Dir)
|
||||||
|
|
||||||
out, err := cmd.CombinedOutput()
|
stdout, err := cmd.StdoutPipe()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
stderr, err := cmd.StderrPipe()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
if err := cmd.Start(); err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
log.Printf("[%s] command output: %s\n", rid, out)
|
var out bytes.Buffer
|
||||||
|
|
||||||
|
teeout := io.TeeReader(stdout, &out)
|
||||||
|
teeerr := io.TeeReader(stderr, &out)
|
||||||
|
|
||||||
|
var wg sync.WaitGroup
|
||||||
|
wg.Add(2)
|
||||||
|
|
||||||
|
logOut := func(out io.Reader, rid string) {
|
||||||
|
in := bufio.NewScanner(out)
|
||||||
|
|
||||||
|
for in.Scan() {
|
||||||
|
outln := in.Text()
|
||||||
|
log.Printf("[%s] command output: %s\n", rid, outln)
|
||||||
|
}
|
||||||
|
if err := in.Err(); err != nil {
|
||||||
|
log.Printf("[%s] error occurred: %+v\n", rid, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
wg.Done()
|
||||||
|
}
|
||||||
|
|
||||||
|
go logOut(teeout, rid)
|
||||||
|
go logOut(teeerr, rid)
|
||||||
|
|
||||||
|
wg.Wait()
|
||||||
|
|
||||||
|
err = cmd.Wait()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("[%s] error occurred: %+v\n", rid, err)
|
log.Printf("[%s] error occurred: %+v\n", rid, err)
|
||||||
}
|
}
|
||||||
@ -421,7 +461,7 @@ func handleHook(h *hook.Hook, rid string, headers, query, payload *map[string]in
|
|||||||
|
|
||||||
log.Printf("[%s] finished handling %s\n", rid, h.ID)
|
log.Printf("[%s] finished handling %s\n", rid, h.ID)
|
||||||
|
|
||||||
return string(out), err
|
return out.String(), err
|
||||||
}
|
}
|
||||||
|
|
||||||
func writeHttpResponseCode(w http.ResponseWriter, rid string, hookId string, responseCode int) {
|
func writeHttpResponseCode(w http.ResponseWriter, rid string, hookId string, responseCode int) {
|
||||||
|
Loading…
Reference in New Issue
Block a user