From c46cc1a54f86093bb30d09d6cb69b098455a90a5 Mon Sep 17 00:00:00 2001 From: Fabio Erculiani Date: Mon, 7 Mar 2011 21:27:49 +0100 Subject: [PATCH] [services] kernel-switcher: when kernel_tag is not available, try to guess it When no reverse dependencies are available, it's impossible to guess the correct kernel tag. So, kernel_tag is None, which causes issue when used in execve() (of course). So, handle the case trying to read package configuration file containing the proper "uname -r" output required to switch /usr/src/linux to the newly installed kernel using "eselect kernel set". Please note that this file (RELEASE_LEVEL) is quite new, and older packages might have been shipped without it. Also see bug #2227 --- services/kernel-switcher | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) 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