@edgible-team/cli 1.0.1 ā 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/LICENSE +16 -0
- package/README.md +114 -1
- package/dist/client/api-client.d.ts +575 -0
- package/dist/client/api-client.d.ts.map +1 -0
- package/dist/client/api-client.js +196 -2
- package/dist/client/index.d.ts +10 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/commands/agent.d.ts +3 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +18 -34
- package/dist/commands/ai.d.ts +3 -0
- package/dist/commands/ai.d.ts.map +1 -0
- package/dist/commands/ai.js +1660 -274
- package/dist/commands/application.d.ts +6 -0
- package/dist/commands/application.d.ts.map +1 -0
- package/dist/commands/application.js +377 -0
- package/dist/commands/auth.d.ts +3 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/base/BaseCommand.d.ts +53 -0
- package/dist/commands/base/BaseCommand.d.ts.map +1 -0
- package/dist/commands/base/CommandHandler.d.ts +28 -0
- package/dist/commands/base/CommandHandler.d.ts.map +1 -0
- package/dist/commands/base/command-wrapper.d.ts +21 -0
- package/dist/commands/base/command-wrapper.d.ts.map +1 -0
- package/dist/commands/base/middleware.d.ts +34 -0
- package/dist/commands/base/middleware.d.ts.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/connectivity.d.ts +3 -0
- package/dist/commands/connectivity.d.ts.map +1 -0
- package/dist/commands/debug.d.ts +3 -0
- package/dist/commands/debug.d.ts.map +1 -0
- package/dist/commands/debug.js +336 -0
- package/dist/commands/discover.d.ts +3 -0
- package/dist/commands/discover.d.ts.map +1 -0
- package/dist/commands/examples/migrated-command-example.d.ts +31 -0
- package/dist/commands/examples/migrated-command-example.d.ts.map +1 -0
- package/dist/commands/gateway.d.ts +6 -0
- package/dist/commands/gateway.d.ts.map +1 -0
- package/dist/commands/managedGateway.d.ts +6 -0
- package/dist/commands/managedGateway.d.ts.map +1 -0
- package/dist/commands/managedGateway.js +132 -0
- package/dist/commands/utils/config-validator.d.ts +29 -0
- package/dist/commands/utils/config-validator.d.ts.map +1 -0
- package/dist/commands/utils/gateway-prompt.d.ts +23 -0
- package/dist/commands/utils/gateway-prompt.d.ts.map +1 -0
- package/dist/commands/utils/input-parser.d.ts +34 -0
- package/dist/commands/utils/input-parser.d.ts.map +1 -0
- package/dist/commands/utils/output-formatter.d.ts +62 -0
- package/dist/commands/utils/output-formatter.d.ts.map +1 -0
- package/dist/config/app-config.d.ts +44 -0
- package/dist/config/app-config.d.ts.map +1 -0
- package/dist/detection/SystemCapabilityDetector.d.ts +139 -0
- package/dist/detection/SystemCapabilityDetector.d.ts.map +1 -0
- package/dist/detection/ToolDetector.d.ts +16 -0
- package/dist/detection/ToolDetector.d.ts.map +1 -0
- package/dist/detection/WorkloadDetector.d.ts +62 -0
- package/dist/detection/WorkloadDetector.d.ts.map +1 -0
- package/dist/di/bindings.d.ts +15 -0
- package/dist/di/bindings.d.ts.map +1 -0
- package/dist/di/container.d.ts +44 -0
- package/dist/di/container.d.ts.map +1 -0
- package/dist/di/types.d.ts +23 -0
- package/dist/di/types.d.ts.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -1
- package/dist/interfaces/IDaemonManager.d.ts +67 -0
- package/dist/interfaces/IDaemonManager.d.ts.map +1 -0
- package/dist/repositories/config-repository.d.ts +46 -0
- package/dist/repositories/config-repository.d.ts.map +1 -0
- package/dist/repositories/gateway-repository.d.ts +37 -0
- package/dist/repositories/gateway-repository.d.ts.map +1 -0
- package/dist/services/AgentStatusManager.d.ts +30 -0
- package/dist/services/AgentStatusManager.d.ts.map +1 -0
- package/dist/services/ConnectivityTester.d.ts +30 -0
- package/dist/services/ConnectivityTester.d.ts.map +1 -0
- package/dist/services/DependencyInstaller.d.ts +32 -0
- package/dist/services/DependencyInstaller.d.ts.map +1 -0
- package/dist/services/LocalAgentManager.d.ts +220 -0
- package/dist/services/LocalAgentManager.d.ts.map +1 -0
- package/dist/services/LocalAgentManager.js +2 -2
- package/dist/services/application/ApplicationService.d.ts +54 -0
- package/dist/services/application/ApplicationService.d.ts.map +1 -0
- package/dist/services/application/ApplicationService.js +10 -3
- package/dist/services/auth/AuthService.d.ts +42 -0
- package/dist/services/auth/AuthService.d.ts.map +1 -0
- package/dist/services/aws.d.ts +136 -0
- package/dist/services/aws.d.ts.map +1 -0
- package/dist/services/aws.js +2 -2
- package/dist/services/daemon/DaemonManagerFactory.d.ts +17 -0
- package/dist/services/daemon/DaemonManagerFactory.d.ts.map +1 -0
- package/dist/services/daemon/DockerDaemonManager.d.ts +26 -0
- package/dist/services/daemon/DockerDaemonManager.d.ts.map +1 -0
- package/dist/services/daemon/LaunchdDaemonManager.d.ts +20 -0
- package/dist/services/daemon/LaunchdDaemonManager.d.ts.map +1 -0
- package/dist/services/daemon/LaunchdDaemonManager.js +6 -0
- package/dist/services/daemon/PodmanDaemonManager.d.ts +24 -0
- package/dist/services/daemon/PodmanDaemonManager.d.ts.map +1 -0
- package/dist/services/daemon/SystemdDaemonManager.d.ts +20 -0
- package/dist/services/daemon/SystemdDaemonManager.d.ts.map +1 -0
- package/dist/services/daemon/WindowsServiceDaemonManager.d.ts +19 -0
- package/dist/services/daemon/WindowsServiceDaemonManager.d.ts.map +1 -0
- package/dist/services/daemon/index.d.ts +7 -0
- package/dist/services/daemon/index.d.ts.map +1 -0
- package/dist/services/edgible.d.ts +304 -0
- package/dist/services/edgible.d.ts.map +1 -0
- package/dist/services/edgible.js +53 -4
- package/dist/services/gateway/GatewayService.d.ts +88 -0
- package/dist/services/gateway/GatewayService.d.ts.map +1 -0
- package/dist/state/config.d.ts +96 -0
- package/dist/state/config.d.ts.map +1 -0
- package/dist/types/AgentConfig.d.ts +126 -0
- package/dist/types/AgentConfig.d.ts.map +1 -0
- package/dist/types/AgentStatus.d.ts +30 -0
- package/dist/types/AgentStatus.d.ts.map +1 -0
- package/dist/types/ApiClient.d.ts +36 -0
- package/dist/types/ApiClient.d.ts.map +1 -0
- package/dist/types/ApiRequests.d.ts +269 -0
- package/dist/types/ApiRequests.d.ts.map +1 -0
- package/dist/types/ApiResponses.d.ts +348 -0
- package/dist/types/ApiResponses.d.ts.map +1 -0
- package/dist/types/Application.d.ts +13 -0
- package/dist/types/Application.d.ts.map +1 -0
- package/dist/types/CaddyJson.d.ts +231 -0
- package/dist/types/CaddyJson.d.ts.map +1 -0
- package/dist/types/DeviceMetrics.d.ts +95 -0
- package/dist/types/DeviceMetrics.d.ts.map +1 -0
- package/dist/types/DeviceMetrics.js +5 -0
- package/dist/types/LogAggregation.d.ts +106 -0
- package/dist/types/LogAggregation.d.ts.map +1 -0
- package/dist/types/LogAggregation.js +5 -0
- package/dist/types/LogEntry.d.ts +60 -0
- package/dist/types/LogEntry.d.ts.map +1 -0
- package/dist/types/LogEntry.js +5 -0
- package/dist/types/UnifiedAgentStatus.d.ts +28 -0
- package/dist/types/UnifiedAgentStatus.d.ts.map +1 -0
- package/dist/types/WireGuard.d.ts +36 -0
- package/dist/types/WireGuard.d.ts.map +1 -0
- package/dist/types/Workload.d.ts +9 -0
- package/dist/types/Workload.d.ts.map +1 -0
- package/dist/types/agent.d.ts +120 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/command-options.d.ts +115 -0
- package/dist/types/command-options.d.ts.map +1 -0
- package/dist/types/connectivity.d.ts +80 -0
- package/dist/types/connectivity.d.ts.map +1 -0
- package/dist/types/errors.d.ts +97 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/gateway-types.d.ts +46 -0
- package/dist/types/gateway-types.d.ts.map +1 -0
- package/dist/types/index.d.ts +28 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/models/ApplicationData.d.ts +78 -0
- package/dist/types/models/ApplicationData.d.ts.map +1 -0
- package/dist/types/models/CertificateData.d.ts +44 -0
- package/dist/types/models/CertificateData.d.ts.map +1 -0
- package/dist/types/models/DeviceData.d.ts +29 -0
- package/dist/types/models/DeviceData.d.ts.map +1 -0
- package/dist/types/models/DevicePoolData.d.ts +47 -0
- package/dist/types/models/DevicePoolData.d.ts.map +1 -0
- package/dist/types/models/LifecycleEvent.d.ts +27 -0
- package/dist/types/models/LifecycleEvent.d.ts.map +1 -0
- package/dist/types/models/LifecycleEvent.js +5 -0
- package/dist/types/models/OrganizationData.d.ts +53 -0
- package/dist/types/models/OrganizationData.d.ts.map +1 -0
- package/dist/types/models/OrganizationInviteData.d.ts +39 -0
- package/dist/types/models/OrganizationInviteData.d.ts.map +1 -0
- package/dist/types/models/ProviderConfiguration.d.ts +37 -0
- package/dist/types/models/ProviderConfiguration.d.ts.map +1 -0
- package/dist/types/models/ResourceData.d.ts +18 -0
- package/dist/types/models/ResourceData.d.ts.map +1 -0
- package/dist/types/models/ServiceResourceData.d.ts +5 -0
- package/dist/types/models/ServiceResourceData.d.ts.map +1 -0
- package/dist/types/models/UserData.d.ts +12 -0
- package/dist/types/models/UserData.d.ts.map +1 -0
- package/dist/types/route.d.ts +67 -0
- package/dist/types/route.d.ts.map +1 -0
- package/dist/types/validation/schemas.d.ts +606 -0
- package/dist/types/validation/schemas.d.ts.map +1 -0
- package/dist/types/validation/schemas.js +46 -4
- package/dist/types/validation.d.ts +68 -0
- package/dist/types/validation.d.ts.map +1 -0
- package/dist/utils/FileIntegrityManager.d.ts +37 -0
- package/dist/utils/FileIntegrityManager.d.ts.map +1 -0
- package/dist/utils/PathMigration.d.ts +45 -0
- package/dist/utils/PathMigration.d.ts.map +1 -0
- package/dist/utils/PathResolver.d.ts +76 -0
- package/dist/utils/PathResolver.d.ts.map +1 -0
- package/dist/utils/PlatformDetector.d.ts +60 -0
- package/dist/utils/PlatformDetector.d.ts.map +1 -0
- package/dist/utils/console-logger.d.ts +37 -0
- package/dist/utils/console-logger.d.ts.map +1 -0
- package/dist/utils/docker-compose-parser.d.ts +28 -0
- package/dist/utils/docker-compose-parser.d.ts.map +1 -0
- package/dist/utils/errors.d.ts +63 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/health-checker.d.ts +34 -0
- package/dist/utils/health-checker.d.ts.map +1 -0
- package/dist/utils/json-logger.d.ts +23 -0
- package/dist/utils/json-logger.d.ts.map +1 -0
- package/dist/utils/log-formatter.d.ts +85 -0
- package/dist/utils/log-formatter.d.ts.map +1 -0
- package/dist/utils/log-formatter.js +39 -11
- package/dist/utils/logger.d.ts +34 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/network-utils.d.ts +56 -0
- package/dist/utils/network-utils.d.ts.map +1 -0
- package/dist/utils/output.d.ts +73 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/passwordValidation.d.ts +32 -0
- package/dist/utils/passwordValidation.d.ts.map +1 -0
- package/dist/utils/progress.d.ts +74 -0
- package/dist/utils/progress.d.ts.map +1 -0
- package/dist/utils/sudo-checker.d.ts +9 -0
- package/dist/utils/sudo-checker.d.ts.map +1 -0
- package/dist/utils/urls.d.ts +19 -0
- package/dist/utils/urls.d.ts.map +1 -0
- package/dist/utils/urls.js +3 -3
- package/dist/utils/validation.d.ts +19 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/validation/schemas.d.ts +197 -0
- package/dist/validation/schemas.d.ts.map +1 -0
- package/dist/validation/schemas.js +1 -1
- package/dist/validation/validator.d.ts +22 -0
- package/dist/validation/validator.d.ts.map +1 -0
- package/package.json +8 -3
- package/recipes/compose/open-webui/docker-compose.yml +17 -0
package/dist/commands/debug.js
CHANGED
|
@@ -43,6 +43,7 @@ const child_process_1 = require("child_process");
|
|
|
43
43
|
const command_wrapper_1 = require("./base/command-wrapper");
|
|
44
44
|
const container_1 = require("../di/container");
|
|
45
45
|
const types_1 = require("../di/types");
|
|
46
|
+
const urls_1 = require("../utils/urls");
|
|
46
47
|
function setupDebugCommands(program) {
|
|
47
48
|
const debugCommand = program
|
|
48
49
|
.command('debug')
|
|
@@ -94,5 +95,340 @@ function setupDebugCommands(program) {
|
|
|
94
95
|
}, {
|
|
95
96
|
configRepository: (0, container_1.getContainer)().get(types_1.TYPES.ConfigRepository),
|
|
96
97
|
}));
|
|
98
|
+
debugCommand
|
|
99
|
+
.command('stage')
|
|
100
|
+
.description('Show current stage and environment information')
|
|
101
|
+
.action((0, command_wrapper_1.wrapCommand)(async () => {
|
|
102
|
+
const container = (0, container_1.getContainer)();
|
|
103
|
+
const logger = container.get(types_1.TYPES.Logger);
|
|
104
|
+
logger.debug('Getting stage information');
|
|
105
|
+
const stage = (0, urls_1.getStage)();
|
|
106
|
+
const stageEnv = process.env['STAGE'];
|
|
107
|
+
const sstStageEnv = process.env['SST_STAGE'];
|
|
108
|
+
const nodeEnv = process.env['NODE_ENV'];
|
|
109
|
+
const apiBaseUrl = (0, urls_1.getApiBaseUrl)();
|
|
110
|
+
const distributionUrl = (0, urls_1.getDistributionUrl)();
|
|
111
|
+
console.log(chalk_1.default.blue('\nš Stage Information\n'));
|
|
112
|
+
console.log(chalk_1.default.cyan('Current Stage:'), chalk_1.default.white.bold(stage));
|
|
113
|
+
console.log();
|
|
114
|
+
console.log(chalk_1.default.cyan('Environment Variables:'));
|
|
115
|
+
console.log(chalk_1.default.gray(' STAGE: '), stageEnv || chalk_1.default.gray('(not set)'));
|
|
116
|
+
console.log(chalk_1.default.gray(' SST_STAGE: '), sstStageEnv || chalk_1.default.gray('(not set)'));
|
|
117
|
+
console.log(chalk_1.default.gray(' NODE_ENV: '), nodeEnv || chalk_1.default.gray('(not set)'));
|
|
118
|
+
console.log();
|
|
119
|
+
console.log(chalk_1.default.cyan('Computed URLs:'));
|
|
120
|
+
console.log(chalk_1.default.gray(' API: '), chalk_1.default.white(apiBaseUrl));
|
|
121
|
+
console.log(chalk_1.default.gray(' Distribution: '), chalk_1.default.white(distributionUrl));
|
|
122
|
+
console.log();
|
|
123
|
+
if (!stageEnv && !sstStageEnv) {
|
|
124
|
+
console.log(chalk_1.default.yellow('ā¹ Using default stage (prod) - no STAGE or SST_STAGE env var set'));
|
|
125
|
+
console.log(chalk_1.default.gray(' To change: export STAGE=dev (or uat, staging, prod)'));
|
|
126
|
+
}
|
|
127
|
+
}, {
|
|
128
|
+
configRepository: (0, container_1.getContainer)().get(types_1.TYPES.ConfigRepository),
|
|
129
|
+
}));
|
|
130
|
+
debugCommand
|
|
131
|
+
.command('set-stage <stage>')
|
|
132
|
+
.description('Display command to set the stage (dev, uat, staging, prod)')
|
|
133
|
+
.action(async (stage) => {
|
|
134
|
+
try {
|
|
135
|
+
const container = (0, container_1.getContainer)();
|
|
136
|
+
const logger = container.get(types_1.TYPES.Logger);
|
|
137
|
+
const validStages = ['dev', 'uat', 'staging', 'prod', 'test'];
|
|
138
|
+
if (!validStages.includes(stage)) {
|
|
139
|
+
console.log(chalk_1.default.red(`ā Invalid stage: ${stage}`));
|
|
140
|
+
console.log(chalk_1.default.gray(` Valid stages: ${validStages.join(', ')}`));
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
logger.debug('Setting stage', { stage });
|
|
144
|
+
console.log(chalk_1.default.blue('\nš§ Stage Configuration\n'));
|
|
145
|
+
console.log(chalk_1.default.cyan('To set the stage, run one of these commands:\n'));
|
|
146
|
+
console.log(chalk_1.default.white.bold('For current shell session:'));
|
|
147
|
+
console.log(chalk_1.default.green(` export STAGE=${stage}`));
|
|
148
|
+
console.log();
|
|
149
|
+
console.log(chalk_1.default.white.bold('For persistent configuration (bash):'));
|
|
150
|
+
console.log(chalk_1.default.green(` echo 'export STAGE=${stage}' >> ~/.bashrc`));
|
|
151
|
+
console.log(chalk_1.default.gray(' Then reload: source ~/.bashrc'));
|
|
152
|
+
console.log();
|
|
153
|
+
console.log(chalk_1.default.white.bold('For persistent configuration (zsh):'));
|
|
154
|
+
console.log(chalk_1.default.green(` echo 'export STAGE=${stage}' >> ~/.zshrc`));
|
|
155
|
+
console.log(chalk_1.default.gray(' Then reload: source ~/.zshrc'));
|
|
156
|
+
console.log();
|
|
157
|
+
const newApiUrl = `https://api.v2.${stage}.edgible.com`;
|
|
158
|
+
const newDistUrl = `https://distribution.${stage}.edgible.com`;
|
|
159
|
+
console.log(chalk_1.default.cyan('After setting, the CLI will use:'));
|
|
160
|
+
console.log(chalk_1.default.gray(' API: '), chalk_1.default.white(newApiUrl));
|
|
161
|
+
console.log(chalk_1.default.gray(' Distribution: '), chalk_1.default.white(newDistUrl));
|
|
162
|
+
console.log();
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
166
|
+
console.error(chalk_1.default.red('Error:'), errorMessage);
|
|
167
|
+
process.exit(1);
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
debugCommand
|
|
171
|
+
.command('application-metrics')
|
|
172
|
+
.description('Fetch and display application metrics')
|
|
173
|
+
.option('-a, --app-id <id>', 'Application ID')
|
|
174
|
+
.option('-o, --org-id <id>', 'Organization ID')
|
|
175
|
+
.option('--hours <hours>', 'Number of hours to look back (default: 24)', '24')
|
|
176
|
+
.option('--json', 'Output as JSON')
|
|
177
|
+
.action((0, command_wrapper_1.wrapCommand)(async (options) => {
|
|
178
|
+
const container = (0, container_1.getContainer)();
|
|
179
|
+
const logger = container.get(types_1.TYPES.Logger);
|
|
180
|
+
const configRepository = container.get(types_1.TYPES.ConfigRepository);
|
|
181
|
+
const config = configRepository.getConfig();
|
|
182
|
+
if (!config.organizationId && !options.orgId) {
|
|
183
|
+
throw new Error('Organization ID is required. Use --org-id or ensure you are logged in.');
|
|
184
|
+
}
|
|
185
|
+
if (!options.appId) {
|
|
186
|
+
throw new Error('Application ID is required. Use --app-id <id>');
|
|
187
|
+
}
|
|
188
|
+
const organizationId = options.orgId || config.organizationId;
|
|
189
|
+
const hours = parseInt(options.hours || '24', 10);
|
|
190
|
+
if (isNaN(hours) || hours <= 0) {
|
|
191
|
+
throw new Error('Hours must be a positive number');
|
|
192
|
+
}
|
|
193
|
+
logger.debug('Fetching application metrics', {
|
|
194
|
+
organizationId,
|
|
195
|
+
applicationId: options.appId,
|
|
196
|
+
hours
|
|
197
|
+
});
|
|
198
|
+
const edgibleService = container.get(types_1.TYPES.EdgibleService);
|
|
199
|
+
const endTime = Date.now();
|
|
200
|
+
const startTime = endTime - (hours * 60 * 60 * 1000);
|
|
201
|
+
try {
|
|
202
|
+
// First, try to get metrics files to debug the issue
|
|
203
|
+
console.log(chalk_1.default.blue('\nš Debugging Metrics Files Endpoint\n'));
|
|
204
|
+
console.log(chalk_1.default.gray('Testing metrics-files endpoint...'));
|
|
205
|
+
console.log(chalk_1.default.gray(` Organization ID: ${organizationId}`));
|
|
206
|
+
console.log(chalk_1.default.gray(` Application ID: ${options.appId}`));
|
|
207
|
+
console.log(chalk_1.default.gray(` Start Time: ${new Date(startTime).toISOString()} (${startTime})`));
|
|
208
|
+
console.log(chalk_1.default.gray(` End Time: ${new Date(endTime).toISOString()} (${endTime})`));
|
|
209
|
+
console.log();
|
|
210
|
+
let metricsFiles;
|
|
211
|
+
try {
|
|
212
|
+
metricsFiles = await edgibleService.getApplicationMetricsFiles(organizationId, options.appId, startTime, endTime);
|
|
213
|
+
console.log(chalk_1.default.green('ā
Metrics Files Response:'));
|
|
214
|
+
console.log(chalk_1.default.gray(` Total Files: ${metricsFiles.totalFiles}`));
|
|
215
|
+
console.log(chalk_1.default.gray(` Total Size: ${formatBytes(metricsFiles.totalSizeBytes || 0)}`));
|
|
216
|
+
console.log(chalk_1.default.gray(` Strategy: ${metricsFiles.strategy}`));
|
|
217
|
+
console.log(chalk_1.default.gray(` Files Found: ${metricsFiles.files?.length || 0}`));
|
|
218
|
+
if (metricsFiles.files && metricsFiles.files.length > 0) {
|
|
219
|
+
console.log(chalk_1.default.gray('\n File Details:'));
|
|
220
|
+
metricsFiles.files.slice(0, 5).forEach((file, index) => {
|
|
221
|
+
console.log(chalk_1.default.gray(` ${index + 1}. ${file.type} - ${file.timeRange?.start} to ${file.timeRange?.end}`));
|
|
222
|
+
console.log(chalk_1.default.gray(` Size: ${formatBytes(file.sizeBytes || 0)}, URL: ${file.url?.substring(0, 60)}...`));
|
|
223
|
+
});
|
|
224
|
+
if (metricsFiles.files.length > 5) {
|
|
225
|
+
console.log(chalk_1.default.gray(` ... and ${metricsFiles.files.length - 5} more files`));
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
console.log(chalk_1.default.yellow(' ā No files found in S3 bucket'));
|
|
230
|
+
console.log(chalk_1.default.gray(' This could indicate:'));
|
|
231
|
+
console.log(chalk_1.default.gray(' - Metrics are not being sent to Firehose'));
|
|
232
|
+
console.log(chalk_1.default.gray(' - Files are stored in a different S3 prefix'));
|
|
233
|
+
console.log(chalk_1.default.gray(' - Time range does not match when files were created'));
|
|
234
|
+
console.log(chalk_1.default.gray(' - S3 bucket permissions issue'));
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
catch (filesError) {
|
|
238
|
+
console.log(chalk_1.default.red('ā Error fetching metrics files:'));
|
|
239
|
+
console.log(chalk_1.default.red(` ${filesError instanceof Error ? filesError.message : String(filesError)}`));
|
|
240
|
+
if (filesError instanceof Error && filesError.stack) {
|
|
241
|
+
console.log(chalk_1.default.gray(` Stack: ${filesError.stack}`));
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
console.log();
|
|
245
|
+
console.log(chalk_1.default.blue('š Fetching Aggregated Metrics\n'));
|
|
246
|
+
const metrics = await edgibleService.getApplicationMetrics(organizationId, options.appId, startTime, endTime);
|
|
247
|
+
if (options.json) {
|
|
248
|
+
console.log(JSON.stringify({ metrics, metricsFiles }, null, 2));
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
// Format and display metrics
|
|
252
|
+
console.log(chalk_1.default.blue('š Application Metrics\n'));
|
|
253
|
+
console.log(chalk_1.default.cyan('Application:'), chalk_1.default.white(metrics.applicationName || options.appId));
|
|
254
|
+
console.log(chalk_1.default.cyan('Application ID:'), chalk_1.default.white(metrics.applicationId));
|
|
255
|
+
console.log(chalk_1.default.cyan('Status:'), chalk_1.default.white(metrics.status || 'unknown'));
|
|
256
|
+
console.log(chalk_1.default.cyan('Uptime:'), chalk_1.default.white(formatUptime(metrics.uptime || 0)));
|
|
257
|
+
console.log();
|
|
258
|
+
if (metrics.gateway) {
|
|
259
|
+
console.log(chalk_1.default.yellow('š Gateway Metrics:'));
|
|
260
|
+
console.log(chalk_1.default.gray(' Total Requests:'), chalk_1.default.white(metrics.gateway.totalRequests?.toLocaleString() || '0'));
|
|
261
|
+
console.log(chalk_1.default.gray(' Active Connections:'), chalk_1.default.white(metrics.gateway.activeConnections?.toString() || '0'));
|
|
262
|
+
console.log(chalk_1.default.gray(' Request Rate:'), chalk_1.default.white(`${(metrics.gateway.requestRate || 0).toFixed(2)} req/s`));
|
|
263
|
+
console.log(chalk_1.default.gray(' Error Rate:'), chalk_1.default.white(`${((metrics.gateway.errorRate || 0) * 100).toFixed(2)}%`));
|
|
264
|
+
console.log(chalk_1.default.gray(' Avg Response Time:'), chalk_1.default.white(`${metrics.gateway.averageResponseTime || 0}ms`));
|
|
265
|
+
console.log(chalk_1.default.gray(' Ingress:'), chalk_1.default.white(formatBytes(metrics.gateway.ingressBytes || 0)));
|
|
266
|
+
console.log(chalk_1.default.gray(' Egress:'), chalk_1.default.white(formatBytes(metrics.gateway.egressBytes || 0)));
|
|
267
|
+
console.log(chalk_1.default.gray(' Status:'), chalk_1.default.white(metrics.gateway.status || 'unknown'));
|
|
268
|
+
console.log(chalk_1.default.gray(' Last Seen:'), chalk_1.default.white(new Date(metrics.gateway.lastSeen || Date.now()).toLocaleString()));
|
|
269
|
+
console.log();
|
|
270
|
+
}
|
|
271
|
+
if (metrics.serving) {
|
|
272
|
+
console.log(chalk_1.default.yellow('š„ļø Serving Device Metrics:'));
|
|
273
|
+
console.log(chalk_1.default.gray(' Health Status:'), chalk_1.default.white(metrics.serving.healthStatus || 'unknown'));
|
|
274
|
+
console.log(chalk_1.default.gray(' Avg Response Time:'), chalk_1.default.white(`${metrics.serving.averageResponseTime || 0}ms`));
|
|
275
|
+
console.log(chalk_1.default.gray(' CPU Usage:'), chalk_1.default.white(`${(metrics.serving.cpuUsage || 0).toFixed(2)}%`));
|
|
276
|
+
console.log(chalk_1.default.gray(' Memory Usage:'), chalk_1.default.white(`${(metrics.serving.memoryUsage || 0).toFixed(2)}%`));
|
|
277
|
+
console.log(chalk_1.default.gray(' Container Restarts:'), chalk_1.default.white((metrics.serving.containerRestarts || 0).toString()));
|
|
278
|
+
console.log(chalk_1.default.gray(' Status:'), chalk_1.default.white(metrics.serving.status || 'unknown'));
|
|
279
|
+
console.log(chalk_1.default.gray(' Last Seen:'), chalk_1.default.white(new Date(metrics.serving.lastSeen || Date.now()).toLocaleString()));
|
|
280
|
+
console.log();
|
|
281
|
+
}
|
|
282
|
+
if (metrics.events && metrics.events.length > 0) {
|
|
283
|
+
console.log(chalk_1.default.yellow('š
Recent Events:'));
|
|
284
|
+
metrics.events.slice(0, 10).forEach((event) => {
|
|
285
|
+
const timestamp = new Date(event.timestamp).toLocaleString();
|
|
286
|
+
console.log(chalk_1.default.gray(` [${timestamp}]`), chalk_1.default.white(`${event.deviceType}: ${event.message}`));
|
|
287
|
+
});
|
|
288
|
+
if (metrics.events.length > 10) {
|
|
289
|
+
console.log(chalk_1.default.gray(` ... and ${metrics.events.length - 10} more events`));
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
if (!metrics.gateway && !metrics.serving) {
|
|
293
|
+
console.log(chalk_1.default.yellow('ā No metrics data available for this time range'));
|
|
294
|
+
console.log(chalk_1.default.gray(' Metrics may take up to 1 minute to appear after application starts reporting.'));
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
catch (error) {
|
|
298
|
+
logger.error('Failed to fetch application metrics', error);
|
|
299
|
+
throw error;
|
|
300
|
+
}
|
|
301
|
+
}, {
|
|
302
|
+
configRepository: (0, container_1.getContainer)().get(types_1.TYPES.ConfigRepository),
|
|
303
|
+
requireAuth: true,
|
|
304
|
+
}));
|
|
305
|
+
debugCommand
|
|
306
|
+
.command('application-logs')
|
|
307
|
+
.description('Fetch and display application logs')
|
|
308
|
+
.option('-a, --app-id <id>', 'Application ID')
|
|
309
|
+
.option('-o, --org-id <id>', 'Organization ID')
|
|
310
|
+
.option('--hours <hours>', 'Number of hours to look back (default: 24)', '24')
|
|
311
|
+
.option('--level <level>', 'Filter by log level (error, warn, info, debug)')
|
|
312
|
+
.option('--event-type <type>', 'Filter by event type (lifecycle, health, traffic, error, metrics)')
|
|
313
|
+
.option('--json', 'Output as JSON')
|
|
314
|
+
.option('--limit <limit>', 'Maximum number of logs to display (default: 50)', '50')
|
|
315
|
+
.action((0, command_wrapper_1.wrapCommand)(async (options) => {
|
|
316
|
+
const container = (0, container_1.getContainer)();
|
|
317
|
+
const logger = container.get(types_1.TYPES.Logger);
|
|
318
|
+
const configRepository = container.get(types_1.TYPES.ConfigRepository);
|
|
319
|
+
const config = configRepository.getConfig();
|
|
320
|
+
if (!config.organizationId && !options.orgId) {
|
|
321
|
+
throw new Error('Organization ID is required. Use --org-id or ensure you are logged in.');
|
|
322
|
+
}
|
|
323
|
+
if (!options.appId) {
|
|
324
|
+
throw new Error('Application ID is required. Use --app-id <id>');
|
|
325
|
+
}
|
|
326
|
+
const organizationId = options.orgId || config.organizationId;
|
|
327
|
+
const hours = parseInt(options.hours || '24', 10);
|
|
328
|
+
const limit = parseInt(options.limit || '50', 10);
|
|
329
|
+
if (isNaN(hours) || hours <= 0) {
|
|
330
|
+
throw new Error('Hours must be a positive number');
|
|
331
|
+
}
|
|
332
|
+
if (isNaN(limit) || limit <= 0) {
|
|
333
|
+
throw new Error('Limit must be a positive number');
|
|
334
|
+
}
|
|
335
|
+
logger.debug('Fetching application logs', {
|
|
336
|
+
organizationId,
|
|
337
|
+
applicationId: options.appId,
|
|
338
|
+
hours,
|
|
339
|
+
level: options.level,
|
|
340
|
+
eventType: options.eventType,
|
|
341
|
+
limit
|
|
342
|
+
});
|
|
343
|
+
const edgibleService = container.get(types_1.TYPES.EdgibleService);
|
|
344
|
+
const endTime = Date.now();
|
|
345
|
+
const startTime = endTime - (hours * 60 * 60 * 1000);
|
|
346
|
+
try {
|
|
347
|
+
const logs = await edgibleService.getApplicationLogs(organizationId, options.appId, startTime, endTime, options.level, options.eventType);
|
|
348
|
+
if (options.json) {
|
|
349
|
+
console.log(JSON.stringify(logs, null, 2));
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
// Format and display logs
|
|
353
|
+
console.log(chalk_1.default.blue('\nš Application Logs\n'));
|
|
354
|
+
console.log(chalk_1.default.cyan('Application:'), chalk_1.default.white(logs.applicationName || options.appId));
|
|
355
|
+
console.log(chalk_1.default.cyan('Total Logs:'), chalk_1.default.white((logs.totalLogs || 0).toString()));
|
|
356
|
+
console.log();
|
|
357
|
+
if (!logs.logs || logs.logs.length === 0) {
|
|
358
|
+
console.log(chalk_1.default.yellow('ā No logs found for this time range'));
|
|
359
|
+
console.log(chalk_1.default.gray(' Logs may take up to 1 minute to appear after application starts reporting.'));
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
const displayLogs = logs.logs.slice(0, limit);
|
|
363
|
+
displayLogs.forEach((log) => {
|
|
364
|
+
const timestamp = new Date(log.timestamp).toLocaleString();
|
|
365
|
+
const level = log.level || 'info';
|
|
366
|
+
const levelColor = getLevelColor(level);
|
|
367
|
+
const deviceType = log.sourceDetails?.deviceType || 'unknown';
|
|
368
|
+
console.log(chalk_1.default.gray(`[${timestamp}]`), levelColor(`[${level.toUpperCase()}]`), chalk_1.default.cyan(`[${deviceType}]`), chalk_1.default.white(log.message || ''));
|
|
369
|
+
if (log.eventType) {
|
|
370
|
+
console.log(chalk_1.default.gray(' Event Type:'), chalk_1.default.white(log.eventType));
|
|
371
|
+
}
|
|
372
|
+
if (log.eventAction) {
|
|
373
|
+
console.log(chalk_1.default.gray(' Action:'), chalk_1.default.white(log.eventAction));
|
|
374
|
+
}
|
|
375
|
+
if (log.metadata && Object.keys(log.metadata).length > 0) {
|
|
376
|
+
console.log(chalk_1.default.gray(' Metadata:'), chalk_1.default.white(JSON.stringify(log.metadata, null, 2).split('\n').map((l) => ' ' + l).join('\n')));
|
|
377
|
+
}
|
|
378
|
+
console.log();
|
|
379
|
+
});
|
|
380
|
+
if (logs.logs.length > limit) {
|
|
381
|
+
console.log(chalk_1.default.gray(`... and ${logs.logs.length - limit} more logs (use --limit to see more)`));
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
catch (error) {
|
|
385
|
+
logger.error('Failed to fetch application logs', error);
|
|
386
|
+
throw error;
|
|
387
|
+
}
|
|
388
|
+
}, {
|
|
389
|
+
configRepository: (0, container_1.getContainer)().get(types_1.TYPES.ConfigRepository),
|
|
390
|
+
requireAuth: true,
|
|
391
|
+
}));
|
|
392
|
+
}
|
|
393
|
+
function formatUptime(seconds) {
|
|
394
|
+
if (seconds < 60) {
|
|
395
|
+
return `${seconds}s`;
|
|
396
|
+
}
|
|
397
|
+
else if (seconds < 3600) {
|
|
398
|
+
const mins = Math.floor(seconds / 60);
|
|
399
|
+
return `${mins}m`;
|
|
400
|
+
}
|
|
401
|
+
else if (seconds < 86400) {
|
|
402
|
+
const hours = Math.floor(seconds / 3600);
|
|
403
|
+
const mins = Math.floor((seconds % 3600) / 60);
|
|
404
|
+
return `${hours}h ${mins}m`;
|
|
405
|
+
}
|
|
406
|
+
else {
|
|
407
|
+
const days = Math.floor(seconds / 86400);
|
|
408
|
+
const hours = Math.floor((seconds % 86400) / 3600);
|
|
409
|
+
return `${days}d ${hours}h`;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
function formatBytes(bytes) {
|
|
413
|
+
if (bytes === 0)
|
|
414
|
+
return '0 B';
|
|
415
|
+
const k = 1024;
|
|
416
|
+
const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
|
|
417
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
418
|
+
return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`;
|
|
419
|
+
}
|
|
420
|
+
function getLevelColor(level) {
|
|
421
|
+
switch (level.toLowerCase()) {
|
|
422
|
+
case 'error':
|
|
423
|
+
return chalk_1.default.red;
|
|
424
|
+
case 'warn':
|
|
425
|
+
return chalk_1.default.yellow;
|
|
426
|
+
case 'info':
|
|
427
|
+
return chalk_1.default.blue;
|
|
428
|
+
case 'debug':
|
|
429
|
+
return chalk_1.default.gray;
|
|
430
|
+
default:
|
|
431
|
+
return chalk_1.default.white;
|
|
432
|
+
}
|
|
97
433
|
}
|
|
98
434
|
//# sourceMappingURL=debug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/commands/discover.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4J5D"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example of a migrated command using all the new infrastructure
|
|
3
|
+
* This demonstrates how to use:
|
|
4
|
+
* - Dependency injection
|
|
5
|
+
* - Logger abstraction
|
|
6
|
+
* - Validation with Zod
|
|
7
|
+
* - Command wrapper
|
|
8
|
+
* - Shared utilities
|
|
9
|
+
* - Proper TypeScript types
|
|
10
|
+
*
|
|
11
|
+
* This is a reference implementation for migrating other commands
|
|
12
|
+
*/
|
|
13
|
+
import { Command } from 'commander';
|
|
14
|
+
/**
|
|
15
|
+
* Example: Migrated gateway create command
|
|
16
|
+
* This shows the pattern for all command migrations
|
|
17
|
+
*/
|
|
18
|
+
export declare function setupExampleGatewayCreateCommand(program: Command): void;
|
|
19
|
+
/**
|
|
20
|
+
* Migration checklist:
|
|
21
|
+
*
|
|
22
|
+
* ā
Use DI container to get services
|
|
23
|
+
* ā
Use logger instead of console.log
|
|
24
|
+
* ā
Validate inputs with Zod schemas
|
|
25
|
+
* ā
Use wrapCommand for error handling
|
|
26
|
+
* ā
Use shared utilities for common operations
|
|
27
|
+
* ā
Use proper TypeScript types (no any)
|
|
28
|
+
* ā
Validate configuration before execution
|
|
29
|
+
* ā
Format output consistently
|
|
30
|
+
*/
|
|
31
|
+
//# sourceMappingURL=migrated-command-example.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrated-command-example.d.ts","sourceRoot":"","sources":["../../../src/commands/examples/migrated-command-example.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC;;;GAGG;AACH,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+KvE;AAED;;;;;;;;;;;GAWG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/commands/gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBpC;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmjB3D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"managedGateway.d.ts","sourceRoot":"","sources":["../../src/commands/managedGateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4hClE"}
|
|
@@ -1,4 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
37
|
};
|
|
@@ -783,5 +816,104 @@ Examples:
|
|
|
783
816
|
configRepository: (0, container_1.getContainer)().get(types_1.TYPES.ConfigRepository),
|
|
784
817
|
requireAuth: true,
|
|
785
818
|
}));
|
|
819
|
+
managedGatewayCommand
|
|
820
|
+
.command('haproxy-stats')
|
|
821
|
+
.description('Download HAProxy stats HTML from a managed gateway')
|
|
822
|
+
.alias('stats')
|
|
823
|
+
.option('-i, --id <id>', 'Gateway ID to download stats from')
|
|
824
|
+
.option('-o, --output <file>', 'Output file path (default: haproxy-stats.html)')
|
|
825
|
+
.option('-p, --port <port>', 'HAProxy stats port (default: 8404)')
|
|
826
|
+
.action((0, command_wrapper_1.wrapCommand)(async (options) => {
|
|
827
|
+
const container = (0, container_1.getContainer)();
|
|
828
|
+
const logger = container.get(types_1.TYPES.Logger);
|
|
829
|
+
const configRepository = container.get(types_1.TYPES.ConfigRepository);
|
|
830
|
+
const edgibleService = container.get(types_1.TYPES.EdgibleService);
|
|
831
|
+
(0, config_validator_1.validateConfig)(configRepository, {
|
|
832
|
+
requireAuth: true,
|
|
833
|
+
});
|
|
834
|
+
let gatewayId = options.id;
|
|
835
|
+
// If no gateway ID provided, let user select
|
|
836
|
+
if (!gatewayId) {
|
|
837
|
+
const listResponse = await edgibleService.listManagedGateways();
|
|
838
|
+
if (!listResponse.success || !listResponse.gateways || listResponse.gateways.length === 0) {
|
|
839
|
+
console.log(chalk_1.default.yellow('ā No managed gateways found'));
|
|
840
|
+
return;
|
|
841
|
+
}
|
|
842
|
+
const choices = listResponse.gateways.map((gateway) => ({
|
|
843
|
+
name: `${gateway.name} (${gateway.id})`,
|
|
844
|
+
value: gateway.id,
|
|
845
|
+
}));
|
|
846
|
+
const answer = await inquirer_1.default.prompt([
|
|
847
|
+
{
|
|
848
|
+
type: 'list',
|
|
849
|
+
name: 'gatewayId',
|
|
850
|
+
message: 'Select managed gateway:',
|
|
851
|
+
choices,
|
|
852
|
+
},
|
|
853
|
+
]);
|
|
854
|
+
gatewayId = answer.gatewayId;
|
|
855
|
+
}
|
|
856
|
+
const outputFile = options.output || 'haproxy-stats.html';
|
|
857
|
+
const statsPort = options.port || '8404';
|
|
858
|
+
logger.info('Downloading HAProxy stats', { gatewayId, outputFile, statsPort });
|
|
859
|
+
try {
|
|
860
|
+
if (!gatewayId) {
|
|
861
|
+
console.log(chalk_1.default.red('ā Gateway ID is required'));
|
|
862
|
+
return;
|
|
863
|
+
}
|
|
864
|
+
// First check if HAProxy is running and stats are available
|
|
865
|
+
const checkCommand = `curl -s -o /dev/null -w "%{http_code}" http://localhost:${statsPort}/stats`;
|
|
866
|
+
const checkResult = await edgibleService.executeManagedGatewayCommand(gatewayId, checkCommand);
|
|
867
|
+
if (!checkResult.success) {
|
|
868
|
+
console.log(chalk_1.default.red('ā Failed to check HAProxy stats availability'));
|
|
869
|
+
if (checkResult.error) {
|
|
870
|
+
console.log(chalk_1.default.red(` Error: ${checkResult.error}`));
|
|
871
|
+
}
|
|
872
|
+
return;
|
|
873
|
+
}
|
|
874
|
+
const httpCode = checkResult.output.trim();
|
|
875
|
+
if (httpCode !== '200') {
|
|
876
|
+
console.log(chalk_1.default.red(`ā HAProxy stats not accessible (HTTP ${httpCode})`));
|
|
877
|
+
console.log(chalk_1.default.yellow(` Hint: Check if HAProxy stats are enabled on port ${statsPort}`));
|
|
878
|
+
console.log(chalk_1.default.yellow(` Hint: Check HAPROXY_STATS_PORT environment variable on the gateway`));
|
|
879
|
+
console.log(chalk_1.default.yellow(` Hint: Verify HAProxy is running: edgible managed-gateway ssh --id ${gatewayId}`));
|
|
880
|
+
return;
|
|
881
|
+
}
|
|
882
|
+
console.log(chalk_1.default.blue('š Downloading HAProxy stats...'));
|
|
883
|
+
// Download the stats HTML
|
|
884
|
+
const downloadCommand = `curl -s http://localhost:${statsPort}/stats`;
|
|
885
|
+
const result = await edgibleService.executeManagedGatewayCommand(gatewayId, downloadCommand);
|
|
886
|
+
if (result.success) {
|
|
887
|
+
if (result.output.trim()) {
|
|
888
|
+
// Write to file
|
|
889
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs/promises')));
|
|
890
|
+
await fs.writeFile(outputFile, result.output, 'utf8');
|
|
891
|
+
console.log(chalk_1.default.green(`\nā HAProxy stats downloaded successfully!`));
|
|
892
|
+
console.log(chalk_1.default.white(` File: ${outputFile}`));
|
|
893
|
+
console.log(chalk_1.default.white(` Size: ${(result.output.length / 1024).toFixed(2)} KB`));
|
|
894
|
+
console.log(chalk_1.default.blue(`\nš” Open ${outputFile} in your browser to view the stats`));
|
|
895
|
+
}
|
|
896
|
+
else {
|
|
897
|
+
console.log(chalk_1.default.yellow('ā No stats data received'));
|
|
898
|
+
console.log(chalk_1.default.gray(' The stats page may be empty or HAProxy may not have any backends configured'));
|
|
899
|
+
}
|
|
900
|
+
}
|
|
901
|
+
else {
|
|
902
|
+
logger.error('Failed to download HAProxy stats', { error: result.error });
|
|
903
|
+
console.log(chalk_1.default.red('ā Failed to download HAProxy stats'));
|
|
904
|
+
if (result.error) {
|
|
905
|
+
console.log(chalk_1.default.red(` Error: ${result.error}`));
|
|
906
|
+
}
|
|
907
|
+
}
|
|
908
|
+
}
|
|
909
|
+
catch (error) {
|
|
910
|
+
logger.error('Error downloading HAProxy stats', error);
|
|
911
|
+
console.log(chalk_1.default.red('ā Error downloading HAProxy stats'));
|
|
912
|
+
throw error;
|
|
913
|
+
}
|
|
914
|
+
}, {
|
|
915
|
+
configRepository: (0, container_1.getContainer)().get(types_1.TYPES.ConfigRepository),
|
|
916
|
+
requireAuth: true,
|
|
917
|
+
}));
|
|
786
918
|
}
|
|
787
919
|
//# sourceMappingURL=managedGateway.js.map
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration validation utilities
|
|
3
|
+
* Centralizes config validation logic
|
|
4
|
+
*/
|
|
5
|
+
import { ConfigRepository } from '../../repositories/config-repository';
|
|
6
|
+
export interface ValidationOptions {
|
|
7
|
+
requireAuth?: boolean;
|
|
8
|
+
requireOrganization?: boolean;
|
|
9
|
+
requireDeviceId?: boolean;
|
|
10
|
+
requireEmail?: boolean;
|
|
11
|
+
requireAwsProfile?: boolean;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Validate configuration based on requirements
|
|
15
|
+
*/
|
|
16
|
+
export declare function validateConfig(configRepository: ConfigRepository, options?: ValidationOptions): void;
|
|
17
|
+
/**
|
|
18
|
+
* Get organization ID or throw error
|
|
19
|
+
*/
|
|
20
|
+
export declare function requireOrganizationId(configRepository: ConfigRepository): string;
|
|
21
|
+
/**
|
|
22
|
+
* Get device ID or throw error
|
|
23
|
+
*/
|
|
24
|
+
export declare function requireDeviceId(configRepository: ConfigRepository): string;
|
|
25
|
+
/**
|
|
26
|
+
* Get email or throw error
|
|
27
|
+
*/
|
|
28
|
+
export declare function requireEmail(configRepository: ConfigRepository): string;
|
|
29
|
+
//# sourceMappingURL=config-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-validator.d.ts","sourceRoot":"","sources":["../../../src/commands/utils/config-validator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAGxE,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,gBAAgB,EAAE,gBAAgB,EAClC,OAAO,GAAE,iBAAsB,GAC9B,IAAI,CA2CN;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,MAAM,CAMhF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,MAAM,CAM1E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,MAAM,CAMvE"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared gateway selection utilities
|
|
3
|
+
* Eliminates duplication across commands
|
|
4
|
+
*/
|
|
5
|
+
import { GatewayService } from '../../services/gateway/GatewayService';
|
|
6
|
+
export interface GatewaySelectionOptions {
|
|
7
|
+
allowNone?: boolean;
|
|
8
|
+
message?: string;
|
|
9
|
+
required?: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Prompt user to select a gateway from available gateways
|
|
13
|
+
*/
|
|
14
|
+
export declare function promptGatewaySelection(gatewayService: GatewayService, options?: GatewaySelectionOptions): Promise<string | null>;
|
|
15
|
+
/**
|
|
16
|
+
* Get gateway by ID, or prompt if not provided
|
|
17
|
+
*/
|
|
18
|
+
export declare function getGatewayId(gatewayService: GatewayService, providedId: string | undefined, options?: GatewaySelectionOptions): Promise<string | null>;
|
|
19
|
+
/**
|
|
20
|
+
* Validate gateway exists
|
|
21
|
+
*/
|
|
22
|
+
export declare function validateGatewayExists(gatewayService: GatewayService, gatewayId: string): Promise<boolean>;
|
|
23
|
+
//# sourceMappingURL=gateway-prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-prompt.d.ts","sourceRoot":"","sources":["../../../src/commands/utils/gateway-prompt.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,cAAc,EAAqB,MAAM,uCAAuC,CAAC;AAE1F,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,cAAc,EAAE,cAAc,EAC9B,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA4CxB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAMxB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAOlB"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input parsing utilities
|
|
3
|
+
* Converts string inputs to proper types and validates them
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
/**
|
|
7
|
+
* Parse port from string
|
|
8
|
+
*/
|
|
9
|
+
export declare function parsePort(value: string | number | undefined): number;
|
|
10
|
+
/**
|
|
11
|
+
* Parse protocol from string
|
|
12
|
+
*/
|
|
13
|
+
export declare function parseProtocol(value: string | undefined): 'http' | 'https' | 'tcp' | 'udp';
|
|
14
|
+
/**
|
|
15
|
+
* Parse device ID from string
|
|
16
|
+
*/
|
|
17
|
+
export declare function parseDeviceId(value: string | undefined): string;
|
|
18
|
+
/**
|
|
19
|
+
* Parse gateway IDs from comma-separated string
|
|
20
|
+
*/
|
|
21
|
+
export declare function parseGatewayIds(value: string | undefined): string[];
|
|
22
|
+
/**
|
|
23
|
+
* Parse boolean from string or boolean
|
|
24
|
+
*/
|
|
25
|
+
export declare function parseBoolean(value: string | boolean | undefined): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Parse number from string with validation
|
|
28
|
+
*/
|
|
29
|
+
export declare function parseNumber(value: string | number | undefined, min?: number, max?: number): number;
|
|
30
|
+
/**
|
|
31
|
+
* Parse and validate command options
|
|
32
|
+
*/
|
|
33
|
+
export declare function parseCommandOptions<T>(schema: z.ZodSchema<T>, options: Record<string, unknown>): T;
|
|
34
|
+
//# sourceMappingURL=input-parser.d.ts.map
|