diff --git a/main b/main index ec4a777..8d0526d 100755 Binary files a/main and b/main differ diff --git a/main.go b/main.go index 3dafe47..4ede9a0 100644 --- a/main.go +++ b/main.go @@ -4,9 +4,7 @@ import ( "fmt" "io/ioutil" "net" - //"os" "path/filepath" - //"strings" "github.com/charmbracelet/lipgloss" "github.com/vishvananda/netlink" @@ -22,14 +20,15 @@ func main() { addrStyle := lipgloss.NewStyle().Faint(true) infoStyle := lipgloss.NewStyle().Foreground(lipgloss.Color("33")) - // Save the current netns + // Save the current namespace origNS, err := netns.Get() if err != nil { - fmt.Println("Error getting current netns:", err) + fmt.Println("Error getting current namespace:", err) return } defer origNS.Close() + // Get all links in the current namespace links, err := netlink.LinkList() if err != nil { fmt.Println("Error listing links:", err) @@ -52,7 +51,7 @@ func main() { fmt.Printf(addrStyle.Render(" %d"), attrs.MTU) fmt.Printf(" %s\n", state) - // IP addresses (IPv4 only) + // IPv4 only addrs, err := netlink.AddrList(link, unix.AF_INET) if err == nil { for _, addr := range addrs { @@ -67,55 +66,50 @@ func main() { fmt.Println(" ", infoStyle.Render("Veth interface")) - // Try to find peer locally peerFound := false - for _, other := range links { - if other.Attrs().Index == attrs.Index { - continue - } - if other.Type() == "veth" && other.Attrs().ParentIndex == attrs.Index { - fmt.Println(" ", infoStyle.Render("Likely peer:"), other.Attrs().Name) - peerFound = true - break - } - } + netnsDir := "/var/run/netns/" + entries, err := ioutil.ReadDir(netnsDir) + if err != nil { + fmt.Println(" ", infoStyle.Render("Could not scan netns dir")) + } else { + for _, entry := range entries { + nsPath := filepath.Join(netnsDir, entry.Name()) - // If not found, scan /var/run/netns/ - if !peerFound { - netnsDir := "/var/run/netns/" - entries, err := ioutil.ReadDir(netnsDir) - if err != nil { - fmt.Println(" ", infoStyle.Render("Could not scan netns dir")) - } else { - for _, entry := range entries { - nsPath := filepath.Join(netnsDir, entry.Name()) + nsHandle, err := netns.GetFromPath(nsPath) + if err != nil { + continue + } - nsHandle, err := netns.GetFromPath(nsPath) - if err != nil { - continue - } + if err := netns.Set(nsHandle); err != nil { + nsHandle.Close() + continue + } - if err := netns.Set(nsHandle); err != nil { - nsHandle.Close() - continue - } + remoteLinks, err := netlink.LinkList() + if err == nil { + for _, rl := range remoteLinks { + if rl.Type() == "veth" && rl.Attrs().ParentIndex == attrs.Index { + fmt.Println(" ", infoStyle.Render("Peer in namespace:"), entry.Name(), "as", rl.Attrs().Name) - remoteLinks, err := netlink.LinkList() - if err == nil { - for _, rl := range remoteLinks { - if rl.Type() == "veth" && rl.Attrs().ParentIndex == attrs.Index { - fmt.Println(" ", infoStyle.Render("Peer in namespace:"), entry.Name(), "as", rl.Attrs().Name) - peerFound = true - break + // Get peer IPs inside this namespace + peerAddrs, err := netlink.AddrList(rl, unix.AF_INET) + if err == nil { + for _, pa := range peerAddrs { + fmt.Println(" ", ipStyle.Render(pa.IPNet.String())) + } } + + peerFound = true + break } } - nsHandle.Close() - netns.Set(origNS) + } - if peerFound { - break - } + nsHandle.Close() + netns.Set(origNS) + + if peerFound { + break } } }