ns.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package proc
  2. import (
  3. "github.com/vishvananda/netlink"
  4. "github.com/vishvananda/netns"
  5. "golang.org/x/sys/unix"
  6. "inet.af/netaddr"
  7. "runtime"
  8. )
  9. func GetNetNs(pid uint32) (netns.NsHandle, error) {
  10. return netns.GetFromPid(int(pid))
  11. }
  12. func GetSelfNetNs() (netns.NsHandle, error) {
  13. return netns.Get()
  14. }
  15. func GetHostNetNs() (netns.NsHandle, error) {
  16. return GetNetNs(1)
  17. }
  18. func ExecuteInNetNs(newNs, curNs netns.NsHandle, f func() error) error {
  19. if newNs.Equal(curNs) {
  20. return f()
  21. }
  22. runtime.LockOSThread()
  23. defer runtime.UnlockOSThread()
  24. if err := netns.Set(newNs); err != nil {
  25. return err
  26. }
  27. errF := f()
  28. if err := netns.Set(curNs); err != nil {
  29. return err
  30. }
  31. return errF
  32. }
  33. func GetNsIps(ns netns.NsHandle) ([]netaddr.IP, error) {
  34. h, err := netlink.NewHandleAt(ns)
  35. if err != nil {
  36. return nil, err
  37. }
  38. defer h.Delete()
  39. links, err := h.LinkList()
  40. if err != nil {
  41. return nil, err
  42. }
  43. var res []netaddr.IP
  44. for _, link := range links {
  45. addrs, err := h.AddrList(link, unix.AF_UNSPEC)
  46. if err != nil {
  47. return nil, err
  48. }
  49. for _, addr := range addrs {
  50. ip := addr.IP
  51. if ip.IsLinkLocalUnicast() || ip.IsMulticast() || ip.IsLinkLocalMulticast() {
  52. continue
  53. }
  54. if ip, ok := netaddr.FromStdIP(ip); ok {
  55. res = append(res, ip)
  56. }
  57. }
  58. }
  59. return res, nil
  60. }