// 节点IP阈值 Vue.component("node-ip-address-thresholds-box", { props: ["v-thresholds"], data: function () { let thresholds = this.vThresholds if (thresholds == null) { thresholds = [] } else { thresholds.forEach(function (v) { if (v.items == null) { v.items = [] } if (v.actions == null) { v.actions = [] } }) } return { editingIndex: -1, thresholds: thresholds, addingThreshold: { items: [], actions: [] }, isAdding: false, isAddingItem: false, isAddingAction: false, itemCode: "nodeAvgRequests", itemReportGroups: [], itemOperator: "lte", itemValue: "", itemDuration: "5", allItems: window.IP_ADDR_THRESHOLD_ITEMS, allOperators: [ { "name": "小于等于", "code": "lte" }, { "name": "大于", "code": "gt" }, { "name": "不等于", "code": "neq" }, { "name": "小于", "code": "lt" }, { "name": "大于等于", "code": "gte" } ], allActions: window.IP_ADDR_THRESHOLD_ACTIONS, actionCode: "up", actionBackupIPs: "", actionWebHookURL: "" } }, methods: { add: function () { this.isAdding = !this.isAdding }, cancel: function () { this.isAdding = false this.editingIndex = -1 this.addingThreshold = { items: [], actions: [] } }, confirm: function () { if (this.addingThreshold.items.length == 0) { teaweb.warn("需要至少添加一个阈值") return } if (this.addingThreshold.actions.length == 0) { teaweb.warn("需要至少添加一个动作") return } if (this.editingIndex >= 0) { this.thresholds[this.editingIndex].items = this.addingThreshold.items this.thresholds[this.editingIndex].actions = this.addingThreshold.actions } else { this.thresholds.push({ items: this.addingThreshold.items, actions: this.addingThreshold.actions }) } // 还原 this.cancel() }, remove: function (index) { this.cancel() this.thresholds.$remove(index) }, update: function (index) { this.editingIndex = index this.addingThreshold = { items: this.thresholds[index].items.$copy(), actions: this.thresholds[index].actions.$copy() } this.isAdding = true }, addItem: function () { this.isAddingItem = !this.isAddingItem let that = this setTimeout(function () { that.$refs.itemValue.focus() }, 100) }, cancelItem: function () { this.isAddingItem = false this.itemCode = "nodeAvgRequests" this.itmeOperator = "lte" this.itemValue = "" this.itemDuration = "5" this.itemReportGroups = [] }, confirmItem: function () { // 特殊阈值快速添加 if (["nodeHealthCheckFailed"].$contains(this.itemCode)) { // 添加 this.addingThreshold.items.push({ item: this.itemCode, operator: this.itemOperator, value: 0, duration: 0, durationUnit: "minute", options: {} }) this.cancelItem() return } if (this.itemDuration.length == 0) { let that = this teaweb.warn("请输入统计周期", function () { that.$refs.itemDuration.focus() }) return } let itemDuration = parseInt(this.itemDuration) if (isNaN(itemDuration) || itemDuration <= 0) { teaweb.warn("请输入正确的统计周期", function () { that.$refs.itemDuration.focus() }) return } if (this.itemValue.length == 0) { let that = this teaweb.warn("请输入对比值", function () { that.$refs.itemValue.focus() }) return } let itemValue = parseFloat(this.itemValue) if (isNaN(itemValue)) { teaweb.warn("请输入正确的对比值", function () { that.$refs.itemValue.focus() }) return } let options = {} switch (this.itemCode) { case "connectivity": // 连通性校验 if (itemValue > 100) { let that = this teaweb.warn("连通性对比值不能超过100", function () { that.$refs.itemValue.focus() }) return } options["groups"] = this.itemReportGroups break } // 添加 this.addingThreshold.items.push({ item: this.itemCode, operator: this.itemOperator, value: itemValue, duration: itemDuration, durationUnit: "minute", options: options }) // 还原 this.cancelItem() }, removeItem: function (index) { this.cancelItem() this.addingThreshold.items.$remove(index) }, changeReportGroups: function (groups) { this.itemReportGroups = groups }, itemName: function (item) { let result = "" this.allItems.forEach(function (v) { if (v.code == item) { result = v.name } }) return result }, itemUnitName: function (itemCode) { let result = "" this.allItems.forEach(function (v) { if (v.code == itemCode) { result = v.unit } }) return result }, itemDurationUnitName: function (unit) { switch (unit) { case "minute": return "分钟" case "second": return "秒" case "hour": return "小时" case "day": return "天" } return unit }, itemOperatorName: function (operator) { let result = "" this.allOperators.forEach(function (v) { if (v.code == operator) { result = v.name } }) return result }, addAction: function () { this.isAddingAction = !this.isAddingAction }, cancelAction: function () { this.isAddingAction = false this.actionCode = "up" this.actionBackupIPs = "" this.actionWebHookURL = "" }, confirmAction: function () { this.doConfirmAction(false) }, doConfirmAction: function (validated, options) { // 是否已存在 let exists = false let that = this this.addingThreshold.actions.forEach(function (v) { if (v.action == that.actionCode) { exists = true } }) if (exists) { teaweb.warn("此动作已经添加过了,无需重复添加") return } if (options == null) { options = {} } switch (this.actionCode) { case "switch": if (!validated) { Tea.action("/ui/validateIPs") .params({ "ips": this.actionBackupIPs }) .success(function (resp) { if (resp.data.ips.length == 0) { teaweb.warn("请输入备用IP", function () { that.$refs.actionBackupIPs.focus() }) return } options["ips"] = resp.data.ips that.doConfirmAction(true, options) }) .fail(function (resp) { teaweb.warn("输入的IP '" + resp.data.failIP + "' 格式不正确,请改正后提交", function () { that.$refs.actionBackupIPs.focus() }) }) .post() return } break case "webHook": if (this.actionWebHookURL.length ==0) { teaweb.warn("请输入WebHook URL", function () { that.$refs.webHookURL.focus() }) return } if (!this.actionWebHookURL.match(/^(http|https):\/\//i)) { teaweb.warn("URL开头必须是http://或者https://", function () { that.$refs.webHookURL.focus() }) return } options["url"] = this.actionWebHookURL } this.addingThreshold.actions.push({ action: this.actionCode, options: options }) // 还原 this.cancelAction() }, removeAction: function (index) { this.cancelAction() this.addingThreshold.actions.$remove(index) }, actionName: function (actionCode) { let result = "" this.allActions.forEach(function (v) { if (v.code == actionCode) { result = v.name } }) return result } }, template: `
[{{item.duration}}{{itemDurationUnitName(item.durationUnit)}}] {{itemName(item.item)}} [{{group.name}}   ] [{{itemOperatorName(item.operator)}}]  {{item.value}}{{itemUnitName(item.item)}}  AND   -> {{actionName(action.action)}} 到{{action.options.ips.join(", ")}} ({{action.options.url}})  AND    
阈值 动作
[{{item.duration}}{{itemDurationUnitName(item.durationUnit)}}] {{itemName(item.item)}} [{{group.name}}   ] [{{itemOperatorName(item.operator)}}] {{item.value}}{{itemUnitName(item.item)}}  
统计项目

{{item.description}}

统计周期
分钟
操作符
对比值
{{item.unit}}
终端分组
 
{{actionName(action.action)}}   到{{action.options.ips.join(", ")}} ({{action.options.url}})
动作类型

{{action.description}}

备用IP *

每行一个备用IP。

URL *

完整的URL,比如https://example.com/webhook/api,系统会在触发阈值的时候通过GET调用此URL。

 
 
` })