summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilliam Jon McCann <mccann@jhu.edu>2007-10-22 16:14:07 -0400
committerWilliam Jon McCann <mccann@jhu.edu>2007-10-22 16:14:07 -0400
commit4c842f1e108a0e9a412ac599cc4cfc954d801e62 (patch)
tree67197ba2cbba83620ff6b14a09008dfdb4886055
parent7e30b7d07d2f6216b6a8d2f75f3494d3947f0584 (diff)
add support for reporting from logrotated files
-rw-r--r--configure.ac30
-rw-r--r--src/ck-event-logger.c9
-rw-r--r--tools/Makefile.am6
-rw-r--r--tools/ck-history.c128
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 ();