def verify_virtualenv(): if not testlib.virtualenv_path(): raise SystemExit("ERROR: Please load virtual environment first " "(Use \"pipenv shell\" or configure direnv)")
def snmpsim(site, request, tmp_path_factory): tmp_path = tmp_path_factory.getbasetemp() snmpsimd_path = "%s/bin/snmpsimd.py" % (virtualenv_path()) source_data_dir = Path(request.fspath.dirname) / "snmp_data" log.logger.setLevel(logging.DEBUG) debug.enable() cmd = [ "%s/bin/python" % site.root, snmpsimd_path, #"--log-level=error", "--cache-dir", str(tmp_path / "snmpsim"), "--data-dir", str(source_data_dir), # TODO: Fix port allocation to prevent problems with parallel tests #"--agent-unix-endpoint=" "--agent-udpv4-endpoint=127.0.0.1:1337", "--agent-udpv6-endpoint=[::1]:1337", "--v3-user=authOnlyUser", "--v3-auth-key=authOnlyUser", "--v3-auth-proto=MD5", ] p = subprocess.Popen( cmd, close_fds=True, # Silence the very noisy output. May be useful to enable this for debugging tests #stdout=open(os.devnull, "w"), #stderr=subprocess.STDOUT, ) # Ensure that snmpsim is ready for clients before starting with the tests def is_listening(): if p.poll() is not None: raise Exception("snmpsimd died. Exit code: %d" % p.poll()) num_sockets = 0 try: for e in os.listdir("/proc/%d/fd" % p.pid): try: if os.readlink("/proc/%d/fd/%s" % (p.pid, e)).startswith("socket:"): num_sockets += 1 except OSError: pass except OSError: if p.poll() is None: raise raise Exception("snmpsimd died. Exit code: %d" % p.poll()) if num_sockets < 2: return False import netsnmp var = netsnmp.Varbind("sysDescr.0") result = netsnmp.snmpget(var, Version=2, DestHost="127.0.0.1:1337", Community="public") if result is None or result[0] is None: return False return True wait_until(is_listening, timeout=20) yield log.logger.setLevel(logging.INFO) debug.disable() logger.debug("Stopping snmpsimd...") p.terminate() p.wait() logger.debug("Stopped snmpsimd.")