From c59d56e70a37885441fb625cfd80f63876fc9061 Mon Sep 17 00:00:00 2001 From: Juergen Kunz Date: Tue, 25 Nov 2025 04:38:26 +0000 Subject: [PATCH] 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. --- license | 2 +- ts/classes/cert-requirement-manager.ts | 15 +-- ts/classes/cloudflare-sync.ts | 9 +- ts/classes/dns.ts | 18 ++-- ts/classes/docker.ts | 44 ++++---- ts/classes/httpserver.ts | 143 +++++++++++++------------ ts/classes/onebox.ts | 13 +-- ts/classes/registries.ts | 11 +- ts/classes/services.ts | 53 ++++----- 9 files changed, 159 insertions(+), 149 deletions(-) diff --git a/license b/license index 12efd5e..500caac 100644 --- a/license +++ b/license @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2025 Lossless GmbH +Copyright (c) 2025 Task Venture Capital GmbH Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/ts/classes/cert-requirement-manager.ts b/ts/classes/cert-requirement-manager.ts index 43e4cdc..68acd7c 100644 --- a/ts/classes/cert-requirement-manager.ts +++ b/ts/classes/cert-requirement-manager.ts @@ -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)}`); } } diff --git a/ts/classes/cloudflare-sync.ts b/ts/classes/cloudflare-sync.ts index 819c05a..e426437 100644 --- a/ts/classes/cloudflare-sync.ts +++ b/ts/classes/cloudflare-sync.ts @@ -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)}`); } } diff --git a/ts/classes/dns.ts b/ts/classes/dns.ts index fe2cf39..5d009e0 100644 --- a/ts/classes/dns.ts +++ b/ts/classes/dns.ts @@ -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; } } diff --git a/ts/classes/docker.ts b/ts/classes/docker.ts index dcff76d..1acbaa0 100644 --- a/ts/classes/docker.ts +++ b/ts/classes/docker.ts @@ -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; } } diff --git a/ts/classes/httpserver.ts b/ts/classes/httpserver.ts index 426815b..f4b90cc 100644 --- a/ts/classes/httpserver.ts +++ b/ts/classes/httpserver.ts @@ -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); } } diff --git a/ts/classes/onebox.ts b/ts/classes/onebox.ts index d148aca..dc636e4 100644 --- a/ts/classes/onebox.ts +++ b/ts/classes/onebox.ts @@ -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)}`); } } } diff --git a/ts/classes/registries.ts b/ts/classes/registries.ts index 8893904..3c9ff8c 100644 --- a/ts/classes/registries.ts +++ b/ts/classes/registries.ts @@ -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; } } diff --git a/ts/classes/services.ts b/ts/classes/services.ts index af8da67..0bb28a8 100644 --- a/ts/classes/services.ts +++ b/ts/classes/services.ts @@ -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);