Name

global.SystemCloneUtil

Description

Defines utility methods for clone profile configuration.

Script

var SystemCloneUtil = Class.create();
SystemCloneUtil.prototype = {
  initialize: function() {
  },
  type: 'SystemCloneUtil'
};

/*
* Validates whether clone request can be submitted. 
*/
SystemCloneUtil.validateCloneRequest = function(cloneProfileSysId) {
  var preserverTables = [],
  	excludedTables = [];
  
  if(JSUtil.nil(cloneProfileSysId)) {
  	var preserverGr = new GlideAggregate(CloneConstants.tableName.CLONE_DATA_PRESERVER);
  	preserverGr.addAggregate('COUNT', 'table');
  	preserverGr.addOrderBy('table');
  	preserverGr.query();
  	if(!preserverGr.hasNext())
  		return CloneConstants.errorMsg.EMPTY_PRESERVERS;
  	
  	while(preserverGr.next()) 
  		preserverTables.push(preserverGr.getValue('table'));
  	
  	var exclusionGr = new GlideAggregate(CloneConstants.tableName.CLONE_DATA_EXCLUSION);
  	exclusionGr.addAggregate('COUNT', 'name');
  	exclusionGr.addOrderBy('name');
  	exclusionGr.query();
  	while(exclusionGr.next()) 
  		excludedTables.push(exclusionGr.getValue('name'));
  	
  } else {
  	var profilePreserverGr = new GlideAggregate(CloneConstants.tableName.CLONE_PROFILE_PRESERVER);
  	profilePreserverGr.addQuery('profile', cloneProfileSysId);
  	profilePreserverGr.addAggregate('COUNT', 'preserver.table');
  	profilePreserverGr.addOrderBy('preserver.table');
  	profilePreserverGr.query();
  	if(!profilePreserverGr.hasNext())
  		return CloneConstants.errorMsg.EMPTY_PRESERVERS;
  	
  	while(profilePreserverGr.next()) 
  		preserverTables.push(profilePreserverGr.getValue('preserver.table'));
  	
  	var profileExclusionGr = new GlideAggregate(CloneConstants.tableName.CLONE_PROFILE_EXCLUSION);
  	profileExclusionGr.addQuery('profile', cloneProfileSysId);
  	profileExclusionGr.addAggregate('COUNT', 'exclusion.name');
  	profileExclusionGr.addOrderBy('exclusion.name');
  	profileExclusionGr.query();
  	while(profileExclusionGr.next()) 
  		excludedTables.push(profileExclusionGr.getValue('exclusion.name'));
  }
  
  var errMsg = SystemCloneUtil.validateSysDbView(preserverTables);
  if(JSUtil.nil(errMsg))
  	return SystemCloneUtil.validateExclusionTablesNotAllowed(excludedTables);
  
  return errMsg;
};

/*
* Validates the cleanup scripts.
*/
SystemCloneUtil.validateCleanupScript = function(current) {
  if(gs.nil(current.getValue('name')))
  	return false;
  
  var cleanupScriptsGr = new GlideRecord(CloneConstants.tableName.CLONE_CLEANUP_SCRIPT);
  cleanupScriptsGr.addQuery('name', current.getValue('name'));
  cleanupScriptsGr.addQuery('sys_id', '!=', current.getValue('sys_id'));
  cleanupScriptsGr.query();
  
  if(cleanupScriptsGr.next()) 
  	return false;
  
  return true;
};

SystemCloneUtil.populateProfileName = function(current) {
  var sourceTable = current.getValue('source_table');
  var profileSysId = current.getValue('profile');
  
  if(!gs.nil(sourceTable) && !gs.nil(profileSysId)) {
  	var gr = new GlideRecord(sourceTable);
  	if(gr.get(profileSysId))
  		return gr.getValue('name');
  }
  return '';
};

/*
* Validates the exclusions.
*/
SystemCloneUtil.validateExclusion = function(current) {
  var tableName = current.getValue('name'),
  	table = current.getValue('table'),
  	excludedTable = [];
  
  if(gs.nil(tableName) && gs.nil(table))
  	return false;
  
  var exclusionGr = new GlideRecord(CloneConstants.tableName.CLONE_DATA_EXCLUSION);
  if(!gs.nil(tableName)) {
  	excludedTable.push(tableName);
  	exclusionGr.addQuery('name', tableName);
  } else {
  	excludedTable.push(table);
  	exclusionGr.addQuery('table', table);
  	exclusionGr.addQuery('condition', current.getValue('condition'));
  }
  
  exclusionGr.addQuery('sys_id', '!=', current.getValue('sys_id'));
  exclusionGr.query();
  if(exclusionGr.next()) 
  	return CloneConstants.errorMsg.EXCLUSION_EXISTS;

  return SystemCloneUtil.validateExclusionTablesNotAllowed(excludedTable);
};

