[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
This commit is contained in:
Fabio Erculiani
2011-03-07 21:27:49 +01:00
parent db39f49bcd
commit c46cc1a54f

View File

@@ -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/<pkg-name>-<pkg-ver>/ 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