mirror of
				https://github.com/gravitl/netmaker.git
				synced 2025-10-31 20:22:44 +08:00 
			
		
		
		
	set addresses appropriately based on if network is using ipv6/4
This commit is contained in:
		| @@ -125,16 +125,21 @@ func CreateExtClient(extclient *models.ExtClient) error { | ||||
| 		extclient.PublicKey = privateKey.PublicKey().String() | ||||
| 	} | ||||
|  | ||||
| 	if extclient.Address == "" { | ||||
| 		newAddress, err := UniqueAddress(extclient.Network) | ||||
| 	parentNetwork, err := GetNetwork(extclient.Network) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if extclient.Address == "" && parentNetwork.IsIPv4 == "yes" { | ||||
| 		newAddress, err := UniqueAddress(extclient.Network, false) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		extclient.Address = newAddress | ||||
| 	} | ||||
|  | ||||
| 	if extclient.Address6 == "" { | ||||
| 		addr6, err := UniqueAddress6(extclient.Network) | ||||
| 	if extclient.Address6 == "" && parentNetwork.IsIPv6 == "yes" { | ||||
| 		addr6, err := UniqueAddress6(extclient.Network, false) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|   | ||||
| @@ -173,7 +173,7 @@ func GetNetworkSettings(networkname string) (models.Network, error) { | ||||
| } | ||||
|  | ||||
| // UniqueAddress - see if address is unique | ||||
| func UniqueAddress(networkName string) (string, error) { | ||||
| func UniqueAddress(networkName string, reverse bool) (string, error) { | ||||
|  | ||||
| 	var network models.Network | ||||
| 	network, err := GetParentNetwork(networkName) | ||||
| @@ -192,7 +192,12 @@ func UniqueAddress(networkName string) (string, error) { | ||||
| 		return "666", err | ||||
| 	} | ||||
|  | ||||
| 	for ; newAddr.ToAddressString().IsValid(); newAddr = newAddr.Increment(1) { | ||||
| 	incVal := 1 | ||||
| 	if reverse { | ||||
| 		incVal = -1 | ||||
| 	} | ||||
|  | ||||
| 	for ; newAddr.ToAddressString().IsValid(); newAddr = newAddr.Increment(int64(incVal)) { | ||||
| 		if IsIPUnique(networkName, newAddr.GetNetIPAddr().IP.String(), database.NODES_TABLE_NAME, false) && | ||||
| 			IsIPUnique(networkName, newAddr.GetNetIPAddr().IP.String(), database.EXT_CLIENT_TABLE_NAME, false) { | ||||
| 			return newAddr.GetNetIPAddr().IP.String(), nil | ||||
| @@ -202,64 +207,6 @@ func UniqueAddress(networkName string) (string, error) { | ||||
| 	return "W1R3: NO UNIQUE ADDRESSES AVAILABLE", errors.New("ERROR: No unique addresses available. Check network subnet") | ||||
| } | ||||
|  | ||||
| // UniqueAddressServer - get unique address starting from last available | ||||
| func UniqueAddressServer(networkName string) (string, error) { | ||||
|  | ||||
| 	var network models.Network | ||||
| 	network, err := GetParentNetwork(networkName) | ||||
| 	if err != nil { | ||||
| 		logger.Log(0, "UniqueAddressServer encountered  an error") | ||||
| 		return "666", err | ||||
| 	} | ||||
|  | ||||
| 	if network.IsIPv4 == "no" { | ||||
| 		return "", fmt.Errorf("IPv4 not active on network " + networkName) | ||||
| 	} | ||||
|  | ||||
| 	newAddr, err := ips.GetLastAddr(network.AddressRange) | ||||
| 	if err != nil { | ||||
| 		logger.Log(0, "UniqueAddressServer encountered  an error") | ||||
| 		return "666", err | ||||
| 	} | ||||
|  | ||||
| 	for ; newAddr.ToAddressString().IsValid(); newAddr = newAddr.Increment(-1) { | ||||
| 		if IsIPUnique(networkName, newAddr.GetNetIPAddr().IP.String(), database.NODES_TABLE_NAME, false) && | ||||
| 			IsIPUnique(networkName, newAddr.GetNetIPAddr().IP.String(), database.EXT_CLIENT_TABLE_NAME, false) { | ||||
| 			return newAddr.GetNetIPAddr().IP.String(), nil | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return "W1R3: NO UNIQUE ADDRESSES AVAILABLE", fmt.Errorf("no unique server addresses found") | ||||
| } | ||||
|  | ||||
| // UniqueAddress6Server - get unique address starting from last available | ||||
| func UniqueAddress6Server(networkName string) (string, error) { | ||||
|  | ||||
| 	network, err := GetParentNetwork(networkName) | ||||
| 	if err != nil { | ||||
| 		logger.Log(0, "UniqueAddressServer encountered  an error") | ||||
| 		return "666", err | ||||
| 	} | ||||
|  | ||||
| 	if network.IsIPv6 == "no" { | ||||
| 		return "", fmt.Errorf("IPv6 not active on network " + networkName) | ||||
| 	} | ||||
|  | ||||
| 	newAddr6, err := ips.GetLastAddr6(network.AddressRange6) | ||||
| 	if err != nil { | ||||
| 		return "666", err | ||||
| 	} | ||||
|  | ||||
| 	for ; newAddr6.ToAddressString().IsValid(); newAddr6 = newAddr6.Increment(-1) { | ||||
| 		if IsIPUnique(networkName, newAddr6.GetNetIPAddr().IP.String(), database.NODES_TABLE_NAME, true) && | ||||
| 			IsIPUnique(networkName, newAddr6.GetNetIPAddr().IP.String(), database.EXT_CLIENT_TABLE_NAME, true) { | ||||
| 			return newAddr6.GetNetIPAddr().IP.String(), nil | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return "W1R3: NO UNIQUE ADDRESSES AVAILABLE", fmt.Errorf("no unique server addresses found") | ||||
| } | ||||
|  | ||||
| // IsIPUnique - checks if an IP is unique | ||||
| func IsIPUnique(network string, ip string, tableName string, isIpv6 bool) bool { | ||||
|  | ||||
| @@ -290,7 +237,7 @@ func IsIPUnique(network string, ip string, tableName string, isIpv6 bool) bool { | ||||
| } | ||||
|  | ||||
| // UniqueAddress6 - see if ipv6 address is unique | ||||
| func UniqueAddress6(networkName string) (string, error) { | ||||
| func UniqueAddress6(networkName string, reverse bool) (string, error) { | ||||
|  | ||||
| 	var network models.Network | ||||
| 	network, err := GetParentNetwork(networkName) | ||||
| @@ -307,7 +254,12 @@ func UniqueAddress6(networkName string) (string, error) { | ||||
| 		return "666", err | ||||
| 	} | ||||
|  | ||||
| 	for ; newAddr6.ToAddressString().IsValid(); newAddr6 = newAddr6.Increment(1) { | ||||
| 	incVal := 1 | ||||
| 	if reverse { | ||||
| 		incVal = -1 | ||||
| 	} | ||||
|  | ||||
| 	for ; newAddr6.ToAddressString().IsValid(); newAddr6 = newAddr6.Increment(int64(incVal)) { | ||||
| 		if IsIPUnique(networkName, newAddr6.GetNetIPAddr().IP.String(), database.NODES_TABLE_NAME, true) && | ||||
| 			IsIPUnique(networkName, newAddr6.GetNetIPAddr().IP.String(), database.EXT_CLIENT_TABLE_NAME, true) { | ||||
| 			return newAddr6.GetNetIPAddr().IP.String(), nil | ||||
| @@ -395,9 +347,9 @@ func UpdateNetworkLocalAddresses(networkName string) error { | ||||
| 			var ipaddr string | ||||
| 			var iperr error | ||||
| 			if node.IsServer == "yes" { | ||||
| 				ipaddr, iperr = UniqueAddressServer(networkName) | ||||
| 				ipaddr, iperr = UniqueAddress(networkName, true) | ||||
| 			} else { | ||||
| 				ipaddr, iperr = UniqueAddress(networkName) | ||||
| 				ipaddr, iperr = UniqueAddress(networkName, false) | ||||
| 			} | ||||
| 			if iperr != nil { | ||||
| 				fmt.Println("error in node  address assignment!") | ||||
| @@ -489,9 +441,9 @@ func UpdateNetworkNodeAddresses(networkName string) error { | ||||
| 			var ipaddr string | ||||
| 			var iperr error | ||||
| 			if node.IsServer == "yes" { | ||||
| 				ipaddr, iperr = UniqueAddressServer(networkName) | ||||
| 				ipaddr, iperr = UniqueAddress(networkName, true) | ||||
| 			} else { | ||||
| 				ipaddr, iperr = UniqueAddress(networkName) | ||||
| 				ipaddr, iperr = UniqueAddress(networkName, false) | ||||
| 			} | ||||
| 			if iperr != nil { | ||||
| 				fmt.Println("error in node  address assignment!") | ||||
| @@ -552,16 +504,6 @@ func UpdateNetwork(currentNetwork *models.Network, newNetwork *models.Network) ( | ||||
| 	return false, false, false, errors.New("failed to update network " + newNetwork.NetID + ", cannot change netid.") | ||||
| } | ||||
|  | ||||
| // Inc - increments an IP | ||||
| func Inc(ip net.IP) { | ||||
| 	for j := len(ip) - 1; j >= 0; j-- { | ||||
| 		ip[j]++ | ||||
| 		if ip[j] > 0 { | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // GetNetwork - gets a network from database | ||||
| func GetNetwork(networkname string) (models.Network, error) { | ||||
|  | ||||
|   | ||||
| @@ -270,20 +270,25 @@ func CreateNode(node *models.Node) error { | ||||
|  | ||||
| 	SetNodeDefaults(node) | ||||
|  | ||||
| 	if node.IsServer == "yes" { | ||||
| 		if node.Address, err = UniqueAddressServer(node.Network); err != nil { | ||||
| 			return err | ||||
| 	defaultACLVal := acls.Allowed | ||||
| 	parentNetwork, err := GetNetwork(node.Network) | ||||
| 	if err == nil { | ||||
| 		if parentNetwork.DefaultACL != "yes" { | ||||
| 			defaultACLVal = acls.NotAllowed | ||||
| 		} | ||||
| 	} else if node.Address == "" { | ||||
| 		if node.Address, err = UniqueAddress(node.Network); err != nil { | ||||
| 	} | ||||
|  | ||||
| 	reverse := node.IsServer == "yes" | ||||
| 	if node.Address == "" && parentNetwork.IsIPv4 == "yes" { | ||||
| 		if node.Address, err = UniqueAddress(node.Network, reverse); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} else if !IsIPUnique(node.Network, node.Address, database.NODES_TABLE_NAME, false) { | ||||
| 		return fmt.Errorf("invalid address: ipv4 " + node.Address + " is not unique") | ||||
| 	} | ||||
|  | ||||
| 	if node.Address6 == "" { | ||||
| 		if node.Address6, err = UniqueAddress6(node.Network); err != nil { | ||||
| 	if node.Address6 == "" && parentNetwork.IsIPv6 == "yes" { | ||||
| 		if node.Address6, err = UniqueAddress6(node.Network, reverse); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} else if !IsIPUnique(node.Network, node.Address6, database.NODES_TABLE_NAME, true) { | ||||
| @@ -312,14 +317,6 @@ func CreateNode(node *models.Node) error { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	defaultACLVal := acls.Allowed | ||||
| 	parentNetwork, err := GetNetwork(node.Network) | ||||
| 	if err == nil { | ||||
| 		if parentNetwork.DefaultACL != "yes" { | ||||
| 			defaultACLVal = acls.NotAllowed | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	_, err = nodeacls.CreateNodeACL(nodeacls.NetworkID(node.Network), nodeacls.NodeID(node.ID), defaultACLVal) | ||||
| 	if err != nil { | ||||
| 		logger.Log(1, "failed to create node ACL for node,", node.ID, "err:", err.Error()) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 0xdcarns
					0xdcarns