diff -Nru zoneminder-1.36.11+dfsg1/debian/changelog zoneminder-1.36.12+dfsg1/debian/changelog --- zoneminder-1.36.11+dfsg1/debian/changelog 2021-11-19 00:53:07.000000000 +0000 +++ zoneminder-1.36.12+dfsg1/debian/changelog 2021-12-16 11:50:24.000000000 +0000 @@ -1,3 +1,11 @@ +zoneminder (1.36.12+dfsg1-1) unstable; urgency=medium + + * New upstream release. + * README: added example of ZM_DB_HOST value for local DB connection. + Thanks, Petter Reinholdtsen. + + -- Dmitry Smirnov Thu, 16 Dec 2021 22:50:24 +1100 + zoneminder (1.36.11+dfsg1-1) unstable; urgency=medium * New upstream release. diff -Nru zoneminder-1.36.11+dfsg1/debian/README.Debian zoneminder-1.36.12+dfsg1/debian/README.Debian --- zoneminder-1.36.11+dfsg1/debian/README.Debian 2021-09-02 05:31:54.000000000 +0000 +++ zoneminder-1.36.12+dfsg1/debian/README.Debian 2021-12-02 06:53:31.000000000 +0000 @@ -26,6 +26,11 @@ chgrp -c www-data /etc/zm/zm.conf +To configure ZoneMinder to use the local database connection, use the +following in the "/etc/zm/zm.conf": + + ZM_DB_HOST=localhost:/run/mysqld/mysqld.sock + Upgrading database ------------------ diff -Nru zoneminder-1.36.11+dfsg1/distros/fedora/zoneminder.spec zoneminder-1.36.12+dfsg1/distros/fedora/zoneminder.spec --- zoneminder-1.36.11+dfsg1/distros/fedora/zoneminder.spec 2021-11-17 16:05:50.000000000 +0000 +++ zoneminder-1.36.12+dfsg1/distros/fedora/zoneminder.spec 2021-12-10 22:36:30.000000000 +0000 @@ -36,7 +36,7 @@ %global _hardened_build 1 Name: zoneminder -Version: 1.36.11 +Version: 1.36.12 Release: 1%{?dist} Summary: A camera monitoring and analysis tool Group: System Environment/Daemons @@ -430,6 +430,9 @@ %dir %attr(755,nginx,nginx) %{_localstatedir}/log/zoneminder %changelog +* Fri Dec 10 2021 Andrew Bauer - 1.36.12-1 +- 1.36.12 release + * Wed Nov 17 2021 Andrew Bauer - 1.36.11-1 - 1.36.11 release diff -Nru zoneminder-1.36.11+dfsg1/distros/redhat/zoneminder.spec zoneminder-1.36.12+dfsg1/distros/redhat/zoneminder.spec --- zoneminder-1.36.11+dfsg1/distros/redhat/zoneminder.spec 2021-11-17 16:05:50.000000000 +0000 +++ zoneminder-1.36.12+dfsg1/distros/redhat/zoneminder.spec 2021-12-10 22:36:30.000000000 +0000 @@ -36,7 +36,7 @@ %global _hardened_build 1 Name: zoneminder -Version: 1.36.11 +Version: 1.36.12 Release: 1%{?dist} Summary: A camera monitoring and analysis tool Group: System Environment/Daemons @@ -430,6 +430,9 @@ %dir %attr(755,nginx,nginx) %{_localstatedir}/log/zoneminder %changelog +* Fri Dec 10 2021 Andrew Bauer - 1.36.12-1 +- 1.36.12 release + * Wed Nov 17 2021 Andrew Bauer - 1.36.11-1 - 1.36.11 release diff -Nru zoneminder-1.36.11+dfsg1/docs/installationguide/debian.rst zoneminder-1.36.12+dfsg1/docs/installationguide/debian.rst --- zoneminder-1.36.11+dfsg1/docs/installationguide/debian.rst 2021-11-17 16:05:50.000000000 +0000 +++ zoneminder-1.36.12+dfsg1/docs/installationguide/debian.rst 2021-12-10 22:36:30.000000000 +0000 @@ -4,7 +4,7 @@ .. contents:: Easy Way: Debian 11 (Bullseye) ------------------------- +------------------------------ This procedure will guide you through the installation of ZoneMinder on Debian 11 (Bullseye). @@ -104,7 +104,7 @@ You can do this using: -.. code-block:: +:: echo "deb https://zmrepo.zoneminder.com/debian/release-1.36 buster/" | sudo tee /etc/apt/sources.list.d/zoneminder.list diff -Nru zoneminder-1.36.11+dfsg1/scripts/zmdc.pl.in zoneminder-1.36.12+dfsg1/scripts/zmdc.pl.in --- zoneminder-1.36.11+dfsg1/scripts/zmdc.pl.in 2021-11-17 16:05:50.000000000 +0000 +++ zoneminder-1.36.12+dfsg1/scripts/zmdc.pl.in 2021-12-10 22:36:30.000000000 +0000 @@ -429,10 +429,20 @@ # It's not running, or at least it's not been started by us $process = { daemon=>$daemon, args=>\@args, command=>$command, keepalive=>!undef }; } elsif ( $process->{pid} && $pid_hash{$process->{pid}} ) { - dPrint(ZoneMinder::Logger::INFO, "'$process->{command}' already running at " + if ($process->{term_sent_at}) { + dPrint(ZoneMinder::Logger::INFO, "'$process->{command}' was told to term at " + .strftime('%y/%m/%d %H:%M:%S', localtime($process->{term_sent_at})) + .", pid = $process->{pid}\n" + ); + $process->{keepalive} = !undef; + $process->{delay} = 0; + delete $terminating_processes{$command}; + } else { + dPrint(ZoneMinder::Logger::INFO, "'$process->{command}' already running at " .strftime('%y/%m/%d %H:%M:%S', localtime($process->{started})) .", pid = $process->{pid}\n" - ); + ); + } return; } @@ -523,7 +533,7 @@ ."\n" ); sigprocmask(SIG_UNBLOCK, $blockset) or die "dying at unblock...\n"; - return(); + return (); } my $pid = $process->{pid}; @@ -586,7 +596,7 @@ sub stop { my ( $daemon, @args ) = @_; - my $command = join(' ', $daemon, @args ); + my $command = join(' ', $daemon, @args); my $process = $cmd_hash{$command}; if ( !$process ) { dPrint(ZoneMinder::Logger::WARNING, "Can't find process with command of '$command'"); diff -Nru zoneminder-1.36.11+dfsg1/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm zoneminder-1.36.12+dfsg1/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm --- zoneminder-1.36.11+dfsg1/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm 2021-11-17 16:05:50.000000000 +0000 +++ zoneminder-1.36.12+dfsg1/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm 2021-12-10 22:36:30.000000000 +0000 @@ -230,8 +230,8 @@ # PostCondition, so no further SQL } else { ( my $stripped_value = $value ) =~ s/^["\']+?(.+)["\']+?$/$1/; - foreach my $temp_value ( split( /["'\s]*?,["'\s]*?/, $stripped_value ) ) { - + # Empty value will result in () from split + foreach my $temp_value ( $stripped_value ? split( /["'\s]*?,["'\s]*?/, $stripped_value ) : $stripped_value ) { if ( $term->{attr} eq 'AlarmedZoneId' ) { $value = '(SELECT * FROM Stats WHERE EventId=E.Id AND Score > 0 AND ZoneId='.$value.')'; } elsif ( $term->{attr} =~ /^MonitorName/ ) { @@ -250,7 +250,8 @@ $$self{Server} = new ZoneMinder::Server($temp_value); } } elsif ( $term->{attr} eq 'StorageId' ) { - $value = "'$temp_value'"; + # Empty means NULL, otherwise must be an integer + $value = $temp_value ne '' ? int($temp_value) : 'NULL'; $$self{Storage} = new ZoneMinder::Storage($temp_value); } elsif ( $term->{attr} eq 'Name' || $term->{attr} eq 'Cause' diff -Nru zoneminder-1.36.11+dfsg1/src/zmc.cpp zoneminder-1.36.12+dfsg1/src/zmc.cpp --- zoneminder-1.36.11+dfsg1/src/zmc.cpp 2021-11-17 16:05:50.000000000 +0000 +++ zoneminder-1.36.12+dfsg1/src/zmc.cpp 2021-12-10 22:36:30.000000000 +0000 @@ -376,6 +376,7 @@ monitor->Id()); zmDbDo(sql); } + monitors.clear(); Image::Deinitialise(); Debug(1, "terminating"); diff -Nru zoneminder-1.36.11+dfsg1/src/zm_libvnc_camera.cpp zoneminder-1.36.12+dfsg1/src/zm_libvnc_camera.cpp --- zoneminder-1.36.11+dfsg1/src/zm_libvnc_camera.cpp 2021-11-17 16:05:50.000000000 +0000 +++ zoneminder-1.36.12+dfsg1/src/zm_libvnc_camera.cpp 2021-12-10 22:36:30.000000000 +0000 @@ -23,7 +23,7 @@ libvnc_lib = dlopen("libvncclient.so", RTLD_LAZY | RTLD_GLOBAL); if (!libvnc_lib) { - Error("Error loading libvncclient: %s", dlerror()); + Error("Error loading libvncclient.so: %s", dlerror()); return; } @@ -135,11 +135,6 @@ } VncCamera::~VncCamera() { - if (capture and mRfb) { - if (mRfb->frameBuffer) - free(mRfb->frameBuffer); - (*rfbClientCleanup_f)(mRfb); - } if (libvnc_lib) { dlclose(libvnc_lib); libvnc_lib = nullptr; @@ -253,6 +248,12 @@ } int VncCamera::Close() { + if (capture and mRfb) { + if (mRfb->frameBuffer) + free(mRfb->frameBuffer); + (*rfbClientCleanup_f)(mRfb); + mRfb = nullptr; + } return 1; } #endif diff -Nru zoneminder-1.36.11+dfsg1/src/zm_monitor.cpp zoneminder-1.36.12+dfsg1/src/zm_monitor.cpp --- zoneminder-1.36.11+dfsg1/src/zm_monitor.cpp 2021-11-17 16:05:50.000000000 +0000 +++ zoneminder-1.36.12+dfsg1/src/zm_monitor.cpp 2021-12-10 22:36:30.000000000 +0000 @@ -1904,7 +1904,7 @@ if (snap->image) { // decoder may not have been able to provide an image if (!ref_image.Buffer()) { - Debug(1, "Assigning instead of Dectecting"); + Debug(1, "Assigning instead of Detecting"); ref_image.Assign(*(snap->image)); } else { Debug(1, "Detecting motion on image %d, image %p", snap->image_index, snap->image); @@ -3096,9 +3096,6 @@ int Monitor::PreCapture() const { return camera->PreCapture(); } int Monitor::PostCapture() const { return camera->PostCapture(); } int Monitor::Close() { - if (close_event_thread.joinable()) { - close_event_thread.join(); - } // Because the stream indexes may change we have to clear out the packetqueue if (decoder) { decoder->Stop(); @@ -3116,10 +3113,14 @@ video_fifo = nullptr; } + if (close_event_thread.joinable()) { + close_event_thread.join(); + } std::lock_guard lck(event_mutex); if (event) { Info("%s: image_count:%d - Closing event %" PRIu64 ", shutting down", name.c_str(), image_count, event->Id()); closeEvent(); + close_event_thread.join(); } if (camera) camera->Close(); return 1; diff -Nru zoneminder-1.36.11+dfsg1/src/zm_monitorstream.cpp zoneminder-1.36.12+dfsg1/src/zm_monitorstream.cpp --- zoneminder-1.36.11+dfsg1/src/zm_monitorstream.cpp 2021-11-17 16:05:50.000000000 +0000 +++ zoneminder-1.36.12+dfsg1/src/zm_monitorstream.cpp 2021-12-10 22:36:30.000000000 +0000 @@ -378,9 +378,10 @@ } // end bool MonitorStream::sendFrame(const char *filepath, struct timeval *timestamp) bool MonitorStream::sendFrame(Image *image, const timeval ×tamp) { + if (!config.timestamp_on_capture) { + monitor->TimestampImage(image, timestamp); + } Image *send_image = prepareImage(image); - if (!config.timestamp_on_capture) - monitor->TimestampImage(send_image, timestamp); fputs("--" BOUNDARY "\r\n", stdout); #if HAVE_LIBAVCODEC @@ -864,14 +865,16 @@ Debug(1, "write index: %d %d", monitor->shared_data->last_write_index, index); Image *snap_image = monitor->image_buffer[index]; + if (!config.timestamp_on_capture) { + monitor->TimestampImage(snap_image, monitor->shared_timestamps[index]); + } + if ( scale != ZM_SCALE_BASE ) { scaled_image.Assign(*snap_image); scaled_image.Scale(scale); snap_image = &scaled_image; } - if ( !config.timestamp_on_capture ) { - monitor->TimestampImage(snap_image, monitor->shared_timestamps[index]); - } + snap_image->EncodeJpeg(img_buffer, &img_buffer_size); fprintf(stdout, diff -Nru zoneminder-1.36.11+dfsg1/src/zm_packetqueue.cpp zoneminder-1.36.12+dfsg1/src/zm_packetqueue.cpp --- zoneminder-1.36.11+dfsg1/src/zm_packetqueue.cpp 2021-11-17 16:05:50.000000000 +0000 +++ zoneminder-1.36.12+dfsg1/src/zm_packetqueue.cpp 2021-12-10 22:36:30.000000000 +0000 @@ -116,14 +116,15 @@ , max_video_packet_count); for ( - auto it = ++pktQueue.begin(); - it != pktQueue.end() and *it != add_packet; + auto it = ++pktQueue.begin(); + it != pktQueue.end() and *it != add_packet; + // iterator is incremented by erase ) { std::shared_ptr zm_packet = *it; ZMLockedPacket *lp = new ZMLockedPacket(zm_packet); if (!lp->trylock()) { - Debug(1, "Found locked packet when trying to free up video packets. Skipping to next one"); + Warning("Found locked packet when trying to free up video packets. This basically means that decoding is not keeping up."); delete lp; ++it; continue; @@ -312,7 +313,6 @@ pktQueue.size()); pktQueue.pop_front(); packet_counts[zm_packet->packet.stream_index] -= 1; - //delete zm_packet; } } // end if have at least max_video_packet_count video packets remaining // We signal on every packet because someday we may analyze sound diff -Nru zoneminder-1.36.11+dfsg1/src/zm_rgb.h zoneminder-1.36.12+dfsg1/src/zm_rgb.h --- zoneminder-1.36.11+dfsg1/src/zm_rgb.h 2021-11-17 16:05:50.000000000 +0000 +++ zoneminder-1.36.12+dfsg1/src/zm_rgb.h 2021-12-10 22:36:30.000000000 +0000 @@ -118,41 +118,34 @@ /* Convert RGB colour value into BGR\ARGB\ABGR */ inline Rgb rgb_convert(Rgb p_col, int p_subpixorder) { - Rgb result; + Rgb result = 0; - switch(p_subpixorder) { - + switch (p_subpixorder) { case ZM_SUBPIX_ORDER_BGR: case ZM_SUBPIX_ORDER_BGRA: - { - BLUE_PTR_BGRA(&result) = BLUE_VAL_RGBA(p_col); - GREEN_PTR_BGRA(&result) = GREEN_VAL_RGBA(p_col); - RED_PTR_BGRA(&result) = RED_VAL_RGBA(p_col); - } - break; + BLUE_PTR_BGRA(&result) = BLUE_VAL_RGBA(p_col); + GREEN_PTR_BGRA(&result) = GREEN_VAL_RGBA(p_col); + RED_PTR_BGRA(&result) = RED_VAL_RGBA(p_col); + break; case ZM_SUBPIX_ORDER_ARGB: - { - BLUE_PTR_ARGB(&result) = BLUE_VAL_RGBA(p_col); - GREEN_PTR_ARGB(&result) = GREEN_VAL_RGBA(p_col); - RED_PTR_ARGB(&result) = RED_VAL_RGBA(p_col); - } - break; + BLUE_PTR_ARGB(&result) = BLUE_VAL_RGBA(p_col); + GREEN_PTR_ARGB(&result) = GREEN_VAL_RGBA(p_col); + RED_PTR_ARGB(&result) = RED_VAL_RGBA(p_col); + break; case ZM_SUBPIX_ORDER_ABGR: - { - BLUE_PTR_ABGR(&result) = BLUE_VAL_RGBA(p_col); - GREEN_PTR_ABGR(&result) = GREEN_VAL_RGBA(p_col); - RED_PTR_ABGR(&result) = RED_VAL_RGBA(p_col); - } - break; - /* Grayscale */ + BLUE_PTR_ABGR(&result) = BLUE_VAL_RGBA(p_col); + GREEN_PTR_ABGR(&result) = GREEN_VAL_RGBA(p_col); + RED_PTR_ABGR(&result) = RED_VAL_RGBA(p_col); + break; + /* Grayscale */ case ZM_SUBPIX_ORDER_NONE: - result = p_col & 0xff; - break; + result = p_col & 0xff; + break; default: - return p_col; - break; + result = p_col; + break; } - + return result; } diff -Nru zoneminder-1.36.11+dfsg1/src/zm_utils.cpp zoneminder-1.36.12+dfsg1/src/zm_utils.cpp --- zoneminder-1.36.11+dfsg1/src/zm_utils.cpp 2021-11-17 16:05:50.000000000 +0000 +++ zoneminder-1.36.12+dfsg1/src/zm_utils.cpp 2021-12-10 22:36:30.000000000 +0000 @@ -224,8 +224,15 @@ #elif defined(__arm__) // ARM processor in 32bit mode // To see if it supports NEON, we need to get that information from the kernel + #ifdef __linux__ unsigned long auxval = getauxval(AT_HWCAP); if (auxval & HWCAP_ARM_NEON) { + #elif defined(__FreeBSD__) + unsigned long auxval = 0; + elf_aux_info(AT_HWCAP, &auxval, sizeof(auxval)); + if (auxval & HWCAP_NEON) { + #error Unsupported OS. + #endif Debug(1,"Detected ARM (AArch32) processor with Neon"); neonversion = 1; } else { diff -Nru zoneminder-1.36.11+dfsg1/src/zm_zone.cpp zoneminder-1.36.12+dfsg1/src/zm_zone.cpp --- zoneminder-1.36.11+dfsg1/src/zm_zone.cpp 2021-11-17 16:05:50.000000000 +0000 +++ zoneminder-1.36.12+dfsg1/src/zm_zone.cpp 2021-12-10 22:36:30.000000000 +0000 @@ -874,16 +874,23 @@ continue; } - if (polygon.Extent().Lo().x_ < 0 || polygon.Extent().Hi().x_ > static_cast(monitor->Width()) - || polygon.Extent().Lo().y_ < 0 || polygon.Extent().Hi().y_ > static_cast(monitor->Height())) { - Error("Zone %d/%s for monitor %s extends outside of image dimensions, (%d,%d), (%d,%d), fixing", + if (polygon.Extent().Lo().x_ < 0 + || + polygon.Extent().Hi().x_ > static_cast(monitor->Width()) + || + polygon.Extent().Lo().y_ < 0 + || + polygon.Extent().Hi().y_ > static_cast(monitor->Height())) { + Error("Zone %d/%s for monitor %s extends outside of image dimensions, (%d,%d), (%d,%d) != (%d,%d), fixing", Id, Name, monitor->Name(), polygon.Extent().Lo().x_, polygon.Extent().Lo().y_, polygon.Extent().Hi().x_, - polygon.Extent().Hi().y_); + polygon.Extent().Hi().y_, + monitor->Width(), + monitor->Height()); polygon.Clip(Box( {0, 0}, diff -Nru zoneminder-1.36.11+dfsg1/utils/do_debian_package.sh zoneminder-1.36.12+dfsg1/utils/do_debian_package.sh --- zoneminder-1.36.11+dfsg1/utils/do_debian_package.sh 2021-11-17 16:05:50.000000000 +0000 +++ zoneminder-1.36.12+dfsg1/utils/do_debian_package.sh 2021-12-10 22:36:30.000000000 +0000 @@ -146,6 +146,14 @@ fi; fi +if [ "$PACKAGE_VERSION" == "NOW" ]; then + PACKAGE_VERSION=`date +%Y%m%d%H%M%S`; +else + if [ "$PACKAGE_VERSION" == "CURRENT" ]; then + PACKAGE_VERSION="`date +%Y%m%d.`$(git rev-list ${versionhash}..HEAD --count)" + fi; +fi; + IFS='.' read -r -a VERSION_PARTS <<< "$RELEASE" if [ "$PPA" == "" ]; then if [ "$RELEASE" != "" ]; then diff -Nru zoneminder-1.36.11+dfsg1/version zoneminder-1.36.12+dfsg1/version --- zoneminder-1.36.11+dfsg1/version 2021-11-17 16:05:50.000000000 +0000 +++ zoneminder-1.36.12+dfsg1/version 2021-12-10 22:36:30.000000000 +0000 @@ -1 +1 @@ -1.36.11 +1.36.12 diff -Nru zoneminder-1.36.11+dfsg1/web/includes/Group.php zoneminder-1.36.12+dfsg1/web/includes/Group.php --- zoneminder-1.36.11+dfsg1/web/includes/Group.php 2021-11-17 16:05:50.000000000 +0000 +++ zoneminder-1.36.12+dfsg1/web/includes/Group.php 2021-12-10 22:36:30.000000000 +0000 @@ -167,9 +167,15 @@ public function Parents() { $Parents = array(); $Parent = $this->Parent(); - while( $Parent ) { + $seen_parents = array(); + while ($Parent) { + $seen_parents[$Parent->Id()] = $Parent; array_unshift($Parents, $Parent); $Parent = $Parent->Parent(); + if ($Parent and isset($seen_parents[$Parent->Id()])) { + Warning("Detected hierarchy loop in group {$Parent->Name()}"); + break; + } } return $Parents; } @@ -189,6 +195,9 @@ public function canView($u=null) { global $user; if (!$u) $u = $user; + if (!count($this->Monitors()) and !count($this->Children())) { + return true; + } # Can view if we can view any of the monitors in it. foreach ($this->Monitors() as $monitor) { if ($monitor->canView($u)) return true; diff -Nru zoneminder-1.36.11+dfsg1/web/skins/classic/views/filter.php zoneminder-1.36.12+dfsg1/web/skins/classic/views/filter.php --- zoneminder-1.36.11+dfsg1/web/skins/classic/views/filter.php 2021-11-17 16:05:50.000000000 +0000 +++ zoneminder-1.36.12+dfsg1/web/skins/classic/views/filter.php 2021-12-10 22:36:30.000000000 +0000 @@ -152,7 +152,7 @@ $focusWindow = true; -$storageareas = array('' => 'All') + ZM\ZM_Object::Objects_Indexed_By_Id('ZM\Storage'); +$storageareas = array('' => array('Name'=>'NULL Unspecified'), '0' => array('Name'=>'Zero')) + ZM\ZM_Object::Objects_Indexed_By_Id('ZM\Storage'); $weekdays = array(); for ( $i = 0; $i < 7; $i++ ) { diff -Nru zoneminder-1.36.11+dfsg1/web/skins/classic/views/js/event.js zoneminder-1.36.12+dfsg1/web/skins/classic/views/js/event.js --- zoneminder-1.36.11+dfsg1/web/skins/classic/views/js/event.js 2021-11-17 16:05:50.000000000 +0000 +++ zoneminder-1.36.12+dfsg1/web/skins/classic/views/js/event.js 2021-12-10 22:36:30.000000000 +0000 @@ -773,8 +773,9 @@ return; } + pauseClicked(); evt.preventDefault(); - $j.getJSON(thisUrl + '?request=event&task=delete&id='+eventData.Id) + $j.getJSON(thisUrl + '?request=event&action=delete&id='+eventData.Id) .done(function(data) { $j('#deleteConfirm').modal('hide'); streamNext(true); diff -Nru zoneminder-1.36.11+dfsg1/web/skins/classic/views/js/events.js zoneminder-1.36.12+dfsg1/web/skins/classic/views/js/events.js --- zoneminder-1.36.11+dfsg1/web/skins/classic/views/js/events.js 2021-11-17 16:05:50.000000000 +0000 +++ zoneminder-1.36.12+dfsg1/web/skins/classic/views/js/events.js 2021-12-10 22:36:30.000000000 +0000 @@ -63,13 +63,13 @@ row.Id = '' + eid + ''; row.Name = '' + row.Name + '' + - '
' + archived + emailed + '
'; + '
' + archived + emailed + '
'; if ( canEdit.Monitors ) row.Monitor = '' + row.Monitor + ''; if ( canEdit.Events ) row.Cause = '' + row.Cause + ''; if ( row.Notes.indexOf('detected:') >= 0 ) { - row.Cause = row.Cause + '
' + row.Notes + '
'; + row.Cause = row.Cause + '
' + row.Notes + '
'; } else if ( row.Notes != 'Forced Web: ' ) { - row.Cause = row.Cause + '
' + row.Notes + '
'; + row.Cause = row.Cause + '
' + row.Notes + '
'; } row.Frames = '' + row.Frames + ''; row.AlarmFrames = '' + row.AlarmFrames + ''; diff -Nru zoneminder-1.36.11+dfsg1/web/skins/classic/views/js/montagereview.js zoneminder-1.36.12+dfsg1/web/skins/classic/views/js/montagereview.js --- zoneminder-1.36.11+dfsg1/web/skins/classic/views/js/montagereview.js 2021-11-17 16:05:50.000000000 +0000 +++ zoneminder-1.36.12+dfsg1/web/skins/classic/views/js/montagereview.js 2021-12-10 22:36:30.000000000 +0000 @@ -57,7 +57,7 @@ var events_for_monitor = events_by_monitor_id[monId]; if ( !events_for_monitor ) { - console.log("No events for monitor " + monId); + //console.log("No events for monitor " + monId); return; } @@ -648,8 +648,11 @@ } function setLive(value) { + // When we submit the context etc goes away but we may still be trying to update + // So kill the timer. + clearInterval(timerObj); liveMode = value; - var form = $j('#montagereview_form')[0]; + var form = document.getElementById('montagereview_form'); form.elements['live'].value = value; form.submit(); return false; @@ -985,6 +988,19 @@ }); }); + if ( !liveMode ) { + canvas = document.getElementById('timeline'); + + canvas.addEventListener('mousemove', mmove, false); + canvas.addEventListener('touchmove', tmove, false); + canvas.addEventListener('mousedown', mdown, false); + canvas.addEventListener('mouseup', mup, false); + canvas.addEventListener('mouseout', mout, false); + + ctx = canvas.getContext('2d'); + drawGraph(); + } + for ( var i = 0, len = monitorPtr.length; i < len; i += 1 ) { var monId = monitorPtr[i]; if ( !monId ) continue; @@ -1006,18 +1022,6 @@ } } // end foreach monitor - if ( !liveMode ) { - canvas = document.getElementById('timeline'); - - canvas.addEventListener('mousemove', mmove, false); - canvas.addEventListener('touchmove', tmove, false); - canvas.addEventListener('mousedown', mdown, false); - canvas.addEventListener('mouseup', mup, false); - canvas.addEventListener('mouseout', mout, false); - - ctx = canvas.getContext('2d'); - drawGraph(); - } setSpeed(speedIndex); //setFit(fitMode); // will redraw //setLive(liveMode); // will redraw diff -Nru zoneminder-1.36.11+dfsg1/web/skins/classic/views/js/montagereview.js.php zoneminder-1.36.12+dfsg1/web/skins/classic/views/js/montagereview.js.php --- zoneminder-1.36.11+dfsg1/web/skins/classic/views/js/montagereview.js.php 2021-11-17 16:05:50.000000000 +0000 +++ zoneminder-1.36.12+dfsg1/web/skins/classic/views/js/montagereview.js.php 2021-12-10 22:36:30.000000000 +0000 @@ -239,6 +239,6 @@ var cWidth; // save canvas width var cHeight; // save canvas height var canvas; // global canvas definition so we don't have to keep looking it up -var ctx; +var ctx = null; var underSlider; // use this to hold what is hidden by the slider var underSliderX; // Where the above was taken from (left side, Y is zero) diff -Nru zoneminder-1.36.11+dfsg1/web/skins/classic/views/js/watch.js zoneminder-1.36.12+dfsg1/web/skins/classic/views/js/watch.js --- zoneminder-1.36.11+dfsg1/web/skins/classic/views/js/watch.js 2021-11-17 16:05:50.000000000 +0000 +++ zoneminder-1.36.12+dfsg1/web/skins/classic/views/js/watch.js 2021-12-10 22:36:30.000000000 +0000 @@ -531,11 +531,11 @@ } function statusCmdQuery() { - $j.getJSON(monitorUrl + '?view=request&request=status&entity=monitor&element[]=Status&element[]=FrameRate&id='+monitorId) + $j.getJSON(monitorUrl + '?view=request&request=status&entity=monitor&element[]=Status&element[]=FrameRate&id='+monitorId+'&'+auth_relay) .done(getStatusCmdResponse) .fail(logAjaxFail); - streamCmdTimer = null; + statusCmdTimer = null; } function alarmCmdReq(data) { diff -Nru zoneminder-1.36.11+dfsg1/zm.conf.in zoneminder-1.36.12+dfsg1/zm.conf.in --- zoneminder-1.36.11+dfsg1/zm.conf.in 2021-11-17 16:05:50.000000000 +0000 +++ zoneminder-1.36.12+dfsg1/zm.conf.in 2021-12-10 22:36:30.000000000 +0000 @@ -37,7 +37,8 @@ ZM_DB_TYPE=@ZM_DB_TYPE@ # ZoneMinder database hostname or ip address and optionally port or unix socket -# Acceptable formats include hostname[:port], ip_address[:port], or localhost:unix_socket +# Acceptable formats include hostname[:port], ip_address[:port], or +# localhost:/path/to/unix_socket ZM_DB_HOST=@ZM_DB_HOST@ # ZoneMinder database name