/*
* Validates the exclusion against the tables that are not allowed to be excluded.
*/
SystemCloneUtil.validateExclusionTablesNotAllowed = function(tables) {
  var tablesNotAllowedList = [];
  tablesNotAllowedList.push('sys_db_object');
  tablesNotAllowedList.push('sys_db_object.*');
  
  if(gs.nil(tables) || !Array.isArray(tables))
  	return '';
  
  var arrUtil = new ArrayUtil();
  var matchingArray = arrUtil.intersect(tablesNotAllowedList, tables);
  if(matchingArray.length == 0)
  	return '';
  else
  	return CloneConstants.errorMsg.EXCLUSIONS_NOT_ALLOWED + matchingArray;
};

SystemCloneUtil.validateSysDbView = function(tables) {
  if(gs.nil(tables) || !Array.isArray(tables))
  	return '';
  
  if (gs.tableExists("sys_db_view")) {
  	while(tables.length > 0) {
  		var tablesList = tables.splice(0, 30);
  		var grView = new GlideRecord("sys_db_view");
  		grView.addQuery('name', 'IN', tablesList);
  		grView.query();
  		if(grView.next())
  			return CloneConstants.errorMsg.PRESERVER_DB_VIEW;
  	}
  }
  
  return '';
};

/*
* Validates the preservers.
*/
SystemCloneUtil.validatePreserver = function(current) {
  if(gs.nil(current.getValue('table')))
  	return;
  
  var preserverGr = new GlideRecord(CloneConstants.tableName.CLONE_DATA_PRESERVER);
  preserverGr.addQuery('table', current.getValue('table'));
  preserverGr.addQuery('condition', current.getValue('condition'));
  preserverGr.addQuery('sys_id', '!=', current.getValue('sys_id'));
  preserverGr.query();
  if(preserverGr.next()) 
  	return CloneConstants.errorMsg.PRESERVER_EXISTS;
  
  var tablesList = [];
  tablesList.push(current.getValue('table'));
  
  return SystemCloneUtil.validateSysDbView(tablesList);
};

