blob: 6ec9b9b29ebb567a8f58da1cbddcec039cc571d2 [file] [log] [blame]
Brad Bishop79641f22019-09-10 07:20:22 -04001#!/usr/bin/env python3
2import sys
3import os
4import subprocess
William A. Kennington IIIac69b482021-06-02 12:28:27 -07005import resource
Brad Bishop79641f22019-09-10 07:20:22 -04006
7env = os.environ.copy()
8args = sys.argv[1:]
9targettype = args.pop(0)
10
11if 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 IIIac69b482021-06-02 12:28:27 -070048
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 Bishop79641f22019-09-10 07:20:22 -040056elif 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)]
72else:
73 sys.exit(-1)
74
75try:
76 r = subprocess.run(command, timeout = 1800, env = env)
77 sys.exit(r.returncode)
78except subprocess.TimeoutExpired:
79 sys.exit(-1)
80