From f2c9e4d5577a3d7b351217e2c4a0db9cc337d6ce Mon Sep 17 00:00:00 2001 From: "sam@zm4210" Date: Sat, 10 Dec 2022 21:59:33 +0800 Subject: [PATCH] =?UTF-8?q?sq:=20webhookd=E9=9B=86=E6=88=90=20---=20./logs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ~~webhookd集成 22.12.12~~ +scripts if hook.MuxHandle(r, prefix) cp hook go mod:+webhookd notes mu.Lock; 非goRoutine时多个则锁死. - webhookd集成 --- .gitignore | 3 +- cmd/main.go | 6 ++ go.mod | 1 + go.sum | 22 ++++- hook/helper.go | 50 +++++++++++ hook/hook.go | 210 +++++++++++++++++++++++++++++++++++++++++++++++ logs/.gitkeep | 0 merger/merge.go | 6 +- sam-custom.md | 4 + scripts/async.sh | 10 +++ scripts/echo.js | 19 +++++ scripts/echo.sh | 15 ++++ scripts/long.sh | 12 +++ 13 files changed, 351 insertions(+), 7 deletions(-) create mode 100644 hook/helper.go create mode 100644 hook/hook.go create mode 100644 logs/.gitkeep create mode 100755 scripts/async.sh create mode 100755 scripts/echo.js create mode 100755 scripts/echo.sh create mode 100755 scripts/long.sh diff --git a/.gitignore b/.gitignore index 10da789..444d1a9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .idea -prometheus-exporter-merger* \ No newline at end of file +prometheus-exporter-merger* +/logs/*.txt \ No newline at end of file diff --git a/cmd/main.go b/cmd/main.go index 0f84143..61989b5 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -11,6 +11,7 @@ import ( prom "github.com/prometheus/client_model/go" "github.com/vadv/prometheus-exporter-merger/merger" + "github.com/vadv/prometheus-exporter-merger/hook" sercmd "gitee.com/g-devops/chisel-poll/chserver/cmd" // clicmd "gitee.com/g-devops/chisel-poll/chclient/cmd" @@ -44,6 +45,11 @@ func Execute() { r := mux.NewRouter() prefix:= "/api/endpoints" reverseTunnelService:= sercmd.MuxHandle(r, prefix) + + prefix= "/api/hook" + hook.SetVars(prefix) + hook.MuxHandle(r, prefix) + r.PathPrefix("/").Handler(&handler{m: m}) //m.设置ReverseTunnelService m.AddChiselService(reverseTunnelService) diff --git a/go.mod b/go.mod index b813e9c..94a9fd4 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ go 1.14 require ( gitee.com/g-devops/chisel-poll v0.0.0-20221202080939-ed5d76c30d93 github.com/gorilla/mux v1.7.3 + github.com/ncarlier/webhookd v1.15.1 github.com/pkg/errors v0.8.1 github.com/prometheus/client_model v0.2.0 //v1 github.com/prometheus/common v0.10.0 //old? diff --git a/go.sum b/go.sum index 26966b4..33e5abc 100644 --- a/go.sum +++ b/go.sum @@ -12,6 +12,7 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/go-fed/httpsig v1.1.0/go.mod h1:RCMrTZvN1bJYtofsG4rd5NaO5obxQ5xBkdiS7xsT7bM= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= @@ -37,11 +38,15 @@ github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCV github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/ncarlier/webhookd v1.15.1 h1:fkxOgkwV0oIqercoMiYeHnQeH4iJoLLnDaSBAU/r6RY= +github.com/ncarlier/webhookd v1.15.1/go.mod h1:EZNEbnBEHJTG+bx/1QkIRvhYbKqSWwr4+1wAARAriM0= github.com/orcaman/concurrent-map v0.0.0-20190826125027-8c72a8bb44f6 h1:lNCW6THrCKBiJBpz8kbVGjC7MgdCGKwuvBgc7LoD6sw= github.com/orcaman/concurrent-map v0.0.0-20190826125027-8c72a8bb44f6/go.mod h1:Lu3tH6HLW3feq74c2GC+jIMS/K2CFcDWnWD9XkenwhI= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -71,13 +76,16 @@ github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce h1:fb190+cK2Xz/dvi9 github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59 h1:3zb4D3T4G8jdExgVU/95+vQXfpEPiMdCaZgmGVxjNHM= golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20211202192323-5770296d904e h1:MUP6MR3rJ7Gk9LEia0LP2ytiH6MuCfs7qYz+47jGdD8= +golang.org/x/crypto v0.0.0-20211202192323-5770296d904e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 h1:YUO/7uOKsKeq9UokNS62b8FYywz3ker1l1vDZRCRefw= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -88,9 +96,17 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d h1:nc5K6ox/4lTFbMVSL9WRR81ixkcwXThoiF6yf+R9scA= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/hook/helper.go b/hook/helper.go new file mode 100644 index 0000000..b19fb20 --- /dev/null +++ b/hook/helper.go @@ -0,0 +1,50 @@ +package hook + +import ( + "bytes" + "fmt" + "net/http" + "net/url" + "strings" + "time" + + "github.com/ncarlier/webhookd/pkg/strcase" +) + +// URLValuesToShellVars convert URL values to shell vars. +func URLValuesToShellVars(q url.Values) []string { + var params []string + for k, v := range q { + var buf bytes.Buffer + value, err := url.QueryUnescape(strings.Join(v[:], ",")) + if err != nil { + continue + } + buf.WriteString(strcase.ToSnake(k)) + buf.WriteString("=") + buf.WriteString(value) + params = append(params, buf.String()) + } + return params +} + +// HTTPHeadersToShellVars convert HTTP headers to shell vars. +func HTTPHeadersToShellVars(h http.Header) []string { + var params []string + for k, v := range h { + var buf bytes.Buffer + value, err := url.QueryUnescape(strings.Join(v[:], ",")) + if err != nil { + continue + } + buf.WriteString(strcase.ToSnake(k)) + buf.WriteString("=") + buf.WriteString(value) + params = append(params, buf.String()) + } + return params +} + +func nextRequestID() string { + return fmt.Sprintf("%d", time.Now().UnixNano()) +} diff --git a/hook/hook.go b/hook/hook.go new file mode 100644 index 0000000..ef87f34 --- /dev/null +++ b/hook/hook.go @@ -0,0 +1,210 @@ +package hook + +import ( + "io" + "path" + "mime" + "strings" + "strconv" + "io/ioutil" + "encoding/json" + "path/filepath" + + "fmt" + "net/http" + "github.com/gorilla/mux" + "github.com/ncarlier/webhookd/pkg/hook" + "github.com/ncarlier/webhookd/pkg/logger" + "github.com/ncarlier/webhookd/pkg/worker" + // "gitee.com/infrastlabs/hostcross/api/config" +) + + +var ( + defaultTimeout int + scriptDir string + scriptPath string + outputDir string +) + +func SetVars(prefix string){ + defaultTimeout= 10 + scriptDir= "scripts" //"/_ext/working/_ee/fk-webhookd/hostcross/scripts" + scriptPath= prefix //"/aa/hook" + outputDir= "logs" +} + +func MuxHandle(ru *mux.Router, prefix string) { + logger.Init("info", "out") + // logger.Init("info") + worker.StartDispatcher(2) + ru.PathPrefix(prefix).Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // getWebhookLog(w, r) + if r.Method == "GET" { + // http://172.17.0.21:18089/aa/hook/echo.sh/3 + if _, err := strconv.Atoi(filepath.Base(r.URL.Path)); err == nil { + getWebhookLog(w, r) + return + } + } + triggerWebhook(w, r) + })) +} + +func triggerWebhook(w http.ResponseWriter, r *http.Request) { + // Check that streaming is supported + flusher, ok := w.(http.Flusher) + if !ok { + http.Error(w, "streaming not supported", http.StatusInternalServerError) + return + } + + // Get hook location + hookName := strings.TrimPrefix(r.URL.Path, scriptPath+"/") + if hookName == "" { + infoHandler(w, r) + return + } + _, err := hook.ResolveScript(scriptDir, hookName) + if err != nil { + logger.Error.Println(err.Error()) + http.Error(w, "hook not found", http.StatusNotFound) + return + } + + if err = r.ParseForm(); err != nil { + logger.Error.Printf("error reading from-data: %v", err) + http.Error(w, "unable to parse request form", http.StatusBadRequest) + return + } + + // parse body + var body []byte + ct := r.Header.Get("Content-Type") + if ct != "" { + mediatype, _, _ := mime.ParseMediaType(ct) + if strings.HasPrefix(mediatype, "text/") || mediatype == "application/json" { + body, err = ioutil.ReadAll(r.Body) + if err != nil { + logger.Error.Printf("error reading body: %v", err) + http.Error(w, "unable to read request body", http.StatusBadRequest) + return + } + } + } + + params := URLValuesToShellVars(r.Form) + params = append(params, HTTPHeadersToShellVars(r.Header)...) + + // logger.Debug.Printf("API REQUEST: \"%s\" with params %s...\n", p, params) + + // Create work + timeout := atoiFallback(r.Header.Get("X-Hook-Timeout"), defaultTimeout) + job, err := hook.NewHookJob(&hook.Request{ + Name: hookName, + Method: r.Method, + Payload: string(body), + Args: params, + Timeout: timeout, + BaseDir: scriptDir, + OutputDir: outputDir, + }) + if err != nil { + logger.Error.Printf("error creating hook job: %v", err) + http.Error(w, "unable to create hook job", http.StatusInternalServerError) + return + } + /* http.Error(w, "hook not found111", http.StatusNotFound) + return */ + + // Put work in queue + worker.WorkQueue <- job + + // Use content negotiation to enable Server-Sent Events + useSSE := r.Method == "GET" && r.Header.Get("Accept") == "text/event-stream" + if useSSE { + // Send SSE response + w.Header().Set("Content-Type", "text/event-stream") + } else { + // Send chunked response + w.Header().Set("X-Content-Type-Options", "nosniff") + } + w.Header().Set("Cache-Control", "no-cache") + w.Header().Set("Connection", "keep-alive") + w.Header().Set("X-Hook-ID", strconv.FormatUint(job.ID(), 10)) + + for { + msg, open := <-job.MessageChan + if !open { + break + } + if useSSE { + fmt.Fprintf(w, "data: %s\n\n", msg) // Send SSE response + } else { + fmt.Fprintf(w, "%s\n", msg) // Send chunked response + } + // Flush the data immediately instead of buffering it for later. + flusher.Flush() + } +} +func atoiFallback(str string, fallback int) int { + if value, err := strconv.Atoi(str); err == nil && value > 0 { + return value + } + return fallback +} + +// http://172.17.0.21:18089/aa/hook/echo.sh/3 +func getWebhookLog(w http.ResponseWriter, r *http.Request) { + // Get hook ID + id := path.Base(r.URL.Path) + fmt.Println(r.URL.Path) + fmt.Println(id) + + // Get script location + hookName := path.Dir(strings.TrimPrefix(r.URL.Path, scriptPath+"/")) + // hookName= "echo.sh" + fmt.Println("hookName: "+hookName) + _, err := hook.ResolveScript(scriptDir, hookName) + if err != nil { + logger.Error.Println(err.Error()) + http.Error(w, err.Error(), http.StatusNotFound) + return + } + + // Retrieve log file + logFile, err := hook.Logs(id, hookName, outputDir) + if err != nil { + logger.Error.Println(err.Error()) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + if logFile == nil { + http.Error(w, "job not found", http.StatusNotFound) + return + } + defer logFile.Close() + + w.Header().Set("Content-Type", "text/plain") + + io.Copy(w, logFile) +} + +// Info API informations model structure. +type Info struct { + Name string `json:"name"` + Version string `json:"version"` +} +func infoHandler(w http.ResponseWriter, r *http.Request) { + info := Info{ + Name: "webhookd", + Version: "config.Version", + } + data, err := json.Marshal(info) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.Header().Set("Content-Type", "application/json") + w.Write(data) +} diff --git a/logs/.gitkeep b/logs/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/merger/merge.go b/merger/merge.go index b87e16a..20beb3a 100644 --- a/merger/merge.go +++ b/merger/merge.go @@ -122,7 +122,7 @@ func (m *merger) merge(ctx context.Context, w io.Writer) error { } func (m *merger) tunMerge(result map[string]*prom.MetricFamily) error { - mu := &sync.Mutex{} + // mu := &sync.Mutex{} detailsMap := m.ReverseTunnelService.GetTunnelDetailsMap() for item := range detailsMap.IterBuffered() { epID:= item.Key @@ -179,8 +179,8 @@ func (m *merger) tunMerge(result map[string]*prom.MetricFamily) error { // fmt.Println("out: ", out) // 按out依次解析name - mu.Lock() - defer mu.Unlock() + // mu.Lock() //just loop 不用锁 + // defer mu.Unlock() for name, metricFamily := range out { // append labels if len(labels) > 0 { diff --git a/sam-custom.md b/sam-custom.md index b59bced..4a680f5 100644 --- a/sam-custom.md +++ b/sam-custom.md @@ -4,6 +4,7 @@ - merger ~~ep节点容错~~; ~~追加dash-id配置参数指标~~ - ~~chserver,取tunMap信息~~, ~~获取node_exp指标(unixDomainSock) 22.12.10~~ +- ~~webhookd集成 22.12.12~~ - - merger.json动态加载; conf:支持读取unixDomainSock - ~~node_exporter~~, flag参数; > mids_exporter绑定到本地uds @@ -14,6 +15,9 @@ https://github.com/prometheus/client_model #v1.x 旧版本 # chisel-uds curl -fSL --unix-socket /tmp/chserver-sock/10002-tmp-node-exporter1.sock http://localhost/metrics + +# hook +http://172.17.0.21:8089/api/hook/echo?msg=merger ``` **Chisel** diff --git a/scripts/async.sh b/scripts/async.sh new file mode 100755 index 0000000..3575c79 --- /dev/null +++ b/scripts/async.sh @@ -0,0 +1,10 @@ +#!/bin/bash + + +echo "Starting background job..." + +nohup ./scripts/long.sh >/tmp/long.log 2>&1 & + +echo "Background job started." + + diff --git a/scripts/echo.js b/scripts/echo.js new file mode 100755 index 0000000..27f29c9 --- /dev/null +++ b/scripts/echo.js @@ -0,0 +1,19 @@ +#!/usr/bin/env node + +const os = require('os') + +// Usage: http POST :8080/examples/echo.js msg==hello foo=bar + +console.log("This is a simple echo hook using NodeJS.") + +const { hook_name, hook_id , user_agent, msg} = process.env + +console.log(`Hook information: name=${hook_name}, id=${hook_id}`) + +console.log("Hostname=", os.hostname()) + +console.log(`User-Agent=${user_agent}`) + +console.log(`msg=${msg}`) + +console.log("body=", process.argv) diff --git a/scripts/echo.sh b/scripts/echo.sh new file mode 100755 index 0000000..02863c0 --- /dev/null +++ b/scripts/echo.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +# Usage: http POST :8080/echo msg==hello foo=bar + +echo "This is a simple echo hook." + +echo "Hook information: name=$hook_name, id=$hook_id, method=$hook_method" + +echo "Command result: hostname=`hostname`" + +echo "Header variable: User-Agent=$user_agent" + +echo "Query parameter: msg=$msg" + +echo "Body payload: $1" diff --git a/scripts/long.sh b/scripts/long.sh new file mode 100755 index 0000000..620f342 --- /dev/null +++ b/scripts/long.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +echo "Running long script..." + +for i in {1..20}; do + sleep 1 + echo "running ${i} ..." +done + +echo "Long script end" + +exit 0