2020-02-17 21:50:29 +01:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
|
|
|
# This script expect to run from the Buildroot top directory.
|
|
|
|
|
2020-04-22 01:00:05 +02:00
|
|
|
import os
|
2020-02-17 21:50:29 +01:00
|
|
|
import pexpect
|
|
|
|
import sys
|
2020-04-22 01:00:05 +02:00
|
|
|
import time
|
2020-02-17 21:50:29 +01:00
|
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
if not (len(sys.argv) == 2):
|
|
|
|
print("Error: incorrect number of arguments")
|
|
|
|
print("""Usage: boot-qemu-image.py <qemu_arch_defconfig>""")
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
# Ignore non Qemu defconfig
|
|
|
|
if not sys.argv[1].startswith('qemu_'):
|
|
|
|
sys.exit(0)
|
|
|
|
|
2020-11-24 21:30:19 +01:00
|
|
|
if not os.path.exists('output/images/start-qemu.sh'):
|
|
|
|
print('qemu-start.sh is missing, cannot test.')
|
|
|
|
sys.exit(0)
|
|
|
|
|
2020-02-17 21:50:29 +01:00
|
|
|
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
|
|
|
|
|
2020-04-22 01:00:05 +02:00
|
|
|
# Let the spawn actually try to fork+exec to the wrapper, and then
|
|
|
|
# let the wrapper exec the qemu process.
|
|
|
|
time.sleep(1)
|
|
|
|
|
2020-02-17 21:50:29 +01:00
|
|
|
try:
|
support/scripts/boot-qemu-image.py: properly catch timeout
As reported on IRC by sephthir, the gitlab test of the defconfig
qemu_sparc_ss10_defconfig doesn't error out while the system
is not working properly.
This is because we explicitly wait for the timeout as an expected
condition, but do not check for it. Indeed, pexpect.expect() returns
the index of the matching condition in the list of expected conditions,
but we just ignore the return code, so we are not able to differentiate
between a successful login (or prompt) from a timeout.
By default, pexepect.expect() raises the pexpect.TIMEOUT exception on a
timeout, and we are already prepared to catch and handle that exception.
But because pexpect.TIMEOUT is passed as an expected condition, the
exception is not raised.
Remove pexpect.TIMEOUT from the list of expected conditions, so that the
exception is properly raised again, and so that we can catch it.
The qemu_sparc_ss10_defconfig is already fixed by
4d16e6f5324f0285f51bfbb5a3503584f3b3ad12.
Signed-off-by: Romain Naour <romain.naour@gmail.com>
Cc: Jugurtha BELKALEM <jugurtha.belkalem@smile.fr>
[yann.morin.1998@free.fr: reword commit log]
Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
2021-02-20 17:56:04 +01:00
|
|
|
child.expect(["buildroot login:"], timeout=60)
|
2020-02-17 21:50:29 +01:00
|
|
|
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:
|
support/scripts/boot-qemu-image.py: properly catch timeout
As reported on IRC by sephthir, the gitlab test of the defconfig
qemu_sparc_ss10_defconfig doesn't error out while the system
is not working properly.
This is because we explicitly wait for the timeout as an expected
condition, but do not check for it. Indeed, pexpect.expect() returns
the index of the matching condition in the list of expected conditions,
but we just ignore the return code, so we are not able to differentiate
between a successful login (or prompt) from a timeout.
By default, pexepect.expect() raises the pexpect.TIMEOUT exception on a
timeout, and we are already prepared to catch and handle that exception.
But because pexpect.TIMEOUT is passed as an expected condition, the
exception is not raised.
Remove pexpect.TIMEOUT from the list of expected conditions, so that the
exception is properly raised again, and so that we can catch it.
The qemu_sparc_ss10_defconfig is already fixed by
4d16e6f5324f0285f51bfbb5a3503584f3b3ad12.
Signed-off-by: Romain Naour <romain.naour@gmail.com>
Cc: Jugurtha BELKALEM <jugurtha.belkalem@smile.fr>
[yann.morin.1998@free.fr: reword commit log]
Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
2021-02-20 17:56:04 +01:00
|
|
|
child.expect(["# "], timeout=60)
|
2020-02-17 21:50:29 +01:00
|
|
|
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:
|
support/scripts/boot-qemu-image.py: properly catch timeout
As reported on IRC by sephthir, the gitlab test of the defconfig
qemu_sparc_ss10_defconfig doesn't error out while the system
is not working properly.
This is because we explicitly wait for the timeout as an expected
condition, but do not check for it. Indeed, pexpect.expect() returns
the index of the matching condition in the list of expected conditions,
but we just ignore the return code, so we are not able to differentiate
between a successful login (or prompt) from a timeout.
By default, pexepect.expect() raises the pexpect.TIMEOUT exception on a
timeout, and we are already prepared to catch and handle that exception.
But because pexpect.TIMEOUT is passed as an expected condition, the
exception is not raised.
Remove pexpect.TIMEOUT from the list of expected conditions, so that the
exception is properly raised again, and so that we can catch it.
The qemu_sparc_ss10_defconfig is already fixed by
4d16e6f5324f0285f51bfbb5a3503584f3b3ad12.
Signed-off-by: Romain Naour <romain.naour@gmail.com>
Cc: Jugurtha BELKALEM <jugurtha.belkalem@smile.fr>
[yann.morin.1998@free.fr: reword commit log]
Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
2021-02-20 17:56:04 +01:00
|
|
|
child.expect(["System halted"], timeout=60)
|
2020-02-17 21:50:29 +01:00
|
|
|
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()
|