diff options
-rwxr-xr-x | scripts/runqemu | 113 |
1 files changed, 56 insertions, 57 deletions
diff --git a/scripts/runqemu b/scripts/runqemu index 41b870c9f7..c33741d804 100755 --- a/scripts/runqemu +++ b/scripts/runqemu @@ -28,14 +28,18 @@ import shutil import glob import configparser -class OEPathError(Exception): +class RunQemuError(Exception): + """Custom exception to raise on known errors.""" + pass + +class OEPathError(RunQemuError): """Custom Exception to give better guidance on missing binaries""" def __init__(self, message): - self.message = "In order for this script to dynamically infer paths\n \ + super().__init__("In order for this script to dynamically infer paths\n \ kernels or filesystem images, you either need bitbake in your PATH\n \ or to source oe-init-build-env before running this script.\n\n \ Dynamic path inference can be avoided by passing a *.qemuboot.conf to\n \ -runqemu, i.e. `runqemu /path/to/my-image-name.qemuboot.conf`\n\n %s" % message +runqemu, i.e. `runqemu /path/to/my-image-name.qemuboot.conf`\n\n %s" % message) def create_logger(): @@ -101,10 +105,10 @@ def check_tun(): """Check /dev/net/tun""" dev_tun = '/dev/net/tun' if not os.path.exists(dev_tun): - raise Exception("TUN control device %s is unavailable; you may need to enable TUN (e.g. sudo modprobe tun)" % dev_tun) + raise RunQemuError("TUN control device %s is unavailable; you may need to enable TUN (e.g. sudo modprobe tun)" % dev_tun) if not os.access(dev_tun, os.W_OK): - raise Exception("TUN control device %s is not writable, please fix (e.g. sudo chmod 666 %s)" % (dev_tun, dev_tun)) + raise RunQemuError("TUN control device %s is not writable, please fix (e.g. sudo chmod 666 %s)" % (dev_tun, dev_tun)) def check_libgl(qemu_bin): cmd = 'ldd %s' % qemu_bin @@ -137,7 +141,7 @@ def check_libgl(qemu_bin): logger.error("You need libGL.so and libGLU.so to exist in your library path to run the QEMU emulator.") logger.error("Ubuntu package names are: libgl1-mesa-dev and libglu1-mesa-dev.") logger.error("Fedora package names are: mesa-libGL-devel mesa-libGLU-devel.") - raise Exception('%s requires libGLU, but not found' % qemu_bin) + raise RunQemuError('%s requires libGLU, but not found' % qemu_bin) def get_first_file(cmds): """Return first file found in wildcard cmds""" @@ -273,7 +277,7 @@ class BaseConfig(object): fst = 'cpio.gz' self.fstype = fst else: - raise Exception("Conflicting: FSTYPE %s and %s" % (self.fstype, fst)) + raise RunQemuError("Conflicting: FSTYPE %s and %s" % (self.fstype, fst)) def set_machine_deploy_dir(self, machine, deploy_dir_image): """Set MACHINE and DEPLOY_DIR_IMAGE""" @@ -329,7 +333,7 @@ class BaseConfig(object): else: logger.warn("%s doesn't exist" % qb) else: - raise Exception("Can't find FSTYPE from: %s" % p) + raise RunQemuError("Can't find FSTYPE from: %s" % p) elif os.path.isdir(p) or re.search(':', p) and re.search('/', p): if self.is_deploy_dir_image(p): @@ -341,16 +345,16 @@ class BaseConfig(object): elif os.path.basename(p).startswith('ovmf'): self.ovmf_bios.append(p) else: - raise Exception("Unknown path arg %s" % p) + raise RunQemuError("Unknown path arg %s" % p) def check_arg_machine(self, arg): """Check whether it is a machine""" if self.get('MACHINE') == arg: return elif self.get('MACHINE') and self.get('MACHINE') != arg: - raise Exception("Maybe conflicted MACHINE: %s vs %s" % (self.get('MACHINE'), arg)) + raise RunQemuError("Maybe conflicted MACHINE: %s vs %s" % (self.get('MACHINE'), arg)) elif re.search('/', arg): - raise Exception("Unknown arg: %s" % arg) + raise RunQemuError("Unknown arg: %s" % arg) logger.info('Assuming MACHINE = %s' % arg) @@ -381,7 +385,7 @@ class BaseConfig(object): if s: deploy_dir_image = s.group(1) else: - raise Exception("bitbake -e %s" % self.bitbake_e) + raise RunQemuError("bitbake -e %s" % self.bitbake_e) if self.is_deploy_dir_image(deploy_dir_image): self.set_machine_deploy_dir(arg, deploy_dir_image) else: @@ -435,7 +439,9 @@ class BaseConfig(object): if (not unknown_arg) or unknown_arg == arg: unknown_arg = arg else: - raise Exception("Can't handle two unknown args: %s %s" % (unknown_arg, arg)) + raise RunQemuError("Can't handle two unknown args: %s %s\n" + "Try 'runqemu help' on how to use it" % \ + (unknown_arg, arg)) # Check to make sure it is a valid machine if unknown_arg: if self.get('MACHINE') == unknown_arg: @@ -461,7 +467,7 @@ class BaseConfig(object): return if not self.get('QB_CPU_KVM'): - raise Exception("QB_CPU_KVM is NULL, this board doesn't support kvm") + raise RunQemuError("QB_CPU_KVM is NULL, this board doesn't support kvm") self.qemu_opt_script += ' %s %s' % (self.get('QB_MACHINE'), self.get('QB_CPU_KVM')) yocto_kvm_wiki = "https://wiki.yoctoproject.org/wiki/How_to_enable_KVM_for_Poky_qemu" @@ -473,30 +479,30 @@ class BaseConfig(object): if not kvm_cap: logger.error("You are trying to enable KVM on a cpu without VT support.") logger.error("Remove kvm from the command-line, or refer:") - raise Exception(yocto_kvm_wiki) + raise RunQemuError(yocto_kvm_wiki) if not os.path.exists(dev_kvm): logger.error("Missing KVM device. Have you inserted kvm modules?") logger.error("For further help see:") - raise Exception(yocto_kvm_wiki) + raise RunQemuError(yocto_kvm_wiki) if os.access(dev_kvm, os.W_OK|os.R_OK): self.qemu_opt_script += ' -enable-kvm' else: logger.error("You have no read or write permission on /dev/kvm.") logger.error("Please change the ownership of this file as described at:") - raise Exception(yocto_kvm_wiki) + raise RunQemuError(yocto_kvm_wiki) if self.vhost_enabled: if not os.path.exists(dev_vhost): logger.error("Missing virtio net device. Have you inserted vhost-net module?") logger.error("For further help see:") - raise Exception(yocto_paravirt_kvm_wiki) + raise RunQemuError(yocto_paravirt_kvm_wiki) if not os.access(dev_kvm, os.W_OK|os.R_OK): logger.error("You have no read or write permission on /dev/vhost-net.") logger.error("Please change the ownership of this file as described at:") - raise Exception(yocto_kvm_wiki) + raise RunQemuError(yocto_kvm_wiki) def check_fstype(self): """Check and setup FSTYPE""" @@ -505,7 +511,7 @@ class BaseConfig(object): if fstype: self.fstype = fstype else: - raise Exception("FSTYPE is NULL!") + raise RunQemuError("FSTYPE is NULL!") def check_rootfs(self): """Check and set rootfs""" @@ -517,7 +523,7 @@ class BaseConfig(object): if not self.rootfs: self.rootfs = self.get('ROOTFS') elif self.get('ROOTFS') != self.rootfs: - raise Exception("Maybe conflicted ROOTFS: %s vs %s" % (self.get('ROOTFS'), self.rootfs)) + raise RunQemuError("Maybe conflicted ROOTFS: %s vs %s" % (self.get('ROOTFS'), self.rootfs)) if self.fstype == 'nfs': return @@ -533,10 +539,10 @@ class BaseConfig(object): cmds = (cmd_name, cmd_link) self.rootfs = get_first_file(cmds) if not self.rootfs: - raise Exception("Failed to find rootfs: %s or %s" % cmds) + raise RunQemuError("Failed to find rootfs: %s or %s" % cmds) if not os.path.exists(self.rootfs): - raise Exception("Can't find rootfs: %s" % self.rootfs) + raise RunQemuError("Can't find rootfs: %s" % self.rootfs) def check_ovmf(self): """Check and set full path for OVMF firmware and variable file(s).""" @@ -550,7 +556,7 @@ class BaseConfig(object): self.ovmf_bios[index] = path break else: - raise Exception("Can't find OVMF firmware: %s" % ovmf) + raise RunQemuError("Can't find OVMF firmware: %s" % ovmf) def check_kernel(self): """Check and set kernel, dtb""" @@ -573,10 +579,10 @@ class BaseConfig(object): cmds = (kernel_match_name, kernel_match_link, kernel_startswith) self.kernel = get_first_file(cmds) if not self.kernel: - raise Exception('KERNEL not found: %s, %s or %s' % cmds) + raise RunQemuError('KERNEL not found: %s, %s or %s' % cmds) if not os.path.exists(self.kernel): - raise Exception("KERNEL %s not found" % self.kernel) + raise RunQemuError("KERNEL %s not found" % self.kernel) dtb = self.get('QB_DTB') if dtb: @@ -586,7 +592,7 @@ class BaseConfig(object): cmds = (cmd_match, cmd_startswith, cmd_wild) self.dtb = get_first_file(cmds) if not os.path.exists(self.dtb): - raise Exception('DTB not found: %s, %s or %s' % cmds) + raise RunQemuError('DTB not found: %s, %s or %s' % cmds) def check_biosdir(self): """Check custombiosdir""" @@ -606,7 +612,7 @@ class BaseConfig(object): self.qemu_opt_script += ' -L %s' % biosdir else: logger.error("Custom BIOS directory not found. Tried: %s, %s, and %s" % (self.custombiosdir, biosdir_native, biosdir_host)) - raise Exception("Invalid custombiosdir: %s" % self.custombiosdir) + raise RunQemuError("Invalid custombiosdir: %s" % self.custombiosdir) def check_mem(self): s = re.search('-m +([0-9]+)', self.qemu_opt_script) @@ -634,7 +640,7 @@ class BaseConfig(object): # Check audio if self.audio_enabled: if not self.get('QB_AUDIO_DRV'): - raise Exception("QB_AUDIO_DRV is NULL, this board doesn't support audio") + raise RunQemuError("QB_AUDIO_DRV is NULL, this board doesn't support audio") if not self.get('QB_AUDIO_OPT'): logger.warn('QB_AUDIO_OPT is NULL, you may need define it to make audio work') else: @@ -689,7 +695,7 @@ class BaseConfig(object): return if not os.path.exists(self.qemuboot): - raise Exception("Failed to find %s (wrong image name or BSP does not support running under qemu?)." % self.qemuboot) + raise RunQemuError("Failed to find %s (wrong image name or BSP does not support running under qemu?)." % self.qemuboot) logger.info('CONFFILE: %s' % self.qemuboot) @@ -815,12 +821,12 @@ class BaseConfig(object): elif os.path.exists(src2): src = src2 if not src: - raise Exception("No NFS_DIR is set, and can't find %s or %s to extract" % (src1, src2)) + raise RunQemuError("No NFS_DIR is set, and can't find %s or %s to extract" % (src1, src2)) logger.info('NFS_DIR not found, extracting %s to %s' % (src, dest)) cmd = 'runqemu-extract-sdk %s %s' % (src, dest) logger.info('Running %s...' % cmd) if subprocess.call(cmd, shell=True) != 0: - raise Exception('Failed to run %s' % cmd) + raise RunQemuError('Failed to run %s' % cmd) self.clean_nfs_dir = True self.rootfs = dest @@ -828,7 +834,7 @@ class BaseConfig(object): cmd = 'runqemu-export-rootfs start %s' % self.rootfs logger.info('Running %s...' % cmd) if subprocess.call(cmd, shell=True) != 0: - raise Exception('Failed to run %s' % cmd) + raise RunQemuError('Failed to run %s' % cmd) self.nfs_running = True @@ -911,7 +917,7 @@ class BaseConfig(object): if os.path.exists(nosudo_flag): logger.error("Error: There are no available tap devices to use for networking,") logger.error("and I see %s exists, so I am not going to try creating" % nosudo_flag) - raise Exception("a new one with sudo.") + raise RunQemuError("a new one with sudo.") gid = os.getgid() uid = os.getuid() @@ -1053,7 +1059,7 @@ class BaseConfig(object): if not qemu_system: qemu_system = self.guess_qb_system() if not qemu_system: - raise Exception("Failed to boot, QB_SYSTEM_NAME is NULL!") + raise RunQemuError("Failed to boot, QB_SYSTEM_NAME is NULL!") qemu_bin = '%s/%s' % (self.bindir_native, qemu_system) @@ -1202,42 +1208,35 @@ class BaseConfig(object): if os.path.exists(result): self.set('STAGING_BINDIR_NATIVE', result) return result - raise Exception("Native sysroot directory %s doesn't exist" % result) + raise RunQemuError("Native sysroot directory %s doesn't exist" % result) else: - raise Exception("Can't find STAGING_BINDIR_NATIVE in '%s' output" % cmd) + raise RunQemuError("Can't find STAGING_BINDIR_NATIVE in '%s' output" % cmd) def main(): if "help" in sys.argv or '-h' in sys.argv or '--help' in sys.argv: print_usage() return 0 - config = BaseConfig() try: + config = BaseConfig() config.check_args() - except Exception as esc: - logger.error(esc) - logger.error("Try 'runqemu help' on how to use it") - return 1 - config.read_qemuboot() - config.check_and_set() - config.print_config() - try: + config.read_qemuboot() + config.check_and_set() + config.print_config() config.setup_network() config.setup_rootfs() config.setup_final() config.start_qemu() + except RunQemuError as err: + logger.error(err) + return 1 + except Exception as err: + import traceback + traceback.print_exc() + return 1 finally: + print("Cleanup") config.cleanup() - return 0 if __name__ == "__main__": - try: - ret = main() - except OEPathError as err: - ret = 1 - logger.error(err.message) - except Exception as esc: - ret = 1 - import traceback - traceback.print_exc() - sys.exit(ret) + sys.exit(main()) |