netmaker/models/api_node.go

177 lines
6.8 KiB
Go
Raw Normal View History

2022-12-21 01:16:24 +08:00
package models
2022-12-22 00:56:29 +08:00
import (
"net"
"time"
"github.com/google/uuid"
)
2022-12-21 01:16:24 +08:00
// ApiNode is a stripped down Node DTO that exposes only required fields to external systems
type ApiNode struct {
2022-12-22 00:56:29 +08:00
ID string `json:"id,omitempty" validate:"required,min=5,id_unique"`
HostID string `json:"hostid,omitempty" validate:"required,min=5,id_unique"`
Address string `json:"address" validate:"omitempty,ipv4"`
Address6 string `json:"address6" validate:"omitempty,ipv6"`
2022-12-24 03:06:39 +08:00
LocalAddress string `json:"localaddress" validate:"omitempty,ipv4"`
2022-12-22 00:56:29 +08:00
AllowedIPs []string `json:"allowedips"`
PersistentKeepalive int32 `json:"persistentkeepalive"`
LastModified int64 `json:"lastmodified"`
ExpirationDateTime int64 `json:"expdatetime"`
LastCheckIn int64 `json:"lastcheckin"`
LastPeerUpdate int64 `json:"lastpeerupdate"`
Network string `json:"network"`
NetworkRange string `json:"networkrange"`
NetworkRange6 string `json:"networkrange6"`
IsRelayed bool `json:"isrelayed"`
IsRelay bool `json:"isrelay"`
RelayedBy string `json:"relayedby" bson:"relayedby" yaml:"relayedby"`
RelayedNodes []string `json:"relaynodes" yaml:"relayedNodes"`
2022-12-22 00:56:29 +08:00
IsEgressGateway bool `json:"isegressgateway"`
IsIngressGateway bool `json:"isingressgateway"`
EgressGatewayRanges []string `json:"egressgatewayranges"`
EgressGatewayNatEnabled bool `json:"egressgatewaynatenabled"`
FailoverNode string `json:"failovernode"`
DNSOn bool `json:"dnson"`
IngressDns string `json:"ingressdns"`
2022-12-22 00:56:29 +08:00
Server string `json:"server"`
InternetGateway string `json:"internetgateway"`
Connected bool `json:"connected"`
PendingDelete bool `json:"pendingdelete"`
2022-12-21 01:16:24 +08:00
// == PRO ==
2022-12-22 00:56:29 +08:00
DefaultACL string `json:"defaultacl,omitempty" validate:"checkyesornoorunset"`
Failover bool `json:"failover"`
}
// ApiNode.ConvertToServerNode - converts an api node to a server node
func (a *ApiNode) ConvertToServerNode(currentNode *Node) *Node {
convertedNode := Node{}
convertedNode.Network = a.Network
convertedNode.Server = a.Server
convertedNode.Action = currentNode.Action
convertedNode.Connected = a.Connected
convertedNode.ID, _ = uuid.Parse(a.ID)
convertedNode.HostID, _ = uuid.Parse(a.HostID)
convertedNode.IsRelay = a.IsRelay
convertedNode.IsRelayed = a.IsRelayed
convertedNode.RelayedBy = a.RelayedBy
convertedNode.RelayedNodes = a.RelayedNodes
2022-12-22 00:56:29 +08:00
convertedNode.PendingDelete = a.PendingDelete
convertedNode.Failover = a.Failover
convertedNode.IsEgressGateway = a.IsEgressGateway
convertedNode.IsIngressGateway = a.IsIngressGateway
2023-02-09 23:27:38 +08:00
// prevents user from changing ranges, must delete and recreate
convertedNode.EgressGatewayRanges = currentNode.EgressGatewayRanges
2022-12-22 00:56:29 +08:00
convertedNode.IngressGatewayRange = currentNode.IngressGatewayRange
convertedNode.IngressGatewayRange6 = currentNode.IngressGatewayRange6
convertedNode.DNSOn = a.DNSOn
convertedNode.IngressDNS = a.IngressDns
2022-12-22 00:56:29 +08:00
convertedNode.EgressGatewayRequest = currentNode.EgressGatewayRequest
convertedNode.EgressGatewayNatEnabled = currentNode.EgressGatewayNatEnabled
2022-12-30 14:13:48 +08:00
convertedNode.PersistentKeepalive = time.Second * time.Duration(a.PersistentKeepalive)
convertedNode.RelayedNodes = a.RelayedNodes
2022-12-22 00:56:29 +08:00
convertedNode.DefaultACL = a.DefaultACL
convertedNode.OwnerID = currentNode.OwnerID
_, networkRange, err := net.ParseCIDR(a.NetworkRange)
if err == nil {
convertedNode.NetworkRange = *networkRange
}
_, networkRange6, err := net.ParseCIDR(a.NetworkRange6)
if err == nil {
convertedNode.NetworkRange6 = *networkRange6
}
2022-12-24 03:06:39 +08:00
if len(a.LocalAddress) > 0 {
_, localAddr, err := net.ParseCIDR(a.LocalAddress)
if err == nil {
convertedNode.LocalAddress = *localAddr
}
} else if !isEmptyAddr(currentNode.LocalAddress.String()) {
convertedNode.LocalAddress = currentNode.LocalAddress
}
2022-12-22 00:56:29 +08:00
udpAddr, err := net.ResolveUDPAddr("udp", a.InternetGateway)
if err == nil {
convertedNode.InternetGateway = udpAddr
}
ip, addr, err := net.ParseCIDR(a.Address)
2022-12-22 00:56:29 +08:00
if err == nil {
convertedNode.Address = *addr
convertedNode.Address.IP = ip
2022-12-22 00:56:29 +08:00
}
ip6, addr6, err := net.ParseCIDR(a.Address6)
2022-12-22 00:56:29 +08:00
if err == nil {
2023-01-27 12:31:54 +08:00
convertedNode.Address6 = *addr6
convertedNode.Address6.IP = ip6
2022-12-22 00:56:29 +08:00
}
convertedNode.FailoverNode, _ = uuid.Parse(a.FailoverNode)
convertedNode.LastModified = time.Unix(a.LastModified, 0)
convertedNode.LastCheckIn = time.Unix(a.LastCheckIn, 0)
convertedNode.LastPeerUpdate = time.Unix(a.LastPeerUpdate, 0)
convertedNode.ExpirationDateTime = time.Unix(a.ExpirationDateTime, 0)
return &convertedNode
2022-12-21 01:16:24 +08:00
}
2022-12-22 03:06:33 +08:00
// Node.ConvertToAPINode - converts a node to an API node
func (nm *Node) ConvertToAPINode() *ApiNode {
apiNode := ApiNode{}
apiNode.ID = nm.ID.String()
2023-01-04 03:17:36 +08:00
apiNode.HostID = nm.HostID.String()
2022-12-22 03:06:33 +08:00
apiNode.Address = nm.Address.String()
if isEmptyAddr(apiNode.Address) {
apiNode.Address = ""
}
apiNode.Address6 = nm.Address6.String()
if isEmptyAddr(apiNode.Address6) {
apiNode.Address6 = ""
}
2022-12-24 03:06:39 +08:00
apiNode.LocalAddress = nm.LocalAddress.String()
if isEmptyAddr(apiNode.LocalAddress) {
apiNode.LocalAddress = ""
}
2022-12-30 14:13:48 +08:00
apiNode.PersistentKeepalive = int32(nm.PersistentKeepalive.Seconds())
2022-12-22 03:06:33 +08:00
apiNode.LastModified = nm.LastModified.Unix()
apiNode.LastCheckIn = nm.LastCheckIn.Unix()
apiNode.LastPeerUpdate = nm.LastPeerUpdate.Unix()
2023-01-26 22:08:02 +08:00
apiNode.ExpirationDateTime = nm.ExpirationDateTime.Unix()
2022-12-22 03:06:33 +08:00
apiNode.Network = nm.Network
apiNode.NetworkRange = nm.NetworkRange.String()
if isEmptyAddr(apiNode.NetworkRange) {
apiNode.NetworkRange = ""
}
apiNode.NetworkRange6 = nm.NetworkRange6.String()
if isEmptyAddr(apiNode.NetworkRange6) {
apiNode.NetworkRange6 = ""
}
apiNode.IsRelayed = nm.IsRelayed
apiNode.IsRelay = nm.IsRelay
apiNode.RelayedBy = nm.RelayedBy
apiNode.RelayedNodes = nm.RelayedNodes
2022-12-22 03:06:33 +08:00
apiNode.IsEgressGateway = nm.IsEgressGateway
apiNode.IsIngressGateway = nm.IsIngressGateway
apiNode.EgressGatewayRanges = nm.EgressGatewayRanges
apiNode.EgressGatewayNatEnabled = nm.EgressGatewayNatEnabled
apiNode.FailoverNode = nm.FailoverNode.String()
if isUUIDSet(apiNode.FailoverNode) {
apiNode.FailoverNode = ""
}
apiNode.DNSOn = nm.DNSOn
apiNode.IngressDns = nm.IngressDNS
2022-12-22 03:06:33 +08:00
apiNode.Server = nm.Server
apiNode.InternetGateway = nm.InternetGateway.String()
if isEmptyAddr(apiNode.InternetGateway) {
apiNode.InternetGateway = ""
}
apiNode.Connected = nm.Connected
apiNode.PendingDelete = nm.PendingDelete
apiNode.DefaultACL = nm.DefaultACL
apiNode.Failover = nm.Failover
return &apiNode
}
func isEmptyAddr(addr string) bool {
return addr == "<nil>" || addr == ":0"
}
func isUUIDSet(uuid string) bool {
return uuid != "00000000-0000-0000-0000-000000000000"
}