1#!/usr/bin/env python 2# 3# Fedora VM image 4# 5# Copyright 2019 Red Hat Inc. 6# 7# Authors: 8# Gerd Hoffmann <kraxel@redhat.com> 9# 10# This code is licensed under the GPL version 2 or later. See 11# the COPYING file in the top-level directory. 12# 13 14import os 15import re 16import sys 17import time 18import socket 19import subprocess 20import basevm 21 22class FedoraVM(basevm.BaseVM): 23 name = "fedora" 24 arch = "x86_64" 25 26 base = "http://dl.fedoraproject.org/pub/fedora/linux/releases/30/" 27 link = base + "Server/x86_64/iso/Fedora-Server-netinst-x86_64-30-1.2.iso" 28 repo = base + "Server/x86_64/os/" 29 full = base + "Everything/x86_64/os/" 30 csum = "5e4eac4566d8c572bfb3bcf54b7d6c82006ec3c6c882a2c9235c6d3494d7b100" 31 size = "20G" 32 pkgs = [ 33 # tools 34 'git-core', 35 'flex', 'bison', 36 'gcc', 'binutils', 'make', 37 38 # perl 39 'perl-Test-Harness', 40 41 # libs: usb 42 '"pkgconfig(libusb-1.0)"', 43 '"pkgconfig(libusbredirparser-0.5)"', 44 45 # libs: crypto 46 '"pkgconfig(gnutls)"', 47 48 # libs: ui 49 '"pkgconfig(sdl2)"', 50 '"pkgconfig(gtk+-3.0)"', 51 '"pkgconfig(ncursesw)"', 52 53 # libs: audio 54 '"pkgconfig(libpulse)"', 55 '"pkgconfig(alsa)"', 56 ] 57 58 BUILD_SCRIPT = """ 59 set -e; 60 rm -rf /home/qemu/qemu-test.* 61 cd $(mktemp -d /home/qemu/qemu-test.XXXXXX); 62 mkdir src build; cd src; 63 tar -xf /dev/vdb; 64 cd ../build 65 ../src/configure --python=python3 {configure_opts}; 66 gmake --output-sync -j{jobs} {target} {verbose}; 67 """ 68 69 def build_image(self, img): 70 self.print_step("Downloading install iso") 71 cimg = self._download_with_cache(self.link, sha256sum=self.csum) 72 img_tmp = img + ".tmp" 73 iso = img + ".install.iso" 74 75 self.print_step("Preparing iso and disk image") 76 subprocess.check_call(["cp", "-f", cimg, iso]) 77 subprocess.check_call(["qemu-img", "create", "-f", "qcow2", 78 img_tmp, self.size]) 79 80 self.print_step("Booting installer") 81 self.boot(img_tmp, extra_args = [ 82 "-bios", "pc-bios/bios-256k.bin", 83 "-machine", "graphics=off", 84 "-cdrom", iso 85 ]) 86 self.console_init(300) 87 self.console_wait("installation process.") 88 time.sleep(0.3) 89 self.console_send("\t") 90 time.sleep(0.3) 91 self.console_send(" console=ttyS0") 92 proxy = os.environ.get("http_proxy") 93 if not proxy is None: 94 self.console_send(" proxy=%s" % proxy) 95 self.console_send(" inst.proxy=%s" % proxy) 96 self.console_send(" inst.repo=%s" % self.repo) 97 self.console_send("\n") 98 99 self.console_wait_send("2) Use text mode", "2\n") 100 101 self.console_wait_send("5) [!] Installation Dest", "5\n") 102 self.console_wait_send("1) [x]", "c\n") 103 self.console_wait_send("2) [ ] Use All Space", "2\n") 104 self.console_wait_send("2) [x] Use All Space", "c\n") 105 self.console_wait_send("1) [ ] Standard Part", "1\n") 106 self.console_wait_send("1) [x] Standard Part", "c\n") 107 108 self.console_wait_send("7) [!] Root password", "7\n") 109 self.console_wait("Password:") 110 self.console_send("%s\n" % self.ROOT_PASS) 111 self.console_wait("Password (confirm):") 112 self.console_send("%s\n" % self.ROOT_PASS) 113 114 self.console_wait_send("8) [ ] User creation", "8\n") 115 self.console_wait_send("1) [ ] Create user", "1\n") 116 self.console_wait_send("3) User name", "3\n") 117 self.console_wait_send("ENTER:", "%s\n" % self.GUEST_USER) 118 self.console_wait_send("4) [ ] Use password", "4\n") 119 self.console_wait_send("5) Password", "5\n") 120 self.console_wait("Password:") 121 self.console_send("%s\n" % self.GUEST_PASS) 122 self.console_wait("Password (confirm):") 123 self.console_send("%s\n" % self.GUEST_PASS) 124 self.console_wait_send("7) Groups", "c\n") 125 126 while True: 127 good = self.console_wait("3) [x] Installation", 128 "3) [!] Installation") 129 self.console_send("r\n") 130 if good: 131 break 132 time.sleep(10) 133 134 while True: 135 good = self.console_wait("4) [x] Software", 136 "4) [!] Software") 137 self.console_send("r\n") 138 if good: 139 break 140 time.sleep(10) 141 self.console_send("r\n" % self.GUEST_PASS) 142 143 self.console_wait_send("'b' to begin install", "b\n") 144 145 self.print_step("Installation started now, this will take a while") 146 147 self.console_wait_send("Installation complete", "\n") 148 self.print_step("Installation finished, rebooting") 149 150 # setup qemu user 151 prompt = " ~]$" 152 self.console_ssh_init(prompt, self.GUEST_USER, self.GUEST_PASS) 153 self.console_wait_send(prompt, "exit\n") 154 155 # setup root user 156 prompt = " ~]#" 157 self.console_ssh_init(prompt, "root", self.ROOT_PASS) 158 self.console_sshd_config(prompt) 159 160 # setup virtio-blk #1 (tarfile) 161 self.console_wait(prompt) 162 self.console_send("echo 'KERNEL==\"vdb\" MODE=\"666\"' >> %s\n" % 163 "/etc/udev/rules.d/99-qemu.rules") 164 165 self.print_step("Configuration finished, rebooting") 166 self.console_wait_send(prompt, "reboot\n") 167 self.console_wait("login:") 168 self.wait_ssh() 169 170 self.print_step("Installing packages") 171 self.ssh_root_check("rm -vf /etc/yum.repos.d/fedora*.repo\n") 172 self.ssh_root_check("echo '[fedora]' >> /etc/yum.repos.d/qemu.repo\n") 173 self.ssh_root_check("echo 'baseurl=%s' >> /etc/yum.repos.d/qemu.repo\n" % self.full) 174 self.ssh_root_check("echo 'gpgcheck=0' >> /etc/yum.repos.d/qemu.repo\n") 175 self.ssh_root_check("dnf install -y %s\n" % " ".join(self.pkgs)) 176 177 # shutdown 178 self.ssh_root(self.poweroff) 179 self.console_wait("sleep state S5") 180 self.wait() 181 182 if os.path.exists(img): 183 os.remove(img) 184 os.rename(img_tmp, img) 185 os.remove(iso) 186 self.print_step("All done") 187 188if __name__ == "__main__": 189 sys.exit(basevm.main(FedoraVM)) 190