1
0
Fork 0
mirror of https://gitlab.com/Shinobi-Systems/ShinobiCE.git synced 2025-03-09 15:40:15 +00:00

fix circular json bug and add some async methods

This commit is contained in:
Moe 2019-10-28 13:38:48 -07:00
parent 4b7a58d409
commit b8bb4d1a69
2 changed files with 214 additions and 214 deletions

View file

@ -1419,218 +1419,218 @@ module.exports = function(s,config,lang,app,io){
} }
},res,req); },res,req);
}); });
/** // /**
* API : Zip Videos and Get Link from fileBin // * API : Zip Videos and Get Link from fileBin
*/ // */
app.get(config.webPaths.apiPrefix+':auth/zipVideos/:ke', function (req,res){ // app.get(config.webPaths.apiPrefix+':auth/zipVideos/:ke', function (req,res){
var failed = function(resp){ // var failed = function(resp){
res.setHeader('Content-Type', 'application/json'); // res.setHeader('Content-Type', 'application/json');
res.end(s.prettyPrint(resp)) // res.end(s.prettyPrint(resp))
} // }
if(req.query.videos && req.query.videos !== ''){ // if(req.query.videos && req.query.videos !== ''){
s.auth(req.params,function(user){ // s.auth(req.params,function(user){
var videosSelected = JSON.parse(req.query.videos) // var videosSelected = JSON.parse(req.query.videos)
var where = [] // var where = []
var values = [] // var values = []
videosSelected.forEach(function(video){ // videosSelected.forEach(function(video){
where.push("(ke=? AND mid=? AND `time`=?)") // where.push("(ke=? AND mid=? AND `time`=?)")
if(!video.ke)video.ke = req.params.ke // if(!video.ke)video.ke = req.params.ke
values.push(video.ke) // values.push(video.ke)
values.push(video.mid) // values.push(video.mid)
var time = s.nameToTime(video.filename) // var time = s.nameToTime(video.filename)
if(req.query.isUTC === 'true'){ // if(req.query.isUTC === 'true'){
time = s.utcToLocal(time) // time = s.utcToLocal(time)
} // }
time = new Date(time) // time = new Date(time)
values.push(time) // values.push(time)
}) // })
s.sqlQuery('SELECT * FROM Videos WHERE '+where.join(' OR '),values,function(err,r){ // s.sqlQuery('SELECT * FROM Videos WHERE '+where.join(' OR '),values,function(err,r){
var resp = {ok: false} // var resp = {ok: false}
if(r && r[0]){ // if(r && r[0]){
resp.ok = true // resp.ok = true
var zipDownload = null // var zipDownload = null
var tempFiles = [] // var tempFiles = []
var fileId = s.gid() // var fileId = s.gid()
var fileBinDir = s.dir.fileBin+req.params.ke+'/' // var fileBinDir = s.dir.fileBin+req.params.ke+'/'
var tempScript = s.dir.streams+req.params.ke+'/'+fileId+'.sh' // var tempScript = s.dir.streams+req.params.ke+'/'+fileId+'.sh'
var zippedFilename = s.formattedTime()+'-'+fileId+'-Shinobi_Recordings.zip' // var zippedFilename = s.formattedTime()+'-'+fileId+'-Shinobi_Recordings.zip'
var zippedFile = fileBinDir+zippedFilename // var zippedFile = fileBinDir+zippedFilename
var script = 'cd '+fileBinDir+' && zip -9 -r '+zippedFile // var script = 'cd '+fileBinDir+' && zip -9 -r '+zippedFile
res.on('close', () => { // res.on('close', () => {
if(zipDownload && zipDownload.destroy){ // if(zipDownload && zipDownload.destroy){
zipDownload.destroy() // zipDownload.destroy()
} // }
fs.unlink(zippedFile); // fs.unlink(zippedFile);
}) // })
fs.mkdir(fileBinDir,function(err){ // fs.mkdir(fileBinDir,function(err){
s.handleFolderError(err) // s.handleFolderError(err)
r.forEach(function(video){ // r.forEach(function(video){
var timeFormatted = s.formattedTime(video.time) // var timeFormatted = s.formattedTime(video.time)
video.filename = timeFormatted+'.'+video.ext // video.filename = timeFormatted+'.'+video.ext
var dir = s.getVideoDirectory(video)+video.filename // var dir = s.getVideoDirectory(video)+video.filename
var tempVideoFile = timeFormatted+' - '+video.mid+'.'+video.ext // var tempVideoFile = timeFormatted+' - '+video.mid+'.'+video.ext
fs.writeFileSync(fileBinDir+tempVideoFile, fs.readFileSync(dir)) // fs.writeFileSync(fileBinDir+tempVideoFile, fs.readFileSync(dir))
tempFiles.push(fileBinDir+tempVideoFile) // tempFiles.push(fileBinDir+tempVideoFile)
script += ' "'+tempVideoFile+'"' // script += ' "'+tempVideoFile+'"'
}) // })
fs.writeFileSync(tempScript,script,'utf8') // fs.writeFileSync(tempScript,script,'utf8')
var zipCreate = spawn('sh',(tempScript).split(' '),{detached: true}) // var zipCreate = spawn('sh',(tempScript).split(' '),{detached: true})
zipCreate.stderr.on('data',function(data){ // zipCreate.stderr.on('data',function(data){
s.userLog({ke:req.params.ke,mid:'$USER'},{title:'Zip Create Error',msg:data.toString()}) // s.userLog({ke:req.params.ke,mid:'$USER'},{title:'Zip Create Error',msg:data.toString()})
}) // })
zipCreate.on('exit',function(data){ // zipCreate.on('exit',function(data){
fs.unlinkSync(tempScript) // fs.unlinkSync(tempScript)
tempFiles.forEach(function(file){ // tempFiles.forEach(function(file){
fs.unlink(file,function(){}) // fs.unlink(file,function(){})
}) // })
res.setHeader('Content-Disposition', 'attachment; filename="'+zippedFilename+'"') // res.setHeader('Content-Disposition', 'attachment; filename="'+zippedFilename+'"')
var zipDownload = fs.createReadStream(zippedFile) // var zipDownload = fs.createReadStream(zippedFile)
zipDownload.pipe(res) // zipDownload.pipe(res)
zipDownload.on('error', function (error) { // zipDownload.on('error', function (error) {
var errorString = error.toString() // var errorString = error.toString()
s.userLog({ // s.userLog({
ke: req.params.ke, // ke: req.params.ke,
mid: '$USER' // mid: '$USER'
},{ // },{
title: 'Zip Download Error', // title: 'Zip Download Error',
msg: errorString // msg: errorString
}) // })
if(zipDownload && zipDownload.destroy){ // if(zipDownload && zipDownload.destroy){
zipDownload.destroy() // zipDownload.destroy()
} // }
res.end(s.prettyPrint({ // res.end(s.prettyPrint({
ok: false, // ok: false,
msg: errorString // msg: errorString
})) // }))
}) // })
zipDownload.on('close', function () { // zipDownload.on('close', function () {
res.end() // res.end()
zipDownload.destroy() // zipDownload.destroy()
fs.unlinkSync(zippedFile) // fs.unlinkSync(zippedFile)
}) // })
}) // })
}) // })
}else{ // }else{
failed({ok:false,msg:'No Videos Found'}) // failed({ok:false,msg:'No Videos Found'})
} // }
}) // })
},res,req); // },res,req);
}else{ // }else{
failed({ok:false,msg:'"videos" query variable is missing from request.'}) // failed({ok:false,msg:'"videos" query variable is missing from request.'})
} // }
}) // })
/** // /**
* API : Zip Cloud Videos and Get Link from fileBin // * API : Zip Cloud Videos and Get Link from fileBin
*/ // */
app.get(config.webPaths.apiPrefix+':auth/zipCloudVideos/:ke', function (req,res){ // app.get(config.webPaths.apiPrefix+':auth/zipCloudVideos/:ke', function (req,res){
var failed = function(resp){ // var failed = function(resp){
res.setHeader('Content-Type', 'application/json'); // res.setHeader('Content-Type', 'application/json');
res.end(s.prettyPrint(resp)) // res.end(s.prettyPrint(resp))
} // }
if(req.query.videos && req.query.videos !== ''){ // if(req.query.videos && req.query.videos !== ''){
s.auth(req.params,function(user){ // s.auth(req.params,function(user){
var videosSelected = JSON.parse(req.query.videos) // var videosSelected = JSON.parse(req.query.videos)
var where = [] // var where = []
var values = [] // var values = []
videosSelected.forEach(function(video){ // videosSelected.forEach(function(video){
where.push("(ke=? AND mid=? AND `time`=?)") // where.push("(ke=? AND mid=? AND `time`=?)")
if(!video.ke)video.ke = req.params.ke // if(!video.ke)video.ke = req.params.ke
values.push(video.ke) // values.push(video.ke)
values.push(video.mid) // values.push(video.mid)
var time = s.nameToTime(video.filename) // var time = s.nameToTime(video.filename)
if(req.query.isUTC === 'true'){ // if(req.query.isUTC === 'true'){
time = s.utcToLocal(time) // time = s.utcToLocal(time)
} // }
time = new Date(time) // time = new Date(time)
values.push(time) // values.push(time)
}) // })
s.sqlQuery('SELECT * FROM `Cloud Videos` WHERE '+where.join(' OR '),values,function(err,r){ // s.sqlQuery('SELECT * FROM `Cloud Videos` WHERE '+where.join(' OR '),values,function(err,r){
var resp = {ok: false} // var resp = {ok: false}
if(r && r[0]){ // if(r && r[0]){
resp.ok = true // resp.ok = true
var zipDownload = null // var zipDownload = null
var tempFiles = [] // var tempFiles = []
var fileId = s.gid() // var fileId = s.gid()
var fileBinDir = s.dir.fileBin+req.params.ke+'/' // var fileBinDir = s.dir.fileBin+req.params.ke+'/'
var tempScript = s.dir.streams+req.params.ke+'/'+fileId+'.sh' // var tempScript = s.dir.streams+req.params.ke+'/'+fileId+'.sh'
var zippedFilename = s.formattedTime()+'-'+fileId+'-Shinobi_Cloud_Backed_Recordings.zip' // var zippedFilename = s.formattedTime()+'-'+fileId+'-Shinobi_Cloud_Backed_Recordings.zip'
var zippedFile = fileBinDir+zippedFilename // var zippedFile = fileBinDir+zippedFilename
var script = 'cd '+fileBinDir+' && zip -9 -r '+zippedFile // var script = 'cd '+fileBinDir+' && zip -9 -r '+zippedFile
res.on('close', () => { // res.on('close', () => {
if(zipDownload && zipDownload.destroy){ // if(zipDownload && zipDownload.destroy){
zipDownload.destroy() // zipDownload.destroy()
} // }
fs.unlink(zippedFile); // fs.unlink(zippedFile);
}) // })
fs.mkdir(fileBinDir,function(err){ // fs.mkdir(fileBinDir,function(err){
var cloudDownloadCount = 0 // var cloudDownloadCount = 0
var getFile = function(video,completed){ // var getFile = function(video,completed){
if(!video)completed(); // if(!video)completed();
s.checkDetails(video) // s.checkDetails(video)
var filename = video.href.split('/') // var filename = video.href.split('/')
filename = filename[filename.length - 1] // filename = filename[filename.length - 1]
var timeFormatted = s.formattedTime(video.time) // var timeFormatted = s.formattedTime(video.time)
var tempVideoFile = video.details.type + '-' + video.mid + '-' + filename // var tempVideoFile = video.details.type + '-' + video.mid + '-' + filename
var tempFileWriteStream = fs.createWriteStream(fileBinDir+tempVideoFile) // var tempFileWriteStream = fs.createWriteStream(fileBinDir+tempVideoFile)
tempFileWriteStream.on('finish', function() { // tempFileWriteStream.on('finish', function() {
++cloudDownloadCount // ++cloudDownloadCount
getFile(r[cloudDownloadCount],completed) // getFile(r[cloudDownloadCount],completed)
}) // })
var cloudVideoDownload = request(video.href) // var cloudVideoDownload = request(video.href)
cloudVideoDownload.on('response', function (res) { // cloudVideoDownload.on('response', function (res) {
res.pipe(tempFileWriteStream) // res.pipe(tempFileWriteStream)
}) // })
tempFiles.push(fileBinDir+tempVideoFile) // tempFiles.push(fileBinDir+tempVideoFile)
script += ' "'+tempVideoFile+'"' // script += ' "'+tempVideoFile+'"'
} // }
getFile(r[cloudDownloadCount],function(){ // getFile(r[cloudDownloadCount],function(){
fs.writeFileSync(tempScript,script,'utf8') // fs.writeFileSync(tempScript,script,'utf8')
var zipCreate = spawn('sh',(tempScript).split(' '),{detached: true}) // var zipCreate = spawn('sh',(tempScript).split(' '),{detached: true})
zipCreate.stderr.on('data',function(data){ // zipCreate.stderr.on('data',function(data){
s.userLog({ke:req.params.ke,mid:'$USER'},{title:'Zip Create Error',msg:data.toString()}) // s.userLog({ke:req.params.ke,mid:'$USER'},{title:'Zip Create Error',msg:data.toString()})
}) // })
zipCreate.on('exit',function(data){ // zipCreate.on('exit',function(data){
fs.unlinkSync(tempScript) // fs.unlinkSync(tempScript)
tempFiles.forEach(function(file){ // tempFiles.forEach(function(file){
fs.unlink(file,function(){}) // fs.unlink(file,function(){})
}) // })
res.setHeader('Content-Disposition', 'attachment; filename="' + zippedFilename + '"') // res.setHeader('Content-Disposition', 'attachment; filename="' + zippedFilename + '"')
var zipDownload = fs.createReadStream(zippedFile) // var zipDownload = fs.createReadStream(zippedFile)
zipDownload.pipe(res) // zipDownload.pipe(res)
zipDownload.on('error', function (error) { // zipDownload.on('error', function (error) {
var errorString = error.toString() // var errorString = error.toString()
s.userLog({ // s.userLog({
ke: req.params.ke, // ke: req.params.ke,
mid: '$USER' // mid: '$USER'
},{ // },{
title: 'Zip Download Error', // title: 'Zip Download Error',
msg: errorString // msg: errorString
}) // })
if(zipDownload && zipDownload.destroy){ // if(zipDownload && zipDownload.destroy){
zipDownload.destroy() // zipDownload.destroy()
} // }
res.end(s.prettyPrint({ // res.end(s.prettyPrint({
ok: false, // ok: false,
msg: errorString // msg: errorString
})) // }))
}) // })
zipDownload.on('close', function () { // zipDownload.on('close', function () {
res.end() // res.end()
zipDownload.destroy() // zipDownload.destroy()
fs.unlinkSync(zippedFile) // fs.unlinkSync(zippedFile)
}) // })
}) // })
}) // })
}) // })
}else{ // }else{
failed({ok:false,msg:'No Videos Found'}) // failed({ok:false,msg:'No Videos Found'})
} // }
}) // })
},res,req); // },res,req);
}else{ // }else{
failed({ok:false,msg:'"videos" query variable is missing from request.'}) // failed({ok:false,msg:'"videos" query variable is missing from request.'})
} // }
}) // })
/** /**
* API : Get Cloud Video File (proxy) * API : Get Cloud Video File (proxy)
*/ */
@ -1988,7 +1988,7 @@ module.exports = function(s,config,lang,app,io){
}else{ }else{
action = Camera[req.params.action] action = Camera[req.params.action]
} }
console.log(s.parseJSON(req.query.options)) // console.log(s.parseJSON(req.query.options))
if(!action || typeof action !== 'function'){ if(!action || typeof action !== 'function'){
errorMessage(req.params.action+' is not an available ONVIF function. See https://github.com/futomi/node-onvif for functions.') errorMessage(req.params.action+' is not an available ONVIF function. See https://github.com/futomi/node-onvif for functions.')
}else{ }else{

View file

@ -24,7 +24,7 @@ module.exports = function(s,config,lang,app){
if(s.group[req.params.ke]&&s.group[req.params.ke].activeMonitors[req.params.id]){ if(s.group[req.params.ke]&&s.group[req.params.ke].activeMonitors[req.params.id]){
if(s.group[req.params.ke].activeMonitors[req.params.id].isStarted === true){ if(s.group[req.params.ke].activeMonitors[req.params.id].isStarted === true){
req.params.uid=user.uid; req.params.uid=user.uid;
s.renderPage(req,res,config.renderPaths.embed,{data:req.params,baseUrl:req.protocol+'://'+req.hostname,config: s.getConfigWithBranding(req.hostname),lang:user.lang,mon:CircularJSON.parse(CircularJSON.stringify(s.group[req.params.ke].rawMonitorConfigurations[req.params.id])),originalURL:s.getOriginalUrl(req)}); s.renderPage(req,res,config.renderPaths.embed,{data:req.params,baseUrl:req.protocol+'://'+req.hostname,config: s.getConfigWithBranding(req.hostname),lang:user.lang,mon:Object.assign(s.group[req.params.ke].rawMonitorConfigurations[req.params.id],{}),originalURL:s.getOriginalUrl(req)});
res.end() res.end()
}else{ }else{
res.end(user.lang['Cannot watch a monitor that isn\'t running.']) res.end(user.lang['Cannot watch a monitor that isn\'t running.'])