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