From 7e00d22bfac45295d97739caad93a599a1623114 Mon Sep 17 00:00:00 2001 From: Benjamin Berg Date: Sat, 20 Apr 2019 00:21:55 +0200 Subject: [PATCH] data: Update systemd units The existing units were never used as the corresponding support was never merged into gnome-session. This commits updates units to be usable with the newer gnome-session unit definitions. Also added is appropriate failure/restart logic including the ability to disable extensions. Note that extensions will only be disabled if a failure happens in the first two minutes after login. https://gitlab.gnome.org/GNOME/gnome-session/merge_requests/13 https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/507 --- data/gnome-shell-disable-extensions.service | 14 +++++++++ data/gnome-shell-wayland.service.in | 26 +++++++++++++++++ data/gnome-shell-wayland.target | 13 ++++++--- data/gnome-shell-x11.service.in | 32 +++++++++++++++++++++ data/gnome-shell-x11.target | 13 ++++++--- data/gnome-shell.service.in | 11 ------- data/meson.build | 18 ++++++++---- 7 files changed, 103 insertions(+), 24 deletions(-) create mode 100644 data/gnome-shell-disable-extensions.service create mode 100644 data/gnome-shell-wayland.service.in create mode 100644 data/gnome-shell-x11.service.in delete mode 100644 data/gnome-shell.service.in diff --git a/data/gnome-shell-disable-extensions.service b/data/gnome-shell-disable-extensions.service new file mode 100644 index 000000000..d55d7ed87 --- /dev/null +++ b/data/gnome-shell-disable-extensions.service @@ -0,0 +1,14 @@ +[Unit] +Description=Disable GNOME Shell extensions after failure +DefaultDependencies=no + +# Only disable extensions for a short period of time after login. +# This means we err on the side of failing the first login after a broken +# extension was installed. +Requisite=gnome-session-stable.timer + +[Service] +Type=simple +# Disable extensions +ExecStart=gsettings set org.gnome.shell disable-user-extensions true +Restart=no diff --git a/data/gnome-shell-wayland.service.in b/data/gnome-shell-wayland.service.in new file mode 100644 index 000000000..848a3ea32 --- /dev/null +++ b/data/gnome-shell-wayland.service.in @@ -0,0 +1,26 @@ +[Unit] +Description=GNOME Shell on Wayland +# On wayland, force a session shutdown +OnFailure=gnome-shell-disable-extensions.service gnome-session-shutdown.target +OnFailureJobMode=replace-irreversibly +CollectMode=inactive-or-failed +RefuseManualStart=on +RefuseManualStop=on + +After=gnome-session-manager.target + +Requisite=gnome-session-initialized.target +PartOf=gnome-session-initialized.target +Before=gnome-session-initialized.target + +# The units already conflict because they use the same BusName +#Conflicts=gnome-shell-x11.service + +[Service] +Type=dbus +ExecStart=@bindir@/gnome-shell +# Exit code 1 means we are probably *not* dealing with an extension failure +SuccessExitStatus=1 +# On wayland we cannot restart +Restart=no +BusName=org.gnome.Shell diff --git a/data/gnome-shell-wayland.target b/data/gnome-shell-wayland.target index a75da3ec7..37e1966d9 100644 --- a/data/gnome-shell-wayland.target +++ b/data/gnome-shell-wayland.target @@ -1,5 +1,10 @@ [Unit] -Description=GNOME Shell (wayland sync point) -After=gnome-shell.service -BindsTo=gnome-shell.service -Conflicts=gnome-shell-x11.target +Description=GNOME Shell on Wayland +DefaultDependencies=no + +Requisite=gnome-session-initialized.target +PartOf=gnome-session-initialized.target +Before=gnome-session-initialized.target + +Requires=gnome-shell-wayland.service +After=gnome-shell-wayland.service diff --git a/data/gnome-shell-x11.service.in b/data/gnome-shell-x11.service.in new file mode 100644 index 000000000..142f26b24 --- /dev/null +++ b/data/gnome-shell-x11.service.in @@ -0,0 +1,32 @@ +[Unit] +Description=GNOME Shell on X11 +# On X11, try to show the GNOME Session Failed screen +OnFailure=gnome-shell-disable-extensions.service gnome-session-failed.target +OnFailureJobMode=replace +CollectMode=inactive-or-failed +RefuseManualStart=on +RefuseManualStop=on + +After=gnome-session-manager.target + +Requisite=gnome-session-initialized.target +PartOf=gnome-session-initialized.target +Before=gnome-session-initialized.target + +# The units already conflict because they use the same BusName +#Conflicts=gnome-shell-wayland.service + +# Limit startup frequency more than the default +StartLimitIntervalSec=15s +StartLimitBurst=3 + +[Service] +Type=dbus +ExecStart=@bindir@/gnome-shell +# Exit code 1 means we are probably *not* dealing with an extension failure +SuccessExitStatus=1 +# On X11 we want to restart on-success (Alt+F2 + r) and on-failure. +Restart=always +# Do not wait before restarting the shell +RestartSec=0ms +BusName=org.gnome.Shell diff --git a/data/gnome-shell-x11.target b/data/gnome-shell-x11.target index 4da13509c..f4af2c8dd 100644 --- a/data/gnome-shell-x11.target +++ b/data/gnome-shell-x11.target @@ -1,5 +1,10 @@ [Unit] -Description=GNOME Shell (x11 sync point) -After=gnome-shell.service -BindsTo=gnome-shell.service -Conflicts=gnome-shell-wayland.target +Description=GNOME Shell on X11 +DefaultDependencies=no + +Requisite=gnome-session-initialized.target +PartOf=gnome-session-initialized.target +Before=gnome-session-initialized.target + +Requires=gnome-shell-x11.service +After=gnome-shell-x11.service diff --git a/data/gnome-shell.service.in b/data/gnome-shell.service.in deleted file mode 100644 index ee275fa0e..000000000 --- a/data/gnome-shell.service.in +++ /dev/null @@ -1,11 +0,0 @@ -[Unit] -Description=GNOME Shell -Wants=gnome-session.service -After=graphical-session-pre.target gnome-session-bus.target -PartOf=graphical-session.target - -[Service] -Type=dbus -ExecStart=@bindir@/gnome-shell -Restart=on-failure -BusName=org.gnome.Shell diff --git a/data/meson.build b/data/meson.build index 48fd8631c..93a9391ea 100644 --- a/data/meson.build +++ b/data/meson.build @@ -100,15 +100,23 @@ if have_systemd unitconf = configuration_data() unitconf.set('bindir', bindir) - unit = configure_file( - input: 'gnome-shell.service.in', - output: 'gnome-shell.service', + configure_file( + input: 'gnome-shell-x11.service.in', + output: 'gnome-shell-x11.service', configuration: unitconf, install_dir: systemduserunitdir ) - units = files('gnome-shell-wayland.target', - 'gnome-shell-x11.target') + configure_file( + input: 'gnome-shell-wayland.service.in', + output: 'gnome-shell-wayland.service', + configuration: unitconf, + install_dir: systemduserunitdir + ) + + units = files('gnome-shell-x11.target', + 'gnome-shell-wayland.target', + 'gnome-shell-disable-extensions.service') install_data(units, install_dir: systemduserunitdir) endif