659 lines
45 KiB
JavaScript
659 lines
45 KiB
JavaScript
var fs = require('fs')
|
|
var request = require('request')
|
|
var execSync = require('child_process').execSync
|
|
module.exports = function(s,config,lang,io){
|
|
var temp = {}
|
|
var superUsers = require(s.location.super)
|
|
var requestURL = 'http://'+config.bindip + ':' + config.port +'/'
|
|
var requestSuperURL = 'http://localhost:' + config.port +'/super/' + superUsers[0].tokens[0] + '/'
|
|
var getBaseURL = function(){
|
|
return 'http://localhost:' + config.port +'/'
|
|
}
|
|
var buildRegularApiRequestURL = function(auth,path,groupKey){
|
|
return getBaseURL() + auth + '/' + path + '/' + groupKey + '/'
|
|
}
|
|
var buildAdminRequestURL = function(auth,path,groupKey){
|
|
return getBaseURL() + 'admin/' + auth + '/' + path + '/' + groupKey + '/'
|
|
}
|
|
var checkResult = function(functionName,expectedResult,testResult){
|
|
if(expectedResult !== testResult){
|
|
console.log(expectedResult,testResult)
|
|
console.log('x ' + functionName + ' : Failed!')
|
|
return false
|
|
}else{
|
|
console.log('✓ ' + functionName + ' : Success')
|
|
return true
|
|
}
|
|
}
|
|
var administratorAccountData = {
|
|
"mail":"test@test1.com",
|
|
"pass":"test1",
|
|
"pass_again":"test1",
|
|
"ke":"GroupKey123456",
|
|
"details":{
|
|
"factorAuth": "0",
|
|
"size": "10000",
|
|
"days": "5",
|
|
"event_days": "10",
|
|
"log_days": "10",
|
|
"max_camera": "",
|
|
"permissions": "all",
|
|
"edit_size": "1",
|
|
"edit_days": "1",
|
|
"edit_event_days": "1",
|
|
"edit_log_days": "1",
|
|
"use_admin": "1",
|
|
"use_aws_s3": "1",
|
|
"use_webdav": "1",
|
|
"use_discordbot": "1",
|
|
"use_ldap": "1"
|
|
}
|
|
}
|
|
var getAdministratorAccountData = function(){
|
|
return Object.assign(administratorAccountData,{})
|
|
}
|
|
var sampleMonitorObject = require('./testMonitor-WatchOnly.json')
|
|
var test = {
|
|
"basic.js" : {
|
|
checkRelativePath : function(next){
|
|
var expectedResult = s.mainDirectory + '/'
|
|
var testResult = s.checkRelativePath('')
|
|
checkResult('Internal Function : checkRelativePath',expectedResult,testResult)
|
|
next()
|
|
},
|
|
parseJSON : function(next){
|
|
var expectedResult = {}
|
|
var testResult = s.parseJSON('{}')
|
|
checkResult('Internal Function : parseJSON',JSON.stringify(expectedResult),JSON.stringify(testResult))
|
|
next()
|
|
},
|
|
stringJSON : function(next){
|
|
var expectedResult = '{}'
|
|
var testResult = s.stringJSON({})
|
|
checkResult('Internal Function : stringJSON',expectedResult,testResult)
|
|
next()
|
|
},
|
|
addUserPassToUrl : function(next){
|
|
var expectedResult = 'http://user:pass@url.com'
|
|
var testResult = s.addUserPassToUrl('http://url.com','user','pass')
|
|
checkResult('Internal Function : addUserPassToUrl',expectedResult,testResult)
|
|
next()
|
|
},
|
|
checkCorrectPathEnding : function(next){
|
|
var expectedResult = '/'
|
|
var testResult = s.checkCorrectPathEnding('')
|
|
checkResult('Internal Function : checkCorrectPathEnding',expectedResult,testResult)
|
|
next()
|
|
},
|
|
md5 : function(next){
|
|
var expectedResult = '5f4dcc3b5aa765d61d8327deb882cf99'
|
|
var testResult = s.md5('password')
|
|
checkResult('Internal Function : md5',expectedResult,testResult)
|
|
next()
|
|
},
|
|
sha256 : function(next){
|
|
var expectedResult = '9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'
|
|
var testResult = require('crypto').createHash('sha256').update('test').digest("hex")
|
|
checkResult('Internal Function : createHash/sha256',expectedResult,testResult)
|
|
next()
|
|
},
|
|
nameToTime : function(next){
|
|
var expectedResult = '2018-10-22 23:00:00'
|
|
var testResult = s.nameToTime('2018-10-22T23-00-00.mp4')
|
|
checkResult('Internal Function : nameToTime',expectedResult,testResult)
|
|
next()
|
|
},
|
|
ipRange : function(next){
|
|
var expectedResult = [
|
|
'192.168.1.1',
|
|
'192.168.1.2',
|
|
'192.168.1.3'
|
|
]
|
|
var testResult = s.ipRange('192.168.1.1','192.168.1.3')
|
|
checkResult('Internal Function : ipRange',JSON.stringify(expectedResult),JSON.stringify(testResult))
|
|
next()
|
|
},
|
|
portRange : function(next){
|
|
var expectedResult = [
|
|
8000,
|
|
8001,
|
|
8002,
|
|
]
|
|
var testResult = s.portRange(8000,8002)
|
|
checkResult('Internal Function : portRange',JSON.stringify(expectedResult),JSON.stringify(testResult))
|
|
next()
|
|
},
|
|
getFunctionParamNames : function(next){
|
|
var testing = function(arg1,arg2){}
|
|
var expectedResult = [
|
|
'arg1',
|
|
'arg2',
|
|
]
|
|
var testResult = s.getFunctionParamNames(testing)
|
|
checkResult('Internal Function : getFunctionParamNames',JSON.stringify(expectedResult),JSON.stringify(testResult))
|
|
next()
|
|
}
|
|
},
|
|
"ffmpeg.js" : {
|
|
splitForFFPMEG : function(next){
|
|
var expectedResult = [
|
|
'flag1',
|
|
'flag2',
|
|
'fl ag3',
|
|
]
|
|
var testResult = s.splitForFFPMEG('flag1 flag2 "fl ag3"')
|
|
checkResult('Internal Function : splitForFFPMEG',JSON.stringify(expectedResult),JSON.stringify(testResult))
|
|
next()
|
|
},
|
|
"ffmpeg" : function(next){
|
|
//command string builder
|
|
var x = {tmp : ''}
|
|
s.checkDetails(sampleMonitorObject)
|
|
sampleMonitorObject.url = s.buildMonitorUrl(sampleMonitorObject)
|
|
var expectedResult = '-loglevel warning -progress pipe:5 -analyzeduration 1000000 -probesize 1000000 -stream_loop -1 -fflags +igndts -re -i "https://cdn.shinobi.video:/videos/bears.mp4" -f mp4 -an -c:v copy -movflags +frag_keyframe+empty_moov+default_base_moof -metadata title="Poseidon Stream" -reset_timestamps 1 pipe:1'
|
|
s.ffmpegFunctions.buildMainInput(sampleMonitorObject,x)
|
|
s.ffmpegFunctions.buildMainStream(sampleMonitorObject,x)
|
|
s.ffmpegFunctions.buildMainRecording(sampleMonitorObject,x)
|
|
s.ffmpegFunctions.buildMainDetector(sampleMonitorObject,x)
|
|
s.ffmpegFunctions.assembleMainPieces(sampleMonitorObject,x)
|
|
var testResult = x.ffmpegCommandString
|
|
checkResult('Internal Function : ffmpeg',expectedResult,testResult)
|
|
//check pipe builder
|
|
var expectedResult = []
|
|
var times = config.pipeAddition
|
|
if(sampleMonitorObject.details.stream_channels){
|
|
times += sampleMonitorObject.details.stream_channels.length
|
|
}
|
|
for(var i=0; i < times; i++){
|
|
expectedResult.push('pipe')
|
|
}
|
|
s.ffmpegFunctions.createPipeArray(sampleMonitorObject,x)
|
|
var testResult = x.stdioPipes
|
|
checkResult('Internal Function : ffmpeg.createPipeArray',JSON.stringify(expectedResult),JSON.stringify(testResult))
|
|
next()
|
|
}
|
|
},
|
|
"webServer" : {
|
|
"super/accounts/saveSettings" : function(next){
|
|
console.log(requestSuperURL)
|
|
var userData = {
|
|
"mail": "admin@shinobi.video1",
|
|
"pass": "password",
|
|
"pass_again": "password"
|
|
}
|
|
var builtURL = requestSuperURL + 'accounts/saveSettings?data=' + encodeURIComponent(s.s(userData))
|
|
request(builtURL,function(err, httpResponse, body){
|
|
var response = s.parseJSON(body)
|
|
checkResult('API : /accounts/saveSettings',true,response.ok)
|
|
next()
|
|
})
|
|
},
|
|
"super/accounts/registerAdmin" : function(next){
|
|
var userData = getAdministratorAccountData()
|
|
var builtURL = requestSuperURL + 'accounts/registerAdmin?data=' + encodeURIComponent(s.s(userData))
|
|
request(builtURL,function(err, httpResponse, body){
|
|
var response = s.parseJSON(body)
|
|
administratorAccountData.uid = response.user.uid
|
|
checkResult('API : /accounts/registerAdmin',true,response.ok)
|
|
next()
|
|
})
|
|
},
|
|
"super/accounts/deleteAdmin" : function(next){
|
|
var userData = getAdministratorAccountData()
|
|
var builtURL = requestSuperURL + 'accounts/deleteAdmin?account=' + encodeURIComponent(s.s({
|
|
"mail":"test@test1.com",
|
|
"ke":"GroupKey123456",
|
|
"uid":administratorAccountData.uid
|
|
|
|
}))
|
|
request(builtURL,function(err, httpResponse, body){
|
|
var response = s.parseJSON(body)
|
|
checkResult('API : /accounts/deleteAdmin',true,response.ok)
|
|
next()
|
|
})
|
|
},
|
|
"super/accounts/registerAdmin (Recreate)" : function(next){
|
|
var userData = getAdministratorAccountData()
|
|
var builtURL = requestSuperURL + 'accounts/registerAdmin?data=' + encodeURIComponent(s.s(userData))
|
|
request(builtURL,function(err, httpResponse, body){
|
|
var response = s.parseJSON(body)
|
|
administratorAccountData.uid = response.user.uid
|
|
checkResult('API : /accounts/registerAdmin',true,response.ok)
|
|
next()
|
|
})
|
|
},
|
|
"super/accounts/list" : function(next){
|
|
var builtURL = requestSuperURL + 'accounts/list'
|
|
request(builtURL,function(err, httpResponse, body){
|
|
var response = s.parseJSON(body)
|
|
if(response.ok === true){
|
|
// administratorAccountData = response.users[0]
|
|
}
|
|
checkResult('API : /accounts/list',1,response.users.length)
|
|
next()
|
|
})
|
|
},
|
|
"super/accounts/list/admin" : function(next){
|
|
var builtURL = requestSuperURL + 'accounts/list/admin'
|
|
request(builtURL,function(err, httpResponse, body){
|
|
var response = s.parseJSON(body)
|
|
checkResult('API : /accounts/list/admin',1,response.users.length)
|
|
next()
|
|
})
|
|
},
|
|
"super/accounts/list/sub" : function(next){
|
|
var builtURL = requestSuperURL + 'accounts/list/sub'
|
|
request(builtURL,function(err, httpResponse, body){
|
|
var response = s.parseJSON(body)
|
|
checkResult('API : /accounts/list/sub',0,response.users.length)
|
|
next()
|
|
})
|
|
},
|
|
"super/accounts/editAdmin" : function(next){
|
|
var userData = getAdministratorAccountData()
|
|
delete(userData.uid)
|
|
var builtURL = requestSuperURL + 'accounts/editAdmin?data=' + encodeURIComponent(s.s(userData)) + "&account=" + encodeURIComponent(s.s({
|
|
"mail":"test@test1.com",
|
|
"ke":"GroupKey123456"
|
|
}))
|
|
request(builtURL,function(err, httpResponse, body){
|
|
var response = s.parseJSON(body)
|
|
if(response.ok !== true)console.log(response.msg)
|
|
checkResult('API : /accounts/editAdmin',true,response.ok)
|
|
next()
|
|
})
|
|
},
|
|
"/ (Login via API)" : function(next){
|
|
var userData = getAdministratorAccountData()
|
|
var builtURL = getBaseURL() + '?json=true'
|
|
request.post(builtURL,{
|
|
form : {machineID: "testMachineId", mail: "test@test1.com", pass: "test1", function: "dash"}
|
|
},function(err, httpResponse, body){
|
|
var response = s.parseJSON(body)
|
|
if(response.ok !== true)console.log(response)
|
|
administratorAccountData.auth = response.$user.auth_token
|
|
checkResult('API : / (Login via API)',true,response.ok)
|
|
next()
|
|
})
|
|
},
|
|
"/api/add" : function(next){
|
|
var userData = getAdministratorAccountData()
|
|
var builtURL = buildRegularApiRequestURL(administratorAccountData.auth,'api',administratorAccountData.ke) + 'add'
|
|
request.post(builtURL,{
|
|
form : {
|
|
"data": {
|
|
"ip": "0.0.0.0",
|
|
"details": {
|
|
"auth_socket": "1",
|
|
"get_monitors": "1",
|
|
"control_monitors": "1",
|
|
"get_logs": "1",
|
|
"watch_stream": "1",
|
|
"watch_snapshot": "1",
|
|
"watch_videos": "1",
|
|
"delete_videos": "1"
|
|
}
|
|
}
|
|
}
|
|
},function(err, httpResponse, body){
|
|
var response = s.parseJSON(body)
|
|
if(response.ok !== true)console.log(builtURL,response)
|
|
temp.newApiKey = response.api.code
|
|
checkResult('API : /api/add',true,response.ok)
|
|
next()
|
|
})
|
|
},
|
|
"Delete API Key" : function(next){
|
|
var userData = getAdministratorAccountData()
|
|
var builtURL = buildRegularApiRequestURL(administratorAccountData.auth,'api',administratorAccountData.ke) + 'delete'
|
|
request.post(builtURL,{
|
|
form : {
|
|
"data": {
|
|
"code": temp.newApiKey
|
|
}
|
|
}
|
|
},function(err, httpResponse, body){
|
|
var response = s.parseJSON(body)
|
|
if(response.ok !== true)console.log(builtURL,response)
|
|
checkResult('API : /api/delete',true,response.ok)
|
|
next()
|
|
})
|
|
},
|
|
"/admin/accounts/register" : function(next){
|
|
var userData = getAdministratorAccountData()
|
|
var builtURL = buildAdminRequestURL(administratorAccountData.auth,'accounts',administratorAccountData.ke) + 'register'
|
|
request.post(builtURL,{
|
|
form : {
|
|
"data": {
|
|
"mail": "test@test2.com",
|
|
"pass": "test1",
|
|
"password_again": "test1"
|
|
}
|
|
}
|
|
},function(err, httpResponse, body){
|
|
var response = s.parseJSON(body)
|
|
if(response.ok !== true)console.log(builtURL,response)
|
|
temp.subAccount = response.user
|
|
checkResult('API : /admin/accounts/register',true,response.ok)
|
|
next()
|
|
})
|
|
},
|
|
"/admin/accounts/edit" : function(next){
|
|
var userData = getAdministratorAccountData()
|
|
var builtURL = buildAdminRequestURL(administratorAccountData.auth,'accounts',administratorAccountData.ke) + 'edit'
|
|
request.post(builtURL,{
|
|
form : {
|
|
"data": {
|
|
"uid": temp.subAccount.uid,
|
|
"mail": temp.subAccount.mail,
|
|
"details": temp.subAccount.details
|
|
}
|
|
}
|
|
},function(err, httpResponse, body){
|
|
var response = s.parseJSON(body)
|
|
if(response.ok !== true)console.log(builtURL,response)
|
|
checkResult('API : /admin/accounts/edit',true,response.ok)
|
|
next()
|
|
})
|
|
},
|
|
"/admin/accounts/delete" : function(next){
|
|
var userData = getAdministratorAccountData()
|
|
var builtURL = buildAdminRequestURL(administratorAccountData.auth,'accounts',administratorAccountData.ke) + 'delete'
|
|
request.post(builtURL,{
|
|
form : {
|
|
"data": {
|
|
"uid": temp.subAccount.uid,
|
|
"mail": temp.subAccount.mail,
|
|
}
|
|
}
|
|
},function(err, httpResponse, body){
|
|
var response = s.parseJSON(body)
|
|
if(response.ok !== true)console.log(builtURL,response)
|
|
temp.subAccount = null
|
|
checkResult('API : /admin/accounts/delete',true,response.ok)
|
|
next()
|
|
})
|
|
},
|
|
"/configureMonitor (Add)" : function(next){
|
|
temp.monitorId = "10998"
|
|
var userData = getAdministratorAccountData()
|
|
var builtURL = buildRegularApiRequestURL(administratorAccountData.auth,'configureMonitor',administratorAccountData.ke) + temp.monitorId
|
|
request.post(builtURL,{
|
|
form : {
|
|
"data": {"mode":"start","mid":temp.monitorId,"name":"ReoLinkWireless","type":"mp4","protocol":"https","host":"cdn.shinobi.video","port":"443","path":"/videos/faces.mp4","ext":"mp4","fps":"3","width":"2048","height":"1536","details":"{\"notes\":\"\",\"dir\":\"\",\"auto_host_enable\":\"1\",\"auto_host\":\"rtsp://user:pass@192.168.1.40:554/\",\"rtsp_transport\":\"tcp\",\"muser\":\"user\",\"mpass\":\"pass\",\"port_force\":null,\"fatal_max\":\"0\",\"aduration\":\"1000000\",\"probesize\":\"1000000\",\"stream_loop\":\"1\",\"sfps\":\"\",\"accelerator\":\"0\",\"hwaccel\":\"cuvid\",\"hwaccel_vcodec\":\"h264_cuvid\",\"hwaccel_device\":\"\",\"stream_type\":\"mp4\",\"stream_flv_type\":\"http\",\"stream_flv_maxLatency\":\"\",\"stream_mjpeg_clients\":\"0\",\"stream_vcodec\":\"copy\",\"stream_acodec\":\"no\",\"hls_time\":\"2\",\"hls_list_size\":\"2\",\"preset_stream\":\"\",\"signal_check\":\"\",\"signal_check_log\":\"0\",\"stream_quality\":\"1\",\"stream_fps\":\"10\",\"stream_scale_x\":\"3072\",\"stream_scale_y\":\"1728\",\"rotate_stream\":null,\"svf\":\"\",\"tv_channel\":null,\"tv_channel_id\":\"\",\"tv_channel_group_title\":\"\",\"stream_timestamp\":null,\"stream_timestamp_font\":\"\",\"stream_timestamp_font_size\":\"\",\"stream_timestamp_color\":\"\",\"stream_timestamp_box_color\":\"\",\"stream_timestamp_x\":\"\",\"stream_timestamp_y\":\"\",\"stream_watermark\":\"0\",\"stream_watermark_location\":\"\",\"stream_watermark_position\":null,\"snap\":\"0\",\"snap_fps\":\"1\",\"snap_scale_x\":\"1920\",\"snap_scale_y\":\"1072\",\"snap_vf\":\"\",\"vcodec\":\"copy\",\"crf\":\"1\",\"preset_record\":\"\",\"acodec\":\"no\",\"dqf\":\"0\",\"cutoff\":\"\",\"rotate_record\":null,\"vf\":\"\",\"timestamp\":\"0\",\"timestamp_font\":\"\",\"timestamp_font_size\":\"\",\"timestamp_color\":\"\",\"timestamp_box_color\":\"\",\"timestamp_x\":\"\",\"timestamp_y\":\"\",\"watermark\":null,\"watermark_location\":\"\",\"watermark_position\":null,\"cust_input\":\"\",\"cust_snap\":\"\",\"cust_rtmp\":\"\",\"cust_rawh264\":\"\",\"cust_detect\":\"\",\"cust_stream\":\"\",\"cust_stream_server\":\"\",\"cust_record\":\"\",\"custom_output\":\"\",\"detector\":\"0\",\"detector_pam\":\"0\",\"detector_noise_filter\":null,\"detector_webhook\":\"0\",\"detector_webhook_url\":\"\",\"detector_command_enable\":\"0\",\"detector_command\":\"\",\"detector_command_timeout\":\"\",\"detector_lock_timeout\":\"\",\"detector_save\":\"0\",\"detector_frame_save\":\"0\",\"detector_mail\":\"0\",\"detector_mail_timeout\":\"\",\"detector_record_method\":\"sip\",\"detector_trigger\":\"1\",\"detector_trigger_record_fps\":\"\",\"detector_timeout\":\"10\",\"watchdog_reset\":\"0\",\"detector_delete_motionless_videos\":\"0\",\"detector_send_frames\":\"1\",\"detector_region_of_interest\":\"0\",\"detector_fps\":\"\",\"detector_scale_x\":\"640\",\"detector_scale_y\":\"480\",\"detector_use_motion\":\"1\",\"detector_use_detect_object\":\"0\",\"detector_frame\":\"0\",\"detector_sensitivity\":\"\",\"cords\":\"[]\",\"detector_buffer_vcodec\":\"auto\",\"detector_buffer_fps\":\"\",\"detector_buffer_hls_time\":\"\",\"detector_buffer_hls_list_size\":\"\",\"detector_buffer_start_number\":\"\",\"detector_buffer_live_start_index\":\"\",\"detector_lisence_plate\":\"0\",\"detector_lisence_plate_country\":\"us\",\"detector_notrigger\":\"0\",\"detector_notrigger_mail\":\"0\",\"detector_notrigger_timeout\":\"\",\"control\":\"0\",\"control_base_url\":\"\",\"control_url_method\":null,\"control_stop\":null,\"control_url_stop_timeout\":\"\",\"control_url_center\":\"\",\"control_url_left\":\"\",\"control_url_left_stop\":\"\",\"control_url_right\":\"\",\"control_url_right_stop\":\"\",\"control_url_up\":\"\",\"control_url_up_stop\":\"\",\"control_url_down\":\"\",\"control_url_down_stop\":\"\",\"control_url_enable_nv\":\"\",\"control_url_disable_nv\":\"\",\"control_url_zoom_out\":\"\",\"control_url_zoom_out_stop\":\"\",\"control_url_zoom_in\":\"\",\"control_url_zoom_in_stop\":\"\",\"groups\":\"\",\"loglevel\":\"quiet\",\"sqllog\":\"0\",\"detector_cascades\":\"\",\"stream_channels\":\"\",\"input_maps\":\"\",\"input_map_choices\":\"\"}","shto":"[]","shfr":"[]"}
|
|
}
|
|
},function(err, httpResponse, body){
|
|
var response = s.parseJSON(body)
|
|
if(response.ok !== true)console.log(builtURL,response)
|
|
checkResult('API : /configureMonitor (Add)',true,response.ok)
|
|
next()
|
|
})
|
|
},
|
|
"/configureMonitor (Add Second)" : function(next){
|
|
temp.monitorId2 = "10999"
|
|
var userData = getAdministratorAccountData()
|
|
var builtURL = buildRegularApiRequestURL(administratorAccountData.auth,'configureMonitor',administratorAccountData.ke) + temp.monitorId2
|
|
request.post(builtURL,{
|
|
form : {
|
|
"data": {"mode":"start","mid":temp.monitorId2,"name":"ReoLinkWireless","type":"mp4","protocol":"https","host":"cdn.shinobi.video","port":"443","path":"/videos/faces.mp4","ext":"mp4","fps":"3","width":"2048","height":"1536","details":"{\"notes\":\"\",\"dir\":\"\",\"auto_host_enable\":\"1\",\"auto_host\":\"rtsp://user:pass@192.168.1.40:554/\",\"rtsp_transport\":\"tcp\",\"muser\":\"user\",\"mpass\":\"pass\",\"port_force\":null,\"fatal_max\":\"0\",\"aduration\":\"1000000\",\"probesize\":\"1000000\",\"stream_loop\":\"1\",\"sfps\":\"\",\"accelerator\":\"0\",\"hwaccel\":\"cuvid\",\"hwaccel_vcodec\":\"h264_cuvid\",\"hwaccel_device\":\"\",\"stream_type\":\"hls\",\"stream_flv_type\":\"http\",\"stream_flv_maxLatency\":\"\",\"stream_mjpeg_clients\":\"0\",\"stream_vcodec\":\"copy\",\"stream_acodec\":\"no\",\"hls_time\":\"2\",\"hls_list_size\":\"2\",\"preset_stream\":\"\",\"signal_check\":\"\",\"signal_check_log\":\"0\",\"stream_quality\":\"1\",\"stream_fps\":\"10\",\"stream_scale_x\":\"3072\",\"stream_scale_y\":\"1728\",\"rotate_stream\":null,\"svf\":\"\",\"tv_channel\":null,\"tv_channel_id\":\"\",\"tv_channel_group_title\":\"\",\"stream_timestamp\":null,\"stream_timestamp_font\":\"\",\"stream_timestamp_font_size\":\"\",\"stream_timestamp_color\":\"\",\"stream_timestamp_box_color\":\"\",\"stream_timestamp_x\":\"\",\"stream_timestamp_y\":\"\",\"stream_watermark\":\"0\",\"stream_watermark_location\":\"\",\"stream_watermark_position\":null,\"snap\":\"0\",\"snap_fps\":\"1\",\"snap_scale_x\":\"1920\",\"snap_scale_y\":\"1072\",\"snap_vf\":\"\",\"vcodec\":\"copy\",\"crf\":\"1\",\"preset_record\":\"\",\"acodec\":\"no\",\"dqf\":\"0\",\"cutoff\":\"\",\"rotate_record\":null,\"vf\":\"\",\"timestamp\":\"0\",\"timestamp_font\":\"\",\"timestamp_font_size\":\"\",\"timestamp_color\":\"\",\"timestamp_box_color\":\"\",\"timestamp_x\":\"\",\"timestamp_y\":\"\",\"watermark\":null,\"watermark_location\":\"\",\"watermark_position\":null,\"cust_input\":\"\",\"cust_snap\":\"\",\"cust_rtmp\":\"\",\"cust_rawh264\":\"\",\"cust_detect\":\"\",\"cust_stream\":\"\",\"cust_stream_server\":\"\",\"cust_record\":\"\",\"custom_output\":\"\",\"detector\":\"0\",\"detector_pam\":\"0\",\"detector_noise_filter\":null,\"detector_webhook\":\"0\",\"detector_webhook_url\":\"\",\"detector_command_enable\":\"0\",\"detector_command\":\"\",\"detector_command_timeout\":\"\",\"detector_lock_timeout\":\"\",\"detector_save\":\"0\",\"detector_frame_save\":\"0\",\"detector_mail\":\"0\",\"detector_mail_timeout\":\"\",\"detector_record_method\":\"sip\",\"detector_trigger\":\"1\",\"detector_trigger_record_fps\":\"\",\"detector_timeout\":\"10\",\"watchdog_reset\":\"0\",\"detector_delete_motionless_videos\":\"0\",\"detector_send_frames\":\"1\",\"detector_region_of_interest\":\"0\",\"detector_fps\":\"\",\"detector_scale_x\":\"640\",\"detector_scale_y\":\"480\",\"detector_use_motion\":\"1\",\"detector_use_detect_object\":\"0\",\"detector_frame\":\"0\",\"detector_sensitivity\":\"\",\"cords\":\"[]\",\"detector_buffer_vcodec\":\"auto\",\"detector_buffer_fps\":\"\",\"detector_buffer_hls_time\":\"\",\"detector_buffer_hls_list_size\":\"\",\"detector_buffer_start_number\":\"\",\"detector_buffer_live_start_index\":\"\",\"detector_lisence_plate\":\"0\",\"detector_lisence_plate_country\":\"us\",\"detector_notrigger\":\"0\",\"detector_notrigger_mail\":\"0\",\"detector_notrigger_timeout\":\"\",\"control\":\"0\",\"control_base_url\":\"\",\"control_url_method\":null,\"control_stop\":null,\"control_url_stop_timeout\":\"\",\"control_url_center\":\"\",\"control_url_left\":\"\",\"control_url_left_stop\":\"\",\"control_url_right\":\"\",\"control_url_right_stop\":\"\",\"control_url_up\":\"\",\"control_url_up_stop\":\"\",\"control_url_down\":\"\",\"control_url_down_stop\":\"\",\"control_url_enable_nv\":\"\",\"control_url_disable_nv\":\"\",\"control_url_zoom_out\":\"\",\"control_url_zoom_out_stop\":\"\",\"control_url_zoom_in\":\"\",\"control_url_zoom_in_stop\":\"\",\"groups\":\"\",\"loglevel\":\"quiet\",\"sqllog\":\"0\",\"detector_cascades\":\"\",\"stream_channels\":\"\",\"input_maps\":\"\",\"input_map_choices\":\"\"}","shto":"[]","shfr":"[]"}
|
|
}
|
|
},function(err, httpResponse, body){
|
|
var response = s.parseJSON(body)
|
|
if(response.ok !== true)console.log(builtURL,response)
|
|
checkResult('API : /configureMonitor (Add Second)',true,response.ok)
|
|
next()
|
|
})
|
|
},
|
|
"/configureMonitor (Edit)" : function(next){
|
|
var userData = getAdministratorAccountData()
|
|
var builtURL = buildRegularApiRequestURL(administratorAccountData.auth,'configureMonitor',administratorAccountData.ke) + temp.monitorId
|
|
request.post(builtURL,{
|
|
form : {
|
|
"data": {"mode":"start","mid":temp.monitorId,"name":"ReoLinkWireless","type":"mp4","protocol":"https","host":"cdn.shinobi.video","port":"443","path":"/videos/faces.mp4","ext":"mp4","fps":"3","width":"2048","height":"1536","details":"{\"notes\":\"\",\"dir\":\"\",\"auto_host_enable\":\"1\",\"auto_host\":\"rtsp://user:pass@192.168.1.40:554/\",\"rtsp_transport\":\"tcp\",\"muser\":\"user\",\"mpass\":\"pass\",\"port_force\":null,\"fatal_max\":\"0\",\"aduration\":\"1000000\",\"probesize\":\"1000000\",\"stream_loop\":\"1\",\"sfps\":\"\",\"accelerator\":\"0\",\"hwaccel\":\"cuvid\",\"hwaccel_vcodec\":\"h264_cuvid\",\"hwaccel_device\":\"\",\"stream_type\":\"mp4\",\"stream_flv_type\":\"http\",\"stream_flv_maxLatency\":\"\",\"stream_mjpeg_clients\":\"0\",\"stream_vcodec\":\"copy\",\"stream_acodec\":\"no\",\"hls_time\":\"2\",\"hls_list_size\":\"2\",\"preset_stream\":\"\",\"signal_check\":\"\",\"signal_check_log\":\"0\",\"stream_quality\":\"1\",\"stream_fps\":\"10\",\"stream_scale_x\":\"3072\",\"stream_scale_y\":\"1728\",\"rotate_stream\":null,\"svf\":\"\",\"tv_channel\":null,\"tv_channel_id\":\"\",\"tv_channel_group_title\":\"\",\"stream_timestamp\":null,\"stream_timestamp_font\":\"\",\"stream_timestamp_font_size\":\"\",\"stream_timestamp_color\":\"\",\"stream_timestamp_box_color\":\"\",\"stream_timestamp_x\":\"\",\"stream_timestamp_y\":\"\",\"stream_watermark\":\"0\",\"stream_watermark_location\":\"\",\"stream_watermark_position\":null,\"snap\":\"0\",\"snap_fps\":\"1\",\"snap_scale_x\":\"1920\",\"snap_scale_y\":\"1072\",\"snap_vf\":\"\",\"vcodec\":\"copy\",\"crf\":\"1\",\"preset_record\":\"\",\"acodec\":\"no\",\"dqf\":\"0\",\"cutoff\":\"\",\"rotate_record\":null,\"vf\":\"\",\"timestamp\":\"0\",\"timestamp_font\":\"\",\"timestamp_font_size\":\"\",\"timestamp_color\":\"\",\"timestamp_box_color\":\"\",\"timestamp_x\":\"\",\"timestamp_y\":\"\",\"watermark\":null,\"watermark_location\":\"\",\"watermark_position\":null,\"cust_input\":\"\",\"cust_snap\":\"\",\"cust_rtmp\":\"\",\"cust_rawh264\":\"\",\"cust_detect\":\"\",\"cust_stream\":\"\",\"cust_stream_server\":\"\",\"cust_record\":\"\",\"custom_output\":\"\",\"detector\":\"0\",\"detector_pam\":\"0\",\"detector_noise_filter\":null,\"detector_webhook\":\"0\",\"detector_webhook_url\":\"\",\"detector_command_enable\":\"0\",\"detector_command\":\"\",\"detector_command_timeout\":\"\",\"detector_lock_timeout\":\"\",\"detector_save\":\"0\",\"detector_frame_save\":\"0\",\"detector_mail\":\"0\",\"detector_mail_timeout\":\"\",\"detector_record_method\":\"sip\",\"detector_trigger\":\"1\",\"detector_trigger_record_fps\":\"\",\"detector_timeout\":\"10\",\"watchdog_reset\":\"0\",\"detector_delete_motionless_videos\":\"0\",\"detector_send_frames\":\"1\",\"detector_region_of_interest\":\"0\",\"detector_fps\":\"\",\"detector_scale_x\":\"640\",\"detector_scale_y\":\"480\",\"detector_use_motion\":\"1\",\"detector_use_detect_object\":\"0\",\"detector_frame\":\"0\",\"detector_sensitivity\":\"\",\"cords\":\"[]\",\"detector_buffer_vcodec\":\"auto\",\"detector_buffer_fps\":\"\",\"detector_buffer_hls_time\":\"\",\"detector_buffer_hls_list_size\":\"\",\"detector_buffer_start_number\":\"\",\"detector_buffer_live_start_index\":\"\",\"detector_lisence_plate\":\"0\",\"detector_lisence_plate_country\":\"us\",\"detector_notrigger\":\"0\",\"detector_notrigger_mail\":\"0\",\"detector_notrigger_timeout\":\"\",\"control\":\"0\",\"control_base_url\":\"\",\"control_url_method\":null,\"control_stop\":null,\"control_url_stop_timeout\":\"\",\"control_url_center\":\"\",\"control_url_left\":\"\",\"control_url_left_stop\":\"\",\"control_url_right\":\"\",\"control_url_right_stop\":\"\",\"control_url_up\":\"\",\"control_url_up_stop\":\"\",\"control_url_down\":\"\",\"control_url_down_stop\":\"\",\"control_url_enable_nv\":\"\",\"control_url_disable_nv\":\"\",\"control_url_zoom_out\":\"\",\"control_url_zoom_out_stop\":\"\",\"control_url_zoom_in\":\"\",\"control_url_zoom_in_stop\":\"\",\"groups\":\"\",\"loglevel\":\"quiet\",\"sqllog\":\"0\",\"detector_cascades\":\"\",\"stream_channels\":\"\",\"input_maps\":\"\",\"input_map_choices\":\"\"}","shto":"[]","shfr":"[]"}
|
|
}
|
|
},function(err, httpResponse, body){
|
|
var response = s.parseJSON(body)
|
|
if(response.ok !== true)console.log(builtURL,response)
|
|
checkResult('API : /configureMonitor (Edit)',true,response.ok)
|
|
next()
|
|
})
|
|
},
|
|
"/monitor/[MONITOR_ID] (Get)" : function(next){
|
|
var userData = getAdministratorAccountData()
|
|
var builtURL = buildRegularApiRequestURL(administratorAccountData.auth,'monitor',administratorAccountData.ke) + temp.monitorId
|
|
request.get(builtURL,function(err, httpResponse, body){
|
|
var response = s.parseJSON(body)
|
|
checkResult('API : /monitor/[MONITOR_ID] (Get)',temp.monitorId,response.mid)
|
|
next()
|
|
})
|
|
},
|
|
"/monitor/[MONITOR_ID]/[MODE] (Mode Switch to Disabled)" : function(next){
|
|
var userData = getAdministratorAccountData()
|
|
var builtURL = buildRegularApiRequestURL(administratorAccountData.auth,'monitor',administratorAccountData.ke) + temp.monitorId + '/stop'
|
|
request.get(builtURL,function(err, httpResponse, body){
|
|
var response = s.parseJSON(body)
|
|
checkResult('API : /monitor/[MONITOR_ID] (Mode Switch to Disabled)',true,response.ok)
|
|
next()
|
|
})
|
|
},
|
|
"/monitor/[MONITOR_ID]/[MODE] (Mode Switch to Watch-Only)" : function(next){
|
|
var userData = getAdministratorAccountData()
|
|
var builtURL = buildRegularApiRequestURL(administratorAccountData.auth,'monitor',administratorAccountData.ke) + temp.monitorId + '/start'
|
|
request.get(builtURL,function(err, httpResponse, body){
|
|
var response = s.parseJSON(body)
|
|
checkResult('API : /monitor/[MONITOR_ID] (Mode Switch to Watch-Only)',true,response.ok)
|
|
next()
|
|
})
|
|
},
|
|
"/monitor/[MONITOR_ID]/[MODE] (Mode Switch to Record)" : function(next){
|
|
var userData = getAdministratorAccountData()
|
|
var builtURL = buildRegularApiRequestURL(administratorAccountData.auth,'monitor',administratorAccountData.ke) + temp.monitorId + '/record'
|
|
request.get(builtURL,function(err, httpResponse, body){
|
|
var response = s.parseJSON(body)
|
|
checkResult('API : /monitor/[MONITOR_ID] (Mode Switch to Record)',true,response.ok)
|
|
next()
|
|
})
|
|
},
|
|
"/monitor (Get All)" : function(next){
|
|
var userData = getAdministratorAccountData()
|
|
var builtURL = buildRegularApiRequestURL(administratorAccountData.auth,'monitor',administratorAccountData.ke)
|
|
request.get(builtURL,function(err, httpResponse, body){
|
|
var response = s.parseJSON(body)
|
|
if(!checkResult('API : /monitor (Get All)',2,response.length)){
|
|
console.log(Object.keys(response))
|
|
}
|
|
next()
|
|
})
|
|
},
|
|
"/configureMonitor (Delete)" : function(next){
|
|
var userData = getAdministratorAccountData()
|
|
var builtURL = buildRegularApiRequestURL(administratorAccountData.auth,'configureMonitor',administratorAccountData.ke) + temp.monitorId2 + '/delete'
|
|
request.post(builtURL,function(err, httpResponse, body){
|
|
var response = s.parseJSON(body)
|
|
if(response.ok !== true)console.log(builtURL,response)
|
|
checkResult('API : /configureMonitor (Delete)',true,response.ok)
|
|
next()
|
|
})
|
|
},
|
|
"/monitorStates Insert (Disable + Detector Off)" : function(next){
|
|
var userData = getAdministratorAccountData()
|
|
var builtURL = buildRegularApiRequestURL(administratorAccountData.auth,'monitorStates',administratorAccountData.ke) + 'DisableWithDetectorOff/insert'
|
|
request.post(builtURL,{
|
|
form: {
|
|
data: {
|
|
"monitors": [
|
|
{
|
|
"mode":"stop",
|
|
"mid":temp.monitorId,
|
|
"details": {
|
|
"detector": "0"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},function(err, httpResponse, body){
|
|
var response = s.parseJSON(body)
|
|
if(response.ok !== true)console.log(builtURL,response)
|
|
checkResult('API : /monitorStates Insert (Disable + Detector Off)',true,response.ok)
|
|
next()
|
|
})
|
|
},
|
|
"/monitorStates Insert (Enable + Detector On)" : function(next){
|
|
var userData = getAdministratorAccountData()
|
|
var builtURL = buildRegularApiRequestURL(administratorAccountData.auth,'monitorStates',administratorAccountData.ke) + 'EnableWithDetectorOn/insert'
|
|
request.post(builtURL,{
|
|
form: {
|
|
data: {
|
|
"monitors": [
|
|
{
|
|
"mode":"start",
|
|
"mid":temp.monitorId,
|
|
"details": {
|
|
"detector": "1"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},function(err, httpResponse, body){
|
|
var response = s.parseJSON(body)
|
|
if(response.ok !== true)console.log(builtURL,response)
|
|
checkResult('API : /monitorStates Insert (Enable + Detector On)',true,response.ok)
|
|
next()
|
|
})
|
|
},
|
|
"/monitorStates Insert (Continuous Recording)" : function(next){
|
|
var userData = getAdministratorAccountData()
|
|
var builtURL = buildRegularApiRequestURL(administratorAccountData.auth,'monitorStates',administratorAccountData.ke) + 'RecordOnly/insert'
|
|
request.post(builtURL,{
|
|
form: {
|
|
data: {
|
|
"monitors": [
|
|
{
|
|
"mode":"record",
|
|
"mid":temp.monitorId,
|
|
"details": {
|
|
"detector": "0"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},function(err, httpResponse, body){
|
|
var response = s.parseJSON(body)
|
|
if(response.ok !== true)console.log(builtURL,response)
|
|
checkResult('API : /monitorStates Insert (Continuous Recording)',true,response.ok)
|
|
next()
|
|
})
|
|
},
|
|
"/monitorStates List" : function(next){
|
|
var userData = getAdministratorAccountData()
|
|
var builtURL = buildRegularApiRequestURL(administratorAccountData.auth,'monitorStates',administratorAccountData.ke)
|
|
request.get(builtURL,function(err, httpResponse, body){
|
|
var response = s.parseJSON(body)
|
|
if(response.ok !== true)console.log(builtURL,response)
|
|
checkResult('API : /monitorStates List',true,response.ok)
|
|
next()
|
|
})
|
|
},
|
|
"/monitorStates Run Action (Disable + Detector Off)" : function(next){
|
|
var userData = getAdministratorAccountData()
|
|
var builtURL = buildRegularApiRequestURL(administratorAccountData.auth,'monitorStates',administratorAccountData.ke) + 'DisableWithDetectorOff'
|
|
request.get(builtURL,function(err, httpResponse, body){
|
|
var response = s.parseJSON(body)
|
|
if(response.ok !== true)console.log(builtURL,response)
|
|
checkResult('API : /monitorStates Run Action (Disable + Detector Off)',true,response.ok)
|
|
next()
|
|
})
|
|
},
|
|
"/monitorStates Run Action (Enable + Detector On)" : function(next){
|
|
var userData = getAdministratorAccountData()
|
|
var builtURL = buildRegularApiRequestURL(administratorAccountData.auth,'monitorStates',administratorAccountData.ke) + 'EnableWithDetectorOn'
|
|
request.get(builtURL,function(err, httpResponse, body){
|
|
var response = s.parseJSON(body)
|
|
if(response.ok !== true)console.log(builtURL,response)
|
|
checkResult('API : /monitorStates Run Action (Enable + Detector On)',true,response.ok)
|
|
next()
|
|
})
|
|
},
|
|
"/monitorStates Run Action (Continuous Recording)" : function(next){
|
|
var userData = getAdministratorAccountData()
|
|
var builtURL = buildRegularApiRequestURL(administratorAccountData.auth,'monitorStates',administratorAccountData.ke) + 'RecordOnly'
|
|
request.get(builtURL,function(err, httpResponse, body){
|
|
var response = s.parseJSON(body)
|
|
if(response.ok !== true)console.log(builtURL,response)
|
|
checkResult('API : /monitorStates Run Action (Continuous Recording)',true,response.ok)
|
|
next()
|
|
})
|
|
},
|
|
"/monitorStates Delete (Disable + Detector Off)" : function(next){
|
|
var userData = getAdministratorAccountData()
|
|
var builtURL = buildRegularApiRequestURL(administratorAccountData.auth,'monitorStates',administratorAccountData.ke) + 'DisableWithDetectorOff/delete'
|
|
request.get(builtURL,function(err, httpResponse, body){
|
|
var response = s.parseJSON(body)
|
|
if(response.ok !== true)console.log(builtURL,response)
|
|
checkResult('API : /monitorStates Delete (Disable + Detector Off)',true,response.ok)
|
|
next()
|
|
})
|
|
},
|
|
"/monitorStates Delete (Enable + Detector On)" : function(next){
|
|
var userData = getAdministratorAccountData()
|
|
var builtURL = buildRegularApiRequestURL(administratorAccountData.auth,'monitorStates',administratorAccountData.ke) + 'EnableWithDetectorOn/delete'
|
|
request.get(builtURL,function(err, httpResponse, body){
|
|
var response = s.parseJSON(body)
|
|
if(response.ok !== true)console.log(builtURL,response)
|
|
checkResult('API : /monitorStates Delete (Enable + Detector On)',true,response.ok)
|
|
next()
|
|
})
|
|
},
|
|
"/monitorStates Delete (Continuous Recording)" : function(next){
|
|
var userData = getAdministratorAccountData()
|
|
var builtURL = buildRegularApiRequestURL(administratorAccountData.auth,'monitorStates',administratorAccountData.ke) + 'RecordOnly/delete'
|
|
request.get(builtURL,function(err, httpResponse, body){
|
|
var response = s.parseJSON(body)
|
|
if(response.ok !== true)console.log(builtURL,response)
|
|
checkResult('API : /monitorStates Delete (Continuous Recording)',true,response.ok)
|
|
next()
|
|
})
|
|
},
|
|
}
|
|
}
|
|
console.log('----- Function Test Starting')
|
|
var completedGroups = 0
|
|
var testGroupKeys = Object.keys(test)
|
|
var testGroupRunLoop = function(callback){
|
|
var tableName = testGroupKeys[completedGroups]
|
|
var testers = test[testGroupKeys[completedGroups]]
|
|
if(tableName){
|
|
console.log('--- Testing ' + tableName + '...')
|
|
// test functions >
|
|
var completedFunctions = 0
|
|
var testFunctionsKeys = Object.keys(testers)
|
|
var testFunctionRunLoop = function(innerCallback){
|
|
var functioName = testFunctionsKeys[completedFunctions]
|
|
var theFunction = testers[testFunctionsKeys[completedFunctions]]
|
|
if(functioName){
|
|
theFunction(function(){
|
|
++completedFunctions
|
|
testFunctionRunLoop(innerCallback)
|
|
})
|
|
}else{
|
|
innerCallback()
|
|
}
|
|
}
|
|
testFunctionRunLoop(function(){
|
|
console.log('-- Completed ' + tableName + '...')
|
|
++completedGroups
|
|
testGroupRunLoop(callback)
|
|
})
|
|
// test functions />
|
|
}else{
|
|
callback()
|
|
}
|
|
}
|
|
testGroupRunLoop(function(){
|
|
console.log('---- Function Test Ended')
|
|
})
|
|
}
|