diff --git a/README.md b/README.md
index 1d4f223..a8918f7 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
# 哪吒面板
- 
+ 
系统状态监控报警、API(SSL证书变更、即将到期、到期)/TCP端口存活/PING 监控、计划任务(可以定时在Agent上执行命令,备份、重启、What ever you want)、极省资源,64M 服务器也能装 agent。
diff --git a/cmd/dashboard/controller/member_api.go b/cmd/dashboard/controller/member_api.go
index 855d3c8..16d9b1f 100644
--- a/cmd/dashboard/controller/member_api.go
+++ b/cmd/dashboard/controller/member_api.go
@@ -281,7 +281,7 @@ func (ma *memberAPI) addOrEditCron(c *gin.Context) {
Type: model.TaskTypeCommand,
})
} else {
- alertmanager.SendNotification(fmt.Sprintf("计划任务:%s,服务器:%d 离线,无法执行。", cr.Name, cr.Servers[j]))
+ alertmanager.SendNotification(fmt.Sprintf("计划任务:%s,服务器:%d 离线,无法执行。", cr.Name, cr.Servers[j]), false)
}
}
})
diff --git a/cmd/dashboard/main.go b/cmd/dashboard/main.go
index 7ee6b8c..fe9dce4 100644
--- a/cmd/dashboard/main.go
+++ b/cmd/dashboard/main.go
@@ -90,7 +90,7 @@ func loadCrons() {
Type: model.TaskTypeCommand,
})
} else {
- alertmanager.SendNotification(fmt.Sprintf("计划任务:%s,服务器:%d 离线,无法执行。", cr.Name, cr.Servers[j]))
+ alertmanager.SendNotification(fmt.Sprintf("计划任务:%s,服务器:%d 离线,无法执行。", cr.Name, cr.Servers[j]), false)
}
}
})
diff --git a/resource/template/component/cron.html b/resource/template/component/cron.html
index 6f2f91b..7e2347b 100644
--- a/resource/template/component/cron.html
+++ b/resource/template/component/cron.html
@@ -10,7 +10,7 @@
-
+
diff --git a/service/alertmanager/alertmanager.go b/service/alertmanager/alertmanager.go
index dac2822..3481d46 100644
--- a/service/alertmanager/alertmanager.go
+++ b/service/alertmanager/alertmanager.go
@@ -134,7 +134,7 @@ func checkStatus() {
max, desc := alert.Check(alertsStore[alert.ID][server.ID])
if desc != "" {
message := fmt.Sprintf("报警规则:%s,服务器:%s(%s),%s,逮到咯,快去看看!", alert.Name, server.Name, server.Host.IP, desc)
- go SendNotification(message)
+ go SendNotification(message, true)
}
// 清理旧数据
if max > 0 && max < len(alertsStore[alert.ID][server.ID]) {
@@ -144,36 +144,37 @@ func checkStatus() {
}
}
-func SendNotification(desc string) {
- // 通知防骚扰策略
- nID := hex.EncodeToString(md5.New().Sum([]byte(desc)))
- var flag bool
- if cacheN, has := dao.Cache.Get(nID); has {
- nHistory := cacheN.(NotificationHistory)
- // 每次提醒都增加一倍等待时间,最后每天最多提醒一次
- if time.Now().After(nHistory.Until) {
- flag = true
- nHistory.Duration *= 2
- if nHistory.Duration > time.Hour*24 {
- nHistory.Duration = time.Hour * 24
+func SendNotification(desc string, muteable bool) {
+ if muteable {
+ // 通知防骚扰策略
+ nID := hex.EncodeToString(md5.New().Sum([]byte(desc)))
+ var flag bool
+ if cacheN, has := dao.Cache.Get(nID); has {
+ nHistory := cacheN.(NotificationHistory)
+ // 每次提醒都增加一倍等待时间,最后每天最多提醒一次
+ if time.Now().After(nHistory.Until) {
+ flag = true
+ nHistory.Duration *= 2
+ if nHistory.Duration > time.Hour*24 {
+ nHistory.Duration = time.Hour * 24
+ }
+ nHistory.Until = time.Now().Add(nHistory.Duration)
+ // 缓存有效期加 10 分钟
+ dao.Cache.Set(nID, nHistory, nHistory.Duration+time.Minute*10)
}
- nHistory.Until = time.Now().Add(nHistory.Duration)
- // 缓存有效期加 10 分钟
- dao.Cache.Set(nID, nHistory, nHistory.Duration+time.Minute*10)
+ } else {
+ // 新提醒直接通知
+ flag = true
+ dao.Cache.Set(nID, NotificationHistory{
+ Duration: firstNotificationDelay,
+ Until: time.Now().Add(firstNotificationDelay),
+ }, firstNotificationDelay+time.Minute*10)
}
- } else {
- // 新提醒直接通知
- flag = true
- dao.Cache.Set(nID, NotificationHistory{
- Duration: firstNotificationDelay,
- Until: time.Now().Add(firstNotificationDelay),
- }, firstNotificationDelay+time.Minute*10)
- }
- if !flag {
- return
+ if !flag {
+ return
+ }
}
-
// 发出通知
notificationsLock.RLock()
defer notificationsLock.RUnlock()
diff --git a/service/dao/dao.go b/service/dao/dao.go
index 947a852..f5ee0e8 100644
--- a/service/dao/dao.go
+++ b/service/dao/dao.go
@@ -34,7 +34,7 @@ var CronLock sync.RWMutex
var Crons map[uint64]*model.Cron
var Cron *cron.Cron
-var Version = "v0.3.7"
+var Version = "v0.3.8"
func ReSortServer() {
ServerLock.RLock()
diff --git a/service/rpc/nezha.go b/service/rpc/nezha.go
index 071310d..b36a512 100644
--- a/service/rpc/nezha.go
+++ b/service/rpc/nezha.go
@@ -52,7 +52,7 @@ func (s *NezhaHandler) ReportTask(c context.Context, r *pb.TaskResult) (*pb.Rece
if errMsg != "" {
var monitor model.Monitor
dao.DB.First(&monitor, "id = ?", r.GetId())
- alertmanager.SendNotification(fmt.Sprintf("服务监控:%s %s", monitor.Name, errMsg))
+ alertmanager.SendNotification(fmt.Sprintf("服务监控:%s %s", monitor.Name, errMsg), true)
}
}
if r.GetType() == model.TaskTypeCommand {
@@ -62,10 +62,10 @@ func (s *NezhaHandler) ReportTask(c context.Context, r *pb.TaskResult) (*pb.Rece
cr := dao.Crons[r.GetId()]
if cr != nil {
if cr.PushSuccessful && r.GetSuccessful() {
- alertmanager.SendNotification(fmt.Sprintf("成功计划任务:%s ,服务器:%d,日志:\n%s", cr.Name, clientID, r.GetData()))
+ alertmanager.SendNotification(fmt.Sprintf("成功计划任务:%s ,服务器:%d,日志:\n%s", cr.Name, clientID, r.GetData()), false)
}
if !r.GetSuccessful() {
- alertmanager.SendNotification(fmt.Sprintf("失败计划任务:%s ,服务器:%d,日志:\n%s", cr.Name, clientID, r.GetData()))
+ alertmanager.SendNotification(fmt.Sprintf("失败计划任务:%s ,服务器:%d,日志:\n%s", cr.Name, clientID, r.GetData()), false)
}
dao.DB.Model(cr).Updates(model.Cron{
LastExecutedAt: time.Now().Add(time.Second * -1 * time.Duration(r.GetDelay())),
@@ -129,7 +129,7 @@ func (s *NezhaHandler) ReportSystemInfo(c context.Context, r *pb.Host) (*pb.Rece
dao.ServerList[clientID].Host.IP != host.IP {
alertmanager.SendNotification(fmt.Sprintf(
"IP变更提醒 服务器:%s ,旧IP:%s,新IP:%s。",
- dao.ServerList[clientID].Name, dao.ServerList[clientID].Host.IP, host.IP))
+ dao.ServerList[clientID].Name, dao.ServerList[clientID].Host.IP, host.IP), true)
}
dao.ServerList[clientID].Host = &host
return &pb.Receipt{Proced: true}, nil