maximo-dev-tools
Version:
Tools used with the development of Maximo projects
611 lines (519 loc) • 21.9 kB
JavaScript
/* eslint-disable no-redeclare */
/* eslint-disable indent */
/* eslint-disable quotes */
/* eslint-disable no-undef */
// @ts-nocheck
RESTRequest = Java.type("com.ibm.tivoli.oslc.RESTRequest");
RuntimeException = Java.type("java.lang.RuntimeException");
System = Java.type("java.lang.System");
URLDecoder = Java.type("java.net.URLDecoder");
StandardCharsets = Java.type("java.nio.charset.StandardCharsets");
MboConstants = Java.type("psdi.mbo.MboConstants");
SqlFormat = Java.type("psdi.mbo.SqlFormat");
MXServer = Java.type("psdi.server.MXServer");
MXException = Java.type("psdi.util.MXException");
MXAccessException = Java.type("psdi.util.MXAccessException");
MXApplicationException = Java.type("psdi.util.MXApplicationException");
MXLoggerFactory = Java.type("psdi.util.logging.MXLoggerFactory");
var logger = MXLoggerFactory.getLogger("maximo.script." + service.getScriptName());
main();
function main() {
if (typeof httpMethod !== "undefined") {
var response = {};
try {
checkPermissions("SHARPTREE_UTILS", "DEPLOYSCRIPT");
if (httpMethod.toLowerCase() === "get") {
var scriptName = getRequestScriptName();
if (typeof scriptName === "undefined" || scriptName === null || !scriptName) {
throw new ScriptError("missing_script_name", "The script name was not provided. " + userInfo.getUserName());
}
response.status = "success";
response.script = extractScript(scriptName);
response.scriptLanguage = getScriptLanguage(scriptName);
responseBody = JSON.stringify(response);
return;
} else {
throw new ScriptError("only_get_supported", "Only the HTTP GET method is supported when extracting automation scripts.");
}
} catch (error) {
response.status = "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);
}
log_error(error);
return;
}
}
}
function getScriptLanguage(scriptName) {
var autoScriptSet;
try {
autoScriptSet = MXServer.getMXServer().getMboSet("AUTOSCRIPT", userInfo);
var sqlf = new SqlFormat("autoscript = :1");
sqlf.setObject(1, "AUTOSCRIPT", "AUTOSCRIPT", scriptName);
autoScriptSet.setWhere(sqlf.format());
if (!autoScriptSet.isEmpty()) {
var autoScript = autoScriptSet.getMbo(0);
return autoScript.getString("SCRIPTLANGUAGE");
} else {
throw new ScriptError("script_not_found", "The automation script " + scriptName + " was not found.");
}
} finally {
_close(autoScriptSet);
}
}
function extractScript(scriptName) {
var autoScriptSet;
try {
autoScriptSet = MXServer.getMXServer().getMboSet("AUTOSCRIPT", userInfo);
var sqlf = new SqlFormat("autoscript = :1");
sqlf.setObject(1, "AUTOSCRIPT", "AUTOSCRIPT", scriptName);
autoScriptSet.setWhere(sqlf.format());
if (!autoScriptSet.isEmpty()) {
var autoScript = autoScriptSet.getMbo(0);
var source = autoScript.getString("SOURCE");
var scriptLanguage = autoScript.getString("SCRIPTLANGUAGE");
if (scriptLanguage === "MBR") {
throw new ScriptError("mbr_not_supported", "MBR language support is not available.");
}
var isPython = false;
switch (scriptLanguage.toLowerCase()) {
case "python":
case "jython":
isPython = true;
break;
}
source = removeScriptConfigFromSource(source, isPython);
if (isPython) {
return source + '\n\nscriptConfig="""' + extractScriptConfiguration(autoScript) + '"""';
} else {
return source + "\n\nvar scriptConfig=" + extractScriptConfiguration(autoScript) + ";";
}
} else {
throw new ScriptError("script_not_found", "The automation script " + scriptName + " was not found.");
}
} finally {
_close(autoScriptSet);
}
}
function removeScriptConfigFromSource(source, isPython) {
var result;
var braces = 0;
var inBrace = false;
var inQuote = false;
var quoteChar;
var ignoreNext = false;
var startIndex = -1;
var endIndex = -1;
var lineComment = false;
var blockComment = false;
var word = "";
var inScriptConfig = false;
var lineStart = 0;
if (isPython) {
tripleQuoteCount = 0;
for (var i = 0; i < source.length; i++) {
var c = source.charAt(i);
if (c === " " || c === "\t" || c === "\n") {
if (c === "\n") {
lineStart = i;
}
word = "";
} else {
word += c;
}
if (!inScriptConfig) {
if (word === "#") {
lineComment = true;
}
if (!lineComment) {
if (word === "scriptConfig") {
inScriptConfig = true;
startIndex = lineStart;
}
} else {
if (lineComment && c === "\n") {
lineComment = false;
}
}
} else {
if (word === '"""' || word.indexOf('"""') > -1) {
tripleQuoteCount++;
word = "";
}
}
if (tripleQuoteCount == 2) {
endIndex = i + 1;
break;
}
}
} else {
for (var i = 0; i < source.length; i++) {
var c = source.charAt(i);
if (c === " " || c === "\t" || c === "\n") {
if (c === "\n") {
lineStart = i;
}
word = "";
} else {
word += c;
}
if (!inScriptConfig) {
if (word === "//") {
lineComment = true;
}
if (word == "/*") {
blockComment = true;
}
if (!lineComment && !blockComment) {
if (word === "scriptConfig") {
inScriptConfig = true;
startIndex = lineStart;
}
} else {
if (lineComment && c === "\n") {
lineComment = false;
}
if (blockComment && word === "*/") {
blockComment = false;
}
}
} else {
if (!inBrace) {
if (c === "{") {
inBrace = true;
braces = 1;
}
} else {
if (braces === 0) {
if (c === ";" || (c !== "\n" && c !== " ")) {
endIndex = i + 1;
break;
}
} else {
if (!inQuote) {
if (c === "{") {
braces++;
} else if (c === "}") {
braces--;
} else if (c === '"' || c === "'") {
inQuote = true;
quoteChar = c;
}
} else {
if (c === "\\") {
ignoreNext = true;
} else if (!ignoreNext && c === quoteChar) {
inQuote = false;
} else {
ignoreNext = false;
}
}
}
}
}
}
}
if (endIndex > 0) {
if (startIndex > 0) {
result = source.substring(0, startIndex) + source.substring(endIndex);
} else {
result = source.substring(endIndex);
}
} else {
// did not contain a configuration.
result = source;
}
return result;
}
function extractScriptConfiguration(autoScript) {
var scriptConfig = {};
scriptConfig.autoscript = autoScript.getString("AUTOSCRIPT");
scriptConfig.description = autoScript.getString("DESCRIPTION");
scriptConfig.version = autoScript.getString("VERSION");
scriptConfig.active = autoScript.getBoolean("ACTIVE");
scriptConfig.logLevel = autoScript.getString("LOGLEVEL");
var autoScriptVarsSet = autoScript.getMboSet("AUTOSCRIPTVARS");
if (!autoScriptVarsSet.isEmpty()) {
var scriptVars = [];
var autoScriptVar = autoScriptVarsSet.moveFirst();
while (autoScriptVar) {
var scriptVar = {};
scriptVar.varname = autoScriptVar.getString("VARNAME");
if (!autoScriptVar.isNull("DESCRIPTION")) {
scriptVar.description = autoScriptVar.getString("DESCRIPTION");
}
if (!autoScriptVar.isNull("VARBINDINGTYPE")) {
scriptVar.varBindingType = autoScriptVar.getString("VARBINDINGTYPE");
}
if (!autoScriptVar.isNull("VARTYPE")) {
scriptVar.varType = autoScriptVar.getString("VARTYPE");
}
if (!autoScriptVar.isNull("ALLOWOVERRIDE")) {
scriptVar.allowOverride = autoScriptVar.getBoolean("ALLOWOVERRIDE");
}
if (!autoScriptVar.isNull("NOVALIDATION")) {
scriptVar.noValidation = autoScriptVar.getBoolean("NOVALIDATION");
}
if (!autoScriptVar.isNull("NOACCESSCHECK")) {
scriptVar.noAccessCheck = autoScriptVar.getBoolean("NOACCESSCHECK");
}
if (!autoScriptVar.isNull("NOACTION")) {
scriptVar.noAction = autoScriptVar.getBoolean("NOACTION");
}
if (!autoScriptVar.isNull("LITERALDATATYPE")) {
scriptVar.literalDataType = autoScriptVar.getString("LITERALDATATYPE");
}
if (!autoScriptVar.isNull("VARBINDINGVALUE")) {
scriptVar.varBindingValue = autoScriptVar.getString("VARBINDINGVALUE");
}
scriptVars.push(scriptVar);
autoScriptVar = autoScriptVarsSet.moveNext();
}
if (scriptVars.length > 0) {
scriptConfig.autoScriptVars = scriptVars;
}
}
var scriptLaunchPointSet = autoScript.getMboSet("SCRIPTLAUNCHPOINT");
if (!scriptLaunchPointSet.isEmpty()) {
var launchPoints = [];
var scriptLaunchPoint = scriptLaunchPointSet.moveFirst();
while (scriptLaunchPoint) {
var launchPoint = {};
launchPoint.launchPointName = scriptLaunchPoint.getString("LAUNCHPOINTNAME");
launchPoint.launchPointType = scriptLaunchPoint.getString("LAUNCHPOINTTYPE");
launchPoint.active = scriptLaunchPoint.getBoolean("ACTIVE");
if (!scriptLaunchPoint.isNull("DESCRIPTION")) {
launchPoint.description = scriptLaunchPoint.getString("DESCRIPTION");
}
if (launchPoint.launchPointType.toUpperCase() === "OBJECT") {
launchPoint.objectName = scriptLaunchPoint.getString("OBJECTNAME");
if (!scriptLaunchPoint.isNull("CONDITION")) {
launchPoint.condition = scriptLaunchPoint.getString("CONDITION");
}
switch (scriptLaunchPoint.getInt("EVENTTYPE")) {
case 0:
launchPoint.initializeValue = true;
break;
case 1:
launchPoint.validateApplication = true;
break;
case 2:
launchPoint.allowObjectCreation = true;
break;
case 3:
launchPoint.allowObjectDeletion = true;
break;
case 4:
launchPoint.save = true;
launchPoint.add = scriptLaunchPoint.getBoolean("ADD");
launchPoint.update = scriptLaunchPoint.getBoolean("UPDATE");
launchPoint.delete = scriptLaunchPoint.getBoolean("DELETE");
if (!scriptLaunchPoint.isNull("EVCONTEXT")) {
switch (scriptLaunchPoint.getInt("EVCONTEXT")) {
case 0:
launchPoint.beforeSave = true;
break;
case 1:
launchPoint.afterSave = true;
break;
case 2:
launchPoint.afterCommit = true;
break;
}
}
break;
}
} else if (launchPoint.launchPointType.toUpperCase() === "ATTRIBUTE") {
launchPoint.objectName = scriptLaunchPoint.getString("OBJECTNAME");
launchPoint.attributeName = scriptLaunchPoint.getString("ATTRIBUTENAME");
switch (scriptLaunchPoint.getInt("ATTRIBUTEEVENT")) {
case 0:
launchPoint.initializeAccessRestriction = true;
break;
case 1:
launchPoint.initializeValue = true;
break;
case 2:
launchPoint.validate = true;
break;
case 3:
launchPoint.retrieveList = true;
break;
case 4:
launchPoint.runAction = true;
break;
}
} else if (launchPoint.launchPointType.toUpperCase() === "ACTION") {
if (!scriptLaunchPoint.isNull("ACTIONNAME")) {
launchPoint.actionName = scriptLaunchPoint.getString("ACTIONNAME");
} else {
launchPoint.actionName = scriptLaunchPoint.getString("LAUNCHPOINTNAME");
}
if (!scriptLaunchPoint.isNull("OBJECTNAME")) {
launchPoint.objectName = scriptLaunchPoint.getString("OBJECTNAME");
}
} else if (launchPoint.launchPointType.toUpperCase() === "CUSTOMCONDITION") {
if (!scriptLaunchPoint.isNull("OBJECTNAME")) {
launchPoint.objectName = scriptLaunchPoint.getString("OBJECTNAME");
}
}
var launchPointVarsSet = scriptLaunchPoint.getMboSet("LAUNCHPOINTVARS");
if (!launchPointVarsSet.isEmpty()) {
pointVars = [];
var launchPointVars = launchPointVarsSet.moveFirst();
while (launchPointVars) {
var pointVar = {};
if (!launchPointVars.isNull("VARNAME")) {
pointVar.varName = launchPointVars.getString("VARNAME");
}
if (!launchPointVars.isNull("VARBINDINGVALUE")) {
pointVar.varBindingValue = launchPointVars.getString("VARBINDINGVALUE");
}
pointVars.push(pointVar);
launchPointVars = launchPointVarsSet.moveNext();
}
if (pointVars.length > 0) {
launchPoint.launchPointVars = pointVars;
}
}
launchPoints.push(launchPoint);
scriptLaunchPoint = scriptLaunchPointSet.moveNext();
}
if (launchPoints.length > 0) {
scriptConfig.scriptLaunchPoints = launchPoints;
}
}
return JSON.stringify(scriptConfig, null, 4);
}
function getRequestScriptName() {
var field = RESTRequest.class.getDeclaredField("request");
field.setAccessible(true);
var httpRequest = field.get(request);
var requestURI = httpRequest.getRequestURI();
var contextPath = httpRequest.getContextPath();
var resourceReq = requestURI;
if (contextPath && contextPath !== "") {
resourceReq = requestURI.substring(contextPath.length());
}
if (!resourceReq.startsWith("/")) {
resourceReq = "/" + resourceReq;
}
var isOSLC = true;
if (!resourceReq.toLowerCase().startsWith("/oslc/script/" + service.scriptName.toLowerCase())) {
if (!resourceReq.toLowerCase().startsWith("/api/script/" + service.scriptName.toLowerCase())) {
return null;
} else {
osOSLC = false;
}
}
var baseReqPath = isOSLC ? "/oslc/script/" + service.scriptName : "/api/script/" + service.scriptName;
var action = resourceReq.substring(baseReqPath.length);
if (action.startsWith("/")) {
action = action.substring(1);
}
if (!action || action.trim() === "") {
return null;
}
return URLDecoder.decode(action.toLowerCase(), StandardCharsets.UTF_8.name());
}
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);
}
}
// Logging functions provided for compatibility with older versions where service.log_xxxx is not available.
// eslint-disable-next-line no-unused-vars
function log_debug(msg) {
logger.debug(msg);
}
// eslint-disable-next-line no-unused-vars
function log_info(msg) {
logger.info(msg);
}
// eslint-disable-next-line no-unused-vars
function log_warn(msg) {
logger.warn(msg);
}
function log_error(msg) {
logger.error(msg);
}
// Cleans up the MboSet connections and closes the set.
function _close(set) {
if (set) {
try {
set.cleanup();
set.close();
} catch (ignored) {}
}
}
function ScriptError(reason, message) {
Error.call(this, message);
this.reason = reason;
this.message = message;
}
// ConfigurationError derives from Error
ScriptError.prototype = Object.create(Error.prototype);
ScriptError.prototype.constructor = ScriptError;
ScriptError.prototype.element;
var scriptConfig = {
"autoscript": "SHARPTREE.AUTOSCRIPT.EXTRACT",
"description": "Sharptree Automation Script Extract Script",
"version": "1.0.0",
"active": true,
"logLevel": "INFO"
};