Skip to content

Commit 98fad34

Browse files
authored
Merge pull request #153 from ysicing/feat-bark
feat(bark): add bark
2 parents 3cbc339 + c32824e commit 98fad34

22 files changed

Lines changed: 399 additions & 216 deletions

conf/app-example.conf

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ TG_TOKEN=xxxxx
181181
TG_MODE_CHAN=0
182182
#tg用户ID
183183
TG_USERID=xxxxx
184-
#tg频道name
184+
#tg频道name或者id, 频道name需要以@开始
185185
TG_CHANNAME=xxxxx
186186
#tg api地址, 可以配置为代理地址
187187
#TG_API_PROXY="https://api.telegram.org/bot%s/%s"
@@ -224,4 +224,17 @@ open-ruliu=0
224224
#默认百度Hi(如流)机器人地址
225225
BDRL_URL=https://api.im.baidu.com/api/msg/groupmsgsend?access_token=xxxxxxxxxxxxxx
226226
#百度Hi(如流)群ID
227-
BDRL_ID=123456
227+
BDRL_ID=123456
228+
#---------------------↓bark接口-----------------------
229+
#是否开启telegram告警通道,可同时开始多个通道0为关闭,1为开启
230+
open-bark=0
231+
#bark默认地址, 建议自行部署bark-server
232+
BARK_URL=https://api.day.app
233+
#bark key, 多个key使用分割
234+
BARK_KEYS=xxxxx
235+
# 复制, 推荐开启
236+
BARK_COPY=1
237+
# 历史记录保存,推荐开启
238+
BARK_ARCHIVE=1
239+
# 消息分组
240+
BARK_GROUP=PrometheusAlert

controllers/bark.go

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package controllers
2+
3+
import (
4+
"PrometheusAlert/model"
5+
"bytes"
6+
"encoding/json"
7+
"fmt"
8+
"io"
9+
"net/http"
10+
"strings"
11+
"time"
12+
13+
"github.com/astaxie/beego"
14+
"github.com/astaxie/beego/logs"
15+
)
16+
17+
// SendBark 发送消息至iPhone
18+
func SendBark(msg, logsign string) string {
19+
open := beego.AppConfig.String("open-bark")
20+
if open != "1" {
21+
logs.Info(logsign, "[bark]", "bark未配置未开启状态,请先配置open-bark为1")
22+
return "bark未配置未开启状态,请先配置open-bark为1"
23+
}
24+
senduser := beego.AppConfig.String("BARK_KEYS")
25+
sendusers := strings.Split(senduser, "-")
26+
for _, u := range sendusers {
27+
// 处理发送消息
28+
urlprefix := generateGetUrlPrefix(msg, u)
29+
barkcopy := beego.AppConfig.String("BARK_COPY")
30+
if barkcopy == "1" {
31+
urlprefix += fmt.Sprintf("?copy=%s", msg)
32+
urlprefix += "&automaticallyCopy=1"
33+
}
34+
barkarchive := beego.AppConfig.String("BARK_ARCHIVE")
35+
if barkarchive == "1" {
36+
urlprefix += "&isArchive=1"
37+
}
38+
urlprefix += fmt.Sprintf("&group=%s", beego.AppConfig.String("BARK_GROUP"))
39+
get, err := sendBark(urlprefix)
40+
if err != nil {
41+
logs.Error(logsign, "[bark]", fmt.Errorf("send to %s, err: %v", u, err))
42+
}
43+
if get.Code != 200 {
44+
logs.Error(logsign, "[bark]", fmt.Errorf("send to %s, get code: %d", u, get.Code))
45+
}
46+
}
47+
model.AlertToCounter.WithLabelValues("bark", "", "").Add(1)
48+
logs.Info(logsign, "[bark]", "bark send ok.")
49+
return "bark send ok"
50+
}
51+
52+
type responseMessage struct {
53+
Code int64 `json:"code"`
54+
Data string `json:"data"`
55+
Message string `json:"message"`
56+
}
57+
58+
func sendBark(url string) (responseMessage, error) {
59+
client := &http.Client{Timeout: 5 * time.Second}
60+
resp, err := client.Get(url)
61+
if err != nil {
62+
return responseMessage{}, err
63+
}
64+
defer resp.Body.Close()
65+
var buffer [512]byte
66+
result := bytes.NewBuffer(nil)
67+
for {
68+
n, err := resp.Body.Read(buffer[0:])
69+
result.Write(buffer[0:n])
70+
if err != nil && err == io.EOF {
71+
break
72+
} else if err != nil {
73+
return responseMessage{}, err
74+
}
75+
}
76+
77+
message := responseMessage{}
78+
err = json.Unmarshal(result.Bytes(), &message)
79+
if err != nil {
80+
return responseMessage{}, err
81+
}
82+
83+
return message, nil
84+
}
85+
86+
func generateGetUrlPrefix(msg, userkey string) string {
87+
barkserver := beego.AppConfig.String("BARK_URL")
88+
barktitle := beego.AppConfig.String("BARK_TITLE")
89+
if len(barktitle) == 0 {
90+
barktitle = "Bark推送测试"
91+
}
92+
buffer := bytes.Buffer{}
93+
buffer.WriteString(fmt.Sprintf("%s/%s/%s/%s", barkserver, userkey, barktitle, msg))
94+
return buffer.String()
95+
}

