summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorWilliam Jon McCann <mccann@jhu.edu>2007-10-19 16:16:18 -0400
committerWilliam Jon McCann <mccann@jhu.edu>2007-10-19 16:16:18 -0400
commit489396ba206bb1e3b82bb504151b0a83d405b33d (patch)
tree4ad7154e057477b961fbc69572bbf6bc51f21036 /tools
parent36419b9ca34a89721746950eb78bb78c4bfb6206 (diff)
add a last compatible outout format to ck-history
Diffstat (limited to 'tools')
-rw-r--r--tools/ck-history.c175
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;