import os
def add_public_key(machine):
with open(f'{machine.identity_file}.pub', 'r') as pub:
public_key = pub.read()
sysroot_ssh = '/mnt/sysroot/root/.ssh'
authorized_keys = os.path.join(sysroot_ssh, 'authorized_keys')
machine.execute(f"chmod 700 {sysroot_ssh}")
machine.write(authorized_keys, public_key, perm="0600")
def pretend_live_workstation_iso(test, installer, machine):
hidden_screens = machine.execute("cat /etc/anaconda/profile.d/fedora-workstation.conf | grep anaconda-screen").split('\n')
hidden_screens = [x.strip() for x in hidden_screens]
installer.steps.hidden_steps.extend(hidden_screens)
test.restore_file('/run/anaconda/anaconda.conf')
test.machine.execute("sed -i 's/type = BOOT_ISO/type = LIVE_OS/g' /run/anaconda/anaconda.conf")
pages = " ".join(hidden_screens)
test.machine.execute(
"sed -i '/^[[:space:]]*hidden_webui_pages[[:space:]]*=/d' /run/anaconda/anaconda.conf && "
f"sed -i '0,/^\\[User Interface\\]$/s|^\\[User Interface\\]$|&\\nhidden_webui_pages = {pages}|' /run/anaconda/anaconda.conf"
)
def pretend_default_scheme(test, scheme):
test.restore_file('/run/anaconda/anaconda.conf')
test.machine.execute(f"sed -i 's/default_scheme =.*/default_scheme = {scheme}/g' /run/anaconda/anaconda.conf")
def get_pretty_name(machine):
return machine.execute("cat /etc/os-release | grep PRETTY_NAME | cut -d '\"' -f 2 | tr -d '\n'")
def rsync_directory(machine, source_mountpoint, target_mountpoint, retry=True):
try:
machine.execute(f"""
set -xe
rsync -pogAXtlHrDx \
--exclude=/dev/* \
--exclude=/proc/* \
--exclude=/sys/* \
--exclude=/tmp/* \
--exclude=/run/* \
--exclude=/mnt/* \
--exclude=/media/* \
--exclude=/lost+found \
--exclude=/var/lib/machines \
--exclude=/var \
{source_mountpoint}/* {target_mountpoint}
""")
except RuntimeError as e:
if retry:
rsync_directory(machine, source_mountpoint, target_mountpoint, retry=False)
else:
raise RuntimeError(f"Error during rsync: {e}") from e
def move_standard_fedora_disk_to_disk(machine, src_disk, dst_disk,
dst_root_part_num, dst_boot_part_num,
dst_efi_part_num=None):
"""
Move Fedora installation from a disk to another disk.
Copy content of / and /boot, create /etc/fstab.
"""
machine.execute(f"""
set -xe
# Create btrfs layout
mkfs.btrfs -f -L BTRFS /dev/{dst_disk}{dst_root_part_num}
mount /dev/{dst_disk}{dst_root_part_num} /mnt
btrfs subvolume create /mnt/root
btrfs subvolume create /mnt/home
# Copy data from the first disk / to the new disk
mkdir -p /mnt-fedora
mount /dev/{src_disk}3 /mnt-fedora
""")
rsync_directory(machine, "/mnt-fedora", "/mnt")
efi_fstab_record = ""
if dst_efi_part_num:
efi_fstab_record = (
f"echo \"UUID=$(blkid -s UUID -o value /dev/{dst_disk}{dst_efi_part_num}) "
f"/boot/efi vfat umask=0077,shortname=winnt 0 2\" >> /mnt/root/etc/fstab"
)
machine.execute(f"""
# Adjust /etc/fstab to contain the new device UUIDS
echo "UUID=$(blkid -s UUID -o value /dev/{dst_disk}{dst_root_part_num}) / btrfs defaults,subvol=root 0 0" > /mnt/root/etc/fstab
echo "UUID=$(blkid -s UUID -o value /dev/{dst_disk}{dst_root_part_num}) /home btrfs defaults,subvol=home 0 0" >> /mnt/root/etc/fstab
echo "UUID=$(blkid -s UUID -o value /dev/{dst_disk}{dst_boot_part_num}) /boot ext4 defaults 0 0" >> /mnt/root/etc/fstab
{efi_fstab_record}
umount -l /mnt-fedora
umount -l /mnt
""", timeout=90)
def move_standard_fedora_disk_to_MBR_disk(storage, machine, mbr_disk, fedora_disk):
"""Partition a disk with msdos table and copy Fedora system from another disk on it."""
storage.partition_disk(f"/dev/{mbr_disk}", [
("1GiB", "ext4"),
("13GiB", "btrfs"),
], is_mbr=True)
boot_part = 1
root_part = 2
move_standard_fedora_disk_to_disk(machine, fedora_disk, mbr_disk, root_part, boot_part)
def move_standard_fedora_disk_to_win_disk(storage, machine, win_disk, fedora_disk):
"""Partition a disk with Win + Fedora layout and copy Fedora system from another disk on it."""
storage.partition_disk(f"/dev/{win_disk}", [
("100MiB", "efi"),
("128MiB", "microsoft-reserved"),
("11.5GiB", "basic-data"),
("1GiB", "ext4"),
("13GiB", "btrfs"),
("530MiB", "microsoft-recovery"),
])
boot_part = 4
root_part = 5
uefi_part = 1
move_standard_fedora_disk_to_disk(machine, fedora_disk, win_disk, root_part, boot_part,
dst_efi_part_num=uefi_part)
def check_cockpit_module_js_error(browser, module_name):
"""Check handling of error trhown by running cockpit module."""
b = browser
msg = f"Unexpected {module_name} JS error"
b.wait_not_present("#critical-error-bz-report-modal.pf-v6-c-modal-box")
b.eval_js(f"window.setTimeout(function() {{throw new Error('{msg}')}}, 0);")
b.switch_to_top()
b.wait_in_text("#critical-error-bz-report-modal-details", msg)
b.wait_in_text("#critical-error-bz-report-modal header",
"The installer cannot continue due to a critical error:"
f" {module_name} plugin failed")