controllers/default.go

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ func (c *MainController) Get() {
2525

2626
//test page
2727
func (c *MainController) Test() {
28-
if !checkAccount(c.Ctx) {
28+
if !checkAccount(c.Ctx) {
2929
c.Redirect("/login", 302)
3030
return
3131
}
@@ -36,7 +36,7 @@ func (c *MainController) Test() {
3636

3737
//template page
3838
func (c *MainController) Template() {
39-
if !checkAccount(c.Ctx) {
39+
if !checkAccount(c.Ctx) {
4040
c.Redirect("/login", 302)
4141
return
4242
}
@@ -52,7 +52,7 @@ func (c *MainController) Template() {
5252

5353
//template add
5454
func (c *MainController) TemplateAdd() {
55-
if !checkAccount(c.Ctx) {
55+
if !checkAccount(c.Ctx) {
5656
c.Redirect("/login", 302)
5757
return
5858
}
@@ -84,7 +84,7 @@ func (c *MainController) AddTpl() {
8484
c.ServeJSON()
8585
}
8686
func (c *MainController) TemplateEdit() {
87-
if !checkAccount(c.Ctx) {
87+
if !checkAccount(c.Ctx) {
8888
c.Redirect("/login", 302)
8989
return
9090
}
@@ -110,7 +110,7 @@ func (c *MainController) TemplateEdit() {
110110
// c.Data["Template"] = Template
111111
//}
112112
func (c *MainController) TemplateDel() {
113-
if !checkAccount(c.Ctx) {
113+
if !checkAccount(c.Ctx) {
114114
c.Redirect("/login", 302)
115115
return
116116
}
@@ -139,15 +139,15 @@ func (c *MainController) AlertTest() {
139139
switch MessageData {
140140
case "wx":
141141
wxtext := "[PrometheusAlert](https://github.com/feiyu563/PrometheusAlert)\n>**测试告警**\n>`告警级别:`测试\n**PrometheusAlert**"
142-
ret := PostToWeiXin(wxtext, beego.AppConfig.String("wxurl"), "jikun.zhang",logsign)
142+
ret := PostToWeiXin(wxtext, beego.AppConfig.String("wxurl"), "jikun.zhang", logsign)
143143
c.Data["json"] = ret
144144
case "dd":
145145
ddtext := "## [PrometheusAlert](https://github.com/feiyu563/PrometheusAlert)\n\n" + "#### 测试告警\n\n" + "###### 告警级别:测试\n\n##### PrometheusAlert\n\n" + "![PrometheusAlert](" + beego.AppConfig.String("logourl") + ")"
146-
ret := PostToDingDing("PrometheusAlert", ddtext, beego.AppConfig.String("ddurl"),"15395105573", logsign)
146+
ret := PostToDingDing("PrometheusAlert", ddtext, beego.AppConfig.String("ddurl"), "15395105573", logsign)
147147
c.Data["json"] = ret
148148
case "fs":
149149
fstext := "[PrometheusAlert](https://github.com/feiyu563/PrometheusAlert)\n\n" + "测试告警\n\n" + "告警级别:测试\n\nPrometheusAlert\n\n" + "![PrometheusAlert](" + beego.AppConfig.String("logourl") + ")"
150-
ret := PostToFS("PrometheusAlert", fstext, beego.AppConfig.String("fsurl"), "244217140@qq.com",logsign)
150+
ret := PostToFS("PrometheusAlert", fstext, beego.AppConfig.String("fsurl"), "244217140@qq.com", logsign)
151151
c.Data["json"] = ret
152152
case "txdx":
153153
MobileMessage := "PrometheusAlertCenter测试告警"
@@ -193,15 +193,19 @@ func (c *MainController) AlertTest() {
193193
c.Data["json"] = ret
194194
case "workwechat":
195195
WorkwechatMessage := "[PrometheusAlert](https://github.com/feiyu563/PrometheusAlert)\n" + "测试告警\n" + "告警级别:测试\nPrometheusAlert\n" + "![PrometheusAlert](" + beego.AppConfig.String("logourl") + ")"
196-
ret := SendWorkWechat(beego.AppConfig.String("WorkWechat_ToUser"),beego.AppConfig.String("WorkWechat_ToParty"), beego.AppConfig.String("WorkWechat_ToTag"),WorkwechatMessage, logsign)
196+
ret := SendWorkWechat(beego.AppConfig.String("WorkWechat_ToUser"), beego.AppConfig.String("WorkWechat_ToParty"), beego.AppConfig.String("WorkWechat_ToTag"), WorkwechatMessage, logsign)
197197
c.Data["json"] = ret
198198
case "bddx":
199199
MobileMessage := "PrometheusAlertCenter测试告警"
200200
ret := PostBDYmessage(MobileMessage, beego.AppConfig.String("defaultphone"), logsign)
201201
c.Data["json"] = ret
202202
case "bdrl":
203203
RLMessage := "## [PrometheusAlert](https://github.com/feiyu563/PrometheusAlert)\n\n" + "#### 测试告警\n\n" + "###### 告警级别:测试\n\n##### PrometheusAlert\n\n" + "![PrometheusAlert](" + beego.AppConfig.String("logourl") + ")"
204-
ret := PostToRuLiu(beego.AppConfig.String("BDRL_ID"),RLMessage,beego.AppConfig.String("BDRL_URL"), logsign)
204+
ret := PostToRuLiu(beego.AppConfig.String("BDRL_ID"), RLMessage, beego.AppConfig.String("BDRL_URL"), logsign)
205+
c.Data["json"] = ret
206+
case "bark":
207+
TgMessage := "PrometheusAlertCenter测试告警"
208+
ret := SendBark(TgMessage, logsign)
205209
c.Data["json"] = ret
206210
default:
207211
c.Data["json"] = "hahaha!"

controllers/dingding.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ type DDMessage struct {
2525
} `json:"at"`
2626
}
2727

28-
func PostToDingDing(title, text, Ddurl,AtSomeOne, logsign string) string {
28+
func PostToDingDing(title, text, Ddurl, AtSomeOne, logsign string) string {
2929
open := beego.AppConfig.String("open-dingding")
3030
if open != "1" {
3131
logs.Info(logsign, "[dingding]", "钉钉接口未配置未开启状态,请先配置open-dingding为1")
@@ -36,15 +36,15 @@ func PostToDingDing(title, text, Ddurl,AtSomeOne, logsign string) string {
3636
if Isatall == 0 {
3737
Atall = false
3838
}
39-
atMobile:=[]string{"15395105573"}
40-
SendText:=text
41-
if AtSomeOne!="" {
42-
atMobile=strings.Split(AtSomeOne, ",")
43-
AtText:=""
44-
for _,phoneN:=range atMobile{
45-
AtText+=" @"+phoneN
39+
atMobile := []string{"15395105573"}
40+
SendText := text
41+
if AtSomeOne != "" {
42+
atMobile = strings.Split(AtSomeOne, ",")
43+
AtText := ""
44+
for _, phoneN := range atMobile {
45+
AtText += " @" + phoneN
4646
}
47-
SendText+=AtText
47+
SendText += AtText
4848
Atall = false
4949
}
5050

controllers/feishu.go

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,15 @@ type FSMessage struct {
1919
Text string `json:"text"`
2020
}
2121

22-
func PostToFS(title, text, Fsurl, userEmail,logsign string) string {
22+
func PostToFS(title, text, Fsurl, userEmail, logsign string) string {
2323
open := beego.AppConfig.String("open-feishu")
2424
if open != "1" {
2525
logs.Info(logsign, "[feishu]", "飞书接口未配置未开启状态,请先配置open-feishu为1")
2626
return "飞书接口未配置未开启状态,请先配置open-feishu为1"
2727
}
2828
RTstring := ""
2929
if strings.Contains(Fsurl, "/v2/") {
30-
RTstring = PostToFeiShuv2(title, text, Fsurl, userEmail,logsign)
30+
RTstring = PostToFeiShuv2(title, text, Fsurl, userEmail, logsign)
3131
} else {
3232
RTstring = PostToFeiShu(title, text, Fsurl, logsign)
3333
}
@@ -104,11 +104,11 @@ type Cards struct {
104104

105105
type FSMessagev2 struct {
106106
MsgType string `json:"msg_type"`
107-
Email string `json:"email"` //@所使用字段
107+
Email string `json:"email"` //@所使用字段
108108
Card Cards `json:"card"`
109109
}
110110

111-
func PostToFeiShuv2(title, text, Fsurl, userEmail,logsign string) string {
111+
func PostToFeiShuv2(title, text, Fsurl, userEmail, logsign string) string {
112112
var color string
113113
if strings.Count(text, "resolved") > 0 && strings.Count(text, "firing") > 0 {
114114
color = "orange"
@@ -118,18 +118,16 @@ func PostToFeiShuv2(title, text, Fsurl, userEmail,logsign string) string {
118118
color = "red"
119119
}
120120

121-
122-
SendContent:=text
123-
if userEmail!="" {
124-
emails:=strings.Split(userEmail, ",")
125-
emailtext:=""
126-
for _,email:=range emails{
127-
emailtext+="<at email="+email+"></at>"
121+
SendContent := text
122+
if userEmail != "" {
123+
emails := strings.Split(userEmail, ",")
124+
emailtext := ""
125+
for _, email := range emails {
126+
emailtext += "<at email=" + email + "></at>"
128127
}
129-
SendContent+=emailtext
128+
SendContent += emailtext
130129
}
131130

132-
133131
u := FSMessagev2{
134132
MsgType: "interactive",
135133
Email: "244217140@qq.com",

0 commit comments

Comments
 (0)