netmaker/netclient/ncutils/peerhelper.go

96 lines
2.3 KiB
Go
Raw Normal View History

2021-11-11 05:08:29 +08:00
package ncutils
import (
"strconv"
"strings"
"net"
"time"
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
)
func GetPeers(iface string) ([]wgtypes.Peer, error) {
2021-11-11 06:02:45 +08:00
2021-11-11 05:08:29 +08:00
var peers []wgtypes.Peer
output, err := RunCmd("wg show "+iface+" dump",true)
if err != nil {
return peers, err
}
2021-11-11 06:02:45 +08:00
for i, line := range strings.Split(strings.TrimSuffix(output, "\n"), "\n") {
if i == 0 {
continue
2021-11-11 05:08:29 +08:00
}
var allowedIPs []net.IPNet
2021-11-11 06:02:45 +08:00
fields := strings.Fields(line)
if len(fields) < 4 {
Log("error parsing peer: "+line)
continue
}
2021-11-11 05:08:29 +08:00
pubkeystring := fields[0]
2021-11-11 06:02:45 +08:00
endpointstring := fields[2]
2021-11-11 05:08:29 +08:00
allowedipstring := fields[3]
2021-11-11 06:02:45 +08:00
var pkeepalivestring string
if len(fields) > 7 {
pkeepalivestring = fields[7]
}
2021-11-11 05:08:29 +08:00
// AllowedIPs = private IP + defined networks
pubkey, err := wgtypes.ParseKey(pubkeystring)
if err != nil {
Log("error parsing peer key "+pubkeystring)
continue
}
ipstrings := strings.Split(allowedipstring, ",")
for _, ipstring := range ipstrings {
var netip net.IP
2021-11-11 06:02:45 +08:00
if netip = net.ParseIP(strings.Split(ipstring,"/")[0]); netip != nil {
2021-11-11 05:08:29 +08:00
allowedIPs = append(
allowedIPs,
net.IPNet{
IP: netip,
Mask: netip.DefaultMask(),
},
)
}
}
if len(allowedIPs) == 0 {
Log("error parsing peer "+pubkeystring+", no allowedips found")
continue
}
var endpointarr []string
var endpointip net.IP
if endpointarr = strings.Split(endpointstring,":"); len(endpointarr) != 2 {
Log("error parsing peer "+pubkeystring+", could not parse endpoint: "+endpointstring)
continue
}
if endpointip = net.ParseIP(endpointarr[0]); endpointip == nil {
Log("error parsing peer "+pubkeystring+", could not parse endpoint: "+endpointarr[0])
continue
}
var port int
if port, err = strconv.Atoi(endpointarr[1]); err != nil {
Log("error parsing peer "+pubkeystring+", could not parse port: "+err.Error())
continue
}
var endpoint = net.UDPAddr {
IP: endpointip,
Port: port,
}
var dur time.Duration
if pkeepalivestring != "" {
if dur, err = time.ParseDuration(pkeepalivestring+"s"); err != nil {
Log("error parsing peer "+pubkeystring+", could not parse keepalive: "+err.Error())
}
}
peers = append(peers, wgtypes.Peer{
PublicKey: pubkey,
Endpoint: &endpoint,
AllowedIPs: allowedIPs,
PersistentKeepaliveInterval: dur,
})
}
return peers, err
2021-11-11 06:02:45 +08:00
}