Refactor error logging to use getErrorMessage utility

- Updated multiple classes to replace direct error message access with getErrorMessage function for improved error handling and consistency.
- Modified error logging in CertRequirementManager, CloudflareDomainSync, OneboxDnsManager, OneboxDockerManager, OneboxHttpServer, Onebox, OneboxRegistriesManager, and OneboxServicesManager.
- Ensured that all error messages logged provide a standardized format and improved clarity.
This commit is contained in:
2025-11-25 04:38:26 +00:00
parent 8ebd677478
commit c59d56e70a
9 changed files with 159 additions and 149 deletions

View File

@@ -7,6 +7,7 @@
import * as plugins from '../plugins.ts';
import { logger } from '../logging.ts';
import { getErrorMessage } from '../utils/error.ts';
import { OneboxDatabase } from './database.ts';
import { OneboxSslManager } from './ssl.ts';
import type { ICertRequirement, ICertificate, IDomain } from '../types.ts';
@@ -42,12 +43,12 @@ export class CertRequirementManager {
await this.processRequirement(requirement);
} catch (error) {
logger.error(
`Failed to process requirement ${requirement.id}: ${error.message}`
`Failed to process requirement ${requirement.id}: ${getErrorMessage(error)}`
);
}
}
} catch (error) {
logger.error(`Failed to process pending requirements: ${error.message}`);
logger.error(`Failed to process pending requirements: ${getErrorMessage(error)}`);
}
}
@@ -169,7 +170,7 @@ export class CertRequirementManager {
logger.success(`Certificate acquired for ${fullDomain}`);
} catch (error) {
logger.error(`Failed to acquire certificate for ${fullDomain}: ${error.message}`);
logger.error(`Failed to acquire certificate for ${fullDomain}: ${getErrorMessage(error)}`);
throw error;
}
}
@@ -203,7 +204,7 @@ export class CertRequirementManager {
}
}
} catch (error) {
logger.error(`Failed to check certificate renewal: ${error.message}`);
logger.error(`Failed to check certificate renewal: ${getErrorMessage(error)}`);
}
}
@@ -252,7 +253,7 @@ export class CertRequirementManager {
logger.success(`Certificate renewed for ${cert.certDomain}`);
} catch (error) {
logger.error(`Failed to renew certificate for ${cert.certDomain}: ${error.message}`);
logger.error(`Failed to renew certificate for ${cert.certDomain}: ${getErrorMessage(error)}`);
}
}
@@ -278,7 +279,7 @@ export class CertRequirementManager {
await Deno.remove(cert.fullChainPath);
} catch (error) {
logger.debug(
`Failed to delete certificate files for ${cert.certDomain}: ${error.message}`
`Failed to delete certificate files for ${cert.certDomain}: ${getErrorMessage(error)}`
);
}
@@ -298,7 +299,7 @@ export class CertRequirementManager {
logger.info(`Cleaned up ${deletedCount} old certificate(s)`);
}
} catch (error) {
logger.error(`Failed to cleanup old certificates: ${error.message}`);
logger.error(`Failed to cleanup old certificates: ${getErrorMessage(error)}`);
}
}

View File

@@ -7,6 +7,7 @@
import * as plugins from '../plugins.ts';
import { logger } from '../logging.ts';
import { getErrorMessage } from '../utils/error.ts';
import { OneboxDatabase } from './database.ts';
import type { IDomain } from '../types.ts';
@@ -33,7 +34,7 @@ export class CloudflareDomainSync {
this.cloudflareAccount = new plugins.cloudflare.CloudflareAccount(apiKey);
logger.info('Cloudflare domain sync initialized');
} catch (error) {
logger.error(`Failed to initialize Cloudflare sync: ${error.message}`);
logger.error(`Failed to initialize Cloudflare sync: ${getErrorMessage(error)}`);
throw error;
}
}
@@ -98,7 +99,7 @@ export class CloudflareDomainSync {
logger.info(`Added new domain from Cloudflare: ${domain}`);
}
} catch (error) {
logger.error(`Failed to sync zone ${zone.name}: ${error.message}`);
logger.error(`Failed to sync zone ${zone.name}: ${getErrorMessage(error)}`);
}
}
@@ -107,7 +108,7 @@ export class CloudflareDomainSync {
logger.success(`Cloudflare zone sync completed: ${zones.length} zone(s) synced`);
} catch (error) {
logger.error(`Cloudflare zone sync failed: ${error.message}`);
logger.error(`Cloudflare zone sync failed: ${getErrorMessage(error)}`);
throw error;
}
}
@@ -138,7 +139,7 @@ export class CloudflareDomainSync {
logger.info(`Marked ${obsoleteCount} domain(s) as obsolete`);
}
} catch (error) {
logger.error(`Failed to mark obsolete domains: ${error.message}`);
logger.error(`Failed to mark obsolete domains: ${getErrorMessage(error)}`);
}
}

View File

