From 0a509561bb0dd1ed7adfc41d90fdce78966ec8e0 Mon Sep 17 00:00:00 2001
From: Isaac Connor
Date: Tue, 13 Nov 2018 20:53:14 -0500
Subject: [PATCH 0001/1203] allow libavresample-dev
---
distros/ubuntu1604/control | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/distros/ubuntu1604/control b/distros/ubuntu1604/control
index 68bc1757f..475214f10 100644
--- a/distros/ubuntu1604/control
+++ b/distros/ubuntu1604/control
@@ -10,7 +10,7 @@ Build-Depends: debhelper (>= 9), dh-systemd, python-sphinx | python3-sphinx, apa
,libavcodec-dev (>= 6:10~)
,libavformat-dev (>= 6:10~)
,libavutil-dev (>= 6:10~)
- ,libswresample-dev
+ ,libswresample-dev | libavresample-dev
,libswscale-dev (>= 6:10~)
,ffmpeg | libav-tools
,net-tools
From 312dab2c2050101fc02be886bc750a3e1aeafc1b Mon Sep 17 00:00:00 2001
From: Javier Gonzalez
Date: Sat, 20 Apr 2019 17:14:43 +0200
Subject: [PATCH 0002/1203] Fixing video export view
---
web/skins/classic/views/video.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/web/skins/classic/views/video.php b/web/skins/classic/views/video.php
index aab9278d6..ca4c46f4b 100644
--- a/web/skins/classic/views/video.php
+++ b/web/skins/classic/views/video.php
@@ -46,7 +46,7 @@ if ( isset($_REQUEST['scale']) )
else
$scale = reScale(SCALE_BASE, $event['DefaultScale'], ZM_WEB_DEFAULT_SCALE);
-$Event = new Event($event['Id']);
+$Event = new ZM\Event($event['Id']);
$eventPath = $Event->Path();
$videoFormats = array();
From cfca67f6633b22395d96a51a9937d0409dc8e355 Mon Sep 17 00:00:00 2001
From: Isaac Connor
Date: Fri, 7 Jun 2019 14:07:23 -0400
Subject: [PATCH 0003/1203] spacing and quotes
---
web/ajax/stream.php | 53 +++++++++++++++++++++++----------------------
1 file changed, 27 insertions(+), 26 deletions(-)
diff --git a/web/ajax/stream.php b/web/ajax/stream.php
index f37012e54..910b18cb5 100644
--- a/web/ajax/stream.php
+++ b/web/ajax/stream.php
@@ -21,38 +21,38 @@ if ( sem_acquire($semaphore,1) !== false ) {
}
$localSocketFile = ZM_PATH_SOCKS.'/zms-'.sprintf('%06d',$_REQUEST['connkey']).'w.sock';
- if ( file_exists( $localSocketFile ) ) {
+ if ( file_exists($localSocketFile) ) {
ZM\Warning("sock file $localSocketFile already exists?! Is someone else talking to zms?");
// They could be. We can maybe have concurrent requests from a browser.
}
- if ( !socket_bind( $socket, $localSocketFile ) ) {
- ajaxError("socket_bind( $localSocketFile ) failed: ".socket_strerror(socket_last_error()) );
+ if ( !socket_bind($socket, $localSocketFile) ) {
+ ajaxError("socket_bind( $localSocketFile ) failed: ".socket_strerror(socket_last_error()));
}
switch ( $_REQUEST['command'] ) {
case CMD_VARPLAY :
- ZM\Logger::Debug( 'Varplaying to '.$_REQUEST['rate'] );
- $msg = pack( 'lcn', MSG_CMD, $_REQUEST['command'], $_REQUEST['rate']+32768 );
+ ZM\Logger::Debug('Varplaying to '.$_REQUEST['rate']);
+ $msg = pack('lcn', MSG_CMD, $_REQUEST['command'], $_REQUEST['rate']+32768);
break;
case CMD_ZOOMIN :
- ZM\Logger::Debug( 'Zooming to '.$_REQUEST['x'].','.$_REQUEST['y'] );
- $msg = pack( 'lcnn', MSG_CMD, $_REQUEST['command'], $_REQUEST['x'], $_REQUEST['y'] );
+ ZM\Logger::Debug('Zooming to '.$_REQUEST['x'].','.$_REQUEST['y']);
+ $msg = pack('lcnn', MSG_CMD, $_REQUEST['command'], $_REQUEST['x'], $_REQUEST['y']);
break;
case CMD_PAN :
- ZM\Logger::Debug( 'Panning to '.$_REQUEST['x'].','.$_REQUEST['y'] );
- $msg = pack( 'lcnn', MSG_CMD, $_REQUEST['command'], $_REQUEST['x'], $_REQUEST['y'] );
+ ZM\Logger::Debug('Panning to '.$_REQUEST['x'].','.$_REQUEST['y']);
+ $msg = pack('lcnn', MSG_CMD, $_REQUEST['command'], $_REQUEST['x'], $_REQUEST['y']);
break;
case CMD_SCALE :
- ZM\Logger::Debug( 'Scaling to '.$_REQUEST['scale'] );
- $msg = pack( 'lcn', MSG_CMD, $_REQUEST['command'], $_REQUEST['scale'] );
+ ZM\Logger::Debug('Scaling to '.$_REQUEST['scale']);
+ $msg = pack('lcn', MSG_CMD, $_REQUEST['command'], $_REQUEST['scale']);
break;
case CMD_SEEK :
- ZM\Logger::Debug( 'Seeking to '.$_REQUEST['offset'] );
- $msg = pack( 'lcN', MSG_CMD, $_REQUEST['command'], $_REQUEST['offset'] );
+ ZM\Logger::Debug('Seeking to '.$_REQUEST['offset']);
+ $msg = pack('lcN', MSG_CMD, $_REQUEST['command'], $_REQUEST['offset']);
break;
default :
ZM\Logger::Debug('Sending command ' . $_REQUEST['command']);
- $msg = pack( 'lc', MSG_CMD, $_REQUEST['command'] );
+ $msg = pack('lc', MSG_CMD, $_REQUEST['command']);
break;
}
@@ -60,7 +60,8 @@ if ( sem_acquire($semaphore,1) !== false ) {
// Pi can take up to 3 seconds for zms to start up.
$max_socket_tries = 1000;
// FIXME This should not exceed web_ajax_timeout
- while ( !file_exists($remSockFile) && $max_socket_tries-- ) { //sometimes we are too fast for our own good, if it hasn't been setup yet give it a second.
+ while ( !file_exists($remSockFile) && $max_socket_tries-- ) {
+ //sometimes we are too fast for our own good, if it hasn't been setup yet give it a second.
// WHY? We will just send another one...
// ANSWER: Because otherwise we get a log of errors logged
@@ -71,27 +72,27 @@ if ( sem_acquire($semaphore,1) !== false ) {
if ( !file_exists($remSockFile) ) {
ajaxError("Socket $remSockFile does not exist. This file is created by zms, and since it does not exist, either zms did not run, or zms exited early. Please check your zms logs and ensure that CGI is enabled in apache and check that the PATH_ZMS is set correctly. Make sure that ZM is actually recording. If you are trying to view a live stream and the capture process (zmc) is not running then zms will exit. Please go to http://zoneminder.readthedocs.io/en/latest/faq.html#why-can-t-i-see-streamed-images-when-i-can-see-stills-in-the-zone-window-etc for more information.");
} else {
- if ( !@socket_sendto( $socket, $msg, strlen($msg), 0, $remSockFile ) ) {
- ajaxError( "socket_sendto( $remSockFile ) failed: ".socket_strerror(socket_last_error()) );
+ if ( !@socket_sendto($socket, $msg, strlen($msg), 0, $remSockFile) ) {
+ ajaxError("socket_sendto( $remSockFile ) failed: ".socket_strerror(socket_last_error()));
}
}
- $rSockets = array( $socket );
+ $rSockets = array($socket);
$wSockets = NULL;
$eSockets = NULL;
$timeout = MSG_TIMEOUT - ( time() - $start_time );
- $numSockets = socket_select( $rSockets, $wSockets, $eSockets, intval($timeout/1000), ($timeout%1000)*1000 );
+ $numSockets = socket_select($rSockets, $wSockets, $eSockets, intval($timeout/1000), ($timeout%1000)*1000);
if ( $numSockets === false ) {
- ZM\Error('socket_select failed: ' . socket_strerror(socket_last_error()) );
- ajaxError( 'socket_select failed: '.socket_strerror(socket_last_error()) );
+ ZM\Error('socket_select failed: ' . socket_strerror(socket_last_error()));
+ ajaxError('socket_select failed: '.socket_strerror(socket_last_error()));
} else if ( $numSockets < 0 ) {
- ZM\Error( "Socket closed $remSockFile" );
- ajaxError( "Socket closed $remSockFile" );
+ ZM\Error("Socket closed $remSockFile");
+ ajaxError("Socket closed $remSockFile");
} else if ( $numSockets == 0 ) {
- ZM\Error( "Timed out waiting for msg $remSockFile" );
+ ZM\Error("Timed out waiting for msg $remSockFile");
socket_set_nonblock($socket);
#ajaxError("Timed out waiting for msg $remSockFile");
} else if ( $numSockets > 0 ) {
@@ -101,7 +102,7 @@ if ( sem_acquire($semaphore,1) !== false ) {
}
}
- switch( $nbytes = @socket_recvfrom( $socket, $msg, MSG_DATA_SIZE, 0, $remSockFile ) ) {
+ switch( $nbytes = @socket_recvfrom($socket, $msg, MSG_DATA_SIZE, 0, $remSockFile) ) {
case -1 :
ajaxError("socket_recvfrom( $remSockFile ) failed: ".socket_strerror(socket_last_error()));
break;
@@ -157,7 +158,7 @@ if ( sem_acquire($semaphore,1) !== false ) {
}
sem_release($semaphore);
} else {
- ZM\Logger::Debug("Couldn't get semaphore");
+ ZM\Logger::Debug('Couldn\'t get semaphore');
ajaxResponse(array());
}
From 4da5c52cd254dc56cdbcb1d0c7ad95bc9bd15252 Mon Sep 17 00:00:00 2001
From: tolland
Date: Wed, 19 Jun 2019 20:18:38 +0000
Subject: [PATCH 0004/1203] remove extra px in svg tag
---
web/skins/classic/views/montage.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/web/skins/classic/views/montage.php b/web/skins/classic/views/montage.php
index 6527a6e8f..aac008dbc 100644
--- a/web/skins/classic/views/montage.php
+++ b/web/skins/classic/views/montage.php
@@ -269,7 +269,7 @@ foreach ( $monitors as $monitor ) {
} // end foreach Zone
?>
-
-
+
+
+ AutoCopy() ) { ?> checked="checked" data-on-click-this="click_autocopy"/>
+ AutoCopyTo(), $filter->AutoCopy() ? null : array('style'=>'display:none;')); ?>
+
+
+
AutoMove() ) { ?> checked="checked" data-on-click-this="click_automove"/>
AutoMoveTo(), $filter->AutoMove() ? null : array('style'=>'display:none;')); ?>
From 0e040fc2fcbafd57682f319f577ceea47e2bfea3 Mon Sep 17 00:00:00 2001
From: Isaac Connor
Date: Tue, 23 Jul 2019 10:00:05 -0400
Subject: [PATCH 0031/1203] Add click_autocopy function
---
web/skins/classic/views/js/filter.js | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/web/skins/classic/views/js/filter.js b/web/skins/classic/views/js/filter.js
index 49a882ee6..36d1e09d5 100644
--- a/web/skins/classic/views/js/filter.js
+++ b/web/skins/classic/views/js/filter.js
@@ -72,6 +72,15 @@ function click_automove(element) {
}
}
+function click_autocopy(element) {
+ updateButtons(this);
+ if ( this.checked ) {
+ $j(this.form.elements['filter[AutoCopyTo]']).css('display', 'inline');
+ } else {
+ this.form.elements['filter[AutoCopyTo]'].hide();
+ }
+}
+
function checkValue( element ) {
var rows = $j(element).closest('tbody').children();
parseRows(rows);
From df0aef89affbc8a0cb6e31bf5395a3f03892f255 Mon Sep 17 00:00:00 2001
From: Isaac Connor
Date: Tue, 23 Jul 2019 10:03:28 -0400
Subject: [PATCH 0032/1203] gracefully handle when window[fnName] doesn't exist
---
web/skins/classic/js/skin.js | 22 +++++++++++++++++++++-
1 file changed, 21 insertions(+), 1 deletion(-)
diff --git a/web/skins/classic/js/skin.js b/web/skins/classic/js/skin.js
index d39062087..c29ef4a84 100644
--- a/web/skins/classic/js/skin.js
+++ b/web/skins/classic/js/skin.js
@@ -144,7 +144,7 @@ window.addEventListener("DOMContentLoaded", function onSkinDCL() {
el.addEventListener("click", function onClick(evt) {
var el = this;
var url;
- if (el.hasAttribute("href")) {
+ if ( el.hasAttribute("href") ) {
//
url = el.getAttribute("href");
} else {
@@ -167,12 +167,20 @@ window.addEventListener("DOMContentLoaded", function onSkinDCL() {
// 'data-on-click-this' calls the global function in the attribute value with the element when a click happens.
document.querySelectorAll("a[data-on-click-this], button[data-on-click-this], input[data-on-click-this]").forEach(function attachOnClick(el) {
var fnName = el.getAttribute("data-on-click-this");
+ if ( !window[fnName] ) {
+ console.error("Nothing found to bind to " + fnName);
+ return;
+ }
el.onclick = window[fnName].bind(el, el);
});
// 'data-on-click' calls the global function in the attribute value with no arguments when a click happens.
document.querySelectorAll("a[data-on-click], button[data-on-click], input[data-on-click]").forEach(function attachOnClick(el) {
var fnName = el.getAttribute("data-on-click");
+ if ( !window[fnName] ) {
+ console.error("Nothing found to bind to " + fnName);
+ return;
+ }
el.onclick = function() {
window[fnName]();
};
@@ -181,6 +189,10 @@ window.addEventListener("DOMContentLoaded", function onSkinDCL() {
// 'data-on-click-true' calls the global function in the attribute value with no arguments when a click happens.
document.querySelectorAll("a[data-on-click-true], button[data-on-click-true], input[data-on-click-true]").forEach(function attachOnClick(el) {
var fnName = el.getAttribute("data-on-click-true");
+ if ( !window[fnName] ) {
+ console.error("Nothing found to bind to " + fnName);
+ return;
+ }
el.onclick = function() {
window[fnName](true);
};
@@ -189,12 +201,20 @@ window.addEventListener("DOMContentLoaded", function onSkinDCL() {
// 'data-on-change-this' calls the global function in the attribute value with the element when a change happens.
document.querySelectorAll("select[data-on-change-this], input[data-on-change-this]").forEach(function attachOnChangeThis(el) {
var fnName = el.getAttribute("data-on-change-this");
+ if ( !window[fnName] ) {
+ console.error("Nothing found to bind to " + fnName);
+ return;
+ }
el.onchange = window[fnName].bind(el, el);
});
// 'data-on-change' adds an event listener for the global function in the attribute value when a change happens.
document.querySelectorAll("select[data-on-change], input[data-on-change]").forEach(function attachOnChange(el) {
var fnName = el.getAttribute("data-on-change");
+ if ( !window[fnName] ) {
+ console.error("Nothing found to bind to " + fnName);
+ return;
+ }
el.onchange = window[fnName];
});
});
From 88beb46c3e645491d93c157be5d6af10b37d16c8 Mon Sep 17 00:00:00 2001
From: Isaac Connor
Date: Tue, 23 Jul 2019 10:04:15 -0400
Subject: [PATCH 0033/1203] Add FilterCopyEvents
---
web/lang/en_gb.php | 1 +
1 file changed, 1 insertion(+)
diff --git a/web/lang/en_gb.php b/web/lang/en_gb.php
index 4001c456e..526486921 100644
--- a/web/lang/en_gb.php
+++ b/web/lang/en_gb.php
@@ -356,6 +356,7 @@ $SLANG = array(
'FilterArchiveEvents' => 'Archive all matches',
'FilterUpdateDiskSpace' => 'Update used disk space',
'FilterDeleteEvents' => 'Delete all matches',
+ 'FilterCopyEvents' => 'Copy all matches',
'FilterMoveEvents' => 'Move all matches',
'FilterEmailEvents' => 'Email details of all matches',
'FilterExecuteEvents' => 'Execute command on all matches',
From 49621bf6529173843261ac542e9306793f9f641d Mon Sep 17 00:00:00 2001
From: Isaac Connor
Date: Tue, 23 Jul 2019 12:58:03 -0400
Subject: [PATCH 0034/1203] Only parse Sql if there is a Query in the filter
---
scripts/ZoneMinder/lib/ZoneMinder/Filter.pm | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm b/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm
index 8383e43b7..fd6dd59dc 100644
--- a/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm
+++ b/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm
@@ -132,6 +132,10 @@ sub Sql {
my $self = shift;
$$self{Sql} = shift if @_;
if ( ! $$self{Sql} ) {
+ if ( !$self->{Query} ) {
+ Warning('No Query in filter.');
+ return;
+ }
my $filter_expr = ZoneMinder::General::jsonDecode($self->{Query});
my $sql = 'SELECT E.*,
unix_timestamp(E.StartTime) as Time,
From bb653b172c59d37e63844494a933e853e7cc94ca Mon Sep 17 00:00:00 2001
From: Isaac Connor
Date: Tue, 23 Jul 2019 14:34:26 -0400
Subject: [PATCH 0035/1203] Use hires time to give better bandwidth reporitng
---
scripts/ZoneMinder/lib/ZoneMinder/Event.pm | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Event.pm b/scripts/ZoneMinder/lib/ZoneMinder/Event.pm
index e1516f1f5..27c157359 100644
--- a/scripts/ZoneMinder/lib/ZoneMinder/Event.pm
+++ b/scripts/ZoneMinder/lib/ZoneMinder/Event.pm
@@ -41,6 +41,7 @@ require Number::Bytes::Human;
require Date::Parse;
require POSIX;
use Date::Format qw(time2str);
+use Time::HiRes qw(gettimeofday tv_interval);
#our @ISA = qw(ZoneMinder::Object);
use parent qw(ZoneMinder::Object);
@@ -595,7 +596,7 @@ Debug("Files to move @files");
for my $file (@files) {
next if $file =~ /^\./;
( $file ) = ( $file =~ /^(.*)$/ ); # De-taint
- my $starttime = time;
+ my $starttime = [gettimeofday];
Debug("Moving file $file to $NewPath");
my $size = -s $file;
if ( ! $size ) {
@@ -607,10 +608,10 @@ Debug("Files to move @files");
}
my $filename = $event_path.'/'.File::Basename::basename($file);
- if ( ! $bucket->add_key( $filename, $file_contents ) ) {
+ if ( ! $bucket->add_key($filename, $file_contents) ) {
die "Unable to add key for $filename";
}
- my $duration = time - $starttime;
+ my $duration = tv_interval($starttime);
Debug('PUT to S3 ' . Number::Bytes::Human::format_bytes($size) . " in $duration seconds = " . Number::Bytes::Human::format_bytes($duration?$size/$duration:$size) . '/sec');
} # end foreach file.
@@ -621,13 +622,13 @@ Debug("Files to move @files");
} # end if s3
my $error = '';
- if ( ! $moved ) {
- File::Path::make_path( $NewPath, {error => \my $err} );
+ if ( !$moved ) {
+ File::Path::make_path($NewPath, {error => \my $err});
if ( @$err ) {
for my $diag (@$err) {
my ($file, $message) = %$diag;
next if $message eq 'File exists';
- if ($file eq '') {
+ if ( $file eq '' ) {
$error .= "general error: $message\n";
} else {
$error .= "problem making $file: $message\n";
@@ -641,20 +642,20 @@ Debug("Files to move @files");
my @files = glob("$OldPath/*");
if ( ! @files ) {
$ZoneMinder::Database::dbh->commit();
- return "No files to move.";
+ return 'No files to move.';
}
for my $file (@files) {
next if $file =~ /^\./;
( $file ) = ( $file =~ /^(.*)$/ ); # De-taint
- my $starttime = time;
+ my $starttime = [gettimeofday];
Debug("Moving file $file to $NewPath");
my $size = -s $file;
if ( ! File::Copy::copy( $file, $NewPath ) ) {
$error .= "Copy failed: for $file to $NewPath: $!";
last;
}
- my $duration = time - $starttime;
+ my $duration = tv_interval($starttime);
Debug('Copied ' . Number::Bytes::Human::format_bytes($size) . " in $duration seconds = " . ($duration?Number::Bytes::Human::format_bytes($size/$duration):'inf') . '/sec');
} # end foreach file.
} # end if ! moved
From 98922b6788dfdc1f1d58a608fa75c66ecfd0e2f2 Mon Sep 17 00:00:00 2001
From: Isaac Connor
Date: Wed, 24 Jul 2019 09:37:16 -0400
Subject: [PATCH 0036/1203] Add SecondaryStorageId to Event so that we can
update it
---
scripts/ZoneMinder/lib/ZoneMinder/Event.pm | 29 ++++++++++++----------
1 file changed, 16 insertions(+), 13 deletions(-)
diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Event.pm b/scripts/ZoneMinder/lib/ZoneMinder/Event.pm
index 27c157359..fd1c8297d 100644
--- a/scripts/ZoneMinder/lib/ZoneMinder/Event.pm
+++ b/scripts/ZoneMinder/lib/ZoneMinder/Event.pm
@@ -64,6 +64,7 @@ $serial = $primary_key = 'Id';
Id
MonitorId
StorageId
+ SecondaryStorageId
Name
Cause
StartTime
@@ -117,7 +118,7 @@ sub Time {
}
sub getPath {
- return Path( @_ );
+ return Path(@_);
}
sub Path {
@@ -132,7 +133,7 @@ sub Path {
if ( ! $$event{Path} ) {
my $Storage = $event->Storage();
- $$event{Path} = join('/', $Storage->Path(), $event->RelativePath() );
+ $$event{Path} = join('/', $Storage->Path(), $event->RelativePath());
}
return $$event{Path};
}
@@ -164,7 +165,8 @@ sub RelativePath {
if ( $event->Time() ) {
$$event{RelativePath} = join('/',
$event->{MonitorId},
- POSIX::strftime( '%y/%m/%d/%H/%M/%S',
+ POSIX::strftime(
+ '%y/%m/%d/%H/%M/%S',
localtime($event->Time())
),
);
@@ -204,7 +206,8 @@ sub LinkPath {
if ( $event->Time() ) {
$$event{LinkPath} = join('/',
$event->{MonitorId},
- POSIX::strftime( '%y/%m/%d',
+ POSIX::strftime(
+ '%y/%m/%d',
localtime($event->Time())
),
'.'.$$event{Id}
@@ -256,8 +259,8 @@ sub createIdFile {
sub GenerateVideo {
my ( $self, $rate, $fps, $scale, $size, $overwrite, $format ) = @_;
- my $event_path = $self->Path( );
- chdir( $event_path );
+ my $event_path = $self->Path();
+ chdir($event_path);
( my $video_name = $self->{Name} ) =~ s/\s/_/g;
my @file_parts;
@@ -283,10 +286,10 @@ sub GenerateVideo {
$file_scale =~ s/_00//;
$file_scale =~ s/(_\d+)0+$/$1/;
$file_scale = 's'.$file_scale;
- push( @file_parts, $file_scale );
+ push @file_parts, $file_scale;
} elsif ( $size ) {
my $file_size = 'S'.$size;
- push( @file_parts, $file_size );
+ push @file_parts, $file_size;
}
my $video_file = join('-', $video_name, $file_parts[0], $file_parts[1] ).'.'.$format;
if ( $overwrite || !-s $video_file ) {
@@ -537,9 +540,9 @@ sub CopyTo {
# We do this before bothering to lock the event
my ( $NewPath ) = ( $NewStorage->Path() =~ /^(.*)$/ ); # De-taint
if ( ! $$NewStorage{Id} ) {
- return "New storage does not have an id. Moving will not happen.";
+ return 'New storage does not have an id. Moving will not happen.';
} elsif ( $$NewStorage{Id} == $$self{StorageId} ) {
- return "Event is already located at " . $NewPath;
+ return 'Event is already located at ' . $NewPath;
} elsif ( !$NewPath ) {
return "New path ($NewPath) is empty.";
} elsif ( ! -e $NewPath ) {
@@ -551,7 +554,7 @@ sub CopyTo {
# data is reloaded, so need to check that the move hasn't already happened.
if ( $$self{StorageId} == $$NewStorage{Id} ) {
$ZoneMinder::Database::dbh->commit();
- return "Event has already been moved by someone else.";
+ return 'Event has already been moved by someone else.';
}
if ( $$OldStorage{Id} != $$self{StorageId} ) {
@@ -586,13 +589,13 @@ sub CopyTo {
}
my $event_path = 'events/'.$self->RelativePath();
-Info("Making dir ectory $event_path/");
+ Debug("Making directory $event_path/");
if ( ! $bucket->add_key( $event_path.'/','' ) ) {
die "Unable to add key for $event_path/";
}
my @files = glob("$OldPath/*");
-Debug("Files to move @files");
+ Debug("Files to move @files");
for my $file (@files) {
next if $file =~ /^\./;
( $file ) = ( $file =~ /^(.*)$/ ); # De-taint
From 99f78c50af9a981276e29a6fab92c4b0a48f3dfb Mon Sep 17 00:00:00 2001
From: Isaac Connor
Date: Wed, 24 Jul 2019 09:37:38 -0400
Subject: [PATCH 0037/1203] Add Updating SecondaryStorageId when using CopyTo
---
scripts/zmfilter.pl.in | 20 +++++++++++++++-----
1 file changed, 15 insertions(+), 5 deletions(-)
diff --git a/scripts/zmfilter.pl.in b/scripts/zmfilter.pl.in
index 0b8812c87..b3da3bb68 100644
--- a/scripts/zmfilter.pl.in
+++ b/scripts/zmfilter.pl.in
@@ -346,10 +346,20 @@ sub checkFilter {
Error($_) if $_;
}
if ( $filter->{AutoCopy} ) {
- my $NewStorage = new ZoneMinder::Storage($filter->{AutoCopyTo});
- $_ = $Event->CopyTo($NewStorage);
- Error($_) if $_;
- }
+ # Copy To is different from MoveTo in that it JUST copies the files
+ # So we still need to update the Event object with the new SecondaryStorageId
+ my $NewStorage = ZoneMinder::Storage->find_one($filter->{AutoCopyTo});
+ if ( $NewStorage ) {
+ $_ = $Event->CopyTo($NewStorage);
+ if ( $_ ) {
+ Error($_);
+ } else {
+ $Event->save({SecondaryStorageId=>$$NewStorage{Id}});
+ }
+ } else {
+ Error("No storage area found for copy to operation. AutoCopyTo was $$filter{AutoCopyTo}");
+ }
+ } # end if AutoCopy
if ( $filter->{UpdateDiskSpace} ) {
$ZoneMinder::Database::dbh->begin_work();
@@ -368,7 +378,7 @@ sub checkFilter {
$ZoneMinder::Database::dbh->commit();
} # end if UpdateDiskSpace
} # end foreach event
-}
+} # end sub checkFilter
sub generateVideo {
my $filter = shift;
From 2d556e6402b9430ff156abd8e441f0b03add487e Mon Sep 17 00:00:00 2001
From: Isaac Connor
Date: Wed, 24 Jul 2019 10:52:32 -0400
Subject: [PATCH 0038/1203] Add SecondaryStorageId to Events
---
db/zm_create.sql.in | 1 +
1 file changed, 1 insertion(+)
diff --git a/db/zm_create.sql.in b/db/zm_create.sql.in
index d1952f66a..113d434ff 100644
--- a/db/zm_create.sql.in
+++ b/db/zm_create.sql.in
@@ -186,6 +186,7 @@ CREATE TABLE `Events` (
`Id` bigint unsigned NOT NULL auto_increment,
`MonitorId` int(10) unsigned NOT NULL default '0',
`StorageId` smallint(5) unsigned default 0,
+ `SecondaryStorageId` smallint(5) unsigned default 0,
`Name` varchar(64) NOT NULL default '',
`Cause` varchar(32) NOT NULL default '',
`StartTime` datetime default NULL,
From 57133691e91c8898bd3700c3a68908fdc02f1349 Mon Sep 17 00:00:00 2001
From: Isaac Connor
Date: Wed, 24 Jul 2019 10:53:23 -0400
Subject: [PATCH 0039/1203] Add update script for SecondaryStorageArea
capability in Events and Filters
---
db/zm_update-1.33.14.sql | 51 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 51 insertions(+)
create mode 100644 db/zm_update-1.33.14.sql
diff --git a/db/zm_update-1.33.14.sql b/db/zm_update-1.33.14.sql
new file mode 100644
index 000000000..83d0cfbba
--- /dev/null
+++ b/db/zm_update-1.33.14.sql
@@ -0,0 +1,51 @@
+--
+-- Add CopyTo action to Filters
+--
+
+SET @s = (SELECT IF(
+ (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE()
+ AND table_name = 'Filters'
+ AND column_name = 'AutoCopy'
+ ) > 0,
+"SELECT 'Column AutoCopy already exists in Filters'",
+"ALTER TABLE Filters ADD `AutoCopy` tinyint(3) unsigned NOT NULL default '0' AFTER `AutoMove`"
+));
+
+PREPARE stmt FROM @s;
+EXECUTE stmt;
+
+SET @s = (SELECT IF(
+ (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE()
+ AND table_name = 'Filters'
+ AND column_name = 'AutoCopyTo'
+ ) > 0,
+"SELECT 'Column AutoCopyTo already exists in Filters'",
+"ALTER TABLE Filters ADD `AutoCopyTo` smallint(5) unsigned NOT NULL default '0' AFTER `AutoCopy`"
+));
+
+PREPARE stmt FROM @s;
+EXECUTE stmt;
+
+SET @s = (SELECT IF(
+ (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE()
+ AND table_name = 'Filters'
+ AND column_name = 'Query_json'
+ ) > 0,
+"SELECT 'Column Query_json already exists in Filters'",
+"ALTER TABLE `Filters` Change `Query` `Query_json` text NOT NULL"
+));
+
+PREPARE stmt FROM @s;
+EXECUTE stmt;
+
+SET @s = (SELECT IF(
+ (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE()
+ AND table_name = 'Events'
+ AND column_name = 'SecondaryStorageId'
+ ) > 0,
+"SELECT 'Column SecondaryStorageId already exists in Events'",
+"ALTER TABLE `Events` ADD `SecondaryStorageId` smallint(5) unsigned default 0 AFTER `StorageId`"
+));
+
+PREPARE stmt FROM @s;
+EXECUTE stmt;
From afa02e436d6bddffa202fada5f74162d5dda4730 Mon Sep 17 00:00:00 2001
From: Isaac Connor
Date: Wed, 24 Jul 2019 10:53:56 -0400
Subject: [PATCH 0040/1203] Upgrade Storage perl object to use parent
Object::find
---
scripts/ZoneMinder/lib/ZoneMinder/Storage.pm | 47 +-------------------
1 file changed, 2 insertions(+), 45 deletions(-)
diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Storage.pm b/scripts/ZoneMinder/lib/ZoneMinder/Storage.pm
index 1f7c1b9fe..17d196f92 100644
--- a/scripts/ZoneMinder/lib/ZoneMinder/Storage.pm
+++ b/scripts/ZoneMinder/lib/ZoneMinder/Storage.pm
@@ -46,56 +46,13 @@ use ZoneMinder::Database qw(:all);
use POSIX;
-use vars qw/ $table $primary_key /;
+use vars qw/ $table $primary_key %fields/;
$table = 'Storage';
$primary_key = 'Id';
#__PACKAGE__->table('Storage');
#__PACKAGE__->primary_key('Id');
+%fields = map { $_ => $_ } qw( Id Name Path DoDelete ServerId Type Url DiskSpace Scheme );
-sub find {
- shift if $_[0] eq 'ZoneMinder::Storage';
- my %sql_filters = @_;
-
- my $sql = 'SELECT * FROM Storage';
- my @sql_filters;
- my @sql_values;
-
- if ( exists $sql_filters{Id} ) {
- push @sql_filters , ' Id=? ';
- push @sql_values, $sql_filters{Id};
- }
- if ( exists $sql_filters{Name} ) {
- push @sql_filters , ' Name = ? ';
- push @sql_values, $sql_filters{Name};
- }
- if ( exists $sql_filters{ServerId} ) {
- push @sql_filters, ' ServerId = ?';
- push @sql_values, $sql_filters{ServerId};
- }
-
-
- $sql .= ' WHERE ' . join(' AND ', @sql_filters) if @sql_filters;
- $sql .= ' LIMIT ' . $sql_filters{limit} if $sql_filters{limit};
-
- my $sth = $ZoneMinder::Database::dbh->prepare_cached( $sql )
- or Fatal( "Can't prepare '$sql': ".$ZoneMinder::Database::dbh->errstr() );
- my $res = $sth->execute( @sql_values )
- or Fatal( "Can't execute '$sql': ".$sth->errstr() );
-
- my @results;
-
- while( my $db_filter = $sth->fetchrow_hashref() ) {
- my $filter = new ZoneMinder::Storage( $$db_filter{Id}, $db_filter );
- push @results, $filter;
- } # end while
- Debug("SQL: $sql returned " . @results . ' results');
- return @results;
-}
-
-sub find_one {
- my @results = find(@_);
- return $results[0] if @results;
-}
sub Path {
if ( @_ > 1 ) {
From 58851d23d2b4780f2da15f7e5f26cb033edeef30 Mon Sep 17 00:00:00 2001
From: Isaac Connor
Date: Wed, 24 Jul 2019 11:22:55 -0400
Subject: [PATCH 0041/1203] Add Secondary Storage support to the Event object
---
web/includes/Event.php | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/web/includes/Event.php b/web/includes/Event.php
index 1b996a839..dc7dd3575 100644
--- a/web/includes/Event.php
+++ b/web/includes/Event.php
@@ -12,6 +12,7 @@ class Event {
'Name',
'MonitorId',
'StorageId',
+'SecondaryStorageId',
'Name',
'Cause',
'StartTime',
@@ -85,6 +86,19 @@ class Event {
return $this->{'Storage'};
}
+ public function SecondaryStorage( $new = null ) {
+ if ( $new ) {
+ $this->{'SecondaryStorage'} = $new;
+ }
+ if ( ! ( array_key_exists('SecondaryStorage', $this) and $this->{'SecondaryStorage'} ) ) {
+ if ( isset($this->{'SecondaryStorageId'}) and $this->{'SecondaryStorageId'} )
+ $this->{'SecondaryStorage'} = Storage::find_one(array('Id'=>$this->{'SecondaryStorageId'}));
+ if ( ! ( array_key_exists('SecondaryStorage', $this) and $this->{'SecondaryStorage'} ) )
+ $this->{'SecondaryStorage'} = new Storage(NULL);
+ }
+ return $this->{'SecondaryStorage'};
+ }
+
public function Monitor() {
if ( isset($this->{'MonitorId'}) ) {
$Monitor = Monitor::find_one(array('Id'=>$this->{'MonitorId'}));
From aff081ad41c127133737fb4d7feb7add9fb39539 Mon Sep 17 00:00:00 2001
From: Isaac Connor
Date: Wed, 24 Jul 2019 11:23:13 -0400
Subject: [PATCH 0042/1203] Must commit after COpyTo to release locks
---
scripts/zmfilter.pl.in | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/scripts/zmfilter.pl.in b/scripts/zmfilter.pl.in
index b3da3bb68..5cba8f1d4 100644
--- a/scripts/zmfilter.pl.in
+++ b/scripts/zmfilter.pl.in
@@ -348,13 +348,15 @@ sub checkFilter {
if ( $filter->{AutoCopy} ) {
# Copy To is different from MoveTo in that it JUST copies the files
# So we still need to update the Event object with the new SecondaryStorageId
- my $NewStorage = ZoneMinder::Storage->find_one($filter->{AutoCopyTo});
+ my $NewStorage = ZoneMinder::Storage->find_one(Id=>$filter->{AutoCopyTo});
if ( $NewStorage ) {
$_ = $Event->CopyTo($NewStorage);
if ( $_ ) {
+ $ZoneMinder::Database::dbh->commit();
Error($_);
} else {
$Event->save({SecondaryStorageId=>$$NewStorage{Id}});
+ $ZoneMinder::Database::dbh->commit();
}
} else {
Error("No storage area found for copy to operation. AutoCopyTo was $$filter{AutoCopyTo}");
From 341f4adbdfaedd093869a009754f46a0a2c6f58d Mon Sep 17 00:00:00 2001
From: Isaac Connor
Date: Wed, 24 Jul 2019 11:23:38 -0400
Subject: [PATCH 0043/1203] Functions that change the Query must reset
Query_json as well
---
web/includes/Filter.php | 46 ++++++++++++++++++++++++++---------------
1 file changed, 29 insertions(+), 17 deletions(-)
diff --git a/web/includes/Filter.php b/web/includes/Filter.php
index f8b06d4e5..d59ecda7c 100644
--- a/web/includes/Filter.php
+++ b/web/includes/Filter.php
@@ -23,29 +23,33 @@ class Filter extends ZM_Object {
'UpdateDiskSpace' => 0,
'Background' => 0,
'Concurrent' => 0,
- #'limit' => 100,
'Query_json' => '',
- #'sort_field' => ZM_WEB_EVENT_SORT_FIELD,
- #'sort_asc' => ZM_WEB_EVENT_SORT_ORDER,
);
- public function Query($new = -1) {
- if ( $new and ( $new != -1 ) ) {
- $this->{'Query'} = $new;
- $this->{'Query_json'} = jsonEncode($new);
- Logger::Debug("Setting Query to " . $this->{'Query_json'});
+ public function Query_json() {
+ if ( func_num_args( ) ) {
+ $this->{'Query_json'} = func_get_arg(0);;
+ $this->{'Query'} = jsonDecode($this->{'Query_json'});
+ }
+ return $this->{'Query_json'};
+ }
+
+ public function Query() {
+ if ( func_num_args( ) ) {
+ $this->{'Query'} = func_get_arg(0);;
+ $this->{'Query_json'} = jsonEncode($this->{'Query'});
}
if ( !array_key_exists('Query', $this) ) {
if ( array_key_exists('Query_json', $this) and $this->{'Query_json'} ) {
$this->{'Query'} = jsonDecode($this->{'Query_json'});
- Logger::Debug("Decoded Query already" . print_r($this->{'Query'}, true ));
-
} else {
- Logger::Debug("No Have Query_json already");
$this->{'Query'} = array();
}
} else {
- Logger::Debug("Have Query already" . print_r($this->{'Query'}, true ));
+ if ( !is_array($this->{'Query'}) ) {
+ # Handle existence of both Query_json and Query in the row
+ $this->{'Query'} = jsonDecode($this->{'Query_json'});
+ }
}
return $this->{'Query'};
}
@@ -59,8 +63,10 @@ class Filter extends ZM_Object {
}
public function terms( ) {
- if ( func_num_args( ) ) {
- $this->Query()['terms'] = func_get_arg(0);
+ if ( func_num_args() ) {
+ $Query = $this->Query();
+ $Query['terms'] = func_get_arg(0);
+ $this->Query($Query);
}
if ( isset( $this->Query()['terms'] ) ) {
return $this->Query()['terms'];
@@ -71,7 +77,9 @@ class Filter extends ZM_Object {
// The following three fields are actually stored in the Query
public function sort_field( ) {
if ( func_num_args( ) ) {
- $this->Query()['sort_field'] = func_get_arg(0);
+ $Query = $this->Query();
+ $Query['sort_field'] = func_get_arg(0);
+ $this->Query($Query);
}
if ( isset( $this->Query()['sort_field'] ) ) {
return $this->{'Query'}['sort_field'];
@@ -82,7 +90,9 @@ class Filter extends ZM_Object {
public function sort_asc( ) {
if ( func_num_args( ) ) {
- $this->Query()['sort_asc'] = func_get_arg(0);
+ $Query = $this->Query();
+ $Query['sort_asc'] = func_get_arg(0);
+ $this->Query($Query);
}
if ( isset( $this->Query()['sort_asc'] ) ) {
return $this->{'Query'}['sort_asc'];
@@ -93,7 +103,9 @@ class Filter extends ZM_Object {
public function limit( ) {
if ( func_num_args( ) ) {
- $this->{'Query'}['limit'] = func_get_arg(0);
+ $Query = $this->Query();
+ $Query['limit'] = func_get_arg(0);
+ $this->Query($Query);
}
if ( isset( $this->Query()['limit'] ) )
return $this->{'Query'}['limit'];
From e3a9d5d48875c6cf8e24f73dc9f0d880a49e0a08 Mon Sep 17 00:00:00 2001
From: Isaac Connor
Date: Wed, 24 Jul 2019 11:24:14 -0400
Subject: [PATCH 0044/1203] Rewrite changes to run through the keys of the
passed in new values array, and handle object methods as well as basic values
---
web/includes/Object.php | 46 +++++++++++++++++++++++++++++++----------
1 file changed, 35 insertions(+), 11 deletions(-)
diff --git a/web/includes/Object.php b/web/includes/Object.php
index 041b45bed..2b58928d9 100644
--- a/web/includes/Object.php
+++ b/web/includes/Object.php
@@ -171,19 +171,43 @@ class ZM_Object {
public function changes( $new_values ) {
$changes = array();
- foreach ( $this->defaults as $field=>$default_value ) {
- if ( array_key_exists($field, $new_values) ) {
- Logger::Debug("Checking default $field => $default_value exists in new values :".$this->{$field} . " " .$new_values[$field]);
- if ( (!array_key_exists($field, $this)) or ( $this->{$field} != $new_values[$field] ) ) {
- Logger::Debug("Checking default $field => $default_value changes becaause" . $new_values[$field].' != '.$new_values[$field]);
- $changes[$field] = $new_values[$field];
- #} else if {
- Logger::Debug("Checking default $field => $default_value changes becaause " . $new_values[$field].' != '.$new_values[$field]);
- #array_push( $changes, [$field=>$defaults[$field]] );
+ foreach ( $new_values as $field => $value ) {
+
+ if ( method_exists($this, $field) ) {
+ $old_value = $this->$field();
+ Logger::Debug("Checking method $field () ".print_r($old_value,true)." => " . print_r($value,true));
+ if ( is_array($old_value) ) {
+ $diff = array_recursive_diff($old_value, $value);
+ Logger::Debug("Checking method $field () diff is".print_r($diff,true));
+ if ( count($diff) ) {
+ $changes[$field] = $value;
+ }
+ } else if ( $this->$field() != $value ) {
+ $changes[$field] = $value;
+ }
+ } else if ( array_key_exists($field, $this) ) {
+ Logger::Debug("Checking field $field => ".$this->{$field} . " ?= " .$value);
+ if ( $this->{$field} != $value ) {
+ $changes[$field] = $value;
+ }
+ } else if ( array_key_exists($field, $this->defaults) ) {
+
+ Logger::Debug("Checking default $field => ".$this->defaults[$field] . " " .$value);
+ if ( $this->defaults[$field] != $value ) {
+ $changes[$field] = $value;
}
- } else {
- Logger::Debug("Checking default $field => $default_value not in new_values");
}
+
+ #if ( (!array_key_exists($field, $this)) or ( $this->{$field} != $new_values[$field] ) ) {
+ #Logger::Debug("Checking default $field => $default_value changes becaause" . $new_values[$field].' != '.$new_values[$field]);
+ #$changes[$field] = $new_values[$field];
+ ##} else if {
+ #Logger::Debug("Checking default $field => $default_value changes becaause " . $new_values[$field].' != '.$new_values[$field]);
+ ##array_push( $changes, [$field=>$defaults[$field]] );
+ #}
+ #} else {
+ #Logger::Debug("Checking default $field => $default_value not in new_values");
+ #}
} # end foreach default
return $changes;
} # end public function changes
From 45afc2a534878b86ae10928fc4241c1f9acad36c Mon Sep 17 00:00:00 2001
From: Isaac Connor
Date: Wed, 24 Jul 2019 11:24:37 -0400
Subject: [PATCH 0045/1203] introduce array_recursive_diff which we use to
compare two arrays in Object::changes
---
web/includes/functions.php | 41 ++++++++++++++++++++++++++++++++++++++
1 file changed, 41 insertions(+)
diff --git a/web/includes/functions.php b/web/includes/functions.php
index 867861ffe..9e0655933 100644
--- a/web/includes/functions.php
+++ b/web/includes/functions.php
@@ -2518,4 +2518,45 @@ function format_duration($time, $separator=':') {
return sprintf('%02d%s%02d%s%02d', floor($time/3600), $separator, ($time/60)%60, $separator, $time%60);
}
+function array_recursive_diff($aArray1, $aArray2) {
+ $aReturn = array();
+
+ foreach ($aArray1 as $mKey => $mValue) {
+ if ( array_key_exists($mKey, $aArray2) ) {
+ if ( is_array($mValue) ) {
+ $aRecursiveDiff = array_recursive_diff($mValue, $aArray2[$mKey]);
+ if ( count($aRecursiveDiff) ) {
+ $aReturn[$mKey] = $aRecursiveDiff;
+ }
+ } else {
+ if ( $mValue != $aArray2[$mKey] ) {
+ $aReturn[$mKey] = $mValue;
+ }
+ }
+ } else {
+ $aReturn[$mKey] = $mValue;
+ }
+ }
+ # Now check for keys in array2 that are not in array1
+ foreach ($aArray2 as $mKey => $mValue) {
+ if ( array_key_exists($mKey, $aArray1) ) {
+ # Already checked it... I think.
+ #if ( is_array($mValue) ) {
+ #$aRecursiveDiff = array_recursive_diff($mValue, $aArray2[$mKey]);
+ #if ( count($aRecursiveDiff) ) {
+ #$aReturn[$mKey] = $aRecursiveDiff;
+ #}
+ #} else {
+ #if ( $mValue != $aArray2[$mKey] ) {
+ #$aReturn[$mKey] = $mValue;
+ #}
+ #}
+ } else {
+ $aReturn[$mKey] = $mValue;
+ }
+ }
+
+ return $aReturn;
+}
+
?>
From 1254e8ab67d0c90ee0b6b98b3496e5ad70036c78 Mon Sep 17 00:00:00 2001
From: Isaac Connor
Date: Wed, 24 Jul 2019 11:24:50 -0400
Subject: [PATCH 0046/1203] Add AttrSecondaryStorageArea to lang
---
web/lang/en_gb.php | 1 +
1 file changed, 1 insertion(+)
diff --git a/web/lang/en_gb.php b/web/lang/en_gb.php
index 526486921..0e575fd1f 100644
--- a/web/lang/en_gb.php
+++ b/web/lang/en_gb.php
@@ -132,6 +132,7 @@ $SLANG = array(
'AttrMaxScore' => 'Max. Score',
'AttrMonitorId' => 'Monitor Id',
'AttrMonitorName' => 'Monitor Name',
+ 'AttrSecondaryStorageArea' => 'Secondary Storage Area',
'AttrStorageArea' => 'Storage Area',
'AttrFilterServer' => 'Server Filter is Running On',
'AttrMonitorServer' => 'Server Monitor is Running On',
From 1a0beab70336397109379197de3b253c01d2642c Mon Sep 17 00:00:00 2001
From: Isaac Connor
Date: Wed, 24 Jul 2019 11:25:38 -0400
Subject: [PATCH 0047/1203] add Secondary Storage Area options. Storage array
is now an array of Objects so use the Name key
---
web/skins/classic/views/js/filter.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/web/skins/classic/views/js/filter.js b/web/skins/classic/views/js/filter.js
index 36d1e09d5..99e8a9c03 100644
--- a/web/skins/classic/views/js/filter.js
+++ b/web/skins/classic/views/js/filter.js
@@ -209,10 +209,10 @@ function parseRows(rows) {
}
var serverVal = inputTds.eq(4).children().val();
inputTds.eq(4).html(serverSelect).children().val(serverVal).chosen({width: "101%"});
- } else if ( attr == 'StorageId' ) { //Choose by storagearea
+ } else if ( (attr == 'StorageId') || (attr == 'SecondaryStorageId') ) { //Choose by storagearea
var storageSelect = $j('').attr('name', queryPrefix + rowNum + '][val]').attr('id', queryPrefix + rowNum + '][val]');
for ( key in storageareas ) {
- storageSelect.append('');
+ storageSelect.append('');
}
var storageVal = inputTds.eq(4).children().val();
inputTds.eq(4).html(storageSelect).children().val(storageVal).chosen({width: "101%"});
From 2d46f2adaba3747401d96cd8549916a739e8d696 Mon Sep 17 00:00:00 2001
From: Isaac Connor
Date: Wed, 24 Jul 2019 11:25:51 -0400
Subject: [PATCH 0048/1203] add Secondary Storage Area options.
---
web/skins/classic/views/filter.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/web/skins/classic/views/filter.php b/web/skins/classic/views/filter.php
index 893d1ecbd..2f159230e 100644
--- a/web/skins/classic/views/filter.php
+++ b/web/skins/classic/views/filter.php
@@ -270,7 +270,7 @@ for ( $i=0; $i < count($terms); $i++ ) {
|
|
|
|
From 39262d55f5914004a2ae41a273bb7631d96294ec Mon Sep 17 00:00:00 2001
From: Isaac Connor
Date: Wed, 24 Jul 2019 11:26:07 -0400
Subject: [PATCH 0049/1203] Also show secondary storage area when viewing event
---
web/skins/classic/views/event.php | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/web/skins/classic/views/event.php b/web/skins/classic/views/event.php
index b09f88acc..f0a6e343c 100644
--- a/web/skins/classic/views/event.php
+++ b/web/skins/classic/views/event.php
@@ -134,7 +134,11 @@ if ( ! $Event->Id() ) {
Length().'s' ?>
Frames() ?>/AlarmFrames() ?>
TotScore() ?>/AvgScore() ?>/MaxScore() ?>
- DiskSpace(null)) . ' on ' . $Event->Storage()->Name() ?>
+
+DiskSpace(null)) . ' on ' . $Event->Storage()->Name().
+ ( $Event->SecondaryStorageId() ? ', ' . $Event->SecondaryStorage()->Name() :'' )
+?>