1.优化即时刷新DDNS任务IP信息显示
2.优化Webhook触发机制
3.新增域名更新状态 暂停,用于标记获取IP失败
4.优化ddns任务执行时间间隔计算
This commit is contained in:
古大羊 2022-08-04 18:46:03 +08:00
parent a2ce54fef6
commit a5b58811a3
8 changed files with 77 additions and 34 deletions

View File

@ -15,7 +15,9 @@ const (
// UpdatedSuccess 更新成功
UpdatedSuccess = "成功"
// UpdateStop 暂停
UpdateStop = "暂停"
UpdateStop = "停止同步"
//UpdatePause 暂停 获取IP失败时暂停
UpdatePause = "暂停同步"
// UpdateWaiting
UpdateWaiting = "等待更新"
)

View File

@ -23,7 +23,7 @@ func (d *DDNSTask) ExecWebhook(domains *DomainsState) {
tryUpdate := hasDomainTryToUpdate(domains.Domains)
if d.WebhookURL != "" && tryUpdate {
if d.WebhookURL != "" && (tryUpdate || (domains.IpAddr == "" && d.WebhookCallOnGetIPfail)) {
//log.Printf("DDNS任务【%s】触发Webhook", d.TaskName)
@ -66,6 +66,8 @@ func WebhookTest(d *DDNSTask, url, method, WebhookRequestBody, proxy, addr, user
url = replaceWebhookTestPara(url, nowTime)
requestBody := replaceWebhookTestPara(WebhookRequestBody, nowTime)
//log.Printf("requestBody:\n%s", requestBody)
//headersStr := cb.task.DNS.Callback.Headers
var headerStrList []string
for i := range headerList {
@ -205,8 +207,15 @@ func hasDomainTryToUpdate(domains []*Domain) bool {
// replaceWebhookTestPara WebhookTest替换参数 #{successDomains},#{failedDomains}
func replaceWebhookTestPara(orgPara, nowTime string) (newPara string) {
orgPara = strings.ReplaceAll(orgPara, "#{ipAddr}", "66.66.66.66")
orgPara = strings.ReplaceAll(orgPara, "#{successDomains}", "baidu.com,google.com")
orgPara = strings.ReplaceAll(orgPara, "#{failedDomains}", "weibo.com,github.com")
successDomains := "www1.google.com,www2.google.com,www3.google.com,www4.google.com"
failedDomains := "www1.github.com,www2.github.com,www3.github.com,www4.github.com"
successDomainsLine := strings.Replace(successDomains, ",", `\n`, -1)
failedDomainsLine := strings.Replace(failedDomains, ",", `\n`, -1)
orgPara = strings.ReplaceAll(orgPara, "#{successDomains}", successDomains)
orgPara = strings.ReplaceAll(orgPara, "#{failedDomains}", failedDomains)
orgPara = strings.ReplaceAll(orgPara, "#{successDomainsLine}", successDomainsLine)
orgPara = strings.ReplaceAll(orgPara, "#{failedDomainsLine}", failedDomainsLine)
orgPara = strings.ReplaceAll(orgPara, "#{time}", nowTime)
return orgPara
}
@ -214,13 +223,23 @@ func replaceWebhookTestPara(orgPara, nowTime string) (newPara string) {
// replacePara 替换参数 #{successDomains},#{failedDomains}
func replaceWebhookPara(d *DomainsState, nowTime, orgPara string) (newPara string) {
ipAddrText := d.IpAddr
successDomains, failedDomains := getDomainsStr(d.Domains)
if ipAddrText == "" {
ipAddrText = "获取IP失败"
successDomains = ""
failedDomains = ""
}
successDomainsLine := strings.Replace(successDomains, ",", `\n`, -1)
failedDomainsLine := strings.Replace(failedDomains, ",", `\n`, -1)
orgPara = strings.ReplaceAll(orgPara, "#{ipAddr}", ipAddrText)
successDomains, failedDomains := getDomainsStr(d.Domains)
orgPara = strings.ReplaceAll(orgPara, "#{successDomains}", successDomains)
orgPara = strings.ReplaceAll(orgPara, "#{failedDomains}", failedDomains)
orgPara = strings.ReplaceAll(orgPara, "#{successDomainsLine}", successDomainsLine)
orgPara = strings.ReplaceAll(orgPara, "#{failedDomainsLine}", failedDomainsLine)
orgPara = strings.ReplaceAll(orgPara, "#{time}", nowTime)
return orgPara
}

View File

@ -34,6 +34,8 @@ func syncAllDomainsOnce(params ...any) {
config.CleanIPUrlAddrMap()
ddnsConf := config.GetDDNSConfigure()
taskBeginTime := time.Now()
for index := range ddnsTaskList {
task := ddnsTaskList[index]
@ -60,8 +62,14 @@ func syncAllDomainsOnce(params ...any) {
}
wg.Wait()
taskEndTime := time.Now()
usedTime := taskEndTime.Sub(taskBeginTime)
nextTaskTimer := time.Second*time.Duration(ddnsConf.Intervals) - usedTime
//log.Printf("syncAllDomainsOnce 任务完成")
DDNSService.Timer = time.NewTimer(time.Second * time.Duration(ddnsConf.Intervals))
DDNSService.Timer = time.NewTimer(nextTaskTimer)
}
func syncTaskDomainsOnce(params ...any) {
@ -71,6 +79,7 @@ func syncTaskDomainsOnce(params ...any) {
case "syncDDNSTask":
{
//log.Printf("syncTaskDomainsOnce 单DDNS任务更新%s", taskKey)
config.CleanIPUrlAddrMap()
task := config.GetDDNSTaskByKey(taskKey)
syncDDNSTask(task)
}

View File

@ -38,11 +38,12 @@ func (d *DNSCommon) AddUpdateDomainRecords() string {
func (d *DNSCommon) addUpdateDomainRecords(recordType string) string {
ipAddr, change, domains := d.task.DomainsState.CheckIPChange(recordType, d.task.TaskKey, d.task.GetIpAddr)
d.task.DomainsState.SetIPAddr(ipAddr)
//及时刷新IP地址显示
config.DDNSTaskListFlushDomainsDetails(d.task.TaskKey, &d.task.DomainsState)
if ipAddr == "" {
d.task.DomainsState.SetDomainUpdateStatus(config.UpdatedFailed, "获取公网IP失败")
d.task.DomainsState.SetDomainUpdateStatus(config.UpdatePause, "获取公网IP失败")
return ipAddr
}
@ -88,9 +89,14 @@ sync:
if d.task.DNS.ResolverDoaminCheck {
domainResolverIPaddr, _ := ResolveDomainAtServerList(recordType, domain.String(), d.task.DNS.DNSServerList)
//log.Printf("domain:%s domainResolverIPaddr:%s ,ipaddr:%s", domain.String(), domainResolverIPaddr, ipAddr)
if domainResolverIPaddr == ipAddr {
domain.SetDomainUpdateStatus(config.UpdatedNothing, "")
if domain.UpdateStatus == config.UpdatedFailed {
domain.SetDomainUpdateStatus(config.UpdatedSuccess, "")
} else {
domain.SetDomainUpdateStatus(config.UpdatedNothing, "")
}
continue
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -8,8 +8,8 @@
<title>Lucky(大吉)</title>
<script type="module" crossorigin src="/assets/index.2a9c070f.js"></script>
<link rel="stylesheet" href="/assets/index.c6f60373.css">
<script type="module" crossorigin src="/assets/index.85a8bea4.js"></script>
<link rel="stylesheet" href="/assets/index.c38c8b21.css">
</head>
<body style="margin:0">
<div id="app"></div>

View File

@ -825,8 +825,11 @@
<el-tooltip class="box-item" effect="dark" content="">
<template #content>支持的变量 <br />
#{ipAddr} : 当前公网IP<br />
#{successDomains} : 更新/添加成功的域名列表<br />
#{failedDomains} : 更新/添加失败的域名列表</template>
#{time} : 触发Webhook的时间 <br />
#{successDomains} : 更新/添加成功的域名列表,域名之间用,号分隔<br />
#{successDomainsLine} : 更新/添加成功的域名列表,域名之间用'\n'分隔<br />
#{failedDomains} : 更新/添加失败的域名列表,域名之间用,号分隔<br />
#{failedDomainsLine} : 更新/添加失败的域名列表,域名之间用'\n'分隔</template>
<el-form-item label="接口地址" label-width="auto">
<el-input v-model="DDNSForm.WebhookURL" autocomplete="off" />
</el-form-item>
@ -849,8 +852,10 @@
支持的变量 :<br />
#{time} : 触发Webhook的时间 <br />
#{ipAddr} : 当前公网IP <br />
#{successDomains} : 更新/添加成功的域名列表<br />
#{failedDomains} : 更新/添加失败的域名列表<br />
#{successDomains} : 更新/添加成功的域名列表,域名之间用,号分隔<br />
#{successDomainsLine} : 更新/添加成功的域名列表,域名之间用'\n'分隔<br />
#{failedDomains} : 更新/添加失败的域名列表,域名之间用,号分隔<br />
#{failedDomainsLine} : 更新/添加失败的域名列表,域名之间用'\n'分隔<br />
如果需要使用BasicAuth,请使用下面两行Header设置BasicAuth的账号和密码<br />
BasicAuthUserName:你的账号<br />
BasicAuthPassword:你的密码</template>
@ -868,8 +873,10 @@
<template #content>支持的变量<br />
#{time} : 触发Webhook的时间 <br />
#{ipAddr} : 当前公网IP<br />
#{successDomains} : 更新/添加成功的域名列表<br />
#{failedDomains} : 更新/添加失败的域名列表</template>
#{successDomains} : 更新/添加成功的域名列表,域名之间用,号分隔<br />
#{successDomainsLine} : 更新/添加成功的域名列表,域名之间用'\n'分隔<br />
#{failedDomains} : 更新/添加失败的域名列表,域名之间用,号分隔<br />
#{failedDomainsLine} : 更新/添加失败的域名列表,域名之间用'\n'分隔</template>
<el-form-item label="RequestBody" label-width="auto"
v-show="DDNSForm.WebhookMethod == 'get' ? false : true">
<el-input v-model="DDNSForm.WebhookRequestBody" type="textarea" rows="5"
@ -884,8 +891,10 @@
多种表示成功的不同字符串请分多行写<br />
支持的变量 <br />
#{ipAddr} : 当前公网IP<br />
#{successDomains} : 更新/添加成功的域名列表<br />
#{failedDomains} : 更新/添加失败的域名列表</template>
#{successDomains} : 更新/添加成功的域名列表,域名之间用,号分隔<br />
#{successDomainsLine} : 更新/添加成功的域名列表,域名之间用'\n'分隔<br />
#{failedDomains} : 更新/添加失败的域名列表,域名之间用,号分隔<br />
#{failedDomainsLine} : 更新/添加失败的域名列表,域名之间用'\n'分隔</template>
<el-form-item label="接口调用成功包含的字符串" label-width="auto">
<el-input v-model="DDNSFormWebhookSuccessContentArea"
:autosize="{ minRows: 3, maxRows: 5 }" type="textarea" autocomplete="off"
@ -1306,8 +1315,8 @@ const WebhookServerSelectChange = (server : string)=>{
let dingding_msg = {
msgtype:"markdown",
markdown:{
title:"你的公网IP变了",
text:'#### 你的公网IP变了 \n - IP地址#{ipAddr} \n - 域名更新成功列表:#{successDomains}\n - 域名更新失败列表:#{failedDomains}\n - Webhook触发时间:#{time}'
title:"DDNS域名同步反馈",
text:'#### DDNS域名同步反馈 \n - IP地址#{ipAddr} \n - 域名更新成功列表:#{successDomainsLine}\n - 域名更新失败列表:#{failedDomainsLine}\n - Webhook触发时间: \n #{time}'
},
}
WebhookServerListArea.value = JSON.stringify(dingding_msg,null,2);
@ -1318,12 +1327,12 @@ const WebhookServerSelectChange = (server : string)=>{
content:{
post:{
zh_cn:{
title:"你的公网IP变了",
title:"DDNS域名同步反馈",
content:[
[{tag:"text",text:"IP地址#{ipAddr}"}],
[{tag:"text",text:"域名更新成功列表:#{successDomains}"}],
[{tag:"text",text:"域名更新失败列表:#{failedDomains}"}],
[{tag:"text",text:"Webhook触发时间: #{time}"}],
[{tag:"text",text:"域名更新成功列表:#{successDomainsLine}"}],
[{tag:"text",text:"域名更新失败列表:#{successDomainsLine}"}],
[{tag:"text",text:"Webhook触发时间: \n#{time}"}],
]
}
}
@ -1335,7 +1344,7 @@ const WebhookServerSelectChange = (server : string)=>{
let weixin_msg = {
msgtype:"markdown",
markdown:{
content:'#### 你的公网IP变了 \n - IP地址#{ipAddr} \n - 域名更新成功列表:#{successDomains}\n - 域名更新失败列表:#{failedDomains}\n - Webhook触发时间:#{time}'
content:'#### DDNS域名同步反馈 \n##### IP地址\n#{ipAddr} \n##### 域名更新成功列表:\n#{successDomainsLine}\n##### 域名更新失败列表:\n#{failedDomainsLine}\n##### Webhook触发时间: \n#{time}'
}
}
WebhookServerListArea.value= JSON.stringify(weixin_msg,null,2)