Merge pull request #12 from svensp/master

rudimentary slack parser
master
Thomas Maier 2020-01-05 15:12:35 +01:00 zatwierdzone przez GitHub
commit ba6aa0b0d5
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
3 zmienionych plików z 92 dodań i 7 usunięć

Wyświetl plik

@ -0,0 +1,13 @@
{
"channel": "#channel",
"icon_emoji": ":heart:",
"username": "Flux Deployer",
"attachments": [
{
"color": "#4286f4",
"title": "Applied flux changes to cluster",
"title_link": "https://GITURL/USERNAME/kubernetes/commit/COMMITSHA",
"text": "Event: Sync: 0f34755, jabber:deployment/test\nCommits:\n\n* \u003chttps://GITURL/USERNAME/kubernetes/commit/COMMITSHA\u003e: change test to test webhook\n\nResources updated:\n\n* jabber:deployment/test"
}
]
}

Wyświetl plik

@ -6,8 +6,17 @@ import (
"net/http"
)
type Response struct {
Message string
Code int
}
func errorResponse() Response {
return Response{"", http.StatusInternalServerError}
}
// interface for parser functions (grafana, prometheus, ...)
type parserFunc func(*http.Request) (string, error)
type parserFunc func(*http.Request) (string, error, Response)
type messageHandler struct {
messages chan<- string // chan to xmpp client
@ -17,13 +26,14 @@ type messageHandler struct {
// http request handler
func (h *messageHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
// parse/generate message from http request
m, err := h.parserFunc(r)
m, err, response := h.parserFunc(r)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
}
// send message to xmpp client
h.messages <- m
w.WriteHeader(http.StatusNoContent)
w.WriteHeader(response.Code)
w.Write([]byte(response.Message))
}
// returns new handler with a given parser function
@ -37,11 +47,11 @@ func newMessageHandler(m chan<- string, f parserFunc) *messageHandler {
/*************
GRAFANA PARSER
*************/
func grafanaParserFunc(r *http.Request) (string, error) {
func grafanaParserFunc(r *http.Request) (string, error, Response) {
// get alert data from request
body, err := ioutil.ReadAll(r.Body)
if err != nil {
return "", err
return "", err, errorResponse()
}
// grafana alert struct
@ -55,7 +65,7 @@ func grafanaParserFunc(r *http.Request) (string, error) {
// parse body into the alert struct
err = json.Unmarshal(body, &alert)
if err != nil {
return "", err
return "", err, errorResponse()
}
// contruct alert message
@ -67,5 +77,64 @@ func grafanaParserFunc(r *http.Request) (string, error) {
message = ":( " + alert.Title + "\n" + alert.Message + "\n" + alert.RuleURL
}
return message, nil
return message, nil, Response{"", http.StatusNoContent}
}
/*************
SLACK PARSER
*************/
type SlackMessage struct {
Channel string `json:"channel"`
IconEmoji string `json:"icon_emoji"`
Username string `json:"username"`
Text string `json:"text"`
Attachments []SlackAttachment `json:"attachments"`
}
type SlackAttachment struct {
Color string `json:"color"`
Title string `json:"title"`
TitleLink string `json:"title_link"`
Text string `json:"text"`
}
func nonemptyAppendNewline(message string) string {
if len(message) == 0 {
return message
}
return message + "\n"
}
func slackParserFunc(r *http.Request) (string, error, Response) {
// get alert data from request
body, err := ioutil.ReadAll(r.Body)
if err != nil {
return "", err, errorResponse()
}
// grafana alert struct
alert := SlackMessage{}
// parse body into the alert struct
err = json.Unmarshal(body, &alert)
if err != nil {
return "", err, Response{"", http.StatusInternalServerError}
}
// contruct alert message
message := ""
hasText := (alert.Text != "")
if hasText {
message = alert.Text
}
for _, attachment := range alert.Attachments {
message = nonemptyAppendNewline(message)
message += attachment.Title + "\n"
message += attachment.TitleLink + "\n\n"
message += attachment.Text
}
return message, nil, Response{"ok", http.StatusOK}
}

Wyświetl plik

@ -115,6 +115,7 @@ func main() {
reply := MessageBody{
Message: stanza.Message{
To: msg.From.Bare(),
From: address,
Type: stanza.ChatMessage,
},
Body: msg.Body,
@ -140,6 +141,7 @@ func main() {
_ = xmppSession.Encode(MessageBody{
Message: stanza.Message{
To: recipient,
From: address,
Type: stanza.ChatMessage,
},
Body: m,
@ -150,6 +152,7 @@ func main() {
// initialize handler for grafana alerts
http.Handle("/grafana", newMessageHandler(messages, grafanaParserFunc))
http.Handle("/slack", newMessageHandler(messages, slackParserFunc))
// listen for requests
_ = http.ListenAndServe(":4321", nil)