From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ryan O'Hara Date: Thu, 3 Feb 2011 13:26:07 -0600 Subject: [Cluster-devel] [PATCH] fenced: send dbus signal when node is fenced Message-ID: <1296761167-10260-1-git-send-email-rohara@redhat.com> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit This patch adds the ability to send a dbus signal when a node is fenced. This code is can reestablish a connection with dbus if necessary. Signed-off-by: Ryan O'Hara --- fence/fenced/Makefile | 8 ++++- fence/fenced/config.c | 2 + fence/fenced/config.h | 3 ++ fence/fenced/dbus.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++ fence/fenced/fd.h | 6 +++ fence/fenced/main.c | 14 +++++++- fence/fenced/recover.c | 4 ++ 7 files changed, 121 insertions(+), 3 deletions(-) create mode 100644 fence/fenced/dbus.c diff --git a/fence/fenced/Makefile b/fence/fenced/Makefile index 7455544..902c299 100644 --- a/fence/fenced/Makefile +++ b/fence/fenced/Makefile @@ -16,7 +16,8 @@ OBJS= config.o \ main.o \ member_cman.o \ recover.o \ - logging.o + logging.o \ + dbus.o CFLAGS += -D_FILE_OFFSET_BITS=64 CFLAGS += -I${ccsincdir} -I${cmanincdir} -I${logtincdir} -I${corosyncincdir} @@ -30,6 +31,11 @@ LDFLAGS += -L${corosynclibdir} -lcpg -lpthread LDFLAGS += -L../../group/lib -l group LDFLAGS += -L${libdir} +ifndef disable_dbus +CFLAGS += $(shell pkg-config --cflags dbus-1) -DDBUS +LDFLAGS += $(shell pkg-config --libs dbus-1) +endif + LDDEPS += ../../group/lib/libgroup.a ${TARGET}: ${OBJS} ${LDDEPS} diff --git a/fence/fenced/config.c b/fence/fenced/config.c index 37f98f9..0517c2a 100644 --- a/fence/fenced/config.c +++ b/fence/fenced/config.c @@ -9,6 +9,7 @@ int ccs_handle; int optd_groupd_compat; int optd_debug_logfile; int optd_clean_start; +int optd_disable_dbus; int optd_skip_undefined; int optd_post_join_delay; int optd_post_fail_delay; @@ -20,6 +21,7 @@ int optd_override_path; int cfgd_groupd_compat = DEFAULT_GROUPD_COMPAT; int cfgd_debug_logfile = DEFAULT_DEBUG_LOGFILE; int cfgd_clean_start = DEFAULT_CLEAN_START; +int cfgd_disable_dbus = DEFAULT_DISABLE_DBUS; int cfgd_skip_undefined = DEFAULT_SKIP_UNDEFINED; int cfgd_post_join_delay = DEFAULT_POST_JOIN_DELAY; int cfgd_post_fail_delay = DEFAULT_POST_FAIL_DELAY; diff --git a/fence/fenced/config.h b/fence/fenced/config.h index f65af0e..d17ed1a 100644 --- a/fence/fenced/config.h +++ b/fence/fenced/config.h @@ -4,6 +4,7 @@ #define DEFAULT_GROUPD_COMPAT 0 #define DEFAULT_DEBUG_LOGFILE 0 #define DEFAULT_CLEAN_START 0 +#define DEFAULT_DISABLE_DBUS 0 #define DEFAULT_SKIP_UNDEFINED 0 #define DEFAULT_POST_JOIN_DELAY 6 #define DEFAULT_POST_FAIL_DELAY 0 @@ -13,6 +14,7 @@ extern int optd_groupd_compat; extern int optd_debug_logfile; extern int optd_clean_start; +extern int optd_disable_dbus; extern int optd_skip_undefined; extern int optd_post_join_delay; extern int optd_post_fail_delay; @@ -22,6 +24,7 @@ extern int optd_override_path; extern int cfgd_groupd_compat; extern int cfgd_debug_logfile; extern int cfgd_clean_start; +extern int cfgd_disable_dbus; extern int cfgd_skip_undefined; extern int cfgd_post_join_delay; extern int cfgd_post_fail_delay; diff --git a/fence/fenced/dbus.c b/fence/fenced/dbus.c new file mode 100644 index 0000000..a1ee9f0 --- /dev/null +++ b/fence/fenced/dbus.c @@ -0,0 +1,87 @@ +#include "fd.h" +#include "config.h" + +#ifdef DBUS +#include + +#define DBUS_FENCE_NAME "com.redhat.cluster.fence" +#define DBUS_FENCE_IFACE "com.redhat.cluster.fence" +#define DBUS_FENCE_PATH "/com/redhat/cluster/fence" + +static DBusConnection *bus = NULL; + +void fd_dbus_init(void) +{ + if (!(bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, NULL))) { + log_error("failed to get dbus connection"); + } else { + log_debug("connected to dbus %s", dbus_bus_get_unique_name(bus)); + } +} + +void fd_dbus_exit(void) +{ + if (bus) { + dbus_connection_close(bus); + dbus_connection_unref(bus); + } + bus = NULL; +} + +void fd_dbus_send(const char *nodename, int nodeid, int result) +{ + DBusMessage *msg = NULL; + + if (bus && !dbus_connection_read_write(bus, 1)) { + log_debug("disconnected from dbus"); + dbus_exit(); + } + + if (!bus) { + dbus_init(); + } + + if (!bus) { + goto out; + } + + if (!(msg = dbus_message_new_signal(DBUS_FENCE_PATH, + DBUS_FENCE_IFACE, + "FenceNode"))) { + log_error("failed to create dbus signal"); + goto out; + } + + if (!dbus_message_append_args(msg, + DBUS_TYPE_STRING, &nodename, + DBUS_TYPE_INT32, &nodeid, + DBUS_TYPE_INT32, &result, + DBUS_TYPE_INVALID)) { + log_error("failed to append args to dbus signal"); + goto out; + } + + dbus_connection_send(bus, msg, NULL); + dbus_connection_flush(bus); + +out: + if (msg) { + dbus_message_unref(msg); + } +} + +#else + +void fd_dbus_init(void) +{ +} + +void fd_dbus_exit(void) +{ +} + +void fd_dbus_send(const char *nodename, int nodeid, int result) +{ +} + +#endif /* DBUS */ diff --git a/fence/fenced/fd.h b/fence/fenced/fd.h index a5a78bf..21855b2 100644 --- a/fence/fenced/fd.h +++ b/fence/fenced/fd.h @@ -286,5 +286,11 @@ void init_logging(void); void setup_logging(void); void close_logging(void); +/* dbus.c */ + +void fd_dbus_init(void); +void fd_dbus_exit(void); +void fd_dbus_send(const char *nodename, int nodeid, int result); + #endif /* __FD_DOT_H__ */ diff --git a/fence/fenced/main.c b/fence/fenced/main.c index e5ab568..b9783fd 100644 --- a/fence/fenced/main.c +++ b/fence/fenced/main.c @@ -902,7 +902,7 @@ static void print_usage(void) printf(" -j Post-join fencing delay (default %d)\n", DEFAULT_POST_JOIN_DELAY); printf(" -f Post-fail fencing delay (default %d)\n", DEFAULT_POST_FAIL_DELAY); printf(" -R Override time (default %d)\n", DEFAULT_OVERRIDE_TIME); - + printf(" -q Disable dbus signals\n"); printf(" -O Override path (default %s)\n", DEFAULT_OVERRIDE_PATH); printf(" -h Print this help, then exit\n"); printf(" -V Print program version information, then exit\n"); @@ -912,7 +912,7 @@ static void print_usage(void) printf("\n"); } -#define OPTION_STRING "Lg:cj:f:Dn:O:hVSse:r:" +#define OPTION_STRING "Lg:cj:f:Dn:O:hVSse:r:q" static void read_arguments(int argc, char **argv) { @@ -970,6 +970,11 @@ static void read_arguments(int argc, char **argv) cfgd_override_path = strdup(optarg); break; + case 'q': + optd_disable_dbus = 1; + cfgd_disable_dbus = 1; + break; + case 'r': register_controlled_dir(optarg); break; @@ -1042,8 +1047,13 @@ int main(int argc, char **argv) signal(SIGTERM, sigterm_handler); set_oom_adj(-16); + if (!cfgd_disable_dbus) { + dbus_init(); + } + loop(); + dbus_exit(); unlink(LOCKFILE_NAME); return 0; } diff --git a/fence/fenced/recover.c b/fence/fenced/recover.c index a7ca047..13014c8 100644 --- a/fence/fenced/recover.c +++ b/fence/fenced/recover.c @@ -384,6 +384,10 @@ void fence_victims(struct fd *fd) log_error("fence %s %s", node->name, error ? "failed" : "success"); + if (!cfgd_disable_dbus) { + fd_dbus_send(node->name, node->nodeid, error); + } + skip_log_message: if (!error) { node->local_victim_done = 1; -- 1.7.3.4