@@ -6,6 +6,7 @@
import Cloudflare from 'npm:cloudflare@5.2.0';
import { logger } from '../logging.ts';
import { getErrorMessage } from '../utils/error.ts';
import { OneboxDatabase } from './database.ts';
export class OneboxDnsManager {
@@ -64,8 +65,9 @@ export class OneboxDnsManager {
}
logger.success('DNS manager initialized with multi-zone support');
} catch (error) {
logger.error(`Failed to initialize DNS manager: ${error.message}`);
if (error.message && error.message.includes('Authorization header')) {
logger.error(`Failed to initialize DNS manager: ${getErrorMessage(error)}`);
const errMsg = getErrorMessage(error);
if (errMsg && errMsg.includes('Authorization header')) {
logger.error('The provided API key appears to be invalid.');
logger.error('Make sure you are using a Cloudflare API TOKEN (not the global API key).');
logger.info('Create an API Token at: https://dash.cloudflare.com/profile/api-tokens');
@@ -153,7 +155,7 @@ export class OneboxDnsManager {
logger.success(`DNS record created for ${domain}${targetIP}`);
} catch (error) {
logger.error(`Failed to add DNS record for ${domain}: ${error.message}`);
logger.error(`Failed to add DNS record for ${domain}: ${getErrorMessage(error)}`);
throw error;
}
}
@@ -194,7 +196,7 @@ export class OneboxDnsManager {
logger.success(`DNS record removed for ${domain}`);
} catch (error) {
logger.error(`Failed to remove DNS record for ${domain}: ${error.message}`);
logger.error(`Failed to remove DNS record for ${domain}: ${getErrorMessage(error)}`);
throw error;
}
}
@@ -224,7 +226,7 @@ export class OneboxDnsManager {
return null;
} catch (error) {
logger.error(`Failed to get DNS record for ${domain}: ${error.message}`);
logger.error(`Failed to get DNS record for ${domain}: ${getErrorMessage(error)}`);
return null;
}
}
@@ -247,7 +249,7 @@ export class OneboxDnsManager {
updatedAt: Number(row.updated_at || row[7]),
}));
} catch (error) {
logger.error(`Failed to list DNS records: ${error.message}`);
logger.error(`Failed to list DNS records: ${getErrorMessage(error)}`);
return [];
}
}
@@ -295,7 +297,7 @@ export class OneboxDnsManager {
logger.success('DNS records synced from Cloudflare');
} catch (error) {
logger.error(`Failed to sync DNS records: ${error.message}`);
logger.error(`Failed to sync DNS records: ${getErrorMessage(error)}`);
throw error;
}
}
@@ -331,7 +333,7 @@ export class OneboxDnsManager {
return false;
}
} catch (error) {
logger.error(`Failed to check DNS for ${domain}: ${error.message}`);
logger.error(`Failed to check DNS for ${domain}: ${getErrorMessage(error)}`);
return false;
}
}

View File

@@ -7,6 +7,7 @@
import * as plugins from '../plugins.ts';
import type { IService, IContainerStats } from '../types.ts';
import { logger } from '../logging.ts';
import { getErrorMessage } from '../utils/error.ts';
export class OneboxDockerManager {
private dockerClient: plugins.docker.Docker | null = null;
@@ -30,7 +31,7 @@ export class OneboxDockerManager {
// Ensure onebox network exists
await this.ensureNetwork();
} catch (error) {
logger.error(`Failed to initialize Docker client: ${error.message}`);
logger.error(`Failed to initialize Docker client: ${getErrorMessage(error)}`);
throw error;
}
}
@@ -68,7 +69,7 @@ export class OneboxDockerManager {
logger.debug(`Docker network already exists: ${this.networkName}`);
}
} catch (error) {
logger.error(`Failed to create Docker network: ${error.message}`);
logger.error(`Failed to create Docker network: ${getErrorMessage(error)}`);
throw error;
}
}
@@ -102,7 +103,7 @@ export class OneboxDockerManager {
return await this.createStandaloneContainer(service);
}
} catch (error) {
logger.error(`Failed to create container for ${service.name}: ${error.message}`);
logger.error(`Failed to create container for ${service.name}: ${getErrorMessage(error)}`);
throw error;
}
}
@@ -257,11 +258,11 @@ export class OneboxDockerManager {
logger.success(`Container started: ${containerID}`);
} catch (error) {
// Ignore "already started" errors (304 status)
if (error.message.includes('304')) {
if (getErrorMessage(error).includes('304')) {
logger.debug(`Container already running: ${containerID}`);
return;
}
logger.error(`Failed to start container ${containerID}: ${error.message}`);
logger.error(`Failed to start container ${containerID}: ${getErrorMessage(error)}`);
throw error;
}
}
@@ -331,11 +332,11 @@ export class OneboxDockerManager {
logger.success(`Container stopped: ${containerID}`);
} catch (error) {
// Ignore "already stopped" errors (304 status)
if (error.message.includes('304')) {
if (getErrorMessage(error).includes('304')) {
logger.debug(`Container already stopped: ${containerID}`);
return;
}
logger.error(`Failed to stop container ${containerID}: ${error.message}`);
logger.error(`Failed to stop container ${containerID}: ${getErrorMessage(error)}`);
throw error;
}
}
@@ -392,7 +393,7 @@ export class OneboxDockerManager {
logger.success(`Container restarted: ${containerID}`);
} catch (error) {
logger.error(`Failed to restart container ${containerID}: ${error.message}`);
logger.error(`Failed to restart container ${containerID}: ${getErrorMessage(error)}`);
throw error;
}
}
@@ -446,7 +447,7 @@ export class OneboxDockerManager {
await this.stopContainer(containerID);
} catch (error) {
// Ignore stop errors
logger.debug(`Error stopping container before removal: ${error.message}`);
logger.debug(`Error stopping container before removal: ${getErrorMessage(error)}`);
}
}
@@ -459,7 +460,7 @@ export class OneboxDockerManager {
logger.success(`Container removed: ${containerID}`);
} catch (error) {
logger.error(`Failed to remove container ${containerID}: ${error.message}`);
logger.error(`Failed to remove container ${containerID}: ${getErrorMessage(error)}`);
throw error;
}
}
@@ -497,7 +498,7 @@ export class OneboxDockerManager {
return response.body.State?.Status || 'unknown';
} catch (error) {
logger.error(`Failed to get container status ${containerID}: ${error.message}`);
logger.error(`Failed to get container status ${containerID}: ${getErrorMessage(error)}`);
return 'unknown';
}
}
@@ -566,7 +567,7 @@ export class OneboxDockerManager {
return 'unknown';
}
} catch (error) {
logger.error(`Failed to get service status ${serviceID}: ${error.message}`);
logger.error(`Failed to get service status ${serviceID}: ${getErrorMessage(error)}`);
return 'unknown';
}
}
@@ -624,8 +625,9 @@ export class OneboxDockerManager {
};
} catch (error) {
// Don't log errors for container not found - this is expected for Swarm services
if (!error.message.includes('No such container') && !error.message.includes('not found')) {
logger.error(`Failed to get container stats ${containerID}: ${error.message}`);
const errMsg = getErrorMessage(error);
if (!errMsg.includes('No such container') && !errMsg.includes('not found')) {
logger.error(`Failed to get container stats ${containerID}: ${errMsg}`);
}
return null;
}
@@ -653,7 +655,7 @@ export class OneboxDockerManager {
return null;
} catch (error) {
logger.warn(`Failed to get container ID for service ${serviceId}: ${error.message}`);
logger.warn(`Failed to get container ID for service ${serviceId}: ${getErrorMessage(error)}`);
return null;
}
}
@@ -707,7 +709,7 @@ export class OneboxDockerManager {
stderr: '', // v5 combines stdout/stderr into single string
};
} catch (error) {
logger.error(`Failed to get container logs ${containerID}: ${error.message}`);
logger.error(`Failed to get container logs ${containerID}: ${getErrorMessage(error)}`);
return { stdout: '', stderr: '' };
}
}
@@ -723,7 +725,7 @@ export class OneboxDockerManager {
c.Labels && c.Labels['managed-by'] === 'onebox'
);
} catch (error) {
logger.error(`Failed to list containers: ${error.message}`);
logger.error(`Failed to list containers: ${getErrorMessage(error)}`);
return [];
}
}
@@ -763,7 +765,7 @@ export class OneboxDockerManager {
await this.dockerClient!.pruneImages();
logger.success('Unused images pruned successfully');
} catch (error) {
logger.error(`Failed to prune images: ${error.message}`);
logger.error(`Failed to prune images: ${getErrorMessage(error)}`);
throw error;
}
}
@@ -788,7 +790,7 @@ export class OneboxDockerManager {
return null;
} catch (error) {
logger.error(`Failed to get container IP ${containerID}: ${error.message}`);
logger.error(`Failed to get container IP ${containerID}: ${getErrorMessage(error)}`);
return null;
}
}
@@ -837,7 +839,7 @@ export class OneboxDockerManager {
return { stdout, stderr, exitCode };
} catch (error) {
logger.error(`Failed to exec in container ${containerID}: ${error.message}`);
logger.error(`Failed to exec in container ${containerID}: ${getErrorMessage(error)}`);
throw error;
}
}
@@ -922,7 +924,7 @@ export class OneboxDockerManager {
logger.success(`Platform container ${options.name} started successfully`);
return containerID;
} catch (error) {
logger.error(`Failed to create platform container ${options.name}: ${error.message}`);
logger.error(`Failed to create platform container ${options.name}: ${getErrorMessage(error)}`);
throw error;
}
}

