236 lines
12 KiB
JavaScript
236 lines
12 KiB
JavaScript
var fs = require('fs');
|
|
var events = require('events');
|
|
var spawn = require('child_process').spawn;
|
|
var exec = require('child_process').exec;
|
|
module.exports = function(s,config){
|
|
s.purgeDiskForGroup = function(e){
|
|
if(config.cron.deleteOverMax === true){
|
|
s.group[e.ke].sizePurgeQueue.push(1)
|
|
if(s.group[e.ke].sizePurging !== true){
|
|
s.group[e.ke].sizePurging = true
|
|
var finish = function(){
|
|
//remove value just used from queue
|
|
s.group[e.ke].sizePurgeQueue.shift()
|
|
//do next one
|
|
if(s.group[e.ke].sizePurgeQueue.length > 0){
|
|
checkQueue()
|
|
}else{
|
|
s.group[e.ke].sizePurging=false
|
|
s.sendDiskUsedAmountToClients(e)
|
|
}
|
|
}
|
|
var checkQueue = function(){
|
|
//get first in queue
|
|
var currentPurge = s.group[e.ke].sizePurgeQueue[0]
|
|
var deleteVideos = function(){
|
|
//run purge command
|
|
if(s.group[e.ke].usedSpace > (s.group[e.ke].sizeLimit*config.cron.deleteOverMaxOffset)){
|
|
s.sqlQuery('SELECT * FROM Videos WHERE status != 0 AND details NOT LIKE \'%"archived":"1"%\' AND ke=? ORDER BY `time` ASC LIMIT 3',[e.ke],function(err,videos){
|
|
var videosToDelete = []
|
|
var queryValues = [e.ke]
|
|
var completedCheck = 0
|
|
if(videos){
|
|
videos.forEach(function(video){
|
|
video.dir = s.getVideoDirectory(video) + s.formattedTime(video.time) + '.' + video.ext
|
|
videosToDelete.push('(mid=? AND `time`=?)')
|
|
queryValues.push(video.mid)
|
|
queryValues.push(video.time)
|
|
fs.chmod(video.dir,0o777,function(err){
|
|
fs.unlink(video.dir,function(err){
|
|
++completedCheck
|
|
if(err){
|
|
fs.stat(video.dir,function(err){
|
|
if(!err){
|
|
s.file('delete',video.dir)
|
|
}
|
|
})
|
|
}
|
|
if(videosToDelete.length === completedCheck){
|
|
videosToDelete = videosToDelete.join(' OR ')
|
|
s.sqlQuery('DELETE FROM Videos WHERE ke =? AND ('+videosToDelete+')',queryValues,function(){
|
|
deleteVideos()
|
|
})
|
|
}
|
|
})
|
|
})
|
|
s.setDiskUsedForGroup(e,-(video.size/1000000))
|
|
s.tx({
|
|
f: 'video_delete',
|
|
ff: 'over_max',
|
|
filename: s.formattedTime(video.time)+'.'+video.ext,
|
|
mid: video.mid,
|
|
ke: video.ke,
|
|
time: video.time,
|
|
end: s.formattedTime(new Date,'YYYY-MM-DD HH:mm:ss')
|
|
},'GRP_'+e.ke)
|
|
})
|
|
}else{
|
|
console.log(err)
|
|
}
|
|
if(videosToDelete.length === 0){
|
|
finish()
|
|
}
|
|
})
|
|
}else{
|
|
finish()
|
|
}
|
|
}
|
|
deleteVideos()
|
|
}
|
|
checkQueue()
|
|
}
|
|
}else{
|
|
s.sendDiskUsedAmountToClients(e)
|
|
}
|
|
}
|
|
s.setDiskUsedForGroup = function(e,bytes){
|
|
//`bytes` will be used as the value to add or substract
|
|
if(s.group[e.ke] && s.group[e.ke].diskUsedEmitter){
|
|
s.group[e.ke].diskUsedEmitter.emit('set',bytes)
|
|
}
|
|
}
|
|
s.purgeCloudDiskForGroup = function(e,storageType){
|
|
if(s.group[e.ke].diskUsedEmitter){
|
|
s.group[e.ke].diskUsedEmitter.emit('purgeCloud',storageType)
|
|
}
|
|
}
|
|
s.setCloudDiskUsedForGroup = function(e,usage){
|
|
//`bytes` will be used as the value to add or substract
|
|
if(s.group[e.ke].diskUsedEmitter){
|
|
s.group[e.ke].diskUsedEmitter.emit('setCloud',usage)
|
|
}
|
|
}
|
|
s.sendDiskUsedAmountToClients = function(e){
|
|
//send the amount used disk space to connected users
|
|
if(s.group[e.ke]&&s.group[e.ke].init){
|
|
s.tx({f:'diskUsed',size:s.group[e.ke].usedSpace,limit:s.group[e.ke].sizeLimit},'GRP_'+e.ke);
|
|
}
|
|
}
|
|
//user log
|
|
s.userLog = function(e,x){
|
|
if(e.id && !e.mid)e.mid = e.id
|
|
if(!x||!e.mid){return}
|
|
if((e.details&&e.details.sqllog==='1')||e.mid.indexOf('$')>-1){
|
|
s.sqlQuery('INSERT INTO Logs (ke,mid,info) VALUES (?,?,?)',[e.ke,e.mid,s.s(x)]);
|
|
}
|
|
s.tx({f:'log',ke:e.ke,mid:e.mid,log:x,time:s.timeObject()},'GRPLOG_'+e.ke);
|
|
}
|
|
s.loadGroup = function(e){
|
|
if(!s.group[e.ke]){
|
|
s.group[e.ke]={}
|
|
}
|
|
if(!s.group[e.ke].init){
|
|
s.group[e.ke].init={}
|
|
}
|
|
if(!s.group[e.ke].fileBin){s.group[e.ke].fileBin={}};
|
|
if(!s.group[e.ke].users){s.group[e.ke].users={}}
|
|
if(!s.group[e.ke].dashcamUsers){s.group[e.ke].dashcamUsers={}}
|
|
if(!s.group[e.ke].sizePurgeQueue){s.group[e.ke].sizePurgeQueue=[]}
|
|
if(!e.limit||e.limit===''){e.limit=10000}else{e.limit=parseFloat(e.limit)}
|
|
//save global space limit for group key (mb)
|
|
s.group[e.ke].sizeLimit=e.limit;
|
|
//save global used space as megabyte value
|
|
s.group[e.ke].usedSpace=e.size/1000000;
|
|
//emit the changes to connected users
|
|
s.sendDiskUsedAmountToClients(e)
|
|
}
|
|
s.loadGroupApps = function(e){
|
|
// e = user
|
|
if(!s.group[e.ke].init){
|
|
s.group[e.ke].init={};
|
|
}
|
|
s.sqlQuery('SELECT * FROM Users WHERE ke=? AND details NOT LIKE ?',[e.ke,'%"sub"%'],function(ar,r){
|
|
if(r&&r[0]){
|
|
r=r[0];
|
|
ar=JSON.parse(r.details);
|
|
//load extenders
|
|
s.loadGroupAppExtensions.forEach(function(extender){
|
|
extender(r)
|
|
})
|
|
//disk Used Emitter
|
|
if(!s.group[e.ke].diskUsedEmitter){
|
|
s.group[e.ke].diskUsedEmitter = new events.EventEmitter()
|
|
s.group[e.ke].diskUsedEmitter.on('setCloud',function(currentChange){
|
|
var amount = currentChange.amount
|
|
var storageType = currentChange.storageType
|
|
var cloudDisk = s.group[e.ke].cloudDiskUse[storageType]
|
|
//validate current values
|
|
if(!cloudDisk.usedSpace){
|
|
cloudDisk.usedSpace = 0
|
|
}else{
|
|
cloudDisk.usedSpace = parseFloat(cloudDisk.usedSpace)
|
|
}
|
|
if(cloudDisk.usedSpace < 0 || isNaN(cloudDisk.usedSpace)){
|
|
cloudDisk.usedSpace = 0
|
|
}
|
|
//change global size value
|
|
cloudDisk.usedSpace = cloudDisk.usedSpace + amount
|
|
})
|
|
s.group[e.ke].diskUsedEmitter.on('purgeCloud',function(storageType){
|
|
if(config.cron.deleteOverMax === true){
|
|
//set queue processor
|
|
var finish=function(){
|
|
// s.sendDiskUsedAmountToClients(e)
|
|
}
|
|
var deleteVideos = function(){
|
|
//run purge command
|
|
var cloudDisk = s.group[e.ke].cloudDiskUse[storageType]
|
|
if(cloudDisk.sizeLimitCheck && cloudDisk.usedSpace > (cloudDisk.sizeLimit*config.cron.deleteOverMaxOffset)){
|
|
s.sqlQuery('SELECT * FROM `Cloud Videos` WHERE status != 0 AND ke=? AND details LIKE \'%"type":"'+storageType+'"%\' ORDER BY `time` ASC LIMIT 2',[e.ke],function(err,videos){
|
|
var videosToDelete = []
|
|
var queryValues = [e.ke]
|
|
if(!videos)return console.log(err)
|
|
videos.forEach(function(video){
|
|
video.dir = s.getVideoDirectory(video) + s.formattedTime(video.time) + '.' + video.ext
|
|
videosToDelete.push('(mid=? AND `time`=?)')
|
|
queryValues.push(video.mid)
|
|
queryValues.push(video.time)
|
|
s.setCloudDiskUsedForGroup(e,{
|
|
amount : -(video.size/1000000),
|
|
storageType : storageType
|
|
})
|
|
s.deleteVideoFromCloudExtensionsRunner(e,storageType,video)
|
|
})
|
|
if(videosToDelete.length > 0){
|
|
videosToDelete = videosToDelete.join(' OR ')
|
|
s.sqlQuery('DELETE FROM `Cloud Videos` WHERE ke =? AND ('+videosToDelete+')',queryValues,function(){
|
|
deleteVideos()
|
|
})
|
|
}else{
|
|
finish()
|
|
}
|
|
})
|
|
}else{
|
|
finish()
|
|
}
|
|
}
|
|
deleteVideos()
|
|
}else{
|
|
// s.sendDiskUsedAmountToClients(e)
|
|
}
|
|
})
|
|
//s.setDiskUsedForGroup
|
|
s.group[e.ke].diskUsedEmitter.on('set',function(currentChange){
|
|
//validate current values
|
|
if(!s.group[e.ke].usedSpace){
|
|
s.group[e.ke].usedSpace=0
|
|
}else{
|
|
s.group[e.ke].usedSpace=parseFloat(s.group[e.ke].usedSpace)
|
|
}
|
|
if(s.group[e.ke].usedSpace<0||isNaN(s.group[e.ke].usedSpace)){
|
|
s.group[e.ke].usedSpace=0
|
|
}
|
|
//change global size value
|
|
s.group[e.ke].usedSpace += currentChange
|
|
//remove value just used from queue
|
|
s.sendDiskUsedAmountToClients(e)
|
|
})
|
|
}
|
|
Object.keys(ar).forEach(function(v){
|
|
s.group[e.ke].init[v]=ar[v]
|
|
})
|
|
}
|
|
});
|
|
}
|
|
}
|