f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina/*
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina Authors:
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina Pavel Březina <pbrezina@redhat.com>
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina Copyright (C) 2016 Red Hat
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina This program is free software; you can redistribute it and/or modify
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina it under the terms of the GNU General Public License as published by
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina the Free Software Foundation; either version 3 of the License, or
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina (at your option) any later version.
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina This program is distributed in the hope that it will be useful,
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina but WITHOUT ANY WARRANTY; without even the implied warranty of
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina GNU General Public License for more details.
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina You should have received a copy of the GNU General Public License
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina along with this program. If not, see <http://www.gnu.org/licenses/>.
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina*/
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina#include <talloc.h>
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina#include <dbus/dbus.h>
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina#include <errno.h>
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina#include "util/util.h"
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina#include "tools/sssctl/sssctl.h"
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina#define SSS_SYSTEMD_BUS "org.freedesktop.systemd1"
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina#define SSS_SYSTEMD_PATH "/org/freedesktop/systemd1"
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina#define SSS_SYSTEMD_IFACE "org.freedesktop.systemd1.Manager"
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina#define SSS_SYSTEMD_UNIT "sssd.service"
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina#define SSS_SYSTEMD_MODE "replace" /* replace queued job if present */
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březinastatic DBusConnection *
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březinasssctl_systemd_connect(void)
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina{
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina DBusConnection *conn;
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina DBusError error;
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina dbus_error_init(&error);
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina conn = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina if (dbus_error_is_set(&error)) {
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to connect to systemd D-Bus "
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina "[%s]: %s\n", error.name, error.message);
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina conn = NULL;
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina goto done;
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina }
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březinadone:
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina dbus_error_free(&error);
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina return conn;
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina}
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březinastatic errno_t sssctl_systemd_call(const char *method)
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina{
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina DBusConnection *conn = NULL;
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina DBusMessage *reply = NULL;
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina DBusMessage *msg = NULL;
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina DBusError error;
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina const char *unit = SSS_SYSTEMD_UNIT;
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina const char *mode = SSS_SYSTEMD_MODE;
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina const char *job;
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina errno_t ret;
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina dbus_error_init(&error);
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina conn = sssctl_systemd_connect();
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina if (conn == NULL) {
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina ret = EIO;
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina goto done;
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina }
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina msg = sbus_create_message(NULL, SSS_SYSTEMD_BUS, SSS_SYSTEMD_PATH,
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina SSS_SYSTEMD_IFACE, method,
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina DBUS_TYPE_STRING, &unit,
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina DBUS_TYPE_STRING, &mode);
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina if (msg == NULL) {
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to create D-Bus Message!\n");
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina ret = ENOMEM;
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina goto done;
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina }
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina reply = dbus_connection_send_with_reply_and_block(conn, msg, 5000, &error);
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina if (dbus_error_is_set(&error)) {
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to send D-Bus message "
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina "[%s]: %s\n", error.name, error.message);
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina ret = EIO;
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina goto done;
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina }
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina ret = sbus_parse_message(reply, DBUS_TYPE_OBJECT_PATH, &job);
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina if (ret != EOK) {
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to get D-Bus reply [%d]: %s!\n",
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina ret, sss_strerror(ret));
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina goto done;
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina }
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "New systemd job created: %s\n", job);
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březinadone:
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina if (msg != NULL) {
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina dbus_message_unref(msg);
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina }
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina if (reply != NULL) {
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina dbus_message_unref(reply);
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina }
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina if (conn != NULL) {
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina dbus_connection_unref(conn);
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina }
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina return ret;
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina}
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březinaerrno_t sssctl_systemd_start(void)
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina{
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Starting SSSD via systemd...\n");
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina return sssctl_systemd_call("StartUnit");
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina}
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březinaerrno_t sssctl_systemd_stop(void)
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina{
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Stopping SSSD via systemd...\n");
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina return sssctl_systemd_call("StopUnit");
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina}
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březinaerrno_t sssctl_systemd_restart(void)
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina{
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Restarting SSSD via systemd...\n");
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina return sssctl_systemd_call("RestartUnit");
f4f2edba5c555773d7c9adfa95562b96b0c0cdb2Pavel Březina}