2018-06-09 23:34:06 +00:00
process . on ( 'uncaughtException' , function ( err ) {
console . error ( 'uncaughtException' , err ) ;
} ) ;
var fs = require ( 'fs' ) ;
var path = require ( 'path' ) ;
var knex = require ( 'knex' ) ;
var moment = require ( 'moment' ) ;
var exec = require ( 'child_process' ) . exec ;
var spawn = require ( 'child_process' ) . spawn ;
var config = require ( './conf.json' ) ;
//set option defaults
2018-06-12 21:27:01 +00:00
s = {
utcOffset : moment ( ) . utcOffset ( )
} ;
2018-06-09 23:34:06 +00:00
if ( config . cron === undefined ) config . cron = { } ;
if ( config . cron . deleteOld === undefined ) config . cron . deleteOld = true ;
if ( config . cron . deleteOrphans === undefined ) config . cron . deleteOrphans = false ;
if ( config . cron . deleteNoVideo === undefined ) config . cron . deleteNoVideo = true ;
if ( config . cron . deleteNoVideoRecursion === undefined ) config . cron . deleteNoVideoRecursion = false ;
if ( config . cron . deleteOverMax === undefined ) config . cron . deleteOverMax = true ;
if ( config . cron . deleteLogs === undefined ) config . cron . deleteLogs = true ;
if ( config . cron . deleteEvents === undefined ) config . cron . deleteEvents = true ;
if ( config . cron . deleteFileBins === undefined ) config . cron . deleteFileBins = true ;
if ( config . cron . interval === undefined ) config . cron . interval = 1 ;
if ( config . databaseType === undefined ) { config . databaseType = 'mysql' }
if ( config . databaseLogs === undefined ) { config . databaseLogs = false }
2018-06-12 21:27:01 +00:00
if ( config . useUTC === undefined ) { config . useUTC = false }
if ( config . debugLog === undefined ) { config . debugLog = false }
2018-06-09 23:34:06 +00:00
if ( ! config . ip || config . ip === '' || config . ip . indexOf ( '0.0.0.0' ) > - 1 ) config . ip = 'localhost' ;
if ( ! config . videosDir ) config . videosDir = _ _dirname + '/videos/' ;
if ( ! config . binDir ) { config . binDir = _ _dirname + '/fileBin/' }
if ( ! config . addStorage ) { config . addStorage = [ ] }
// Database Connection
var databaseOptions = {
client : config . databaseType ,
connection : config . db ,
}
if ( databaseOptions . client . indexOf ( 'sqlite' ) > - 1 ) {
databaseOptions . client = 'sqlite3' ;
databaseOptions . useNullAsDefault = true ;
}
if ( databaseOptions . client === 'sqlite3' && databaseOptions . connection . filename === undefined ) {
databaseOptions . connection . filename = _ _dirname + "/shinobi.sqlite"
}
s . databaseEngine = knex ( databaseOptions )
2018-11-05 20:55:58 +00:00
s . dateSubtract = function ( date , interval , units ) {
var ret = date
var checkRollover = function ( ) { if ( ret . getDate ( ) != date . getDate ( ) ) ret . setDate ( 0 ) ; } ;
switch ( interval . toLowerCase ( ) ) {
case 'year' : ret . setFullYear ( ret . getFullYear ( ) - units ) ; checkRollover ( ) ; break ;
case 'quarter' : ret . setMonth ( ret . getMonth ( ) - 3 * units ) ; checkRollover ( ) ; break ;
case 'month' : ret . setMonth ( ret . getMonth ( ) - units ) ; checkRollover ( ) ; break ;
case 'week' : ret . setDate ( ret . getDate ( ) - 7 * units ) ; break ;
case 'day' : ret . setDate ( ret . getDate ( ) - units ) ; break ;
case 'hour' : ret . setTime ( ret . getTime ( ) - units * 3600000 ) ; break ;
case 'minute' : ret . setTime ( ret . getTime ( ) - units * 60000 ) ; break ;
case 'second' : default : ret . setTime ( ret . getTime ( ) - units * 1000 ) ; break ;
}
return ( new Date ( ret ) )
}
2018-06-09 23:34:06 +00:00
s . sqlDate = function ( value ) {
2018-11-05 20:55:58 +00:00
var value = value . toLowerCase ( )
var splitValue = value . split ( ' ' )
var amount = parseFloat ( splitValue [ 0 ] )
var today = new Date ( )
var query
if ( value . indexOf ( 'min' ) > - 1 ) {
query = s . dateSubtract ( today , 'minute' , amount )
} else if ( value . indexOf ( 'day' ) > - 1 ) {
query = s . dateSubtract ( today , 'day' , amount )
} else if ( value . indexOf ( 'hour' ) > - 1 ) {
query = s . dateSubtract ( today , 'hour' , amount )
2018-06-09 23:34:06 +00:00
}
2018-11-05 20:55:58 +00:00
return query
2018-06-09 23:34:06 +00:00
}
2018-09-15 20:31:03 +00:00
s . mergeQueryValues = function ( query , values ) {
2018-06-09 23:34:06 +00:00
if ( ! values ) { values = [ ] }
var valuesNotFunction = true ;
if ( typeof values === 'function' ) {
var values = [ ] ;
valuesNotFunction = false ;
}
if ( values && valuesNotFunction ) {
var splitQuery = query . split ( '?' )
var newQuery = ''
splitQuery . forEach ( function ( v , n ) {
newQuery += v
2018-09-15 20:31:03 +00:00
var value = values [ n ]
if ( value ) {
if ( isNaN ( value ) || value instanceof Date ) {
newQuery += "'" + value + "'"
2018-06-09 23:34:06 +00:00
} else {
2018-09-15 20:31:03 +00:00
newQuery += value
2018-06-09 23:34:06 +00:00
}
}
} )
} else {
newQuery = query
}
2018-09-15 20:31:03 +00:00
return newQuery
}
s . stringToSqlTime = function ( value ) {
newValue = new Date ( value . replace ( 'T' , ' ' ) )
return newValue
}
s . sqlQuery = function ( query , values , onMoveOn ) {
if ( ! values ) { values = [ ] }
if ( typeof values === 'function' ) {
var onMoveOn = values ;
var values = [ ] ;
}
if ( ! onMoveOn ) { onMoveOn = function ( ) { } }
var mergedQuery = s . mergeQueryValues ( query , values )
s . debugLog ( 's.sqlQuery QUERY' , mergedQuery )
return s . databaseEngine
. raw ( query , values )
. asCallback ( function ( err , r ) {
if ( err ) {
console . log ( 's.sqlQuery QUERY ERRORED' , query )
console . log ( 's.sqlQuery ERROR' , err )
}
if ( onMoveOn && typeof onMoveOn === 'function' ) {
switch ( databaseOptions . client ) {
case 'sqlite3' :
if ( ! r ) r = [ ]
break ;
default :
if ( r ) r = r [ 0 ]
break ;
2018-06-09 23:34:06 +00:00
}
2018-09-15 20:31:03 +00:00
onMoveOn ( err , r )
}
} )
2018-06-09 23:34:06 +00:00
}
2018-06-12 21:27:01 +00:00
s . debugLog = function ( arg1 , arg2 ) {
if ( config . debugLog === true ) {
if ( ! arg2 ) arg2 = ''
console . log ( arg1 , arg2 )
}
}
2018-06-09 23:34:06 +00:00
//containers
s . overlapLock = { } ;
s . alreadyDeletedRowsWithNoVideosOnStart = { } ;
//functions
s . checkCorrectPathEnding = function ( x ) {
var length = x . length
if ( x . charAt ( length - 1 ) !== '/' ) {
x = x + '/'
}
return x . replace ( '__DIR__' , _ _dirname )
}
s . dir = {
videos : s . checkCorrectPathEnding ( config . videosDir ) ,
fileBin : s . checkCorrectPathEnding ( config . binDir ) ,
addStorage : config . addStorage ,
} ;
s . moment = function ( e , x ) {
if ( ! e ) { e = new Date } ; if ( ! x ) { x = 'YYYY-MM-DDTHH-mm-ss' } ;
return moment ( e ) . format ( x ) ;
}
2018-06-12 21:27:01 +00:00
s . utcToLocal = function ( time ) {
return moment . utc ( time ) . utcOffset ( s . utcOffset ) . format ( )
}
s . localToUtc = function ( time ) {
return moment ( time ) . utc ( )
}
2018-10-10 06:56:13 +00:00
s . nameToTime = function ( x ) { x = x . replace ( '.webm' , '' ) . replace ( '.mp4' , '' ) . split ( 'T' ) , x [ 1 ] = x [ 1 ] . replace ( /-/g , ':' ) ; x = x . join ( ' ' ) ; return x ; }
2019-02-17 04:11:11 +00:00
io = require ( 'socket.io-client' ) ( 'ws://' + config . ip + ':' + config . port , { transports : [ 'websocket' ] } ) ; //connect to master
2018-10-10 06:56:13 +00:00
s . cx = function ( x ) { x . cronKey = config . cron . key ; return io . emit ( 'cron' , x ) }
2018-06-09 23:34:06 +00:00
//emulate master socket emitter
2018-10-10 06:56:13 +00:00
s . tx = function ( x , y ) { s . cx ( { f : 's.tx' , data : x , to : y } ) }
s . deleteVideo = function ( x ) { s . cx ( { f : 's.deleteVideo' , file : x } ) }
2018-06-09 23:34:06 +00:00
//Cron Job
s . cx ( { f : 'init' , time : moment ( ) } )
2018-10-10 06:56:13 +00:00
s . getVideoDirectory = function ( e ) {
2018-06-09 23:34:06 +00:00
if ( e . mid && ! e . id ) { e . id = e . mid } ;
if ( e . details && ( e . details instanceof Object ) === false ) {
try { e . details = JSON . parse ( e . details ) } catch ( err ) { }
}
if ( e . details . dir && e . details . dir !== '' ) {
return s . checkCorrectPathEnding ( e . details . dir ) + e . ke + '/' + e . id + '/'
} else {
return s . dir . videos + e . ke + '/' + e . id + '/' ;
}
}
2018-10-10 06:56:13 +00:00
s . getFileBinDirectory = function ( e ) {
2018-06-09 23:34:06 +00:00
if ( e . mid && ! e . id ) { e . id = e . mid } ;
return s . dir . fileBin + e . ke + '/' + e . id + '/' ;
}
//filters set by the user in their dashboard
//deleting old videos is part of the filter - config.cron.deleteOld
2018-10-10 06:56:13 +00:00
s . checkFilterRules = function ( v , callback ) {
2018-06-09 23:34:06 +00:00
//filters
if ( ! v . d . filters || v . d . filters == '' ) {
v . d . filters = { } ;
}
//delete old videos with filter
2018-11-05 20:55:58 +00:00
if ( config . cron . deleteOld === true ) {
2018-09-15 20:31:03 +00:00
var where = [ {
"p1" : "end" ,
2018-11-05 20:55:58 +00:00
"p2" : "<=" ,
"p3" : s . sqlDate ( v . d . days + " DAY" )
2018-09-15 20:31:03 +00:00
} ]
//exclude monitors with their own max days
v . monitorsWithMaxKeepDays . forEach ( function ( mid ) {
where . push ( {
"p1" : "mid" ,
"p2" : "!=" ,
"p3" : mid ,
} )
} )
2018-06-21 05:45:07 +00:00
v . d . filters . deleteOldVideosByCron = {
"id" : "deleteOldVideosByCron" ,
"name" : "deleteOldVideosByCron" ,
2018-06-09 23:34:06 +00:00
"sort_by" : "time" ,
"sort_by_direction" : "ASC" ,
"limit" : "" ,
"enabled" : "1" ,
"archive" : "0" ,
"email" : "0" ,
"delete" : "1" ,
"execute" : "" ,
2018-09-15 20:31:03 +00:00
"where" : where
2018-06-09 23:34:06 +00:00
} ;
}
2018-06-13 05:02:03 +00:00
s . debugLog ( 'Filters' )
2018-06-09 23:34:06 +00:00
var keys = Object . keys ( v . d . filters )
if ( keys . length > 0 ) {
keys . forEach ( function ( m , current ) {
2018-06-13 05:02:03 +00:00
// b = filter
var b = v . d . filters [ m ] ;
s . debugLog ( b )
2018-06-09 23:34:06 +00:00
if ( b . enabled === "1" ) {
b . ar = [ v . ke ] ;
b . sql = [ ] ;
b . where . forEach ( function ( j , k ) {
if ( j . p1 === 'ke' ) { j . p3 = v . ke }
switch ( j . p3 _type ) {
case 'function' :
b . sql . push ( j . p1 + ' ' + j . p2 + ' ' + j . p3 )
break ;
default :
b . sql . push ( j . p1 + ' ' + j . p2 + ' ?' )
b . ar . push ( j . p3 )
break ;
}
} )
b . sql = 'WHERE ke=? AND status != 0 AND details NOT LIKE \'%"archived":"1"%\' AND (' + b . sql . join ( ' AND ' ) + ')' ;
if ( b . sort _by && b . sort _by !== '' ) {
b . sql += ' ORDER BY `' + b . sort _by + '` ' + b . sort _by _direction
}
if ( b . limit && b . limit !== '' ) {
b . sql += ' LIMIT ' + b . limit
}
s . sqlQuery ( 'SELECT * FROM Videos ' + b . sql , b . ar , function ( err , r ) {
if ( r && r [ 0 ] ) {
2018-06-21 05:45:07 +00:00
if ( r . length > 0 || config . debugLog === true ) {
s . cx ( { f : 'filterMatch' , msg : r . length + ' SQL rows match "' + m + '"' , ke : v . ke , time : moment ( ) } )
}
2018-06-09 23:34:06 +00:00
b . cx = {
f : 'filters' ,
name : b . name ,
videos : r ,
time : moment ( ) ,
ke : v . ke ,
id : b . id
} ;
if ( b . archive === "1" ) {
s . cx ( { f : 'filters' , ff : 'archive' , videos : r , time : moment ( ) , ke : v . ke , id : b . id } ) ;
2018-06-21 05:45:07 +00:00
} else if ( b . delete === "1" ) {
s . cx ( { f : 'filters' , ff : 'delete' , videos : r , time : moment ( ) , ke : v . ke , id : b . id } ) ;
2018-06-09 23:34:06 +00:00
}
if ( b . email === "1" ) {
b . cx . ff = 'email' ;
b . cx . delete = b . delete ;
b . cx . mail = v . mail ;
b . cx . execute = b . execute ;
b . cx . query = b . sql ;
s . cx ( b . cx ) ;
}
if ( b . execute && b . execute !== "" ) {
s . cx ( { f : 'filters' , ff : 'execute' , execute : b . execute , time : moment ( ) } ) ;
}
}
} )
}
if ( current === keys . length - 1 ) {
//last filter
callback ( )
}
} )
} else {
//no filters
callback ( )
}
}
//database rows with no videos in the filesystem
2018-10-10 06:56:13 +00:00
s . deleteRowsWithNoVideo = function ( v , callback ) {
2018-06-09 23:34:06 +00:00
if (
config . cron . deleteNoVideo === true && (
config . cron . deleteNoVideoRecursion === true ||
( config . cron . deleteNoVideoRecursion === false && ! s . alreadyDeletedRowsWithNoVideosOnStart [ v . ke ] )
)
) {
s . alreadyDeletedRowsWithNoVideosOnStart [ v . ke ] = true ;
es = { } ;
2018-11-05 20:55:58 +00:00
s . sqlQuery ( 'SELECT * FROM Videos WHERE ke=? AND status!=0 AND details NOT LIKE \'%"archived":"1"%\' AND time < ?' , [ v . ke , s . sqlDate ( '10 MINUTE' ) ] , function ( err , evs ) {
2018-06-09 23:34:06 +00:00
if ( evs && evs [ 0 ] ) {
es . del = [ ] ; es . ar = [ v . ke ] ;
evs . forEach ( function ( ev ) {
2018-06-21 05:45:07 +00:00
var filename
var details
try {
details = JSON . parse ( ev . details )
} catch ( err ) {
if ( details instanceof Object ) {
details = ev . details
} else {
details = { }
}
}
var dir = s . getVideoDirectory ( ev )
2018-06-12 21:27:01 +00:00
if ( details . isUTC === true ) {
2018-06-21 05:45:07 +00:00
filename = s . localToUtc ( ev . time ) . format ( 'YYYY-MM-DDTHH-mm-ss' ) + '.' + ev . ext
} else {
filename = s . moment ( ev . time ) + '.' + ev . ext
2018-06-12 21:27:01 +00:00
}
2018-06-21 05:45:07 +00:00
fileExists = fs . existsSync ( dir + filename )
2018-06-12 21:27:01 +00:00
if ( fileExists !== true ) {
2018-09-29 20:09:47 +00:00
s . deleteVideo ( ev )
2018-06-12 21:27:01 +00:00
s . tx ( { f : 'video_delete' , filename : filename + '.' + ev . ext , mid : ev . mid , ke : ev . ke , time : ev . time , end : s . moment ( new Date , 'YYYY-MM-DD HH:mm:ss' ) } , 'GRP_' + ev . ke ) ;
2018-06-09 23:34:06 +00:00
}
} ) ;
2018-06-21 05:45:07 +00:00
if ( es . del . length > 0 || config . debugLog === true ) {
2018-06-09 23:34:06 +00:00
s . cx ( { f : 'deleteNoVideo' , msg : es . del . length + ' SQL rows with no file deleted' , ke : v . ke , time : moment ( ) } )
}
}
setTimeout ( function ( ) {
callback ( )
} , 3000 )
} )
} else {
callback ( )
}
}
//info about what the application is doing
2018-10-10 06:56:13 +00:00
s . deleteOldLogs = function ( v , callback ) {
2018-06-09 23:34:06 +00:00
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 ) {
2018-11-05 20:55:58 +00:00
s . sqlQuery ( "DELETE FROM Logs WHERE ke=? AND `time` < ?" , [ v . ke , s . sqlDate ( v . d . log _days + ' DAY' ) ] , function ( err , rrr ) {
2018-06-09 23:34:06 +00:00
callback ( )
if ( err ) return console . error ( err ) ;
2018-06-21 05:45:07 +00:00
if ( rrr . affectedRows && rrr . affectedRows . length > 0 || config . debugLog === true ) {
s . cx ( { f : 'deleteLogs' , msg : ( rrr . affectedRows || 0 ) + ' SQL rows older than ' + v . d . log _days + ' days deleted' , ke : v . ke , time : moment ( ) } )
2018-06-09 23:34:06 +00:00
}
} )
} else {
callback ( )
}
}
//events - motion, object, etc. detections
2018-10-10 06:56:13 +00:00
s . deleteOldEvents = function ( v , callback ) {
2018-06-09 23:34:06 +00:00
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 ) {
2018-11-05 20:55:58 +00:00
s . sqlQuery ( "DELETE FROM Events WHERE ke=? AND `time` < ?" , [ v . ke , s . sqlDate ( v . d . event _days + ' DAY' ) ] , function ( err , rrr ) {
2018-06-09 23:34:06 +00:00
callback ( )
if ( err ) return console . error ( err ) ;
2018-06-21 05:45:07 +00:00
if ( rrr . affectedRows && rrr . affectedRows . length > 0 || config . debugLog === true ) {
s . cx ( { f : 'deleteEvents' , msg : ( rrr . affectedRows || 0 ) + ' SQL rows older than ' + v . d . event _days + ' days deleted' , ke : v . ke , time : moment ( ) } )
2018-06-09 23:34:06 +00:00
}
} )
} else {
callback ( )
}
}
//check for temporary files (special archive)
2018-10-10 06:56:13 +00:00
s . deleteOldFileBins = function ( v , callback ) {
2018-06-09 23:34:06 +00:00
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 ) {
2018-11-05 20:55:58 +00:00
var fileBinQuery = " FROM Files WHERE ke=? AND `time` < ?" ;
s . sqlQuery ( "SELECT *" + fileBinQuery , [ v . ke , s . sqlDate ( v . d . fileBin _days + ' DAY' ) ] , function ( err , files ) {
2018-06-09 23:34:06 +00:00
if ( files && files [ 0 ] ) {
//delete the files
files . forEach ( function ( file ) {
fs . unlink ( s . getFileBinDirectory ( file ) + file . name , function ( err ) {
// if(err)console.error(err)
} )
} )
//delete the database rows
s . sqlQuery ( "DELETE" + fileBinQuery , [ v . ke , v . d . fileBin _days ] , function ( err , rrr ) {
callback ( )
if ( err ) return console . error ( err ) ;
2018-06-21 05:45:07 +00:00
if ( rrr . affectedRows && rrr . affectedRows . length > 0 || config . debugLog === true ) {
s . cx ( { f : 'deleteFileBins' , msg : ( rrr . affectedRows || 0 ) + ' files older than ' + v . d . fileBin _days + ' days deleted' , ke : v . ke , time : moment ( ) } )
2018-06-09 23:34:06 +00:00
}
} )
} else {
callback ( )
}
} )
} else {
callback ( )
}
}
//check for files with no database row
2018-10-10 06:56:13 +00:00
s . 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.' )
2018-06-09 23:34:06 +00:00
}
2018-10-10 06:56:13 +00:00
callback ( )
2018-06-09 23:34:06 +00:00
}
//user processing function
s . processUser = function ( number , rows ) {
var v = rows [ number ] ;
if ( ! v ) {
//no user object given
return
}
2018-06-12 21:27:01 +00:00
s . debugLog ( v )
2018-06-09 23:34:06 +00:00
if ( ! s . alreadyDeletedRowsWithNoVideosOnStart [ v . ke ] ) {
s . alreadyDeletedRowsWithNoVideosOnStart [ v . ke ] = false ;
}
if ( ! s . overlapLock [ v . ke ] ) {
// set overlap lock
s . overlapLock [ v . ke ] = true ;
//set permissions
v . d = JSON . parse ( v . details ) ;
//size
if ( ! v . d . size || v . d . size == '' ) { v . d . size = 10000 } else { v . d . size = parseFloat ( v . d . size ) } ;
//days to keep videos
if ( ! v . d . days || v . d . days == '' ) { v . d . days = 5 } else { v . d . days = parseFloat ( v . d . days ) } ;
s . sqlQuery ( 'SELECT * FROM Monitors WHERE ke=?' , [ v . ke ] , function ( err , rr ) {
2018-06-12 21:27:01 +00:00
if ( ! v . d . filters || v . d . filters == '' ) {
v . d . filters = { } ;
}
2018-09-15 20:31:03 +00:00
v . monitorsWithMaxKeepDays = [ ]
2018-06-09 23:34:06 +00:00
rr . forEach ( function ( b , m ) {
b . details = JSON . parse ( b . details ) ;
if ( b . details . max _keep _days && b . details . max _keep _days !== '' ) {
2018-09-15 20:31:03 +00:00
v . monitorsWithMaxKeepDays . push ( b . mid )
2018-06-21 05:45:07 +00:00
v . d . filters [ 'deleteOldVideosByCron' + b . mid ] = {
"id" : 'deleteOldVideosByCron' + b . mid ,
"name" : 'deleteOldVideosByCron' + b . mid ,
2018-06-09 23:34:06 +00:00
"sort_by" : "time" ,
"sort_by_direction" : "ASC" ,
"limit" : "" ,
"enabled" : "1" ,
"archive" : "0" ,
"email" : "0" ,
"delete" : "1" ,
"execute" : "" ,
"where" : [ {
2018-09-15 20:31:03 +00:00
"p1" : "mid" ,
2018-06-09 23:34:06 +00:00
"p2" : "=" ,
"p3" : b . mid
} , {
"p1" : "end" ,
"p2" : "<" ,
2018-11-05 20:55:58 +00:00
"p3" : s . sqlDate ( b . details . max _keep _days + " DAY" )
2018-06-09 23:34:06 +00:00
} ]
} ;
}
} )
s . deleteOldLogs ( v , function ( ) {
2018-06-13 05:02:03 +00:00
s . debugLog ( '--- deleteOldLogs Complete' )
2018-06-09 23:34:06 +00:00
s . deleteOldFileBins ( v , function ( ) {
2018-06-13 05:02:03 +00:00
s . debugLog ( '--- deleteOldFileBins Complete' )
2018-06-09 23:34:06 +00:00
s . deleteOldEvents ( v , function ( ) {
2018-06-13 05:02:03 +00:00
s . debugLog ( '--- deleteOldEvents Complete' )
2018-06-09 23:34:06 +00:00
s . checkFilterRules ( v , function ( ) {
2018-06-13 05:02:03 +00:00
s . debugLog ( '--- checkFilterRules Complete' )
2018-06-09 23:34:06 +00:00
s . deleteRowsWithNoVideo ( v , function ( ) {
2018-06-13 05:02:03 +00:00
s . debugLog ( '--- deleteRowsWithNoVideo Complete' )
2018-06-09 23:34:06 +00:00
s . checkForOrphanedFiles ( v , function ( ) {
//done user, unlock current, and do next
s . overlapLock [ v . ke ] = false ;
s . processUser ( number + 1 , rows )
} )
} )
} )
} )
} )
} )
} )
2018-06-12 21:27:01 +00:00
} else {
s . processUser ( number + 1 , rows )
2018-06-09 23:34:06 +00:00
}
}
//recursive function
s . cron = function ( ) {
x = { } ;
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 )
}
} )
s . timeout = setTimeout ( function ( ) {
s . cron ( ) ;
} , parseFloat ( config . cron . interval ) * 60000 * 60 )
}
s . cron ( ) ;
//socket commander
io . on ( 'f' , function ( d ) {
switch ( d . f ) {
case 'start' : case 'restart' :
clearTimeout ( s . timeout ) ;
s . cron ( ) ;
break ;
case 'stop' :
clearTimeout ( s . timeout ) ;
break ;
}
} )
2018-09-15 20:31:03 +00:00
console . log ( 'Shinobi : cron.js started' )