66 lines
1.8 KiB
Go
66 lines
1.8 KiB
Go
package queues
|
||
|
||
import (
|
||
"fmt"
|
||
"gitee.ltd/lxh/logger/log"
|
||
"strings"
|
||
"time"
|
||
"wireguard-dashboard/client"
|
||
"wireguard-dashboard/repository"
|
||
"wireguard-dashboard/utils"
|
||
)
|
||
|
||
// offlineMonitoring
|
||
// @description: 离线监听任务
|
||
func offlineMonitoring() {
|
||
for {
|
||
devices, err := client.WireguardClient.Devices()
|
||
if err != nil {
|
||
time.Sleep(5 * time.Minute) // 休眠五分钟再执行
|
||
offlineMonitoring()
|
||
continue
|
||
}
|
||
|
||
// 遍历客户端数据,并渲染数据信息
|
||
for _, d := range devices {
|
||
for _, p := range d.Peers {
|
||
clientInfo, err := repository.Client().GetByPublicKey(p.PublicKey.String())
|
||
if err != nil {
|
||
continue
|
||
}
|
||
|
||
// 没有启用离线监听时,即使客户端已经离线则也不执行
|
||
if *clientInfo.OfflineMonitoring != 1 || clientInfo.Email == "" {
|
||
continue
|
||
}
|
||
|
||
var ipAllocation string
|
||
for _, iaip := range p.AllowedIPs {
|
||
ipAllocation += iaip.String() + ","
|
||
}
|
||
ipAllocation = strings.TrimRight(ipAllocation, ",")
|
||
isOnline := time.Since(p.LastHandshakeTime).Minutes() < 3
|
||
|
||
// 未离线
|
||
if !isOnline {
|
||
continue
|
||
}
|
||
|
||
content := fmt.Sprintf("客户端:%s\r\n", clientInfo.Name)
|
||
content += fmt.Sprintf("客户端IP:%s\r\n", ipAllocation)
|
||
content += fmt.Sprintf("端点IP:%s", p.Endpoint.String())
|
||
content += fmt.Sprintf("最后握手时间:%s\r\n", p.LastHandshakeTime.Format("2006-01-02 15:04:05"))
|
||
content += fmt.Sprintf("离线时间:%s\r\n", time.Now().Format("2006-01-02 15:04:05"))
|
||
|
||
// 离线并且配置了邮箱,准备发送邮件
|
||
err = utils.Mail().SendMail(clientInfo.Email, fmt.Sprintf("客户端离线通知"), content, "")
|
||
if err != nil {
|
||
log.Errorf("发送离线通知邮件失败: %v", err.Error())
|
||
continue
|
||
}
|
||
|
||
}
|
||
}
|
||
}
|
||
}
|