From a995d72ebd5f561e0a53183a1a7347bb24756758 Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Sat, 22 Aug 2015 12:36:49 -0500 Subject: [PATCH 01/49] add warning and help text for maxfps fields --- web/lang/en_gb.php | 11 ++++++++++- web/skins/classic/views/monitor.php | 14 ++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/web/lang/en_gb.php b/web/lang/en_gb.php index bf0258caf..6112aaf8c 100644 --- a/web/lang/en_gb.php +++ b/web/lang/en_gb.php @@ -903,7 +903,16 @@ $OLANG = array( 'OPTIONS_EXIF' => array( 'Help' => "Enable this option to embed EXIF data into each jpeg frame." ), - + 'OPTIONS_MAXFPS' => array( + 'Help' => "This field has certain limitations when used for non-local devices.~~ ". + "Failure to adhere to these limitations will cause a delay in live video, irregular frame skipping, ". + "and missed events~~". + "For streaming IP cameras, do not use this field to reduce the frame rate. Set the frame rate in the". + " camera, instead. You can, however, use a value that is slightly higher than the frame rate in the camera. ". + "In this case, this helps keep the cpu from being overtaxed in the event of a network problem.~~". + "Some, mostly older, IP cameras support snapshot mode. In this case ZoneMinder is actively polling the camera ". + "for new images. In this case, it is safe to use thie field." + ), // 'LANG_DEFAULT' => array( // 'Prompt' => "This is a new prompt for this option", diff --git a/web/skins/classic/views/monitor.php b/web/skins/classic/views/monitor.php index 5920409ad..7935e4f5c 100644 --- a/web/skins/classic/views/monitor.php +++ b/web/skins/classic/views/monitor.php @@ -680,9 +680,19 @@ switch ( $tab ) - - +  () +  () + + + + From e3d06ca1036336c8bdd98fe4b8a3ccc7f68a6acd Mon Sep 17 00:00:00 2001 From: Pliable Pixels Date: Mon, 2 Nov 2015 16:54:52 -0500 Subject: [PATCH 02/49] added prev/next event ids --- web/api/app/Controller/EventsController.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/web/api/app/Controller/EventsController.php b/web/api/app/Controller/EventsController.php index 1afd3be1f..9c861c040 100644 --- a/web/api/app/Controller/EventsController.php +++ b/web/api/app/Controller/EventsController.php @@ -83,10 +83,14 @@ class EventsController extends AppController { } $options = array('conditions' => array('Event.' . $this->Event->primaryKey => $id)); $event = $this->Event->find('first', $options); + $this->Event->id = $id; + $event_neighbors = $this->Event->find('neighbors'); $path = $configs['ZM_DIR_EVENTS'].'/'.$this->Image->getEventPath($event).'/'; $event['Event']['BasePath'] = $path; + $event['Event']['Next'] = $event_neighbors['next']['Event']['Id']; + $event['Event']['Prev'] = $event_neighbors['prev']['Event']['Id']; $this->set(array( 'event' => $event, From 7cbad44ae4edd56a6e871059fecf1759f03c37dc Mon Sep 17 00:00:00 2001 From: Pliable Pixels Date: Wed, 4 Nov 2015 14:23:28 -0500 Subject: [PATCH 03/49] also return the prev and next events for the same monitor as the current event --- web/api/app/Controller/EventsController.php | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/web/api/app/Controller/EventsController.php b/web/api/app/Controller/EventsController.php index 9c861c040..18de054a8 100644 --- a/web/api/app/Controller/EventsController.php +++ b/web/api/app/Controller/EventsController.php @@ -83,15 +83,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).'/'; + $event['Event']['BasePath'] = $path; + + # Get the previous and next events for any monitor $this->Event->id = $id; $event_neighbors = $this->Event->find('neighbors'); - - $path = $configs['ZM_DIR_EVENTS'].'/'.$this->Image->getEventPath($event).'/'; - - $event['Event']['BasePath'] = $path; $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') From 551194227d35d7eb300a34fb841c2e6106e42083 Mon Sep 17 00:00:00 2001 From: abishai Date: Sun, 15 Nov 2015 21:40:25 +0000 Subject: [PATCH 04/49] compat for php 5.4 --- web/views/image.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) 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']) ) { From e00049f17a69eca4a61822244a55782a14954cf3 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Mon, 16 Nov 2015 09:30:09 -0500 Subject: [PATCH 05/49] change format to native --- distros/ubuntu1204_cmake/source/format | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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) From f322bde35c75da86b217472eb09e7ea42becf0e5 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Mon, 16 Nov 2015 11:01:11 -0500 Subject: [PATCH 06/49] increase version to 109 because I at some point pushed a db update script --- CMakeLists.txt | 2 +- configure.ac | 2 +- version | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) 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/version b/version index ca2c9c84c..a960d2a6d 100644 --- a/version +++ b/version @@ -1 +1 @@ -1.28.108 +1.28.109 From 7f5958d873bc4f00739324f99741031c5a443f64 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Mon, 16 Nov 2015 11:01:41 -0500 Subject: [PATCH 07/49] remove comma that shouldn't be there --- db/zm_update-1.28.109.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/zm_update-1.28.109.sql b/db/zm_update-1.28.109.sql index c23927e26..be6dca9f1 100644 --- a/db/zm_update-1.28.109.sql +++ b/db/zm_update-1.28.109.sql @@ -14,7 +14,7 @@ SET @s = (SELECT IF( AND column_name = 'Hostname' ) > 0, "SELECT 'Column Hostname already exists in Servers'", -"ALTER TABLE `Servers` ADD COLUMN `Hostname` TEXT AFTER Name", +"ALTER TABLE `Servers` ADD COLUMN `Hostname` TEXT AFTER Name" )); PREPARE stmt FROM @s; From 9052274d0d6ce0fbab6a57d50e79baf7a829d37f Mon Sep 17 00:00:00 2001 From: Andy Bauer Date: Tue, 17 Nov 2015 12:20:51 -0600 Subject: [PATCH 08/49] Update rpm documentation to reference index permission --- distros/fedora/README.Fedora | 16 ++++++++-------- distros/redhat/README.CentOS | 12 ++++++------ distros/redhat/README.Centos7 | 16 ++++++++-------- 3 files changed, 22 insertions(+), 22 deletions(-) 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; From 37b041b561371f04ee5019dffbde72fbe1fbe42a Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 20 Nov 2015 16:00:57 -0500 Subject: [PATCH 09/49] add index to recommended default permissions on zmuser --- distros/ubuntu1504_cmake/README.Debian | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/distros/ubuntu1504_cmake/README.Debian b/distros/ubuntu1504_cmake/README.Debian index 2ba809fe4..8182e0678 100644 --- a/distros/ubuntu1504_cmake/README.Debian +++ b/distros/ubuntu1504_cmake/README.Debian @@ -8,7 +8,7 @@ Initializing database OR cat /usr/share/zoneminder/db/zm_create.sql | sudo mysql --defaults-file=/etc/mysql/debian.cnf - echo 'grant lock tables,alter,create,select,insert,update,delete on zm.* to 'zmuser'@localhost identified by "zmpass";'\ + echo 'grant lock tables,alter,create,index,select,insert,update,delete on zm.* to 'zmuser'@localhost identified by "zmpass";'\ | sudo mysql --defaults-file=/etc/mysql/debian.cnf mysql Hint: generate secure password with `pwgen` and update "/etc/zm/zm.conf" From a9609d2a438a8f5eb5539da9167c4160af8807a6 Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Sat, 21 Nov 2015 12:17:23 -0600 Subject: [PATCH 10/49] fix mem alloc fault in zm_monitor.cpp --- src/zm_monitor.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/zm_monitor.cpp b/src/zm_monitor.cpp index ca14b5373..753a3dd62 100644 --- a/src/zm_monitor.cpp +++ b/src/zm_monitor.cpp @@ -4196,21 +4196,24 @@ void MonitorStream::runStream() char *swap_path = 0; bool buffered_playback = false; + + // 15 is the max length for the swap path suffix, /zmswap-whatever, assuming max 6 digits for monitor id + const int max_swap_len_suffix = 15; + int swap_path_length = strlen(config.path_swap)+1; // +1 for NULL terminator if ( connkey && playback_buffer > 0 ) { - if ( swap_path_length + 15 > PATH_MAX ) { - // 15 is for /zmswap-whatever, assuming max 6 digits for monitor id - Error( "Swap Path is too long. %d > %d ", swap_path_length+15, PATH_MAX ); + if ( swap_path_length + max_swap_len_suffix > PATH_MAX ) { + Error( "Swap Path is too long. %d > %d ", swap_path_length+max_swap_len_suffix, PATH_MAX ); } else { - swap_path = (char *)malloc( swap_path_length+15 ); + swap_path = (char *)malloc( swap_path_length+max_swap_len_suffix ); Debug( 3, "Checking swap image path %s", config.path_swap ); strncpy( swap_path, config.path_swap, swap_path_length ); if ( checkSwapPath( swap_path, false ) ) { - snprintf( &(swap_path[swap_path_length]), sizeof(swap_path)-swap_path_length, "/zmswap-m%d", monitor->Id() ); + snprintf( &(swap_path[swap_path_length]), max_swap_len_suffix, "/zmswap-m%d", monitor->Id() ); if ( checkSwapPath( swap_path, true ) ) { - snprintf( &(swap_path[swap_path_length]), sizeof(swap_path)-swap_path_length, "/zmswap-q%06d", connkey ); + snprintf( &(swap_path[swap_path_length]), max_swap_len_suffix, "/zmswap-q%06d", connkey ); if ( checkSwapPath( swap_path, true ) ) { buffered_playback = true; } From e65f91d404d19616be5b906910f1494caa2326be Mon Sep 17 00:00:00 2001 From: Andy Bauer Date: Sat, 21 Nov 2015 15:18:43 -0600 Subject: [PATCH 11/49] update rpm documentation --- distros/fedora/README.Fedora | 23 ++++++++++++++++------- distros/redhat/README.CentOS | 23 ++++++++++++++++------- distros/redhat/README.Centos7 | 23 ++++++++++++++++------- 3 files changed, 48 insertions(+), 21 deletions(-) diff --git a/distros/fedora/README.Fedora b/distros/fedora/README.Fedora index 94b3c5712..85088d868 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" and "index" permission. - This change must be done manually before ZoneMinder will run. See the - installation steps below. +3. Due to the active state of the ZoneMinder project, we now recommend granting + ALL permission to the ZoneMinder mysql account. 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,7 +46,7 @@ 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,index + mysql> grant all on zm.* to 'zmuser'@localhost identified by 'zmpass'; mysql> exit; mysqladmin -u root -p reload @@ -59,6 +59,11 @@ New installs Change ZM_DB_USER and ZM_DB_PASS to the values you created in the previous step. + Additionally, you must also edit + /usr/share/zoneminder/www/api/app/Config/database.php in a similar manner. + Scroll down and change login and password to the values you created in the + previous step. + 4. Edit /etc/php.ini, uncomment the date.timezone line, and add your local timezone. PHP will complain loudly if this is not set, or if it is set incorrectly, and these complaints will show up in the zoneminder logging @@ -109,12 +114,16 @@ Upgrades Compare /etc/zm/zm.conf to /etc/zm/zm.conf.rpmnew. Verify that zm.conf contains any new config settings that may be in zm.conf.rpmnew. + Additionally, you must also edit + /usr/share/zoneminder/www/api/app/Config/database.php in a similar manner. + Scroll down and change login and password to the values you used + previsouly. + 2. Verify permissions of the zmuser account. 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, create, and index permission - to the ZoneMinder database: + have increased. Verify the zmuser database account has been granted all + 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 39586b7d3..e6e53bbc6 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" and "index" permission. - This change must be done manually before ZoneMinder will run. See the - installation steps below. +1. Due to the active state of the ZoneMinder project, we now recommend granting + ALL permission to the ZoneMinder mysql account. 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,index + mysql> grant all on zm.* to 'zmuser'@localhost identified by 'zmpass'; mysql> exit; mysql -uroot -p < /usr/share/zoneminder/db/zm_create.sql @@ -45,6 +45,11 @@ New installs other than zmuser/zmpass then you must now edit /etc/zm.conf. Change ZM_DB_USER and ZM_DB_PASS to the values you created in step 2. + Additionally, you must also edit + /usr/share/zoneminder/www/api/app/Config/database.php in a similar manner. + Scroll down and change login and password to the values you created in the + previous step. + 4. Edit /etc/php.ini, uncomment the date.timezone line, and add your local timezone. PHP will complain loudly if this is not set, or if it is set incorrectly, and these complaints will show up in the zoneminder logging @@ -101,12 +106,16 @@ New installs Compare /etc/zm.conf to /etc/zm.conf.rpmnew. Verify that zm.conf contains any new config settings that may be in zm.conf.rpmnew. + Additionally, you must also edit + /usr/share/zoneminder/www/api/app/Config/database.php in a similar manner. + Scroll down and change login and password to the values you used + previsouly. + 2. Verify permissions of the zmuser account. 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, create, and index permission - to the ZoneMinder database: + have increased. Verify the zmuser database account has been granted all + 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 9bf9a8462..451f4290b 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" and "index" permission. - This change must be done manually before ZoneMinder will run. See the - installation steps below. +1. Due to the active state of the ZoneMinder project, we now recommend granting + ALL permission to the ZoneMinder mysql account. 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,7 +34,7 @@ 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,index + mysql> grant all on zm.* to 'zmuser'@localhost identified by 'zmpass'; mysql> exit; mysqladmin -u root -p reload @@ -47,6 +47,11 @@ New installs Change ZM_DB_USER and ZM_DB_PASS to the values you created in the previous step. + Additionally, you must also edit + /usr/share/zoneminder/www/api/app/Config/database.php in a similar manner. + Scroll down and change login and password to the values you created in the + previous step. + 4. Edit /etc/php.ini, uncomment the date.timezone line, and add your local timezone. PHP will complain loudly if this is not set, or if it is set incorrectly, and these complaints will show up in the zoneminder logging @@ -96,12 +101,16 @@ Upgrades Compare /etc/zm/zm.conf to /etc/zm/zm.conf.rpmnew. Verify that zm.conf contains any new config settings that may be in zm.conf.rpmnew. + Additionally, you must also edit + /usr/share/zoneminder/www/api/app/Config/database.php in a similar manner. + Scroll down and change login and password to the values you used + previsouly. + 2. Verify permissions of the zmuser account. 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, create, and index permission - to the ZoneMinder database: + have increased. Verify the zmuser database account has been granted all + permission to the ZoneMinder database: mysql -u root -p mysql> show grants for zmuser@localhost; From cbfdc5d88d49f8dd0d9b9f25fc009b964de041d6 Mon Sep 17 00:00:00 2001 From: Andy Bauer Date: Sat, 21 Nov 2015 15:23:13 -0600 Subject: [PATCH 12/49] rpm packaging updates --- CMakeLists.txt | 8 +- .../fedora/{ => archive}/zoneminder.f21.spec | 0 distros/fedora/zoneminder.f23.spec | 412 ++++++++++++++++++ 3 files changed, 416 insertions(+), 4 deletions(-) rename distros/fedora/{ => archive}/zoneminder.f21.spec (100%) create mode 100644 distros/fedora/zoneminder.f23.spec diff --git a/CMakeLists.txt b/CMakeLists.txt index c7be1ceec..cf9337809 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -144,7 +144,7 @@ set(ZM_TARGET_DISTRO "" CACHE STRING "Build ZoneMinder for a specific distribution. Currently, valid names are: f21, f22, el6, el7, OS13") # Reassign some variables if a target distro has been specified -if((ZM_TARGET_DISTRO STREQUAL "f21") OR (ZM_TARGET_DISTRO STREQUAL "f22")) +if((ZM_TARGET_DISTRO STREQUAL "f22") OR (ZM_TARGET_DISTRO STREQUAL "f23")) set(ZM_RUNDIR "/var/run/zoneminder") set(ZM_SOCKDIR "/var/lib/zoneminder/sock") set(ZM_TMPDIR "/var/lib/zoneminder/temp") @@ -176,7 +176,7 @@ elseif(ZM_TARGET_DISTRO STREQUAL "OS13") set(ZM_WEB_GROUP "www") set(ZM_WEBDIR "/srv/www/htdocs/zoneminder") set(ZM_CGIDIR "/srv/www/cgi-bin") -endif((ZM_TARGET_DISTRO STREQUAL "f21") OR (ZM_TARGET_DISTRO STREQUAL "f22")) +endif((ZM_TARGET_DISTRO STREQUAL "f22") OR (ZM_TARGET_DISTRO STREQUAL "f23")) # Required for certain checks to work set(CMAKE_EXTRA_INCLUDE_FILES @@ -691,13 +691,13 @@ if(ZM_ONVIF) endif(ZM_ONVIF) # Process distro subdirectories -if((ZM_TARGET_DISTRO STREQUAL "f21") OR (ZM_TARGET_DISTRO STREQUAL "f22")) +if((ZM_TARGET_DISTRO STREQUAL "f22") OR (ZM_TARGET_DISTRO STREQUAL "f23")) add_subdirectory(distros/fedora) elseif((ZM_TARGET_DISTRO STREQUAL "el6") OR (ZM_TARGET_DISTRO STREQUAL "el7")) add_subdirectory(distros/redhat) elseif(ZM_TARGET_DISTRO STREQUAL "OS13") add_subdirectory(distros/opensuse) -endif((ZM_TARGET_DISTRO STREQUAL "f21") OR (ZM_TARGET_DISTRO STREQUAL "f22")) +endif((ZM_TARGET_DISTRO STREQUAL "f22") OR (ZM_TARGET_DISTRO STREQUAL "f23")) # Print optional libraries detection status message(STATUS "Optional libraries found:${optlibsfound}") diff --git a/distros/fedora/zoneminder.f21.spec b/distros/fedora/archive/zoneminder.f21.spec similarity index 100% rename from distros/fedora/zoneminder.f21.spec rename to distros/fedora/archive/zoneminder.f21.spec diff --git a/distros/fedora/zoneminder.f23.spec b/distros/fedora/zoneminder.f23.spec new file mode 100644 index 000000000..97f0e73ac --- /dev/null +++ b/distros/fedora/zoneminder.f23.spec @@ -0,0 +1,412 @@ +%define zmuid $(id -un) +%define zmgid $(id -gn) +%define zmuid_final apache +%define zmgid_final apache + +%global _hardened_build 1 + +### Delete the lines below to build with ffmpeg and/or x10 +%define _without_ffmpeg 1 +%define _without_x10 1 + +Name: zoneminder +Version: 1.29.0 +Release: 1%{?dist} +Summary: A camera monitoring and analysis tool +Group: System Environment/Daemons +# jscalendar is LGPL (any version): http://www.dynarch.com/projects/calendar/ +# Mootools is inder the MIT license: http://mootools.net/ +License: GPLv2+ and LGPLv2+ and MIT +URL: http://www.zoneminder.com/ + +#Source: https://github.com/ZoneMinder/ZoneMinder/archive/v%{version}.tar.gz +Source: ZoneMinder-%{version}.tar.gz + +BuildRequires: cmake gnutls-devel systemd-units bzip2-devel +BuildRequires: mariadb-devel pcre-devel libjpeg-turbo-devel +BuildRequires: perl(Archive::Tar) perl(Archive::Zip) perl-podlators +BuildRequires: perl(Date::Manip) perl(DBD::mysql) +BuildRequires: perl(ExtUtils::MakeMaker) perl(LWP::UserAgent) +BuildRequires: perl(MIME::Entity) perl(MIME::Lite) +BuildRequires: perl(PHP::Serialization) perl(Sys::Mmap) +BuildRequires: perl(Time::HiRes) perl(Net::SFTP::Foreign) +BuildRequires: perl(Expect) perl(Sys::Syslog) +BuildRequires: gcc gcc-c++ vlc-devel libcurl-devel libv4l-devel +%{!?_without_ffmpeg:BuildRequires: ffmpeg-devel} +%{!?_without_x10:BuildRequires: perl(X10::ActiveHome) perl(Astro::SunTime)} +# cmake needs the following installed at build time due to the way it auto-detects certain parameters +BuildRequires: httpd polkit-devel +%{!?_without_ffmpeg:BuildRequires: ffmpeg} + +Requires: httpd php php-gd php-mysql cambozola polkit net-tools psmisc +Requires: libjpeg-turbo vlc-core libcurl +Requires: perl(:MODULE_COMPAT_%(eval "`%{__perl} -V:version`"; echo $version)) +Requires: perl(DBD::mysql) perl(Archive::Tar) perl(Archive::Zip) +Requires: perl(MIME::Entity) perl(MIME::Lite) perl(Net::SMTP) perl(Net::FTP) +Requires: perl(LWP::Protocol::https) +%{!?_without_ffmpeg:Requires: ffmpeg} + +Requires(post): systemd-units systemd-sysv +Requires(post): /usr/bin/gpasswd +Requires(post): /usr/bin/less +Requires(preun): systemd-units +Requires(postun): systemd-units + +%description +ZoneMinder is a set of applications which is intended to provide a complete +solution allowing you to capture, analyse, record and monitor any cameras you +have attached to a Linux based machine. It is designed to run on kernels which +support the Video For Linux (V4L) interface and has been tested with cameras +attached to BTTV cards, various USB cameras and IP network cameras. It is +designed to support as many cameras as you can attach to your computer without +too much degradation of performance. + +%prep +%setup -q -n ZoneMinder-%{version} + +# Change the following default values +./utils/zmeditconfigdata.sh ZM_PATH_ZMS /cgi-bin/zm/nph-zms +./utils/zmeditconfigdata.sh ZM_OPT_CAMBOZOLA yes +./utils/zmeditconfigdata.sh ZM_PATH_SWAP /dev/shm +./utils/zmeditconfigdata.sh ZM_UPLOAD_FTP_LOC_DIR /var/spool/zoneminder-upload +./utils/zmeditconfigdata.sh ZM_OPT_CONTROL yes +./utils/zmeditconfigdata.sh ZM_CHECK_FOR_UPDATES no +./utils/zmeditconfigdata.sh ZM_DYN_SHOW_DONATE_REMINDER no + +%build +%cmake \ + -DZM_TARGET_DISTRO="f23" \ +%{?_without_ffmpeg:-DZM_NO_FFMPEG=ON} \ +%{?_without_x10:-DZM_NO_X10=ON} \ + . + +make %{?_smp_mflags} + +%install +export DESTDIR=%{buildroot} +make install + +%post +if [ $1 -eq 1 ] ; then + # Initial installation + /bin/systemctl daemon-reload >/dev/null 2>&1 || : +fi + +# Allow zoneminder access to local video sources, serial ports, and x10 +/usr/bin/gpasswd -a %{zmuid_final} video +/usr/bin/gpasswd -a %{zmuid_final} dialout + +# Upgrade from a previous version of zoneminder +if [ $1 -eq 2 ] ; then + # Freshen the database + /usr/bin/zmupdate.pl -f + + # We can't run this automatically when new sql account permissions need to + # be manually added first + # Run zmupdate non-interactively + #/usr/bin/zmupdate.pl --nointeractive +fi + +# Warn the end user to read the README file +echo -e "\nVERY IMPORTANT: Before starting ZoneMinder, read README.Fedora to finish the\ninstallation or upgrade!\n" +echo -e "\nThe README file is located here: %{_docdir}/%{name}\n" + +%preun +if [ $1 -eq 0 ] ; then + # Package removal, not upgrade + /bin/systemctl --no-reload disable zoneminder.service > /dev/null 2>&1 || : + /bin/systemctl stop zoneminder.service > /dev/null 2>&1 || : +fi + +%postun +/bin/systemctl daemon-reload >/dev/null 2>&1 || : +if [ $1 -ge 1 ] ; then + # Package upgrade, not uninstall + /bin/systemctl try-restart zoneminder.service >/dev/null 2>&1 || : +fi + +%triggerun -- zoneminder < 1.25.0-4 +# Save the current service runlevel info +# User must manually run systemd-sysv-convert --apply zoneminder +# to migrate them to systemd targets +/usr/bin/systemd-sysv-convert --save zoneminder >/dev/null 2>&1 ||: + +# Run these because the SysV package being removed won't do them +/sbin/chkconfig --del zoneminder >/dev/null 2>&1 || : +/bin/systemctl try-restart zoneminder.service >/dev/null 2>&1 || : + + +%files +%defattr(-,root,root,-) +%doc AUTHORS COPYING README.md distros/fedora/README.Fedora distros/fedora/jscalendar-doc +%config %attr(640,root,%{zmgid_final}) /etc/zm/zm.conf +%config(noreplace) %attr(644,root,root) /etc/httpd/conf.d/zoneminder.conf +%config(noreplace) /etc/tmpfiles.d/zoneminder.conf +%config(noreplace) /etc/logrotate.d/zoneminder + +%{_unitdir}/zoneminder.service + +%{_bindir}/zma +%{_bindir}/zmaudit.pl +%{_bindir}/zmc +%{_bindir}/zmcontrol.pl +%{_bindir}/zmdc.pl +%{_bindir}/zmf +%{_bindir}/zmfilter.pl +%{_bindir}/zmpkg.pl +%{_bindir}/zmstreamer +%{_bindir}/zmtrack.pl +%{_bindir}/zmtrigger.pl +%{_bindir}/zmu +%{_bindir}/zmupdate.pl +%{_bindir}/zmvideo.pl +%{_bindir}/zmwatch.pl +%{_bindir}/zmcamtool.pl +%{_bindir}/zmsystemctl.pl +%{!?_without_x10:%{_bindir}/zmx10.pl} + +%{perl_vendorlib}/ZoneMinder* +%{_mandir}/man*/* +%dir %{_libexecdir}/zoneminder +%{_libexecdir}/zoneminder/cgi-bin +%dir %{_datadir}/zoneminder +%{_datadir}/zoneminder/db +%{_datadir}/zoneminder/www + +%{_datadir}/polkit-1/actions/com.zoneminder.systemctl.policy +%{_datadir}/polkit-1/rules.d/com.zoneminder.systemctl.rules + +%dir %attr(755,%{zmuid_final},%{zmgid_final}) /var/lib/zoneminder +%dir %attr(755,%{zmuid_final},%{zmgid_final}) /var/lib/zoneminder/events +%dir %attr(755,%{zmuid_final},%{zmgid_final}) /var/lib/zoneminder/images +%dir %attr(755,%{zmuid_final},%{zmgid_final}) /var/lib/zoneminder/sock +%dir %attr(755,%{zmuid_final},%{zmgid_final}) /var/lib/zoneminder/swap +%dir %attr(755,%{zmuid_final},%{zmgid_final}) /var/lib/zoneminder/temp +%dir %attr(755,%{zmuid_final},%{zmgid_final}) /var/log/zoneminder +%dir %attr(755,%{zmuid_final},%{zmgid_final}) /var/spool/zoneminder-upload +%dir %attr(755,%{zmuid_final},%{zmgid_final}) /run/zoneminder + + +%changelog +* Sat Nov 21 2015 Andrew Bauer - 1.29.0 +- Bump version for 1.29.0 release on Fedora 23. + +* Sat Feb 14 2015 Andrew Bauer - 1.28.1 +- Bump version for 1.28.1 release on Fedora 21. + +* Sun Oct 5 2014 Andrew Bauer - 1.28.0 +- Bump version for 1.28.0 release. + +* Fri Mar 14 2014 Andrew Bauer - 1.27 +- Tweak build requirements for cmake + +* Sat Feb 01 2014 Andrew Bauer - 1.27 +- Add zmcamtool.pl. Bump version for 1.27 release. + +* Mon Dec 16 2013 Andrew Bauer - 1.26.5 +- This is a bug fixe release +- RTSP fixes, cmake enhancements, couple other misc fixes + +* Mon Oct 07 2013 Andrew Bauer - 1.26.4 +- Initial cmake build. + +* Sat Oct 05 2013 Andrew Bauer - 1.26.4 +- Fedora specific path changes have been moved to zoneminder-1.26.0-defaults.patch +- All files are now part of the zoneminder source tree. Update specfile accordingly. + +* Sat Sep 21 2013 Andrew Bauer - 1.26.3 +- Initial rebuild for ZoneMinder 1.26.3 release. + +* Fri Feb 15 2013 Fedora Release Engineering - 1.25.0-13 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild + +* Mon Jan 21 2013 Adam Tkac - 1.25.0-12 +- rebuild due to "jpeg8-ABI" feature drop + +* Mon Jan 7 2013 Remi Collet - 1.25.0-11 +- fix configuration file for httpd 2.4, #871502 + +* Fri Dec 21 2012 Adam Tkac - 1.25.0-10 +- rebuild against new libjpeg + +* Thu Aug 09 2012 Jason L Tibbitts III - 1.25.0-9 +- Add patch to work around v4l2 api breakage in 3.5 kernel. + +* Sun Jul 22 2012 Fedora Release Engineering - 1.25.0-8 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Sat Jun 23 2012 Petr Pisar - 1.25.0-7 +- Perl 5.16 rebuild + +* Wed Mar 21 2012 Jason L Tibbitts III - 1.25.0-6 +- Fix stupid thinko in sql modifications. + +* Sat Feb 25 2012 Jason L Tibbitts III - 1.25.0-5 +- Clean up macro usage. + +* Sat Feb 25 2012 Jason L Tibbitts III - 1.25.0-4 +- Convert to systemd. +- Add tmpfiles.d configuration since the initscript isn't around to create + /run/zoneminder. +- Remove some pointless executable permissions. +- Add logrotate file. + +* Wed Feb 22 2012 Jason L Tibbitts III - 1.25.0-3 +- Update README.Fedora to reference systemctl and mention timezone info in + php.ini. +- Add proper default for EYEZM_LOG_TO_FILE. + + +* Thu Feb 09 2012 Jason L Tibbitts III - 1.25.0-2 +- Rebuild for new pcre. + +* Thu Jan 19 2012 Jason L Tibbitts III - 1.25.0-1 +- Update to 1.25.0 +- Fix gcc4.7 build problems. +- Drop gcc4.4 build fixes; for whatever reason they now break the build. +- Clean up old patches. +- Force setting of ZM_TMPDIR and ZM_RUNDIR. + +* Sat Jan 14 2012 Fedora Release Engineering - 1.24.4-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild + +* Thu Sep 15 2011 Jason L Tibbitts III - 1.24.4-3 +- Re-add the dist-tag that somehow got lost. + +* Thu Sep 15 2011 Jason L Tibbitts III - 1.24.4-2 +- Add patch for bug 711780 - fix syntax issue in Mapped.pm. +- Undo that patch, and undo another which was the cause of the whole mess. +- Fix up other patches so ZM_PATH_BUILD is both defined and useful. +- Make sure database creation mods actually take. +- Update Fedora-specific docs with some additional info. +- Use bundled mootools (javascript, so no guideline violation). +- Update download location. +- Update the gcrypt patch to actually work. +- Upstream changed the tarball without changing the version to patch a + vulnerability, so redownload. + +* Sun Aug 14 2011 Jason L Tibbitts III - 1.24.4-1 +- Initial attempt to upgrade to 1.24.4. +- Add patch from BZ 460310 to build against libgcrypt instead of requiring the + gnutls openssl libs. + +* Thu Jul 21 2011 Petr Sabata - 1.24.3-7.20110324svn3310 +- Perl mass rebuild + +* Wed Jul 20 2011 Petr Sabata - 1.24.3-6.20110324svn3310 +- Perl mass rebuild + +* Mon May 09 2011 Jason L Tibbitts III - 1.24.3-5.20110324svn3310 +- Bump for gnutls update. + +* Thu Mar 24 2011 Jason L Tibbitts III - 1.24.3-4.20110324svn3310 +- Update to latest 1.24.3 subversion. Turns out that what upstream was calling + 1.24.3 is really just an occasionally updated devel snapshot. +- Rebase various patches. + +* Wed Mar 23 2011 Dan Horák - 1.24.3-3 +- rebuilt for mysql 5.5.10 (soname bump in libmysqlclient) + +* Tue Feb 08 2011 Fedora Release Engineering - 1.24.3-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Tue Jan 25 2011 Jason L Tibbitts III - 1.24.3-1 +- Update to latest upstream version. +- Rebase patches. +- Initial incomplete attempt to disable v4l1 support. + +* Fri Jan 21 2011 Jason L Tibbitts III - 1.24.2-6 +- Unbundle cambozola; instead link to the separately pacakged copy. +- Remove BuildRoot:, %%clean and buildroot cleaning in %%install. +- Git rid of mixed space/tab usage by removing all tabs. +- Remove unnecessary Conflicts: line. +- Attempt to force short_open_tag on for the code directories. +- Move default location of sockets, swaps, logfiles and some temporary files to + make more sense and allow things to work better with a future selinux policy. +- Fix errors in README.Fedora. + +* Wed Jun 02 2010 Marcela Maslanova - 1.24.2-5 +- Mass rebuild with perl-5.12.0 + +* Fri Dec 4 2009 Stepan Kasal - 1.24.2-4 +- rebuild against perl 5.10.1 +- use Perl vendorarch and archlib variables correctly + +* Mon Jul 27 2009 Fedora Release Engineering - 1.24.2-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild + +* Wed Jul 22 2009 Jason L Tibbitts III - 1.24.2-2 +- Bump release since 1.24.2-1 was mistakenly tagged a few months ago. + +* Wed Jul 22 2009 Jason L Tibbitts III - 1.24.2-1 +- Initial update to 1.24.2. +- Rebase patches. +- Update mootools download location. +- Update to mootools 1.2.3. +- Add additional dependencies for some optional features. + +* Sat Apr 11 2009 Martin Ebourne - 1.24.1-3 +- Remove unused Sys::Mmap perl dependency RPM is finding + +* Sat Apr 11 2009 Martin Ebourne - 1.24.1-2 +- Update gcc44 patch to disable -frepo, seems to be broken with gcc44 +- Added noffmpeg patch to make building outside mock easier + +* Sat Mar 21 2009 Martin Ebourne - 1.24.1-1 +- Patch for gcc 4.4 compilation errors +- Upgrade to 1.24.1 + +* Wed Feb 25 2009 Fedora Release Engineering - 1.23.3-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild + +* Sat Jan 24 2009 Caolán McNamara - 1.23.3-3 +- rebuild for dependencies + +* Mon Dec 15 2008 Martin Ebourne - 1.23.3-2 +- Fix permissions on zm.conf + +* Fri Jul 11 2008 Jason L Tibbitts III - 1.23.3-1 +- Initial attempt at packaging 1.23. + +* Tue Jul 1 2008 Martin Ebourne - 1.22.3-15 +- Add perl module compat dependency, bz #453590 + +* Tue May 6 2008 Martin Ebourne - 1.22.3-14 +- Remove default runlevel, bz #441315 + +* Mon Apr 28 2008 Jason L Tibbitts III - 1.22.3-13 +- Backport patch for CVE-2008-1381 from 1.23.3 to 1.22.3. + +* Tue Feb 19 2008 Fedora Release Engineering - 1.22.3-12 +- Autorebuild for GCC 4.3 + +* Thu Jan 3 2008 Martin Ebourne - 1.22.3-11 +- Fix compilation on gcc 4.3 + +* Thu Dec 6 2007 Martin Ebourne - 1.22.3-10 +- Rebuild for new openssl + +* Thu Aug 2 2007 Martin Ebourne - 1.22.3-8 +- Fix licence tag + +* Thu Jul 12 2007 Martin Ebourne - 1.22.3-7 +- Fixes from testing by Jitz including missing dependencies and database creation + +* Sat Jun 30 2007 Martin Ebourne - 1.22.3-6 +- Disable crashtrace on ppc + +* Sat Jun 30 2007 Martin Ebourne - 1.22.3-5 +- Fix uid for directories in /var/lib/zoneminder + +* Tue Jun 26 2007 Martin Ebourne - 1.22.3-4 +- Added perl Archive::Tar dependency +- Disabled web interface due to lack of access control on the event images + +* Sun Jun 10 2007 Martin Ebourne - 1.22.3-3 +- Changes recommended in review by Jason Tibbitts + +* Mon Apr 2 2007 Martin Ebourne - 1.22.3-2 +- Standardised on package name of zoneminder + +* Thu Dec 28 2006 Martin Ebourne - 1.22.3-1 +- First version. Uses some parts from zm-1.20.1 by Corey DeLasaux and Serg Oskin From dabe32a593ae30b1df94ffb94ec3ad19b927c012 Mon Sep 17 00:00:00 2001 From: Andy Bauer Date: Sat, 21 Nov 2015 18:21:18 -0600 Subject: [PATCH 13/49] Error on missing submodules --- CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index cf9337809..193b484b4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,6 +8,12 @@ set(zoneminder_VERSION "1.28.109") # make API version a minor of ZM version set(zoneminder_API_VERSION "${zoneminder_VERSION}.1") +# Make sure the submodules are there +if( NOT EXISTS "${CMAKE_SOURCE_DIR}/web/api/app/Plugin/Crud/.git" ) +message( SEND_ERROR "The git submodules are not available. Please run +git submodule update --init --recursive") +endif( NOT EXISTS "${CMAKE_SOURCE_DIR}/web/api/app/Plugin/Crud/.git" ) + # CMake does not allow out-of-source build if CMakeCache.exists # in the source folder. Abort and notify the user if( From 91f700a7cd33f0fb4fb22592f917d599a32c2a4f Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Mon, 23 Nov 2015 10:10:56 -0600 Subject: [PATCH 14/49] Update CMakeLists.txt --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cf9337809..7d83fec8c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -141,7 +141,7 @@ set(ZM_PERL_SEARCH_PATH "" CACHE PATH where ZM_PERL_MM_PARMS has been modified such that ZoneMinder's Perl modules are installed outside Perl's default search path.") set(ZM_TARGET_DISTRO "" CACHE STRING - "Build ZoneMinder for a specific distribution. Currently, valid names are: f21, f22, el6, el7, OS13") + "Build ZoneMinder for a specific distribution. Currently, valid names are: f22, f23, el6, el7, OS13") # Reassign some variables if a target distro has been specified if((ZM_TARGET_DISTRO STREQUAL "f22") OR (ZM_TARGET_DISTRO STREQUAL "f23")) From c2a7e0c58728dfda1cd1dddc989c1f48253550f3 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 25 Nov 2015 15:39:46 -0500 Subject: [PATCH 15/49] fix size of monitor popup in flat skin --- web/skins/classic/js/dark.js | 2 +- web/skins/classic/js/flat.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/web/skins/classic/js/dark.js b/web/skins/classic/js/dark.js index 8868c8ce7..06a940482 100644 --- a/web/skins/classic/js/dark.js +++ b/web/skins/classic/js/dark.js @@ -48,7 +48,7 @@ var popupSizes = { 'log': { 'width': 1080, 'height': 720 }, 'login': { 'width': 720, 'height': 480 }, 'logout': { 'width': 260, 'height': 100 }, - 'monitor': { 'width': 450, 'height': 440 }, + 'monitor': { 'width': 525, 'height': 700 }, 'monitorpreset':{ 'width': 440, 'height': 200 }, 'monitorprobe': { 'width': 500, 'height': 240 }, 'monitorselect':{ 'width': 160, 'height': 200 }, diff --git a/web/skins/classic/js/flat.js b/web/skins/classic/js/flat.js index 7a34247a0..3b1882250 100644 --- a/web/skins/classic/js/flat.js +++ b/web/skins/classic/js/flat.js @@ -48,7 +48,7 @@ var popupSizes = { 'log': { 'width': 1080, 'height': 720 }, 'login': { 'width': 720, 'height': 480 }, 'logout': { 'width': 260, 'height': 100 }, - 'monitor': { 'width': 450, 'height': 440 }, + 'monitor': { 'width': 525, 'height': 700 }, 'monitorpreset':{ 'width': 440, 'height': 200 }, 'monitorprobe': { 'width': 500, 'height': 240 }, 'monitorselect':{ 'width': 160, 'height': 200 }, From 5390605797d2ec8db4c6eb81752cd6e6c1dc2fac Mon Sep 17 00:00:00 2001 From: SteveGilvarry Date: Thu, 3 Dec 2015 10:23:19 +1100 Subject: [PATCH 16/49] Add v to front of version string in version->parse to force conversion of decimal to dotted decimal versions, and change from ge to > to prevent reapplying current version --- scripts/zmupdate.pl.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/zmupdate.pl.in b/scripts/zmupdate.pl.in index e9f4a2dc2..969c72cb6 100644 --- a/scripts/zmupdate.pl.in +++ b/scripts/zmupdate.pl.in @@ -1044,7 +1044,7 @@ if ( $version ) foreach my $patch ( @files ) { my ( $v ) = $patch =~ /^zm_update\-([\d\.]+)\.sql$/; #PP make sure we use version compare - if ( version->parse($v) ge version->parse($version) ) { + if ( version->parse('v' . $v) > version->parse('v' . $version) ) { print( "Upgrading DB to $v from $version\n" ); patchDB( $dbh, $v ); if ( $dbh->errstr() ) { From 1957c5672f8286333e0a58b11f3721c296a95ed4 Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Fri, 4 Dec 2015 12:03:18 -0600 Subject: [PATCH 17/49] Check for the presence of CrudControllerTrait.php instead of .git --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 63425f4b3..b07156919 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,10 +9,10 @@ set(zoneminder_VERSION "1.28.109") set(zoneminder_API_VERSION "${zoneminder_VERSION}.1") # Make sure the submodules are there -if( NOT EXISTS "${CMAKE_SOURCE_DIR}/web/api/app/Plugin/Crud/.git" ) +if( NOT EXISTS "${CMAKE_SOURCE_DIR}/web/api/app/Plugin/Crud/Lib/CrudControllerTrait.php" ) message( SEND_ERROR "The git submodules are not available. Please run git submodule update --init --recursive") -endif( NOT EXISTS "${CMAKE_SOURCE_DIR}/web/api/app/Plugin/Crud/.git" ) +endif( NOT EXISTS "${CMAKE_SOURCE_DIR}/web/api/app/Plugin/Crud/Lib/CrudControllerTrait.php" ) # CMake does not allow out-of-source build if CMakeCache.exists # in the source folder. Abort and notify the user From e637915823ab643216f44759a6cd495a05042d15 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 4 Dec 2015 15:39:37 -0500 Subject: [PATCH 18/49] add a lock around the socket creating/deleting. --- src/zm_stream.cpp | 22 ++++++++++++++++++++++ src/zm_stream.h | 3 +++ 2 files changed, 25 insertions(+) diff --git a/src/zm_stream.cpp b/src/zm_stream.cpp index 30a420bb1..4e9a4da10 100644 --- a/src/zm_stream.cpp +++ b/src/zm_stream.cpp @@ -286,6 +286,23 @@ void StreamBase::openComms() { if ( connkey > 0 ) { + + snprintf( sock_path_lock, sizeof(sock_path_lock), "%s/zms-%06d.lock", config.path_socks, connkey); + + lock_fd = open(sock_path_lock, O_CREAT|O_WRONLY, S_IRUSR | S_IWUSR); + if (lock_fd <= 0 || flock(lock_fd, LOCK_SH|LOCK_NB) != 0) + { + Error("Unable to lock sock lock file %s: %s", sock_path_lock, strerror(errno) ); + + close(lock_fd); + lock_fd = 0; + } + else + { + Debug( 1, "We have obtained a read lock on %s fd: %d", sock_path_lock, lock_fd); + } + + sd = socket( AF_UNIX, SOCK_DGRAM, 0 ); if ( sd < 0 ) { @@ -321,6 +338,11 @@ void StreamBase::closeComms() { unlink( loc_sock_path ); } + if (lock_fd > 0) + { + loc_sock_path[0] = '\0'; + close(lock_fd); //close it rather than unlock it incase it got deleted. + } } } diff --git a/src/zm_stream.h b/src/zm_stream.h index ef442ab8e..9936688a8 100644 --- a/src/zm_stream.h +++ b/src/zm_stream.h @@ -78,6 +78,8 @@ protected: struct sockaddr_un loc_addr; char rem_sock_path[PATH_MAX]; struct sockaddr_un rem_addr; + char sock_path_lock[PATH_MAX]; + int lock_fd; protected: bool paused; @@ -127,6 +129,7 @@ public: connkey = 0; sd = -1; + lock_fd = 0; memset( &loc_sock_path, 0, sizeof(loc_sock_path) ); memset( &loc_addr, 0, sizeof(loc_addr) ); memset( &rem_sock_path, 0, sizeof(rem_sock_path) ); From be36301779f38dc1757ebd6c832634e15b6fc8d8 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 4 Dec 2015 16:35:27 -0500 Subject: [PATCH 19/49] use exclusive lock, add includes --- src/zm_stream.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/zm_stream.cpp b/src/zm_stream.cpp index 4e9a4da10..f50671338 100644 --- a/src/zm_stream.cpp +++ b/src/zm_stream.cpp @@ -18,6 +18,10 @@ // #include +#include +#include +#include +#include #include "zm.h" #include "zm_mpeg.h" @@ -290,7 +294,7 @@ void StreamBase::openComms() snprintf( sock_path_lock, sizeof(sock_path_lock), "%s/zms-%06d.lock", config.path_socks, connkey); lock_fd = open(sock_path_lock, O_CREAT|O_WRONLY, S_IRUSR | S_IWUSR); - if (lock_fd <= 0 || flock(lock_fd, LOCK_SH|LOCK_NB) != 0) + if (lock_fd <= 0 || flock(lock_fd, LOCK_EX) != 0) { Error("Unable to lock sock lock file %s: %s", sock_path_lock, strerror(errno) ); @@ -299,7 +303,7 @@ void StreamBase::openComms() } else { - Debug( 1, "We have obtained a read lock on %s fd: %d", sock_path_lock, lock_fd); + Debug( 1, "We have obtained a lock on %s fd: %d", sock_path_lock, lock_fd); } From 0fc68e2e91de480ddeab92aee23a17c142fb5b0d Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 4 Dec 2015 16:38:24 -0500 Subject: [PATCH 20/49] delete lock when we are done with it --- src/zm_stream.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zm_stream.cpp b/src/zm_stream.cpp index f50671338..c66638759 100644 --- a/src/zm_stream.cpp +++ b/src/zm_stream.cpp @@ -344,8 +344,8 @@ void StreamBase::closeComms() } if (lock_fd > 0) { - loc_sock_path[0] = '\0'; close(lock_fd); //close it rather than unlock it incase it got deleted. + unlink(sock_path_lock); } } } From d6b2e1959f8fa3941e1c2e50cb075ea032658c25 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 8 Dec 2015 08:40:44 -0500 Subject: [PATCH 21/49] add a 1/8th scale option, which is useful for 1920x1080 streams --- web/skins/classic/includes/config.php | 1 + 1 file changed, 1 insertion(+) diff --git a/web/skins/classic/includes/config.php b/web/skins/classic/includes/config.php index d586f90c8..459bbc587 100644 --- a/web/skins/classic/includes/config.php +++ b/web/skins/classic/includes/config.php @@ -40,6 +40,7 @@ $scales = array( "50" => "1/2x", "33" => "1/3x", "25" => "1/4x", + "12.5" => "1/8x", ); $bwArray = array( From 7c298c58ed0aab83b860ac2c768d125f3c2a3bbf Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 8 Dec 2015 16:20:38 -0500 Subject: [PATCH 22/49] Add code to detect the change in REALM from older to newer firmware --- .../lib/ZoneMinder/Control/TVIP862.pm | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Control/TVIP862.pm b/scripts/ZoneMinder/lib/ZoneMinder/Control/TVIP862.pm index 050e2bb75..d7c669583 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/Control/TVIP862.pm +++ b/scripts/ZoneMinder/lib/ZoneMinder/Control/TVIP862.pm @@ -138,6 +138,30 @@ sub open ."'" ); $self->{ua}->credentials($ADDRESS,$REALM,$USERNAME,$PASSWORD); + + # Detect REALM + my $req = HTTP::Request->new( GET=>"http://".$ADDRESS."/cgi/ptdc.cgi" ); + my $res = $self->{ua}->request($req); + + if ( ! $res->is_success ) { + Debug("Need newer REALM"); + if ( $res->status_line() eq '401 Unauthorized' ) { + my $headers = $res->headers(); + foreach my $k ( keys %$headers ) { + Debug("Initial Header $k => $$headers{$k}"); + } # end foreach + if ( $$headers{'www-authenticate'} ) { + my ( $auth, $tokens ) = $$headers{'www-authenticate'} =~ /^(\w+)\s+(.*)$/; + if ( $tokens =~ /\w+="([^"]+)"/i ) { + $REALM = $1; + Debug( "Changing REALM to $REALM" ); + $self->{ua}->credentials($ADDRESS,$REALM,$USERNAME,$PASSWORD); + } # end if + } else { + Debug("No headers line"); + } # end if headers + } # end if $res->status_line() eq '401 Unauthorized' + } # end if ! $res->is_success } sub close From 53dec9f26dca517a2d19dec286628c67c88344d4 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 9 Dec 2015 10:43:23 -0500 Subject: [PATCH 23/49] check for setting of __REQUEST['object'] to silence php NOTICE --- web/includes/actions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/includes/actions.php b/web/includes/actions.php index b357d3222..6d94bafb2 100644 --- a/web/includes/actions.php +++ b/web/includes/actions.php @@ -766,7 +766,7 @@ if ( !empty($action) ) // System edit actions if ( canEdit( 'System' ) ) { - if ( $_REQUEST['object'] == 'server' ) { + if ( isset( $_REQUEST['object'] ) and ( $_REQUEST['object'] == 'server' ) ) { if ( $action == "save" ) { if ( !empty($_REQUEST['id']) ) From af76d19646f4334164a530b239ddd17a91349070 Mon Sep 17 00:00:00 2001 From: SteveGilvarry Date: Fri, 18 Dec 2015 01:47:10 +1100 Subject: [PATCH 24/49] Add a constrained namespace implementation around Authenticator class to prevent conflict with libvlc live555. --- src/zm_remote_camera.cpp | 2 +- src/zm_remote_camera.h | 2 +- src/zm_remote_camera_http.cpp | 4 ++-- src/zm_rtsp.cpp | 4 ++-- src/zm_rtsp.h | 2 +- src/zm_rtsp_auth.cpp | 4 ++++ src/zm_rtsp_auth.h | 4 ++++ 7 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/zm_remote_camera.cpp b/src/zm_remote_camera.cpp index 608311649..8ac4a51ba 100644 --- a/src/zm_remote_camera.cpp +++ b/src/zm_remote_camera.cpp @@ -71,7 +71,7 @@ void RemoteCamera::Initialise() } mNeedAuth = false; - mAuthenticator = new Authenticator(username,password); + mAuthenticator = new zm::Authenticator(username,password); struct addrinfo hints; memset(&hints, 0, sizeof(hints)); diff --git a/src/zm_remote_camera.h b/src/zm_remote_camera.h index 44c00bf65..7e3ae79a8 100644 --- a/src/zm_remote_camera.h +++ b/src/zm_remote_camera.h @@ -50,7 +50,7 @@ protected: // fill required fields and set needAuth // subsequent requests can set the required authentication header. bool mNeedAuth; - Authenticator* mAuthenticator; + zm::Authenticator* mAuthenticator; protected: struct addrinfo *hp; diff --git a/src/zm_remote_camera_http.cpp b/src/zm_remote_camera_http.cpp index 44004564f..440c24e05 100644 --- a/src/zm_remote_camera_http.cpp +++ b/src/zm_remote_camera_http.cpp @@ -306,7 +306,7 @@ int RemoteCameraHttp::GetResponse() std::string Header = header; mAuthenticator->checkAuthResponse(Header); - if ( mAuthenticator->auth_method() == AUTH_DIGEST ) { + if ( mAuthenticator->auth_method() == zm::AUTH_DIGEST ) { Debug( 2, "Need Digest Authentication" ); request = stringtf( "GET %s HTTP/%s\r\n", path.c_str(), config.http_version ); request += stringtf( "User-Agent: %s/%s\r\n", config.http_ua, ZM_VERSION ); @@ -750,7 +750,7 @@ Debug(3, "Need more data buffer %d < content length %d", buffer.size(), content_ Debug(2, "Checking for digest auth in %s", authenticate_header ); mAuthenticator->checkAuthResponse(Header); - if ( mAuthenticator->auth_method() == AUTH_DIGEST ) { + if ( mAuthenticator->auth_method() == zm::AUTH_DIGEST ) { Debug( 2, "Need Digest Authentication" ); request = stringtf( "GET %s HTTP/%s\r\n", path.c_str(), config.http_version ); request += stringtf( "User-Agent: %s/%s\r\n", config.http_ua, ZM_VERSION ); diff --git a/src/zm_rtsp.cpp b/src/zm_rtsp.cpp index 0dbcb7329..7ac80e9b6 100644 --- a/src/zm_rtsp.cpp +++ b/src/zm_rtsp.cpp @@ -203,9 +203,9 @@ RtspThread::RtspThread( int id, RtspMethod method, const std::string &protocol, mNeedAuth = false; StringVector parts = split(auth,":"); if (parts.size() > 1) - mAuthenticator = new Authenticator(parts[0], parts[1]); + mAuthenticator = new zm::Authenticator(parts[0], parts[1]); else - mAuthenticator = new Authenticator(parts[0], ""); + mAuthenticator = new zm::Authenticator(parts[0], ""); } RtspThread::~RtspThread() diff --git a/src/zm_rtsp.h b/src/zm_rtsp.h index acd28e651..192200d0b 100644 --- a/src/zm_rtsp.h +++ b/src/zm_rtsp.h @@ -66,7 +66,7 @@ private: // subsequent requests can set the required authentication header. bool mNeedAuth; int respCode; - Authenticator* mAuthenticator; + zm::Authenticator* mAuthenticator; std::string mHttpSession; ///< Only for RTSP over HTTP sessions diff --git a/src/zm_rtsp_auth.cpp b/src/zm_rtsp_auth.cpp index fd9087afa..10ecf3475 100644 --- a/src/zm_rtsp_auth.cpp +++ b/src/zm_rtsp_auth.cpp @@ -24,6 +24,8 @@ #include #include +namespace zm { + Authenticator::Authenticator(std::string &username, std::string password) { #ifdef HAVE_GCRYPT_H // Special initialisation for libgcrypt @@ -227,3 +229,5 @@ void Authenticator::checkAuthResponse(std::string &response) { Debug( 2, "Didn't find auth line in %s", authLine.c_str()); } } + +} // namespace zm diff --git a/src/zm_rtsp_auth.h b/src/zm_rtsp_auth.h index 23745f9c7..079dec639 100644 --- a/src/zm_rtsp_auth.h +++ b/src/zm_rtsp_auth.h @@ -32,6 +32,8 @@ #include #endif // HAVE_GCRYPT_H || HAVE_LIBCRYPTO +namespace zm { + enum AuthMethod { AUTH_UNDEFINED = 0, AUTH_BASIC = 1, AUTH_DIGEST = 2 }; class Authenticator { public: @@ -62,4 +64,6 @@ private: int nc; }; +} // namespace zm + #endif // ZM_RTSP_AUTH_H From ca45ac23fa412b3b02e8dd601a3e7995b18c2574 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 18 Dec 2015 13:30:42 -0500 Subject: [PATCH 25/49] increase height of group edit window --- web/skins/classic/js/dark.js | 2 +- web/skins/classic/js/flat.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/web/skins/classic/js/dark.js b/web/skins/classic/js/dark.js index 06a940482..b8ab38888 100644 --- a/web/skins/classic/js/dark.js +++ b/web/skins/classic/js/dark.js @@ -42,7 +42,7 @@ var popupSizes = { 'frame': { 'addWidth': 32, 'minWidth': 384, 'addHeight': 100 }, 'frames': { 'width': 500, 'height': 600 }, 'function': { 'width': 300, 'height': 92 }, - 'group': { 'width': 360, 'height': 180 }, + 'group': { 'width': 360, 'height': 300 }, 'groups': { 'width': 440, 'height': 220 }, 'image': { 'addWidth': 48, 'addHeight': 80 }, 'log': { 'width': 1080, 'height': 720 }, diff --git a/web/skins/classic/js/flat.js b/web/skins/classic/js/flat.js index 3b1882250..fc03b91e0 100644 --- a/web/skins/classic/js/flat.js +++ b/web/skins/classic/js/flat.js @@ -42,7 +42,7 @@ var popupSizes = { 'frame': { 'addWidth': 32, 'minWidth': 384, 'addHeight': 100 }, 'frames': { 'width': 500, 'height': 600 }, 'function': { 'width': 300, 'height': 140 }, - 'group': { 'width': 360, 'height': 180 }, + 'group': { 'width': 360, 'height': 300 }, 'groups': { 'width': 440, 'height': 220 }, 'image': { 'addWidth': 48, 'addHeight': 80 }, 'log': { 'width': 1080, 'height': 720 }, From 983d87f69b84e062e9bf6976cef8fe27687a263e Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 18 Dec 2015 13:34:44 -0500 Subject: [PATCH 26/49] increase height and width of groups window to fit buttons in --- web/skins/classic/js/dark.js | 2 +- web/skins/classic/js/flat.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/web/skins/classic/js/dark.js b/web/skins/classic/js/dark.js index b8ab38888..f8867feda 100644 --- a/web/skins/classic/js/dark.js +++ b/web/skins/classic/js/dark.js @@ -43,7 +43,7 @@ var popupSizes = { 'frames': { 'width': 500, 'height': 600 }, 'function': { 'width': 300, 'height': 92 }, 'group': { 'width': 360, 'height': 300 }, - 'groups': { 'width': 440, 'height': 220 }, + 'groups': { 'width': 540, 'height': 420 }, 'image': { 'addWidth': 48, 'addHeight': 80 }, 'log': { 'width': 1080, 'height': 720 }, 'login': { 'width': 720, 'height': 480 }, diff --git a/web/skins/classic/js/flat.js b/web/skins/classic/js/flat.js index fc03b91e0..6d5a89bf7 100644 --- a/web/skins/classic/js/flat.js +++ b/web/skins/classic/js/flat.js @@ -43,7 +43,7 @@ var popupSizes = { 'frames': { 'width': 500, 'height': 600 }, 'function': { 'width': 300, 'height': 140 }, 'group': { 'width': 360, 'height': 300 }, - 'groups': { 'width': 440, 'height': 220 }, + 'groups': { 'width': 540, 'height': 420 }, 'image': { 'addWidth': 48, 'addHeight': 80 }, 'log': { 'width': 1080, 'height': 720 }, 'login': { 'width': 720, 'height': 480 }, From 9e2b1ba3cb9cdf1d1393fb4e340038dfd5beedc8 Mon Sep 17 00:00:00 2001 From: arjunrc Date: Fri, 18 Dec 2015 15:08:40 -0500 Subject: [PATCH 27/49] remove hardcoded version --- docs/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 2d376f03d..1e7f35737 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -51,9 +51,9 @@ copyright = u'2014, https://github.com/ZoneMinder/ZoneMinder/graphs/contributors # built documents. # # The short X.Y version. -version = '1.28.1' +#version = '1.28.1' # The full version, including alpha/beta/rc tags. -release = '1.28.1' +#release = '1.28.1' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 511421bff1f864156fac15255d5449e9a25f2427 Mon Sep 17 00:00:00 2001 From: arjunrc Date: Fri, 18 Dec 2015 15:08:56 -0500 Subject: [PATCH 28/49] rewrite --- docs/installationguide/ubuntu.rst | 540 +++++++++++++++++++++++------- 1 file changed, 428 insertions(+), 112 deletions(-) diff --git a/docs/installationguide/ubuntu.rst b/docs/installationguide/ubuntu.rst index b95d46a89..fa065cb96 100644 --- a/docs/installationguide/ubuntu.rst +++ b/docs/installationguide/ubuntu.rst @@ -1,64 +1,466 @@ Ubuntu ====== -Option A: Install a ready made package ---------------------------------------- +.. contents:: -Installation procedure (common for all versions of Ubuntu) -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Easy Way: Install ZoneMinder from a package (Ubuntu 15.x+) +----------------------------------------------------------- +These instructions are for a brand new ubuntu 15.04 system which does not have ZM installed. -It is important that you first apply any system software upgrades first to Ubuntu, especially if you have just created a new image of Ubuntu. -Not doing this may cause the PPA process to fail and complain about various unmet dependencies. - -If you also plan to install the database in the same server (which is typically the case), first do: +**Step 1**: Make sure we add the correct packages :: - sudo apt-get install mysql-server + sudo add-apt-repository ppa:iconnor/zoneminder-master + sudo apt-get update -This will ask you for a user and password to configure for Zoneminder. -Note that when you install the PPA, it will also create a username of zmuser and a password of zmpass irrespective of what you select at this stage - -Now add the ppa repository path: +if you don't have mysql already installed: :: - sudo apt-add-repository ppa:iconnor/zoneminder + sudo apt-get install mysql-server + +This will ask you to set up a master password for the DB (you are asked for the mysql root password when installing mysql server). + +**Step 2**: Install ZoneMinder -Once you have updated the repository then update and install the package.: - :: - sudo apt-get update - sudo apt-get install zoneminder + sudo apt-get install zoneminder +**Step 3**: Configure the Database +:: + sudo mysql -uroot -p < /usr/share/zoneminder/db/zm_create.sql + mysql -uroot -p -e "grant select,insert,update,delete,create,alter,index,lock tables on zm.* to 'zmuser'@localhost identified by 'zmpass';" -Post Install steps for Ubuntu 15.x or newer (systemd) -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +You don't really need this, but no harm (needed if you are upgrading) :: sudo /usr/bin/zmupdate.pl + +**Step 4**: Configure systemd to recognize ZoneMinder and configure Apache correctly: + +:: + sudo systemctl enable zoneminder sudo a2enconf zoneminder + sudo a2enmod cgi + sudo chown -R www-data:www-data /usr/share/zoneminder/ + + +We need this for API routing to work: + +:: + + sudo a2enmod rewrite + +This is probably a bug with iconnor's PPA as of Oct 3, 2015 with package 1.28.107. After installing, ``zm.conf`` does not have the right read permissions, so we need to fix that. This may go away in future PPA releases: + +:: + + sudo chown www-data:www-data /etc/zm/zm.conf + +We also need to install php5-gd (as of 1.28.107, this is not installed) + +:: + + sudo apt-get install php5-gd + +**Step 5**: Edit Timezone in PHP + +:: + + vi /etc/php5/apache2/php.ini + +Look for [Date] and inside it you will see a date.timezone +that is commented. remove the comment and specific your timezone. +Please make sure the timezone is valid (see this: http://php.net/manual/en/timezones.php) + +In my case: + +:: + + date.timezone = America/New_York + +**Step 6**: Restart services + +:: + sudo service apache2 reload - systemctl restart zoneminder + sudo systemctl restart zoneminder -You should now be able to view the zoneminder interface at ``http://localhost/zm`` (replace localhost with your server IP if you are accessing it remotely) -.. image:: images/zm_first_screen_post_install.png +**Step 7: make sure live streaming works**: Make sure you can view Monitor streams: + +startup ZM console in your browser, go to ``Options->Path`` and make sure ``PATH_ZMS`` is set to ``/zm/cgi-bin/nph-zms`` and restart ZM (you should not need to do this for packages, as this should automatically work) + + +**Step 8**: If you have changed your DB login/password from zmuser/zmpass, the API won't know about it + +If you changed the DB password **after** installing ZM, the APIs will not be able to connect to the DB. + +If you have, go to ``zoneminder/www/api/app/Config`` & Edit ``database.php`` + +There is a class there called ``DATABASE_CONFIG`` - change the ``$default`` array to reflect your new details. Example: + +:: + + public $default = array( + 'datasource' => 'Database/Mysql', + 'persistent' => false, + 'host' => 'localhost', + 'login' => 'mynewDBusername', + 'password' => 'mynewDBpassword' + 'database' => 'zm', + 'prefix' => '', + //'encoding' => 'utf8', + ); + + +You are done. Lets proceed to make sure everything works: + +Making sure ZM and APIs work: + +1. open up a browser and go to ``http://localhost/zm`` - should bring up ZM +2. (OPTIONAL - just for peace of mind) open up a tab and go to ``http://localhost/zm/api`` - should bring up a screen showing CakePHP version with some green color boxes. Green is good. If you see red, or you don't see green, there may be a problem (should not happen). Ignore any warnings in yellow saying "DebugKit" not installed. You don't need it +3. open up a tab in the same browser and go to ``http://localhost/zm/api/host/getVersion.json`` + +If it responds with something like: + +:: + + { + "version": "1.28.107", + "apiversion": "1.28.107.1" + } + + +**Then your APIs are working** + +Make sure ZM and APIs work with security: +1. Enable OPT_AUTH in ZM +2. Log out of ZM in browser +3. Open a NEW tab in the SAME BROWSER (important) and go to ``http://localhost/zm/api/host/getVersion.json`` - should give you "Unauthorized" along with a lot more of text +4. Go to another tab in the SAME BROWSER (important) and log into ZM +5. Repeat step 3 and it should give you the ZM and API version + +**Congrats** your installation is complete + + +Easy Way: Install ZoneMinder from a package (Ubuntu 14.x) +----------------------------------------------------------- +**These instructions are for a brand new ubuntu 14.x system which does not have ZM installed.** + +**Step 1:** Install ZoneMinder + +:: + + sudo add-apt-repository ppa:iconnor/zoneminder-master + sudo apt-get update + sudo apt-get install zoneminder + +(just press OK for the prompts you get) + +**Step 2:** Set up DB + +:: + + sudo mysql -uroot -p < /usr/share/zoneminder/db/zm_create.sql + mysql -uroot -p -e "grant select,insert,update,delete,create,alter,index,lock tables on zm.* to 'zmuser'@localhost identified by 'zmpass';" + +**Step 3:** Set up Apache + +:: + + sudo a2enconf zoneminder + sudo a2enmod rewrite + sudo a2enmod cgi + +**Step 4:**:Some tweaks that will be needed: + +Edit /etc/init.d/zoneminder: + +add a ``sleep 10`` right after line 25 that reads ``echo -n "Starting $prog:"`` +(The reason we need this sleep is to make sure ZM starts after mysqld starts) + +As of Oct 3 2015, zm.conf is not readable by ZM. This is likely a bug and will go away in the next package + +:: + + sudo chown www-data:www-data /etc/zm/zm.conf + + + +**Step 5**: If you have changed your DB login/password + +If you changed the DB password **after** installing ZM, the APIs will not be able to connect to the DB. + +If you have, go to zoneminder/www/api/app/Config & Edit ``database.php`` + +There is a class there called ``DATABASE_CONFIG`` - change the ``$default`` array to reflect your new details. Example: + +:: + + public $default = array( + 'datasource' => 'Database/Mysql', + 'persistent' => false, + 'host' => 'localhost', + 'login' => 'mynewDBusername', + 'password' => 'mynewDBpassword' + 'database' => 'zm', + 'prefix' => '', + //'encoding' => 'utf8',` + ); + +We also need to install php5-gd (as of 1.28.107, this is not installed) + +:: + + sudo apt-get install php5-gd + + +**Step 6**: Edit Timezone in PHP + +vi /etc/php5/apache2/php.ini +Look for [Date] and inside it you will see a date.timezone +that is commented. remove the comment and specific your timezone. +Please make sure the timezone is valid (see [this](http://php.net/manual/en/timezones.php)) + +In my case: + +:: + + date.timezone = America/New_York + + +**Step 7: make sure live streaming works**: Make sure you can view Monitor streams: + +startup ZM console in your browser, go to ``Options->Path`` and make sure ``PATH_ZMS`` is set to ``/zm/cgi-bin/nph-zms`` and restart ZM (you should not need to do this for packages, as this should automatically work) + + + +restart: + +:: + + sudo service apache2 restart + /etc/init.d/zoneminder restart + +**Step 8**: Making sure ZM and APIs work: (optional - only if you need APIs) + +1. open up a browser and go to ``http://localhost/zm`` - should bring up ZM +2. (OPTIONAL - just for peace of mind) open up a tab and go to ``http://localhost/zm/api`` - should bring up a screen showing CakePHP version with some green color boxes. Green is good. If you see red, or you don't see green, there may be a problem (should not happen). Ignore any warnings in yellow saying "DebugKit" not installed. You don't need it +3. open up a tab in the same browser and go to ``http://localhost/zm/api/host/getVersion.json`` + +If it responds with something like: + +:: + + { + "version": "1.28.107", + "apiversion": "1.28.107.1" + } + +Then your APIs are working + +Make sure you can view Monitor View: +1. Open up ZM, configure your monitors and verify you can view Monitor feeds. +2. If not, open up ZM console in your browser, go to ``Options->Path`` and make sure ``PATH_ZMS`` is set to ``/zm/cgi-bin/nph-zms`` and restart ZM (you should not need to do this for packages, as this should automatically work) + +Make sure ZM and APIs work with security: +1. Enable OPT_AUTH in ZM +2. Log out of ZM in browser +3. Open a NEW tab in the SAME BROWSER (important) and go to ``http://localhost/zm/api/host/getVersion.json`` - should give you "Unauthorized" along with a lot more of text +4. Go to another tab in the SAME BROWSER (important) and log into ZM +5. Repeat step 3 and it should give you the ZM and API version + +**Congrats** Your installation is complete -Post install steps for Ubuntu 14.x or older (SystemV) -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Harder Way: Build Package From Source +------------------------------------------- +(These instructions assume installation from source on a ubuntu 15.x+ system) + +**Step 1:** First make sure you have the needed tools + +:: + + sudo apt-get update + sudo apt-get install cmake git + +**Step 2:** Next up make sure you have all the dependencies + +:: + + sudo apt-get install apache2 mysql-server php5 php5-mysql build-essential libmysqlclient-dev libssl-dev libbz2-dev libpcre3-dev libdbi-perl libarchive-zip-perl libdate-manip-perl libdevice-serialport-perl libmime-perl libpcre3 libwww-perl libdbd-mysql-perl libsys-mmap-perl yasm automake autoconf libjpeg8-dev libjpeg8 apache2 libapache2-mod-php5 php5-cli libphp-serialization-perl libgnutls-dev libjpeg8-dev libavcodec-dev libavformat-dev libswscale-dev libavutil-dev libv4l-dev libtool ffmpeg libnetpbm10-dev libavdevice-dev libmime-lite-perl dh-autoreconf dpatch policykit-1 libpolkit-gobject-1-dev libextutils-pkgconfig-perl libcurl3 libvlc-dev libcurl4-openssl-dev curl php5-gd + +(you are asked for the mysql root password when installing mysql server - put in a password that you'd like). + +**Step 3:** Download ZoneMinder source code and compile+install: + +:: + + git clone https://github.com/ZoneMinder/ZoneMinder.git + cd ZoneMinder/ + git submodule init + git submodule update + cmake . + make + sudo make install + +**Step 4:** Now make sure your symlinks to events and images are set correctly: + +:: + + sudo ./zmlinkcontent.sh + +**Step 5:** Now lets make sure ZM has DB permissions to write to the DB: + +:: + + mysql -uroot -p -e "grant select,insert,update,delete,create,alter,index,lock tables on zm.* to 'zmuser'@localhost identified by 'zmpass';" + +**Step 6:** Now lets create the DB & its tables that ZM needs + +:: + + mysql -uroot -p + Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch + AllowOverride All + Require all granted + + + Alias /zm /usr/local/share/zoneminder/www + + php_flag register_globals off + Options Indexes FollowSymLinks + + DirectoryIndex index.php + + + + + AllowOverride All + + +**Step 11:** Now lets make sure ZM can read/write to the zoneminder directory: + +:: + + sudo chown -R www-data:www-data /usr/local/share/zoneminder/ + + +**Step 12:** Make sure you can view Monitor View + +1. Open up ZM, configure your monitors and verify you can view Monitor feeds +2. If not, open up ZM console in your browser, go to ``Options->Path`` and make sure ``PATH_ZMS`` is set to ``/zm/cgi-bin/nph-zms`` and restart ZM + +**Step 13**: Edit Timezone in PHP + +vi /etc/php5/apache2/php.ini +Look for [Date] and inside it you will see a date.timezone +that is commented. remove the comment and specific your timezone. +Please make sure the timezone is valid (see http://php.net/manual/en/timezones.php) + +In my case: + +:: + + date.timezone = America/New_York + +**Step 14:** Finally, lets make a config change to apache (needed for htaccess overrides to work for APIs) +Edit /etc/apache2/apache2.conf and add this: + +:: + + + AllowOverride All + Require all granted + + +Restart apache + +:: + + sudo service apache2 reload + +You are done. Lets proceed to make sure everything works: + +Making sure ZM and APIs work: + +1. open up a browser and go to ``http://localhost/zm`` - should bring up ZM +2. (OPTIONAL - just for peace of mind) open up a tab and go to ``http://localhost/zm/api`` - should bring up a screen showing CakePHP version with some green color boxes. Green is good. If you see red, or you don't see green, there may be a problem (should not happen). Ignore any warnings in yellow saying "DebugKit" not installed. You don't need it +3. open up a tab in the same browser and go to ``http://localhost/zm/api/host/getVersion.json`` + +If it responds with something like: + +:: + + { + "version": "1.28.107", + "apiversion": "1.28.107.1" + } + +Then your APIs are working + +Make sure ZM and APIs work with security: +1. Enable OPT_AUTH in ZM +2. Log out of ZM in browser +3. Open a NEW tab in the SAME BROWSER (important) and go to ``http://localhost/zm/api/host/getVersion.json`` - should give you "Unauthorized" along with a lot more of text +4. Go to another tab in the SAME BROWSER (important) and log into ZM +5. Repeat step 3 and it should give you the ZM and API version + +**Congrats** your installation is complete + Suggested changes to MySQL (Optional but recommended) -""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +------------------------------------------------------ For most of you Zoneminder will run just fine with the default MySQL settings. There are a couple of settings that may, in time, provide beneficial especially if you have a number of cameras and many events with a lot of files. One setting we recommend is the "innodb_file_per_table" This will be a default setting in MySQL 5.6 but should be added in MySQL 5.5 which comes with Ubuntu 14.04. A description can be found here: http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-tablespaces.html To add "innodb_file_per_table" edit the my.cnf file: @@ -72,90 +474,4 @@ Save and exit. Restart MySQL ``service mysql restart`` -Adding a sleep for mysql dependency (Ubuntu 14.x and below only) -"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -We recommend you add a "sleep" command just after ``start() {`` in ``/etc/init.d/zoneminder`` to make sure mysql starts before ZoneMinder does. To do this, -simply modify ``/etc/init.d/zoneminder`` at around line 25 (where you will find the start function) to look like this: - -:: - - start() { - echo -n "Making sure mysql started... Sleeping for 10 seconds..." - sleep 10 - echo -n "Starting $prog: " - -Making Apache aware of ZoneMinder -"""""""""""""""""""""""""""""""""""""""""""" - -Next, we need to make sure apache knows about zoneminder's configuration for apache. - -:: - - ln -s /etc/zm/apache.conf /etc/apache2/conf-available/zoneminder.conf - -If you are upgrading from an old version: - -:: - - sudo /usr/bin/zmupdate.pl - -Then look for ``/etc/apache2/conf-enable/zm.conf`` - if you have it, please remove it - -:: - - a2enconf zoneminder - adduser www-data video - - -lets make sure we restart apache: - -:: - - service apache2 restart - - -You should now be able to view the zoneminder interface at ``http://localhost/zm`` (replace localhost with your server IP if you are accessing it remotely) - -.. image:: images/zm_first_screen_post_install.png - - -Finally, in the zoneminder web interface, go to Options->Paths, change PATH_ZMS to ``/zm/cgi-bin/nph-zms`` - - -Option B: Build Package From Source -------------------------------------------- - -A fresh build based on master branch running Ubuntu 1204 LTS. Will likely work for other versions as well.:: - - root@host:~# aptitude install -y apache2 mysql-server php5 php5-mysql build-essential libmysqlclient-dev libssl-dev libbz2-dev libpcre3-dev libdbi-perl libarchive-zip-perl libdate-manip-perl libdevice-serialport-perl libmime-perl libpcre3 libwww-perl libdbd-mysql-perl libsys-mmap-perl yasm automake autoconf libjpeg8-dev libjpeg8 apache2-mpm-prefork libapache2-mod-php5 php5-cli libphp-serialization-perl libgnutls-dev libjpeg8-dev libavcodec-dev libavformat-dev libswscale-dev libavutil-dev libv4l-dev libtool ffmpeg libnetpbm10-dev libavdevice-dev libmime-lite-perl dh-autoreconf dpatch; - - root@host:~# git clone https://github.com/ZoneMinder/ZoneMinder.git zoneminder; - root@host:~# cd zoneminder; - root@host:~# ln -s distros/ubuntu1204 debian; - root@host:~# dpkg-checkbuilddeps; - root@host:~# dpkg-buildpackage; - - -One level above you'll now find a deb package matching the architecture of the build host\::: - - root@host:~# ls -1 ~/zoneminder\*; - /root/zoneminder_1.26.4-1_amd64.changes - /root/zoneminder_1.26.4-1_amd64.deb - /root/zoneminder_1.26.4-1.dsc - /root/zoneminder_1.26.4-1.tar.gz - - -The dpkg command itself does not resolve dependencies. That's what high-level interfaces like aptitude and apt-get are normally for. Unfortunately, unlike RPM, there's no easy way to install a separate deb package not contained with any repository. - -To overcome this "limitation" we'll use dpkg only to install the zoneminder package and apt-get to fetch all needed dependencies afterwards. Running dpkg-reconfigure in the end will ensure that the setup scripts e.g. for database provisioning were executed.:: - - root@host:~# dpkg -i /root/zoneminder_1.26.4-1_amd64.deb; apt-get install -f; - root@host:~# dpkg-reconfigure zoneminder; - -Alternatively you may also use gdebi to automatically resolve dependencies during installation\::: - - root@host:~# aptitude install -y gdebi; - root@host:~# gdebi /root/zoneminder_1.26.4-1_amd64.deb; - - sudo apt-get install apache2 mysql-server php5 php5-mysql build-essential libmysqlclient-dev libssl-dev libbz2-dev libpcre3-dev libdbi-perl libarchive-zip-perl libdate-manip-perl libdevice-serialport-perl libmime-perl libpcre3 libwww-perl libdbd-mysql-perl libsys-mmap-perl yasm automake autoconf libjpeg-turbo8-dev libjpeg-turbo8 apache2-mpm-prefork libapache2-mod-php5 php5-cli From b444061cc6993618fc56805381f276f7087f58a4 Mon Sep 17 00:00:00 2001 From: arjunrc Date: Fri, 18 Dec 2015 15:11:05 -0500 Subject: [PATCH 29/49] removed -master from ppa - when 1.29 releases it will be stable --- docs/installationguide/ubuntu.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/installationguide/ubuntu.rst b/docs/installationguide/ubuntu.rst index fa065cb96..1d5412077 100644 --- a/docs/installationguide/ubuntu.rst +++ b/docs/installationguide/ubuntu.rst @@ -11,7 +11,7 @@ These instructions are for a brand new ubuntu 15.04 system which does not have Z :: - sudo add-apt-repository ppa:iconnor/zoneminder-master + sudo add-apt-repository ppa:iconnor/zoneminder sudo apt-get update if you don't have mysql already installed: @@ -158,7 +158,7 @@ Easy Way: Install ZoneMinder from a package (Ubuntu 14.x) :: - sudo add-apt-repository ppa:iconnor/zoneminder-master + sudo add-apt-repository ppa:iconnor/zoneminder sudo apt-get update sudo apt-get install zoneminder From 3fe64f8ce656c97a252e25fda442622f8911991d Mon Sep 17 00:00:00 2001 From: arjunrc Date: Sat, 19 Dec 2015 13:38:54 -0500 Subject: [PATCH 30/49] rtd theme --- docs/conf.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 1e7f35737..11d1fb392 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -98,14 +98,15 @@ pygments_style = 'sphinx' # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -html_theme = 'default' +#html_theme = 'default' +html_theme = 'sphinx_rtd_theme' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. -html_theme_options = { - "stickysidebar": "true" -} +#html_theme_options = { +# "stickysidebar": "true" +#} # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] @@ -129,8 +130,8 @@ html_theme_options = { # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] -html_style='zmstyles.css' +#html_static_path = ['_static'] +#html_style='zmstyles.css' # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied From 2763c3d92ed8235967c15c5126ec9b92e5e278e3 Mon Sep 17 00:00:00 2001 From: arjunrc Date: Sat, 19 Dec 2015 13:40:21 -0500 Subject: [PATCH 31/49] deleted --- docs/_static/zmstyles.css | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 docs/_static/zmstyles.css diff --git a/docs/_static/zmstyles.css b/docs/_static/zmstyles.css deleted file mode 100644 index 8f59f3910..000000000 --- a/docs/_static/zmstyles.css +++ /dev/null @@ -1,13 +0,0 @@ -@import url("default.css"); - -div.admonition-note { -border-top: 2px solid red; -border-bottom: 2px solid red; -border-left: 2px solid red; -border-right: 2px solid red; -background-color: #ff6347 -} - -img { - border: 1px solid black !important; -} From c4bdb127ce4b4c98ea988dfb025a79425e82b1c4 Mon Sep 17 00:00:00 2001 From: arjunrc Date: Sat, 19 Dec 2015 16:53:30 -0500 Subject: [PATCH 32/49] fixed custom style breaking rtd theme --- docs/conf.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index 11d1fb392..109161b24 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -15,6 +15,9 @@ import sys import os +def setup(app): + app.add_stylesheet('zmstyle.css') + # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. @@ -130,7 +133,7 @@ html_theme = 'sphinx_rtd_theme' # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -#html_static_path = ['_static'] +html_static_path = ['_static'] #html_style='zmstyles.css' # Add any extra paths that contain custom files (such as robots.txt or From cbea550d70f58f4d8d2ba2fd137d99623d17bbd5 Mon Sep 17 00:00:00 2001 From: arjunrc Date: Sat, 19 Dec 2015 16:53:47 -0500 Subject: [PATCH 33/49] custom theming for ZM --- docs/_static/zmstyle.css | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 docs/_static/zmstyle.css diff --git a/docs/_static/zmstyle.css b/docs/_static/zmstyle.css new file mode 100644 index 000000000..b8f0235f3 --- /dev/null +++ b/docs/_static/zmstyle.css @@ -0,0 +1,3 @@ +img { + border: 1px solid black !important; + } From 27b1b37d5b0f549aa55680acf4cdd7ab471483b3 Mon Sep 17 00:00:00 2001 From: arjunrc Date: Sat, 19 Dec 2015 17:43:36 -0500 Subject: [PATCH 34/49] added opt_use_api --- .../lib/ZoneMinder/ConfigData.pm.in | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in index 7fff3d62e..9a065f8cf 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in +++ b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in @@ -357,7 +357,23 @@ our @options = type => $types{boolean}, category => "system", }, - # PP - Google reCaptcha settings + { + name => "ZM_OPT_USE_API", + default => "yes", + description => "Enable ZoneMinder APIs", + help => qqq(" + ZoneMinder now features a new API using which 3rd party + applications can interact with ZoneMinder data. It is + STRONGLY recommended that you enable authentication along + with APIs. Note that the APIs return sensitive data like + Monitor access details which are configured as JSON objects. + Which is why we recommend you enabling authentication, especially + if you are exposing your ZM instance on the Internet. + "), + type => $types{boolean}, + category => "system", + }, +# PP - Google reCaptcha settings { name => "ZM_OPT_USE_GOOG_RECAPTCHA", default => "no", @@ -410,6 +426,7 @@ our @options = type => $types {string}, category => "system", }, + { name => "ZM_DIR_EVENTS", From 028c9b956c59185421b4e4707e2b8a4a55a78c09 Mon Sep 17 00:00:00 2001 From: arjunrc Date: Sat, 19 Dec 2015 17:44:02 -0500 Subject: [PATCH 35/49] check for opt_use_api, also pull in user roles support --- web/api/app/Controller/AppController.php | 51 +++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/web/api/app/Controller/AppController.php b/web/api/app/Controller/AppController.php index 1d85115e8..8494aaa6c 100644 --- a/web/api/app/Controller/AppController.php +++ b/web/api/app/Controller/AppController.php @@ -58,14 +58,63 @@ class AppController extends Controller { // Also checking to do this only if ZM_OPT_USE_AUTH is on public function beforeFilter() { $this->loadModel('Config'); + + $options = array('conditions' => array('Config.' . $this->Config->primaryKey => 'ZM_OPT_USE_API')); + $config = $this->Config->find('first', $options); + $zmOptApi = $config['Config']['Value']; + + if ($zmOptApi !='1') + { + throw new UnauthorizedException(__('API Disabled')); + return; + } + $options = array('conditions' => array('Config.' . $this->Config->primaryKey => 'ZM_OPT_USE_AUTH')); $config = $this->Config->find('first', $options); $zmOptAuth = $config['Config']['Value']; if (!$this->Session->Read('user.Username') && ($zmOptAuth=='1')) { - throw new NotFoundException(__('Not Authenticated')); + throw new UnauthorizedException(__('Not Authenticated')); return; } + // PP #1155 fixes + else + { + $this->loadModel('User'); + $loggedinUser = $this->Session->Read('user.Username'); + $isEnabled = $this->Session->Read('user.Enabled'); + // PP - this will likely never happen as if its + // not enabled, login will fail and Not Auth will be returned + // however, keeping this here for now + if ($isEnabled != "1" && $zmOptAuth=="1") + { + throw new UnauthorizedException(__('User is not enabled')); + return; + } + + if ($zmOptAuth=='1') + { + $options = array ('conditions' => array ('User.Username' => $loggedinUser)); + $userMonitors = $this->User->find('first', $options); + $this->Session->Write('allowedMonitors',$userMonitors['User']['MonitorIds']); + $this->Session->Write('streamPermission',$userMonitors['User']['Stream']); + $this->Session->Write('eventPermission',$userMonitors['User']['Events']); + $this->Session->Write('controlPermission',$userMonitors['User']['Control']); + $this->Session->Write('systemPermission',$userMonitors['User']['System']); + $this->Session->Write('monitorPermission',$userMonitors['User']['Monitors']); + } + else // if auth is not on, you can do everything + { + //$userMonitors = $this->User->find('first', $options); + $this->Session->Write('allowedMonitors',''); + $this->Session->Write('streamPermission','View'); + $this->Session->Write('eventPermission','Edit'); + $this->Session->Write('controlPermission','Edit'); + $this->Session->Write('systemPermission','Edit'); + $this->Session->Write('monitorPermission','Edit'); + } + } + } From f56688e7c2e1012dd002866d5c5a6b5a334a1fb4 Mon Sep 17 00:00:00 2001 From: arjunrc Date: Sat, 19 Dec 2015 17:44:16 -0500 Subject: [PATCH 36/49] initial user role support --- web/api/app/Controller/EventsController.php | 130 +++++++++++++++----- 1 file changed, 96 insertions(+), 34 deletions(-) diff --git a/web/api/app/Controller/EventsController.php b/web/api/app/Controller/EventsController.php index 988c19110..e82e7844e 100644 --- a/web/api/app/Controller/EventsController.php +++ b/web/api/app/Controller/EventsController.php @@ -14,6 +14,18 @@ class EventsController extends AppController { */ public $components = array('RequestHandler', 'Scaler', 'Image', 'Paginator'); +//# PP #1155 +public function beforeFilter() { + parent::beforeFilter(); + $canView = $this->Session->Read('eventPermission'); + if ($canView =='None') + { + throw new UnauthorizedException(__('Insufficient Privileges')); + return; + } + +} + /** * index method * @@ -22,6 +34,19 @@ class EventsController extends AppController { */ public function index() { $this->Event->recursive = -1; + + //PP #1155 + $allowedMonitors=preg_split ('@,@', $this->Session->Read('allowedMonitors'),NULL, PREG_SPLIT_NO_EMPTY); + + if (!empty($allowedMonitors)) + { + $mon_options = array('Event.MonitorId' => $allowedMonitors); + } + else + { + $mon_options=''; + } + if ($this->request->params['named']) { $this->FilterComponent = $this->Components->load('Filter'); @@ -49,14 +74,15 @@ class EventsController extends AppController { 'limit' => '100', 'order' => array('StartTime', 'MaxScore'), 'paramType' => 'querystring', - 'conditions' => $conditions + // PP #1155 + 'conditions' => array (array($conditions, $mon_options)) ); $events = $this->Paginator->paginate('Event'); // For each event, get its thumbnail data (path, width, height) foreach ($events as $key => $value) { - // PP - $thumbData = $this->createThumbnail($value['Event']['Id']); - $thumbData =""; + //$thumbData = $this->createThumbnail($value['Event']['Id']); + $thumbData = ""; $events[$key]['thumbData'] = $thumbData; } @@ -71,41 +97,56 @@ class EventsController extends AppController { * @param string $id * @return void */ - public function view($id = null) { - $this->loadModel('Config'); - $configs = $this->Config->find('list', array( - 'fields' => array('Name', 'Value'), - 'conditions' => array('Name' => array('ZM_DIR_EVENTS')) - )); + public function view($id = null) +{ + $this->loadModel('Config'); + $configs = $this->Config->find('list', array( + 'fields' => array('Name', 'Value'), + 'conditions' => array('Name' => array('ZM_DIR_EVENTS')) + )); - $this->Event->recursive = 1; - if (!$this->Event->exists($id)) { - throw new NotFoundException(__('Invalid event')); - } - $options = array('conditions' => array('Event.' . $this->Event->primaryKey => $id)); - $event = $this->Event->find('first', $options); + $this->Event->recursive = 1; + if (!$this->Event->exists($id)) { + throw new NotFoundException(__('Invalid event')); + } - $path = $configs['ZM_DIR_EVENTS'].'/'.$this->Image->getEventPath($event).'/'; - $event['Event']['BasePath'] = $path; + //PP #1155 + $allowedMonitors=preg_split ('@,@', $this->Session->Read('allowedMonitors'),NULL, PREG_SPLIT_NO_EMPTY); - # Get the previous and next events for any monitor - $this->Event->id = $id; + if (!empty($allowedMonitors)) + { + $mon_options = array('Event.MonitorId' => $allowedMonitors); + } + else + { + $mon_options=''; + } + + $options = array('conditions' => array(array('Event.' . $this->Event->primaryKey => $id), $mon_options)); + $event = $this->Event->find('first', $options); + + $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']; + $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( + # 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']; + )); + $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') + )); + } - $this->set(array( - 'event' => $event, - '_serialize' => array('event') - )); - } /** * add method @@ -113,6 +154,14 @@ class EventsController extends AppController { * @return void */ public function add() { + + //PP - #1155 + if ($this->Session->Read('eventPermission') != 'Edit') + { + throw new UnauthorizedException(__('Insufficient privileges')); + return; + } + if ($this->request->is('post')) { $this->Event->create(); if ($this->Event->save($this->request->data)) { @@ -131,6 +180,14 @@ class EventsController extends AppController { * @return void */ public function edit($id = null) { + + //PP - #1155 + if ($this->Session->Read('eventPermission') != 'Edit') + { + throw new UnauthorizedException(__('Insufficient privileges')); + return; + } + $this->Event->id = $id; if (!$this->Event->exists($id)) { @@ -157,15 +214,20 @@ class EventsController extends AppController { * @return void */ public function delete($id = null) { + //PP - #1155 + if ($this->Session->Read('eventPermission') != 'Edit') + { + throw new UnauthorizedException(__('Insufficient privileges')); + return; + } $this->Event->id = $id; if (!$this->Event->exists()) { throw new NotFoundException(__('Invalid event')); } $this->request->allowMethod('post', 'delete'); if ($this->Event->delete()) { - // PP - lets make sure the frame table entry is removed too - $this->loadModel('Frame'); - $this->Frame->delete(); + //$this->loadModel('Frame'); + //$this->Event->Frame->delete(); return $this->flash(__('The event has been deleted.'), array('action' => 'index')); } else { return $this->flash(__('The event could not be deleted. Please, try again.'), array('action' => 'index')); From e812398fb9244967ae74d57babc242b2f1815624 Mon Sep 17 00:00:00 2001 From: arjunrc Date: Sat, 19 Dec 2015 17:44:39 -0500 Subject: [PATCH 37/49] initial user role support --- web/api/app/Controller/HostController.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/web/api/app/Controller/HostController.php b/web/api/app/Controller/HostController.php index ee5ecd30f..2e2c49551 100644 --- a/web/api/app/Controller/HostController.php +++ b/web/api/app/Controller/HostController.php @@ -101,7 +101,10 @@ class HostController extends AppController { function getVersion() { $version = Configure::read('ZM_VERSION'); - $apiversion = Configure::read('ZM_API_VERSION'); + // PP - not going to use the ZM_API_VERSION + // requires recompilation and dependency on ZM upgrade + //$apiversion = Configure::read('ZM_API_VERSION'); + $apiversion = '1.0'; $this->set(array( 'version' => $version, From b4fdaa9b4d032b9b62285738bab1bb1ffc058c1c Mon Sep 17 00:00:00 2001 From: arjunrc Date: Sat, 19 Dec 2015 17:44:46 -0500 Subject: [PATCH 38/49] initial user role support --- web/api/app/Controller/MonitorsController.php | 68 +++++++++++++++++-- 1 file changed, 63 insertions(+), 5 deletions(-) diff --git a/web/api/app/Controller/MonitorsController.php b/web/api/app/Controller/MonitorsController.php index 3aeb31aa8..d13ed3a31 100644 --- a/web/api/app/Controller/MonitorsController.php +++ b/web/api/app/Controller/MonitorsController.php @@ -16,6 +16,20 @@ class MonitorsController extends AppController { */ public $components = array('Paginator', 'RequestHandler'); + +//# PP #1155 +public function beforeFilter() { + parent::beforeFilter(); + $canView = $this->Session->Read('monitorPermission'); + if ($canView =='None') + { + throw new UnauthorizedException(__('Insufficient Privileges')); + return; + } + +} + + /** * index method * @@ -23,7 +37,18 @@ class MonitorsController extends AppController { */ public function index() { $this->Monitor->recursive = 0; - $monitors = $this->Monitor->find('all'); + //PP #1155 + $allowedMonitors=preg_split ('@,@', $this->Session->Read('allowedMonitors'),NULL, PREG_SPLIT_NO_EMPTY); + + if (!empty($allowedMonitors)) + { + $options = array('conditions'=>array('Monitor.Id'=> $allowedMonitors)); + } + else + { + $options=''; + } + $monitors = $this->Monitor->find('all',$options); $this->set(array( 'monitors' => $monitors, '_serialize' => array('monitors') @@ -42,7 +67,22 @@ class MonitorsController extends AppController { if (!$this->Monitor->exists($id)) { throw new NotFoundException(__('Invalid monitor')); } - $options = array('conditions' => array('Monitor.' . $this->Monitor->primaryKey => $id)); + //PP #1155 + $allowedMonitors=preg_split ('@,@', $this->Session->Read('allowedMonitors'),NULL, PREG_SPLIT_NO_EMPTY); + if (!empty($allowedMonitors)) + { + $restricted = array('Monitor.' . $this->Monitor->primaryKey => $allowedMonitors); + } + else + { + $restricted = ''; + } + + $options = array('conditions' => array( + array('Monitor.' . $this->Monitor->primaryKey => $id), + $restricted + ) + ); $monitor = $this->Monitor->find('first', $options); $this->set(array( 'monitor' => $monitor, @@ -57,6 +97,14 @@ class MonitorsController extends AppController { */ public function add() { if ($this->request->is('post')) { + + //PP - #1155 + if ($this->Session->Read('systemPermission') != 'Edit') + { + throw new UnauthotizedException(__('Insufficient privileges')); + return; + } + $this->Monitor->create(); if ($this->Monitor->save($this->request->data)) { $this->daemonControl($this->Monitor->id, 'start', $this->request->data); @@ -78,7 +126,12 @@ class MonitorsController extends AppController { if (!$this->Monitor->exists($id)) { throw new NotFoundException(__('Invalid monitor')); } - + //PP - #1155 + if ($this->Session->Read('systemPermission') != 'Edit') + { + throw new UnauthorizedException(__('Insufficient privileges')); + return; + } if ($this->Monitor->save($this->request->data)) { $message = 'Saved'; } else { @@ -90,8 +143,7 @@ class MonitorsController extends AppController { '_serialize' => array('message') )); // PP - restart this monitor after change - $this->daemonControl($this->Monitor->id, 'restart', $this->request->data); - + $this->daemonControl($this->Monitor->id, 'restart', $this->request->data); } /** @@ -106,6 +158,12 @@ class MonitorsController extends AppController { if (!$this->Monitor->exists()) { throw new NotFoundException(__('Invalid monitor')); } + //PP - #1155 + if ($this->Session->Read('systemPermission') != 'Edit') + { + throw new UnauthorizedException(__('Insufficient privileges')); + return; + } $this->request->allowMethod('post', 'delete'); $this->daemonControl($this->Monitor->id, 'stop'); From c4461c328eddb5a82f1dc5755ab8a955bee86333 Mon Sep 17 00:00:00 2001 From: arjunrc Date: Sat, 19 Dec 2015 17:45:03 -0500 Subject: [PATCH 39/49] initial user role support --- web/api/app/Model/User.php | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 web/api/app/Model/User.php diff --git a/web/api/app/Model/User.php b/web/api/app/Model/User.php new file mode 100644 index 000000000..9d9dd7f85 --- /dev/null +++ b/web/api/app/Model/User.php @@ -0,0 +1,32 @@ + Date: Sat, 19 Dec 2015 18:36:38 -0500 Subject: [PATCH 40/49] PP - Gone,flitted away, Taken the starts from the night and sun, From the day! Gone, and a cloud in my heart. - Tennyson --- web/api/app/Controller/AppController.php | 8 ++++---- .../app/Controller/Component/ImageComponent.php | 2 +- web/api/app/Controller/ConfigsController.php | 2 +- web/api/app/Controller/EventsController.php | 16 ++++++++-------- web/api/app/Controller/HostController.php | 2 +- web/api/app/Controller/MonitorsController.php | 14 +++++++------- web/api/app/Model/User.php | 2 +- 7 files changed, 23 insertions(+), 23 deletions(-) diff --git a/web/api/app/Controller/AppController.php b/web/api/app/Controller/AppController.php index 8494aaa6c..d961269d3 100644 --- a/web/api/app/Controller/AppController.php +++ b/web/api/app/Controller/AppController.php @@ -34,7 +34,7 @@ class AppController extends Controller { use CrudControllerTrait; public $components = [ - 'Session', // PP - We are going to use SessionHelper to check PHP session vars + 'Session', // We are going to use SessionHelper to check PHP session vars 'RequestHandler', 'Crud.Crud' => [ 'actions' => [ @@ -49,7 +49,7 @@ class AppController extends Controller { ] ]; - //PP - Global beforeFilter function + // Global beforeFilter function //Zoneminder sets the username session variable // to the logged in user. If this variable is set // then you are logged in @@ -77,13 +77,13 @@ class AppController extends Controller { throw new UnauthorizedException(__('Not Authenticated')); return; } - // PP #1155 fixes + // #1155 fixes else { $this->loadModel('User'); $loggedinUser = $this->Session->Read('user.Username'); $isEnabled = $this->Session->Read('user.Enabled'); - // PP - this will likely never happen as if its + // this will likely never happen as if its // not enabled, login will fail and Not Auth will be returned // however, keeping this here for now if ($isEnabled != "1" && $zmOptAuth=="1") diff --git a/web/api/app/Controller/Component/ImageComponent.php b/web/api/app/Controller/Component/ImageComponent.php index 68a254031..f8ed7a533 100644 --- a/web/api/app/Controller/Component/ImageComponent.php +++ b/web/api/app/Controller/Component/ImageComponent.php @@ -48,7 +48,7 @@ class ImageComponent extends Component { $imageFile = $config['ZM_DIR_EVENTS']."/".$imagePath; //$thumbFile = ZM_DIR_EVENTS."/".$thumbPath; $thumbFile = $thumbPath; - // PP: This segment of code results in errors when trying to get Events API + // This segment of code results in errors when trying to get Events API // This actually seems to be generating images for the angular UI web view // and should not be a part of the API anyway // I've commented it so events APIs continue to work diff --git a/web/api/app/Controller/ConfigsController.php b/web/api/app/Controller/ConfigsController.php index e70978246..48f50ae8e 100644 --- a/web/api/app/Controller/ConfigsController.php +++ b/web/api/app/Controller/ConfigsController.php @@ -15,7 +15,7 @@ class ConfigsController extends AppController { public $components = array('RequestHandler'); /** - * PP - resolves the issue of not returning all config parameters + * resolves the issue of not returning all config parameters * refer https://github.com/ZoneMinder/ZoneMinder/issues/953 * index method * diff --git a/web/api/app/Controller/EventsController.php b/web/api/app/Controller/EventsController.php index e82e7844e..28bef7a64 100644 --- a/web/api/app/Controller/EventsController.php +++ b/web/api/app/Controller/EventsController.php @@ -14,7 +14,7 @@ class EventsController extends AppController { */ public $components = array('RequestHandler', 'Scaler', 'Image', 'Paginator'); -//# PP #1155 +//#1155 public function beforeFilter() { parent::beforeFilter(); $canView = $this->Session->Read('eventPermission'); @@ -35,7 +35,7 @@ public function beforeFilter() { public function index() { $this->Event->recursive = -1; - //PP #1155 + // #1155 $allowedMonitors=preg_split ('@,@', $this->Session->Read('allowedMonitors'),NULL, PREG_SPLIT_NO_EMPTY); if (!empty($allowedMonitors)) @@ -64,7 +64,7 @@ public function beforeFilter() { $this->Paginator->settings = array( // https://github.com/ZoneMinder/ZoneMinder/issues/995 // 'limit' => $limit['ZM_WEB_EVENTS_PER_PAGE'], - // PP - 25 events per page which is what the above + // 25 events per page which is what the above // default is, is way too low for an API // changing this to 100 so we don't kill ZM // with many event APIs. In future, we can @@ -74,7 +74,7 @@ public function beforeFilter() { 'limit' => '100', 'order' => array('StartTime', 'MaxScore'), 'paramType' => 'querystring', - // PP #1155 + // #1155 'conditions' => array (array($conditions, $mon_options)) ); $events = $this->Paginator->paginate('Event'); @@ -110,7 +110,7 @@ public function beforeFilter() { throw new NotFoundException(__('Invalid event')); } - //PP #1155 + // #1155 $allowedMonitors=preg_split ('@,@', $this->Session->Read('allowedMonitors'),NULL, PREG_SPLIT_NO_EMPTY); if (!empty($allowedMonitors)) @@ -155,7 +155,7 @@ public function beforeFilter() { */ public function add() { - //PP - #1155 + // - #1155 if ($this->Session->Read('eventPermission') != 'Edit') { throw new UnauthorizedException(__('Insufficient privileges')); @@ -181,7 +181,7 @@ public function beforeFilter() { */ public function edit($id = null) { - //PP - #1155 + // - #1155 if ($this->Session->Read('eventPermission') != 'Edit') { throw new UnauthorizedException(__('Insufficient privileges')); @@ -214,7 +214,7 @@ public function beforeFilter() { * @return void */ public function delete($id = null) { - //PP - #1155 + //- #1155 if ($this->Session->Read('eventPermission') != 'Edit') { throw new UnauthorizedException(__('Insufficient privileges')); diff --git a/web/api/app/Controller/HostController.php b/web/api/app/Controller/HostController.php index 2e2c49551..57b210a7e 100644 --- a/web/api/app/Controller/HostController.php +++ b/web/api/app/Controller/HostController.php @@ -101,7 +101,7 @@ class HostController extends AppController { function getVersion() { $version = Configure::read('ZM_VERSION'); - // PP - not going to use the ZM_API_VERSION + // not going to use the ZM_API_VERSION // requires recompilation and dependency on ZM upgrade //$apiversion = Configure::read('ZM_API_VERSION'); $apiversion = '1.0'; diff --git a/web/api/app/Controller/MonitorsController.php b/web/api/app/Controller/MonitorsController.php index d13ed3a31..3d493762f 100644 --- a/web/api/app/Controller/MonitorsController.php +++ b/web/api/app/Controller/MonitorsController.php @@ -17,7 +17,7 @@ class MonitorsController extends AppController { public $components = array('Paginator', 'RequestHandler'); -//# PP #1155 +//# 1155 public function beforeFilter() { parent::beforeFilter(); $canView = $this->Session->Read('monitorPermission'); @@ -37,7 +37,7 @@ public function beforeFilter() { */ public function index() { $this->Monitor->recursive = 0; - //PP #1155 + //#1155 $allowedMonitors=preg_split ('@,@', $this->Session->Read('allowedMonitors'),NULL, PREG_SPLIT_NO_EMPTY); if (!empty($allowedMonitors)) @@ -67,7 +67,7 @@ public function beforeFilter() { if (!$this->Monitor->exists($id)) { throw new NotFoundException(__('Invalid monitor')); } - //PP #1155 + //#1155 $allowedMonitors=preg_split ('@,@', $this->Session->Read('allowedMonitors'),NULL, PREG_SPLIT_NO_EMPTY); if (!empty($allowedMonitors)) { @@ -98,7 +98,7 @@ public function beforeFilter() { public function add() { if ($this->request->is('post')) { - //PP - #1155 + //- #1155 if ($this->Session->Read('systemPermission') != 'Edit') { throw new UnauthotizedException(__('Insufficient privileges')); @@ -126,7 +126,7 @@ public function beforeFilter() { if (!$this->Monitor->exists($id)) { throw new NotFoundException(__('Invalid monitor')); } - //PP - #1155 + //- #1155 if ($this->Session->Read('systemPermission') != 'Edit') { throw new UnauthorizedException(__('Insufficient privileges')); @@ -142,7 +142,7 @@ public function beforeFilter() { 'message' => $message, '_serialize' => array('message') )); - // PP - restart this monitor after change + // - restart this monitor after change $this->daemonControl($this->Monitor->id, 'restart', $this->request->data); } @@ -158,7 +158,7 @@ public function beforeFilter() { if (!$this->Monitor->exists()) { throw new NotFoundException(__('Invalid monitor')); } - //PP - #1155 + // #1155 if ($this->Session->Read('systemPermission') != 'Edit') { throw new UnauthorizedException(__('Insufficient privileges')); diff --git a/web/api/app/Model/User.php b/web/api/app/Model/User.php index 9d9dd7f85..c0392f51d 100644 --- a/web/api/app/Model/User.php +++ b/web/api/app/Model/User.php @@ -1,7 +1,7 @@ Date: Sat, 19 Dec 2015 19:04:27 -0500 Subject: [PATCH 41/49] removed issue # --- web/api/app/Controller/AppController.php | 1 - web/api/app/Controller/EventsController.php | 7 ------- web/api/app/Controller/MonitorsController.php | 6 ------ web/api/app/Model/User.php | 1 - 4 files changed, 15 deletions(-) diff --git a/web/api/app/Controller/AppController.php b/web/api/app/Controller/AppController.php index d961269d3..5b39597b3 100644 --- a/web/api/app/Controller/AppController.php +++ b/web/api/app/Controller/AppController.php @@ -77,7 +77,6 @@ class AppController extends Controller { throw new UnauthorizedException(__('Not Authenticated')); return; } - // #1155 fixes else { $this->loadModel('User'); diff --git a/web/api/app/Controller/EventsController.php b/web/api/app/Controller/EventsController.php index 28bef7a64..ef569cd7b 100644 --- a/web/api/app/Controller/EventsController.php +++ b/web/api/app/Controller/EventsController.php @@ -14,7 +14,6 @@ class EventsController extends AppController { */ public $components = array('RequestHandler', 'Scaler', 'Image', 'Paginator'); -//#1155 public function beforeFilter() { parent::beforeFilter(); $canView = $this->Session->Read('eventPermission'); @@ -35,7 +34,6 @@ public function beforeFilter() { public function index() { $this->Event->recursive = -1; - // #1155 $allowedMonitors=preg_split ('@,@', $this->Session->Read('allowedMonitors'),NULL, PREG_SPLIT_NO_EMPTY); if (!empty($allowedMonitors)) @@ -74,7 +72,6 @@ public function beforeFilter() { 'limit' => '100', 'order' => array('StartTime', 'MaxScore'), 'paramType' => 'querystring', - // #1155 'conditions' => array (array($conditions, $mon_options)) ); $events = $this->Paginator->paginate('Event'); @@ -110,7 +107,6 @@ public function beforeFilter() { throw new NotFoundException(__('Invalid event')); } - // #1155 $allowedMonitors=preg_split ('@,@', $this->Session->Read('allowedMonitors'),NULL, PREG_SPLIT_NO_EMPTY); if (!empty($allowedMonitors)) @@ -155,7 +151,6 @@ public function beforeFilter() { */ public function add() { - // - #1155 if ($this->Session->Read('eventPermission') != 'Edit') { throw new UnauthorizedException(__('Insufficient privileges')); @@ -181,7 +176,6 @@ public function beforeFilter() { */ public function edit($id = null) { - // - #1155 if ($this->Session->Read('eventPermission') != 'Edit') { throw new UnauthorizedException(__('Insufficient privileges')); @@ -214,7 +208,6 @@ public function beforeFilter() { * @return void */ public function delete($id = null) { - //- #1155 if ($this->Session->Read('eventPermission') != 'Edit') { throw new UnauthorizedException(__('Insufficient privileges')); diff --git a/web/api/app/Controller/MonitorsController.php b/web/api/app/Controller/MonitorsController.php index 3d493762f..9ab7461f9 100644 --- a/web/api/app/Controller/MonitorsController.php +++ b/web/api/app/Controller/MonitorsController.php @@ -17,7 +17,6 @@ class MonitorsController extends AppController { public $components = array('Paginator', 'RequestHandler'); -//# 1155 public function beforeFilter() { parent::beforeFilter(); $canView = $this->Session->Read('monitorPermission'); @@ -37,7 +36,6 @@ public function beforeFilter() { */ public function index() { $this->Monitor->recursive = 0; - //#1155 $allowedMonitors=preg_split ('@,@', $this->Session->Read('allowedMonitors'),NULL, PREG_SPLIT_NO_EMPTY); if (!empty($allowedMonitors)) @@ -67,7 +65,6 @@ public function beforeFilter() { if (!$this->Monitor->exists($id)) { throw new NotFoundException(__('Invalid monitor')); } - //#1155 $allowedMonitors=preg_split ('@,@', $this->Session->Read('allowedMonitors'),NULL, PREG_SPLIT_NO_EMPTY); if (!empty($allowedMonitors)) { @@ -98,7 +95,6 @@ public function beforeFilter() { public function add() { if ($this->request->is('post')) { - //- #1155 if ($this->Session->Read('systemPermission') != 'Edit') { throw new UnauthotizedException(__('Insufficient privileges')); @@ -126,7 +122,6 @@ public function beforeFilter() { if (!$this->Monitor->exists($id)) { throw new NotFoundException(__('Invalid monitor')); } - //- #1155 if ($this->Session->Read('systemPermission') != 'Edit') { throw new UnauthorizedException(__('Insufficient privileges')); @@ -158,7 +153,6 @@ public function beforeFilter() { if (!$this->Monitor->exists()) { throw new NotFoundException(__('Invalid monitor')); } - // #1155 if ($this->Session->Read('systemPermission') != 'Edit') { throw new UnauthorizedException(__('Insufficient privileges')); diff --git a/web/api/app/Model/User.php b/web/api/app/Model/User.php index c0392f51d..8ef18d131 100644 --- a/web/api/app/Model/User.php +++ b/web/api/app/Model/User.php @@ -1,7 +1,6 @@ Date: Sun, 20 Dec 2015 11:22:12 -0500 Subject: [PATCH 42/49] update paths to /usr/share/zoneminder/www and /usr/lib/zoneminder/cgi-bin --- distros/debian_cmake/rules | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/distros/debian_cmake/rules b/distros/debian_cmake/rules index aa0501ab1..4bdc7cb0c 100755 --- a/distros/debian_cmake/rules +++ b/distros/debian_cmake/rules @@ -17,9 +17,9 @@ override_dh_auto_configure: -DZM_SOCKDIR=/var/run/zm \ -DZM_TMPDIR=/var/tmp/zm \ -DZM_LOGDIR=/var/log/zm \ - -DZM_WEBDIR=/usr/share/zoneminder \ + -DZM_WEBDIR=/usr/share/zoneminder/www \ -DZM_CONTENTDIR=/var/cache/zoneminder \ - -DZM_CGIDIR=/usr/lib/cgi-bin \ + -DZM_CGIDIR=/usr/lib/zoneminder/cgi-bin \ -DZM_WEB_USER=www-data \ -DZM_WEB_GROUP=www-data \ -DCMAKE_INSTALL_SYSCONFDIR=etc/zm From 4ef35c8c7081f58b87d163528dbef2e25949a298 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Sun, 20 Dec 2015 11:23:01 -0500 Subject: [PATCH 43/49] No need for a cgi-bin link --- distros/debian_cmake/links | 1 - 1 file changed, 1 deletion(-) diff --git a/distros/debian_cmake/links b/distros/debian_cmake/links index 9715ee428..5560a100a 100644 --- a/distros/debian_cmake/links +++ b/distros/debian_cmake/links @@ -1,4 +1,3 @@ var/cache/zoneminder/events usr/share/zoneminder/events var/cache/zoneminder/images usr/share/zoneminder/images var/cache/zoneminder/temp usr/share/zoneminder/temp -usr/lib/cgi-bin usr/share/zoneminder/cgi-bin From 9743bad13f6d8b9af510ca1c808de042b412e759 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Sun, 20 Dec 2015 12:21:18 -0500 Subject: [PATCH 44/49] Add a valid config if a person is using mod_fcgid instead of mod_php --- distros/ubuntu1204/apache.conf | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/distros/ubuntu1204/apache.conf b/distros/ubuntu1204/apache.conf index 965c67f86..262db423f 100644 --- a/distros/ubuntu1204/apache.conf +++ b/distros/ubuntu1204/apache.conf @@ -1,9 +1,21 @@ Alias /zm /usr/share/zoneminder/www - - php_flag register_globals off - Options Indexes FollowSymLinks - - DirectoryIndex index.php - - + + + Options +ExecCGI + AllowOverride All + AddHandler fcgid-script .php + FCGIWrapper /usr/bin/php5-cgi + Order allow,deny + Allow from all + + + + + php_flag register_globals off + Options Indexes FollowSymLinks + + DirectoryIndex index.php + + + From f4debc203d4f21838650c584a99b4a3c31c29ea2 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Sun, 20 Dec 2015 12:23:40 -0500 Subject: [PATCH 45/49] Only run zmupdate.pl if the mysql db is located here --- distros/ubuntu1504_cmake/zoneminder.postinst | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/distros/ubuntu1504_cmake/zoneminder.postinst b/distros/ubuntu1504_cmake/zoneminder.postinst index 4d2da7331..82b256e6b 100644 --- a/distros/ubuntu1504_cmake/zoneminder.postinst +++ b/distros/ubuntu1504_cmake/zoneminder.postinst @@ -2,6 +2,8 @@ set -e +. /etc/zm/zm.conf + if [ "$1" = "configure" ]; then chown www-data:root /var/log/zm chown www-data:www-data /var/lib/zm @@ -15,9 +17,13 @@ if [ "$1" = "configure" ]; then # 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 + if [ "$ZM_DB_HOST" = "localhost" ]; then + 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 + else + echo "Not doing database upgrade due to remote db server ($ZM_DB_HOST)" + fi; fi From 6ccf36bc770768c147e558636c7d24542d5d172f Mon Sep 17 00:00:00 2001 From: arjunrc Date: Sun, 20 Dec 2015 14:55:48 -0500 Subject: [PATCH 46/49] updated mobile app info --- docs/userguide/mobile.rst | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/docs/userguide/mobile.rst b/docs/userguide/mobile.rst index fe8d6e418..b6feb805d 100644 --- a/docs/userguide/mobile.rst +++ b/docs/userguide/mobile.rst @@ -3,16 +3,17 @@ Mobile Devices Here are some options for using ZoneMinder on Mobile devices: -Using the existing web console -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -* You can directly use the ZoneMinder interface by launching a browser and going to the ZoneMinder server just like you do on the Desktop -* ZoneMinder also has a "mobile skin" that offers limited functionality (not all views are present in this skin). You can point your mobile browser to ``http://yourzoneminderip/zm/index.php?skin=mobile`` and bookmark it - Third party mobile clients ^^^^^^^^^^^^^^^^^^^^^^^^^^^ * zmNinja (`source code `__, needs APIs to be installed to work) - * Currently in free beta testing for iOS and Android. Will be in app/play store as soon as ZM 1.29 is launched -* zmView (limited, free) and zmView Pro (more features, paid) - `website `__ + * Available in App Store and Play Store - `website `__ +* zmView (limited, free) and zmView Pro (more features, paid) + * Available in App Store and Play Store, relies on ZM skins `website `__ + +Using the existing web console +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +* You can directly use the ZoneMinder interface by launching a browser and going to the ZoneMinder server just like you do on the Desktop +* ZoneMinder also has a "mobile skin" that offers limited functionality (not all views are present in this skin). You can point your mobile browser to ``http://yourzoneminderip/zm/index.php?skin=mobile`` and bookmark it. **Note however that 1.29 is the last release that will support the mobile skin. It's use is deprecated** Discontinued clients ^^^^^^^^^^^^^^^^^^^^ From b33c0764fe4eefb72121efbc8a399d7736195f40 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Mon, 21 Dec 2015 12:59:52 -0500 Subject: [PATCH 47/49] update to new cgi-bin path --- distros/debian_cmake/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/distros/debian_cmake/install b/distros/debian_cmake/install index 9e8953409..1bd76421f 100644 --- a/distros/debian_cmake/install +++ b/distros/debian_cmake/install @@ -1,5 +1,5 @@ usr/bin -usr/lib/cgi-bin +usr/lib/zoneminder/cgi-bin usr/share/man usr/share/perl5/ZoneMinder usr/share/perl5/ZoneMinder.pm From abda4411e94be1caca88b8840452e8a8db2030f2 Mon Sep 17 00:00:00 2001 From: SteveGilvarry Date: Wed, 23 Dec 2015 19:34:31 +1100 Subject: [PATCH 48/49] Revert to Default Theme, RTD will use their own and local builds default sphinx theme --- docs/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 109161b24..9bda5df7b 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -101,8 +101,8 @@ pygments_style = 'sphinx' # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -#html_theme = 'default' -html_theme = 'sphinx_rtd_theme' +html_theme = 'default' +#html_theme = 'sphinx_rtd_theme' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the From e6e8a75b645654024ca18ca554dcdc12ce962b72 Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Sun, 27 Dec 2015 11:48:53 -0600 Subject: [PATCH 49/49] Update zoneminder.f23.spec --- distros/fedora/zoneminder.f23.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/distros/fedora/zoneminder.f23.spec b/distros/fedora/zoneminder.f23.spec index 97f0e73ac..da19c80ee 100644 --- a/distros/fedora/zoneminder.f23.spec +++ b/distros/fedora/zoneminder.f23.spec @@ -38,7 +38,7 @@ BuildRequires: gcc gcc-c++ vlc-devel libcurl-devel libv4l-devel BuildRequires: httpd polkit-devel %{!?_without_ffmpeg:BuildRequires: ffmpeg} -Requires: httpd php php-gd php-mysql cambozola polkit net-tools psmisc +Requires: httpd php php-gd php-mysql cambozola polkit net-tools psmisc mod_ssl Requires: libjpeg-turbo vlc-core libcurl Requires: perl(:MODULE_COMPAT_%(eval "`%{__perl} -V:version`"; echo $version)) Requires: perl(DBD::mysql) perl(Archive::Tar) perl(Archive::Zip)