| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- # SPDX-License-Identifier: GPL-2.0
- from .utils import ip
- import ctypes
- import random
- import string
- libc = ctypes.cdll.LoadLibrary('libc.so.6')
- class NetNS:
- def __init__(self, name=None):
- if name:
- self.name = name
- else:
- self.name = ''.join(random.choice(string.ascii_lowercase) for _ in range(8))
- ip('netns add ' + self.name)
- def __del__(self):
- if self.name:
- ip('netns del ' + self.name)
- self.name = None
- def __enter__(self):
- return self
- def __exit__(self, ex_type, ex_value, ex_tb):
- self.__del__()
- def __str__(self):
- return self.name
- def __repr__(self):
- return f"NetNS({self.name})"
- class NetNSEnter:
- def __init__(self, ns_name):
- self.ns_path = f"/run/netns/{ns_name}"
- def __enter__(self):
- self.saved = open("/proc/thread-self/ns/net")
- with open(self.ns_path) as ns_file:
- libc.setns(ns_file.fileno(), 0)
- return self
- def __exit__(self, exc_type, exc_value, traceback):
- libc.setns(self.saved.fileno(), 0)
- self.saved.close()
|