Export original attributes in DB IDO and Livestatus

fixes #10392
This commit is contained in:
Michael Friedrich 2015-10-22 15:48:53 +02:00
parent 4cf4ffe893
commit d618762dad
14 changed files with 55 additions and 3 deletions

View File

@ -199,6 +199,8 @@ New columns:
{host,service}group | notes_url | TEXT | NULL | -
{host,service}group | action_url | TEXT | NULL | -
customvariable* | is_json | integer | 0 | Defines whether `varvalue` is a json encoded string from custom attributes, or not
servicestatus | original_attributes | TEXT | NULL | JSON encoded dictionary of original attributes if modified at runtime.
hoststatus | original_attributes | TEXT | NULL | JSON encoded dictionary of original attributes if modified at runtime.
Additional command custom variables populated from 'vars' dictionary.
Additional global custom variables populated from 'Vars' constant (object_id is NULL).
@ -249,6 +251,8 @@ New columns:
status | custom_variable_names
status | custom_variable_values
status | custom_variables
hosts | original_attributes
services | original_attributes
Command custom variables reflect the local 'vars' dictionary.
Status custom variables reflect the global 'Vars' constant.

View File

@ -31,6 +31,7 @@
#include "base/convert.hpp"
#include "base/objectlock.hpp"
#include "base/logger.hpp"
#include "base/json.hpp"
#include <boost/foreach.hpp>
using namespace icinga;
@ -170,6 +171,8 @@ Dictionary::Ptr HostDbObject::GetStatusFields(void) const
fields->Set("check_timeperiod_object_id", host->GetCheckPeriod());
fields->Set("is_reachable", CompatUtility::GetCheckableIsReachable(host));
fields->Set("original_attributes", JsonEncode(host->GetOriginalAttributes()));
return fields;
}

View File

@ -35,6 +35,7 @@
#include "base/configtype.hpp"
#include "base/utility.hpp"
#include "base/logger.hpp"
#include "base/json.hpp"
#include <boost/foreach.hpp>
#include <boost/algorithm/string/join.hpp>
@ -164,6 +165,8 @@ Dictionary::Ptr ServiceDbObject::GetStatusFields(void) const
fields->Set("check_timeperiod_object_id", service->GetCheckPeriod());
fields->Set("is_reachable", CompatUtility::GetCheckableIsReachable(service));
fields->Set("original_attributes", JsonEncode(service->GetOriginalAttributes()));
return fields;
}

View File

