blob: f8e04e02d2128bc324e12133cca18f3ad98ce1dd [file] [log] [blame]
Brad Bishop79641f22019-09-10 07:20:22 -04001#!/usr/bin/env python3
2import sys
3import os
4import subprocess
5
6env = os.environ.copy()
7args = sys.argv[1:]
8targettype = args.pop(0)
9
10if targettype == "user":
11 qemuargs = os.environ.get("QEMU_OPTIONS", "").split()
12 if not os.path.exists(qemuargs[0]):
13 # ensure qemu args has a valid absolute path
14 for i in os.environ.get("PATH", "").split(":"):
15 if os.path.exists(os.path.join(i, qemuargs[0])):
16 qemuargs[0] = os.path.join(i, qemuargs[0])
17 break
18 sysroot = os.environ.get("QEMU_SYSROOT", None)
19 if not sysroot:
20 sys.exit(-1)
21 libpaths = [sysroot + "/usr/lib", sysroot + "/lib"]
22
23 if args[0] == "env":
24 args.pop(0)
25 if len(args) == 0:
26 args = ["env"]
27 else:
28 # process options
29 while args[0].startswith("-"):
30 opt = args.pop(0).lstrip("-")
31 if "i" in opt:
32 env.clear()
33 # process environment vars
34 while "=" in args[0]:
35 key, val = args.pop(0).split("=", 1)
36 if key == "LD_LIBRARY_PATH":
37 libpaths += val.split(":")
38 else:
39 env[key] = val
40 if args[0] == "cp":
41 # ignore copies, the filesystem is the same
42 sys.exit(0)
43
44 qemuargs += ["-L", sysroot]
45 qemuargs += ["-E", "LD_LIBRARY_PATH={}".format(":".join(libpaths))]
46 command = qemuargs + args
47elif targettype == "ssh":
48 host = os.environ.get("SSH_HOST", None)
49 user = os.environ.get("SSH_HOST_USER", None)
50 port = os.environ.get("SSH_HOST_PORT", None)
51
52 command = ["ssh", "-o", "UserKnownHostsFile=/dev/null", "-o", "StrictHostKeyChecking=no"]
53 if port:
54 command += ["-p", str(port)]
55 if not host:
56 sys.exit(-1)
57 command += ["{}@{}".format(user, host) if user else host]
58
59 # wrap and replace quotes for correct transformation on ssh
60 wrapped = " ".join(["'{0}'".format(i.replace("'", r"'\''")) for i in ["cd", os.getcwd()]]) + "; "
61 wrapped += " ".join(["'{0}'".format(i.replace("'", r"'\''")) for i in args])
62 command += ["sh", "-c", "\"{}\"".format(wrapped)]
63else:
64 sys.exit(-1)
65
66try:
67 r = subprocess.run(command, timeout = 1800, env = env)
68 sys.exit(r.returncode)
69except subprocess.TimeoutExpired:
70 sys.exit(-1)
71