Browse Source

added peer checking

worker-9 4 years ago
parent
commit
cdbbc4bb68
4 changed files with 71 additions and 1 deletions
  1. 17 0
      controllers/common.go
  2. 15 0
      database/database.go
  3. 39 0
      database/statics.go
  4. 0 1
      serverctl/wireguard.go

+ 17 - 0
controllers/common.go

@@ -210,6 +210,14 @@ func CreateNode(node models.Node, networkName string) (models.Node, error) {
 	return node, err
 }
 
+func NotifyNetworkCheck(networkName string) bool {
+	if currentPeersList, err := serverctl.GetPeers(networkName); err == nil {
+		return database.SetPeers(currentPeersList, networkName)
+	} else {
+		return false
+	}
+}
+
 func NodeCheckIn(node models.Node, networkName string) (models.CheckInResponse, error) {
 
 	var response models.CheckInResponse
@@ -252,6 +260,15 @@ func NodeCheckIn(node models.Node, networkName string) (models.CheckInResponse,
 	if nkeyupdate < gkeyupdate {
 		response.NeedKeyUpdate = true
 	}
+	if parentnode.Name == "netmaker" {
+		if NotifyNetworkCheck(networkName) {
+			err := SetNetworkNodesLastModified(networkName)
+			if err != nil {
+				log.Println(err, "could not notify network to update peers")
+			}
+		}
+	}
+
 	if time.Now().Unix() > parentnode.ExpirationDateTime {
 		response.NeedDelete = true
 		err = DeleteNode(node.MacAddress, networkName)

+ 15 - 0
database/database.go

@@ -3,6 +3,7 @@ package database
 import (
 	"encoding/json"
 	"errors"
+
 	"github.com/rqlite/gorqlite"
 )
 
@@ -12,6 +13,7 @@ const USERS_TABLE_NAME = "users"
 const DNS_TABLE_NAME = "dns"
 const EXT_CLIENT_TABLE_NAME = "extclients"
 const INT_CLIENTS_TABLE_NAME = "intclients"
+const PEERS_TABLE_NAME = "peers"
 const DATABASE_FILENAME = "netmaker.db"
 
 var Database gorqlite.Connection
@@ -37,6 +39,7 @@ func createTables() {
 	createTable(DNS_TABLE_NAME)
 	createTable(EXT_CLIENT_TABLE_NAME)
 	createTable(INT_CLIENTS_TABLE_NAME)
+	createTable(PEERS_TABLE_NAME)
 }
 
 func createTable(tableName string) error {
@@ -64,6 +67,18 @@ func Insert(key string, value string, tableName string) error {
 	}
 }
 
+func InsertPeer(key string, value string) error {
+	if key != "" && value != "" {
+		_, err := Database.WriteOne("INSERT OR REPLACE INTO " + PEERS_TABLE_NAME + " (key, value) VALUES ('" + key + "', '" + value + "')")
+		if err != nil {
+			return err
+		}
+		return nil
+	} else {
+		return errors.New("invalid peer insert " + key + " : " + value)
+	}
+}
+
 func DeleteRecord(tableName string, key string) error {
 	_, err := Database.WriteOne("DELETE FROM " + tableName + " WHERE key = \"" + key + "\"")
 	if err != nil {

+ 39 - 0
database/statics.go

@@ -0,0 +1,39 @@
+package database
+
+import (
+	"encoding/json"
+)
+
+func SetPeers(newPeers map[string]string, networkName string) bool {
+	areEqual := PeersAreEqual(newPeers, networkName)
+	if !areEqual {
+		jsonData, err := json.Marshal(newPeers)
+		if err != nil {
+			return false
+		}
+		InsertPeer(networkName, string(jsonData))
+		return true
+	}
+	return !areEqual
+}
+
+func PeersAreEqual(toCompare map[string]string, networkName string) bool {
+	record, err := FetchRecord(PEERS_TABLE_NAME, networkName)
+	if err != nil {
+		return false
+	}
+	currentDataMap := make(map[string]string)
+	err = json.Unmarshal([]byte(record), &currentDataMap)
+	if err != nil {
+		return false
+	}
+	if len(currentDataMap) != len(toCompare) {
+		return false
+	}
+	for k := range currentDataMap {
+		if currentDataMap[k] != toCompare[k] {
+			return false
+		}
+	}
+	return true
+}

+ 0 - 1
serverctl/wireguard.go

@@ -203,6 +203,5 @@ func GetPeers(networkName string) (map[string]string, error) {
 	for _, peer := range device.Peers {
 		peers[peer.PublicKey.String()] = peer.Endpoint.String()
 	}
-
 	return peers, nil
 }