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