ifpsrv.c revision b81ad4a7c59cade13d52216f805d904392627136
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina/*
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina Authors:
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina Jakub Hrozek <jhrozek@redhat.com>
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina Copyright (C) 2013 Red Hat
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina InfoPipe responder: the responder server
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina This program is free software; you can redistribute it and/or modify
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina it under the terms of the GNU General Public License as published by
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina the Free Software Foundation; either version 3 of the License, or
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina (at your option) any later version.
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina This program is distributed in the hope that it will be useful,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina but WITHOUT ANY WARRANTY; without even the implied warranty of
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina GNU General Public License for more details.
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina You should have received a copy of the GNU General Public License
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina along with this program. If not, see <http://www.gnu.org/licenses/>.
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina*/
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include <stdio.h>
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include <unistd.h>
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include <fcntl.h>
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include <sys/types.h>
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include <sys/stat.h>
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include <sys/socket.h>
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include <sys/un.h>
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include <string.h>
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include <sys/time.h>
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include <errno.h>
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include <popt.h>
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include <dbus/dbus.h>
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "util/util.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "sbus/sssd_dbus.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "monitor/monitor_interfaces.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "confdb/confdb.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "responder/ifp/ifp_private.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "responder/common/responder_sbus.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastruct mon_cli_iface monitor_ifp_methods = {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina { &mon_cli_iface_meta, 0 },
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina .ping = monitor_common_pong,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina .resInit = monitor_common_res_init,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina .shutDown = NULL,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina .goOffline = NULL,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina .resetOffline = NULL,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina .rotateLogs = responder_logrotate,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina};
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastatic struct data_provider_iface ifp_dp_methods = {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina { &data_provider_iface_meta, 0 },
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina .RegisterService = NULL,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina .pamHandler = NULL,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina .sudoHandler = NULL,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina .autofsHandler = NULL,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina .hostHandler = NULL,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina .getDomains = NULL,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina .getAccountInfo = NULL,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina};
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastruct infopipe_iface ifp_iface = {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina { &infopipe_iface_meta, 0 },
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina .Ping = ifp_ping,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina};
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastruct sss_cmd_table *get_ifp_cmds(void)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina{
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina static struct sss_cmd_table ifp_cmds[] = {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina { SSS_GET_VERSION, sss_cmd_get_version },
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina { SSS_CLI_NULL, NULL}
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina };
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return ifp_cmds;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina}
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastatic void ifp_dp_reconnect_init(struct sbus_connection *conn,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina int status, void *pvt)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina{
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct be_conn *be_conn = talloc_get_type(pvt, struct be_conn);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina int ret;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* Did we reconnect successfully? */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (status == SBUS_RECONNECT_SUCCESS) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Reconnected to the Data Provider.\n");
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* Identify ourselves to the data provider */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = dp_common_send_id(be_conn->conn,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DATA_PROVIDER_VERSION,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina "InfoPipe");
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* all fine */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (ret == EOK) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina handle_requests_after_reconnect(be_conn->rctx);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* Failed to reconnect */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_FATAL_FAILURE, "Could not reconnect to %s provider.\n",
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina be_conn->domain->name);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina}
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastatic errno_t
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinasysbus_init(TALLOC_CTX *mem_ctx,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct tevent_context *ev,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *dbus_name,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *dbus_path,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct sbus_vtable *iface_vtable,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina void *pvt,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct sysbus_ctx **sysbus)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina{
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DBusError dbus_error;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DBusConnection *conn = NULL;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct sysbus_ctx *system_bus = NULL;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct sbus_interface *sif;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina errno_t ret;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina system_bus = talloc_zero(mem_ctx, struct sysbus_ctx);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (system_bus == NULL) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return ENOMEM;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina dbus_error_init(&dbus_error);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* Connect to the well-known system bus */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina conn = dbus_bus_get(DBUS_BUS_SYSTEM, &dbus_error);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (conn == NULL) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ("Failed to connect to D-BUS system bus.\n"));
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = EIO;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina goto fail;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina dbus_connection_set_exit_on_disconnect(conn, FALSE);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = dbus_bus_request_name(conn, dbus_name,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* We want exclusive access */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DBUS_NAME_FLAG_DO_NOT_QUEUE,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina &dbus_error);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (ret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* We were unable to register on the system bus */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ("Unable to request name on the system bus.\n"));
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = EIO;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina goto fail;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Listening on %s\n", dbus_name);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* Integrate with tevent loop */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = sbus_init_connection(system_bus, ev, conn,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina SBUS_CONN_TYPE_SYSBUS,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina &system_bus->conn);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (ret != EOK) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina "Could not integrate D-BUS into mainloop.\n");
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina goto fail;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina sif = sbus_new_interface(system_bus->conn,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina dbus_path,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina iface_vtable,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina pvt);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (sif == NULL) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina "Could not add the sbus interface\n");
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina goto fail;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = sbus_conn_add_interface(system_bus->conn, sif);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (ret != EOK) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina "Could not add the interface\n");
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina goto fail;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina *sysbus = system_bus;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return EOK;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinafail:
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (dbus_error_is_set(&dbus_error)) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_OP_FAILURE,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina "DBus error message: %s\n", dbus_error.message);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina dbus_error_free(&dbus_error);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (conn) dbus_connection_unref(conn);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina talloc_free(system_bus);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return ret;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina}
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinaint ifp_process_init(TALLOC_CTX *mem_ctx,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct tevent_context *ev,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct confdb_ctx *cdb)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina{
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct resp_ctx *rctx;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct sss_cmd_table *ifp_cmds;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct ifp_ctx *ifp_ctx;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct be_conn *iter;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina int ret;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina int max_retries;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ifp_cmds = get_ifp_cmds();
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = sss_process_init(mem_ctx, ev, cdb,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ifp_cmds,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina NULL, NULL,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina CONFDB_IFP_CONF_ENTRY,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina SSS_IFP_SBUS_SERVICE_NAME,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina SSS_IFP_SBUS_SERVICE_VERSION,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina &monitor_ifp_methods,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina "InfoPipe",
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina &ifp_dp_methods.vtable,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina &rctx);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (ret != EOK) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_FATAL_FAILURE, "sss_process_init() failed\n");
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return ret;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ifp_ctx = talloc_zero(rctx, struct ifp_ctx);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (ifp_ctx == NULL) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_FATAL_FAILURE, "fatal error initializing ifp_ctx\n");
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = ENOMEM;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina goto fail;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ifp_ctx->rctx = rctx;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ifp_ctx->rctx->pvt_ctx = ifp_ctx;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = sss_names_init_from_args(ifp_ctx,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina "(?P<name>[^@]+)@?(?P<domain>[^@]*$)",
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina "%1$s@%2$s", &ifp_ctx->snctx);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (ret != EOK) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_FATAL_FAILURE, "fatal error initializing regex data\n");
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina goto fail;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* Enable automatic reconnection to the Data Provider */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = confdb_get_int(ifp_ctx->rctx->cdb,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina CONFDB_IFP_CONF_ENTRY,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina CONFDB_SERVICE_RECON_RETRIES,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina 3, &max_retries);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (ret != EOK) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_FATAL_FAILURE,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina "Failed to set up automatic reconnection\n");
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina goto fail;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina for (iter = ifp_ctx->rctx->be_conns; iter; iter = iter->next) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina sbus_reconnect_init(iter->conn, max_retries,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ifp_dp_reconnect_init, iter);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* Connect to the D-BUS system bus and set up methods */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = sysbus_init(ifp_ctx, ifp_ctx->rctx->ev,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina INFOPIPE_IFACE,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina INFOPIPE_PATH,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina &ifp_iface.vtable,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ifp_ctx, &ifp_ctx->sysbus);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (ret != EOK) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina "Failed to connect to the system message bus\n");
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina talloc_free(ifp_ctx);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return EIO;
}
ret = schedule_get_domains_task(rctx, rctx->ev, rctx);
if (ret != EOK) {
DEBUG(SSSDBG_FATAL_FAILURE,
"schedule_get_domains_tasks failed.\n");
goto fail;
}
DEBUG(SSSDBG_TRACE_FUNC, "InfoPipe Initialization complete\n");
return EOK;
fail:
talloc_free(rctx);
return ret;
}
int main(int argc, const char *argv[])
{
int opt;
poptContext pc;
struct main_context *main_ctx;
int ret;
struct poptOption long_options[] = {
POPT_AUTOHELP
SSSD_MAIN_OPTS
POPT_TABLEEND
};
/* Set debug level to invalid value so we can deside if -d 0 was used. */
debug_level = SSSDBG_INVALID;
pc = poptGetContext(argv[0], argc, argv, long_options, 0);
while((opt = poptGetNextOpt(pc)) != -1) {
switch(opt) {
default:
fprintf(stderr, "\nInvalid option %s: %s\n\n",
poptBadOption(pc, 0), poptStrerror(opt));
poptPrintUsage(pc, stderr, 0);
return 1;
}
}
poptFreeContext(pc);
DEBUG_INIT(debug_level);
/* set up things like debug, signals, daemonization, etc... */
debug_log_file = "sssd_ifp";
ret = server_setup("sssd[ifp]", 0, CONFDB_IFP_CONF_ENTRY, &main_ctx);
if (ret != EOK) return 2;
ret = die_if_parent_died();
if (ret != EOK) {
/* This is not fatal, don't return */
DEBUG(SSSDBG_MINOR_FAILURE,
"Could not set up to exit when parent process does\n");
}
ret = ifp_process_init(main_ctx,
main_ctx->event_ctx,
main_ctx->confdb_ctx);
if (ret != EOK) return 3;
/* loop on main */
server_loop(main_ctx);
return 0;
}