/* States - TODO refactor */
if (boost::algorithm::contains(type, "INITIAL HOST STATE")) {
+ if (tokens.size() < 5)
+ return Dictionary::Ptr();
+
log_class = LogClassState;
log_type = LogTypeHostInitialState;
plugin_output = tokens[4];
}
else if (boost::algorithm::contains(type, "CURRENT HOST STATE")) {
+ if (tokens.size() < 5)
+ return Dictionary::Ptr();
+
log_class = LogClassState;
log_type = LogTypeHostCurrentState;
plugin_output = tokens[4];
}
else if (boost::algorithm::contains(type, "HOST ALERT")) {
+ if (tokens.size() < 5)
+ return Dictionary::Ptr();
+
log_class = LogClassAlert;
log_type = LogTypeHostAlert;
plugin_output = tokens[4];
}
else if (boost::algorithm::contains(type, "HOST DOWNTIME ALERT")) {
+ if (tokens.size() < 3)
+ return Dictionary::Ptr();
+
log_class = LogClassAlert;
log_type = LogTypeHostDowntimeAlert;
comment = tokens[2];
}
else if (boost::algorithm::contains(type, "HOST FLAPPING ALERT")) {
+ if (tokens.size() < 3)
+ return Dictionary::Ptr();
+
log_class = LogClassAlert;
log_type = LogTypeHostFlapping;
comment = tokens[2];
}
else if (boost::algorithm::contains(type, "INITIAL SERVICE STATE")) {
+ if (tokens.size() < 6)
+ return Dictionary::Ptr();
+
log_class = LogClassState;
log_type = LogTypeServiceInitialState;
plugin_output = tokens[5];
}
else if (boost::algorithm::contains(type, "CURRENT SERVICE STATE")) {
+ if (tokens.size() < 6)
+ return Dictionary::Ptr();
+
log_class = LogClassState;
log_type = LogTypeServiceCurrentState;
plugin_output = tokens[5];
}
else if (boost::algorithm::contains(type, "SERVICE ALERT")) {
+ if (tokens.size() < 6)
+ return Dictionary::Ptr();
+
log_class = LogClassAlert;
log_type = LogTypeServiceAlert;
plugin_output = tokens[5];
}
else if (boost::algorithm::contains(type, "SERVICE DOWNTIME ALERT")) {
+ if (tokens.size() < 4)
+ return Dictionary::Ptr();
+
log_class = LogClassAlert;
log_type = LogTypeServiceDowntimeAlert;
comment = tokens[3];
}
else if (boost::algorithm::contains(type, "SERVICE FLAPPING ALERT")) {
+ if (tokens.size() < 4)
+ return Dictionary::Ptr();
+
log_class = LogClassAlert;
log_type = LogTypeServiceFlapping;
comment = tokens[3];
}
else if (boost::algorithm::contains(type, "TIMEPERIOD TRANSITION")) {
+ if (tokens.size() < 4)
+ return Dictionary::Ptr();
+
log_class = LogClassState;
log_type = LogTypeTimeperiodTransition;
}
/* Notifications - TODO refactor */
else if (boost::algorithm::contains(type, "HOST NOTIFICATION")) {
+ if (tokens.size() < 6)
+ return Dictionary::Ptr();
+
log_class = LogClassNotification;
log_type = LogTypeHostNotification;
plugin_output = tokens[5];
}
else if (boost::algorithm::contains(type, "SERVICE NOTIFICATION")) {
+ if (tokens.size() < 7)
+ return Dictionary::Ptr();
+
log_class = LogClassNotification;
log_type = LogTypeHostNotification;
}
/* Passive Checks - TODO refactor */
else if (boost::algorithm::contains(type, "PASSIVE HOST CHECK")) {
+ if (tokens.size() < 3)
+ return Dictionary::Ptr();
+
log_class = LogClassPassive;
host_name = tokens[0];
plugin_output = tokens[2];
}
else if (boost::algorithm::contains(type, "PASSIVE SERVICE CHECK")) {
+ if (tokens.size() < 4)
+ return Dictionary::Ptr();
+
log_class = LogClassPassive;
host_name = tokens[0];
return;
}
+ String msg;
+ BOOST_FOREACH(const String& line, lines) {
+ msg += line + "\n";
+ }
+ Log(LogDebug, "livestatus", msg);
+
/* default separators */
m_Separators.push_back("\n");
m_Separators.push_back(";");
Filter::Ptr Query::ParseFilter(const String& params, unsigned long& from, unsigned long& until)
{
+ /*
+ * time >= 1382696656
+ * type = SERVICE FLAPPING ALERT
+ */
std::vector<String> tokens;
- boost::algorithm::split(tokens, params, boost::is_any_of(" "));
+ size_t sp_index;
+ String temp_buffer = params;
+
+ /* extract attr and op */
+ for (int i = 0; i < 2; i++) {
+ sp_index = temp_buffer.FindFirstOf(" ");
+
+ /* 'attr op' or 'attr op val' is valid */
+ if (i < 1 && sp_index == String::NPos)
+ BOOST_THROW_EXCEPTION(std::runtime_error("Livestatus filter '" + params + "' does not contain all required fields."));
+
+ tokens.push_back(temp_buffer.SubStr(0, sp_index));
+ temp_buffer = temp_buffer.SubStr(sp_index + 1);
+ }
+
+ /* add the rest as value */
+ tokens.push_back(temp_buffer);
if (tokens.size() == 2)
tokens.push_back("");
if (tokens.size() < 3)
return Filter::Ptr();
- String op = tokens[1];
bool negate = false;
+ String attr = tokens[0];
+ String op = tokens[1];
+ String val = tokens[2];
if (op == "!=") {
op = "=";
negate = true;
}
- Filter::Ptr filter = boost::make_shared<AttributeFilter>(tokens[0], op, tokens[2]);
+ Filter::Ptr filter = boost::make_shared<AttributeFilter>(attr, op, val);
if (negate)
filter = boost::make_shared<NegateFilter>(filter);
/* pre-filter log time duration */
- if (tokens[0] == "time") {
+ if (attr == "time") {
if (op == "<" || op == "<=") {
- until = Convert::ToLong(tokens[2]);
+ until = Convert::ToLong(val);
} else if (op == ">" || op == ">=") {
- from = Convert::ToLong(tokens[2]);
+ from = Convert::ToLong(val);
}
}
+
+ Log(LogDebug, "livestatus", "Parsed filter with attr: '" + attr + "' op: '" + op + "' val: '" + val + "'.");
return filter;
}
std::vector<Value> objects = table->FilterRows(m_Filter);
std::vector<String> columns;
-
+
if (m_Columns.size() > 0)
columns = m_Columns;
else
BOOST_FOREACH(const Value& object, objects) {
aggregator->Apply(table, object);
}
-
+
stats[index] = aggregator->GetResult();
index++;
}
void Query::ExecuteErrorHelper(const Stream::Ptr& stream)
{
+ Log(LogDebug, "livestatus", "ERROR: Code: '" + Convert::ToString(m_ErrorCode) + "' Message: '" + m_ErrorMessage + "'.");
SendResponse(stream, m_ErrorCode, m_ErrorMessage);
}