95 lines
2.2 KiB
JavaScript
95 lines
2.2 KiB
JavaScript
|
#!/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);
|
||
|
}
|
||
|
}
|