🔊 v0.3.0 计划任务(定期备份等场景)

This commit is contained in:
naiba
2021-01-19 09:59:04 +08:00
parent f20a501ab4
commit d7a3ba607b
24 changed files with 417 additions and 38 deletions

View File

@@ -3,8 +3,10 @@ package dao
import (
"sort"
"sync"
"time"
"github.com/patrickmn/go-cache"
"github.com/robfig/cron/v3"
"gorm.io/gorm"
"github.com/naiba/nezha/model"
@@ -21,13 +23,29 @@ var Cache *cache.Cache
var DB *gorm.DB
// 服务器监控、状态相关
var ServerList map[uint64]*model.Server
var ServerLock sync.RWMutex
var SortedServerList []*model.Server
var SortedServerLock sync.RWMutex
var Version = "v0.2.6"
// 计划任务相关
var CronLock sync.RWMutex
var Crons map[uint64]*model.Cron
var Cron *cron.Cron
var Version = "v0.3.0"
func init() {
shanghai, err := time.LoadLocation("Asia/Shanghai")
if err != nil {
panic(err)
}
Cron = cron.New(cron.WithLocation(shanghai))
Crons = make(map[uint64]*model.Cron)
ServerList = make(map[uint64]*model.Server)
}
func ReSortServer() {
ServerLock.RLock()

View File

@@ -18,10 +18,11 @@ type NezhaHandler struct {
func (s *NezhaHandler) ReportTask(c context.Context, r *pb.TaskResult) (*pb.Receipt, error) {
var err error
if _, err = s.Auth.Check(c); err != nil {
var clientID uint64
if clientID, err = s.Auth.Check(c); err != nil {
return nil, err
}
if r.GetType() == model.MonitorTypeHTTPGET {
if r.GetType() == model.TaskTypeHTTPGET {
// SSL 证书报警
var errMsg string
if strings.HasPrefix(r.GetData(), "SSL证书错误") {
@@ -54,10 +55,27 @@ func (s *NezhaHandler) ReportTask(c context.Context, r *pb.TaskResult) (*pb.Rece
alertmanager.SendNotification(fmt.Sprintf("服务监控:%s %s", monitor.Name, errMsg))
}
}
// 存入历史记录
mh := model.PB2MonitorHistory(r)
if err := dao.DB.Create(&mh).Error; err != nil {
return nil, err
if r.GetType() == model.TaskTypeCommand {
// 处理上报的计划任务
dao.CronLock.RLock()
cr := dao.Crons[r.GetId()]
dao.CronLock.RUnlock()
if cr.PushSuccessful && r.GetSuccessful() {
alertmanager.SendNotification(fmt.Sprintf("成功计划任务:%s ,服务器:%d日志\n%s", cr.Name, clientID, r.GetData()))
}
if !r.GetSuccessful() {
alertmanager.SendNotification(fmt.Sprintf("失败计划任务:%s ,服务器:%d日志\n%s", cr.Name, clientID, r.GetData()))
}
dao.DB.Model(cr).Updates(model.Cron{
LastExecutedAt: time.Now().Add(time.Second * -1 * time.Duration(r.GetDelay())),
LastResult: r.GetSuccessful(),
})
} else {
// 存入历史记录
mh := model.PB2MonitorHistory(r)
if err := dao.DB.Create(&mh).Error; err != nil {
return nil, err
}
}
return &pb.Receipt{Proced: true}, nil
}