CVSROOT:        /cvs/cluster
Module name:    conga
Changes by:     [EMAIL PROTECTED]       2007-09-18 18:46:35

Modified files:
        ricci/modules/log: LogParser.cpp LogParser.h LoggingModule.cpp 
                           LoggingModule.h main.cpp 

Log message:
        Cleanup and minor optimization

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/log/LogParser.cpp.diff?cvsroot=cluster&r1=1.10&r2=1.11
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/log/LogParser.h.diff?cvsroot=cluster&r1=1.4&r2=1.5
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/log/LoggingModule.cpp.diff?cvsroot=cluster&r1=1.4&r2=1.5
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/log/LoggingModule.h.diff?cvsroot=cluster&r1=1.2&r2=1.3
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/log/main.cpp.diff?cvsroot=cluster&r1=1.4&r2=1.5

--- conga/ricci/modules/log/LogParser.cpp       2007/09/11 02:45:28     1.10
+++ conga/ricci/modules/log/LogParser.cpp       2007/09/18 18:46:35     1.11
@@ -1,431 +1,470 @@
 /*
-  Copyright Red Hat, Inc. 2006
-
-  This program is free software; you can redistribute it and/or modify it
-  under the terms of the GNU General Public License as published by the
-  Free Software Foundation; either version 2, or (at your option) any
-  later version.
-
-  This program is distributed in the hope that it will be useful, but
-  WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-  General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program; see the file COPYING.  If not, write to the
-  Free Software Foundation, Inc.,  675 Mass Ave, Cambridge,
-  MA 02139, USA.
+** Copyright Red Hat, Inc. 2006-2007
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License version 2 as
+** published by the Free Software Foundation.
+**
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+** General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; see the file COPYING. If not, write to the
+** Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+** MA 02139, USA.
 */
 /*
  * Author: Stanko Kupcevic <[EMAIL PROTECTED]>
  */
 
-
 #include "LogParser.h"
 #include "utils.h"
 #include "Mutex.h"
 
+#include <unistd.h>
+#include <errno.h>
 #include <time.h>
-#include <sys/types.h>
 #include <dirent.h>
+#include <sys/types.h>
 #include <sys/stat.h>
-#include <unistd.h>
 
 #include <fstream>
-
 #include <iostream>
 
 using namespace std;
 
+static const char *cluster[] = {
+       "cluster",
+       "modclusterd",
+       "dlm",
+       "gulm",
+       "lock_gulmd",
+       "lock_gulmd_main",
+       "lock_gulmd_core",
+       "lock_gulmd_LT",
+       "lock_gulmd_LTPX",
+       "cman",
+       "cman_tool",
+       "ccs",
+       "ccs_tool",
+       "ccsd",
+       "fence",
+       "fenced",
+       "clvmd",
+       "gfs",
+       "gfs2",
+       "openais",
+       "groupd",
+       "qdiskd",
+       "dlm_controld",
+       "gfs_controld",
+       "clurgmgrd",
+       "rgmanager"
+};
 
+static const char *cluster_service_manager[] = {
+       "clurgmgrd",
+       "rgmanager"
+};
 
-static const char* cluster[] = {"cluster",
-                               "modclusterd",
-                               "dlm",
-                               "gulm",
-                               "lock_gulmd",
-                               "lock_gulmd_main",
-                               "lock_gulmd_core",
-                               "lock_gulmd_LT",
-                               "lock_gulmd_LTPX",
-                               "cman",
-                               "cman_tool",
-                               "ccs",
-                               "ccs_tool",
-                               "ccsd",
-                               "fence",
-                               "fenced",
-                               "clvmd",
-                               "gfs",
-                               "gfs2",
-                               "openais",
-                               "groupd",
-                               "qdiskd",
-                               "dlm_controld",
-                               "gfs_controld",
-                               "clurgmgrd",
-                               "rgmanager"};
-
-static const char* cluster_service_manager[] = {"clurgmgrd",
-                                               "rgmanager"};
-
-static const char* LVS[] = {"ipvs",
-                           "ipvsadm",
-                           "piranha",
-                           "piranha-gui"};
-
-static const char* storage[] = {"gfs",
-                               "gfs2",
-                               "lvm",
-                               "clvm",
-                               "clvmd",
-                               "end_request",
-                               "buffer",
-                               "scsi",
-                               "md",
-                               "raid0",
-                               "raid1",
-                               "raid4",
-                               "raid5",
-                               "cdrom",
-                               "ext2",
-                               "ext3",
-                               "ext3-fs",
-                               "swap",
-                               "mount",
-                               "automount"};
-
-static const char* selinux[] = {"selinux",
-                               "security",
-                               "pam",
-                               "audit"};
-
-
-
+static const char *LVS[] = {
+       "ipvs",
+       "ipvsadm",
+       "piranha",
+       "piranha-gui"
+};
 
