Name

sn_agent.ACCResultsFormatter

Description

Convert JSON to Html in order to show it formatted in worknotes in incidents

Script

var ACCResultsFormatter = Class.create();
ACCResultsFormatter.prototype = {
  initialize: function() {
  	
  },
  	
  /**
   * JSON Formatter for OSQuery Results for worknotes
   *
   * @param json {string}
   *     example {"computer_name":"winserver2019","local_hostname":"winserver2019"}]
   * @param input_transpose {string} true/false to render results in row vs column structure 
   * @param input_query {string} of OSQuery request for restructuring order
   *     example "select local_hostname, computer_name from system_info"
   * Returns an [code] html blob to render onto worknotes for seeing OSQuery results better
   */
  
  formatOSQuery: function(json, input_transpose, input_query) {
  	var t_transpose = input_transpose;
  	var resultsTable = JSON.parse(json);
  	if (!(resultsTable instanceof Array)) 
  		return "[code] Input string is not a JSON array [/code]. input: " + json;

  	var fieldArrangement = new sn_agent.ACCResultsSorter().sortOSQuery(resultsTable, input_query);
  	
  	return this.createWorknotes(resultsTable, fieldArrangement, t_transpose);
  },
  
  createDefaultTableRows: function(resultsTable, fieldArrangement) {
  	var html = "";
  	for (var rowIdx in resultsTable) {
  		var row = resultsTable[rowIdx];

  		// In the first row we create thr table headers
  		if (rowIdx == 0) {
  			html += "<tr>\n";

  			for (var fieldIdx in fieldArrangement) {
  				html += "<th>" + fieldArrangement[fieldIdx] + "</th>\n";
  			}
  			html += "</tr>\n";
  		}

  		// Now add the field values
  		html += "<tr>\n";

  		for (fieldIdx in fieldArrangement) {
  			var field = fieldArrangement[fieldIdx];
  			html += "<td>" + row[field] + "</td>\n";
  		}
  		html += "</tr>\n";
  		}
  	return html;
  },
  
  createTransposedTableRows: function(resultsTable, fieldArrangement) {
  	var html = "";
  	for (var fieldIdx in fieldArrangement) {	
  		field = fieldArrangement[fieldIdx];
  		html += "<tr>\n";
  		html += "<th>" + field + "</th>\n";

  		for(var colIdx in resultsTable){
  			var col = resultsTable[colIdx];
  			html += "<td>" + col[field] + "</td>\n";
  		}				
  		html += "</tr>\n";
  	}
  	return html;
  },
  
  createWorknotes: function(resultsTable, fieldArrangement, transpose) {
  	var html = "[code]";
  	var htmlHeader = "<head>" +
  	" <style>" +
  		" td { white-space: nowrap;}\n" +
  		
  		" .withscroll {\n" +
  		" overflow-x: scroll;\n" +       
  		" white-space: nowrap;\n" +
  		"}\n" +

  		" table, th, td {\n" +
  		" border: 1px solid #d4d6db;\n" +
  		" border-collapse: collapse;\n" +
  		"}\n" +
  		
  		" td, th { padding:4px;}\n" +
  		" td { font-weight:normal;}\n" +
  		" table { border-radius:6px;}\n" +
  		" th{ background-color:#e8eaed;}\n"+

  	"</style>\n" +
  	"</head>\n";
  	
  	html += htmlHeader;
  	html += '<body><div class="withscroll">\n';
  	html += "<table>";
  	
  	if(transpose === "false"){
  		html += this.createDefaultTableRows(resultsTable, fieldArrangement);
  	} else {
  		html += this.createTransposedTableRows(resultsTable, fieldArrangement);
  	}
  	
  	html += "</table>\n";
  	html += "</div></body>\n";
  	html += "[/code]\n";
  	
  	return html;
  },

  type: 'ACCResultsFormatter'
};

Sys ID

b002878f0f750110ce4d142386767eef

Offical Documentation

Official Docs: