galleon
Version:
A badass SMTP mail server built on Node to make your life simpler.
69 lines (66 loc) • 2.67 kB
JavaScript
// Automatically Restores Raw Files to Database based on Database check
var _ = require('lodash');
var fs = require('fs');
var path = require('path');
var async = require('async');
var Processor = require('../fleet/incoming/processor');
module.exports = function (Galleon, query, callback) {
// Make sure raw path is retrievable from environment
if (!_.has(Galleon.environment, "paths.raw")) return callback(new Error("Raw Path not found."));
// Resolve Path to raw emails
var rawPath = path.resolve(Galleon.environment.paths.raw);
var RestoreToDatabase = Processor(Galleon, Galleon.connection, Galleon.spamc);
// Read List of files
fs.readdir(rawPath, function (error, files) {
if (error) return callback(error);
// Execution Array for Async Parallel
var ParallelExecutionArray = [];
_.each(files, function (eID) {
// Push a check function per file to Exec Array
ParallelExecutionArray.push(function RESTORE_IF_NO_RECORD(_callback) {
Galleon.connection.collections.mail.findOne({ eID: eID }, function (error, model) {
if (error) return _callback(error);
// If record not found restore
// Match Legacy Raw records
var OriginalID = eID;
if (eID.substring(0, 5) === '_raw_') eID = eID.substring(5);
if (!model) {
var CALLBACK_CALLED = false;
var FileStream = fs.createReadStream(path.resolve(rawPath, OriginalID));
// Ignore Stream errors
FileStream.on('error', function (error) {
if (!CALLBACK_CALLED) _callback(null, "ERROR:" + eID + "TIMED_OUT");
CALLBACK_CALLED = true;
});
RestoreToDatabase(FileStream, {
eID: eID,
path: path.resolve(rawPath, OriginalID),
store: false
}, function (error) {
// Call callback regardless of error
if (error) {
CALLBACK_CALLED = true;
return _callback(null, "ERROR:" + eID + error);
}
console.log("RESTORED", eID);
if (!CALLBACK_CALLED) _callback();
CALLBACK_CALLED = true;
});
// Timeout Function
setTimeout(function () {
if (!CALLBACK_CALLED) {
_callback(null, "ERROR:" + eID + "TIMED_OUT");
}
CALLBACK_CALLED = true;
}, 15000);
} else {
// EMAIL Exists -> Continue
_callback();
}
})
})
})
// Launch in parallel
async.parallelLimit(ParallelExecutionArray, 5, callback);
})
}