Path: blob/main/tests/atf_python/sys/net/tools.py
101899 views
#!/usr/local/bin/python31import json2import os3import subprocess456class ToolsHelper(object):7NETSTAT_PATH = "/usr/bin/netstat"8IFCONFIG_PATH = "/sbin/ifconfig"910@classmethod11def get_output(cls, cmd: str, verbose=False) -> str:12if verbose:13print("run: '{}'".format(cmd))14return os.popen(cmd).read()1516@classmethod17def pf_rules(cls, rules, verbose=True):18pf_conf = ""19for r in rules:20pf_conf = pf_conf + r + "\n"2122if verbose:23print("Set rules:")24print(pf_conf)2526ps = subprocess.Popen("/sbin/pfctl -g -f -", shell=True,27stdin=subprocess.PIPE)28ps.communicate(bytes(pf_conf, 'utf-8'))29ret = ps.wait()30if ret != 0:31raise Exception("Failed to set pf rules %d" % ret)3233if verbose:34cls.print_output("/sbin/pfctl -sr")3536@classmethod37def print_output(cls, cmd: str, verbose=True):38if verbose:39print("======= {} =====".format(cmd))40print(cls.get_output(cmd))41if verbose:42print()4344@classmethod45def print_net_debug(cls):46cls.print_output("ifconfig")47cls.print_output("netstat -rnW")4849@classmethod50def set_sysctl(cls, oid, val):51cls.get_output("sysctl {}={}".format(oid, val))5253@classmethod54def get_routes(cls, family: str, fibnum: int = 0):55family_key = {"inet": "-4", "inet6": "-6"}.get(family)56out = cls.get_output(57"{} {} -rnW -F {} --libxo json".format(cls.NETSTAT_PATH, family_key, fibnum)58)59js = json.loads(out)60js = js["statistics"]["route-information"]["route-table"]["rt-family"]61if js:62return js[0]["rt-entry"]63else:64return []6566@classmethod67def get_nhops(cls, family: str, fibnum: int = 0):68family_key = {"inet": "-4", "inet6": "-6"}.get(family)69out = cls.get_output(70"{} {} -onW -F {} --libxo json".format(cls.NETSTAT_PATH, family_key, fibnum)71)72js = json.loads(out)73js = js["statistics"]["route-nhop-information"]["nhop-table"]["rt-family"]74if js:75return js[0]["nh-entry"]76else:77return []7879@classmethod80def get_linklocals(cls):81ret = {}82ifname = None83ips = []84for line in cls.get_output(cls.IFCONFIG_PATH).splitlines():85if line[0].isalnum():86if ifname:87ret[ifname] = ips88ips = []89ifname = line.split(":")[0]90else:91words = line.split()92if words[0] == "inet6" and words[1].startswith("fe80"):93# inet6 fe80::1%lo0 prefixlen 64 scopeid 0x294ip = words[1].split("%")[0]95scopeid = int(words[words.index("scopeid") + 1], 16)96ips.append((ip, scopeid))97if ifname:98ret[ifname] = ips99return ret100101102