From 318b5940a23ddb9860278619269c5288c52240e2 Mon Sep 17 00:00:00 2001 From: Elad Bar Date: Fri, 5 Nov 2021 19:34:50 +0000 Subject: [PATCH 01/11] Fix VOLUME /customAutoLoad --- Dockerfile | 2 +- Dockerfile.arm32v7 | 2 +- Dockerfile.nvidia | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index dc0ede43..e0b40bde 100644 --- a/Dockerfile +++ b/Dockerfile @@ -100,8 +100,8 @@ RUN sed -i -e 's/\r//g' /home/Shinobi/Docker/init.sh VOLUME ["/home/Shinobi/videos"] VOLUME ["/home/Shinobi/plugins"] +VOLUME ["/home/Shinobi/libs/customAutoLoad"] VOLUME ["/config"] -VOLUME ["/customAutoLoad"] VOLUME ["/var/lib/mysql"] EXPOSE 8080 443 21 25 diff --git a/Dockerfile.arm32v7 b/Dockerfile.arm32v7 index e7bd2698..c85896f6 100644 --- a/Dockerfile.arm32v7 +++ b/Dockerfile.arm32v7 @@ -98,8 +98,8 @@ RUN chmod -f +x /home/Shinobi/Docker/init.sh VOLUME ["/home/Shinobi/videos"] VOLUME ["/home/Shinobi/plugins"] +VOLUME ["/home/Shinobi/libs/customAutoLoad"] VOLUME ["/config"] -VOLUME ["/customAutoLoad"] VOLUME ["/var/lib/mysql"] EXPOSE 8080 diff --git a/Dockerfile.nvidia b/Dockerfile.nvidia index 0a06510b..10ac76ef 100644 --- a/Dockerfile.nvidia +++ b/Dockerfile.nvidia @@ -107,8 +107,8 @@ RUN sed -i -e 's/\r//g' /home/Shinobi/Docker/init.sh VOLUME ["/home/Shinobi/videos"] VOLUME ["/home/Shinobi/plugins"] +VOLUME ["/home/Shinobi/libs/customAutoLoad"] VOLUME ["/config"] -VOLUME ["/customAutoLoad"] VOLUME ["/var/lib/mysql"] EXPOSE 8080 443 21 25 From bb010997d1ff86f98a04f4c1bbaefc39304467ca Mon Sep 17 00:00:00 2001 From: Matheus de Paula Date: Sun, 14 Nov 2021 02:48:15 +0000 Subject: [PATCH 02/11] Update pt_BR.json --- languages/pt_BR.json | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/languages/pt_BR.json b/languages/pt_BR.json index 34b64f42..14367af0 100644 --- a/languages/pt_BR.json +++ b/languages/pt_BR.json @@ -51,7 +51,7 @@ "Enable Nightvision": "Ativar Visão Noturna", "Disable Nightvision": "Desativar Visão Noturna", "Current": "Atual", - "Monitors": "Monitors", + "Monitors": "Monitores", "Video": "Video", "Videos": "Videos", "Events": "Eventos", @@ -122,12 +122,12 @@ "Execute Command": "Executar Comando", "for Global Access": "para Acesso Global", "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", "Documentation": "Documentação", "All Monitors": "Todos Monitores", - "Motion Meter": "Medidos de Movimento", - "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.", + "Motion Meter": "Medição de movimentos", + "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", "ONVIF Scanner": "ONVIF Scanner", "Scan Settings": "Configurações de digitalização", @@ -162,7 +162,7 @@ "Browser Console Log": "Navegador de logs", "All Monitors and Privileges": "Todos monitores e privilégios", "Permissions": "Permissões", - "Time-lapse Tool": "Ferramenta Time-laps", + "Time-lapse Tool": "Time-lapse", "total": "total", "MB": "MB", "Calendar": "Calendário", @@ -187,11 +187,11 @@ "Add New": "Adicionar novo", "Delete Selected Videos": "Excluir vídeos selecionados", "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", "confirmDeleteFilter": "Deseja excluir este filtro? Você não poderá recuperá-lo.", "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.", "dropBoxSuccess": "Sucesso! Arquivos salvos em seu Dropbox.", "API Key Deleted": "Chave da API excluída", @@ -246,13 +246,13 @@ "Connected": "Conectado", "Not Connected": "Não conectado", "Lisence Plate Detector": "Detector de placas", - "OpenCV Cascades": "OpenCV Cascatas", + "OpenCV Cascades": "Cascatas OpenCV ", "Refresh List of Cascades": "Atualizar Lista de Cascatas", "\"No Motion\" Detector": "\"Sem movimento\" Detector", "Control": "Controle", "Grouping": "Agrupando   Adicione grupos em Configurações", "Logging": "Logging", - "IdentityText1": "É assim que o sistema irá identificar os dados para este fluxo. Você não pode alterar o ID do Monitor uma vez que você pressionou salvar. Se você quiser, você pode fazer o ID do Monitor 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 ID do Monitor uma vez que você o salvou. Se você quiser, você pode fazer o ID do Monitor mais legível para humanos antes de continuar.", "IdentityText2": "Você pode duplicar um monitor modificando o ID do Monitor e depois pressionando salvar. Você não pode 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.", "NotesPlacholder": "Comentários que você quer deixar para as configurações desta câmera.", @@ -273,7 +273,7 @@ "Path": "Caminho", "Monitor Capture Rate": "Taxa de captura do monitor (FPS)", "Analyzation Duration": "Duração da análise", - "Probe Size": "Probe Size", + "Probe Size": "Tamanho da sonda", "Stream Type": "Tipo de transmissão", "# of Allow MJPEG Clients": "# para permitir clientes MJPEG 0 para infinito", "HLS Video Encoder": "Codificador de vídeo HLS", @@ -281,9 +281,9 @@ "HLS Segment Length": "Comprimento do segmento HLS em segundos", "HLS Preset": "Pré-definição HLS", "HLS List Size": "Tamanho da lista HLS", - "Check Signal Interval": "Verifique o intervalo do sinal em minutos", + "Check Signal Interval": "Verificar o intervalo do sinal em minutos", "Log Signal Event": "Evento de sinal de registro Apenas cliente", - "Quality": "Qualidade 1 para alta, 23 para Low", + "Quality": "Qualidade 1 para alta, 23 para baixa", "Rate": "Taxa (FPS)", "Width": "Largura", "Height": "Altura", @@ -444,13 +444,13 @@ "Process Unexpected Exit": "Saída inesperado do processo", "Process Crashed for Monitor": "Processo de Monitor quebrado", "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 Problemas 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", "JPEGErrorText": "Houve um problema ao obter dados da sua 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", - "Can't Connect": "Não pode conectar", + "Can't Connect": "Não foi possível conectar", "Video Finished": "Vídeo finalizado", "No Monitor Found, Ignoring Request": "Monitor não encontrado, ignorando requisição", "Event": "Evento", From 9648f8cc60bfb246103694f5f06e0e38cca1da12 Mon Sep 17 00:00:00 2001 From: Moe Date: Thu, 18 Nov 2021 19:48:13 -0800 Subject: [PATCH 03/11] update P2P Server list for dev branch --- libs/commander.js | 137 ++++++++++++++++++++++------------------------ 1 file changed, 64 insertions(+), 73 deletions(-) diff --git a/libs/commander.js b/libs/commander.js index 7ed6d364..96f8b519 100644 --- a/libs/commander.js +++ b/libs/commander.js @@ -1,85 +1,76 @@ const { Worker } = require('worker_threads'); module.exports = function(s,config,lang,app){ + const fetch = require('node-fetch') const { modifyConfiguration, getConfiguration } = require('./system/utils.js')(config) + let customerServerList = !!config.p2pServerList; var runningWorker; config.machineId = config.p2pApiKey + '' + config.p2pGroupId config.p2pTargetAuth = config.p2pTargetAuth || s.gid(30) - if(!config.p2pServerList)config.p2pServerList = { - "vancouver-1": { - name: 'Vancouver-1', - host: 'p2p-vancouver-1.shinobi.cloud', - p2pPort: '8084', - webPort: '8000', - maxNetworkSpeed: { - up: 5000, - down: 5000, - shared: true + if(!config.workerStreamOutHandlers){ + config.workerStreamOutHandlers = [ + 'Base64', + 'FLV', + 'MP4', + ]; + } + if(!customerServerList){ + config.p2pServerList = { + "vancouver-1": { + name: 'Vancouver-1', + host: 'p2p-vancouver-1.shinobi.cloud', + p2pPort: '8084', + webPort: '8000', + maxNetworkSpeed: { + up: 5000, + down: 5000, + shared: true + }, + location: { + lat: 49.284966, + lon: -123.1140607 + } }, - location: { - lat: 49.284966, - lon: -123.1140607 - } - }, - "vancouver-2": { - name: 'Vancouver-2', - host: 'p2p-vancouver-2.shinobi.cloud', - p2pPort: '8084', - webPort: '8000', - maxNetworkSpeed: { - up: 400, - down: 1000, - shared: true + "toronto-1": { + name: 'Toronto-1', + host: 'p2p-toronto-1.shinobi.cloud', + p2pPort: '8084', + webPort: '8000', + maxNetworkSpeed: { + up: 5000, + down: 5000, + shared: true + }, + location: { + lat: 43.644773, + lon: -79.3862837 + } }, - location: { - lat: 49.284966, - lon: -123.1140607 + "paris-1": { + name: 'Paris-1', + host: 'p2p-paris-1.shinobi.cloud', + p2pPort: '8084', + webPort: '8000', + maxNetworkSpeed: { + up: 200, + down: 200, + shared: true + }, + location: { + lat: 48.873877, + lon: 2.295533 + } } - }, - "toronto-1": { - name: 'Toronto-1', - host: 'p2p-toronto-1.shinobi.cloud', - p2pPort: '8084', - webPort: '8000', - maxNetworkSpeed: { - up: 5000, - down: 5000, - shared: true - }, - location: { - lat: 43.644773, - lon: -79.3862837 - } - }, - "paris-1": { - name: 'Paris-1', - host: 'p2p-paris-1.shinobi.cloud', - p2pPort: '8084', - webPort: '8000', - maxNetworkSpeed: { - up: 200, - down: 200, - shared: true - }, - location: { - lat: 48.873877, - lon: 2.295533 - } - }, - "amsterdam-1": { - name: 'Amsterdam-1', - host: 'p2p-amsterdam-1.shinobi.cloud', - p2pPort: '8084', - webPort: '8000', - maxNetworkSpeed: { - up: 500, - down: 500, - shared: true - }, - location: { - lat: 52.348773, - lon: 4.8846043 - } - }, + } + // get latest + fetch('https://cdn.shinobi.video/configs/p2pServers.js') + .then(res => res.text()) + .then((text) => { + try{ + eval(`config.p2pServerList = ` + text) + }catch(err){ + s.debugLog(err) + } + }); } if(!config.p2pHostSelected)config.p2pHostSelected = 'paris-1' const stopWorker = () => { From 7cd5afd24ad9d22dbbd4d266698f940b8176e6b0 Mon Sep 17 00:00:00 2001 From: Mike Hurley Date: Sat, 27 Nov 2021 03:23:54 +0000 Subject: [PATCH 04/11] Fix case of repo powertools --- INSTALL/CentOS - Quick Install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL/CentOS - Quick Install.sh b/INSTALL/CentOS - Quick Install.sh index b45014a5..e6fd1d9f 100644 --- a/INSTALL/CentOS - Quick Install.sh +++ b/INSTALL/CentOS - Quick Install.sh @@ -125,7 +125,7 @@ if [ "${ffmpeginstall^}" = "Y" ]; then elif [ "$version" = 8 ]; then #Enable Negativo17 repo for FFMPEG (CentOS 8) 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 dnf install ffmpeg ffmpeg-devel -y -q -e 0 fi From 9e3861aec610e1b719216f8a8a9ec4500d3673e4 Mon Sep 17 00:00:00 2001 From: Mike Hurley Date: Sat, 27 Nov 2021 04:00:50 +0000 Subject: [PATCH 05/11] update to address mysql_secure_installation to mariadb-secure-installation change --- INSTALL/CentOS - Quick Install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL/CentOS - Quick Install.sh b/INSTALL/CentOS - Quick Install.sh index e6fd1d9f..614de9b9 100644 --- a/INSTALL/CentOS - Quick Install.sh +++ b/INSTALL/CentOS - Quick Install.sh @@ -148,7 +148,7 @@ if [ "${installdbserver^}" = "Y" ] || [ "${installdbserver^}" = "" ]; then if [ "${securedbserver^}" = "Y" ]; then #Configure basic security for MariaDB - sudo mysql_secure_installation + sudo mariadb-secure-installation else echo "=========================================================" echo "Skipping database server security configuration..." From 4ee189203701ae1f22baf6b796acd009749c5341 Mon Sep 17 00:00:00 2001 From: Mike Hurley Date: Sat, 27 Nov 2021 04:02:29 +0000 Subject: [PATCH 06/11] update to address mysql_secure_installation to mariadb-secure-installation change --- INSTALL/centos.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL/centos.sh b/INSTALL/centos.sh index 4c8d7a77..15a61ea2 100644 --- a/INSTALL/centos.sh +++ b/INSTALL/centos.sh @@ -76,7 +76,7 @@ if [ "$mysqlagree" = "y" ] || [ "$mysqlagree" = "Y" ]; then sudo systemctl start mariadb sudo systemctl enable mariadb #Run mysql install - sudo mysql_secure_installation + sudo mariadb-secure-installation fi echo "=============" echo "Shinobi - Database Installation" From 71a536c0cd71480467a50552a5d25ffe1cf1395e Mon Sep 17 00:00:00 2001 From: Moe Date: Sat, 27 Nov 2021 19:12:54 -0800 Subject: [PATCH 07/11] cron syntax fix for file size setting after old video delete --- cron.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cron.js b/cron.js index ad9eb97b..59f6cc22 100644 --- a/cron.js +++ b/cron.js @@ -207,7 +207,7 @@ const deleteVideosByDays = async (v,days,addedQueries) => { const filename = formattedTime(row.time) + '.' + row.ext try{ await fs.promises.unlink(dir + filename) - row.size += clearSize + clearSize += row.size sendToWebSocket({ f: 'video_delete', filename: filename + '.' + row.ext, From 481cb4c75e221b05a01b1248f1a07c3d2d7b929e Mon Sep 17 00:00:00 2001 From: Moe Date: Sat, 27 Nov 2021 19:14:32 -0800 Subject: [PATCH 08/11] cron syntax fix for file size setting after old video delete --- cron.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cron.js b/cron.js index ad9eb97b..59f6cc22 100644 --- a/cron.js +++ b/cron.js @@ -207,7 +207,7 @@ const deleteVideosByDays = async (v,days,addedQueries) => { const filename = formattedTime(row.time) + '.' + row.ext try{ await fs.promises.unlink(dir + filename) - row.size += clearSize + clearSize += row.size sendToWebSocket({ f: 'video_delete', filename: filename + '.' + row.ext, From 0c3c183ae8306457a9442f0ed15bc860f1ded4d2 Mon Sep 17 00:00:00 2001 From: Moe Date: Sun, 28 Nov 2021 09:25:36 -0800 Subject: [PATCH 09/11] cron syntax fix for file size setting after old video delete+ --- cron.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cron.js b/cron.js index 59f6cc22..bc738df5 100644 --- a/cron.js +++ b/cron.js @@ -207,7 +207,7 @@ const deleteVideosByDays = async (v,days,addedQueries) => { const filename = formattedTime(row.time) + '.' + row.ext try{ await fs.promises.unlink(dir + filename) - clearSize += row.size + clearSize += row.size / 1048576 sendToWebSocket({ f: 'video_delete', filename: filename + '.' + row.ext, From b0b12d7261f089604e4a4e07af4dce0ef786531d Mon Sep 17 00:00:00 2001 From: Moe Date: Sun, 28 Nov 2021 09:26:02 -0800 Subject: [PATCH 10/11] cron syntax fix for file size setting after old video delete+ --- cron.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cron.js b/cron.js index 59f6cc22..bc738df5 100644 --- a/cron.js +++ b/cron.js @@ -207,7 +207,7 @@ const deleteVideosByDays = async (v,days,addedQueries) => { const filename = formattedTime(row.time) + '.' + row.ext try{ await fs.promises.unlink(dir + filename) - clearSize += row.size + clearSize += row.size / 1048576 sendToWebSocket({ f: 'video_delete', filename: filename + '.' + row.ext, From 26572e480bd254a445f1f32bf7fde6c484f142e8 Mon Sep 17 00:00:00 2001 From: Moe Date: Mon, 29 Nov 2021 13:56:26 -0800 Subject: [PATCH 11/11] fix cron addStorage calculation --- cron.js | 9 +++++---- libs/socketio.js | 17 ++++++++++++++++- libs/videos.js | 8 +++++--- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/cron.js b/cron.js index bc738df5..414136e0 100644 --- a/cron.js +++ b/cron.js @@ -92,8 +92,8 @@ const deleteVideo = (x) => { const deleteFileBinEntry = (x) => { postMessage({f:'s.deleteFileBinEntry',file:x}) } -const setDiskUsedForGroup = (groupKey,size,target) => { - postMessage({f:'s.setDiskUsedForGroup', ke: groupKey, size: size, target: target}) +const setDiskUsedForGroup = (groupKey,size,target,videoRow) => { + postMessage({f:'s.setDiskUsedForGroup', ke: groupKey, size: size, target: target, videoRow: videoRow}) } const getVideoDirectory = function(e){ if(e.mid&&!e.id){e.id=e.mid}; @@ -185,6 +185,7 @@ const checkFilterRules = function(v){ }) } const deleteVideosByDays = async (v,days,addedQueries) => { + const groupKey = v.ke; const whereQuery = [ ['ke','=',v.ke], ['time','<', sqlDate(days+' DAY')], @@ -207,7 +208,8 @@ const deleteVideosByDays = async (v,days,addedQueries) => { const filename = formattedTime(row.time) + '.' + row.ext try{ await fs.promises.unlink(dir + filename) - clearSize += row.size / 1048576 + const fileSizeMB = row.size / 1048576; + setDiskUsedForGroup(groupKey,-fileSizeMB,null,row) sendToWebSocket({ f: 'video_delete', filename: filename + '.' + row.ext, @@ -227,7 +229,6 @@ const deleteVideosByDays = async (v,days,addedQueries) => { where: whereQuery }) affectedRows = deleteResponse.rows || 0 - setDiskUsedForGroup(v.ke,-clearSize) } return { ok: true, diff --git a/libs/socketio.js b/libs/socketio.js index 8075f12a..94e9fb88 100644 --- a/libs/socketio.js +++ b/libs/socketio.js @@ -987,7 +987,22 @@ module.exports = function(s,config,lang,io){ s.deleteFileBinEntry(d.file) break; 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; case'start':case'end': d.mid='_cron';s.userLog(d,{type:'cron',msg:d.msg}) diff --git a/libs/videos.js b/libs/videos.js index 6fd64e28..eb63c944 100644 --- a/libs/videos.js +++ b/libs/videos.js @@ -608,9 +608,11 @@ module.exports = function(s,config,lang){ } s.getVideoStorageIndex = function(video){ try{ - var details = s.parseJSON(video.details) || {} - var storageId = details.storageId - 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 monitorId = video.id || video.mid + const details = s.parseJSON(video.details) || {} + 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){ return s.group[video.ke].addStorageUse[storageId] }