peerhelper.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package ncutils
  2. import (
  3. "strconv"
  4. "strings"
  5. "net"
  6. "time"
  7. "golang.zx2c4.com/wireguard/wgctrl/wgtypes"
  8. )
  9. func GetPeers(iface string) ([]wgtypes.Peer, error) {
  10. var peers []wgtypes.Peer
  11. output, err := RunCmd("wg show "+iface+" dump",true)
  12. if err != nil {
  13. return peers, err
  14. }
  15. for i, line := range strings.Split(strings.TrimSuffix(output, "\n"), "\n") {
  16. if i == 0 {
  17. continue
  18. }
  19. var allowedIPs []net.IPNet
  20. fields := strings.Fields(line)
  21. if len(fields) < 4 {
  22. Log("error parsing peer: "+line)
  23. continue
  24. }
  25. pubkeystring := fields[0]
  26. endpointstring := fields[2]
  27. allowedipstring := fields[3]
  28. var pkeepalivestring string
  29. if len(fields) > 7 {
  30. pkeepalivestring = fields[7]
  31. }
  32. // AllowedIPs = private IP + defined networks
  33. pubkey, err := wgtypes.ParseKey(pubkeystring)
  34. if err != nil {
  35. Log("error parsing peer key "+pubkeystring)
  36. continue
  37. }
  38. ipstrings := strings.Split(allowedipstring, ",")
  39. for _, ipstring := range ipstrings {
  40. var netip net.IP
  41. if netip = net.ParseIP(strings.Split(ipstring,"/")[0]); netip != nil {
  42. allowedIPs = append(
  43. allowedIPs,
  44. net.IPNet{
  45. IP: netip,
  46. Mask: netip.DefaultMask(),
  47. },
  48. )
  49. }
  50. }
  51. if len(allowedIPs) == 0 {
  52. Log("error parsing peer "+pubkeystring+", no allowedips found")
  53. continue
  54. }
  55. var endpointarr []string
  56. var endpointip net.IP
  57. if endpointarr = strings.Split(endpointstring,":"); len(endpointarr) != 2 {
  58. Log("error parsing peer "+pubkeystring+", could not parse endpoint: "+endpointstring)
  59. continue
  60. }
  61. if endpointip = net.ParseIP(endpointarr[0]); endpointip == nil {
  62. Log("error parsing peer "+pubkeystring+", could not parse endpoint: "+endpointarr[0])
  63. continue
  64. }
  65. var port int
  66. if port, err = strconv.Atoi(endpointarr[1]); err != nil {
  67. Log("error parsing peer "+pubkeystring+", could not parse port: "+err.Error())
  68. continue
  69. }
  70. var endpoint = net.UDPAddr {
  71. IP: endpointip,
  72. Port: port,
  73. }
  74. var dur time.Duration
  75. if pkeepalivestring != "" {
  76. if dur, err = time.ParseDuration(pkeepalivestring+"s"); err != nil {
  77. Log("error parsing peer "+pubkeystring+", could not parse keepalive: "+err.Error())
  78. }
  79. }
  80. peers = append(peers, wgtypes.Peer{
  81. PublicKey: pubkey,
  82. Endpoint: &endpoint,
  83. AllowedIPs: allowedIPs,
  84. PersistentKeepaliveInterval: dur,
  85. })
  86. }
  87. return peers, err
  88. }