diff options
| author | William Jon McCann <mccann@jhu.edu> | 2007-10-21 23:59:32 -0400 | 
|---|---|---|
| committer | William Jon McCann <mccann@jhu.edu> | 2007-10-21 23:59:32 -0400 | 
| commit | e419ced301a9e0d5f98c8cee030fe50158a2d291 (patch) | |
| tree | cf8b51539f16f06911d11c4ff2ba66eed5fb193c /tools | |
| parent | 7880c2eacaa45196b83a9032371f487f6fe312e4 (diff) | |
add last mode, filtering by user/seat; shorten logged ids
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/ck-history.c | 177 | 
1 files changed, 166 insertions, 11 deletions
| diff --git a/tools/ck-history.c b/tools/ck-history.c index b6ee5d2..75ccb56 100644 --- a/tools/ck-history.c +++ b/tools/ck-history.c @@ -38,6 +38,7 @@  typedef enum {          REPORT_TYPE_SUMMARY = 0, +        REPORT_TYPE_LAST,          REPORT_TYPE_LAST_COMPAT,          REPORT_TYPE_LOG,  } ReportType; @@ -97,7 +98,8 @@ process_log_file (const char *filename)  }  static void -generate_report_summary (void) +generate_report_summary (int         uid, +                         const char *seat)  {  } @@ -130,7 +132,7 @@ find_first_matching_remove_event (GList                      *events,  }  static char * -get_user_name_for_uid (uid_t uid) +get_user_name_for_uid (int  uid)  {          struct passwd *pwent;          char          *name; @@ -146,16 +148,38 @@ get_user_name_for_uid (uid_t uid)          return name;  } +static int +get_uid_for_username (const char *username) +{ +        struct passwd *pwent; +        int            uid; + +        g_assert (username != NULL); + +        uid = -1; + +        pwent = getpwnam (username); +        if (pwent != NULL) { +                uid = pwent->pw_uid; +        } + +        return uid; +} +  static char *  get_utline_for_event (CkLogSeatSessionAddedEvent *e)  {          char *utline; +        utline = NULL; +          if (e->session_x11_display != NULL && e->session_x11_display[0] != '\0') {                  utline = g_strdup (e->session_x11_display);          } else {                  if (g_str_has_prefix (e->session_display_device, "/dev/")) {                          utline = g_strdup (e->session_display_device + 5); +                } else { +                        utline = g_strdup (e->session_display_device);                  }          } @@ -163,7 +187,8 @@ get_utline_for_event (CkLogSeatSessionAddedEvent *e)  }  static void -generate_report_last_compat (void) +generate_report_last (int         uid, +                      const char *seat)  {          GList      *oldest;          CkLogEvent *oldest_event; @@ -190,6 +215,111 @@ generate_report_last_compat (void)                  e = (CkLogSeatSessionAddedEvent *)event; + +                if (uid >= 0 && e->session_unix_user != uid) { +                        continue; +                } + +                if (seat != NULL && strcmp (e->seat_id, seat) != 0) { +                        continue; +                } + +                str = g_string_new (NULL); + +                username = get_user_name_for_uid (e->session_unix_user); +                utline = get_utline_for_event (e); + +                addedtime = g_strndup (ctime (&event->timestamp.tv_sec), 16); +                g_string_printf (str, +                                 "%-8.8s %-10.10s %-7.7s %-12.12s %-16.16s %-16.16s", +                                 username, +                                 e->session_id, +                                 e->seat_id, +                                 utline, +                                 e->session_remote_host_name ? e->session_remote_host_name : "", +                                 addedtime); +                g_free (username); +                g_free (addedtime); +                g_free (utline); + +                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); +        if (oldest != NULL) { +                oldest_event = oldest->data; +                g_print ("\nLog begins %s", ctime (&oldest_event->timestamp.tv_sec)); +        } +} + +static void +generate_report_last_compat (int         uid, +                             const char *seat) +{ +        GList      *oldest; +        CkLogEvent *oldest_event; +        GList      *l; + +        /* print events in reverse time order */ + +        for (l = g_list_last (all_events); l != NULL; l = l->prev) { +                CkLogEvent                 *event; +                GString                    *str; +                char                       *username; +                char                       *utline; +                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; + +                if (uid >= 0 && e->session_unix_user != uid) { +                        continue; +                } + +                if (seat != NULL && strcmp (e->seat_id, seat) != 0) { +                        continue; +                } +                  str = g_string_new (NULL);                  username = get_user_name_for_uid (e->session_unix_user); @@ -248,7 +378,8 @@ generate_report_last_compat (void)  }  static void -generate_report_log (void) +generate_report_log (int         uid, +                     const char *seat)  {          GList *l; @@ -265,20 +396,25 @@ generate_report_log (void)  }  static void -generate_report (int report_type) +generate_report (int         report_type, +                 int         uid, +                 const char *seat)  {          all_events = g_list_reverse (all_events);          switch (report_type) {          case REPORT_TYPE_SUMMARY: -                generate_report_summary (); +                generate_report_summary (uid, seat); +                break; +        case REPORT_TYPE_LAST: +                generate_report_last (uid, seat);                  break;          case REPORT_TYPE_LAST_COMPAT: -                generate_report_last_compat (); +                generate_report_last_compat (uid, seat);                  break;          case REPORT_TYPE_LOG: -                generate_report_log (); +                generate_report_log (uid, seat);                  break;          default:                  g_assert_not_reached (); @@ -300,13 +436,20 @@ main (int    argc,          gboolean            retval;          GError             *error = NULL;          int                 report_type; +        int                 uid;          static gboolean     do_version = FALSE;          static gboolean     report_last_compat = FALSE; +        static gboolean     report_last = FALSE;          static gboolean     report_log = FALSE; +        static char        *username = NULL; +        static char        *seat = NULL;          static GOptionEntry entries [] = {                  { "version", 'V', 0, G_OPTION_ARG_NONE, &do_version, N_("Version of this application"), NULL }, -                { "last-compat", 'l', 0, G_OPTION_ARG_NONE, &report_last_compat, N_("Show 'last' compatible listing of last logged in users"), NULL }, -                { "log", 'a', 0, G_OPTION_ARG_NONE, &report_log, N_("Show full event log"), NULL }, +                { "last", 0, 0, G_OPTION_ARG_NONE, &report_last, N_("Show listing of last logged in users"), NULL }, +                { "last-compat", 0, 0, G_OPTION_ARG_NONE, &report_last_compat, N_("Show 'last' compatible listing of last logged in users"), NULL }, +                { "log", 0, 0, G_OPTION_ARG_NONE, &report_log, N_("Show full event log"), NULL }, +                { "seat", 's', 0, G_OPTION_ARG_STRING, &seat, N_("Show entries for the specified seat"), N_("SEAT") }, +                { "user", 'u', 0, G_OPTION_ARG_STRING, &username, N_("Show entries for the specified user"), N_("NAME") },                  { NULL }          }; @@ -329,14 +472,26 @@ main (int    argc,          if (report_last_compat) {                  report_type = REPORT_TYPE_LAST_COMPAT; +        } else if (report_last) { +                report_type = REPORT_TYPE_LAST;          } else if (report_log) {                  report_type = REPORT_TYPE_LOG;          } else {                  report_type = REPORT_TYPE_SUMMARY;          } +        if (username != NULL) { +                uid = get_uid_for_username (username); +                if (uid == -1) { +                        g_warning ("Unknown username: %s", username); +                        exit (1); +                } +        } else { +                uid = -1; +        } +          process_log_file (DEFAULT_LOG_FILENAME); -        generate_report (report_type); +        generate_report (report_type, uid, seat);          free_events ();          return 0; | 
