Shinobi/libs/scheduler.js

264 lines
11 KiB
JavaScript

module.exports = function(s,config,lang,app,io){
s.schedules = {}
//Get all Schedules
s.getAllSchedules = function(callback){
s.schedules = {}
s.sqlQuery('SELECT * FROM Schedules',function(err,rows){
rows.forEach(function(schedule){
s.updateSchedule(schedule)
})
if(callback)callback()
})
}
//update schedule
s.updateSchedule = function(row){
var schedule = Object.assign(row,{})
if(!s.schedules[schedule.ke])s.schedules[schedule.ke] = {}
s.checkDetails(schedule)
if(!s.schedules[schedule.ke][schedule.name]){
s.schedules[schedule.ke][schedule.name] = schedule
}else{
s.schedules[schedule.ke][schedule.name] = Object.assign(s.schedules[schedule.ke][schedule.name],schedule)
}
}
//check time in schedule
s.checkTimeAgainstSchedule = function(start,end,callback){
try{
if(
start
){
var checkStartTime = new Date()
var startSplit = start.split(':')
var startHour = parseInt(startSplit[0])
var startMin = parseInt(startSplit[1])
checkStartTime.setHours(startHour)
checkStartTime.setMinutes(startMin)
if(end){
var checkEndTime = new Date()
var endSplit = end.split(':')
var endHour = parseInt(endSplit[0])
var endMin = parseInt(endSplit[1])
checkEndTime.setHours(endHour)
checkEndTime.setMinutes(endMin)
}
var currentDate = new Date()
if(
(
currentDate >= checkStartTime &&
currentDate <= checkEndTime
) ||
currentDate >= checkStartTime && !end
){
callback()
}else{
callback({
currentDate : currentDate,
startTime : checkStartTime,
endTime : checkEndTime
})
}
}else{
callback()
}
}catch(err){
console.log(err)
callback()
}
}
//check all Schedules
s.checkSchedules = function(v,callback){
var groupKeys = Object.keys(s.schedules)
groupKeys.forEach(function(key){
var scheduleNames = Object.keys(s.schedules[key])
scheduleNames.forEach(function(name){
var schedule = s.schedules[key][name]
if(!schedule.active && schedule.enabled === 1 && schedule.start && schedule.details.monitorStates){
s.checkTimeAgainstSchedule(schedule.start,schedule.end,function(err){
if(!err){
schedule.active = true
var monitorStates = schedule.details.monitorStates
monitorStates.forEach(function(stateName){
s.activateMonitorStates(key,stateName,{
ke: key,
uid: 'System',
details: {},
permissions: {},
lang: lang
},function(endData){
// console.log(endData)
})
})
}else{
schedule.active = false
}
})
}
})
})
}
//
s.findSchedule = function(groupKey,name,callback){
//presetQueryVals = [ke, type, name]
s.sqlQuery("SELECT * FROM Schedules WHERE ke=? AND name=? LIMIT 1",[groupKey,name],function(err,schedules){
var schedule
var notFound = false
if(schedules && schedules[0]){
schedule = schedules[0]
s.checkDetails(schedule)
}else{
notFound = true
}
callback(notFound,schedule)
})
}
//
var onProcessReady = function(){
s.getAllSchedules(function(){
s.checkSchedules()
})
setInterval(function(){
s.checkSchedules()
},1000 * 60 * 5)
}
/**
* WebServerPath : API : Get Schedule
*/
app.all([
config.webPaths.apiPrefix+':auth/schedule/:ke',
config.webPaths.adminApiPrefix+':auth/schedule/:ke',
config.webPaths.apiPrefix+':auth/schedule/:ke/:name',
config.webPaths.adminApiPrefix+':auth/schedule/:ke/:name',
config.webPaths.apiPrefix+':auth/schedules/:ke',
config.webPaths.adminApiPrefix+':auth/schedules/:ke',
config.webPaths.apiPrefix+':auth/schedules/:ke/:name',
config.webPaths.adminApiPrefix+':auth/schedules/:ke/:name',
],function (req,res){
s.auth(req.params,function(user){
var endData = {
ok : false
}
if(user.details.sub){
endData.msg = user.lang['Not Permitted']
s.closeJsonResponse(res,endData)
return
}
var theQuery = "SELECT * FROM Schedules WHERE ke=?"
var theQueryValues = [req.params.ke]
if(req.params.name){
theQuery += ' AND name=?'
theQueryValues.push(req.params.name)
}
s.sqlQuery(theQuery,theQueryValues,function(err,schedules){
if(schedules && schedules[0]){
endData.ok = true
schedules.forEach(function(schedule){
s.checkDetails(schedule)
})
endData.schedules = schedules
}else{
endData.msg = user.lang['Not Found']
}
s.closeJsonResponse(res,endData)
})
})
})
/**
* WebServerPath : API : Update Schedule
*/
app.all([
config.webPaths.apiPrefix+':auth/schedule/:ke/:name/:action',
config.webPaths.adminApiPrefix+':auth/schedule/:ke/:name/:action',
config.webPaths.apiPrefix+':auth/schedules/:ke/:name/:action',
config.webPaths.adminApiPrefix+':auth/schedules/:ke/:name/:action'
],function (req,res){
s.auth(req.params,function(user){
var endData = {
ok : false
}
if(user.details.sub){
endData.msg = user.lang['Not Permitted']
s.closeJsonResponse(res,endData)
return
}
switch(req.params.action){
case'insert':case'edit':
var form = s.getPostData(req)
s.checkDetails(form)
if(!form || !form.details){
endData.msg = user.lang['Form Data Not Found']
s.closeJsonResponse(res,endData)
return
}
form.enabled = parseInt(form.enabled) || 1;
s.findSchedule(req.params.ke,req.params.name,function(notFound,preset){
if(notFound === true){
endData.msg = lang["Inserted Schedule Configuration"]
var insertData = {
ke: req.params.ke,
name: req.params.name,
details: s.stringJSON(form.details),
start: form.start,
end: form.end,
enabled: form.enabled
}
s.sqlQuery('INSERT INTO Schedules ('+Object.keys(insertData).join(',')+') VALUES (?,?,?,?,?,?)',Object.values(insertData))
s.tx({
f: 'add_schedule',
insertData: insertData,
ke: req.params.ke,
name: req.params.name
},'GRP_'+req.params.ke)
}else{
endData.msg = lang["Edited Schedule Configuration"]
var insertData = {
details: s.stringJSON(form.details),
start: form.start,
end: form.end,
enabled: form.enabled,
ke: req.params.ke,
name: req.params.name
}
s.sqlQuery('UPDATE Schedules SET details=?,start=?,end=?,enabled=? WHERE ke=? AND name=?',Object.values(insertData))
s.tx({
f: 'edit_schedule',
insertData: insertData,
ke: req.params.ke,
name: req.params.name
},'GRP_'+req.params.ke)
}
s.updateSchedule({
ke: req.params.ke,
name: req.params.name,
details: s.stringJSON(form.details),
start: form.start,
end: form.end,
enabled: form.enabled
})
endData.ok = true
s.closeJsonResponse(res,endData)
})
break;
case'delete':
s.findSchedule(req.params.ke,req.params.name,function(notFound,schedule){
if(notFound === true){
endData.msg = user.lang['Schedule Configuration Not Found']
s.closeJsonResponse(res,endData)
}else{
s.sqlQuery('DELETE FROM Schedules WHERE ke=? AND name=?',[req.params.ke,req.params.name],function(err){
if(!err){
endData.msg = lang["Deleted Schedule Configuration"]
endData.ok = true
if(s.schedules[schedule.ke])delete(s.schedules[schedule.ke][schedule.name])
}
s.closeJsonResponse(res,endData)
})
}
})
break;
}
})
})
//bind events
s.onProcessReady(onProcessReady)
}