Merge pull request #684 from gravitl/bugfixes_v0.10.0_various2

Bugfixes v0.10.0 various2
This commit is contained in:
Alex Feiszli
2022-02-05 16:17:09 -05:00
committed by GitHub
16 changed files with 81 additions and 50 deletions

View File

@@ -563,10 +563,10 @@ func updateNode(w http.ResponseWriter, r *http.Request) {
} }
if servercfg.IsDNSMode() { if servercfg.IsDNSMode() {
err = logic.SetDNS() logic.SetDNS()
} }
logger.Log(1, r.Header.Get("user"), "updated node", node.MacAddress, "on network", node.Network) logger.Log(1, r.Header.Get("user"), "updated node", node.ID, "on network", node.Network)
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)
json.NewEncoder(w).Encode(newNode) json.NewEncoder(w).Encode(newNode)

View File

@@ -182,15 +182,16 @@ func getServerAddrs(node *models.Node) {
} }
} }
var serverAddrs = make([]models.ServerAddr, 1) var serverAddrs = make([]models.ServerAddr, 0)
for _, node := range serverNodes { for _, node := range serverNodes {
if node.Address != "" {
serverAddrs = append(serverAddrs, models.ServerAddr{ serverAddrs = append(serverAddrs, models.ServerAddr{
IsLeader: logic.IsLeader(&node), IsLeader: logic.IsLeader(&node),
Address: node.Address, Address: node.Address,
}) })
} }
}
networkSettings, _ := logic.GetParentNetwork(node.Network) networkSettings, _ := logic.GetParentNetwork(node.Network)
// TODO consolidate functionality around files // TODO consolidate functionality around files

View File

@@ -32,10 +32,12 @@ func TestCreateEgressGateway(t *testing.T) {
assert.EqualError(t, err, "freebsd is unsupported for egress gateways") assert.EqualError(t, err, "freebsd is unsupported for egress gateways")
}) })
t.Run("Success", func(t *testing.T) { t.Run("Success", func(t *testing.T) {
deleteAllNodes()
testnode := createTestNode() testnode := createTestNode()
gateway.NodeID = testnode.ID gateway.NodeID = testnode.ID
node, err := logic.CreateEgressGateway(gateway) node, err := logic.CreateEgressGateway(gateway)
t.Log(node)
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, "yes", node.IsEgressGateway) assert.Equal(t, "yes", node.IsEgressGateway)
assert.Equal(t, gateway.Ranges, node.EgressGatewayRanges) assert.Equal(t, gateway.Ranges, node.EgressGatewayRanges)
@@ -47,7 +49,6 @@ func TestDeleteEgressGateway(t *testing.T) {
database.InitializeDatabase() database.InitializeDatabase()
deleteAllNetworks() deleteAllNetworks()
createNet() createNet()
createTestNode()
testnode := createTestNode() testnode := createTestNode()
gateway.Interface = "eth0" gateway.Interface = "eth0"
gateway.Ranges = []string{"10.100.100.0/24"} gateway.Ranges = []string{"10.100.100.0/24"}

View File

@@ -752,7 +752,7 @@ func isInterfacePresent(iface string, address string) (string, bool) {
} }
for _, addr := range currAddrs { for _, addr := range currAddrs {
if strings.Contains(addr.String(), address) && currIface.Name != iface { if strings.Contains(addr.String(), address) && currIface.Name != iface {
logger.Log(2, "found iface", addr.String(), currIface.Name) // logger.Log(2, "found iface", addr.String(), currIface.Name)
interfaces = nil interfaces = nil
currAddrs = nil currAddrs = nil
return currIface.Name, false return currIface.Name, false
@@ -761,6 +761,6 @@ func isInterfacePresent(iface string, address string) (string, bool) {
currAddrs = nil currAddrs = nil
} }
interfaces = nil interfaces = nil
logger.Log(2, "failed to find iface", iface) // logger.Log(2, "failed to find iface", iface)
return "", true return "", true
} }

View File

@@ -159,7 +159,7 @@ func UpdateNode(currentNode *models.Node, newNode *models.Node) error {
return database.Insert(newNode.ID, string(data), database.NODES_TABLE_NAME) return database.Insert(newNode.ID, string(data), database.NODES_TABLE_NAME)
} }
} }
return fmt.Errorf("failed to update node " + newNode.MacAddress + ", cannot change macaddress.") return fmt.Errorf("failed to update node " + currentNode.ID + ", cannot change ID.")
} }
// IsNodeIDUnique - checks if node id is unique // IsNodeIDUnique - checks if node id is unique
@@ -175,8 +175,10 @@ func ValidateNode(node *models.Node, isUpdate bool) error {
if isUpdate { if isUpdate {
return true return true
} }
unique, _ := isMacAddressUnique(node.MacAddress, node.Network) var unique = true
if !(node.MacAddress == "") {
unique, _ = isMacAddressUnique(node.MacAddress, node.Network)
}
isFieldUnique, _ := IsNodeIDUnique(node) isFieldUnique, _ := IsNodeIDUnique(node)
return isFieldUnique && unique return isFieldUnique && unique
}) })
@@ -602,7 +604,10 @@ func isMacAddressUnique(macaddress string, networkName string) (bool, error) {
nodes, err := GetNetworkNodes(networkName) nodes, err := GetNetworkNodes(networkName)
if err != nil { if err != nil {
return database.IsEmptyRecord(err), err if database.IsEmptyRecord(err) {
return true, nil
}
return false, err
} }
for _, node := range nodes { for _, node := range nodes {

BIN
main Executable file

Binary file not shown.

View File

@@ -27,7 +27,7 @@ func SetJWT(client nodepb.NodeServiceClient, network string) (context.Context, e
if err != nil { if err != nil {
return nil, status.Errorf(codes.Unauthenticated, fmt.Sprintf("Something went wrong with Auto Login: %v", err)) return nil, status.Errorf(codes.Unauthenticated, fmt.Sprintf("Something went wrong with Auto Login: %v", err))
} }
tokentext, err = os.ReadFile(home + "nettoken-" + network) tokentext, err = ncutils.GetFileWithRetry(home+"nettoken-"+network, 1)
if err != nil { if err != nil {
return nil, status.Errorf(codes.Unauthenticated, fmt.Sprintf("Something went wrong: %v", err)) return nil, status.Errorf(codes.Unauthenticated, fmt.Sprintf("Something went wrong: %v", err))
} }
@@ -88,7 +88,7 @@ func StoreSecret(key string, network string) error {
// RetrieveSecret - fetches secret locally // RetrieveSecret - fetches secret locally
func RetrieveSecret(network string) (string, error) { func RetrieveSecret(network string) (string, error) {
dat, err := os.ReadFile(ncutils.GetNetclientPathSpecific() + "secret-" + network) dat, err := ncutils.GetFileWithRetry(ncutils.GetNetclientPathSpecific()+"secret-"+network, 3)
return string(dat), err return string(dat), err
} }
@@ -103,7 +103,7 @@ func StoreTrafficKey(key *[32]byte, network string) error {
// RetrieveTrafficKey - reads traffic file locally // RetrieveTrafficKey - reads traffic file locally
func RetrieveTrafficKey(network string) (*[32]byte, error) { func RetrieveTrafficKey(network string) (*[32]byte, error) {
data, err := os.ReadFile(ncutils.GetNetclientPathSpecific() + "traffic-" + network) data, err := ncutils.GetFileWithRetry(ncutils.GetNetclientPathSpecific()+"traffic-"+network, 2)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@@ -68,7 +68,7 @@ func Write(config *ClientConfig, network string) error {
if err != nil { if err != nil {
return err return err
} }
return err return f.Sync()
} }
// ClientConfig.ReadConfig - used to read config from client disk into memory // ClientConfig.ReadConfig - used to read config from client disk into memory
@@ -109,7 +109,6 @@ func ModConfig(node *models.Node) error {
return errors.New("no network provided") return errors.New("no network provided")
} }
var modconfig ClientConfig var modconfig ClientConfig
var err error
if FileExists(ncutils.GetNetclientPathSpecific() + "netconfig-" + network) { if FileExists(ncutils.GetNetclientPathSpecific() + "netconfig-" + network) {
useconfig, err := ReadConfig(network) useconfig, err := ReadConfig(network)
if err != nil { if err != nil {
@@ -120,8 +119,7 @@ func ModConfig(node *models.Node) error {
modconfig.Node = (*node) modconfig.Node = (*node)
modconfig.NetworkSettings = node.NetworkSettings modconfig.NetworkSettings = node.NetworkSettings
err = Write(&modconfig, network) return Write(&modconfig, network)
return err
} }
// ModConfig - overwrites the node inside client config on disk // ModConfig - overwrites the node inside client config on disk

View File

@@ -299,10 +299,9 @@ func NodeUpdate(client mqtt.Client, msg mqtt.Message) {
return return
} }
if newNode.DNSOn == "yes" { if newNode.DNSOn == "yes" {
ncutils.Log("setting up DNS") for _, server := range newNode.NetworkSettings.DefaultServerAddrs {
for _, server := range cfg.Node.NetworkSettings.DefaultServerAddrs {
if server.IsLeader { if server.IsLeader {
go setDNS(cfg.Node.Interface, cfg.Network, server.Address) go local.SetDNSWithRetry(newNode.Interface, newNode.Network, server.Address)
break break
} }
} }
@@ -581,19 +580,6 @@ func decryptMsg(cfg *config.ClientConfig, msg []byte) ([]byte, error) {
return ncutils.BoxDecrypt(msg, serverPubKey, diskKey) return ncutils.BoxDecrypt(msg, serverPubKey, diskKey)
} }
func setDNS(iface, network, address string) {
var reachable bool
for counter := 0; !reachable && counter < 5; counter++ {
reachable = local.IsDNSReachable(address)
time.Sleep(time.Second << 1)
}
if !reachable {
ncutils.Log("not setting dns, server unreachable: " + address)
} else if err := local.UpdateDNS(iface, network, address); err != nil {
ncutils.Log("error applying dns" + err.Error())
}
}
func pingServer(cfg *config.ClientConfig) error { func pingServer(cfg *config.ClientConfig) error {
node := getServerAddress(cfg) node := getServerAddress(cfg)
pinger, err := ping.NewPinger(node) pinger, err := ping.NewPinger(node)

View File

@@ -68,13 +68,12 @@ func JoinNetwork(cfg config.ClientConfig, privateKey string) error {
cfg.Node.TrafficKeys.Server = nil cfg.Node.TrafficKeys.Server = nil
// == end handle keys == // == end handle keys ==
if cfg.Node.LocalRange != "" && cfg.Node.LocalAddress == "" { if cfg.Node.LocalAddress == "" {
log.Println("local vpn, getting local address from range: " + cfg.Node.LocalRange)
cfg.Node.LocalAddress = getLocalIP(cfg.Node)
} else if cfg.Node.LocalAddress == "" {
intIP, err := getPrivateAddr() intIP, err := getPrivateAddr()
if err == nil { if err == nil {
cfg.Node.LocalAddress = intIP cfg.Node.LocalAddress = intIP
} else {
ncutils.PrintLog("error retrieving private address: "+err.Error(), 1)
} }
} }
@@ -237,6 +236,14 @@ func JoinNetwork(cfg config.ClientConfig, privateKey string) error {
if err != nil { if err != nil {
return err return err
} }
if node.DNSOn == "yes" {
for _, server := range node.NetworkSettings.DefaultServerAddrs {
if server.IsLeader {
go local.SetDNSWithRetry(node.Interface, node.Network, server.Address)
break
}
}
}
if cfg.Daemon != "off" { if cfg.Daemon != "off" {
err = daemon.InstallDaemon(cfg) err = daemon.InstallDaemon(cfg)
} }

View File

@@ -16,6 +16,19 @@ import (
const DNS_UNREACHABLE_ERROR = "nameserver unreachable" const DNS_UNREACHABLE_ERROR = "nameserver unreachable"
func SetDNSWithRetry(iface, network, address string) {
var reachable bool
for counter := 0; !reachable && counter < 5; counter++ {
reachable = IsDNSReachable(address)
time.Sleep(time.Second << 1)
}
if !reachable {
ncutils.Log("not setting dns, server unreachable: " + address)
} else if err := UpdateDNS(iface, network, address); err != nil {
ncutils.Log("error applying dns" + err.Error())
}
}
// SetDNS - sets the DNS of a local machine // SetDNS - sets the DNS of a local machine
func SetDNS(nameserver string) error { func SetDNS(nameserver string) error {
bytes, err := os.ReadFile("/etc/resolv.conf") bytes, err := os.ReadFile("/etc/resolv.conf")

View File

@@ -5,19 +5,25 @@ import (
"fmt" "fmt"
"net" "net"
"strings"
"github.com/gravitl/netmaker/netclient/ncutils" "github.com/gravitl/netmaker/netclient/ncutils"
) )
func setRoute(iface string, addr *net.IPNet, address string) error { func setRoute(iface string, addr *net.IPNet, address string) error {
var err error out, err := ncutils.RunCmd(fmt.Sprintf("ip route get %s", addr.IP.String()), false)
if err != nil || !strings.Contains(out, iface) {
_, err = ncutils.RunCmd(fmt.Sprintf("ip route add %s dev %s", addr.String(), iface), false) _, err = ncutils.RunCmd(fmt.Sprintf("ip route add %s dev %s", addr.String(), iface), false)
}
return err return err
} }
func deleteRoute(iface string, addr *net.IPNet, address string) error { func deleteRoute(iface string, addr *net.IPNet, address string) error {
var err error var err error
out, _ := ncutils.RunCmd(fmt.Sprintf("ip route get %s", addr.IP.String()), false)
if strings.Contains(out, iface) {
_, err = ncutils.RunCmd(fmt.Sprintf("ip route del %s dev %s", addr.String(), iface), false) _, err = ncutils.RunCmd(fmt.Sprintf("ip route del %s dev %s", addr.String(), iface), false)
}
return err return err
} }

View File

@@ -27,6 +27,6 @@ func setCidr(iface, address string, addr *net.IPNet) {
ncutils.RunCmd("route change "+addr.IP.String()+" mask "+addr.Mask.String()+" "+address, false) ncutils.RunCmd("route change "+addr.IP.String()+" mask "+addr.Mask.String()+" "+address, false)
} }
func removeCidr(iface, address string, addr *net.IPNet) { func removeCidr(iface string, addr *net.IPNet, address string) {
ncutils.RunCmd("route delete "+addr.IP.String()+" mask "+addr.Mask.String()+" "+address, false) ncutils.RunCmd("route delete "+addr.IP.String()+" mask "+addr.Mask.String()+" "+address, false)
} }

BIN
netclient/main Executable file

Binary file not shown.

View File

@@ -320,6 +320,22 @@ func GetNetclientPath() string {
} }
} }
// GetFileWithRetry - retry getting file X number of times before failing
func GetFileWithRetry(path string, retryCount int) ([]byte, error) {
var data []byte
var err error
for count := 0; count < retryCount; count++ {
data, err = os.ReadFile(path)
if err == nil {
return data, err
} else {
PrintLog("failed to retrieve file "+path+", retrying...", 1)
time.Sleep(time.Second >> 2)
}
}
return data, err
}
// GetNetclientPathSpecific - gets specific netclient config path // GetNetclientPathSpecific - gets specific netclient config path
func GetNetclientPathSpecific() string { func GetNetclientPathSpecific() string {
if IsWindows() { if IsWindows() {
@@ -411,6 +427,7 @@ func Copy(src, dst string) error {
return err return err
} }
err = os.Chmod(dst, 0755) err = os.Chmod(dst, 0755)
return err return err
} }

View File

@@ -65,9 +65,6 @@ func ApplyWGQuickConf(confPath string, ifacename string) error {
ncutils.RunCmd("wg-quick down "+confPath, true) ncutils.RunCmd("wg-quick down "+confPath, true)
} }
_, err = ncutils.RunCmd("wg-quick up "+confPath, true) _, err = ncutils.RunCmd("wg-quick up "+confPath, true)
// if err != nil {
// return err
// }
return err return err
} }
} }
@@ -126,6 +123,6 @@ func StorePrivKey(key string, network string) error {
// RetrievePrivKey - reads wg priv key from local disk // RetrievePrivKey - reads wg priv key from local disk
func RetrievePrivKey(network string) (string, error) { func RetrievePrivKey(network string) (string, error) {
dat, err := os.ReadFile(ncutils.GetNetclientPathSpecific() + "wgkey-" + network) dat, err := ncutils.GetFileWithRetry(ncutils.GetNetclientPathSpecific()+"wgkey-"+network, 2)
return string(dat), err return string(dat), err
} }