Merge branch 'storageareas' of github.com:ZoneMinder/ZoneMinder into storageareas

This commit is contained in:
Isaac Connor 2016-02-12 19:12:12 -05:00
commit 0ff0262c8b
91 changed files with 3160 additions and 510 deletions

View File

@ -1,5 +1,29 @@
# Change Log
## [v1.29.0](https://github.com/ZoneMinder/ZoneMinder/tree/v1.29.0) (2016-02-03)
[Full Changelog](https://github.com/ZoneMinder/ZoneMinder/compare/v1.29.0-rc2...v1.29.0)
**Merged pull requests:**
- 1253 zms quit cmd [\#1254](https://github.com/ZoneMinder/ZoneMinder/pull/1254) ([pliablepixels](https://github.com/pliablepixels))
- Add Debug/Info lines reporting multi-server status [\#1252](https://github.com/ZoneMinder/ZoneMinder/pull/1252) ([connortechnology](https://github.com/connortechnology))
- Do debian package mods [\#1244](https://github.com/ZoneMinder/ZoneMinder/pull/1244) ([pliablepixels](https://github.com/pliablepixels))
- zmtrigger - process off+time delay condition [\#1240](https://github.com/ZoneMinder/ZoneMinder/pull/1240) ([knnniggett](https://github.com/knnniggett))
- Multi server [\#1233](https://github.com/ZoneMinder/ZoneMinder/pull/1233) ([connortechnology](https://github.com/connortechnology))
- remove Google open Sans external import [\#1232](https://github.com/ZoneMinder/ZoneMinder/pull/1232) ([connortechnology](https://github.com/connortechnology))
- PTZ - Added autostop to Down command on FI8918W [\#1189](https://github.com/ZoneMinder/ZoneMinder/pull/1189) ([marcolino7](https://github.com/marcolino7))
## [v1.29.0-rc2](https://github.com/ZoneMinder/ZoneMinder/tree/v1.29.0-rc2) (2016-01-05)
[Full Changelog](https://github.com/ZoneMinder/ZoneMinder/compare/v1.29.0-rc1...v1.29.0-rc2)
**Merged pull requests:**
- Multi server [\#1223](https://github.com/ZoneMinder/ZoneMinder/pull/1223) ([connortechnology](https://github.com/connortechnology))
- Multi server [\#1222](https://github.com/ZoneMinder/ZoneMinder/pull/1222) ([connortechnology](https://github.com/connortechnology))
- Multi server [\#1217](https://github.com/ZoneMinder/ZoneMinder/pull/1217) ([connortechnology](https://github.com/connortechnology))
- Multi server [\#1215](https://github.com/ZoneMinder/ZoneMinder/pull/1215) ([connortechnology](https://github.com/connortechnology))
- Change log updates [\#1172](https://github.com/ZoneMinder/ZoneMinder/pull/1172) ([SteveGilvarry](https://github.com/SteveGilvarry))
## [v1.29.0-rc1](https://github.com/ZoneMinder/ZoneMinder/tree/v1.29.0-rc1) (2016-01-01)
[Full Changelog](https://github.com/ZoneMinder/ZoneMinder/compare/v1.28.1...v1.29.0-rc1)
@ -328,7 +352,7 @@
- Fix window sizes and input field sizes for flat skin [\#381](https://github.com/ZoneMinder/ZoneMinder/pull/381) ([m-bene](https://github.com/m-bene))
- Fix reload loop on switching skins [\#380](https://github.com/ZoneMinder/ZoneMinder/pull/380) ([m-bene](https://github.com/m-bene))
- Ability to skip frames in motion detection. [\#377](https://github.com/ZoneMinder/ZoneMinder/pull/377) ([Sune1337](https://github.com/Sune1337))
- same dvr controlls in event as in monitor [\#375](https://github.com/ZoneMinder/ZoneMinder/pull/375) ([m-bene](https://github.com/m-bene))
- same dvr controls in event as in monitor [\#375](https://github.com/ZoneMinder/ZoneMinder/pull/375) ([m-bene](https://github.com/m-bene))
- do not quote column names in parse filter [\#374](https://github.com/ZoneMinder/ZoneMinder/pull/374) ([m-bene](https://github.com/m-bene))
- Fix 'Undefined index: filter' php warnings for filter view when [\#373](https://github.com/ZoneMinder/ZoneMinder/pull/373) ([m-bene](https://github.com/m-bene))
- Reduce window size to exclude task bar area [\#371](https://github.com/ZoneMinder/ZoneMinder/pull/371) ([m-bene](https://github.com/m-bene))

View File

@ -4,7 +4,7 @@
#
cmake_minimum_required (VERSION 2.6)
project (zoneminder)
set(zoneminder_VERSION "1.29.1")
set(zoneminder_VERSION "1.30.2")
# make API version a minor of ZM version
set(zoneminder_API_VERSION "${zoneminder_VERSION}.1")

View File

@ -1,6 +1,6 @@
# ZoneMinder
FROM ubuntu:precise
FROM ubuntu:trusty
MAINTAINER Kyle Johnson <kjohnson@gnulnx.net>
# Let the container know that there is no tty
@ -10,10 +10,10 @@ ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && apt-get install -y \
libpolkit-gobject-1-dev 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 \
libwww-perl libdbd-mysql-perl libsys-mmap-perl yasm cmake libjpeg-turbo8-dev \
libjpeg-turbo8 libtheora-dev libvorbis-dev libvpx-dev libx264-dev libmp4v2-dev libav-tools mysql-client \
apache2 php5 php5-mysql apache2-mpm-prefork libapache2-mod-php5 php5-cli openssh-server \
mysql-server libvlc-dev libvlc5 libvlccore-dev libvlccore5 vlc-data libcurl4-openssl-dev \
mysql-server libvlc-dev libvlc5 libvlccore-dev libvlccore7 vlc-data libcurl4-openssl-dev \
libavformat-dev libswscale-dev libavutil-dev libavcodec-dev libavfilter-dev \
libavresample-dev libavdevice-dev libpostproc-dev libv4l-dev libtool libnetpbm10-dev \
libmime-lite-perl dh-autoreconf dpatch
@ -25,10 +25,11 @@ ADD . /ZoneMinder
WORKDIR /ZoneMinder
# Setup the ZoneMinder build environment
RUN aclocal && autoheader && automake --force-missing --add-missing && autoconf
#RUN aclocal && autoheader && automake --force-missing --add-missing && autoconf
# Configure ZoneMinder
RUN ./configure --with-libarch=lib/$DEB_HOST_GNU_TYPE --disable-debug --host=$DEB_HOST_GNU_TYPE --build=$DEB_BUILD_GNU_TYPE --with-mysql=/usr --with-webdir=/var/www/zm --with-ffmpeg=/usr --with-cgidir=/usr/lib/cgi-bin --with-webuser=www-data --with-webgroup=www-data --enable-mmap=yes ZM_SSL_LIB=openssl ZM_DB_USER=zm ZM_DB_PASS=zm
#RUN ./configure --with-libarch=lib/$DEB_HOST_GNU_TYPE --disable-debug --host=$DEB_HOST_GNU_TYPE --build=$DEB_BUILD_GNU_TYPE --with-mysql=/usr --with-webdir=/var/www/zm --with-ffmpeg=/usr --with-cgidir=/usr/lib/cgi-bin --with-webuser=www-data --with-webgroup=www-data --enable-mmap=yes --enable-onvif ZM_SSL_LIB=openssl ZM_DB_USER=zm ZM_DB_PASS=zm
RUN cmake .
# Build ZoneMinder
RUN make
@ -36,6 +37,9 @@ RUN make
# Install ZoneMinder
RUN make install
# ensure writable folders
RUN ./zmlinkcontent.sh
# Adding the start script
ADD utils/docker/start.sh /tmp/start.sh
@ -43,15 +47,23 @@ ADD utils/docker/start.sh /tmp/start.sh
# TODO - Files ADD'ed have 755 already...why do we need this?
RUN chmod 755 /tmp/start.sh
# Creating SSH privledge escalation dir
# give files in /usr/local/share/zoneminder/
RUN chown -R www-data:www-data /usr/local/share/zoneminder/
# Creating SSH privilege escalation dir
RUN mkdir /var/run/sshd
# Adding apache virtual hosts file
ADD utils/docker/apache-vhost /etc/apache2/sites-enabled/000-default
ADD utils/docker/apache-vhost /etc/apache2/sites-available/000-default.conf
ADD utils/docker/phpdate.ini /etc/php5/apache2/conf.d/25-phpdate.ini
# Set the root passwd
RUN echo 'root:root' | chpasswd
# Add a user we can actually login with
RUN useradd -m -s /bin/bash -G sudo zoneminder
RUN echo 'zoneminder:zoneminder' | chpasswd
# Expose ssh and http ports
EXPOSE 80
EXPOSE 22

View File

@ -18,7 +18,7 @@ Important differences
---------------------
* Unlike the autotools way, the cmake way does not require any options. It attempts to detect some things by its own (system directories, libarch, web user and group) and uses defaults for others (installation paths and such).
* Unlike the autotools way, which links the binaries to a fixed list of libraries, the cmake way only links to libraries that it found on the system. If a library is not found, but required, a fatal error will be shown during the configuration step.
* Unlike the autotools way, the cmake way does not modify the system in any way it shouldnt. It only does what its supposed to do: Install files to your system. Nothing else and nothing leaks out of the DESTDIR environment variable (if used). This means that depending on your configuration, there might be an extra required step after installation: to link WEB_PATH/events and WEB_PATH/images folders to the correct places.
* Unlike the autotools way, the cmake way does not modify the system in any way it shouldn't. It only does what its supposed to do: Install files to your system. Nothing else and nothing leaks out of the DESTDIR environment variable (if used). This means that depending on your configuration, there might be an extra required step after installation: to link WEB_PATH/events and WEB_PATH/images folders to the correct places.
Configuration
-------------

View File

@ -227,7 +227,7 @@ Now clone the ZoneMinder git repository:
```bash
git clone https://github.com/ZoneMinder/ZoneMinder
```
This will create a sub-folder called ZoneMinder, which will contain the latest developement.
This will create a sub-folder called ZoneMinder, which will contain the latest development.
We want to turn this into a tarball, but first we need to figure out what to name it. Look here:
```bash

View File

@ -3,7 +3,7 @@
# For instructions on building with cmake, please see INSTALL
#
AC_PREREQ(2.59)
AC_INIT(zm,1.29.1,[http://www.zoneminder.com/forums/ - Please check FAQ first],zoneminder,http://www.zoneminder.com/downloads.html)
AC_INIT(zm,1.30.2,[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)

View File

@ -227,6 +227,7 @@ CREATE TABLE `Filters` (
`AutoExecuteCmd` tinytext,
`AutoDelete` tinyint(3) unsigned NOT NULL default '0',
`Background` tinyint(1) unsigned NOT NULL default '0',
`Concurrent` tinyint(1) unsigned NOT NULL default '0',
PRIMARY KEY (`Name`)
) ENGINE=@ZM_MYSQL_ENGINE@;
@ -414,6 +415,7 @@ INSERT INTO States (Name,Definition,IsActive) VALUES ('default','','1');
DROP TABLE IF EXISTS `Servers`;
CREATE TABLE `Servers` (
`Id` int(10) unsigned NOT NULL auto_increment,
`Hostname` TEXT,
`Name` varchar(64) NOT NULL default '',
`State_Id` int(10) unsigned,
PRIMARY KEY (`Id`)
@ -603,8 +605,9 @@ INSERT INTO Controls VALUES (NULL,'ONVIF Camera','Ffmpeg','onvif',0,0,1,1,0,0,0,
INSERT INTO `Controls` VALUES (NULL,'Foscam 9831W','Ffmpeg','FI9831W',0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,16,1,1,1,1,0,0,0,1,1,0,360,0,360,1,0,4,0,0,1,0,90,0,90,0,0,0,0,0,0,0);
INSERT INTO `Controls` VALUES (NULL,'Foscam FI8918W','Ffmpeg','FI8918W',0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,8,0,1,1,1,0,0,0,1,1,0,360,0,360,1,0,4,0,0,1,0,90,0,90,1,0,4,0,0,0,0);
INSERT INTO `Controls` VALUES (NULL,'SunEyes SP-P1802SWPTZ','Libvlc','SPP1802SWPTZ',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,8,0,1,1,0,0,0,0,1,1,0,0,0,0,1,0,64,0,0,1,0,0,0,0,1,0,64,0,0,0,0);
INSERT INTO `Controls` VALUES (NULL,'Wanscam HW0025','Libvlc','WanscamHW0025', 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 16, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 350, 0, 0, 1, 0, 10, 0, 0, 1, 0, 0, 0, 0, 1, 0, 10, 0, 0, 0, 0);
INSERT INTO `Controls` VALUES (NULL,'IPCC 7210W','Libvlc','IPCC7210W', 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 16, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 350, 0, 0, 1, 0, 10, 0, 0, 1, 0, 0, 0, 0, 1, 0, 10, 0, 0, 0, 0);
INSERT INTO `Controls` VALUES (NULL,'Vivotek ePTZ','Remote','Vivotek_ePTZ',0,0,1,1,0,0,0,1,0,0,0,0,1,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,1,0,5,0,0,1,0,0,0,0,1,0,5,0,0,0,0);
--
-- Add some monitor preset values

View File

@ -1,5 +1,5 @@
--
-- This updates a 1.28.106 database to 1.28.107
-- This updates a 1.28.108 database to 1.28.109
--
--

110
db/zm_update-1.30.1.sql Normal file
View File

@ -0,0 +1,110 @@
--
-- This updates a 1.28.108 database to 1.28.109
--
--
-- Add Controls definition for Vivotek ePTZ
--
INSERT INTO Controls
SELECT * FROM (SELECT NULL as Id,
'Vivotek ePTZ' as Name,
'Remote' as Type,
'Vivotek_ePTZ' as Protocol,
0 as CanWake,
0 as CanSleep,
1 as CanReset,
1 as CanZoom,
0 as CanAutoZoom,
0 as CanZoomAbs,
0 as CanZoomRel,
1 as CanZoomCon,
0 as MinZoomRange,
0 as MaxZoomRange,
0 as MinZoomStep,
0 as MaxZoomStep,
1 as HasZoomSpeed,
0 as MinZoomSpeed,
5 as MaxZoomSpeed,
0 as CanFocus,
0 as CanAutoFocus,
0 as CanFocusAbs,
0 as CanFocusRel,
0 as CanFocusCon,
0 as MinFocusRange,
0 as MaxFocusRange,
0 as MinFocusStep,
0 as MaxFocusStep,
0 as HasFocusSpeed,
0 as MinFocusSpeed,
0 as MaxFocusSpeed,
0 as CanIris,
0 as CanAutoIris,
0 as CanIrisAbs,
0 as CanIrisRel,
0 as CanIrisCon,
0 as MinIrisRange,
0 as MaxIrisRange,
0 as MinIrisStep,
0 as MaxIrisStep,
0 as HasIrisSpeed,
0 as MinIrisSpeed,
0 as MaxIrisSpeed,
0 as CanGain,
0 as CanAutoGain,
0 as CanGainAbs,
0 as CanGainRel,
0 as CanGainCon,
0 as MinGainRange,
0 as MaxGainRange,
0 as MinGainStep,
0 as MaxGainStep,
0 as HasGainSpeed,
0 as MinGainSpeed,
0 as MaxGainSpeed,
0 as CanWhite,
0 as CanAutoWhite,
0 as CanWhiteAbs,
0 as CanWhiteRel,
0 as CanWhiteCon,
0 as MinWhiteRange,
0 as MaxWhiteRange,
0 as MinWhiteStep,
0 as MaxWhiteStep,
0 as HasWhiteSpeed,
0 as MinWhiteSpeed,
0 as MaxWhiteSpeed,
0 as HasPresets,
0 as NumPresets,
0 as HasHomePreset,
0 as CanSetPresets,
1 as CanMove,
0 as CanMoveDiag,
0 as CanMoveMap,
0 as CanMoveAbs,
0 as CanMoveRel,
1 as CanMoveCon,
1 as CanPan,
0 as MinPanRange,
0 as MaxPanRange,
0 as MinPanStep,
0 as MaxPanStep,
1 as HasPanSpeed,
0 as MinPanSpeed,
5 as MaxPanSpeed,
0 as HasTurboPan,
0 as TurboPanSpeed,
1 as CanTilt,
0 as MinTiltRange,
0 as MaxTiltRange,
0 as MinTiltStep,
0 as MaxTiltStep,
1 as HasTiltSpeed,
0 as MinTiltSpeed,
5 as MaxTiltSpeed,
0 as HasTurboTilt,
0 as TurboTiltSpeed,
0 as CanAutoScan,
0 as NumScanPaths) AS tmp
WHERE NOT EXISTS (
SELECT Name FROM Controls WHERE name = 'Vivotek ePTZ'
) LIMIT 1;

21
db/zm_update-1.30.2.sql Normal file
View File

@ -0,0 +1,21 @@
--
-- This updates a 1.30.1 database to 1.30.2
--
--
-- Update Filters table to have a Concurrent Column
--
SET @s = (SELECT IF(
(SELECT COUNT(*)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'Filters'
AND table_schema = DATABASE()
AND column_name = 'Concurrent'
) > 0,
"SELECT 'Column Concurrent already exists in Filters'",
"ALTER TABLE Filters ADD COLUMN `Concurrent` tinyint(1) unsigned NOT NULL default '0' AFTER Background"
));
PREPARE stmt FROM @s;
EXECUTE stmt;

View File

@ -39,7 +39,7 @@ install(CODE "execute_process(COMMAND ln -sf ../../../../../../var/lib/zoneminde
# Fedora requires cambozola as a separate package so just link to it
install(CODE "execute_process(COMMAND ln -sf ../../java/cambozola.jar \"\$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATAROOTDIR}/zoneminder/www/cambozola.jar\")")
# Install auxillary files required to run zoneminder on Fedora
# Install auxiliary files required to run zoneminder on Fedora
install(FILES zoneminder.conf DESTINATION /etc/httpd/conf.d PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ)
install(FILES zoneminder.logrotate DESTINATION /etc/logrotate.d RENAME zoneminder PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ)
install(FILES ../../misc/zoneminder-tmpfiles.conf DESTINATION /etc/tmpfiles.d RENAME zoneminder.conf PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ)

View File

@ -44,12 +44,10 @@ New installs
set during the previous step, you will need to create the ZoneMinder
database and configure a database account for ZoneMinder to use:
mysql -u root -p < /usr/share/zoneminder/db/zm_create.sql
mysql -u root -p
mysql> grant all
on zm.* to 'zmuser'@localhost identified by 'zmpass';
mysql> exit;
mysqladmin -u root -p reload
mysql -uroot -p < /usr/share/zoneminder/db/zm_create.sql
mysql -uroot -p -e "grant all on zm.* to \
'zmuser'@localhost identified by 'zmpass';"
mysqladmin -uroot -p reload
The database account credentials, zmuser/zmpass, are arbitrary. Set them to
anything that suits your envinroment.
@ -125,9 +123,7 @@ Upgrades
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;
mysql> exit;
mysql -uroot -p -e "show grants for zmuser@localhost;"
See step 2 of the Installation section to add missing permissions.

View File

@ -65,7 +65,7 @@ too much degradation of performance.
%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_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
@ -138,7 +138,7 @@ fi
%files
%defattr(-,root,root,-)
%doc AUTHORS COPYING README.md distros/fedora/README.Fedora distros/fedora/jscalendar-doc
%doc AUTHORS COPYING README.md distros/fedora/README.Fedora distros/fedora/README.https 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

View File

@ -65,7 +65,7 @@ too much degradation of performance.
%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_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
@ -138,7 +138,7 @@ fi
%files
%defattr(-,root,root,-)
%doc AUTHORS COPYING README.md distros/fedora/README.Fedora distros/fedora/jscalendar-doc
%doc AUTHORS COPYING README.md distros/fedora/README.Fedora distros/fedora/README.https 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

View File

@ -38,7 +38,7 @@ install(CODE "execute_process(COMMAND ln -sf ../../../../${zm_webdir}/temp \"\$E
# Opensuse cambazola? requires cambozola as a separate package so just link to it
#install(CODE "execute_process(COMMAND ln -sf ../../java/cambozola.jar \"\$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATAROOTDIR}/zoneminder/www/cambozola.jar\")")
# Install auxillary files required to run zoneminder on OpenSuse
# Install auxiliary files required to run zoneminder on OpenSuse
install(FILES zoneminder.conf DESTINATION /etc/apache2/conf.d PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ)
install(FILES zoneminder.logrotate DESTINATION /etc/logrotate.d RENAME zoneminder PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ)
install(FILES zoneminder.tmpfiles DESTINATION /etc/tmpfiles.d RENAME zoneminder.conf PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)

View File

@ -138,7 +138,7 @@ Upgrades
has select, insert, update, and delete permission.
3. You will need to upgrade the ZoneMinder database as described in the
manual. Only if the previous step was succesful, may you run zmupdate like
manual. Only if the previous step was successful, may you run zmupdate like
so (as root):
/opt/zoneminder/bin/zmupdate.pl

View File

@ -57,7 +57,7 @@ install(CODE "execute_process(COMMAND ln -sf ../../../../../../var/lib/zoneminde
# Link to Cambozola, which is now packaged in zmrepo
install(CODE "execute_process(COMMAND ln -sf ../../java/cambozola.jar \"\$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATAROOTDIR}/zoneminder/www/cambozola.jar\")")
# Install auxillary files required to run zoneminder on CentOS
# Install auxiliary files required to run zoneminder on CentOS
install(FILES redalert.wav DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATAROOTDIR}/zoneminder/www/sounds PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
if(ZM_TARGET_DISTRO STREQUAL "el7")
install(FILES zoneminder.el7.conf DESTINATION /etc/httpd/conf.d RENAME zoneminder.conf PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ)

View File

@ -30,12 +30,9 @@ New installs
will need to create the ZoneMinder database and configure a database
account for ZoneMinder to use:
mysql -uroot -p
mysql> create database zm;
mysql> grant all
on zm.* to 'zmuser'@localhost identified by 'zmpass';
mysql> exit;
mysql -uroot -p < /usr/share/zoneminder/db/zm_create.sql
mysql -uroot -p -e "grant all on zm.* to \
'zmuser'@localhost identified by 'zmpass';"
mysqladmin -uroot -p reload
The database account credentials, zmuser/zmpass, are arbitrary. Set them to
@ -117,9 +114,7 @@ New installs
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;
mysql> exit;
mysql -uroot -p -e "show grants for zmuser@localhost;"
See step 2 of the Installation section to add missing permissions.

View File

@ -32,12 +32,10 @@ New installs
will need to create the ZoneMinder database and configure a database
account for ZoneMinder to use:
mysql -u root -p < /usr/share/zoneminder/db/zm_create.sql
mysql -u root -p
mysql> grant all
on zm.* to 'zmuser'@localhost identified by 'zmpass';
mysql> exit;
mysqladmin -u root -p reload
mysql -uroot -p < /usr/share/zoneminder/db/zm_create.sql
mysql -uroot -p -e "grant all on zm.* to \
'zmuser'@localhost identified by 'zmpass';"
mysqladmin -uroot -p reload
The database account credentials, zmuser/zmpass, are arbitrary. Set them to
anything that suits your envinroment.
@ -112,9 +110,7 @@ Upgrades
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;
mysql> exit;
mysql -uroot -p -e "show grants for zmuser@localhost;"
See step 2 of the Installation section to add missing permissions.

View File

@ -130,7 +130,7 @@ rm -rf %{_docdir}/%{name}-%{version}
%files
%defattr(-,root,root,-)
%doc AUTHORS BUGS ChangeLog COPYING LICENSE NEWS README.md distros/redhat/README.CentOS distros/redhat/jscalendar-doc
%doc AUTHORS BUGS ChangeLog COPYING LICENSE NEWS README.md distros/redhat/README.CentOS distros/redhat/README.https distros/redhat/jscalendar-doc
%doc distros/redhat/local_zoneminder.te
%config %attr(640,root,%{zmgid_final}) %{_sysconfdir}/zm.conf
%config(noreplace) %attr(644,root,root) %{_sysconfdir}/httpd/conf.d/zoneminder.conf

View File

@ -137,7 +137,7 @@ fi
%files
%defattr(-,root,root,-)
%doc AUTHORS BUGS ChangeLog COPYING LICENSE NEWS README.md distros/redhat/README.Centos7 distros/redhat/jscalendar-doc
%doc AUTHORS BUGS ChangeLog COPYING LICENSE NEWS README.md distros/redhat/README.Centos7 distros/redhat/README.https distros/redhat/jscalendar-doc
%doc distros/redhat/local_zoneminder.te
%config %attr(640,root,%{zmgid_final}) /etc/zm/zm.conf
%config(noreplace) %attr(644,root,root) /etc/httpd/conf.d/zoneminder.conf

View File

@ -525,7 +525,7 @@ zoneminder (1.22.3-7) unstable; urgency=low
zoneminder (1.22.3-6) unstable; urgency=low
* Removed a similar bash only statment from zmpkg.pl
* Removed a similar bash only statement from zmpkg.pl
(closes:414882)
-- Peter Howard <pjh@northern-ridge.com.au> Sat, 14 Apr 2007 11:46:56 +1000

View File

@ -51,7 +51,7 @@ Depends: ${shlibs:Depends}, ${misc:Depends}, ${perl:Depends}
,libwww-perl
,mysql-client | virtual-mysql-client
,perl-modules
,php5-mysql
,php5-mysql, php5-gd
,policykit-1
,rsyslog | system-log-daemon
,zip

View File

@ -1,3 +1,21 @@
zoneminder (1.29.111-trusty-2016020101) trusty; urgency=medium
* Fix video download and use of Storage Areas
-- Isaac Connor <iconnor@testing.internal.point-one.com> Mon, 01 Feb 2016 13:42:06 -0500
zoneminder (1.29.111-trusty-2016011401) trusty; urgency=medium
* fix timeline view for storageareas
-- Isaac Connor <iconnor@testing.internal.point-one.com> Thu, 14 Jan 2016 14:03:41 -0500
zoneminder (1.29.111-trusty-2016010801) trusty; urgency=medium
* Add better debug and skip when event links are not just digits. Merge multi-server stuff from master.
-- Isaac Connor <iconnor@testing.internal.point-one.com> Fri, 08 Jan 2016 10:37:16 -0500
zoneminder (1.29.111-trusty-2016010401) trusty; urgency=medium
* include fix to rotate image dimensions when applying a rotation

View File

@ -86,7 +86,7 @@ Section: web
Architecture: any
Depends: zoneminder-core (= ${binary:Version}), ${shlibs:Depends},
${misc:Depends}, debconf, apache2, libapache2-mod-php5 | libapache2-mod-fcgid,
php5, php5-mysql | php5-mysqlnd
php5, php5-mysql | php5-mysqlnd, php5-gd
Description: Essential files for ZoneMinder's web user interface
ZoneMinder is a video camera security and surveillance solution.
.

View File

@ -525,7 +525,7 @@ zoneminder (1.22.3-7) unstable; urgency=low
zoneminder (1.22.3-6) unstable; urgency=low
* Removed a similar bash only statment from zmpkg.pl
* Removed a similar bash only statement from zmpkg.pl
(closes:414882)
-- Peter Howard <pjh@northern-ridge.com.au> Sat, 14 Apr 2007 11:46:56 +1000

View File

@ -51,7 +51,7 @@ Depends: ${shlibs:Depends}, ${misc:Depends}, ${perl:Depends}
,libwww-perl
,mysql-client | virtual-mysql-client
,perl-modules
,php5-mysql
,php5-mysql, php5-gd
,policykit-1
,rsyslog | system-log-daemon
,zip
@ -105,7 +105,7 @@ Package: zoneminder-doc
Section: doc
Architecture: all
Multi-Arch: foreign
Depends: ${misc:Depends}, ${sphinxdoc:Depends}
Depends: ${misc:Depends}, ${sphinxdoc:Depends}, python-sphinx-rtd-theme | python3-sphinx-rtd-theme
Suggests: www-browser
Description: ZoneMinder documentation
ZoneMinder is intended for use in single or multi-camera video security

View File

@ -1,10 +1,10 @@
/var/log/zm/*log {
/var/log/zm/*.log {
missingok
notifempty
sharedscripts
postrotate
/usr/bin/zmpkg.pl logrot >>/dev/null 2>&1 || :
endscript
weekly
rotate 3
daily
rotate 7
}

View File

@ -87,8 +87,6 @@ exclude_patterns = ['_build']
# output. They are ignored by default.
#show_authors = False
import sphinx_rtd_theme
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
@ -115,7 +113,6 @@ html_theme = 'default'
# Add any paths that contain custom themes here, relative to this directory.
#html_theme_path = []
html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".

View File

@ -238,7 +238,7 @@ The second approach is to use diagnostic images which are saved copies of the in
There are two kinds of diagnostic images which are and are written (and continuously overwritten) to the top level monitor event directory. If an event occurs then the files are additionally copied to the event directory and renamed with the appropriate frame number as a prefix.
The first set are produced by the monitor on the image as a whole. The diag-r.jpg image is the current reference image against which all individual frames are compared and the diag-d.jpg image is the delta image highlighting the difference between the reference image and the last analysed image. In this images identicial pixels will be black and the more different a pixel is the whiter it will be. Viewing this image and determining the colour of the pixels is a good way of getting a feel for the pixel differences you might expect (often more than you think).
The first set are produced by the monitor on the image as a whole. The diag-r.jpg image is the current reference image against which all individual frames are compared and the diag-d.jpg image is the delta image highlighting the difference between the reference image and the last analysed image. In this images identical pixels will be black and the more different a pixel is the whiter it will be. Viewing this image and determining the colour of the pixels is a good way of getting a feel for the pixel differences you might expect (often more than you think).
The second set of diag images are labelled as diag-<zoneid>-<stage>.jpg where zoneid is the id of the zone in question (Smile) and the stage is where in the alarm check process the image is generated from. So if you have several zones you can expect to see multiple files. Also these files are only interested in what is happening in their zone only and will ignore anything else outside of the zone. The stages that each number represents are as follows,
@ -617,14 +617,14 @@ How can I trouble shoot the hardware and/or software?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Here are some commands to get information about your hardware. Some commands are distribution dependent.
* ``[[lspci]] -vv`` -- Returns lots of detailed info. Check for conflicting interrupts or port assignments. You can sometimes alter interrupts/ ports in bios. Try a different pci slot to get a clue if it is HW conflict (comand provided by the pciutils package).
* ``[[lspci]] -vv`` -- Returns lots of detailed info. Check for conflicting interrupts or port assignments. You can sometimes alter interrupts/ ports in bios. Try a different pci slot to get a clue if it is HW conflict (command provided by the pciutils package).
* ``[[scanpci]] -v`` -- Gives you information from your hardware EPROM
* ``[[lsusb]] -vv`` -- Returns lots of detail about USB devices (camand provided by usbutils package).
* ``[[dmesg]]`` -- Shows you how your hardware initialized (or didn't) on boot-up. You will get the most use of this.
* ``[[v4l-info]]`` -- to see how driver is talking to card. look for unusual values.
* ``[[modinfo bttv]]`` -- some bttv driver stats.
* ``[[zmu]] -m 0 -q -v`` -- Returns various information regarding a monitor configuration.
* ``[[ipcs]] `` -- Provides information on the ipc facilities for which the calling process has read acccess.
* ``[[ipcs]] `` -- Provides information on the ipc facilities for which the calling process has read access.
* ``[[ipcrm]] `` -- The ipcrm command can be used to remove an IPC object from the kernel.
* ``cat /proc/interrupts`` -- This will dispaly what interrupts your hardware is using.

View File

@ -13,7 +13,7 @@ ZoneMinder Documentation
Welcome to ZoneMinder's documentation, the following resources are available
:doc:`installationguide/index`
Many distrubution repos only hold older versions of ZoneMinder, current versions contain many bug fixes and updated functionality. Instructions here for installing updated packages or compiling from source.
Many distribution repos only hold older versions of ZoneMinder, current versions contain many bug fixes and updated functionality. Instructions here for installing updated packages or compiling from source.
:doc:`userguide/index`
Guide to setting up ZoneMinder for the first time and detailed guides for using the ZoneMinder front end.

View File

@ -21,7 +21,7 @@ New installs
1. Follow the normal instructions for your distro for installing ZoneMinder onto all the ZoneMinder servers in the normal fashion. Only a single database will be needed either as standalone, or on one of the ZoneMinder Servers.
2. On each ZoneMinder server, edit zm.conf. Find the ZM_DB_HOST variable and set it to the name or ip address of your Database Server.
2. On each ZoneMinder server, edit zm.conf. Find the ZM_DB_HOST variable and set it to the name or ip address of your Database Server. Find the ZM_SERVER_HOST and enter a name for this ZoneMinder server. Use a name easily recognizable by you. This name is not used by ZoneMinder for dns or any other form of network conectivity.
3. Copy the file /usr/share/zoneminder/db/zm_create.sql from one of the ZoneMinder Servers to the machine targeted as the Database Server.
@ -34,9 +34,7 @@ New installs
::
mysql -u root -p < zm_create.sql
mysql -u root -p
mysql> grant all on zm.* to 'zmuser'@'%' identified by 'zmpass';
mysql> exit;
mysql -uroot -p -e "grant all on zm.* to 'zmuser'@localhost identified by 'zmpass';"
mysqladmin -u root -p reload
The database account credentials, zmuser/zmpass, are arbitrary. Set them to anything that suits your environment.
@ -52,6 +50,6 @@ Additionally, you must also edit /usr/share/zoneminder/www/api/app/Config/databa
NOTE: The location of this folder varies by distro. This folder is often found under "/var/lib/zoneminder/events" for RedHat based distros and "/var/cache/zoneminder/events" for Debain based distros. This folder is NOT a Symbolic Link!
10. Open your browser and point it to the web console on any of the ZoneMinder Servers (they will all be the same). Open Options, click the Servers tab,and populate this screen with all of your ZoneMinder Servers.
10. Open your browser and point it to the web console on any of the ZoneMinder Servers (they will all be the same). Open Options, click the Servers tab,and populate this screen with all of your ZoneMinder Servers. Each server has a field for its name and its hostname. The name is what you used for ZM_SERVER_HOST in step 2. The hostname is the network name or ip address ZoneMinder should use.
11. When creating a new Monitor, remember to select the server the camera will be assigned to from the Server drop down box.

View File

@ -35,7 +35,7 @@ Type
Suppresses the detection of motion within it. This can be layered on top of any other zone type, preventing motion within the Inactive zone from being effective for any other zone type. Use inactive zones to cover areas in which nothing notable will ever happen or where you get false alarms that don't relate to what you are trying to monitor. Inactive zones may be overlaid on other zones to blank out areas, and are processed first (with the exception of Privacy zones, see below). As a general practice, you should try and make zones abut each other instead of overlapping to avoid repeated duplicate processing of the same area.
* Privacy
Blackens the pixels within it. This can be used if you want to hide some regions in the image if the situation does not allow an other solution. This zone type is different to all the others in that it gets processed as soon as possible during capture (even before the timestamp gets into the image) and not in the analyzing process. So if you add, change or delete a Privacy zone, you don't see the changes in the image until the capture process gets restarted. This will be done automatically, but needs a few seconds.
Blackens the pixels within it. This can be used if you want to hide some regions in the image if the situation does not allow another solution. This zone type is different to all the others in that it gets processed as soon as possible during capture (even before the timestamp gets into the image) and not in the analyzing process. So if you add, change or delete a Privacy zone, you don't see the changes in the image until the capture process gets restarted. This will be done automatically, but needs a few seconds.
Preset
The preset chooser sets sensible default values based on computational needs (fast v. best) and sensitivity (low, medium, high.) It is not required that you select a preset, and you can alter any of the parameters after choosing a preset. For a small number of monitors with ZoneMinder running on modern equipment, Best, high sensitivity can be chosen as a good starting point.

View File

@ -90,7 +90,7 @@ Saving filters
.. image:: images/filter-save.png
:width: 400px
When saving filters, if you want the filter to run in the background make sure you select the "Run filter in background" option. When checked, ZoneMinder will make sure the filter is checked regularly. For example, if you want to be notified of new events by email, you sould make sure this is checked. Filters that are configured to run in the background have a "*" next to it.
When saving filters, if you want the filter to run in the background make sure you select the "Run filter in background" option. When checked, ZoneMinder will make sure the filter is checked regularly. For example, if you want to be notified of new events by email, you should make sure this is checked. Filters that are configured to run in the background have a "*" next to it.
For example:

View File

@ -65,7 +65,7 @@ own empty screen.
* **B**: Click here to explore the various options of ZoneMinder and how to configure them. You already used this to enable authentication and change style above. Over time, you will find this to have many other things you will want to customize.
* **C**: This link, when clicked, opens up a color coded log window of what is going on in Zoneminder and often gives you good insight into what is going wrong or right. Note that the color here is red - that is an indication that some error occurred in ZoneMinder. You should click it and investigate.
* **D**: This is the core of ZoneMinder - recording events. It gives you a count of how many events were recorded over the hour, day, week, month.
* **E**: These are the "Zones". Zones are areas within the camera that you mark as 'hotspots' for motion detection. Simply put, when you first configure your monitors (cameras), by default Zoneminder uses the entire field of view of the camera to detect motion. You may not want this. You may want to create "zones" specifically for detecting motion and ignore others. For example, lets consider a room with a fan that spins. You surely don't want to consider the fan moving continously a reason for triggering a record? Probably not - in that case, you'd leave the fan out while making your zones.
* **E**: These are the "Zones". Zones are areas within the camera that you mark as 'hotspots' for motion detection. Simply put, when you first configure your monitors (cameras), by default Zoneminder uses the entire field of view of the camera to detect motion. You may not want this. You may want to create "zones" specifically for detecting motion and ignore others. For example, lets consider a room with a fan that spins. You surely don't want to consider the fan moving continuously a reason for triggering a record? Probably not - in that case, you'd leave the fan out while making your zones.
* **F**: This is the "source" column that tells you the type of the camera - if its an IP camera, a USB camera or more. In this example, they are all IP cameras. Note the color red on item F ? Well that means there is something wrong with that camera. No wonder the log also shows red. Good indication for you to tap on logs and investigate
* **G**: This defines how Zoneminder will record events. There are various modes. In brief Modect == record if a motion is detected,Record = always record 24x7, Mocord = always record PLUS detect motion, Monitor = just provide a live view but don't record anytime, Modect = Don't record till an externa entity via zmtrigger tells Zoneminder to (this is advanced usage).
* **H**: If you click on these links you can view a "Montage" of all your configured monitors or cycle through each one

View File

@ -25,9 +25,9 @@ FORCED_ALARM_SCORE - The 'zmu' utility can be used to force an alarm on a monito
BULK_FRAME_INTERVAL - Traditionally ZoneMinder writes an entry into the Frames database table for each frame that is captured and saved. This works well in motion detection scenarios but when in a DVR situation ('Record' or 'Mocord' mode) this results in a huge number of frame writes and a lot of database and disk bandwidth for very little additional information. Setting this to a non-zero value will enabled ZoneMinder to group these non-alarm frames into one 'bulk' frame entry which saves a lot of bandwidth and space. The only disadvantage of this is that timing information for individual frames is lost but in constant frame rate situations this is usually not significant. This setting is ignored in Modect mode and individual frames are still written if an alarm occurs in Mocord mode also.
EVENT_CLOSE_MODE - When a monitor is running in a continuous recording mode (Record or Mocord) events are usually closed after a fixed period of time (the section length). However in Mocord mode it is possible that motion detection may occur near the end of a section. This option controls what happens when an alarm occurs in Mocord mode. The 'time' setting means that the event will be closed at the end of the section regardless of alarm activity. The 'idle' setting means that the event will be closed at the end of the section if there is no alarm activity occuring at the time otherwise it will be closed once the alarm is over meaning the event may end up being longer than the normal section length. The 'alarm' setting means that if an alarm occurs during the event, the event will be closed once the alarm is over regardless of when this occurs. This has the effect of limiting the number of alarms to one per event and the events will be shorter than the section length if an alarm has occurred.
EVENT_CLOSE_MODE - When a monitor is running in a continuous recording mode (Record or Mocord) events are usually closed after a fixed period of time (the section length). However in Mocord mode it is possible that motion detection may occur near the end of a section. This option controls what happens when an alarm occurs in Mocord mode. The 'time' setting means that the event will be closed at the end of the section regardless of alarm activity. The 'idle' setting means that the event will be closed at the end of the section if there is no alarm activity occurring at the time otherwise it will be closed once the alarm is over meaning the event may end up being longer than the normal section length. The 'alarm' setting means that if an alarm occurs during the event, the event will be closed once the alarm is over regardless of when this occurs. This has the effect of limiting the number of alarms to one per event and the events will be shorter than the section length if an alarm has occurred.
CREATE_ANALYSIS_IMAGES - By default during an alarm ZoneMinder records both the raw captured image and one that has been analysed and had areas where motion was detected outlined. This can be very useful during zone configuration or in analysing why events occured. However it also incurs some overhead and in a stable system may no longer be necessary. This parameter allows you to switch the generation of these images off.
CREATE_ANALYSIS_IMAGES - By default during an alarm ZoneMinder records both the raw captured image and one that has been analysed and had areas where motion was detected outlined. This can be very useful during zone configuration or in analysing why events occurred. However it also incurs some overhead and in a stable system may no longer be necessary. This parameter allows you to switch the generation of these images off.
WEIGHTED_ALARM_CENTRES - ZoneMinder will always calculate the centre point of an alarm in a zone to give some indication of where on the screen it is. This can be used by the experimental motion tracking feature or your own custom extensions. In the alarmed or filtered pixels mode this is a simple midpoint between the extents of the detected pxiesl. However in the blob method this can instead be calculated using weighted pixel locations to give more accurate positioning for irregularly shaped blobs. This method, while more precise is also slower and so is turned off by default.

View File

@ -1,5 +1,5 @@
Options - Servers
---------------
-----------------
.. image:: images/Options_Servers.png

View File

@ -25,9 +25,9 @@ FILTER_EXECUTE_INTERVAL - ZoneMinder allows you to save filters to the database
MAX_RESTART_DELAY - The zmdc (zm daemon control) process controls when processeses are started or stopped and will attempt to restart any that fail. If a daemon fails frequently then a delay is introduced between each restart attempt. If the daemon stills fails then this delay is increased to prevent extra load being placed on the system by continual restarts. This option controls what this maximum delay is.
WATCH_CHECK_INTERVAL - The zmwatch daemon checks the image capture performance of the capture daemons to ensure that they have not locked up (rarely a sync error may occur which blocks indefinately). This option determines how often the daemons are checked.
WATCH_CHECK_INTERVAL - The zmwatch daemon checks the image capture performance of the capture daemons to ensure that they have not locked up (rarely a sync error may occur which blocks indefinitely). This option determines how often the daemons are checked.
WATCH_MAX_DELAY - The zmwatch daemon checks the image capture performance of the capture daemons to ensure that they have not locked up (rarely a sync error may occur which blocks indefinately). This option determines the maximum delay to allow since the last captured frame. The daemon will be restarted if it has not captured any images after this period though the actual restart may take slightly longer in conjunction with the check interval value above.
WATCH_MAX_DELAY - The zmwatch daemon checks the image capture performance of the capture daemons to ensure that they have not locked up (rarely a sync error may occur which blocks indefinitely). This option determines the maximum delay to allow since the last captured frame. The daemon will be restarted if it has not captured any images after this period though the actual restart may take slightly longer in conjunction with the check interval value above.
RUN_AUDIT - The zmaudit daemon exists to check that the saved information in the database and on the filesystem match and are consistent with each other. If an error occurs or if you are using 'fast deletes' it may be that database records are deleted but files remain. In this case, and similar, zmaudit will remove redundant information to synchronise the two data stores. This option controls whether zmaudit is run in the background and performs these checks and fixes continuously. This is recommended for most systems however if you have a very large number of events the process of scanning the database and filesystem may take a long time and impact performance. In this case you may prefer to not have zmaudit running unconditionally and schedule occasional checks at other, more convenient, times.

View File

@ -19,7 +19,7 @@ UPLOAD_PORT - You can use filters to instruct ZoneMinder to upload events to a r
UPLOAD_USER - You can use filters to instruct ZoneMinder to upload events to a remote server. This option indicates the username that ZoneMinder should use to log in for transfer.
UPLOAD_PASS - You can use filters to instruct ZoneMinder to upload events to a remote server. This option indicates the password that ZoneMinder should use to log in for transfer. If you are using certicate based logins for SFTP servers you can leave this option blank.
UPLOAD_PASS - You can use filters to instruct ZoneMinder to upload events to a remote server. This option indicates the password that ZoneMinder should use to log in for transfer. If you are using certificate based logins for SFTP servers you can leave this option blank.
UPLOAD_LOC_DIR - You can use filters to instruct ZoneMinder to upload events to a remote server. This option indicates the local directory that ZoneMinder should use for temporary upload files. These are files that are created from events, uploaded and then deleted.

View File

@ -5,7 +5,7 @@ Options - X10
OPT_X10 - If you have an X10 Home Automation setup in your home you can use ZoneMinder to initiate or react to X10 signals if your computer has the appropriate interface controller. This option indicates whether X10 options will be available in the browser client.
X10_DEVICE - If you have an X10 controller device (e.g. XM10U) connected to your computer this option details which port it is conected on, the default of /dev/ttyS0 maps to serial or com port 1.
X10_DEVICE - If you have an X10 controller device (e.g. XM10U) connected to your computer this option details which port it is connected on, the default of /dev/ttyS0 maps to serial or com port 1.
X10_HOUSE_CODE - X10 devices are grouped together by identifying them as all belonging to one House Code. This option details what that is. It should be a single letter between A and P.

View File

@ -20,7 +20,7 @@ Here is an example of viewing an event stream:
* **A**: Administrative Event options on the event including viewing individual frames
* **B**: The actual image stream
* **C**: Navigation control
* **D**: You can switch between watching a single event or Continous mode (where it advances to the next event after playback is complete)
* **D**: You can switch between watching a single event or Continuous mode (where it advances to the next event after playback is complete)
* **E**: Event progress bar - how much of the current event has been played back
You will notice for the first time that alarm images now contain an overlay outlining the blobs that represent the alarmed area. This outline is in the colour defined for that zone and lets you see what it was that caused the alarm. Clicking on one of the thumbnails will take you to a full size window where you can see the image in all its detail and scroll through the various images that make up the event. If you have the ZM_RECORD_EVENT_STATS option on, you will be able to click the 'Stats' link here and get some analysis of the cause of the event.

View File

@ -104,6 +104,7 @@ BEGIN
#$dbh->disconnect();
if ( ! exists $Config{ZM_SERVER_ID} ) {
$Config{ZM_SERVER_ID} = undef;
$sth = $dbh->prepare_cached( 'SELECT * FROM Servers WHERE Name=?' );
if ( $Config{ZM_SERVER_NAME} ) {
$res = $sth->execute( $Config{ZM_SERVER_NAME} );
@ -114,7 +115,6 @@ BEGIN
my $result = $sth->fetchrow_hashref();
$Config{ZM_SERVER_ID} = $$result{Id};
}
$Config{ZM_SERVER_ID} = undef;
}
}

View File

@ -1985,7 +1985,7 @@ our @options =
You can use filters to instruct ZoneMinder to upload events to
a remote server. This option indicates the password that
ZoneMinder should use to log in for transfer. If you are using
certicate based logins for SFTP servers you can leave this
certificate based logins for SFTP servers you can leave this
option blank.
"),
requires => [ { name => "ZM_OPT_UPLOAD", value => "yes" } ],
@ -2077,6 +2077,21 @@ our @options =
type => $types{integer},
category => "upload",
},
{
name => "ZM_UPLOAD_STRICT",
default => "no",
description => "Require strict host key checking for SFTP uploads",
help => qqq("
You can require SFTP uploads to verify the host key of the remote server
for protection against man-in-the-middle attacks. You will need to add the
server's key to the known_hosts file. On most systems, this will be
~/.ssh/known_hosts, where ~ is the home directory of the web server running
ZoneMinder.
"),
requires => [ { name => "ZM_OPT_UPLOAD", value => "yes" } ],
type => $types{boolean},
category => "upload",
},
{
name => "ZM_UPLOAD_FTP_PASSIVE",
default => "yes",

View File

@ -173,6 +173,7 @@ sub moveConDown
Debug( "Move Down" );
my $cmd = "decoder_control.cgi?command=2";
$self->sendCmd( $cmd );
$self->autoStop( $self->{Monitor}->{AutoStopTimeout} );
}
#Left Arrow

View File

@ -155,7 +155,7 @@ sub reset
#my $cmd = "setOSDSetting%26isEnableTimeStamp%3D0%26isEnableDevName%3D1%26dispPos%3D0%26isEnabledOSDMask%3D0";
Info ("Sending reboot $cmd");
$self->sendCmd( $cmd );
# Setup For Stream=0 Resolution=720p Bandwith=4M FPS=30 KeyFrameInterval/GOP=100 VBR=ON
# Setup For Stream=0 Resolution=720p Bandwidth=4M FPS=30 KeyFrameInterval/GOP=100 VBR=ON
#$cmd = "setVideoStreamParam%26streamType%3D0%26resolution%3D0%26bitRate%3D4194304%26frameRate%3D30%26GOP%3D100%26isVBR%3D1";
#$self->sendCmd( $cmd );
# Setup For Infrared AUTO

View File

@ -0,0 +1,377 @@
# ==========================================================================
#
# ZoneMinder IPCC-7210W IP Control Protocol Module, $Date: 2015-11-18$, $Revision: 0001$
# Modified for use with IPCC-7210W on Nov 2015
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# ==========================================================================
#
# This module contains the implementation of the
# IPCC-7210W IP camera control protocol
#
package ZoneMinder::Control::IPCC-7210W;
use 5.006;
use strict;
use warnings;
require ZoneMinder::Base;
require ZoneMinder::Control;
our @ISA = qw(ZoneMinder::Control);
# ==========================================================================
#
# IPCC-7210W IP Control Protocol
#
# ==========================================================================
use ZoneMinder::Logger qw(:all);
use ZoneMinder::Config qw(:all);
use Time::HiRes qw( usleep );
sub new
{
my $class = shift;
my $id = shift;
my $self = ZoneMinder::Control->new( $id );
bless( $self, $class );
srand( time() );
return $self;
}
our $AUTOLOAD;
sub AUTOLOAD
{
my $self = shift;
my $class = ref($self) || croak( "$self not object" );
my $name = $AUTOLOAD;
$name =~ s/.*://;
if ( exists($self->{$name}) )
{
return( $self->{$name} );
}
Fatal( "Can't access $name member of object of class $class" );
}
sub open
{
my $self = shift;
$self->loadMonitor();
use LWP::UserAgent;
$self->{ua} = LWP::UserAgent->new;
$self->{ua}->agent( "ZoneMinder Control Agent/".ZoneMinder::Base::ZM_VERSION );
$self->{state} = 'open';
}
sub close
{
my $self = shift;
$self->{state} = 'closed';
}
sub printMsg
{
my $self = shift;
my $msg = shift;
my $msg_len = length($msg);
Debug( $msg."[".$msg_len."]" );
}
sub sendCmd
{
my $self = shift;
my $cmd = shift;
my $result = undef;
printMsg( $cmd, "Tx" );
#print( "http://$address/$cmd\n" );
my $req = HTTP::Request->new( GET=>"http://".$self->{Monitor}->{ControlAddress}."/$cmd".$self->{Monitor}->{ControlDevice} );
Info( "http://".$self->{Monitor}->{ControlAddress}."/$cmd".$self->{Monitor}->{ControlDevice} );
my $res = $self->{ua}->request($req);
if ( $res->is_success )
{
$result = !undef;
}
else
{
Error( "Error check failed: '".$res->status_line()."'" );
}
return( $result );
}
sub cameraReset
{
my $self = shift;
Debug( "Camera Reset" );
my $cmd = "reboot.cgi?";
$self->sendCmd( $cmd );
}
#Up Arrow
sub moveConUp
{
my $self = shift;
my $params = shift;
Debug( "Move Up" );
my $cmd = "decoder_control.cgi?command=0&onestep=1&";
$self->sendCmd( $cmd );
my $autostop = $self->getParam( $params, 'autostop', 0 );
if ( $autostop && $self->{Monitor}->{AutoStopTimeout} )
{
usleep( $self->{Monitor}->{AutoStopTimeout} );
$self->moveStop( $params );
}
}
#Down Arrow
sub moveConDown
{
my $self = shift;
my $params = shift;
Debug( "Move Down" );
my $cmd = "decoder_control.cgi?command=2&onestep=1&";
$self->sendCmd( $cmd );
my $autostop = $self->getParam( $params, 'autostop', 0 );
if ( $autostop && $self->{Monitor}->{AutoStopTimeout} )
{
usleep( $self->{Monitor}->{AutoStopTimeout} );
$self->moveStop( $params );
}
}
#Left Arrow
sub moveConLeft
{
my $self = shift;
my $params = shift;
Debug( "Move Left" );
my $cmd = "decoder_control.cgi?command=4&onestep=1&";
$self->sendCmd( $cmd );
my $autostop = $self->getParam( $params, 'autostop', 0 );
if ( $autostop && $self->{Monitor}->{AutoStopTimeout} )
{
usleep( $self->{Monitor}->{AutoStopTimeout} );
$self->moveStop( $params );
}
}
#Right Arrow
sub moveConRight
{
my $self = shift;
my $params = shift;
Debug( "Move Right" );
my $cmd = "decoder_control.cgi?command=6&onestep=1&";
$self->sendCmd( $cmd );
my $autostop = $self->getParam( $params, 'autostop', 0 );
if ( $autostop && $self->{Monitor}->{AutoStopTimeout} )
{
usleep( $self->{Monitor}->{AutoStopTimeout} );
$self->moveStop( $params );
}
}
#Diagonally Up Right Arrow
sub moveConUpRight
{
my $self = shift;
my $params = shift;
Debug( "Move Diagonally Up Right" );
my $cmd = "decoder_control.cgi?command=91&onestep=1&";
$self->sendCmd( $cmd );
my $autostop = $self->getParam( $params, 'autostop', 0 );
if ( $autostop && $self->{Monitor}->{AutoStopTimeout} )
{
usleep( $self->{Monitor}->{AutoStopTimeout} );
$self->moveStop( $params );
}
}
#Diagonally Down Right Arrow
sub moveConDownRight
{
my $self = shift;
my $params = shift;
Debug( "Move Diagonally Down Right" );
my $cmd = "decoder_control.cgi?command=93&onestep=1&";
$self->sendCmd( $cmd );
my $autostop = $self->getParam( $params, 'autostop', 0 );
if ( $autostop && $self->{Monitor}->{AutoStopTimeout} )
{
usleep( $self->{Monitor}->{AutoStopTimeout} );
$self->moveStop( $params );
}
}
#Diagonally Up Left Arrow
sub moveConUpLeft
{
my $self = shift;
my $params = shift;
Debug( "Move Diagonally Up Left" );
my $cmd = "decoder_control.cgi?command=90&onestep=1&";
$self->sendCmd( $cmd );
my $autostop = $self->getParam( $params, 'autostop', 0 );
if ( $autostop && $self->{Monitor}->{AutoStopTimeout} )
{
usleep( $self->{Monitor}->{AutoStopTimeout} );
$self->moveStop( $params );
}
}
#Diagonally Down Left Arrow
sub moveConDownLeft
{
my $self = shift;
my $params = shift;
Debug( "Move Diagonally Down Left" );
my $cmd = "decoder_control.cgi?command=92&onestep=1&";
$self->sendCmd( $cmd );
my $autostop = $self->getParam( $params, 'autostop', 0 );
if ( $autostop && $self->{Monitor}->{AutoStopTimeout} )
{
usleep( $self->{Monitor}->{AutoStopTimeout} );
$self->moveStop( $params );
}
}
#Stop
sub moveStop
{
my $self = shift;
Debug( "Move Stop" );
my $cmd = "decoder_control.cgi?command=1&onestep=1&";
$self->sendCmd( $cmd );
}
#Move Camera to Home Position
sub presetHome
{
my $self = shift;
Debug( "Home Preset" );
my $cmd = "decoder_control.cgi?command=25&onestep=0&";
$self->sendCmd( $cmd );
}
# zoom out
sub zoomRelTele
{
my $self = shift;
Debug( "Zoom Tele" );
my $cmd = "camera_control.cgi?param=17&value=1&";
$self->sendCmd( $cmd );
}
#zoom in
sub zoomRelWide
{
my $self = shift;
Debug( "Zoom Wide" );
my $cmd = "camera_control.cgi?param=18&value=1&";
$self->sendCmd( $cmd );
}
#Set preset
sub presetSet
{
my $self = shift;
my $params = shift;
my $preset = $self->getParam( $params, 'preset' );
my $presetCmd = 30 + (($preset-1)*2);
Debug( "Set Preset $preset with cmd $presetCmd" );
my $cmd = "decoder_control.cgi?command=$presetCmd&onestep=0&sit=$presetCmd&";
$self->sendCmd( $cmd );
}
#Goto preset
sub presetGoto
{
my $self = shift;
my $params = shift;
my $preset = $self->getParam( $params, 'preset' );
my $presetCmd = 31 + (($preset-1)*2);
Debug( "Goto Preset $preset with cmd $presetCmd" );
my $cmd = "decoder_control.cgi?command=$presetCmd&onestep=0&sit=$presetCmd&";
$self->sendCmd( $cmd );
}
#Turn IR on
sub wake
{
my $self = shift;
Debug( "Wake - IR on" );
my $cmd = "camera_control.cgi?param=14&value=1&";
$self->sendCmd( $cmd );
}
#Turn IR off
sub sleep
{
my $self = shift;
Debug( "Sleep - IR off" );
my $cmd = "camera_control.cgi?param=14&value=0&";
$self->sendCmd( $cmd );
}
1;
__END__
# Below is stub documentation for your module. You'd better edit it!
=head1 NAME
ZoneMinder::IPCC-7210W - Perl extension for IPCC-7210W PTZ control
=head1 SYNOPSIS
use ZoneMinder::Control::IPCC
=head1 DESCRIPTION
This script provides Pan/Tilt/Zoom control for IPCC-7210W camera.
=head1 SEE ALSO
ZoneMinder::Control::Wanscam
=head1 AUTHOR
=head1 COPYRIGHT AND LICENSE
Copyright (C) 2001-2008
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.8.3 or,
at your option, any later version of Perl 5 you may have available.
=cut

View File

@ -133,8 +133,10 @@ sub sendCmd
my $result = undef;
# Pelco P protocol checksum is created by XOR'ing the first seven bytes in the message
# including the first byte, the STX sync packet
my $checksum = 0x00;
for ( my $i = 1; $i < int(@$cmd); $i++ )
for ( my $i = 0; $i < int(@$cmd); $i++ )
{
$checksum ^= $cmd->[$i];
}

View File

@ -0,0 +1,227 @@
# ==========================================================================
#
# ZoneMinder Vivotek ePTZ Control Protocol Module
# Copyright (C) 2015 Robin Daermann
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# ==========================================================================
#
# This module contains the implementation of the Vivotek ePTZ camera control
# protocol
#
package ZoneMinder::Control::Vivotek_ePTZ;
use 5.006;
use strict;
use warnings;
require ZoneMinder::Base;
require ZoneMinder::Control;
our @ISA = qw(ZoneMinder::Control);
# ==========================================================================
#
# Vivotek ePTZ Control Protocol
#
# ==========================================================================
use ZoneMinder::Logger qw(:all);
use ZoneMinder::Config qw(:all);
use Time::HiRes qw( usleep );
sub new
{
my $class = shift;
my $id = shift;
my $self = ZoneMinder::Control->new( $id );
Debug( "Camera New" );
bless( $self, $class );
srand( time() );
return $self;
}
our $AUTOLOAD;
sub AUTOLOAD
{
my $self = shift;
my $class = ref($self) || croak( "$self not object" );
my $name = $AUTOLOAD;
Debug( "Camera AUTOLOAD" );
$name =~ s/.*://;
if ( exists($self->{$name}) )
{
return( $self->{$name} );
}
Fatal( "Can't access $name member of object of class $class" );
}
sub open
{
my $self = shift;
$self->loadMonitor();
Debug( "Camera open" );
use LWP::UserAgent;
$self->{ua} = LWP::UserAgent->new;
$self->{ua}->agent( "ZoneMinder Control Agent/".ZoneMinder::Base::ZM_VERSION );
$self->{state} = 'open';
}
sub close
{
my $self = shift;
$self->{state} = 'closed';
}
sub printMsg
{
my $msg = shift;
my $msg_len = length($msg);
Debug( $msg."[".$msg_len."]" );
}
sub sendCmd
{
my ($self, $cmd, $speedcmd) = @_;
my $result = undef;
printMsg( $speedcmd, "Tx" );
printMsg( $cmd, "Tx" );
my $req = HTTP::Request->new( GET => "http://" . $self->{Monitor}->{ControlAddress} . "/cgi-bin/camctrl/eCamCtrl.cgi?stream=0&$speedcmd&$cmd" );
my $res = $self->{ua}->request($req);
if ( $res->is_success )
{
$result = !undef;
}
else
{
Error( "Request failed: '" . $res->status_line() . "' (URI: '" . $req->as_string() . "')" );
}
return( $result );
}
sub moveConUp
{
my ($self, $params) = @_;
my $speed = 'speedtilt=' . ($params->{tiltspeed} - 6);
Debug( "Move Up" );
$self->sendCmd( 'move=up', $speed );
}
sub moveConDown
{
my ($self, $params) = @_;
my $speed = 'speedtilt=' . ($params->{tiltspeed} - 6);
Debug( "Move Down" );
$self->sendCmd( 'move=down', $speed );
}
sub moveConLeft
{
my ($self, $params) = @_;
my $speed = 'speedpan=-' . $params->{panspeed};
Debug( "Move Left" );
$self->sendCmd( 'move=left', $speed );
}
sub moveConRight
{
my ($self, $params) = @_;
my $speed = 'speedpan=' . ($params->{panspeed} - 6);
Debug( "Move Right" );
$self->sendCmd( 'move=right', $speed );
}
sub moveStop
{
my $self = shift;
Debug( "Move Stop" );
# not implemented
}
sub zoomConTele
{
my ($self, $params) = @_;
my $speed = 'speedzoom=' . ($params->{speed} - 6);
Debug( "Zoom In" );
$self->sendCmd( 'zoom=tele', $speed );
}
sub zoomConWide
{
my ($self, $params) = @_;
my $speed = 'speedzoom=' . ($params->{speed} - 6);
Debug( "Zoom Out" );
$self->sendCmd( 'zoom=wide', $speed );
}
sub reset
{
my $self = shift;
Debug( "Camera Reset" );
$self->sendCmd( 'move=home' );
}
1;
__END__
=head1 NAME
ZoneMinder::Control::Vivotek_ePTZ - ZoneMinder Perl extension for Vivotek ePTZ
camera control protocol
=head1 SYNOPSIS
use ZoneMinder::Control::Vivotek_ePTZ;
=head1 DESCRIPTION
This module implements the ePTZ protocol used in various Vivotek IP cameras,
developed with a Vivotek IB8369 model.
Currently, only simple pan, tilt and zoom function is implemented. Presets will
follow later.
=head2 EXPORT
None.
=head1 SEE ALSO
I would say, see ZoneMinder::Control documentation. But it is a stub.
=head1 AUTHOR
Robin Daermann E<lt>r.daermann@ids-services.deE<gt>
=head1 COPYRIGHT AND LICENSE
Copyright (C) 2015 by Robin Daermann
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.8.3 or,
at your option, any later version of Perl 5 you may have available.
=cut

View File

@ -0,0 +1,399 @@
# ==========================================================================
#
# ZoneMinder Wanscam HW0025 IP Control Protocol Module, $Date: 2009-11-25 09:20:00 +0000 (Wed, 04 Nov 2009) $, $Revision: 0001 $
# Copyright (C) 2001-2015 Florian Neumair
# Modified for use with Foscam FI8918W IP Camera by Dave Harris
# Modified Feb 2011 by Howard Durdle (http://durdl.es/x) to:
# fix horizontal panning, add presets and IR on/off
# use Control Device field to pass username and password
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# ==========================================================================
#
# This module contains the implementation of the Wanscam HW0025 IP camera control
# protocol
#
# Known working Devices:
# * Wanscam HW0025
# * IPCC-7210W
#
package ZoneMinder::Control::WanscamHW0025;
use 5.006;
use strict;
use warnings;
require ZoneMinder::Base;
require ZoneMinder::Control;
our @ISA = qw(ZoneMinder::Control);
# ==========================================================================
#
# Wanscam HW0025 IP Control Protocol
#
# ==========================================================================
use ZoneMinder::Logger qw(:all);
use ZoneMinder::Config qw(:all);
use Time::HiRes qw( usleep );
sub new
{
my $class = shift;
my $id = shift;
my $self = ZoneMinder::Control->new( $id );
bless( $self, $class );
srand( time() );
return $self;
}
our $AUTOLOAD;
sub AUTOLOAD
{
my $self = shift;
my $class = ref($self) || croak( "$self not object" );
my $name = $AUTOLOAD;
$name =~ s/.*://;
if ( exists($self->{$name}) )
{
return( $self->{$name} );
}
Fatal( "Can't access $name member of object of class $class" );
}
sub open
{
my $self = shift;
$self->loadMonitor();
use LWP::UserAgent;
$self->{ua} = LWP::UserAgent->new;
$self->{ua}->agent( "ZoneMinder Control Agent/".ZoneMinder::Base::ZM_VERSION );
$self->{state} = 'open';
}
sub close
{
my $self = shift;
$self->{state} = 'closed';
}
sub printMsg
{
my $self = shift;
my $msg = shift;
my $msg_len = length($msg);
Debug( $msg."[".$msg_len."]" );
}
sub sendCmd
{
my $self = shift;
my $cmd = shift;
my $result = undef;
printMsg( $cmd, "Tx" );
#print( "http://$address/$cmd\n" );
my $req = HTTP::Request->new( GET=>"http://".$self->{Monitor}->{ControlAddress}."/$cmd".$self->{Monitor}->{ControlDevice} );
Info( "http://".$self->{Monitor}->{ControlAddress}."/$cmd".$self->{Monitor}->{ControlDevice} );
my $res = $self->{ua}->request($req);
if ( $res->is_success )
{
$result = !undef;
}
else
{
Error( "Error check failed: '".$res->status_line()."'" );
}
return( $result );
}
sub cameraReset
{
my $self = shift;
Debug( "Camera Reset" );
my $cmd = "reboot.cgi?";
$self->sendCmd( $cmd );
}
#Up Arrow
sub moveConUp
{
my $self = shift;
my $params = shift;
Debug( "Move Up" );
my $cmd = "decoder_control.cgi?command=0&onestep=1&";
$self->sendCmd( $cmd );
my $autostop = $self->getParam( $params, 'autostop', 0 );
if ( $autostop && $self->{Monitor}->{AutoStopTimeout} )
{
usleep( $self->{Monitor}->{AutoStopTimeout} );
$self->moveStop( $params );
}
}
#Down Arrow
sub moveConDown
{
my $self = shift;
my $params = shift;
Debug( "Move Down" );
my $cmd = "decoder_control.cgi?command=2&onestep=1&";
$self->sendCmd( $cmd );
my $autostop = $self->getParam( $params, 'autostop', 0 );
if ( $autostop && $self->{Monitor}->{AutoStopTimeout} )
{
usleep( $self->{Monitor}->{AutoStopTimeout} );
$self->moveStop( $params );
}
}
#Left Arrow
sub moveConLeft
{
my $self = shift;
my $params = shift;
Debug( "Move Left" );
my $cmd = "decoder_control.cgi?command=4&onestep=1&";
$self->sendCmd( $cmd );
my $autostop = $self->getParam( $params, 'autostop', 0 );
if ( $autostop && $self->{Monitor}->{AutoStopTimeout} )
{
usleep( $self->{Monitor}->{AutoStopTimeout} );
$self->moveStop( $params );
}
}
#Right Arrow
sub moveConRight
{
my $self = shift;
my $params = shift;
Debug( "Move Right" );
my $cmd = "decoder_control.cgi?command=6&onestep=1&";
$self->sendCmd( $cmd );
my $autostop = $self->getParam( $params, 'autostop', 0 );
if ( $autostop && $self->{Monitor}->{AutoStopTimeout} )
{
usleep( $self->{Monitor}->{AutoStopTimeout} );
$self->moveStop( $params );
}
}
#Diagonally Up Right Arrow
sub moveConUpRight
{
my $self = shift;
my $params = shift;
Debug( "Move Diagonally Up Right" );
my $cmd = "decoder_control.cgi?command=91&onestep=1&";
$self->sendCmd( $cmd );
my $autostop = $self->getParam( $params, 'autostop', 0 );
if ( $autostop && $self->{Monitor}->{AutoStopTimeout} )
{
usleep( $self->{Monitor}->{AutoStopTimeout} );
$self->moveStop( $params );
}
}
#Diagonally Down Right Arrow
sub moveConDownRight
{
my $self = shift;
my $params = shift;
Debug( "Move Diagonally Down Right" );
my $cmd = "decoder_control.cgi?command=93&onestep=1&";
$self->sendCmd( $cmd );
my $autostop = $self->getParam( $params, 'autostop', 0 );
if ( $autostop && $self->{Monitor}->{AutoStopTimeout} )
{
usleep( $self->{Monitor}->{AutoStopTimeout} );
$self->moveStop( $params );
}
}
#Diagonally Up Left Arrow
sub moveConUpLeft
{
my $self = shift;
my $params = shift;
Debug( "Move Diagonally Up Left" );
my $cmd = "decoder_control.cgi?command=90&onestep=1&";
$self->sendCmd( $cmd );
my $autostop = $self->getParam( $params, 'autostop', 0 );
if ( $autostop && $self->{Monitor}->{AutoStopTimeout} )
{
usleep( $self->{Monitor}->{AutoStopTimeout} );
$self->moveStop( $params );
}
}
#Diagonally Down Left Arrow
sub moveConDownLeft
{
my $self = shift;
my $params = shift;
Debug( "Move Diagonally Down Left" );
my $cmd = "decoder_control.cgi?command=92&onestep=1&";
$self->sendCmd( $cmd );
my $autostop = $self->getParam( $params, 'autostop', 0 );
if ( $autostop && $self->{Monitor}->{AutoStopTimeout} )
{
usleep( $self->{Monitor}->{AutoStopTimeout} );
$self->moveStop( $params );
}
}
#Stop
sub moveStop
{
my $self = shift;
Debug( "Move Stop" );
my $cmd = "decoder_control.cgi?command=1&onestep=1&";
$self->sendCmd( $cmd );
}
#Move Camera to Home Position
sub presetHome
{
my $self = shift;
Debug( "Home Preset" );
my $cmd = "decoder_control.cgi?command=25&onestep=0&";
$self->sendCmd( $cmd );
}
# zoom out
sub zoomRelTele
{
my $self = shift;
Debug( "Zoom Tele" );
my $cmd = "camera_control.cgi?param=17&value=1&";
$self->sendCmd( $cmd );
}
#zoom in
sub zoomRelWide
{
my $self = shift;
Debug( "Zoom Wide" );
my $cmd = "camera_control.cgi?param=18&value=1&";
$self->sendCmd( $cmd );
}
#Set preset
sub presetSet
{
my $self = shift;
my $params = shift;
my $preset = $self->getParam( $params, 'preset' );
my $presetCmd = 30 + (($preset-1)*2);
Debug( "Set Preset $preset with cmd $presetCmd" );
my $cmd = "decoder_control.cgi?command=$presetCmd&onestep=0&sit=$presetCmd&";
$self->sendCmd( $cmd );
}
#Goto preset
sub presetGoto
{
my $self = shift;
my $params = shift;
my $preset = $self->getParam( $params, 'preset' );
my $presetCmd = 31 + (($preset-1)*2);
Debug( "Goto Preset $preset with cmd $presetCmd" );
my $cmd = "decoder_control.cgi?command=$presetCmd&onestep=0&sit=$presetCmd&";
$self->sendCmd( $cmd );
}
#Turn IR on
sub wake
{
my $self = shift;
Debug( "Wake - IR on" );
my $cmd = "camera_control.cgi?param=14&value=1&";
$self->sendCmd( $cmd );
}
#Turn IR off
sub sleep
{
my $self = shift;
Debug( "Sleep - IR off" );
my $cmd = "camera_control.cgi?param=14&value=0&";
$self->sendCmd( $cmd );
}
1;
__END__
# Below is stub documentation for your module. You'd better edit it!
=head1 NAME
ZoneMinder::Database - Perl extension for blah blah blah
=head1 SYNOPSIS
use ZoneMinder::Control::Wanscam
blah blah blah
=head1 DESCRIPTION
Stub documentation for ZoneMinder, created by h2xs. It looks like the
author of the extension was negligent enough to leave the stub
unedited.
Blah blah blah.
=head2 EXPORT
None by default.
=head1 SEE ALSO
Mention other useful documentation such as the documentation of
related modules or operating system documentation (such as man pages
in UNIX), or any relevant external documentation such as RFCs or
standards.
If you have a mailing list set up for your module, mention it here.
If you have a web site set up for your module, mention it here.
=head1 AUTHOR
Philip Coombes, <philip.coombes@zoneminder.com>
=head1 COPYRIGHT AND LICENSE
Copyright (C) 2001-2008 Philip Coombes
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.8.3 or,
at your option, any later version of Perl 5 you may have available.
=cut

View File

@ -98,29 +98,28 @@ sub getEventPath
{
my $event = shift;
my $Storage = $event->Storage();
my $event_path = "";
if ( $Config{ZM_USE_DEEP_STORAGE} )
{
$event_path = $Config{ZM_DIR_EVENTS}
.'/'.$event->{MonitorId}
.'/'.strftime( "%y/%m/%d/%H/%M/%S",
$event_path = join('/',
$Storage->Path(),
$event->{MonitorId},
strftime( "%y/%m/%d/%H/%M/%S",
localtime($event->{Time})
)
;
),
);
}
else
{
$event_path = $Config{ZM_DIR_EVENTS}
.'/'.$event->{MonitorId}
.'/'.$event->{Id}
;
$event_path = join('/',
$Storage->Path(),
$event->{MonitorId},
$event->{Id},
);
}
if ( index($Config{ZM_DIR_EVENTS},'/') != 0 ){
$event_path = $Config{ZM_PATH_WEB}
.'/'.$event_path
;
}
return( $event_path );
}

View File

@ -127,6 +127,7 @@ sub Execute {
while( my $event = $sth->fetchrow_hashref() ) {
push @results, $event;
}
Debug($sql . ' returned ' . @results . ' events.' );
$sth->finish();
Debug("Loaded " . @results . " events for filter $_[0]{Name} using query ($sql)");
return @results;
@ -360,7 +361,6 @@ sub Sql {
{
$sql .= " limit 0,".$filter_expr->{limit};
}
Debug( "SQL:$sql\n" );
$self->{Sql} = $sql;
} # end if has Sql
return $self->{Sql};

View File

@ -212,6 +212,10 @@ MAIN: while( $loop ) {
my $count = 0;
foreach my $event_link ( @event_links )
{
if ( $event_link =~ /[^\d\.]/ ) {
Warning("Non-event link found $event_link in $day_dir, skipping");
next;
}
Debug( "Checking link $event_link" );
( my $event = $event_link ) =~ s/^.*\.//;
my $event_path = readlink( $event_link );

View File

@ -419,9 +419,9 @@ sub toPreset
foreach (@data) {
s/\b(?:\d{1,3}\.){3}\d{1,3}\b/<ip-address>/; # ip address
s/<ip-address>:(6553[0-5]|655[0-2]\d|65[0-4]\d\d|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{0,3}|0)$/<ip-address>:<port>/; # tcpip port
s/\/\/.*:.*@/\/\/<username>:<pwd>@/; # user & pwd preceeding an ip address
s/(&|\?)(user|username)=\w\w*(&|\?)/$1$2=<username>$3/i; # username embeded in url
s/(&|\?)(pwd|password)=\w\w*(&|\?)/$1$2=<pwd>$3/i; # password embeded in url
s/\/\/.*:.*@/\/\/<username>:<pwd>@/; # user & pwd preceding an ip address
s/(&|\?)(user|username)=\w\w*(&|\?)/$1$2=<username>$3/i; # username embedded in url
s/(&|\?)(pwd|password)=\w\w*(&|\?)/$1$2=<pwd>$3/i; # password embedded in url
s/\w\w*:\w\w*/<username>:<pwd>/; # user & pwd in their own field
s/\/dev\/video\d\d*/\/dev\/video<?>/; # local video devices
}

View File

@ -27,7 +27,7 @@ zmfilter.pl - ZoneMinder tool to filter events
=head1 SYNOPSIS
zmfilter.pl [-f <filter name>,--filter=<filter name>] | -v, --version
zmfilter.pl [-f <filter name>,--filter=<filter name>] [--filter_id=<filter id>] | -v, --version
=head1 DESCRIPTION
@ -37,7 +37,9 @@ matching events.
=head1 OPTIONS
-f{filter name}, --filter={filter name} - The name of a specific filter to run
--filter_id={filter id} - The id of a specific filter to run
-v, --version - Print ZoneMinder version
=cut
@ -60,8 +62,6 @@ use constant START_DELAY => 5; # How long to wait before starting
@EXTRA_PERL_LIB@
use ZoneMinder;
require ZoneMinder::Event;
require ZoneMinder::Filter;
use DBI;
use POSIX;
use Time::HiRes qw/gettimeofday/;
@ -70,6 +70,24 @@ use Getopt::Long;
use autouse 'Pod::Usage'=>qw(pod2usage);
use autouse 'Data::Dumper'=>qw(Dumper);
my $filter_name = "";
my $filter_id;
my $version = 0;
GetOptions(
'filter=s' =>\$filter_name,
'filter_id=s' =>\$filter_id,
'version' =>\$version
) or pod2usage(-exitstatus => -1);
if ( $version ) {
print ZoneMinder::Base::ZM_VERSION . "\n";
exit(0);
}
require ZoneMinder::Event;
require ZoneMinder::Filter;
use constant EVENT_PATH => ($Config{ZM_DIR_EVENTS}=~m|/|)
? $Config{ZM_DIR_EVENTS}
: ($Config{ZM_PATH_WEB}.'/'.$Config{ZM_DIR_EVENTS})
@ -135,20 +153,6 @@ delete @ENV{qw(IFS CDPATH ENV BASH_ENV)};
my $delay = $Config{ZM_FILTER_EXECUTE_INTERVAL};
my $event_id = 0;
my $filter_parm = "";
my $version = 0;
#
GetOptions(
'filter=s' =>\$filter_parm,
'version' =>\$version
) or pod2usage(-exitstatus => -1);
if ( $version ) {
print ZoneMinder::Base::ZM_VERSION . "\n";
exit(0);
}
if ( ! EVENT_PATH ) {
Error( "No event path defined. Config was $Config{ZM_DIR_EVENTS}\n" );
@ -159,39 +163,42 @@ chdir( EVENT_PATH );
my $dbh = zmDbConnect();
if ( $filter_parm )
{
Info( "Scanning for events using filter '$filter_parm'\n" );
}
else
{
if ( $filter_name ) {
Info( "Scanning for events using filter '$filter_name'\n" );
} elsif ( $filter_id ) {
Info( "Scanning for events using filter id '$filter_id'\n" );
} else {
Info( "Scanning for events\n" );
}
if ( !$filter_parm )
{
if ( ! ( $filter_name or $filter_id ) ) {
sleep( START_DELAY );
}
my $filters;
my $last_action = 0;
while( 1 )
{
while( 1 ) {
my $now = time;
if ( ($now - $last_action) > $Config{ZM_FILTER_RELOAD_DELAY} )
{
if ( ($now - $last_action) > $Config{ZM_FILTER_RELOAD_DELAY} ) {
Debug( "Reloading filters\n" );
$last_action = $now;
$filters = getFilters( $filter_parm );
$filters = getFilters( { Name=>$filter_name, Id=>$filter_id } );
}
foreach my $filter ( @$filters )
{
checkFilter( $filter );
foreach my $filter ( @$filters ) {
if ( $$filter{Concurrent} and ! ( $filter_id or $filter_name ) ) {
my ( $proc ) = $0 =~ /(\S+)/;
my ( $id ) = $$filter{Id} =~ /(\d+)/;
Debug("Running concurrent filter process $proc --filter_id $$filter{Id} => $id for $$filter{Name}");
system( qq`$proc --filter "$$filter{Name}" &` );
} else {
checkFilter( $filter );
}
}
last if ( $filter_parm );
last if ( $filter_name or $filter_id );
Debug( "Sleeping for $delay seconds\n" );
sleep( $delay );
@ -199,16 +206,18 @@ while( 1 )
sub getFilters
{
my $filter_name = shift;
my $sql_filters = @_ ? shift : {};
my @sql_values;
my @filters;
my $sql = "SELECT * FROM Filters WHERE";
if ( $filter_name )
{
if ( $$sql_filters{Name} ) {
$sql .= " Name = ? and";
}
else
{
push @sql_values, $$sql_filters{Name};
} elsif ( $$sql_filters{Id} ) {
$sql .= " Id = ? and";
push @sql_values, $$sql_filters{Id};
} else {
$sql .= " Background = 1 and";
}
$sql .= "( AutoArchive = 1
@ -221,17 +230,8 @@ sub getFilters
) ORDER BY Name";
my $sth = $dbh->prepare_cached( $sql )
or Fatal( "Can't prepare '$sql': ".$dbh->errstr() );
my $res;
if ( $filter_name )
{
$res = $sth->execute( $filter_name )
or Fatal( "Can't execute '$sql': ".$sth->errstr() );
}
else
{
$res = $sth->execute()
or Fatal( "Can't execute '$sql': ".$sth->errstr() );
}
my $res = $sth->execute( @sql_values )
or Fatal( "Can't execute '$sql': ".$sth->errstr() );
FILTER: while( my $db_filter = $sth->fetchrow_hashref() )
{
my $filter = new ZoneMinder::Filter( $$db_filter{Id}, $db_filter );
@ -245,7 +245,12 @@ sub getFilters
push( @filters, $filter );
}
$sth->finish();
Debug( "Got " . @filters . " filters" );
if ( ! @filters ) {
Error("No filter found for $sql with values(@sql_values)");
} else {
Debug( "Got " . @filters . " filters" );
}
return( \@filters );
}
@ -530,7 +535,8 @@ sub uploadArchFile
if $Config{ZM_UPLOAD_PORT};
$sftpOptions{timeout} = $Config{ZM_UPLOAD_TIMEOUT}
if $Config{ZM_UPLOAD_TIMEOUT};
$sftpOptions{more} = [ '-o'=>'StrictHostKeyChecking=no' ];
$sftpOptions{more} = [ '-o'=>'StrictHostKeyChecking=no' ]
if ! $Config{ZM_UPLOAD_STRICT};
$Net::SFTP::Foreign::debug = -1
if $Config{ZM_UPLOAD_DEBUG};
my $sftp = Net::SFTP::Foreign->new( $Config{ZM_UPLOAD_HOST}, %sftpOptions );

View File

@ -504,22 +504,11 @@ sub handleMessage
Info( "Set monitor to $state\n" );
if ( $delay )
{
my $action_time = time()+$delay;
my $action_text = $id."|".( ($state eq "enable")
? "disable"
: "enable"
)
;
my $action_array = $actions{$action_time};
if ( !$action_array )
{
$action_array = $actions{$action_time} = [];
}
push( @$action_array, { connection=>$connection,
message=>$action_text
}
);
Debug( "Added timed event '$action_text', expires at $action_time (+$delay secs)\n" );
);
handleDelay($delay, $connection, $action_text);
}
}
elsif ( $action =~ /^(on|off)(?:[ \+](\d+))?$/ )
@ -534,43 +523,33 @@ sub handleMessage
zmTriggerEventOn( $monitor, $score, $cause, $text );
zmTriggerShowtext( $monitor, $showtext ) if defined($showtext);
Info( "Trigger '$trigger' '$cause'\n" );
if ( $delay )
{
my $action_text = $id."|cancel";
handleDelay($delay, $connection, $action_text);
}
}
elsif ( $trigger eq "off" )
{
my $last_event = zmGetLastEvent( $monitor );
zmTriggerEventOff( $monitor );
zmTriggerShowtext( $monitor, $showtext ) if defined($showtext);
Info( "Trigger '$trigger'\n" );
# Wait til it's finished
while( zmInAlarm( $monitor )
&& ($last_event == zmGetLastEvent( $monitor ))
)
if ( $delay )
{
# Tenth of a second
usleep( 100000 );
}
my $action_text = $id."|off|0|".$cause."|".$text;
handleDelay($delay, $connection, $action_text);
} else {
my $last_event = zmGetLastEvent( $monitor );
zmTriggerEventOff( $monitor );
zmTriggerShowtext( $monitor, $showtext ) if defined($showtext);
Info( "Trigger '$trigger'\n" );
# Wait til it's finished
while( zmInAlarm( $monitor )
&& ($last_event == zmGetLastEvent( $monitor ))
)
{
# Tenth of a second
usleep( 100000 );
}
zmTriggerEventCancel( $monitor );
}
else
{
Info( "Trigger '$trigger'\n" );
zmTriggerEventCancel( $monitor );
}
if ( $delay )
{
my $action_time = time()+$delay;
#my $action_text = $id."|cancel|0|".$cause."|".$text;
my $action_text = $id."|cancel";
my $action_array = $actions{$action_time};
if ( !$action_array )
{
$action_array = $actions{$action_time} = [];
}
push( @$action_array, { connection=>$connection,
message=>$action_text
}
);
Debug( "Added timed event '$action_text', expires at $action_time (+$delay secs)\n" );
}
}
elsif( $action eq "cancel" )
@ -590,5 +569,23 @@ sub handleMessage
}
} # end sub handleMessage
sub handleDelay
{
my $delay = shift;
my $connection = shift;
my $action_text = shift;
my $action_time = time()+$delay;
my $action_array = $actions{$action_time};
if ( !$action_array )
{
$action_array = $actions{$action_time} = [];
}
push( @$action_array, { connection=>$connection,
message=>$action_text
}
);
Debug( "Added timed event '$action_text', expires at $action_time (+$delay secs)\n" );
}
1;
__END__

View File

@ -23,7 +23,7 @@
=head1 NAME
zmupdate.pl - check and upgrade Zoneminer database
zmupdate.pl - check and upgrade ZoneMinder database
=head1 SYNOPSIS

View File

@ -115,6 +115,7 @@ void zmLoadConfig()
if ( ! staticConfig.SERVER_ID ) {
if ( ! staticConfig.SERVER_NAME.empty() ) {
Debug( 1, "Fetching ZM_SERVER_ID For Name = %s", staticConfig.SERVER_NAME.c_str() );
std::string sql = stringtf("SELECT Id FROM Servers WHERE Name='%s'", staticConfig.SERVER_NAME.c_str() );
if ( MYSQL_ROW dbrow = zmDbFetchOne( sql.c_str() ) ) {
staticConfig.SERVER_ID = atoi(dbrow[0]);
@ -124,6 +125,7 @@ void zmLoadConfig()
} // end if has SERVER_NAME
} else if ( staticConfig.SERVER_NAME.empty() ) {
Debug( 1, "Fetching ZM_SERVER_NAME For Id = %d", staticConfig.SERVER_ID );
std::string sql = stringtf("SELECT Name FROM Servers WHERE Id='%d'", staticConfig.SERVER_ID );
if ( MYSQL_ROW dbrow = zmDbFetchOne( sql.c_str() ) ) {
@ -133,6 +135,11 @@ void zmLoadConfig()
}
}
if ( ! staticConfig.SERVER_ID ) {
Info( "No Server ID or Name specified in config. Not using Multi-Server Mode." );
} else {
Info( "Server is %d: using Multi-Server Mode.", staticConfig.SERVER_ID );
}
}
StaticConfig staticConfig;

View File

@ -1095,6 +1095,11 @@ void EventStream::processCommand( const CmdMsg *msg )
Debug( 1, "Got QUERY command, sending STATUS" );
break;
}
case CMD_QUIT :
{
Info ("User initiated exit - CMD_QUIT");
break;
}
default :
{
// Do nothing, for now
@ -1132,6 +1137,9 @@ void EventStream::processCommand( const CmdMsg *msg )
exit( -1 );
}
}
// quit after sending a status, if this was a quit request
if ((MsgCommand)msg->msg_data[0]==CMD_QUIT)
exit(0);
updateFrameRate( (double)event_data->frame_count/event_data->duration );
}

View File

@ -2062,9 +2062,9 @@ int Monitor::LoadLocalMonitors( const char *device, Monitor **&monitors, Purpose
sql += "'";
}
if ( staticConfig.SERVER_ID ) {
Debug( 1, "Server ID %d", staticConfig.SERVER_ID );
sql += stringtf( " AND ServerId=%d", staticConfig.SERVER_ID );
}
Debug( 1, "Loading Local Monitors with %s", sql.c_str() );
MYSQL_RES *result = zmDbFetch( sql.c_str() );
if ( !result ) {
@ -2246,6 +2246,7 @@ int Monitor::LoadRemoteMonitors( const char *protocol, const char *host, const c
sql += stringtf(" AND Protocol = '%s' and Host = '%s' and Port = '%s' and Path = '%s'", protocol, host, port, path );
}
Debug( 1, "Loading Remote Monitors with %s", sql.c_str() );
MYSQL_RES *result = zmDbFetch( sql.c_str() );
if ( !result ) {
Error( "Can't use query result: %s", mysql_error( &dbconn ) );
@ -2426,6 +2427,7 @@ int Monitor::LoadFileMonitors( const char *file, Monitor **&monitors, Purpose pu
if ( staticConfig.SERVER_ID ) {
sql += stringtf( " AND ServerId=%d", staticConfig.SERVER_ID );
}
Debug( 1, "Loading File Monitors with %s", sql.c_str() );
MYSQL_RES *result = zmDbFetch( sql.c_str() );
if ( !result )
{
@ -2570,6 +2572,7 @@ int Monitor::LoadFfmpegMonitors( const char *file, Monitor **&monitors, Purpose
if ( staticConfig.SERVER_ID ) {
sql += stringtf( " AND ServerId=%d", staticConfig.SERVER_ID );
}
Debug( 1, "Loading FFMPEG Monitors with %s", sql.c_str() );
MYSQL_RES *result = zmDbFetch( sql.c_str() );
if ( ! result ) {
Error( "Cannot load FfmpegMonitors" );
@ -3937,6 +3940,11 @@ void MonitorStream::processCommand( const CmdMsg *msg )
Debug( 1, "Got SCALE command, to %d", scale );
break;
}
case CMD_QUIT :
{
Info ("User initiated exit - CMD_QUIT");
break;
}
case CMD_QUERY :
{
Debug( 1, "Got QUERY command, sending STATUS" );
@ -4002,6 +4010,10 @@ void MonitorStream::processCommand( const CmdMsg *msg )
}
}
// quit after sending a status, if this was a quit request
if ((MsgCommand)msg->msg_data[0]==CMD_QUIT)
exit(0);
updateFrameRate( monitor->GetFPS() );
}

View File

@ -199,7 +199,7 @@ int RemoteCameraHttp::ReadData( Buffer &buffer, int bytes_expected )
return( -1 );
}
// There can be lots of bytes available. I've seen 4MB or more. This will vastly inflate our buffer size unneccessarily.
// There can be lots of bytes available. I've seen 4MB or more. This will vastly inflate our buffer size unnecessarily.
if ( total_bytes_to_read > ZM_NETWORK_BUFSIZ ) {
total_bytes_to_read = ZM_NETWORK_BUFSIZ;
Debug(3, "Just getting 32K" );

View File

@ -57,7 +57,7 @@ protected:
} DataMsg;
typedef enum { MSG_CMD=1, MSG_DATA_WATCH, MSG_DATA_EVENT } MsgType;
typedef enum { CMD_NONE=0, CMD_PAUSE, CMD_PLAY, CMD_STOP, CMD_FASTFWD, CMD_SLOWFWD, CMD_SLOWREV, CMD_FASTREV, CMD_ZOOMIN, CMD_ZOOMOUT, CMD_PAN, CMD_SCALE, CMD_PREV, CMD_NEXT, CMD_SEEK, CMD_VARPLAY, CMD_GET_IMAGE, CMD_QUERY=99 } MsgCommand;
typedef enum { CMD_NONE=0, CMD_PAUSE, CMD_PLAY, CMD_STOP, CMD_FASTFWD, CMD_SLOWFWD, CMD_SLOWREV, CMD_FASTREV, CMD_ZOOMIN, CMD_ZOOMOUT, CMD_PAN, CMD_SCALE, CMD_PREV, CMD_NEXT, CMD_SEEK, CMD_VARPLAY, CMD_GET_IMAGE, CMD_QUIT, CMD_QUERY=99 } MsgCommand;
protected:
Monitor *monitor;

View File

@ -275,7 +275,7 @@ int main( int argc, char *argv[] )
Debug( 1, "Read frame header, expecting %ld bytes of image", frame_header.image_length );
static unsigned char image_data[ZM_MAX_IMAGE_SIZE];
// Read for pipe and loop until bytes expected have been read or an error occures
// Read for pipe and loop until bytes expected have been read or an error occurs
int bytes_read = 0;
do
{

View File

@ -1,18 +1,45 @@
#!/bin/bash
if [ "$1" == "clean" ]; then
read -p "Do you really want to delete existing packages? [y/N]"
[[ $REPLY == [yY] ]] && { rm -fr zoneminder*.build zoneminder*.changes zoneminder*.deb; echo "Existing package files deleted"; } || { echo "Packages have NOT been deleted"; }
exit;
fi
DATE=`date -R`
DISTRO=$1
SNAPSHOT=$2
if [ "$SNAPSHOT" == "stable" ]; then
SNAPSHOT="";
fi;
TYPE=$3
if [ "$TYPE" == "" ]; then
TYPE="source";
fi;
BRANCH=$4
if [ ! -d 'zoneminder_release' ]; then
git clone https://github.com/ZoneMinder/ZoneMinder.git zoneminder_release
git clone https://github.com/ZoneMinder/ZoneMinder.git zoneminder_release
fi;
if [ "$BRANCH" != "" ]; then
cd zoneminder_release
if [ "$BRANCH" == "stable" ]; then
BRANCH=$(git describe --tags $(git rev-list --tags --max-count=1));
echo "Latest stable branch is $BRANCH";
fi
git checkout $BRANCH
cd ../
fi;
VERSION=`cat zoneminder_release/version`
if [ $VERSION == "" ]; then
exit 1;
exit 1;
fi;
echo "Doing $TYPE release zoneminder_$VERSION-$DISTRO-$SNAPSHOT";
mv zoneminder_release zoneminder_$VERSION-$DISTRO-$SNAPSHOT.orig
@ -20,28 +47,45 @@ cd zoneminder_$VERSION-$DISTRO-$SNAPSHOT.orig
git submodule init
git submodule update --init --recursive
if [ $DISTRO == "trusty" ]; then
cp -r distros/ubuntu1204_cmake debian
ln -sf distros/ubuntu1204_cmake debian
else
cp -r distros/ubuntu1504_cmake debian
ln -sf distros/ubuntu1504_cmake debian
fi;
if [ -z `hostname -d` ] ; then
AUTHOR="`getent passwd $USER | cut -d ':' -f 5 | cut -d ',' -f 1` <`whoami`@`hostname`.local>"
else
AUTHOR="`getent passwd $USER | cut -d ':' -f 5 | cut -d ',' -f 1` <`whoami`@`hostname`>"
fi
cat <<EOF > debian/changelog
zoneminder ($VERSION-$DISTRO-$SNAPSHOT) $DISTRO; urgency=medium
*
-- Isaac Connor <iconnor@connortechnology.com> $DATE
-- $AUTHOR $DATE
EOF
rm -rf .git
rm .gitignore
cd ../
tar zcf zoneminder_$VERSION-$DISTRO.orig.tar.gz zoneminder_$VERSION-$DISTRO-$SNAPSHOT.orig
cd zoneminder_$VERSION-$DISTRO-$SNAPSHOT.orig
#rm -rf .git
#rm .gitignore
#cd ../
#tar zcf zoneminder_$VERSION-$DISTRO.orig.tar.gz zoneminder_$VERSION-$DISTRO-$SNAPSHOT.orig
#cd zoneminder_$VERSION-$DISTRO-$SNAPSHOT.orig
if [ $TYPE == "binary" ]; then
debuild -k52C7377E
debuild
else
debuild -S -sa -k52C7377E
if [ $TYPE == "local" ]; then
debuild -i -us -uc -b
else
debuild -S -sa
fi;
fi;
cd ../
rm -fr zoneminder_$VERSION-$DISTRO-$SNAPSHOT.orig
read -p "Do you want to keep the checked out version of Zoneminder (incase you want to modify it later) [y/N]"
[[ $REPLY == [yY] ]] && { mv zoneminder_$VERSION-$DISTRO-$SNAPSHOT.orig zoneminder_release; echo "The checked out copy is preserved in zoneminder_release"; } || { rm -fr zoneminder_$VERSION-$DISTRO-$SNAPSHOT.orig; echo "The checked out copy has been deleted"; }
echo "Done!"

View File

@ -6,8 +6,7 @@
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
require all granted
</Directory>
</VirtualHost>

5
utils/docker/phpdate.ini Normal file
View File

@ -0,0 +1,5 @@
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = GMT

View File

@ -1,5 +1,11 @@
#!/bin/bash
# Prepare proper amount of shared memory
# For H.264 cameras it may be necessary to increase the amout of shared memory
# to 2048 megabytes.
umount /dev/shm
mount -t tmpfs -o rw,nosuid,nodev,noexec,relatime,size=512M tmpfs /dev/shm
# Start MySQL
/usr/bin/mysqld_safe &
@ -25,7 +31,13 @@ done
mysql -u root < db/zm_create.sql
# Add the ZoneMinder DB user
mysql -u root -e "grant insert,select,update,delete,lock tables,alter on zm.* to 'zm'@'localhost' identified by 'zm'"
mysql -u root -e "grant insert,select,update,delete,lock tables,alter on zm.* to 'zmuser'@'localhost' identified by 'zmpass';"
# Activate CGI
a2enmod cgi
# Activate modrewrite
a2enmod rewrite
# Restart apache
service apache2 restart

View File

@ -1 +1 @@
1.29.1
1.30.2

72
web/includes/Event.php Normal file
View File

@ -0,0 +1,72 @@
<?php
require_once( 'database.php' );
require_once( 'Storage.php' );
class Event {
public function __construct( $IdOrRow ) {
$row = NULL;
if ( $IdOrRow ) {
if ( is_integer( $IdOrRow ) or is_numeric( $IdOrRow ) ) {
$row = dbFetchOne( 'SELECT *,unix_timestamp(StartTime) as Time FROM Events WHERE Id=?', NULL, array( $IdOrRow ) );
if ( ! $row ) {
Error("Unable to load Event record for Id=" . $IdOrRow );
}
} elseif ( is_array( $IdOrRow ) ) {
$row = $IdOrRow;
} else {
Error("Unknown argument passed to Event Constructor ($IdOrRow)");
return;
}
} # end if isset($IdOrRow)
if ( $row ) {
foreach ($row as $k => $v) {
$this->{$k} = $v;
}
} else {
Error("No row for Event " . $IdOrRow );
}
} // end function __construct
public function Storage() {
return new Storage( $this->{'StorageId'} );
}
public function __call( $fn, array $args){
if(isset($this->{$fn})){
return $this->{$fn};
#array_unshift($args, $this);
#call_user_func_array( $this->{$fn}, $args);
}
}
public function Path() {
$Storage = $this->Storage();
return $Storage->Path().'/'.$this->Relative_Path();
}
public function Relative_Path() {
$event_path = "";
if ( ZM_USE_DEEP_STORAGE )
{
$event_path =
$this->{'MonitorId'}
.'/'.strftime( "%y/%m/%d/%H/%M/%S",
$this->{'Time'}
)
;
}
else
{
$event_path =
$this->{'MonitorId'}
.'/'.$this->{'Id'}
;
}
return( $event_path );
}
}
?>

View File

@ -6,6 +6,7 @@ web_DATA = \
config.php
dist_web_DATA = \
Event.php \
Monitor.php \
Server.php \
Storage.php \

View File

@ -36,5 +36,14 @@ class Storage {
#call_user_func_array( $this->{$fn}, $args);
}
}
public static function find_all() {
$storage_areas = array();
$result = dbQuery( 'SELECT * FROM Storage ORDER BY Name');
$results = $result->fetchALL(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'Storage' );
foreach ( $results as $row => $obj ) {
$storage_areas[] = $obj;
}
return $storage_areas;
}
}
?>

View File

@ -181,6 +181,8 @@ if ( !empty($action) )
$sql .= ", AutoDelete = ".dbEscape($_REQUEST['autoDelete']);
if ( !empty($_REQUEST['background']) )
$sql .= ", Background = ".dbEscape($_REQUEST['background']);
if ( !empty($_REQUEST['concurrent']) )
$sql .= ", Concurrent = ".dbEscape($_REQUEST['concurrent']);
dbQuery( $sql );
$refreshParent = true;
}

View File

@ -792,7 +792,7 @@ function getFormChanges( $values, $newValues, $types=false, $columns=false )
{
if ( !isset($values[$key]) || ($values[$key] != $value) )
{
$changes[$key] = "$key = ".dbEscape($value);
$changes[$key] = "$key = ".dbEscape(trim($value));
}
break;
}

View File

@ -87,6 +87,7 @@ $SLANG = array(
'Actual' => 'Actual',
'AddNewControl' => 'Add New Control',
'AddNewMonitor' => 'Add New Monitor',
'AddNewServer' => 'Add New Server',
'AddNewUser' => 'Add New User',
'AddNewZone' => 'Add New Zone',
'Alarm' => 'Alarm',
@ -232,6 +233,7 @@ $SLANG = array(
'Close' => 'Close',
'Colour' => 'Colour',
'Command' => 'Command',
'ConcurrentFilter' => 'Run filter concurrently',
'Config' => 'Config',
'ConfiguredFor' => 'Configured for',
'ConfirmDeleteEvents' => 'Are you sure you wish to delete the selected events?',
@ -385,6 +387,7 @@ $SLANG = array(
'HighBW' => 'High&nbsp;B/W',
'High' => 'High',
'Home' => 'Home',
'Hostname' => 'Hostname',
'Hour' => 'Hour',
'Hue' => 'Hue',
'Id' => 'Id',

View File

@ -1,3 +1,4 @@
<?php
//
// ZoneMinder web UK English language file, $Date$, $Revision$
@ -50,7 +51,7 @@
// do this by default, uncomment this if required.
//
// Example
header( "Content-Type: text/html; charset=koi8-r" );
header( "Content-Type: text/html; charset=utf-8" );
// You may need to change your locale here if your default one is incorrect for the
// language described in this file, or if you have multiple languages supported.
@ -71,60 +72,60 @@ header( "Content-Type: text/html; charset=koi8-r" );
// Simple String Replacements
$SLANG = array(
'24BitColour' => '24 битный цвет',
'32BitColour' => '32 битный цвет', // Added - 2011-06-15
'8BitGrey' => '256 оттенков серого',
'24BitColour' => '24 битный цвет',
'32BitColour' => '32 битный цвет', // Added - 2011-06-15
'8BitGrey' => '256 оттенков серого',
'Action' => 'Action',
'Actual' => 'Действительный',
'Actual' => 'Действительный',
'AddNewControl' => 'Add New Control',
'AddNewMonitor' => 'Добавить монитор',
'AddNewUser' => 'Добавить пользователя',
'AddNewZone' => 'Добавить зону',
'Alarm' => 'Тревога',
'AlarmBrFrames' => 'Кадры<br/>тревоги',
'AlarmFrame' => 'Кадр тревоги',
'AddNewMonitor' => 'Добавить монитор',
'AddNewUser' => 'Добавить пользователя',
'AddNewZone' => 'Добавить зону',
'Alarm' => 'Тревога',
'AlarmBrFrames' => 'Кадры<br/>тревоги',
'AlarmFrame' => 'Кадр тревоги',
'AlarmFrameCount' => 'Alarm Frame Count',
'AlarmLimits' => 'Гран.&nbsp;зоны&nbsp;трев.',
'AlarmLimits' => 'Гран.&nbsp;зоны&nbsp;трев.',
'AlarmMaximumFPS' => 'Alarm Maximum FPS',
'AlarmPx' => 'Пкс&nbsp;трев.',
'AlarmPx' => 'Пкс&nbsp;трев.',
'AlarmRGBUnset' => 'You must set an alarm RGB colour',
'AlarmRefImageBlendPct'=> 'Alarm Reference Image Blend %ge', // Added - 2015-04-18
'Alert' => 'Настороже',
'All' => 'Все',
'Alert' => 'Настороже',
'All' => 'Все',
'AnalysisFPS' => 'Analysis FPS', // Added - 2015-07-22
'AnalysisUpdateDelay' => 'Analysis Update Delay', // Added - 2015-07-23
'Apply' => 'Применить',
'ApplyingStateChange' => 'Состояние сервиса изменяется',
'ArchArchived' => 'Только в архиве',
'ArchUnarchived' => 'Только не в архиве',
'Archive' => 'Архив',
'Apply' => 'Применить',
'ApplyingStateChange' => 'Состояние сервиса изменяется',
'ArchArchived' => 'Только в архиве',
'ArchUnarchived' => 'Только не в архиве',
'Archive' => 'Архив',
'Archived' => 'Archived',
'Area' => 'Area',
'AreaUnits' => 'Area (px/%)',
'AttrAlarmFrames' => 'Кол-во кадров тревоги',
'AttrArchiveStatus' => 'Статус архивации',
'AttrAvgScore' => 'Сред. оценка',
'AttrAlarmFrames' => 'Кол-во кадров тревоги',
'AttrArchiveStatus' => 'Статус архивации',
'AttrAvgScore' => 'Сред. оценка',
'AttrCause' => 'Cause',
'AttrDate' => 'Дата',
'AttrDateTime' => 'Дата/Время',
'AttrDate' => 'Дата',
'AttrDateTime' => 'Дата/Время',
'AttrDiskBlocks' => 'Disk Blocks',
'AttrDiskPercent' => 'Disk Percent',
'AttrDuration' => 'Длительность',
'AttrFrames' => 'Кол-во кадров',
'AttrDuration' => 'Длительность',
'AttrFrames' => 'Кол-во кадров',
'AttrId' => 'Id',
'AttrMaxScore' => 'Макс. оценка',
'AttrMonitorId' => 'Id Монитора',
'AttrMonitorName' => 'Название Монитора',
'AttrMaxScore' => 'Макс. оценка',
'AttrMonitorId' => 'Id Монитора',
'AttrMonitorName' => 'Название Монитора',
'AttrName' => 'Name',
'AttrNotes' => 'Notes',
'AttrSystemLoad' => 'System Load',
'AttrTime' => 'Время',
'AttrTotalScore' => 'Сумм. оценка',
'AttrWeekday' => 'День недели',
'AttrTime' => 'Время',
'AttrTotalScore' => 'Сумм. оценка',
'AttrWeekday' => 'День недели',
'Auto' => 'Auto',
'AutoStopTimeout' => 'Auto Stop Timeout',
'Available' => 'Available', // Added - 2009-03-31
'AvgBrScore' => 'Сред.<br/>оценка',
'AvgBrScore' => 'Сред.<br/>оценка',
'Background' => 'Background',
'BackgroundFilter' => 'Run filter in background',
'BadAlarmFrameCount' => 'Alarm frame count must be an integer of one or more',
@ -157,14 +158,14 @@ $SLANG = array(
'BadWarmupCount' => 'Warmup frames must be an integer of zero or more',
'BadWebColour' => 'Web colour must be a valid web colour string',
'BadWidth' => 'Width must be set to a valid value',
'Bandwidth' => 'канал',
'Bandwidth' => 'канал',
'BandwidthHead' => 'Bandwidth', // This is the end of the bandwidth status on the top of the console, different in many language due to phrasing
'BlobPx' => 'Пкс объекта',
'BlobSizes' => 'Размер объектов',
'Blobs' => 'Кол-во объектов',
'Brightness' => 'Яркость',
'BlobPx' => 'Пкс объекта',
'BlobSizes' => 'Размер объектов',
'Blobs' => 'Кол-во объектов',
'Brightness' => 'Яркость',
'Buffer' => 'Buffer', // Added - 2015-04-18
'Buffers' => 'Буферы',
'Buffers' => 'Буферы',
'CSSDescription' => 'Change the default css for this computer', // Added - 2015-04-18
'CanAutoFocus' => 'Can Auto Focus',
'CanAutoGain' => 'Can Auto Gain',
@ -204,35 +205,35 @@ $SLANG = array(
'CanZoomAbs' => 'Can Zoom Absolute',
'CanZoomCon' => 'Can Zoom Continuous',
'CanZoomRel' => 'Can Zoom Relative',
'Cancel' => 'Отменить',
'CancelForcedAlarm' => 'Отменить форсированную тревогу',
'CaptureHeight' => 'Размер по Y',
'Cancel' => 'Отменить',
'CancelForcedAlarm' => 'Отменить форсированную тревогу',
'CaptureHeight' => 'Размер по Y',
'CaptureMethod' => 'Capture Method', // Added - 2009-02-08
'CapturePalette' => 'Режим захвата',
'CapturePalette' => 'Режим захвата',
'CaptureResolution' => 'Capture Resolution', // Added - 2015-04-18
'CaptureWidth' => 'Размер по X',
'CaptureWidth' => 'Размер по X',
'Cause' => 'Cause',
'CheckMethod' => 'Метод проверки тревоги',
'CheckMethod' => 'Метод проверки тревоги',
'ChooseDetectedCamera' => 'Choose Detected Camera', // Added - 2009-03-31
'ChooseFilter' => 'Выбрать фильтр',
'ChooseFilter' => 'Выбрать фильтр',
'ChooseLogFormat' => 'Choose a log format', // Added - 2011-06-17
'ChooseLogSelection' => 'Choose a log selection', // Added - 2011-06-17
'ChoosePreset' => 'Choose Preset',
'Clear' => 'Clear', // Added - 2011-06-16
'Close' => 'Закрыть',
'Colour' => 'Цвет',
'Close' => 'Закрыть',
'Colour' => 'Цвет',
'Command' => 'Command',
'Component' => 'Component', // Added - 2011-06-16
'Config' => 'Config',
'ConfiguredFor' => 'Настроен на',
'ConfiguredFor' => 'Настроен на',
'ConfirmDeleteEvents' => 'Are you sure you wish to delete the selected events?',
'ConfirmPassword' => 'Подтвердите пароль',
'ConjAnd' => 'и',
'ConjOr' => 'или',
'Console' => 'Сервер',
'ContactAdmin' => 'Пожалуйста обратитесь к вашему администратору.',
'ConfirmPassword' => 'Подтвердите пароль',
'ConjAnd' => 'и',
'ConjOr' => 'или',
'Console' => 'Сервер',
'ContactAdmin' => 'Пожалуйста обратитесь к вашему администратору.',
'Continue' => 'Continue',
'Contrast' => 'Контраст',
'Contrast' => 'Контраст',
'Control' => 'Control',
'ControlAddress' => 'Control Address',
'ControlCap' => 'Control Capability',
@ -242,29 +243,29 @@ $SLANG = array(
'Controllable' => 'Controllable',
'Current' => 'Current', // Added - 2015-04-18
'Cycle' => 'Cycle',
'CycleWatch' => 'Циклический просмотр',
'CycleWatch' => 'Циклический просмотр',
'DateTime' => 'Date/Time', // Added - 2011-06-16
'Day' => 'День',
'Day' => 'День',
'Debug' => 'Debug',
'DefaultRate' => 'Default Rate',
'DefaultScale' => 'Default Scale',
'DefaultView' => 'Default View',
'Deinterlacing' => 'Deinterlacing', // Added - 2015-04-18
'Delay' => 'Delay', // Added - 2015-04-18
'Delete' => 'Удалить',
'DeleteAndNext' => 'Удалить &amp; след.',
'DeleteAndPrev' => 'Удалить &amp; пред.',
'DeleteSavedFilter' => 'Удалить сохраненный фильтр',
'Description' => 'Описание',
'Delete' => 'Удалить',
'DeleteAndNext' => 'Удалить &amp; след.',
'DeleteAndPrev' => 'Удалить &amp; пред.',
'DeleteSavedFilter' => 'Удалить сохраненный фильтр',
'Description' => 'Описание',
'DetectedCameras' => 'Detected Cameras', // Added - 2009-03-31
'DetectedProfiles' => 'Detected Profiles', // Added - 2015-04-18
'Device' => 'Device', // Added - 2009-02-08
'DeviceChannel' => 'Канал',
'DeviceFormat' => 'Формат',
'DeviceNumber' => 'Номер устройства',
'DeviceChannel' => 'Канал',
'DeviceFormat' => 'Формат',
'DeviceNumber' => 'Номер устройства',
'DevicePath' => 'Device Path',
'Devices' => 'Devices',
'Dimensions' => 'Размеры',
'Dimensions' => 'Размеры',
'DisableAlarms' => 'Disable Alarms',
'Disk' => 'Disk',
'Display' => 'Display', // Added - 2011-01-30
@ -281,23 +282,23 @@ $SLANG = array(
'DonateYes' => 'Yes, I\'d like to donate now',
'Download' => 'Download',
'DuplicateMonitorName' => 'Duplicate Monitor Name', // Added - 2009-03-31
'Duration' => 'Длительность',
'Edit' => 'Редактирование',
'Duration' => 'Длительность',
'Edit' => 'Редактирование',
'Email' => 'Email',
'EnableAlarms' => 'Enable Alarms',
'Enabled' => 'разрешен',
'EnterNewFilterName' => 'Введите новое название фильтра',
'Error' => 'Ошибка',
'ErrorBrackets' => 'Ошибка: количество открывающих и закрывающих скобок должно быть одинаковым',
'ErrorValidValue' => 'Ошибка: проверьте что все термы имеют действительное значение',
'Etc' => 'и т.д.',
'Event' => 'Событие',
'EventFilter' => 'Фильтр событий',
'Enabled' => 'разрешен',
'EnterNewFilterName' => 'Введите новое название фильтра',
'Error' => 'Ошибка',
'ErrorBrackets' => 'Ошибка: количество открывающих и закрывающих скобок должно быть одинаковым',
'ErrorValidValue' => 'Ошибка: проверьте что все термы имеют действительное значение',
'Etc' => 'и т.д.',
'Event' => 'Событие',
'EventFilter' => 'Фильтр событий',
'EventId' => 'Event Id',
'EventName' => 'Event Name',
'EventPrefix' => 'Event Prefix',
'Events' => 'События',
'Exclude' => 'Исключить',
'Events' => 'События',
'Exclude' => 'Исключить',
'Execute' => 'Execute',
'Export' => 'Export',
'ExportDetails' => 'Export Event Details',
@ -313,8 +314,8 @@ $SLANG = array(
'ExportSucceeded' => 'Export Succeeded', // Added - 2009-02-08
'ExportVideoFiles' => 'Export Video Files (if present)',
'Exporting' => 'Exporting',
'FPS' => 'к/c',
'FPSReportInterval' => 'Период обновления индикации скорости',
'FPS' => 'к/c',
'FPSReportInterval' => 'Период обновления индикации скорости',
'FTP' => 'FTP',
'Far' => 'Far',
'FastForward' => 'Fast Forward',
@ -328,12 +329,12 @@ $SLANG = array(
'FilterExecuteEvents' => 'Execute command on all matches',
'FilterLog' => 'Filter log', // Added - 2015-04-18
'FilterMessageEvents' => 'Message details of all matches',
'FilterPx' => 'Пкс фильтра',
'FilterPx' => 'Пкс фильтра',
'FilterUnset' => 'You must specify a filter width and height',
'FilterUploadEvents' => 'Upload all matches',
'FilterVideoEvents' => 'Create video for all matches',
'Filters' => 'Filters',
'First' => 'Первый',
'First' => 'Первый',
'FlippedHori' => 'Flipped Horizontally',
'FlippedVert' => 'Flipped Vertically',
'FnMocord' => 'Mocord', // Added 2013.08.16.
@ -343,21 +344,21 @@ $SLANG = array(
'FnNone' => 'None', // Added 2013.08.16.
'FnRecord' => 'Record', // Added 2013.08.16.
'Focus' => 'Focus',
'ForceAlarm' => 'Включить тревогу',
'ForceAlarm' => 'Включить тревогу',
'Format' => 'Format',
'Frame' => 'Кадр',
'FrameId' => 'Id кадра',
'FrameRate' => 'Скорость',
'FrameSkip' => 'Пропускать кадры',
'Frames' => 'кадры',
'Func' => 'Функ.',
'Function' => 'Функция',
'Frame' => 'Кадр',
'FrameId' => 'Id кадра',
'FrameRate' => 'Скорость',
'FrameSkip' => 'Пропускать кадры',
'Frames' => 'кадры',
'Func' => 'Функ.',
'Function' => 'Функция',
'Gain' => 'Gain',
'General' => 'General',
'GenerateVideo' => 'Генерировать видео',
'GeneratingVideo' => 'Генерируется видео',
'GoToZoneMinder' => 'Перейти на ZoneMinder.com',
'Grey' => 'ч/б',
'GenerateVideo' => 'Генерировать видео',
'GeneratingVideo' => 'Генерируется видео',
'GoToZoneMinder' => 'Перейти на ZoneMinder.com',
'Grey' => 'ч/б',
'Group' => 'Group',
'Groups' => 'Groups',
'HasFocusSpeed' => 'Has Focus Speed',
@ -371,25 +372,25 @@ $SLANG = array(
'HasTurboTilt' => 'Has Turbo Tilt',
'HasWhiteSpeed' => 'Has White Bal. Speed',
'HasZoomSpeed' => 'Has Zoom Speed',
'High' => 'широкий',
'HighBW' => 'Широкий канал',
'High' => 'широкий',
'HighBW' => 'Широкий канал',
'Home' => 'Home',
'Hour' => 'Час',
'Hue' => 'Оттенок',
'Hour' => 'Час',
'Hue' => 'Оттенок',
'Id' => 'Id',
'Idle' => 'Idle',
'Ignore' => 'Игнорировать',
'Image' => 'Изображение',
'ImageBufferSize' => 'Размер буфера изображения',
'Ignore' => 'Игнорировать',
'Image' => 'Изображение',
'ImageBufferSize' => 'Размер буфера изображения',
'Images' => 'Images',
'In' => 'In',
'Include' => 'Включить',
'Inverted' => 'Инвертировать',
'Include' => 'Включить',
'Inverted' => 'Инвертировать',
'Iris' => 'Iris',
'KeyString' => 'Key String',
'Label' => 'Label',
'Language' => 'Язык',
'Last' => 'Последний',
'Language' => 'Язык',
'Last' => 'Последний',
'Layout' => 'Layout', // Added - 2009-02-08
'Level' => 'Level', // Added - 2011-06-16
'Libvlc' => 'Libvlc',
@ -399,23 +400,23 @@ $SLANG = array(
'LinkedMonitors' => 'Linked Monitors',
'List' => 'List',
'Load' => 'Load',
'Local' => 'Локальный',
'Local' => 'Локальный',
'Log' => 'Log', // Added - 2011-06-16
'LoggedInAs' => 'Пользователь',
'LoggedInAs' => 'Пользователь',
'Logging' => 'Logging', // Added - 2011-06-16
'LoggingIn' => 'Вход в систему',
'Login' => 'Войти',
'Logout' => 'Выйти',
'LoggingIn' => 'Вход в систему',
'Login' => 'Войти',
'Logout' => 'Выйти',
'Logs' => 'Logs', // Added - 2011-06-17
'Low' => 'узкий',
'LowBW' => 'Узкий канал',
'Low' => 'узкий',
'LowBW' => 'Узкий канал',
'Main' => 'Main',
'Man' => 'Man',
'Manual' => 'Manual',
'Mark' => 'Метка',
'Max' => 'Макс.',
'Mark' => 'Метка',
'Max' => 'Макс.',
'MaxBandwidth' => 'Max Bandwidth',
'MaxBrScore' => 'Макс.<br/>оценка',
'MaxBrScore' => 'Макс.<br/>оценка',
'MaxFocusRange' => 'Max Focus Range',
'MaxFocusSpeed' => 'Max Focus Speed',
'MaxFocusStep' => 'Max Focus Step',
@ -437,16 +438,16 @@ $SLANG = array(
'MaxZoomRange' => 'Max Zoom Range',
'MaxZoomSpeed' => 'Max Zoom Speed',
'MaxZoomStep' => 'Max Zoom Step',
'MaximumFPS' => 'Ограничение скорости записи (к/с)',
'Medium' => 'средний',
'MediumBW' => 'Обычный канал',
'MaximumFPS' => 'Ограничение скорости записи (к/с)',
'Medium' => 'средний',
'MediumBW' => 'Обычный канал',
'Message' => 'Message', // Added - 2011-06-16
'MinAlarmAreaLtMax' => 'Minimum alarm area should be less than maximum',
'MinAlarmAreaUnset' => 'You must specify the minimum alarm pixel count',
'MinBlobAreaLtMax' => 'Минимальная площадь объекта должна быть меньше чем максимальная площадь объекта',
'MinBlobAreaLtMax' => 'Минимальная площадь объекта должна быть меньше чем максимальная площадь объекта',
'MinBlobAreaUnset' => 'You must specify the minimum blob pixel count',
'MinBlobLtMinFilter' => 'Minimum blob area should be less than or equal to minimum filter area',
'MinBlobsLtMax' => 'Минимальное число объектов должно быть меньше чем максимальное число объектов',
'MinBlobsLtMax' => 'Минимальное число объектов должно быть меньше чем максимальное число объектов',
'MinBlobsUnset' => 'You must specify the minimum blob count',
'MinFilterAreaLtMax' => 'Minimum filter area should be less than maximum',
'MinFilterAreaUnset' => 'You must specify the minimum filter pixel count',
@ -463,7 +464,7 @@ $SLANG = array(
'MinPanRange' => 'Min Pan Range',
'MinPanSpeed' => 'Min Pan Speed',
'MinPanStep' => 'Min Pan Step',
'MinPixelThresLtMax' => 'Нижний порог кол-ва пикселей должен быть ниже верхнего порога кол-ва пикселей',
'MinPixelThresLtMax' => 'Нижний порог кол-ва пикселей должен быть ниже верхнего порога кол-ва пикселей',
'MinPixelThresUnset' => 'You must specify a minimum pixel threshold',
'MinTiltRange' => 'Min Tilt Range',
'MinTiltSpeed' => 'Min Tilt Speed',
@ -474,17 +475,17 @@ $SLANG = array(
'MinZoomRange' => 'Min Zoom Range',
'MinZoomSpeed' => 'Min Zoom Speed',
'MinZoomStep' => 'Min Zoom Step',
'Misc' => 'Разное',
'Misc' => 'Разное',
'Mode' => 'Mode', // Added - 2015-04-18
'Monitor' => 'Монитор',
'MonitorIds' => 'Id&nbsp;Мониторов',
'Monitor' => 'Монитор',
'MonitorIds' => 'Id&nbsp;Мониторов',
'MonitorPreset' => 'Monitor Preset',
'MonitorPresetIntro' => 'Select an appropriate preset from the list below.<br><br>Please note that this may overwrite any values you already have configured for this monitor.<br><br>',
'MonitorProbe' => 'Monitor Probe', // Added - 2009-03-31
'MonitorProbeIntro' => 'The list below shows detected analog and network cameras and whether they are already being used or available for selection.<br/><br/>Select the desired entry from the list below.<br/><br/>Please note that not all cameras may be detected and that choosing a camera here may overwrite any values you already have configured for the current monitor.<br/><br/>', // Added - 2009-03-31
'Monitors' => 'Мониторы',
'Monitors' => 'Мониторы',
'Montage' => 'Montage',
'Month' => 'Месяц',
'Month' => 'Месяц',
'More' => 'More', // Added - 2011-06-16
'MotionFrameSkip' => 'Motion Frame Skip',
'Move' => 'Move',
@ -493,30 +494,30 @@ $SLANG = array(
'Mtg3widgrx' => '3-wide grid, scaled, enlarge on alarm', // Added 2013.08.15.
'Mtg4widgrd' => '4-wide grid', // Added 2013.08.15.
'MtgDefault' => 'Default', // Added 2013.08.15.
'MustBeGe' => 'должно быть больше или равно',
'MustBeLe' => 'должно быть меньше или равно',
'MustConfirmPassword' => 'Вы должны подтвердить пароль',
'MustSupplyPassword' => 'Вы должны ввести пароль',
'MustSupplyUsername' => 'Вы должны ввести имя пользователя',
'Name' => 'Имя',
'MustBeGe' => 'должно быть больше или равно',
'MustBeLe' => 'должно быть меньше или равно',
'MustConfirmPassword' => 'Вы должны подтвердить пароль',
'MustSupplyPassword' => 'Вы должны ввести пароль',
'MustSupplyUsername' => 'Вы должны ввести имя пользователя',
'Name' => 'Имя',
'Near' => 'Near',
'Network' => 'Сеть',
'New' => 'Нов.',
'Network' => 'Сеть',
'New' => 'Нов.',
'NewGroup' => 'New Group',
'NewLabel' => 'New Label',
'NewPassword' => 'Новый пароль',
'NewState' => 'Новое состояние',
'NewUser' => 'Новый пользователь',
'Next' => 'След.',
'No' => 'Нет',
'NewPassword' => 'Новый пароль',
'NewState' => 'Новое состояние',
'NewUser' => 'Новый пользователь',
'Next' => 'След.',
'No' => 'Нет',
'NoDetectedCameras' => 'No Detected Cameras', // Added - 2009-03-31
'NoFramesRecorded' => 'Это событие не содежит кадров',
'NoFramesRecorded' => 'Это событие не содежит кадров',
'NoGroup' => 'No Group',
'NoSavedFilters' => 'нет сохраненных фильтров',
'NoStatisticsRecorded' => 'Статистика по этому событию/кадру не записана',
'None' => 'отсутствует',
'NoneAvailable' => 'не доступны',
'Normal' => 'Нормальная',
'NoSavedFilters' => 'нет сохраненных фильтров',
'NoStatisticsRecorded' => 'Статистика по этому событию/кадру не записана',
'None' => 'отсутствует',
'NoneAvailable' => 'не доступны',
'Normal' => 'Нормальная',
'Notes' => 'Notes',
'NumPresets' => 'Num Presets',
'Off' => 'Off',
@ -524,106 +525,106 @@ $SLANG = array(
'OnvifCredentialsIntro'=> 'Please supply user name and password for the selected camera.<br/>If no user has been created for the camera then the user given here will be created with the given password.<br/><br/>', // Added - 2015-04-18
'OnvifProbe' => 'ONVIF', // Added - 2015-04-18
'OnvifProbeIntro' => 'The list below shows detected ONVIF cameras and whether they are already being used or available for selection.<br/><br/>Select the desired entry from the list below.<br/><br/>Please note that not all cameras may be detected and that choosing a camera here may overwrite any values you already have configured for the current monitor.<br/><br/>', // Added - 2015-04-18
'OpEq' => 'равно',
'OpGt' => 'больше',
'OpGtEq' => 'больше либо равно',
'OpIn' => 'в списке',
'OpLt' => 'меньше',
'OpLtEq' => 'меньше или равно',
'OpMatches' => 'совпадает',
'OpNe' => 'не равно',
'OpNotIn' => 'не в списке',
'OpNotMatches' => 'не совпадает',
'OpEq' => 'равно',
'OpGt' => 'больше',
'OpGtEq' => 'больше либо равно',
'OpIn' => 'в списке',
'OpLt' => 'меньше',
'OpLtEq' => 'меньше или равно',
'OpMatches' => 'совпадает',
'OpNe' => 'не равно',
'OpNotIn' => 'не в списке',
'OpNotMatches' => 'не совпадает',
'Open' => 'Open',
'OptionHelp' => 'OptionHelp',
'OptionRestartWarning' => 'Эти изменения подействуют только после перезапуска программы.',
'Options' => 'Опции',
'OrEnterNewName' => 'или введите новое имя',
'OptionRestartWarning' => 'Эти изменения подействуют только после перезапуска программы.',
'Options' => 'Опции',
'OrEnterNewName' => 'или введите новое имя',
'Order' => 'Order',
'Orientation' => 'Ориентация',
'Orientation' => 'Ориентация',
'Out' => 'Out',
'OverwriteExisting' => 'Перезаписать существующее',
'Paged' => 'По страницам',
'OverwriteExisting' => 'Перезаписать существующее',
'Paged' => 'По страницам',
'Pan' => 'Pan',
'PanLeft' => 'Pan Left',
'PanRight' => 'Pan Right',
'PanTilt' => 'Pan/Tilt',
'Parameter' => 'Парамер',
'Password' => 'Пароль',
'PasswordsDifferent' => 'Пароли не совпадают',
'Paths' => 'Пути',
'Parameter' => 'Парамер',
'Password' => 'Пароль',
'PasswordsDifferent' => 'Пароли не совпадают',
'Paths' => 'Пути',
'Pause' => 'Pause',
'Phone' => 'Phone',
'PhoneBW' => 'Телефонная линия',
'PhoneBW' => 'Телефонная линия',
'Pid' => 'PID', // Added - 2011-06-16
'PixelDiff' => 'Pixel Diff',
'Pixels' => 'в пикселях',
'Pixels' => 'в пикселях',
'Play' => 'Play',
'PlayAll' => 'Play All',
'PleaseWait' => 'Пожалуйста подождите',
'PleaseWait' => 'Пожалуйста подождите',
'Plugins' => 'Plugins',
'Point' => 'Point',
'PostEventImageBuffer' => 'Буфер после события',
'PreEventImageBuffer' => 'Буфер до события',
'PostEventImageBuffer' => 'Буфер после события',
'PreEventImageBuffer' => 'Буфер до события',
'PreserveAspect' => 'Preserve Aspect Ratio',
'Preset' => 'Preset',
'Presets' => 'Presets',
'Prev' => 'Пред.',
'Prev' => 'Пред.',
'Probe' => 'Probe', // Added - 2009-03-31
'ProfileProbe' => 'Stream Probe', // Added - 2015-04-18
'ProfileProbeIntro' => 'The list below shows the existing stream profiles of the selected camera .<br/><br/>Select the desired entry from the list below.<br/><br/>Please note that ZoneMinder cannot configure additional profiles and that choosing a camera here may overwrite any values you already have configured for the current monitor.<br/><br/>', // Added - 2015-04-18
'Progress' => 'Progress', // Added - 2015-04-18
'Protocol' => 'Protocol',
'Rate' => 'Скорость',
'Real' => 'Реальная',
'Rate' => 'Скорость',
'Real' => 'Реальная',
'Record' => 'Record',
'RefImageBlendPct' => 'Прозрачность опорного кадра, %',
'Refresh' => 'Обновить',
'Remote' => 'Удаленный',
'RemoteHostName' => 'Имя удаленного хоста',
'RemoteHostPath' => 'Путь на удаленном хосте',
'RemoteHostPort' => 'удаленный порт',
'RefImageBlendPct' => 'Прозрачность опорного кадра, %',
'Refresh' => 'Обновить',
'Remote' => 'Удаленный',
'RemoteHostName' => 'Имя удаленного хоста',
'RemoteHostPath' => 'Путь на удаленном хосте',
'RemoteHostPort' => 'удаленный порт',
'RemoteHostSubPath' => 'Remote Host SubPath', // Added - 2009-02-08
'RemoteImageColours' => 'Цветность на удаленном хосте',
'RemoteImageColours' => 'Цветность на удаленном хосте',
'RemoteMethod' => 'Remote Method', // Added - 2009-02-08
'RemoteProtocol' => 'Remote Protocol', // Added - 2009-02-08
'Rename' => 'Переименовать',
'Rename' => 'Переименовать',
'Replay' => 'Replay',
'ReplayAll' => 'All Events',
'ReplayGapless' => 'Gapless Events',
'ReplaySingle' => 'Single Event',
'Reset' => 'Reset',
'ResetEventCounts' => 'Обнулить счетчик событий',
'Restart' => 'Перезапустить',
'Restarting' => 'Перезапускается',
'RestrictedCameraIds' => 'Id запрещенных камер',
'ResetEventCounts' => 'Обнулить счетчик событий',
'Restart' => 'Перезапустить',
'Restarting' => 'Перезапускается',
'RestrictedCameraIds' => 'Id запрещенных камер',
'RestrictedMonitors' => 'Restricted Monitors',
'ReturnDelay' => 'Return Delay',
'ReturnLocation' => 'Return Location',
'Rewind' => 'Rewind',
'RotateLeft' => 'Повернуть влево',
'RotateRight' => 'Повернуть вправо',
'RotateLeft' => 'Повернуть влево',
'RotateRight' => 'Повернуть вправо',
'RunLocalUpdate' => 'Please run zmupdate.pl to update', // Added - 2011-05-25
'RunMode' => 'Режим работы',
'RunState' => 'Состояние',
'Running' => 'Выполняется',
'Save' => 'Сохранить',
'SaveAs' => 'Сохранить как',
'SaveFilter' => 'Сохранить фильтр',
'Scale' => 'Масштаб',
'Score' => 'Оценка',
'Secs' => 'Сек.',
'Sectionlength' => 'Длина секции (в кадрах)',
'RunMode' => 'Режим работы',
'RunState' => 'Состояние',
'Running' => 'Выполняется',
'Save' => 'Сохранить',
'SaveAs' => 'Сохранить как',
'SaveFilter' => 'Сохранить фильтр',
'Scale' => 'Масштаб',
'Score' => 'Оценка',
'Secs' => 'Сек.',
'Sectionlength' => 'Длина секции (в кадрах)',
'Select' => 'Select',
'SelectFormat' => 'Select Format', // Added - 2011-06-17
'SelectLog' => 'Select Log', // Added - 2011-06-17
'SelectMonitors' => 'Select Monitors',
'SelfIntersecting' => 'Polygon edges must not intersect',
'Set' => 'Set',
'SetNewBandwidth' => 'Установка новой ширина канала',
'SetNewBandwidth' => 'Установка новой ширина канала',
'SetPreset' => 'Set Preset',
'Settings' => 'Настройки',
'ShowFilterWindow' => 'Показать окно фильтра',
'Settings' => 'Настройки',
'ShowFilterWindow' => 'Показать окно фильтра',
'ShowTimeline' => 'Show Timeline',
'SignalCheckColour' => 'Signal Check Colour',
'Size' => 'Size',
@ -632,19 +633,19 @@ $SLANG = array(
'SortAsc' => 'Asc',
'SortBy' => 'Sort by',
'SortDesc' => 'Desc',
'Source' => 'Источник',
'Source' => 'Источник',
'SourceColours' => 'Source Colours', // Added - 2009-02-08
'SourcePath' => 'Source Path', // Added - 2009-02-08
'SourceType' => 'Тип источника',
'SourceType' => 'Тип источника',
'Speed' => 'Speed',
'SpeedHigh' => 'High Speed',
'SpeedLow' => 'Low Speed',
'SpeedMedium' => 'Medium Speed',
'SpeedTurbo' => 'Turbo Speed',
'Start' => 'Запустить',
'State' => 'Состояние',
'Stats' => 'Статистика',
'Status' => 'Статус',
'Start' => 'Запустить',
'State' => 'Состояние',
'Stats' => 'Статистика',
'Status' => 'Статус',
'Step' => 'Step',
'StepBack' => 'Step Back',
'StepForward' => 'Step Forward',
@ -652,84 +653,84 @@ $SLANG = array(
'StepMedium' => 'Medium Step',
'StepNone' => 'No Step',
'StepSmall' => 'Small Step',
'Stills' => 'Стоп-кадры',
'Stop' => 'Остановить',
'Stopped' => 'Остановлен',
'Stream' => 'Поток',
'Stills' => 'Стоп-кадры',
'Stop' => 'Остановить',
'Stopped' => 'Остановлен',
'Stream' => 'Поток',
'StreamReplayBuffer' => 'Stream Replay Image Buffer',
'Submit' => 'Submit',
'System' => 'Система',
'System' => 'Система',
'SystemLog' => 'System Log', // Added - 2011-06-16
'TargetColorspace' => 'Target colorspace', // Added - 2015-04-18
'Tele' => 'Tele',
'Thumbnail' => 'Thumbnail',
'Tilt' => 'Tilt',
'Time' => 'Время',
'TimeDelta' => 'Относительное время',
'TimeStamp' => 'Метка времени',
'Time' => 'Время',
'TimeDelta' => 'Относительное время',
'TimeStamp' => 'Метка времени',
'Timeline' => 'Timeline',
'TimelineTip1' => 'Pass your mouse over the graph to view a snapshot image and event details.', // Added 2013.08.15.
'TimelineTip2' => 'Click on the coloured sections of the graph, or the image, to view the event.', // Added 2013.08.15.
'TimelineTip3' => 'Click on the background to zoom in to a smaller time period based around your click.', // Added 2013.08.15.
'TimelineTip4' => 'Use the controls below to zoom out or navigate back and forward through the time range.', // Added 2013.08.15.
'Timestamp' => 'Метка времени',
'TimestampLabelFormat' => 'Формат метки',
'TimestampLabelX' => 'X-координата метки',
'TimestampLabelY' => 'Y-координата метки',
'Timestamp' => 'Метка времени',
'TimestampLabelFormat' => 'Формат метки',
'TimestampLabelX' => 'X-координата метки',
'TimestampLabelY' => 'Y-координата метки',
'Today' => 'Today',
'Tools' => 'Инструменты',
'Tools' => 'Инструменты',
'Total' => 'Total', // Added - 2011-06-16
'TotalBrScore' => 'Сумм.<br/>оценка',
'TotalBrScore' => 'Сумм.<br/>оценка',
'TrackDelay' => 'Track Delay',
'TrackMotion' => 'Track Motion',
'Triggers' => 'Триггеры',
'Triggers' => 'Триггеры',
'TurboPanSpeed' => 'Turbo Pan Speed',
'TurboTiltSpeed' => 'Turbo Tilt Speed',
'Type' => 'Тип',
'Unarchive' => 'Уд.&nbsp;из&nbsp;архива',
'Type' => 'Тип',
'Unarchive' => 'Уд.&nbsp;из&nbsp;архива',
'Undefined' => 'Undefined', // Added - 2009-02-08
'Units' => 'Ед. измерения',
'Units' => 'Ед. измерения',
'Unknown' => 'Unknown',
'Update' => 'Update',
'UpdateAvailable' => 'Доступно обновление ZoneMinder',
'UpdateNotNecessary' => 'Обновление не требуется',
'UpdateAvailable' => 'Доступно обновление ZoneMinder',
'UpdateNotNecessary' => 'Обновление не требуется',
'Updated' => 'Updated', // Added - 2011-06-16
'Upload' => 'Upload', // Added - 2011-08-23
'UseFilter' => 'Использовать фильтр',
'UseFilterExprsPost' => '&nbsp;выражений&nbsp;для&nbsp;фильтра', // This is used at the end of the phrase 'use N filter expressions'
'UseFilterExprsPre' => 'Испол.&nbsp;', // This is used at the beginning of the phrase 'use N filter expressions'
'UseFilter' => 'Использовать фильтр',
'UseFilterExprsPost' => '&nbsp;выражений&nbsp;для&nbsp;фильтра', // This is used at the end of the phrase 'use N filter expressions'
'UseFilterExprsPre' => 'Испол.&nbsp;', // This is used at the beginning of the phrase 'use N filter expressions'
'UsedPlugins' => 'Used Plugins',
'User' => 'Пользователь',
'Username' => 'Имя пользователя',
'Users' => 'Пользователи',
'User' => 'Пользователь',
'Username' => 'Имя пользователя',
'Users' => 'Пользователи',
'V4L' => 'V4L', // Added - 2015-04-18
'V4LCapturesPerFrame' => 'Captures Per Frame', // Added - 2015-04-18
'V4LMultiBuffer' => 'Multi Buffering', // Added - 2015-04-18
'Value' => 'Значение',
'Version' => 'Версия',
'VersionIgnore' => 'Игнорировать эту версию',
'VersionRemindDay' => 'Напомнить через день',
'VersionRemindHour' => 'Напомнить через час',
'VersionRemindNever' => 'Не говорить о новых версиях',
'VersionRemindWeek' => 'Напомнить через неделю',
'Video' => 'Видео',
'Value' => 'Значение',
'Version' => 'Версия',
'VersionIgnore' => 'Игнорировать эту версию',
'VersionRemindDay' => 'Напомнить через день',
'VersionRemindHour' => 'Напомнить через час',
'VersionRemindNever' => 'Не говорить о новых версиях',
'VersionRemindWeek' => 'Напомнить через неделю',
'Video' => 'Видео',
'VideoFormat' => 'Video Format',
'VideoGenFailed' => 'Ошибка генерации видео!',
'VideoGenFailed' => 'Ошибка генерации видео!',
'VideoGenFiles' => 'Existing Video Files',
'VideoGenNoFiles' => 'No Video Files Found',
'VideoGenParms' => 'Параметры генерации видео',
'VideoGenParms' => 'Параметры генерации видео',
'VideoGenSucceeded' => 'Video Generation Succeeded!',
'VideoSize' => 'Размер изображения',
'View' => 'Просмотр',
'ViewAll' => 'Просм. все',
'VideoSize' => 'Размер изображения',
'View' => 'Просмотр',
'ViewAll' => 'Просм. все',
'ViewEvent' => 'View Event',
'ViewPaged' => 'Просм. постранично',
'ViewPaged' => 'Просм. постранично',
'Wake' => 'Wake',
'WarmupFrames' => 'Кадры разогрева',
'WarmupFrames' => 'Кадры разогрева',
'Watch' => 'Watch',
'Web' => 'Интерфейс',
'Web' => 'Интерфейс',
'WebColour' => 'Web Colour',
'Week' => 'Неделя',
'Week' => 'Неделя',
'White' => 'White',
'WhiteBalance' => 'White Balance',
'Wide' => 'Wide',
@ -739,10 +740,10 @@ $SLANG = array(
'X10InputAlarmString' => 'X10 Input Alarm String',
'X10OutputAlarmString' => 'X10 Output Alarm String',
'Y' => 'Y',
'Yes' => 'Да',
'YouNoPerms' => 'У вас не достаточно прав для доступа к этому ресурсу.',
'Zone' => 'Зона',
'ZoneAlarmColour' => 'Цвет тревоги (Red/Green/Blue)',
'Yes' => 'Да',
'YouNoPerms' => 'У вас не достаточно прав для доступа к этому ресурсу.',
'Zone' => 'Зона',
'ZoneAlarmColour' => 'Цвет тревоги (Red/Green/Blue)',
'ZoneArea' => 'Zone Area',
'ZoneExtendAlarmFrames' => 'Extend Alarm Frame Count',
'ZoneFilterSize' => 'Filter Width/Height (pixels)',
@ -753,7 +754,7 @@ $SLANG = array(
'ZoneMinMaxPixelThres' => 'Min/Max Pixel Threshold (0-255)',
'ZoneMinderLog' => 'ZoneMinder Log', // Added - 2011-06-17
'ZoneOverloadFrames' => 'Overload Frame Ignore Count',
'Zones' => 'Зоны',
'Zones' => 'Зоны',
'Zoom' => 'Zoom',
'ZoomIn' => 'Zoom In',
'ZoomOut' => 'Zoom Out',
@ -761,13 +762,13 @@ $SLANG = array(
// Complex replacements with formatting and/or placements, must be passed through sprintf
$CLANG = array(
'CurrentLogin' => 'Текущий пользователь: \'%1$s\'',
'CurrentLogin' => 'Текущий пользователь: \'%1$s\'',
'EventCount' => '%1$s %2$s', // For example '37 Events' (from Vlang below)
'LastEvents' => 'Последние %1$s %2$s', // For example 'Last 37 Events' (from Vlang below)
'LatestRelease' => 'Последняя версия: v%1$s, у Вас установлена: v%2$s.',
'LastEvents' => 'Последние %1$s %2$s', // For example 'Last 37 Events' (from Vlang below)
'LatestRelease' => 'Последняя версия: v%1$s, у Вас установлена: v%2$s.',
'MonitorCount' => '%1$s %2$s', // For example '4 Monitors' (from Vlang below)
'MonitorFunction' => 'Функция монитора %1$s',
'RunningRecentVer' => 'У вас установлена новейшая версия ZoneMinder, v%s.',
'MonitorFunction' => 'Функция монитора %1$s',
'RunningRecentVer' => 'У вас установлена новейшая версия ZoneMinder, v%s.',
'VersionMismatch' => 'Version mismatch, system is version %1$s, database is %2$s.', // Added - 2011-05-25
);
@ -807,8 +808,8 @@ $CLANG = array(
// Variable arrays expressing plurality, see the zmVlang description above
$VLANG = array(
'Event' => array( 1=>'Событий', 2=>'Событие', 3=>'События' ),
'Monitor' => array( 1=>'Мониторов', 2=>'Монитор', 3=>'Монитора' ),
'Event' => array( 1=>'Событий', 2=>'Событие', 3=>'События' ),
'Monitor' => array( 1=>'Мониторов', 2=>'Монитор', 3=>'Монитора' ),
);
// You will need to choose or write a function that can correlate the plurality string arrays

View File

@ -1,7 +1,7 @@
body {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size:10px;
font-weight: normal
font-weight: normal;
color: #333333;
}

View File

@ -1,7 +1,7 @@
body {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size:10px;
font-weight: normal
font-weight: normal;
color: #333333;
}

View File

@ -1,7 +1,7 @@
body {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size:10px;
font-weight: normal
font-weight: normal;
color: #333333;
}

View File

@ -21,11 +21,9 @@
* Primary look and feel styles
*/
@import url("https://fonts.googleapis.com/css?family=Open+Sans:200,200italic,300,300italic,400,400italic,600,600italic,700");
body {
font-family: "Open Sans", Verdana, Arial, Helvetica, sans-serif;
font-size: 16px;
font-size: 13px;
color: #333333;
font-weight: 300;
text-align: center;

View File

@ -47,7 +47,7 @@ var popupSizes = {
'image': { 'addWidth': 48, 'addHeight': 80 },
'log': { 'width': 1080, 'height': 720 },
'login': { 'width': 720, 'height': 480 },
'logout': { 'width': 260, 'height': 100 },
'logout': { 'width': 260, 'height': 150 },
'monitor': { 'width': 600, 'height': 780 },
'monitorpreset':{ 'width': 440, 'height': 200 },
'monitorprobe': { 'width': 500, 'height': 240 },

View File

@ -47,7 +47,7 @@ var popupSizes = {
'image': { 'addWidth': 48, 'addHeight': 80 },
'log': { 'width': 1080, 'height': 720 },
'login': { 'width': 720, 'height': 480 },
'logout': { 'width': 260, 'height': 100 },
'logout': { 'width': 260, 'height': 150 },
'monitor': { 'width': 600, 'height': 780 },
'monitorpreset':{ 'width': 440, 'height': 200 },
'monitorprobe': { 'width': 500, 'height': 240 },

View File

@ -20,6 +20,9 @@
require_once('includes/Server.php');
$servers = Server::find_all();
require_once('includes/Storage.php');
$storage_areas = Storage::find_all();
$show_storage_areas = count($storage_areas) > 1 and canEdit( 'System' ) ? 1 : 0;
$eventCounts = array(
array(
@ -212,7 +215,11 @@ if ( canView( 'Stream' ) && $cycleCount > 1 )
{
$cycleGroup = isset($_COOKIE['zmGroup'])?$_COOKIE['zmGroup']:0;
?>
<div id="cycleMontage"><?php echo makePopupLink( '?view=cycle&amp;group='.$cycleGroup, 'zmCycle'.$cycleGroup, array( 'cycle', $cycleWidth, $cycleHeight ), translate('Cycle'), $running ) ?>&nbsp;/&nbsp;<?php echo makePopupLink( '?view=montage&amp;group='.$cycleGroup, 'zmMontage'.$cycleGroup, 'montage', translate('Montage'), $running ) ?></div>
<div id="cycleMontage">
<?php echo makePopupLink( '?view=cycle&amp;group='.$cycleGroup, 'zmCycle'.$cycleGroup, array( 'cycle', $cycleWidth, $cycleHeight ), translate('Cycle'), $running ) ?>&nbsp;/&nbsp;
<?php echo makePopupLink( '?view=montage&amp;group='.$cycleGroup, 'zmMontage'.$cycleGroup, 'montage', translate('Montage'), $running ) ?>&nbsp;/&nbsp;
<?php echo makePopupLink( '?view=montagereview&amp;group='.$cycleGroup, 'zmMontage'.$cycleGroup, 'montagereview', translate('Montage Review'), $running ) ?>
</div>
<?php
}
else
@ -238,10 +245,13 @@ else
<tr>
<th class="colName"><?php echo translate('Name') ?></th>
<th class="colFunction"><?php echo translate('Function') ?></th>
<?php if ( count($servers) > 1 ) { ?>
<?php if ( count($servers) ) { ?>
<th class="colServer"><?php echo translate('Server') ?></th>
<?php } ?>
<th class="colSource"><?php echo translate('Source') ?></th>
<?php if ( $show_storage_areas ) { ?>
<th class="colStorage"><?php echo translate('Storage') ?></th>
<?php } ?>
<?php
for ( $i = 0; $i < count($eventCounts); $i++ )
{
@ -264,7 +274,11 @@ if ( canEdit('Monitors') )
</thead>
<tfoot>
<tr>
<td class="colLeftButtons" colspan="<?php echo count($servers) > 1 ? 4 : 3 ?>">
<td class="colLeftButtons" colspan="<?php $columns = 3;
if ( count($servers) > 1 ) { $columns += 1; }
if ( $show_storage_areas ) { $columns += 1; }
echo $columns;
?>">
<input type="button" value="<?php echo translate('Refresh') ?>" onclick="location.reload(true);"/>
<?php echo makePopupButton( '?view=monitor', 'zmMonitor0', 'monitor', translate('AddNewMonitor'), (canEdit( 'Monitors' ) && !$user['MonitorIds']) ) ?>
<?php echo makePopupButton( '?view=filter&amp;filter[terms][0][attr]=DateTime&amp;filter[terms][0][op]=%3c&amp;filter[terms][0][val]=now', 'zmFilter', 'filter', translate('Filters'), canView( 'Events' ) ) ?>
@ -287,7 +301,7 @@ for ( $i = 0; $i < count($eventCounts); $i++ )
foreach( $displayMonitors as $monitor )
{
?>
<tr>
<tr title="<?php echo $monitor['Id'] ?>">
<?php
if ( !$monitor['zmc'] )
$dclass = "errorText";
@ -311,7 +325,7 @@ foreach( $displayMonitors as $monitor )
?>
<td class="colName"><?php echo makePopupLink( '?view=watch&amp;mid='.$monitor['Id'], 'zmWatch'.$monitor['Id'], array( 'watch', reScale( $monitor['Width'], $scale ), reScale( $monitor['Height'], $scale ) ), $monitor['Name'], $running && ($monitor['Function'] != 'None') && canView( 'Stream' ) ) ?></td>
<td class="colFunction"><?php echo makePopupLink( '?view=function&amp;mid='.$monitor['Id'], 'zmFunction', 'function', '<span class="'.$fclass.'">'.translate('Fn'.$monitor['Function']).( empty($monitor['Enabled']) ? ', disabled' : '' ) .'</span>', canEdit( 'Monitors' ) ) ?></td>
<?php if ( count($servers) > 1 ) { ?>
<?php if ( count($servers) ) { ?>
<td class="colServer"><?php
$Server = new Server( $monitor['ServerId'] );
echo $Server->Name();
@ -336,6 +350,12 @@ echo $Server->Name();
<?php } else { ?>
<td class="colSource">&nbsp;</td>
<?php } ?>
<?php if ( $show_storage_areas ) { ?>
<td class="colStorage"><?php
$Storage = new Storage( $monitor['StorageId'] );
echo $Storage->Name();
?></td>
<?php } ?>
<?php
for ( $i = 0; $i < count($eventCounts); $i++ )
{

View File

@ -30,6 +30,8 @@ foreach ( dbFetchAll( "select * from Filters order by Name" ) as $row )
$filterNames[$row['Name']] = $row['Name'];
if ( $row['Background'] )
$filterNames[$row['Name']] .= "*";
if ( $row['Concurrent'] )
$filterNames[$row['Name']] .= "&";
if ( !empty($_REQUEST['reload']) && isset($_REQUEST['filterName']) && $_REQUEST['filterName'] == $row['Name'] )
$dbFilter = $row;
}

View File

@ -76,6 +76,9 @@ xhtmlHeaders(__FILE__, translate('SaveFilter') );
<p>
<label for="background"><?php echo translate('BackgroundFilter') ?></label><input type="checkbox" id="background" name="background" value="1"<?php if ( !empty($filterData['Background']) ) { ?> checked="checked"<?php } ?>/>
</p>
<p>
<label for="concurrent"><?php echo translate('ConcurrentFilter') ?></label><input type="checkbox" id="concurrent" name="concurrent" value="1"<?php if ( !empty($filterData['Concurrent']) ) { ?> checked="checked"<?php } ?>/>
</p>
<div id="contentButtons">
<input type="submit" value="<?php echo translate('Save') ?>"<?php if ( !canEdit( 'Events' ) ) { ?> disabled="disabled"<?php } ?>/><input type="button" value="<?php echo translate('Cancel') ?>" onclick="closeWindow();"/>
</div>

View File

@ -112,7 +112,7 @@ function previewEvent( eventId, frameId )
function loadEventImage( imagePath, eid, fid, width, height )
{
var imageSrc = $('imageSrc');
imageSrc.setProperty( 'src', imagePrefix+imagePath );
imageSrc.setProperty( 'src', imagePrefix + '&eid='+eid+'&fid='+fid );
imageSrc.removeEvent( 'click' );
imageSrc.addEvent( 'click', showEvent.pass( [ eid, fid, width, height ] ) );
var eventData = $('eventData');

View File

@ -804,7 +804,7 @@ switch ( $tab )
elseif ( $newMonitor['Type'] == "Remote" )
{
?>
<tr><td><?php echo translate('RemoteProtocol') ?></td><td><?php echo buildSelect( "newMonitor[Protocol]", $remoteProtocols, "updateMethods( this )" ); ?></td></tr>
<tr><td><?php echo translate('RemoteProtocol') ?></td><td><?php echo buildSelect( "newMonitor[Protocol]", $remoteProtocols, "updateMethods( this );if(this.value=='RTSP'){\$('RTSPDescribe').show();}else{\$('RTSPDescribe').hide();}" ); ?></td></tr>
<?php
if ( empty($newMonitor['Protocol']) || $newMonitor['Protocol'] == "http" )
{
@ -868,7 +868,7 @@ switch ( $tab )
if ( $newMonitor['Type'] == "Remote" )
{
?>
<tr><td><?php echo translate('RTSPDescribe') ?>&nbsp;(<?php echo makePopupLink( '?view=optionhelp&amp;option=OPTIONS_RTSPDESCRIBE', 'zmOptionHelp', 'optionhelp', '?' ) ?>) </td><td><input type="checkbox" name="newMonitor[RTSPDescribe]" value="1"<?php if ( !empty($newMonitor['RTSPDescribe']) ) { ?> checked="checked"<?php } ?>/></td></tr>
<tr id="RTSPDescribe"<?php if ( $newMonitor['Protocol'] != 'RTSP' ) { echo ' style="display:none;"' } ) ?>><td><?php echo translate('RTSPDescribe') ?>&nbsp;(<?php echo makePopupLink( '?view=optionhelp&amp;option=OPTIONS_RTSPDESCRIBE', 'zmOptionHelp', 'optionhelp', '?' ) ?>) </td><td><input type="checkbox" name="newMonitor[RTSPDescribe]" value="1"<?php if ( !empty($newMonitor['RTSPDescribe']) ) { ?> checked="checked"<?php } ?>/></td></tr>
<?php
}
?>

View File

@ -113,7 +113,7 @@ foreach ( $monitors as $monitor )
if ( !isset( $scale ) )
$scale = reScale( SCALE_BASE, $monitor->DefaultScale(), ZM_WEB_DEFAULT_SCALE );
?>
<div id="monitorFrame<?php echo $monitor->index() ?>" class="monitorFrame">
<div id="monitorFrame<?php echo $monitor->index() ?>" class="monitorFrame" title="<?php echo $monitor->Name() ?>">
<div id="monitor<?php echo $monitor->index() ?>" class="monitor idle">
<div id="imageFeed<?php echo $monitor->index() ?>" class="imageFeed" onclick="createPopup( '?view=watch&amp;mid=<?php echo $monitor->Id() ?>', 'zmWatch<?php echo $monitor->Id() ?>', 'watch', <?php echo $monitor->scaleWidth() ?>, <?php echo $monitor->scaleHeight() ?> );">
<?php

File diff suppressed because it is too large Load Diff

View File

@ -222,6 +222,7 @@ elseif ( $tab == "users" )
<thead>
<tr>
<th class="colName"><?php echo translate('name') ?></th>
<th class="colHostname"><?php echo translate('Hostname') ?></th>
<th class="colMark"><?php echo translate('Mark') ?></th>
</tr>
</thead>
@ -229,6 +230,7 @@ elseif ( $tab == "users" )
<?php foreach( dbFetchAll( 'SELECT * FROM Servers' ) as $row ) { ?>
<tr>
<td class="colName"><?php echo makePopupLink( '?view=server&amp;id='.$row['Id'], 'zmServer', 'server', validHtmlStr($row['Name']), $canEdit ) ?></td>
<td class="colHostname"><?php echo makePopupLink( '?view=server&amp;id='.$row['Id'], 'zmServer', 'server', validHtmlStr($row['Hostname']), $canEdit ) ?></td>
<td class="colMark"><input type="checkbox" name="markIds[]" value="<?php echo $row['Id'] ?>" onclick="configureDeleteButton( this );"<?php if ( !$canEdit ) { ?> disabled="disabled"<?php } ?>/></td>
</tr>
<?php } #end foreach Server ?>

View File

@ -52,11 +52,11 @@ xhtmlHeaders(__FILE__, translate('Server')." - ".$newServer['Name'] );
<table id="contentTable" class="major" cellspacing="0">
<tbody>
<tr>
<th scope="row"><?php echo translate('ServerName') ?></th>
<th scope="row"><?php echo translate('Name') ?></th>
<td><input type="text" name="newServer[Name]" value="<?php echo $newServer['Name'] ?>"/></td>
</tr>
<tr>
<th scope="row"><?php echo translate('ServerHostname') ?></th>
<th scope="row"><?php echo translate('Hostname') ?></th>
<td><input type="text" name="newServer[Hostname]" value="<?php echo $newServer['Hostname'] ?>"/></td>
</tr>
</tbody>

View File

@ -24,6 +24,8 @@ if ( !canView( 'Events' ) )
return;
}
require_once('includes/Event.php');
$eid = validInt($_REQUEST['eid']);
$sql = 'SELECT E.*,M.Name AS MonitorName,M.DefaultRate,M.DefaultScale FROM Events AS E INNER JOIN Monitors AS M ON E.MonitorId = M.Id WHERE E.Id = ?';
@ -45,7 +47,8 @@ if ( isset( $_REQUEST['scale'] ) )
else
$scale = reScale( SCALE_BASE, $event['DefaultScale'], ZM_WEB_DEFAULT_SCALE );
$eventPath = ZM_DIR_EVENTS.'/'.getEventPath( $event );
$Event = new Event( $event['Id'] );
$eventPath = $Event->Path();
$videoFormats = array();
$ffmpegFormats = preg_split( '/\s+/', ZM_FFMPEG_FORMATS );

View File

@ -38,6 +38,9 @@ if ( !canView( 'Events' ) )
return;
}
require_once('includes/Storage.php');
require_once('includes/Event.php');
header( 'Content-type: image/jpeg' );
// Compatibility for PHP 5.4
@ -55,13 +58,23 @@ if (!function_exists('imagescale'))
}
}
$Storage = NULL;
$errorText = false;
if ( empty($_REQUEST['path']) )
{
$errorText = "No image path";
if ( ! empty($_REQUEST['fid']) ) {
if ( ! empty($_REQUEST['eid'] ) ) {
$Event = new Event( $_REQUEST['eid'] );
$Storage = $Event->Storage();
$path = $Event->Relative_Path().'/'.sprintf("%'.0".ZM_EVENT_IMAGE_DIGITS.'d',$_REQUEST['fid']).'-capture.jpg';
}
} else {
$errorText = "No image path";
}
}
else
{
$Storage = new Storage();
$path = $_REQUEST['path'];
if ( !empty($user['MonitorIds']) )
{
@ -111,10 +124,12 @@ if ( $errorText )
Error( $errorText );
else
if( ($scale==0 || $scale==100) && $width==0 && $height==0 )
readfile( ZM_DIR_EVENTS.'/'.$path );
if ( ! readfile( $Storage->Path().'/'.$path ) ) {
Error("No bytes read from ". $Storage->Path() . '/'.$path );
}
else
{
$i = imagecreatefromjpeg ( ZM_DIR_EVENTS.'/'.$path );
$i = imagecreatefromjpeg ( $Storage->Path().'/'.$path );
$oldWidth=imagesx($i);
$oldHeight=imagesy($i);
if($width==0 && $height==0) // scale has to be set to get here with both zero