ns.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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. attrs := link.Attrs()
  46. if attrs.OperState == netlink.OperDown {
  47. continue
  48. }
  49. addrs, err := h.AddrList(link, unix.AF_UNSPEC)
  50. if err != nil {
  51. return nil, err
  52. }
  53. for _, addr := range addrs {
  54. ip := addr.IP
  55. if ip.IsLinkLocalUnicast() || ip.IsMulticast() || ip.IsLinkLocalMulticast() {
  56. continue
  57. }
  58. if ip, ok := netaddr.FromStdIP(ip); ok {
  59. res = append(res, ip)
  60. }
  61. }
  62. }
  63. return res, nil
  64. }