package main import ( "fmt" "io/ioutil" "net" //"os" "path/filepath" //"strings" "github.com/charmbracelet/lipgloss" "github.com/vishvananda/netlink" "github.com/vishvananda/netns" "golang.org/x/sys/unix" ) func main() { headerStyle := lipgloss.NewStyle().Bold(true).Foreground(lipgloss.Color("63")) ipStyle := lipgloss.NewStyle().Foreground(lipgloss.Color("203")) upStyle := lipgloss.NewStyle().Foreground(lipgloss.Color("42")) downStyle := lipgloss.NewStyle().Foreground(lipgloss.Color("196")) addrStyle := lipgloss.NewStyle().Faint(true) infoStyle := lipgloss.NewStyle().Foreground(lipgloss.Color("33")) // Save the current netns origNS, err := netns.Get() if err != nil { fmt.Println("Error getting current netns:", err) return } defer origNS.Close() links, err := netlink.LinkList() if err != nil { fmt.Println("Error listing links:", err) return } for _, link := range links { attrs := link.Attrs() if attrs == nil { continue } state := downStyle.Render("DOWN") if attrs.Flags&net.FlagUp != 0 { state = upStyle.Render("UP") } fmt.Print(headerStyle.Render(attrs.Name), " ") fmt.Printf(addrStyle.Render(" %s"), attrs.HardwareAddr) fmt.Printf(addrStyle.Render(" %d"), attrs.MTU) fmt.Printf(" %s\n", state) // IP addresses (IPv4 only) addrs, err := netlink.AddrList(link, unix.AF_INET) if err == nil { for _, addr := range addrs { fmt.Println(" ", ipStyle.Render(addr.IPNet.String())) } } if link.Type() != "veth" { fmt.Println() continue } 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 } } // 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 } 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) peerFound = true break } } } nsHandle.Close() netns.Set(origNS) if peerFound { break } } } } if !peerFound { fmt.Println(" ", infoStyle.Render("Peer not found — may be deleted or hidden")) } fmt.Println() } }