| # 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() |