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 /tools | |
| parent | 36419b9ca34a89721746950eb78bb78c4bfb6206 (diff) | |
add a last compatible outout format to ck-history
Diffstat (limited to 'tools')
| -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; | 
