Name
sn_vsc.SCComparisonUtil
Description
No description available
Script
var SCComparisonUtil = Class.create();
SCComparisonUtil.prototype = {
constants: new sn_vsc.SecurityCenterConstants(),
initialize: function() {},
/*
*
*Input params (timeStamp1 = first comparison timeStamp)
*Input params (timeStamp2 = second comparison timeStamp)
*Create new comparison and associate it with logged in user
*/
compareWithUserId: function(timeStamp1, timeStamp2) {
var compare = this.createUserComparison(timeStamp1, timeStamp2, gs.getUserID(), false);
var paramList = compare + ',' + timeStamp1 + ',' + timeStamp2;
gs.eventQueue('sn_vsc.sec.hardening.comparison', null, 'sn_vsc_changed_hardening_settings', paramList);
},
/*
*
*Input params (timeStamp1 = first comparison timeStamp)
*Input params (timeStamp2 = second comparison timeStamp)
*Runs new comparison against given timeStamps
*/
runComparison: function(timeStamp1, timeStamp2) {
var queryCondition = "sys_created_on>javascript:gs.dateGenerate('" + timeStamp1 + "','" + this.getDateTimeStamp(timeStamp1) + "')^sys_created_on<=javascript:gs.dateGenerate('" + timeStamp2 + "','" + this.getDateTimeStamp(timeStamp2) + "')";
var settings = [];
var tableRec = new GlideAggregate("sn_vsc_updated_settings");
tableRec.addEncodedQuery(queryCondition);
tableRec.groupBy("u_setting");
tableRec.query();
while (tableRec.next()) {
settings.push(tableRec.u_setting.sys_id);
}
return settings;
},
//get time stamp of latest job run for given date
getDateTimeStamp: function(date) {
var gr = new GlideRecord('sn_vsc_hardening_compliance_scores');
gr.orderBy('harc_collected');
gr.addEncodedQuery("harc_collected>=javascript:gs.dateGenerate('" + date + "','" + "00:00:00" + "')");
gr.query();
if (gr.next()) {
if (gr.harc_collected.getDisplayValue().split(" ")[0] == date) {
return gr.harc_collected.getDisplayValue().split(" ")[1];
}
}
},
//Runs every time new score is generated, captures new score
recordComplianceScore: function() {
var score = Math.round((this.getScore(this.constants.SUM_OF_COMPLIANT_HARDENING_SETTING_WEIGHT) / this.getScore(this.constants.TOTAL_HARDENING_SETTING_WEIGHT)) * 100).toString();
var gr = new GlideRecord('pa_job_logs');
gr.addQuery('job', this.constants.SCPAJob);
gr.orderByDesc('sys_created_on');
gr.query();
if (gr.next()) {
var grC = new GlideRecord('sn_vsc_hardening_compliance_scores');
grC.orderByDesc('harc_collected');
grC.query();
if (grC.next()) {
var jobDate = new GlideDateTime(gr.sys_created_on).getDisplayValue();
if (jobDate.split(" ")[0] == grC.harc_collected.getDisplayValue().split(" ")[0]) {
grC.harc_score = score;
grC.harc_collected = new GlideDateTime(gr.sys_created_on).getDisplayValue();
grC.harc_compliant = this.getNonCompliant();
grC.update();
return;
} else {
this.insertScore(new GlideDateTime(gr.sys_created_on).getDisplayValue(), score, this.getNonCompliant());
return;
}
} else {
this.insertScore(new GlideDateTime(gr.sys_created_on).getDisplayValue(), score, this.getNonCompliant());
return;
}
}
},
//Insert new score collection
insertScore: function(createdOn, score, compliance) {
var gr = new GlideRecord('sn_vsc_hardening_compliance_scores');
gr.initialize();
gr.harc_collected = createdOn;
gr.harc_score = score;
gr.harc_compliant = compliance;
gr.insert();
},
//Get latest score on indicator
getScore: function(indicatorId) {
var gr = new GlideRecord('pa_scores_l1');
gr.addQuery('indicator', this.getId(indicatorId));
gr.orderByDesc('start_at');
gr.query();
if (gr.next()) {
return gr.value;
}
},
//Get indicator id
getId: function(indicatorSysId) {
var gr = new GlideRecord('pa_indicators');
gr.addQuery('sys_id', indicatorSysId);
gr.query();
if (gr.next()) {
return gr.id;
}
},
//Get total non-compliant settings
getNonCompliant: function() {
var gr = new GlideRecord('sn_vsc_instance_hardening_settings');
gr.addQuery('compliance_status', 'non-compliant');
gr.query();
return gr.getRowCount();
},
/*
*
*Create new comparison for most recent Job run
*/
defaultComparison: function() {
var gr = new GlideRecord('pa_job_logs');
gr.addQuery('job', this.constants.SCPAJob);
gr.orderByDesc('sys_created_on');
gr.query();
if (gr.next()) {
var dates = [];
while (gr.next() && dates.length < 2) {
var jobDate = new GlideDateTime(gr.sys_created_on).getDisplayValue().split(" ")[0];
if (dates.length == 0 || dates[0] != jobDate) {
dates.push(jobDate);
}
}
if (dates.length == 2 && dates[1] != null && dates[0] != null) {
var currDate = new GlideDateTime().getDisplayValue().split(" ")[0];
var users = "";
if (dates[0] == currDate) {
var gComp = new GlideRecord("sn_vsc_user_comparisons");
gComp.addQuery('usr_name', 'CONTAINS', currDate);
gComp.query();
while (gComp.next()) {
if (gComp.usr_name.split(",")[1] == currDate) {
users += gComp.usr_list.toString();
gComp.deleteRecord();
}
}
var gSet = new GlideRecord("sn_vsc_changed_hardening_settings");
gSet.addEncodedQuery('set_comp=NULL');
gSet.query();
gSet.query();
while (gSet.next()) {
gSet.deleteMultiple();
}
this.updateDefaultState();
var compa = this.createUserComparison(dates[1], dates[0], users, true);
var param = compa + ',' + dates[1] + ',' + dates[0];
gs.eventQueue('sn_vsc.sec.hardening.comparison', null, 'sn_vsc_changed_hardening_settings', param);
} else {
this.updateDefaultState();
var com = this.createUserComparison(dates[1], dates[0], " ", true);
var paramList = com + ',' + dates[1] + ',' + dates[0];
gs.eventQueue('sn_vsc.sec.hardening.comparison', null, 'sn_vsc_changed_hardening_settings', paramList);
}
}
}
},
//Set default state on previous default comparison
updateDefaultState: function() {
var gU = new GlideRecord("sn_vsc_user_comparisons");
gU.addQuery('usr_default', true);
gU.query();
while (gU.next()) {
gU.usr_default = false;
gU.update();
}
},
/*
*
*Input params (timeStamp1 = first comparison timeStamp)
*Input params (timeStamp2 = second comparison timeStamp)
*Check if comparison already exist, update user assignment respectively
*/
lookForComparison: function(timeStamp1, timeStamp2) {
if (timeStamp1 != null && timeStamp2 != null) {
var compId = timeStamp1 + "," + timeStamp2; //need to handle reverse comparision
var grUser = new GlideRecord("sn_vsc_user_comparisons");
grUser.addQuery('usr_name', compId);
grUser.query();
if (grUser.next()) { //Comparison found
if (!grUser.usr_list.toString().includes(gs.getUserID())) {
this.removeUserFromComparisons(gs.getUserID());
if (grUser.usr_list.toString() != '') {
grUser.usr_list = grUser.usr_list.toString() + ',' + gs.getUserID();
} else {
grUser.usr_list = gs.getUserID();
}
grUser.update();
}
} else { //Comparison not found
this.compareWithUserId(timeStamp1, timeStamp2);
}
}
},
/*
*
*Remove user associated to comparision
*/
removeUserFromComparisons: function(userId) {
var gr = new GlideRecord("sn_vsc_user_comparisons");
var eQ = "usr_listLIKE" + userId;
gr.addEncodedQuery(eQ);
gr.query();
while (gr.next()) {
var Uarr = gr.usr_list.split(",");
var index = Uarr.indexOf(userId.toString());
if (index !== -1) {
Uarr.splice(index, 1);
}
gr.usr_list = Uarr.toString();
gr.update();
}
},
/*
*
*Input params (timeStamp1 = first comparison timeStamp)
*Input params (timeStamp2 = second comparison timeStamp)
*Create new comparison and associate it with given user
*/
createUserComparison: function(timeStamp1, timeStamp2, userId, isDefault) {
if (timeStamp1 != "" && timeStamp1 != null && timeStamp2 != "" && timeStamp2 != null) {
if (userId != " ") {
this.removeUserFromComparisons(gs.getUserID());
}
var grUser = new GlideRecord("sn_vsc_user_comparisons");
grUser.initialize();
grUser.setValue("usr_name", timeStamp1 + "," + timeStamp2);
grUser.setValue("usr_default", isDefault);
if (userId != "") {
grUser.setValue("usr_list", userId);
}
grUser.setValue("usr_status", "progress");
return grUser.insert();
}
},
/*
*
*Input params (compare = reference to user comparison record)
*Input params (settings = list of changed settings)
*Associate chnaged settings to comparison
*/
createChangedSettings: function(compare, settings) {
for (var stg in settings) {
var chgSetting = new GlideRecord("sn_vsc_changed_hardening_settings");
chgSetting.initialize();
chgSetting.setValue("set_comp", compare);
chgSetting.setValue("set_setting", settings[stg]);
chgSetting.insert();
}
},
/*
*
*Assign default comparison upon login for admin users
*/
loginEvent: function(uId) {
var gC = new GlideRecord("sn_vsc_user_comparisons");
gC.query();
if (gC.getRowCount() > 0) {
this.removeUserFromComparisons(uId);
}
},
/*
*
* Returns changed hardening settings glide record
*/
getChangedRecord: function() {
var dates = [];
var grPA = new GlideRecord('pa_job_logs');
grPA.addQuery('job', "aead645c53911110dd8eddeeff7b12e9");
grPA.orderByDesc('sys_created_on');
grPA.setLimit(2);
grPA.query();
while (grPA.next()) {
var date = new GlideDateTime(grPA.sys_created_on).getDisplayValue();
dates.push(date);
}
var date1 = dates[1].split(" ")[0].toString();
var time1 = dates[1].split(" ")[1].toString();
var date2 = dates[0].split(" ")[0].toString();
var time2 = dates[0].split(" ")[1].toString();
var grSettings = new GlideRecord('sn_vsc_updated_settings');
var records = "sys_created_onBETWEENjavascript:gs.dateGenerate('" + date1 + "','" + time1 + "')@javascript:gs.dateGenerate('" + date2 + "','" + time2 + "')";
grSettings.addEncodedQuery(records);
grSettings.query();
return grSettings;
},
/*
*
* Returns number of settings changed between most recent scores n & n-1
*/
totalChangedSettings: function() {
var settingsRecord = this.getChangedRecord();
return settingsRecord.getRowCount();
},
/*
*
* Returns most repeated security area in number of settings changed
*/
mostRepeatedSecurityArea: function(currScoreDate, prevScoreDate) {
var resultArea = {};
var securityArea = {};
var mostRepeatedSecurityArea = '';
var settingsRecord = this.getUpdatedSettings(currScoreDate, prevScoreDate);
while (settingsRecord.next()) {
var secArea = settingsRecord.u_setting.security_check_category.getDisplayValue();
if (resultArea[secArea]) {
resultArea[secArea]++;
} else {
// otherwise, add the word to the result object with a count of 1
resultArea[secArea] = 1;
}
}
if (resultArea) {
// Create items array
var items = Object.keys(resultArea).map(function(key) {
return [key, resultArea[key]];
});
// Sort the array based on the second element
items.sort(function(first, second) {
return second[1] - first[1];
});
// Create a new array with only the first 3 items
var slicedArray = items.slice(0, 3);
securityArea = slicedArray.map(function(area) {
return area[0];
});
}
return securityArea;
},
/*
*
* Returns most repeated priority for the security area in number of settings changed
*/
getAllPriorityForSecurityArea: function(securityArea, currScoreDate, prevScoreDate) {
var mostRepeatedSecurityAreaArray = securityArea;
var mostRepeatedPriority = '';
var resultPriority = {};
var settingsRecord = this.getUpdatedSettings(currScoreDate, prevScoreDate);
while (settingsRecord.next()) {
var secArea = settingsRecord.u_setting.security_check_category.getDisplayValue();
for (var i = 0; i < mostRepeatedSecurityAreaArray.length; i++) {
if (secArea == mostRepeatedSecurityAreaArray[i]) {
var priority = settingsRecord.u_setting.check.priority.getDisplayValue();
if (resultPriority[priority]) {
resultPriority[priority]++;
} else {
// otherwise, add the word to the result object with a count of 1
resultPriority[priority] = 1;
}
}
}
}
return resultPriority;
},
getUpdatedSettings: function(currScoreDate, prevScoreDate) {
var encodedQuery = "";
if (currScoreDate != prevScoreDate) {
encodedQuery = "sys_created_on>javascript:gs.dateGenerate('" + prevScoreDate.split(' ')[0] + "','23:59:59')";
var grSettings = new GlideAggregate('sn_vsc_updated_settings');
grSettings.addEncodedQuery(encodedQuery);
grSettings.groupBy('u_setting');
grSettings.query();
return grSettings;
}
},
getScoreTrendDates: function() {
var startDate = new GlideDateTime();
var currDate = new GlideDateTime();
var endDate = new GlideDateTime();
var gr = new GlideRecord('sn_vsc_hardening_compliance_scores');
gr.addEncodedQuery('harc_score!=0');
gr.orderBy('harc_collected');
gr.setLimit(1);
gr.query();
if (gr.next()) {
startDate = new GlideDateTime(gr.getValue('harc_collected'));
}
var startYear = startDate.getYearLocalTime();
var currYear = currDate.getYearLocalTime();
if (currYear - startYear > 1) {
startDate.setYear(currYear - 1);
}
return [{
"startDate": startDate.getDisplayValue().split(" ")[0],
"endDate": endDate.getDisplayValue().split(" ")[0]
}];
},
type: 'SCComparisonUtil'
};
Sys ID
046c1a8653301110dd8eddeeff7b126e