Name

sn_acc_adapter.AccCommandTransformUtilsSNC

Description

No description available

Script

var AccCommandTransformUtilsSNC = Class.create();
AccCommandTransformUtilsSNC.prototype = {
  TRANSFORM: [ {
  	cmd: 'powershell "Get-CimInstance -ClassName win32_processor | Measure-Object -Property LoadPercentage -Average | Select Average"',
  	fn: 'transformCpuPercentage'
  }, {
  	cmd: 'systeminfo | find "Available Physical Memory"',
  	fn: 'transformWinFreePhysicalMemory'
  }, {
  	cmd: 'powershell "$((Get-Process).CPU | Foreach {$total=0} {$total += $_} {$total})"',
  	type: 'value',
  	key: 'totalCPU'
  }, {
  	cmd: 'sysctl -n hw.memsize',
  	type: 'value',
  	key: 'TotalPhysicalMemory'
  }, {
  	cmd: 'vm_stat | grep -v "Virtual Memory Statistics"',
  	fn: 'transformFreePhysicalMemory'
  }, {
  	cmd: 'top -o mem -l 1 -n 50 | tail -50',
  	fn: 'transformRunningProcessesByMemory'
  }, {
  	cmd: 'ps -A -c -r -o %cpu,pid,uid,command  | head -51 | tail +2',
  	fn: 'transformRunningProcessesByCPU'
  }, {
  	cmd: 'installed_applications.rb',
  	fn: 'transformInstalledApps'
  }, {
  	cmd: 'sysinfo_msinfo32.rb',
  	fn: 'transformMsinfo32Data'
  }, {
  	cmd: 'dsregcmd /status',
  	fn: 'transformDsregcmdData'
  }, {
      cmd: 'systemctl list-units --type=service --all',
      fn: 'transformServicesData'
  }],

  transformCmdPayload: function(payload, cmd) {
  	var transformResult = this.getCmdTransformConfig(cmd);
  	if (!transformResult || typeof transformResult.fn !== "function") {
  		gs.error("[AccCommandTransformUtilsSNC.transformCmdPayload]: No transform script defined for command " + cmd);
  		return;
  	}
  	return transformResult.fn(payload, transformResult.transformConfig);
  },

  getCmdTransformConfig: function(cmd) {
  	for (var i = 0; i < this.TRANSFORM.length; i++) {
  		var cmdTransformFnEntry = this.TRANSFORM[i];
  		if (cmdTransformFnEntry.cmd === cmd) {
  			if (cmdTransformFnEntry.type) {
  				switch(cmdTransformFnEntry.type) {
  					case 'key=value': 
  						return {fn: this.transformKeyValue, transformConfig: cmdTransformFnEntry};
  					case 'value': 
  						return {fn: this.transformValue, transformConfig: cmdTransformFnEntry};
  				}
  			} else {
  				return {fn: this[cmdTransformFnEntry.fn], transformConfig: cmdTransformFnEntry};
  			}
  		}
  	}
  	return;
  },

  transformValue: function(payload, transformConfig) {
  	payload = payload.replace(/(\r\n|\n|\r)/gm, "");
  	try {
  		if (payload && transformConfig.key) {
  			var obj = {};
  			obj[transformConfig.key] = payload;
  			return obj;
  		}
  	} catch (error) {
  		gs.error("[AccCommandTransformUtilsSNC.transformValue]: Unable to parse payload " + payload);
  	}
  	return {};
  },

  transformKeyValue: function(payload, transformConfig) {
  	payload = payload.replace(/(\r\n|\n|\r)/gm, "");
  	try {
  		var index = payload.indexOf("=");
  		var key = payload.substring(0, index);
  		var value = payload.substring(index+1);
  		if (key && value) {
  			var obj = {};
  			obj[key] = value;
  			return obj;
  		} else {
  			return {};
  		}
  	} catch (error) {
  		gs.error("[AccCommandTransformUtilsSNC.transformKeyValue]: Unable to parse payload " + payload);
  	}
  	return {};
  },
  
  transformCpuPercentage: function(payload, transformConfig) {
  	var obj = {};
  	payload = payload.replace(/(\r\n|\n|\r|\s+)/gm, "");
  	var lineformat = /Average-------((?=\.\d|\d)(?:\d+)?(?:\.?\d*))(?:[Ee]([+-]?\d+))?/;
  	
  	if(lineformat.test(payload)){
  		var cpuReg = /Average-------(.*)?/;
  		var cpuPercentage = payload.match(cpuReg);
  		obj['LoadPercentage'] =  cpuPercentage[1];
  	} 
  	return obj;
  },

  transformWinFreePhysicalMemory: function(payload) {
  	var obj = {};
  	payload = payload.replace(/(\r\n|\n|\r|,)/gm, "");
  	var format = /Available Physical Memory:\s+(\d+)\s+MB/;
  	if(format.test(payload)) {
  		var mbValueStr = payload.split(":")[1].trim();
  		var mbValue = mbValueStr.split(" ")[0];
  		var bValue = mbValue * 1024 * 1024;
  		obj['FreePhysicalMemory'] = bValue;
  	}
  	return obj;
  },

  transformFreePhysicalMemory: function(payload, transformConfig) {
  	var vmStats = {};
  	var lineformat = /(.*):\s+(\d+)/;
  	payload.split("\n").forEach(function(row) {
  		if (row) {
  			var matchData = row.match(lineformat);
  			// 4096 is the page size [vm_stat first line will give you this info]
  			vmStats[matchData[1]] = Number(matchData[2]) * 4096;
  		}
  	});
  	var appMemory = vmStats["Anonymous pages"] - vmStats["Pages purgeable"];
  	var memoryUsed = appMemory + vmStats["Pages wired down"] + vmStats["Pages occupied by compressor"];
  	return {
  		"memory_used": memoryUsed
  	};
  },
  
  transformRunningProcessesByCPU: function(payload, transformConfig) {
  	var ouputArray = [];
  	var lineformat = /(\d+.\d+)\s+(\d+)\s+(\d+)\s+(.*)/;
  	payload.split("\n").forEach(function(row) {
  		if (row) {
  			var matchData = row.match(lineformat);
  			var output = {};
  			output['percentage'] = matchData[1];
  			output['pid'] = matchData[2];
  			output['uid'] = matchData[3];
  			output['name'] = matchData[4];
  			output['metric_type'] = 'cpu';
  			ouputArray.push(output);
  		}
  	});
  	return ouputArray;
  },
  
  transformRunningProcessesByMemory: function(payload, transformConfig) {
  	var outputArray = [];
  	var lineformat = /^(\d+)\s+(.*?)\s+(?:\d+.\d+)\s+(?:\d+:.*.\d+)\s+(\d+)[BKMG]\s+(.*)/;
  	payload.split("\n").forEach(function(row) {
  		if (row) {
  			var matchData = row.match(lineformat);
  			var output = {};
  			output['pid'] = matchData[1];
  			output['name'] = matchData[2];
  			output['total_size'] = Number(matchData[3])*1024*1024; //Converting to bytes from MB
  			output['metric_type'] = 'memory';
  			var otherData = matchData[4].split(/\s+/);
  			output['uid'] = otherData[8];
  			outputArray.push(output);
  		}
  	});
  	return outputArray;
  },
  
  transformInstalledApps: function(payload, transformConfig) {
  	var outputArray = [];
  	var jsonPayload;
  	try {
  		jsonPayload = JSON.parse(payload);
  	} catch (err) {
  		gs.error("AccCommandTransformUtils [transformInstalledApps]: Invalid JSON payload");
  		return outputArray;
  	}
  	jsonPayload.forEach(function(app) {
  		var output = {};
  		output['version'] = app['version'];
  		output['name'] = app['name'];
  		if (app['publisher']) {
  			// for linux: trim the email part in publisher "Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>"
  			output['publisher'] = app['publisher'].replace(/<(.)+@(.)+>/, '').trim();
  		}
  		if (app['lastUsedTime']) output['lastUsedTime'] = app['lastUsedTime'];
  		outputArray.push(output);
  	});
  	return outputArray;
  },
  
  transformMsinfo32Data: function(payload, transformConfig) {
  	function getTableData(startIndex, data) {
  		var obj = {};
  		// first row has the columns
  		var cols = data[startIndex].replace(/\r|\0/gm, "").split("\t").filter(function (col) { return col != ""; });
  		obj.cols = cols;
  		var colLength = cols.length;
  		obj.rows = [];
  		// get rows data
  		for (var i = startIndex + 1; ; i++) {
  			var line = data[i].replace(/\r|\0/gm, "");
  			if (!line) break;
  			var colVals = line.trim().split("\t");
  			var rowObj = {};
  			for (var j = 0; j < colLength; j++) {
  				if (cols[j]) rowObj[cols[j]] = colVals[j] || "";
  			}
  			obj.rows.push(rowObj);
  		}
  		return [obj, i];
  	}

  	function parse(data) {
  		var lines = data.split("\n");

  		var infoMap = {};
  		var linesLength = lines.length;

  		for (var i = 0; i < linesLength; i++) {
  			var line = lines[i];
  			// remove extra chars
  			line = line.replace(/\r|\0/gm, "");

  			// check the category format ex: [System summary]
  			if (!/^\[.+\]$/.test(line)) continue;

  			// remove braces around category name
  			var label = line.substring(1, line.length - 1);

  			// get the index of the line from where the table data starts
  			var dataStartIndex = i + 1;
  			while (!lines[dataStartIndex].replace(/\r|\0/gm, "")) dataStartIndex++;

  			// if category doesn't have data, 3 lines exists before the next category
  			if (dataStartIndex - i > 2) {
  				infoMap[label] = {};
  				continue;
  			}

  			// get table data and the index of the last table row
  			var tableData = getTableData(dataStartIndex, lines);
  			infoMap[label] = tableData[0];
  			i = tableData[1];
  		}

  		return infoMap;
  	}
  	
  	try {
  		return parse(payload);
  	} catch(err) {
  		gs.error("AccCommandTransformUtils [transformMsinfo32Data]: Unable to parse msinfo32 data");
  	}
  	
  	return {};
  },
  
  transformDsregcmdData: function(payload, transformConfig) {
  	function parse(data) {
  		var lines = data.split("\n");
  		var sectionHeaderStarted = false;
  		var isSectionBody = false;
  		var sections = [];
  		for (var i = 0; i < lines.length; i++) {
  			var line = lines[i];
  			// remove extra chars
  			line = line.replace(/^\s+|\s+$/gm, "");
  			if(!line) {
  				// update flag isSectionBody as section body ends with a empty line
  				if(isSectionBody)
  					isSectionBody = false;
  				continue;
  			}
  			// check if line has single '+' char at start and end, and only '-' char between start and end 
  			if((/^\+[-]+\+$/).test(line)) {
  				sectionHeaderStarted = !sectionHeaderStarted;
  				// check if section header is finised, then it's the start of section body
  				if(!sectionHeaderStarted) {
  					isSectionBody = true;
  					// skip next line as the section body starts with a empty line
  					i++;
  				}
  			}
  			// check if line has single '|' char at start and end, and contains other characters between start and end
  			else if(sectionHeaderStarted && (/^\|(.)+\|$/).test(line)) {
  				line = line.slice(1, -1).trim();
  				if(!line)
  					continue;
  				var section = {};
  				section.label = line;
  				var sectionData = {
  					cols: ["item", "value"],
  					rows:[]
  				};
  				section.data = sectionData;
  				sections.push(section);
  			} else if(section && isSectionBody) {
  				var separatorIdx = line.indexOf(':');
  				var key = line.slice(0, separatorIdx).trim();
  				var value = line.slice(separatorIdx + 1).trim();
  				var row = {
  					item : key,
  					value: value
  				};
  				section.data.rows.push(row);
  			}
  		}
  		return sections;
  	}

  	try {
  		return parse(payload);
  	} catch(err) {
  		gs.error("AccCommandTransformUtils [transformDsregcmdData]: Unable to parse dsregcmd data");
  	}
  	
  	return [];
  },
  
  transformServicesData: function(payload) {
      var services = [];
      var lines = payload.split('\n');
      var columns = lines[0].match(/\w+/g);
      for (var i = 1; i < 6; i++) {
          columns[i - 1] = columns[i - 1].toLowerCase();
      }
      for (var i = 1; i < lines.length - 8; i++) {
          var service = {};
          var line = lines[i];
          line = line.replace(/\s\s+/g, ' ');
          var rowfieldsValues = line.split(' ');
          for (var j = 1; j < 5; j++) {
              service[columns[j - 1]] = rowfieldsValues[j];
          }
          var desc = [];
          for (var j = 5; j < rowfieldsValues.length; j++) {
              desc.push(rowfieldsValues[j]);
          }
          service[columns[4]] = desc.join(' ').trim();
          services.push(service);
      }
      return services;
  },
  
  initialize: function() {},

  type: 'AccCommandTransformUtilsSNC'
};

Sys ID

7179abe677f30110e48006e57b5a996e

Offical Documentation

Official Docs: