diff --git a/server/managers/BackupManager.js b/server/managers/BackupManager.js index 102521b71..562748c36 100644 --- a/server/managers/BackupManager.js +++ b/server/managers/BackupManager.js @@ -48,9 +48,34 @@ class BackupManager { } async init() { - const backupsDirExists = await fs.pathExists(this.backupPath) - if (!backupsDirExists) { - await fs.ensureDir(this.backupPath) + // Validate backupPath before attempting to create it + if (!this.backupPath || typeof this.backupPath !== 'string' || this.backupPath.length < 2) { + Logger.error(`[BackupManager] Invalid backup path configured: "${this.backupPath}". Falling back to default.`) + // Reset to default backup path + global.ServerSettings.backupPath = Path.join(global.MetadataPath, 'backups') + } + + try { + const backupsDirExists = await fs.pathExists(this.backupPath) + if (!backupsDirExists) { + await fs.ensureDir(this.backupPath) + } + } catch (error) { + Logger.error(`[BackupManager] Failed to ensure backup directory at "${this.backupPath}": ${error.message}`) + // Attempt to fall back to default path + const defaultBackupPath = Path.join(global.MetadataPath, 'backups') + if (this.backupPath !== defaultBackupPath) { + Logger.info(`[BackupManager] Attempting to use default backup path: "${defaultBackupPath}"`) + global.ServerSettings.backupPath = defaultBackupPath + try { + await fs.ensureDir(defaultBackupPath) + } catch (fallbackError) { + Logger.error(`[BackupManager] Failed to create default backup directory: ${fallbackError.message}`) + throw new Error(`[BackupManager] Failed to create default backup directory at "${defaultBackupPath}"`, { cause: fallbackError }) + } + } else { + throw new Error(`[BackupManager] Failed to ensure backup directory at "${this.backupPath}"`, { cause: error }) + } } await this.loadBackups() diff --git a/server/managers/CacheManager.js b/server/managers/CacheManager.js index b44b65de3..38c0415e9 100644 --- a/server/managers/CacheManager.js +++ b/server/managers/CacheManager.js @@ -24,10 +24,15 @@ class CacheManager { this.ImageCachePath = Path.join(this.CachePath, 'images') this.ItemCachePath = Path.join(this.CachePath, 'items') - await fs.ensureDir(this.CachePath) - await fs.ensureDir(this.CoverCachePath) - await fs.ensureDir(this.ImageCachePath) - await fs.ensureDir(this.ItemCachePath) + try { + await fs.ensureDir(this.CachePath) + await fs.ensureDir(this.CoverCachePath) + await fs.ensureDir(this.ImageCachePath) + await fs.ensureDir(this.ItemCachePath) + } catch (error) { + Logger.error(`[CacheManager] Failed to create cache directories at "${this.CachePath}": ${error.message}`) + throw new Error(`[CacheManager] Failed to create cache directories at "${this.CachePath}"`, { cause: error }) + } } async handleCoverCache(res, libraryItemId, options = {}) { diff --git a/server/managers/LogManager.js b/server/managers/LogManager.js index 731dfe70a..07bb7d401 100644 --- a/server/managers/LogManager.js +++ b/server/managers/LogManager.js @@ -37,8 +37,13 @@ class LogManager { } async ensureLogDirs() { - await fs.ensureDir(this.DailyLogPath) - await fs.ensureDir(this.ScanLogPath) + try { + await fs.ensureDir(this.DailyLogPath) + await fs.ensureDir(this.ScanLogPath) + } catch (error) { + console.error(`[LogManager] Failed to create log directories at "${this.DailyLogPath}": ${error.message}`) + throw new Error(`[LogManager] Failed to create log directories at "${this.DailyLogPath}"`, { cause: error }) + } } /** @@ -102,20 +107,20 @@ class LogManager { } /** - * - * @param {string} filename + * + * @param {string} filename */ async removeLogFile(filename) { const fullPath = Path.join(this.DailyLogPath, filename) const exists = await fs.pathExists(fullPath) if (!exists) { Logger.error(TAG, 'Invalid log dne ' + fullPath) - this.dailyLogFiles = this.dailyLogFiles.filter(dlf => dlf !== filename) + this.dailyLogFiles = this.dailyLogFiles.filter((dlf) => dlf !== filename) } else { try { await fs.unlink(fullPath) Logger.info(TAG, 'Removed daily log: ' + filename) - this.dailyLogFiles = this.dailyLogFiles.filter(dlf => dlf !== filename) + this.dailyLogFiles = this.dailyLogFiles.filter((dlf) => dlf !== filename) } catch (error) { Logger.error(TAG, 'Failed to unlink log file ' + fullPath) } @@ -123,8 +128,8 @@ class LogManager { } /** - * - * @param {LogObject} logObj + * + * @param {LogObject} logObj */ async logToFile(logObj) { // Fatal crashes get logged to a separate file @@ -152,8 +157,8 @@ class LogManager { } /** - * - * @param {LogObject} logObj + * + * @param {LogObject} logObj */ async logCrashToFile(logObj) { const line = JSON.stringify(logObj) + '\n' @@ -161,18 +166,18 @@ class LogManager { const logsDir = Path.join(global.MetadataPath, 'logs') await fs.ensureDir(logsDir) const crashLogPath = Path.join(logsDir, 'crash_logs.txt') - return fs.writeFile(crashLogPath, line, { flag: "a+" }).catch((error) => { + return fs.writeFile(crashLogPath, line, { flag: 'a+' }).catch((error) => { console.log('[LogManager] Appended crash log', error) }) } /** * Most recent 5000 daily logs - * + * * @returns {string} */ getMostRecentCurrentDailyLogs() { return this.currentDailyLog?.logs.slice(-5000) || '' } } -module.exports = LogManager \ No newline at end of file +module.exports = LogManager diff --git a/server/managers/MigrationManager.js b/server/managers/MigrationManager.js index 8635def10..e302038ff 100644 --- a/server/managers/MigrationManager.js +++ b/server/managers/MigrationManager.js @@ -38,7 +38,12 @@ class MigrationManager { if (!(await fs.pathExists(this.configPath))) throw new Error(`Config path does not exist: ${this.configPath}`) this.migrationsDir = path.join(this.configPath, 'migrations') - await fs.ensureDir(this.migrationsDir) + try { + await fs.ensureDir(this.migrationsDir) + } catch (error) { + Logger.error(`[MigrationManager] Failed to create migrations directory at "${this.migrationsDir}": ${error.message}`) + throw new Error(`[MigrationManager] Failed to create migrations directory at "${this.migrationsDir}"`, { cause: error }) + } this.serverVersion = this.extractVersionFromTag(serverVersion) if (!this.serverVersion) throw new Error(`Invalid server version: ${serverVersion}. Expected a version tag like v1.2.3.`) diff --git a/server/managers/PlaybackSessionManager.js b/server/managers/PlaybackSessionManager.js index fb12fedaa..1e95727f1 100644 --- a/server/managers/PlaybackSessionManager.js +++ b/server/managers/PlaybackSessionManager.js @@ -459,7 +459,12 @@ class PlaybackSessionManager { * Remove all stream folders in `/metadata/streams` */ async removeOrphanStreams() { - await fs.ensureDir(this.StreamsPath) + try { + await fs.ensureDir(this.StreamsPath) + } catch (error) { + Logger.error(`[PlaybackSessionManager] Failed to create streams directory at "${this.StreamsPath}": ${error.message}`) + throw new Error(`[PlaybackSessionManager] Failed to create streams directory at "${this.StreamsPath}"`, { cause: error }) + } try { const streamsInPath = await fs.readdir(this.StreamsPath) for (const streamId of streamsInPath) {