#!/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)
|