Skip to main content
Glama
unlock-domain.js3.68 kB
/** * Utility to unlock a locked domain * Usage: node tests/unlock-domain.js ZZ_TEST_MCP_01 */ // Set environment variable to skip MCP auto-start process.env.MCP_SKIP_AUTO_START = 'true'; const { makeAdtRequestWithTimeout, getBaseUrl, encodeSapObjectName } = require('../dist/lib/utils'); const crypto = require('crypto'); // Load environment require('dotenv').config({ path: 'e19.env' }); async function unlockDomain(domainName, providedLockHandle) { try { const baseUrl = await getBaseUrl(); const sessionId = crypto.randomUUID().replace(/-/g, ''); const requestId = crypto.randomUUID().replace(/-/g, ''); let lockHandle = providedLockHandle; // If no lock handle provided, try to get it by locking if (!lockHandle) { // Step 1: Lock the domain to get lock handle const domainNameEncoded = encodeSapObjectName(domainName.toLowerCase()); const lockUrl = `${baseUrl}/sap/bc/adt/ddic/domains/${domainNameEncoded}?_action=LOCK&accessMode=MODIFY`; console.log(`Locking domain ${domainName} to get lock handle...`); const headers = { 'Accept': 'application/vnd.sap.as+xml;charset=UTF-8;dataname=com.sap.adt.lock.result;q=0.8, application/vnd.sap.as+xml;charset=UTF-8;dataname=com.sap.adt.lock.result2;q=0.9', 'X-sap-adt-profiling': 'server-time', 'X-sap-adt-sessiontype': 'stateful', 'sap-adt-connection-id': sessionId, 'sap-adt-request-id': requestId }; const lockResponse = await makeAdtRequestWithTimeout(lockUrl, 'POST', 'default', null, undefined, headers); // Parse lock response to get lock handle const XMLParser = require('fast-xml-parser').XMLParser; const parser = new XMLParser({ ignoreAttributes: false, attributeNamePrefix: '', }); const result = parser.parse(lockResponse.data); lockHandle = result?.['asx:abap']?.['asx:values']?.['DATA']?.['LOCK_HANDLE']; if (!lockHandle) { console.error('Failed to get lock handle from response'); console.log('Response:', lockResponse.data); return; } console.log(`Lock handle: ${lockHandle}`); } else { console.log(`Using provided lock handle: ${lockHandle}`); } // Step 2: Unlock const domainNameEncoded = encodeSapObjectName(domainName.toLowerCase()); const unlockUrl = `${baseUrl}/sap/bc/adt/ddic/domains/${domainNameEncoded}?_action=UNLOCK&lockHandle=${lockHandle}`; console.log(`Unlocking domain ${domainName}...`); const unlockHeaders = { 'X-sap-adt-profiling': 'server-time', 'X-sap-adt-sessiontype': 'stateful', 'sap-adt-connection-id': sessionId, 'sap-adt-request-id': crypto.randomUUID().replace(/-/g, '') }; await makeAdtRequestWithTimeout(unlockUrl, 'POST', 'default', null, undefined, unlockHeaders); console.log(`✅ Domain ${domainName} unlocked successfully!`); } catch (error) { console.error('❌ Failed to unlock domain:', error.message); if (error.response?.data) { console.error('Response:', error.response.data); } } } // Get domain name from command line const domainName = process.argv[2]; const lockHandle = process.argv[3]; // Optional lock handle if (!domainName) { console.error('Usage: node tests/unlock-domain.js <DOMAIN_NAME> [LOCK_HANDLE]'); console.error('Example: node tests/unlock-domain.js ZZ_TEST_MCP_01'); console.error('Example with lock handle: node tests/unlock-domain.js ZZ_TEST_MCP_01 38185D812ADA94614D210B068DC52482EE3EBCC3'); process.exit(1); } unlockDomain(domainName, lockHandle);

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/fr0ster/mcp-abap-adt'

If you have feedback or need assistance with the MCP directory API, please join our Discord server