| #!/usr/bin/env python3 |
| import sys |
| import os |
| import subprocess |
| import resource |
| |
| env = os.environ.copy() |
| args = sys.argv[1:] |
| targettype = args.pop(0) |
| |
| if targettype == "user": |
| qemuargs = os.environ.get("QEMU_OPTIONS", "").split() |
| if not os.path.exists(qemuargs[0]): |
| # ensure qemu args has a valid absolute path |
| for i in os.environ.get("PATH", "").split(":"): |
| if os.path.exists(os.path.join(i, qemuargs[0])): |
| qemuargs[0] = os.path.join(i, qemuargs[0]) |
| break |
| sysroot = os.environ.get("QEMU_SYSROOT", None) |
| if not sysroot: |
| sys.exit(-1) |
| libpaths = [sysroot + "/usr/lib", sysroot + "/lib"] |
| |
| if args[0] == "env": |
| args.pop(0) |
| if len(args) == 0: |
| args = ["env"] |
| else: |
| # process options |
| while args[0].startswith("-"): |
| opt = args.pop(0).lstrip("-") |
| if "i" in opt: |
| env.clear() |
| # process environment vars |
| while "=" in args[0]: |
| key, val = args.pop(0).split("=", 1) |
| if key == "LD_LIBRARY_PATH": |
| libpaths += val.split(":") |
| else: |
| env[key] = val |
| if args[0] == "cp": |
| # ignore copies, the filesystem is the same |
| sys.exit(0) |
| |
| qemuargs += ["-L", sysroot] |
| qemuargs += ["-E", "LD_LIBRARY_PATH={}".format(":".join(libpaths))] |
| command = qemuargs + args |
| |
| # We've seen qemu-arm using up all system memory for some glibc |
| # tests e.g. nptl/tst-pthread-timedlock-lockloop |
| # Cap at 8GB since no test should need more than that |
| # (5GB adds 7 failures for qemuarm glibc test run) |
| limit = 8*1024*1024*1024 |
| resource.setrlimit(resource.RLIMIT_AS, (limit, limit)) |
| |
| elif targettype == "ssh": |
| host = os.environ.get("SSH_HOST", None) |
| user = os.environ.get("SSH_HOST_USER", None) |
| port = os.environ.get("SSH_HOST_PORT", None) |
| |
| command = ["ssh", "-o", "UserKnownHostsFile=/dev/null", "-o", "StrictHostKeyChecking=no"] |
| if port: |
| command += ["-p", str(port)] |
| if not host: |
| sys.exit(-1) |
| command += ["{}@{}".format(user, host) if user else host] |
| |
| # wrap and replace quotes for correct transformation on ssh |
| wrapped = " ".join(["'{0}'".format(i.replace("'", r"'\''")) for i in ["cd", os.getcwd()]]) + "; " |
| wrapped += " ".join(["'{0}'".format(i.replace("'", r"'\''")) for i in args]) |
| command += ["sh", "-c", "\"{}\"".format(wrapped)] |
| else: |
| sys.exit(-1) |
| |
| try: |
| r = subprocess.run(command, timeout = 1800, env = env) |
| sys.exit(r.returncode) |
| except subprocess.TimeoutExpired: |
| sys.exit(-1) |
| |