[Cluster-devel] conga/ricci/modules/log LogParser.cpp LogParse ...
rmccabe at sourceware.org
rmccabe at sourceware.org
Tue Sep 18 18:46:36 UTC 2007
CVSROOT: /cvs/cluster
Module name: conga
Changes by: rmccabe at sourceware.org 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 <kupcevic at redhat.com>
*/
-
#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(¤t_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(¤t_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 <kupcevic at redhat.com>
*/
-
-#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 <kupcevic at redhat.com>
*/
-
#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 <kupcevic at redhat.com>
*/
-
-#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 <kupcevic at redhat.com>
*/
@@ -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;
+ }
}
More information about the Cluster-devel
mailing list