View File

@@ -6,6 +6,7 @@
import * as plugins from '../plugins.ts';
import { logger } from '../logging.ts';
import { getErrorMessage } from '../utils/error.ts';
import type { Onebox } from './onebox.ts';
import type { IApiResponse, ICreateRegistryTokenRequest, IRegistryTokenView } from '../types.ts';
@@ -37,7 +38,7 @@ export class OneboxHttpServer {
logger.success(`HTTP server started on http://localhost:${this.port}`);
} catch (error) {
logger.error(`Failed to start HTTP server: ${error.message}`);
logger.error(`Failed to start HTTP server: ${getErrorMessage(error)}`);
throw error;
}
}
@@ -56,7 +57,7 @@ export class OneboxHttpServer {
this.server = null;
logger.success('HTTP server stopped');
} catch (error) {
logger.error(`Failed to stop HTTP server: ${error.message}`);
logger.error(`Failed to stop HTTP server: ${getErrorMessage(error)}`);
throw error;
}
}
@@ -95,8 +96,8 @@ export class OneboxHttpServer {
// Serve Angular UI
return await this.serveStaticFile(path);
} catch (error) {
logger.error(`Request error: ${error.message}`);
return this.jsonResponse({ success: false, error: error.message }, 500);
logger.error(`Request error: ${getErrorMessage(error)}`);
return this.jsonResponse({ success: false, error: getErrorMessage(error) }, 500);
}
}
@@ -339,7 +340,7 @@ export class OneboxHttpServer {
},
});
} catch (error) {
logger.error(`Login error: ${error.message}`);
logger.error(`Login error: ${getErrorMessage(error)}`);
return this.jsonResponse({ success: false, error: 'Login failed' }, 500);
}
}
@@ -349,8 +350,8 @@ export class OneboxHttpServer {
const status = await this.oneboxRef.getSystemStatus();
return this.jsonResponse({ success: true, data: status });
} catch (error) {
logger.error(`Failed to get system status: ${error.message}`);
return this.jsonResponse({ success: false, error: error.message || 'Failed to get system status' }, 500);
logger.error(`Failed to get system status: ${getErrorMessage(error)}`);
return this.jsonResponse({ success: false, error: getErrorMessage(error) || 'Failed to get system status' }, 500);
}
}
@@ -359,8 +360,8 @@ export class OneboxHttpServer {
const services = this.oneboxRef.services.listServices();
return this.jsonResponse({ success: true, data: services });
} catch (error) {
logger.error(`Failed to list services: ${error.message}`);
return this.jsonResponse({ success: false, error: error.message || 'Failed to list services' }, 500);
logger.error(`Failed to list services: ${getErrorMessage(error)}`);
return this.jsonResponse({ success: false, error: getErrorMessage(error) || 'Failed to list services' }, 500);
}
}
@@ -374,8 +375,8 @@ export class OneboxHttpServer {
return this.jsonResponse({ success: true, data: service });
} catch (error) {
logger.error(`Failed to deploy service: ${error.message}`);
return this.jsonResponse({ success: false, error: error.message || 'Failed to deploy service' }, 500);
logger.error(`Failed to deploy service: ${getErrorMessage(error)}`);
return this.jsonResponse({ success: false, error: getErrorMessage(error) || 'Failed to deploy service' }, 500);
}
}
@@ -387,8 +388,8 @@ export class OneboxHttpServer {
}
return this.jsonResponse({ success: true, data: service });
} catch (error) {
logger.error(`Failed to get service ${name}: ${error.message}`);
return this.jsonResponse({ success: false, error: error.message || 'Failed to get service' }, 500);
logger.error(`Failed to get service ${name}: ${getErrorMessage(error)}`);
return this.jsonResponse({ success: false, error: getErrorMessage(error) || 'Failed to get service' }, 500);
}
}
@@ -417,8 +418,8 @@ export class OneboxHttpServer {
return this.jsonResponse({ success: true, data: service });
} catch (error) {
logger.error(`Failed to update service ${name}: ${error.message}`);
return this.jsonResponse({ success: false, error: error.message || 'Failed to update service' }, 500);
logger.error(`Failed to update service ${name}: ${getErrorMessage(error)}`);
return this.jsonResponse({ success: false, error: getErrorMessage(error) || 'Failed to update service' }, 500);
}
}
@@ -431,8 +432,8 @@ export class OneboxHttpServer {
return this.jsonResponse({ success: true, message: 'Service removed' });
} catch (error) {
logger.error(`Failed to delete service ${name}: ${error.message}`);
return this.jsonResponse({ success: false, error: error.message || 'Failed to delete service' }, 500);
logger.error(`Failed to delete service ${name}: ${getErrorMessage(error)}`);
return this.jsonResponse({ success: false, error: getErrorMessage(error) || 'Failed to delete service' }, 500);
}
}
@@ -445,8 +446,8 @@ export class OneboxHttpServer {
return this.jsonResponse({ success: true, message: 'Service started' });
} catch (error) {
logger.error(`Failed to start service ${name}: ${error.message}`);
return this.jsonResponse({ success: false, error: error.message || 'Failed to start service' }, 500);
logger.error(`Failed to start service ${name}: ${getErrorMessage(error)}`);
return this.jsonResponse({ success: false, error: getErrorMessage(error) || 'Failed to start service' }, 500);
}
}
@@ -459,8 +460,8 @@ export class OneboxHttpServer {
return this.jsonResponse({ success: true, message: 'Service stopped' });
} catch (error) {
logger.error(`Failed to stop service ${name}: ${error.message}`);
return this.jsonResponse({ success: false, error: error.message || 'Failed to stop service' }, 500);
logger.error(`Failed to stop service ${name}: ${getErrorMessage(error)}`);
return this.jsonResponse({ success: false, error: getErrorMessage(error) || 'Failed to stop service' }, 500);
}
}
@@ -473,8 +474,8 @@ export class OneboxHttpServer {
return this.jsonResponse({ success: true, message: 'Service restarted' });
} catch (error) {
logger.error(`Failed to restart service ${name}: ${error.message}`);
return this.jsonResponse({ success: false, error: error.message || 'Failed to restart service' }, 500);
logger.error(`Failed to restart service ${name}: ${getErrorMessage(error)}`);
return this.jsonResponse({ success: false, error: getErrorMessage(error) || 'Failed to restart service' }, 500);
}
}
@@ -485,8 +486,8 @@ export class OneboxHttpServer {
logger.log(`handleGetLogsRequest: logs value = ${String(logs).slice(0, 100)}`);
return this.jsonResponse({ success: true, data: logs });
} catch (error) {
logger.error(`Failed to get logs for service ${name}: ${error.message}`);
return this.jsonResponse({ success: false, error: error.message || 'Failed to get logs' }, 500);
logger.error(`Failed to get logs for service ${name}: ${getErrorMessage(error)}`);
return this.jsonResponse({ success: false, error: getErrorMessage(error) || 'Failed to get logs' }, 500);
}
}
@@ -540,7 +541,7 @@ export class OneboxHttpServer {
message: 'Settings updated successfully'
});
} catch (error) {
logger.error(`Failed to update settings: ${error.message}`);
logger.error(`Failed to update settings: ${getErrorMessage(error)}`);
return this.jsonResponse({ success: false, error: 'Failed to update settings' }, 500);
}
}
@@ -564,8 +565,8 @@ export class OneboxHttpServer {
message: `Certificate obtained for ${domain}`,
});
} catch (error) {
logger.error(`Failed to obtain certificate: ${error.message}`);
return this.jsonResponse({ success: false, error: error.message || 'Failed to obtain certificate' }, 500);
logger.error(`Failed to obtain certificate: ${getErrorMessage(error)}`);
return this.jsonResponse({ success: false, error: getErrorMessage(error) || 'Failed to obtain certificate' }, 500);
}
}
@@ -574,8 +575,8 @@ export class OneboxHttpServer {
const certificates = this.oneboxRef.ssl.listCertificates();
return this.jsonResponse({ success: true, data: certificates });
} catch (error) {
logger.error(`Failed to list certificates: ${error.message}`);
return this.jsonResponse({ success: false, error: error.message || 'Failed to list certificates' }, 500);
logger.error(`Failed to list certificates: ${getErrorMessage(error)}`);
return this.jsonResponse({ success: false, error: getErrorMessage(error) || 'Failed to list certificates' }, 500);
}
}
@@ -587,8 +588,8 @@ export class OneboxHttpServer {
}
return this.jsonResponse({ success: true, data: certificate });
} catch (error) {
logger.error(`Failed to get certificate for ${domain}: ${error.message}`);
return this.jsonResponse({ success: false, error: error.message || 'Failed to get certificate' }, 500);
logger.error(`Failed to get certificate for ${domain}: ${getErrorMessage(error)}`);
return this.jsonResponse({ success: false, error: getErrorMessage(error) || 'Failed to get certificate' }, 500);
}
}
@@ -600,8 +601,8 @@ export class OneboxHttpServer {
message: `Certificate renewed for ${domain}`,
});
} catch (error) {
logger.error(`Failed to renew certificate for ${domain}: ${error.message}`);
return this.jsonResponse({ success: false, error: error.message || 'Failed to renew certificate' }, 500);
logger.error(`Failed to renew certificate for ${domain}: ${getErrorMessage(error)}`);
return this.jsonResponse({ success: false, error: getErrorMessage(error) || 'Failed to renew certificate' }, 500);
}
}
@@ -661,10 +662,10 @@ export class OneboxHttpServer {
return this.jsonResponse({ success: true, data: domainViews });
} catch (error) {
logger.error(`Failed to get domains: ${error.message}`);
logger.error(`Failed to get domains: ${getErrorMessage(error)}`);
return this.jsonResponse({
success: false,
error: error.message || 'Failed to get domains',
error: getErrorMessage(error) || 'Failed to get domains',
}, 500);
}
}
@@ -685,10 +686,10 @@ export class OneboxHttpServer {
message: 'Cloudflare zones synced successfully',
});
} catch (error) {
logger.error(`Failed to sync Cloudflare zones: ${error.message}`);
logger.error(`Failed to sync Cloudflare zones: ${getErrorMessage(error)}`);
return this.jsonResponse({
success: false,
error: error.message || 'Failed to sync Cloudflare zones',
error: getErrorMessage(error) || 'Failed to sync Cloudflare zones',
}, 500);
}
}
@@ -737,10 +738,10 @@ export class OneboxHttpServer {
return this.jsonResponse({ success: true, data: domainDetail });
} catch (error) {
logger.error(`Failed to get domain detail for ${domainName}: ${error.message}`);
logger.error(`Failed to get domain detail for ${domainName}: ${getErrorMessage(error)}`);
return this.jsonResponse({
success: false,
error: error.message || 'Failed to get domain detail',
error: getErrorMessage(error) || 'Failed to get domain detail',
}, 500);
}
}
@@ -750,10 +751,10 @@ export class OneboxHttpServer {
const records = this.oneboxRef.dns.listDNSRecords();
return this.jsonResponse({ success: true, data: records });
} catch (error) {
logger.error(`Failed to get DNS records: ${error.message}`);
logger.error(`Failed to get DNS records: ${getErrorMessage(error)}`);
return this.jsonResponse({
success: false,
error: error.message || 'Failed to get DNS records',
error: getErrorMessage(error) || 'Failed to get DNS records',
}, 500);
}
}
@@ -777,10 +778,10 @@ export class OneboxHttpServer {
message: `DNS record created for ${domain}`,
});
} catch (error) {
logger.error(`Failed to create DNS record: ${error.message}`);
logger.error(`Failed to create DNS record: ${getErrorMessage(error)}`);
return this.jsonResponse({
success: false,
error: error.message || 'Failed to create DNS record',
error: getErrorMessage(error) || 'Failed to create DNS record',
}, 500);
}
}
@@ -794,10 +795,10 @@ export class OneboxHttpServer {
message: `DNS record deleted for ${domain}`,
});
} catch (error) {
logger.error(`Failed to delete DNS record for ${domain}: ${error.message}`);
logger.error(`Failed to delete DNS record for ${domain}: ${getErrorMessage(error)}`);
return this.jsonResponse({
success: false,
error: error.message || 'Failed to delete DNS record',
error: getErrorMessage(error) || 'Failed to delete DNS record',
}, 500);
}
}
@@ -818,10 +819,10 @@ export class OneboxHttpServer {
message: 'DNS records synced from Cloudflare',
});
} catch (error) {
logger.error(`Failed to sync DNS records: ${error.message}`);
logger.error(`Failed to sync DNS records: ${getErrorMessage(error)}`);
return this.jsonResponse({
success: false,
error: error.message || 'Failed to sync DNS records',
error: getErrorMessage(error) || 'Failed to sync DNS records',
}, 500);
}
}
@@ -953,9 +954,9 @@ export class OneboxHttpServer {
});
logStream.on('error', (error: Error) => {
logger.error(`Log stream error for ${serviceName}: ${error.message}`);
logger.error(`Log stream error for ${serviceName}: ${getErrorMessage(error)}`);
if (socket.readyState === WebSocket.OPEN) {
socket.send(JSON.stringify({ error: error.message }));
socket.send(JSON.stringify({ error: getErrorMessage(error) }));
}
});
@@ -971,9 +972,9 @@ export class OneboxHttpServer {
};
} catch (error) {
logger.error(`Failed to start log stream for ${serviceName}: ${error.message}`);
logger.error(`Failed to start log stream for ${serviceName}: ${getErrorMessage(error)}`);
if (socket.readyState === WebSocket.OPEN) {
socket.send(JSON.stringify({ error: error.message }));
socket.send(JSON.stringify({ error: getErrorMessage(error) }));
socket.close();
}
}
@@ -1004,7 +1005,7 @@ export class OneboxHttpServer {
failCount++;
}
} catch (error) {
logger.error(`Failed to send to WebSocket client: ${error.message}`);
logger.error(`Failed to send to WebSocket client: ${getErrorMessage(error)}`);
this.wsClients.delete(client);
failCount++;
}
@@ -1074,10 +1075,10 @@ export class OneboxHttpServer {
return this.jsonResponse({ success: true, data: result });
} catch (error) {
logger.error(`Failed to list platform services: ${error.message}`);
logger.error(`Failed to list platform services: ${getErrorMessage(error)}`);
return this.jsonResponse({
success: false,
error: error.message || 'Failed to list platform services',
error: getErrorMessage(error) || 'Failed to list platform services',
}, 500);
}
}
@@ -1114,10 +1115,10 @@ export class OneboxHttpServer {
},
});
} catch (error) {
logger.error(`Failed to get platform service ${type}: ${error.message}`);
logger.error(`Failed to get platform service ${type}: ${getErrorMessage(error)}`);
return this.jsonResponse({
success: false,
error: error.message || 'Failed to get platform service',
error: getErrorMessage(error) || 'Failed to get platform service',
}, 500);
}
}
@@ -1145,10 +1146,10 @@ export class OneboxHttpServer {
},
});
} catch (error) {
logger.error(`Failed to start platform service ${type}: ${error.message}`);
logger.error(`Failed to start platform service ${type}: ${getErrorMessage(error)}`);
return this.jsonResponse({
success: false,
error: error.message || 'Failed to start platform service',
error: getErrorMessage(error) || 'Failed to start platform service',
}, 500);
}
}
@@ -1171,10 +1172,10 @@ export class OneboxHttpServer {
message: `Platform service ${provider.displayName} stopped`,
});
} catch (error) {
logger.error(`Failed to stop platform service ${type}: ${error.message}`);
logger.error(`Failed to stop platform service ${type}: ${getErrorMessage(error)}`);
return this.jsonResponse({
success: false,
error: error.message || 'Failed to stop platform service',
error: getErrorMessage(error) || 'Failed to stop platform service',
}, 500);
}
}
@@ -1220,10 +1221,10 @@ export class OneboxHttpServer {
data: formattedResources,
});
} catch (error) {
logger.error(`Failed to get platform resources for service ${serviceName}: ${error.message}`);
logger.error(`Failed to get platform resources for service ${serviceName}: ${getErrorMessage(error)}`);
return this.jsonResponse({
success: false,
error: error.message || 'Failed to get platform resources',
error: getErrorMessage(error) || 'Failed to get platform resources',
}, 500);
}
}
@@ -1235,10 +1236,10 @@ export class OneboxHttpServer {
const tags = await this.oneboxRef.registry.getImageTags(serviceName);
return this.jsonResponse({ success: true, data: tags });
} catch (error) {
logger.error(`Failed to get registry tags for ${serviceName}: ${error.message}`);
logger.error(`Failed to get registry tags for ${serviceName}: ${getErrorMessage(error)}`);
return this.jsonResponse({
success: false,
error: error.message || 'Failed to get registry tags',
error: getErrorMessage(error) || 'Failed to get registry tags',
}, 500);
}
}
@@ -1282,10 +1283,10 @@ export class OneboxHttpServer {
return this.jsonResponse({ success: true, data: tokenViews });
} catch (error) {
logger.error(`Failed to list registry tokens: ${error.message}`);
logger.error(`Failed to list registry tokens: ${getErrorMessage(error)}`);
return this.jsonResponse({
success: false,
error: error.message || 'Failed to list registry tokens',
error: getErrorMessage(error) || 'Failed to list registry tokens',
}, 500);
}
}
@@ -1412,10 +1413,10 @@ export class OneboxHttpServer {
},
});
} catch (error) {
logger.error(`Failed to create registry token: ${error.message}`);
logger.error(`Failed to create registry token: ${getErrorMessage(error)}`);
return this.jsonResponse({
success: false,
error: error.message || 'Failed to create registry token',
error: getErrorMessage(error) || 'Failed to create registry token',
}, 500);
}
}
@@ -1439,10 +1440,10 @@ export class OneboxHttpServer {
message: 'Token deleted successfully',
});
} catch (error) {
logger.error(`Failed to delete registry token ${tokenId}: ${error.message}`);
logger.error(`Failed to delete registry token ${tokenId}: ${getErrorMessage(error)}`);
return this.jsonResponse({
success: false,
error: error.message || 'Failed to delete registry token',
error: getErrorMessage(error) || 'Failed to delete registry token',
}, 500);
}
}