+static const char *storage[] = {
+       "gfs",
+       "gfs2",
+       "lvm",
+       "clvm",
+       "clvmd",
+       "end_request",
+       "buffer",
+       "scsi",
+       "md",
+       "raid0",
+       "raid1",
+       "raid4",
+       "raid5",
+       "cdrom",
+       "ext2",
+       "ext3",
+       "ext3-fs",
+       "swap",
+       "mount",
+       "automount"
+};
 
+static const char *selinux[] = {
+       "selinux",
+       "security",
+       "pam",
+       "audit"
+};
 
 class tag_set
 {
 public:
-  tag_set(const String& name,
-         const set<String>& elements) :
-    name(name),
-    elements(elements) {}
-
-  String name;
-  set<String> elements;
-  set<String> match;
+       tag_set(const String& name, const set<String>& elements) :
+               name(name),
+               elements(elements) {}
+
+       String name;
+       set<String> elements;
+       set<String> match;
 };
 
-
 static const vector<tag_set>&
 get_sets()
 {
-  static vector<tag_set> sets;
-  static Mutex mutex;
-  static bool init = false;
-
-  MutexLocker l(mutex);
-  if (!init) {
-    init = true;
-    tag_set clu("cluster",
-               set<String>(cluster,
-                           cluster + sizeof(cluster)/sizeof(char*)));
-    clu.match.insert("fence_");
-    sets.push_back(clu);
-
-    sets.push_back(tag_set("cluster service manager",
-                          set<String>(cluster_service_manager,
-                                      cluster_service_manager + 
sizeof(cluster_service_manager)/sizeof(char*))));
-
-    sets.push_back(tag_set("lvs",
-                          set<String>(LVS,
-                                      LVS + sizeof(LVS)/sizeof(char*))));
-
-    sets.push_back(tag_set("storage",
-                          set<String>(storage,
-                                      storage + 
sizeof(storage)/sizeof(char*))));
-
-    tag_set SEL("selinux",
-               set<String>(selinux,
-                           selinux + sizeof(selinux)/sizeof(char*)));
-    SEL.match.insert("pam_");
-    sets.push_back(SEL);
-  }
-  return sets;
-}
+       static vector<tag_set> sets;
+       static Mutex mutex;
+       static bool init = false;
+
+       MutexLocker l(mutex);
+       if (!init) {
+               init = true;
+               tag_set clu("cluster",
+                       set<String>(cluster, cluster + arr_elem(cluster)));
+               clu.match.insert("fence_");
+               sets.push_back(clu);
+
+               sets.push_back(tag_set("cluster service manager",
+                       set<String>(cluster_service_manager,
+                               cluster_service_manager + 
arr_elem(cluster_service_manager))));
+
+               sets.push_back(tag_set("lvs", set<String>(LVS, LVS + 
arr_elem(LVS))));
+
+               sets.push_back(tag_set("storage",
+                       set<String>(storage, storage + arr_elem(storage))));
+
+               tag_set SEL("selinux",
+                       set<String>(selinux, selinux + arr_elem(selinux)));
+               SEL.match.insert("pam_");
+               sets.push_back(SEL);
+       }
 
+       return sets;
+}
 
 
 static time_t
 parse_time(const String& time_rep)
 {
-  struct tm tm;
-  if (!strptime(time_rep.c_str(), "%b %d %T %Y", &tm))
-    throw String("invalid log entry format");
-  return mktime(&tm);
+       struct tm tm;
+       if (!strptime(time_rep.c_str(), "%b %d %T %Y", &tm))
+               throw String("invalid log entry format");
+       return mktime(&tm);
 }
 
-
 set<String>&
-get_files(const String& path_,
-         set<String>& files,
-          time_t age_time)
+get_files(const String& path_, set<String>& files, time_t age_time)
 {
-  String path = utils::rstrip(utils::strip(path_), "/");
-  if (path.empty() || path.find_first_of(" ; & $ ` ? > < ' \" ; | \\ * \n \t") 
!= path.npos)
-    return files;
-  if (path[0] != '/')
-    return files;
-
-  struct stat st;
-  if (stat(path.c_str(), &st))
-    //    throw String("unable to stat ") + path;
-    return files;
-  if (S_ISREG(st.st_mode)) {
-    if (st.st_mtime >= age_time)
-      files.insert(path);
-
-    // get rotated logs
-    for (int i=0; i<25; i++)
-      get_files(path + "." + utils::to_string(i), files, age_time);
-
-    return files;
-  } else if (S_ISDIR(st.st_mode))
-    ; // process directory
-  else
-    return files;
-
-  DIR* d = opendir(path.c_str());
-  if (d == NULL)
-    throw String("unable to open directory ") + path;
-  try {
-    while (true) {
-      struct dirent* ent = readdir(d);
-      if (ent == NULL) {
-       closedir(d);
-       return files;
-      }
-      String kid_path = ent->d_name;
-      if (kid_path == "." || kid_path == "..")
-       continue;
-      kid_path = path + "/" + kid_path;
-      get_files(kid_path, files, age_time);
-    }
-  } catch ( ... ) {
-    closedir(d);
-    throw;
-  }
-}
-
+       String path = utils::rstrip(utils::strip(path_), "/");
+       if (path.empty() ||
+               path.find_first_of(" ; & $ ` ? > < ' \" ; | \\ * \n \t") != 
path.npos)
+       {
+               return files;
+       }
 
+       if (path[0] != '/')
+               return files;
 
+       struct stat st;
+       if (stat(path.c_str(), &st))
+               return files;
+
+       if (S_ISREG(st.st_mode)) {
+               if (st.st_mtime >= age_time)
+                       files.insert(path);
+
+               // get rotated logs
+               for (int i = 0 ; i < 25 ; i++)
+                       get_files(path + "." + utils::to_string(i), files, 
age_time);
+
+               return files;
+       } else if (S_ISDIR(st.st_mode))
+               ; // process directory
+       else
+               return files;
+
+       DIR *d = opendir(path.c_str());
+       if (d == NULL) {
+               throw String("unable to open directory ")
+                               + path + ":" + String(strerror(errno));
+       }
 
+       try {
+               while (true) {
+                       struct dirent *ent = readdir(d);
+                       if (ent == NULL) {
+                               closedir(d);
+                               return files;
+                       }
+
+                       String kid_path = ent->d_name;
+                       if (kid_path == "." || kid_path == "..")
+                               continue;
+
+                       kid_path = path + "/" + kid_path;
+                       get_files(kid_path, files, age_time);
+               }
+       } catch ( ... ) {
+               closedir(d);
+               throw;
+       }
+}
 
 LogEntry::LogEntry(const String& entry)
 {
-  vector<String> words = utils::split(entry);
-  if (words.size() < 6)
-    throw String("invalid log entry format");
-  if (words[4] == "last" &&
-      words[5] == "message")
-    throw String("LogEntry: last message repetition");
-  if (words[5] == "printk:" &&
-      entry.find("suppressed") != entry.npos)
-    throw String("LogEntry: printk repetition");
-
-  // get current year (not present in log files)
-  char buff[100];
-  time_t current_time = ::time(0);
-  struct tm tm;
-  localtime_r(&current_time, &tm);
-  if (strftime(buff, sizeof(buff), "%Y", &tm) != 4)
-    throw String("failed to get current year");
-  String year(buff, 4);
-  String time_rep = words[0] + " " + words[1] + " " + words[2] + " " + year;
-  age = (long long) difftime(current_time, parse_time(time_rep));
-  if (age < 0) {
-    // beginning of the year fix, since year is not present in log files
-    // FIXME: works only for log files shorter than 2 years
-    year = utils::to_string(utils::to_long(year) - 1);
-    time_rep = words[0] + " " + words[1] + " " + words[2] + " " + year;
-    age = (long long) difftime(current_time, parse_time(time_rep));
-  }
-  if (age < 0)
-    throw String("error in LogEntry() - negative age");
-
-  // domain & pid
-  String d = utils::rstrip(utils::to_lower(words[4]), ":");
-  String::size_type i = d.find("[");
-  domain = d.substr(0, i);
-  tags.insert(domain);
-  if (i != d.npos) {
-    pid = utils::strip(d.substr(i));
-    pid = utils::lstrip(pid, "[");
-    pid = utils::rstrip(pid, "]");
-    tags.insert(pid);
-  }
-  vector<String>::size_type idx = 5;
-  if (domain == "kernel") {
-    domain = utils::rstrip(utils::to_lower(words[5]), ":");
-    tags.insert(domain);
-    if (words[5][words[5].size()-1] == ':')
-      idx = 6;
-  }
-
-  // message
-  for ( ; idx<words.size(); idx++)
-    msg += words[idx] + " ";
-  msg = utils::strip(msg);
-
-  // tags (misc)
-  for (vector<String>::size_type j=4; j<6; j++) {
-    String t(utils::strip(utils::to_lower(words[j])));
-    if (t.empty())
-      continue;
-    if (t[t.size()-1] != ':')
-      continue;
-    t = utils::rstrip(t, ":");
-    tags.insert(t);
-    if ((i = t.find("(")) != t.npos) {
-      tags.insert(utils::strip(t.substr(0, i)));
-      String tmp_tag = utils::strip(t.substr(i));
-      tmp_tag = tmp_tag.substr(0, tmp_tag.find(")"));
-      tmp_tag = utils::lstrip(tmp_tag, "(");
-      tmp_tag = utils::rstrip(tmp_tag, ")");
-      tags.insert(tmp_tag);
-    }
-    if ((i = t.find("[")) != t.npos) {
-      tags.insert(utils::strip(t.substr(0, i)));
-      String tmp_tag = utils::strip(t.substr(i));
-      tmp_tag = tmp_tag.substr(0, tmp_tag.find("]"));
-      tmp_tag = utils::lstrip(tmp_tag, "[");
-      tmp_tag = utils::rstrip(tmp_tag, "]");
-      tags.insert(tmp_tag);
-    }
-  }
-
-  // tags (from tag sets)
-  vector<tag_set> sets = get_sets();
-  set<String> tags_c(tags);
-  for (set<String>::const_iterator iter = tags_c.begin();
-       iter != tags_c.end();
-       iter++)
-    for (vector<tag_set>::const_iterator ts_iter = sets.begin();
-        ts_iter != sets.end();
-        ts_iter++) {
-      if (ts_iter->elements.find(*iter) != ts_iter->elements.end())
-       tags.insert(ts_iter->name);
-      for (set<String>::const_iterator m_iter = ts_iter->match.begin();
-          m_iter != ts_iter->match.end();
-          m_iter++)
-       if (iter->find(*m_iter) == 0)
-         tags.insert(ts_iter->name);
-    }
-  if (tags.find("") != tags.end())
-    tags.erase("");
+       vector<String> words = utils::split(entry);
+       if (words.size() < 6)
+               throw String("invalid log entry format");
+
+       if (words[4] == "last" &&
+               words[5] == "message")
+       {
+               throw String("LogEntry: last message repetition");
+       }
+
+       if (words[5] == "printk:" &&
+               entry.find("suppressed") != entry.npos)
+       {
+               throw String("LogEntry: printk repetition");
+       }
+
+       // get current year (not present in log files)
+       char buff[64];
+       time_t current_time = ::time(NULL);
+       struct tm tm;
+
+       localtime_r(&current_time, &tm);
+       if (strftime(buff, sizeof(buff), "%Y", &tm) != 4)
+               throw String("failed to get current year");
+       String year(buff, 4);
+       String time_rep = words[0] + " " + words[1] + " " + words[2] + " " + 
year;
+       age = (long long) difftime(current_time, parse_time(time_rep));
+
+       if (age < 0) {
+               // beginning of the year fix, since year is not present in log 
files
+               // FIXME: works only for log files shorter than 2 years
+               year = utils::to_string(utils::to_long(year) - 1);
+               time_rep = words[0] + " " + words[1] + " " + words[2] + " " + 
year;
+               age = (long long) difftime(current_time, parse_time(time_rep));
+       }
+
+       if (age < 0)
+               throw String("error in LogEntry() - negative age");
+
+       // domain & pid
+       String d = utils::rstrip(utils::to_lower(words[4]), ":");
+       String::size_type i = d.find("[");
+       domain = d.substr(0, i);
+       tags.insert(domain);
+
+       if (i != d.npos) {
+               pid = utils::strip(d.substr(i));
+               pid = utils::lstrip(pid, "[");
+               pid = utils::rstrip(pid, "]");
+               tags.insert(pid);
+       }
+
+       vector<String>::size_type idx = 5;
+       if (domain == "kernel") {
+               domain = utils::rstrip(utils::to_lower(words[5]), ":");
+               tags.insert(domain);
+
+               if (words[5][words[5].size() - 1] == ':')
+                       idx = 6;
+       }
+
+       // message
+       for ( ; idx < words.size() ; idx++)
+               msg += words[idx] + " ";
+       msg = utils::strip(msg);
+
+       // tags (misc)
+       for (vector<String>::size_type j = 4 ; j < 6 ; j++) {
+               String t(utils::strip(utils::to_lower(words[j])));
+
+               if (t.empty())
+                       continue;
+
+               if (t[t.size() - 1] != ':')
+                       continue;
+
+               t = utils::rstrip(t, ":");
+               tags.insert(t);
+
+               if ((i = t.find("(")) != t.npos) {
+                       tags.insert(utils::strip(t.substr(0, i)));
+                       String tmp_tag = utils::strip(t.substr(i));
+                       tmp_tag = tmp_tag.substr(0, tmp_tag.find(")"));
+                       tmp_tag = utils::lstrip(tmp_tag, "(");
+                       tmp_tag = utils::rstrip(tmp_tag, ")");
+                       tags.insert(tmp_tag);
+               }
+
+               if ((i = t.find("[")) != t.npos) {
+                       tags.insert(utils::strip(t.substr(0, i)));
+                       String tmp_tag = utils::strip(t.substr(i));
+                       tmp_tag = tmp_tag.substr(0, tmp_tag.find("]"));
+                       tmp_tag = utils::lstrip(tmp_tag, "[");
+                       tmp_tag = utils::rstrip(tmp_tag, "]");
+                       tags.insert(tmp_tag);
+               }
+       }
+
+       // tags (from tag sets)
+       vector<tag_set> sets = get_sets();
+       set<String> tags_c(tags);
+
+       for (set<String>::const_iterator
+                       iter = tags_c.begin() ;
+                       iter != tags_c.end() ;
+                       iter++)
+       {
+               for (vector<tag_set>::const_iterator
+                               ts_iter = sets.begin() ;
+                               ts_iter != sets.end() ;
+                               ts_iter++)
+               {
+                       if (ts_iter->elements.find(*iter) != 
ts_iter->elements.end())
+                               tags.insert(ts_iter->name);
+
+                       for (set<String>::const_iterator
+                                       m_iter = ts_iter->match.begin() ;
+                                       m_iter != ts_iter->match.end() ;
+                                       m_iter++)
+                       {
+                               if (iter->find(*m_iter) == 0)
+                                       tags.insert(ts_iter->name);
+                       }
+               }
+       }
+
+       if (tags.find("") != tags.end())
+               tags.erase("");
 }
 
 String
 LogEntry::compare_str() const
 {
-  String b(utils::to_string(age));
-  b += domain + pid + msg;
-  return b;
+       String b(utils::to_string(age));
+       b += domain + pid + msg;
+       return b;
 }
 
 bool
 LogEntry::operator < (const LogEntry& obj) const
 {
-  return compare_str() < obj.compare_str();
+       return compare_str() < obj.compare_str();
 }
 
 XMLObject
 LogEntry::xml() const
 {
-  XMLObject x("logentry");
-  x.set_attr("domain", domain);
-  x.set_attr("pid", pid);
-  x.set_attr("age", utils::to_string(age));
-  x.set_attr("msg", msg);
-
-  for (set<String>::const_iterator iter = matched_tags.begin();
-       iter != matched_tags.end();
-       iter++) {
-    XMLObject t("match");
-    t.set_attr("tag", *iter);
-    x.add_child(t);
-  }
+       XMLObject x("logentry");
+       x.set_attr("domain", domain);
+       x.set_attr("pid", pid);
+       x.set_attr("age", utils::to_string(age));
+       x.set_attr("msg", msg);
+
+       for (set<String>::const_iterator
+                       iter = matched_tags.begin() ;
+                       iter != matched_tags.end() ;
+                       iter++)
+       {
+               XMLObject t("match");
+               t.set_attr("tag", *iter);
+               x.add_child(t);
+       }
 
-  return x;
+       return x;
 }
 
