From d29829a46c04e11558b02eb3b14947dbd20802f5 Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Tue, 15 Mar 2016 21:44:24 -0600 Subject: [PATCH] * Implemented @watch rule for import schedule * Implemented @immediate rule for export schedule --- core/scanner_tossers/ftn_bso.js | 101 +++++++++++++++++++++----------- 1 file changed, 66 insertions(+), 35 deletions(-) diff --git a/core/scanner_tossers/ftn_bso.js b/core/scanner_tossers/ftn_bso.js index fb5d22fe..6414ee35 100644 --- a/core/scanner_tossers/ftn_bso.js +++ b/core/scanner_tossers/ftn_bso.js @@ -21,6 +21,7 @@ let fs = require('fs'); let later = require('later'); let temp = require('temp').track(); // track() cleans up temp dir/files for us let assert = require('assert'); +let gaze = require('gaze'); exports.moduleInfo = { name : 'FTN BSO', @@ -1009,6 +1010,21 @@ function FTNMessageScanTossModule() { }); }); }; + + // Starts an export block - returns true if we can proceed + this.exportingStart = function() { + if(!this.exportRunning) { + this.exportRunning = true; + return true; + } + + return false; + }; + + // ends an export block + this.exportingEnd = function() { + this.exportRunning = false; + }; } require('util').inherits(FTNMessageScanTossModule, MessageScanTossModule); @@ -1016,6 +1032,22 @@ require('util').inherits(FTNMessageScanTossModule, MessageScanTossModule); FTNMessageScanTossModule.prototype.startup = function(cb) { Log.info(`${exports.moduleInfo.name} Scanner/Tosser starting up`); + let importing = false; + + let self = this; + + function tryImportNow(reasonDesc) { + if(!importing) { + importing = true; + + Log.info( { module : exports.moduleInfo.name }, reasonDesc); + + self.performImport( () => { + importing = false; + }); + } + } + this.createTempDirectories(err => { if(err) { Log.warn( { error : err.toStrong() }, 'Failed creating temporary directories!'); @@ -1025,46 +1057,39 @@ FTNMessageScanTossModule.prototype.startup = function(cb) { if(_.isObject(this.moduleConfig.schedule)) { const exportSchedule = this.parseScheduleString(this.moduleConfig.schedule.export); if(exportSchedule) { - if(exportSchedule.sched) { - let exporting = false; + if(exportSchedule.sched && this.exportingStart()) { this.exportTimer = later.setInterval( () => { - if(!exporting) { - exporting = true; - - Log.info( { module : exports.moduleInfo.name }, 'Performing scheduled message scan/export...'); - - this.performExport( () => { - exporting = false; - }); - } + + Log.info( { module : exports.moduleInfo.name }, 'Performing scheduled message scan/export...'); + + this.performExport( () => { + this.exportingEnd(); + }); }, exportSchedule.sched); } - if(exportSchedule.watchFile) { - // :TODO: monitor file for changes/existance with gaze - } - if(_.isBoolean(exportSchedule.immediate)) { this.exportImmediate = exportSchedule.immediate; } } const importSchedule = this.parseScheduleString(this.moduleConfig.schedule.import); - if(importSchedule) { - if(importSchedule.sched) { - let importing = false; + if(importSchedule) { + if(importSchedule.sched) { this.importTimer = later.setInterval( () => { - if(!importing) { - importing = true; - - Log.info( { module : exports.moduleInfo.name }, 'Performing scheduled message import/toss...'); - - this.performImport( () => { - importing = false; - }); - } + tryImportNow('Performing scheduled message import/toss...'); }, importSchedule.sched); } + + if(_.isString(importSchedule.watchFile)) { + gaze(importSchedule.watchFile, (err, watcher) => { + watcher.on('all', (event, watchedPath) => { + if(importSchedule.watchFile === watchedPath) { + tryImportNow(`Performing import/toss due to @watch: ${watchedPath} (${event})`); + } + }); + }); + } } } @@ -1227,13 +1252,19 @@ FTNMessageScanTossModule.prototype.record = function(message) { if(!this.isAreaConfigValid(areaConfig)) { return; } - - // :TODO: We must share a check to block export with schedule/timer when this is exporting... - // :TODO: Messages must be marked as "exported" else we will export this particular message again later @ schedule/timer - // ...if getNewUuidsSql in performExport checks for MSGID existence also we can omit already-exported messages - - this.exportMessagesToUplinks( [ message.uuid ], areaConfig, err => { - }); - + + if(this.exportingStart()) { + this.exportMessagesToUplinks( [ message.uuid ], areaConfig, err => { + const info = { uuid : message.uuid, subject : message.subject }; + + if(err) { + Log.warn(info, 'Failed exporting message'); + } else { + Log.info(info, 'Message exported'); + } + + this.exportingEnd(); + }); + } } };