netns.py 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. # SPDX-License-Identifier: GPL-2.0
  2. from .utils import ip
  3. import ctypes
  4. import random
  5. import string
  6. libc = ctypes.cdll.LoadLibrary('libc.so.6')
  7. class NetNS:
  8. def __init__(self, name=None):
  9. if name:
  10. self.name = name
  11. else:
  12. self.name = ''.join(random.choice(string.ascii_lowercase) for _ in range(8))
  13. ip('netns add ' + self.name)
  14. def __del__(self):
  15. if self.name:
  16. ip('netns del ' + self.name)
  17. self.name = None
  18. def __enter__(self):
  19. return self
  20. def __exit__(self, ex_type, ex_value, ex_tb):
  21. self.__del__()
  22. def __str__(self):
  23. return self.name
  24. def __repr__(self):
  25. return f"NetNS({self.name})"
  26. class NetNSEnter:
  27. def __init__(self, ns_name):
  28. self.ns_path = f"/run/netns/{ns_name}"
  29. def __enter__(self):
  30. self.saved = open("/proc/thread-self/ns/net")
  31. with open(self.ns_path) as ns_file:
  32. libc.setns(ns_file.fileno(), 0)
  33. return self
  34. def __exit__(self, exc_type, exc_value, traceback):
  35. libc.setns(self.saved.fileno(), 0)
  36. self.saved.close()