osrm-backend/scripts/md5sum.js
2016-11-12 02:48:13 +01:00

95 lines
2.2 KiB
JavaScript
Executable File

#!/usr/bin/env node
'use strict'
var crypto = require('crypto');
var fs = require('fs');
var idx = process.argv.indexOf('-c');
if (idx > -1) {
var validate_file = process.argv[idx+1];
if (!process.argv[idx+1]) {
console.error('Please pass arg to -c with a path to the data.md5sum file used to validate');
process.exit(1);
}
validate(validate_file);
} else {
// we are generating checksums for all filenames passed
var args = process.argv.slice(2);
if (args.length > 0) {
generate(args);
} else {
console.error('Please pass either a list of files to generate an md5sum for or validate with "-c data.md5sum"');
process.exit(1);
}
}
function md5FileSync (filename) {
var BUFFER_SIZE = 8192;
var fd = fs.openSync(filename, 'r');
var hash = crypto.createHash('md5');
var buffer = new Buffer(BUFFER_SIZE);
try {
var bytesRead;
do {
bytesRead = fs.readSync(fd, buffer, 0, BUFFER_SIZE);
hash.update(buffer.slice(0, bytesRead));
} while (bytesRead === BUFFER_SIZE)
} finally {
fs.closeSync(fd);
}
return hash.digest('hex');
}
function generate(files) {
files.forEach(function(filename) {
var md5_actual = md5FileSync(filename);
console.log(md5_actual,'',filename);
})
}
function validate(validate_file) {
var sums = {};
var lines = fs.readFileSync(validate_file).
toString().
split('\n').
filter(function(line) {
return line !== "";
});
var error = 0;
lines.forEach(function(line) {
var parts = line.split(' ');
var filename = parts[1];
var md5 = parts[0];
sums[filename] = md5;
var md5_actual = md5FileSync(filename);
if (md5_actual !== md5) {
error++;
console.error(filename + ': FAILED')
} else {
console.log(filename + ': OK');
}
})
if (error > 0) {
console.error('ms5sum.js WARNING: 1 computed checksum did NOT match');
console.error('\nExpected:')
lines.forEach(function(line) {
var parts = line.split(' ');
var filename = parts[1];
var md5 = parts[0];
console.log(md5 + ' ' + filename);
})
process.exit(1);
} else {
process.exit(0);
}
}