peerhelper.go 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package ncutils
  2. import (
  3. "golang.zx2c4.com/wireguard/wgctrl/wgtypes"
  4. "net"
  5. "strconv"
  6. "strings"
  7. "time"
  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. }