synapse-mcp 1.0.0 → 1.0.2
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/README.md +1820 -147
- package/dist/constants.d.ts +10 -4
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +18 -8
- package/dist/constants.js.map +1 -1
- package/dist/events/emitter.d.ts +63 -0
- package/dist/events/emitter.d.ts.map +1 -0
- package/dist/events/emitter.js +112 -0
- package/dist/events/emitter.js.map +1 -0
- package/dist/events/index.d.ts +3 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +3 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/types.d.ts +51 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/events/types.js +3 -0
- package/dist/events/types.js.map +1 -0
- package/dist/formatters/compose.d.ts +185 -0
- package/dist/formatters/compose.d.ts.map +1 -0
- package/dist/formatters/compose.js +397 -0
- package/dist/formatters/compose.js.map +1 -0
- package/dist/formatters/container.d.ts +84 -0
- package/dist/formatters/container.d.ts.map +1 -0
- package/dist/formatters/container.js +323 -0
- package/dist/formatters/container.js.map +1 -0
- package/dist/formatters/diagnostics.d.ts +20 -0
- package/dist/formatters/diagnostics.d.ts.map +1 -0
- package/dist/formatters/diagnostics.js +73 -0
- package/dist/formatters/diagnostics.js.map +1 -0
- package/dist/formatters/docker.d.ts +139 -0
- package/dist/formatters/docker.d.ts.map +1 -0
- package/dist/formatters/docker.js +216 -0
- package/dist/formatters/docker.js.map +1 -0
- package/dist/formatters/host.d.ts +137 -0
- package/dist/formatters/host.d.ts.map +1 -0
- package/dist/formatters/host.js +198 -0
- package/dist/formatters/host.js.map +1 -0
- package/dist/formatters/index.d.ts +17 -270
- package/dist/formatters/index.d.ts.map +1 -1
- package/dist/formatters/index.js +21 -456
- package/dist/formatters/index.js.map +1 -1
- package/dist/formatters/scout.d.ts +424 -0
- package/dist/formatters/scout.d.ts.map +1 -0
- package/dist/formatters/scout.js +687 -0
- package/dist/formatters/scout.js.map +1 -0
- package/dist/formatters/strategy.d.ts +105 -0
- package/dist/formatters/strategy.d.ts.map +1 -0
- package/dist/formatters/strategy.js +120 -0
- package/dist/formatters/strategy.js.map +1 -0
- package/dist/formatters/utils.d.ts +84 -0
- package/dist/formatters/utils.d.ts.map +1 -0
- package/dist/formatters/utils.js +129 -0
- package/dist/formatters/utils.js.map +1 -0
- package/dist/health-rate-limiter.d.ts +59 -0
- package/dist/health-rate-limiter.d.ts.map +1 -0
- package/dist/health-rate-limiter.js +159 -0
- package/dist/health-rate-limiter.js.map +1 -0
- package/dist/index.js +61 -100
- package/dist/index.js.map +1 -1
- package/dist/middleware/async-handler.d.ts +62 -0
- package/dist/middleware/async-handler.d.ts.map +1 -0
- package/dist/middleware/async-handler.js +58 -0
- package/dist/middleware/async-handler.js.map +1 -0
- package/dist/middleware/auth.d.ts +32 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +63 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/csrf-protection.d.ts +58 -0
- package/dist/middleware/csrf-protection.d.ts.map +1 -0
- package/dist/middleware/csrf-protection.js +123 -0
- package/dist/middleware/csrf-protection.js.map +1 -0
- package/dist/middleware/error-handler.d.ts +49 -0
- package/dist/middleware/error-handler.d.ts.map +1 -0
- package/dist/middleware/error-handler.js +90 -0
- package/dist/middleware/error-handler.js.map +1 -0
- package/dist/middleware/error-mapper.d.ts +44 -0
- package/dist/middleware/error-mapper.d.ts.map +1 -0
- package/dist/middleware/error-mapper.js +127 -0
- package/dist/middleware/error-mapper.js.map +1 -0
- package/dist/middleware/index.d.ts +13 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +13 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/request-id.d.ts +22 -0
- package/dist/middleware/request-id.d.ts.map +1 -0
- package/dist/middleware/request-id.js +31 -0
- package/dist/middleware/request-id.js.map +1 -0
- package/dist/middleware/types.d.ts +33 -0
- package/dist/middleware/types.d.ts.map +1 -0
- package/dist/middleware/types.js +2 -0
- package/dist/middleware/types.js.map +1 -0
- package/dist/schemas/common.d.ts +205 -8
- package/dist/schemas/common.d.ts.map +1 -1
- package/dist/schemas/common.js +290 -17
- package/dist/schemas/common.js.map +1 -1
- package/dist/schemas/flux/compose.d.ts +307 -44
- package/dist/schemas/flux/compose.d.ts.map +1 -1
- package/dist/schemas/flux/compose.js +74 -48
- package/dist/schemas/flux/compose.js.map +1 -1
- package/dist/schemas/flux/container.d.ts +423 -56
- package/dist/schemas/flux/container.d.ts.map +1 -1
- package/dist/schemas/flux/container.js +83 -61
- package/dist/schemas/flux/container.js.map +1 -1
- package/dist/schemas/flux/docker.d.ts +254 -37
- package/dist/schemas/flux/docker.d.ts.map +1 -1
- package/dist/schemas/flux/docker.js +69 -39
- package/dist/schemas/flux/docker.js.map +1 -1
- package/dist/schemas/flux/host.d.ts +312 -29
- package/dist/schemas/flux/host.d.ts.map +1 -1
- package/dist/schemas/flux/host.js +74 -31
- package/dist/schemas/flux/host.js.map +1 -1
- package/dist/schemas/flux/index.d.ts +503 -11
- package/dist/schemas/flux/index.d.ts.map +1 -1
- package/dist/schemas/flux/index.js +34 -70
- package/dist/schemas/flux/index.js.map +1 -1
- package/dist/schemas/host-config.d.ts +76 -0
- package/dist/schemas/host-config.d.ts.map +1 -0
- package/dist/schemas/host-config.js +105 -0
- package/dist/schemas/host-config.js.map +1 -0
- package/dist/schemas/scout/index.d.ts +80 -23
- package/dist/schemas/scout/index.d.ts.map +1 -1
- package/dist/schemas/scout/index.js +26 -11
- package/dist/schemas/scout/index.js.map +1 -1
- package/dist/schemas/scout/logs.d.ts +17 -5
- package/dist/schemas/scout/logs.d.ts.map +1 -1
- package/dist/schemas/scout/logs.js +41 -31
- package/dist/schemas/scout/logs.js.map +1 -1
- package/dist/schemas/scout/simple.d.ts +126 -11
- package/dist/schemas/scout/simple.d.ts.map +1 -1
- package/dist/schemas/scout/simple.js +112 -57
- package/dist/schemas/scout/simple.js.map +1 -1
- package/dist/schemas/scout/zfs.d.ts +17 -5
- package/dist/schemas/scout/zfs.d.ts.map +1 -1
- package/dist/schemas/scout/zfs.js +34 -25
- package/dist/schemas/scout/zfs.js.map +1 -1
- package/dist/services/cache-layer.d.ts +160 -0
- package/dist/services/cache-layer.d.ts.map +1 -0
- package/dist/services/cache-layer.js +138 -0
- package/dist/services/cache-layer.js.map +1 -0
- package/dist/services/compose-cache.d.ts +75 -0
- package/dist/services/compose-cache.d.ts.map +1 -0
- package/dist/services/compose-cache.js +178 -0
- package/dist/services/compose-cache.js.map +1 -0
- package/dist/services/compose-discovery.d.ts +46 -0
- package/dist/services/compose-discovery.d.ts.map +1 -0
- package/dist/services/compose-discovery.js +219 -0
- package/dist/services/compose-discovery.js.map +1 -0
- package/dist/services/compose-project-lister.d.ts +27 -0
- package/dist/services/compose-project-lister.d.ts.map +1 -0
- package/dist/services/compose-project-lister.js +71 -0
- package/dist/services/compose-project-lister.js.map +1 -0
- package/dist/services/compose-scanner.d.ts +63 -0
- package/dist/services/compose-scanner.d.ts.map +1 -0
- package/dist/services/compose-scanner.js +253 -0
- package/dist/services/compose-scanner.js.map +1 -0
- package/dist/services/compose.d.ts +64 -28
- package/dist/services/compose.d.ts.map +1 -1
- package/dist/services/compose.js +220 -98
- package/dist/services/compose.js.map +1 -1
- package/dist/services/config-loader.d.ts +23 -0
- package/dist/services/config-loader.d.ts.map +1 -0
- package/dist/services/config-loader.js +124 -0
- package/dist/services/config-loader.js.map +1 -0
- package/dist/services/config-service.d.ts +38 -0
- package/dist/services/config-service.d.ts.map +1 -0
- package/dist/services/config-service.js +225 -0
- package/dist/services/config-service.js.map +1 -0
- package/dist/services/container-host-map-cache.d.ts +121 -0
- package/dist/services/container-host-map-cache.d.ts.map +1 -0
- package/dist/services/container-host-map-cache.js +188 -0
- package/dist/services/container-host-map-cache.js.map +1 -0
- package/dist/services/container.d.ts +194 -6
- package/dist/services/container.d.ts.map +1 -1
- package/dist/services/container.js +386 -11
- package/dist/services/container.js.map +1 -1
- package/dist/services/diagnostics.d.ts +57 -0
- package/dist/services/diagnostics.d.ts.map +1 -0
- package/dist/services/diagnostics.js +271 -0
- package/dist/services/diagnostics.js.map +1 -0
- package/dist/services/docker/container-service.d.ts +123 -0
- package/dist/services/docker/container-service.d.ts.map +1 -0
- package/dist/services/docker/container-service.js +347 -0
- package/dist/services/docker/container-service.js.map +1 -0
- package/dist/services/docker/image-service.d.ts +82 -0
- package/dist/services/docker/image-service.d.ts.map +1 -0
- package/dist/services/docker/image-service.js +193 -0
- package/dist/services/docker/image-service.js.map +1 -0
- package/dist/services/docker/index.d.ts +80 -0
- package/dist/services/docker/index.d.ts.map +1 -0
- package/dist/services/docker/index.js +103 -0
- package/dist/services/docker/index.js.map +1 -0
- package/dist/services/docker/network-service.d.ts +22 -0
- package/dist/services/docker/network-service.d.ts.map +1 -0
- package/dist/services/docker/network-service.js +43 -0
- package/dist/services/docker/network-service.js.map +1 -0
- package/dist/services/docker/system-service.d.ts +49 -0
- package/dist/services/docker/system-service.d.ts.map +1 -0
- package/dist/services/docker/system-service.js +215 -0
- package/dist/services/docker/system-service.js.map +1 -0
- package/dist/services/docker/utils/client-factory.d.ts +56 -0
- package/dist/services/docker/utils/client-factory.d.ts.map +1 -0
- package/dist/services/docker/utils/client-factory.js +139 -0
- package/dist/services/docker/utils/client-factory.js.map +1 -0
- package/dist/services/docker/utils/client-manager.d.ts +88 -0
- package/dist/services/docker/utils/client-manager.d.ts.map +1 -0
- package/dist/services/docker/utils/client-manager.js +124 -0
- package/dist/services/docker/utils/client-manager.js.map +1 -0
- package/dist/services/docker/utils/exec-handler.d.ts +94 -0
- package/dist/services/docker/utils/exec-handler.d.ts.map +1 -0
- package/dist/services/docker/utils/exec-handler.js +197 -0
- package/dist/services/docker/utils/exec-handler.js.map +1 -0
- package/dist/services/docker/utils/formatters.d.ts +13 -0
- package/dist/services/docker/utils/formatters.d.ts.map +1 -0
- package/dist/services/docker/utils/formatters.js +33 -0
- package/dist/services/docker/utils/formatters.js.map +1 -0
- package/dist/services/docker/utils/log-parser.d.ts +10 -0
- package/dist/services/docker/utils/log-parser.d.ts.map +1 -0
- package/dist/services/docker/utils/log-parser.js +48 -0
- package/dist/services/docker/utils/log-parser.js.map +1 -0
- package/dist/services/docker/utils/stats-calculator.d.ts +68 -0
- package/dist/services/docker/utils/stats-calculator.d.ts.map +1 -0
- package/dist/services/docker/utils/stats-calculator.js +61 -0
- package/dist/services/docker/utils/stats-calculator.js.map +1 -0
- package/dist/services/docker/volume-service.d.ts +22 -0
- package/dist/services/docker/volume-service.d.ts.map +1 -0
- package/dist/services/docker/volume-service.js +48 -0
- package/dist/services/docker/volume-service.js.map +1 -0
- package/dist/services/docker-interfaces.d.ts +283 -0
- package/dist/services/docker-interfaces.d.ts.map +1 -0
- package/dist/services/docker-interfaces.js +13 -0
- package/dist/services/docker-interfaces.js.map +1 -0
- package/dist/services/docker.d.ts +42 -5
- package/dist/services/docker.d.ts.map +1 -1
- package/dist/services/docker.js +335 -127
- package/dist/services/docker.js.map +1 -1
- package/dist/services/file-service.d.ts +6 -2
- package/dist/services/file-service.d.ts.map +1 -1
- package/dist/services/file-service.js +156 -52
- package/dist/services/file-service.js.map +1 -1
- package/dist/services/host-config-repository.d.ts +133 -0
- package/dist/services/host-config-repository.d.ts.map +1 -0
- package/dist/services/host-config-repository.js +323 -0
- package/dist/services/host-config-repository.js.map +1 -0
- package/dist/services/host-resolver.d.ts +49 -0
- package/dist/services/host-resolver.d.ts.map +1 -0
- package/dist/services/host-resolver.js +176 -0
- package/dist/services/host-resolver.js.map +1 -0
- package/dist/services/interfaces.d.ts +61 -194
- package/dist/services/interfaces.d.ts.map +1 -1
- package/dist/services/local-executor.d.ts +31 -0
- package/dist/services/local-executor.d.ts.map +1 -0
- package/dist/services/local-executor.js +71 -0
- package/dist/services/local-executor.js.map +1 -0
- package/dist/services/ssh-config-loader.d.ts +35 -0
- package/dist/services/ssh-config-loader.d.ts.map +1 -0
- package/dist/services/ssh-config-loader.js +218 -0
- package/dist/services/ssh-config-loader.js.map +1 -0
- package/dist/services/ssh-pool.d.ts +26 -1
- package/dist/services/ssh-pool.d.ts.map +1 -1
- package/dist/services/ssh-pool.js +166 -25
- package/dist/services/ssh-pool.js.map +1 -1
- package/dist/services/ssh-service.d.ts +3 -0
- package/dist/services/ssh-service.d.ts.map +1 -1
- package/dist/services/ssh-service.js +53 -31
- package/dist/services/ssh-service.js.map +1 -1
- package/dist/services/ssh.d.ts +2 -6
- package/dist/services/ssh.d.ts.map +1 -1
- package/dist/services/ssh.js +9 -40
- package/dist/services/ssh.js.map +1 -1
- package/dist/tools/definitions/flux.d.ts +13 -0
- package/dist/tools/definitions/flux.d.ts.map +1 -0
- package/dist/tools/definitions/flux.js +101 -0
- package/dist/tools/definitions/flux.js.map +1 -0
- package/dist/tools/definitions/index.d.ts +8 -0
- package/dist/tools/definitions/index.d.ts.map +1 -0
- package/dist/tools/definitions/index.js +8 -0
- package/dist/tools/definitions/index.js.map +1 -0
- package/dist/tools/definitions/scout.d.ts +13 -0
- package/dist/tools/definitions/scout.d.ts.map +1 -0
- package/dist/tools/definitions/scout.js +78 -0
- package/dist/tools/definitions/scout.js.map +1 -0
- package/dist/tools/flux.d.ts +16 -8
- package/dist/tools/flux.d.ts.map +1 -1
- package/dist/tools/flux.js +27 -66
- package/dist/tools/flux.js.map +1 -1
- package/dist/tools/handlers/base-handler.d.ts +172 -0
- package/dist/tools/handlers/base-handler.d.ts.map +1 -0
- package/dist/tools/handlers/base-handler.js +234 -0
- package/dist/tools/handlers/base-handler.js.map +1 -0
- package/dist/tools/handlers/compose-handlers.d.ts +108 -0
- package/dist/tools/handlers/compose-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/compose-handlers.js +293 -0
- package/dist/tools/handlers/compose-handlers.js.map +1 -0
- package/dist/tools/handlers/compose-utils.d.ts +35 -0
- package/dist/tools/handlers/compose-utils.d.ts.map +1 -0
- package/dist/tools/handlers/compose-utils.js +76 -0
- package/dist/tools/handlers/compose-utils.js.map +1 -0
- package/dist/tools/handlers/compose.d.ts +23 -0
- package/dist/tools/handlers/compose.d.ts.map +1 -0
- package/dist/tools/handlers/compose.js +125 -0
- package/dist/tools/handlers/compose.js.map +1 -0
- package/dist/tools/handlers/container.d.ts +23 -0
- package/dist/tools/handlers/container.d.ts.map +1 -0
- package/dist/tools/handlers/container.js +333 -0
- package/dist/tools/handlers/container.js.map +1 -0
- package/dist/tools/handlers/docker.d.ts +24 -0
- package/dist/tools/handlers/docker.d.ts.map +1 -0
- package/dist/tools/handlers/docker.js +155 -0
- package/dist/tools/handlers/docker.js.map +1 -0
- package/dist/tools/handlers/host.d.ts +23 -0
- package/dist/tools/handlers/host.d.ts.map +1 -0
- package/dist/tools/handlers/host.js +196 -0
- package/dist/tools/handlers/host.js.map +1 -0
- package/dist/tools/handlers/scout-logs.d.ts +24 -0
- package/dist/tools/handlers/scout-logs.d.ts.map +1 -0
- package/dist/tools/handlers/scout-logs.js +119 -0
- package/dist/tools/handlers/scout-logs.js.map +1 -0
- package/dist/tools/handlers/scout-simple.d.ts +23 -0
- package/dist/tools/handlers/scout-simple.d.ts.map +1 -0
- package/dist/tools/handlers/scout-simple.js +286 -0
- package/dist/tools/handlers/scout-simple.js.map +1 -0
- package/dist/tools/handlers/scout-zfs.d.ts +23 -0
- package/dist/tools/handlers/scout-zfs.d.ts.map +1 -0
- package/dist/tools/handlers/scout-zfs.js +82 -0
- package/dist/tools/handlers/scout-zfs.js.map +1 -0
- package/dist/tools/index.d.ts +32 -2
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +41 -35
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/registry.d.ts +135 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +151 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/scout.d.ts +16 -8
- package/dist/tools/scout.d.ts.map +1 -1
- package/dist/tools/scout.js +36 -78
- package/dist/tools/scout.js.map +1 -1
- package/dist/types.d.ts +629 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/command-security.d.ts +82 -0
- package/dist/utils/command-security.d.ts.map +1 -0
- package/dist/utils/command-security.js +122 -0
- package/dist/utils/command-security.js.map +1 -0
- package/dist/utils/error-sanitization.d.ts +77 -0
- package/dist/utils/error-sanitization.d.ts.map +1 -0
- package/dist/utils/error-sanitization.js +107 -0
- package/dist/utils/error-sanitization.js.map +1 -0
- package/dist/utils/errors.d.ts +30 -6
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +91 -12
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/help-handler.d.ts +23 -0
- package/dist/utils/help-handler.d.ts.map +1 -0
- package/dist/utils/help-handler.js +21 -0
- package/dist/utils/help-handler.js.map +1 -0
- package/dist/utils/help.d.ts +1 -1
- package/dist/utils/help.d.ts.map +1 -1
- package/dist/utils/help.js +57 -16
- package/dist/utils/help.js.map +1 -1
- package/dist/utils/host-utils.d.ts +31 -0
- package/dist/utils/host-utils.d.ts.map +1 -0
- package/dist/utils/host-utils.js +80 -0
- package/dist/utils/host-utils.js.map +1 -0
- package/dist/utils/index.d.ts +8 -2
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +8 -2
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/init-detection.d.ts +36 -0
- package/dist/utils/init-detection.d.ts.map +1 -0
- package/dist/utils/init-detection.js +79 -0
- package/dist/utils/init-detection.js.map +1 -0
- package/dist/utils/logger.d.ts +11 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +32 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/pagination.d.ts +20 -0
- package/dist/utils/pagination.d.ts.map +1 -0
- package/dist/utils/pagination.js +29 -0
- package/dist/utils/pagination.js.map +1 -0
- package/dist/utils/path-security.d.ts +132 -18
- package/dist/utils/path-security.d.ts.map +1 -1
- package/dist/utils/path-security.js +164 -35
- package/dist/utils/path-security.js.map +1 -1
- package/dist/utils/sorting.d.ts +33 -0
- package/dist/utils/sorting.d.ts.map +1 -0
- package/dist/utils/sorting.js +57 -0
- package/dist/utils/sorting.js.map +1 -0
- package/dist/utils/text-filters.d.ts +13 -0
- package/dist/utils/text-filters.d.ts.map +1 -0
- package/dist/utils/text-filters.js +18 -0
- package/dist/utils/text-filters.js.map +1 -0
- package/dist/utils/time.d.ts +11 -0
- package/dist/utils/time.d.ts.map +1 -0
- package/dist/utils/time.js +13 -0
- package/dist/utils/time.js.map +1 -0
- package/dist/utils/validation.d.ts +25 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +56 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +45 -19
- package/dist/schemas/discriminator.d.ts +0 -20
- package/dist/schemas/discriminator.d.ts.map +0 -1
- package/dist/schemas/discriminator.js +0 -25
- package/dist/schemas/discriminator.js.map +0 -1
- package/dist/schemas/unified.d.ts +0 -674
- package/dist/schemas/unified.d.ts.map +0 -1
- package/dist/schemas/unified.js +0 -453
- package/dist/schemas/unified.js.map +0 -1
- package/dist/tools/unified.d.ts +0 -7
- package/dist/tools/unified.d.ts.map +0 -1
- package/dist/tools/unified.js +0 -827
- package/dist/tools/unified.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssh-config-loader.d.ts","sourceRoot":"","sources":["../../src/services/ssh-config-loader.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AA4F9C;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,GAAE,MAA0C,GACrD,OAAO,CAAC,UAAU,EAAE,CAAC,CAuGvB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAC9B,cAAc,EAAE,UAAU,EAAE,EAC5B,WAAW,EAAE,UAAU,EAAE,GACxB,UAAU,EAAE,CAkBd"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import SSHConfig, { LineType } from "ssh-config";
|
|
6
|
+
/**
|
|
7
|
+
* Expand tilde (~) in paths to user's home directory
|
|
8
|
+
*/
|
|
9
|
+
function expandTildePath(path) {
|
|
10
|
+
if (path.startsWith("~/")) {
|
|
11
|
+
return join(homedir(), path.slice(2));
|
|
12
|
+
}
|
|
13
|
+
if (path === "~") {
|
|
14
|
+
return homedir();
|
|
15
|
+
}
|
|
16
|
+
return path;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Check if a host pattern contains wildcards or special characters
|
|
20
|
+
* Skip hosts like *, *.example.com, etc.
|
|
21
|
+
*/
|
|
22
|
+
function isPatternHost(hostName) {
|
|
23
|
+
return hostName.includes("*") || hostName.includes("?");
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Hosts to skip - these are not Docker hosts
|
|
27
|
+
* (git hosting services, backup servers, etc.)
|
|
28
|
+
*/
|
|
29
|
+
const SKIP_HOSTS = new Set([
|
|
30
|
+
"github.com",
|
|
31
|
+
"gitlab.com",
|
|
32
|
+
"bitbucket.org",
|
|
33
|
+
"ssh.github.com",
|
|
34
|
+
"backup.unraid.net",
|
|
35
|
+
]);
|
|
36
|
+
/**
|
|
37
|
+
* Helper to get string value from SSH config value
|
|
38
|
+
*/
|
|
39
|
+
function getStringValue(value) {
|
|
40
|
+
if (typeof value === "string") {
|
|
41
|
+
return value;
|
|
42
|
+
}
|
|
43
|
+
if (Array.isArray(value) && value.length > 0) {
|
|
44
|
+
return value[0].val;
|
|
45
|
+
}
|
|
46
|
+
return "";
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Extract defaults from `Host *` block so individual hosts inherit global settings.
|
|
50
|
+
*/
|
|
51
|
+
function getGlobalDefaults(config) {
|
|
52
|
+
const defaults = {};
|
|
53
|
+
const globalSection = config.find({ Host: "*" });
|
|
54
|
+
if (!globalSection || !("config" in globalSection)) {
|
|
55
|
+
return defaults;
|
|
56
|
+
}
|
|
57
|
+
const user = globalSection.config.find((line) => {
|
|
58
|
+
return line.type === LineType.DIRECTIVE && line.param === "User";
|
|
59
|
+
});
|
|
60
|
+
if (user?.value) {
|
|
61
|
+
defaults.user = getStringValue(user.value);
|
|
62
|
+
}
|
|
63
|
+
const port = globalSection.config.find((line) => {
|
|
64
|
+
return line.type === LineType.DIRECTIVE && line.param === "Port";
|
|
65
|
+
});
|
|
66
|
+
if (port?.value) {
|
|
67
|
+
const portNum = Number.parseInt(getStringValue(port.value), 10);
|
|
68
|
+
if (!Number.isNaN(portNum)) {
|
|
69
|
+
defaults.port = portNum;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const identityFile = globalSection.config.find((line) => {
|
|
73
|
+
return line.type === LineType.DIRECTIVE && line.param === "IdentityFile";
|
|
74
|
+
});
|
|
75
|
+
if (identityFile?.value) {
|
|
76
|
+
defaults.identityFile = expandTildePath(getStringValue(identityFile.value));
|
|
77
|
+
}
|
|
78
|
+
return defaults;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Load host configurations from SSH config file
|
|
82
|
+
*
|
|
83
|
+
* @param configPath - Path to SSH config file (defaults to ~/.ssh/config)
|
|
84
|
+
* @returns Promise resolving to array of HostConfig objects parsed from SSH config
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* ```typescript
|
|
88
|
+
* const hosts = await loadFromSSHConfig("~/.ssh/config");
|
|
89
|
+
* // Returns: [{ name: "server1", host: "192.168.1.100", protocol: "ssh", ... }]
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
export async function loadFromSSHConfig(configPath = join(homedir(), ".ssh", "config")) {
|
|
93
|
+
const _debug = Boolean(process.env.SYNAPSE_DEBUG);
|
|
94
|
+
// Return empty array if config doesn't exist
|
|
95
|
+
if (!existsSync(configPath)) {
|
|
96
|
+
return [];
|
|
97
|
+
}
|
|
98
|
+
try {
|
|
99
|
+
const configContent = await readFile(configPath, "utf-8");
|
|
100
|
+
const config = SSHConfig.parse(configContent);
|
|
101
|
+
const globalDefaults = getGlobalDefaults(config);
|
|
102
|
+
const hosts = [];
|
|
103
|
+
for (const section of config) {
|
|
104
|
+
// Only process Host sections (not Match or other directives)
|
|
105
|
+
if (section.type !== LineType.DIRECTIVE) {
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const directive = section;
|
|
109
|
+
if (directive.param !== "Host") {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
const hostValue = getStringValue(directive.value);
|
|
113
|
+
// Skip wildcard hosts, pattern hosts, and known non-Docker hosts
|
|
114
|
+
if (!hostValue ||
|
|
115
|
+
hostValue === "*" ||
|
|
116
|
+
isPatternHost(hostValue) ||
|
|
117
|
+
SKIP_HOSTS.has(hostValue)) {
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
// Find the config section for this host
|
|
121
|
+
const hostSection = config.find({ Host: hostValue });
|
|
122
|
+
if (!hostSection || !("config" in hostSection)) {
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
// Extract hostname - required field
|
|
126
|
+
const hostname = hostSection.config.find((line) => {
|
|
127
|
+
return line.type === LineType.DIRECTIVE && line.param === "HostName";
|
|
128
|
+
});
|
|
129
|
+
// Skip hosts without HostName (they're just aliases)
|
|
130
|
+
if (!hostname || !hostname.value) {
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
// Build HostConfig object
|
|
134
|
+
const hostConfig = {
|
|
135
|
+
name: hostValue,
|
|
136
|
+
host: getStringValue(hostname.value),
|
|
137
|
+
protocol: "ssh",
|
|
138
|
+
};
|
|
139
|
+
// Extract optional User
|
|
140
|
+
const user = hostSection.config.find((line) => {
|
|
141
|
+
return line.type === LineType.DIRECTIVE && line.param === "User";
|
|
142
|
+
});
|
|
143
|
+
if (user?.value) {
|
|
144
|
+
hostConfig.sshUser = getStringValue(user.value);
|
|
145
|
+
}
|
|
146
|
+
else if (globalDefaults.user) {
|
|
147
|
+
hostConfig.sshUser = globalDefaults.user;
|
|
148
|
+
}
|
|
149
|
+
// Extract optional Port
|
|
150
|
+
const port = hostSection.config.find((line) => {
|
|
151
|
+
return line.type === LineType.DIRECTIVE && line.param === "Port";
|
|
152
|
+
});
|
|
153
|
+
if (port?.value) {
|
|
154
|
+
const portNum = Number.parseInt(getStringValue(port.value), 10);
|
|
155
|
+
if (!Number.isNaN(portNum)) {
|
|
156
|
+
hostConfig.port = portNum;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
else if (globalDefaults.port) {
|
|
160
|
+
hostConfig.port = globalDefaults.port;
|
|
161
|
+
}
|
|
162
|
+
// Extract optional IdentityFile
|
|
163
|
+
const identityFile = hostSection.config.find((line) => {
|
|
164
|
+
return line.type === LineType.DIRECTIVE && line.param === "IdentityFile";
|
|
165
|
+
});
|
|
166
|
+
if (identityFile?.value) {
|
|
167
|
+
const rawPath = getStringValue(identityFile.value);
|
|
168
|
+
const expandedPath = expandTildePath(rawPath);
|
|
169
|
+
hostConfig.sshKeyPath = expandedPath;
|
|
170
|
+
}
|
|
171
|
+
else if (globalDefaults.identityFile) {
|
|
172
|
+
hostConfig.sshKeyPath = globalDefaults.identityFile;
|
|
173
|
+
}
|
|
174
|
+
hosts.push(hostConfig);
|
|
175
|
+
}
|
|
176
|
+
return hosts;
|
|
177
|
+
}
|
|
178
|
+
catch (_error) {
|
|
179
|
+
// Log error but don't crash - return empty array on parse errors
|
|
180
|
+
return [];
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Merge host configurations with manual config taking precedence
|
|
185
|
+
*
|
|
186
|
+
* Manual hosts completely replace SSH config hosts with the same name.
|
|
187
|
+
* No property merging - manual config is used as-is.
|
|
188
|
+
*
|
|
189
|
+
* @param sshConfigHosts - Hosts loaded from SSH config
|
|
190
|
+
* @param manualHosts - Hosts from manual configuration (config file or env var)
|
|
191
|
+
* @returns Merged array with manual hosts taking precedence
|
|
192
|
+
*
|
|
193
|
+
* @example
|
|
194
|
+
* ```typescript
|
|
195
|
+
* const sshHosts = [{ name: "server1", host: "192.168.1.100", protocol: "ssh" }];
|
|
196
|
+
* const manualHosts = [{ name: "server1", host: "10.0.0.100", protocol: "http" }];
|
|
197
|
+
* const merged = mergeHostConfigs(sshHosts, manualHosts);
|
|
198
|
+
* // Result: [{ name: "server1", host: "10.0.0.100", protocol: "http" }]
|
|
199
|
+
* // Manual config completely replaces SSH config
|
|
200
|
+
* ```
|
|
201
|
+
*/
|
|
202
|
+
export function mergeHostConfigs(sshConfigHosts, manualHosts) {
|
|
203
|
+
// Create a map of manual hosts by name for fast lookup
|
|
204
|
+
const manualHostMap = new Map();
|
|
205
|
+
for (const host of manualHosts) {
|
|
206
|
+
manualHostMap.set(host.name, host);
|
|
207
|
+
}
|
|
208
|
+
// Start with all manual hosts
|
|
209
|
+
const merged = [...manualHosts];
|
|
210
|
+
// Add SSH hosts that don't conflict with manual hosts
|
|
211
|
+
for (const sshHost of sshConfigHosts) {
|
|
212
|
+
if (!manualHostMap.has(sshHost.name)) {
|
|
213
|
+
merged.push(sshHost);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return merged;
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=ssh-config-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssh-config-loader.js","sourceRoot":"","sources":["../../src/services/ssh-config-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { HostConfig } from "../types.js";
|
|
2
1
|
import { NodeSSH } from "node-ssh";
|
|
2
|
+
import type { HostConfig } from "../types.js";
|
|
3
3
|
/**
|
|
4
4
|
* SSH connection pool configuration
|
|
5
5
|
*/
|
|
@@ -47,14 +47,39 @@ export declare function generatePoolKey(host: HostConfig): string;
|
|
|
47
47
|
export declare class SSHConnectionPoolImpl implements SSHConnectionPool {
|
|
48
48
|
private config;
|
|
49
49
|
private pool;
|
|
50
|
+
private waitQueues;
|
|
50
51
|
private stats;
|
|
51
52
|
private healthCheckTimer?;
|
|
53
|
+
private isShuttingDown;
|
|
52
54
|
constructor(config?: Partial<SSHPoolConfig>);
|
|
53
55
|
getStats(): PoolStats;
|
|
56
|
+
getHealth(): {
|
|
57
|
+
healthy: boolean;
|
|
58
|
+
};
|
|
54
59
|
private startHealthChecks;
|
|
60
|
+
private scheduleNextHealthCheck;
|
|
61
|
+
/**
|
|
62
|
+
* Perform health checks on idle connections with staggered timing.
|
|
63
|
+
* Instead of firing all checks simultaneously (causing burst SSH traffic),
|
|
64
|
+
* checks are spread across the health check interval window with a small
|
|
65
|
+
* delay between each to reduce network pressure.
|
|
66
|
+
*/
|
|
55
67
|
private performHealthChecks;
|
|
56
68
|
private checkConnectionHealth;
|
|
57
69
|
getConnection(host: HostConfig): Promise<NodeSSH>;
|
|
70
|
+
private keyCache;
|
|
71
|
+
private static readonly KEY_CACHE_TTL_MS;
|
|
72
|
+
/**
|
|
73
|
+
* Get private key content with secure caching
|
|
74
|
+
* PERF-C7: Cache key content to eliminate 5-20ms sync I/O per connection
|
|
75
|
+
* SECURITY (CWE-316): Uses Buffer with TTL for defense-in-depth
|
|
76
|
+
*/
|
|
77
|
+
private getPrivateKey;
|
|
78
|
+
/**
|
|
79
|
+
* Securely clear all cached SSH private keys by zeroing buffer memory
|
|
80
|
+
* SECURITY (CWE-316): Prevents keys from persisting in memory after cleanup
|
|
81
|
+
*/
|
|
82
|
+
private clearKeyCache;
|
|
58
83
|
private createConnection;
|
|
59
84
|
private updateConnectionStats;
|
|
60
85
|
releaseConnection(host: HostConfig, connection: NodeSSH): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssh-pool.d.ts","sourceRoot":"","sources":["../../src/services/ssh-pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"ssh-pool.d.ts","sourceRoot":"","sources":["../../src/services/ssh-pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI9C;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,aAMjC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAyBD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,iBAAiB,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxE,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,QAAQ,IAAI,SAAS,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAGxD;AAED;;GAEG;AACH,qBAAa,qBAAsB,YAAW,iBAAiB;IAC7D,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,IAAI,CAAoC;IAChD,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,gBAAgB,CAAC,CAAiB;IAE1C,OAAO,CAAC,cAAc,CAAS;gBAEnB,MAAM,GAAE,OAAO,CAAC,aAAa,CAAM;IAmB/C,QAAQ,IAAI,SAAS;IAIrB,SAAS,IAAI;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE;IAYjC,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,uBAAuB;IAY/B;;;;;OAKG;YACW,mBAAmB;YAiCnB,qBAAqB;IAkC7B,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IA+DvD,OAAO,CAAC,QAAQ,CAAwD;IAExE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAiB;IAEzD;;;;OAIG;YACW,aAAa;IAoB3B;;;OAGG;IACH,OAAO,CAAC,aAAa;YAOP,gBAAgB;IAgE9B,OAAO,CAAC,qBAAqB;IAqBvB,iBAAiB,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAmC7E,OAAO,CAAC,mBAAmB;YAiBb,gBAAgB;IA8BxB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BhD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CA0ChC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { NodeSSH } from "node-ssh";
|
|
2
|
+
import { sanitizeErrorMessage } from "../utils/error-sanitization.js";
|
|
2
3
|
import { HostOperationError, logError } from "../utils/errors.js";
|
|
3
4
|
/**
|
|
4
5
|
* Default pool configuration
|
|
@@ -8,7 +9,7 @@ export const DEFAULT_POOL_CONFIG = {
|
|
|
8
9
|
idleTimeoutMs: 60000,
|
|
9
10
|
connectionTimeoutMs: 5000,
|
|
10
11
|
enableHealthChecks: true,
|
|
11
|
-
healthCheckIntervalMs: 30000
|
|
12
|
+
healthCheckIntervalMs: 30000,
|
|
12
13
|
};
|
|
13
14
|
/**
|
|
14
15
|
* Generate unique pool key for host
|
|
@@ -24,11 +25,15 @@ export function generatePoolKey(host) {
|
|
|
24
25
|
export class SSHConnectionPoolImpl {
|
|
25
26
|
config;
|
|
26
27
|
pool;
|
|
28
|
+
waitQueues;
|
|
27
29
|
stats;
|
|
28
30
|
healthCheckTimer;
|
|
31
|
+
// SECURITY (CWE-404): Flag to prevent in-flight health checks from accessing disposed connections
|
|
32
|
+
isShuttingDown = false;
|
|
29
33
|
constructor(config = {}) {
|
|
30
34
|
this.config = { ...DEFAULT_POOL_CONFIG, ...config };
|
|
31
35
|
this.pool = new Map();
|
|
36
|
+
this.waitQueues = new Map();
|
|
32
37
|
this.stats = {
|
|
33
38
|
poolHits: 0,
|
|
34
39
|
poolMisses: 0,
|
|
@@ -36,7 +41,7 @@ export class SSHConnectionPoolImpl {
|
|
|
36
41
|
idleConnections: 0,
|
|
37
42
|
totalConnections: 0,
|
|
38
43
|
healthChecksPassed: 0,
|
|
39
|
-
healthCheckFailures: 0
|
|
44
|
+
healthCheckFailures: 0,
|
|
40
45
|
};
|
|
41
46
|
if (this.config.enableHealthChecks) {
|
|
42
47
|
this.startHealthChecks();
|
|
@@ -45,22 +50,60 @@ export class SSHConnectionPoolImpl {
|
|
|
45
50
|
getStats() {
|
|
46
51
|
return { ...this.stats };
|
|
47
52
|
}
|
|
53
|
+
getHealth() {
|
|
54
|
+
// Pool is healthy if there are no active connections with failures,
|
|
55
|
+
// or if health checks are passing more than failing
|
|
56
|
+
const hasFailures = this.stats.healthCheckFailures > 0;
|
|
57
|
+
const hasMorePassesThanFailures = this.stats.healthChecksPassed >= this.stats.healthCheckFailures;
|
|
58
|
+
return {
|
|
59
|
+
healthy: !hasFailures || hasMorePassesThanFailures,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
48
62
|
startHealthChecks() {
|
|
49
|
-
this.
|
|
50
|
-
|
|
63
|
+
this.scheduleNextHealthCheck();
|
|
64
|
+
}
|
|
65
|
+
scheduleNextHealthCheck() {
|
|
66
|
+
this.healthCheckTimer = setTimeout(async () => {
|
|
67
|
+
// SECURITY (CWE-404): Don't run health checks during shutdown
|
|
68
|
+
if (this.isShuttingDown)
|
|
69
|
+
return;
|
|
70
|
+
await this.performHealthChecks();
|
|
71
|
+
// Only reschedule after completion (prevents overlap)
|
|
72
|
+
if (!this.isShuttingDown) {
|
|
73
|
+
this.scheduleNextHealthCheck();
|
|
74
|
+
}
|
|
51
75
|
}, this.config.healthCheckIntervalMs);
|
|
52
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* Perform health checks on idle connections with staggered timing.
|
|
79
|
+
* Instead of firing all checks simultaneously (causing burst SSH traffic),
|
|
80
|
+
* checks are spread across the health check interval window with a small
|
|
81
|
+
* delay between each to reduce network pressure.
|
|
82
|
+
*/
|
|
53
83
|
async performHealthChecks() {
|
|
54
|
-
const
|
|
84
|
+
const checks = [];
|
|
55
85
|
for (const [poolKey, connections] of this.pool.entries()) {
|
|
56
86
|
for (const metadata of connections) {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
healthCheckPromises.push(this.checkConnectionHealth(poolKey, metadata));
|
|
87
|
+
if (!metadata.isActive && !this.isShuttingDown) {
|
|
88
|
+
checks.push({ poolKey, metadata });
|
|
60
89
|
}
|
|
61
90
|
}
|
|
62
91
|
}
|
|
63
|
-
|
|
92
|
+
if (checks.length === 0)
|
|
93
|
+
return;
|
|
94
|
+
// Stagger checks: spread across 80% of the interval to leave headroom
|
|
95
|
+
// Minimum 100ms between checks to avoid micro-bursts
|
|
96
|
+
const staggerMs = Math.max(100, Math.floor((this.config.healthCheckIntervalMs * 0.8) / checks.length));
|
|
97
|
+
for (let i = 0; i < checks.length; i++) {
|
|
98
|
+
if (this.isShuttingDown)
|
|
99
|
+
break;
|
|
100
|
+
const { poolKey, metadata } = checks[i];
|
|
101
|
+
await this.checkConnectionHealth(poolKey, metadata);
|
|
102
|
+
// Stagger delay between checks (skip delay after last check)
|
|
103
|
+
if (i < checks.length - 1 && !this.isShuttingDown) {
|
|
104
|
+
await new Promise((resolve) => setTimeout(resolve, staggerMs));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
64
107
|
}
|
|
65
108
|
async checkConnectionHealth(poolKey, metadata) {
|
|
66
109
|
try {
|
|
@@ -81,8 +124,8 @@ export class SSHConnectionPoolImpl {
|
|
|
81
124
|
metadata: {
|
|
82
125
|
poolKey,
|
|
83
126
|
failureCount: metadata.healthChecksFailed + 1,
|
|
84
|
-
lastUsed: new Date(metadata.lastUsed).toISOString()
|
|
85
|
-
}
|
|
127
|
+
lastUsed: new Date(metadata.lastUsed).toISOString(),
|
|
128
|
+
},
|
|
86
129
|
});
|
|
87
130
|
metadata.healthChecksFailed++;
|
|
88
131
|
this.stats.healthCheckFailures++;
|
|
@@ -104,7 +147,21 @@ export class SSHConnectionPoolImpl {
|
|
|
104
147
|
}
|
|
105
148
|
// Check if we can create new connection
|
|
106
149
|
if (connections.length >= this.config.maxConnections) {
|
|
107
|
-
|
|
150
|
+
// Queue the request instead of throwing immediately
|
|
151
|
+
return new Promise((resolve, reject) => {
|
|
152
|
+
const timer = setTimeout(() => {
|
|
153
|
+
// Remove from queue on timeout
|
|
154
|
+
const queue = this.waitQueues.get(poolKey) || [];
|
|
155
|
+
const index = queue.findIndex((item) => item.timer === timer);
|
|
156
|
+
if (index !== -1) {
|
|
157
|
+
queue.splice(index, 1);
|
|
158
|
+
}
|
|
159
|
+
reject(new Error(`Connection pool wait timeout for ${poolKey} (waited ${this.config.connectionTimeoutMs}ms)`));
|
|
160
|
+
}, this.config.connectionTimeoutMs);
|
|
161
|
+
const queue = this.waitQueues.get(poolKey) || [];
|
|
162
|
+
queue.push({ resolve, reject, timer });
|
|
163
|
+
this.waitQueues.set(poolKey, queue);
|
|
164
|
+
});
|
|
108
165
|
}
|
|
109
166
|
// Create new connection (pool miss)
|
|
110
167
|
const connection = await this.createConnection(host);
|
|
@@ -115,7 +172,7 @@ export class SSHConnectionPoolImpl {
|
|
|
115
172
|
created: Date.now(),
|
|
116
173
|
healthChecksPassed: 0,
|
|
117
174
|
healthChecksFailed: 0,
|
|
118
|
-
isActive: true
|
|
175
|
+
isActive: true,
|
|
119
176
|
};
|
|
120
177
|
connections.push(metadata);
|
|
121
178
|
this.pool.set(poolKey, connections);
|
|
@@ -123,27 +180,87 @@ export class SSHConnectionPoolImpl {
|
|
|
123
180
|
this.updateConnectionStats();
|
|
124
181
|
return connection;
|
|
125
182
|
}
|
|
183
|
+
// SECURITY (CWE-316): Store private keys as Buffers for explicit zeroing on cleanup
|
|
184
|
+
keyCache = new Map();
|
|
185
|
+
// TTL for cached keys: 5 minutes (prevents indefinite memory retention)
|
|
186
|
+
static KEY_CACHE_TTL_MS = 5 * 60 * 1000;
|
|
187
|
+
/**
|
|
188
|
+
* Get private key content with secure caching
|
|
189
|
+
* PERF-C7: Cache key content to eliminate 5-20ms sync I/O per connection
|
|
190
|
+
* SECURITY (CWE-316): Uses Buffer with TTL for defense-in-depth
|
|
191
|
+
*/
|
|
192
|
+
async getPrivateKey(keyPath) {
|
|
193
|
+
// Check cache first (with TTL enforcement)
|
|
194
|
+
const cached = this.keyCache.get(keyPath);
|
|
195
|
+
if (cached) {
|
|
196
|
+
const age = Date.now() - cached.cachedAt;
|
|
197
|
+
if (age < SSHConnectionPoolImpl.KEY_CACHE_TTL_MS) {
|
|
198
|
+
return cached.key.toString("utf-8");
|
|
199
|
+
}
|
|
200
|
+
// TTL expired: zero and remove
|
|
201
|
+
cached.key.fill(0);
|
|
202
|
+
this.keyCache.delete(keyPath);
|
|
203
|
+
}
|
|
204
|
+
// Read once and cache as Buffer (async I/O)
|
|
205
|
+
const { promises: fs } = await import("node:fs");
|
|
206
|
+
const keyContent = await fs.readFile(keyPath);
|
|
207
|
+
this.keyCache.set(keyPath, { key: keyContent, cachedAt: Date.now() });
|
|
208
|
+
return keyContent.toString("utf-8");
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Securely clear all cached SSH private keys by zeroing buffer memory
|
|
212
|
+
* SECURITY (CWE-316): Prevents keys from persisting in memory after cleanup
|
|
213
|
+
*/
|
|
214
|
+
clearKeyCache() {
|
|
215
|
+
for (const entry of this.keyCache.values()) {
|
|
216
|
+
entry.key.fill(0);
|
|
217
|
+
}
|
|
218
|
+
this.keyCache.clear();
|
|
219
|
+
}
|
|
126
220
|
async createConnection(host) {
|
|
127
221
|
const ssh = new NodeSSH();
|
|
222
|
+
// SECURITY (S-M3, CWE-250): Validate username FIRST - fail fast before file I/O
|
|
223
|
+
// Require explicit SSH username - no root fallback to prevent unnecessary privileges
|
|
224
|
+
const username = host.sshUser || process.env.USER;
|
|
225
|
+
if (!username) {
|
|
226
|
+
throw new HostOperationError(`No SSH username configured for host ${host.name}. Set sshUser in config or USER env var.`, host.name, "createConnection");
|
|
227
|
+
}
|
|
228
|
+
// SECURITY (CWE-250): Reject root to enforce principle of least privilege
|
|
229
|
+
// Exception: Allow root for systems like Unraid that only support root SSH
|
|
230
|
+
if (username === "root" && !host.allowRoot) {
|
|
231
|
+
throw new HostOperationError(`SSH as root is not allowed for host ${host.name}. Use a non-root user with appropriate sudo permissions, or set allowRoot: true in host config for systems like Unraid.`, host.name, "createConnection");
|
|
232
|
+
}
|
|
233
|
+
// Read private key content if path is provided
|
|
234
|
+
// Using privateKey (content) instead of privateKeyPath is more reliable
|
|
235
|
+
// PERF-C7: Use async cached read instead of sync readFileSync
|
|
236
|
+
let privateKey;
|
|
237
|
+
if (host.sshKeyPath) {
|
|
238
|
+
try {
|
|
239
|
+
privateKey = await this.getPrivateKey(host.sshKeyPath);
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
// SECURITY (S-H3): Sanitize error message to avoid leaking key path
|
|
243
|
+
const detailedMsg = `Failed to read SSH private key at ${host.sshKeyPath}`;
|
|
244
|
+
const genericMsg = "Failed to read SSH private key";
|
|
245
|
+
throw new HostOperationError(sanitizeErrorMessage(detailedMsg, genericMsg), host.name, "createConnection", error);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
// Use SSH agent if available (matches OpenSSH CLI behavior)
|
|
249
|
+
const agent = process.env.SSH_AUTH_SOCK || undefined;
|
|
128
250
|
const connectionConfig = {
|
|
129
251
|
host: host.host,
|
|
130
252
|
port: host.port || 22,
|
|
131
|
-
username
|
|
132
|
-
|
|
133
|
-
|
|
253
|
+
username,
|
|
254
|
+
privateKey,
|
|
255
|
+
agent,
|
|
256
|
+
readyTimeout: this.config.connectionTimeoutMs,
|
|
134
257
|
};
|
|
135
|
-
console.error(`[SSH Pool] Attempting connection to ${host.name} (${connectionConfig.host}:${connectionConfig.port})`);
|
|
136
|
-
console.error(`[SSH Pool] - Username: ${connectionConfig.username}`);
|
|
137
|
-
console.error(`[SSH Pool] - Private key: ${connectionConfig.privateKeyPath}`);
|
|
138
|
-
console.error(`[SSH Pool] - Ready timeout: ${connectionConfig.readyTimeout}ms`);
|
|
139
258
|
try {
|
|
140
259
|
await ssh.connect(connectionConfig);
|
|
141
|
-
console.error(`[SSH Pool] Successfully connected to ${host.name}`);
|
|
142
260
|
return ssh;
|
|
143
261
|
}
|
|
144
262
|
catch (error) {
|
|
145
|
-
|
|
146
|
-
throw error;
|
|
263
|
+
throw new HostOperationError("SSH connection failed", host.name, "createConnection", error);
|
|
147
264
|
}
|
|
148
265
|
}
|
|
149
266
|
updateConnectionStats() {
|
|
@@ -173,6 +290,21 @@ export class SSHConnectionPoolImpl {
|
|
|
173
290
|
}
|
|
174
291
|
const metadata = connections.find((c) => c.connection === connection);
|
|
175
292
|
if (metadata) {
|
|
293
|
+
// Check if there are queued requests waiting for a connection
|
|
294
|
+
const queue = this.waitQueues.get(poolKey);
|
|
295
|
+
if (queue && queue.length > 0) {
|
|
296
|
+
// Give connection directly to next waiting request
|
|
297
|
+
const queueItem = queue.shift();
|
|
298
|
+
if (queueItem) {
|
|
299
|
+
clearTimeout(queueItem.timer);
|
|
300
|
+
metadata.isActive = true;
|
|
301
|
+
metadata.lastUsed = Date.now();
|
|
302
|
+
this.updateConnectionStats();
|
|
303
|
+
queueItem.resolve(connection);
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
// No waiting requests, mark as idle
|
|
176
308
|
metadata.isActive = false;
|
|
177
309
|
metadata.lastUsed = Date.now();
|
|
178
310
|
this.updateConnectionStats();
|
|
@@ -181,7 +313,11 @@ export class SSHConnectionPoolImpl {
|
|
|
181
313
|
}
|
|
182
314
|
}
|
|
183
315
|
scheduleIdleCleanup(poolKey, metadata) {
|
|
184
|
-
|
|
316
|
+
// Cancel previous timer if exists (prevents timer accumulation)
|
|
317
|
+
if (metadata.idleTimer) {
|
|
318
|
+
clearTimeout(metadata.idleTimer);
|
|
319
|
+
}
|
|
320
|
+
metadata.idleTimer = setTimeout(async () => {
|
|
185
321
|
const now = Date.now();
|
|
186
322
|
const idleTime = now - metadata.lastUsed;
|
|
187
323
|
// Only close if still idle and exceeded timeout
|
|
@@ -228,10 +364,15 @@ export class SSHConnectionPoolImpl {
|
|
|
228
364
|
this.updateConnectionStats();
|
|
229
365
|
}
|
|
230
366
|
async closeAll() {
|
|
367
|
+
// SECURITY (CWE-404): Set shutdown flag before clearing timers to prevent
|
|
368
|
+
// in-flight health checks from accessing disposed connections
|
|
369
|
+
this.isShuttingDown = true;
|
|
231
370
|
if (this.healthCheckTimer) {
|
|
232
|
-
|
|
371
|
+
clearTimeout(this.healthCheckTimer);
|
|
233
372
|
this.healthCheckTimer = undefined;
|
|
234
373
|
}
|
|
374
|
+
// SECURITY (CWE-316): Securely zero and clear cached SSH private keys
|
|
375
|
+
this.clearKeyCache();
|
|
235
376
|
const closePromises = [];
|
|
236
377
|
for (const connections of this.pool.values()) {
|
|
237
378
|
for (const metadata of connections) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssh-pool.js","sourceRoot":"","sources":["../../src/services/ssh-pool.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ssh-pool.js","sourceRoot":"","sources":["../../src/services/ssh-pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAalE;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAkB;IAChD,cAAc,EAAE,CAAC;IACjB,aAAa,EAAE,KAAK;IACpB,mBAAmB,EAAE,IAAI;IACzB,kBAAkB,EAAE,IAAI;IACxB,qBAAqB,EAAE,KAAK;CAC7B,CAAC;AAiDF;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAAgB;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IAC7B,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,qBAAqB;IACxB,MAAM,CAAgB;IACtB,IAAI,CAAoC;IACxC,UAAU,CAA2B;IACrC,KAAK,CAAY;IACjB,gBAAgB,CAAkB;IAC1C,kGAAkG;IAC1F,cAAc,GAAG,KAAK,CAAC;IAE/B,YAAY,SAAiC,EAAE;QAC7C,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,mBAAmB,EAAE,GAAG,MAAM,EAAE,CAAC;QACpD,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,IAAI,GAAG,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,GAAG;YACX,QAAQ,EAAE,CAAC;YACX,UAAU,EAAE,CAAC;YACb,iBAAiB,EAAE,CAAC;YACpB,eAAe,EAAE,CAAC;YAClB,gBAAgB,EAAE,CAAC;YACnB,kBAAkB,EAAE,CAAC;YACrB,mBAAmB,EAAE,CAAC;SACvB,CAAC;QAEF,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;YACnC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,QAAQ;QACN,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED,SAAS;QACP,oEAAoE;QACpE,oDAAoD;QACpD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,GAAG,CAAC,CAAC;QACvD,MAAM,yBAAyB,GAC7B,IAAI,CAAC,KAAK,CAAC,kBAAkB,IAAI,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC;QAElE,OAAO;YACL,OAAO,EAAE,CAAC,WAAW,IAAI,yBAAyB;SACnD,CAAC;IACJ,CAAC;IAEO,iBAAiB;QACvB,IAAI,CAAC,uBAAuB,EAAE,CAAC;IACjC,CAAC;IAEO,uBAAuB;QAC7B,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;YAC5C,8DAA8D;YAC9D,IAAI,IAAI,CAAC,cAAc;gBAAE,OAAO;YAChC,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACjC,sDAAsD;YACtD,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;gBACzB,IAAI,CAAC,uBAAuB,EAAE,CAAC;YACjC,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACxC,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,mBAAmB;QAC/B,MAAM,MAAM,GAA6D,EAAE,CAAC;QAE5E,KAAK,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YACzD,KAAK,MAAM,QAAQ,IAAI,WAAW,EAAE,CAAC;gBACnC,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;oBAC/C,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEhC,sEAAsE;QACtE,qDAAqD;QACrD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CACxB,GAAG,EACH,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,qBAAqB,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CACtE,CAAC;QAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,IAAI,IAAI,CAAC,cAAc;gBAAE,MAAM;YAE/B,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACxC,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAEpD,6DAA6D;YAC7D,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;gBAClD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,qBAAqB,CACjC,OAAe,EACf,QAA4B;QAE5B,IAAI,CAAC;YACH,uCAAuC;YACvC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;YAEhE,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACtB,sDAAsD;gBACtD,QAAQ,CAAC,kBAAkB,EAAE,CAAC;gBAC9B,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACN,iBAAiB;gBACjB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CACN,IAAI,kBAAkB,CAAC,qBAAqB,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,CAAC,EACvF;gBACE,QAAQ,EAAE;oBACR,OAAO;oBACP,YAAY,EAAE,QAAQ,CAAC,kBAAkB,GAAG,CAAC;oBAC7C,QAAQ,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE;iBACpD;aACF,CACF,CAAC;YAEF,QAAQ,CAAC,kBAAkB,EAAE,CAAC;YAC9B,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC;YACjC,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,IAAgB;QAClC,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAEjD,8BAA8B;QAC9B,MAAM,cAAc,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAE5D,IAAI,cAAc,EAAE,CAAC;YACnB,uCAAuC;YACvC,cAAc,CAAC,QAAQ,GAAG,IAAI,CAAC;YAC/B,cAAc,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACrC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACtB,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC7B,OAAO,cAAc,CAAC,UAAU,CAAC;QACnC,CAAC;QAED,wCAAwC;QACxC,IAAI,WAAW,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YACrD,oDAAoD;YACpD,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC9C,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC5B,+BAA+B;oBAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;oBACjD,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;oBAC9D,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;wBACjB,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;oBACzB,CAAC;oBACD,MAAM,CACJ,IAAI,KAAK,CACP,oCAAoC,OAAO,YAAY,IAAI,CAAC,MAAM,CAAC,mBAAmB,KAAK,CAC5F,CACF,CAAC;gBACJ,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;gBAEpC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjD,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;gBACvC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;QACL,CAAC;QAED,oCAAoC;QACpC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAErD,MAAM,QAAQ,GAAuB;YACnC,UAAU;YACV,IAAI;YACJ,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;YACpB,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE;YACnB,kBAAkB,EAAE,CAAC;YACrB,kBAAkB,EAAE,CAAC;YACrB,QAAQ,EAAE,IAAI;SACf,CAAC;QAEF,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAEpC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACxB,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAE7B,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,oFAAoF;IAC5E,QAAQ,GAAG,IAAI,GAAG,EAA6C,CAAC;IACxE,wEAAwE;IAChE,MAAM,CAAU,gBAAgB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;IAEzD;;;;OAIG;IACK,KAAK,CAAC,aAAa,CAAC,OAAe;QACzC,2CAA2C;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC;YACzC,IAAI,GAAG,GAAG,qBAAqB,CAAC,gBAAgB,EAAE,CAAC;gBACjD,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACtC,CAAC;YACD,+BAA+B;YAC/B,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACnB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;QAED,4CAA4C;QAC5C,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACtE,OAAO,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED;;;OAGG;IACK,aAAa;QACnB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,IAAgB;QAC7C,MAAM,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC;QAE1B,gFAAgF;QAChF,qFAAqF;QACrF,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,kBAAkB,CAC1B,uCAAuC,IAAI,CAAC,IAAI,0CAA0C,EAC1F,IAAI,CAAC,IAAI,EACT,kBAAkB,CACnB,CAAC;QACJ,CAAC;QAED,0EAA0E;QAC1E,2EAA2E;QAC3E,IAAI,QAAQ,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAC3C,MAAM,IAAI,kBAAkB,CAC1B,uCAAuC,IAAI,CAAC,IAAI,yHAAyH,EACzK,IAAI,CAAC,IAAI,EACT,kBAAkB,CACnB,CAAC;QACJ,CAAC;QAED,+CAA+C;QAC/C,wEAAwE;QACxE,8DAA8D;QAC9D,IAAI,UAA8B,CAAC;QACnC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC;gBACH,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACzD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,oEAAoE;gBACpE,MAAM,WAAW,GAAG,qCAAqC,IAAI,CAAC,UAAU,EAAE,CAAC;gBAC3E,MAAM,UAAU,GAAG,gCAAgC,CAAC;gBACpD,MAAM,IAAI,kBAAkB,CAC1B,oBAAoB,CAAC,WAAW,EAAE,UAAU,CAAC,EAC7C,IAAI,CAAC,IAAI,EACT,kBAAkB,EAClB,KAAK,CACN,CAAC;YACJ,CAAC;QACH,CAAC;QAED,4DAA4D;QAC5D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,SAAS,CAAC;QAErD,MAAM,gBAAgB,GAAG;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;YACrB,QAAQ;YACR,UAAU;YACV,KAAK;YACL,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,mBAAmB;SAC9C,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YACpC,OAAO,GAAG,CAAC;QACb,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,kBAAkB,CAAC,uBAAuB,EAAE,IAAI,CAAC,IAAI,EAAE,kBAAkB,EAAE,KAAK,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC;IAEO,qBAAqB;QAC3B,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;gBAC/B,KAAK,EAAE,CAAC;gBACR,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAClB,MAAM,EAAE,CAAC;gBACX,CAAC;qBAAM,CAAC;oBACN,IAAI,EAAE,CAAC;gBACT,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,iBAAiB,GAAG,MAAM,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,IAAgB,EAAE,UAAmB;QAC3D,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAE3C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC;QACtE,IAAI,QAAQ,EAAE,CAAC;YACb,8DAA8D;YAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC3C,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,mDAAmD;gBACnD,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;gBAChC,IAAI,SAAS,EAAE,CAAC;oBACd,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;oBAC9B,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC;oBACzB,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;oBAC/B,IAAI,CAAC,qBAAqB,EAAE,CAAC;oBAC7B,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;oBAC9B,OAAO;gBACT,CAAC;YACH,CAAC;YAED,oCAAoC;YACpC,QAAQ,CAAC,QAAQ,GAAG,KAAK,CAAC;YAC1B,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAE7B,2BAA2B;YAC3B,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAEO,mBAAmB,CAAC,OAAe,EAAE,QAA4B;QACvE,gEAAgE;QAChE,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;YACvB,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACnC,CAAC;QAED,QAAQ,CAAC,SAAS,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;YACzC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC;YAEzC,gDAAgD;YAChD,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;gBAChE,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACjD,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAChC,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,OAAe,EAAE,QAA4B;QAC1E,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC,WAAW;YAAE,OAAO;QAEzB,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,IAAI,CAAC;gBACH,MAAM,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YACtC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,QAAQ,CACN,IAAI,kBAAkB,CACpB,kCAAkC,EAClC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAClB,SAAS,EACT,KAAK,CACN,EACD,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,CAC1B,CAAC;YACJ,CAAC;YAED,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAE7B,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC7B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC5B,CAAC;YAED,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,IAAgB;QACpC,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAE3C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;YACvD,IAAI,CAAC;gBACH,MAAM,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YACtC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,QAAQ,CACN,IAAI,kBAAkB,CACpB,yDAAyD,EACzD,QAAQ,CAAC,IAAI,CAAC,IAAI,EAClB,iBAAiB,EACjB,KAAK,CACN,EACD,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,CAC1B,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QAExC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1B,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,0EAA0E;QAC1E,8DAA8D;QAC9D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAE3B,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACpC,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;QACpC,CAAC;QAED,sEAAsE;QACtE,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,MAAM,aAAa,GAAoB,EAAE,CAAC;QAE1C,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,KAAK,MAAM,QAAQ,IAAI,WAAW,EAAE,CAAC;gBACnC,aAAa,CAAC,IAAI,CAChB,CAAC,KAAK,IAAmB,EAAE;oBACzB,IAAI,CAAC;wBACH,MAAM,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;oBACtC,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,QAAQ,CACN,IAAI,kBAAkB,CACpB,kDAAkD,EAClD,QAAQ,CAAC,IAAI,CAAC,IAAI,EAClB,UAAU,EACV,KAAK,CACN,EACD,EAAE,SAAS,EAAE,UAAU,EAAE,CAC1B,CAAC;oBACJ,CAAC;gBACH,CAAC,CAAC,EAAE,CACL,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QAExC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAClB,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAC/B,CAAC"}
|
|
@@ -31,6 +31,9 @@ export declare class SSHService implements ISSHService {
|
|
|
31
31
|
/**
|
|
32
32
|
* Get host resource usage via SSH using connection pool
|
|
33
33
|
*
|
|
34
|
+
* Security (S-H4): Uses hardcoded HOST_RESOURCES_SCRIPT constant for safety.
|
|
35
|
+
* See constant definition for security documentation.
|
|
36
|
+
*
|
|
34
37
|
* @param host - Host configuration to query
|
|
35
38
|
* @returns Resource information including CPU, memory, disk, and uptime
|
|
36
39
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssh-service.d.ts","sourceRoot":"","sources":["../../src/services/ssh-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"ssh-service.d.ts","sourceRoot":"","sources":["../../src/services/ssh-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAgC9C;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,qBAAa,UAAW,YAAW,WAAW;IAChC,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,kBAAkB;IAErD;;;;;;;;;;;;OAYG;IACG,iBAAiB,CACrB,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAM,EAAO,EACnB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,MAAM,CAAC;IAuElB;;;;;;;;OAQG;IACG,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC;CAmEjE"}
|