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