From 94c0dfa2a02bdcf80ccc857afb4d0bde3f80ea1c Mon Sep 17 00:00:00 2001 From: AJ ONeal Date: Mon, 24 Jun 2019 20:00:01 -0600 Subject: [PATCH] noop file and type refactor --- cmd/watchdog/watchdog.go | 2 +- go.sum | 2 - watchdog.go | 176 ++++++++++++++++++++------------------- 3 files changed, 91 insertions(+), 89 deletions(-) diff --git a/cmd/watchdog/watchdog.go b/cmd/watchdog/watchdog.go index 48a8abe..db98cf7 100644 --- a/cmd/watchdog/watchdog.go +++ b/cmd/watchdog/watchdog.go @@ -69,7 +69,7 @@ func main() { done := make(chan struct{}, 1) - allWebhooks := make(map[string]watchdog.ConfigWebhook) + allWebhooks := make(map[string]watchdog.Webhook) for i := range config.Webhooks { h := config.Webhooks[i] diff --git a/go.sum b/go.sum index d2c4ce5..a3bc5b9 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,2 @@ -git.rootprojects.org/root/go-gitver v1.1.0 h1:ANQUnUXYgbDR+WaMcI+PQQjLnxlCbAZCD/zivkrf8fY= -git.rootprojects.org/root/go-gitver v1.1.0/go.mod h1:Rj1v3TBhvdaSphFEqMynUYwAz/4f+wY/+syBTvRrmlI= git.rootprojects.org/root/go-gitver v1.1.1 h1:5b0lxnTYnft5hqpln0XCrJaGPH0SKzhPaazVAvAlZ8I= git.rootprojects.org/root/go-gitver v1.1.1/go.mod h1:Rj1v3TBhvdaSphFEqMynUYwAz/4f+wY/+syBTvRrmlI= diff --git a/watchdog.go b/watchdog.go index 7cb1890..4493674 100644 --- a/watchdog.go +++ b/watchdog.go @@ -20,7 +20,7 @@ type Dog struct { Keywords string Recover string Webhooks []string - AllWebhooks map[string]ConfigWebhook + AllWebhooks map[string]Webhook Logger chan string error error failures int @@ -172,94 +172,98 @@ func (d *Dog) notify(hardFail bool) { continue } - // TODO do this in main on config init - if "" == h.Method { - h.Method = "POST" - } - - var body *strings.Reader - var err error - // TODO real templates - if 0 != len(h.Form) { - form := url.Values{} - for k := range h.Form { - v := h.Form[k] - // because `{{` gets urlencoded - //k = strings.Replace(k, "{{ .Name }}", d.Name, -1) - v = strings.Replace(v, "{{ .Name }}", d.Name, -1) - d.Logger <- fmt.Sprintf("[HEADER] %s: %s", k, v) - form.Set(k, v) - } - body = strings.NewReader(form.Encode()) - } else if 0 != len(h.JSON) { - bodyBuf, err := json.Marshal(h.JSON) - if nil != err { - d.Logger <- fmt.Sprintf("[Notify] JSON Marshal Error for '%s': %s", h.Name, err) - continue - } - // `{{` should be left alone - body = strings.NewReader(strings.Replace(string(bodyBuf), "{{ .Name }}", d.Name, -1)) - } - - client := NewHTTPClient() - req, err := http.NewRequest(h.Method, h.URL, body) - if nil != err { - d.Logger <- fmt.Sprintf("[Notify] HTTP Client Network Error for '%s': %s", h.Name, err) - continue - } - - if 0 != len(h.Form) { - req.Header.Set("Content-Type", "application/x-www-form-urlencoded") - } else if 0 != len(h.JSON) { - req.Header.Set("Content-Type", "application/json") - } - - if 0 != len(h.Auth) { - user := h.Auth["user"] - if "" == user { - user = h.Auth["username"] - } - pass := h.Auth["pass"] - if "" == user { - pass = h.Auth["password"] - } - req.SetBasicAuth(user, pass) - } - - req.Header.Set("User-Agent", "Watchdog/1.0") - for k := range h.Headers { - req.Header.Set(k, h.Headers[k]) - } - - resp, err := client.Do(req) - if nil != err { - d.Logger <- fmt.Sprintf("[Notify] HTTP Client Error for '%s': %s", h.Name, err) - continue - } - - if !(resp.StatusCode >= 200 && resp.StatusCode < 300) { - d.Logger <- fmt.Sprintf("[Notify] Response Error for '%s': %s", h.Name, resp.Status) - continue - } - - // TODO json vs xml vs txt - var data map[string]interface{} - req.Header.Add("Accept", "application/json") - decoder := json.NewDecoder(resp.Body) - err = decoder.Decode(&data) - if err != nil { - d.Logger <- fmt.Sprintf("[Notify] Response Body Error for '%s': %s", h.Name, resp.Status) - continue - } - - // TODO some sort of way to determine if data is successful (keywords) - d.Logger <- fmt.Sprintf("[Notify] Success? %#v", data) + d.notifyOne(h, hardFail) } } +func (d *Dog) notifyOne(h Webhook, hardFail bool) { + // TODO do this in main on config init + if "" == h.Method { + h.Method = "POST" + } + + var body *strings.Reader + var err error + // TODO real templates + if 0 != len(h.Form) { + form := url.Values{} + for k := range h.Form { + v := h.Form[k] + // because `{{` gets urlencoded + //k = strings.Replace(k, "{{ .Name }}", d.Name, -1) + v = strings.Replace(v, "{{ .Name }}", d.Name, -1) + d.Logger <- fmt.Sprintf("[HEADER] %s: %s", k, v) + form.Set(k, v) + } + body = strings.NewReader(form.Encode()) + } else if 0 != len(h.JSON) { + bodyBuf, err := json.Marshal(h.JSON) + if nil != err { + d.Logger <- fmt.Sprintf("[Notify] JSON Marshal Error for '%s': %s", h.Name, err) + return + } + // `{{` should be left alone + body = strings.NewReader(strings.Replace(string(bodyBuf), "{{ .Name }}", d.Name, -1)) + } + + client := NewHTTPClient() + req, err := http.NewRequest(h.Method, h.URL, body) + if nil != err { + d.Logger <- fmt.Sprintf("[Notify] HTTP Client Network Error for '%s': %s", h.Name, err) + return + } + + if 0 != len(h.Form) { + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + } else if 0 != len(h.JSON) { + req.Header.Set("Content-Type", "application/json") + } + + if 0 != len(h.Auth) { + user := h.Auth["user"] + if "" == user { + user = h.Auth["username"] + } + pass := h.Auth["pass"] + if "" == user { + pass = h.Auth["password"] + } + req.SetBasicAuth(user, pass) + } + + req.Header.Set("User-Agent", "Watchdog/1.0") + for k := range h.Headers { + req.Header.Set(k, h.Headers[k]) + } + + resp, err := client.Do(req) + if nil != err { + d.Logger <- fmt.Sprintf("[Notify] HTTP Client Error for '%s': %s", h.Name, err) + return + } + + if !(resp.StatusCode >= 200 && resp.StatusCode < 300) { + d.Logger <- fmt.Sprintf("[Notify] Response Error for '%s': %s", h.Name, resp.Status) + return + } + + // TODO json vs xml vs txt + var data map[string]interface{} + req.Header.Add("Accept", "application/json") + decoder := json.NewDecoder(resp.Body) + err = decoder.Decode(&data) + if err != nil { + d.Logger <- fmt.Sprintf("[Notify] Response Body Error for '%s': %s", h.Name, resp.Status) + return + } + + // TODO some sort of way to determine if data is successful (keywords) + d.Logger <- fmt.Sprintf("[Notify] Success? %#v", data) +} + type Config struct { - Watches []ConfigWatch `json:"watches"` - Webhooks []ConfigWebhook `json:"webhooks"` + Watches []ConfigWatch `json:"watches"` + Webhooks []Webhook `json:"webhooks"` } type ConfigWatch struct { @@ -270,7 +274,7 @@ type ConfigWatch struct { RecoverScript string `json:"recover_script"` } -type ConfigWebhook struct { +type Webhook struct { Name string `json:"name"` Method string `json:"method"` URL string `json:"url"`