176 lines
7.0 KiB
Python
176 lines
7.0 KiB
Python
import threading
|
|
import time
|
|
import os
|
|
import logging
|
|
import asyncio
|
|
from testbase import TestBase
|
|
|
|
logger = logging.getLogger("archtest")
|
|
|
|
class TestLeaveAllDefault(TestBase):
|
|
def __init__(self, serial_monitor):
|
|
super().__init__(serial_monitor)
|
|
self.running_test = False
|
|
self.installation_complete = False
|
|
self.installation_successful = False
|
|
self.fix_post_install_boot = False
|
|
self.entered_disk_enc_pw = False
|
|
|
|
self.exit_code = -1
|
|
|
|
threading.Thread.__init__(self)
|
|
self.start()
|
|
|
|
def run(self):
|
|
while True:
|
|
if b'Set/Modify the below options' in self.buffer and self.running_test is False:
|
|
# This is our entrypoint, from here on we'll have to fly blind because
|
|
# the menu system uses ANSI/VT100 escape codes to put the arrow and stuff.
|
|
# So we can't check for `> Archinstall langauge` for instance.
|
|
# So lets fire away our test sequence and monitor for some break-point values.
|
|
logger.info(f"Running through a typical installation scenario accepting all defaults.")
|
|
self.running_test = True
|
|
time.sleep(1)
|
|
|
|
logger.info(f"Selecting a good regional mirror")
|
|
# Navigate to Mirror selection
|
|
self.send_key('arrow_down', delay=0.2)
|
|
self.send_key('enter', delay=0.2)
|
|
self.send_key('enter', delay=0.2)
|
|
time.sleep(2) # Let the UI buffer complete before we start searching
|
|
# Search for a known mirror region with good speed relative to source of execution
|
|
self.send_key('/', delay=0.2)
|
|
self.send_string('Sweden', delay=0.2)
|
|
self.send_key('enter', delay=0.2)
|
|
# Exit the mirror selection screen
|
|
self.send_key('arrow_down', delay=0.2)
|
|
self.send_key('arrow_down', delay=0.2)
|
|
self.send_key('enter', delay=0.2)
|
|
# Enter 'locale' option
|
|
logger.info(f"Setting a keyboard locale to something known")
|
|
self.send_key('enter', delay=0.2)
|
|
# Enter keyboard layout
|
|
self.send_key('enter', delay=0.2)
|
|
time.sleep(1) # Let the UI buffer complete again before searching
|
|
self.send_key('/', delay=0.2)
|
|
time.sleep(0.5)
|
|
self.send_string('sv-latin1', delay=0.2)
|
|
self.send_key('enter', delay=0.2)
|
|
# Exit locale
|
|
logger.info(f"Selecting the one virtual harddrive")
|
|
self.send_key('arrow_down', delay=0.2)
|
|
self.send_key('arrow_down', delay=0.2)
|
|
self.send_key('arrow_down', delay=0.2)
|
|
self.send_key('enter', delay=0.2)
|
|
# Enter disk config
|
|
self.send_key('enter', delay=0.2)
|
|
# Enter partitioning
|
|
self.send_key('enter', delay=0.2)
|
|
# Use best effort
|
|
self.send_key('enter', delay=0.2)
|
|
# Select second option, which should be Virtio Block Device
|
|
self.send_key('arrow_down', delay=0.2)
|
|
self.send_key('enter', delay=0.2)
|
|
# Select btrfs
|
|
logger.info(f"Selecting btrfs + subvolumes + compression")
|
|
self.send_key('enter', delay=0.2)
|
|
# Use subvolumes
|
|
self.send_key('enter', delay=0.2)
|
|
# Use compression
|
|
self.send_key('enter', delay=0.2)
|
|
# Exit partitioning
|
|
logger.info(f"Setting disk encryption password")
|
|
self.send_key('arrow_down', delay=0.2)
|
|
self.send_key('arrow_down', delay=0.2)
|
|
self.send_key('enter', delay=0.2)
|
|
# Enter disk encryption
|
|
self.send_key('enter', delay=0.2)
|
|
# Select encryption type
|
|
self.send_key('enter', delay=0.2)
|
|
# Select LUKS
|
|
self.send_key('enter', delay=0.2)
|
|
# Enter password selection
|
|
self.send_key('arrow_down', delay=0.2)
|
|
self.send_key('enter', delay=0.2)
|
|
# Enter a test password
|
|
self.send_string('test', delay=0.2)
|
|
self.send_key('enter', delay=0.2)
|
|
self.send_string('test', delay=0.2)
|
|
self.send_key('enter', delay=0.2)
|
|
# Select partition
|
|
self.send_key('arrow_down', delay=0.2)
|
|
self.send_key('arrow_down', delay=0.2)
|
|
self.send_key('enter', delay=0.2)
|
|
# Select the default partition
|
|
self.send_key('enter', delay=0.2)
|
|
# Exit encryption menu
|
|
self.send_key('arrow_down', delay=0.2)
|
|
self.send_key('arrow_down', delay=0.2)
|
|
self.send_key('arrow_down', delay=0.2)
|
|
self.send_key('arrow_down', delay=0.2)
|
|
self.send_key('enter', delay=0.2)
|
|
# Skip some entries in the main menu
|
|
logger.info(f"Setting a root password")
|
|
self.send_key('arrow_down', delay=0.2)
|
|
self.send_key('arrow_down', delay=0.2)
|
|
self.send_key('arrow_down', delay=0.2)
|
|
self.send_key('arrow_down', delay=0.2) # Move to "root password"
|
|
self.send_key('enter', delay=0.2)
|
|
# Enter a test root password
|
|
self.send_string('test', delay=0.2)
|
|
self.send_key('enter', delay=0.2)
|
|
self.send_string('test', delay=0.2)
|
|
self.send_key('enter', delay=0.2)
|
|
# Skip some entries
|
|
logger.info(f"Adding nano as additional password")
|
|
self.send_key('arrow_down', delay=0.2)
|
|
self.send_key('arrow_down', delay=0.2)
|
|
self.send_key('arrow_down', delay=0.2)
|
|
self.send_key('arrow_down', delay=0.2) # Additional packages
|
|
self.send_key('enter', delay=0.2)
|
|
# Enter a test package that is reliable
|
|
self.send_string('nano', delay=0.2)
|
|
self.send_key('enter', delay=0.2)
|
|
logger.info(f"Setting network config")
|
|
# Configure networking
|
|
time.sleep(1)
|
|
self.send_key('enter', delay=0.2)
|
|
self.send_key('enter', delay=0.2)
|
|
time.sleep(2)
|
|
# Proceed to installation
|
|
logger.info(f"Proceeding to install")
|
|
self.send_key('arrow_down', delay=0.2)
|
|
self.send_key('arrow_down', delay=0.2)
|
|
self.send_key('arrow_down', delay=0.2)
|
|
self.send_key('arrow_down', delay=0.2) # Install
|
|
self.send_key('enter', delay=0.2)
|
|
# Proceed to install
|
|
self.send_key('enter', delay=0.2)
|
|
elif b'Would you like to chroot' in self.buffer and self.installation_complete is False:
|
|
logger.info(f"Installation appears to have completed")
|
|
self.installation_complete = True
|
|
self.send_key('arrow_down', delay=0.2) # No
|
|
self.send_key('enter', delay=0.2)
|
|
elif b'Installation completed without any errors' in self.buffer and self.installation_successful is False:
|
|
logger.info(f"Installation was successful, rebooting")
|
|
self.installation_successful = True
|
|
self.send_string('reboot', delay=0.2)
|
|
self.send_key('enter', delay=0.2)
|
|
elif b'Arch Linux (linux-fallback)' in self.buffer and self.installation_successful is True and self.fix_post_install_boot is False:
|
|
logger.info(f"Found linux-fallback, assuming bootloader needs adjusting for serial output")
|
|
self.fix_post_install_boot = True
|
|
asyncio.run_coroutine_threadsafe(self.serial_monitor.edit_boot(), loop=self.serial_monitor.QMP.loop)
|
|
elif b'A password is required to access the root volume' in self.buffer and self.installation_successful is True and self.fix_post_install_boot is True and self.entered_disk_enc_pw is False:
|
|
logger.info(f"Found disk encryption password, supplying it")
|
|
self.entered_disk_enc_pw = True
|
|
self.send_string('test', delay=0.2)
|
|
self.send_key('enter', delay=0.2)
|
|
elif b'archlinux login:' in self.buffer[-500:] and self.installation_successful and self.entered_disk_enc_pw:
|
|
logger.info("Installation successful, for real!")
|
|
self.exit_code = 0
|
|
break
|
|
|
|
time.sleep(0.25)
|
|
|
|
os.system('pkill tail')
|
|
exit(self.exit_code) |