-
-
-
-
-
-
 set<LogEntry>
-LogParser::get_entries(long long age,
-                      const std::list<String>& domains,
-                      const list<String>& paths)
+LogParser::get_entries(        long long age,
+                                               const std::list<String>& 
domains,
+                                               const list<String>& paths)
 {
-  set<LogEntry> ret;
-  time_t age_time = time(NULL);
+       set<LogEntry> ret;
+       time_t age_time = time(NULL);
+
+       if ((long long) age_time - age < 0)
+               age_time = 0;
+       else
+               age_time -= age;
+
+
+       // set of requested tags
+       set<String> req_tags(domains.begin(), domains.end());
+
+       // get log paths
+       set<String> files;
+
+       for (list<String>::const_iterator
+                       iter = paths.begin() ;
+                       iter != paths.end() ;
+                       iter++)
+       {
+               get_files(*iter, files, age_time);
+       }
 
-  if ((long long) age_time - age < 0)
-    age_time = 0;
-  else
-    age_time -= age;
-
-
-  // set of requested tags
-  set<String> req_tags(domains.begin(), domains.end());
-
-  // get log paths
-  set<String> files;
-  for (list<String>::const_iterator iter = paths.begin();
-       iter != paths.end();
-       iter++)
-    get_files(*iter, files, age_time);
-  if (files.empty()) {
-    get_files("/var/log/messages", files, age_time);
-    get_files("/var/log/syslog", files, age_time);
-  }
-
-  // process log files
-  for (set<String>::const_iterator iter = files.begin();
-       iter != files.end();
-       iter++) {
-    ifstream log(iter->c_str());
-    if (!log.is_open())
-      throw String("failed to open ") + *iter;
-    while (log.good()) {
-      char buff[1024];
-      log.getline(buff, sizeof(buff));
-      try {
-       LogEntry e(buff);
-       if (e.age > age)
-         continue;
-       if (req_tags.empty())
-         ret.insert(e);
-       else {
-         bool add = false;
-         for (set<String>::const_iterator t_iter = req_tags.begin();
-              t_iter != req_tags.end();
-              t_iter++)
-           if (e.tags.find(*t_iter) != e.tags.end()) {
-             add = true;
-             e.matched_tags.insert(*t_iter);
-           }
-         if (add)
-           ret.insert(e);
-       }
-      } catch ( ... ) {}
-    }
-  }
+       if (files.empty()) {
+               get_files("/var/log/messages", files, age_time);
+               get_files("/var/log/syslog", files, age_time);
+       }
+
+       // process log files
+       for (set<String>::const_iterator
+                       iter = files.begin() ;
+                       iter != files.end() ;
+                       iter++)
+       {
+               ifstream log(iter->c_str());
+               if (!log.is_open())
+                       throw String("failed to open ") + *iter;
+
+               while (log.good()) {
+                       char buff[4096];
+
+                       try {
+                               log.getline(buff, sizeof(buff));
+                               LogEntry e(buff);
+
+                               /*
+                               ** Since the log entries' times ascend 
chronologically, we
+                               ** can bail if we hit an entry that's older 
than the max age.
+                               */
+                               if (e.age > age)
+                                       break;
+
+                               if (req_tags.empty())
+                                       ret.insert(e);
+                               else {
+                                       bool add = false;
+                                       for (set<String>::const_iterator
+                                                       t_iter = 
req_tags.begin() ;
+                                                       t_iter != 
req_tags.end() ;
+                                                       t_iter++)
+                                       {
+                                               if (e.tags.find(*t_iter) != 
e.tags.end()) {
+                                                       add = true;
+                                                       
e.matched_tags.insert(*t_iter);
+                                               }
+
+                                               if (add)
+                                                       ret.insert(e);
+                                       }
+                               }
+                       } catch ( ... ) {}
+               }
+       }
 
-  return ret;
+       return ret;
 }
