1
0
Fork 0
mirror of https://gitlab.com/Shinobi-Systems/ShinobiCE.git synced 2025-03-09 15:40:15 +00:00
- Rebased sql, test, web, defintions, languages, INSTALL, and libs folders.
This commit is contained in:
Moe 2019-03-07 14:43:37 -08:00
parent 24de55e45a
commit d0b12e92e7
362 changed files with 21716 additions and 7018 deletions

View file

@ -12,6 +12,9 @@
<link rel="stylesheet" href="<%-window.libURL%>libs/css/fullcalendar.min.css">
<link rel="stylesheet" href="<%-window.libURL%>libs/css/bootstrap-table.min.css">
<link rel="stylesheet" href="<%-window.libURL%>libs/css/main.dash2.css">
<% customAutoLoad.adminLibsCss.forEach(function(lib){ %>
<link rel="stylesheet" href="<%-window.libURL%>libs/css/<%-lib%>">
<% }) %>
<body class="shinobi-bg">
<div class="container-fluid">
<div class="container">
@ -80,8 +83,14 @@
</div>
</div>
</div>
<script>
var adminApiPrefix = "<%=originalURL%><%=config.webPaths.adminApiPrefix%>"
</script>
<% include blocks/confirm.ejs %>
<% include blocks/subpermissions.ejs %>
<% customAutoLoad.adminPageBlocks.forEach(function(block){ %>
<%- include(block) %>
<% }) %>
</body>
<script><% include ../libs/js/basic.js %></script>
<script><% include ../libs/js/socket.io.js %></script>
@ -275,3 +284,6 @@ $('body')
localStorage.removeItem('ShinobiLogin_'+location.host);location.href=location.href;
})
</script>
<% customAutoLoad.adminLibsJs.forEach(function(lib){ %>
<script src="<%-window.libURL%>libs/js/<%-lib%>"></script>
<% }) %>

View file

@ -93,3 +93,4 @@
</form>
</div>
</div>
<script src="<%-window.libURL%>libs/js/dash2.apiwindow.js"></script>

View file

@ -259,3 +259,4 @@
</form>
</div>
</div>
<script src="<%-window.libURL%>libs/js/dash2.detectorfilter.js"></script>

View file

@ -28,8 +28,8 @@
<div class="form-group-group blue where">
<h4><%- lang['Find Where'] %>
<div class="pull-right">
<a class="btn btn-default btn-xs add">&nbsp;<i class="fa fa-plus"></i>&nbsp;</a>
<a class="btn btn-danger btn-xs remove">&nbsp;<i class="fa fa-minus"></i>&nbsp;</a>
<a class="btn btn-default btn-xs add">&nbsp;<i class="fa fa-plus"></i>&nbsp;</a>
<a class="btn btn-danger btn-xs remove">&nbsp;<i class="fa fa-minus"></i>&nbsp;</a>
</div>
</h4>
<div id="filters_where">
@ -39,20 +39,20 @@
<div class="form-group col-md-4">
<label>
<div><select class="form-control" name="sort_by">
<option value="time" selected><%- lang['Start Time'] %></option>
<option value="end"><%- lang['End Time'] %></option>
<option value="time" selected><%- lang['Start Time'] %></option>
<option value="end"><%- lang['End Time'] %></option>
<option value="mid"><%- lang['Monitor ID'] %></option>
<option value="ext"><%- lang['File Type'] %></option>
<option value="size"><%- lang['Filesize'] %></option>
<option value="status"><%- lang['Video Status'] %></option>
<option value="ext"><%- lang['File Type'] %></option>
<option value="size"><%- lang['Filesize'] %></option>
<option value="status"><%- lang['Video Status'] %></option>
</select></div>
</label>
</div>
<div class="form-group col-md-4">
<label>
<div><select class="form-control" name="sort_by_direction">
<option value="ASC" selected><%- lang['ASC'] %></option>
<option value="DESC"><%- lang['DESC'] %></option>
<option value="ASC" selected><%- lang['ASC'] %></option>
<option value="DESC"><%- lang['DESC'] %></option>
</select></div>
</label>
</div>
@ -68,8 +68,8 @@
<div class="form-group">
<label><div><span><%- lang['Enabled'] %></span></div>
<div><select class="form-control" name="enabled">
<option value="0" selected><%- lang['No'] %></option>
<option value="1"><%- lang['Yes'] %></option>
<option value="0" selected><%- lang['No'] %></option>
<option value="1"><%- lang['Yes'] %></option>
</select></div>
</label>
</div>
@ -77,24 +77,24 @@
<div class="form-group col-md-12 hidden">
<label><div><span><%- lang['Archive'] %></span></div>
<div><select class="form-control" name="archive">
<option value="0" selected><%- lang['No'] %></option>
<option value="1"><%- lang['Yes'] %></option>
<option value="0" selected><%- lang['No'] %></option>
<option value="1"><%- lang['Yes'] %></option>
</select></div>
</label>
</div>
<div class="form-group col-md-12">
<label><div><span><%- lang['Email Details'] %></span></div>
<div><select class="form-control" name="email">
<option value="0" selected><%- lang['No'] %></option>
<option value="1"><%- lang['Yes'] %></option>
<option value="0" selected><%- lang['No'] %></option>
<option value="1"><%- lang['Yes'] %></option>
</select></div>
</label>
</div>
<div class="form-group col-md-12">
<label><div><span><%- lang['Delete Matches'] %></span></div>
<div><select class="form-control" name="delete">
<option value="0" selected><%- lang['No'] %></option>
<option value="1"><%- lang['Yes'] %></option>
<option value="0" selected><%- lang['No'] %></option>
<option value="1"><%- lang['Yes'] %></option>
</select></div>
</label>
</div>
@ -115,4 +115,5 @@
</div>
</form>
</div>
</div>
</div>
<script src="<%-window.libURL%>libs/js/dash2.cronfilter.js"></script>

View file

@ -9,6 +9,7 @@
<link rel="stylesheet" href="<%-window.libURL%>libs/css/material.min.css">
<link rel="stylesheet" href="<%-window.libURL%>libs/css/material.style.css">
<meta name="mobile-web-app-capable" content="yes">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">
<% include header-favicon.ejs %>
<script src="<%-window.libURL%>libs/js/jquery.min.js"></script>
<script src="<%-window.libURL%>libs/js/jquery-ui.min.js"></script>

View file

@ -35,7 +35,7 @@
<div class="fixed-table-container">
<div class="fixed-table-body">
<table class="table table-striped">
<tbody class="search-body"></tbody>
<tbody class="search-body"></tbody>
</table>
</div>
</div>
@ -48,4 +48,5 @@
</div>
</div>
</div>
</div>
</div>
<script src="<%-window.libURL%>libs/js/dash2.logviewer.js"></script>

View file

