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

Offical Documentation

Official Docs: