From 55aedbabb9c071912fe48571df43270d6bbbed6b Mon Sep 17 00:00:00 2001 From: Moe Date: Fri, 22 Feb 2019 22:59:06 -0800 Subject: [PATCH] Add dropInEvents module - This allows you to drop a file into `/dev/shm/streams/dropInEvents/[GROUP KEY]/[MONITOR ID]` to trigger an event. - This is useful for cameras that can do FTP upload on Motion detected with their internal detector. - `dropInEventsDir` can be configured in conf.json --- libs/dropInEvents.js | 84 ++++++++++++++++++++++++++++++++++++++++++++ libs/extenders.js | 5 +++ libs/startup.js | 3 ++ 3 files changed, 92 insertions(+) create mode 100644 libs/dropInEvents.js diff --git a/libs/dropInEvents.js b/libs/dropInEvents.js new file mode 100644 index 00000000..20288751 --- /dev/null +++ b/libs/dropInEvents.js @@ -0,0 +1,84 @@ +var fs = require('fs'); +module.exports = function(s,config,lang,app,io){ + if(config.dropInEventServer === true){ + if(config.dropInEventDeleteFileAfterTrigger === undefined)config.dropInEventDeleteFileAfterTrigger = true + var beforeMonitorsLoadedOnStartup = function(){ + if(!config.dropInEventsDir){ + config.dropInEventsDir = s.dir.streams + 'dropInEvents/' + } + s.dir.dropInEvents = s.checkCorrectPathEnding(config.dropInEventsDir) + console.log(s.dir.dropInEvents) + + //dropInEvents dir + if(!fs.existsSync(s.dir.dropInEvents)){ + fs.mkdirSync(s.dir.dropInEvents) + } + } + var onMonitorInit = function(monitorConfig){ + var ke = monitorConfig.ke + var mid = monitorConfig.mid + var groupEventDropDir = s.dir.dropInEvents + ke + + if(!fs.existsSync(groupEventDropDir)){ + fs.mkdirSync(groupEventDropDir) + } + var monitorEventDropDir = groupEventDropDir + '/' + mid + '/' + if(!fs.existsSync(monitorEventDropDir)){ + fs.mkdirSync(monitorEventDropDir) + } + if(s.group[monitorConfig.ke].mon[monitorConfig.mid].dropInEventWatcher){ + s.group[monitorConfig.ke].mon[monitorConfig.mid].dropInEventWatcher.close() + delete(s.group[monitorConfig.ke].mon[monitorConfig.mid].dropInEventWatcher) + } + var fileQueue = {} + s.group[monitorConfig.ke].mon[monitorConfig.mid].dropInEventFileQueue = fileQueue + var eventTrigger = function(eventType,filename){ + var filePath = monitorEventDropDir + filename + if(filename.indexOf('.jpg') > -1){ + var snapPath = s.dir.streams + ke + '/' + mid + '/s.jpg' + fs.unlink(snapPath,function(err){ + fs.createReadStream(filePath).pipe(fs.createWriteStream(snapPath)) + s.triggerEvent({ + id: mid, + ke: ke, + details: { + confidence: 100, + name: filename, + plug: "dropInEvent", + reason: "dropInEvent" + } + }) + }) + }else{ + s.triggerEvent({ + id: mid, + ke: ke, + details: { + confidence: 100, + name: filename, + plug: "dropInEvent", + reason: "dropInEvent" + } + }) + } + console.log(eventType,filePath) + + if(config.dropInEventDeleteFileAfterTrigger){ + setTimeout(function(){ + fs.unlink(filePath) + },1000 * 60 * 5) + } + } + var directoryWatch = fs.watch(monitorEventDropDir,function(eventType,filename){ + clearTimeout(fileQueue[filename]) + fileQueue[filename] = setTimeout(function(){ + eventTrigger(eventType,filename) + },3000) + }) + s.group[monitorConfig.ke].mon[monitorConfig.mid].dropInEventWatcher = directoryWatch + } + //add extensions + s.beforeMonitorsLoadedOnStartup(beforeMonitorsLoadedOnStartup) + s.onMonitorInit(onMonitorInit) + } +} diff --git a/libs/extenders.js b/libs/extenders.js index c984ed83..f0f9a068 100644 --- a/libs/extenders.js +++ b/libs/extenders.js @@ -123,4 +123,9 @@ module.exports = function(s,config){ s.onFFmpegLoadedExtensions.push(callback) } // + s.beforeMonitorsLoadedOnStartupExtensions = [] + s.beforeMonitorsLoadedOnStartup = function(callback){ + s.beforeMonitorsLoadedOnStartupExtensions.push(callback) + } + // } diff --git a/libs/startup.js b/libs/startup.js index 44582840..5754931d 100644 --- a/libs/startup.js +++ b/libs/startup.js @@ -34,6 +34,9 @@ module.exports = function(s,config,lang,io){ } var loadedAccounts = [] var loadMonitors = function(callback){ + s.beforeMonitorsLoadedOnStartupExtensions.forEach(function(extender){ + extender() + }) s.systemLog(lang.startUpText4) //preliminary monitor start s.sqlQuery('SELECT * FROM Monitors', function(err,monitors) {