View File

@@ -5,6 +5,7 @@
*/
import { logger } from '../logging.ts';
import { getErrorMessage } from '../utils/error.ts';
import { OneboxDatabase } from './database.ts';
import { OneboxDockerManager } from './docker.ts';
import { OneboxServicesManager } from './services.ts';
@@ -108,7 +109,7 @@ export class Onebox {
await this.registry.init();
} catch (error) {
logger.warn('Onebox Registry initialization failed - local registry will be disabled');
logger.warn(`Error: ${error.message}`);
logger.warn(`Error: ${getErrorMessage(error)}`);
}
// Initialize Platform Services (non-critical)
@@ -116,7 +117,7 @@ export class Onebox {
await this.platformServices.init();
} catch (error) {
logger.warn('Platform services initialization failed - MongoDB/S3 features will be limited');
logger.warn(`Error: ${error.message}`);
logger.warn(`Error: ${getErrorMessage(error)}`);
}
// Login to all registries
@@ -128,7 +129,7 @@ export class Onebox {
this.initialized = true;
logger.success('Onebox initialized successfully');
} catch (error) {
logger.error(`Failed to initialize Onebox: ${error.message}`);
logger.error(`Failed to initialize Onebox: ${getErrorMessage(error)}`);
throw error;
}
}
@@ -158,7 +159,7 @@ export class Onebox {
logger.warn('IMPORTANT: Change the default password immediately!');
}
} catch (error) {
logger.error(`Failed to create default user: ${error.message}`);
logger.error(`Failed to create default user: ${getErrorMessage(error)}`);
}
}
@@ -211,7 +212,7 @@ export class Onebox {
platformServices: platformServicesStatus,
};
} catch (error) {
logger.error(`Failed to get system status: ${error.message}`);
logger.error(`Failed to get system status: ${getErrorMessage(error)}`);
throw error;
}
}
@@ -265,7 +266,7 @@ export class Onebox {
logger.success('Onebox shutdown complete');
} catch (error) {
logger.error(`Error during shutdown: ${error.message}`);
logger.error(`Error during shutdown: ${getErrorMessage(error)}`);
}
}
}

