diff --git a/cmds/networkd/addr_watcher.go b/cmds/networkd/addr_watcher.go index b75d56601..5de5936a8 100644 --- a/cmds/networkd/addr_watcher.go +++ b/cmds/networkd/addr_watcher.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/containernetworking/plugins/pkg/ns" "github.com/rs/zerolog/log" "time" @@ -11,10 +12,12 @@ import ( "github.com/cenkalti/backoff/v3" "github.com/threefoldtech/tfexplorer/client" "github.com/threefoldtech/tfexplorer/models/generated/directory" + "github.com/threefoldtech/tfexplorer/schema" "github.com/threefoldtech/zos/pkg" "github.com/threefoldtech/zos/pkg/network/ifaceutil" + "github.com/threefoldtech/zos/pkg/network/namespace" + "github.com/threefoldtech/zos/pkg/network/ndmz" "github.com/threefoldtech/zos/pkg/network/types" - "github.com/threefoldtech/tfexplorer/schema" "github.com/vishvananda/netlink" ) @@ -56,6 +59,13 @@ func (w WatchedLinks) callBack(update netlink.AddrUpdate) error { return err } + ndmzIfaces, err := getNdmzInterfaces() + if err != nil { + return err + } + + ifaces = append(ifaces, ndmzIfaces...) + return publishIfaces(ifaces, w.nodeID, w.dir) } @@ -96,6 +106,53 @@ func (w WatchedLinks) Forever(ctx context.Context) error { } } +func getNdmzInterfaces() ([]types.IfaceInfo, error) { + var output []types.IfaceInfo + + f := func(_ ns.NetNS) error { + links, err := netlink.LinkList() + if err != nil { + log.Error().Err(err).Msgf("failed to list interfaces") + return err + } + for _, link := range links { + if link.Attrs().Name == ndmz.DMZPub4 || link.Attrs().Name == ndmz.DMZPub6 { + addrs, err := netlink.AddrList(link, netlink.FAMILY_ALL) + if err != nil { + return err + } + + info := types.IfaceInfo{ + Name: link.Attrs().Name, + Addrs: make([]types.IPNet, len(addrs)), + MacAddress: schema.MacAddress{link.Attrs().HardwareAddr}, + } + for i, addr := range addrs { + info.Addrs[i] = types.NewIPNet(addr.IPNet) + } + + output = append(output, info) + } + + } + return nil + } + + // get the ndmz network namespace + ndmz, err := namespace.GetByName(ndmz.NetNSNDMZ) + if err != nil { + return nil, err + } + defer ndmz.Close() + + err = ndmz.Do(f) + if err != nil { + return nil, err + } + + return output, nil +} + func getLocalInterfaces() ([]types.IfaceInfo, error) { var output []types.IfaceInfo diff --git a/cmds/networkd/main.go b/cmds/networkd/main.go index fe24c41a6..8a111df60 100644 --- a/cmds/networkd/main.go +++ b/cmds/networkd/main.go @@ -68,14 +68,6 @@ func main() { log.Info().Msg("shutting down") }) - ifaces, err := getLocalInterfaces() - if err != nil { - log.Fatal().Err(err).Msg("failed to read local network interfaces") - } - if err := publishIfaces(ifaces, nodeID, dir); err != nil { - log.Fatal().Err(err).Msg("failed to publish network interfaces to BCDB") - } - ifaceVersion := -1 exitIface, err := getPubIface(dir, nodeID.Identity()) @@ -123,6 +115,22 @@ func main() { } }(ctx, chIface) + ifaces, err := getLocalInterfaces() + if err != nil { + log.Fatal().Err(err).Msg("failed to read local network interfaces") + } + + ndmzIfaces, err := getNdmzInterfaces() + if err != nil { + log.Fatal().Err(err).Msg("failed to read ndmz network interfaces") + } + + ifaces = append(ifaces, ndmzIfaces...) + + if err := publishIfaces(ifaces, nodeID, dir); err != nil { + log.Fatal().Err(err).Msg("failed to publish ndmz network interfaces to BCDB") + } + go startAddrWatch(ctx, nodeID, dir, ifaces) log.Info().Msg("start zbus server")