#!/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", "-o", "LogLevel=quiet"]
    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)

