diff --git a/src/apphealthmonitor.js b/src/apphealthmonitor.js index 3f403180e..b28d6a7be 100644 --- a/src/apphealthmonitor.js +++ b/src/apphealthmonitor.js @@ -152,7 +152,7 @@ async function processDockerEvents(options) { }); stream.on('error', function (error) { - debug('Error reading docker events', error); + debug('Error reading docker events: %o', error); }); stream.on('end', function () { diff --git a/src/apptask.js b/src/apptask.js index 55f59e3ee..a09b566b3 100644 --- a/src/apptask.js +++ b/src/apptask.js @@ -185,7 +185,7 @@ async function cleanupLogs(app) { // note that redis container logs are cleaned up by the addon const [error] = await safe(fs.promises.rm(path.join(paths.LOG_DIR, app.id), { force: true, recursive: true })); - if (error) debug('cleanupLogs: cannot cleanup logs:', error); + if (error) debug('cleanupLogs: cannot cleanup logs: %o', error); } async function verifyManifest(manifest) { @@ -627,7 +627,7 @@ async function update(app, args, progressCallback) { if (newTcpPorts[portName] || newUdpPorts[portName]) continue; // port still in use const [error] = await safe(apps.delPortBinding(currentPorts[portName], apps.PORT_TYPE_TCP)); - if (error && error.reason === BoxError.NOT_FOUND) debug('update: portbinding does not exist in database', error); + if (error && error.reason === BoxError.NOT_FOUND) debug('update: portbinding does not exist in database: %o', error); else if (error) throw error; // also delete from app object for further processing (the db is updated in the next step) @@ -804,7 +804,7 @@ async function run(appId, args, progressCallback) { const [error, result] = await safe(cmd); // only some commands like backup return a result if (error) { - debug(`run: app error for state ${app.installationState}:`, error); + debug(`run: app error for state ${app.installationState}: %o`, error); if (app.installationState === apps.ISTATE_PENDING_BACKUP) { // return to installed state intentionally. the error is stashed only in the task and not the app (the UI shows error state otherwise) diff --git a/src/backupcleaner.js b/src/backupcleaner.js index 3befafa2e..3f7d9758e 100644 --- a/src/backupcleaner.js +++ b/src/backupcleaner.js @@ -105,7 +105,7 @@ async function removeBackup(backupConfig, backup, progressCallback) { if (pruneError) debug(`removeBackup: unable to prune backup directory ${path.dirname(backupFilePath)}: ${pruneError.message}`); const [delError] = await safe(backups.del(backup.id)); - if (delError) debug(`removeBackup: error removing ${backup.id} from database`, delError); + if (delError) debug(`removeBackup: error removing ${backup.id} from database. %o`, delError); else debug(`removeBackup: removed ${backup.remotePath}`); } @@ -222,7 +222,7 @@ async function cleanupMissingBackups(backupConfig, progressCallback) { await progressCallback({ message: `Removing missing backup ${backup.remotePath}`}); const [delError] = await safe(backups.del(backup.id)); - if (delError) debug(`cleanupMissingBackups: error removing ${backup.id} from database`, delError); + if (delError) debug(`cleanupMissingBackups: error removing ${backup.id} from database. %o`, delError); missingBackupPaths.push(backup.remotePath); } diff --git a/src/backupformat/tgz.js b/src/backupformat/tgz.js index b8a68a29b..4b03be9df 100644 --- a/src/backupformat/tgz.js +++ b/src/backupformat/tgz.js @@ -54,19 +54,19 @@ function tarPack(dataLayout, encryption) { const ps = new ProgressStream({ interval: 10000 }); // emit 'progress' every 10 seconds pack.on('error', function (error) { - debug('tarPack: tar stream error.', error); + debug('tarPack: tar stream error. %o', error); ps.emit('error', new BoxError(BoxError.EXTERNAL_ERROR, error.message)); }); gzip.on('error', function (error) { - debug('tarPack: gzip stream error.', error); + debug('tarPack: gzip stream error. %o', error); ps.emit('error', new BoxError(BoxError.EXTERNAL_ERROR, error.message)); }); if (encryption) { const encryptStream = new EncryptStream(encryption); encryptStream.on('error', function (error) { - debug('tarPack: encrypt stream error.', error); + debug('tarPack: encrypt stream error. %o', error); ps.emit('error', new BoxError(BoxError.EXTERNAL_ERROR, error.message)); }); @@ -99,17 +99,17 @@ function tarExtract(inStream, dataLayout, encryption) { }); inStream.on('error', function (error) { - debug('tarExtract: input stream error.', error); + debug('tarExtract: input stream error. %o', error); emitError(new BoxError(BoxError.EXTERNAL_ERROR, error.message)); }); gunzip.on('error', function (error) { - debug('tarExtract: gunzip stream error.', error); + debug('tarExtract: gunzip stream error. %o', error); emitError(new BoxError(BoxError.EXTERNAL_ERROR, error.message)); }); extract.on('error', function (error) { - debug('tarExtract: extract stream error.', error); + debug('tarExtract: extract stream error. %o', error); emitError(new BoxError(BoxError.EXTERNAL_ERROR, error.message)); }); diff --git a/src/cloudron.js b/src/cloudron.js index c6df591c7..0a8dca2f7 100644 --- a/src/cloudron.js +++ b/src/cloudron.js @@ -171,7 +171,7 @@ async function reboot() { await notifications.clearAlert(notifications.ALERT_REBOOT, 'Reboot Required'); const [error] = await safe(shell.promises.sudo('reboot', [ REBOOT_CMD ], {})); - if (error) debug('reboot: could not reboot', error); + if (error) debug('reboot: could not reboot. %o', error); } async function isRebootRequired() { diff --git a/src/directoryserver.js b/src/directoryserver.js index 895b68926..dcd9c065d 100644 --- a/src/directoryserver.js +++ b/src/directoryserver.js @@ -309,7 +309,7 @@ async function start() { }); gServer.on('error', function (error) { - debug('server startup error ', error); + debug('server startup error: %o', error); }); gServer.bind('ou=system,dc=cloudron', async function(req, res, next) { diff --git a/src/dns/gcdns.js b/src/dns/gcdns.js index 9b45bb1dc..560cda3da 100644 --- a/src/dns/gcdns.js +++ b/src/dns/gcdns.js @@ -54,10 +54,7 @@ async function getZoneByName(domainConfig, zoneName) { if (error && error.reason === 'No such domain') throw new BoxError(BoxError.NOT_FOUND, error.message); if (error && error.code === 403) throw new BoxError(BoxError.ACCESS_DENIED, error.message); if (error && error.code === 404) throw new BoxError(BoxError.NOT_FOUND, error.message); - if (error) { - debug('gcdns.getZones', error); - throw new BoxError(BoxError.EXTERNAL_ERROR, error); - } + if (error) throw new BoxError(BoxError.EXTERNAL_ERROR, error); const zone = result[0].filter(function (zone) { return zone.metadata.dnsName.slice(0, -1) === zoneName; // the zone name contains a '.' at the end diff --git a/src/docker.js b/src/docker.js index db929d483..8c9d7db11 100644 --- a/src/docker.js +++ b/src/docker.js @@ -136,7 +136,7 @@ async function pullImage(manifest) { }); stream.on('error', function (error) { // this is only hit for stream error and not for some download error - debug('error pulling image %s: %j', manifest.dockerImage, error); + debug('error pulling image %s: %o', manifest.dockerImage, error); reject(new BoxError(BoxError.DOCKER_ERROR, error.message)); }); }); @@ -477,7 +477,7 @@ async function deleteContainer(containerId) { // id can also be name if (error && error.statusCode === 404) return; if (error) { - debug('Error removing container %s : %j', containerId, error); + debug('Error removing container %s : %o', containerId, error); throw new BoxError(BoxError.DOCKER_ERROR, error); } } @@ -529,7 +529,7 @@ async function deleteImage(manifest) { if (error && error.statusCode === 409) return; // another container using the image if (error) { - debug('Error removing image %s : %j', dockerImage, error); + debug('Error removing image %s : %o', dockerImage, error); throw new BoxError(BoxError.DOCKER_ERROR, error); } } diff --git a/src/dockerproxy.js b/src/dockerproxy.js index e361e1838..869b22bb5 100644 --- a/src/dockerproxy.js +++ b/src/dockerproxy.js @@ -54,7 +54,7 @@ function attachDockerRequest(req, res, next) { // Force node to send out the headers, this is required for the /container/wait api to make the docker cli proceed res.write(' '); - dockerResponse.on('error', function (error) { debug('dockerResponse error:', error); }); + dockerResponse.on('error', function (error) { debug('dockerResponse error: %o', error); }); dockerResponse.pipe(res, { end: true }); }); diff --git a/src/externalldap.js b/src/externalldap.js index 327ffe306..767c906dd 100644 --- a/src/externalldap.js +++ b/src/externalldap.js @@ -291,7 +291,7 @@ async function startSyncer() { const taskId = await tasks.add(tasks.TASK_SYNC_EXTERNAL_LDAP, []); tasks.startTask(taskId, {}, function (error, result) { - debug('sync: done', error, result); + debug('sync: done. %o %j', error, result); }); return taskId; @@ -322,17 +322,17 @@ async function syncUsers(externalLdapConfig, progressCallback) { debug(`syncUsers: [adding user] username=${ldapUser.username} email=${ldapUser.email} displayName=${ldapUser.displayName}`); const [userAddError] = await safe(users.add(ldapUser.email, { username: ldapUser.username, password: null, displayName: ldapUser.displayName, source: 'ldap' }, AuditSource.EXTERNAL_LDAP_TASK)); - if (userAddError) debug('syncUsers: Failed to create user', ldapUser, userAddError); + if (userAddError) debug('syncUsers: Failed to create user. %j %o', ldapUser, userAddError); } else if (user.source !== 'ldap') { debug(`syncUsers: [mapping user] username=${ldapUser.username} email=${ldapUser.email} displayName=${ldapUser.displayName}`); const [userMappingError] = await safe(users.update(user, { email: ldapUser.email, fallbackEmail: ldapUser.email, displayName: ldapUser.displayName, source: 'ldap' }, AuditSource.EXTERNAL_LDAP_TASK)); - if (userMappingError) debug('Failed to map user', ldapUser, userMappingError); + if (userMappingError) debug('Failed to map user. %j %o', ldapUser, userMappingError); } else if (user.email !== ldapUser.email || user.displayName !== ldapUser.displayName) { debug(`syncUsers: [updating user] username=${ldapUser.username} email=${ldapUser.email} displayName=${ldapUser.displayName}`); const [userUpdateError] = await safe(users.update(user, { email: ldapUser.email, fallbackEmail: ldapUser.email, displayName: ldapUser.displayName }, AuditSource.EXTERNAL_LDAP_TASK)); - if (userUpdateError) debug('Failed to update user', ldapUser, userUpdateError); + if (userUpdateError) debug('Failed to update user. %j %o', ldapUser, userUpdateError); } else { // user known and up-to-date debug(`syncUsers: [up-to-date user] username=${ldapUser.username} email=${ldapUser.email} displayName=${ldapUser.displayName}`); @@ -431,7 +431,7 @@ async function syncGroupUsers(externalLdapConfig, progressCallback) { for (const memberDn of ldapGroupMembers) { const [ldapError, result] = await safe(ldapGetByDN(externalLdapConfig, memberDn)); if (ldapError) { - debug(`syncGroupUsers: Failed to get ${memberDn}:`, ldapError); + debug(`syncGroupUsers: Failed to get ${memberDn}: %o`, ldapError); continue; } @@ -442,12 +442,12 @@ async function syncGroupUsers(externalLdapConfig, progressCallback) { const [getError, userObject] = await safe(users.getByUsername(username)); if (getError || !userObject) { - debug(`syncGroupUsers: Failed to get user by username ${username}`, getError ? getError : 'User not found'); + debug(`syncGroupUsers: Failed to get user by username ${username}. %o`, getError ? getError : 'User not found'); continue; } const [addError] = await safe(groups.addMember(group.id, userObject.id)); - if (addError && addError.reason !== BoxError.ALREADY_EXISTS) debug('syncGroupUsers: Failed to add member', addError); + if (addError && addError.reason !== BoxError.ALREADY_EXISTS) debug('syncGroupUsers: Failed to add member. %o', addError); } } diff --git a/src/hush.js b/src/hush.js index 79a2fcd81..b6f1ff74a 100644 --- a/src/hush.js +++ b/src/hush.js @@ -144,7 +144,7 @@ function decryptFilePath(filePath, encryption) { decryptedParts.push(plainTextString); } catch (error) { - debug(`Error decrypting part ${part} of path ${filePath}:`, error); + debug(`Error decrypting part ${part} of path ${filePath}: %o`, error); return { error: new BoxError(BoxError.CRYPTO_ERROR, `Error decrypting part ${part} of path ${filePath}: ${error.message}`) }; } } @@ -160,7 +160,7 @@ function createReadStream(sourceFile, encryption) { const ps = new ProgressStream({ interval: 10000 }); // display a progress every 10 seconds stream.on('error', function (error) { - debug(`createReadStream: read stream error at ${sourceFile}`, error); + debug(`createReadStream: read stream error at ${sourceFile}. %o`, error); ps.emit('error', new BoxError(BoxError.FS_ERROR, `Error reading ${sourceFile}: ${error.message} ${error.code}`)); }); @@ -170,7 +170,7 @@ function createReadStream(sourceFile, encryption) { let encryptStream = new EncryptStream(encryption); encryptStream.on('error', function (error) { - debug(`createReadStream: encrypt stream error ${sourceFile}`, error); + debug(`createReadStream: encrypt stream error ${sourceFile}. %o`, error); ps.emit('error', new BoxError(BoxError.CRYPTO_ERROR, `Encryption error at ${sourceFile}: ${error.message}`)); }); @@ -188,7 +188,7 @@ function createWriteStream(destFile, encryption) { const ps = new ProgressStream({ interval: 10000 }); // display a progress every 10 seconds stream.on('error', function (error) { - debug(`createWriteStream: write stream error ${destFile}`, error); + debug(`createWriteStream: write stream error ${destFile}. %o`, error); ps.emit('error', new BoxError(BoxError.FS_ERROR, `Write error ${destFile}: ${error.message}`)); }); @@ -201,7 +201,7 @@ function createWriteStream(destFile, encryption) { if (encryption) { let decrypt = new DecryptStream(encryption); decrypt.on('error', function (error) { - debug(`createWriteStream: decrypt stream error ${destFile}`, error); + debug(`createWriteStream: decrypt stream error ${destFile}. %o`, error); ps.emit('error', new BoxError(BoxError.CRYPTO_ERROR, `Decryption error at ${destFile}: ${error.message}`)); }); diff --git a/src/janitor.js b/src/janitor.js index c964c4701..f82c224f6 100644 --- a/src/janitor.js +++ b/src/janitor.js @@ -18,9 +18,9 @@ async function cleanupTokens() { debug('Cleaning up expired tokens'); const [error, result] = await safe(tokens.delExpired()); - if (error) return debug('cleanupTokens: error removing expired tokens', error); + if (error) return debug('cleanupTokens: error removing expired tokens. %o', error); - debug(`Cleaned up ${result} expired tokens`,); + debug(`Cleaned up ${result} expired tokens`); } async function cleanupTmpVolume(containerInfo) { diff --git a/src/ldap.js b/src/ldap.js index 953489ff2..aa819e2d6 100644 --- a/src/ldap.js +++ b/src/ldap.js @@ -646,7 +646,7 @@ async function start() { gServer = ldap.createServer({ log: logger }); gServer.on('error', function (error) { - debug('start: server error ', error); + debug('start: server error. %o', error); }); gServer.search('ou=users,dc=cloudron', authenticateApp, userSearch); diff --git a/src/oidc.js b/src/oidc.js index 71a277d6b..7d3e0bc58 100644 --- a/src/oidc.js +++ b/src/oidc.js @@ -131,7 +131,7 @@ function load(modelName) { try { data = JSON.parse(fs.readFileSync(filePath), 'utf8'); } catch (e) { - debug(`load: failed to read ${filePath}, start with new one.`, e); + debug(`load: failed to read ${filePath}, start with new one. %o`, e); } DATA_STORE[modelName] = data; @@ -618,7 +618,7 @@ async function renderError(ctx, out, error) { errorMessage: error.error_description || error.error_detail || 'Unknown error' }; - debug('renderError:', error); + debug('renderError: %o', error); ctx.type = 'html'; ctx.body = ejs.render(fs.readFileSync(path.join(__dirname, 'oidc_templates/error.ejs'), 'utf8'), data, {}); diff --git a/src/platform.js b/src/platform.js index 021a5ed47..522899eb3 100644 --- a/src/platform.js +++ b/src/platform.js @@ -105,7 +105,7 @@ async function pruneInfraImages() { for (const image of images) { const output = safe.child_process.execSync(`docker images --digests ${image.repo} --format "{{.ID}} {{.Repository}}:{{.Tag}}@{{.Digest}}"`, { encoding: 'utf8' }); if (output === null) { - debug(`Failed to list images of ${image}`, safe.error); + debug(`Failed to list images of ${image}. %o`, safe.error); throw safe.error; } diff --git a/src/provision.js b/src/provision.js index 652e6fcaf..042378da5 100644 --- a/src/provision.js +++ b/src/provision.js @@ -117,7 +117,7 @@ async function setup(domainConfig, sysinfoConfig, auditSource) { safe(setupTask(domain, auditSource), { debug }); // now that args are validated run the task in the background } catch (error) { - debug('setup: error', error); + debug('setup: error. %o', error); gProvisionStatus.setup.active = false; gProvisionStatus.setup.errorMessage = error.message; throw error; diff --git a/src/routes/apps.js b/src/routes/apps.js index babefe8b9..f5bc27342 100644 --- a/src/routes/apps.js +++ b/src/routes/apps.js @@ -797,7 +797,7 @@ async function startExecWebSocket(req, res, next) { duplexStream.on('end', function () { ws.close(); }); duplexStream.on('close', function () { ws.close(); }); duplexStream.on('error', function (error) { - debug('duplexStream error:', error); + debug('duplexStream error: %o', error); }); duplexStream.on('data', function (data) { if (ws.readyState !== WebSocket.OPEN) return; @@ -805,7 +805,7 @@ async function startExecWebSocket(req, res, next) { }); ws.on('error', function (error) { - debug('websocket error:', error); + debug('websocket error: %o', error); }); ws.on('message', function (msg) { duplexStream.write(msg); diff --git a/src/scripts/backupupload.js b/src/scripts/backupupload.js index 951b140f4..816d400af 100755 --- a/src/scripts/backupupload.js +++ b/src/scripts/backupupload.js @@ -47,7 +47,7 @@ function throttledProgressCallback(msecs) { await settings.initCache(); const [uploadError] = await safe(backuptask.upload(remotePath, format, dataLayoutString, throttledProgressCallback(5000))); - debug('upload completed. error: ', uploadError); + debug('upload completed. error: %o', uploadError); process.send({ result: uploadError ? uploadError.message : '' }); diff --git a/src/services.js b/src/services.js index 62d9baceb..9701c6733 100644 --- a/src/services.js +++ b/src/services.js @@ -440,7 +440,7 @@ async function getServiceLogs(id, options) { throw new BoxError(BoxError.NOT_FOUND, 'Service not found'); } - debug(`Getting logs for ${name}`); + debug(`getServiceLogs: getting logs for ${name}`); let cp; @@ -535,7 +535,7 @@ async function startAppServices(app) { const [error] = await safe(APP_SERVICES[addon].start(instance)); // assume addons name is service name // error ignored because we don't want "start app" to error. use can fix it from Services - if (error) debug(`startAppServices: ${addon}:${instance}`, error); + if (error) debug(`startAppServices: ${addon}:${instance}. %o`, error); } } @@ -549,7 +549,7 @@ async function stopAppServices(app) { const [error] = await safe(APP_SERVICES[addon].stop(instance)); // assume addons name is service name // error ignored because we don't want "start app" to error. use can fix it from Services - if (error) debug(`stopAppServices: ${addon}:${instance}`, error); + if (error) debug(`stopAppServices: ${addon}:${instance}. %o`, error); } } @@ -682,7 +682,7 @@ async function importDatabase(addon) { const [error] = await safe(importAppDatabase(app, addon)); if (!error) continue; - debug(`importDatabase: Error importing ${addon} of app ${app.id}. Marking as errored`, error); + debug(`importDatabase: Error importing ${addon} of app ${app.id}. Marking as errored. %o`, error); // FIXME: there is no way to 'repair' if we are here. we need to make a separate apptask that re-imports db // not clear, if repair workflow should be part of addon or per-app await safe(apps.update(app.id, { installationState: apps.ISTATE_ERROR, error: { message: error.message } })); @@ -711,7 +711,7 @@ async function exportDatabase(addon) { const [error] = await safe(ADDONS[addon].backup(app, app.manifest.addons[addon])); if (error) { - debug(`exportDatabase: Error exporting ${addon} of app ${app.id}.`, error); + debug(`exportDatabase: Error exporting ${addon} of app ${app.id}. %o`, error); // for errored apps, we can ignore if export had an error if (app.installationState === apps.ISTATE_ERROR) continue; throw error; @@ -1790,7 +1790,7 @@ async function teardownRedis(app, options) { if (error) throw new BoxError(BoxError.FS_ERROR, `Error removing redis data: ${error.message}`); safe.fs.rmSync(path.join(paths.LOG_DIR, `redis-${app.id}`), { recursive: true, force: true }); - if (safe.error) debug('cannot cleanup logs:', safe.error); + if (safe.error) debug('teardownRedis: cannot cleanup logs: %o', safe.error); await addonConfigs.unset(app.id, 'redis'); } @@ -1868,7 +1868,7 @@ async function statusUnbound() { const [digError, digResult] = await safe(dig.resolve('ipv4.api.cloudron.io', 'A', { server: '127.0.0.1', timeout: 10000 })); if (!digError && Array.isArray(digResult) && digResult.length !== 0) return { status: exports.SERVICE_STATUS_ACTIVE }; - debug('statusUnbound: unbound is up, but failed to resolve ipv4.api.cloudron.io', digError, digResult); + debug('statusUnbound: unbound is up, but failed to resolve ipv4.api.cloudron.io . %o %j', digError, digResult); return { status: exports.SERVICE_STATUS_STARTING }; } diff --git a/src/storage/filesystem.js b/src/storage/filesystem.js index 83c9cd319..f40a664cd 100644 --- a/src/storage/filesystem.js +++ b/src/storage/filesystem.js @@ -119,7 +119,7 @@ function upload(apiConfig, backupFilePath, sourceStream, callback) { }); fileStream.on('error', function (error) { - debug('[%s] upload: out stream error.', backupFilePath, error); + debug(`upload: [${backupFilePath}] out stream error. %o`, error); callback(new BoxError(BoxError.EXTERNAL_ERROR, error.message)); }); @@ -131,7 +131,7 @@ function upload(apiConfig, backupFilePath, sourceStream, callback) { if (!safe.fs.chownSync(path.dirname(backupFilePath), backupUid, backupUid)) return callback(new BoxError(BoxError.EXTERNAL_ERROR, 'Unable to chown:' + safe.error.message)); } - debug('upload %s: done.', backupFilePath); + debug(`upload ${backupFilePath}: done`); callback(null); }); @@ -187,7 +187,7 @@ function listDir(apiConfig, dir, batchSize, iteratorCallback, callback) { }); }); entryStream.on('warn', function (error) { - debug('listDir: warning ', error); + debug('listDir: warning. %o', error); }); entryStream.on('end', function () { iteratorCallback(entries, callback); diff --git a/src/storage/gcs.js b/src/storage/gcs.js index 69e876dc9..bbed640db 100644 --- a/src/storage/gcs.js +++ b/src/storage/gcs.js @@ -94,7 +94,7 @@ function upload(apiConfig, backupFilePath, sourceStream, callback) { function done(error) { if (error) { - debug('[%s] upload: gcp upload error.', backupFilePath, error); + debug(`upload: [${backupFilePath}] gcp upload error. %o`, error); return callback(new BoxError(BoxError.EXTERNAL_ERROR, `Error uploading ${backupFilePath}. Message: ${error.message} HTTP Code: ${error.code}`)); } @@ -151,7 +151,7 @@ function download(apiConfig, backupFilePath, callback) { if (error && error.code == 404){ ps.emit('error', new BoxError(BoxError.NOT_FOUND)); } else { - debug('[%s] download: gcp stream error.', backupFilePath, error); + debug(`download: [${backupFilePath}] gcp stream error. %o`, error); ps.emit('error', new BoxError(BoxError.EXTERNAL_ERROR, error)); } }) @@ -200,7 +200,7 @@ async function copy(apiConfig, oldFilePath, newFilePath, progressCallback) { var relativePath = path.relative(oldFilePath, entry.fullPath); getBucket(apiConfig).file(entry.fullPath).copy(path.join(newFilePath, relativePath), function(error) { - if (error) debug('copyBackup: gcs copy error', error); + if (error) debug('copyBackup: gcs copy error. %o', error); if (error && error.code === 404) return iteratorCallback(new BoxError(BoxError.NOT_FOUND, 'Old backup not found')); if (error) return iteratorCallback(new BoxError(BoxError.EXTERNAL_ERROR, error.message)); @@ -278,7 +278,7 @@ async function testConfig(apiConfig) { await new Promise((resolve, reject) => { uploadStream.on('error', function(error) { - debug('testConfig: failed uploading cloudron-testfile', error); + debug('testConfig: failed uploading cloudron-testfile. %o', error); if (error && error.code && (error.code == 403 || error.code == 404)) { return reject(new BoxError(BoxError.BAD_FIELD, error.message)); } diff --git a/src/storage/s3.js b/src/storage/s3.js index c6c80a413..040ef4956 100644 --- a/src/storage/s3.js +++ b/src/storage/s3.js @@ -134,7 +134,7 @@ function upload(apiConfig, backupFilePath, sourceStream, callback) { s3.upload(params, { partSize, queueSize: 3 }, function (error, data) { if (error) { - debug('Error uploading [%s]: s3 upload error.', backupFilePath, error); + debug(`upload: [${backupFilePath}] s3 upload error. %o`, error); return callback(new BoxError(BoxError.EXTERNAL_ERROR, `Error uploading ${backupFilePath}. Message: ${error.message} HTTP Code: ${error.code}`)); } @@ -201,7 +201,7 @@ class S3MultipartDownloadStream extends Readable { if (S3_NOT_FOUND(error)) { this.destroy(new BoxError(BoxError.NOT_FOUND, `Backup not found: ${this._path}`)); } else { - debug(`download: ${this._path} s3 stream error.`, error); + debug(`download: ${this._path} s3 stream error. %o`, error); this.destroy(new BoxError(BoxError.EXTERNAL_ERROR, `Error multipartDownload ${this._path}. Message: ${error.message} HTTP Code: ${error.code}`)); } } diff --git a/src/syncer.js b/src/syncer.js index 03fde6c3b..334e6bd1b 100644 --- a/src/syncer.js +++ b/src/syncer.js @@ -155,13 +155,13 @@ function sync(dataLayout, taskProcessor, concurrency, callback) { safe.fs.closeSync(newCacheFd); - debug(`Processing ${delQueue.length} deletes and ${addQueue.length} additions`); + debug(`sync: processing ${delQueue.length} deletes and ${addQueue.length} additions`); async.eachLimit(delQueue, concurrency, taskProcessor, function (error) { - debug('Done processing deletes. error:', error); + debug('sync: done processing deletes. error: %o', error); async.eachLimit(addQueue, concurrency, taskProcessor, function (error) { - debug('Done processing adds. error:', error); + debug('sync: done processing adds. error: %o', error); if (error) return callback(error); diff --git a/src/sysinfo/generic.js b/src/sysinfo/generic.js index 017952ac5..fa0a62319 100644 --- a/src/sysinfo/generic.js +++ b/src/sysinfo/generic.js @@ -35,7 +35,7 @@ async function getServerIPv4(config) { gCache.ipv4.request = null; if (networkError || response.status !== 200) { - debug('getServerIPv4: Error getting IP', networkError); + debug('getServerIPv4: Error getting IP. %o', networkError); throw new BoxError(BoxError.EXTERNAL_ERROR, 'Unable to detect IPv4. API server (ipv4.api.cloudron.io) unreachable'); } @@ -69,7 +69,7 @@ async function getServerIPv6(config) { gCache.ipv6.request = null; if (networkError || response.status !== 200) { - debug('getServerIPv6: Error getting IP', networkError); + debug('getServerIPv6: Error getting IP. %o', networkError); throw new BoxError(BoxError.EXTERNAL_ERROR, 'Unable to detect IPv6. API server (ipv6.api.cloudron.io) unreachable'); } diff --git a/src/tasks.js b/src/tasks.js index cef47bdec..51a7c8cbd 100644 --- a/src/tasks.js +++ b/src/tasks.js @@ -203,7 +203,7 @@ function startTask(id, options, callback) { if (callback) callback(taskError, task ? task.result : null); - debug(`startTask: ${id} done. error:`, taskError); + debug(`startTask: ${id} done. error: %o`, taskError); }); if (options.timeout) { diff --git a/src/translation.js b/src/translation.js index cdbf74463..6e9a81693 100644 --- a/src/translation.js +++ b/src/translation.js @@ -50,7 +50,7 @@ function translate(input, translations, fallbackTranslations) { async function getTranslations() { let fallback = safe.JSON.parse(fs.readFileSync(path.join(TRANSLATION_FOLDER, 'en.json'), 'utf8')); if (!fallback) { - debug('getTranslations: Fallback language en not found', safe.error); + debug('getTranslations: Fallback language en not found. %o', safe.error); fallback = {}; } @@ -58,7 +58,7 @@ async function getTranslations() { let translations = safe.JSON.parse(fs.readFileSync(path.join(TRANSLATION_FOLDER, lang + '.json'), 'utf8')); if (!translations) { - debug(`getTranslations: Requested language ${lang} not found`, safe.error); + debug(`getTranslations: Requested language ${lang} not found. %o`, safe.error); translations = {}; } @@ -71,7 +71,7 @@ async function getLanguages() { const [error, result] = await safe(fs.promises.readdir(TRANSLATION_FOLDER)); if (error) { - debug('getLanguages: Failed to list translations', error); + debug('getLanguages: Failed to list translations. %o', error); return languages; } diff --git a/src/updatechecker.js b/src/updatechecker.js index fad1713df..d864b2007 100644 --- a/src/updatechecker.js +++ b/src/updatechecker.js @@ -95,8 +95,8 @@ async function checkForUpdates(options) { assert.strictEqual(typeof options, 'object'); const [boxError] = await safe(checkBoxUpdates(options)); - if (boxError) debug('checkForUpdates: error checking for box updates:', boxError); + if (boxError) debug('checkForUpdates: error checking for box updates: %o', boxError); const [appError] = await safe(checkAppUpdates(options)); - if (appError) debug('checkForUpdates: error checking for app updates:', appError); + if (appError) debug('checkForUpdates: error checking for app updates: %o', appError); } diff --git a/src/updater.js b/src/updater.js index 95a244f1a..8cb9f00aa 100644 --- a/src/updater.js +++ b/src/updater.js @@ -200,7 +200,7 @@ async function updateToLatest(options, auditSource) { tasks.startTask(taskId, { timeout: 20 * 60 * 60 * 1000 /* 20 hours */, nice: 15, memoryLimit }, async (error) => { locker.unlock(locker.OP_BOX_UPDATE); - debug('Update failed with error', error); + debug('Update failed with error. %o', error); const timedOut = error.code === tasks.ETIMEOUT; await safe(eventlog.add(eventlog.ACTION_UPDATE_FINISH, auditSource, { taskId, errorMessage: error.message, timedOut })); diff --git a/src/users.js b/src/users.js index 4588d377d..68f5563d0 100644 --- a/src/users.js +++ b/src/users.js @@ -395,7 +395,7 @@ async function verifyWithUsername(username, password, identifier, options) { const [error, newUserId] = await safe(externalLdap.maybeCreateUser(username.toLowerCase())); if (error && error.reason === BoxError.BAD_STATE) throw new BoxError(BoxError.NOT_FOUND, 'User not found'); // no external ldap or no auto create if (error) { - debug(`verifyWithUsername: failed to auto create user ${username}`, error); + debug(`verifyWithUsername: failed to auto create user ${username}. %o`, error); throw new BoxError(BoxError.NOT_FOUND, 'User not found'); }