#!/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); } }