From dd79fe6583c85ef28fa7a593b1e8ca192b97bbdb Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Thu, 3 Dec 2020 12:13:58 +0000 Subject: [PATCH] data: Set up D-Bus session services as systemd user services This allows them to be managed by `systemd --user` on systems that use it, meaning they can be manipulated by `systemctl --user`, placed into a slice for resource management purposes, configured with drop-in configuration in {/etc,/usr/lib}/systemd/user/goa-daemon.service.d/*.conf and so on. On systems that do not launch dbus-daemon as a `systemd --user` service, including systems that do not use systemd at all, the SystemdService field is ignored and the dbus-daemon will continue to use the traditional activation mechanism. In this case the GOA services will continue to be child processes of the dbus-daemon. Signed-off-by: Simon McVittie --- data/Makefile.am | 9 +++++++++ data/goa-daemon.service.in | 7 +++++++ data/goa-identity-service.service.in | 7 +++++++ data/meson.build | 12 ++++++++++++ data/org.gnome.Identity.service.in | 1 + data/org.gnome.OnlineAccounts.service.in | 1 + meson.build | 14 ++++++++++++++ meson_options.txt | 1 + 8 files changed, 52 insertions(+) create mode 100644 data/goa-daemon.service.in create mode 100644 data/goa-identity-service.service.in diff --git a/data/Makefile.am b/data/Makefile.am index e3608a12..76741349 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -11,12 +11,17 @@ gsettings_SCHEMAS = $(gsettings_schema_files) servicedir = $(datadir)/dbus-1/services service_in_files = org.gnome.OnlineAccounts.service.in +systemduserunitdir = $(prefix)/lib/systemd/user +systemd_service_in_files = goa-daemon.service.in if BUILD_KERBEROS service_in_files += org.gnome.Identity.service.in +systemd_service_in_files += goa-identity-service.service.in endif service_DATA = $(service_in_files:.service.in=.service) +systemduserunit_DATA = $(systemd_service_in_files:.service.in=.service) + %.service: %.service.in Makefile @sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@ endif @@ -24,11 +29,15 @@ endif EXTRA_DIST = \ $(gsettings_schema_files) \ dbus-interfaces.xml \ + goa-daemon.service.in \ + goa-identity-service.service.in \ org.gnome.Identity.service.in \ org.gnome.OnlineAccounts.service.in \ $(NULL) CLEANFILES = \ + goa-daemon.service \ + goa-identity-service.service \ org.gnome.OnlineAccounts.service \ org.gnome.Identity.service \ $(NULL) diff --git a/data/goa-daemon.service.in b/data/goa-daemon.service.in new file mode 100644 index 00000000..c612656f --- /dev/null +++ b/data/goa-daemon.service.in @@ -0,0 +1,7 @@ +[Unit] +Description=GNOME Online Accounts service + +[Service] +ExecStart=@libexecdir@/goa-daemon +Type=dbus +BusName=org.gnome.OnlineAccounts diff --git a/data/goa-identity-service.service.in b/data/goa-identity-service.service.in new file mode 100644 index 00000000..7bf8cf6c --- /dev/null +++ b/data/goa-identity-service.service.in @@ -0,0 +1,7 @@ +[Unit] +Description=GNOME identity service for Kerberos + +[Service] +ExecStart=@libexecdir@/goa-identity-service +Type=dbus +BusName=org.gnome.Identity diff --git a/data/meson.build b/data/meson.build index a62f8e8d..42cb8ffa 100644 --- a/data/meson.build +++ b/data/meson.build @@ -9,8 +9,10 @@ if enable_goabackend ) services = ['org.gnome.OnlineAccounts.service'] + systemd_services = ['goa-daemon.service'] if enable_kerberos services += 'org.gnome.Identity.service' + systemd_services += ['goa-identity-service.service'] endif service_conf = configuration_data() @@ -25,4 +27,14 @@ if enable_goabackend install_dir: dbus_service_dir ) endforeach + + foreach service: systemd_services + configure_file( + input: service + '.in', + output: service, + configuration: service_conf, + install: true, + install_dir: systemd_userunitdir + ) + endforeach endif diff --git a/data/org.gnome.Identity.service.in b/data/org.gnome.Identity.service.in index bd3b0322..f70948e8 100644 --- a/data/org.gnome.Identity.service.in +++ b/data/org.gnome.Identity.service.in @@ -1,3 +1,4 @@ [D-BUS Service] Name=org.gnome.Identity Exec=@libexecdir@/goa-identity-service +SystemdService=goa-identity-service.service diff --git a/data/org.gnome.OnlineAccounts.service.in b/data/org.gnome.OnlineAccounts.service.in index ff2b976a..9d8df111 100644 --- a/data/org.gnome.OnlineAccounts.service.in +++ b/data/org.gnome.OnlineAccounts.service.in @@ -1,3 +1,4 @@ [D-BUS Service] Name=org.gnome.OnlineAccounts Exec=@libexecdir@/goa-daemon +SystemdService=goa-daemon.service diff --git a/meson.build b/meson.build index c3d54c8f..f3cffc72 100644 --- a/meson.build +++ b/meson.build @@ -86,6 +86,20 @@ dbus_dep = dependency('dbus-1') dbus_service_dir = dbus_dep.get_pkgconfig_variable('session_bus_services_dir', define_variable: ['datadir', goa_datadir]) +systemd_userunitdir = get_option('systemduserunitdir') + +if systemd_userunitdir == '' + systemd_dep = dependency('systemd', required: false) + + if systemd_dep.found() + systemd_userunitdir = systemd_dep.get_pkgconfig_variable('systemduserunitdir') + else + # Fall back to the upstream default. + # Note that this is always 'lib', even if libdir is something else + systemd_userunitdir = join_paths(goa_prefix, 'lib', 'systemd', 'user') + endif +endif + # Libraries # introspection support enable_introspection = get_option('introspection') diff --git a/meson_options.txt b/meson_options.txt index 08c65ecd..6cd6219b 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -39,3 +39,4 @@ option('introspection', type: 'boolean', value: true, description: 'Enable GObje option('man', type: 'boolean', value: false, description: 'enable man pages') option('template_file', type: 'string', value: '', description: 'Path to the template file') option('vapi', type: 'boolean', value: true, description: 'build Vala binding') +option('systemduserunitdir', type: 'string', value: '', description: 'Override systemd user unit directory') -- GitLab