[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:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user