publish dns on node creation

This commit is contained in:
Matthew R Kasun
2023-02-06 07:32:37 -05:00
parent 2c36dfb0bf
commit a441e35a09
2 changed files with 93 additions and 0 deletions

View File

@@ -671,6 +671,21 @@ func createNode(w http.ResponseWriter, r *http.Request) {
} }
}() }()
//runForceServerUpdate(&data.Node, true) //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 == // == EGRESS ==

View File

@@ -160,6 +160,84 @@ func ServerStartNotify() error {
return nil 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 // function to collect and store metrics for server nodes
//func collectServerMetrics(networks []models.Network) { //func collectServerMetrics(networks []models.Network) {
// if !servercfg.Is_EE { // if !servercfg.Is_EE {