UNPKG

trm-core

Version:

TRM (Transport Request Manager) Core

521 lines (520 loc) 27.2 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_INTF = exports.TRM_SERVER_PACKAGE_NAME = void 0; const semver_1 = require("semver"); const trm_commons_1 = require("trm-commons"); 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_SERVER_INTF = 'ZIF_TRM'; 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(refresh) { return __awaiter(this, void 0, void 0, function* () { if (!this._sourceTrkorr || refresh) { trm_commons_1.Logger.log(`Ready to read installed packages`, true); trm_commons_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) { trm_commons_1.Logger.log(`TABL ${exports.SRC_TRKORR_TABL} exists`, true); const srcTrkorr = yield this.readTable(exports.SRC_TRKORR_TABL, [{ fieldName: 'TRKORR' }]); this._sourceTrkorr = srcTrkorr.map(o => o.trkorr); } else { this._sourceTrkorr = []; } } return this._sourceTrkorr; }); } 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(refresh) { return __awaiter(this, void 0, void 0, function* () { if (!this._ignoredTrkorr || refresh) { trm_commons_1.Logger.log(`Reading ignored transports`, true); trm_commons_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) { trm_commons_1.Logger.log(`TABLE ${exports.SKIP_TRKORR_TABL} exists`, true); const skipTrkorr = yield this.readTable(exports.SKIP_TRKORR_TABL, [{ fieldName: 'TRKORR' }]); this._ignoredTrkorr = skipTrkorr.map(o => o.trkorr); } else { this._ignoredTrkorr = []; } } return this._ignoredTrkorr; }); } getTrmServerPackage() { return __awaiter(this, void 0, void 0, function* () { var oPackage; const oPublicRegistry = registry_1.RegistryProvider.getRegistry(); 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 = registry_1.RegistryProvider.getRegistry(); 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, includeLocals) { var trmPackages = []; var fromBackend = false; if (!refresh) { if (includeSoruces && this._installedPackagesI) { trm_commons_1.Logger.log(`Cached version of installed packages with sources`, true); return this._installedPackagesI; } else if (!includeSoruces && this._installedPackages) { trm_commons_1.Logger.log(`Cached version of installed packages without sources`, true); return this._installedPackages; } } trm_commons_1.Logger.log(`Include sources: ${includeSoruces}`, true); const aSourceTrkorr = includeSoruces ? (yield this.getSourceTrkorr(refresh)) : []; const serverExists = yield this.readTable('TADIR', [{ fieldName: 'OBJ_NAME' }], `PGMID EQ 'R3TR' AND OBJECT EQ 'INTF' AND OBJ_NAME EQ '${exports.TRM_SERVER_INTF}'`); if (serverExists.length === 1) { trm_commons_1.Logger.log(`INTF ${exports.TRM_SERVER_INTF} exists`, true); try { var installedPackagesBackend = yield this.getInstalledPackagesBackend(); if (!includeSoruces) { installedPackagesBackend = installedPackagesBackend.filter(o => !aSourceTrkorr.includes(o.transport.trkorr)); } if (!includeLocals) { installedPackagesBackend = installedPackagesBackend.filter(o => o.registry !== registry_1.LOCAL_RESERVED_KEYWORD); } for (const o of installedPackagesBackend) { const transport = o.transport.trkorr ? new transport_1.Transport(o.transport.trkorr, null, o.transport.migration) : null; const manifest = manifest_1.Manifest.fromAbapXml(o.manifest); if (transport) { manifest.setLinkedTransport(transport); } const trmPackage = new trmPackage_1.TrmPackage(o.name, registry_1.RegistryProvider.getRegistry(o.registry), manifest); if (transport) { try { trmPackage.setDevclass(yield transport.getDevclass(o.tdevc)); } catch (x) { } } else { if (o.tdevc.length === 1) { trmPackage.setDevclass(o.tdevc[0].devclass); } } trmPackage.setWbTransport(o.trkorr ? new transport_1.Transport(o.trkorr) : null); trmPackages.push(trmPackage); } fromBackend = true; } catch (e) { trmPackages = []; trm_commons_1.Logger.error(e.toString(), true); } } if (fromBackend) { trm_commons_1.Logger.log(`Packages were fetched from backend`, true); return trmPackages; } else { trm_commons_1.Logger.log(`Packages weren't fetched from backend, continue`, true); } var packageTransports = []; trm_commons_1.Logger.log(`Ready to read installed packages`, true); trm_commons_1.Logger.log(`Source trkorr ${JSON.stringify(aSourceTrkorr)}`, true); var aSkipTrkorr = yield this.getIgnoredTrkorr(); trm_commons_1.Logger.log(`Ignored trkorr ${JSON.stringify(aSkipTrkorr)}`, true); var aMigrationTrkorr; var aActualTrkorr = (yield this.readTable('E071', [{ fieldName: 'TRKORR' }], `PGMID EQ '*' AND OBJECT EQ '${transport_1.COMMENT_OBJ}' AND TRKORR EQ 'RSTK906391'`)).map(o => o.trkorr); aActualTrkorr = Array.from(new Set(aActualTrkorr)); try { aMigrationTrkorr = (yield this.readTable('ZTRM_E070', [{ fieldName: 'TRM_TROKRR' }])).map(o => o.trmTrokrr); } catch (e) { aMigrationTrkorr = []; } var aTrkorr = aActualTrkorr.map(s => { return { trkorr: s, migration: false }; }).concat(aMigrationTrkorr.map(s => { return { trkorr: s, migration: true }; })); for (const sTrkorr of aTrkorr) { if (!aSourceTrkorr.includes(sTrkorr.trkorr)) { trm_commons_1.Logger.log(`${sTrkorr.trkorr} not from source`, true); var aTrkorrStatusCheck; try { trm_commons_1.Logger.log(`Checking ${sTrkorr.trkorr} TMS import result`, true); if (!sTrkorr.migration) { aTrkorrStatusCheck = (yield this.readTable('TMSBUFFER', [{ fieldName: 'TRKORR' }, { fieldName: 'MAXRC' }], `SYSNAM EQ '${this.getSysname()}' AND TRKORR EQ '${sTrkorr.trkorr}' AND IMPSING NE 'X'`)); } else { aTrkorrStatusCheck = (yield this.readTable('ZTRM_TMSBUFFER', [{ fieldName: 'TRKORR' }, { fieldName: 'MAXRC' }], `SYSNAM EQ '${this.getSysname()}' AND TRM_TROKRR EQ '${sTrkorr.trkorr}' AND IMPSING NE 'X'`)); } aTrkorrStatusCheck = aTrkorrStatusCheck.filter(o => parseInt(o.maxrc) >= 0); } catch (e) { aTrkorrStatusCheck = []; } if (aTrkorrStatusCheck.length === 0) { trm_commons_1.Logger.log(`Adding ${sTrkorr.trkorr} to skipped filter`, true); aSkipTrkorr.push(sTrkorr.trkorr); } } } aTrkorr = aTrkorr.filter(trkorr => !aSkipTrkorr.includes(trkorr.trkorr)); trm_commons_1.Logger.log(`Final transports ${JSON.stringify(aTrkorr)}`, true); const transports = aTrkorr.map(trkorr => new transport_1.Transport(trkorr.trkorr, null, trkorr.migration)); for (const transport of transports) { const trmPackage = yield transport.getLinkedPackage(); if (trmPackage) { trm_commons_1.Logger.log(`Transport ${transport.trkorr}, found linked package`, true); if (trmPackage.registry.getRegistryType() === registry_1.RegistryType.LOCAL && !includeLocals) { trm_commons_1.Logger.log(`Package is local, skipping`, true); continue; } 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); } } trm_commons_1.Logger.log(`Package Transports map: ${(0, trm_commons_1.inspect)(packageTransports.map(o => { return { packageName: o.package.packageName, registry: o.package.registry.endpoint, transports: o.transports.map(k => k.trkorr) }; }), { 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()); } } trm_commons_1.Logger.log(`Packages found: ${(0, trm_commons_1.inspect)(trmPackages, { breakLength: Infinity, compact: true })}`, true); trm_commons_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(registry_1.RegistryProvider.getRegistry())); var generatedTrmServerPackage = yield this.getTrmServerPackage(); if (trmServerPackage && trmServerPackage.manifest) { trm_commons_1.Logger.log(`trm-server was found (it was imported via transport)`, true); if (trmServerPackage.manifest.get().version === generatedTrmServerPackage.manifest.get().version) { trm_commons_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(registry_1.RegistryProvider.getRegistry()))); trmPackages.push(generatedTrmServerPackage); } catch (e) { trm_commons_1.Logger.warning(`${exports.TRM_SERVER_PACKAGE_NAME} is not installed`, true); } trm_commons_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(registry_1.RegistryProvider.getRegistry())); var generatedTrmRestPackage = yield this.getTrmRestPackage(); if (trmRestPackage && trmRestPackage.manifest) { trm_commons_1.Logger.log(`trm-rest was found (it was imported via transport)`, true); if (trmRestPackage.manifest.get().version === generatedTrmRestPackage.manifest.get().version) { trm_commons_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(registry_1.RegistryProvider.getRegistry()))); trmPackages.push(generatedTrmRestPackage); } catch (e) { trm_commons_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; }); } readClassDescriptions(clsname) { return __awaiter(this, void 0, void 0, function* () { return yield this.readTable('SEOCLASSTX', [{ fieldName: 'CLSNAME' }, { fieldName: 'LANGU' }, { fieldName: 'DESCRIPT' }], `CLSNAME EQ '${clsname.trim().toUpperCase()}'`); }); } } exports.SystemConnectorBase = SystemConnectorBase;