diff --git a/cmd/dashboard/controller/member_api.go b/cmd/dashboard/controller/member_api.go
index fb4d5ba..23b8f0b 100644
--- a/cmd/dashboard/controller/member_api.go
+++ b/cmd/dashboard/controller/member_api.go
@@ -396,18 +396,21 @@ func (ma *memberAPI) addOrEditServer(c *gin.Context) {
}
type monitorForm struct {
- ID uint64
- Name string
- Target string
- Type uint8
- Cover uint8
- Notify string
- NotificationTag string
- SkipServersRaw string
- Duration uint64
- MinLatency float32
- MaxLatency float32
- LatencyNotify string
+ ID uint64
+ Name string
+ Target string
+ Type uint8
+ Cover uint8
+ Notify string
+ NotificationTag string
+ SkipServersRaw string
+ Duration uint64
+ MinLatency float32
+ MaxLatency float32
+ LatencyNotify string
+ EnableTriggerTask string
+ FailTriggerTasksRaw string
+ RecoverTriggerTasksRaw string
}
func (ma *memberAPI) addOrEditMonitor(c *gin.Context) {
@@ -427,6 +430,9 @@ func (ma *memberAPI) addOrEditMonitor(c *gin.Context) {
m.LatencyNotify = mf.LatencyNotify == "on"
m.MinLatency = mf.MinLatency
m.MaxLatency = mf.MaxLatency
+ m.EnableTriggerTask = mf.EnableTriggerTask == "on"
+ m.RecoverTriggerTasksRaw = mf.RecoverTriggerTasksRaw
+ m.FailTriggerTasksRaw = mf.FailTriggerTasksRaw
err = m.InitSkipServers()
}
if err == nil {
@@ -434,6 +440,12 @@ func (ma *memberAPI) addOrEditMonitor(c *gin.Context) {
if m.NotificationTag == "" {
m.NotificationTag = "default"
}
+ if err == nil {
+ err = utils.Json.Unmarshal([]byte(mf.FailTriggerTasksRaw), &m.FailTriggerTasks)
+ }
+ if err == nil {
+ err = utils.Json.Unmarshal([]byte(mf.RecoverTriggerTasksRaw), &m.RecoverTriggerTasks)
+ }
if m.ID == 0 {
err = singleton.DB.Create(&m).Error
} else {
diff --git a/model/monitor.go b/model/monitor.go
index f019c92..7f24267 100644
--- a/model/monitor.go
+++ b/model/monitor.go
@@ -48,6 +48,12 @@ type Monitor struct {
NotificationTag string // 当前服务监控所属的通知组
Cover uint8
+ EnableTriggerTask bool `gorm:"default: false"`
+ FailTriggerTasksRaw string `gorm:"default:'[]'"`
+ RecoverTriggerTasksRaw string `gorm:"default:'[]'"`
+ FailTriggerTasks []uint64 `gorm:"-" json:"-"` // 失败时执行的触发任务id
+ RecoverTriggerTasks []uint64 `gorm:"-" json:"-"` // 恢复时执行的触发任务id
+
MinLatency float32
MaxLatency float32
LatencyNotify bool
@@ -73,6 +79,21 @@ func (m *Monitor) CronSpec() string {
return fmt.Sprintf("@every %ds", m.Duration)
}
+func (m *Monitor) BeforeSave(tx *gorm.DB) error {
+
+ if data, err := utils.Json.Marshal(m.FailTriggerTasks); err != nil {
+ return err
+ } else {
+ m.FailTriggerTasksRaw = string(data)
+ }
+ if data, err := utils.Json.Marshal(m.RecoverTriggerTasks); err != nil {
+ return err
+ } else {
+ m.RecoverTriggerTasksRaw = string(data)
+ }
+ return nil
+}
+
func (m *Monitor) AfterFind(tx *gorm.DB) error {
m.SkipServers = make(map[uint64]bool)
var skipServers []uint64
@@ -83,6 +104,15 @@ func (m *Monitor) AfterFind(tx *gorm.DB) error {
for i := 0; i < len(skipServers); i++ {
m.SkipServers[skipServers[i]] = true
}
+
+ // 加载触发任务列表
+ if err := utils.Json.Unmarshal([]byte(m.FailTriggerTasksRaw), &m.FailTriggerTasks); err != nil {
+ return err
+ }
+ if err := utils.Json.Unmarshal([]byte(m.RecoverTriggerTasksRaw), &m.RecoverTriggerTasks); err != nil {
+ return err
+ }
+
return nil
}
diff --git a/resource/l10n/zh-CN.toml b/resource/l10n/zh-CN.toml
index f096e09..125245d 100644
--- a/resource/l10n/zh-CN.toml
+++ b/resource/l10n/zh-CN.toml
@@ -184,6 +184,9 @@ other = "始终触发"
[ModeOnetimeTrigger]
other = "单次触发"
+[EnableTriggerTask]
+other = "启用触发任务"
+
[FailTriggerTasks]
other = "故障时触发任务"
diff --git a/resource/static/main.js b/resource/static/main.js
index 42b1b68..edc5bf5 100644
--- a/resource/static/main.js
+++ b/resource/static/main.js
@@ -330,22 +330,61 @@ function addOrEditMonitor(monitor) {
modal.find("a.ui.label.visible").each((i, el) => {
el.remove();
});
+ if (monitor && monitor.EnableTriggerTask) {
+ modal.find(".ui.nb-EnableTriggerTask.checkbox").checkbox("set checked");
+ } else {
+ modal.find(".ui.nb-EnableTriggerTask.checkbox").checkbox("set unchecked");
+ }
var servers;
+ var failTriggerTasks;
+ var recoverTriggerTasks;
if (monitor) {
servers = monitor.SkipServersRaw;
const serverList = JSON.parse(servers || "[]");
- const node = modal.find("i.dropdown.icon");
+ const node = modal.find("i.dropdown.icon.specificServer");
for (let i = 0; i < serverList.length; i++) {
node.after(
- 'ID:' +
- serverList[i] +
- ''
+ 'ID:' +
+ serverList[i] +
+ ''
+ );
+ }
+
+ failTriggerTasks = monitor.FailTriggerTasksRaw;
+ recoverTriggerTasks = monitor.RecoverTriggerTasksRaw;
+ const failTriggerTasksList = JSON.parse(failTriggerTasks || "[]");
+ const recoverTriggerTasksList = JSON.parse(recoverTriggerTasks || "[]");
+ const node1 = modal.find("i.dropdown.icon.failTask");
+ const node2 = modal.find("i.dropdown.icon.recoverTask");
+ for (let i = 0; i < failTriggerTasksList.length; i++) {
+ node1.after(
+ 'ID:' +
+ failTriggerTasksList[i] +
+ ''
+ );
+ }
+ for (let i = 0; i < recoverTriggerTasksList.length; i++) {
+ node2.after(
+ 'ID:' +
+ recoverTriggerTasksList[i] +
+ ''
);
}
}
- modal
+modal
+ .find("input[name=FailTriggerTasksRaw]")
+ .val(monitor ? "[]," + failTriggerTasks.substr(1, failTriggerTasks.length - 2) : "[]");
+modal
+ .find("input[name=RecoverTriggerTasksRaw]")
+ .val(monitor ? "[]," + recoverTriggerTasks.substr(1, recoverTriggerTasks.length - 2) : "[]");
+
+modal
.find("input[name=SkipServersRaw]")
.val(monitor ? "[]," + servers.substr(1, servers.length - 2) : "[]");
showFormModal(".monitor.modal", "#monitorForm", "/api/monitor");
diff --git a/resource/template/component/monitor.html b/resource/template/component/monitor.html
index dd08eab..dff1efb 100644
--- a/resource/template/component/monitor.html
+++ b/resource/template/component/monitor.html
@@ -39,7 +39,7 @@
diff --git a/resource/template/dashboard-default/monitor.html b/resource/template/dashboard-default/monitor.html
index 2d97c75..14589bc 100644
--- a/resource/template/dashboard-default/monitor.html
+++ b/resource/template/dashboard-default/monitor.html
@@ -22,6 +22,9 @@
{{tr "NotificationMethodGroup"}} |
{{tr "FailureNotification"}} |
{{tr "LatencyNotification"}} |
+
{{tr "EnableTriggerTask"}} |
+
{{tr "FailTriggerTasks"}} |
+
{{tr "RecoverTriggerTasks"}} |
{{tr "Administration"}} |
@@ -41,6 +44,9 @@
{{$monitor.NotificationTag}} |
{{$monitor.Notify}} |
{{$monitor.LatencyNotify}} |
+
{{$monitor.EnableTriggerTask}} |
+
{{$monitor.FailTriggerTasksRaw}} |
+
{{$monitor.RecoverTriggerTasksRaw}} |
|