--- conga/ricci/modules/log/LogParser.h 2007/09/11 02:45:28     1.4
+++ conga/ricci/modules/log/LogParser.h 2007/09/18 18:46:35     1.5
@@ -1,28 +1,27 @@
 /*
-  Copyright Red Hat, Inc. 2006
-
-  This program is free software; you can redistribute it and/or modify it
-  under the terms of the GNU General Public License as published by the
-  Free Software Foundation; either version 2, or (at your option) any
-  later version.
-
-  This program is distributed in the hope that it will be useful, but
-  WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-  General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program; see the file COPYING.  If not, write to the
-  Free Software Foundation, Inc.,  675 Mass Ave, Cambridge,
-  MA 02139, USA.
+** Copyright Red Hat, Inc. 2006-2007
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License version 2 as
+** published by the Free Software Foundation.
+**
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+** General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; see the file COPYING. If not, write to the
+** Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+** MA 02139, USA.
 */
+
 /*
  * Author: Stanko Kupcevic <[EMAIL PROTECTED]>
  */
 
-
-#ifndef LogParser_h
-#define LogParser_h
+#ifndef __CONGA_MODLOG_LOGPARSER_H
+#define __CONGA_MODLOG_LOGPARSER_H
 
 #include "XML.h"
 
@@ -30,42 +29,33 @@
 #include <set>
 #include <list>
 
