ns.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package proc
  2. import (
  3. "runtime"
  4. "github.com/vishvananda/netlink"
  5. "github.com/vishvananda/netns"
  6. "golang.org/x/sys/unix"
  7. "inet.af/netaddr"
  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. }