diff --git a/src/modules/displaymanager/main.py b/src/modules/displaymanager/main.py index 942a7d470..559a5bcf0 100644 --- a/src/modules/displaymanager/main.py +++ b/src/modules/displaymanager/main.py @@ -93,20 +93,22 @@ class DisplayManager(metaclass=abc.ABCMeta): name = None executable = None - @classmethod - def have_dm(cls, root_mount_point): + def __init__(self, root_mount_point): + self.root_mount_point = root_mount_point + + def have_dm(cls): if cls.executable is None: return True - bin_path = "{!s}/usr/bin/{!s}".format(root_mount_point, cls.executable) - sbin_path = "{!s}/usr/sbin/{!s}".format(root_mount_point, cls.executable) + bin_path = "{!s}/usr/bin/{!s}".format(self.root_mount_point, cls.executable) + sbin_path = "{!s}/usr/sbin/{!s}".format(self.root_mount_point, cls.executable) return ( os.path.exists(bin_path) or os.path.exists(sbin_path) ) @abc.abstractmethod - def set_autologin(self, username, do_autologin, root_mount_point, default_desktop_environment): + def set_autologin(self, username, do_autologin, default_desktop_environment): """ Configure the DM inside the given @p root_mount_point with autologin (if @p do_autologin is True) for the given @p username. @@ -141,9 +143,9 @@ class DMmdm(DisplayManager): name = "mdm" executable = "mdm" - def set_autologin(self, username, do_autologin, root_mount_point, default_desktop_environment): + def set_autologin(self, username, do_autologin, default_desktop_environment): # Systems with MDM as Desktop Manager - mdm_conf_path = os.path.join(root_mount_point, "etc/mdm/custom.conf") + mdm_conf_path = os.path.join(self.root_mount_point, "etc/mdm/custom.conf") if os.path.exists(mdm_conf_path): with open(mdm_conf_path, 'r') as mdm_conf: @@ -215,7 +217,7 @@ class DMmdm(DisplayManager): "sed -i \"s|default.desktop|{!s}.desktop|g\" " "{!s}/etc/mdm/custom.conf".format( default_desktop_environment.desktop_file, - root_mount_point + self.root_mount_point ) ) @@ -224,9 +226,9 @@ class DMgdm(DisplayManager): name = "gdm" executable = "gdm" - def set_autologin(self, username, do_autologin, root_mount_point, default_desktop_environment): + def set_autologin(self, username, do_autologin, default_desktop_environment): # Systems with GDM as Desktop Manager - gdm_conf_path = os.path.join(root_mount_point, "etc/gdm/custom.conf") + gdm_conf_path = os.path.join(self.root_mount_point, "etc/gdm/custom.conf") if os.path.exists(gdm_conf_path): with open(gdm_conf_path, 'r') as gdm_conf: @@ -260,7 +262,7 @@ class DMgdm(DisplayManager): if (do_autologin): accountservice_dir = "{!s}/var/lib/AccountsService/users".format( - root_mount_point + self.root_mount_point ) userfile_path = "{!s}/{!s}".format(accountservice_dir, username) if os.path.exists(accountservice_dir): @@ -308,10 +310,10 @@ class DMkdm(DisplayManager): name = "kdm" executable = "kdm" - def set_autologin(self, username, do_autologin, root_mount_point, default_desktop_environment): + def set_autologin(self, username, do_autologin, default_desktop_environment): # Systems with KDM as Desktop Manager kdm_conf_path = os.path.join( - root_mount_point, "usr/share/config/kdm/kdmrc" + self.root_mount_point, "usr/share/config/kdm/kdmrc" ) # Check which path is in use: SUSE does something else. # Also double-check the default setting. Pick the first @@ -320,7 +322,7 @@ class DMkdm(DisplayManager): "usr/share/config/kdm/kdmrc", "usr/share/kde4/config/kdm/kdmrc", ): - p = os.path.join(root_mount_point, candidate_kdmrc) + p = os.path.join(self.root_mount_point, candidate_kdmrc) if os.path.exists(p): kdm_conf_path = p break @@ -380,9 +382,9 @@ class DMlxdm(DisplayManager): name = "lxdm" executable = "lxdm" - def set_autologin(self, username, do_autologin, root_mount_point, default_desktop_environment): + def set_autologin(self, username, do_autologin, default_desktop_environment): # Systems with LXDM as Desktop Manager - lxdm_conf_path = os.path.join(root_mount_point, "etc/lxdm/lxdm.conf") + lxdm_conf_path = os.path.join(self.root_mount_point, "etc/lxdm/lxdm.conf") text = [] if os.path.exists(lxdm_conf_path): @@ -427,7 +429,7 @@ class DMlxdm(DisplayManager): "sed -i -e \"s|^.*session=.*|session={!s}|\" " "{!s}/etc/lxdm/lxdm.conf".format( default_desktop_environment.executable, - root_mount_point + self.root_mount_point ) ) @@ -436,13 +438,13 @@ class DMlightdm(DisplayManager): name = "lightdm" executable = "lightdm" - def set_autologin(self, username, do_autologin, root_mount_point, default_desktop_environment): + def set_autologin(self, username, do_autologin, default_desktop_environment): # Systems with LightDM as Desktop Manager # Ideally, we should use configparser for the ini conf file, # but we just do a simple text replacement for now, as it # worksforme(tm) lightdm_conf_path = os.path.join( - root_mount_point, "etc/lightdm/lightdm.conf" + self.root_mount_point, "etc/lightdm/lightdm.conf" ) text = [] @@ -524,12 +526,12 @@ class DMlightdm(DisplayManager): def greeter_setup(self): lightdm_conf_path = os.path.join( - root_mount_point, "etc/lightdm/lightdm.conf" + self.root_mount_point, "etc/lightdm/lightdm.conf" ) # configure lightdm-greeter greeter_path = os.path.join( - root_mount_point, "usr/share/xgreeters" + self.root_mount_point, "usr/share/xgreeters" ) if (os.path.exists(greeter_path)): @@ -559,9 +561,9 @@ class DMslim(DisplayManager): name = "slim" executable = "slim" - def set_autologin(self, username, do_autologin, root_mount_point, default_desktop_environment): + def set_autologin(self, username, do_autologin, default_desktop_environment): # Systems with Slim as Desktop Manager - slim_conf_path = os.path.join(root_mount_point, "etc/slim.conf") + slim_conf_path = os.path.join(self.root_mount_point, "etc/slim.conf") text = [] if os.path.exists(slim_conf_path): @@ -595,9 +597,9 @@ class DMsddm(DisplayManager): name = "sddm" executable = "sddm" - def set_autologin(self, username, do_autologin, root_mount_point, default_desktop_environment): + def set_autologin(self, username, do_autologin, default_desktop_environment): # Systems with Sddm as Desktop Manager - sddm_conf_path = os.path.join(root_mount_point, "etc/sddm.conf") + sddm_conf_path = os.path.join(self.root_mount_point, "etc/sddm.conf") sddm_config = configparser.ConfigParser(strict=False) # Make everything case sensitive @@ -633,7 +635,7 @@ class DMsysconfig(DisplayManager): name = "sysconfig" executable = None - def set_autologin(self, username, do_autologin, root_mount_point, default_desktop_environment): + def set_autologin(self, username, do_autologin, default_desktop_environment): dmauto = "DISPLAYMANAGER_AUTOLOGIN" os.system( @@ -641,7 +643,7 @@ class DMsysconfig(DisplayManager): "{!s}/etc/sysconfig/displaymanager".format( dmauto, dmauto, username if do_autologin else "", - root_mount_point + self.root_mount_point ) ) @@ -659,40 +661,6 @@ display_managers = [ ] -def have_dm(dm_name, root_mount_point): - """ - Checks if display manager is properly installed. - - :param dm_name: - :param root_mount_point: - :return: - """ - bin_path = "{!s}/usr/bin/{!s}".format(root_mount_point, dm_name) - sbin_path = "{!s}/usr/sbin/{!s}".format(root_mount_point, dm_name) - return (os.path.exists(bin_path) - or os.path.exists(sbin_path) - ) - - - -_ = """ - if "mdm" == displaymanager: - - if "gdm" == displaymanager: - - if "kdm" == displaymanager: - - if "lxdm" == displaymanager: - - if "lightdm" == displaymanager: - - if "slim" == displaymanager: - - if "sddm" == displaymanager: - - if "sysconfig" == displaymanager: -""" - def run(): """ Configure display managers. @@ -736,57 +704,23 @@ def run(): else: enable_basic_setup = False - # Setup slim - if "slim" in displaymanagers: - if not have_dm("slim", root_mount_point): - libcalamares.utils.debug("slim selected but not installed") - displaymanagers.remove("slim") - - # Setup sddm - if "sddm" in displaymanagers: - if not have_dm("sddm", root_mount_point): - libcalamares.utils.debug("sddm selected but not installed") - displaymanagers.remove("sddm") - - # setup lightdm - if "lightdm" in displaymanagers: - if have_dm("lightdm", root_mount_point): - pass + dm_impl = [] + for dm in displaymanagers: + # Find the implementation class + dm_impl = None + impl = [ cls for name, cls in display_managers if name == dm ] + if len(impl) == 1: + dm_instance = impl[0](root_mount_point) + if dm_instance.have_dm(): + dm_impl.append(dm_instance) + else: + dm_impl = None else: - libcalamares.utils.debug("lightdm selected but not installed") - displaymanagers.remove("lightdm") + libcalamares.utils.debug("{!s} has {!d} implementation classes.".format(dm).format(len(impl))) - # Setup gdm - if "gdm" in displaymanagers: - if have_dm("gdm", root_mount_point): - pass - else: - libcalamares.utils.debug("gdm selected but not installed") - displaymanagers.remove("gdm") - - # Setup mdm - if "mdm" in displaymanagers: - if have_dm("mdm", root_mount_point): - pass - else: - libcalamares.utils.debug("mdm selected but not installed") - displaymanagers.remove("mdm") - - # Setup lxdm - if "lxdm" in displaymanagers: - if have_dm("lxdm", root_mount_point): - pass - else: - libcalamares.utils.debug("lxdm selected but not installed") - displaymanagers.remove("lxdm") - - # Setup kdm - if "kdm" in displaymanagers: - if have_dm("kdm", root_mount_point): - pass - else: - libcalamares.utils.debug("kdm selected but not installed") - displaymanagers.remove("kdm") + if dm_impl is None: + libcalamares.utils.debug("{!s} selected but not installed".format(dm)) + displaymanagers.remove(dm) if username is not None: libcalamares.utils.debug( @@ -798,19 +732,16 @@ def run(): libcalamares.globalstorage.insert("displayManagers", displaymanagers) dm_setup_message = [] - for dm in displaymanagers: - impl = [ cls for name, cls in display_managers if name == dm ] - if len(impl) == 1: - dm_impl = impl[0]() # Instantiate the class that was named - dm_message = None - if enable_basic_setup: - dm_message = dm_impl.basic_setup() - if default_desktop_environment is not None and dm_message is None: - dm_message = dm_impl.desktop_environment_setup(default_desktop_environment) - if dm_message is None: - dm_message = dm_impl.set_autologin(username, default_desktop_environment, root_mount_point) - else: - dm_message = ("Can not configure {!s}".format(dm), "{!s} has {!d} implementation classes.".format(dm).format(len(impl))) + for dm in dm_impl: + dm_message = None + if enable_basic_setup: + dm_message = dm.basic_setup() + if default_desktop_environment is not None and dm_message is None: + dm_message = dm.desktop_environment_setup(default_desktop_environment) + if dm_message is None: + dm_message = dm.greeter_setup() + if dm_message is None: + dm_message = dm.set_autologin(username, do_autologin, default_desktop_environment) if dm_message is not None: dm_setup_message.append("{!s}: {!s}".format(*dm_message))