SystemCloneUtil.fixSystemProfileConfigForQuebec = function() {
  var securityGr = new GlideRecord('sys_security_acl');
  securityGr.addEncodedQuery('nameLIKEclone_cleanup_script.*^ORnameLIKEclone_data_exclude.*^ORnameLIKEclone_data_preserver.*^ORnameLIKEclone_profile_exclusions.*^ORnameLIKEclone_profile_preservers.*^ORnameLIKEclone_profile_cleanup_scripts.*');
  securityGr.query();
  while(securityGr.next()) {
  	gs.info('ACL with sys_id ' + securityGr.getValue('sys_id') + ' deactivated.');
  	securityGr.active = false;
  	securityGr.update();
  }
  
  var exclusionGr = new GlideRecord(CloneConstants.tableName.CLONE_DATA_EXCLUSION);
  exclusionGr.addEncodedQuery('include_in_system_cloneISEMPTY');
  exclusionGr.query();
  while(exclusionGr.next()) {
  	exclusionGr['include_in_system_clone'] = true;
  	exclusionGr.setWorkflow(false);
  	exclusionGr.update();
  }

  var preserverGr = new GlideRecord(CloneConstants.tableName.CLONE_DATA_PRESERVER);
  preserverGr.addEncodedQuery('include_in_system_cloneISEMPTY');
  preserverGr.query();
  while(preserverGr.next()) {
  	preserverGr['include_in_system_clone'] = true;
  	preserverGr.setWorkflow(false);
  	preserverGr.update();
  }

  var cleanupScriptGr = new GlideRecord(CloneConstants.tableName.CLONE_CLEANUP_SCRIPT);
  cleanupScriptGr.addEncodedQuery('include_in_system_cloneISEMPTY');
  cleanupScriptGr.query();
  while(cleanupScriptGr.next()) {
  	cleanupScriptGr['include_in_system_clone'] = true;
  	cleanupScriptGr.setWorkflow(false);
  	cleanupScriptGr.update();
  }
  
  var profileExclusionGr = new GlideRecord(CloneConstants.tableName.CLONE_PROFILE_EXCLUSION);
  profileExclusionGr.addEncodedQuery('source_tableISEMPTY');
  profileExclusionGr.query();
  while(profileExclusionGr.next()) {
  	profileExclusionGr['source_table'] = 'clone_profile';
  	profileExclusionGr.setWorkflow(false);
  	profileExclusionGr.update();
  }
  
  var profilePreserverGr = new GlideRecord(CloneConstants.tableName.CLONE_PROFILE_PRESERVER);
  profilePreserverGr.addEncodedQuery('source_tableISEMPTY');
  profilePreserverGr.query();
  while(profilePreserverGr.next()) {
  	profilePreserverGr['source_table'] = 'clone_profile';
  	profilePreserverGr.setWorkflow(false);
  	profilePreserverGr.update();
  }
  
  var profileCleanupScriptGr = new GlideRecord(CloneConstants.tableName.CLONE_PROFILE_CLEANUP_SCRIPT);
  profileCleanupScriptGr.addEncodedQuery('source_tableISEMPTY');
  profileCleanupScriptGr.query();
  while(profileCleanupScriptGr.next()) {
  	profileCleanupScriptGr['source_table'] = 'clone_profile';
  	profileCleanupScriptGr.setWorkflow(false);
  	profileCleanupScriptGr.update();
  }
  
  var cloneProfileExclusionGr = new GlideRecord(CloneConstants.tableName.CLONE_PROFILE_EXCLUSION);
  cloneProfileExclusionGr.addEncodedQuery('exclusion.default=false^ORexclusion.defaultISEMPTY');
  cloneProfileExclusionGr.addQuery('profile', CloneConstants.SYSTEM_PROFILE_SYS_ID);
  cloneProfileExclusionGr.query();

  while(cloneProfileExclusionGr.next()) {
  	exclusionGr = cloneProfileExclusionGr.exclusion.getRefRecord();
  	if(!gs.nil(exclusionGr.getValue('sys_id'))) {
  		exclusionGr['default'] = true;
  		exclusionGr.setWorkflow(false);
  		gs.info('Exclusion ' + exclusionGr.getValue('name') + ' default checkbox updated to true.');
  		exclusionGr.update();
  	}
  }

  var cloneProfilePreserverGr = new GlideRecord(CloneConstants.tableName.CLONE_PROFILE_PRESERVER);
  cloneProfilePreserverGr.addEncodedQuery('preserver.default=false^ORpreserver.defaultISEMPTY');
  cloneProfilePreserverGr.addQuery('profile', CloneConstants.SYSTEM_PROFILE_SYS_ID);
  cloneProfilePreserverGr.query();

  while(cloneProfilePreserverGr.next()) {
  	preserverGr = cloneProfilePreserverGr.preserver.getRefRecord();
  	if(!gs.nil(preserverGr.getValue('sys_id'))) {
  		preserverGr['default'] = true;
  		preserverGr.setWorkflow(false);
  		gs.info('Preserver ' + preserverGr.getValue('name') + ' default checkbox updated to true.');
  		preserverGr.update();
  	}
  }

  var cloneProfileCleanupScriptGr = new GlideRecord(CloneConstants.tableName.CLONE_PROFILE_CLEANUP_SCRIPT);
  cloneProfileCleanupScriptGr.addEncodedQuery('cleanup_script.default=false^ORcleanup_script.defaultISEMPTY');
  cloneProfileCleanupScriptGr.addQuery('profile', CloneConstants.SYSTEM_PROFILE_SYS_ID);
  cloneProfileCleanupScriptGr.query();

  while(cloneProfileCleanupScriptGr.next()) {
  	cleanupScriptGr = cloneProfileCleanupScriptGr.cleanup_script.getRefRecord();
  	if(!gs.nil(cleanupScriptGr.getValue('sys_id'))) {
  		cleanupScriptGr['default'] = true;
  		cleanupScriptGr.setWorkflow(false);
  		gs.info('Cleanup Script ' + cleanupScriptGr.getValue('name') + ' default checkbox updated to true.');
  		cleanupScriptGr.update();
  	}
  }
};

Sys ID

12cfefda3b231010aaec0896c3efc4ac

Offical Documentation

Official Docs: