commit
8bcf65f64d
|
@ -100,8 +100,8 @@ RUN sed -i -e 's/\r//g' /home/Shinobi/Docker/init.sh
|
||||||
|
|
||||||
VOLUME ["/home/Shinobi/videos"]
|
VOLUME ["/home/Shinobi/videos"]
|
||||||
VOLUME ["/home/Shinobi/plugins"]
|
VOLUME ["/home/Shinobi/plugins"]
|
||||||
|
VOLUME ["/home/Shinobi/libs/customAutoLoad"]
|
||||||
VOLUME ["/config"]
|
VOLUME ["/config"]
|
||||||
VOLUME ["/customAutoLoad"]
|
|
||||||
VOLUME ["/var/lib/mysql"]
|
VOLUME ["/var/lib/mysql"]
|
||||||
|
|
||||||
EXPOSE 8080 443 21 25
|
EXPOSE 8080 443 21 25
|
||||||
|
|
|
@ -98,8 +98,8 @@ RUN chmod -f +x /home/Shinobi/Docker/init.sh
|
||||||
|
|
||||||
VOLUME ["/home/Shinobi/videos"]
|
VOLUME ["/home/Shinobi/videos"]
|
||||||
VOLUME ["/home/Shinobi/plugins"]
|
VOLUME ["/home/Shinobi/plugins"]
|
||||||
|
VOLUME ["/home/Shinobi/libs/customAutoLoad"]
|
||||||
VOLUME ["/config"]
|
VOLUME ["/config"]
|
||||||
VOLUME ["/customAutoLoad"]
|
|
||||||
VOLUME ["/var/lib/mysql"]
|
VOLUME ["/var/lib/mysql"]
|
||||||
|
|
||||||
EXPOSE 8080
|
EXPOSE 8080
|
||||||
|
|
|
@ -107,8 +107,8 @@ RUN sed -i -e 's/\r//g' /home/Shinobi/Docker/init.sh
|
||||||
|
|
||||||
VOLUME ["/home/Shinobi/videos"]
|
VOLUME ["/home/Shinobi/videos"]
|
||||||
VOLUME ["/home/Shinobi/plugins"]
|
VOLUME ["/home/Shinobi/plugins"]
|
||||||
|
VOLUME ["/home/Shinobi/libs/customAutoLoad"]
|
||||||
VOLUME ["/config"]
|
VOLUME ["/config"]
|
||||||
VOLUME ["/customAutoLoad"]
|
|
||||||
VOLUME ["/var/lib/mysql"]
|
VOLUME ["/var/lib/mysql"]
|
||||||
|
|
||||||
EXPOSE 8080 443 21 25
|
EXPOSE 8080 443 21 25
|
||||||
|
|
|
@ -125,7 +125,7 @@ if [ "${ffmpeginstall^}" = "Y" ]; then
|
||||||
elif [ "$version" = 8 ]; then
|
elif [ "$version" = 8 ]; then
|
||||||
#Enable Negativo17 repo for FFMPEG (CentOS 8)
|
#Enable Negativo17 repo for FFMPEG (CentOS 8)
|
||||||
sudo dnf install epel-release dnf-utils -y -q -e 0
|
sudo dnf install epel-release dnf-utils -y -q -e 0
|
||||||
sudo yum-config-manager --set-enabled PowerTools
|
sudo yum-config-manager --set-enabled powertools
|
||||||
sudo yum-config-manager --add-repo=https://negativo17.org/repos/epel-multimedia.repo
|
sudo yum-config-manager --add-repo=https://negativo17.org/repos/epel-multimedia.repo
|
||||||
sudo dnf install ffmpeg ffmpeg-devel -y -q -e 0
|
sudo dnf install ffmpeg ffmpeg-devel -y -q -e 0
|
||||||
fi
|
fi
|
||||||
|
@ -148,7 +148,7 @@ if [ "${installdbserver^}" = "Y" ] || [ "${installdbserver^}" = "" ]; then
|
||||||
|
|
||||||
if [ "${securedbserver^}" = "Y" ]; then
|
if [ "${securedbserver^}" = "Y" ]; then
|
||||||
#Configure basic security for MariaDB
|
#Configure basic security for MariaDB
|
||||||
sudo mysql_secure_installation
|
sudo mariadb-secure-installation
|
||||||
else
|
else
|
||||||
echo "========================================================="
|
echo "========================================================="
|
||||||
echo "Skipping database server security configuration..."
|
echo "Skipping database server security configuration..."
|
||||||
|
|
|
@ -76,7 +76,7 @@ if [ "$mysqlagree" = "y" ] || [ "$mysqlagree" = "Y" ]; then
|
||||||
sudo systemctl start mariadb
|
sudo systemctl start mariadb
|
||||||
sudo systemctl enable mariadb
|
sudo systemctl enable mariadb
|
||||||
#Run mysql install
|
#Run mysql install
|
||||||
sudo mysql_secure_installation
|
sudo mariadb-secure-installation
|
||||||
fi
|
fi
|
||||||
echo "============="
|
echo "============="
|
||||||
echo "Shinobi - Database Installation"
|
echo "Shinobi - Database Installation"
|
||||||
|
|
9
cron.js
9
cron.js
|
@ -92,8 +92,8 @@ const deleteVideo = (x) => {
|
||||||
const deleteFileBinEntry = (x) => {
|
const deleteFileBinEntry = (x) => {
|
||||||
postMessage({f:'s.deleteFileBinEntry',file:x})
|
postMessage({f:'s.deleteFileBinEntry',file:x})
|
||||||
}
|
}
|
||||||
const setDiskUsedForGroup = (groupKey,size,target) => {
|
const setDiskUsedForGroup = (groupKey,size,target,videoRow) => {
|
||||||
postMessage({f:'s.setDiskUsedForGroup', ke: groupKey, size: size, target: target})
|
postMessage({f:'s.setDiskUsedForGroup', ke: groupKey, size: size, target: target, videoRow: videoRow})
|
||||||
}
|
}
|
||||||
const getVideoDirectory = function(e){
|
const getVideoDirectory = function(e){
|
||||||
if(e.mid&&!e.id){e.id=e.mid};
|
if(e.mid&&!e.id){e.id=e.mid};
|
||||||
|
@ -185,6 +185,7 @@ const checkFilterRules = function(v){
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
const deleteVideosByDays = async (v,days,addedQueries) => {
|
const deleteVideosByDays = async (v,days,addedQueries) => {
|
||||||
|
const groupKey = v.ke;
|
||||||
const whereQuery = [
|
const whereQuery = [
|
||||||
['ke','=',v.ke],
|
['ke','=',v.ke],
|
||||||
['time','<', sqlDate(days+' DAY')],
|
['time','<', sqlDate(days+' DAY')],
|
||||||
|
@ -207,7 +208,8 @@ const deleteVideosByDays = async (v,days,addedQueries) => {
|
||||||
const filename = formattedTime(row.time) + '.' + row.ext
|
const filename = formattedTime(row.time) + '.' + row.ext
|
||||||
try{
|
try{
|
||||||
await fs.promises.unlink(dir + filename)
|
await fs.promises.unlink(dir + filename)
|
||||||
clearSize += row.size / 1048576
|
const fileSizeMB = row.size / 1048576;
|
||||||
|
setDiskUsedForGroup(groupKey,-fileSizeMB,null,row)
|
||||||
sendToWebSocket({
|
sendToWebSocket({
|
||||||
f: 'video_delete',
|
f: 'video_delete',
|
||||||
filename: filename + '.' + row.ext,
|
filename: filename + '.' + row.ext,
|
||||||
|
@ -227,7 +229,6 @@ const deleteVideosByDays = async (v,days,addedQueries) => {
|
||||||
where: whereQuery
|
where: whereQuery
|
||||||
})
|
})
|
||||||
affectedRows = deleteResponse.rows || 0
|
affectedRows = deleteResponse.rows || 0
|
||||||
setDiskUsedForGroup(v.ke,-clearSize)
|
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
ok: true,
|
ok: true,
|
||||||
|
|
|
@ -51,7 +51,7 @@
|
||||||
"Enable Nightvision": "Ativar Visão Noturna",
|
"Enable Nightvision": "Ativar Visão Noturna",
|
||||||
"Disable Nightvision": "Desativar Visão Noturna",
|
"Disable Nightvision": "Desativar Visão Noturna",
|
||||||
"Current": "Atual",
|
"Current": "Atual",
|
||||||
"Monitors": "Monitors",
|
"Monitors": "Monitores",
|
||||||
"Video": "Video",
|
"Video": "Video",
|
||||||
"Videos": "Videos",
|
"Videos": "Videos",
|
||||||
"Events": "Eventos",
|
"Events": "Eventos",
|
||||||
|
@ -122,12 +122,12 @@
|
||||||
"Execute Command": "Executar Comando",
|
"Execute Command": "Executar Comando",
|
||||||
"for Global Access": "para Acesso Global",
|
"for Global Access": "para Acesso Global",
|
||||||
"Help": "Ajuda",
|
"Help": "Ajuda",
|
||||||
"Don't show this anymore": "Não mostre isso mais",
|
"Don't show this anymore": "Não me mostre isso mais",
|
||||||
"Chat on Discord": "Conversar no Discord",
|
"Chat on Discord": "Conversar no Discord",
|
||||||
"Documentation": "Documentação",
|
"Documentation": "Documentação",
|
||||||
"All Monitors": "Todos Monitores",
|
"All Monitors": "Todos Monitores",
|
||||||
"Motion Meter": "Medidos de Movimento",
|
"Motion Meter": "Medição de movimentos",
|
||||||
"FFmpegTip": "FFprobe is a simple multimedia streams analyzer. You can use it to output all kinds of information about an input including duration, frame rate, frame size, etc.",
|
"FFmpegTip": "FFprobe é um simples analisador de streams. Você pode usá-lo para extrar todos os tipos de informação sobre uma entrada incluindo duração, taxa de frames por segundo, tamanho do frame, etc;",
|
||||||
"Complete Stream URL": "URL de transmissão completa",
|
"Complete Stream URL": "URL de transmissão completa",
|
||||||
"ONVIF Scanner": "ONVIF Scanner",
|
"ONVIF Scanner": "ONVIF Scanner",
|
||||||
"Scan Settings": "Configurações de digitalização",
|
"Scan Settings": "Configurações de digitalização",
|
||||||
|
@ -162,7 +162,7 @@
|
||||||
"Browser Console Log": "Navegador de logs",
|
"Browser Console Log": "Navegador de logs",
|
||||||
"All Monitors and Privileges": "Todos monitores e privilégios",
|
"All Monitors and Privileges": "Todos monitores e privilégios",
|
||||||
"Permissions": "Permissões",
|
"Permissions": "Permissões",
|
||||||
"Time-lapse Tool": "Ferramenta Time-laps",
|
"Time-lapse Tool": "Time-lapse",
|
||||||
"total": "total",
|
"total": "total",
|
||||||
"MB": "MB",
|
"MB": "MB",
|
||||||
"Calendar": "Calendário",
|
"Calendar": "Calendário",
|
||||||
|
@ -187,11 +187,11 @@
|
||||||
"Add New": "Adicionar novo",
|
"Add New": "Adicionar novo",
|
||||||
"Delete Selected Videos": "Excluir vídeos selecionados",
|
"Delete Selected Videos": "Excluir vídeos selecionados",
|
||||||
"DeleteSelectedVideosMsg": "Deseja excluir esses vídeos? Você não poderá recuperá-los.",
|
"DeleteSelectedVideosMsg": "Deseja excluir esses vídeos? Você não poderá recuperá-los.",
|
||||||
"clientStreamFailedattemptingReconnect": "A verificação ctream do lado do cliente falhou, tentando reconectar.",
|
"clientStreamFailedattemptingReconnect": "A verificação do stream falhou, tentando se reconectar.",
|
||||||
"Delete Filter": "Excluir filtro",
|
"Delete Filter": "Excluir filtro",
|
||||||
"confirmDeleteFilter": "Deseja excluir este filtro? Você não poderá recuperá-lo.",
|
"confirmDeleteFilter": "Deseja excluir este filtro? Você não poderá recuperá-lo.",
|
||||||
"Fix Video": "Corrigir Vídeo",
|
"Fix Video": "Corrigir Vídeo",
|
||||||
"FixVideoMsg": "Você deseja corrigir esse vídeo? Você não poderá desfazer essa ação..",
|
"FixVideoMsg": "Você deseja corrigir o vídeo? Você não poderá desfazer essa ação..",
|
||||||
"DeleteVideoMsg": "Deseja excluir este vídeo? Você não poderá recuperá-lo.",
|
"DeleteVideoMsg": "Deseja excluir este vídeo? Você não poderá recuperá-lo.",
|
||||||
"dropBoxSuccess": "Sucesso! Arquivos salvos em seu Dropbox.",
|
"dropBoxSuccess": "Sucesso! Arquivos salvos em seu Dropbox.",
|
||||||
"API Key Deleted": "Chave da API excluída",
|
"API Key Deleted": "Chave da API excluída",
|
||||||
|
@ -246,13 +246,13 @@
|
||||||
"Connected": "Conectado",
|
"Connected": "Conectado",
|
||||||
"Not Connected": "Não conectado",
|
"Not Connected": "Não conectado",
|
||||||
"Lisence Plate Detector": "Detector de placas",
|
"Lisence Plate Detector": "Detector de placas",
|
||||||
"OpenCV Cascades": "OpenCV Cascatas",
|
"OpenCV Cascades": "Cascatas OpenCV ",
|
||||||
"Refresh List of Cascades": "Atualizar Lista de Cascatas",
|
"Refresh List of Cascades": "Atualizar Lista de Cascatas",
|
||||||
"\"No Motion\" Detector": "\"Sem movimento\" Detector",
|
"\"No Motion\" Detector": "\"Sem movimento\" Detector",
|
||||||
"Control": "Controle",
|
"Control": "Controle",
|
||||||
"Grouping": "Agrupando <small>Adicione grupos em <b>Configurações</b></small>",
|
"Grouping": "Agrupando <small>Adicione grupos em <b>Configurações</b></small>",
|
||||||
"Logging": "Logging",
|
"Logging": "Logging",
|
||||||
"IdentityText1": "É assim que o sistema irá identificar os dados para este fluxo. Você não pode alterar o <b>ID do Monitor</b> uma vez que você pressionou salvar. Se você quiser, você pode fazer o <b>ID do Monitor</b> mais legível para humanos antes de continuar.",
|
"IdentityText1": "É assim que o sistema irá identificar os dados para este fluxo. Você não pode alterar o <b>ID do Monitor</b> uma vez que você o salvou. Se você quiser, você pode fazer o <b>ID do Monitor</b> mais legível para humanos antes de continuar.",
|
||||||
"IdentityText2": "Você pode duplicar um monitor modificando o <b>ID do Monitor</b> e depois pressionando salvar. Você <b>não pode</b> usar o ID de um monitor que já existe ou ele economizará sobre as informações do banco de dados desse monitor.",
|
"IdentityText2": "Você pode duplicar um monitor modificando o <b>ID do Monitor</b> e depois pressionando salvar. Você <b>não pode</b> usar o ID de um monitor que já existe ou ele economizará sobre as informações do banco de dados desse monitor.",
|
||||||
"noSpecialCharacters": "Sem espaços ou caracteres especiais.",
|
"noSpecialCharacters": "Sem espaços ou caracteres especiais.",
|
||||||
"NotesPlacholder": "Comentários que você quer deixar para as configurações desta câmera.",
|
"NotesPlacholder": "Comentários que você quer deixar para as configurações desta câmera.",
|
||||||
|
@ -273,7 +273,7 @@
|
||||||
"Path": "Caminho",
|
"Path": "Caminho",
|
||||||
"Monitor Capture Rate": "Taxa de captura do monitor <small>(FPS)</small>",
|
"Monitor Capture Rate": "Taxa de captura do monitor <small>(FPS)</small>",
|
||||||
"Analyzation Duration": "Duração da análise",
|
"Analyzation Duration": "Duração da análise",
|
||||||
"Probe Size": "Probe Size",
|
"Probe Size": "Tamanho da sonda",
|
||||||
"Stream Type": "Tipo de transmissão",
|
"Stream Type": "Tipo de transmissão",
|
||||||
"# of Allow MJPEG Clients": "# para permitir clientes MJPEG <small>0 para infinito</small>",
|
"# of Allow MJPEG Clients": "# para permitir clientes MJPEG <small>0 para infinito</small>",
|
||||||
"HLS Video Encoder": "Codificador de vídeo HLS",
|
"HLS Video Encoder": "Codificador de vídeo HLS",
|
||||||
|
@ -281,9 +281,9 @@
|
||||||
"HLS Segment Length": "Comprimento do segmento HLS <small>em segundos</small>",
|
"HLS Segment Length": "Comprimento do segmento HLS <small>em segundos</small>",
|
||||||
"HLS Preset": "Pré-definição HLS",
|
"HLS Preset": "Pré-definição HLS",
|
||||||
"HLS List Size": "Tamanho da lista HLS",
|
"HLS List Size": "Tamanho da lista HLS",
|
||||||
"Check Signal Interval": "Verifique o intervalo do sinal <small>em minutos</small>",
|
"Check Signal Interval": "Verificar o intervalo do sinal <small>em minutos</small>",
|
||||||
"Log Signal Event": "Evento de sinal de registro <small>Apenas cliente</small>",
|
"Log Signal Event": "Evento de sinal de registro <small>Apenas cliente</small>",
|
||||||
"Quality": "Qualidade <small>1 para alta, 23 para Low</small>",
|
"Quality": "Qualidade <small>1 para alta, 23 para baixa</small>",
|
||||||
"Rate": "Taxa <small>(FPS)</small>",
|
"Rate": "Taxa <small>(FPS)</small>",
|
||||||
"Width": "Largura",
|
"Width": "Largura",
|
||||||
"Height": "Altura",
|
"Height": "Altura",
|
||||||
|
@ -444,13 +444,13 @@
|
||||||
"Process Unexpected Exit": "Saída inesperado do processo",
|
"Process Unexpected Exit": "Saída inesperado do processo",
|
||||||
"Process Crashed for Monitor": "Processo de Monitor quebrado",
|
"Process Crashed for Monitor": "Processo de Monitor quebrado",
|
||||||
"FFmpegCantStart": "FFmpeg não pôde iniciar",
|
"FFmpegCantStart": "FFmpeg não pôde iniciar",
|
||||||
"FFmpegCantStartText": "O mecanismo de gravação para esta câmera não pôde começar. Pode haver algo errado com a configuração da sua câmera. Se houver algum registro diferente deste, por favor, coloque-os em <b> Problemas </b> no Github.",
|
"FFmpegCantStartText": "O FFMpeg não pode inicializar. Pode haver algo de errado com a configuração da sua câmera. Se houver alguma configuração diferente, por favor, reporte no Gitlab.",
|
||||||
"JPEG Error": "Erro JPEG",
|
"JPEG Error": "Erro JPEG",
|
||||||
"JPEGErrorText": "Houve um problema ao obter dados da sua câmera.",
|
"JPEGErrorText": "Houve um problema ao obter dados da sua câmera.",
|
||||||
"Fatal Maximum Reached": "Máximo atingido, parando câmera.",
|
"Fatal Maximum Reached": "Máximo atingido, parando câmera.",
|
||||||
"FatalMaximumReachedText": "Erro JPEG fatal.",
|
"FatalMaximumReachedText": "Erro fatal de JPEG",
|
||||||
"Incorrect Settings Chosen": "Configuração incorreta escolhida",
|
"Incorrect Settings Chosen": "Configuração incorreta escolhida",
|
||||||
"Can't Connect": "Não pode conectar",
|
"Can't Connect": "Não foi possível conectar",
|
||||||
"Video Finished": "Vídeo finalizado",
|
"Video Finished": "Vídeo finalizado",
|
||||||
"No Monitor Found, Ignoring Request": "Monitor não encontrado, ignorando requisição",
|
"No Monitor Found, Ignoring Request": "Monitor não encontrado, ignorando requisição",
|
||||||
"Event": "Evento",
|
"Event": "Evento",
|
||||||
|
|
|
@ -955,7 +955,22 @@ module.exports = function(s,config,lang,io){
|
||||||
s.deleteFileBinEntry(d.file)
|
s.deleteFileBinEntry(d.file)
|
||||||
break;
|
break;
|
||||||
case's.setDiskUsedForGroup':
|
case's.setDiskUsedForGroup':
|
||||||
s.setDiskUsedForGroup(d.ke,d.size,d.target || undefined)
|
function doOnMain(){
|
||||||
|
s.setDiskUsedForGroup(d.ke,d.size,d.target || undefined)
|
||||||
|
}
|
||||||
|
if(d.videoRow){
|
||||||
|
let storageIndex = s.getVideoStorageIndex(d.videoRow);
|
||||||
|
if(storageIndex){
|
||||||
|
s.setDiskUsedForGroupAddStorage(d.ke,{
|
||||||
|
size: d.size,
|
||||||
|
storageIndex: storageIndex
|
||||||
|
})
|
||||||
|
}else{
|
||||||
|
doOnMain()
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
doOnMain()
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case'start':case'end':
|
case'start':case'end':
|
||||||
d.mid='_cron';s.userLog(d,{type:'cron',msg:d.msg})
|
d.mid='_cron';s.userLog(d,{type:'cron',msg:d.msg})
|
||||||
|
|
|
@ -608,9 +608,11 @@ module.exports = function(s,config,lang){
|
||||||
}
|
}
|
||||||
s.getVideoStorageIndex = function(video){
|
s.getVideoStorageIndex = function(video){
|
||||||
try{
|
try{
|
||||||
var details = s.parseJSON(video.details) || {}
|
const monitorId = video.id || video.mid
|
||||||
var storageId = details.storageId
|
const details = s.parseJSON(video.details) || {}
|
||||||
if(s.group[video.ke] && s.group[video.ke].activeMonitors[video.id] && s.group[video.ke].activeMonitors[video.id].addStorageId)storageId = s.group[video.ke].activeMonitors[video.id].addStorageId
|
const storageId = details.storageId
|
||||||
|
const activeMonitor = s.group[video.ke] && s.group[video.ke].activeMonitors[monitorId] ? s.group[video.ke].activeMonitors[monitorId] : null;
|
||||||
|
if(activeMonitor && activeMonitor.addStorageId)storageId = activeMonitor.addStorageId;
|
||||||
if(storageId){
|
if(storageId){
|
||||||
return s.group[video.ke].addStorageUse[storageId]
|
return s.group[video.ke].addStorageUse[storageId]
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue