This commit is contained in:
root 2025-06-25 14:22:34 -04:00
parent 853c0e6357
commit 86cbb31a2f
2 changed files with 39 additions and 45 deletions

BIN
main

Binary file not shown.

84
main.go
View File

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