From 1a545ba0744532f2936899806523214d3a067769 Mon Sep 17 00:00:00 2001 From: William Jon McCann Date: Tue, 29 Jan 2008 14:06:45 -0500 Subject: add support for logging start/stop/restart Also enable reporting this information with ck-history. --- src/ck-log-event.c | 211 +++++++++++++++++++++++++++++++++++++++++++++++++++-- src/ck-log-event.h | 19 ++++- src/ck-manager.c | 59 ++++++++++++++- 3 files changed, 276 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/ck-log-event.c b/src/ck-log-event.c index 5cdaa95..172776e 100644 --- a/src/ck-log-event.c +++ b/src/ck-log-event.c @@ -46,6 +46,25 @@ event_seat_removed_free (CkLogSeatRemovedEvent *event) event->seat_id = NULL; } +static void +event_system_stop_free (CkLogSystemStopEvent *event) +{ + g_assert (event != NULL); +} + +static void +event_system_restart_free (CkLogSystemRestartEvent *event) +{ + g_assert (event != NULL); +} + + +static void +event_system_start_free (CkLogSystemStartEvent *event) +{ + g_assert (event != NULL); +} + static void event_seat_session_added_free (CkLogSeatSessionAddedEvent *event) { @@ -154,6 +173,31 @@ event_seat_removed_copy (CkLogSeatRemovedEvent *event, event_copy->seat_kind = event->seat_kind; } +static void +event_system_stop_copy (CkLogSystemStopEvent *event, + CkLogSystemStopEvent *event_copy) +{ + g_assert (event != NULL); + g_assert (event_copy != NULL); +} + +static void +event_system_restart_copy (CkLogSystemRestartEvent *event, + CkLogSystemRestartEvent *event_copy) +{ + g_assert (event != NULL); + g_assert (event_copy != NULL); +} + + +static void +event_system_start_copy (CkLogSystemStartEvent *event, + CkLogSystemStartEvent *event_copy) +{ + g_assert (event != NULL); + g_assert (event_copy != NULL); +} + static void event_seat_session_added_copy (CkLogSeatSessionAddedEvent *event, CkLogSeatSessionAddedEvent *event_copy) @@ -250,6 +294,18 @@ ck_log_event_copy (CkLogEvent *event) event_seat_removed_copy ((CkLogSeatRemovedEvent *) event, (CkLogSeatRemovedEvent *) event_copy); break; + case CK_LOG_EVENT_SYSTEM_STOP: + event_system_stop_copy ((CkLogSystemStopEvent *) event, + (CkLogSystemStopEvent *) event_copy); + break; + case CK_LOG_EVENT_SYSTEM_RESTART: + event_system_restart_copy ((CkLogSystemRestartEvent *) event, + (CkLogSystemRestartEvent *) event_copy); + break; + case CK_LOG_EVENT_SYSTEM_START: + event_system_start_copy ((CkLogSystemStartEvent *) event, + (CkLogSystemStartEvent *) event_copy); + break; case CK_LOG_EVENT_SEAT_SESSION_ADDED: event_seat_session_added_copy ((CkLogSeatSessionAddedEvent *) event, (CkLogSeatSessionAddedEvent *) event_copy); @@ -288,6 +344,15 @@ ck_log_event_free (CkLogEvent *event) case CK_LOG_EVENT_SEAT_REMOVED: event_seat_removed_free ((CkLogSeatRemovedEvent *) event); break; + case CK_LOG_EVENT_SYSTEM_STOP: + event_system_stop_free ((CkLogSystemStopEvent *) event); + break; + case CK_LOG_EVENT_SYSTEM_RESTART: + event_system_restart_free ((CkLogSystemRestartEvent *) event); + break; + case CK_LOG_EVENT_SYSTEM_START: + event_system_start_free ((CkLogSystemStartEvent *) event); + break; case CK_LOG_EVENT_SEAT_SESSION_ADDED: event_seat_session_added_free ((CkLogSeatSessionAddedEvent *) event); break; @@ -379,6 +444,34 @@ add_log_for_seat_session_removed (GString *str, e->session_creation_time ? e->session_creation_time : ""); } +static void +add_log_for_system_stop (GString *str, + CkLogEvent *event) +{ + CkLogSystemStopEvent *e; + + e = (CkLogSystemStopEvent *)event; +} + +static void +add_log_for_system_restart (GString *str, + CkLogEvent *event) +{ + CkLogSystemRestartEvent *e; + + e = (CkLogSystemRestartEvent *)event; +} + + +static void +add_log_for_system_start (GString *str, + CkLogEvent *event) +{ + CkLogSystemStartEvent *e; + + e = (CkLogSystemStartEvent *)event; +} + static void add_log_for_seat_active_session_changed (GString *str, CkLogEvent *event) @@ -431,6 +524,15 @@ event_type_to_name (CkLogEventType event_type) case CK_LOG_EVENT_SEAT_REMOVED: str = "SEAT_REMOVED"; break; + case CK_LOG_EVENT_SYSTEM_STOP: + str = "SYSTEM_STOP"; + break; + case CK_LOG_EVENT_SYSTEM_RESTART: + str = "SYSTEM_RESTART"; + break; + case CK_LOG_EVENT_SYSTEM_START: + str = "SYSTEM_START"; + break; case CK_LOG_EVENT_SEAT_SESSION_ADDED: str = "SEAT_SESSION_ADDED"; break; @@ -465,6 +567,12 @@ event_name_to_type (const char *event_name, *event_type = CK_LOG_EVENT_SEAT_ADDED; } else if (strcmp (event_name, "SEAT_REMOVED") == 0) { *event_type = CK_LOG_EVENT_SEAT_REMOVED; + } else if (strcmp (event_name, "SYSTEM_STOP") == 0) { + *event_type = CK_LOG_EVENT_SYSTEM_STOP; + } else if (strcmp (event_name, "SYSTEM_RESTART") == 0) { + *event_type = CK_LOG_EVENT_SYSTEM_RESTART; + } else if (strcmp (event_name, "SYSTEM_START") == 0) { + *event_type = CK_LOG_EVENT_SYSTEM_START; } else if (strcmp (event_name, "SEAT_SESSION_ADDED") == 0) { *event_type = CK_LOG_EVENT_SEAT_SESSION_ADDED; } else if (strcmp (event_name, "SEAT_SESSION_REMOVED") == 0) { @@ -507,6 +615,15 @@ ck_log_event_to_string (CkLogEvent *event, case CK_LOG_EVENT_SEAT_REMOVED: add_log_for_seat_removed (str, event); break; + case CK_LOG_EVENT_SYSTEM_STOP: + add_log_for_system_stop (str, event); + break; + case CK_LOG_EVENT_SYSTEM_RESTART: + add_log_for_system_restart (str, event); + break; + case CK_LOG_EVENT_SYSTEM_START: + add_log_for_system_start (str, event); + break; case CK_LOG_EVENT_SEAT_SESSION_ADDED: add_log_for_seat_session_added (str, event); break; @@ -528,7 +645,7 @@ ck_log_event_to_string (CkLogEvent *event, } } -static char * +static const char * skip_header (const char *str, gssize len) { @@ -566,7 +683,7 @@ parse_log_for_seat_added (const GString *str, CkLogEvent *event) { gboolean ret; - char *s; + const char *s; GRegex *re; GMatchInfo *match_info; gboolean res; @@ -626,7 +743,7 @@ parse_log_for_seat_removed (const GString *str, CkLogEvent *event) { gboolean ret; - char *s; + const char *s; GRegex *re; GMatchInfo *match_info; gboolean res; @@ -681,12 +798,81 @@ parse_log_for_seat_removed (const GString *str, return ret; } +static gboolean +parse_log_for_system_stop (const GString *str, + CkLogEvent *event) +{ + gboolean ret; + const char *s; + CkLogSystemStopEvent *e; + + ret = FALSE; + + s = skip_header (str->str, str->len); + if (s == NULL) { + goto out; + } + + e = (CkLogSystemStopEvent *)event; + + ret = TRUE; + out: + + return ret; +} + +static gboolean +parse_log_for_system_restart (const GString *str, + CkLogEvent *event) +{ + gboolean ret; + const char *s; + CkLogSystemRestartEvent *e; + + ret = FALSE; + + s = skip_header (str->str, str->len); + if (s == NULL) { + goto out; + } + + e = (CkLogSystemRestartEvent *)event; + + ret = TRUE; + out: + + return ret; +} + +static gboolean +parse_log_for_system_start (const GString *str, + CkLogEvent *event) +{ + gboolean ret; + const char *s; + CkLogSystemStartEvent *e; + + ret = FALSE; + + s = skip_header (str->str, str->len); + if (s == NULL) { + goto out; + } + + e = (CkLogSystemStartEvent *)event; + + ret = TRUE; + out: + + return ret; +} + static gboolean parse_log_for_seat_session_added (const GString *str, CkLogEvent *event) { gboolean ret; - char *s; + const char *s; GRegex *re; GMatchInfo *match_info; gboolean res; @@ -761,7 +947,7 @@ parse_log_for_seat_session_removed (const GString *str, CkLogEvent *event) { gboolean ret; - char *s; + const char *s; GRegex *re; GMatchInfo *match_info; gboolean res; @@ -836,7 +1022,7 @@ parse_log_for_seat_active_session_changed (const GString *str, CkLogEvent *event) { gboolean ret; - char *s; + const char *s; GRegex *re; GMatchInfo *match_info; gboolean res; @@ -888,7 +1074,7 @@ parse_log_for_seat_device_added (const GString *str, CkLogEvent *event) { gboolean ret; - char *s; + const char *s; GRegex *re; GMatchInfo *match_info; gboolean res; @@ -941,7 +1127,7 @@ parse_log_for_seat_device_removed (const GString *str, CkLogEvent *event) { gboolean ret; - char *s; + const char *s; GRegex *re; GMatchInfo *match_info; gboolean res; @@ -1043,6 +1229,15 @@ ck_log_event_fill_from_string (CkLogEvent *event, case CK_LOG_EVENT_SEAT_REMOVED: res = parse_log_for_seat_removed (str, event); break; + case CK_LOG_EVENT_SYSTEM_STOP: + res = parse_log_for_system_stop (str, event); + break; + case CK_LOG_EVENT_SYSTEM_RESTART: + res = parse_log_for_system_restart (str, event); + break; + case CK_LOG_EVENT_SYSTEM_START: + res = parse_log_for_system_start (str, event); + break; case CK_LOG_EVENT_SEAT_SESSION_ADDED: res = parse_log_for_seat_session_added (str, event); break; diff --git a/src/ck-log-event.h b/src/ck-log-event.h index f5defed..149f49b 100644 --- a/src/ck-log-event.h +++ b/src/ck-log-event.h @@ -29,7 +29,9 @@ typedef enum { CK_LOG_EVENT_START = 0, CK_LOG_EVENT_STOP, - CK_LOG_EVENT_SYSTEM_SHUTDOWN, + CK_LOG_EVENT_SYSTEM_START, + CK_LOG_EVENT_SYSTEM_STOP, + CK_LOG_EVENT_SYSTEM_RESTART, CK_LOG_EVENT_SYSTEM_RUNLEVEL_CHANGED, CK_LOG_EVENT_SEAT_ADDED, CK_LOG_EVENT_SEAT_REMOVED, @@ -40,6 +42,18 @@ typedef enum CK_LOG_EVENT_SEAT_ACTIVE_SESSION_CHANGED, } CkLogEventType; +typedef struct +{ +} CkLogSystemStopEvent; + +typedef struct +{ +} CkLogSystemRestartEvent; + +typedef struct +{ +} CkLogSystemStartEvent; + typedef struct { char *seat_id; @@ -103,6 +117,9 @@ typedef struct typedef struct { union { + CkLogSystemRestartEvent system_start; + CkLogSystemStopEvent system_stop; + CkLogSystemRestartEvent system_restart; CkLogSeatAddedEvent seat_added; CkLogSeatRemovedEvent seat_removed; CkLogSeatSessionAddedEvent seat_session_added; diff --git a/src/ck-manager.c b/src/ck-manager.c index c7c045b..9d9c786 100644 --- a/src/ck-manager.c +++ b/src/ck-manager.c @@ -434,6 +434,50 @@ log_seat_removed_event (CkManager *manager, g_free (sid); } +static void +log_system_stop_event (CkManager *manager) +{ + CkLogEvent event; + gboolean res; + GError *error; + + memset (&event, 0, sizeof (CkLogEvent)); + + event.type = CK_LOG_EVENT_SYSTEM_STOP; + g_get_current_time (&event.timestamp); + + error = NULL; + res = ck_event_logger_queue_event (manager->priv->logger, &event, &error); + if (! res) { + g_debug ("Unable to log event: %s", error->message); + g_error_free (error); + } + + /* FIXME: in this case we should block and wait for log to flush */ +} + +static void +log_system_restart_event (CkManager *manager) +{ + CkLogEvent event; + gboolean res; + GError *error; + + memset (&event, 0, sizeof (CkLogEvent)); + + event.type = CK_LOG_EVENT_SYSTEM_RESTART; + g_get_current_time (&event.timestamp); + + error = NULL; + res = ck_event_logger_queue_event (manager->priv->logger, &event, &error); + if (! res) { + g_debug ("Unable to log event: %s", error->message); + g_error_free (error); + } + + /* FIXME: in this case we should block and wait for log to flush */ +} + static void log_seat_session_added_event (CkManager *manager, CkSeat *seat, @@ -1214,7 +1258,7 @@ get_system_num_users (CkManager *manager) #ifdef ENABLE_RBAC_SHUTDOWN static gboolean -check_rbac_permissions (CkManager *manager, +check_rbac_permissions (CkManager *manager, DBusGMethodInvocation *context) { const char *sender; @@ -1243,10 +1287,11 @@ check_rbac_permissions (CkManager *manager, out: - if (res == TRUE) + if (res == TRUE) { g_debug ("User %s has RBAC permission to stop/restart", username); - else + } else { g_debug ("User %s does not have RBAC permission to stop/restart", username); + } g_free (username); return res; @@ -1287,12 +1332,15 @@ ck_manager_restart (CkManager *manager, #endif #ifdef ENABLE_RBAC_SHUTDOWN - if (!check_rbac_permissions (manager, context)) + if (! check_rbac_permissions (manager, context)) { goto out; + } #endif g_debug ("ConsoleKit preforming Restart: %s", action); + log_system_restart_event (manager); + error = NULL; res = g_spawn_command_line_async (LIBDIR "/ConsoleKit/scripts/ck-system-restart", &error); @@ -1348,6 +1396,9 @@ ck_manager_stop (CkManager *manager, #endif g_debug ("Stopping system"); + + log_system_stop_event (manager); + error = NULL; res = g_spawn_command_line_async (LIBDIR "/ConsoleKit/scripts/ck-system-stop", &error); -- cgit