@ -744,6 +744,7 @@ CREATE TABLE IF NOT EXISTS icinga_hoststatus (
process_performance_data smallint default 0,
obsess_over_host smallint default 0,
modified_host_attributes int default 0,
original_attributes TEXT character set latin1 default NULL,
event_handler TEXT character set latin1 default '',
check_command TEXT character set latin1 default '',
normal_check_interval double default '0',
@ -1230,6 +1231,7 @@ CREATE TABLE IF NOT EXISTS icinga_servicestatus (
process_performance_data smallint default 0,
obsess_over_service smallint default 0,
modified_service_attributes int default 0,
original_attributes TEXT character set latin1 default NULL,
event_handler TEXT character set latin1 default '',
check_command TEXT character set latin1 default '',
normal_check_interval double default '0',

View File

@ -41,6 +41,13 @@ CREATE TABLE IF NOT EXISTS icinga_zonestatus (
ALTER TABLE icinga_services MODIFY freshness_threshold int;
ALTER TABLE icinga_hosts MODIFY freshness_threshold int;
-- -----------------------------------------
-- #10392 - original attributes
-- -----------------------------------------
ALTER TABLE icinga_servicestatus ADD COLUMN original_attributes TEXT character set latin1 default NULL;
ALTER TABLE icinga_hoststatus ADD COLUMN original_attributes TEXT character set latin1 default NULL;
-- -----------------------------------------
-- update dbversion
-- -----------------------------------------

View File

@ -770,6 +770,7 @@ CREATE TABLE icinga_hoststatus (
process_performance_data INTEGER default 0,
obsess_over_host INTEGER default 0,
modified_host_attributes INTEGER default 0,
original_attributes TEXT default NULL,
event_handler TEXT default '',
check_command TEXT default '',
normal_check_interval double precision default 0,
@ -1256,6 +1257,7 @@ CREATE TABLE icinga_servicestatus (
process_performance_data INTEGER default 0,
obsess_over_service INTEGER default 0,
modified_service_attributes INTEGER default 0,
original_attributes TEXT default NULL,
event_handler TEXT default '',
check_command TEXT default '',
normal_check_interval double precision default 0,

View File

@ -151,6 +151,12 @@ CREATE TABLE icinga_zonestatus (
CONSTRAINT UQ_zonestatus UNIQUE (zone_object_id)
) ;
-- -----------------------------------------
-- #10392 original attributes
-- -----------------------------------------
ALTER TABLE icinga_servicestatus ADD COLUMN original_attributes TEXT default NULL;
ALTER TABLE icinga_hoststatus ADD COLUMN original_attributes TEXT default NULL;
-- -----------------------------------------
-- update dbversion
-- -----------------------------------------

View File

@ -164,6 +164,7 @@ void HostsTable::AddColumns(Table *table, const String& prefix,
table->AddColumn(prefix + "check_source", Column(&HostsTable::CheckSourceAccessor, objectAccessor));
table->AddColumn(prefix + "is_reachable", Column(&HostsTable::IsReachableAccessor, objectAccessor));
table->AddColumn(prefix + "cv_is_json", Column(&HostsTable::CVIsJsonAccessor, objectAccessor));
table->AddColumn(prefix + "original_attributes", Column(&HostsTable::OriginalAttributesAccessor, objectAccessor));
/* add additional group by values received through the object accessor */
if (table->GetGroupByType() == LivestatusGroupByHostGroup) {
@ -1570,3 +1571,13 @@ Value HostsTable::IsReachableAccessor(const Value& row)
return host->IsReachable();
}
Value HostsTable::OriginalAttributesAccessor(const Value& row)
{
Host::Ptr host = static_cast<Host::Ptr>(row);
if (!host)
return Empty;
return JsonEncode(host->GetOriginalAttributes());
}

View File

@ -144,6 +144,7 @@ protected:
static Value CheckSourceAccessor(const Value& row);
static Value IsReachableAccessor(const Value& row);
static Value CVIsJsonAccessor(const Value& row);
static Value OriginalAttributesAccessor(const Value& row);
};
}

View File

@ -137,6 +137,7 @@ void ServicesTable::AddColumns(Table *table, const String& prefix,
table->AddColumn(prefix + "check_source", Column(&ServicesTable::CheckSourceAccessor, objectAccessor));
table->AddColumn(prefix + "is_reachable", Column(&ServicesTable::IsReachableAccessor, objectAccessor));
table->AddColumn(prefix + "cv_is_json", Column(&ServicesTable::CVIsJsonAccessor, objectAccessor));
table->AddColumn(prefix + "original_attributes", Column(&ServicesTable::OriginalAttributesAccessor, objectAccessor));
HostsTable::AddColumns(table, "host_", boost::bind(&ServicesTable::HostAccessor, _1, objectAccessor));
@ -1266,3 +1267,13 @@ Value ServicesTable::IsReachableAccessor(const Value& row)
return service->IsReachable();
}
Value ServicesTable::OriginalAttributesAccessor(const Value& row)
{
Service::Ptr service = static_cast<Service::Ptr>(row);
if (!service)
return Empty;
return JsonEncode(service->GetOriginalAttributes());
}

View File

@ -127,6 +127,7 @@ protected:
static Value CheckSourceAccessor(const Value& row);
static Value IsReachableAccessor(const Value& row);
static Value CVIsJsonAccessor(const Value& row);
static Value OriginalAttributesAccessor(const Value& row);
};
}

View File

@ -1,4 +1,4 @@
GET hosts
Columns: name modified_attributes modified_attributes_list
Columns: name modified_attributes modified_attributes_list original_attributes
ResponseHeader: fixed16

View File

@ -1,4 +1,4 @@
GET services
Columns: name modified_attributes modified_attributes_list
Columns: description modified_attributes modified_attributes_list original_attributes
ResponseHeader: fixed16

View File

@ -1,7 +1,8 @@
#!/bin/bash
NC=`which nc`
LIVESTATUSSOCKET="/var/run/icinga2/cmd/livestatus"
LOCALSTATEDIR=`icinga2 variable get LocalStateDir`
LIVESTATUSSOCKET="$LOCALSTATEDIR/run/icinga2/cmd/livestatus"
LIVESTATUSHOST="127.0.0.1"
LIVESTATUSPORT="6558"
LIVESTATUSQUERIES="./queries"