diff --git a/services/kernel-switcher b/services/kernel-switcher index c25c64050..fac568667 100755 --- a/services/kernel-switcher +++ b/services/kernel-switcher @@ -59,6 +59,23 @@ def _setup_kernel_symlink(target_tag): if os.access(eselect_exec, os.X_OK): subprocess.call((eselect_exec, "kernel", "set", target_tag)) +def _guess_kernel_name(kernel_atom): + """ + This method takes advantage of Entropy kernel package info files available + at /etc/kernels/-/ directory. + This function tries to read uname -r from the RELEASE_LEVEL file. + """ + namever = entropy.dep.remove_cat(kernel_atom) + kernel_meta_file = os.path.join("/etc/kernels", namever, "RELEASE_LEVEL") + if os.path.isfile(kernel_meta_file): + try: + with open(kernel_meta_file, "r") as km_f: + kernel_name = km_f.readline().strip() + if kernel_name: + return kernel_name + except (OSError, IOError): + return None + # removing and installing proprietary drivers might reset the selected # OpenGL implementation @@ -117,6 +134,7 @@ def _switch_kernel(args): return 1 kernel_atom = etp_client.open_repository(pkg_repo).retrieveAtom(pkg_id) + # this can be None ! target_tag = _get_target_tag(etp_client, kernel_match) inst_repo = etp_client.installed_repository() @@ -152,7 +170,14 @@ def _switch_kernel(args): ) if (rc == 0) and (not etpUi['pretend']): _set_opengl_impl(opengl) - _setup_kernel_symlink(target_tag) + if target_tag: + # if target_tag is None, we are unable to set the symlink + _setup_kernel_symlink(target_tag) + else: + # try to guess, sigh, for now + guessed_kernel_name = _guess_kernel_name(kernel_atom) + if guessed_kernel_name: + _setup_kernel_symlink(guessed_kernel_name) _show_kernel_warnings(kernel_atom) return rc