This commit is contained in:
commit
9871336025
13
.drone.yml
Normal file
13
.drone.yml
Normal file
|
@ -0,0 +1,13 @@
|
|||
kind: pipeline
|
||||
name: default
|
||||
|
||||
steps:
|
||||
- name: docker
|
||||
image: plugins/docker
|
||||
settings:
|
||||
registry: r.sbruder.de
|
||||
username:
|
||||
from_secret: docker_username
|
||||
password:
|
||||
from_secret: docker_password
|
||||
repo: r.sbruder.de/alertmanager-gotify
|
21
Dockerfile
Normal file
21
Dockerfile
Normal file
|
@ -0,0 +1,21 @@
|
|||
FROM golang:alpine as builder
|
||||
|
||||
WORKDIR /go/src/git.sbruder.de/simon/alertmanager-gotify/
|
||||
|
||||
COPY alertmanager-gotify.go .
|
||||
|
||||
RUN apk add --no-cache git upx
|
||||
|
||||
RUN go get -v \
|
||||
&& CGO_ENABLED=0 go build -v -ldflags="-s -w" \
|
||||
&& upx --ultra-brute alertmanager-gotify
|
||||
|
||||
FROM scratch
|
||||
|
||||
COPY --from=builder /go/src/git.sbruder.de/simon/alertmanager-gotify/alertmanager-gotify /alertmanager-gotify
|
||||
|
||||
USER 1000
|
||||
|
||||
ENTRYPOINT ["/alertmanager-gotify"]
|
||||
|
||||
EXPOSE 8081
|
97
alertmanager-gotify.go
Normal file
97
alertmanager-gotify.go
Normal file
|
@ -0,0 +1,97 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"log"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"os"
|
||||
"encoding/json"
|
||||
"io/ioutil"
|
||||
"strings"
|
||||
|
||||
"github.com/gotify/go-api-client/auth"
|
||||
"github.com/gotify/go-api-client/client/message"
|
||||
"github.com/gotify/go-api-client/gotify"
|
||||
"github.com/gotify/go-api-client/models"
|
||||
)
|
||||
|
||||
type POSTData struct {
|
||||
Alerts []Alert `json:alerts`
|
||||
}
|
||||
|
||||
type Alert struct {
|
||||
Annotations Annotations `json:annotations`
|
||||
Labels Labels `json:labels`
|
||||
Status string `json:status`
|
||||
}
|
||||
|
||||
type Annotations struct {
|
||||
Description string `json:description`
|
||||
Title string `json:title`
|
||||
}
|
||||
|
||||
type Labels struct {
|
||||
Severity string `json:severity`
|
||||
}
|
||||
|
||||
func main() {
|
||||
gotifyURL := os.Getenv("GOTIFY_URL")
|
||||
|
||||
http.HandleFunc("/alert", func (w http.ResponseWriter, r *http.Request) {
|
||||
if r.Method != "POST" {
|
||||
http.Error(w, "405 Method not allowed", http.StatusMethodNotAllowed)
|
||||
return
|
||||
}
|
||||
|
||||
applicationToken := r.URL.Query().Get("token")
|
||||
if applicationToken == "" {
|
||||
http.Error(w, "401 Unauthorized", http.StatusUnauthorized)
|
||||
return
|
||||
}
|
||||
|
||||
body, err := ioutil.ReadAll(r.Body)
|
||||
if err != nil {
|
||||
log.Printf("Error reading request body %v", err)
|
||||
http.Error(w, "500 Internal Server Error", http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
postData := POSTData{}
|
||||
err = json.Unmarshal(body, &postData)
|
||||
if err != nil {
|
||||
log.Printf("Failed to parse json %v", err)
|
||||
http.Error(w, "500 Internal Server Error", http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
parsedURL, _ := url.Parse(gotifyURL)
|
||||
client := gotify.NewClient(parsedURL, &http.Client{})
|
||||
|
||||
for _, alert := range postData.Alerts {
|
||||
var title strings.Builder
|
||||
|
||||
if alert.Status == "resolved" {
|
||||
title.WriteString("RESOLVED: ")
|
||||
} else {
|
||||
title.WriteString(strings.ToUpper(alert.Labels.Severity))
|
||||
title.WriteString(": ")
|
||||
}
|
||||
|
||||
title.WriteString(alert.Annotations.Title)
|
||||
|
||||
params := message.NewCreateMessageParams()
|
||||
params.Body = &models.MessageExternal{
|
||||
Title: title.String(),
|
||||
Message: alert.Annotations.Description,
|
||||
}
|
||||
_, err = client.Message.CreateMessage(params, auth.TokenAuth(applicationToken))
|
||||
|
||||
if err != nil {
|
||||
log.Printf("Could not send message %v", err)
|
||||
http.Error(w, "500 Internal Server Error", http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
http.ListenAndServe(":8081", nil)
|
||||
}
|
Reference in a new issue