Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add aarch64 support, and more responsive qemu interaction #23

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 36 additions & 11 deletions ovmf-vars-generator
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import tempfile
import shutil
import string
import subprocess
import select


def strip_special(line):
Expand Down Expand Up @@ -106,6 +107,9 @@ def enroll_keys(args):
stderr=subprocess.STDOUT)
logging.info('Performing enrollment')
# Wait until the UEFI shell starts (first line is printed)
pollobj = select.poll()
pollobj.register(p.stdout, select.POLLIN)

read = p.stdout.readline()
if b'char device redirected' in read:
read = p.stdout.readline()
Expand All @@ -116,25 +120,46 @@ def enroll_keys(args):
if args.print_output:
print(strip_special(read), end='')
print()
# Send the escape char to enter the UEFI shell early
p.stdin.write(b'\x1b')
p.stdin.flush()
# And then run the following three commands from the UEFI shell:
# change into the first file system device; install the default
# keys and certificates, and reboot
p.stdin.write(b'fs0:\r\n')
p.stdin.write(b'EnrollDefaultKeys.efi\r\n')
p.stdin.write(b'reset -s\r\n')
# Send the press enter for the default boot (uefi shell)
p.stdin.write(b'\r\n')
p.stdin.flush()

wait_timeout = 100;
while True:
read = p.stdout.readline()
poll_result = pollobj.poll(1000)
if poll_result:
# readline can get stuck in menus and other
# UI elements in uefi which don't respond
# with a CR the poll above doesn't help
# with that case.
read = p.stdout.readline()
else:
wait_timeout-=1
if wait_timeout == 0:
logging.info('Failed enrollment')
# consider something stronger here
# as we can still get stuck in the p.wait()
break;
continue
if args.print_output and len(read):
print('OUT: %s' % strip_special(read), end='')
print()
if b'info: success' in read:
if b'seconds to skip' in read:
p.stdin.write(b'\r\n')
p.stdin.flush()
elif b'info: success' in read:
break
elif b'Reset with <null string>' in read:
break
elif b'Shell>' in read:
# And then run the following three commands from the UEFI shell:
# change into the first file system device; install the default
# keys and certificates, and reboot
p.stdin.write(b'fs0:\r\n')
p.stdin.write(b'EnrollDefaultKeys.efi\r\n')
p.stdin.write(b'reset -s\r\n')
p.stdin.flush()

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Which serves a purpose if one is in a python env. OTOH, python isn't a great shell scripting language anymore than c. Worse, this script is being used on fedora in an actual rpmbuild/bash environment. In that case about 80% of this scripts functionality can be represented like:

/usr/bin/expect <<EOF
spawn /usr/bin/qemu-system-${MACHTYPE} ${QEMU_ARCH} ${COMMON} $FIRMWARE ${VARS}=off $CDROM $SMBIOS
expect -exact "Shell>"
send -- "\r\nfs0:\r\n"
send -- "EnrollDefaultKeys.efi\r\n"
send -- "reset -s\r\n"
expect eof
EOF

the remainder, which I've also done (dealing with multiple arches, and validating enrolled keys) is about 3-4x the size of that.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Which serves a purpose if one is in a python env. OTOH, python isn't a great shell scripting language anymore than c. Worse, this script is being used on fedora in an actual rpmbuild/bash environment.

I'm not arguing for/against this being in python vs. sh, just that since it is in python, pexpect is at our disposal.

p.wait()
if args.print_output:
print(strip_special(p.stdout.read()), end='')
Expand Down