#include "decision_made_event.h"
#include "log.h"
#include "systemd_dbus.h"
+#include "common.h"
static int recover_service(struct faultd_action *action)
{
struct faultd_event *ev = nqueue_pop(&action->execution_queue,
struct faultd_event, nq_node);
struct decision_made_event *dm_ev = to_decision_made_event(ev);
+ char *service_path;
int ret;
+ service_path = bson_get_string(&dm_ev->action_data, FAULTD_AD_SERVICE_NAME);
+ if (!service_path) {
+ log_error("Service path has not been provided");
+ goto unref_old_event;
+ }
+
/*
* TODO:
* For now it's just copy paste of service restart
* Add some real recovery action here
*/
- ret = faultd_dbus_call_systemd_simple((char *)dm_ev->action_data,
+ ret = faultd_dbus_call_systemd_simple(service_path,
SYSTEMD_UNIT_INTERFACE,
"Restart",
"s",
"replace");
if (ret < 0)
- log_error_errno(ret, "Failed to restart service: %s",
- (char *)dm_ev->action_data);
+ log_error_errno(ret, "Failed to restart service: %s", service_path);
+unref_old_event:
faultd_event_unref(ev);
return 0;
}
#include "decision_made_event.h"
#include "log.h"
#include "systemd_dbus.h"
+#include "common.h"
static int restart_service(struct faultd_action *action)
{
struct faultd_event *ev = nqueue_pop(&action->execution_queue,
struct faultd_event, nq_node);
struct decision_made_event *dm_ev = to_decision_made_event(ev);
+ char *service_path;
int ret;
- ret = faultd_dbus_call_systemd_simple((char *)dm_ev->action_data,
+ service_path = bson_get_string(&dm_ev->action_data, FAULTD_AD_SERVICE_NAME);
+ if (!service_path) {
+ log_error("Service path has not been provided");
+ goto unref_old_event;
+ }
+
+ ret = faultd_dbus_call_systemd_simple(service_path,
SYSTEMD_UNIT_INTERFACE,
"Restart",
"s",
"replace");
if (ret < 0)
- log_error_errno(ret, "Failed to restart service: %s",
- (char *)dm_ev->action_data);
+ log_error_errno(ret, "Failed to restart service: %s", service_path);
+unref_old_event:
faultd_event_unref(ev);
return 0;
}
.reason = ev,
.who_made = MODULE_NAME,
.action = FAULTD_ACTION_SERVICE_RESTART_ID,
- .action_data_release = free,
};
int ret;
if (systemd_service_is_of_type(&rv_ev->service, FAULTD_SERVICE_TYPE_VIP)) {
ev_data.action = FAULTD_ACTION_REBOOT_ID;
- ev_data.action_data = NULL;
+ ret = bson_fill_for_reboot(&ev_data.action_data);
} else {
- ev_data.action_data = strdup(rv_ev->service.dbus_path);
- if (!ev_data.action_data) {
- log_error("Unable to duplicate service name");
- faultd_event_unref(ev);
- return -ENOMEM;
- }
+ ret = bson_fill_for_srv_restart(&ev_data.action_data,
+ rv_ev->service.dbus_path);
+ }
+
+ if (ret) {
+ log_error("Unable to create action data");
+ goto unref_old_event;
}
ret = faultd_event_create(DECISION_MADE_EVENT_ID, &ev_data, &new_ev);
- faultd_event_unref(ev);
if (ret) {
log_error("Unable to create event");
- goto free_action_data;
+ goto del_action_data;
}
+ faultd_event_unref(ev);
+
ret = event_processor_report_event(new_ev);
if (ret) {
log_error("Unable to report event");
- goto put_new_event;
+ goto unref_new_event;
}
return 0;
-put_new_event:
+unref_new_event:
faultd_event_unref(new_ev);
return 0;
-free_action_data:
- free(ev_data.action_data);
+del_action_data:
+ bson_destroy(&ev_data.action_data);
+unref_old_event:
+ faultd_event_unref(ev);
return 0;
}
.reason = ev,
.who_made = MODULE_NAME,
.action = FAULTD_ACTION_SERVICE_RECOVER_ID,
- .action_data = NULL,
- .action_data_release = free,
};
int ret;
* recovering that service
*/
- ev_data.action_data = strdup(sf_ev->service.dbus_path);
- if (!ev_data.action_data) {
- log_error("Unable to duplicate service name");
- faultd_event_unref(ev);
- return -ENOMEM;
+ ret = bson_fill_for_srv_recover(&ev_data.action_data,
+ sf_ev->service.dbus_path,
+ sf_ev->service.recovery_unit);
+ if (ret) {
+ log_error("Unable to create action data");
+ goto unref_old_event;
}
ret = faultd_event_create(DECISION_MADE_EVENT_ID, &ev_data, &new_ev);
- faultd_event_unref(ev);
if (ret) {
log_error("Unable to create event");
- goto free_action_data;
+ goto del_action_data;
}
+ faultd_event_unref(ev);
+
ret = event_processor_report_event(new_ev);
if (ret) {
log_error("Unable to report event");
- goto put_new_event;
+ goto unref_new_event;
}
return 0;
-put_new_event:
+unref_new_event:
faultd_event_unref(new_ev);
return 0;
-free_action_data:
- free(ev_data.action_data);
+del_action_data:
+ bson_destroy(&ev_data.action_data);
+unref_old_event:
+ faultd_event_unref(ev);
return 0;
}
.reason = ev,
.who_made = MODULE_NAME,
.action = FAULTD_ACTION_REBOOT_ID,
- .action_data = NULL,
- .action_data_release = free,
};
int ret;
+ ret = bson_fill_for_reboot(&ev_data.action_data);
+ if (ret)
+ goto unref_old_event;
+
ret = faultd_event_create(DECISION_MADE_EVENT_ID, &ev_data, &new_ev);
- faultd_event_unref(ev);
if (ret) {
log_error("Unable to create event");
- goto out;
+ goto del_action_data;
}
+ faultd_event_unref(ev);
+
ret = event_processor_report_event(new_ev);
if (ret) {
log_error("Unable to report event");
- goto put_new_event;
+ goto unref_new_event;
}
return 0;
-put_new_event:
+unref_new_event:
faultd_event_unref(new_ev);
-out:
return 0;
+
+del_action_data:
+ bson_destroy(&ev_data.action_data);
+unref_old_event:
+ faultd_event_unref(ev);
+ return 0;
+
}
static struct faultd_event_handler vip_fault_event_handler = {
}
dm_ev->action_data = dm_ev_data->action_data;
- dm_ev->action_data_release = dm_ev_data->action_data_release;
dm_ev->reason = dm_ev_data->reason;
faultd_event_ref(dm_ev->reason);
free(dm_ev->who_made);
free(dm_ev->action);
- if (dm_ev->action_data_release)
- dm_ev->action_data_release(dm_ev->action_data);
+ bson_destroy(&dm_ev->action_data);
faultd_event_unref(dm_ev->reason);
faultd_event_cleanup_internal(&dm_ev->event);
free(dm_ev);
faultd_event_serialize_internal(ev, out);
bson_append_string(out, DM_EV_WHO, dm_ev->who_made);
bson_append_string(out, DM_EV_ACTION, dm_ev->action);
- if (dm_ev->action_data != NULL)
- bson_append_string(out, DM_EV_ACTION_DATA, (char*)dm_ev->action_data); /* FIXME */
+ bson_append_bson(out, DM_EV_ACTION_DATA, &dm_ev->action_data);
}
static struct faultd_event_type decision_made_event_type = {
#define FAULTD_DECISION_MADE_EVENT_H
#include <time.h>
+#include <ejdb/bson.h>
#include "action.h"
#include "event.h"
struct faultd_event *reason;
char *who_made;
char *action;
- void *action_data;
- void (*action_data_release)(void *);
+ bson action_data;
/* TODO: what more do we need? */
};
/* Strings are deep copied */
char *who_made;
char *action;
- /* Action data is shallow copied */
- void *action_data;
- void (*action_data_release)(void *);
+
+ bson action_data;
};
#define to_decision_made_event(EVENT) \