package hvpnnode3 import ( "fmt" "log/slog" "strings" "time" "golang.zx2c4.com/wireguard/wgctrl/wgtypes" ) var log slog.Logger func StartMonitor(wg *WGLink, log slog.Logger) { go monitor(wg, log) } func monitor(wg *WGLink, log slog.Logger) { log.Info("[WGMonitor] Starting") for { time.Sleep(time.Second * 10) peers, err := wg.GetAllPeers() if err != nil { log.Error("[WGMonitor] " + err.Error()) continue } sb := strings.Builder{} var activePeers int var totalRx int64 var totalTx int64 for _, peer := range peers { totalRx += peer.ReceiveBytes totalTx += peer.TransmitBytes if isActive(peer) { activePeers += 1 } } sb.WriteString(fmt.Sprintf("Peers: %d ", len(peers))) sb.WriteString(fmt.Sprintf("Active peers: %d ", activePeers)) sb.WriteString(fmt.Sprintf("TX: %d RX: %d", totalTx, totalRx)) log.Info("[WGMonitor] " + sb.String()) } } func isActive(peer wgtypes.Peer) bool { if peer.LastHandshakeTime.IsZero() { return false } else if time.Since(peer.LastHandshakeTime.UTC()) < time.Duration(4 * time.Minute) { return true } return false }