maximo-dev-tools
Version:
Tools used with the development of Maximo projects
1,049 lines (899 loc) • 56.3 kB
JavaScript
/* eslint-disable no-redeclare */
/* eslint-disable indent */
/* eslint-disable quotes */
/* eslint-disable no-undef */
// @ts-nocheck
load("nashorn:parser.js");
RESTRequest = Java.type("com.ibm.tivoli.oslc.RESTRequest");
MboConstants = Java.type("psdi.mbo.MboConstants");
SqlFormat = Java.type("psdi.mbo.SqlFormat");
MXServer = Java.type("psdi.server.MXServer");
MXAccessException = Java.type("psdi.util.MXAccessException");
MXApplicationException = Java.type("psdi.util.MXApplicationException");
MXException = Java.type("psdi.util.MXException");
Version = Java.type("psdi.util.Version");
ScriptBinding = Java.type("com.ibm.tivoli.maximo.script.ScriptBinding");
ScriptCache = Java.type("com.ibm.tivoli.maximo.script.ScriptCache");
ScriptDriverFactory = Java.type("com.ibm.tivoli.maximo.script.ScriptDriverFactory");
ScriptContext = Java.type("javax.script.ScriptContext");
ScriptEngineManager = Java.type("javax.script.ScriptEngineManager");
SimpleScriptContext = Java.type("javax.script.SimpleScriptContext");
ScriptException = Java.type("javax.script.ScriptException");
Integer = Java.type("java.lang.Integer");
RuntimeException = Java.type("java.lang.RuntimeException");
Runnable = Java.type("java.lang.Runnable");
System = Java.type("java.lang.System");
Thread = Java.type("java.lang.Thread");
Calendar = Java.type("java.util.Calendar");
HashMap = Java.type("java.util.HashMap");
NoSuchMethodException = Java.type("java.lang.NoSuchMethodException");
// Global input variables
scriptSource = "";
MXLoggerFactory = Java.type("psdi.util.logging.MXLoggerFactory");
var logger = MXLoggerFactory.getLogger("maximo.script." + service.getScriptName());
load({ script: ScriptCache.getInstance().getScriptInfo("SHARPTREE.AUTOSCRIPT.LIBRARY").getScriptSource(), name: "SHARPTREE.AUTOSCRIPT.LIBRARY" });
if (typeof httpMethod !== "undefined") {
main();
}
function main() {
var response = {};
try {
checkPermissions("SHARPTREE_UTILS", "DEPLOYSCRIPT");
var action;
if (typeof requestBody !== "undefined") {
action = getRequestAction();
if (httpMethod != "POST") {
throw new ScriptError("only_post_supported", "Only the HTTP POST method is supported when deploying automation scripts.");
}
scriptSource = requestBody;
if (!scriptSource) {
throw new ScriptError("no_script_source", "A script source must be the request body.");
}
if (action && action.startsWith("source")) {
scriptSource = requestBody;
if (!scriptSource) {
throw new ScriptError("no_script_source", "A script source must be the request body.");
}
var scriptConfig = getConfigFromScript(scriptSource, action.split("/")[1]);
var sqlf = new SqlFormat("autoscript = :1");
sqlf.setObject(1, "AUTOSCRIPT", "AUTOSCRIPT", scriptConfig.autoscript);
var autoScriptSet;
try {
autoScriptSet = MXServer.getMXServer().getMboSet("AUTOSCRIPT", userInfo);
autoScriptSet.setWhere(sqlf.format());
if (!autoScriptSet.isEmpty()) {
response = {};
response.source = autoScriptSet.getMbo(0).getString("SOURCE");
responseBody = JSON.stringify(response);
return;
} else {
response = {};
response.source = "";
responseBody = JSON.stringify(response);
return;
}
} finally {
_close(autoScriptSet);
}
} else if (action && action == "config") {
deployConfig(JSON.parse(requestBody));
return;
}
} else if (typeof request !== "undefined" && typeof httpMethod !== "undefined") {
if (httpMethod === "GET") {
if (request.getQueryParam("deployId")) {
responseBody = JSON.stringify(getDeploymentResult(request.getQueryParam("deployId")));
return;
} else {
action = getRequestAction();
if (action) {
if (action.startsWith("version")) {
var response = { version: getScriptVersion("SHARPTREE.AUTOSCRIPT.DEPLOY") };
responseBody = JSON.stringify(response);
return;
}
}
}
} else if (httpMethod == "PUT") {
if (request.getQueryParam("deployId") && request.getQueryParam("cancel") == "true") {
var bulletinBoardSet = MXServer.getMXServer().getMboSet("BULLETINBOARD", userInfo);
try {
var bulletinBoard = bulletinBoardSet.getMboForUniqueId(request.getQueryParam("deployId"));
if (bulletinBoard) {
bulletinBoard.delete();
bulletinBoardSet.save();
}
responseBody = JSON.stringify({ "deploying": false, "status": "success" });
return;
} finally {
_close(bulletinBoardSet);
}
}
}
}
// if the script source is available then call the deploy script.
// This allows the deployScript function to be called from the context directly if the script it loaded from another script.
if (scriptSource) {
var response = deployScript(scriptSource, action);
responseBody = JSON.stringify(response);
}
} catch (error) {
response.status = "error";
// ensure the error is logged to the Maximo logs
Java.type("java.lang.System").out.println(error);
if (error instanceof ScriptError) {
response.message = error.message;
response.reason = error.reason;
} else if (error instanceof SyntaxError) {
response.reason = "syntax_error";
response.message = error.message;
} else if (error instanceof Error) {
response.message = error.message;
} else if (error instanceof MXException) {
response.reason = error.getErrorGroup() + "_" + error.getErrorKey();
response.message = error.getMessage();
} else if (error instanceof RuntimeException) {
if (error.getCause() instanceof MXException) {
response.reason = error.getCause().getErrorGroup() + "_" + error.getCause().getErrorKey();
response.message = error.getCause().getMessage();
} else {
response.reason = "runtime_exception";
response.message = error.getMessage();
}
} else {
response.cause = error;
}
if (typeof httpMethod !== "undefined") {
responseBody = JSON.stringify(response);
}
service.log_error(error);
return;
}
if (typeof response.status === "undefined" || response.status == null) {
response.status = "success";
}
if (typeof requestBody !== "undefined" && requestBody) {
responseBody = JSON.stringify(response);
}
return;
}
function deployScript(scriptSource, language) {
var scriptConfig = getConfigFromScript(scriptSource, language);
var deployId = -1;
var result = { "scriptName": scriptConfig.autoscript };
if (scriptConfig) {
validateScriptConfig(scriptConfig);
var autoScriptSet;
try {
autoScriptSet = MXServer.getMXServer().getMboSet("AUTOSCRIPT", userInfo);
var sqlf = new SqlFormat("autoscript = :1");
sqlf.setObject(1, "AUTOSCRIPT", "AUTOSCRIPT", scriptConfig.autoscript);
autoScriptSet.setWhere(sqlf.format());
var autoscript;
if (autoScriptSet.isEmpty()) {
autoscript = autoScriptSet.add();
autoscript.setValue("AUTOSCRIPT", scriptConfig.autoscript);
autoscript.setValue("SCRIPTLANGUAGE", language ? language : "javascript");
autoscript.setValue("ACTIVE", true);
} else {
autoscript = autoScriptSet.getMbo(0);
}
autoscript.setValue("SOURCE", scriptSource);
var autoScriptId = autoscript.getUniqueIDValue();
// Delete all the launch points to ensure they are recreated correctly.
// Deleting the launch variables first so the script variables can be deleted without reference errors.
scriptLaunchPointSet = autoscript.getMboSet("SCRIPTLAUNCHPOINT");
scriptLaunchPointSet.deleteAll();
autoScriptSet.save();
//Refetch the auto script
autoScriptSet.reset();
autoscript = autoScriptSet.getMboForUniqueId(autoScriptId);
// Delete the script variables to ensure they are recreated correctly.
autoScriptVarsSet = autoscript.getMboSet("AUTOSCRIPTVARS");
autoScriptVarsSet.deleteAll();
autoScriptSet.save();
//Refetch the auto script
autoScriptSet.reset();
autoscript = autoScriptSet.getMboForUniqueId(autoScriptId);
scriptLaunchPointSet = autoscript.getMboSet("SCRIPTLAUNCHPOINT");
autoScriptVarsSet = autoscript.getMboSet("AUTOSCRIPTVARS");
if (scriptConfig.description) {
autoscript.setValue("DESCRIPTION", scriptConfig.description);
}
setValueIfAvailable(autoscript, "DESCRIPTION", scriptConfig.description);
setValueIfAvailable(autoscript, "VERSION", scriptConfig.version);
setValueIfAvailable(autoscript, "ACTIVE", scriptConfig.active);
setValueIfAvailable(autoscript, "LOGLEVEL", scriptConfig.logLevel);
setValueIfAvailable(autoscript, "INTERFACE", scriptConfig.allowInvokingScriptFunctions);
if (typeof scriptConfig.autoScriptVars !== "undefined") {
scriptConfig.autoScriptVars.forEach(function (element) {
if (typeof element.varname !== "undefined") {
var autoScriptVar = autoScriptVarsSet.add();
autoScriptVar.setValue("VARNAME", element.varname);
setValueIfAvailable(autoScriptVar, "DESCRIPTION", element.description);
setValueIfAvailable(autoScriptVar, "VARBINDINGTYPE", element.varBindingType);
setValueIfAvailable(autoScriptVar, "VARTYPE", element.varType);
setValueIfAvailable(autoScriptVar, "ALLOWOVERRIDE", element.allowOverride);
if (element.varBindingType.toUpperCase() != "LITERAL" && element.varType.toUpperCase() != "IN") {
setValueIfAvailable(autoScriptVar, "NOVALIDATION", element.noValidation);
setValueIfAvailable(autoScriptVar, "NOACCESSCHECK", element.noAccessCheck);
setValueIfAvailable(autoScriptVar, "NOACTION", element.noAction);
}
setValueIfAvailable(autoScriptVar, "LITERALDATATYPE", element.literalDataType);
setValueIfAvailable(autoScriptVar, "VARBINDINGVALUE", element.varBindingValue, MboConstants.NOACCESSCHECK);
}
});
}
if (scriptConfig.scriptLaunchPoints) {
scriptConfig.scriptLaunchPoints.forEach(function (element) {
if (typeof element.launchPointName !== "undefined" && typeof element.launchPointType !== "undefined") {
var scriptLaunchPoint = scriptLaunchPointSet.add();
scriptLaunchPoint.setValue("LAUNCHPOINTNAME", element.launchPointName);
scriptLaunchPoint.setValue("LAUNCHPOINTTYPE", element.launchPointType, MboConstants.NOACCESSCHECK);
if (typeof element.active !== "undefined") {
scriptLaunchPoint.setValue("ACTIVE", element.active);
} else {
scriptLaunchPoint.setValue("ACTIVE", true);
}
setValueIfAvailable(scriptLaunchPoint, "DESCRIPTION", element.description);
if (element.launchPointType.toUpperCase() === "OBJECT") {
if (typeof element.objectName === "undefined") {
throw new ScriptError("missing_attribute", "The objectName is a required attribute when defining an Object launch point.");
}
scriptLaunchPoint.setValue("OBJECTNAME", element.objectName);
setValueIfAvailable(scriptLaunchPoint, "CONDITION", element.condition);
if (typeof element.initializeValue !== "undefined" && element.initializeValue) {
scriptLaunchPoint.setValue("EVENTTYPE", "0");
} else if (typeof element.validateApplication !== "undefined" && element.validateApplication) {
scriptLaunchPoint.setValue("EVENTTYPE", "1");
} else if (typeof element.allowObjectCreation !== "undefined" && element.allowObjectCreation) {
scriptLaunchPoint.setValue("EVENTTYPE", "2");
} else if (typeof element.allowObjectDeletion !== "undefined" && element.allowObjectDeletion) {
scriptLaunchPoint.setValue("EVENTTYPE", "3");
} else if (typeof element.save !== "undefined" && element.save) {
scriptLaunchPoint.setValue("EVENTTYPE", "4");
var saveActionAdded = false;
if (typeof element.add !== "undefined" && element.add) {
scriptLaunchPoint.setValue("ADD", true);
saveActionAdded = true;
}
if (typeof element.update !== "undefined" && element.update) {
scriptLaunchPoint.setValue("UPDATE", true);
saveActionAdded = true;
}
if (typeof element.delete !== "undefined" && element.delete) {
scriptLaunchPoint.setValue("DELETE", true);
saveActionAdded = true;
}
if (!saveActionAdded) {
throw new ScriptError(
"missing_save_action",
"At least one object save action of either add, update, or delete must be provided."
);
}
var saveWhenAdded = false;
if (typeof element.beforeSave !== "undefined" && element.beforeSave) {
scriptLaunchPoint.setValue("EVCONTEXT", "0");
saveWhenAdded = true;
} else if (typeof element.afterSave !== "undefined" && element.afterSave) {
scriptLaunchPoint.setValue("EVCONTEXT", "1");
saveWhenAdded = true;
} else if (typeof element.afterCommit !== "undefined" && element.afterCommit) {
scriptLaunchPoint.setValue("EVCONTEXT", "2");
saveWhenAdded = true;
}
if (!saveWhenAdded) {
throw new ScriptError(
"missing_action_type",
"A save action type of beforeSave, afterSave, or afterCommit must be provided."
);
}
} else {
throw new ScriptError(
"missing_attribute",
"One of the following attributes is required when defining an Object launch point: initializeValue, validateApplication, allowObjectCreation, allowObjectDeletion, or save."
);
}
} else if (element.launchPointType.toUpperCase() === "ATTRIBUTE") {
if (element.objectName === "undefined") {
throw new ScriptError("missing_attribute", "The objectName is a required attribute when defining an Attribute launch point.");
}
if (element.attributeName === "undefined") {
throw new ScriptError(
"missing_attribute",
"The attributeName is a required attribute when defining an Attribute launch point."
);
}
scriptLaunchPoint.setValue("OBJECTNAME", element.objectName);
scriptLaunchPoint.setValue("ATTRIBUTENAME", element.attributeName);
if (typeof element.initializeAccessRestriction !== "undefined" && element.initializeAccessRestriction) {
scriptLaunchPoint.setValue("ATTRIBUTEEVENT", "0");
} else if (typeof element.initializeValue !== "undefined" && element.initializeValue) {
scriptLaunchPoint.setValue("ATTRIBUTEEVENT", "1");
} else if (typeof element.validate !== "undefined" && element.validate) {
scriptLaunchPoint.setValue("ATTRIBUTEEVENT", "2");
} else if (typeof element.retrieveList !== "undefined" && element.retrieveList) {
scriptLaunchPoint.setValue("ATTRIBUTEEVENT", "3");
} else if (typeof element.runAction !== "undefined" && element.runAction) {
scriptLaunchPoint.setValue("ATTRIBUTEEVENT", "4");
} else {
throw new ScriptError(
"missing_attribute",
"One of the following attributes is required when defining an Attribute launch point: initializeAccessRestriction, initializeValue, validate, retrieveList or runAction."
);
}
} else if (element.launchPointType.toUpperCase() === "ACTION") {
if (typeof element.actionName === "undefined") {
throw new ScriptError("missing_attribute", "The actionName is required when defining an Action launch point");
}
scriptLaunchPoint.setValue("ACTIONNAME", element.actionName);
setValueIfAvailable(scriptLaunchPoint, "OBJECTNAME", element.objectName);
} else if (element.launchPointType.toUpperCase() === "CUSTOMCONDITION") {
setValueIfAvailable(scriptLaunchPoint, "OBJECTNAME", element.objectName);
} else {
throw new ScriptError("unknown_launchpoint_type", "The launch point type " + element.launchPointType + " is not supported.");
}
if (typeof element.launchPointVars !== "undefined") {
var launchPointVarsSet = scriptLaunchPoint.getMboSet("LAUNCHPOINTVARS");
if (launchPointVarsSet.isEmpty()) {
throw new ScriptError(
"no_variable_defined",
"A launch point variable has been defined, but there are no script variables defined."
);
}
element.launchPointVars.forEach(function (elementChild) {
if (typeof elementChild.varName === "undefined" || typeof elementChild.varBindingValue === "undefined") {
throw new ScriptError(
"missing_attribute",
"A varName and varBindingValue are required when defining a launch point variable."
);
}
var launchPointVars = launchPointVarsSet.moveFirst();
var found = false;
while (launchPointVars && !found) {
if (launchPointVars.getString("VARNAME").equalsIgnoreCase(elementChild.varName)) {
launchPointVars.setValue("OVERRIDDEN", true, MboConstants.NOACCESSCHECK);
launchPointVars.setValue("VARBINDINGVALUE", elementChild.varBindingValue, MboConstants.NOACCESSCHECK);
found = true;
}
launchPointVars = launchPointVarsSet.moveNext();
}
if (!found) {
throw new ScriptError(
"no_variable_defined",
"The launch point variable " +
elementChild.varName +
" has been defined, but there is no corresponding script variable."
);
}
});
}
} else {
throw new ScriptError(
"missing_attribute",
"The launchPointName and launchPointType are required attributes when defining a script launch point."
);
}
});
}
autoScriptSet.save();
try {
// save the configuration details.
service
.invokeScript("SHARPTREE.AUTOSCRIPT.STORE")
.createOrUpdateScript(scriptConfig.autoscript.toUpperCase(), scriptSource, userInfo.getUserName());
} catch (error) {
log_error("Error saving script configuration history." + JSON.stringify(error));
}
var messages = scriptConfig.messages;
if (Array.isArray(messages)) {
messages.forEach(function (message) {
createOrUpdateMessage(message);
});
}
var maxvars = scriptConfig.maxvars;
if (Array.isArray(maxvars)) {
maxvars.forEach(function (maxvar) {
createOrUpdateMaxVar(maxvar);
});
}
var properties = scriptConfig.properties;
if (Array.isArray(properties)) {
properties.forEach(function (property) {
createOrUpdateProperty(property);
});
}
var ctx = new HashMap();
if (scriptConfig.onDeploy) {
var manager = new ScriptEngineManager();
var engine = manager.getEngineByName(language ? language : "javascript");
var bindings = engine.createBindings();
if (!bindings.put) {
var ctx = new HashMap();
ctx.put("service", service);
ctx.put("request", request);
ctx.put("userInfo", userInfo);
ctx.put("onDeploy", true);
bindings = new ScriptBinding(ctx);
} else {
bindings.put("service", service);
bindings.put("request", request);
bindings.put("userInfo", userInfo);
bindings.put("onDeploy", true);
}
engine.getContext().setBindings(bindings, ScriptContext.GLOBAL_SCOPE);
engine.eval(scriptSource);
try {
engine.invokeFunction(scriptConfig.onDeploy);
} catch (error) {
if (error instanceof NoSuchMethodException) {
throw new ScriptError("ondeploy_function_notfound", 'The onDeploy function "' + scriptConfig.onDeploy + '" was not found.');
} else if (error instanceof ScriptException) {
throw new ScriptError("error_ondeploy", 'Error calling onDeploy function "' + scriptConfig.onDeploy + '" :' + error.message);
}
}
} else if (typeof scriptConfig.onDeployScript !== "undefined" && scriptConfig.onDeployScript) {
var deployScript = ScriptCache.getInstance().getScriptInfo(scriptConfig.onDeployScript);
if (deployScript) {
var ctx = new HashMap();
ctx.put("service", service);
ctx.put("request", request);
ctx.put("userInfo", userInfo);
ctx.put("onDeploy", true);
ScriptDriverFactory.getInstance().getScriptDriver(deployScript.getName()).runScript(deployScript.getName(), ctx);
if (typeof scriptConfig.deleteDeployScript === "undefined" || scriptConfig.deleteDeployScript == null || scriptConfig.deleteDeployScript) {
var deployAutoScriptSet;
try {
deployAutoScriptSet = MXServer.getMXServer().getMboSet("AUTOSCRIPT", userInfo);
var deploySqlf = new SqlFormat("autoscript = :1");
deploySqlf.setObject(1, "AUTOSCRIPT", "AUTOSCRIPT", deployScript.getName());
deployAutoScriptSet.setWhere(deploySqlf.format());
var deployAutoScript = deployAutoScriptSet.moveFirst();
if (deployAutoScript) {
deployAutoScript.delete();
deployAutoScriptSet.save();
}
} finally {
_close(deployAutoScriptSet);
}
}
}
} else {
var deployScript = ScriptCache.getInstance().getScriptInfo(scriptConfig.autoscript + ".DEPLOY");
if (deployScript) {
var bulletinBoardSet = MXServer.getMXServer().getMboSet("BULLETINBOARD", userInfo);
try {
var bulletinBoard = bulletinBoardSet.add();
bulletinBoard.setValue("SUBJECT", "Deploy script configuration " + scriptConfig.autoscript);
bulletinBoard.setValue("MESSAGE", "Deployment progress is being tracked in the associated Communication Log.");
var progress = {
"description": "Deploying script configuration " + scriptConfig.autoscript,
"progress": []
};
var commlog = bulletinBoard.getMboSet("COMMLOG").add();
commlog.setValue("SENDFROM", service.getProperty("mxe.adminEmail"));
commlog.setValue("MESSAGE", JSON.stringify(progress, null, 4));
var calendar = Calendar.getInstance();
calendar.setTime(bulletinBoard.getDate("POSTDATE"));
calendar.add(Calendar.MINUTE, 30);
bulletinBoard.setValue("EXPIREDATE", calendar.getTime());
bulletinBoardSet.save();
deployId = bulletinBoard.getUniqueIDValue();
} finally {
_close(bulletinBoardSet);
}
var updateProgress = function (progress) {
if (typeof deployId !== "undefined") {
var bulletinBoardSet;
try {
bulletinBoardSet = MXServer.getMXServer().getMboSet("BULLETINBOARD", MXServer.getMXServer().getSystemUserInfo());
var bulletinBoard = bulletinBoardSet.getMboForUniqueId(deployId);
if (bulletinBoard) {
var message = JSON.parse(bulletinBoard.getString("COMMLOG.MESSAGE"));
message.progress.push({
"message": progress,
"timestamp": Java.type("psdi.util.MXFormat").dateTimeToString(MXServer.getMXServer().getDate())
});
bulletinBoard.setValue("COMMLOG.MESSAGE", JSON.stringify(message, null, 4));
bulletinBoardSet.save();
} else {
throw Error("The script deployment bulletin board record with id " + deployId + " was not found. Cancelling deployment.");
}
} catch (error) {
Java.type("java.lang.System").out.println("Error updating progress: " + error);
throw error;
} finally {
if(bulletinBoardSet){
bulletinBoardSet.cleanup();
bulletinBoardSet.close();
}
}
}
};
var ctx = new HashMap();
ctx.put("service", service);
ctx.put("request", request);
ctx.put("userInfo", userInfo);
ctx.put("onDeploy", true);
ctx.put("updateProgress", updateProgress);
var backgroundUserInfo = userInfo;
var ScriptDeployRunner = Java.extend(Runnable, {
run: function () {
var bulletinBoardSet = MXServer.getMXServer().getMboSet("BULLETINBOARD", backgroundUserInfo);
try {
ScriptDriverFactory.getInstance().getScriptDriver(deployScript.getName()).runScript(deployScript.getName(), ctx);
var bulletinBoard = bulletinBoardSet.getMboForUniqueId(deployId);
if (bulletinBoard) {
bulletinBoard.delete();
bulletinBoardSet.save();
}
} catch (error) {
var bulletinBoard = bulletinBoardSet.getMboForUniqueId(deployId);
if (bulletinBoard) {
var progress = JSON.parse(bulletinBoard.getString("COMMLOG.MESSAGE"));
if (error.getErrorGroup() == "script" && error.getErrorKey() == "errorrunningscript") {
progress.error =
Java.type("psdi.util.MXExceptionMediator").getMessage(error.getDetail(), MXServer.getMXServer().getBaseLang()) +
" of script " +
error.getParameters()[0];
} else {
progress.error = error.getMessage();
}
bulletinBoard.setValue("STATUS", "REJECTED");
bulletinBoard.setValue("COMMLOG.MESSAGE", JSON.stringify(progress, null, 4));
bulletinBoardSet.save();
}
Java.type("java.lang.System").out.println(error);
if (typeof service !== "undefined") {
service.log_error("Script Deployment Error", error);
}
} finally {
_close(bulletinBoardSet);
// remove the deploy script.
if (
typeof scriptConfig.deleteDeployScript === "undefined" ||
scriptConfig.deleteDeployScript == null ||
scriptConfig.deleteDeployScript
) {
var deployAutoScriptSet;
try {
deployAutoScriptSet = MXServer.getMXServer().getMboSet("AUTOSCRIPT", userInfo);
var deploySqlf = new SqlFormat("autoscript = :1");
deploySqlf.setObject(1, "AUTOSCRIPT", "AUTOSCRIPT", deployScript.getName());
deployAutoScriptSet.setWhere(deploySqlf.format());
var deployAutoScript = deployAutoScriptSet.moveFirst();
if (deployAutoScript) {
deployAutoScript.delete();
deployAutoScriptSet.save();
}
} finally {
_close(deployAutoScriptSet);
}
}
}
}
});
var scriptDeployRunner = new Thread(new ScriptDeployRunner());
scriptDeployRunner.start();
result = getDeploymentResult(deployId);
if (result.deploying) {
result.deployid = deployId;
}
result.scriptName = scriptConfig.autoscript;
return result;
}
}
} finally {
_close(autoScriptSet);
}
return result;
} else {
throw new ScriptError("config_not_found", "Configuration variable scriptConfig was not found in the script.");
}
}
function getDeploymentResult(deployId) {
try {
var bulletinBoardSet = MXServer.getMXServer().getMboSet("BULLETINBOARD", userInfo);
var entry = bulletinBoardSet.getMboForUniqueId(deployId);
if (entry) {
var message = JSON.parse(entry.getString("COMMLOG.MESSAGE"));
if (entry.getString("STATUS") == "REJECTED") {
message.status = "error";
message.error = JSON.parse(entry.getString("COMMLOG.MESSAGE")).error;
message.deploying = false;
return message;
} else {
message.deploying = true;
message.status = "success";
return message;
}
} else {
return { "deploying": false };
}
} finally {
_close(bulletinBoardSet);
}
}
function setValueIfAvailable(mbo, attribute, value) {
if (typeof value !== "undefined") {
mbo.setValue(attribute, value);
}
}
function checkPermissions(app, optionName) {
if (!userInfo) {
throw new ScriptError("no_user_info", "The userInfo global variable has not been set, therefore the user permissions cannot be verified.");
}
if (!MXServer.getMXServer().lookup("SECURITY").getProfile(userInfo).hasAppOption(app, optionName) && !isInAdminGroup()) {
throw new ScriptError(
"no_permission",
"The user " + userInfo.getUserName() + " does not have access to the " + optionName + " option in the " + app + " object structure."
);
}
}
// Determines if the current user is in the administrator group, returns true if the user is, false otherwise.
function isInAdminGroup() {
var user = userInfo.getUserName();
service.log_info("Determining if the user " + user + " is in the administrator group.");
var groupUserSet;
try {
groupUserSet = MXServer.getMXServer().getMboSet("GROUPUSER", MXServer.getMXServer().getSystemUserInfo());
// Get the ADMINGROUP MAXVAR value.
var adminGroup = MXServer.getMXServer().lookup("MAXVARS").getString("ADMINGROUP", null);
// Query for the current user and the found admin group.
// The current user is determined by the implicity `user` variable.
sqlFormat = new SqlFormat("userid = :1 and groupname = :2");
sqlFormat.setObject(1, "GROUPUSER", "USERID", user);
sqlFormat.setObject(2, "GROUPUSER", "GROUPNAME", adminGroup);
groupUserSet.setWhere(sqlFormat.format());
if (!groupUserSet.isEmpty()) {
service.log_info("The user " + user + " is in the administrator group " + adminGroup + ".");
return true;
} else {
service.log_info("The user " + user + " is not in the administrator group " + adminGroup + ".");
return false;
}
} finally {
_close(groupUserSet);
}
}
function getConfigFromScript(scriptSource, languageHint) {
if (scriptSource) {
if (languageHint === "python" || languageHint === "jython") {
// var regex = / *scriptConfig.*"""((.|\n|\r)*)"""/gm;
var regex = /^(?!#).*scriptConfig.*"""(.|\n|\r)*?"""/gm;
var found = scriptSource.match(regex);
if (found && found.length == 1) {
var config = found[0];
config = config.trim().substring(config.indexOf("{"), config.length - 3);
return JSON.parse(config);
} else {
throw new ScriptError("config_not_found", "Configuration variable scriptConfig was not found in the script.");
}
} else {
var ast;
try {
ast = parse(scriptSource);
} catch (error) {
// attempt to parse python script
try {
return getConfigFromPythonScript(scriptSource);
} catch (error) {
log_error(JSON.stringify(error));
throw new ScriptError("parsing_error", "Error parsing script, please see log for details.");
}
}
if (ast.type === "Program" && ast.body) {
var result;
ast.body.forEach(function (element) {
if (element.type === "VariableDeclaration") {
if (element.declarations) {
element.declarations.forEach(function (declaration) {
if (declaration.id && declaration.id.type === "Identifier" && declaration.id.name === "scriptConfig") {
result = astToJavaScript(declaration.init);
}
});
}
}
});
if (result) {
return result;
} else {
throw new ScriptError("config_not_found", "Configuration variable scriptConfig was not found in the script.");
}
} else {
throw new ScriptError("script_wrong_type", "The script must be of type Program and have a body to be deployed.");
}
}
} else {
throw new ScriptError("no_script_source", "The script source is required to deploy the script.");
}
}
function getConfigFromPythonScript(source) {
var regex = /^(?!#).*scriptConfig.*"""(.|\n|\r)*?"""/gm;
var found = scriptSource.match(regex);
if (found && found.length == 1) {
var config = found[0];
config = config.trim().substring(config.indexOf("{"), config.length - 3);
return JSON.parse(config);
} else {
throw new ScriptError("config_not_found", "Configuration variable scriptConfig was not found in the script.");
}
}
function createOrUpdateProperty(property) {
if (typeof property.propName === "undefined" || !property.propName) {
throw new ScriptError("message_missing_varname", 'The property record is missing the required property "propName"');
}
var maxPropSet;
try {
maxPropSet = MXServer.getMXServer().getMboSet("MAXPROP", MXServer.getMXServer().getSystemUserInfo());
var sqlf = new SqlFormat("propname = :1");
sqlf.setObject(1, "MAXPROP", "PROPNAME", property.propName);
maxPropSet.setWhere(sqlf.format());
if (property.delete) {
if (!maxPropSet.isEmpty()) {
maxPropSet.moveFirst().delete();
}
} else {
var maxProp;
if (maxPropSet.isEmpty()) {
maxProp = maxPropSet.add();
maxProp.setValue("PROPNAME", property.propName);
} else {
maxProp = maxPropSet.moveFirst();
}
if (typeof property.secureLevel !== "undefined") {
maxProp.setValue("SECURELEVEL", property.secureLevel);
}
if (typeof property.maxType !== "undefined") {
maxProp.setValue("MAXTYPE", property.maxType);
}
if (typeof property.description !== "undefined" && property.description) {
maxProp.setValue("DESCRIPTION", property.description);
}
if (typeof property.encrypted !== "undefined") {
maxProp.setValue("ENCRYPTED", property.encrypted);
}
if (typeof property.masked !== "undefined") {
maxProp.setValue("MASKED", property.masked);
}
if (typeof property.globalOnly !== "undefined") {
maxProp.setValue("GLOBALONLY", property.globalOnly);
}
if (typeof property.onlineChanges !== "undefined") {
maxProp.setValue("ONLINECHANGES", property.onlineChanges);
}
if (typeof property.liveRefresh !== "undefined") {
maxProp.setValue("LIVEREFRESH", property.liveRefresh);
}
if (typeof property.domainId !== "undefined") {
maxProp.setValue("DOMAINID", property.domainId);
} else {
maxProp.setValueNull("DOMAINID");
}
if (typeof property.nullsAllowed !== "undefined") {
maxProp.setValue("NULLSALLOWED", property.nullsAllowed);
}
var propValueSet = maxProp.getMboSet("MAXPROPVALUE");
var propValue;
if (propValueSet.isEmpty()) {
propValue = propValueSet.add();
} else {
propValue = propValueSet.moveFirst();
}
var toBeAdded = propValue.toBeAdded();
if (typeof property.propValue !== "undefined" && property.propValue) {
propValue.setValue("PROPVALUE", property.propValue, MboConstants.NOACCESSCHECK);
}
}
maxPropSet.save();
if (toBeAdded && typeof property.initialPropValue !== "undefined" && property.initialPropValue) {
var id = maxProp.getUniqueIDValue();
maxPropSet.reset();
maxPropSet.getMboForUniqueId(id).getMboSet("MAXPROPVALUE").moveFirst().setValue("PROPVALUE", property.initialPropValue, MboConstants.NOACCESSCHECK);
maxPropSet.save();
}
MXServer.getMXServer().reloadMaximoCache("MAXPROP", property.propName, true);
} finally {
_close(maxPropSet);
}
}
function createOrUpdateMaxVar(maxvar) {
if (typeof maxvar.varName === "undefined" || !maxvar.varName) {
throw new ScriptError("message_missing_varname", 'The maxvar record is missing the required property "varName"');
} else {
maxvar.varName = maxvar.varName.toUpperCase();
}
if (typeof maxvar.varType === "undefined" || !maxvar.varType) {
throw new ScriptError("message_missing_vartype", 'The maxvar record is missing the required property "varType"');
} else {
maxvar.varType = maxvar.varType.toUpperCase();
}
var maxvarTypeSet;
try {
maxvarTypeSet = MXServer.getMXServer().getMboSet("MAXVARTYPE", MXServer.getMXServer().getSystemUserInfo());
var sqlf = new SqlFormat("varname = :1");
sqlf.setObject(1, "MAXVARTYPE", "VARNAME", maxvar.varName);
maxvarTypeSet.setWhere(sqlf.format());
var maxvarType;
if (typeof maxvar.delete !== "undefined" && maxvar.delete) {
if (!maxvarTypeSet.isEmpty()) {
var maxvarType = maxvarTypeSet.moveFirst();
maxvarType.getMboSet("MAXVARS").deleteAll();
maxvarType.delete();
}
} else {
if (maxvarTypeSet.isEmpty()) {
maxvarType = maxvarTypeSet.add();
maxvarType.setValue("VARNAME", maxvar.varName);
maxvarType.setValue("VARTYPE", maxvar.varType);
var id = maxvarType.getUniqueIDValue();
maxvarTypeSet.save();
maxvarTypeSet.reset();
maxvarType = maxvarTypeSet.getMboForUniqueId(id);
} else {
maxvarType = maxvarTypeSet.moveFirst();
}
if (typeof maxvar.defaultValue !== "undefined" && maxvar.defaultValue) {
maxvarType.setValue("DEFAULTVALUE", maxvar.defaultValue);
} else {
maxvarType.setValueNull("DEFAULTVALUE");
}
if (typeof maxvar.description !== "undefined" && maxvar.description) {
maxvarType.setValue("DESCRIPTION", maxvar.description);
} else {
maxvarType.setValueNull("DESCRIPTION");
}
var maxvarsValueSet = maxvarType.getMboSet("MAXVARS");
var maxvarsValue;
if (maxvarsValueSet.isEmpty()) {
maxvarsValue = maxvarsValueSet.add();
maxvarsValue.setValue("VARNAME", maxvar.varName);
maxvarsValue.setValue("VARTYPE", maxvar.varType);
if (typeof maxvar.orgId !== "undefined" && maxvar.orgId) {
maxvarsValue.setValue("ORGID", maxvar.orgId);
}
if (typeof maxvar.siteId !== "undefined" && maxvar.siteId) {
maxvarsValue.setValue("SITEID", maxvar.siteId);
}
} else {
maxvarsValue = maxvarsValueSet.moveFirst();
}
if (typeof maxvar.varValue !== "undefined") {
maxvarsValue.setValue("VARVALUE", maxvar.varValue);
} else {
maxvarsValue.setValueNull("VARVALUE");
}
}
maxvarTypeSet.save();
} finally {
_close(maxvarTypeSet);
}
}
function createOrUpdateMessage(message) {
if (typeof message.msgGroup === "undefined" || !message.msgGroup || typeof message.msgKey === "undefined" || !message.msgKey) {
throw new ScriptError(
"message_missing_group_or_key",
"The message: \n" + JSON.stringify(message, null, 4) + "\nis missing either a msgKey or msgGroupp value."
);
}
if (typeof message.value === "undefined" || !message.value) {
throw new ScriptError("message_missing_value", "The message: " + message.msgGroup + ":" + message.msgKey + "\nis missing a message value.");
}
if (typeof message.prefix === "undefined" || !message.prefix) {
message.prefix = "BMXZZ";
}
if (typeof message.suffix === "undefined" || !message.suffix) {
message.suffix = "E";
}
if (typeof message.displayMethod === "undefined" || !message.displayMethod) {
message.displayMethod = "MSGBOX";
}
if (typeof message.value === "undefined" || !message.value) {
message.displayMethod = " ";
}
var maxMessagesSet;
try {
maxMessagesSet = MXServer.getMXServer().getMboSet("MAXMESSAGES", MXServer.getMXServer().getSystemUserInfo());
var sqlf = new SqlFormat("msggroup = :1 and msgkey = :2");
sqlf.setObject(1, "MAXMESSAGES", "MSGGROUP", message.msgGroup);
sqlf.setObject(2, "MAXMESSAGES", "MSGKE