diff --git a/controllers/network.go b/controllers/network.go index 840c06c7..e3e84071 100644 --- a/controllers/network.go +++ b/controllers/network.go @@ -227,7 +227,7 @@ func createNetwork(w http.ResponseWriter, r *http.Request) { if servercfg.IsClientMode() != "off" { var success bool - success, err = serverctl.AddNetwork(network.NetID) + success, err = serverctl.AddNetwork(&network) if err != nil || !success { logic.DeleteNetwork(network.NetID) if err == nil { diff --git a/logic/server.go b/logic/server.go index 8bda9ef9..5d8847c9 100644 --- a/logic/server.go +++ b/logic/server.go @@ -26,9 +26,9 @@ const KUBERNETES_LISTEN_PORT = 31821 const KUBERNETES_SERVER_MTU = 1024 // ServerJoin - responsible for joining a server to a network -func ServerJoin(network string, serverID string, privateKey string) error { +func ServerJoin(networkSettings *models.Network, serverID string) error { - if network == "" { + if networkSettings == nil || networkSettings.NetID == "" { return errors.New("no network provided") } @@ -54,6 +54,15 @@ func ServerJoin(network string, serverID string, privateKey string) error { } if node.Endpoint == "" { + if node.IsLocal == "yes" { + var localAddr, localErr = getServerLocalIP(networkSettings) + if localErr != nil { + logger.Log(1, "could not acquire local address", localErr.Error()) + } else { + node.LocalAddress = localAddr + node.LocalRange = networkSettings.LocalRange + } + } if node.IsLocal == "yes" && node.LocalAddress != "" { node.Endpoint = node.LocalAddress } else { @@ -65,6 +74,8 @@ func ServerJoin(network string, serverID string, privateKey string) error { } } + var privateKey = "" + // Generate and set public/private WireGuard Keys if privateKey == "" { wgPrivatekey, err := wgtypes.GeneratePrivateKey() @@ -76,7 +87,7 @@ func ServerJoin(network string, serverID string, privateKey string) error { node.PublicKey = wgPrivatekey.PublicKey().String() } - node.Network = network + node.Network = networkSettings.NetID logger.Log(2, "adding a server instance on network", node.Network) err = CreateNode(node) @@ -421,3 +432,23 @@ func checkNodeActions(node *models.Node) string { } return "" } + +// best effort, or get public ip +func getServerLocalIP(networkSettings *models.Network) (string, error) { + var networkCIDR = networkSettings.AddressRange + var currentAddresses, err = net.InterfaceAddrs() + if err != nil { // attempt to use public IP + return "", err + } + var _, currentCIDR, cidrErr = net.ParseCIDR(networkCIDR) + if cidrErr != nil { + return "", err + } + for _, address := range currentAddresses { + if currentCIDR.Contains(net.IP(address.Network())) { + logger.Log(1, "setting local ip", address.String()) + return address.String(), nil + } + } + return "", errors.New("could not find local ip") +} diff --git a/serverctl/serverctl.go b/serverctl/serverctl.go index e0b9178e..1e874daa 100644 --- a/serverctl/serverctl.go +++ b/serverctl/serverctl.go @@ -103,7 +103,7 @@ func SyncNetworks(servernets []models.Network) error { } } if !exists { - success, err := AddNetwork(servernet.NetID) + success, err := AddNetwork(&servernet) if err != nil || !success { if err == nil { err = errors.New("network add failed for " + servernet.NetID) @@ -139,7 +139,7 @@ func SyncNetworks(servernets []models.Network) error { } // AddNetwork - add a network to server in client mode -func AddNetwork(network string) (bool, error) { - var err = logic.ServerJoin(network, servercfg.GetNodeID(), "") +func AddNetwork(networkSettings *models.Network) (bool, error) { + var err = logic.ServerJoin(networkSettings, servercfg.GetNodeID()) return true, err }