-
 class LogEntry
 {
- public:
-  LogEntry(const String& entry);
-
-  long long age;
-  String domain;
-  String msg;
-  String pid;
-
-  std::set<String> tags;
-  std::set<String> matched_tags;
+       public:
+               LogEntry(const String& entry);
 
-  XMLObject xml() const;
+               long long age;
+               String domain;
+               String msg;
+               String pid;
 
-  bool operator < (const LogEntry&) const;
+               std::set<String> tags;
+               std::set<String> matched_tags;
 
- private:
+               XMLObject xml() const;
 
-  String compare_str() const;
+               bool operator < (const LogEntry&) const;
 
+       private:
+               String compare_str() const;
 };
 
-
-
 class LogParser
 {
- public:
-
-  std::set<LogEntry> get_entries(long long age,
-                                const std::list<String>& tags,
-                                const std::list<String>& paths);
-
-
+       public:
+               std::set<LogEntry> get_entries( long long age,
+                                                                               
const std::list<String>& tags,
+                                                                               
const std::list<String>& paths);
 };
 
-
-#endif  // LogParser_h
+#endif
--- conga/ricci/modules/log/LoggingModule.cpp   2007/09/11 02:45:28     1.4
+++ conga/ricci/modules/log/LoggingModule.cpp   2007/09/18 18:46:35     1.5
@@ -1,136 +1,142 @@
 /*
-  Copyright Red Hat, Inc. 2006
-
-  This program is free software; you can redistribute it and/or modify it
-  under the terms of the GNU General Public License as published by the
-  Free Software Foundation; either version 2, or (at your option) any
-  later version.
-
-  This program is distributed in the hope that it will be useful, but
-  WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-  General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program; see the file COPYING.  If not, write to the
-  Free Software Foundation, Inc.,  675 Mass Ave, Cambridge,
-  MA 02139, USA.
+** Copyright Red Hat, Inc. 2006-2007
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License version 2 as
+** published by the Free Software Foundation.
+**
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+** General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; see the file COPYING. If not, write to the
+** Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+** MA 02139, USA.
 */
+
 /*
  * Author: Stanko Kupcevic <[EMAIL PROTECTED]>
  */
 
-
 #include "LoggingModule.h"
 #include "LogParser.h"
 #include "utils.h"
 
-
 using namespace std;
 
-
 static VarMap get(const VarMap& args);
 
 static ApiFcnMap build_fcn_map();
 
-
 LoggingModule::LoggingModule() :
-  Module(build_fcn_map())
+       Module(build_fcn_map())
 {}
 
 LoggingModule::~LoggingModule()
 {}
 
-
 ApiFcnMap
 build_fcn_map()
 {
-  FcnMap   api_1_0;
-  api_1_0["get"]     = get;
+       FcnMap api_1_0;
+       api_1_0["get"] = get;
 
-  ApiFcnMap   api_fcn_map;
-  api_fcn_map["1.0"] = api_1_0;
+       ApiFcnMap api_fcn_map;
+       api_fcn_map["1.0"] = api_1_0;
 
-  return api_fcn_map;
+       return api_fcn_map;
 }
 
-
 VarMap
 get(const VarMap& args)
 {
-  long long age;
-  list<String> tags;
-  list<String> paths;
-  bool intersection = false;
-  try {
-    VarMap::const_iterator iter = args.find("age");
-    if (iter == args.end())
-      throw APIerror("missing age variable");
-    age = iter->second.get_int();
-
-    iter = args.find("tags");
-    if (iter != args.end())
-      tags = iter->second.get_list_str();
-
-    iter = args.find("paths");
-    if (iter != args.end())
-      paths = iter->second.get_list_str();
-
-    iter = args.find("intersection");
-    if (iter != args.end())
-      intersection = iter->second.get_bool();
-  } catch ( String e ) {
-    throw APIerror(e);
-  }
-
-  // clean up
-
-  list<String> t;
-  for (list<String>::const_iterator iter = tags.begin();
-       iter != tags.end();
-       iter++) {
-    String s(utils::strip(utils::to_lower(*iter)));
-    if (s.size())
-      t.push_back(s);
-  }
-  tags.swap(t); t.clear();
-  for (list<String>::const_iterator iter = paths.begin();
-       iter != paths.end();
-       iter++) {
-    String s(utils::strip(*iter));
-    if (s.size())
-      t.push_back(s);
-  }
-  paths.swap(t);
-
-  // command
-
-  set<LogEntry> entries = LogParser().get_entries(age,
-                                                 tags,
-                                                 paths);
-  // union or intersection?
-  if (intersection) {
-    // LogParser::get returns union
-    set<LogEntry> intersect;
-    for (set<LogEntry>::const_iterator iter = entries.begin();
-        iter != entries.end();
-        iter++)
-      if (iter->matched_tags.size() == tags.size())
-       intersect.insert(*iter);
-    entries.swap(intersect);
-  }
-
-  // response
-
-  list<XMLObject> result_list;
-  for (set<LogEntry>::const_iterator iter = entries.begin();
-       iter != entries.end();
-       iter++)
-    result_list.push_back(iter->xml());
-
-  Variable var("log_entries", result_list);
-
-  VarMap ret;
-  ret.insert(pair<String, Variable>(var.name(), var));
-  return ret;
+       long long age;
+       list<String> tags;
+       list<String> paths;
+       bool intersection = false;
+
+       try {
+               VarMap::const_iterator iter = args.find("age");
+               if (iter == args.end())
+                       throw APIerror("missing age variable");
+               age = iter->second.get_int();
+
+               iter = args.find("tags");
+               if (iter != args.end())
+                       tags = iter->second.get_list_str();
+
+               iter = args.find("paths");
+               if (iter != args.end())
+                       paths = iter->second.get_list_str();
+
+               iter = args.find("intersection");
+               if (iter != args.end())
+                       intersection = iter->second.get_bool();
+       } catch ( String e ) {
+               throw APIerror(e);
+       }
+
+       // clean up
+
+       list<String> t;
+       for (list<String>::const_iterator
+               iter = tags.begin() ;
+               iter != tags.end() ;
+               iter++)
+       {
+               String s(utils::strip(utils::to_lower(*iter)));
+               if (s.size())
+                       t.push_back(s);
+       }
+
+       tags.swap(t);
+       t.clear();
+
+       for (list<String>::const_iterator
+                       iter = paths.begin() ;
+                       iter != paths.end() ;
+                       iter++)
+       {
+               String s(utils::strip(*iter));
+               if (s.size())
+                       t.push_back(s);
+       }
+       paths.swap(t);
+
+       // command
+       set<LogEntry> entries = LogParser().get_entries(age, tags, paths);
+
+       // union or intersection?
+       if (intersection) {
+               // LogParser::get returns union
+               set<LogEntry> intersect;
+
+               for (set<LogEntry>::const_iterator
+                               iter = entries.begin() ;
+                               iter != entries.end() ;
+                               iter++)
+               {
+                       if (iter->matched_tags.size() == tags.size())
+                               intersect.insert(*iter);
+               }
+               entries.swap(intersect);
+       }
+
+       // response
+       list<XMLObject> result_list;
+       for (set<LogEntry>::const_iterator
+                       iter = entries.begin() ;
+                       iter != entries.end() ;
+                       iter++)
+       {
+               result_list.push_back(iter->xml());
+       }
+
+       Variable var("log_entries", result_list);
+
+       VarMap ret;
+       ret.insert(pair<String, Variable>(var.name(), var));
+       return ret;
 }
