api_node.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. package models
  2. import (
  3. "net"
  4. "time"
  5. "github.com/google/uuid"
  6. )
  7. // ApiNode is a stripped down Node DTO that exposes only required fields to external systems
  8. type ApiNode struct {
  9. ID string `json:"id,omitempty" validate:"required,min=5,id_unique"`
  10. HostID string `json:"hostid,omitempty" validate:"required,min=5,id_unique"`
  11. Address string `json:"address" validate:"omitempty,ipv4"`
  12. Address6 string `json:"address6" validate:"omitempty,ipv6"`
  13. PostUp string `json:"postup"`
  14. PostDown string `json:"postdown"`
  15. AllowedIPs []string `json:"allowedips"`
  16. PersistentKeepalive int32 `json:"persistentkeepalive"`
  17. LastModified int64 `json:"lastmodified"`
  18. ExpirationDateTime int64 `json:"expdatetime"`
  19. LastCheckIn int64 `json:"lastcheckin"`
  20. LastPeerUpdate int64 `json:"lastpeerupdate"`
  21. Network string `json:"network"`
  22. NetworkRange string `json:"networkrange"`
  23. NetworkRange6 string `json:"networkrange6"`
  24. IsRelayed bool `json:"isrelayed"`
  25. IsRelay bool `json:"isrelay"`
  26. IsEgressGateway bool `json:"isegressgateway"`
  27. IsIngressGateway bool `json:"isingressgateway"`
  28. EgressGatewayRanges []string `json:"egressgatewayranges"`
  29. EgressGatewayNatEnabled bool `json:"egressgatewaynatenabled"`
  30. RelayAddrs []string `json:"relayaddrs"`
  31. FailoverNode string `json:"failovernode"`
  32. DNSOn bool `json:"dnson"`
  33. IsLocal bool `json:"islocal"`
  34. Server string `json:"server"`
  35. InternetGateway string `json:"internetgateway"`
  36. Connected bool `json:"connected"`
  37. PendingDelete bool `json:"pendingdelete"`
  38. // == PRO ==
  39. DefaultACL string `json:"defaultacl,omitempty" validate:"checkyesornoorunset"`
  40. Failover bool `json:"failover"`
  41. }
  42. // ApiNode.ConvertToServerNode - converts an api node to a server node
  43. func (a *ApiNode) ConvertToServerNode(currentNode *Node) *Node {
  44. convertedNode := Node{}
  45. convertedNode.Network = a.Network
  46. convertedNode.Server = a.Server
  47. convertedNode.Action = currentNode.Action
  48. convertedNode.Connected = a.Connected
  49. convertedNode.AllowedIPs = a.AllowedIPs
  50. convertedNode.ID, _ = uuid.Parse(a.ID)
  51. convertedNode.HostID, _ = uuid.Parse(a.HostID)
  52. convertedNode.PostUp = a.PostUp
  53. convertedNode.PostDown = a.PostDown
  54. convertedNode.IsLocal = a.IsLocal
  55. convertedNode.IsRelay = a.IsRelay
  56. convertedNode.IsRelayed = a.IsRelayed
  57. convertedNode.PendingDelete = a.PendingDelete
  58. convertedNode.Peers = currentNode.Peers
  59. convertedNode.Failover = a.Failover
  60. convertedNode.IsEgressGateway = a.IsEgressGateway
  61. convertedNode.IsIngressGateway = a.IsIngressGateway
  62. convertedNode.EgressGatewayRanges = a.EgressGatewayRanges
  63. convertedNode.IngressGatewayRange = currentNode.IngressGatewayRange
  64. convertedNode.IngressGatewayRange6 = currentNode.IngressGatewayRange6
  65. convertedNode.DNSOn = a.DNSOn
  66. convertedNode.EgressGatewayRequest = currentNode.EgressGatewayRequest
  67. convertedNode.EgressGatewayNatEnabled = currentNode.EgressGatewayNatEnabled
  68. convertedNode.PersistentKeepalive = time.Duration(a.PersistentKeepalive)
  69. convertedNode.RelayAddrs = a.RelayAddrs
  70. convertedNode.DefaultACL = a.DefaultACL
  71. convertedNode.OwnerID = currentNode.OwnerID
  72. _, networkRange, err := net.ParseCIDR(a.NetworkRange)
  73. if err == nil {
  74. convertedNode.NetworkRange = *networkRange
  75. }
  76. _, networkRange6, err := net.ParseCIDR(a.NetworkRange6)
  77. if err == nil {
  78. convertedNode.NetworkRange6 = *networkRange6
  79. }
  80. udpAddr, err := net.ResolveUDPAddr("udp", a.InternetGateway)
  81. if err == nil {
  82. convertedNode.InternetGateway = udpAddr
  83. }
  84. _, addr, err := net.ParseCIDR(a.Address)
  85. if err == nil {
  86. convertedNode.Address = *addr
  87. }
  88. _, addr6, err := net.ParseCIDR(a.Address6)
  89. if err == nil {
  90. convertedNode.Address = *addr6
  91. }
  92. convertedNode.FailoverNode, _ = uuid.Parse(a.FailoverNode)
  93. convertedNode.LastModified = time.Unix(a.LastModified, 0)
  94. convertedNode.LastCheckIn = time.Unix(a.LastCheckIn, 0)
  95. convertedNode.LastPeerUpdate = time.Unix(a.LastPeerUpdate, 0)
  96. convertedNode.ExpirationDateTime = time.Unix(a.ExpirationDateTime, 0)
  97. return &convertedNode
  98. }
  99. // Node.ConvertToAPINode - converts a node to an API node
  100. func (nm *Node) ConvertToAPINode() *ApiNode {
  101. apiNode := ApiNode{}
  102. apiNode.ID = nm.ID.String()
  103. apiNode.HostID = nm.ID.String()
  104. apiNode.Address = nm.Address.String()
  105. if isEmptyAddr(apiNode.Address) {
  106. apiNode.Address = ""
  107. }
  108. apiNode.Address6 = nm.Address6.String()
  109. if isEmptyAddr(apiNode.Address6) {
  110. apiNode.Address6 = ""
  111. }
  112. apiNode.PostDown = nm.PostDown
  113. apiNode.PostUp = nm.PostUp
  114. apiNode.AllowedIPs = nm.AllowedIPs
  115. apiNode.PersistentKeepalive = int32(nm.PersistentKeepalive)
  116. apiNode.LastModified = nm.LastModified.Unix()
  117. apiNode.LastCheckIn = nm.LastCheckIn.Unix()
  118. apiNode.LastPeerUpdate = nm.LastPeerUpdate.Unix()
  119. apiNode.Network = nm.Network
  120. apiNode.NetworkRange = nm.NetworkRange.String()
  121. if isEmptyAddr(apiNode.NetworkRange) {
  122. apiNode.NetworkRange = ""
  123. }
  124. apiNode.NetworkRange6 = nm.NetworkRange6.String()
  125. if isEmptyAddr(apiNode.NetworkRange6) {
  126. apiNode.NetworkRange6 = ""
  127. }
  128. apiNode.IsRelayed = nm.IsRelayed
  129. apiNode.IsRelay = nm.IsRelay
  130. apiNode.IsEgressGateway = nm.IsEgressGateway
  131. apiNode.IsIngressGateway = nm.IsIngressGateway
  132. apiNode.EgressGatewayRanges = nm.EgressGatewayRanges
  133. apiNode.EgressGatewayNatEnabled = nm.EgressGatewayNatEnabled
  134. apiNode.RelayAddrs = nm.RelayAddrs
  135. apiNode.FailoverNode = nm.FailoverNode.String()
  136. if isUUIDSet(apiNode.FailoverNode) {
  137. apiNode.FailoverNode = ""
  138. }
  139. apiNode.DNSOn = nm.DNSOn
  140. apiNode.IsLocal = nm.IsLocal
  141. apiNode.Server = nm.Server
  142. apiNode.InternetGateway = nm.InternetGateway.String()
  143. if isEmptyAddr(apiNode.InternetGateway) {
  144. apiNode.InternetGateway = ""
  145. }
  146. apiNode.Connected = nm.Connected
  147. apiNode.PendingDelete = nm.PendingDelete
  148. apiNode.DefaultACL = nm.DefaultACL
  149. apiNode.Failover = nm.Failover
  150. return &apiNode
  151. }
  152. func isEmptyAddr(addr string) bool {
  153. return addr == "<nil>" || addr == ":0"
  154. }
  155. func isUUIDSet(uuid string) bool {
  156. return uuid != "00000000-0000-0000-0000-000000000000"
  157. }