diff options
author | William Jon McCann <mccann@jhu.edu> | 2007-10-19 16:16:18 -0400 |
---|---|---|
committer | William Jon McCann <mccann@jhu.edu> | 2007-10-19 16:16:18 -0400 |
commit | 489396ba206bb1e3b82bb504151b0a83d405b33d (patch) | |
tree | 4ad7154e057477b961fbc69572bbf6bc51f21036 | |
parent | 36419b9ca34a89721746950eb78bb78c4bfb6206 (diff) |
add a last compatible outout format to ck-history
-rw-r--r-- | tools/ck-history.c | 175 |
1 files changed, 169 insertions, 6 deletions
diff --git a/tools/ck-history.c b/tools/ck-history.c index 9584ee1..b917b45 100644 --- a/tools/ck-history.c +++ b/tools/ck-history.c @@ -38,12 +38,14 @@ typedef enum { REPORT_TYPE_SUMMARY = 0, + REPORT_TYPE_LAST_COMPAT, + REPORT_TYPE_LOG, } ReportType; #define DEFAULT_LOG_FILENAME LOCALSTATEDIR "/run/ConsoleKit/history" #define MAX_LINE_LEN 2048 -static GList *events = NULL; +static GList *all_events = NULL; static gboolean process_event_line (const char *line) @@ -56,7 +58,7 @@ process_event_line (const char *line) g_string_free (str, TRUE); if (event != NULL) { - events = g_list_prepend (events, event); + all_events = g_list_prepend (all_events, event); } return TRUE; @@ -95,13 +97,139 @@ process_log_file (const char *filename) } static void -generate_report (void) +generate_report_summary (void) { - GList *l; +} + +static CkLogEvent * +find_first_matching_remove_event (GList *events, + CkLogSeatSessionAddedEvent *event) +{ + CkLogEvent *revent; + GList *l; - events = g_list_reverse (events); + revent = NULL; for (l = events; l != NULL; l = l->next) { + CkLogSeatSessionRemovedEvent *e; + + if (((CkLogEvent *)l->data)->type != CK_LOG_EVENT_SEAT_SESSION_REMOVED) { + continue; + } + e = l->data; + + if (e->session_id != NULL + && event->session_id != NULL + && strcmp (e->session_id, event->session_id) == 0) { + revent = (CkLogEvent *)l->data; + break; + } + } + + return revent; +} + +static char * +get_user_name_for_uid (uid_t uid) +{ + struct passwd *pwent; + char *name; + + name = NULL; + + pwent = getpwuid (uid); + + if (pwent != NULL) { + name = g_strdup (pwent->pw_name); + } + + return name; +} + +static void +generate_report_last_compat (void) +{ + GList *oldest; + CkLogEvent *oldest_event; + GList *l; + + for (l = all_events; l != NULL; l = l->next) { + CkLogEvent *event; + GString *str; + char *username; + char *addedtime; + char *removedtime; + char *duration; + CkLogSeatSessionAddedEvent *e; + CkLogEvent *remove_event; + + event = l->data; + + if (event->type != CK_LOG_EVENT_SEAT_SESSION_ADDED) { + continue; + } + + e = (CkLogSeatSessionAddedEvent *)event; + + str = g_string_new (NULL); + + username = get_user_name_for_uid (e->session_unix_user); + + addedtime = g_strndup (ctime (&event->timestamp.tv_sec), 16); + g_string_printf (str, + "%-8.8s %-12.12s %-16.16s %-16.16s", + username, + e->session_x11_display ? e->session_x11_display: e->session_display_device, + e->session_remote_host_name ? e->session_remote_host_name : "", + addedtime); + g_free (username); + g_free (addedtime); + + remove_event = find_first_matching_remove_event (l, e); + if (remove_event != NULL) { + time_t secs; + int mins; + int hours; + int days; + + removedtime = g_strdup_printf ("- %s", ctime (&remove_event->timestamp.tv_sec) + 11); + removedtime[7] = 0; + secs = remove_event->timestamp.tv_sec - event->timestamp.tv_sec; + mins = (secs / 60) % 60; + hours = (secs / 3600) % 24; + days = secs / 86400; + if (days > 0) { + duration = g_strdup_printf ("(%d+%02d:%02d)", days, hours, mins); + } else { + duration = g_strdup_printf (" (%02d:%02d)", hours, mins); + } + } else { + removedtime = g_strdup (" still"); + duration = g_strdup ("logged in"); + } + + g_string_append_printf (str, + " %-7.7s %-12.12s", + removedtime, + duration); + + g_print ("%s\n", str->str); + g_string_free (str, TRUE); + g_free (removedtime); + g_free (duration); + } + + oldest = g_list_first (all_events); + oldest_event = oldest->data; + g_print ("Log begins %s\n", ctime (&oldest_event->timestamp.tv_sec)); +} + +static void +generate_report_log (void) +{ + GList *l; + + for (l = all_events; l != NULL; l = l->next) { CkLogEvent *event; GString *str; @@ -114,6 +242,28 @@ generate_report (void) } static void +generate_report (int report_type) +{ + + all_events = g_list_reverse (all_events); + + switch (report_type) { + case REPORT_TYPE_SUMMARY: + generate_report_summary (); + break; + case REPORT_TYPE_LAST_COMPAT: + generate_report_last_compat (); + break; + case REPORT_TYPE_LOG: + generate_report_log (); + break; + default: + g_assert_not_reached (); + break; + } +} + +static void free_events (void) { /* FIXME: */ @@ -126,9 +276,14 @@ main (int argc, GOptionContext *context; gboolean retval; GError *error = NULL; + int report_type; static gboolean do_version = FALSE; + static gboolean report_last = FALSE; + static gboolean report_log = FALSE; static GOptionEntry entries [] = { { "version", 'V', 0, G_OPTION_ARG_NONE, &do_version, N_("Version of this application"), NULL }, + { "last", 'l', 0, G_OPTION_ARG_NONE, &report_last, N_("Show listing of last logged in users"), NULL }, + { "log", 'a', 0, G_OPTION_ARG_NONE, &report_log, N_("Show full event log"), NULL }, { NULL } }; @@ -149,8 +304,16 @@ main (int argc, exit (1); } + if (report_last) { + report_type = REPORT_TYPE_LAST_COMPAT; + } else if (report_log) { + report_type = REPORT_TYPE_LOG; + } else { + report_type = REPORT_TYPE_SUMMARY; + } + process_log_file (DEFAULT_LOG_FILENAME); - generate_report (); + generate_report (report_type); free_events (); return 0; |