diff options
| author | William Jon McCann <mccann@jhu.edu> | 2007-10-22 16:14:07 -0400 | 
|---|---|---|
| committer | William Jon McCann <mccann@jhu.edu> | 2007-10-22 16:14:07 -0400 | 
| commit | 4c842f1e108a0e9a412ac599cc4cfc954d801e62 (patch) | |
| tree | 67197ba2cbba83620ff6b14a09008dfdb4886055 | |
| parent | 7e30b7d07d2f6216b6a8d2f75f3494d3947f0584 (diff) | |
add support for reporting from logrotated files
| -rw-r--r-- | configure.ac | 30 | ||||
| -rw-r--r-- | src/ck-event-logger.c | 9 | ||||
| -rw-r--r-- | tools/Makefile.am | 6 | ||||
| -rw-r--r-- | tools/ck-history.c | 128 | 
4 files changed, 154 insertions, 19 deletions
diff --git a/configure.ac b/configure.ac index 1de573e..c701912 100644 --- a/configure.ac +++ b/configure.ac @@ -49,16 +49,20 @@ AC_CHECK_FUNCS(getpeerucred getpeereid)  AC_TYPE_UID_T  PKG_CHECK_MODULES(CONSOLE_KIT, -        dbus-glib-1 >= $DBUS_REQUIRED_VERSION -        gobject-2.0 >= $GLIB_REQUIRED_VERSION -        gthread-2.0 >= $GLIB_REQUIRED_VERSION +  dbus-glib-1 >= $DBUS_REQUIRED_VERSION +  gobject-2.0 >= $GLIB_REQUIRED_VERSION +  gthread-2.0 >= $GLIB_REQUIRED_VERSION  )  PKG_CHECK_MODULES(LIBDBUS, -	dbus-1 >= $DBUS_REQUIRED_VERSION +  dbus-1 >= $DBUS_REQUIRED_VERSION  )  PKG_CHECK_MODULES(TOOLS, -        x11 >= $X11_REQUIRED_VERSION -        glib-2.0 >= $GLIB_REQUIRED_VERSION +  x11 >= $X11_REQUIRED_VERSION +  glib-2.0 >= $GLIB_REQUIRED_VERSION +) + +PKG_CHECK_MODULES(HISTORY, +  glib-2.0 >= $GLIB_REQUIRED_VERSION  )  AC_PATH_PROG(GLIB_GENMARSHAL, glib-genmarshal) @@ -123,6 +127,20 @@ else  fi  AC_SUBST(DBUS_SYS_DIR) + +dnl --------------------------------------------------------------------------- +dnl - Check for libz +dnl --------------------------------------------------------------------------- + +have_libz=no +AC_CHECK_LIB(z, compress, +  [AC_CHECK_HEADER(zlib.h, [have_libz=yes], [])], []) +if test "x$have_libz" != "xyes"; then +  AC_MSG_ERROR([Unable to find libz]) +fi +Z_LIBS="${Z_LIBS} -lz" +AC_SUBST(Z_LIBS) +  dnl ---------------------------------------------------------------------------  dnl - PID file  dnl --------------------------------------------------------------------------- diff --git a/src/ck-event-logger.c b/src/ck-event-logger.c index 2d8b9e3..b14bec0 100644 --- a/src/ck-event-logger.c +++ b/src/ck-event-logger.c @@ -177,11 +177,18 @@ write_log_for_event (CkEventLogger *event_logger,          if (event_logger->priv->file != NULL) {                  int rc; +                g_debug ("fd:%d err:%d tell:%ld", +                         fileno (event_logger->priv->file), +                         ferror (event_logger->priv->file), +                         ftell (event_logger->priv->file)); +                  rc = fprintf (event_logger->priv->file, "%s\n", str->str); -                if (rc < 0) { +                if (rc <= 0) {                          g_warning ("Record was not written to disk (%s)",                                     g_strerror (errno));                  } +        } else { +                g_warning ("Log file not open for writing");          }          g_string_free (str, TRUE); diff --git a/tools/Makefile.am b/tools/Makefile.am index ad9e589..61d60cc 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -27,6 +27,7 @@ INCLUDES =							\  	-DDATADIR=\""$(datadir)"\"				\  	-DSYSCONFDIR=\""$(sysconfdir)"\" 			\  	-DLOCALSTATEDIR=\""$(localstatedir)"\" 			\ +	$(HISTORY_CFLAGS)					\  	$(WARN_CFLAGS)						\  	$(DEBUG_CFLAGS)						\  	$(DBUS_CFLAGS)						\ @@ -49,8 +50,9 @@ ck_history_SOURCES =			\  	ck-history.c			\  	$(NULL) -ck_history_LDADD =				\ -	$(CONSOLE_KIT_LIBS)			\ +ck_history_LDADD =			\ +	$(HISTORY_LIBS)			\ +	$(Z_LIBS)			\  	$(top_builddir)/src/libck-event-log.la	\  	$(NULL) diff --git a/tools/ck-history.c b/tools/ck-history.c index a8ef30b..0629bdf 100644 --- a/tools/ck-history.c +++ b/tools/ck-history.c @@ -23,12 +23,14 @@  #include <stdlib.h>  #include <stdio.h> +#include <unistd.h>  #include <sys/types.h>  #include <pwd.h>  #include <string.h>  #include <errno.h>  #include <locale.h> +#include <zlib.h>  #include <glib.h>  #include <glib/gi18n.h> @@ -67,6 +69,22 @@ process_event_line (const char *line)  }  static gboolean +process_log_gzstream (gzFile *fstream) +{ +        char line[MAX_LINE_LEN]; + +        while (gzgets (fstream, line, sizeof (line)) != Z_NULL) { +                if (strlen (line) == sizeof (line) - 1) { +                        g_warning ("Log line truncated"); +                } + +                process_event_line (line); +        } + +        return TRUE; +} + +static gboolean  process_log_stream (FILE *fstream)  {          char line[MAX_LINE_LEN]; @@ -85,17 +103,107 @@ process_log_stream (FILE *fstream)  static gboolean  process_log_file (const char *filename)  { -        FILE *f; - -        f = g_fopen (filename, "r"); -        if (f == NULL) { -                g_warning ("Error opening %s (%s)\n", -                           filename, -                           g_strerror (errno)); -                return FALSE; +        gboolean ret; + +        g_debug ("Processing %s...", filename); + +        if (g_str_has_suffix (filename, ".gz")) { +                gzFile *f; +                f = gzopen (filename, "r"); +                if (f == NULL) { +                        int         errnum; +                        const char *errmsg; +                        errmsg = gzerror (f, &errnum); +                        if (errnum == Z_ERRNO) { +                                errmsg = g_strerror (errno); +                        } +                        g_warning ("Error opening %s (%s)\n", +                                   filename, +                                   errmsg); +                        return FALSE; +                } +                ret = process_log_gzstream (f); +                gzclose (f); +        } else { +                FILE    *f; + +                f = g_fopen (filename, "r"); +                if (f == NULL) { +                        g_warning ("Error opening %s (%s)\n", +                                   filename, +                                   g_strerror (errno)); +                        return FALSE; +                } +                ret = process_log_stream (f); +                fclose (f);          } -        return process_log_stream (f); +        return ret; +} + +static GList * +get_log_file_list (void) +{ +        int      num; +        GList   *files; + +        /* always try the primary file */ +        files = NULL; +        files = g_list_prepend (files, g_strdup (DEFAULT_LOG_FILENAME)); +        num = 1; +        while (1) { +                char *filename; +                filename = g_strdup_printf ("%s.%d", DEFAULT_LOG_FILENAME, num); +                if (g_access (filename, R_OK) != 0) { +                        char *filename_gz; + +                        /* check for .gz */ +                        filename_gz = g_strdup_printf ("%s.gz", filename); +                        g_free (filename); + +                        if (g_access (filename_gz, R_OK) != 0) { +                                g_free (filename_gz); +                                break; +                        } +                        filename = filename_gz; +                } +                num++; +                files = g_list_prepend (files, filename); +        }; + +        return files; +} + +static gboolean +process_logs (void) +{ +        gboolean ret; +        GList   *files; +        GList   *l; + +        ret = FALSE; + +        files = get_log_file_list (); + +        for (l = files; l != NULL; l = l->next) { +                gboolean res; +                char    *filename; + +                filename = l->data; + +                res = process_log_file (filename); +                if (! res) { +                        goto out; +                } +        } + +        ret = TRUE; + + out: +        g_list_foreach (files, (GFunc)g_free, NULL); +        g_list_free (files); + +        return ret;  }  static void @@ -599,7 +707,7 @@ main (int    argc,                  uid = -1;          } -        process_log_file (DEFAULT_LOG_FILENAME); +        process_logs ();          generate_report (report_type, uid, seat);          free_events ();  | 
