From 79e94b4a7ebc597597e6520623f298e408ab9871 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Thu, 25 Jul 2019 21:31:23 +1000 Subject: [PATCH] ratbagd: install the devel dbus policy file on startup Don't rely on some other tool to install the policy file, let's just do this in ratbagd.devel directly so it's immediately executable. Signed-off-by: Peter Hutterer --- meson.build | 18 +++++++++++--- ratbagd/ratbagd.c | 54 +++++++++++++++++++++++++++++++++++++++++ tools/ratbagctl.test.in | 5 ---- tools/toolbox.py | 16 ------------ 4 files changed, 68 insertions(+), 25 deletions(-) diff --git a/meson.build b/meson.build index 5e61ce80..b5f060f0 100644 --- a/meson.build +++ b/meson.build @@ -422,19 +422,29 @@ install_man('ratbagd/ratbagd.8') # (org.freedesktop.ratbag_devel1). This server is used by ratbagdctl.devel. # +config_ratbagd_devel = configuration_data() +dbus_devel_policy = configure_file(input : 'dbus/org.freedesktop.ratbag_devel1.conf.in', + output : 'org.freedesktop.ratbag_devel1.conf', + configuration : config_ratbagd_devel) + +# This is a hack. We always install the devel policy file into +# /etc/dbus-1/system.d, independent of any prefixes we use otherwise. +# This should never be used outside of developer machines anyway, but +# installations on those may use different prefixes for building. +# This is not set in stone, suggest something better if you can. +dbussystemdir = join_paths('/', get_option('sysconfdir'), 'dbus-1', 'system.d') + executable('ratbagd.devel', src_ratbagd, dependencies : deps_ratbagd, include_directories : include_directories('src'), install : false, c_args : ['-DRATBAG_DBUS_INTERFACE="ratbag_devel1"', + '-DDBUS_POLICY_SRC="@0@/@1@"'.format(meson.build_root(), dbus_devel_policy), + '-DDBUS_POLICY_DST="@0@/@1@"'.format(dbussystemdir, dbus_devel_policy), '-DDISABLE_COREDUMP=1'], ) -config_ratbagd_devel = configuration_data() -configure_file(input : 'dbus/org.freedesktop.ratbag_devel1.conf.in', - output : 'org.freedesktop.ratbag_devel1.conf', - configuration : config_ratbagd_devel) #### unit file #### if enable_systemd diff --git a/ratbagd/ratbagd.c b/ratbagd/ratbagd.c index 7349bbfb..6c462b68 100644 --- a/ratbagd/ratbagd.c +++ b/ratbagd/ratbagd.c @@ -521,6 +521,56 @@ static int ratbagd_run(struct ratbagd *ctx) return sd_event_loop(ctx->event); } +static bool install_ratbagd_devel_dbus_policy(void) +{ + bool rc = true; +#ifdef RATBAG_DEVELOPER_EDITION + _cleanup_close_ int in = -1, out = -1; + int nread, nwrite; + char buf[40960]; + + rc = false; + + log_verbose("Installing DBus policy file to %s\n", DBUS_POLICY_DST); + + in = open(DBUS_POLICY_SRC, O_RDONLY); + if (in == -1) { + log_error("Failed to source policy file: %m\n"); + goto out; + } + out = open(DBUS_POLICY_DST, O_CREAT|O_WRONLY, 0644); + if (out == -1) { + log_error("Failed to open destination: %m\n"); + goto out; + } + + + nread = read(in, buf, sizeof(buf)); + if (nread < 0) { + log_error("Failed to read policy file: %m\n"); + goto out; + } + + nwrite = write(out, buf, nread); + if (nread != nwrite) { + log_error("Failed to write policy file: %m\n"); + goto out; + } + + rc = true; + +out: +#endif + return rc; +} + +static void remove_ratbagd_devel_dbus_policy(void) +{ +#ifdef RATBAG_DEVELOPER_EDITION + unlink(DBUS_POLICY_DST); +#endif +} + int main(int argc, char *argv[]) { struct ratbagd *ctx = NULL; @@ -550,6 +600,9 @@ int main(int argc, char *argv[]) } } + if (!install_ratbagd_devel_dbus_policy()) + goto exit; + r = ratbagd_new(&ctx); if (r < 0) goto exit; @@ -558,6 +611,7 @@ int main(int argc, char *argv[]) r = ratbagd_run(ctx); + remove_ratbagd_devel_dbus_policy(); exit: ratbagd_free(ctx); diff --git a/tools/ratbagctl.test.in b/tools/ratbagctl.test.in index 53a0f404..7cb918bf 100755 --- a/tools/ratbagctl.test.in +++ b/tools/ratbagctl.test.in @@ -603,11 +603,6 @@ class TestRatbagCtlLED(TestRatbagCtl): def setUpModule(): global ratbagd_process, ratbagd, parser - # To do actually do this: - # - copy the org.freedesktop.ratbag_devel1.conf to - # /etc/dbus-1/system.d - # - start builddir/ratbagd.devel (in gdb if need be) - # - run builddir/ratbagctl.test ratbagd_process = None if start_ratbagd: ratbagd_process = toolbox.start_ratbagd() diff --git a/tools/toolbox.py b/tools/toolbox.py index d4be4784..8bb3c8dc 100644 --- a/tools/toolbox.py +++ b/tools/toolbox.py @@ -36,9 +36,6 @@ RATBAGCTL_NAME = 'ratbagctl' RATBAGCTL_PATH = os.path.join('@MESON_BUILD_ROOT@', RATBAGCTL_NAME) RATBAGCTL_DEVEL_NAME = 'ratbagctl.devel' RATBAGCTL_DEVEL_PATH = os.path.join('@MESON_BUILD_ROOT@', RATBAGCTL_DEVEL_NAME) -DBUS_CONF_DIR = '/etc/dbus-1/system.d' -DBUS_CONF_NAME = 'org.freedesktop.ratbag_devel1.conf' -DBUS_CONF_PATH = os.path.join(DBUS_CONF_DIR, DBUS_CONF_NAME) def import_non_standard_path(name, path): @@ -61,12 +58,6 @@ def start_ratbagd(verbosity=0): from gi.repository import Gio import time - os.makedirs(DBUS_CONF_DIR, exist_ok=True) - - # first copy the policy for the ratbagd daemon to be allowed to run - shutil.copy(os.path.join('@MESON_BUILD_ROOT@', DBUS_CONF_NAME), - DBUS_CONF_PATH) - # FIXME: kill any running ratbagd.devel args = [os.path.join('@MESON_BUILD_ROOT@', "ratbagd.devel")] @@ -111,10 +102,6 @@ def terminate_ratbagd(ratbagd): ratbagd.wait(5) except subprocess.TimeoutExpired: ratbagd.kill() - try: - os.unlink(DBUS_CONF_PATH) - except FileNotFoundError: - pass def sync_dbus(): @@ -130,9 +117,6 @@ from ratbagctl import open_ratbagd, get_parser, RatbagError, RatbagErrorCapabili __all__ = [ RATBAGCTL_NAME, RATBAGCTL_PATH, - DBUS_CONF_DIR, - DBUS_CONF_NAME, - DBUS_CONF_PATH, start_ratbagd, terminate_ratbagd, open_ratbagd,