diff --git a/CMakeLists.txt b/CMakeLists.txt index ea67474d6..c7be1ceec 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,7 @@ # cmake_minimum_required (VERSION 2.6) project (zoneminder) -set(zoneminder_VERSION "1.28.108") +set(zoneminder_VERSION "1.28.109") # make API version a minor of ZM version set(zoneminder_API_VERSION "${zoneminder_VERSION}.1") diff --git a/configure.ac b/configure.ac index 436be34cf..b9d4ef2ee 100644 --- a/configure.ac +++ b/configure.ac @@ -3,7 +3,7 @@ # For instructions on building with cmake, please see INSTALL # AC_PREREQ(2.59) -AC_INIT(zm,1.28.108,[http://www.zoneminder.com/forums/ - Please check FAQ first],zoneminder,http://www.zoneminder.com/downloads.html) +AC_INIT(zm,1.28.109,[http://www.zoneminder.com/forums/ - Please check FAQ first],zoneminder,http://www.zoneminder.com/downloads.html) AM_INIT_AUTOMAKE AC_CONFIG_SRCDIR(src/zm.h) AC_CONFIG_HEADERS(config.h) diff --git a/db/zm_update-1.28.107.sql b/db/zm_update-1.28.107.sql index 4d4c6432d..76fea0100 100644 --- a/db/zm_update-1.28.107.sql +++ b/db/zm_update-1.28.107.sql @@ -13,7 +13,7 @@ SET @s = (SELECT IF( AND table_schema = DATABASE() AND column_name = 'Id' ) > 0, -"SELECT 'Column ID already exists in Monitors'", +"SELECT 'Column ID already exists in Frames'", "ALTER TABLE `Frames` ADD COLUMN `Id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT FIRST, DROP PRIMARY KEY, ADD PRIMARY KEY(`Id`)" )); diff --git a/db/zm_update-1.28.109.sql b/db/zm_update-1.28.109.sql new file mode 100644 index 000000000..be6dca9f1 --- /dev/null +++ b/db/zm_update-1.28.109.sql @@ -0,0 +1,21 @@ +-- +-- This updates a 1.28.106 database to 1.28.107 +-- + +-- +-- Update Frame table to have a PrimaryKey of ID, insetad of a Composite Primary Key +-- Used primarially for compatibility with CakePHP +-- +SET @s = (SELECT IF( + (SELECT COUNT(*) + FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_name = 'Servers' + AND table_schema = DATABASE() + AND column_name = 'Hostname' + ) > 0, +"SELECT 'Column Hostname already exists in Servers'", +"ALTER TABLE `Servers` ADD COLUMN `Hostname` TEXT AFTER Name" +)); + +PREPARE stmt FROM @s; +EXECUTE stmt; diff --git a/distros/debian/postinst b/distros/debian/postinst index d06f9c641..42a3bb1dc 100644 --- a/distros/debian/postinst +++ b/distros/debian/postinst @@ -15,7 +15,7 @@ if [ "$1" = "configure" ]; then # test if database if already present... if ! $(echo quit | mysql --defaults-file=/etc/mysql/debian.cnf zm > /dev/null 2> /dev/null) ; then cat /usr/share/zoneminder/db/zm_create.sql | mysql --defaults-file=/etc/mysql/debian.cnf - echo 'grant lock tables, alter,select,insert,update,delete on zm.* to 'zmuser'@localhost identified by "zmpass";' | mysql --defaults-file=/etc/mysql/debian.cnf mysql + echo 'grant lock tables, alter,select,insert,update,delete,create,index on zm.* to 'zmuser'@localhost identified by "zmpass";' | mysql --defaults-file=/etc/mysql/debian.cnf mysql fi invoke-rc.d zoneminder stop || true @@ -47,6 +47,8 @@ if [ "$1" = "configure" ]; then chown www-data:www-data -R /var/cache/zoneminder else chown www-data:www-data /var/log/zm + + echo 'grant lock tables, create, index, alter on zm.* to 'zmuser'@localhost identified by "zmpass";' | mysql --defaults-file=/etc/mysql/debian.cnf mysql zmupdate.pl fi fi diff --git a/distros/fedora/README.Fedora b/distros/fedora/README.Fedora index 3043d78fd..94b3c5712 100644 --- a/distros/fedora/README.Fedora +++ b/distros/fedora/README.Fedora @@ -11,9 +11,9 @@ What's New 2. The ZoneMinder config file, zm.conf, has been moved under /etc/zm. -3. The ZoneMinder mysql account now requires "Create" permission. This change - must be done manually before ZoneMinder will run. See the installation steps - below. +3. The ZoneMinder mysql account now requires "create" and "index" permission. + This change must be done manually before ZoneMinder will run. See the + installation steps below. 4. A new permission group called "Groups" has been added. This allows the system administrator to assign "view", "edit", or "none" permission to @@ -46,9 +46,9 @@ New installs mysql -u root -p < /usr/share/zoneminder/db/zm_create.sql mysql -u root -p - mysql> grant select,insert,update,delete,lock tables,alter,create - on zm.* to 'zmuser'@localhost identified by 'zmpass'; - mysql> exit; + mysql> grant select,insert,update,delete,lock tables,alter,create,index + on zm.* to 'zmuser'@localhost identified by 'zmpass'; + mysql> exit; mysqladmin -u root -p reload The database account credentials, zmuser/zmpass, are arbitrary. Set them to @@ -113,8 +113,8 @@ Upgrades Over time, the database account permissions required for normal operation have changed. Verify the zmuser database account has been granted select, - insert, update, delete, lock tables, alter, and create permission to the - ZoneMinder database: + insert, update, delete, lock tables, alter, create, and index permission + to the ZoneMinder database: mysql -u root -p mysql> show grants for zmuser@localhost; diff --git a/distros/redhat/README.CentOS b/distros/redhat/README.CentOS index 05e2cb0ab..39586b7d3 100644 --- a/distros/redhat/README.CentOS +++ b/distros/redhat/README.CentOS @@ -1,9 +1,9 @@ What's New ========== -1. The ZoneMinder mysql account now requires "Create" permission. This change - must be done manually before ZoneMinder will run. See the installation steps - below. +1. The ZoneMinder mysql account now requires "create" and "index" permission. + This change must be done manually before ZoneMinder will run. See the + installation steps below. 2. A new permission group called "Groups" has been added. This allows the system administrator to assign "view", "edit", or "none" permission to @@ -32,7 +32,7 @@ New installs mysql -uroot -p mysql> create database zm; - mysql> grant select,insert,update,delete,lock tables,alter,create + mysql> grant select,insert,update,delete,lock tables,alter,create,index on zm.* to 'zmuser'@localhost identified by 'zmpass'; mysql> exit; mysql -uroot -p < /usr/share/zoneminder/db/zm_create.sql @@ -105,8 +105,8 @@ New installs Over time, the database account permissions required for normal operation have changed. Verify the zmuser database account has been granted select, - insert, update, delete, lock tables, alter, and create permission to the - ZoneMinder database: + insert, update, delete, lock tables, alter, create, and index permission + to the ZoneMinder database: mysql -u root -p mysql> show grants for zmuser@localhost; diff --git a/distros/redhat/README.Centos7 b/distros/redhat/README.Centos7 index 70e98b006..9bf9a8462 100644 --- a/distros/redhat/README.Centos7 +++ b/distros/redhat/README.Centos7 @@ -1,9 +1,9 @@ What's New ========== -1. The ZoneMinder mysql account now requires "Create" permission. This change - must be done manually before ZoneMinder will run. See the installation steps - below. +1. The ZoneMinder mysql account now requires "create" and "index" permission. + This change must be done manually before ZoneMinder will run. See the + installation steps below. 2. A new permission group called "Groups" has been added. This allows the system administrator to assign "view", "edit", or "none" permission to @@ -34,9 +34,9 @@ New installs mysql -u root -p < /usr/share/zoneminder/db/zm_create.sql mysql -u root -p - mysql> grant select,insert,update,delete,lock tables,alter,create - on zm.* to 'zmuser'@localhost identified by 'zmpass'; - mysql> exit; + mysql> grant select,insert,update,delete,lock tables,alter,create,index + on zm.* to 'zmuser'@localhost identified by 'zmpass'; + mysql> exit; mysqladmin -u root -p reload The database account credentials, zmuser/zmpass, are arbitrary. Set them to @@ -100,8 +100,8 @@ Upgrades Over time, the database account permissions required for normal operation have changed. Verify the zmuser database account has been granted select, - insert, update, delete, lock tables, alter, and create permission to the - ZoneMinder database: + insert, update, delete, lock tables, alter, create, and index permission + to the ZoneMinder database: mysql -u root -p mysql> show grants for zmuser@localhost; diff --git a/distros/ubuntu1204_cmake/source/format b/distros/ubuntu1204_cmake/source/format index 163aaf8d8..89ae9db8f 100644 --- a/distros/ubuntu1204_cmake/source/format +++ b/distros/ubuntu1204_cmake/source/format @@ -1 +1 @@ -3.0 (quilt) +3.0 (native) diff --git a/distros/ubuntu1504_cmake/zoneminder.postinst b/distros/ubuntu1504_cmake/zoneminder.postinst index e7810e468..4d2da7331 100644 --- a/distros/ubuntu1504_cmake/zoneminder.postinst +++ b/distros/ubuntu1504_cmake/zoneminder.postinst @@ -8,6 +8,17 @@ if [ "$1" = "configure" ]; then if [ -z "$2" ]; then chown www-data:www-data -R /var/cache/zoneminder fi + + # Do this every time the package is installed or upgraded + # Test for database presence to avoid failure of zmupdate.pl + + # Ensure zoneminder is stopped + deb-systemd-invoke stop zoneminder.service || exit $? + + echo 'grant lock tables, create, index, alter on zm.* to 'zmuser'@localhost identified by "zmpass";' | mysql --defaults-file=/etc/mysql/debian.cnf mysql + # Run the ZoneMinder update tool + zmupdate.pl --nointeractive + fi #DEBHELPER# diff --git a/scripts/Makefile.am b/scripts/Makefile.am index 92fddf98d..5eacd8203 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -57,7 +57,7 @@ EXTRA_DIST = \ ZoneMinder/lib/ZoneMinder/ConfigAdmin.pm \ ZoneMinder/lib/ZoneMinder/ConfigData.pm.in \ ZoneMinder/lib/ZoneMinder/Control.pm \ - ZoneMinder/lib/ZoneMinder/Control \ # Grab all ptz control skips under the Control folder + ZoneMinder/lib/ZoneMinder/Control \ ZoneMinder/lib/ZoneMinder/Trigger/Channel.pm \ ZoneMinder/lib/ZoneMinder/Trigger/Channel/Handle.pm \ ZoneMinder/lib/ZoneMinder/Trigger/Channel/Spawning.pm \ diff --git a/src/zm_remote_camera_rtsp.cpp b/src/zm_remote_camera_rtsp.cpp index 7e00a5d60..a07d97a8e 100644 --- a/src/zm_remote_camera_rtsp.cpp +++ b/src/zm_remote_camera_rtsp.cpp @@ -30,8 +30,9 @@ RemoteCameraRtsp::RemoteCameraRtsp( int p_id, const std::string &p_method, const std::string &p_host, const std::string &p_port, const std::string &p_path, int p_width, int p_height, bool p_rtsp_describe, int p_colours, int p_brightness, int p_contrast, int p_hue, int p_colour, bool p_capture ) : RemoteCamera( p_id, "rtsp", p_host, p_port, p_path, p_width, p_height, p_colours, p_brightness, p_contrast, p_hue, p_colour, p_capture ), - rtspThread( 0 ), - rtsp_describe( p_rtsp_describe ) + rtsp_describe( p_rtsp_describe ), + rtspThread( 0 ) + { if ( p_method == "rtpUni" ) method = RtspThread::RTP_UNICAST; diff --git a/src/zm_rtsp.h b/src/zm_rtsp.h index f5dcb9552..acd28e651 100644 --- a/src/zm_rtsp.h +++ b/src/zm_rtsp.h @@ -50,12 +50,13 @@ private: private: int mId; - bool mRtspDescribe; + RtspMethod mMethod; std::string mProtocol; std::string mHost; std::string mPort; std::string mPath; + bool mRtspDescribe; std::string mUrl; // Reworked authentication system diff --git a/version b/version index ca2c9c84c..a960d2a6d 100644 --- a/version +++ b/version @@ -1 +1 @@ -1.28.108 +1.28.109 diff --git a/web/api/app/Controller/EventsController.php b/web/api/app/Controller/EventsController.php index 5f88fbfc1..988c19110 100644 --- a/web/api/app/Controller/EventsController.php +++ b/web/api/app/Controller/EventsController.php @@ -84,11 +84,23 @@ class EventsController extends AppController { } $options = array('conditions' => array('Event.' . $this->Event->primaryKey => $id)); $event = $this->Event->find('first', $options); - - $path = $configs['ZM_DIR_EVENTS'].'/'.$this->Image->getEventPath($event).'/'; + $path = $configs['ZM_DIR_EVENTS'].'/'.$this->Image->getEventPath($event).'/'; $event['Event']['BasePath'] = $path; + # Get the previous and next events for any monitor + $this->Event->id = $id; + $event_neighbors = $this->Event->find('neighbors'); + $event['Event']['Next'] = $event_neighbors['next']['Event']['Id']; + $event['Event']['Prev'] = $event_neighbors['prev']['Event']['Id']; + + # Also get the previous and next events for the same monitor + $event_monitor_neighbors = $this->Event->find('neighbors', array( + 'conditions'=>array('Event.MonitorId'=>$event['Event']['MonitorId']) + )); + $event['Event']['NextOfMonitor'] = $event_monitor_neighbors['next']['Event']['Id']; + $event['Event']['PrevOfMonitor'] = $event_monitor_neighbors['prev']['Event']['Id']; + $this->set(array( 'event' => $event, '_serialize' => array('event') diff --git a/web/includes/database.php b/web/includes/database.php index b849405d9..2d7bfd7a9 100644 --- a/web/includes/database.php +++ b/web/includes/database.php @@ -32,6 +32,7 @@ function dbConnect() try { $dbConn = new PDO( ZM_DB_TYPE . ':host=' . ZM_DB_HOST . ';dbname='.ZM_DB_NAME, ZM_DB_USER, ZM_DB_PASS ); + $dbConn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $ex ) { echo "Unable to connect to ZM db." . $ex->getMessage(); $dbConn = null; @@ -111,7 +112,7 @@ function dbQuery( $sql, $params=NULL ) { $result = $dbConn->query( $sql ); } } catch(PDOException $e) { - Fatal( "SQL-ERR '".$e.getMessage()."', statement was '".$sql."'" ); + Fatal( "SQL-ERR '".$e->getMessage()."', statement was '".$sql."'" ); } return( $result ); } diff --git a/web/views/image.php b/web/views/image.php index 80377599f..de8205f76 100644 --- a/web/views/image.php +++ b/web/views/image.php @@ -40,6 +40,21 @@ if ( !canView( 'Events' ) ) header( 'Content-type: image/jpeg' ); +// Compatibility for PHP 5.4 +if (!function_exists('imagescale')) +{ + function imagescale($image, $new_width, $new_height = -1, $mode = 0) + { + $mode; // Not supported + + $new_height = ($new_height == -1) ? imagesy($image) : $new_height; + $imageNew = imagecreatetruecolor($new_width, $new_height); + imagecopyresampled($imageNew, $image, 0, 0, 0, 0, (int)$new_width, (int)$new_height, imagesx($image), imagesy($image)); + + return $imageNew; + } +} + $errorText = false; if ( empty($_REQUEST['path']) ) {