@ -119,6 +119,22 @@
</select></div>
</label>
</div>
<div class="form-group h_l_input h_l_limited">
<label><div><span><%-lang['Can use Wasabi Hot Cloud Storage']%></span></div>
<div><select class="form-control" detail="use_whcs">
<option value="1" selected><%-lang.Yes%></option>
<option value="0"><%-lang.No%></option>
</select></div>
</label>
</div>
<div class="form-group h_l_input h_l_limited">
<label><div><span><%-lang['Can use SFTP']%></span></div>
<div><select class="form-control" detail="use_sftp">
<option value="1" selected><%-lang.Yes%></option>
<option value="0"><%-lang.No%></option>
</select></div>
</label>
</div>
<div class="form-group h_l_input h_l_limited">
<label><div><span><%-lang['Can use WebDAV']%></span></div>
<div><select class="form-control" detail="use_webdav">
@ -146,24 +162,24 @@
<div class="form-group h_l_input h_l_limited">
<label><div><span><%-lang['Use Global Amazon S3 Video Storage']%></span></div>
<div><select class="form-control" detail="aws_use_global">
<option value="1" selected><%-lang.Yes%></option>
<option value="0"><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
<option value="0" selected><%-lang.No%></option>
</select></div>
</label>
</div>
<div class="form-group h_l_input h_l_limited">
<label><div><span><%-lang['Use Global Backblaze B2 Video Storage']%></span></div>
<div><select class="form-control" detail="b2_use_global">
<option value="1" selected><%-lang.Yes%></option>
<option value="0"><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
<option value="0" selected><%-lang.No%></option>
</select></div>
</label>
</div>
<div class="form-group h_l_input h_l_limited">
<label><div><span><%-lang['Use Global WebDAV Video Storage']%></span></div>
<div><select class="form-control" detail="webdav_use_global">
<option value="1" selected><%-lang.Yes%></option>
<option value="0"><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
<option value="0" selected><%-lang.No%></option>
</select></div>
</label>
</div>
@ -185,7 +201,7 @@
<script>
//add new
$.aN={e:$('#add_edit')};$.aN.f=$.aN.e.find('form')
$.aN.modeIsEdit = false
$.aN.modeIsEdit = function(){return $('#edit').is(':checked')}
$.aN.f.submit(function(e){
e.preventDefault();
var formValues = $.aN.f.serializeObject()
@ -193,7 +209,7 @@ $.aN.f.submit(function(e){
data: formValues
}
var webPath = 'registerAdmin'
if($.aN.modeIsEdit){
if($.aN.modeIsEdit()){
webPath = 'editAdmin'
postData.account = $.aN.selected
}
@ -210,14 +226,23 @@ $.aN.e.on('change','[name="mail"]',function(){
var thisVal = $(this).val()
$.each(users,function(n,user){
if($.aN.selected && user.ke !== $.aN.selected.ke && thisVal.toLowerCase() === user.mail.toLowerCase()){
new PNotify({text:"<%=lang['Email address is in use.']%>",type:'error'})
new PNotify({text:lang['Email address is in use.'],type:'error'})
}
})
})
//client side group key check
$.aN.e.on('change','[name="ke"]',function(){
var thisVal = $(this).val()
$.each(users,function(n,user){
if(!$.aN.modeIsEdit() && user.ke === thisVal){
new PNotify({text:lang['Group Key is in use.'] + ' ' + lang['Create Sub-Accounts at /admin'],type:'error'})
}
})
})
$.aN.e.on('change','[detail]',function(){
e = {}
e.ar = {}
if($.aN.modeIsEdit){
if($.aN.modeIsEdit()){
try{
e.ar = Object.assign(JSON.parse($.aN.selected.details),{})
}catch(err){
@ -232,12 +257,10 @@ $.aN.e.on('change','[detail]',function(){
})
$('#edit').change(function(e){
if($('#edit').is(':checked')){
$.aN.modeIsEdit = true
$('#title').text("<%-lang['Edit']%>")
$('#title').text(lang['Edit'])
$.aN.e.find('[name="ke"]').prop('disabled',true)
}else{
$.aN.modeIsEdit = false
$('#title').text("<%-lang['Add New']%>")
$('#title').text(lang['Add New'])
$.aN.e.find('input,select').prop('disabled',false)
}
$.aN.e.find('[detail]').first().change()
@ -288,6 +311,7 @@ $.aC.e.on('click','.delete',function(e){
});
})
$.aC.e.on('click','.permission',function(e){
$('#edit').prop('checked',true).change().parent().addClass('is-checked')
$.aN.e.modal('show')
e.e=$(this).parents('tr');
e.u=e.e.attr('ke');
@ -303,7 +327,6 @@ $.aC.e.on('click','.permission',function(e){
$.each(JSON.parse(e.account.details),function(n,v){
$.aN.e.find('[detail="'+n+'"]').val(v)
})
$('#edit').prop('checked',true).change().parent().addClass('is-checked')
// $.pR.e.modal('show');
})

View file

@ -1,81 +0,0 @@
<!--Migrator-->
<div class="modal full fade dark" id="migrator" role="dialog" aria-labelledby="migratorLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
<h4 class="modal-title" id="migratorLabel"><i class="fa fa-play-circle"></i> &nbsp; <span></span></h4>
</div>
<div class="modal-body">
<form>
<div class="form-group-group green">
<h4><%-lang['']%></h4>
<div class="form-group">
<label><div><span><%-lang['Monitor JSON']%></span></div>
<div><textarea name="json" class="form-control"></textarea></div>
</label>
</div>
</div>
</form>
<!--
<form>
<div class="form-group-group green">
<h4><%-lang['Connection']%></h4>
<div class="form-group">
<label><div><span><%-lang.Username%></span></div>
<div><input class="form-control" name="name" value=""></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Password']%></span></div>
<div><input class="form-control" name="password" type="password" value=""></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Host']%></span></div>
<div><input class="form-control" name="host" value=""></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Host Type']%></span></div>
<div><select class="form-control" name="host_type">
<option value="zm" selected>ZoneMinder</option>
</select></div>
</label>
</div>
</div>
</form>
-->
</div>
<div class="modal-footer">
<a class="btn btn-primary download_link"><i class="fa fa-download"></i> &nbsp; <%-lang.Import%></a>
<button type="button" class="btn btn-default" data-dismiss="modal"><%-lang.Close%></button>
</div>
</div>
</div>
</div>
<script>
$.migrator = {
e : $('#migrator')
}
$.migrator.f = $.migrator.e.find('form')
$.migrator.f.submit(function(e){
e.preventDefault()
var postMonitor = function(v){
$.post($.ccio.init('location',$user)+$user.auth_token+'/configureMonitor/'+$user.ke+'/'+v.mid,{data:JSON.stringify(v,null,3)},function(d){
$.ccio.log(d)
})
}
var form = $.migrator.f.serializeObject()
switch(form.host_type){
case'zm':
$.get(form.host+'/index.php?username='+form.name+'&password='+form.password+'&action=login&view=console',function(data){
console.log(data)
})
break;
}
return false
})
</script>

View file

@ -0,0 +1,182 @@
<div class="modal dark fade" id="monitorStates" role="dialog" aria-labelledby="monitorStatesLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<form class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
<h4 class="modal-title" id="monitorStatesLabel"><i class="fa fa-align-right"></i> &nbsp; <%-lang['Monitor States']%></h4>
</div>
<div class="modal-body">
<div class="form-group">
<label>
<div><select class="form-control" id="monitorStatesSelector">
<option value=""><%-lang['Add New']%></option>
<optgroup label="<%-lang['Saved Presets']%>"></optgroup>
</select></div>
</label>
</div>
<div class="form-group-group green">
<h4><%- lang['Preset'] %>
<div class="pull-right">
<a class="btn btn-danger btn-xs delete" style="display:none">&nbsp;<i class="fa fa-trash-o"></i>&nbsp;</a>
</div>
</h4>
<div class="form-group">
<label><div><span><%-lang['Name']%></span></div>
<div><input class="form-control" name="name"></div>
</label>
</div>
</div>
<div class="form-group-group blue">
<h4><%- lang['Monitors'] %>
<div class="pull-right">
<a class="btn btn-default btn-xs add">&nbsp;<i class="fa fa-plus"></i>&nbsp;</a>
</div>
</h4>
<div id="monitorStatesMonitors">
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default pull-left" data-dismiss="modal"><i class="fa fa-times"></i> <%-lang.Close%></button>
<button type="button" class="btn btn-default" data-toggle="modal" data-target="#schedules"><i class="fa fa-clock-o"></i> <%-lang.Schedules%></button>
<button type="submit" class="btn btn-success"><i class="fa fa-check"></i> <%-lang.Save%></button>
</div>
</form>
</div>
</div>
<script>
$(document).ready(function(){
$.monitorStates = {
e: $('#monitorStates'),
selector: $('#monitorStatesSelector'),
monitors: $('#monitorStatesMonitors'),
loaded: {}
}
$.monitorStates.f = $.monitorStates.e.find('form')
$.monitorStates.loadPresets = function(callback){
$.get($.ccio.init('location',$user) + $user.auth_token + '/monitorStates/' + $user.ke,function(d){
var html = ''
$.each(d.presets,function(n,v){
$.monitorStates.loaded[v.name] = v
html += '<option value="' + v.name + '">' + v.name + '</option>'
})
$.monitorStates.selector.find('optgroup').html(html)
if(callback)callback()
})
}
$.monitorStates.e.on('shown.bs.modal', function (e) {
if($.monitorStates.selector.val() === '')$.monitorStates.loadPresets()
})
$.monitorStates.add = function(loaded,doAppend){
if(!loaded){
json = ''
}else{
json = JSON.stringify(loaded,null,3)
}
var html = '<div class="state-monitor-row"><h4 style="margin-top:7.5px;margin-bottom:7.5px"><small>&nbsp;</small><div class="pull-right"><a class="btn btn-danger btn-xs delete-monitor"><i class="fa fa-trash-o"></i></a></div></h4><textarea class="json form-control" style="width:100%;height:300px">' + json +'</textarea></div>'
if(doAppend)$.monitorStates.monitors.append(html)
return html
}
$.monitorStates.e.find('.add').click(function(e){
$.monitorStates.add(null,true)
})
$.monitorStates.e.on('change','.json',function(e){
var el = $(this)
var val = el.val()
try{
el.css('border-color','green')
var parsed = JSON.parse(val)
el.val(JSON.stringify(parsed,null,3))
}catch(err){
el.css('border-color','red')
return $.ccio.init('note',{title:lang['Invalid JSON'],text:lang.InvalidJSONText,type:'error'})
}
})
$.monitorStates.e.on('click','.delete',function(e){
$.confirm.e.modal('show');
$.confirm.title.text(lang['Delete Monitor States Preset']);
$.confirm.body.html(lang.deleteMonitorStateText1);
$.confirm.click({title:'Delete',class:'btn-danger'},function(){
var form = $.monitorStates.f.serializeObject()
$.post($.ccio.init('location',$user) + $user.auth_token + '/monitorStates/' + $user.ke + '/' + form.name + '/delete',function(d){
$.ccio.log(d)
if(d.ok === true){
$.monitorStates.loadPresets()
$.ccio.init('note',{title:lang.Success,text:d.msg,type:'success'})
}
})
})
})
$.monitorStates.e.on('click','.delete-monitor',function(e){
var el = $(this).parents('.state-monitor-row')
$.confirm.e.modal('show');
$.confirm.title.text(lang['Delete Monitor State']);
$.confirm.body.html(lang.deleteMonitorStateText2)
$.confirm.click({title:'Delete',class:'btn-danger'},function(){
el.remove()
})
})
$.monitorStates.selector.change(function(e){
var selected = $(this).val()
var loaded = $.monitorStates.loaded[selected]
var namespace = $.monitorStates.e.find('[name="name"]')
var deleteButton = $.monitorStates.e.find('.delete')
if(loaded){
namespace.val(loaded.name)
var html = ''
$.each(loaded.details.monitors,function(n,v){
html += $.monitorStates.add(v)
})
$.monitorStates.monitors.html(html)
deleteButton.show()
}else{
namespace.val('')
$.monitorStates.monitors.empty()
deleteButton.hide()
}
})
$.monitorStates.f.submit(function(e){
e.preventDefault()
var el = $(this)
var form = el.serializeObject()
var monitors = []
var failedToParseAJson = false
var rows = $.monitorStates.monitors.find('.state-monitor-row')
if(form.name === ''){
return $.ccio.init('note',{title:lang['Invalid Data'],text:lang['Name cannot be empty.'],type:'error'})
}
if(rows.length === 0){
return $.ccio.init('note',{title:lang['Invalid Data'],text:lang['Must be atleast one row'],type:'error'})
}
rows.each(function(n,v){
var el = $(v)
try{
console.log(el.find('.json').val())
var json = JSON.parse(el.find('.json').val())
if(json.mid)monitors.push(json)
}catch(err){
console.log(err)
failedToParseAJson = true
}
})
if(failedToParseAJson === true){
return $.ccio.init('note',{title:lang['Invalid JSON'],text:lang.InvalidJSONText,type:'error'})
}
var data = {
monitors: monitors
}
$.post($.ccio.init('location',$user) + $user.auth_token + '/monitorStates/' + $user.ke + '/' + form.name + '/insert',{data:data},function(d){
$.ccio.log(d)
if(d.ok === true){
$.monitorStates.loadPresets(function(){
$.monitorStates.selector.val(form.name)
})
$.ccio.init('note',{title:lang.Success,text:d.msg,type:'success'})
}
})
return false;
})
})
</script>

View file

@ -87,9 +87,15 @@
<option value="socket"><%-lang['Shinobi Streamer']%></option>
<option value="dashcam"><%-lang['Dashcam (Streamer v2)']%></option>
<option value="local"><%-lang['Local']%></option>
<% if(config.rtmpServer){ %><option value="rtmp"><%-lang['RTMP']%></option><% } %>
</select></div>
</label>
</div>
<div class="form-group h_t_input h_t_rtmp">
<label><div><span><%-lang['Stream Key']%></span></div>
<div><input class="form-control" detail="rtmp_key"></div>
</label>
</div>
<div class="h_t_input h_t_h264 h_t_hls h_t_mp4 h_t_jpeg h_t_mjpeg h_t_local">
<div class="form-group h_t_input h_t_h264 h_t_hls h_t_mp4 h_t_jpeg h_t_mjpeg">
<label><div><span><%-lang['Automatic']%></span></div>
@ -169,7 +175,7 @@
</div>
<div class="form-group">
<label><div><span><%-lang['Retry Connection']%></span></div>
<div><input class="form-control" detail="fatal_max" placeholder="10"></div>
<div><input class="form-control" detail="fatal_max" placeholder="0"></div>
</label>
</div>
<div class="form-group">
@ -198,6 +204,17 @@
<!-- START of Input -->
<div class="form-group-group forestgreen" section id="monSectionInput">
<h4><%-lang['Input Settings']%></h4>
<div class="form-group input-mapping" style="display:none">
<label><div><span><%-lang['Primary Input']%></span></div>
<div><select class="form-control" detail="primary_input">
<option value="0"><%-lang['All streams in first feed']%> (0)</option>
<option value="0:0" selected><%-lang['First stream in feed']%> (0:0, <%-lang.Default%>)</option>
<option value="0:1"><%-lang['Second stream in feed']%> (0:1)</option>
<option value="0:v"><%-lang['Video streams only']%> (0:v)</option>
<option value="0:v:0"><%-lang['Video stream only from first feed']%> (0:v:0)</option>
</select></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Analyzation Duration']%></span></div>
<div><input class="form-control" detail="aduration"></div>
@ -284,6 +301,14 @@
<div><input class="form-control" detail="hwaccel_device"></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Use coProcessor']%></span></div>
<div><select class="form-control" detail="use_coprocessor">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
</div>
</div>
</div>
<!-- END of Input -->
@ -842,6 +867,11 @@
<div><input class="form-control" detail="cust_record"></div>
</label>
</div>
<div class="form-group h_rec_mtd_input h_rec_mtd_sip" style="display:none">
<label><div><span><%-lang['Traditional Recording Flags']%></span></div>
<div><input class="form-control" detail="cust_sip_record"></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Output Method']%></span></div>
<div><input class="form-control" detail="custom_output" placeholder="-f flv rtmp://.."></div>
@ -937,6 +967,11 @@
<div><input class="form-control" detail="detector_timeout" placeholder="10"></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Notification Video Length']%></span></div>
<div><input class="form-control" detail="detector_send_video_length" placeholder="10"></div>
</label>
</div>
</div>
<div class="form-group h_rec_mtd_input h_rec_mtd_hot h_rec_mtd_sip">
<label><div><span><%-lang['Timeout Reset on Next Event']%></span></div>
@ -956,6 +991,21 @@
</label>
</div>
</div>
<div class="form-group">
<label><div><span><%-lang['Trigger Camera Groups']%></span></div>
<div><select class="form-control" detail="detector_multi_trigger" selector="det_multi_trig">
<option value="0"><%-lang.No%></option>
<option value="1" selected><%-lang.Yes%></option>
</select></div>
</label>
</div>
<div class="form-group-group orange det_multi_trig_input det_multi_trig_1" section id="monSectionDetectorGroupMulti" style="display:none">
<h4><%-lang['Trigger Camera Groups']%></h4>
<div>
<ul class="mdl-list" id="monitor_group_detector_multi"></ul>
<input type="hidden" detail="group_detector_multi">
</div>
</div>
<div class="form-group">
<label><div><span><%-lang['Webhook']%></span></div>
<div><select class="form-control" detail="detector_webhook" selector="h_det_web">
@ -1065,6 +1115,14 @@
</select></div>
</label>
</div>
<!-- <div class="form-group h_det_pam_input h_det_pam_1">
<label><div><span><%-lang['Show Matrices']%></span></div>
<div><select class="form-control" detail="detector_show_matrix">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
</div> -->
<div class="form-group">
<label><div><span><%-lang['Indifference']%></span></div>
<div><input class="form-control" detail="detector_sensitivity" placeholder="0.5"></div>
@ -1106,16 +1164,6 @@
<div><input class="form-control" detail="detector_noise_filter_range" placeholder="6"></div>
</label>
</div>
<!--
<div class="form-group">
<label><div><span><%-lang['Show Regions of Interest']%></span></div>
<div><select class="form-control" detail="detector_region_of_interest">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
</div>
-->
<div class="form-group-group orange" section id="monSectionNoMotionDetector">
<h4><%-lang['"No Motion" Detector']%></h4>
<div class="form-group">
@ -1141,6 +1189,29 @@
</div>
</div>
</div>
<!-- Start of Audio Detection -->
<div class="form-group-group orange" section id="monSectionAudioDetector">
<h4><%-lang['Audio Detector']%></h4>
<div class="form-group">
<label><div><span><%-lang['Enabled']%></span></div>
<div><select class="form-control" detail="detector_audio">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Minimum dB']%></span></div>
<div><input class="form-control" detail="detector_audio_min_db" placeholder="5"></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Maximum dB']%></span></div>
<div><input class="form-control" detail="detector_audio_max_db" placeholder=""></div>
</label>
</div>
</div>
<!-- END of Audio Detection -->
<div class="form-group-group orange shinobi-detector-opencv shinobi-detector-openalpr shinobi-detector-yolo shinobi-detector-dlib shinobi-detector_plug" section id="monSectionDetectorObject">
<h4><%-lang['Object Detection']%> <small><%-lang['Plugin']%> : <b class="shinobi-detector_name"></b> <b class="shinobi-detector-invert"><%-lang['Not Connected']%></b><b class="shinobi-detector" style="display:none"><%-lang['Connected']%></b></small></h4>
<div class="form-group">
@ -1151,6 +1222,22 @@
</select></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Send Frames']%></span></div>
<div><select class="form-control" detail="detector_send_frames_object">
<option value="0"><%-lang.No%></option>
<option value="1" selected><%-lang.Yes%></option>
</select></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Require Object to be in Region']%></span></div>
<div><select class="form-control" detail="detector_obj_region">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Check for Motion First']%></span></div>
<div><select class="form-control" detail="detector_use_motion" selector="h_det_mot_fir">
@ -1168,19 +1255,19 @@
</div>
<div class="form-group">
<label><div><span><%-lang['Width']%></span></div>
<div><input class="form-control" type="number" min="1" detail="detector_scale_x_object" placeholder="320"></div>
<div><input class="form-control" type="number" min="1" detail="detector_scale_x_object" placeholder=""></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Height']%></span></div>
<div><input class="form-control" type="number" min="1" detail="detector_scale_y_object" placeholder="240"></div>
<div><input class="form-control" type="number" min="1" detail="detector_scale_y_object" placeholder=""></div>
</label>
</div>
</div>
</div>
<div class=" h_casc_input h_casc_1" style="display:none">
<div class="form-group-group orange shinobi-detector-opencv shinobi-detector-openalpr shinobi-detector_plug" style="display:none" section id="monSectionLisencePlateDetector">
<h4><%-lang['Lisence Plate Detector']%></h4>
<h4><%-lang['License Plate Detector']%></h4>
<div class="form-group">
<label><div><span><%-lang['Enabled']%></span></div>
<div><select class="form-control" detail="detector_lisence_plate">
@ -1589,3 +1676,4 @@
</form>
</div>
</div>
<script src="<%-window.libURL%>libs/js/dash2.monitoredit.js"></script>

View file

@ -35,4 +35,5 @@
</div>
</div>
</div>
</div>
</div>
<script src="<%-window.libURL%>libs/js/dash2.multimon.js"></script>

View file

@ -84,3 +84,4 @@
</div>
</div>
</div>
<script src="<%-window.libURL%>libs/js/dash2.powervideo.js"></script>

View file

@ -30,7 +30,7 @@
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default pull-left" data-dismiss="modal"><i class="fa fa-times"></i> <%-lang.Close%></button>
<a class="btn btn-danger stop" style="display:none"><%-lang.Stop%><span> &nbsp; <i class="fa fa-pulse fa-spinner"></i></span></a>
<a class="btn btn-danger stop" style="display:none"><%-lang.Stop%><span> &nbsp; <i class="fa fa-pulse fa-spinner"></i></span></a>
<button type="submit" class="btn btn-success"><%-lang.Check%></button>
</div>
</form>
@ -91,4 +91,7 @@
</div>
</form>
</div>
</div>
</div>
<!-- -->
<script src="<%-window.libURL%>libs/js/dash2.probe.js"></script>
<script src="<%-window.libURL%>libs/js/dash2.onvifscanner.js"></script>

View file

@ -81,3 +81,4 @@
</form>
</div>
</div>
<script src="<%-window.libURL%>libs/js/dash2.regioneditor.js"></script>

View file

@ -0,0 +1,179 @@
<div class="modal dark fade" id="schedules" role="dialog" aria-labelledby="schedulesLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<form class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
<h4 class="modal-title" id="schedulesLabel"><i class="fa fa-clock-o"></i> &nbsp; <%-lang['Schedules']%></h4>
</div>
<div class="modal-body">
<div class="form-group">
<label>
<div><select class="form-control" id="schedulesSelector">
<option value=""><%-lang['Add New']%></option>
<optgroup label="<%-lang['Saved Schedules']%>"></optgroup>
</select></div>
</label>
</div>
<div class="form-group-group green">
<h4><%- lang['Schedule'] %>
<div class="pull-right">
<a class="btn btn-danger btn-xs delete" style="display:none">&nbsp;<i class="fa fa-trash-o"></i>&nbsp;</a>
</div>
</h4>
<div class="form-group">
<label><div><span><%-lang['Name']%></span></div>
<div><input class="form-control" name="name"></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Enabled']%></span></div>
<div><select class="form-control" name="enabled">
<option value="1" selected><%-lang.Yes%></option>
<option value="0"><%-lang.No%></option>
</select></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Start']%></span></div>
<div><input class="form-control" name="start" placeholder="HH:ss"></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['End']%></span></div>
<div><input class="form-control" name="end" placeholder="HH:ss"></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Monitor States']%></span></div>
<div><select class="form-control" style="min-height:100px" multiple name="monitorStates">
</select></div>
</label>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default pull-left" data-dismiss="modal"><i class="fa fa-times"></i> <%-lang.Close%></button>
<button type="submit" class="btn btn-success"><i class="fa fa-check"></i> <%-lang.Save%></button>
</div>
</form>
</div>
</div>
<script>
$(document).ready(function(){
$.schedules = {
e: $('#schedules'),
selector: $('#schedulesSelector'),
loadedMonitorStates: {},
loadedSchedules: {}
}
$.schedules.f = $.schedules.e.find('form')
$.schedules.selectedStates = $.schedules.e.find('[name="monitorStates"]')
$.schedules.loadSchedules = function(callback){
$.get($.ccio.init('location',$user) + $user.auth_token + '/schedule/' + $user.ke,function(d){
console.log(d)
var html = ''
$.each(d.schedules,function(n,v){
$.schedules.loadedSchedules[v.name] = v
html += $.ccio.tm('option',{
id: v.name,
name: v.name
})
})
$.schedules.selector.find('optgroup').html(html)
if(callback)callback()
})
}
$.schedules.loadMonitorStates = function(){
$.get($.ccio.init('location',$user) + $user.auth_token + '/monitorStates/' + $user.ke,function(d){
var html = ''
$.each(d.presets,function(n,v){
$.schedules.loadedMonitorStates[v.name] = v
html += $.ccio.tm('option',{
id: v.name,
name: v.name
})
})
$.schedules.selectedStates.html(html)
})
}
$.schedules.e.on('shown.bs.modal', function (e) {
$.schedules.loadMonitorStates()
$.schedules.loadSchedules()
})
$.schedules.e.on('click','.delete',function(e){
$.confirm.e.modal('show');
$.confirm.title.text(lang['Delete Monitor States Preset']);
$.confirm.body.html(lang.deleteMonitorStateText1);
$.confirm.click({title:'Delete',class:'btn-danger'},function(){
var form = $.schedules.f.serializeObject()
$.post($.ccio.init('location',$user) + $user.auth_token + '/schedule/' + $user.ke + '/' + form.name + '/delete',function(d){
$.ccio.log(d)
if(d.ok === true){
$.schedules.loadSchedules()
$.ccio.init('note',{title:lang.Success,text:d.msg,type:'success'})
}
})
})
})
$.schedules.selector.change(function(e){
var selected = $(this).val()
var loaded = $.schedules.loadedSchedules[selected]
var namespace = $.schedules.e.find('[name="name"]')
var deleteButton = $.schedules.e.find('.delete')
$.schedules.selectedStates.find('option:selected').removeAttr('selected')
if(loaded){
namespace.val(loaded.name)
var html = ''
$.each(loaded,function(n,v){
$.schedules.f.find('[name="' + n + '"]').val(v)
})
$.each(loaded.details.monitorStates,function(n,v){
$.schedules.selectedStates.find('option[value="' + v + '"]').prop('selected',true)
})
deleteButton.show()
}else{
namespace.val('')
deleteButton.hide()
}
})
$.schedules.f.submit(function(e){
e.preventDefault()
var el = $(this)
var form = el.serializeObject()
var monitors = []
var failedToParseAJson = false
var rows = $.monitorStates.monitors.find('.state-monitor-row')
if(form.name === ''){
return $.ccio.init('note',{title:lang['Invalid Data'],text:lang['Name cannot be empty.'],type:'error'})
}
if(form.start === ''){
return $.ccio.init('note',{title:lang['Invalid Data'],text:lang['Start Time cannot be empty.'],type:'error'})
}
if(form.monitorStates instanceof Array === false){
form.monitorStates = [form.monitorStates]
}
console.log(form.monitorStates)
var data = {
start: form.start,
end: form.end,
enabled: form.enabled,
details:{
monitorStates: form.monitorStates
}
}
$.post($.ccio.init('location',$user) + $user.auth_token + '/schedule/' + $user.ke + '/' + form.name + '/insert',{data:data},function(d){
$.ccio.log(d)
if(d.ok === true){
$.schedules.loadSchedules(function(){
$.schedules.selector.val(form.name)
})
$.ccio.init('note',{title:lang.Success,text:d.msg,type:'success'})
}
})
return false;
})
})
</script>

View file

@ -174,199 +174,318 @@
<% if(details.use_webdav!=='0'){ %>
<div class="form-group-group forestgreen">
<h4><%-lang.WebDAV%></h4>
<div class="form-group">
<label><div><span><%-lang.URL%></span></div>
<div><input class="form-control" detail="webdav_url"></div>
</label>
</div>
<div class="row">
<div class="form-group col-md-12">
<label><div><span><%-lang.Username%></span></div>
<div><input class="form-control" detail="webdav_user"></div>
</label>
</div>
<div class="form-group col-md-12">
<label><div><span><%-lang.Password%></span></div>
<div><input class="form-control" type="password" detail="webdav_pass"></div>
</label>
</div>
</div>
<div class="form-group">
<label><div><span><%-lang.Autosave%></span></div>
<div><select class="form-control" detail="webdav_save">
<div><select class="form-control" detail="webdav_save" selector="autosave_webdav">
<option value="0"><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Save Links to Database']%></span></div>
<div><select class="form-control" detail="webdav_log" selector="h_webdavsld">
<option value="0"><%-lang.No%></option>
<option value="1" selected><%-lang.Yes%></option>
</select></div>
</label>
</div>
<div class="h_webdavsld_input h_webdavsld_1">
<div class="autosave_webdav_input autosave_webdav_1">
<div class="form-group">
<label><div><span><%-lang['Use Max Storage Amount']%></span></div>
<div><select class="form-control" detail="use_webdav_size_limit" selector="h_webdavzl">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
<label><div><span><%-lang.URL%></span></div>
<div><input class="form-control" detail="webdav_url"></div>
</label>
</div>
<div class="row">
<div class="form-group col-md-12">
<label><div><span><%-lang.Username%></span></div>
<div><input class="form-control" detail="webdav_user"></div>
</label>
</div>
<div class="form-group col-md-12">
<label><div><span><%-lang.Password%></span></div>
<div><input class="form-control" type="password" detail="webdav_pass"></div>
</label>
</div>
</div>
<div class="form-group">
<label><div><span><%-lang['Save Links to Database']%></span></div>
<div><select class="form-control" detail="webdav_log" selector="h_webdavsld">
<option value="0"><%-lang.No%></option>
<option value="1" selected><%-lang.Yes%></option>
</select></div>
</label>
</div>
<div class="form-group h_webdavzl_input h_webdavzl_1">
<label><div><span><%-lang['Max Storage Amount']%></span></div>
<div><input class="form-control" placeholder="10000" detail="webdav_size_limit"></div>
<div class="h_webdavsld_input h_webdavsld_1">
<div class="form-group">
<label><div><span><%-lang['Use Max Storage Amount']%></span></div>
<div><select class="form-control" detail="use_webdav_size_limit" selector="h_webdavzl">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
</div>
<div class="form-group h_webdavzl_input h_webdavzl_1">
<label><div><span><%-lang['Max Storage Amount']%></span></div>
<div><input class="form-control" placeholder="10000" detail="webdav_size_limit"></div>
</label>
</div>
</div>
<div class="form-group">
<label><div><span><%-lang['Save Directory']%></span></div>
<div><input class="form-control" placeholder="/" detail="webdav_dir"></div>
</label>
</div>
</div>
<div class="form-group">
<label><div><span><%-lang['Save Directory']%></span></div>
<div><input class="form-control" placeholder="/" detail="webdav_dir"></div>
</label>
</div>
</div>
<% } %>
<% if(details.use_aws_s3!=='0'){ %>
<div class="form-group-group forestgreen">
<h4><%-lang['Amazon S3']%></h4>
<div class="form-group">
<label><div><span><%-lang.Bucket%></span></div>
<div><input class="form-control" detail="aws_s3_bucket" placeholder="Example : slippery-seal"></div>
</label>
</div>
<div class="row">
<div class="form-group col-md-12">
<label><div><span><%-lang.aws_accessKeyId%></span></div>
<div><input class="form-control" detail="aws_accessKeyId"></div>
</label>
</div>
<div class="form-group col-md-12">
<label><div><span><%-lang.aws_secretAccessKey%></span></div>
<div><input class="form-control" type="password" detail="aws_secretAccessKey"></div>
</label>
</div>
</div>
<div class="form-group">
<label><div><span><%-lang.Region%></span></div>
<div><select class="form-control" detail="aws_region">
<option value="us-west-1" selected>US West (N. California)</option>
<option value="us-west-2">US West (Oregon)</option>
<option value="us-east-2">US East (Ohio)</option>
<option value="us-east-1">US East (N. Virginia)</option>
<option value="ap-south-1">Asia Pacific (Mumbai)</option>
<option value="ap-northeast-2">Asia Pacific (Seoul)</option>
<option value="ap-northeast-3">Asia Pacific (Osaka-Local)**</option>
<option value="ap-southeast-1">Asia Pacific (Singapore)</option>
<option value="ap-southeast-2">Asia Pacific (Sydney)</option>
<option value="ap-northeast-1">Asia Pacific (Tokyo)</option>
<option value="ca-central-1">Canada (Central)</option>
<option value="cn-north-1">China (Beijing)</option>
<option value="cn-northwest-1">China (Ningxia)</option>
<option value="eu-central-1">EU (Frankfurt)</option>
<option value="eu-west-1">EU (Ireland)</option>
<option value="eu-west-2">EU (London)</option>
<option value="eu-west-3">EU (Paris)</option>
<option value="sa-east-1">South America (São Paulo)</option>
</select></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang.Autosave%></span></div>
<div><select class="form-control" detail="aws_s3_save">
<div><select class="form-control" detail="aws_s3_save" selector="autosave_aws_s3">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Save Links to Database']%></span></div>
<div><select class="form-control" detail="aws_s3_log" selector="h_s3sld">
<option value="0"><%-lang.No%></option>
<option value="1" selected><%-lang.Yes%></option>
</select></div>
</label>
</div>
<div class="h_s3sld_input h_s3sld_1">
<div class="autosave_aws_s3_input autosave_aws_s3_1">
<div class="form-group">
<label><div><span><%-lang['Use Max Storage Amount']%></span></div>
<div><select class="form-control" detail="use_aws_s3_size_limit" selector="h_s3zl">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
<label><div><span><%-lang.Bucket%></span></div>
<div><input class="form-control" detail="aws_s3_bucket" placeholder="Example : slippery-seal"></div>
</label>
</div>
<div class="row">
<div class="form-group col-md-12">
<label><div><span><%-lang.aws_accessKeyId%></span></div>
<div><input class="form-control" detail="aws_accessKeyId"></div>
</label>
</div>
<div class="form-group col-md-12">
<label><div><span><%-lang.aws_secretAccessKey%></span></div>
<div><input class="form-control" type="password" detail="aws_secretAccessKey"></div>
</label>
</div>
</div>
<div class="form-group">
<label><div><span><%-lang.Region%></span></div>
<div><select class="form-control" detail="aws_region">
<option value="us-west-1" selected>US West (N. California)</option>
<option value="us-west-2">US West (Oregon)</option>
<option value="us-east-2">US East (Ohio)</option>
<option value="us-east-1">US East (N. Virginia)</option>
<option value="ap-south-1">Asia Pacific (Mumbai)</option>
<option value="ap-northeast-2">Asia Pacific (Seoul)</option>
<option value="ap-northeast-3">Asia Pacific (Osaka-Local)**</option>
<option value="ap-southeast-1">Asia Pacific (Singapore)</option>
<option value="ap-southeast-2">Asia Pacific (Sydney)</option>
<option value="ap-northeast-1">Asia Pacific (Tokyo)</option>
<option value="ca-central-1">Canada (Central)</option>
<option value="cn-north-1">China (Beijing)</option>
<option value="cn-northwest-1">China (Ningxia)</option>
<option value="eu-central-1">EU (Frankfurt)</option>
<option value="eu-west-1">EU (Ireland)</option>
<option value="eu-west-2">EU (London)</option>
<option value="eu-west-3">EU (Paris)</option>
<option value="sa-east-1">South America (São Paulo)</option>
</select></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Save Links to Database']%></span></div>
<div><select class="form-control" detail="aws_s3_log" selector="h_s3sld">
<option value="0"><%-lang.No%></option>
<option value="1" selected><%-lang.Yes%></option>
</select></div>
</label>
</div>
<div class="form-group h_s3zl_input h_s3zl_1">
<label><div><span><%-lang['Max Storage Amount']%></span></div>
<div><input class="form-control" placeholder="10000" detail="aws_s3_size_limit"></div>
<div class="h_s3sld_input h_s3sld_1">
<div class="form-group">
<label><div><span><%-lang['Use Max Storage Amount']%></span></div>
<div><select class="form-control" detail="use_aws_s3_size_limit" selector="h_s3zl">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
</div>
<div class="form-group h_s3zl_input h_s3zl_1">
<label><div><span><%-lang['Max Storage Amount']%></span></div>
<div><input class="form-control" placeholder="10000" detail="aws_s3_size_limit"></div>
</label>
</div>
</div>
<div class="form-group">
<label><div><span><%-lang['Save Directory']%></span></div>
<div><input class="form-control" placeholder="" detail="aws_s3_dir"></div>
</label>
</div>
</div>
<div class="form-group">
<label><div><span><%-lang['Save Directory']%></span></div>
<div><input class="form-control" placeholder="" detail="aws_s3_dir"></div>
</label>
</div>
</div>
<% } %>
<% if(details.use_bb_b2!=='0'){ %>
<div class="form-group-group forestgreen">
<h4><%-lang['Backblaze B2']%></h4>
<div class="form-group">
<label><div><span><%-lang.Bucket%></span></div>
<div><input class="form-control" detail="bb_b2_bucket" placeholder="Example : slippery-seal"></div>
</label>
</div>
<div class="row">
<div class="form-group col-md-12">
<label><div><span><%-lang.accountId%></span></div>
<div><input class="form-control" detail="bb_b2_accountId"></div>
</label>
</div>
<div class="form-group col-md-12">
<label><div><span><%-lang.applicationKey%></span></div>
<div><input class="form-control" type="password" detail="bb_b2_applicationKey"></div>
</label>
</div>
</div>
<div class="form-group">
<label><div><span><%-lang.Autosave%></span></div>
<div><select class="form-control" detail="bb_b2_save">
<div><select class="form-control" detail="bb_b2_save" selector="autosave_bb_b2">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Save Links to Database']%></span></div>
<div><select class="form-control" detail="bb_b2_log" selector="h_b2sld">
<option value="0"><%-lang.No%></option>
<option value="1" selected><%-lang.Yes%></option>
</select></div>
</label>
</div>
<div class="h_b2sld_input h_b2sld_1">
<div class="autosave_bb_b2_input autosave_bb_b2_1">
<div class="form-group">
<label><div><span><%-lang['Use Max Storage Amount']%></span></div>
<div><select class="form-control" detail="use_bb_b2_size_limit" selector="h_b2zl">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
<label><div><span><%-lang.Bucket%></span></div>
<div><input class="form-control" detail="bb_b2_bucket" placeholder="Example : slippery-seal"></div>
</label>
</div>
<div class="row">
<div class="form-group col-md-12">
<label><div><span><%-lang.accountId%></span></div>
<div><input class="form-control" detail="bb_b2_accountId"></div>
</label>
</div>
<div class="form-group col-md-12">
<label><div><span><%-lang.applicationKey%></span></div>
<div><input class="form-control" type="password" detail="bb_b2_applicationKey"></div>
</label>
</div>
</div>
<div class="form-group">
<label><div><span><%-lang['Save Links to Database']%></span></div>
<div><select class="form-control" detail="bb_b2_log" selector="h_b2sld">
<option value="0"><%-lang.No%></option>
<option value="1" selected><%-lang.Yes%></option>
</select></div>
</label>
</div>
<div class="form-group h_b2zl_input h_b2zl_1">
<label><div><span><%-lang['Max Storage Amount']%></span></div>
<div><input class="form-control" placeholder="10000" detail="bb_b2_size_limit"></div>
<div class="h_b2sld_input h_b2sld_1">
<div class="form-group">
<label><div><span><%-lang['Use Max Storage Amount']%></span></div>
<div><select class="form-control" detail="use_bb_b2_size_limit" selector="h_b2zl">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
</div>
<div class="form-group h_b2zl_input h_b2zl_1">
<label><div><span><%-lang['Max Storage Amount']%></span></div>
<div><input class="form-control" placeholder="10000" detail="bb_b2_size_limit"></div>
</label>
</div>
</div>
<div class="form-group">
<label><div><span><%-lang['Save Directory']%></span></div>
<div><input class="form-control" placeholder="" detail="bb_b2_dir"></div>
</label>
</div>
</div>
</div>
<% } %>
<% if(details.use_whcs!=='0'){ %>
<div class="form-group-group forestgreen">
<h4><%-lang['Wasabi Hot Cloud Storage']%></h4>
<div class="form-group">
<label><div><span><%-lang['Save Directory']%></span></div>
<div><input class="form-control" placeholder="" detail="bb_b2_dir"></div>
<label><div><span><%-lang.Autosave%></span></div>
<div><select class="form-control" detail="whcs_save" selector="autosave_whcs">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
</div>
<div class="autosave_whcs_input autosave_whcs_1">
<div class="form-group">
<label><div><span><%-lang.Bucket%></span></div>
<div><input class="form-control" detail="whcs_bucket" placeholder="Example : slippery-seal"></div>
</label>
</div>
<div class="row">
<div class="form-group col-md-12">
<label><div><span><%-lang.aws_accessKeyId%></span></div>
<div><input class="form-control" detail="whcs_accessKeyId"></div>
</label>
</div>
<div class="form-group col-md-12">
<label><div><span><%-lang.aws_secretAccessKey%></span></div>
<div><input class="form-control" type="password" detail="whcs_secretAccessKey"></div>
</label>
</div>
</div>
<div class="form-group">
<label><div><span><%-lang.Region%></span></div>
<div><select class="form-control" detail="whcs_region">
<option value="us-west-1" selected>US West</option>
<option value="us-east-1">US East</option>
</select></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Save Links to Database']%></span></div>
<div><select class="form-control" detail="whcs_log" selector="h_whcssld">
<option value="0"><%-lang.No%></option>
<option value="1" selected><%-lang.Yes%></option>
</select></div>
</label>
</div>
<div class="h_whcssld_input h_whcssld_1">
<div class="form-group">
<label><div><span><%-lang['Use Max Storage Amount']%></span></div>
<div><select class="form-control" detail="use_whcs_size_limit" selector="h_whcszl">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
</div>
<div class="form-group h_whcszl_input h_whcszl_1">
<label><div><span><%-lang['Max Storage Amount']%></span></div>
<div><input class="form-control" placeholder="10000" detail="whcs_size_limit"></div>
</label>
</div>
</div>
<div class="form-group">
<label><div><span><%-lang['Save Directory']%></span></div>
<div><input class="form-control" placeholder="" detail="whcs_dir"></div>
</label>
</div>
</div>
</div>
<% } %>
<% if(details.use_sftp!=='0'){ %>
<div class="form-group-group forestgreen">
<h4><%-lang['SFTP (SSH File Transfer)']%></h4>
<div class="form-group">
<label><div><span><%-lang.Autosave%></span></div>
<div><select class="form-control" detail="sftp_save" selector="autosave_sftp">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
</div>
<div class="autosave_sftp_input autosave_sftp_1">
<div class="form-group">
<label><div><span><%-lang.Host%></span></div>
<div><input class="form-control" detail="sftp_host"></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang.Port%></span></div>
<div><input class="form-control" type="text" detail="sftp_port"></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang.Username%></span></div>
<div><input class="form-control" type="text" detail="sftp_username"></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang.Password%></span></div>
<div><input class="form-control" type="password" detail="sftp_password"></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang.privateKey%></span></div>
<div><textarea class="form-control" type="password" detail="sftp_privateKey"></textarea></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Save Directory']%></span></div>
<div><input class="form-control" placeholder="" detail="sftp_dir"></div>
</label>
</div>
</div>
</div>
<% } %>
<% if(details.use_discordbot!=='0'){ %>
@ -471,6 +590,14 @@
</select></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Show Thumbnails in Video List']%></span></div>
<div><select class="form-control" localStorage="showThumbnail">
<option value="1"><%-lang.Yes%></option>
<option value="0" selected><%-lang.No%></option>
</select></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Themes']%></span></div>
<div><select class="form-control" detail="theme">
@ -495,3 +622,4 @@
</form>
</div>
</div>
<script src="<%-window.libURL%>libs/js/dash2.usersettings.js"></script>

View file

@ -0,0 +1,143 @@
<div class="row">
<div class="col-md-6">
<form class="form-group-group green export">
<nav class="navbar navbar-rounded navbar-expand-lg bg-success" style="margin-top:10px">
<div class="container">
<div class="collapse navbar-collapse">
<ul class="navbar-nav">
<li class="nav-item">
<a class="save_config"><p><i class="fa fa-download"></i> <%-lang.Database%> : <%-lang.Export%></p></a>
</li>
</ul>
</div>
</div>
</nav>
<% [
'Users',
'Monitors',
'API',
'Videos',
'Cloud Videos',
'Logs',
'Presets',
'Files'
].forEach(function(tableName){ %>
<div class="form-group">
<label><div><span><%=tableName%></span></div>
<div>
<select class="form-control" tableName="<%=tableName%>">
<option value="0">No</option>
<option value="1" selected=>Yes</option>
</select>
</div>
</label>
</div>
<% }) %>
<input hidden name="tables">
</form>
</div>
<div class="col-md-6">
<form class="form-group-group red import">
<nav class="navbar navbar-rounded navbar-expand-lg bg-primary" style="margin-top:10px">
<div class="container">
<div class="collapse navbar-collapse">
<ul class="navbar-nav">
<li class="nav-item">
<a class="import_config"><p><i class="fa fa-upload"></i> <%-lang.Database%> : <%-lang.Import%></p></a>
</li>
</ul>
</div>
</div>
</nav>
<div class="form-group">
<label><div><span><%=lang['Upload File']%></span></div>
<div>
<input type="file" class="fileToUpload" name="hi">
<input type="file" class="fileToUpload">
<input type="file" class="fileToUpload">
<input type="file" class="fileToUpload">
</div>
</label>
</div>
</form>
</div>
</div>
<script>
var tableNames = [
'Users',
'Monitors',
'API',
'Videos',
'Cloud Videos',
'Logs',
'Files',
'Presets',
]
$.superBackupDatabase = {}
$.superBackupDatabase.e = $('#superBackupDatabase')
$.superBackupDatabase.exportForm = $.superBackupDatabase.e.find('form.export')
$.superBackupDatabase.importForm = $.superBackupDatabase.e.find('form.import')
$(document).ready(function(){
$.superBackupDatabase.e.find('.save_config').click(function(){
$.superBackupDatabase.exportForm.submit()
})
$.superBackupDatabase.e.find('.import_config').click(function(){
$.superBackupDatabase.importForm.submit()
})
$.superBackupDatabase.exportForm.submit(function(e){
e.preventDefault()
var selectedTables = {}
$('[tableName]').each(function(){
var el = $(this)
var tableName = el.attr('tableName')
var tableSelected = el.val()
selectedTables[tableName] = tableSelected
})
$.post('<%=originalURL%><%=config.webPaths.superApiPrefix%>'+$user.sessionKey+'/export/system',selectedTables,function(data){
var partsOfResponse = []
$.each(data.database,function(tableName,rows){
})
var dataStr = "data:text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(data))
$('#temp').html('<a></a>')
.find('a')
.attr('href',dataStr)
.attr('download','Shinobi_System_Backup_(' + Object.keys(selectedTables).join(',') + ')_' + (new Date()) + '.json')
[0].click()
})
return false
})
$.superBackupDatabase.importForm.submit(function(e){
e.preventDefault()
var el = $(this)
var uploadElements = el.find('.fileToUpload')
var formdata = new FormData(this);
console.log(formdata)
// $.each(uploadElements,function(n,v){
// var uploadElement = $(v)
// var fileElement = uploadElement.prop('files')
// if(fileElement.length > 0){
// formdata.append("importData" + n, fileElement[0])
// }
// })
// try{
// var isPrescribedLayer = true
// var importData = JSON.parse($.superBackupDatabase.importForm.find('textarea').val())
// $.each(tableNames,function(n,tableName){
// if(importData[tableName])isPrescribedLayer = false
// })
// if(isPrescribedLayer == false){
// importData = {database: importData}
// }
// }catch(err){
// console.log(err)
// return (new PNotify({text:'JSON is invalid',type:'error'}))
// }
$.post('<%=originalURL%><%=config.webPaths.superApiPrefix%>'+$user.sessionKey+'/import/system',$(formdata).serializeObject(),function(data){
console.log(data)
if(data && data.ok)new PNotify({text:'Imported Data',type:'success'})
})
return false
})
})
</script>

View file

@ -77,4 +77,5 @@
</div>
</div>
</div>
</div>
</div>
<script src="<%-window.libURL%>libs/js/dash2.timelapse.js"></script>

View file

@ -43,6 +43,7 @@
<div class="col-md-4 text-left">
<a class="btn btn-danger delete_selected"><i class="fa fa-trash-o"></i> &nbsp; <%-lang['Delete']%></a>
<a class="btn btn-default export_selected"><i class="fa fa-folder-o"></i> &nbsp; <%-lang['Zip and Download']%></a>
<a class="btn btn-default merge_selected"><i class="fa fa-copy"></i> &nbsp; <%-lang['Merge and Download']%></a>
</div>
<div class="col-md-4">
<div class="text-center" id="videos_viewer_pages"></div>
@ -77,3 +78,4 @@
</div>
</div>
</div>
<script src="<%-window.libURL%>libs/js/dash2.vidview.js"></script>

View file

@ -21,6 +21,7 @@ requires https or firefox
<canvas id="canvas"></canvas>
<script src="<%-window.libURL%>libs/js/jquery.min.js"></script>
<script src="<%-window.libURL%>libs/js/socket.io.js"></script>
<script src="<%-window.libURL%>libs/js/basic.js"></script>
<script src="<%-window.libURL%>libs/js/menu.js"></script>
<script>
$.ccio = {}

View file

@ -1,4 +1,4 @@
<% include blocks/header %>
<% include blocks/header.ejs %>
<div class="shinobi-bg display-table" style="height:100%">
<div class="shinobi-bg-shade">
<div class="container">

View file

@ -4,6 +4,8 @@
<% include blocks/header %>
<script>var $user = <%- JSON.stringify($user) %>;</script>
<script>var lang = <%- JSON.stringify(lang) %>;</script>
<link rel="stylesheet" href="<%-window.libURL%>libs/css/roboto.css" type="text/css" />
<link rel="stylesheet" href="<%-window.libURL%>libs/css/material-design-iconic-font.min.css" type="text/css" />
<link rel="stylesheet" href="<%-window.libURL%>libs/css/pnotify.custom.min.css">
<link rel="stylesheet" href="<%-window.libURL%>libs/css/vbox.css">
<link rel="stylesheet" href="<%-window.libURL%>libs/css/daterangepicker.css">
@ -14,7 +16,22 @@
<link rel="stylesheet" href="<%-window.libURL%>libs/css/gridstack.min.css">
<link rel="stylesheet" href="<%-window.libURL%>libs/css/gridstack-extra.min.css">
<link rel="stylesheet" href="<%-window.libURL%>libs/css/bootstrap-table.min.css">
<!--
<link rel="stylesheet" href="<%-window.libURL%>libs/css/dash2.basic.css">
<link rel="stylesheet" href="<%-window.libURL%>libs/css/dash2.forms.css">
<link rel="stylesheet" href="<%-window.libURL%>libs/css/dash2.modal.css">
<link rel="stylesheet" href="<%-window.libURL%>libs/css/dash2.monitors.css">
<link rel="stylesheet" href="<%-window.libURL%>libs/css/dash2.powervideo.css">
<link rel="stylesheet" href="<%-window.libURL%>libs/css/dash2.ptzcontrols.css">
<link rel="stylesheet" href="<%-window.libURL%>libs/css/dash2.regioneditor.css">
<link rel="stylesheet" href="<%-window.libURL%>libs/css/dash2.rightotleft.css">
<link rel="stylesheet" href="<%-window.libURL%>libs/css/dash2.timelapse.css">
<link rel="stylesheet" href="<%-window.libURL%>libs/css/main.dash2.css">
-->
<link rel="stylesheet" href="<%-window.libURL%>libs/css/main.dash2.old.css">
<% customAutoLoad.LibsCss.forEach(function(lib){ %>
<link rel="stylesheet" href="<%-window.libURL%>libs/css/<%-lib%>">
<% }) %>
<style id="theme">
<% if(details.theme&&details.theme!==''){ %><%- include(__dirname+'/web/libs/themes/'+details.theme+'/style.css'); %><% } %>
</style>
@ -32,12 +49,6 @@
<% } %>
</style>
<html lang="en">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:regular,bold,italic,thin,light,bolditalic,black,medium&amp;lang=en">
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<!-- <link rel="stylesheet" href="$$hosted_libs_prefix$$/$$version$$/material.cyan-light_blue.min.css">-->
</head>
<body>
<div class="demo-layout demo-blog mdl-layout mdl-js-layout mdl-layout--fixed-drawer mdl-layout--fixed-header">
<header id="main_header" class="demo-header mdl-layout__header">
@ -121,6 +132,8 @@
<% if(!details.sub){ %>
<li class="mdl-menu__item" data-toggle="modal" data-target="#onvif_probe"><div><i class="fa fa-rss"></i><div><%- lang.ONVIF %></div></div></li>
<li class="mdl-menu__item" data-toggle="modal" data-target="#probe"><div><i class="fa fa-search"></i><div><%- lang.FFprobe %></div></div></li>
<li class="mdl-menu__item" data-toggle="modal" data-target="#monitorStates"><div><i class="fa fa-align-right"></i><div><%- lang['Monitor States'] %></div></div></li>
<li class="mdl-menu__item" data-toggle="modal" data-target="#schedules"><div><i class="fa fa-clock-o"></i><div><%- lang['Schedules'] %></div></div></li>
<li class="mdl-menu__item" data-toggle="modal" data-target="#filters"><div><i class="fa fa-filter"></i><div><%- lang.Filters %></div></div></li>
<% } %>
<li class="mdl-menu__item permission_view_logs" data-toggle="modal" data-target="#logs_modal"><div><i class="fa fa-exclamation-triangle"></i><div><%- lang.Logs %></div></div></li>
@ -167,7 +180,12 @@
<% include blocks/probe.ejs %>
<% include blocks/region.ejs %>
<% include blocks/detectorfilters.ejs %>
<% include blocks/monitorStates.ejs %>
<% include blocks/schedules.ejs %>
<% include blocks/confirm.ejs %>
<% customAutoLoad.PageBlocks.forEach(function(block){ %>
<%- include(block) %>
<% }) %>
<% if(config.DropboxAppKey){ %>
<!--Dropbox Library, Change data-app-key to your app key. -->
<script type="text/javascript" src="https://www.dropbox.com/static/api/2/dropins.js" id="dropboxjs" data-app-key="<%= config.DropboxAppKey %>"></script>
@ -198,5 +216,15 @@
<script src="<%-window.libURL%>libs/js/gridstack.min.js"></script>
<script src="<%-window.libURL%>libs/js/gridstack.jQueryUI.min.js"></script>
<script src="<%-window.libURL%>libs/js/basic.js"></script>
<script><% include ../libs/js/main.dash2.js %></script>
<script><% include ../libs/js/dash2.config.js %></script>
<script src="<%-window.libURL%>libs/js/dash2.basic.js"></script>
<script src="<%-window.libURL%>libs/js/dash2.confirm.js"></script>
<script src="<%-window.libURL%>libs/js/dash2.socketio.js"></script>
<script src="<%-window.libURL%>libs/js/dash2.gridstack.js"></script>
<script src="<%-window.libURL%>libs/js/dash2.elements.js"></script>
<script src="<%-window.libURL%>libs/js/dash2.elementbuilder.js"></script>
<script src="<%-window.libURL%>libs/js/dash2.init.js"></script>
<% customAutoLoad.LibsJs.forEach(function(lib){ %>
<script src="<%-window.libURL%>libs/js/<%-lib%>"></script>
<% }) %>
<% include blocks/help.ejs %>

2
web/pages/robots.txt Normal file
View file

@ -0,0 +1,2 @@
User-agent: *
Disallow: /

View file

@ -17,6 +17,7 @@ requires https or firefox
</div>
<video id="video"><source></video>
<canvas id="canvas"></canvas>
<script src="<%-window.libURL%>libs/js/jquery.min.js"></script>
<script src="<%-window.libURL%>libs/js/socket.io.js"></script>
<script src="<%-window.libURL%>libs/js/basic.js"></script>
<script src="<%-window.libURL%>libs/js/menu.js"></script>

View file

@ -8,8 +8,8 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0, shrink-to-fit=no' name='viewport' />
<!-- Fonts and icons -->
<link href="https://fonts.googleapis.com/css?family=Montserrat:400,700,200" rel="stylesheet" />
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/latest/css/font-awesome.min.css" />
<link href="<%-window.libURL%>libs/css/montserrat.css" rel="stylesheet" />
<link href="<%-window.libURL%>libs/css/font-awesome.min.css" rel="stylesheet" />
<!-- CSS Files -->
<link href="<%-window.libURL%>libs/css/bootstrap4.min.css" rel="stylesheet" />
<link href="<%-window.libURL%>libs/css/main.dash2.css" rel="stylesheet" />
@ -27,6 +27,9 @@
.list-group li .form-group {margin:0}
a {cursor:pointer}
</style>
<% customAutoLoad.superLibsCss.forEach(function(lib){ %>
<link rel="stylesheet" href="<%-window.libURL%>libs/css/<%-lib%>">
<% }) %>
</head>
<body class="index-page sidebar-collapse bg-hexagon">
@ -62,7 +65,7 @@
<div class="row">
<div class="col-md-12">
<div id="main-card" class="card">
<ul class="nav nav-tabs nav-tabs-neutral justify-content-center bg-primary" role="tablist">
<ul class="nav nav-tabs nav-tabs-neutral justify-content-center bg-primary" id="tablist" role="tablist">
<li class="nav-item">
<a class="nav-link active" data-toggle="tab" href="#accounts" role="tab">Accounts</a>
</li>
@ -169,8 +172,15 @@
</div>
</div>
</div>
<div id="temp" style="display:none"></div>
</body>
<script>
var superApiPrefix = "<%=originalURL%><%=config.webPaths.superApiPrefix%>"
</script>
<% include blocks/confirm.ejs %>
<% customAutoLoad.superPageBlocks.forEach(function(block){ %>
<%- include(block) %>
<% }) %>
<script src="<%-window.libURL%>libs/js/pnotify.custom.min.js" type="text/javascript"></script>
<script><% include ../libs/js/moment.js %></script>
<script src="<%-window.libURL%>libs/js/livestamp.min.js" type="text/javascript"></script>
@ -178,6 +188,7 @@
<script src="<%-window.libURL%>libs/js/placeholder.js" type="text/javascript"></script>
<script src="<%-window.libURL%>libs/js/now-ui-kit.js?v=1.1.0" type="text/javascript"></script>
<script type="text/javascript">
var lang = <%- JSON.stringify(lang) || {} %>;
PNotify.prototype.options.styling = "fontawesome";
$(document).ready(function() {
// the body of this function is in assets/js/now-ui-kit.js
@ -530,4 +541,7 @@ $('body')
})
</script>
<% include blocks/mainpermissions.ejs %>
<% customAutoLoad.superLibsJs.forEach(function(lib){ %>
<script src="<%-window.libURL%>libs/js/<%-lib%>"></script>
<% }) %>
</html>