View File

@@ -7,6 +7,7 @@
import * as plugins from '../plugins.ts';
import type { IRegistry } from '../types.ts';
import { logger } from '../logging.ts';
import { getErrorMessage } from '../utils/error.ts';
import { OneboxDatabase } from './database.ts';
export class OneboxRegistriesManager {
@@ -64,7 +65,7 @@ export class OneboxRegistriesManager {
return registry;
} catch (error) {
logger.error(`Failed to add registry ${url}: ${error.message}`);
logger.error(`Failed to add registry ${url}: ${getErrorMessage(error)}`);
throw error;
}
}
@@ -84,7 +85,7 @@ export class OneboxRegistriesManager {
// Note: We don't perform docker logout as it might affect other users
} catch (error) {
logger.error(`Failed to remove registry ${url}: ${error.message}`);
logger.error(`Failed to remove registry ${url}: ${getErrorMessage(error)}`);
throw error;
}
}
@@ -145,7 +146,7 @@ export class OneboxRegistriesManager {
logger.success(`Logged into registry: ${registry.url}`);
} catch (error) {
logger.error(`Failed to login to registry ${registry.url}: ${error.message}`);
logger.error(`Failed to login to registry ${registry.url}: ${getErrorMessage(error)}`);
throw error;
}
}
@@ -160,7 +161,7 @@ export class OneboxRegistriesManager {
try {
await this.loginToRegistry(registry);
} catch (error) {
logger.warn(`Failed to login to ${registry.url}: ${error.message}`);
logger.warn(`Failed to login to ${registry.url}: ${getErrorMessage(error)}`);
// Continue with other registries
}
}
@@ -188,7 +189,7 @@ export class OneboxRegistriesManager {
return code === 0;
} catch (error) {
logger.error(`Failed to test registry ${url}: ${error.message}`);
logger.error(`Failed to test registry ${url}: ${getErrorMessage(error)}`);
return false;
}
}

