@silasfmartins/testhub 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/copilot-instructions.md +520 -0
- package/biome.json +37 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.js +169 -0
- package/dist/scripts/consumer-postinstall.d.ts +15 -0
- package/dist/scripts/consumer-postinstall.js +785 -0
- package/dist/scripts/generate-docs.d.ts +16 -0
- package/dist/scripts/generate-docs.js +1363 -0
- package/dist/scripts/generate-index.d.ts +2 -0
- package/dist/scripts/generate-index.js +314 -0
- package/dist/scripts/init-api.d.ts +2 -0
- package/dist/scripts/init-api.js +525 -0
- package/dist/scripts/init-banco.d.ts +2 -0
- package/dist/scripts/init-banco.js +347 -0
- package/dist/scripts/init-frontend.d.ts +2 -0
- package/dist/scripts/init-frontend.js +627 -0
- package/dist/scripts/init-mobile.d.ts +2 -0
- package/dist/scripts/init-mobile.js +481 -0
- package/dist/scripts/init-scenarios.d.ts +2 -0
- package/dist/scripts/init-scenarios.js +846 -0
- package/dist/scripts/init-ssh.d.ts +2 -0
- package/dist/scripts/init-ssh.js +639 -0
- package/dist/scripts/package-versions.d.ts +57 -0
- package/dist/scripts/package-versions.js +768 -0
- package/dist/scripts/postinstall.d.ts +1 -0
- package/dist/scripts/postinstall.js +527 -0
- package/dist/scripts/robust-build.d.ts +7 -0
- package/dist/scripts/robust-build.js +88 -0
- package/dist/scripts/setup-local-packages.d.ts +31 -0
- package/dist/scripts/setup-local-packages.js +237 -0
- package/dist/scripts/smart-override.d.ts +2 -0
- package/dist/scripts/smart-override.js +1360 -0
- package/dist/scripts/sync-configs.d.ts +27 -0
- package/dist/scripts/sync-configs.js +248 -0
- package/dist/scripts/test-biome-parse.d.ts +5 -0
- package/dist/scripts/test-biome-parse.js +84 -0
- package/dist/scripts/ultracite-setup.d.ts +4 -0
- package/dist/scripts/ultracite-setup.js +310 -0
- package/dist/scripts/update-all-init-scripts.d.ts +2 -0
- package/dist/scripts/update-all-init-scripts.js +52 -0
- package/dist/scripts/update-biome-schema.d.ts +15 -0
- package/dist/scripts/update-biome-schema.js +124 -0
- package/dist/src/AutoCoreFacade.d.ts +145 -0
- package/dist/src/AutoCoreFacade.js +217 -0
- package/dist/src/api/ApiActions.d.ts +297 -0
- package/dist/src/api/ApiActions.js +1905 -0
- package/dist/src/api/Certificate.d.ts +60 -0
- package/dist/src/api/Certificate.js +79 -0
- package/dist/src/api/JsonResponse.d.ts +116 -0
- package/dist/src/api/JsonResponse.js +206 -0
- package/dist/src/appium/DeviceFarmViewer.d.ts +79 -0
- package/dist/src/appium/DeviceFarmViewer.js +1083 -0
- package/dist/src/appium/MobileActions.d.ts +347 -0
- package/dist/src/appium/MobileActions.js +1632 -0
- package/dist/src/appium/MobileConnection.d.ts +160 -0
- package/dist/src/appium/MobileConnection.js +772 -0
- package/dist/src/config/envLoader.d.ts +123 -0
- package/dist/src/config/envLoader.js +361 -0
- package/dist/src/config/jest-safe-setup.d.ts +19 -0
- package/dist/src/config/jest-safe-setup.js +369 -0
- package/dist/src/config/timeouts.d.ts +32 -0
- package/dist/src/config/timeouts.js +38 -0
- package/dist/src/desktop/DesktopActions.d.ts +46 -0
- package/dist/src/desktop/DesktopActions.js +398 -0
- package/dist/src/desktop/DesktopConnection.d.ts +32 -0
- package/dist/src/desktop/DesktopConnection.js +84 -0
- package/dist/src/domain/entities/TestExecution.d.ts +117 -0
- package/dist/src/domain/entities/TestExecution.js +150 -0
- package/dist/src/domain/entities/TestReport.d.ts +114 -0
- package/dist/src/domain/entities/TestReport.js +179 -0
- package/dist/src/domain/repositories/ITestRepository.d.ts +196 -0
- package/dist/src/domain/repositories/ITestRepository.js +14 -0
- package/dist/src/domain/schemas/ValidationSchemas.d.ts +159 -0
- package/dist/src/domain/schemas/ValidationSchemas.js +181 -0
- package/dist/src/functions/errors/BaseError.d.ts +78 -0
- package/dist/src/functions/errors/BaseError.js +245 -0
- package/dist/src/functions/errors/ConfigurationError.d.ts +16 -0
- package/dist/src/functions/errors/ConfigurationError.js +48 -0
- package/dist/src/functions/errors/ErrorCatalog.d.ts +148 -0
- package/dist/src/functions/errors/ErrorCatalog.js +157 -0
- package/dist/src/functions/errors/GlobalErrorHandler.d.ts +101 -0
- package/dist/src/functions/errors/GlobalErrorHandler.js +281 -0
- package/dist/src/functions/errors/IntegrationError.d.ts +17 -0
- package/dist/src/functions/errors/IntegrationError.js +51 -0
- package/dist/src/functions/errors/SecurityError.d.ts +14 -0
- package/dist/src/functions/errors/SecurityError.js +42 -0
- package/dist/src/functions/errors/SystemError.d.ts +12 -0
- package/dist/src/functions/errors/SystemError.js +36 -0
- package/dist/src/functions/errors/ValidationError.d.ts +14 -0
- package/dist/src/functions/errors/ValidationError.js +61 -0
- package/dist/src/functions/errors/index.d.ts +12 -0
- package/dist/src/functions/errors/index.js +13 -0
- package/dist/src/global-setup.d.ts +1 -0
- package/dist/src/global-setup.js +1037 -0
- package/dist/src/helpers/BancoActions.d.ts +188 -0
- package/dist/src/helpers/BancoActions.js +581 -0
- package/dist/src/helpers/EnviromentHelper.d.ts +17 -0
- package/dist/src/helpers/EnviromentHelper.js +66 -0
- package/dist/src/helpers/ParallelExecutionHelper.d.ts +183 -0
- package/dist/src/helpers/ParallelExecutionHelper.js +375 -0
- package/dist/src/helpers/SyncSignal.d.ts +15 -0
- package/dist/src/helpers/SyncSignal.js +44 -0
- package/dist/src/hubdocs/CategoryDetector.d.ts +83 -0
- package/dist/src/hubdocs/CategoryDetector.js +401 -0
- package/dist/src/hubdocs/DirectStatementInterceptor.d.ts +54 -0
- package/dist/src/hubdocs/DirectStatementInterceptor.js +243 -0
- package/dist/src/hubdocs/ExecutionTracker.d.ts +107 -0
- package/dist/src/hubdocs/ExecutionTracker.js +702 -0
- package/dist/src/hubdocs/HubDocs.d.ts +395 -0
- package/dist/src/hubdocs/HubDocs.js +3586 -0
- package/dist/src/hubdocs/StatementMethodFilter.d.ts +71 -0
- package/dist/src/hubdocs/StatementMethodFilter.js +618 -0
- package/dist/src/hubdocs/StatementTracker.d.ts +417 -0
- package/dist/src/hubdocs/StatementTracker.js +2419 -0
- package/dist/src/hubdocs/SwaggerGenerator.d.ts +59 -0
- package/dist/src/hubdocs/SwaggerGenerator.js +405 -0
- package/dist/src/hubdocs/index.d.ts +9 -0
- package/dist/src/hubdocs/index.js +9 -0
- package/dist/src/hubdocs/types.d.ts +114 -0
- package/dist/src/hubdocs/types.js +5 -0
- package/dist/src/infrastructure/DependencyContainer.d.ts +142 -0
- package/dist/src/infrastructure/DependencyContainer.js +250 -0
- package/dist/src/infrastructure/adapters/AppiumAdapter.d.ts +168 -0
- package/dist/src/infrastructure/adapters/AppiumAdapter.js +468 -0
- package/dist/src/infrastructure/adapters/OracleAdapter.d.ts +150 -0
- package/dist/src/infrastructure/adapters/OracleAdapter.js +388 -0
- package/dist/src/infrastructure/adapters/PlaywrightAdapter.d.ts +192 -0
- package/dist/src/infrastructure/adapters/PlaywrightAdapter.js +382 -0
- package/dist/src/infrastructure/adapters/SSHAdapter.d.ts +141 -0
- package/dist/src/infrastructure/adapters/SSHAdapter.js +428 -0
- package/dist/src/interfaces.d.ts +501 -0
- package/dist/src/interfaces.js +25 -0
- package/dist/src/internal/fakes/__fake-actions__.d.ts +17 -0
- package/dist/src/internal/fakes/__fake-actions__.js +21 -0
- package/dist/src/internal/fakes/__forbidden__.d.ts +10 -0
- package/dist/src/internal/fakes/__forbidden__.js +18 -0
- package/dist/src/internal/fakes/__honeypot__.d.ts +15 -0
- package/dist/src/internal/fakes/__honeypot__.js +24 -0
- package/dist/src/octane/OctaneReporter.d.ts +13 -0
- package/dist/src/octane/OctaneReporter.js +61 -0
- package/dist/src/playwright/CryptoActions.d.ts +20 -0
- package/dist/src/playwright/CryptoActions.js +75 -0
- package/dist/src/playwright/EnhancedWebActions.d.ts +7 -0
- package/dist/src/playwright/EnhancedWebActions.js +65 -0
- package/dist/src/playwright/WebActions.d.ts +1599 -0
- package/dist/src/playwright/WebActions.js +11788 -0
- package/dist/src/playwright/actions/ActionTimeline.d.ts +36 -0
- package/dist/src/playwright/actions/ActionTimeline.js +101 -0
- package/dist/src/playwright/actions/RecoveryQueue.d.ts +82 -0
- package/dist/src/playwright/actions/RecoveryQueue.js +130 -0
- package/dist/src/playwright/actions/SelectorCache.d.ts +53 -0
- package/dist/src/playwright/actions/SelectorCache.js +96 -0
- package/dist/src/playwright/actions/index.d.ts +13 -0
- package/dist/src/playwright/actions/index.js +14 -0
- package/dist/src/playwright/actions/types.d.ts +147 -0
- package/dist/src/playwright/actions/types.js +5 -0
- package/dist/src/playwright/fixtures.d.ts +112 -0
- package/dist/src/playwright/fixtures.js +718 -0
- package/dist/src/playwright/network-logs-reporter.d.ts +7 -0
- package/dist/src/playwright/network-logs-reporter.js +66 -0
- package/dist/src/playwright/registerRecoveryWrappers.d.ts +1 -0
- package/dist/src/playwright/registerRecoveryWrappers.js +54 -0
- package/dist/src/security/BuildSecurity.d.ts +12 -0
- package/dist/src/security/BuildSecurity.js +138 -0
- package/dist/src/security/EulaProtection.d.ts +70 -0
- package/dist/src/security/EulaProtection.js +155 -0
- package/dist/src/security/HoneypotManager.d.ts +46 -0
- package/dist/src/security/HoneypotManager.js +234 -0
- package/dist/src/security/KeysManager.d.ts +36 -0
- package/dist/src/security/KeysManager.js +158 -0
- package/dist/src/security/ProofOfWorkIntegration.d.ts +64 -0
- package/dist/src/security/ProofOfWorkIntegration.js +206 -0
- package/dist/src/security/SecurityValidation.d.ts +21 -0
- package/dist/src/security/SecurityValidation.js +163 -0
- package/dist/src/security/SourceMapProtection.d.ts +55 -0
- package/dist/src/security/SourceMapProtection.js +220 -0
- package/dist/src/security/protector.d.ts +1 -0
- package/dist/src/security/protector.js +97 -0
- package/dist/src/ssh/SSHActions.d.ts +262 -0
- package/dist/src/ssh/SSHActions.js +790 -0
- package/dist/src/ssh/SSHClient.d.ts +99 -0
- package/dist/src/ssh/SSHClient.js +409 -0
- package/dist/src/statements/BaseStatement.d.ts +38 -0
- package/dist/src/statements/BaseStatement.js +78 -0
- package/dist/src/testContext/AuthStateManager.d.ts +93 -0
- package/dist/src/testContext/AuthStateManager.js +256 -0
- package/dist/src/testContext/CoverageManager.d.ts +198 -0
- package/dist/src/testContext/CoverageManager.js +917 -0
- package/dist/src/testContext/TestAnnotations.d.ts +476 -0
- package/dist/src/testContext/TestAnnotations.js +2647 -0
- package/dist/src/testContext/TestContext.d.ts +138 -0
- package/dist/src/testContext/TestContext.js +369 -0
- package/dist/src/testContext/UnifiedHtmlGenerator.d.ts +7 -0
- package/dist/src/testContext/UnifiedHtmlGenerator.js +264 -0
- package/dist/src/testContext/UnifiedReportManager.d.ts +211 -0
- package/dist/src/testContext/UnifiedReportManager.js +1206 -0
- package/dist/src/testhub/DynamicConfigManager.d.ts +121 -0
- package/dist/src/testhub/DynamicConfigManager.js +320 -0
- package/dist/src/testhub/SystemsManager.d.ts +119 -0
- package/dist/src/testhub/SystemsManager.js +365 -0
- package/dist/src/testhub/TestHubClient.d.ts +335 -0
- package/dist/src/testhub/TestHubClient.js +1215 -0
- package/dist/src/testhub/TestHubReporter.d.ts +62 -0
- package/dist/src/testhub/TestHubReporter.js +576 -0
- package/dist/src/testhub/TestHubVars.d.ts +116 -0
- package/dist/src/testhub/TestHubVars.js +273 -0
- package/dist/src/utils/ActionInterceptor.d.ts +59 -0
- package/dist/src/utils/ActionInterceptor.js +741 -0
- package/dist/src/utils/ArtifactsCompressor.d.ts +43 -0
- package/dist/src/utils/ArtifactsCompressor.js +181 -0
- package/dist/src/utils/AutoLogsFinal.d.ts +47 -0
- package/dist/src/utils/AutoLogsFinal.js +148 -0
- package/dist/src/utils/CodeGenSession.d.ts +114 -0
- package/dist/src/utils/CodeGenSession.js +264 -0
- package/dist/src/utils/ConfigLogger.d.ts +133 -0
- package/dist/src/utils/ConfigLogger.js +611 -0
- package/dist/src/utils/CustomReporter.d.ts +22 -0
- package/dist/src/utils/CustomReporter.js +352 -0
- package/dist/src/utils/DataStore.d.ts +171 -0
- package/dist/src/utils/DataStore.js +484 -0
- package/dist/src/utils/DatabaseInterceptor.d.ts +19 -0
- package/dist/src/utils/DatabaseInterceptor.js +295 -0
- package/dist/src/utils/DateHelper.d.ts +16 -0
- package/dist/src/utils/DateHelper.js +120 -0
- package/dist/src/utils/DateValidator.d.ts +4 -0
- package/dist/src/utils/DateValidator.js +51 -0
- package/dist/src/utils/DocumentGenerator.d.ts +35 -0
- package/dist/src/utils/DocumentGenerator.js +129 -0
- package/dist/src/utils/EvidenceCapture.d.ts +90 -0
- package/dist/src/utils/EvidenceCapture.js +600 -0
- package/dist/src/utils/EvidenceReportGenerator.d.ts +70 -0
- package/dist/src/utils/EvidenceReportGenerator.js +799 -0
- package/dist/src/utils/FrameManagementUtil.d.ts +42 -0
- package/dist/src/utils/FrameManagementUtil.js +75 -0
- package/dist/src/utils/GlobalStatementsInterceptor.d.ts +1 -0
- package/dist/src/utils/GlobalStatementsInterceptor.js +1 -0
- package/dist/src/utils/HTMLTemplate.d.ts +1 -0
- package/dist/src/utils/HTMLTemplate.js +1034 -0
- package/dist/src/utils/InterceptacaoMagica.d.ts +23 -0
- package/dist/src/utils/InterceptacaoMagica.js +365 -0
- package/dist/src/utils/LogSanitizer.d.ts +35 -0
- package/dist/src/utils/LogSanitizer.js +110 -0
- package/dist/src/utils/Logger.d.ts +65 -0
- package/dist/src/utils/Logger.js +284 -0
- package/dist/src/utils/McpLocalClient.d.ts +141 -0
- package/dist/src/utils/McpLocalClient.js +871 -0
- package/dist/src/utils/PDFEvidenceGenerator.d.ts +20 -0
- package/dist/src/utils/PDFEvidenceGenerator.js +156 -0
- package/dist/src/utils/SpecFileAnalyzer.d.ts +35 -0
- package/dist/src/utils/SpecFileAnalyzer.js +209 -0
- package/dist/src/utils/StatementInterceptor.d.ts +18 -0
- package/dist/src/utils/StatementInterceptor.js +87 -0
- package/dist/src/utils/StatementLogger.d.ts +33 -0
- package/dist/src/utils/StatementLogger.js +113 -0
- package/dist/src/utils/StatementsInterceptor.d.ts +1 -0
- package/dist/src/utils/StatementsInterceptor.js +1 -0
- package/dist/src/utils/TeamsFlushHook.d.ts +17 -0
- package/dist/src/utils/TeamsFlushHook.js +168 -0
- package/dist/src/utils/TerminalLogCapture.d.ts +158 -0
- package/dist/src/utils/TerminalLogCapture.js +531 -0
- package/dist/src/utils/TestMethodLogger.d.ts +70 -0
- package/dist/src/utils/TestMethodLogger.js +95 -0
- package/dist/src/utils/UnifiedTeardown.d.ts +4 -0
- package/dist/src/utils/UnifiedTeardown.js +400 -0
- package/dist/src/utils/XPathCatalog.d.ts +152 -0
- package/dist/src/utils/XPathCatalog.js +350 -0
- package/dist/src/utils/generators.d.ts +90 -0
- package/dist/src/utils/generators.js +167 -0
- package/dist/src/utils/testRecovery/ResilientPlaywright.d.ts +152 -0
- package/dist/src/utils/testRecovery/ResilientPlaywright.js +715 -0
- package/dist/src/utils/testRecovery/TestRecoveryClient.d.ts +801 -0
- package/dist/src/utils/testRecovery/TestRecoveryClient.js +1415 -0
- package/dist/src/utils/testRecovery/autoFixCode.d.ts +65 -0
- package/dist/src/utils/testRecovery/autoFixCode.js +32 -0
- package/dist/vitest.config.d.ts +2 -0
- package/dist/vitest.config.js +59 -0
- package/dist/wdio.conf.d.ts +1 -0
- package/dist/wdio.conf.js +420 -0
- package/package.json +137 -0
- package/protect-loader.mjs +643 -0
- package/scripts/consumer-postinstall.ts +975 -0
- package/scripts/generate-index.ts +343 -0
- package/scripts/init-api.ts +613 -0
- package/scripts/init-banco.ts +437 -0
- package/scripts/init-frontend.ts +727 -0
- package/scripts/init-mobile.ts +558 -0
- package/scripts/init-scenarios.ts +925 -0
- package/scripts/init-ssh.ts +734 -0
- package/scripts/package-versions.ts +978 -0
- package/scripts/postinstall.ts +605 -0
- package/scripts/smart-override.ts +1675 -0
- package/scripts/sync-configs.ts +302 -0
- package/scripts/ultracite-setup.ts +370 -0
- package/src/types/globals.d.ts +48 -0
- package/tsconfig.json +29 -0
- package/types/autocore-sync-signal.d.ts +10 -0
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Adaptador SSH para execução remota seguindo padrões DDD
|
|
3
|
+
* @module Infrastructure/Adapters
|
|
4
|
+
*/
|
|
5
|
+
import { Client } from 'ssh2';
|
|
6
|
+
import { SchemaValidator, SSHCredentialsSchema, } from '../../domain/schemas/ValidationSchemas.js';
|
|
7
|
+
import { IntegrationError } from '../../functions/errors/IntegrationError.js';
|
|
8
|
+
import { ValidationError } from '../../functions/errors/ValidationError.js';
|
|
9
|
+
/**
|
|
10
|
+
* Adaptador que integra node-ssh com a arquitetura do AutoCore
|
|
11
|
+
* Implementa a interface ISSHClient usando node-ssh
|
|
12
|
+
*/
|
|
13
|
+
export class SSHAdapter {
|
|
14
|
+
ssh = null;
|
|
15
|
+
connected = false;
|
|
16
|
+
connectionInfo = null;
|
|
17
|
+
constructor() {
|
|
18
|
+
// Lazy loading da biblioteca node-ssh
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Conecta ao servidor SSH
|
|
22
|
+
*/
|
|
23
|
+
async connect(credentials) {
|
|
24
|
+
try {
|
|
25
|
+
// Validação usando Zod
|
|
26
|
+
const validCredentials = SchemaValidator.validate(SSHCredentialsSchema, credentials);
|
|
27
|
+
// Lazy loading da biblioteca SSH
|
|
28
|
+
if (!this.ssh) {
|
|
29
|
+
try {
|
|
30
|
+
// Usar ssh2 em vez de node-ssh
|
|
31
|
+
this.ssh = new Client();
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
// Fallback para implementação mock se ssh2 não estiver disponível
|
|
35
|
+
this.ssh = {
|
|
36
|
+
connect: async () => {
|
|
37
|
+
throw new Error('ssh2 não instalado');
|
|
38
|
+
},
|
|
39
|
+
dispose: async () => { },
|
|
40
|
+
execCommand: async () => ({
|
|
41
|
+
code: 1,
|
|
42
|
+
stdout: '',
|
|
43
|
+
stderr: 'node-ssh não instalado',
|
|
44
|
+
}),
|
|
45
|
+
putFile: async () => {
|
|
46
|
+
throw new Error('node-ssh não instalado');
|
|
47
|
+
},
|
|
48
|
+
getFile: async () => {
|
|
49
|
+
throw new Error('node-ssh não instalado');
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Preparar configuração de conexão
|
|
55
|
+
const config = {
|
|
56
|
+
host: validCredentials.host,
|
|
57
|
+
port: validCredentials.port,
|
|
58
|
+
username: validCredentials.username,
|
|
59
|
+
readyTimeout: 30_000,
|
|
60
|
+
keepaliveInterval: 15_000,
|
|
61
|
+
algorithms: {
|
|
62
|
+
kex: [
|
|
63
|
+
'diffie-hellman-group-exchange-sha256',
|
|
64
|
+
'diffie-hellman-group14-sha256',
|
|
65
|
+
'diffie-hellman-group14-sha1',
|
|
66
|
+
'diffie-hellman-group1-sha1',
|
|
67
|
+
'ecdh-sha2-nistp256',
|
|
68
|
+
'ecdh-sha2-nistp384',
|
|
69
|
+
'ecdh-sha2-nistp521',
|
|
70
|
+
],
|
|
71
|
+
cipher: [
|
|
72
|
+
'aes128-ctr',
|
|
73
|
+
'aes192-ctr',
|
|
74
|
+
'aes256-ctr',
|
|
75
|
+
'aes128-gcm',
|
|
76
|
+
'aes256-gcm',
|
|
77
|
+
'aes128-cbc',
|
|
78
|
+
'aes192-cbc',
|
|
79
|
+
'aes256-cbc',
|
|
80
|
+
],
|
|
81
|
+
hmac: ['hmac-sha2-256', 'hmac-sha2-512', 'hmac-sha1'],
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
// Adicionar autenticação
|
|
85
|
+
if (validCredentials.privateKey) {
|
|
86
|
+
config.privateKey = validCredentials.privateKey;
|
|
87
|
+
if (validCredentials.passphrase) {
|
|
88
|
+
config.passphrase = validCredentials.passphrase;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else if (validCredentials.password) {
|
|
92
|
+
config.password = validCredentials.password;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
throw ValidationError.missingRequiredParameter('password or privateKey');
|
|
96
|
+
}
|
|
97
|
+
await this.ssh.connect(config);
|
|
98
|
+
this.connected = true;
|
|
99
|
+
this.connectionInfo = validCredentials;
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
const err = error;
|
|
103
|
+
this.connected = false;
|
|
104
|
+
this.connectionInfo = null;
|
|
105
|
+
throw IntegrationError.sshConnectionFailed(credentials.host, err);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Desconecta do servidor SSH
|
|
110
|
+
*/
|
|
111
|
+
async disconnect() {
|
|
112
|
+
try {
|
|
113
|
+
if (this.ssh && this.connected) {
|
|
114
|
+
this.ssh.end();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
finally {
|
|
118
|
+
this.connected = false;
|
|
119
|
+
this.connectionInfo = null;
|
|
120
|
+
this.ssh = null;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Verifica se está conectado
|
|
125
|
+
*/
|
|
126
|
+
isConnected() {
|
|
127
|
+
return this.connected && !!this.ssh;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Executa comando no servidor remoto
|
|
131
|
+
*/
|
|
132
|
+
async executeCommand(command, options = {}) {
|
|
133
|
+
if (!this.isConnected()) {
|
|
134
|
+
throw ValidationError.invalidConfiguration('ssh', 'SSH não está conectado');
|
|
135
|
+
}
|
|
136
|
+
if (!command.trim()) {
|
|
137
|
+
throw ValidationError.missingRequiredParameter('command');
|
|
138
|
+
}
|
|
139
|
+
const startTime = new Date();
|
|
140
|
+
try {
|
|
141
|
+
const execOptions = {
|
|
142
|
+
execOptions: {},
|
|
143
|
+
};
|
|
144
|
+
if (options.cwd) {
|
|
145
|
+
// Prefixar comando com mudança de diretório
|
|
146
|
+
command = `cd ${options.cwd} && ${command}`;
|
|
147
|
+
}
|
|
148
|
+
if (options.timeout) {
|
|
149
|
+
execOptions.execOptions.timeout = options.timeout;
|
|
150
|
+
}
|
|
151
|
+
const result = await this.ssh.execCommand(command, execOptions);
|
|
152
|
+
return {
|
|
153
|
+
success: result.code === 0,
|
|
154
|
+
stdout: result.stdout || '',
|
|
155
|
+
stderr: result.stderr || '',
|
|
156
|
+
exitCode: result.code || 0,
|
|
157
|
+
command,
|
|
158
|
+
timestamp: startTime,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
const err = error;
|
|
163
|
+
throw IntegrationError.webOperationFailed('executeCommand', `Falha ao executar comando: ${command}`, err);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Faz upload de arquivo para o servidor
|
|
168
|
+
*/
|
|
169
|
+
async uploadFile(localPath, remotePath) {
|
|
170
|
+
if (!this.isConnected()) {
|
|
171
|
+
throw ValidationError.invalidConfiguration('ssh', 'SSH não está conectado');
|
|
172
|
+
}
|
|
173
|
+
if (!(localPath.trim() && remotePath.trim())) {
|
|
174
|
+
throw ValidationError.missingRequiredParameter('localPath and remotePath');
|
|
175
|
+
}
|
|
176
|
+
try {
|
|
177
|
+
await this.ssh.putFile(localPath, remotePath);
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
const err = error;
|
|
181
|
+
throw IntegrationError.fileSystemError('upload', `${localPath} -> ${remotePath}`, err);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Faz download de arquivo do servidor
|
|
186
|
+
*/
|
|
187
|
+
async downloadFile(remotePath, localPath) {
|
|
188
|
+
if (!this.isConnected()) {
|
|
189
|
+
throw ValidationError.invalidConfiguration('ssh', 'SSH não está conectado');
|
|
190
|
+
}
|
|
191
|
+
if (!(localPath.trim() && remotePath.trim())) {
|
|
192
|
+
throw ValidationError.missingRequiredParameter('localPath and remotePath');
|
|
193
|
+
}
|
|
194
|
+
try {
|
|
195
|
+
await this.ssh.getFile(localPath, remotePath);
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
const err = error;
|
|
199
|
+
throw IntegrationError.fileSystemError('download', `${remotePath} -> ${localPath}`, err);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Cria diretório no servidor
|
|
204
|
+
*/
|
|
205
|
+
async createDirectory(remotePath, recursive = true) {
|
|
206
|
+
if (!this.isConnected()) {
|
|
207
|
+
throw ValidationError.invalidConfiguration('ssh', 'SSH não está conectado');
|
|
208
|
+
}
|
|
209
|
+
if (!remotePath.trim()) {
|
|
210
|
+
throw ValidationError.missingRequiredParameter('remotePath');
|
|
211
|
+
}
|
|
212
|
+
try {
|
|
213
|
+
const command = recursive
|
|
214
|
+
? `mkdir -p "${remotePath}"`
|
|
215
|
+
: `mkdir "${remotePath}"`;
|
|
216
|
+
const result = await this.executeCommand(command);
|
|
217
|
+
if (!result.success) {
|
|
218
|
+
throw new Error(`Falha ao criar diretório: ${result.stderr}`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
const err = error;
|
|
223
|
+
throw IntegrationError.fileSystemError('createDirectory', remotePath, err);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Remove arquivo do servidor
|
|
228
|
+
*/
|
|
229
|
+
async removeFile(remotePath) {
|
|
230
|
+
if (!this.isConnected()) {
|
|
231
|
+
throw ValidationError.invalidConfiguration('ssh', 'SSH não está conectado');
|
|
232
|
+
}
|
|
233
|
+
if (!remotePath.trim()) {
|
|
234
|
+
throw ValidationError.missingRequiredParameter('remotePath');
|
|
235
|
+
}
|
|
236
|
+
try {
|
|
237
|
+
const result = await this.executeCommand(`rm -f "${remotePath}"`);
|
|
238
|
+
if (!result.success) {
|
|
239
|
+
throw new Error(`Falha ao remover arquivo: ${result.stderr}`);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
catch (error) {
|
|
243
|
+
const err = error;
|
|
244
|
+
throw IntegrationError.fileSystemError('removeFile', remotePath, err);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Remove diretório do servidor
|
|
249
|
+
*/
|
|
250
|
+
async removeDirectory(remotePath, recursive = false) {
|
|
251
|
+
if (!this.isConnected()) {
|
|
252
|
+
throw ValidationError.invalidConfiguration('ssh', 'SSH não está conectado');
|
|
253
|
+
}
|
|
254
|
+
if (!remotePath.trim()) {
|
|
255
|
+
throw ValidationError.missingRequiredParameter('remotePath');
|
|
256
|
+
}
|
|
257
|
+
try {
|
|
258
|
+
const command = recursive
|
|
259
|
+
? `rm -rf "${remotePath}"`
|
|
260
|
+
: `rmdir "${remotePath}"`;
|
|
261
|
+
const result = await this.executeCommand(command);
|
|
262
|
+
if (!result.success) {
|
|
263
|
+
throw new Error(`Falha ao remover diretório: ${result.stderr}`);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
catch (error) {
|
|
267
|
+
const err = error;
|
|
268
|
+
throw IntegrationError.fileSystemError('removeDirectory', remotePath, err);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Verifica se arquivo existe no servidor
|
|
273
|
+
*/
|
|
274
|
+
async fileExists(remotePath) {
|
|
275
|
+
if (!this.isConnected()) {
|
|
276
|
+
throw ValidationError.invalidConfiguration('ssh', 'SSH não está conectado');
|
|
277
|
+
}
|
|
278
|
+
if (!remotePath.trim()) {
|
|
279
|
+
throw ValidationError.missingRequiredParameter('remotePath');
|
|
280
|
+
}
|
|
281
|
+
try {
|
|
282
|
+
const result = await this.executeCommand(`test -e "${remotePath}" && echo "exists"`);
|
|
283
|
+
return result.success && result.stdout.includes('exists');
|
|
284
|
+
}
|
|
285
|
+
catch (error) {
|
|
286
|
+
return false;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Obtém informações de arquivo/diretório
|
|
291
|
+
*/
|
|
292
|
+
async getFileInfo(remotePath) {
|
|
293
|
+
if (!this.isConnected()) {
|
|
294
|
+
throw ValidationError.invalidConfiguration('ssh', 'SSH não está conectado');
|
|
295
|
+
}
|
|
296
|
+
if (!remotePath.trim()) {
|
|
297
|
+
throw ValidationError.missingRequiredParameter('remotePath');
|
|
298
|
+
}
|
|
299
|
+
try {
|
|
300
|
+
const result = await this.executeCommand(`stat -c "%s %Y %F" "${remotePath}"`);
|
|
301
|
+
if (!result.success) {
|
|
302
|
+
throw new Error(`Arquivo não encontrado: ${remotePath}`);
|
|
303
|
+
}
|
|
304
|
+
const parts = result.stdout.trim().split(' ');
|
|
305
|
+
if (parts.length < 3) {
|
|
306
|
+
throw new Error('Formato inválido de stat');
|
|
307
|
+
}
|
|
308
|
+
const size = Number.parseInt(parts[0], 10);
|
|
309
|
+
const modifiedTimestamp = Number.parseInt(parts[1], 10);
|
|
310
|
+
const fileType = parts.slice(2).join(' ');
|
|
311
|
+
return {
|
|
312
|
+
size: isNaN(size) ? 0 : size,
|
|
313
|
+
modified: new Date(modifiedTimestamp * 1000),
|
|
314
|
+
isDirectory: fileType.includes('directory'),
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
catch (error) {
|
|
318
|
+
const err = error;
|
|
319
|
+
throw IntegrationError.fileSystemError('getFileInfo', remotePath, err);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Lista conteúdo de diretório
|
|
324
|
+
*/
|
|
325
|
+
async listDirectory(remotePath) {
|
|
326
|
+
if (!this.isConnected()) {
|
|
327
|
+
throw ValidationError.invalidConfiguration('ssh', 'SSH não está conectado');
|
|
328
|
+
}
|
|
329
|
+
if (!remotePath.trim()) {
|
|
330
|
+
throw ValidationError.missingRequiredParameter('remotePath');
|
|
331
|
+
}
|
|
332
|
+
try {
|
|
333
|
+
const result = await this.executeCommand(`ls -1 "${remotePath}"`);
|
|
334
|
+
if (!result.success) {
|
|
335
|
+
throw new Error(`Falha ao listar diretório: ${result.stderr}`);
|
|
336
|
+
}
|
|
337
|
+
return result.stdout
|
|
338
|
+
.split('\n')
|
|
339
|
+
.map((line) => line.trim())
|
|
340
|
+
.filter((line) => line.length > 0);
|
|
341
|
+
}
|
|
342
|
+
catch (error) {
|
|
343
|
+
const err = error;
|
|
344
|
+
throw IntegrationError.fileSystemError('listDirectory', remotePath, err);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Obtém informações da conexão atual
|
|
349
|
+
*/
|
|
350
|
+
getConnectionInfo() {
|
|
351
|
+
return this.connectionInfo;
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Obtém a instância do NodeSSH
|
|
355
|
+
* Para casos onde é necessário acessar funcionalidades específicas
|
|
356
|
+
*/
|
|
357
|
+
getSSHClient() {
|
|
358
|
+
return this.ssh;
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Executa múltiplos comandos em sequência
|
|
362
|
+
*/
|
|
363
|
+
async executeCommandSequence(commands, options = {}) {
|
|
364
|
+
if (!commands || commands.length === 0) {
|
|
365
|
+
throw ValidationError.missingRequiredParameter('commands');
|
|
366
|
+
}
|
|
367
|
+
const results = [];
|
|
368
|
+
const stopOnError = options.stopOnError !== false;
|
|
369
|
+
for (const command of commands) {
|
|
370
|
+
try {
|
|
371
|
+
const result = await this.executeCommand(command, options);
|
|
372
|
+
results.push(result);
|
|
373
|
+
if (stopOnError && !result.success) {
|
|
374
|
+
break;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
catch (error) {
|
|
378
|
+
const errorResult = {
|
|
379
|
+
success: false,
|
|
380
|
+
stdout: '',
|
|
381
|
+
stderr: error.message,
|
|
382
|
+
exitCode: -1,
|
|
383
|
+
command,
|
|
384
|
+
timestamp: new Date(),
|
|
385
|
+
};
|
|
386
|
+
results.push(errorResult);
|
|
387
|
+
if (stopOnError) {
|
|
388
|
+
break;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
return results;
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Executa script local no servidor remoto
|
|
396
|
+
*/
|
|
397
|
+
async executeScript(scriptContent, options = {}) {
|
|
398
|
+
if (!scriptContent.trim()) {
|
|
399
|
+
throw ValidationError.missingRequiredParameter('scriptContent');
|
|
400
|
+
}
|
|
401
|
+
const interpreter = options.interpreter || 'bash';
|
|
402
|
+
const args = options.args ? options.args.join(' ') : '';
|
|
403
|
+
const tempFile = `/tmp/autocore_script_${Date.now()}.sh`;
|
|
404
|
+
try {
|
|
405
|
+
// Upload do script
|
|
406
|
+
const fs = await import('fs/promises');
|
|
407
|
+
const localTempFile = `./temp_script_${Date.now()}.sh`;
|
|
408
|
+
await fs.writeFile(localTempFile, scriptContent);
|
|
409
|
+
await this.uploadFile(localTempFile, tempFile);
|
|
410
|
+
await fs.unlink(localTempFile);
|
|
411
|
+
// Tornar executável e executar
|
|
412
|
+
await this.executeCommand(`chmod +x "${tempFile}"`);
|
|
413
|
+
const result = await this.executeCommand(`${interpreter} "${tempFile}" ${args}`, options);
|
|
414
|
+
// Limpar arquivo temporário
|
|
415
|
+
await this.removeFile(tempFile);
|
|
416
|
+
return result;
|
|
417
|
+
}
|
|
418
|
+
catch (error) {
|
|
419
|
+
// Tentar limpar arquivo temporário em caso de erro
|
|
420
|
+
try {
|
|
421
|
+
await this.removeFile(tempFile);
|
|
422
|
+
}
|
|
423
|
+
catch { }
|
|
424
|
+
const err = error;
|
|
425
|
+
throw IntegrationError.webOperationFailed('executeScript', 'Falha ao executar script remoto', err);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
}
|