diff --git a/support/scripts/boot-qemu-image.py b/support/scripts/boot-qemu-image.py new file mode 100755 index 0000000000..2c1afba398 --- /dev/null +++ b/support/scripts/boot-qemu-image.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python3 + +# This script expect to run from the Buildroot top directory. + +import pexpect +import sys +import os + + +def main(): + if not (len(sys.argv) == 2): + print("Error: incorrect number of arguments") + print("""Usage: boot-qemu-image.py """) + sys.exit(1) + + # Ignore non Qemu defconfig + if not sys.argv[1].startswith('qemu_'): + sys.exit(0) + + qemu_start = os.path.join(os.getcwd(), 'output/images/start-qemu.sh') + + child = pexpect.spawn(qemu_start, ['serial-only'], + timeout=5, encoding='utf-8', + env={"QEMU_AUDIO_DRV": "none"}) + + # We want only stdout into the log to avoid double echo + child.logfile = sys.stdout + + try: + child.expect(["buildroot login:", pexpect.TIMEOUT], timeout=60) + except pexpect.EOF as e: + # Some emulations require a fork of qemu-system, which may be + # missing on the system, and is not provided by Buildroot. + # In this case, spawn above will succeed at starting the wrapper + # start-qemu.sh, but that one will fail (exit with 127) in such + # a situation. + exit = [int(l.split(' ')[1]) + for l in e.value.splitlines() + if l.startswith('exitstatus: ')] + if len(exit) and exit[0] == 127: + print('qemu-start.sh could not find the qemu binary') + sys.exit(0) + print("Connection problem, exiting.") + sys.exit(1) + except pexpect.TIMEOUT: + print("System did not boot in time, exiting.") + sys.exit(1) + + child.sendline("root\r") + + try: + child.expect(["# ", pexpect.TIMEOUT], timeout=60) + except pexpect.EOF: + print("Cannot connect to shell") + sys.exit(1) + except pexpect.TIMEOUT: + print("Timeout while waiting for shell") + sys.exit(1) + + child.sendline("poweroff\r") + + try: + child.expect(["System halted", pexpect.TIMEOUT], timeout=60) + child.expect(pexpect.EOF) + except pexpect.EOF: + pass + except pexpect.TIMEOUT: + # Qemu may not exit properly after "System halted", ignore. + print("Cannot halt machine") + + sys.exit(0) + + +if __name__ == "__main__": + main()