From e92f524fbea7d41c0713f63c238f33ebe4522b90 Mon Sep 17 00:00:00 2001 From: 0xdcarns Date: Wed, 21 Dec 2022 11:56:29 -0500 Subject: [PATCH] finished convert api to nm node --- models/api_host.go | 27 ++++++++ models/api_node.go | 149 +++++++++++++++++++++++++++++---------------- models/host.go | 6 ++ models/node.go | 33 +++------- 4 files changed, 137 insertions(+), 78 deletions(-) create mode 100644 models/api_host.go diff --git a/models/api_host.go b/models/api_host.go new file mode 100644 index 00000000..5fae1f59 --- /dev/null +++ b/models/api_host.go @@ -0,0 +1,27 @@ +package models + +// APIHost - the host struct for API usage +type APIHost struct { + ID string `json:"id"` + Verbosity int `json:"verbosity"` + FirewallInUse string `json:"firewallinuse"` + Version string `json:"version"` + IPForwarding bool `json:"ipforwarding"` + DaemonInstalled bool `json:"daemoninstalled"` + HostPass string `json:"hostpass"` + Name string `json:"name"` + OS string `json:"os"` + Interface string `json:"interface"` + Debug bool `json:"debug"` + ListenPort int `json:"listenport"` + LocalAddress string `json:"localaddress"` + LocalRange string `json:"localrange"` + LocalListenPort int `json:"locallistenport"` + ProxyListenPort int `json:"proxy_listen_port"` + MTU int `json:"mtu" yaml:"mtu"` + Interfaces []Iface `json:"interfaces" yaml:"interfaces"` + PublicKey string `json:"publickey"` + MacAddress string `json:"macaddress"` + InternetGateway string `json:"internetgateway"` + Nodes []string `json:"nodes"` +} diff --git a/models/api_node.go b/models/api_node.go index 7b72fd8d..ac8388bd 100644 --- a/models/api_node.go +++ b/models/api_node.go @@ -1,59 +1,102 @@ package models +import ( + "net" + "time" + + "github.com/google/uuid" +) + // ApiNode is a stripped down Node DTO that exposes only required fields to external systems type ApiNode struct { - ID string `json:"id,omitempty" bson:"id,omitempty" yaml:"id,omitempty" validate:"required,min=5,id_unique"` - HostID string `json:"hostid,omitempty" bson:"id,omitempty" yaml:"hostid,omitempty" validate:"required,min=5,id_unique"` - Address string `json:"address" bson:"address" yaml:"address" validate:"omitempty,ipv4"` - Address6 string `json:"address6" bson:"address6" yaml:"address6" validate:"omitempty,ipv6"` - LocalAddress string `json:"localaddress" bson:"localaddress" yaml:"localaddress" validate:"omitempty"` - Interfaces []Iface `json:"interfaces" yaml:"interfaces"` - Name string `json:"name" bson:"name" yaml:"name" validate:"omitempty,max=62,in_charset"` - NetworkSettings Network `json:"networksettings" bson:"networksettings" yaml:"networksettings" validate:"-"` - ListenPort int `json:"listenport" bson:"listenport" yaml:"listenport" validate:"omitempty,numeric,min=1024,max=65535"` - LocalListenPort int32 `json:"locallistenport" bson:"locallistenport" yaml:"locallistenport" validate:"numeric,min=0,max=65535"` - ProxyListenPort int32 `json:"proxy_listen_port" bson:"proxy_listen_port" yaml:"proxy_listen_port" validate:"numeric,min=0,max=65535"` - PublicKey string `json:"publickey" bson:"publickey" yaml:"publickey" validate:"required,base64"` - Endpoint string `json:"endpoint" bson:"endpoint" yaml:"endpoint" validate:"required,ip"` - PostUp string `json:"postup" bson:"postup" yaml:"postup"` - PostDown string `json:"postdown" bson:"postdown" yaml:"postdown"` - AllowedIPs []string `json:"allowedips" bson:"allowedips" yaml:"allowedips"` - PersistentKeepalive int32 `json:"persistentkeepalive" bson:"persistentkeepalive" yaml:"persistentkeepalive" validate:"omitempty,numeric,max=1000"` - IsHub string `json:"ishub" bson:"ishub" yaml:"ishub" validate:"checkyesorno"` - LastModified int64 `json:"lastmodified" bson:"lastmodified" yaml:"lastmodified"` - ExpirationDateTime int64 `json:"expdatetime" bson:"expdatetime" yaml:"expdatetime"` - LastCheckIn int64 `json:"lastcheckin" bson:"lastcheckin" yaml:"lastcheckin"` - MacAddress string `json:"macaddress" bson:"macaddress" yaml:"macaddress"` - Network string `json:"network" bson:"network" yaml:"network" validate:"network_exists"` - IsRelayed bool `json:"isrelayed" bson:"isrelayed" yaml:"isrelayed"` - IsPending bool `json:"ispending" bson:"ispending" yaml:"ispending"` - IsRelay bool `json:"isrelay" bson:"isrelay" yaml:"isrelay" validate:"checkyesorno"` - IsDocker bool `json:"isdocker" bson:"isdocker" yaml:"isdocker" validate:"checkyesorno"` - IsK8S bool `json:"isk8s" bson:"isk8s" yaml:"isk8s" validate:"checkyesorno"` - IsEgressGateway bool `json:"isegressgateway" bson:"isegressgateway" yaml:"isegressgateway" validate:"checkyesorno"` - IsIngressGateway bool `json:"isingressgateway" bson:"isingressgateway" yaml:"isingressgateway" validate:"checkyesorno"` - EgressGatewayRanges []string `json:"egressgatewayranges" bson:"egressgatewayranges" yaml:"egressgatewayranges"` - EgressGatewayNatEnabled string `json:"egressgatewaynatenabled" bson:"egressgatewaynatenabled" yaml:"egressgatewaynatenabled"` - EgressGatewayRequest EgressGatewayRequest `json:"egressgatewayrequest" bson:"egressgatewayrequest" yaml:"egressgatewayrequest"` - RelayAddrs []string `json:"relayaddrs" bson:"relayaddrs" yaml:"relayaddrs"` - FailoverNode string `json:"failovernode" bson:"failovernode" yaml:"failovernode"` - IsStatic string `json:"isstatic" bson:"isstatic" yaml:"isstatic" validate:"checkyesorno"` - DNSOn bool `json:"dnson" bson:"dnson" yaml:"dnson" validate:"checkyesorno"` - IsLocal bool `json:"islocal" bson:"islocal" yaml:"islocal" validate:"checkyesorno"` - LocalRange string `json:"localrange" bson:"localrange" yaml:"localrange"` - IPForwarding bool `json:"ipforwarding" bson:"ipforwarding" yaml:"ipforwarding" validate:"checkyesorno"` - OS string `json:"os" bson:"os" yaml:"os"` - MTU int32 `json:"mtu" bson:"mtu" yaml:"mtu"` - Version string `json:"version" bson:"version" yaml:"version"` - Server string `json:"server" bson:"server" yaml:"server"` - TrafficKeys TrafficKeys `json:"traffickeys" bson:"traffickeys" yaml:"traffickeys"` - FirewallInUse string `json:"firewallinuse" bson:"firewallinuse" yaml:"firewallinuse"` - InternetGateway string `json:"internetgateway" bson:"internetgateway" yaml:"internetgateway"` - Connected bool `json:"connected" bson:"connected" yaml:"connected" validate:"checkyesorno"` - PendingDelete bool `json:"pendingdelete" bson:"pendingdelete" yaml:"pendingdelete"` - Proxy bool `json:"proxy" bson:"proxy" yaml:"proxy"` - + 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"` + PostUp string `json:"postup"` + PostDown string `json:"postdown"` + 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"` + IsEgressGateway bool `json:"isegressgateway"` + IsIngressGateway bool `json:"isingressgateway"` + EgressGatewayRanges []string `json:"egressgatewayranges"` + EgressGatewayNatEnabled bool `json:"egressgatewaynatenabled"` + RelayAddrs []string `json:"relayaddrs"` + FailoverNode string `json:"failovernode"` + DNSOn bool `json:"dnson"` + IsLocal bool `json:"islocal"` + Server string `json:"server"` + InternetGateway string `json:"internetgateway"` + Connected bool `json:"connected"` + PendingDelete bool `json:"pendingdelete"` // == PRO == - DefaultACL string `json:"defaultacl,omitempty" bson:"defaultacl,omitempty" yaml:"defaultacl,omitempty" validate:"checkyesornoorunset"` - Failover string `json:"failover" bson:"failover" yaml:"failover" validate:"checkyesorno"` + 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.AllowedIPs = a.AllowedIPs + convertedNode.ID, _ = uuid.Parse(a.ID) + convertedNode.HostID, _ = uuid.Parse(a.HostID) + convertedNode.PostUp = a.PostUp + convertedNode.PostDown = a.PostDown + convertedNode.IsLocal = a.IsLocal + convertedNode.IsRelay = a.IsRelay + convertedNode.IsRelayed = a.IsRelayed + convertedNode.PendingDelete = a.PendingDelete + convertedNode.Peers = currentNode.Peers + convertedNode.Failover = a.Failover + convertedNode.IsEgressGateway = a.IsEgressGateway + convertedNode.IsIngressGateway = a.IsIngressGateway + convertedNode.EgressGatewayRanges = a.EgressGatewayRanges + convertedNode.IngressGatewayRange = currentNode.IngressGatewayRange + convertedNode.IngressGatewayRange6 = currentNode.IngressGatewayRange6 + convertedNode.DNSOn = a.DNSOn + convertedNode.EgressGatewayRequest = currentNode.EgressGatewayRequest + convertedNode.EgressGatewayNatEnabled = currentNode.EgressGatewayNatEnabled + convertedNode.PersistentKeepalive = int(a.PersistentKeepalive) + convertedNode.RelayAddrs = a.RelayAddrs + 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 + } + udpAddr, err := net.ResolveUDPAddr("udp", a.InternetGateway) + if err == nil { + convertedNode.InternetGateway = udpAddr + } + _, addr, err := net.ParseCIDR(a.Address) + if err == nil { + convertedNode.Address = *addr + } + _, addr6, err := net.ParseCIDR(a.Address6) + if err == nil { + convertedNode.Address = *addr6 + } + 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 } diff --git a/models/host.go b/models/host.go index 5f8235bc..8d2031ad 100644 --- a/models/host.go +++ b/models/host.go @@ -34,4 +34,10 @@ type Host struct { TrafficKeyPublic []byte `json:"traffickeypublic" yaml:"trafficekeypublic"` InternetGateway net.UDPAddr `json:"internetgateway" yaml:"internetgateway"` Nodes []string `json:"nodes" yaml:"nodes"` + Interfaces []Iface `json:"interfaces" yaml:"interfaces"` + EndpointIP net.IP `json:"endpointip" yaml:"endpointip"` + ProxyEnabled bool `json:"proxy_enabled" yaml:"proxy_enabled"` + IsDocker bool `json:"isdocker" yaml:"isdocker"` + IsK8S bool `json:"isk8s" yaml:"isk8s"` + IsStatic bool `json:"isstatic" yaml:"isstatic"` } diff --git a/models/node.go b/models/node.go index dd8ccf30..3caf8474 100644 --- a/models/node.go +++ b/models/node.go @@ -64,8 +64,6 @@ type CommonNode struct { InternetGateway *net.UDPAddr `json:"internetgateway" yaml:"internetgateway"` Server string `json:"server" yaml:"server"` Connected bool `json:"connected" yaml:"connected"` - Interfaces []Iface `json:"interfaces" yaml:"interfaces"` - EndpointIP net.IP `json:"endpointip" yaml:"endpointip"` Address net.IPNet `json:"address" yaml:"address"` Address6 net.IPNet `json:"address6" yaml:"address6"` PostUp string `json:"postup" yaml:"postup"` @@ -74,11 +72,9 @@ type CommonNode struct { IsLocal bool `json:"islocal" yaml:"islocal"` IsEgressGateway bool `json:"isegressgateway" yaml:"isegressgateway"` IsIngressGateway bool `json:"isingressgateway" yaml:"isingressgateway"` - IsStatic bool `json:"isstatic" yaml:"isstatic"` DNSOn bool `json:"dnson" yaml:"dnson"` PersistentKeepalive int `json:"persistentkeepalive" yaml:"persistentkeepalive"` Peers []wgtypes.PeerConfig `json:"peers" yaml:"peers"` - Proxy bool `json:"proxy" bson:"proxy" yaml:"proxy"` } // Node - a model of a network node @@ -91,15 +87,13 @@ type Node struct { ExpirationDateTime time.Time `json:"expdatetime" bson:"expdatetime" yaml:"expdatetime"` AllowedIPs []string `json:"allowedips" bson:"allowedips" yaml:"allowedips"` EgressGatewayRanges []string `json:"egressgatewayranges" bson:"egressgatewayranges" yaml:"egressgatewayranges"` - EgressGatewayNatEnabled string `json:"egressgatewaynatenabled" bson:"egressgatewaynatenabled" yaml:"egressgatewaynatenabled"` + EgressGatewayNatEnabled bool `json:"egressgatewaynatenabled" bson:"egressgatewaynatenabled" yaml:"egressgatewaynatenabled"` EgressGatewayRequest EgressGatewayRequest `json:"egressgatewayrequest" bson:"egressgatewayrequest" yaml:"egressgatewayrequest"` IngressGatewayRange string `json:"ingressgatewayrange" bson:"ingressgatewayrange" yaml:"ingressgatewayrange"` IngressGatewayRange6 string `json:"ingressgatewayrange6" bson:"ingressgatewayrange6" yaml:"ingressgatewayrange6"` IsRelayed bool `json:"isrelayed" bson:"isrelayed" yaml:"isrelayed"` IsRelay bool `json:"isrelay" bson:"isrelay" yaml:"isrelay"` RelayAddrs []string `json:"relayaddrs" bson:"relayaddrs" yaml:"relayaddrs"` - IsDocker bool `json:"isdocker" bson:"isdocker" yaml:"isdocker"` - IsK8S bool `json:"isk8s" bson:"isk8s" yaml:"isk8s"` // == PRO == DefaultACL string `json:"defaultacl,omitempty" bson:"defaultacl,omitempty" yaml:"defaultacl,omitempty" validate:"checkyesornoorunset"` OwnerID string `json:"ownerid,omitempty" bson:"ownerid,omitempty" yaml:"ownerid,omitempty"` @@ -423,9 +417,6 @@ func (newNode *Node) Fill(currentNode *Node) { // TODO add new field for nftable if newNode.IngressGatewayRange6 == "" { newNode.IngressGatewayRange6 = currentNode.IngressGatewayRange6 } - if newNode.IsStatic != currentNode.IsStatic { - newNode.IsStatic = currentNode.IsStatic - } if newNode.DNSOn != currentNode.DNSOn { newNode.DNSOn = currentNode.DNSOn } @@ -444,12 +435,6 @@ func (newNode *Node) Fill(currentNode *Node) { // TODO add new field for nftable if newNode.IsRelayed == currentNode.IsRelayed { newNode.IsRelayed = currentNode.IsRelayed } - if newNode.IsDocker == currentNode.IsDocker { - newNode.IsDocker = currentNode.IsDocker - } - if newNode.IsK8S != currentNode.IsK8S { - newNode.IsK8S = currentNode.IsK8S - } if newNode.Server == "" { newNode.Server = currentNode.Server } @@ -462,7 +447,6 @@ func (newNode *Node) Fill(currentNode *Node) { // TODO add new field for nftable if newNode.Failover != currentNode.Failover { newNode.Failover = currentNode.Failover } - newNode.Proxy = currentNode.Proxy } // StringWithCharset - returns random string inside defined charset @@ -532,6 +516,9 @@ func (ln *LegacyNode) ConvertToNewNode() (*Host, *Node) { host.InternetGateway = *gateway id, _ := uuid.Parse(ln.ID) host.Nodes = append(host.Nodes, id.String()) + host.Interfaces = ln.Interfaces + host.EndpointIP = net.ParseIP(ln.Endpoint) + // host.ProxyEnabled = ln.Proxy // this will always be false.. } id, _ := uuid.Parse(ln.ID) node.ID = id @@ -542,8 +529,6 @@ func (ln *LegacyNode) ConvertToNewNode() (*Host, *Node) { node.NetworkRange6 = *cidr node.Server = ln.Server node.Connected = parseBool(ln.Connected) - node.Interfaces = ln.Interfaces - node.EndpointIP = net.ParseIP(ln.Endpoint) _, cidr, _ = net.ParseCIDR(ln.Address) node.Address = *cidr _, cidr, _ = net.ParseCIDR(ln.Address6) @@ -554,10 +539,8 @@ func (ln *LegacyNode) ConvertToNewNode() (*Host, *Node) { node.IsLocal = parseBool(ln.IsLocal) node.IsEgressGateway = parseBool(ln.IsEgressGateway) node.IsIngressGateway = parseBool(ln.IsIngressGateway) - node.IsStatic = parseBool(ln.IsStatic) node.DNSOn = parseBool(ln.DNSOn) node.PersistentKeepalive = int(ln.PersistentKeepalive) - node.Proxy = ln.Proxy return &host, &node } @@ -570,14 +553,14 @@ func (n *Node) Legacy(h *Host, s *ServerConfig, net *Network) *LegacyNode { l.Address = n.Address.String() l.Address6 = n.Address6.String() l.LocalAddress = h.LocalAddress.String() - l.Interfaces = n.Interfaces + l.Interfaces = h.Interfaces l.Name = h.Name l.NetworkSettings = *net l.ListenPort = int32(h.ListenPort) l.LocalListenPort = int32(h.LocalListenPort) l.ProxyListenPort = int32(h.ProxyListenPort) l.PublicKey = h.PublicKey.String() - l.Endpoint = n.EndpointIP.String() + l.Endpoint = h.EndpointIP.String() l.PostUp = n.PostUp l.PostDown = n.PostDown //l.AllowedIPs = @@ -603,7 +586,7 @@ func (n *Node) Legacy(h *Host, s *ServerConfig, net *Network) *LegacyNode { //l.FailoverNode = n.FailoverNode //l.IngressGatewayRange = n.IngressGatewayRange //l.IngressGatewayRange6 = n.IngressGatewayRange6 - l.IsStatic = formatBool(n.IsStatic) + l.IsStatic = formatBool(h.IsStatic) l.UDPHolePunch = formatBool(true) l.DNSOn = formatBool(n.DNSOn) l.Action = n.Action @@ -620,7 +603,7 @@ func (n *Node) Legacy(h *Host, s *ServerConfig, net *Network) *LegacyNode { l.InternetGateway = h.InternetGateway.String() l.Connected = formatBool(n.Connected) //l.PendingDelete = formatBool(n.PendingDelete) - l.Proxy = n.Proxy + l.Proxy = h.ProxyEnabled l.DefaultACL = n.DefaultACL l.OwnerID = n.OwnerID //l.Failover = n.Failover