diff --git a/controllers/common.go b/controllers/common.go index 218189e0..b5f4a1d4 100644 --- a/controllers/common.go +++ b/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) diff --git a/database/database.go b/database/database.go index 14c94ab6..10d7636b 100644 --- a/database/database.go +++ b/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 { diff --git a/database/statics.go b/database/statics.go new file mode 100644 index 00000000..6ec73d51 --- /dev/null +++ b/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), ¤tDataMap) + 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 +} diff --git a/serverctl/wireguard.go b/serverctl/wireguard.go index 5db759c3..1ffa4651 100644 --- a/serverctl/wireguard.go +++ b/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 }