node update fix, nil pointer errors fix

This commit is contained in:
Abhishek Kondur 2023-01-06 00:29:55 +05:30
parent 950fd3c290
commit 9f0ef1628c
5 changed files with 52 additions and 37 deletions

View file

@ -48,9 +48,9 @@ func GetNetworkNodes(network string) ([]models.Node, error) {
// UpdateNode - takes a node and updates another node with it's values
func UpdateNode(currentNode *models.Node, newNode *models.Node) error {
if newNode.Address.String() != currentNode.Address.String() {
if newNode.Address.IP.String() != currentNode.Address.IP.String() {
if network, err := GetParentNetwork(newNode.Network); err == nil {
if !IsAddressInCIDR(newNode.Address.String(), network.AddressRange) {
if !IsAddressInCIDR(newNode.Address.IP.String(), network.AddressRange) {
return fmt.Errorf("invalid address provided; out of network range for node %s", newNode.ID)
}
}
@ -561,11 +561,7 @@ func createNode(node *models.Node) error {
if node.Address.IP, err = UniqueAddress(node.Network, false); err != nil {
return err
}
_, cidr, err := net.ParseCIDR(parentNetwork.AddressRange)
if err != nil {
return err
}
node.Address.Mask = net.CIDRMask(cidr.Mask.Size())
node.Address.Mask = net.CIDRMask(32, 32)
}
} else if !IsIPUnique(node.Network, node.Address.String(), database.NODES_TABLE_NAME, false) {
return fmt.Errorf("invalid address: ipv4 " + node.Address.String() + " is not unique")
@ -575,11 +571,7 @@ func createNode(node *models.Node) error {
if node.Address6.IP, err = UniqueAddress6(node.Network, false); err != nil {
return err
}
_, cidr, err := net.ParseCIDR(parentNetwork.AddressRange6)
if err != nil {
return err
}
node.Address6.Mask = net.CIDRMask(cidr.Mask.Size())
node.Address6.Mask = net.CIDRMask(128, 128)
}
} else if !IsIPUnique(node.Network, node.Address6.String(), database.NODES_TABLE_NAME, true) {
return fmt.Errorf("invalid address: ipv6 " + node.Address6.String() + " is not unique")

View file

@ -207,6 +207,9 @@ func GetPeerUpdateForHost(host *models.Host) (models.HostPeerUpdate, error) {
if err != nil {
continue
}
if !node.Connected {
continue
}
hostPeerUpdate.Network[node.Network] = models.NetworkInfo{
DNS: getPeerDNS(node.Network),
}
@ -216,18 +219,19 @@ func GetPeerUpdateForHost(host *models.Host) (models.HostPeerUpdate, error) {
return models.HostPeerUpdate{}, err
}
for _, peer := range currentPeers {
var peerConfig wgtypes.PeerConfig
peerHost, err := GetHost(peer.HostID.String())
if err != nil {
log.Println("no peer host", err)
return models.HostPeerUpdate{}, err
}
if peer.ID == node.ID {
log.Println("peer update, skipping self")
//skip yourself
continue
}
var peerConfig wgtypes.PeerConfig
peerHost, err := GetHost(peer.HostID.String())
if err != nil {
log.Println("no peer host", err)
return models.HostPeerUpdate{}, err
}
if !peer.Connected {
log.Println("peer update, skipping unconnected node")
//skip unconnected nodes
@ -847,6 +851,7 @@ func getPeerDNS(network string) string {
host, err := GetHost(node.HostID.String())
if err != nil {
logger.Log(0, "error retrieving host for node", node.ID.String(), err.Error())
continue
}
dns = dns + fmt.Sprintf("%s %s.%s\n", nodes[i].Address, host.Name, nodes[i].Network)
}

View file

@ -34,7 +34,8 @@ func CheckZombies(newnode *models.Node, mac net.HardwareAddr) {
for _, node := range nodes {
host, err := GetHost(node.HostID.String())
if err != nil {
// should we delete the node if host not found ??
continue
}
if host.MacAddress.String() == mac.String() {
logger.Log(0, "adding ", node.ID.String(), " to zombie list")

View file

@ -365,7 +365,7 @@ func (node *LegacyNode) SetDefaultFailover() {
// Node.Fill - fills other node data into calling node data if not set on calling node
func (newNode *Node) Fill(currentNode *Node) { // TODO add new field for nftables present
newNode.ID = currentNode.ID
newNode.HostID = currentNode.HostID
// Revisit the logic for boolean values
// TODO ---- !!!!!!!!!!!!!!!!!!!!!!!!!!!!
// TODO ---- !!!!!!!!!!!!!!!!!!!!!!!!!!
@ -499,17 +499,23 @@ func (ln *LegacyNode) ConvertToNewNode() (*Host, *Node) {
host.HostPass = ln.Password
host.Name = ln.Name
host.ListenPort = int(ln.ListenPort)
_, cidr, _ := net.ParseCIDR(ln.LocalAddress)
_, cidr, _ = net.ParseCIDR(ln.LocalRange)
host.LocalRange = *cidr
if _, cidr, err := net.ParseCIDR(ln.LocalAddress); err == nil {
host.LocalRange = *cidr
} else {
if _, cidr, err := net.ParseCIDR(ln.LocalRange); err == nil {
host.LocalRange = *cidr
}
}
host.LocalListenPort = int(ln.LocalListenPort)
host.ProxyListenPort = int(ln.ProxyListenPort)
host.MTU = int(ln.MTU)
host.PublicKey, _ = wgtypes.ParseKey(ln.PublicKey)
host.MacAddress, _ = net.ParseMAC(ln.MacAddress)
host.TrafficKeyPublic = ln.TrafficKeys.Mine
gateway, _ := net.ResolveUDPAddr("udp", ln.InternetGateway)
host.InternetGateway = *gateway
gateway, err := net.ResolveUDPAddr("udp", ln.InternetGateway)
if err == nil {
host.InternetGateway = *gateway
}
id, _ := uuid.Parse(ln.ID)
host.Nodes = append(host.Nodes, id.String())
host.Interfaces = ln.Interfaces
@ -519,16 +525,26 @@ func (ln *LegacyNode) ConvertToNewNode() (*Host, *Node) {
id, _ := uuid.Parse(ln.ID)
node.ID = id
node.Network = ln.Network
_, cidr, _ := net.ParseCIDR(ln.NetworkSettings.AddressRange)
node.NetworkRange = *cidr
_, cidr, _ = net.ParseCIDR(ln.NetworkSettings.AddressRange6)
node.NetworkRange6 = *cidr
if _, cidr, err := net.ParseCIDR(ln.NetworkSettings.AddressRange); err == nil {
node.NetworkRange = *cidr
}
if _, cidr, err := net.ParseCIDR(ln.NetworkSettings.AddressRange6); err == nil {
node.NetworkRange6 = *cidr
}
node.Server = ln.Server
node.Connected = parseBool(ln.Connected)
_, cidr, _ = net.ParseCIDR(ln.Address)
node.Address = *cidr
_, cidr, _ = net.ParseCIDR(ln.Address6)
node.Address6 = *cidr
if ln.Address != "" {
node.Address = net.IPNet{
IP: net.ParseIP(ln.Address),
Mask: net.CIDRMask(32, 32),
}
}
if ln.Address6 != "" {
node.Address = net.IPNet{
IP: net.ParseIP(ln.Address6),
Mask: net.CIDRMask(128, 128),
}
}
node.PostUp = ln.PostUp
node.PostDown = ln.PostDown
node.Action = ln.Action

View file

@ -90,19 +90,20 @@ func UpdateNode(client mqtt.Client, msg mqtt.Message) {
logger.Log(1, "failed to decrypt message for node ", id, decryptErr.Error())
return
}
var newNode models.Node
if err := json.Unmarshal(decrypted, &newNode); err != nil {
var oldNode models.LegacyNode
if err := json.Unmarshal(decrypted, &oldNode); err != nil {
logger.Log(1, "error unmarshaling payload ", err.Error())
return
}
ifaceDelta := logic.IfaceDelta(&currentNode, &newNode)
_, newNode := oldNode.ConvertToNewNode()
ifaceDelta := logic.IfaceDelta(&currentNode, newNode)
if servercfg.Is_EE && ifaceDelta {
if err = logic.EnterpriseResetAllPeersFailovers(currentNode.ID.String(), currentNode.Network); err != nil {
logger.Log(1, "failed to reset failover list during node update", currentNode.ID.String(), currentNode.Network)
}
}
newNode.SetLastCheckIn()
if err := logic.UpdateNode(&currentNode, &newNode); err != nil {
if err := logic.UpdateNode(&currentNode, newNode); err != nil {
logger.Log(1, "error saving node", err.Error())
return
}