rsync: fix integrity check
This commit is contained in:
@@ -34,23 +34,23 @@ async function verify(backup, backupSite, progressCallback) {
|
||||
}
|
||||
|
||||
const validSignature = crypto.verify(null /* algo */, backupInfoBuffer, backupSite.integrityKeyPair.publicKey, Buffer.from(backup.integrity.signature, 'hex'));
|
||||
progressCallback({ message: `Signature valid? ${validSignature}`});
|
||||
progressCallback({ message: `${backup.remotePath}.backupinfo has ${validSignature ? 'valid': 'invalid' } signature`});
|
||||
|
||||
const backupInfo = JSON.parse(backupInfoBuffer.toString('utf8'));
|
||||
const integrityMap = new Map(Object.entries(backupInfo));
|
||||
|
||||
const [verifyError, verifyMessages] = await safe(backupFormats.api(backupSite.format).verify(backupSite, backup.remotePath, integrityMap, progressCallback));
|
||||
progressCallback({ message: 'Verification done' });
|
||||
progressCallback({ message: `Verification of ${backup.remotePath} done` });
|
||||
|
||||
const messages = [];
|
||||
if (!validSignature) messages.push(`${backup.remotePath}.backupinfo has invalid signature`);
|
||||
if (verifyError) messages.push(`Failed to verify ${backup.remotePath}: ${verifyError.message}`);
|
||||
if (verifyMessages) messages.push(...verifyMessages);
|
||||
|
||||
debug(`verified: ${JSON.stringify(verifyMessages, null, 4)}`);
|
||||
debug(`verified: ${backup.remotePath} ${JSON.stringify(verifyMessages, null, 4)}`);
|
||||
|
||||
stats.duration = Date.now() - stats.startTime;
|
||||
return { stats, messages };
|
||||
return { stats, messages: messages.slice(0, 50) }; // keep rsync fails to 50 to not overflow db
|
||||
}
|
||||
|
||||
async function check(backupId, progressCallback) {
|
||||
@@ -66,7 +66,7 @@ async function check(backupId, progressCallback) {
|
||||
const depBackup = await backups.get(depId);
|
||||
const result = await verify(depBackup, backupSite, progressCallback); // { stats, messages }
|
||||
|
||||
await backups.setIntegrityResult(backup, result.messages.length === 0 ? 'passed' : 'failed', result);
|
||||
await backups.setIntegrityResult(depBackup, result.messages.length === 0 ? 'passed' : 'failed', result);
|
||||
if (result.messages.length) aggregatedMessages.push(`Integrity check of dependent backup ${depBackup.remotePath} failed`);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user