View File

@@ -6,6 +6,7 @@
import type { IService, IServiceDeployOptions, IPlatformRequirements } from '../types.ts';
import { logger } from '../logging.ts';
import { getErrorMessage } from '../utils/error.ts';
import { OneboxDatabase } from './database.ts';
import { OneboxDockerManager } from './docker.ts';
import type { PlatformServicesManager } from './platform-services/index.ts';
@@ -84,7 +85,7 @@ export class OneboxServicesManager {
platformEnvVars = await platformServices.provisionForService(service);
logger.success(`Platform resources provisioned for service '${options.name}'`);
} catch (error) {
logger.error(`Failed to provision platform resources: ${error.message}`);
logger.error(`Failed to provision platform resources: ${getErrorMessage(error)}`);
// Clean up the service record on failure
this.database.deleteService(service.id!);
throw error;
@@ -164,7 +165,7 @@ export class OneboxServicesManager {
);
}
} catch (error) {
logger.warn(`Failed to create certificate requirement: ${error.message}`);
logger.warn(`Failed to create certificate requirement: ${getErrorMessage(error)}`);
}
// Configure DNS (if autoDNS is enabled)
@@ -172,7 +173,7 @@ export class OneboxServicesManager {
try {
await this.oneboxRef.dns.addDNSRecord(options.domain);
} catch (error) {
logger.warn(`Failed to configure DNS for ${options.domain}: ${error.message}`);
logger.warn(`Failed to configure DNS for ${options.domain}: ${getErrorMessage(error)}`);
}
}
@@ -180,7 +181,7 @@ export class OneboxServicesManager {
try {
await this.oneboxRef.reverseProxy.addRoute(service.id!, options.domain, options.port);
} catch (error) {
logger.warn(`Failed to configure reverse proxy for ${options.domain}: ${error.message}`);
logger.warn(`Failed to configure reverse proxy for ${options.domain}: ${getErrorMessage(error)}`);
}
// Configure SSL (if autoSSL is enabled)
@@ -191,7 +192,7 @@ export class OneboxServicesManager {
await this.oneboxRef.ssl.obtainCertificate(options.domain);
await this.oneboxRef.reverseProxy.reloadCertificates();
} catch (error) {
logger.warn(`Failed to obtain SSL certificate for ${options.domain}: ${error.message}`);
logger.warn(`Failed to obtain SSL certificate for ${options.domain}: ${getErrorMessage(error)}`);
}
}
}
@@ -200,7 +201,7 @@ export class OneboxServicesManager {
return this.database.getServiceByName(options.name)!;
} catch (error) {
logger.error(`Failed to deploy service ${options.name}: ${error.message}`);
logger.error(`Failed to deploy service ${options.name}: ${getErrorMessage(error)}`);
throw error;
}
}
@@ -229,7 +230,7 @@ export class OneboxServicesManager {
logger.success(`Service started: ${name}`);
} catch (error) {
logger.error(`Failed to start service ${name}: ${error.message}`);
logger.error(`Failed to start service ${name}: ${getErrorMessage(error)}`);
this.database.updateService(
this.database.getServiceByName(name)?.id!,
{ status: 'failed' }
@@ -262,7 +263,7 @@ export class OneboxServicesManager {
logger.success(`Service stopped: ${name}`);
} catch (error) {
logger.error(`Failed to stop service ${name}: ${error.message}`);
logger.error(`Failed to stop service ${name}: ${getErrorMessage(error)}`);
throw error;
}
}
@@ -289,7 +290,7 @@ export class OneboxServicesManager {
logger.success(`Service restarted: ${name}`);
} catch (error) {
logger.error(`Failed to restart service ${name}: ${error.message}`);
logger.error(`Failed to restart service ${name}: ${getErrorMessage(error)}`);
throw error;
}
}
@@ -311,7 +312,7 @@ export class OneboxServicesManager {
try {
await this.docker.removeContainer(service.containerID, true);
} catch (error) {
logger.warn(`Failed to remove container: ${error.message}`);
logger.warn(`Failed to remove container: ${getErrorMessage(error)}`);
}
}
@@ -320,7 +321,7 @@ export class OneboxServicesManager {
try {
this.oneboxRef.reverseProxy.removeRoute(service.domain);
} catch (error) {
logger.warn(`Failed to remove reverse proxy route: ${error.message}`);
logger.warn(`Failed to remove reverse proxy route: ${getErrorMessage(error)}`);
}
// Note: We don't remove DNS records or SSL certs automatically
@@ -335,7 +336,7 @@ export class OneboxServicesManager {
await platformServices.cleanupForService(service.id!);
logger.success(`Platform resources cleaned up for service '${name}'`);
} catch (error) {
logger.warn(`Failed to cleanup platform resources: ${error.message}`);
logger.warn(`Failed to cleanup platform resources: ${getErrorMessage(error)}`);
// Continue with service deletion even if cleanup fails
}
}
@@ -345,7 +346,7 @@ export class OneboxServicesManager {
logger.success(`Service removed: ${name}`);
} catch (error) {
logger.error(`Failed to remove service ${name}: ${error.message}`);
logger.error(`Failed to remove service ${name}: ${getErrorMessage(error)}`);
throw error;
}
}
@@ -388,7 +389,7 @@ export class OneboxServicesManager {
// v5 API returns combined stdout/stderr with proper formatting
return logs.stdout;
} catch (error) {
logger.error(`Failed to get logs for service ${name}: ${error.message}`);
logger.error(`Failed to get logs for service ${name}: ${getErrorMessage(error)}`);
throw error;
}
}
@@ -412,7 +413,7 @@ export class OneboxServicesManager {
await this.docker.streamContainerLogs(service.containerID, callback);
} catch (error) {
logger.error(`Failed to stream logs for service ${name}: ${error.message}`);
logger.error(`Failed to stream logs for service ${name}: ${getErrorMessage(error)}`);
throw error;
}
}
@@ -434,7 +435,7 @@ export class OneboxServicesManager {
const stats = await this.docker.getContainerStats(service.containerID);
return stats;
} catch (error) {
logger.error(`Failed to get metrics for service ${name}: ${error.message}`);
logger.error(`Failed to get metrics for service ${name}: ${getErrorMessage(error)}`);
return null;
}
}
@@ -456,7 +457,7 @@ export class OneboxServicesManager {
const platformServices = this.oneboxRef.platformServices as PlatformServicesManager;
return await platformServices.getResourcesForService(service.id!);
} catch (error) {
logger.error(`Failed to get platform resources for service ${name}: ${error.message}`);
logger.error(`Failed to get platform resources for service ${name}: ${getErrorMessage(error)}`);
return [];
}
}
@@ -478,7 +479,7 @@ export class OneboxServicesManager {
const status = await this.docker.getContainerStatus(service.containerID);
return status;
} catch (error) {
logger.error(`Failed to get status for service ${name}: ${error.message}`);
logger.error(`Failed to get status for service ${name}: ${getErrorMessage(error)}`);
return 'unknown';
}
}
@@ -499,7 +500,7 @@ export class OneboxServicesManager {
// Note: Requires container restart to take effect
logger.info(`Environment variables updated for ${name}. Restart service to apply changes.`);
} catch (error) {
logger.error(`Failed to update env vars for service ${name}: ${error.message}`);
logger.error(`Failed to update env vars for service ${name}: ${getErrorMessage(error)}`);
throw error;
}
}
@@ -535,7 +536,7 @@ export class OneboxServicesManager {
try {
await this.docker.stopContainer(oldContainerID);
} catch (error) {
logger.warn(`Failed to stop container: ${error.message}`);
logger.warn(`Failed to stop container: ${getErrorMessage(error)}`);
}
}
@@ -566,7 +567,7 @@ export class OneboxServicesManager {
await this.docker.removeContainer(oldContainerID, true);
logger.info(`Removed old container for ${name}`);
} catch (error) {
logger.warn(`Failed to remove old container: ${error.message}`);
logger.warn(`Failed to remove old container: ${getErrorMessage(error)}`);
}
}
@@ -582,7 +583,7 @@ export class OneboxServicesManager {
try {
this.oneboxRef.reverseProxy.removeRoute(oldDomain);
} catch (error) {
logger.warn(`Failed to remove old reverse proxy route: ${error.message}`);
logger.warn(`Failed to remove old reverse proxy route: ${getErrorMessage(error)}`);
}
}
@@ -595,7 +596,7 @@ export class OneboxServicesManager {
updates.port || service.port
);
} catch (error) {
logger.warn(`Failed to configure reverse proxy: ${error.message}`);
logger.warn(`Failed to configure reverse proxy: ${getErrorMessage(error)}`);
}
}
}
@@ -614,7 +615,7 @@ export class OneboxServicesManager {
return this.database.getServiceByName(name)!;
} catch (error) {
logger.error(`Failed to update service ${name}: ${error.message}`);
logger.error(`Failed to update service ${name}: ${getErrorMessage(error)}`);
throw error;
}
}
@@ -653,7 +654,7 @@ export class OneboxServicesManager {
}
}
} catch (error) {
logger.debug(`Failed to sync status for service ${name}: ${error.message}`);
logger.debug(`Failed to sync status for service ${name}: ${getErrorMessage(error)}`);
}
}
@@ -678,7 +679,7 @@ export class OneboxServicesManager {
try {
await this.checkForRegistryUpdates();
} catch (error) {
logger.error(`Auto-update check failed: ${error.message}`);
logger.error(`Auto-update check failed: ${getErrorMessage(error)}`);
}
}, 30000);