diff --git a/core/archive_util.js b/core/archive_util.js index cbae6d13..f4a3a168 100644 --- a/core/archive_util.js +++ b/core/archive_util.js @@ -75,7 +75,7 @@ module.exports = class ArchiveUtil { } // return first match - const detected = _.find(this.archivers, arch => { + const detected = _.findKey(this.archivers, arch => { const lenNeeded = arch.offset + arch.sig.length; if(buf.length < lenNeeded) { diff --git a/core/config.js b/core/config.js index 47b0003d..c0749e10 100644 --- a/core/config.js +++ b/core/config.js @@ -211,7 +211,6 @@ function getDefaultConfig() { archivers : { zip : { - name : "PKZip", // :TODO: Use key for this sig : "504b0304", offset : 0, compressCmd : "7z", diff --git a/core/module_util.js b/core/module_util.js index fa28d634..931f8194 100644 --- a/core/module_util.js +++ b/core/module_util.js @@ -69,8 +69,7 @@ function loadModulesForCategory(category, iterator, complete) { fs.readdir(Config.paths[category], (err, files) => { if(err) { - iterator(err); - return; + return iterator(err); } const jsModules = files.filter(file => { diff --git a/core/scanner_tossers/ftn_bso.js b/core/scanner_tossers/ftn_bso.js index 87536cb5..9399b6d0 100644 --- a/core/scanner_tossers/ftn_bso.js +++ b/core/scanner_tossers/ftn_bso.js @@ -55,8 +55,20 @@ function FTNMessageScanTossModule() { } + this.getDefaultNetworkName = function() { + if(this.moduleConfig.defaultNetwork) { + return this.moduleConfig.defaultNetwork; + } + + const networkNames = Object.keys(Config.messageNetworks.ftn.networks); + if(1 === networkNames.length) { + return networkNames[0]; + } + }; + this.isDefaultDomainZone = function(networkName, address) { - return(networkName === this.moduleConfig.defaultNetwork && address.zone === this.moduleConfig.defaultZone); + const defaultNetworkName = this.getDefaultNetworkName(); + return(networkName === defaultNetworkName && address.zone === this.moduleConfig.defaultZone); } this.getOutgoingPacketDir = function(networkName, destAddress) { @@ -288,6 +300,8 @@ function FTNMessageScanTossModule() { return false; } + // :TODO: need to check more! + return true; }; @@ -318,9 +332,6 @@ function FTNMessageScanTossModule() { } }; - this.performImport = function() { - }; - this.getAreaLastScanId = function(areaTag, cb) { const sql = `SELECT area_tag, message_id @@ -576,6 +587,43 @@ function FTNMessageScanTossModule() { ); }, cb); // complete }; + + this.importMessagesFromDirectory = function(importDir, cb) { + async.waterfall( + [ + function getPossibleFiles(callback) { + fs.readdir(importDir, (err, files) => { + callback(err, files); + }); + }, + function identify(files, callback) { + async.map(files, (f, transform) => { + let entry = { file : f }; + + if('.pkt' === paths.extname(f)) { + entry.type = 'packet'; + transform(null, entry); + } else { + const fullPath = paths.join(importDir, f); + self.archUtil.detectType(fullPath, (err, archName) => { + entry.type = archName; + transform(null, entry); + }); + } + }, (err, identifiedFiles) => { + callback(err, identifiedFiles); + }); + }, + function importPacketFiles(identifiedFiles, callback) { + + } + ], + err => { + cb(err); + } + ); + }; + } require('util').inherits(FTNMessageScanTossModule, MessageScanTossModule); @@ -592,7 +640,7 @@ FTNMessageScanTossModule.prototype.startup = function(cb) { if(!exporting) { exporting = true; - Log.info( { module : exports.moduleInfo.name }, 'Performing scheduled message export...'); + Log.info( { module : exports.moduleInfo.name }, 'Performing scheduled message scan/export...'); this.performExport(err => { exporting = false; @@ -605,6 +653,24 @@ FTNMessageScanTossModule.prototype.startup = function(cb) { // :TODO: monitor file for changes/existance with gaze } } + + const importSchedule = this.parseScheduleString(this.moduleConfig.schedule.import); + if(importSchedule) { + if(importSchedule.sched) { + let importing = false; + this.importTimer = later.setInterval( () => { + if(!importing) { + importing = true; + + Log.info( { module : exports.moduleInfo.name }, 'Performing scheduled message import/toss...'); + + this.performImport(err => { + importing = false; + }); + } + }, importSchedule.sched); + } + } } FTNMessageScanTossModule.super_.prototype.startup.call(this, cb); @@ -620,13 +686,28 @@ FTNMessageScanTossModule.prototype.shutdown = function(cb) { FTNMessageScanTossModule.super_.prototype.shutdown.call(this, cb); }; +FTNMessageScanTossModule.prototype.performImport = function(cb) { + if(!this.hasValidConfiguration()) { + return cb(new Error('Missing or invalid configuration')); + } + + var self = this; + + async.each( [ 'inbound', 'secInbound' ], (importDir, nextDir) => { + self.importMessagesFromDirectory(self.moduleConfig.paths[importDir], err => { + + nextDir(); + }); + }, cb); +}; + FTNMessageScanTossModule.prototype.performExport = function(cb) { // // We're only concerned with areas related to FTN. For each area, loop though // and let's find out what messages need exported. // if(!this.hasValidConfiguration()) { - return cb(new Error('No valid configurations for export')); + return cb(new Error('Missing or invalid configuration')); } const getNewUuidsSql = @@ -668,9 +749,15 @@ FTNMessageScanTossModule.prototype.performExport = function(cb) { }); }, function exportToConfiguredUplinks(msgRows, callback) { - const uuidsOnly = msgRows.map(r => r.message_uuid); // conver to array of UUIDs only + const uuidsOnly = msgRows.map(r => r.message_uuid); // convert to array of UUIDs only self.exportMessagesToUplinks(uuidsOnly, areaConfig, err => { - callback(err, msgRows[msgRows.length - 1].message_id); + const newLastScanId = msgRows[msgRows.length - 1].message_id; + + Log.info( + { messagesExported : msgRows.length, newLastScanId : newLastScanId }, + 'Export complete'); + + callback(err, newLastScanId); }); }, function updateLastScanId(newLastScanId, callback) {