From cf1fd477458ac6092615b11382833df677b41180 Mon Sep 17 00:00:00 2001 From: Moe Date: Thu, 3 Oct 2019 08:03:36 -0700 Subject: [PATCH 1/4] reset activeMonitor object on failure + fix syntax error with monitor.details --- libs/monitor.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/libs/monitor.js b/libs/monitor.js index db953477..9c527eca 100644 --- a/libs/monitor.js +++ b/libs/monitor.js @@ -179,9 +179,9 @@ module.exports = function(s,config,lang){ switch(monitor.protocol){ case'rtsp': if( - details.rtsp_transport - && details.rtsp_transport !== '' - && details.rtsp_transport !== 'no' + monitor.details.rtsp_transport + && monitor.details.rtsp_transport !== '' + && monitor.details.rtsp_transport !== 'no' ){ inputOptions.push('-rtsp_transport ' + monitor.details.rtsp_transport) } @@ -778,7 +778,7 @@ module.exports = function(s,config,lang){ } s.group[e.ke].activeMonitors[e.id].recordingChecker = setTimeout(function(){ if(s.group[e.ke].activeMonitors[e.id].isStarted === true && s.group[e.ke].rawMonitorConfigurations[e.id].mode === 'record'){ - s.launchMonitorProcesses(e); + s.launchMonitorProcesses(s.cleanMonitorObject(e)); s.sendMonitorStatus({id:e.id,ke:e.ke,status:lang.Restarting}); s.userLog(e,{type:lang['Camera is not recording'],msg:{msg:lang['Restarting Process']}}); s.orphanedVideoCheck(e,2,null,true) @@ -789,7 +789,7 @@ module.exports = function(s,config,lang){ clearTimeout(s.group[e.ke].activeMonitors[e.id].streamChecker) s.group[e.ke].activeMonitors[e.id].streamChecker = setTimeout(function(){ if(s.group[e.ke].activeMonitors[e.id] && s.group[e.ke].activeMonitors[e.id].isStarted === true){ - s.launchMonitorProcesses(e); + s.launchMonitorProcesses(s.cleanMonitorObject(e)); s.userLog(e,{type:lang['Camera is not streaming'],msg:{msg:lang['Restarting Process']}}); s.orphanedVideoCheck(e,2,null,true) } @@ -879,7 +879,7 @@ module.exports = function(s,config,lang){ } if(e.details.fatal_max !== 0 && e.errorCount > e.details.fatal_max){ clearTimeout(s.group[e.ke].activeMonitors[e.id].recordingSnapper) - s.launchMonitorProcesses(e) + s.launchMonitorProcesses(s.cleanMonitorObject(e)) } }) } @@ -1451,7 +1451,7 @@ module.exports = function(s,config,lang){ if(e.details.fatal_max !== 0 && e.errorFatalCount > e.details.fatal_max){ s.camera('stop',{id:e.id,ke:e.ke}) }else{ - s.launchMonitorProcesses(e) + s.launchMonitorProcesses(s.cleanMonitorObject(e)) }; },5000); }else{ From 71f0d61d854ce52e9291995b84636722b17df542 Mon Sep 17 00:00:00 2001 From: Moe Date: Thu, 3 Oct 2019 08:04:49 -0700 Subject: [PATCH 2/4] replace setTimeout with setInterval in cron.js + light cleanup --- cron.js | 62 ++++++++++++++++++++++++++++++--------------------------- 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/cron.js b/cron.js index a9eb577c..a38ec083 100644 --- a/cron.js +++ b/cron.js @@ -144,7 +144,7 @@ s.debugLog = function(arg1,arg2){ } //containers -s.overlapLock={}; +var overlapLocks = {} s.alreadyDeletedRowsWithNoVideosOnStart={}; //functions s.checkCorrectPathEnding=function(x){ @@ -194,7 +194,7 @@ s.getFileBinDirectory = function(e){ } //filters set by the user in their dashboard //deleting old videos is part of the filter - config.cron.deleteOld -s.checkFilterRules = function(v,callback){ +const checkFilterRules = function(v,callback){ //filters if(!v.d.filters||v.d.filters==''){ v.d.filters={}; @@ -301,7 +301,7 @@ s.checkFilterRules = function(v,callback){ } } //database rows with no videos in the filesystem -s.deleteRowsWithNoVideo = function(v,callback){ +const deleteRowsWithNoVideo = function(v,callback){ if( config.cron.deleteNoVideo===true&&( config.cron.deleteNoVideoRecursion===true|| @@ -350,7 +350,7 @@ s.deleteRowsWithNoVideo = function(v,callback){ } } //info about what the application is doing -s.deleteOldLogs = function(v,callback){ +const deleteOldLogs = function(v,callback){ if(!v.d.log_days||v.d.log_days==''){v.d.log_days=10}else{v.d.log_days=parseFloat(v.d.log_days)}; if(config.cron.deleteLogs===true&&v.d.log_days!==0){ s.sqlQuery("DELETE FROM Logs WHERE ke=? AND `time` < ?",[v.ke,s.sqlDate(v.d.log_days+' DAY')],function(err,rrr){ @@ -365,7 +365,7 @@ s.deleteOldLogs = function(v,callback){ } } //events - motion, object, etc. detections -s.deleteOldEvents = function(v,callback){ +const deleteOldEvents = function(v,callback){ if(!v.d.event_days||v.d.event_days==''){v.d.event_days=10}else{v.d.event_days=parseFloat(v.d.event_days)}; if(config.cron.deleteEvents===true&&v.d.event_days!==0){ s.sqlQuery("DELETE FROM Events WHERE ke=? AND `time` < ?",[v.ke,s.sqlDate(v.d.event_days+' DAY')],function(err,rrr){ @@ -380,7 +380,7 @@ s.deleteOldEvents = function(v,callback){ } } //check for temporary files (special archive) -s.deleteOldFileBins = function(v,callback){ +const deleteOldFileBins = function(v,callback){ if(!v.d.fileBin_days||v.d.fileBin_days==''){v.d.fileBin_days=10}else{v.d.fileBin_days=parseFloat(v.d.fileBin_days)}; if(config.cron.deleteFileBins===true&&v.d.fileBin_days!==0){ var fileBinQuery = " FROM Files WHERE ke=? AND `time` < ?"; @@ -409,7 +409,7 @@ s.deleteOldFileBins = function(v,callback){ } } //check for files with no database row -s.checkForOrphanedFiles = function(v,callback){ +const checkForOrphanedFiles = function(v,callback){ if(config.cron.deleteOrphans === true){ console.log('"config.cron.deleteOrphans" has been removed. It has been replace by a one-time-run at startup with "config.insertOrphans". As the variable name suggests, instead of deleting, it will insert videos found without a database row.') console.log('By default "config.orphanedVideoCheckMax" will only check up to 20 video. You can raise this value to any number you choose but be careful as it will check that number of videos on every start.') @@ -417,7 +417,7 @@ s.checkForOrphanedFiles = function(v,callback){ callback() } //user processing function -s.processUser = function(number,rows){ +const processUser = function(number,rows){ var v = rows[number]; if(!v){ //no user object given @@ -427,9 +427,9 @@ s.processUser = function(number,rows){ if(!s.alreadyDeletedRowsWithNoVideosOnStart[v.ke]){ s.alreadyDeletedRowsWithNoVideosOnStart[v.ke]=false; } - if(!s.overlapLock[v.ke]){ + if(!overlapLocks[v.ke]){ // set overlap lock - s.overlapLock[v.ke]=true; + overlapLocks[v.ke] = true //set permissions v.d=JSON.parse(v.details); //size @@ -468,20 +468,20 @@ s.processUser = function(number,rows){ }; } }) - s.deleteOldLogs(v,function(){ + deleteOldLogs(v,function(){ s.debugLog('--- deleteOldLogs Complete') - s.deleteOldFileBins(v,function(){ + deleteOldFileBins(v,function(){ s.debugLog('--- deleteOldFileBins Complete') - s.deleteOldEvents(v,function(){ + deleteOldEvents(v,function(){ s.debugLog('--- deleteOldEvents Complete') - s.checkFilterRules(v,function(){ + checkFilterRules(v,function(){ s.debugLog('--- checkFilterRules Complete') - s.deleteRowsWithNoVideo(v,function(){ + deleteRowsWithNoVideo(v,function(){ s.debugLog('--- deleteRowsWithNoVideo Complete') - s.checkForOrphanedFiles(v,function(){ + checkForOrphanedFiles(v,function(){ //done user, unlock current, and do next - s.overlapLock[v.ke]=false; - s.processUser(number+1,rows) + overlapLocks[v.ke]=false; + processUser(number+1,rows) }) }) }) @@ -490,35 +490,39 @@ s.processUser = function(number,rows){ }) }) }else{ - s.processUser(number+1,rows) + processUser(number+1,rows) } } //recursive function -s.cron=function(){ - x={}; +var theCronInterval = null +const setIntervalForCron = function(){ + clearCronInterval() + theCronInterval = setTimeout(doCronJobs,parseFloat(config.cron.interval)*60000*60) +} +const clearCronInterval = function(){ + clearInterval(theCronInterval) +} +const doCronJobs = function(){ s.cx({f:'start',time:moment()}) s.sqlQuery('SELECT ke,uid,details,mail FROM Users WHERE details NOT LIKE \'%"sub"%\'', function(err,rows) { if(err){ console.error(err) } if(rows&&rows[0]){ - s.processUser(0,rows) + processUser(0,rows) } }) - s.timeout=setTimeout(function(){ - s.cron(); - },parseFloat(config.cron.interval)*60000*60) } -s.cron(); +setIntervalForCron() +doCronJobs() //socket commander io.on('f',function(d){ switch(d.f){ case'start':case'restart': - clearTimeout(s.timeout); - s.cron(); + setIntervalForCron() break; case'stop': - clearTimeout(s.timeout); + clearCronInterval() break; } }) From dd53cdb662b3aa3da1f7b78898134a8567265269 Mon Sep 17 00:00:00 2001 From: Moe Date: Thu, 3 Oct 2019 08:10:07 -0700 Subject: [PATCH 3/4] replace setTimeout with setInterval in cron.js+ --- cron.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cron.js b/cron.js index a38ec083..883b457a 100644 --- a/cron.js +++ b/cron.js @@ -497,7 +497,7 @@ const processUser = function(number,rows){ var theCronInterval = null const setIntervalForCron = function(){ clearCronInterval() - theCronInterval = setTimeout(doCronJobs,parseFloat(config.cron.interval)*60000*60) + theCronInterval = setInterval(doCronJobs,parseFloat(config.cron.interval)*60000*60) } const clearCronInterval = function(){ clearInterval(theCronInterval) From 38287ae7849015ceed33d6e6792016fdcb503f07 Mon Sep 17 00:00:00 2001 From: Moe Date: Thu, 3 Oct 2019 08:15:07 -0700 Subject: [PATCH 4/4] add missing icon rules --- libs/monitor.js | 2 +- libs/socketio.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/monitor.js b/libs/monitor.js index 9c527eca..2fcdaac6 100644 --- a/libs/monitor.js +++ b/libs/monitor.js @@ -211,7 +211,7 @@ module.exports = function(s,config,lang){ } } if(options.useIcon === true){ - checkExists(streamDir + 's.jpg',function(success){ + checkExists(streamDir + 'icon.jpg',function(success){ if(success === false){ noIconChecks() }else{ diff --git a/libs/socketio.js b/libs/socketio.js index 7f48a343..5039a86c 100644 --- a/libs/socketio.js +++ b/libs/socketio.js @@ -440,7 +440,7 @@ module.exports = function(s,config,lang,io){ s.sqlQuery('SELECT * FROM Monitors WHERE ke=?', [d.ke], function(err,r) { if(r && r[0]){ r.forEach(function(monitor){ - s.cameraSendSnapshot({mid:monitor.mid,ke:monitor.ke,mon:monitor}) + s.cameraSendSnapshot({mid:monitor.mid,ke:monitor.ke,mon:monitor},{useIcon: true}) }) } })