UNPKG

trm-core

Version:

TRM (Transport Request Manager) Core

427 lines (426 loc) 22.1 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.SystemConnectorBase = exports.SKIP_TRKORR_TABL = exports.SRC_TRKORR_TABL = exports.TRM_REST_PACKAGE_NAME = exports.TRM_SERVER_PACKAGE_NAME = void 0; const semver_1 = require("semver"); const logger_1 = require("../logger"); const manifest_1 = require("../manifest"); const transport_1 = require("../transport"); const trmPackage_1 = require("../trmPackage"); const registry_1 = require("../registry"); const node_r3trans_1 = require("node-r3trans"); exports.TRM_SERVER_PACKAGE_NAME = 'trm-server'; exports.TRM_REST_PACKAGE_NAME = 'trm-rest'; exports.SRC_TRKORR_TABL = 'ZTRM_SRC_TRKORR'; exports.SKIP_TRKORR_TABL = 'ZTRM_SKIP_TRKORR'; class SystemConnectorBase { constructor() { } getTransportStatus(trkorr) { return __awaiter(this, void 0, void 0, function* () { const aTrkorrStatusCheck = (yield this.readTable('E070', [{ fieldName: 'TRKORR' }, { fieldName: 'TRSTATUS' }], `TRKORR EQ '${trkorr}'`)); if (aTrkorrStatusCheck.length !== 1) { throw new Error(`Transport not found.`); } else { return aTrkorrStatusCheck[0].trstatus; } }); } getPackageWorkbenchTransport(oPackage) { return __awaiter(this, void 0, void 0, function* () { var aTrkorr = (yield this.readTable('E071', [{ fieldName: 'TRKORR' }], `PGMID EQ '*' AND OBJECT EQ '${transport_1.COMMENT_OBJ}'`)).map(o => o.trkorr); aTrkorr = Array.from(new Set(aTrkorr)); var aSkipTrkorr = []; for (const sTrkorr of aTrkorr) { var canBeReleased = false; try { canBeReleased = (yield this.getTransportStatus(sTrkorr)) === 'D'; } catch (e) { canBeReleased = false; } if (!canBeReleased) { aSkipTrkorr.push(sTrkorr); } } aTrkorr = aTrkorr.filter(trkorr => !aSkipTrkorr.includes(trkorr)); const transports = aTrkorr.map(trkorr => new transport_1.Transport(trkorr)); var packageTransports = []; for (const transport of transports) { const transportPackage = yield transport.getLinkedPackage(); if (transportPackage) { if (trmPackage_1.TrmPackage.compare(transportPackage, oPackage)) { packageTransports.push(transport); } } } if (packageTransports.length > 0) { return yield transport_1.Transport.getLatest(packageTransports); } return null; }); } getSourceTrkorr() { return __awaiter(this, void 0, void 0, function* () { logger_1.Logger.log(`Ready to read installed packages`, true); logger_1.Logger.log(`Checking if ${exports.SRC_TRKORR_TABL} exists`, true); const tablExists = yield this.readTable('TADIR', [{ fieldName: 'OBJ_NAME' }], `PGMID EQ 'R3TR' AND OBJECT EQ 'TABL' AND OBJ_NAME EQ '${exports.SRC_TRKORR_TABL}'`); if (tablExists.length === 1) { logger_1.Logger.log(`TABL ${exports.SRC_TRKORR_TABL} exists`, true); const srcTrkorr = yield this.readTable(exports.SRC_TRKORR_TABL, [{ fieldName: 'TRKORR' }]); return srcTrkorr.map(o => o.trkorr); } else { return []; } }); } getObject(pgmid, object, objName) { return __awaiter(this, void 0, void 0, function* () { const tadir = yield this.readTable('TADIR', [{ fieldName: 'PGMID' }, { fieldName: 'OBJECT' }, { fieldName: 'OBJ_NAME' }, { fieldName: 'DEVCLASS' }, { fieldName: 'SRCSYSTEM' }, { fieldName: 'AUTHOR' }], `PGMID EQ '${pgmid.trim().toUpperCase()}' AND OBJECT EQ '${object.trim().toUpperCase()}' AND OBJ_NAME EQ '${objName.trim().toUpperCase()}'`); if (tadir.length === 1) { return tadir[0]; } }); } getIgnoredTrkorr() { return __awaiter(this, void 0, void 0, function* () { logger_1.Logger.log(`Reading ignored transports`, true); logger_1.Logger.log(`Checking if ${exports.SKIP_TRKORR_TABL} exists`, true); const tablExists = yield this.readTable('TADIR', [{ fieldName: 'OBJ_NAME' }], `PGMID EQ 'R3TR' AND OBJECT EQ 'TABL' AND OBJ_NAME EQ '${exports.SKIP_TRKORR_TABL}'`); if (tablExists.length === 1) { logger_1.Logger.log(`TABLE ${exports.SKIP_TRKORR_TABL} exists`, true); const skipTrkorr = yield this.readTable(exports.SKIP_TRKORR_TABL, [{ fieldName: 'TRKORR' }]); return skipTrkorr.map(o => o.trkorr); } else { return []; } }); } getTrmServerPackage() { return __awaiter(this, void 0, void 0, function* () { var oPackage; const oPublicRegistry = new registry_1.Registry(registry_1.PUBLIC_RESERVED_KEYWORD); const intf = yield this.getObject('R3TR', 'INTF', 'ZIF_TRM'); if (intf) { try { const trmServerVersion = yield this.getTrmServerVersion(); const oManifest = new manifest_1.Manifest({ name: exports.TRM_SERVER_PACKAGE_NAME, version: trmServerVersion }); if ((0, semver_1.valid)(trmServerVersion)) { oPackage = new trmPackage_1.TrmPackage(exports.TRM_SERVER_PACKAGE_NAME, oPublicRegistry, oManifest).setDevclass(intf.devclass); } } catch (e) { } } if (!oPackage) { throw new Error(`Package ${exports.TRM_SERVER_PACKAGE_NAME} was not found.`); } return oPackage; }); } getTrmRestPackage() { return __awaiter(this, void 0, void 0, function* () { var oPackage; const oPublicRegistry = new registry_1.Registry(registry_1.PUBLIC_RESERVED_KEYWORD); const intf = yield this.getObject('R3TR', 'INTF', 'ZIF_TRM_REST'); if (intf) { try { const trmRestVersion = yield this.getTrmRestVersion(); const oManifest = new manifest_1.Manifest({ name: exports.TRM_REST_PACKAGE_NAME, version: trmRestVersion }); if ((0, semver_1.valid)(trmRestVersion)) { oPackage = new trmPackage_1.TrmPackage(exports.TRM_REST_PACKAGE_NAME, oPublicRegistry, oManifest).setDevclass(intf.devclass); } } catch (e) { } } if (!oPackage) { throw new Error(`Package ${exports.TRM_REST_PACKAGE_NAME} was not found.`); } return oPackage; }); } getInstalledPackages() { return __awaiter(this, arguments, void 0, function* (includeSoruces = true, refresh) { if (!refresh) { if (includeSoruces && this._installedPackagesI) { logger_1.Logger.log(`Cached version of installed packages with sources`, true); return this._installedPackagesI; } else if (!includeSoruces && this._installedPackages) { logger_1.Logger.log(`Cached version of installed packages without sources`, true); return this._installedPackages; } } var trmPackages = []; var packageTransports = []; logger_1.Logger.log(`Ready to read installed packages`, true); logger_1.Logger.log(`Include sources: ${includeSoruces}`, true); const aSourceTrkorr = includeSoruces ? (yield this.getSourceTrkorr()) : []; logger_1.Logger.log(`Source trkorr ${JSON.stringify(aSourceTrkorr)}`, true); var aSkipTrkorr = yield this.getIgnoredTrkorr(); logger_1.Logger.log(`Ignored trkorr ${JSON.stringify(aSkipTrkorr)}`, true); var aTrkorr = (yield this.readTable('E071', [{ fieldName: 'TRKORR' }], `PGMID EQ '*' AND OBJECT EQ '${transport_1.COMMENT_OBJ}'`)).map(o => o.trkorr); aTrkorr = Array.from(new Set(aTrkorr)); for (const sTrkorr of aTrkorr) { if (!aSourceTrkorr.includes(sTrkorr)) { logger_1.Logger.log(`${sTrkorr} not from source`, true); var aTrkorrStatusCheck; try { logger_1.Logger.log(`Checking ${sTrkorr} TMS import result`, true); aTrkorrStatusCheck = (yield this.readTable('TMSBUFFER', [{ fieldName: 'TRKORR' }, { fieldName: 'MAXRC' }], `SYSNAM EQ '${this.getSysname()}' AND TRKORR EQ '${sTrkorr}' AND IMPSING NE 'X'`)).filter(o => parseInt(o.maxrc) >= 0); } catch (e) { aTrkorrStatusCheck = []; } if (aTrkorrStatusCheck.length === 0) { logger_1.Logger.log(`Adding ${sTrkorr} to skipped filter`, true); aSkipTrkorr.push(sTrkorr); } } } aTrkorr = aTrkorr.filter(trkorr => !aSkipTrkorr.includes(trkorr)); logger_1.Logger.log(`Final transports ${JSON.stringify(aTrkorr)}`, true); const transports = aTrkorr.map(trkorr => new transport_1.Transport(trkorr)); for (const transport of transports) { const trmPackage = yield transport.getLinkedPackage(); if (trmPackage) { logger_1.Logger.log(`Transport ${transport.trkorr}, found linked package`, true); var arrayIndex = packageTransports.findIndex(o => trmPackage_1.TrmPackage.compare(o.package, trmPackage)); if (arrayIndex < 0) { arrayIndex = packageTransports.push({ package: trmPackage, transports: [] }); arrayIndex--; } packageTransports[arrayIndex].transports.push(transport); } } logger_1.Logger.log(`Package Transports map: ${(0, logger_1.inspect)(packageTransports, { breakLength: Infinity, compact: true })}`, true); for (const packageTransport of packageTransports) { const latestTransport = yield transport_1.Transport.getLatest(packageTransport.transports); if (latestTransport) { trmPackages.push(yield latestTransport.getLinkedPackage()); } } logger_1.Logger.log(`Packages found: ${(0, logger_1.inspect)(trmPackages, { breakLength: Infinity, compact: true })}`, true); logger_1.Logger.log(`Excluding trm-server (adding it manually)`, true); try { const trmServerPackage = trmPackages.find(o => o.packageName === exports.TRM_SERVER_PACKAGE_NAME && o.compareRegistry(new registry_1.Registry(registry_1.PUBLIC_RESERVED_KEYWORD))); var generatedTrmServerPackage = yield this.getTrmServerPackage(); if (trmServerPackage && trmServerPackage.manifest) { logger_1.Logger.log(`trm-server was found (it was imported via transport)`, true); if (trmServerPackage.manifest.get().version === generatedTrmServerPackage.manifest.get().version) { logger_1.Logger.log(`trm-server imported is the one currenlty in use`, true); generatedTrmServerPackage.manifest = trmServerPackage.manifest; } } trmPackages = trmPackages.filter(o => !(o.packageName === exports.TRM_SERVER_PACKAGE_NAME && o.compareRegistry(new registry_1.Registry(registry_1.PUBLIC_RESERVED_KEYWORD)))); trmPackages.push(generatedTrmServerPackage); } catch (e) { logger_1.Logger.warning(`${exports.TRM_SERVER_PACKAGE_NAME} is not installed`, true); } logger_1.Logger.log(`Excluding trm-rest (adding it manually)`, true); try { const trmRestPackage = trmPackages.find(o => o.packageName === exports.TRM_REST_PACKAGE_NAME && o.compareRegistry(new registry_1.Registry(registry_1.PUBLIC_RESERVED_KEYWORD))); var generatedTrmRestPackage = yield this.getTrmRestPackage(); if (trmRestPackage && trmRestPackage.manifest) { logger_1.Logger.log(`trm-rest was found (it was imported via transport)`, true); if (trmRestPackage.manifest.get().version === generatedTrmRestPackage.manifest.get().version) { logger_1.Logger.log(`trm-rest imported is the one currenlty in use`, true); generatedTrmRestPackage.manifest = trmRestPackage.manifest; } } trmPackages = trmPackages.filter(o => !(o.packageName === exports.TRM_REST_PACKAGE_NAME && o.compareRegistry(new registry_1.Registry(registry_1.PUBLIC_RESERVED_KEYWORD)))); trmPackages.push(generatedTrmRestPackage); } catch (e) { logger_1.Logger.warning(`${exports.TRM_SERVER_PACKAGE_NAME} is not installed`, true); } if (includeSoruces) { this._installedPackagesI = trmPackages; } else { this._installedPackages = trmPackages; } return trmPackages; }); } getDevclass(devclass) { return __awaiter(this, void 0, void 0, function* () { const tdevc = yield this.readTable('TDEVC', [{ fieldName: 'DEVCLASS' }, { fieldName: 'PARENTCL' }], `DEVCLASS EQ '${devclass.trim().toUpperCase()}'`); if (tdevc.length === 1) { return tdevc[0]; } }); } getTransportTargets() { return __awaiter(this, void 0, void 0, function* () { try { return yield this.readTable('TMSCSYS', [{ fieldName: 'SYSNAM' }, { fieldName: 'SYSTXT' }, { fieldName: 'SYSTYP' }]); } catch (e) { return yield this.readTable('TMSCSYS', [{ fieldName: 'SYSNAM' }, { fieldName: 'SYSTXT' }]); } }); } getSubpackages(devclass) { return __awaiter(this, void 0, void 0, function* () { const queryFields = [{ fieldName: 'DEVCLASS' }, { fieldName: 'PARENTCL' }]; var subpackages = []; const initial = yield this.readTable('TDEVC', queryFields, `DEVCLASS EQ '${devclass.trim().toUpperCase()}'`); if (initial.length === 1) { subpackages.push({ tdevc: initial[0], queryDone: false }); } while (subpackages.find(o => !o.queryDone)) { const searchParentIndex = subpackages.findIndex(o => !o.queryDone); const tdevc = yield this.readTable('TDEVC', queryFields, `PARENTCL EQ '${subpackages[searchParentIndex].tdevc.devclass.trim().toUpperCase()}'`); subpackages[searchParentIndex].queryDone = true; tdevc.forEach(o => { subpackages.push({ tdevc: o, queryDone: false }); }); } return subpackages.map(o => o.tdevc).filter(o => o.devclass !== devclass.trim().toUpperCase()); }); } getDevclassObjects(devclass_1) { return __awaiter(this, arguments, void 0, function* (devclass, includeSubpackages = true) { var aTadir = []; var aDevclass = [devclass]; if (includeSubpackages) { aDevclass = aDevclass.concat(((yield this.getSubpackages(devclass)).map(o => o.devclass))); } for (const d of aDevclass) { aTadir = aTadir.concat(((yield this.listDevclassObjects(d.trim().toUpperCase())))); } return aTadir; }); } getInstallPackages(packageName, registry) { return __awaiter(this, void 0, void 0, function* () { const registryEndpoint = registry.getRegistryType() === registry_1.RegistryType.PUBLIC ? registry_1.PUBLIC_RESERVED_KEYWORD : registry.endpoint; return yield this.readTable('ZTRMVINSTALLDEVC', [{ fieldName: 'ORIGINAL_DEVCLASS' }, { fieldName: 'INSTALL_DEVCLASS' }], `PACKAGE_NAME EQ '${packageName}' AND PACKAGE_REGISTRY EQ '${registryEndpoint}'`); }); } setPackageSuperpackage(devclass, superpackage) { return __awaiter(this, void 0, void 0, function* () { return yield this.tdevcInterface(devclass, superpackage); }); } clearPackageSuperpackage(devclass) { return __awaiter(this, void 0, void 0, function* () { return yield this.tdevcInterface(devclass, null, true); }); } setPackageTransportLayer(devclass, devlayer) { return __awaiter(this, void 0, void 0, function* () { return yield this.tdevcInterface(devclass, null, null, devlayer); }); } checkSapEntryExists(table, sapEntry) { return __awaiter(this, void 0, void 0, function* () { try { var aQuery = []; Object.keys(sapEntry).forEach(k => { aQuery.push(`${k.trim().toUpperCase()} EQ '${sapEntry[k]}'`); }); const entry = yield this.readTable(table.trim().toUpperCase(), [{ fieldName: Object.keys(sapEntry)[0].trim().toUpperCase() }], aQuery.join(' AND ')); return entry.length > 0; } catch (e) { return false; } }); } getPackageIntegrity(oPackage) { return __awaiter(this, void 0, void 0, function* () { const packageName = oPackage.packageName; const registryEndpoint = oPackage.registry.getRegistryType() === registry_1.RegistryType.PUBLIC ? registry_1.PUBLIC_RESERVED_KEYWORD : oPackage.registry.endpoint; const aIntegrity = yield this.readTable('ZTRM_INTEGRITY', [{ fieldName: 'INTEGRITY' }], `PACKAGE_NAME EQ '${packageName}' AND PACKAGE_REGISTRY EQ '${registryEndpoint}'`); if (aIntegrity.length === 1) { return aIntegrity[0].integrity; } else { return ''; } }); } getFunctionModule(func) { return __awaiter(this, void 0, void 0, function* () { const aTfdir = yield this.readTable('TFDIR', [{ fieldName: 'FUNCNAME' }, { fieldName: 'PNAME' }], `FUNCNAME EQ '${func.trim().toUpperCase()}'`); if (aTfdir.length === 1) { return aTfdir[0]; } }); } getExistingObjects(objects) { return __awaiter(this, void 0, void 0, function* () { var ret = []; for (const object of objects) { const oTadir = yield this.getObject(object.pgmid, object.object, object.objName); if (oTadir) { ret.push(oTadir); } } return ret; }); } getNamespace(namespace) { return __awaiter(this, void 0, void 0, function* () { const aNamespace = yield this.readTable('TRNSPACET', [{ fieldName: 'NAMESPACE' }, { fieldName: 'REPLICENSE' }], `NAMESPACE EQ '${namespace.toUpperCase()}'`); if (aNamespace.length === 1) { const aNamespacet = yield this.readTable('TRNSPACETT', [{ fieldName: 'NAMESPACE' }, { fieldName: 'SPRAS' }, { fieldName: 'DESCRIPTN' }, { fieldName: 'OWNER' }], `NAMESPACE EQ '${namespace.toUpperCase()}'`); return { trnspacet: aNamespace[0], trnspacett: aNamespacet }; } }); } getR3transVersion() { return __awaiter(this, void 0, void 0, function* () { if (!this._r3transInfoLog) { this._r3transInfoLog = yield this.getR3transInfo(); } return node_r3trans_1.R3trans.getVersion(this._r3transInfoLog); }); } getR3transUnicode() { return __awaiter(this, void 0, void 0, function* () { if (!this._r3transInfoLog) { this._r3transInfoLog = yield this.getR3transInfo(); } return node_r3trans_1.R3trans.isUnicode(this._r3transInfoLog); }); } isTransportLayerExist(devlayer) { return __awaiter(this, void 0, void 0, function* () { const aTransportLayer = (yield this.readTable('TCETRAL', [{ fieldName: 'VERSION' }, { fieldName: 'TRANSLAYER' }], `TRANSLAYER EQ '${devlayer}'`)); return aTransportLayer.length > 0; }); } } exports.SystemConnectorBase = SystemConnectorBase;