--- conga/ricci/modules/log/LoggingModule.h     2007/09/11 02:45:28     1.2
+++ conga/ricci/modules/log/LoggingModule.h     2007/09/18 18:46:35     1.3
@@ -1,41 +1,37 @@
 /*
-  Copyright Red Hat, Inc. 2006
-
-  This program is free software; you can redistribute it and/or modify it
-  under the terms of the GNU General Public License as published by the
-  Free Software Foundation; either version 2, or (at your option) any
-  later version.
-
-  This program is distributed in the hope that it will be useful, but
-  WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-  General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program; see the file COPYING.  If not, write to the
-  Free Software Foundation, Inc.,  675 Mass Ave, Cambridge,
-  MA 02139, USA.
+** Copyright Red Hat, Inc. 2006-2007
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License version 2 as
+** published by the Free Software Foundation.
+**
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+** General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; see the file COPYING. If not, write to the
+** Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+** MA 02139, USA.
 */
+
 /*
  * Author: Stanko Kupcevic <[EMAIL PROTECTED]>
  */
 
-
-#ifndef LoggingModule_h
-#define LoggingModule_h
+#ifndef __CONGA_MODLOG_LOGGINGMODLE_H
+#define __CONGA_MODLOG_LOGGINGMODLE_H
 
 #include "Module.h"
 
-
 class LoggingModule : public Module
 {
- public:
-  LoggingModule();
-  virtual ~LoggingModule();
-
- private:
+       public:
+               LoggingModule();
+               virtual ~LoggingModule();
 
+       private:
 };
 
-
-#endif  // LoggingModule_h
+#endif
--- conga/ricci/modules/log/main.cpp    2007/09/11 02:45:28     1.4
+++ conga/ricci/modules/log/main.cpp    2007/09/18 18:46:35     1.5
@@ -1,21 +1,21 @@
 /*
-  Copyright Red Hat, Inc. 2005
-
-  This program is free software; you can redistribute it and/or modify it
-  under the terms of the GNU General Public License as published by the
-  Free Software Foundation; either version 2, or (at your option) any
-  later version.
-
-  This program is distributed in the hope that it will be useful, but
-  WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-  General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program; see the file COPYING.  If not, write to the
-  Free Software Foundation, Inc.,  675 Mass Ave, Cambridge,
-  MA 02139, USA.
+** Copyright Red Hat, Inc. 2006-2007
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License version 2 as
+** published by the Free Software Foundation.
+**
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+** General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; see the file COPYING. If not, write to the
+** Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+** MA 02139, USA.
 */
+
 /*
  * Author: Stanko Kupcevic <[EMAIL PROTECTED]>
  */
@@ -24,18 +24,17 @@
 #include "LoggingModule.h"
 
 #include <iostream>
+
 using namespace std;
 
 int
-main(int argc, char** argv)
+main(int argc, char **argv)
 {
-  try {
-    LoggingModule m;
-    return stdin_out_module_driver(m,
-                                  argc,
-                                  argv);
-  } catch (String e) {
-    cerr << e << endl;
-    return 1;
-  }
+       try {
+               LoggingModule m;
+               return stdin_out_module_driver(m, argc, argv);
+       } catch (String e) {
+               cerr << e << endl;
+               return 1;
+       }
 }

Reply via email to