Name
sn_acc_adapter.AccTransformUtilsSNC
Description
No description available
Script
var AccTransformUtilsSNC = Class.create();
AccTransformUtilsSNC.prototype = {
METRIC_DEF_TRANSFORM_CONFIG: {},
METRIC_STAGING_FIELDS: {
PAYLOAD: "payload",
CI: "configuration_item",
ADAPTER_CONFIG: "adapter_config"
},
ADAPTER_CONFIG_FIELDS: {
METRIC_DEF: "metric_definition"
},
getTransformedPayloadItem: function(payloadItem, respOverrides, attrPickList) {
var transformedPayloadItem = {};
var isAttrPickListAvailable = attrPickList && attrPickList.length > 0;
var isRespOverridesAvailable = respOverrides && Object.keys(respOverrides).length > 0;
for (var itemKey in payloadItem) {
// if pick list exists for a metric def. but attr doesn't exist, ignore
if (isAttrPickListAvailable && attrPickList.indexOf(itemKey) === -1) {
continue;
}
// otherwise look for override and include it in transformed payload
var overrideKey = itemKey;
if (isRespOverridesAvailable && respOverrides.hasOwnProperty(itemKey)) {
overrideKey = respOverrides[itemKey];
}
transformedPayloadItem[overrideKey] = payloadItem[itemKey];
}
return transformedPayloadItem;
},
getTransformedOsQueryPayload: function(payload, transformConfig) {
var transformedPayload;
var respOverrides = transformConfig.respOverrides;
var attrPickList = transformConfig.attrPickList;
if (Array.isArray(payload)) {
transformedPayload = [];
var length = transformConfig.maxRows && payload.length > transformConfig.maxRows ? transformConfig.maxRows: payload.length;
for (var i = 0; i < length; i++) {
var transformedPayloadElement = this.getTransformedPayloadItem(payload[i], respOverrides, attrPickList);
transformedPayload.push(transformedPayloadElement);
}
} else {
transformedPayload = this.getTransformedPayloadItem(payload, respOverrides, attrPickList);
}
return transformedPayload;
},
getTransformedMetricDefPayload: function(metricStagingGr) {
var transformedPayload = [];
var arrayExistsInOutputs = false;
var metricDefSysId;
while (metricStagingGr.next()) {
var payload, result;
try {
// payload structure - { output, cmdType, cmd }
payload = JSON.parse(metricStagingGr.getValue(this.METRIC_STAGING_FIELDS.PAYLOAD));
} catch (err) {
gs.error("getTransformedMetricDefPayload: Unable to parse metric staging payload");
return {};
}
// get metric def. sys id to get hold of the transform config
var adapterConfigRef = metricStagingGr[this.METRIC_STAGING_FIELDS.ADAPTER_CONFIG].getRefRecord();
if (!adapterConfigRef.isValidRecord()) {
gs.error("getTransformedMetricDefPayload: Invalid adapter config record");
return {};
}
metricDefSysId = adapterConfigRef.getValue(this.ADAPTER_CONFIG_FIELDS.METRIC_DEF);
var transformConfig = this.METRIC_DEF_TRANSFORM_CONFIG[metricDefSysId];
if (payload.cmdType && payload.cmdType === "osquery") {
result = this.getTransformedOsQueryPayload(payload.output, transformConfig);
} else if (payload.cmdType && payload.cmdType === "command") {
result = this.getTransformedCmdPayload(payload.output, transformConfig, payload.cmd);
}
if (!arrayExistsInOutputs && Array.isArray(result)) arrayExistsInOutputs = true;
transformedPayload.push(result);
}
if (arrayExistsInOutputs) {
transformedPayload = transformedPayload.reduce(function(flattedArray, outputItem) {
if (Array.isArray(outputItem)) return flattedArray.concat(outputItem);
flattedArray.push(outputItem);
return flattedArray;
}, []);
}
// merge outputs into a single object as per metric def. transform config
if (transformConfig.mergeOutputs && transformedPayload.length > 0) {
var mergedOutput = {};
transformedPayload.forEach(function(outputItem) {
this.objectAssign(mergedOutput, outputItem);
}, this);
transformedPayload = mergedOutput;
}
return transformedPayload;
},
// polyfill for native JS Object.assign
objectAssign: function(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i];
for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}
return target;
},
getTransformedCmdPayload: function(payload, transformConfig, cmd) {
var accCommandTransformUtils = new AccCommandTransformUtils();
var jsonPayload = accCommandTransformUtils.transformCmdPayload(payload, cmd);
var transformedPayload;
var respOverrides = transformConfig.respOverrides;
var attrPickList = transformConfig.attrPickList;
if (Array.isArray(jsonPayload)) {
transformedPayload = [];
var length = transformConfig.maxRows && jsonPayload.length > transformConfig.maxRows ? transformConfig.maxRows: jsonPayload.length;
for (var i = 0; i < length; i++) {
var transformedPayloadElement = this.getTransformedPayloadItem(jsonPayload[i], respOverrides, attrPickList);
transformedPayload.push(transformedPayloadElement);
}
} else {
transformedPayload = this.getTransformedPayloadItem(jsonPayload, respOverrides, attrPickList);
}
return transformedPayload;
},
setMetricDefTransformConfig: function() {
var sowInvConfig = new sn_sow.SOWInvestigateConfig();
// Asset usage
this.METRIC_DEF_TRANSFORM_CONFIG[sowInvConfig.DEFINITION_CONFIG_MAP.ASSET_UTILIZATION] = {
// contains the expected attributes for a metric def.
attrPickList: ["LoadPercentage", "days", "hours", "total_space", "free_space", "FreePhysicalMemory", "TotalPhysicalMemory", "blocks_free", "blocks_available", "blocks_size", "memory_free", "memory_total", "memory_used", "cpu_usage"],
// contains mapping between payload and schema for overriding the payload properties
respOverrides: {
"LoadPercentage": "cpu_percentage",
"cpu_usage": "cpu_percentage",
"memory_free": "FreePhysicalMemory",
"memory_total": "TotalPhysicalMemory",
"memory_used": "UsedPhysicalMemory"
},
// dictates if array of outputs exist, wheather to merge them into a single object or not
mergeOutputs: true
};
// Logged in users
this.METRIC_DEF_TRANSFORM_CONFIG[sowInvConfig.DEFINITION_CONFIG_MAP.LOGGED_IN_USER] = {
attrPickList: ["user", "tty", "time"],
respOverrides: {},
mergeOutputs: false,
maxRows: 5
};
// Running processes
this.METRIC_DEF_TRANSFORM_CONFIG[sowInvConfig.DEFINITION_CONFIG_MAP.RUNNING_PROCESSES] = {
attrPickList: ["pid", "uid", "name", "total_size", "percentage", "user_time", "system_time", "metric_type", "totalCPU"],
respOverrides: {
"percentage": "cpu_percentage"
},
mergeOutputs: false,
maxRows: 5
};
// System overview
this.METRIC_DEF_TRANSFORM_CONFIG[sowInvConfig.DEFINITION_CONFIG_MAP.SYSTEM_OVERVIEW] = {
attrPickList: ["computer_name", "hardware_model", "hardware_serial", "name", "version"],
respOverrides: {
"name": "os_name",
"version": "os_version"
},
mergeOutputs: true
};
// Installed applications
this.METRIC_DEF_TRANSFORM_CONFIG[sowInvConfig.DEFINITION_CONFIG_MAP.INSTALLED_APPLICATIONS] = {
attrPickList: ["name", "version", "publisher", "lastUsedTime"],
respOverrides: {},
mergeOutputs: false
};
// System information (msinfo32)
this.METRIC_DEF_TRANSFORM_CONFIG[sowInvConfig.DEFINITION_CONFIG_MAP.SYSTEM_INFO_MSINFO32] = {
attrPickList: [],
respOverrides: {},
mergeOutputs: true
};
// System information (dsregcmd)
this.METRIC_DEF_TRANSFORM_CONFIG[sowInvConfig.DEFINITION_CONFIG_MAP.SYSTEM_INFO_DSREGCMD] = {
attrPickList: [],
respOverrides: {},
mergeOutputs: false
};
// Services
this.METRIC_DEF_TRANSFORM_CONFIG[sowInvConfig.DEFINITION_CONFIG_MAP.SERVICES] = {
attrPickList: ["name", "service_name", "status", "pid", "start_type", "service_exit_code", "label", "active", "sub", "unit", "plist", "description"],
respOverrides: {
"unit": "service_name",
"name": "service_name"
},
mergeOutputs: false
};
},
initialize: function() {
this.setMetricDefTransformConfig();
},
type: 'AccTransformUtilsSNC'
};
Sys ID
f0b43a30539b0110ae50ddeeff7b1223