From: Łukasz Stelmach Date: Fri, 19 May 2017 15:00:16 +0000 (+0200) Subject: Serialise events to bson format X-Git-Tag: submit/tizen/20170622.101818~18^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=16307b43e65152fde74144bad975370170c88f17;p=platform%2Fcore%2Fsystem%2Ffaultd.git Serialise events to bson format Change-Id: Iebe856156ce6e65e3edcaf79952a633d25a1ea6d Signed-off-by: Łukasz Stelmach --- diff --git a/src/core/event.c b/src/core/event.c index 424e801..5864edd 100644 --- a/src/core/event.c +++ b/src/core/event.c @@ -130,6 +130,9 @@ int faultd_event_init_internal(struct faultd_event_type *ev_type, void faultd_event_serialize_internal(struct faultd_event *ev, bson *out) { - /* call from e.g. .serialize in service_failed_event */ - /* serialize faultd_event structure */ + /* FIXME: check return values of bson_append_XXX */ + bson_append_binary(out, EV_BOOT_ID, BSON_BIN_UUID, (char *)&ev->boot_id, sizeof(ev->boot_id)); + /* FIXME: serialise event_type structure (?) */ + bson_append_string(out, EV_TYPE_NAME, ev->type->name); + faultd_bson_append_timespec(out, EV_TIMESTAMP, &ev->timestamp); } diff --git a/src/core/event.h b/src/core/event.h index a8ced0e..963bb90 100644 --- a/src/core/event.h +++ b/src/core/event.h @@ -29,6 +29,10 @@ #include "notify_queue.h" #include "module.h" +#define EV_BOOT_ID "bid" +#define EV_TIMESTAMP "ts" +#define EV_TYPE_NAME "tn" + struct faultd_event; struct faultd_event_ops { @@ -66,6 +70,7 @@ struct faultd_event { struct list_head node; /* To be used by event processig FW */ struct nqueue_node nq_node; + bson_oid_t oid; }; int faultd_event_type_register(struct faultd_event_type *type); diff --git a/src/core/event_processor.c b/src/core/event_processor.c index 0abc387..8c437af 100644 --- a/src/core/event_processor.c +++ b/src/core/event_processor.c @@ -18,6 +18,7 @@ #include +#include "database.h" #include "event_processor.h" #include "log.h" @@ -132,6 +133,19 @@ FAULTD_MODULE_REGISTER(&event_processor.module); int event_processor_report_event(struct faultd_event *ev) { + bson b; + bson_oid_t oid; + + bson_init(&b); + database_new_oid(&oid); + bson_append_oid(&b, JDBIDKEYNAME, &oid); + faultd_event_serialize(ev, &b); + bson_finish(&b); + + database_store(&b, &ev->oid); + + bson_destroy(&b); + return nqueue_append(&event_processor.pending_events, &ev->nq_node); } diff --git a/src/core/service.c b/src/core/service.c index cf91b51..fe5e318 100644 --- a/src/core/service.c +++ b/src/core/service.c @@ -227,3 +227,10 @@ int systemd_get_unit_by_pid(pid_t pid, const char **name) return 0; } + +void systemd_service_serialize(struct systemd_service *s, bson* out) +{ + bson_append_start_object(out, SYSD_SERVICE); + bson_append_string(out, SYSD_SERVICE_DBUS_PATH, s->dbus_path); + bson_append_finish_object(out); +} diff --git a/src/core/service.h b/src/core/service.h index 3bd409c..a527ad3 100644 --- a/src/core/service.h +++ b/src/core/service.h @@ -19,9 +19,15 @@ #ifndef FAULTD_SERVICE_H #define FAULTD_SERVICE_H +#include #include #include +#include "common.h" + +#define SYSD_SERVICE "sd_sv" +#define SYSD_SERVICE_DBUS_PATH "db_p" + struct systemd_service { char *dbus_path; char *service_type; @@ -32,5 +38,6 @@ int systemd_service_init_by_pid(pid_t pid, struct systemd_service *s); int systemd_service_init(const char *dbus_path, struct systemd_service *s); void systemd_service_cleanup(struct systemd_service *s); int systemd_get_unit_by_pid(pid_t pid, const char **name); +void systemd_service_serialize(struct systemd_service *s, bson *out); #endif /* FAULTD_SERVICE_H */ diff --git a/src/event_types/decision_made_event.c b/src/event_types/decision_made_event.c index 0ee82b3..0493368 100644 --- a/src/event_types/decision_made_event.c +++ b/src/event_types/decision_made_event.c @@ -21,6 +21,7 @@ #include #include +#include "common.h" #include "decision_made_event.h" static int allocate_dm_event(struct faultd_event_type *type, @@ -100,7 +101,14 @@ static void dm_event_serialize(struct faultd_event *ev, bson *out) { struct decision_made_event *dm_ev = to_decision_made_event(ev); + + assert(!BSON_OID_IS_ZERO(dm_ev->reason->oid)); + 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 */ } static struct faultd_event_type decision_made_event_type = { diff --git a/src/event_types/decision_made_event.h b/src/event_types/decision_made_event.h index 16f6a97..e32e8f3 100644 --- a/src/event_types/decision_made_event.h +++ b/src/event_types/decision_made_event.h @@ -26,6 +26,9 @@ #include "common.h" #define DECISION_MADE_EVENT_ID "decision_made" +#define DM_EV_WHO "who" +#define DM_EV_ACTION "act" +#define DM_EV_ACTION_DATA "actd" struct decision_made_event { struct faultd_event event; diff --git a/src/event_types/resource_violation_event.c b/src/event_types/resource_violation_event.c index 9a97fed..c09f542 100644 --- a/src/event_types/resource_violation_event.c +++ b/src/event_types/resource_violation_event.c @@ -86,6 +86,9 @@ static void rv_event_serialize(struct faultd_event *ev, bson *out) struct resource_violation_event *rv_ev = to_resource_violation_event(ev); faultd_event_serialize_internal(ev, out); + systemd_service_serialize(&rv_ev->service, out); + bson_append_time_t(out, RV_EV_DTIME, rv_ev->detection_time); + bson_append_int(out, RV_EV_PID, rv_ev->pid); } static struct faultd_event_type resource_violation_event_type = { diff --git a/src/event_types/resource_violation_event.h b/src/event_types/resource_violation_event.h index 32654b5..870f486 100644 --- a/src/event_types/resource_violation_event.h +++ b/src/event_types/resource_violation_event.h @@ -26,6 +26,8 @@ #include "service.h" #define RESOURCE_VIOLATION_EVENT_ID "resource_violation" +#define RV_EV_DTIME "dt" +#define RV_EV_PID "pid" enum resource_type { FAULTD_RESOURCE_FD, diff --git a/src/event_types/service_failed_event.c b/src/event_types/service_failed_event.c index f989b0a..b05facc 100644 --- a/src/event_types/service_failed_event.c +++ b/src/event_types/service_failed_event.c @@ -84,6 +84,8 @@ static void sf_event_serialize(struct faultd_event *ev, bson *out) struct service_failed_event *sf_ev = to_service_failed_event(ev); faultd_event_serialize_internal(ev, out); + systemd_service_serialize(&sf_ev->service, out); + bson_append_time_t(out, SF_EV_DTIME, sf_ev->detection_time); } static struct faultd_event_type service_failed_event_type = { diff --git a/src/event_types/service_failed_event.h b/src/event_types/service_failed_event.h index 6a53a44..19595ba 100644 --- a/src/event_types/service_failed_event.h +++ b/src/event_types/service_failed_event.h @@ -26,6 +26,7 @@ #include "service.h" #define SERVICE_FAILED_EVENT_ID "service_failed" +#define SF_EV_DTIME "dt" struct service_failed_event { struct faultd_event event; diff --git a/src/util/common.h b/src/util/common.h index 719f007..b874a43 100644 --- a/src/util/common.h +++ b/src/util/common.h @@ -25,6 +25,10 @@ #define ARRAY_SIZE(a) (sizeof(a)/sizeof(*a)) +#define BSON_OID_IS_ZERO(o) (o.ints[0] == 0 && \ + o.ints[1] == 0 && \ + o.ints[2] == 0) + #ifndef offsetof #define offsetof(type, member) __builtin_offsetof(type, member) #endif /* offsetof */