Brad Bishop | 79641f2 | 2019-09-10 07:20:22 -0400 | [diff] [blame] | 1 | #!/usr/bin/env python3 |
| 2 | import sys |
| 3 | import os |
| 4 | import subprocess |
William A. Kennington III | ac69b48 | 2021-06-02 12:28:27 -0700 | [diff] [blame] | 5 | import resource |
Brad Bishop | 79641f2 | 2019-09-10 07:20:22 -0400 | [diff] [blame] | 6 | |
| 7 | env = os.environ.copy() |
| 8 | args = sys.argv[1:] |
| 9 | targettype = args.pop(0) |
| 10 | |
| 11 | if targettype == "user": |
| 12 | qemuargs = os.environ.get("QEMU_OPTIONS", "").split() |
| 13 | if not os.path.exists(qemuargs[0]): |
| 14 | # ensure qemu args has a valid absolute path |
| 15 | for i in os.environ.get("PATH", "").split(":"): |
| 16 | if os.path.exists(os.path.join(i, qemuargs[0])): |
| 17 | qemuargs[0] = os.path.join(i, qemuargs[0]) |
| 18 | break |
| 19 | sysroot = os.environ.get("QEMU_SYSROOT", None) |
| 20 | if not sysroot: |
| 21 | sys.exit(-1) |
| 22 | libpaths = [sysroot + "/usr/lib", sysroot + "/lib"] |
| 23 | |
| 24 | if args[0] == "env": |
| 25 | args.pop(0) |
| 26 | if len(args) == 0: |
| 27 | args = ["env"] |
| 28 | else: |
| 29 | # process options |
| 30 | while args[0].startswith("-"): |
| 31 | opt = args.pop(0).lstrip("-") |
| 32 | if "i" in opt: |
| 33 | env.clear() |
| 34 | # process environment vars |
| 35 | while "=" in args[0]: |
| 36 | key, val = args.pop(0).split("=", 1) |
| 37 | if key == "LD_LIBRARY_PATH": |
| 38 | libpaths += val.split(":") |
| 39 | else: |
| 40 | env[key] = val |
| 41 | if args[0] == "cp": |
| 42 | # ignore copies, the filesystem is the same |
| 43 | sys.exit(0) |
| 44 | |
| 45 | qemuargs += ["-L", sysroot] |
| 46 | qemuargs += ["-E", "LD_LIBRARY_PATH={}".format(":".join(libpaths))] |
| 47 | command = qemuargs + args |
William A. Kennington III | ac69b48 | 2021-06-02 12:28:27 -0700 | [diff] [blame] | 48 | |
| 49 | # We've seen qemu-arm using up all system memory for some glibc |
| 50 | # tests e.g. nptl/tst-pthread-timedlock-lockloop |
| 51 | # Cap at 8GB since no test should need more than that |
| 52 | # (5GB adds 7 failures for qemuarm glibc test run) |
| 53 | limit = 8*1024*1024*1024 |
| 54 | resource.setrlimit(resource.RLIMIT_AS, (limit, limit)) |
| 55 | |
Brad Bishop | 79641f2 | 2019-09-10 07:20:22 -0400 | [diff] [blame] | 56 | elif targettype == "ssh": |
| 57 | host = os.environ.get("SSH_HOST", None) |
| 58 | user = os.environ.get("SSH_HOST_USER", None) |
| 59 | port = os.environ.get("SSH_HOST_PORT", None) |
| 60 | |
| 61 | command = ["ssh", "-o", "UserKnownHostsFile=/dev/null", "-o", "StrictHostKeyChecking=no"] |
| 62 | if port: |
| 63 | command += ["-p", str(port)] |
| 64 | if not host: |
| 65 | sys.exit(-1) |
| 66 | command += ["{}@{}".format(user, host) if user else host] |
| 67 | |
| 68 | # wrap and replace quotes for correct transformation on ssh |
| 69 | wrapped = " ".join(["'{0}'".format(i.replace("'", r"'\''")) for i in ["cd", os.getcwd()]]) + "; " |
| 70 | wrapped += " ".join(["'{0}'".format(i.replace("'", r"'\''")) for i in args]) |
| 71 | command += ["sh", "-c", "\"{}\"".format(wrapped)] |
| 72 | else: |
| 73 | sys.exit(-1) |
| 74 | |
| 75 | try: |
| 76 | r = subprocess.run(command, timeout = 1800, env = env) |
| 77 | sys.exit(r.returncode) |
| 78 | except subprocess.TimeoutExpired: |
| 79 | sys.exit(-1) |
| 80 | |