From 6b18ff57c965ce77e434c669fe98497dd0f1f0a3 Mon Sep 17 00:00:00 2001 From: "Matthew R. Kasun" Date: Mon, 28 Nov 2022 11:16:19 -0500 Subject: [PATCH] add all local interfaces to node --- models/node.go | 7 +++++++ mq/handlers.go | 1 + netclient/functions/common.go | 31 +++++++++++++++++++++++++++++++ netclient/functions/join.go | 8 ++++++++ netclient/functions/mqpublish.go | 8 ++++++++ 5 files changed, 55 insertions(+) diff --git a/models/node.go b/models/node.go index c4641d35..4e42d3de 100644 --- a/models/node.go +++ b/models/node.go @@ -43,6 +43,12 @@ var seededRand *rand.Rand = rand.New( type NodeCheckin struct { Version string Connected string + Ifaces []Iface +} + +type Iface struct { + Name string + Address net.IPNet } // Node - struct for node model @@ -51,6 +57,7 @@ type Node struct { Address string `json:"address" bson:"address" yaml:"address" validate:"omitempty,ipv4"` Address6 string `json:"address6" bson:"address6" yaml:"address6" validate:"omitempty,ipv6"` LocalAddress string `json:"localaddress" bson:"localaddress" yaml:"localaddress" validate:"omitempty"` + Interfaces []Iface `json:"interfaces" yaml:"interfaces"` Name string `json:"name" bson:"name" yaml:"name" validate:"omitempty,max=62,in_charset"` NetworkSettings Network `json:"networksettings" bson:"networksettings" yaml:"networksettings" validate:"-"` ListenPort int32 `json:"listenport" bson:"listenport" yaml:"listenport" validate:"omitempty,numeric,min=1024,max=65535"` diff --git a/mq/handlers.go b/mq/handlers.go index a4b77bf4..ce36a49e 100644 --- a/mq/handlers.go +++ b/mq/handlers.go @@ -52,6 +52,7 @@ func Ping(client mqtt.Client, msg mqtt.Message) { node.SetLastCheckIn() node.Version = checkin.Version node.Connected = checkin.Connected + node.Interfaces = checkin.Ifaces if err := logic.UpdateNode(&node, &node); err != nil { logger.Log(0, "error updating node", node.Name, node.ID, " on checkin", err.Error()) return diff --git a/netclient/functions/common.go b/netclient/functions/common.go index 34ead956..e9b75c97 100644 --- a/netclient/functions/common.go +++ b/netclient/functions/common.go @@ -127,6 +127,37 @@ func getPrivateAddrBackup() (string, error) { return local, err } +func getInterfaces() (*[]models.Iface, error) { + ifaces, err := net.Interfaces() + if err != nil { + return nil, err + } + var data []models.Iface + var link models.Iface + for _, iface := range ifaces { + if iface.Flags&net.FlagUp == 0 { + continue // interface down + } + if iface.Flags&net.FlagLoopback != 0 { + continue // loopback interface + } + addrs, err := iface.Addrs() + if err != nil { + return nil, err + } + for _, addr := range addrs { + link.Name = iface.Name + _, cidr, err := net.ParseCIDR(addr.String()) + if err != nil { + continue + } + link.Address = *cidr + data = append(data, link) + } + } + return &data, nil +} + // GetNode - gets node locally func GetNode(network string) models.Node { diff --git a/netclient/functions/join.go b/netclient/functions/join.go index 02482427..ea2cfd68 100644 --- a/netclient/functions/join.go +++ b/netclient/functions/join.go @@ -238,6 +238,14 @@ func JoinNetwork(cfg *config.ClientConfig, privateKey string) error { logger.Log(1, "network:", cfg.Network, "error retrieving private address: ", err.Error()) } } + if len(cfg.Node.Interfaces) == 0 { + ip, err := getInterfaces() + if err != nil { + logger.Log(0, "failed to retrive local interfaces", err.Error()) + } else { + cfg.Node.Interfaces = *ip + } + } // set endpoint if blank. set to local if local net, retrieve from function if not if cfg.Node.Endpoint == "" { diff --git a/netclient/functions/mqpublish.go b/netclient/functions/mqpublish.go index 233bc2f5..70551d89 100644 --- a/netclient/functions/mqpublish.go +++ b/netclient/functions/mqpublish.go @@ -140,6 +140,14 @@ func Hello(nodeCfg *config.ClientConfig) { var checkin models.NodeCheckin checkin.Version = ncutils.Version checkin.Connected = nodeCfg.Node.Connected + ip, err := getInterfaces() + if err != nil { + logger.Log(0, "failed to retrieve local interfaces", err.Error()) + } else { + nodeCfg.Node.Interfaces = *ip + config.Write(nodeCfg, nodeCfg.Network) + } + checkin.Ifaces = nodeCfg.Node.Interfaces data, err := json.Marshal(checkin) if err != nil { logger.Log(0, "unable to marshal checkin data", err.Error())