From 4990b8e3f8c3fdd4fcdc639898845b64e4352264 Mon Sep 17 00:00:00 2001 From: Kevin Kofler Date: Fri, 7 Nov 2014 02:24:43 +0100 Subject: [PATCH 1/4] displaymanager: Refactor the desktop environment detection to eliminate the copy&paste. This also fixes some issues with the previous code: * The code for LightDM only supported Xfce. * The case where multiple desktop environments are installed was not handled in a good way. * We now also check that the xsession definition actually exists. This allows handling the case where upstream changed the xsession definition's name without renaming the invoked binary. --- src/modules/displaymanager/main.py | 84 +++++++++++------------------- 1 file changed, 31 insertions(+), 53 deletions(-) diff --git a/src/modules/displaymanager/main.py b/src/modules/displaymanager/main.py index c9f8a0d4e..cb27a8047 100644 --- a/src/modules/displaymanager/main.py +++ b/src/modules/displaymanager/main.py @@ -19,10 +19,29 @@ # along with Calamares. If not, see . import os +import collections import libcalamares import subprocess +DesktopEnvironment = collections.namedtuple('DesktopEnvironment', ['executable', 'desktop_file']) + +desktop_environments = [ + DesktopEnvironment('/usr/bin/startxfce4', 'xfce'), + DesktopEnvironment('/usr/bin/cinnamon-session', 'cinnamon-session'), + DesktopEnvironment('/usr/bin/mate-session', 'mate'), + DesktopEnvironment('/usr/bin/enlightenment_start', 'enlightenment'), + DesktopEnvironment('/usr/bin/openbox-session', 'openbox'), + DesktopEnvironment('/usr/bin/lxsession', 'LXDE') +] + +def find_desktop_environment(root_mount_point): + for desktop_environment in desktop_environments: + if os.path.exists('%s%s' % (root_mount_point, desktop_environment.executable)) \ + and os.path.exists('%s/usr/share/xsessions/%s.desktop' % (root_mount_point, desktop_environment.desktop_file)): + return desktop_environment + return None + def set_autologin(username, displaymanagers, root_mount_point): """ Enables automatic login for the installed desktop managers """ @@ -196,9 +215,10 @@ def run(): libcalamares.utils.chroot_call(['passwd', '-l', 'lightdm']) libcalamares.utils.chroot_call( ['chown', '-R', 'lightdm:lightdm', '/run/lightdm']) - if os.path.exists("%s/usr/bin/startxfce4" % root_mount_point): + default_desktop_environment = find_desktop_environment(root_mount_point) + if default_desktop_environment != None: os.system( - "sed -i -e 's/^.*user-session=.*/user-session=xfce/' %s/etc/lightdm/lightdm.conf" % root_mount_point) + "sed -i -e 's/^.*user-session=.*/user-session=%s/' %s/etc/lightdm/lightdm.conf" % (default_desktop_environment.desktop_file, root_mount_point)) libcalamares.utils.chroot_call(['ln', '-s', '/usr/lib/lightdm/lightdm/gdmflexiserver', '/usr/bin/gdmflexiserver']) @@ -222,24 +242,10 @@ def run(): if os.path.exists("%s/var/lib/AccountsService/users" % root_mount_point): os.system( "echo \"[User]\" > %s/var/lib/AccountsService/users/gdm" % root_mount_point) - if os.path.exists("%s/usr/bin/startxfce4" % root_mount_point): - os.system( - "echo \"XSession=xfce\" >> %s/var/lib/AccountsService/users/gdm" % root_mount_point) - if os.path.exists("%s/usr/bin/cinnamon-session" % root_mount_point): + default_desktop_environment = find_desktop_environment(root_mount_point) + if default_desktop_environment != None: os.system( - "echo \"XSession=cinnamon-session\" >> %s/var/lib/AccountsService/users/gdm" % root_mount_point) - if os.path.exists("%s/usr/bin/mate-session" % root_mount_point): - os.system( - "echo \"XSession=mate\" >> %s/var/lib/AccountsService/users/gdm" % root_mount_point) - if os.path.exists("%s/usr/bin/enlightenment_start" % root_mount_point): - os.system( - "echo \"XSession=enlightenment\" >> %s/var/lib/AccountsService/users/gdm" % root_mount_point) - if os.path.exists("%s/usr/bin/openbox-session" % root_mount_point): - os.system( - "echo \"XSession=openbox\" >> %s/var/lib/AccountsService/users/gdm" % root_mount_point) - if os.path.exists("%s/usr/bin/lxsession" % root_mount_point): - os.system( - "echo \"XSession=LXDE\" >> %s/var/lib/AccountsService/users/gdm" % root_mount_point) + "echo \"XSession=%s\" >> %s/var/lib/AccountsService/users/gdm" % (default_desktop_environment.desktop_file, root_mount_point)) os.system( "echo \"Icon=\" >> %s/var/lib/AccountsService/users/gdm" % root_mount_point) else: @@ -258,24 +264,10 @@ def run(): libcalamares.utils.chroot_call( ['chown', 'root:mdm', '/var/lib/mdm']) libcalamares.utils.chroot_call(['chmod', '1770', '/var/lib/mdm']) - if os.path.exists("%s/usr/bin/startxfce4" % root_mount_point): - os.system( - "sed -i 's|default.desktop|xfce.desktop|g' %s/etc/mdm/custom.conf" % root_mount_point) - if os.path.exists("%s/usr/bin/cinnamon-session" % root_mount_point): + default_desktop_environment = find_desktop_environment(root_mount_point) + if default_desktop_environment != None: os.system( - "sed -i 's|default.desktop|cinnamon.desktop|g' %s/etc/mdm/custom.conf" % root_mount_point) - if os.path.exists("%s/usr/bin/openbox-session" % root_mount_point): - os.system( - "sed -i 's|default.desktop|openbox.desktop|g' %s/etc/mdm/custom.conf" % root_mount_point) - if os.path.exists("%s/usr/bin/mate-session" % root_mount_point): - os.system( - "sed -i 's|default.desktop|mate.desktop|g' %s/etc/mdm/custom.conf" % root_mount_point) - if os.path.exists("%s/usr/bin/lxsession" % root_mount_point): - os.system( - "sed -i 's|default.desktop|LXDE.desktop|g' %s/etc/mdm/custom.conf" % root_mount_point) - if os.path.exists("%s/usr/bin/enlightenment_start" % root_mount_point): - os.system( - "sed -i 's|default.desktop|enlightenment.desktop|g' %s/etc/mdm/custom.conf" % root_mount_point) + "sed -i 's|default.desktop|%s.desktop|g' %s/etc/mdm/custom.conf" % (default_desktop_environment.desktop_file, root_mount_point)) else: return "mdm selected but not installed", "" @@ -283,24 +275,10 @@ def run(): if "lxdm" in displaymanagers: if os.path.exists("%s/usr/bin/lxdm" % root_mount_point): libcalamares.utils.chroot_call(['groupadd', '--system', 'lxdm']) - if os.path.exists("%s/usr/bin/startxfce4" % root_mount_point): - os.system( - "sed -i -e 's|^.*session=.*|session=/usr/bin/startxfce4|' %s/etc/lxdm/lxdm.conf" % root_mount_point) - if os.path.exists("%s/usr/bin/cinnamon-session" % root_mount_point): - os.system( - "sed -i -e 's|^.*session=.*|session=/usr/bin/cinnamon-session|' %s/etc/lxdm/lxdm.conf" % root_mount_point) - if os.path.exists("%s/usr/bin/mate-session" % root_mount_point): - os.system( - "sed -i -e 's|^.*session=.*|session=/usr/bin/mate-session|' %s/etc/lxdm/lxdm.conf" % root_mount_point) - if os.path.exists("%s/usr/bin/enlightenment_start" % root_mount_point): - os.system( - "sed -i -e 's|^.*session=.*|session=/usr/bin/enlightenment_start|' %s/etc/lxdm/lxdm.conf" % root_mount_point) - if os.path.exists("%s/usr/bin/openbox-session" % root_mount_point): - os.system( - "sed -i -e 's|^.*session=.*|session=/usr/bin/openbox-session|' %s/etc/lxdm/lxdm.conf" % root_mount_point) - if os.path.exists("%s/usr/bin/lxsession" % root_mount_point): + default_desktop_environment = find_desktop_environment(root_mount_point) + if default_desktop_environment != None: os.system( - "sed -i -e 's|^.*session=.*|session=/usr/bin/lxsession|' %s/etc/lxdm/lxdm.conf" % root_mount_point) + "sed -i -e 's|^.*session=.*|session=%s|' %s/etc/lxdm/lxdm.conf" % (default_desktop_environment.executable, root_mount_point)) libcalamares.utils.chroot_call( ['chgrp', '-R', 'lxdm', '/var/lib/lxdm']) libcalamares.utils.chroot_call( From e365864c05d6ba0adf483a70bbce7be6335d73e8 Mon Sep 17 00:00:00 2001 From: Kevin Kofler Date: Fri, 7 Nov 2014 02:26:13 +0100 Subject: [PATCH 2/4] displaymanager: Detect the KDE Plasma (5 and 4) and GNOME desktop environments. Add them to the front of the list of desktop environments because users are more likely to expect those as the default if they have them installed. --- src/modules/displaymanager/main.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/modules/displaymanager/main.py b/src/modules/displaymanager/main.py index cb27a8047..802097cf4 100644 --- a/src/modules/displaymanager/main.py +++ b/src/modules/displaymanager/main.py @@ -27,6 +27,9 @@ import subprocess DesktopEnvironment = collections.namedtuple('DesktopEnvironment', ['executable', 'desktop_file']) desktop_environments = [ + DesktopEnvironment('/usr/bin/startkde', 'plasma'), # KDE Plasma 5 + DesktopEnvironment('/usr/bin/startkde', 'kde-plasma'), # KDE Plasma 4 + DesktopEnvironment('/usr/bin/gnome-session', 'gnome'), DesktopEnvironment('/usr/bin/startxfce4', 'xfce'), DesktopEnvironment('/usr/bin/cinnamon-session', 'cinnamon-session'), DesktopEnvironment('/usr/bin/mate-session', 'mate'), From 467d78dde6bb0f0f9db1fa3dea17fc3942eff62a Mon Sep 17 00:00:00 2001 From: Kevin Kofler Date: Fri, 7 Nov 2014 02:57:19 +0100 Subject: [PATCH 3/4] displaymanager: Use a regex to match User= in sddm.conf. This ensures we really only match the User= line and not the RememberLastUser= one. --- src/modules/displaymanager/main.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/modules/displaymanager/main.py b/src/modules/displaymanager/main.py index 802097cf4..76d97041f 100644 --- a/src/modules/displaymanager/main.py +++ b/src/modules/displaymanager/main.py @@ -20,6 +20,7 @@ import os import collections +import re import libcalamares import subprocess @@ -167,7 +168,8 @@ def set_autologin(username, displaymanagers, root_mount_point): text = sddm_conf.readlines() with open(sddm_conf_path, 'w') as sddm_conf: for line in text: - if 'User=' in line: + # User= line, possibly commented out + if re.match('\\s*(?:#\\s*)?User=', line): line = 'User={}\n'.format(username) sddm_conf.write(line) From 8512e4340535b1687ac3dda1ee7f941e90613c26 Mon Sep 17 00:00:00 2001 From: Kevin Kofler Date: Fri, 7 Nov 2014 03:04:18 +0100 Subject: [PATCH 4/4] displaymanager: Set Session= for sddm autologin. Detect the correct value using find_desktop_environment. --- src/modules/displaymanager/main.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/modules/displaymanager/main.py b/src/modules/displaymanager/main.py index 76d97041f..f788a64cb 100644 --- a/src/modules/displaymanager/main.py +++ b/src/modules/displaymanager/main.py @@ -171,6 +171,11 @@ def set_autologin(username, displaymanagers, root_mount_point): # User= line, possibly commented out if re.match('\\s*(?:#\\s*)?User=', line): line = 'User={}\n'.format(username) + # Session= line, commented out or with empty value + if re.match('\\s*#\\s*Session=|\\s*Session=$', line): + default_desktop_environment = find_desktop_environment(root_mount_point) + if default_desktop_environment != None: + line = 'Session={}.desktop\n'.format(default_desktop_environment.desktop_file) sddm_conf.write(line) return None