From 4c842f1e108a0e9a412ac599cc4cfc954d801e62 Mon Sep 17 00:00:00 2001 From: William Jon McCann Date: Mon, 22 Oct 2007 16:14:07 -0400 Subject: add support for reporting from logrotated files --- configure.ac | 30 +++++++++--- src/ck-event-logger.c | 9 +++- tools/Makefile.am | 6 ++- 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 #include +#include #include #include #include #include #include +#include #include #include @@ -66,6 +68,22 @@ process_event_line (const char *line) return TRUE; } +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) { @@ -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 (); -- cgit