Browse Source

publish dns on node creation

Matthew R Kasun 2 years ago
parent
commit
a441e35a09
2 changed files with 93 additions and 0 deletions
  1. 15 0
      controllers/node.go
  2. 78 0
      mq/publishers.go

+ 15 - 0
controllers/node.go

@@ -671,6 +671,21 @@ func createNode(w http.ResponseWriter, r *http.Request) {
 		}
 	}()
 	//runForceServerUpdate(&data.Node, true)
+	dns := models.DNSUpdate{
+		Action:  models.DNSInsert,
+		Address: data.Node.Address.IP.String(),
+		Name:    data.Host.Name + data.Node.Network,
+	}
+	go func() {
+		//publish new node dns entry to all nodes on network
+		if err := mq.PublishDNSUpdate(data.Node.Network, dns); err != nil {
+			logger.Log(1, "failed to publish dns update on node creation", err.Error())
+		}
+		//publish add dns records for network to new node
+		if err := mq.PublishAllDNS(&data.Node); err != nil {
+			logger.Log(1, "failed to publish dns update on node creation", err.Error())
+		}
+	}()
 }
 
 // == EGRESS ==

+ 78 - 0
mq/publishers.go

@@ -160,6 +160,84 @@ func ServerStartNotify() error {
 	return nil
 }
 
+func PublishDNSUpdate(network string, dns models.DNSUpdate) error {
+	nodes, err := logic.GetNetworkNodes(network)
+	if err != nil {
+		return err
+	}
+	for _, node := range nodes {
+		host, err := logic.GetHost(node.HostID.String())
+		if err != nil {
+			logger.Log(0, "error retrieving host for dns update", host.ID.String(), err.Error())
+			continue
+		}
+		data, err := json.Marshal(dns)
+		if err != nil {
+			logger.Log(0, "failed to encode dns data for node", node.ID.String(), err.Error())
+		}
+		if err := publish(host, "network/"+host.ID.String()+"/dns", data); err != nil {
+			logger.Log(0, "error publishing dns update to host", host.ID.String(), err.Error())
+			continue
+		}
+		logger.Log(3, "published dns update to host", host.ID.String())
+	}
+	return nil
+}
+
+func PublishAllDNS(newnode *models.Node) error {
+	alldns := []models.DNSUpdate{}
+	dns := models.DNSUpdate{}
+	newnodeHost, err := logic.GetHost(newnode.HostID.String())
+	if err != nil {
+		return fmt.Errorf("error retrieving host for dns update %w", err)
+	}
+	nodes, err := logic.GetNetworkNodes(newnode.Network)
+	if err != nil {
+		return err
+	}
+	for _, node := range nodes {
+		if node.ID == newnode.ID {
+			//skip self
+			continue
+		}
+		host, err := logic.GetHost(node.HostID.String())
+		if err != nil {
+			logger.Log(0, "error retrieving host for dns update", host.ID.String(), err.Error())
+			continue
+		}
+		if node.Address.IP != nil {
+			dns.Action = models.DNSInsert
+			dns.Name = host.Name + "." + node.Network
+			dns.Address = node.Address.IP.String()
+			alldns = append(alldns, dns)
+		}
+		if node.Address6.IP != nil {
+			dns.Action = models.DNSInsert
+			dns.Name = host.Name + "." + node.Network
+			dns.Address = node.Address6.IP.String()
+			alldns = append(alldns, dns)
+		}
+	}
+	entries, err := logic.GetCustomDNS(newnode.Network)
+	if err != nil {
+		logger.Log(0, "error retrieving custom dns entries", err.Error())
+	}
+	for _, entry := range entries {
+		dns.Action = models.DNSInsert
+		dns.Address = entry.Address
+		dns.Name = entry.Name
+		alldns = append(alldns, dns)
+	}
+	data, err := json.Marshal(alldns)
+	if err != nil {
+		return fmt.Errorf("error encoding dnd data %w", err)
+	}
+	if err := publish(newnodeHost, "network/"+newnodeHost.ID.String()+"/fulldns", data); err != nil {
+		return fmt.Errorf("error publish full dns update to %s, %w", newnodeHost.ID.String(), err)
+	}
+	return nil
+}
+
 // function to collect and store metrics for server nodes
 //func collectServerMetrics(networks []models.Network) {
 //	if !servercfg.Is_EE {