String objectName = object->GetName();
ExecuteQuery({ "HSET", "icinga:status:" + typeName, objectName, jsonBody });
+
+ /* Icinga DB part for Icinga Web 2 */
+ Checkable::Ptr checkable = dynamic_pointer_cast<Checkable>(object);
+
+ if (checkable) {
+ Dictionary::Ptr attrs = new Dictionary();
+ String tableName;
+ String objectCheckSum = CalculateCheckSumString(objectName, true); //store binary checksum here
+
+ Host::Ptr host;
+ Service::Ptr service;
+
+ tie(host, service) = GetHostService(checkable);
+
+ if (service) {
+ tableName = "servicestate";
+ attrs->Set("service_checksum", objectCheckSum);
+ attrs->Set("host_checksum", CalculateCheckSumString(host->GetName(), true));
+ } else {
+ tableName = "hoststate";
+ attrs->Set("host_checksum", objectCheckSum);
+ }
+
+ attrs->Set("last_check", checkable->GetLastCheck());
+ attrs->Set("next_check", checkable->GetNextCheck());
+
+ attrs->Set("severity", 0); //TODO
+
+/*
+ 'host_checksum' => null,
+ 'command' => null, // JSON, array
+ 'execution_start' => null,
+ 'execution_end' => null,
+ 'schedule_start' => null,
+ 'schedule_end' => null,
+ 'exit_status' => null,
+ 'output' => null,
+ 'performance_data' => null, // JSON, array
+
+
+10.0.3.12:6379> keys icinga:hoststate.*
+1) "icinga:hoststate.~\xf5a\x91+\x03\x97\x99\xb5(\x16 CYm\xb1\xdf\x85\xa2\xcb"
+10.0.3.12:6379> get "icinga:hoststate.~\xf5a\x91+\x03\x97\x99\xb5(\x16 CYm\xb1\xdf\x85\xa2\xcb"
+"{\"command\":[\"\\/usr\\/lib\\/nagios\\/plugins\\/check_ping\",\"-H\",\"127.0.0.1\",\"-c\",\"5000,100%\",\"-w\",\"3000,80%\"],\"execution_start\":1492007581.7624,\"execution_end\":1492007585.7654,\"schedule_start\":1492007581.7609,\"schedule_end\":1492007585.7655,\"exit_status\":0,\"output\":\"PING OK - Packet loss = 0%, RTA = 0.08 ms\",\"performance_data\":[\"rta=0.076000ms;3000.000000;5000.000000;0.000000\",\"pl=0%;80;100;0\"]}"
+
+*/
+
+ CheckResult::Ptr cr = checkable->GetLastCheckResult();
+
+ if (cr) {
+ attrs->Set("command", JsonEncode(cr->GetCommand()));
+ attrs->Set("execution_start", cr->GetExecutionStart());
+ attrs->Set("execution_end", cr->GetExecutionEnd());
+ attrs->Set("schedule_start", cr->GetScheduleStart());
+ attrs->Set("schedule_end", cr->GetScheduleStart());
+ attrs->Set("exit_status", cr->GetExitStatus());
+ attrs->Set("output", cr->GetOutput());
+ attrs->Set("performance_data", JsonEncode(cr->GetPerformanceData()));
+ }
+
+ String jsonAttrs = JsonEncode(attrs);
+ String key = "icinga:" + tableName + "." + objectCheckSum;
+ ExecuteQuery({ "SET", key, jsonAttrs });
+
+ /* expire in check_interval * attempts + timeout + some more seconds */
+ double expireTime = checkable->GetCheckInterval() * checkable->GetMaxCheckAttempts() + 60;
+ ExecuteQuery({ "EXPIRE", key, String(expireTime) });
+ }
}
void RedisWriter::StateChangedHandler(const ConfigObject::Ptr& object)
return output;
}
-String RedisWriter::CalculateCheckSumString(const String& str)
+String RedisWriter::CalculateCheckSumString(const String& str, bool binary)
{
- return SHA1(str);
+ return SHA1(str, binary);
}
-String RedisWriter::CalculateCheckSumGroups(const Array::Ptr& groups)
+String RedisWriter::CalculateCheckSumGroups(const Array::Ptr& groups, bool binary)
{
String output;
output += SHA1(group, true); //binary checksum required here
}
- return SHA1(output);
+ return SHA1(output, binary);
}
-String RedisWriter::CalculateCheckSumProperties(const ConfigObject::Ptr& object)
+String RedisWriter::CalculateCheckSumProperties(const ConfigObject::Ptr& object, bool binary)
{
//TODO: consider precision of 6 for double values; use specific config fields for hashing?
- return HashValue(object);
+ return HashValue(object, binary);
}
-String RedisWriter::CalculateCheckSumVars(const ConfigObject::Ptr& object)
+String RedisWriter::CalculateCheckSumVars(const ConfigObject::Ptr& object, bool binary)
{
CustomVarObject::Ptr customVarObject = dynamic_pointer_cast<CustomVarObject>(object);
if (!customVarObject)
- return HashValue(Empty);
+ return HashValue(Empty, binary);
Dictionary::Ptr vars = customVarObject->GetVars();
if (!vars)
- return HashValue(Empty);
+ return HashValue(Empty, binary);
- return HashValue(vars);
+ return HashValue(vars, binary);
}
-String RedisWriter::HashValue(const Value& value)
+String RedisWriter::HashValue(const Value& value, bool binary)
{
Value temp;
else
temp = value;
- return SHA1(JsonEncode(temp));
+ return SHA1(JsonEncode(temp), binary);
}
Dictionary::Ptr RedisWriter::SerializeObjectAttrs(const Object::Ptr& object, int fieldType)
/* utilities */
static String FormatCheckSumBinary(const String& str);
- static String CalculateCheckSumString(const String& str);
- static String CalculateCheckSumGroups(const Array::Ptr& groups);
- static String CalculateCheckSumProperties(const ConfigObject::Ptr& object);
- static String CalculateCheckSumVars(const ConfigObject::Ptr& object);
+ static String CalculateCheckSumString(const String& str, bool binary = false);
+ static String CalculateCheckSumGroups(const Array::Ptr& groups, bool binary = false);
+ static String CalculateCheckSumProperties(const ConfigObject::Ptr& object, bool binary = false);
+ static String CalculateCheckSumVars(const ConfigObject::Ptr& object, bool binary = false);
- static String HashValue(const Value& value);
+ static String HashValue(const Value& value, bool binary = false);
static Dictionary::Ptr SerializeObjectAttrs(const Object::Ptr& object, int fieldType);
static void StateChangedHandler(const ConfigObject::Ptr& object);