ip in ns
This commit is contained in:
parent
853c0e6357
commit
86cbb31a2f
84
main.go
84
main.go
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue