Merge branch 'master' into storageareas
This commit is contained in:
commit
371b86300a
|
@ -104,6 +104,7 @@ mark_as_advanced(
|
||||||
ZM_PERL_SEARCH_PATH
|
ZM_PERL_SEARCH_PATH
|
||||||
ZM_TARGET_DISTRO
|
ZM_TARGET_DISTRO
|
||||||
ZM_CONFIG_DIR
|
ZM_CONFIG_DIR
|
||||||
|
ZM_CONFIG_SUBDIR
|
||||||
ZM_SYSTEMD)
|
ZM_SYSTEMD)
|
||||||
|
|
||||||
set(ZM_RUNDIR "/var/run/zm" CACHE PATH
|
set(ZM_RUNDIR "/var/run/zm" CACHE PATH
|
||||||
|
@ -137,6 +138,8 @@ set(ZM_WEB_GROUP "" CACHE STRING
|
||||||
# Advanced
|
# Advanced
|
||||||
set(ZM_CONFIG_DIR "/${CMAKE_INSTALL_SYSCONFDIR}" CACHE PATH
|
set(ZM_CONFIG_DIR "/${CMAKE_INSTALL_SYSCONFDIR}" CACHE PATH
|
||||||
"Location of ZoneMinder configuration, default system config directory")
|
"Location of ZoneMinder configuration, default system config directory")
|
||||||
|
set(ZM_CONFIG_SUBDIR "${ZM_CONFIG_DIR}/conf.d" CACHE PATH
|
||||||
|
"Location of ZoneMinder configuration subfolder, default: ZM_CONFIG_DIR/conf.d")
|
||||||
set(ZM_EXTRA_LIBS "" CACHE STRING
|
set(ZM_EXTRA_LIBS "" CACHE STRING
|
||||||
"A list of optional libraries, separated by semicolons, e.g. ssl;theora")
|
"A list of optional libraries, separated by semicolons, e.g. ssl;theora")
|
||||||
set(ZM_MYSQL_ENGINE "InnoDB" CACHE STRING
|
set(ZM_MYSQL_ENGINE "InnoDB" CACHE STRING
|
||||||
|
@ -171,28 +174,13 @@ set(ZM_SYSTEMD "OFF" CACHE BOOL
|
||||||
"Set to ON to force building ZM with systemd support. default: OFF")
|
"Set to ON to force building ZM with systemd support. default: OFF")
|
||||||
|
|
||||||
# Reassign some variables if a target distro has been specified
|
# Reassign some variables if a target distro has been specified
|
||||||
if((ZM_TARGET_DISTRO STREQUAL "fc24") OR (ZM_TARGET_DISTRO STREQUAL "fc25"))
|
if((ZM_TARGET_DISTRO MATCHES "^el") OR (ZM_TARGET_DISTRO MATCHES "^fc"))
|
||||||
set(ZM_RUNDIR "/var/run/zoneminder")
|
|
||||||
set(ZM_SOCKDIR "/var/lib/zoneminder/sock")
|
|
||||||
set(ZM_TMPDIR "/var/lib/zoneminder/temp")
|
|
||||||
set(ZM_LOGDIR "/var/log/zoneminder")
|
|
||||||
set(ZM_CONFIG_DIR "/etc/zm")
|
|
||||||
set(ZM_WEBDIR "/usr/share/zoneminder/www")
|
|
||||||
set(ZM_CGIDIR "/usr/libexec/zoneminder/cgi-bin")
|
|
||||||
elseif(ZM_TARGET_DISTRO STREQUAL "el6")
|
|
||||||
set(ZM_RUNDIR "/var/run/zoneminder")
|
|
||||||
set(ZM_SOCKDIR "/var/lib/zoneminder/sock")
|
|
||||||
set(ZM_TMPDIR "/var/lib/zoneminder/temp")
|
|
||||||
set(ZM_LOGDIR "/var/log/zoneminder")
|
|
||||||
set(ZM_CONFIG_DIR "/etc/zm")
|
|
||||||
set(ZM_WEBDIR "/usr/share/zoneminder/www")
|
|
||||||
set(ZM_CGIDIR "/usr/libexec/zoneminder/cgi-bin")
|
|
||||||
elseif(ZM_TARGET_DISTRO STREQUAL "el7")
|
|
||||||
set(ZM_RUNDIR "/var/run/zoneminder")
|
set(ZM_RUNDIR "/var/run/zoneminder")
|
||||||
set(ZM_SOCKDIR "/var/lib/zoneminder/sock")
|
set(ZM_SOCKDIR "/var/lib/zoneminder/sock")
|
||||||
set(ZM_TMPDIR "/var/lib/zoneminder/temp")
|
set(ZM_TMPDIR "/var/lib/zoneminder/temp")
|
||||||
set(ZM_LOGDIR "/var/log/zoneminder")
|
set(ZM_LOGDIR "/var/log/zoneminder")
|
||||||
set(ZM_CONFIG_DIR "/etc/zm")
|
set(ZM_CONFIG_DIR "/etc/zm")
|
||||||
|
set(ZM_CONFIG_SUBDIR "/etc/zm/conf.d")
|
||||||
set(ZM_WEBDIR "/usr/share/zoneminder/www")
|
set(ZM_WEBDIR "/usr/share/zoneminder/www")
|
||||||
set(ZM_CGIDIR "/usr/libexec/zoneminder/cgi-bin")
|
set(ZM_CGIDIR "/usr/libexec/zoneminder/cgi-bin")
|
||||||
elseif(ZM_TARGET_DISTRO STREQUAL "OS13")
|
elseif(ZM_TARGET_DISTRO STREQUAL "OS13")
|
||||||
|
@ -212,10 +200,11 @@ elseif(ZM_TARGET_DISTRO STREQUAL "FreeBSD")
|
||||||
set(ZM_WEB_USER "www")
|
set(ZM_WEB_USER "www")
|
||||||
set(ZM_WEB_GROUP "www")
|
set(ZM_WEB_GROUP "www")
|
||||||
set(ZM_CONFIG_DIR "/usr/local/etc/zm")
|
set(ZM_CONFIG_DIR "/usr/local/etc/zm")
|
||||||
|
set(ZM_CONFIG_SUBDIR "/usr/local/etc/zm/conf.d")
|
||||||
set(ZM_WEBDIR "/usr/local/share/zoneminder/www")
|
set(ZM_WEBDIR "/usr/local/share/zoneminder/www")
|
||||||
set(ZM_CGIDIR "/usr/local/libexec/zoneminder/cgi-bin")
|
set(ZM_CGIDIR "/usr/local/libexec/zoneminder/cgi-bin")
|
||||||
set(ZM_PERL_MM_PARMS "INSTALLDIRS=site")
|
set(ZM_PERL_MM_PARMS "INSTALLDIRS=site")
|
||||||
endif((ZM_TARGET_DISTRO STREQUAL "fc24") OR (ZM_TARGET_DISTRO STREQUAL "fc25"))
|
endif((ZM_TARGET_DISTRO MATCHES "^el") OR (ZM_TARGET_DISTRO MATCHES "^fc"))
|
||||||
|
|
||||||
# Required for certain checks to work
|
# Required for certain checks to work
|
||||||
set(CMAKE_EXTRA_INCLUDE_FILES
|
set(CMAKE_EXTRA_INCLUDE_FILES
|
||||||
|
@ -791,6 +780,11 @@ else(ZM_PERL_SEARCH_PATH)
|
||||||
set(EXTRA_PERL_LIB "# Include from system perl paths only")
|
set(EXTRA_PERL_LIB "# Include from system perl paths only")
|
||||||
endif(ZM_PERL_SEARCH_PATH)
|
endif(ZM_PERL_SEARCH_PATH)
|
||||||
|
|
||||||
|
# If this is an out-of-source build, copy the files we need to the binary directory
|
||||||
|
if(NOT (CMAKE_BINARY_DIR STREQUAL CMAKE_SOURCE_DIR))
|
||||||
|
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/conf.d" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/conf.d")
|
||||||
|
endif(NOT (CMAKE_BINARY_DIR STREQUAL CMAKE_SOURCE_DIR))
|
||||||
|
|
||||||
# Generate files from the .in files
|
# Generate files from the .in files
|
||||||
configure_file(zm.conf.in "${CMAKE_CURRENT_BINARY_DIR}/zm.conf" @ONLY)
|
configure_file(zm.conf.in "${CMAKE_CURRENT_BINARY_DIR}/zm.conf" @ONLY)
|
||||||
configure_file(zoneminder-config.cmake "${CMAKE_CURRENT_BINARY_DIR}/config.h" @ONLY)
|
configure_file(zoneminder-config.cmake "${CMAKE_CURRENT_BINARY_DIR}/config.h" @ONLY)
|
||||||
|
@ -814,13 +808,11 @@ if(ZM_ONVIF)
|
||||||
endif(ZM_ONVIF)
|
endif(ZM_ONVIF)
|
||||||
|
|
||||||
# Process distro subdirectories
|
# Process distro subdirectories
|
||||||
if((ZM_TARGET_DISTRO STREQUAL "fc24") OR (ZM_TARGET_DISTRO STREQUAL "fc25"))
|
if((ZM_TARGET_DISTRO MATCHES "^el") OR (ZM_TARGET_DISTRO MATCHES "^fc"))
|
||||||
add_subdirectory(distros/redhat)
|
|
||||||
elseif((ZM_TARGET_DISTRO STREQUAL "el6") OR (ZM_TARGET_DISTRO STREQUAL "el7"))
|
|
||||||
add_subdirectory(distros/redhat)
|
add_subdirectory(distros/redhat)
|
||||||
elseif(ZM_TARGET_DISTRO STREQUAL "OS13")
|
elseif(ZM_TARGET_DISTRO STREQUAL "OS13")
|
||||||
add_subdirectory(distros/opensuse)
|
add_subdirectory(distros/opensuse)
|
||||||
endif((ZM_TARGET_DISTRO STREQUAL "fc24") OR (ZM_TARGET_DISTRO STREQUAL "fc25"))
|
endif((ZM_TARGET_DISTRO MATCHES "^el") OR (ZM_TARGET_DISTRO MATCHES "^fc"))
|
||||||
|
|
||||||
# Print optional libraries detection status
|
# Print optional libraries detection status
|
||||||
message(STATUS "Optional libraries found:${optlibsfound}")
|
message(STATUS "Optional libraries found:${optlibsfound}")
|
||||||
|
@ -838,7 +830,8 @@ else(zmconfgen_result EQUAL 0)
|
||||||
endif(zmconfgen_result EQUAL 0)
|
endif(zmconfgen_result EQUAL 0)
|
||||||
|
|
||||||
# Install zm.conf
|
# Install zm.conf
|
||||||
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/zm.conf" DESTINATION "${ZM_CONFIG_DIR}")
|
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/zm.conf" DESTINATION "${ZM_CONFIG_DIR}")
|
||||||
|
install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/conf.d/" DESTINATION "${ZM_CONFIG_SUBDIR}")
|
||||||
#install(CODE "
|
#install(CODE "
|
||||||
#if (NOT EXISTS \"${ZM_CONFIG_DIR}/zm.conf\")
|
#if (NOT EXISTS \"${ZM_CONFIG_DIR}/zm.conf\")
|
||||||
#message(STATUS \"No zm.conf at ${CMAKE_CURRENT_BINARY_DIR}/zm.conf. Will install a new zm.conf\")
|
#message(STATUS \"No zm.conf at ${CMAKE_CURRENT_BINARY_DIR}/zm.conf. Will install a new zm.conf\")
|
||||||
|
|
91
Dockerfile
91
Dockerfile
|
@ -1,24 +1,75 @@
|
||||||
# ZoneMinder
|
# ZoneMinder, you need the GIT repository code and submodules (git submodule update --init --recursive)
|
||||||
|
|
||||||
FROM ubuntu:xenial
|
FROM ubuntu:xenial
|
||||||
MAINTAINER Markos Vakondios <mvakondios@gmail.com>
|
MAINTAINER Markos Vakondios <mvakondios@gmail.com>
|
||||||
|
|
||||||
# Resynchronize the package index files
|
# Resynchronize the package index files
|
||||||
RUN apt-get update && \
|
RUN apt-get update \
|
||||||
DEBIAN_FRONTEND=noninteractive apt-get install -y \
|
&& DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
|
||||||
libpolkit-gobject-1-dev build-essential libmysqlclient-dev libssl-dev libbz2-dev libpcre3-dev \
|
apache2 \
|
||||||
libdbi-perl libarchive-zip-perl libdate-manip-perl libdevice-serialport-perl libmime-perl libpcre3 \
|
build-essential \
|
||||||
libwww-perl libdbd-mysql-perl libsys-mmap-perl yasm cmake libjpeg-turbo8-dev \
|
cmake \
|
||||||
libjpeg-turbo8 libtheora-dev libvorbis-dev libvpx-dev libx264-dev libmp4v2-dev libav-tools mysql-client \
|
dh-autoreconf \
|
||||||
apache2 php php-mysql libapache2-mod-php php-cli \
|
dpatch \
|
||||||
mysql-server libvlc-dev libvlc5 libvlccore-dev libvlccore8 vlc-data libcurl4-openssl-dev \
|
libapache2-mod-php \
|
||||||
libavformat-dev libswscale-dev libavutil-dev libavcodec-dev libavfilter-dev \
|
libarchive-zip-perl \
|
||||||
libavresample-dev libavdevice-dev libpostproc-dev libv4l-dev libtool libnetpbm10-dev \
|
libavcodec-dev \
|
||||||
libmime-lite-perl dh-autoreconf dpatch \
|
libavdevice-dev \
|
||||||
&& apt-get clean
|
libavfilter-dev \
|
||||||
|
libavformat-dev \
|
||||||
|
libavresample-dev \
|
||||||
|
libav-tools \
|
||||||
|
libavutil-dev \
|
||||||
|
libbz2-dev \
|
||||||
|
libcurl4-openssl-dev \
|
||||||
|
libdate-manip-perl \
|
||||||
|
libdbd-mysql-perl \
|
||||||
|
libdbi-perl \
|
||||||
|
libdevice-serialport-perl \
|
||||||
|
libjpeg-turbo8 \
|
||||||
|
libjpeg-turbo8-dev \
|
||||||
|
libmime-lite-perl \
|
||||||
|
libmime-perl \
|
||||||
|
libmp4v2-dev \
|
||||||
|
libmysqlclient-dev \
|
||||||
|
libnetpbm10-dev \
|
||||||
|
libpcre3 \
|
||||||
|
libpcre3-dev \
|
||||||
|
libpolkit-gobject-1-dev \
|
||||||
|
libpostproc-dev \
|
||||||
|
libssl-dev \
|
||||||
|
libswscale-dev \
|
||||||
|
libsys-mmap-perl \
|
||||||
|
libtheora-dev \
|
||||||
|
libtool \
|
||||||
|
libv4l-dev \
|
||||||
|
libvlc5 \
|
||||||
|
libvlccore8 \
|
||||||
|
libvlccore-dev \
|
||||||
|
libvlc-dev \
|
||||||
|
libvorbis-dev \
|
||||||
|
libvpx-dev \
|
||||||
|
libwww-perl \
|
||||||
|
libx264-dev \
|
||||||
|
mysql-client \
|
||||||
|
mysql-server \
|
||||||
|
php \
|
||||||
|
php-cli \
|
||||||
|
php-mysql \
|
||||||
|
vlc-data \
|
||||||
|
yasm \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
# Copy local code into our container
|
# Copy local code into our container
|
||||||
ADD . /ZoneMinder
|
ADD cmake /ZoneMinder/cmake/
|
||||||
|
ADD db /ZoneMinder/db/
|
||||||
|
ADD misc /ZoneMinder/misc/
|
||||||
|
ADD onvif /ZoneMinder/onvif/
|
||||||
|
ADD scripts /ZoneMinder/scripts/
|
||||||
|
ADD src /ZoneMinder/src/
|
||||||
|
ADD umutils /ZoneMinder/umutils/
|
||||||
|
ADD web /ZoneMinder/web/
|
||||||
|
ADD cmakecacheimport.sh CMakeLists.txt version zm.conf.in zmconfgen.pl.in zmlinkcontent.sh.in zoneminder-config.cmake /ZoneMinder/
|
||||||
|
|
||||||
# Change into the ZoneMinder directory
|
# Change into the ZoneMinder directory
|
||||||
WORKDIR /ZoneMinder
|
WORKDIR /ZoneMinder
|
||||||
|
@ -39,18 +90,20 @@ RUN ./zmlinkcontent.sh
|
||||||
# Adding the start script
|
# Adding the start script
|
||||||
ADD utils/docker/start.sh /tmp/start.sh
|
ADD utils/docker/start.sh /tmp/start.sh
|
||||||
|
|
||||||
# give files in /usr/local/share/zoneminder/
|
# Settings rights for /usr/local/share/zoneminder/
|
||||||
RUN chown -R www-data:www-data /usr/local/share/zoneminder/
|
RUN chown -R www-data:www-data /usr/local/share/zoneminder/
|
||||||
|
|
||||||
# Adding apache virtual hosts file
|
# Adding apache virtual hosts file
|
||||||
RUN cp misc/apache.conf /etc/apache2/sites-available/000-default.conf
|
RUN cp misc/apache.conf /etc/apache2/sites-available/000-default.conf
|
||||||
ADD utils/docker/phpdate.ini /etc/php5/apache2/conf.d/25-phpdate.ini
|
|
||||||
|
|
||||||
# Expose http port
|
# Expose http port
|
||||||
EXPOSE 80
|
EXPOSE 80
|
||||||
|
|
||||||
# Initial database and apache setup:
|
VOLUME /var/lib/zoneminder/images /var/lib/zoneminder/events /var/lib/mysql /var/log/zm
|
||||||
RUN "/ZoneMinder/utils/docker/setup.sh"
|
|
||||||
|
|
||||||
CMD ["/ZoneMinder/utils/docker/start.sh"]
|
# To speed up configuration testing, we put it here
|
||||||
|
ADD utils/docker /ZoneMinder/utils/docker/
|
||||||
|
|
||||||
|
CMD /ZoneMinder/utils/docker/setup.sh && /ZoneMinder/utils/docker/start.sh >/var/log/start.log 2>&1 & /bin/bash
|
||||||
|
|
||||||
|
# Run example docker run -it -p 1080:80 -e PHP_TIMEZONE='Europe/Paris' -v /disk/zoneminder/events:/var/lib/zoneminder/events -v /disk/zoneminder/images:/var/lib/zoneminder/images -v /disk/zoneminder/mysql:/var/lib/mysql -v /disk/zoneminder/logs:/var/log/zm --name zoneminder zoneminder/zoneminder
|
||||||
|
|
|
@ -55,7 +55,7 @@ further defined and clarified by project maintainers.
|
||||||
## Enforcement
|
## Enforcement
|
||||||
|
|
||||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||||
reported by contacting the project team at [INSERT EMAIL ADDRESS]. All
|
reported by contacting the project team at abuse@zoneminder.com. All
|
||||||
complaints will be reviewed and investigated and will result in a response that
|
complaints will be reviewed and investigated and will result in a response that
|
||||||
is deemed necessary and appropriate to the circumstances. The project team is
|
is deemed necessary and appropriate to the circumstances. The project team is
|
||||||
obligated to maintain confidentiality with regard to the reporter of an incident.
|
obligated to maintain confidentiality with regard to the reporter of an incident.
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
conf.d/README
|
||||||
|
|
||||||
|
Any changes to ZoneMinder's configuration should be made here in this folder,
|
||||||
|
rather than directly editing the default zm.conf file.
|
||||||
|
|
||||||
|
ZoneMinder will process each file in this folder with a ".conf" extension.
|
||||||
|
Each "Var = Value" pair, in each config file, will be loaded into ZoneMinder's
|
||||||
|
running configuration, overriding any variables with the same name found in the
|
||||||
|
default zm.conf file.
|
||||||
|
|
||||||
|
After creating a custom config file, don't forget to set the proper file and
|
||||||
|
owner permission on it. For example, this is typically what you should do after
|
||||||
|
saving the config file to disk:
|
||||||
|
|
||||||
|
sudo chown root:apache *.conf
|
||||||
|
sudo chmod 640 *.conf
|
||||||
|
|
||||||
|
Substitute "apache" with the name of the web server user account on your system.
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
# Do NOT set ZM_SERVER_HOST if you are not using Multi-Server
|
||||||
|
# You have been warned
|
||||||
|
#
|
||||||
|
# The name specified here must have a corresponding entry
|
||||||
|
# in the Servers tab under Options
|
||||||
|
ZM_SERVER_HOST=
|
||||||
|
|
|
@ -22,7 +22,8 @@ override_dh_auto_configure:
|
||||||
-DZM_CGIDIR=/usr/lib/zoneminder/cgi-bin \
|
-DZM_CGIDIR=/usr/lib/zoneminder/cgi-bin \
|
||||||
-DZM_WEB_USER=www-data \
|
-DZM_WEB_USER=www-data \
|
||||||
-DZM_WEB_GROUP=www-data \
|
-DZM_WEB_GROUP=www-data \
|
||||||
-DCMAKE_INSTALL_SYSCONFDIR=etc/zm
|
-DZM_CONFIG_SUBDIR="/etc/zm/conf.d" \
|
||||||
|
-DZM_CONFIG_DIR="/etc/zm"
|
||||||
|
|
||||||
override_dh_auto_install:
|
override_dh_auto_install:
|
||||||
dh_auto_install --buildsystem=cmake
|
dh_auto_install --buildsystem=cmake
|
||||||
|
|
|
@ -1,7 +1,16 @@
|
||||||
What's New
|
What's New
|
||||||
==========
|
==========
|
||||||
|
|
||||||
1. The Apache ScriptAlias has been changed from "/cgi-bin/zm/zms" to
|
1. ZoneMinder now uses a conf.d subfolder to process custom changes to
|
||||||
|
variables found in zm.conf. Changes to zm.conf will be overwritten
|
||||||
|
during an upgrade. Instead, create a file with a ".conf" extension under
|
||||||
|
the conf.d folder and make your changes there.
|
||||||
|
|
||||||
|
2. ZoneMinder now supports recording directly to video container! This feature
|
||||||
|
is new and should be treated as experimental. Refer to the documentation
|
||||||
|
regarding how to use this feature.
|
||||||
|
|
||||||
|
3. The Apache ScriptAlias has been changed from "/cgi-bin/zm/zms" to
|
||||||
"/cgi-bin-zm/zms". This has been to done to avoid this bug:
|
"/cgi-bin-zm/zms". This has been to done to avoid this bug:
|
||||||
https://bugzilla.redhat.com/show_bug.cgi?id=973067
|
https://bugzilla.redhat.com/show_bug.cgi?id=973067
|
||||||
|
|
||||||
|
@ -9,16 +18,10 @@ What's New
|
||||||
and verify it is set to "/cgi-bin-zm/nph-zms". Failure to do so will result
|
and verify it is set to "/cgi-bin-zm/nph-zms". Failure to do so will result
|
||||||
in a broken system. You have been warned.
|
in a broken system. You have been warned.
|
||||||
|
|
||||||
2. Due to the active state of the ZoneMinder project, we now recommend granting
|
4. This package uses the HTTPS protocol by default to access the web portal.
|
||||||
ALL permission to the ZoneMinder mysql account. This change must be done
|
|
||||||
manually before ZoneMinder will run. See the installation steps below.
|
|
||||||
|
|
||||||
3. This package uses the HTTPS protocol by default to access the web portal.
|
|
||||||
Requests using HTTP will auto-redirect to HTTPS. See README.https for
|
Requests using HTTP will auto-redirect to HTTPS. See README.https for
|
||||||
more information.
|
more information.
|
||||||
|
|
||||||
4. This package ships with the new ZoneMinder API enabled.
|
|
||||||
|
|
||||||
New installs
|
New installs
|
||||||
============
|
============
|
||||||
|
|
||||||
|
@ -43,13 +46,17 @@ New installs
|
||||||
anything that suits your environment.
|
anything that suits your environment.
|
||||||
|
|
||||||
3. If you have chosen to change the zoneminder database account credentials to
|
3. If you have chosen to change the zoneminder database account credentials to
|
||||||
something other than zmuser/zmpass, you must now edit /etc/zm/zm.conf.
|
something other than zmuser/zmpass, you must now create a config file under
|
||||||
Change ZM_DB_USER and ZM_DB_PASS to the values you created in the previous
|
/etc/zm/conf.d and set your credentials there. For example, create the file
|
||||||
step.
|
/etc/zm/conf.d/zm-db-user.conf and add the following content to it:
|
||||||
|
|
||||||
|
ZM_DB_USER = {username of the sql account you want to use}
|
||||||
|
ZM_DB_PASS = {password of the sql account you want to use}
|
||||||
|
|
||||||
This version of zoneminder no longer requires you to make a similar change
|
Once the file has been saved, set proper file & ownership permissions on it:
|
||||||
to the credentials in /usr/share/zoneminder/www/api/app/Config/database.php
|
|
||||||
This now happens dynamically. Do *not* make any changes to this file.
|
sudo chown root:apache *.conf
|
||||||
|
sudo chmod 640 *.conf
|
||||||
|
|
||||||
4. Edit /etc/php.ini, uncomment the date.timezone line, and add your local
|
4. Edit /etc/php.ini, uncomment the date.timezone line, and add your local
|
||||||
timezone. PHP will complain loudly if this is not set, or if it is set
|
timezone. PHP will complain loudly if this is not set, or if it is set
|
||||||
|
@ -107,21 +114,11 @@ New installs
|
||||||
Upgrades
|
Upgrades
|
||||||
========
|
========
|
||||||
|
|
||||||
1. Verify /etc/zm/zm.conf.
|
1. Conf.d folder support has been added to ZoneMinder 1.31.0. Any custom
|
||||||
|
changes previously made to zm.conf must now be made in one or more custom
|
||||||
If zm.conf was manually edited before running the upgrade, the installation
|
config files, created under the conf.d folder. Do this now. See
|
||||||
may not overwrite it. In this case, it will create the file
|
/etc/zm/conf.d/README for details. Once you recreate any custom config changes
|
||||||
/etc/zm/zm.conf.rpmnew.
|
under the conf.d folder, they will remain in place indefinitely.
|
||||||
|
|
||||||
For example, this will happen if you are using database account credentials
|
|
||||||
other than zmuser/zmpass.
|
|
||||||
|
|
||||||
Compare /etc/zm/zm.conf to /etc/zm/zm.conf.rpmnew. Verify that zm.conf
|
|
||||||
contains any new config settings that may be in zm.conf.rpmnew.
|
|
||||||
|
|
||||||
This version of zoneminder no longer requires you to make a similar change
|
|
||||||
to the credentials in /usr/share/zoneminder/www/api/app/Config/database.php
|
|
||||||
This now happens dynamically. Do *not* make any changes to this file.
|
|
||||||
|
|
||||||
2. Verify permissions of the zmuser account.
|
2. Verify permissions of the zmuser account.
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,16 @@ What's New
|
||||||
replacing core packages, such as php, will not be supported by us. You are
|
replacing core packages, such as php, will not be supported by us. You are
|
||||||
on your own should you choose to go down that path.
|
on your own should you choose to go down that path.
|
||||||
|
|
||||||
2. The Apache ScriptAlias has been changed from "/cgi-bin/zm/zms" to
|
2. ZoneMinder now uses a conf.d subfolder to process custom changes to
|
||||||
|
variables found in zm.conf. Changes to zm.conf will be overwritten
|
||||||
|
during an upgrade. Instead, create a file with a ".conf" extension under
|
||||||
|
th2 conf.d folder and make your changes there.
|
||||||
|
|
||||||
|
3. ZoneMinder now supports recording directly to video container! This feature
|
||||||
|
is new and should be treated as experimental. Refer to the documentation
|
||||||
|
regarding how to use this feature.
|
||||||
|
|
||||||
|
4. The Apache ScriptAlias has been changed from "/cgi-bin/zm/zms" to
|
||||||
"/cgi-bin-zm/zms". This has been to done match the configuration of
|
"/cgi-bin-zm/zms". This has been to done match the configuration of
|
||||||
CentOS7/Fedora and simplify the build process.
|
CentOS7/Fedora and simplify the build process.
|
||||||
|
|
||||||
|
@ -19,14 +28,6 @@ What's New
|
||||||
Make sure it is set to "/cgi-bin-zm/nph-zms". Failure to do so will result
|
Make sure it is set to "/cgi-bin-zm/nph-zms". Failure to do so will result
|
||||||
in a broken system. You have been warned.
|
in a broken system. You have been warned.
|
||||||
|
|
||||||
3. The ZoneMinder configuration file, zm.conf, has been moved to /etc/zm/.
|
|
||||||
This has been to done match the configuration of CentOS7/Fedora and
|
|
||||||
simplify the build process.
|
|
||||||
|
|
||||||
4. Due to the active state of the ZoneMinder project, we now recommend granting
|
|
||||||
ALL permission to the ZoneMinder mysql account. This change must be done
|
|
||||||
manually before ZoneMinder will run. See the installation steps below.
|
|
||||||
|
|
||||||
5. This package uses the HTTPS protocol by default to access the web portal.
|
5. This package uses the HTTPS protocol by default to access the web portal.
|
||||||
Requests using HTTP will auto-redirect to HTTPS. See README.https for
|
Requests using HTTP will auto-redirect to HTTPS. See README.https for
|
||||||
more information.
|
more information.
|
||||||
|
@ -59,9 +60,18 @@ New installs
|
||||||
The database account credentials, zmuser/zmpass, are arbitrary. Set them to
|
The database account credentials, zmuser/zmpass, are arbitrary. Set them to
|
||||||
anything that suits your environment.
|
anything that suits your environment.
|
||||||
|
|
||||||
3. If you have chosen to change the zoneminder mysql credentials to something
|
3. If you have chosen to change the zoneminder database account credentials to
|
||||||
other than zmuser/zmpass then you must now edit /etc/zm/zm.conf. Change
|
something other than zmuser/zmpass, you must now create a config file under
|
||||||
ZM_DB_USER and ZM_DB_PASS to the values you created in the previous step.
|
/etc/zm/conf.d and set your credentials there. For example, create the file
|
||||||
|
/etc/zm/conf.d/zm-db-user.conf and add the following content to it:
|
||||||
|
|
||||||
|
ZM_DB_USER = {username of the sql account you want to use}
|
||||||
|
ZM_DB_PASS = {password of the sql account you want to use}
|
||||||
|
|
||||||
|
Once the file has been saved, set proper file & ownership permissions on it:
|
||||||
|
|
||||||
|
sudo chown root:apache *.conf
|
||||||
|
sudo chmod 640 *.conf
|
||||||
|
|
||||||
4. Edit /etc/php.ini, uncomment the date.timezone line, and add your local
|
4. Edit /etc/php.ini, uncomment the date.timezone line, and add your local
|
||||||
timezone. PHP will complain loudly if this is not set, or if it is set
|
timezone. PHP will complain loudly if this is not set, or if it is set
|
||||||
|
@ -110,17 +120,11 @@ New installs
|
||||||
Upgrades
|
Upgrades
|
||||||
========
|
========
|
||||||
|
|
||||||
1. Verify /etc/zm/zm.conf.
|
1. Conf.d folder support has been added to ZoneMinder 1.31.0. Any custom
|
||||||
|
changes previously made to zm.conf must now be made in one or more custom
|
||||||
If zm.conf was manually edited before running the upgrade, the installation
|
config files, created under the conf.d folder. Do this now. See
|
||||||
may not overwrite it. In this case, it will create the file
|
/etc/zm/conf.d/README for details. Once you recreate any custom config changes
|
||||||
/etc/zm/zm.conf.rpmnew.
|
under the conf.d folder, they will remain in place indefinitely.
|
||||||
|
|
||||||
For example, this will happen if you are using database account credentials
|
|
||||||
other than zmuser/zmpass.
|
|
||||||
|
|
||||||
Compare /etc/zm/zm.conf to /etc/zm/zm.conf.rpmnew. Verify that zm.conf
|
|
||||||
contains any new config settings that may be in zm.conf.rpmnew.
|
|
||||||
|
|
||||||
2. Verify permissions of the zmuser account.
|
2. Verify permissions of the zmuser account.
|
||||||
|
|
||||||
|
|
|
@ -1,23 +1,26 @@
|
||||||
What's New
|
What's New
|
||||||
==========
|
==========
|
||||||
|
|
||||||
1. The Apache ScriptAlias has been changed from "/cgi-bin/zm/zms" to
|
1. ZoneMinder now uses a conf.d subfolder to process custom changes to
|
||||||
|
variables found in zm.conf. Changes to zm.conf will be overwritten
|
||||||
|
during an upgrade. Instead, create a file with a ".conf" extension under
|
||||||
|
the conf.d folder and make your changes there.
|
||||||
|
|
||||||
|
2. ZoneMinder now supports recording directly to video container! This feature
|
||||||
|
is new and should be treated as experimental. Refer to the documentation
|
||||||
|
regarding how to use this feature.
|
||||||
|
|
||||||
|
3. The Apache ScriptAlias has been changed from "/cgi-bin/zm/zms" to
|
||||||
"/cgi-bin-zm/zms". This has been to done to avoid this bug:
|
"/cgi-bin-zm/zms". This has been to done to avoid this bug:
|
||||||
https://bugzilla.redhat.com/show_bug.cgi?id=973067
|
https://bugzilla.redhat.com/show_bug.cgi?id=973067
|
||||||
|
|
||||||
IMPORTANT: You must manually verify the value of PATH_ZMS under Options.
|
IMPORTANT: You must manually inspect the value for PATH_ZMS under Options
|
||||||
Make sure it is set to "/cgi-bin-zm/nph-zms". Failure to do so will result
|
and verify it is set to "/cgi-bin-zm/nph-zms". Failure to do so will result
|
||||||
in a broken system. You have been warned.
|
in a broken system. You have been warned.
|
||||||
|
|
||||||
2. Due to the active state of the ZoneMinder project, we now recommend granting
|
4. This package uses the HTTPS protocol by default to access the web portal.
|
||||||
ALL permission to the ZoneMinder mysql account. This change must be done
|
|
||||||
manually before ZoneMinder will run. See the installation steps below.
|
|
||||||
|
|
||||||
3. This package uses the HTTPS protocol by default to access the web portal.
|
|
||||||
Requests using HTTP will auto-redirect to HTTPS. See README.https for
|
Requests using HTTP will auto-redirect to HTTPS. See README.https for
|
||||||
more information.
|
more information.
|
||||||
|
|
||||||
4. This package ships with the new ZoneMinder API enabled.
|
|
||||||
|
|
||||||
New installs
|
New installs
|
||||||
============
|
============
|
||||||
|
@ -43,13 +46,17 @@ New installs
|
||||||
anything that suits your environment.
|
anything that suits your environment.
|
||||||
|
|
||||||
3. If you have chosen to change the zoneminder database account credentials to
|
3. If you have chosen to change the zoneminder database account credentials to
|
||||||
something other than zmuser/zmpass, you must now edit /etc/zm/zm.conf.
|
something other than zmuser/zmpass, you must now create a config file under
|
||||||
Change ZM_DB_USER and ZM_DB_PASS to the values you created in the previous
|
/etc/zm/conf.d and set your credentials there. For example, create the file
|
||||||
step.
|
/etc/zm/conf.d/zm-db-user.conf and add the following content to it:
|
||||||
|
|
||||||
|
ZM_DB_USER = {username of the sql account you want to use}
|
||||||
|
ZM_DB_PASS = {password of the sql account you want to use}
|
||||||
|
|
||||||
This version of zoneminder no longer requires you to make a similar change
|
Once the file has been saved, set proper file & ownership permissions on it:
|
||||||
to the credentials in /usr/share/zoneminder/www/api/app/Config/database.php
|
|
||||||
This now happens dynamically. Do *not* make any changes to this file.
|
sudo chown root:apache *.conf
|
||||||
|
sudo chmod 640 *.conf
|
||||||
|
|
||||||
4. Edit /etc/php.ini, uncomment the date.timezone line, and add your local
|
4. Edit /etc/php.ini, uncomment the date.timezone line, and add your local
|
||||||
timezone. PHP will complain loudly if this is not set, or if it is set
|
timezone. PHP will complain loudly if this is not set, or if it is set
|
||||||
|
@ -98,21 +105,11 @@ New installs
|
||||||
Upgrades
|
Upgrades
|
||||||
========
|
========
|
||||||
|
|
||||||
1. Verify /etc/zm/zm.conf.
|
1. Conf.d folder support has been added to ZoneMinder 1.31.0. Any custom
|
||||||
|
changes previously made to zm.conf must now be made in one or more custom
|
||||||
If zm.conf was manually edited before running the upgrade, the installation
|
config files, created under the conf.d folder. Do this now. See
|
||||||
may not overwrite it. In this case, it will create the file
|
/etc/zm/conf.d/README for details. Once you recreate any custom config changes
|
||||||
/etc/zm/zm.conf.rpmnew.
|
under the conf.d folder, they will remain in place indefinitely.
|
||||||
|
|
||||||
For example, this will happen if you are using database account credentials
|
|
||||||
other than zmuser/zmpass.
|
|
||||||
|
|
||||||
Compare /etc/zm/zm.conf to /etc/zm/zm.conf.rpmnew. Verify that zm.conf
|
|
||||||
contains any new config settings that may be in zm.conf.rpmnew.
|
|
||||||
|
|
||||||
This version of zoneminder no longer requires you to make a similar change
|
|
||||||
to the credentials in /usr/share/zoneminder/www/api/app/Config/database.php
|
|
||||||
This now happens dynamically. Do *not* make any changes to this file.
|
|
||||||
|
|
||||||
2. Verify permissions of the zmuser account.
|
2. Verify permissions of the zmuser account.
|
||||||
|
|
||||||
|
|
|
@ -280,7 +280,13 @@ rm -rf %{_docdir}/%{name}-%{version}
|
||||||
%files
|
%files
|
||||||
%license COPYING
|
%license COPYING
|
||||||
%doc AUTHORS README.md distros/redhat/readme/README.%{readme_suffix} distros/redhat/readme/README.https distros/redhat/jscalendar-doc
|
%doc AUTHORS README.md distros/redhat/readme/README.%{readme_suffix} distros/redhat/readme/README.https distros/redhat/jscalendar-doc
|
||||||
%config(noreplace) %attr(640,root,%{zmgid_final}) %{_sysconfdir}/zm/zm.conf
|
%dir %{_sysconfdir}/zm
|
||||||
|
%dir %{_sysconfdir}/zm/conf.d
|
||||||
|
%{_sysconfdir}/zm/conf.d/README
|
||||||
|
# Always overwrite zm.conf now that ZoneMinder supports conf.d folder
|
||||||
|
%attr(640,root,%{zmgid_final}) %{_sysconfdir}/zm/zm.conf
|
||||||
|
%config(noreplace) %attr(640,root,%{zmgid_final}) %{_sysconfdir}/zm/conf.d/*.conf
|
||||||
|
|
||||||
%config(noreplace) %attr(644,root,root) %{wwwconfdir}/zoneminder.conf
|
%config(noreplace) %attr(644,root,root) %{wwwconfdir}/zoneminder.conf
|
||||||
%config(noreplace) %{_sysconfdir}/logrotate.d/zoneminder
|
%config(noreplace) %{_sysconfdir}/logrotate.d/zoneminder
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,7 @@ override_dh_auto_configure:
|
||||||
-DCMAKE_VERBOSE_MAKEFILE=ON \
|
-DCMAKE_VERBOSE_MAKEFILE=ON \
|
||||||
-DCMAKE_BUILD_TYPE=Release \
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
-DZM_CONFIG_DIR="/etc/zm" \
|
-DZM_CONFIG_DIR="/etc/zm" \
|
||||||
|
-DZM_CONFIG_SUBDIR="/etc/zm/conf.d" \
|
||||||
-DZM_RUNDIR="/var/run/zm" \
|
-DZM_RUNDIR="/var/run/zm" \
|
||||||
-DZM_SOCKDIR="/var/run/zm" \
|
-DZM_SOCKDIR="/var/run/zm" \
|
||||||
-DZM_TMPDIR="/tmp/zm" \
|
-DZM_TMPDIR="/tmp/zm" \
|
||||||
|
|
|
@ -62,7 +62,9 @@ override_dh_auto_configure:
|
||||||
-DZM_CGIDIR=/usr/lib/cgi-bin \
|
-DZM_CGIDIR=/usr/lib/cgi-bin \
|
||||||
-DZM_WEB_USER=www-data \
|
-DZM_WEB_USER=www-data \
|
||||||
-DZM_WEB_GROUP=www-data \
|
-DZM_WEB_GROUP=www-data \
|
||||||
-DCMAKE_INSTALL_SYSCONFDIR=etc/zm
|
-DZM_CONFIG_SUBDIR="/etc/zm/conf.d" \
|
||||||
|
-DZM_CONFIG_DIR="/etc/zm"
|
||||||
|
|
||||||
|
|
||||||
override_dh_auto_test:
|
override_dh_auto_test:
|
||||||
# do not run tests...
|
# do not run tests...
|
||||||
|
|
|
@ -20,6 +20,7 @@ override_dh_auto_configure:
|
||||||
-DCMAKE_VERBOSE_MAKEFILE=ON \
|
-DCMAKE_VERBOSE_MAKEFILE=ON \
|
||||||
-DCMAKE_BUILD_TYPE=Release \
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
-DZM_CONFIG_DIR="/etc/zm" \
|
-DZM_CONFIG_DIR="/etc/zm" \
|
||||||
|
-DZM_CONFIG_SUBDIR="/etc/zm/conf.d" \
|
||||||
-DZM_RUNDIR="/var/run/zm" \
|
-DZM_RUNDIR="/var/run/zm" \
|
||||||
-DZM_SOCKDIR="/var/run/zm" \
|
-DZM_SOCKDIR="/var/run/zm" \
|
||||||
-DZM_TMPDIR="/tmp/zm" \
|
-DZM_TMPDIR="/tmp/zm" \
|
||||||
|
|
|
@ -65,26 +65,28 @@ our $VERSION = $ZoneMinder::Base::VERSION;
|
||||||
|
|
||||||
use constant ZM_PID => "@ZM_PID@"; # Path to the ZoneMinder run pid file
|
use constant ZM_PID => "@ZM_PID@"; # Path to the ZoneMinder run pid file
|
||||||
use constant ZM_CONFIG => "@ZM_CONFIG@"; # Path to the ZoneMinder config file
|
use constant ZM_CONFIG => "@ZM_CONFIG@"; # Path to the ZoneMinder config file
|
||||||
|
use constant ZM_CONFIG_SUBDIR => "@ZM_CONFIG_SUBDIR@"; # Path to the ZoneMinder config subfolder
|
||||||
|
|
||||||
use Carp;
|
use Carp;
|
||||||
|
|
||||||
# Load the config from the database into the symbol table
|
# Load the config from the database into the symbol table
|
||||||
BEGIN {
|
BEGIN {
|
||||||
|
|
||||||
|
# Process name, value pairs from the main config file first
|
||||||
my $config_file = ZM_CONFIG;
|
my $config_file = ZM_CONFIG;
|
||||||
open( my $CONFIG, "<", $config_file )
|
process_configfile($config_file);
|
||||||
or croak( "Can't open config file '$config_file': $!" );
|
|
||||||
foreach my $str ( <$CONFIG> ) {
|
# Search for user created config files. If one or more are found then
|
||||||
next if ( $str =~ /^\s*$/ );
|
# update the Config hash with those values
|
||||||
next if ( $str =~ /^\s*#/ );
|
if ( -d ZM_CONFIG_SUBDIR ) {
|
||||||
my ( $name, $value ) = $str =~ /^\s*([^=\s]+)\s*=\s*(.*?)\s*$/;
|
if ( -R ZM_CONFIG_SUBDIR ) {
|
||||||
if ( ! $name ) {
|
foreach my $filename ( glob ZM_CONFIG_SUBDIR."/*.conf" ) {
|
||||||
print( STDERR "Warning, bad line in $config_file: $str\n" );
|
process_configfile($filename);
|
||||||
next;
|
}
|
||||||
} # end if
|
} else {
|
||||||
$name =~ tr/a-z/A-Z/;
|
print( STDERR "WARNING: ZoneMinder configuration subfolder found but is not readable. Check folder permissions on ".ZM_CONFIG_SUBDIR.".\n" );
|
||||||
$Config{$name} = $value;
|
}
|
||||||
}
|
}
|
||||||
close( $CONFIG );
|
|
||||||
|
|
||||||
use DBI;
|
use DBI;
|
||||||
my $socket;
|
my $socket;
|
||||||
|
@ -126,6 +128,31 @@ BEGIN {
|
||||||
}
|
}
|
||||||
$sth->finish();
|
$sth->finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# This subroutine must be inside the BEGIN block
|
||||||
|
sub process_configfile {
|
||||||
|
my $config_file = shift;
|
||||||
|
|
||||||
|
if ( -R $config_file ) {
|
||||||
|
open( my $CONFIG, "<", $config_file )
|
||||||
|
or croak( "Can't open config file '$config_file': $!" );
|
||||||
|
foreach my $str ( <$CONFIG> ) {
|
||||||
|
next if ( $str =~ /^\s*$/ );
|
||||||
|
next if ( $str =~ /^\s*#/ );
|
||||||
|
my ( $name, $value ) = $str =~ /^\s*([^=\s]+)\s*=\s*(.*?)\s*$/;
|
||||||
|
if ( ! $name ) {
|
||||||
|
print( STDERR "Warning, bad line in $config_file: $str\n" );
|
||||||
|
next;
|
||||||
|
} # end if
|
||||||
|
$name =~ tr/a-z/A-Z/;
|
||||||
|
$Config{$name} = $value;
|
||||||
|
}
|
||||||
|
close( $CONFIG );
|
||||||
|
} else {
|
||||||
|
print( STDERR "WARNING: ZoneMinder configuration file found but is not readable. Check file permissions on $config_file\n" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} # end BEGIN
|
} # end BEGIN
|
||||||
|
|
||||||
sub loadConfigFromDB {
|
sub loadConfigFromDB {
|
||||||
|
|
|
@ -55,6 +55,7 @@ a sql file, which can then be easily imported to another zoneminder system.
|
||||||
--help - Print usage information.
|
--help - Print usage information.
|
||||||
--user=<dbuser> - Alternate dB user with privileges to alter dB.
|
--user=<dbuser> - Alternate dB user with privileges to alter dB.
|
||||||
--pass=<dbpass> - Password of alternate dB user with privileges to alter dB.
|
--pass=<dbpass> - Password of alternate dB user with privileges to alter dB.
|
||||||
|
--version - Print version.
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
use strict;
|
use strict;
|
||||||
|
@ -105,43 +106,43 @@ $Config{ZM_DB_USER} = $dbUser;
|
||||||
$Config{ZM_DB_PASS} = $dbPass;
|
$Config{ZM_DB_PASS} = $dbPass;
|
||||||
|
|
||||||
if ( $version ) {
|
if ( $version ) {
|
||||||
print( ZoneMinder::Base::ZM_VERSION . "\n");
|
print( ZoneMinder::Base::ZM_VERSION . "\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
# Check to make sure commandline params make sense
|
# Check to make sure commandline params make sense
|
||||||
if ( ((!$help) && ($import + $export + $topreset) != 1 )) {
|
if ( ((!$help) && ($import + $export + $topreset) != 1 )) {
|
||||||
print( STDERR qq/Please give only one of the following: "import", "export", or "topreset".\n/ );
|
print( STDERR qq/Please give only one of the following: "import", "export", or "topreset".\n/ );
|
||||||
pod2usage(-exitstatus => -1);
|
pod2usage(-exitstatus => -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ($export)&&($overwrite) ) {
|
if ( ($export)&&($overwrite) ) {
|
||||||
print( "Warning: Overwrite parameter ignored during an export.\n");
|
print( "Warning: Overwrite parameter ignored during an export.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ($noregex)&&(!$topreset) ) {
|
if ( ($noregex)&&(!$topreset) ) {
|
||||||
print( qq/Warning: Noregex parameter only applies when "topreset" parameter is also set. Ignoring.\n/);
|
print( qq/Warning: Noregex parameter only applies when "topreset" parameter is also set. Ignoring.\n/);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ($topreset)&&($ARGV[0] !~ /\d\d*/) ) {
|
if ( ($topreset)&&($ARGV[0] !~ /\d\d*/) ) {
|
||||||
print( STDERR qq/Parameter "topreset" requires a valid monitor ID.\n/ );
|
print( STDERR qq/Parameter "topreset" requires a valid monitor ID.\n/ );
|
||||||
pod2usage(-exitstatus => -1);
|
pod2usage(-exitstatus => -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
# Call the appropriate subroutine based on the params given on the commandline
|
# Call the appropriate subroutine based on the params given on the commandline
|
||||||
if ($help) {
|
if ($help) {
|
||||||
pod2usage(-exitstatus => -1);
|
pod2usage(-exitstatus => -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($export) {
|
if ($export) {
|
||||||
exportsql();
|
exportsql();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($import) {
|
if ($import) {
|
||||||
importsql();
|
importsql();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($topreset) {
|
if ($topreset) {
|
||||||
toPreset();
|
toPreset();
|
||||||
}
|
}
|
||||||
|
|
||||||
###############
|
###############
|
||||||
|
@ -149,299 +150,293 @@ if ($topreset) {
|
||||||
###############
|
###############
|
||||||
|
|
||||||
# Execute a pre-built sql select query
|
# Execute a pre-built sql select query
|
||||||
sub selectQuery
|
sub selectQuery {
|
||||||
{
|
my $dbh = shift;
|
||||||
my $dbh = shift;
|
my $sql = shift;
|
||||||
my $sql = shift;
|
my $monitorid = shift;
|
||||||
my $monitorid = shift;
|
|
||||||
|
|
||||||
my $sth = $dbh->prepare_cached( $sql )
|
my $sth = $dbh->prepare_cached( $sql )
|
||||||
or die( "Can't prepare '$sql': ".$dbh->errstr() );
|
or die( "Can't prepare '$sql': ".$dbh->errstr() );
|
||||||
my $res = $sth->execute($monitorid)
|
my $res = $sth->execute($monitorid)
|
||||||
or die( "Can't execute: ".$sth->errstr() );
|
or die( "Can't execute: ".$sth->errstr() );
|
||||||
|
|
||||||
my @data = $sth->fetchrow_array();
|
my @data = $sth->fetchrow_array();
|
||||||
$sth->finish();
|
$sth->finish();
|
||||||
|
|
||||||
return @data;
|
return @data;
|
||||||
}
|
}
|
||||||
|
|
||||||
# Exectute a pre-built sql query
|
# Exectute a pre-built sql query
|
||||||
sub runQuery
|
sub runQuery {
|
||||||
{
|
my $dbh = shift;
|
||||||
my $dbh = shift;
|
my $sql = shift;
|
||||||
my $sql = shift;
|
my $sth = $dbh->prepare_cached( $sql )
|
||||||
my $sth = $dbh->prepare_cached( $sql )
|
or die( "Can't prepare '$sql': ".$dbh->errstr() );
|
||||||
or die( "Can't prepare '$sql': ".$dbh->errstr() );
|
my $res = $sth->execute()
|
||||||
my $res = $sth->execute()
|
or die( "Can't execute: ".$sth->errstr() );
|
||||||
or die( "Can't execute: ".$sth->errstr() );
|
$sth->finish();
|
||||||
$sth->finish();
|
|
||||||
|
|
||||||
return $res;
|
return $res;
|
||||||
}
|
}
|
||||||
|
|
||||||
# Build and execute a sql insert query
|
# Build and execute a sql insert query
|
||||||
sub insertQuery
|
sub insertQuery {
|
||||||
{
|
my $dbh = shift;
|
||||||
my $dbh = shift;
|
my $tablename = shift;
|
||||||
my $tablename = shift;
|
my @data = @_;
|
||||||
my @data = @_;
|
|
||||||
|
|
||||||
my $sql = "INSERT INTO $tablename VALUES (NULL,"
|
my $sql = "INSERT INTO $tablename VALUES (NULL,"
|
||||||
.(join ", ", ("?") x @data).")"; # Add "?" for each array element
|
.(join ', ', ('?') x @data).')'; # Add "?" for each array element
|
||||||
|
|
||||||
my $sth = $dbh->prepare_cached( $sql )
|
my $sth = $dbh->prepare_cached( $sql )
|
||||||
or die( "Can't prepare '$sql': ".$dbh->errstr() );
|
or die( "Can't prepare '$sql': ".$dbh->errstr() );
|
||||||
my $res = $sth->execute(@data)
|
my $res = $sth->execute(@data)
|
||||||
or die( "Can't execute: ".$sth->errstr() );
|
or die( "Can't execute: ".$sth->errstr() );
|
||||||
$sth->finish();
|
$sth->finish();
|
||||||
|
|
||||||
return $res;
|
return $res;
|
||||||
}
|
}
|
||||||
|
|
||||||
# Build and execute a sql delete query
|
# Build and execute a sql delete query
|
||||||
sub deleteQuery
|
sub deleteQuery {
|
||||||
{
|
my $dbh = shift;
|
||||||
my $dbh = shift;
|
my $sqltable = shift;
|
||||||
my $sqltable = shift;
|
my $sqlname = shift;
|
||||||
my $sqlname = shift;
|
|
||||||
|
|
||||||
my $sql = "DELETE FROM $sqltable WHERE Name = ?";
|
my $sql = "DELETE FROM $sqltable WHERE Name = ?";
|
||||||
my $sth = $dbh->prepare_cached( $sql )
|
my $sth = $dbh->prepare_cached( $sql )
|
||||||
or die( "Can't prepare '$sql': ".$dbh->errstr() );
|
or die( "Can't prepare '$sql': ".$dbh->errstr() );
|
||||||
my $res = $sth->execute($sqlname)
|
my $res = $sth->execute($sqlname)
|
||||||
or die( "Can't execute: ".$sth->errstr() );
|
or die( "Can't execute: ".$sth->errstr() );
|
||||||
$sth->finish();
|
$sth->finish();
|
||||||
|
|
||||||
return $res;
|
return $res;
|
||||||
}
|
}
|
||||||
|
|
||||||
# Build and execute a sql select count query
|
# Build and execute a sql select count query
|
||||||
sub checkExists
|
sub checkExists {
|
||||||
{
|
my $dbh = shift;
|
||||||
my $dbh = shift;
|
my $sqltable = shift;
|
||||||
my $sqltable = shift;
|
my $sqlname = shift;
|
||||||
my $sqlname = shift;
|
my $result = 0;
|
||||||
my $result = 0;
|
|
||||||
|
|
||||||
my $sql = "SELECT count(*) FROM $sqltable WHERE Name = ?";
|
my $sql = "SELECT count(*) FROM $sqltable WHERE Name = ?";
|
||||||
my $sth = $dbh->prepare_cached( $sql )
|
my $sth = $dbh->prepare_cached( $sql )
|
||||||
or die( "Can't prepare '$sql': ".$dbh->errstr() );
|
or die( "Can't prepare '$sql': ".$dbh->errstr() );
|
||||||
my $res = $sth->execute($sqlname)
|
my $res = $sth->execute($sqlname)
|
||||||
or die( "Can't execute: ".$sth->errstr() );
|
or die( "Can't execute: ".$sth->errstr() );
|
||||||
|
|
||||||
my $rows = $sth->fetchrow_arrayref();
|
my $rows = $sth->fetchrow_arrayref();
|
||||||
$sth->finish();
|
$sth->finish();
|
||||||
|
|
||||||
if ($rows->[0] > 0) {
|
if ($rows->[0] > 0) {
|
||||||
$result = 1;
|
$result = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
# Import camera control & presets into the zoneminder dB
|
# Import camera control & presets into the zoneminder dB
|
||||||
sub importsql
|
sub importsql {
|
||||||
{
|
my @newcontrols;
|
||||||
my @newcontrols;
|
my @overwritecontrols;
|
||||||
my @overwritecontrols;
|
my @skippedcontrols;
|
||||||
my @skippedcontrols;
|
my @newpresets;
|
||||||
my @newpresets;
|
my @overwritepresets;
|
||||||
my @overwritepresets;
|
my @skippedpresets;
|
||||||
my @skippedpresets;
|
my %controls;
|
||||||
my %controls;
|
my %monitorpresets;
|
||||||
my %monitorpresets;
|
|
||||||
|
|
||||||
if ($ARGV[0]) {
|
if ($ARGV[0]) {
|
||||||
$sqlfile = $ARGV[0];
|
$sqlfile = $ARGV[0];
|
||||||
|
} else {
|
||||||
|
$sqlfile = $Config{ZM_PATH_DATA}.'/db/zm_create.sql';
|
||||||
|
}
|
||||||
|
|
||||||
|
open(my $SQLFILE,'<',$sqlfile)
|
||||||
|
or die( "Can't Open file: $!\n" );
|
||||||
|
|
||||||
|
# Find and extract ptz control and monitor preset records
|
||||||
|
while (<$SQLFILE>) {
|
||||||
|
# Our regex replaces the primary key with NULL
|
||||||
|
if (s/^(INSERT INTO .*?Controls.*? VALUES \().*?(,')(.*?)(',.*)/$1NULL$2$3$4/i) {
|
||||||
|
$controls{$3} = $_;
|
||||||
|
} elsif (s/^(INSERT INTO .*?MonitorPresets.*? VALUES \().*?(,')(.*?)(',.*)/$1NULL$2$3$4/i) {
|
||||||
|
$monitorpresets{$3} = $_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close $SQLFILE;
|
||||||
|
|
||||||
|
if ( ! (%controls || %monitorpresets) ) {
|
||||||
|
die( "Error: No relevant data found in $sqlfile.\n" );
|
||||||
|
}
|
||||||
|
|
||||||
|
# Now that we've got what we were looking for,
|
||||||
|
# compare to what is already in the dB
|
||||||
|
|
||||||
|
my $dbh = zmDbConnect();
|
||||||
|
foreach (keys %controls) {
|
||||||
|
if (!checkExists($dbh,'Controls',$_)) {
|
||||||
|
# No existing Control was found. Add new control to dB.
|
||||||
|
runQuery($dbh,$controls{$_});
|
||||||
|
push @newcontrols, $_;
|
||||||
|
} elsif ($overwrite) {
|
||||||
|
# An existing Control was found and the overwrite flag is set.
|
||||||
|
# Overwrite the control.
|
||||||
|
deleteQuery($dbh,'Controls',$_);
|
||||||
|
runQuery($dbh,$controls{$_});
|
||||||
|
push @overwritecontrols, $_;
|
||||||
} else {
|
} else {
|
||||||
$sqlfile = $Config{ZM_PATH_DATA}.'/db/zm_create.sql';
|
# An existing Control was found and the overwrite flag was not set.
|
||||||
}
|
# Do nothing.
|
||||||
|
push @skippedcontrols, $_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
open(my $SQLFILE,"<",$sqlfile)
|
foreach (keys %monitorpresets) {
|
||||||
or die( "Can't Open file: $!\n" );
|
if (!checkExists($dbh,'MonitorPresets',$_)) {
|
||||||
|
# No existing MonitorPreset was found. Add new MonitorPreset to dB.
|
||||||
|
runQuery($dbh,$monitorpresets{$_});
|
||||||
|
push @newpresets, $_;
|
||||||
|
} elsif ($overwrite) {
|
||||||
|
# An existing MonitorPreset was found and the overwrite flag is set.
|
||||||
|
# Overwrite the MonitorPreset.
|
||||||
|
deleteQuery($dbh,'MonitorPresets',$_);
|
||||||
|
runQuery($dbh,$monitorpresets{$_});
|
||||||
|
push @overwritepresets, $_;
|
||||||
|
} else {
|
||||||
|
# An existing MonitorPreset was found and the overwrite flag was
|
||||||
|
# not set. Do nothing.
|
||||||
|
push @skippedpresets, $_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# Find and extract ptz control and monitor preset records
|
if (@newcontrols) {
|
||||||
while (<$SQLFILE>) {
|
print 'Number of ptz camera controls added: '
|
||||||
# Our regex replaces the primary key with NULL
|
.scalar(@newcontrols)."\n";
|
||||||
if (s/^(INSERT INTO .*?Controls.*? VALUES \().*?(,')(.*?)(',.*)/$1NULL$2$3$4/i) {
|
}
|
||||||
$controls{$3} = $_;
|
if (@overwritecontrols) {
|
||||||
} elsif (s/^(INSERT INTO .*?MonitorPresets.*? VALUES \().*?(,')(.*?)(',.*)/$1NULL$2$3$4/i) {
|
print 'Number of existing ptz camera controls overwritten: '
|
||||||
$monitorpresets{$3} = $_;
|
.scalar(@overwritecontrols)."\n";
|
||||||
}
|
}
|
||||||
}
|
if (@skippedcontrols) {
|
||||||
close $SQLFILE;
|
print 'Number of existing ptz camera controls skipped: '
|
||||||
|
.scalar(@skippedcontrols)."\n";
|
||||||
|
}
|
||||||
|
|
||||||
if ( ! (%controls || %monitorpresets) ) {
|
if (@newpresets) {
|
||||||
die( "Error: No relevant data found in $sqlfile.\n" );
|
print 'Number of monitor presets added: '
|
||||||
}
|
.scalar(@newpresets)."\n";
|
||||||
|
}
|
||||||
# Now that we've got what we were looking for,
|
if (@overwritepresets) {
|
||||||
# compare to what is already in the dB
|
print 'Number of existing monitor presets overwritten: '
|
||||||
|
.scalar(@overwritepresets)."\n";
|
||||||
my $dbh = zmDbConnect();
|
}
|
||||||
foreach (keys %controls) {
|
if (@skippedpresets) {
|
||||||
if (!checkExists($dbh,"Controls",$_)) {
|
print 'Number of existing presets skipped: '
|
||||||
# No existing Control was found. Add new control to dB.
|
.scalar(@skippedpresets)."\n";
|
||||||
runQuery($dbh,$controls{$_});
|
}
|
||||||
push @newcontrols, $_;
|
|
||||||
} elsif ($overwrite) {
|
|
||||||
# An existing Control was found and the overwrite flag is set.
|
|
||||||
# Overwrite the control.
|
|
||||||
deleteQuery($dbh,"Controls",$_);
|
|
||||||
runQuery($dbh,$controls{$_});
|
|
||||||
push @overwritecontrols, $_;
|
|
||||||
} else {
|
|
||||||
# An existing Control was found and the overwrite flag was not set.
|
|
||||||
# Do nothing.
|
|
||||||
push @skippedcontrols, $_;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (keys %monitorpresets) {
|
|
||||||
if (!checkExists($dbh,"MonitorPresets",$_)) {
|
|
||||||
# No existing MonitorPreset was found. Add new MonitorPreset to dB.
|
|
||||||
runQuery($dbh,$monitorpresets{$_});
|
|
||||||
push @newpresets, $_;
|
|
||||||
} elsif ($overwrite) {
|
|
||||||
# An existing MonitorPreset was found and the overwrite flag is set.
|
|
||||||
# Overwrite the MonitorPreset.
|
|
||||||
deleteQuery($dbh,"MonitorPresets",$_);
|
|
||||||
runQuery($dbh,$monitorpresets{$_});
|
|
||||||
push @overwritepresets, $_;
|
|
||||||
} else {
|
|
||||||
# An existing MonitorPreset was found and the overwrite flag was
|
|
||||||
# not set. Do nothing.
|
|
||||||
push @skippedpresets, $_;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (@newcontrols) {
|
|
||||||
print "Number of ptz camera controls added: "
|
|
||||||
.scalar(@newcontrols)."\n";
|
|
||||||
}
|
|
||||||
if (@overwritecontrols) {
|
|
||||||
print "Number of existing ptz camera controls overwritten: "
|
|
||||||
.scalar(@overwritecontrols)."\n";
|
|
||||||
}
|
|
||||||
if (@skippedcontrols) {
|
|
||||||
print "Number of existing ptz camera controls skipped: "
|
|
||||||
.scalar(@skippedcontrols)."\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (@newpresets) {
|
|
||||||
print "Number of monitor presets added: "
|
|
||||||
.scalar(@newpresets)."\n";
|
|
||||||
}
|
|
||||||
if (@overwritepresets) {
|
|
||||||
print "Number of existing monitor presets overwritten: "
|
|
||||||
.scalar(@overwritepresets)."\n";
|
|
||||||
}
|
|
||||||
if (@skippedpresets) {
|
|
||||||
print "Number of existing presets skipped: "
|
|
||||||
.scalar(@skippedpresets)."\n";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Export camera controls & presets from the zoneminder dB to STDOUT
|
# Export camera controls & presets from the zoneminder dB to STDOUT
|
||||||
sub exportsql
|
sub exportsql {
|
||||||
{
|
|
||||||
|
|
||||||
my ( $host, $port ) = ( $Config{ZM_DB_HOST} =~ /^([^:]+)(?::(.+))?$/ );
|
my ( $host, $port ) = ( $Config{ZM_DB_HOST} =~ /^([^:]+)(?::(.+))?$/ );
|
||||||
my $command = "mysqldump -t --skip-opt --compact -h".$host;
|
my $command = 'mysqldump -t --skip-opt --compact -h'.$host;
|
||||||
$command .= " -P".$port if defined($port);
|
$command .= ' -P'.$port if defined($port);
|
||||||
if ( $dbUser ) {
|
if ( $dbUser ) {
|
||||||
$command .= " -u".$dbUser;
|
$command .= ' -u'.$dbUser;
|
||||||
if ( $dbPass ) {
|
if ( $dbPass ) {
|
||||||
$command .= " -p".$dbPass;
|
$command .= ' -p'.$dbPass;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ($ARGV[0]) {
|
if ($ARGV[0]) {
|
||||||
$command .= qq( --where="Name = '$ARGV[0]'");
|
$command .= qq( --where="Name = '$ARGV[0]'");
|
||||||
}
|
}
|
||||||
|
|
||||||
$command .= " zm Controls MonitorPresets";
|
$command .= " zm Controls MonitorPresets";
|
||||||
|
|
||||||
my $output = qx($command);
|
my $output = qx($command);
|
||||||
my $status = $? >> 8;
|
my $status = $? >> 8;
|
||||||
if ( $status || logDebugging() ) {
|
if ( $status || logDebugging() ) {
|
||||||
chomp( $output );
|
chomp( $output );
|
||||||
print( "Output: $output\n" );
|
print( "Output: $output\n" );
|
||||||
}
|
}
|
||||||
if ( $status ) {
|
if ( $status ) {
|
||||||
die( "Command '$command' exited with status: $status\n" );
|
die( "Command '$command' exited with status: $status\n" );
|
||||||
} else {
|
} else {
|
||||||
# NULLify the primary keys before printing the output to STDOUT
|
# NULLify the primary keys before printing the output to STDOUT
|
||||||
$output =~ s/VALUES \((.*?),'/VALUES \(NULL,'/ig;
|
$output =~ s/VALUES \((.*?),'/VALUES \(NULL,'/ig;
|
||||||
print $output;
|
print $output;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub toPreset
|
sub toPreset {
|
||||||
{
|
my $dbh = zmDbConnect();
|
||||||
my $dbh = zmDbConnect();
|
my $monitorid = $ARGV[0];
|
||||||
my $monitorid = $ARGV[0];
|
|
||||||
|
|
||||||
# Grap the following fields from the Monitors table
|
# Grap the following fields from the Monitors table
|
||||||
my $sql = "SELECT
|
my $sql = 'SELECT
|
||||||
Name,
|
Name,
|
||||||
Type,
|
Type,
|
||||||
Device,
|
Device,
|
||||||
Channel,
|
Channel,
|
||||||
Format,
|
Format,
|
||||||
Protocol,
|
Protocol,
|
||||||
Method,
|
Method,
|
||||||
Host,
|
Host,
|
||||||
Port,
|
Port,
|
||||||
Path,
|
Path,
|
||||||
SubPath,
|
SubPath,
|
||||||
Width,
|
Width,
|
||||||
Height,
|
Height,
|
||||||
Palette,
|
Palette,
|
||||||
MaxFPS,
|
MaxFPS,
|
||||||
Controllable,
|
Controllable,
|
||||||
ControlId,
|
ControlId,
|
||||||
ControlDevice,
|
ControlDevice,
|
||||||
ControlAddress,
|
ControlAddress,
|
||||||
DefaultRate,
|
DefaultRate,
|
||||||
DefaultScale
|
DefaultScale
|
||||||
FROM Monitors WHERE Id = ?";
|
FROM Monitors WHERE Id = ?';
|
||||||
my @data = selectQuery($dbh,$sql,$monitorid);
|
my @data = selectQuery($dbh,$sql,$monitorid);
|
||||||
|
|
||||||
if (!@data) {
|
if (!@data) {
|
||||||
die( "Error: Monitor Id $monitorid does not appear to exist in the database.\n" );
|
die( "Error: Monitor Id $monitorid does not appear to exist in the database.\n" );
|
||||||
|
}
|
||||||
|
|
||||||
|
# Attempt to search for and replace system specific values such as
|
||||||
|
# ip addresses, ports, usernames, etc. with generic placeholders
|
||||||
|
if (!$noregex) {
|
||||||
|
foreach (@data) {
|
||||||
|
next if ! $_;
|
||||||
|
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 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
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# Attempt to search for and replace system specific values such as
|
if (!checkExists($dbh,"MonitorPresets",$data[0])) {
|
||||||
# ip addresses, ports, usernames, etc. with generic placeholders
|
# No existing Preset was found. Add new Preset to dB.
|
||||||
if (!$noregex) {
|
print "Adding new preset: $data[0]\n";
|
||||||
foreach (@data) {
|
insertQuery($dbh,'MonitorPresets',@data);
|
||||||
next if ! $_;
|
} elsif ($overwrite) {
|
||||||
s/\b(?:\d{1,3}\.){3}\d{1,3}\b/<ip-address>/; # ip address
|
# An existing Control was found and the overwrite flag is set.
|
||||||
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
|
# Overwrite the control.
|
||||||
s/\/\/.*:.*@/\/\/<username>:<pwd>@/; # user & pwd preceding an ip address
|
print "Existing preset $data[0] detected.\nOverwriting...\n";
|
||||||
s/(&|\?)(user|username)=\w\w*(&|\?)/$1$2=<username>$3/i; # username embedded in url
|
deleteQuery($dbh,'MonitorPresets',$data[0]);
|
||||||
s/(&|\?)(pwd|password)=\w\w*(&|\?)/$1$2=<pwd>$3/i; # password embedded in url
|
insertQuery($dbh,'MonitorPresets',@data);
|
||||||
s/\w\w*:\w\w*/<username>:<pwd>/; # user & pwd in their own field
|
} else {
|
||||||
s/\/dev\/video\d\d*/\/dev\/video<?>/; # local video devices
|
# An existing Control was found and the overwrite flag was not set.
|
||||||
}
|
# Do nothing.
|
||||||
}
|
print "Existing preset $data[0] detected and overwrite flag not set.\nSkipping...\n";
|
||||||
|
}
|
||||||
if (!checkExists($dbh,"MonitorPresets",$data[0])) {
|
|
||||||
# No existing Preset was found. Add new Preset to dB.
|
|
||||||
print "Adding new preset: $data[0]\n";
|
|
||||||
insertQuery($dbh,"MonitorPresets",@data);
|
|
||||||
} elsif ($overwrite) {
|
|
||||||
# An existing Control was found and the overwrite flag is set.
|
|
||||||
# Overwrite the control.
|
|
||||||
print "Existing preset $data[0] detected.\nOverwriting...\n";
|
|
||||||
deleteQuery($dbh,"MonitorPresets",$data[0]);
|
|
||||||
insertQuery($dbh,"MonitorPresets",@data);
|
|
||||||
} else {
|
|
||||||
# An existing Control was found and the overwrite flag was not set.
|
|
||||||
# Do nothing.
|
|
||||||
print "Existing preset $data[0] detected and overwrite flag not set.\nSkipping...\n";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
__END__
|
||||||
|
|
|
@ -24,14 +24,80 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <dirent.h>
|
||||||
|
#include <glob.h>
|
||||||
|
|
||||||
#include "zm_utils.h"
|
#include "zm_utils.h"
|
||||||
|
|
||||||
void zmLoadConfig() {
|
void zmLoadConfig() {
|
||||||
|
|
||||||
|
// Process name, value pairs from the main config file first
|
||||||
|
char configFile[PATH_MAX] = ZM_CONFIG;
|
||||||
|
process_configfile(configFile);
|
||||||
|
|
||||||
|
// Search for user created config files. If one or more are found then
|
||||||
|
// update the Config hash with those values
|
||||||
|
DIR* configSubFolder = opendir(ZM_CONFIG_SUBDIR);
|
||||||
|
if ( configSubFolder ) { // subfolder exists and is readable
|
||||||
|
char glob_pattern[PATH_MAX] = "";
|
||||||
|
snprintf( glob_pattern, sizeof(glob_pattern), "%s/*.conf", ZM_CONFIG_SUBDIR );
|
||||||
|
|
||||||
|
glob_t pglob;
|
||||||
|
int glob_status = glob( glob_pattern, 0, 0, &pglob );
|
||||||
|
if ( glob_status != 0 ) {
|
||||||
|
if ( glob_status < 0 ) {
|
||||||
|
Error( "Can't glob '%s': %s", glob_pattern, strerror(errno) );
|
||||||
|
} else {
|
||||||
|
Debug( 1, "Can't glob '%s': %d", glob_pattern, glob_status );
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for ( unsigned int i = 0; i < pglob.gl_pathc; i++ ) {
|
||||||
|
process_configfile(pglob.gl_pathv[i]);
|
||||||
|
}
|
||||||
|
closedir(configSubFolder);
|
||||||
|
}
|
||||||
|
globfree( &pglob );
|
||||||
|
}
|
||||||
|
|
||||||
|
zmDbConnect();
|
||||||
|
config.Load();
|
||||||
|
config.Assign();
|
||||||
|
|
||||||
|
// Populate the server config entries
|
||||||
|
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]);
|
||||||
|
} else {
|
||||||
|
Fatal("Can't get ServerId for Server %s", staticConfig.SERVER_NAME.c_str() );
|
||||||
|
}
|
||||||
|
|
||||||
|
} // 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() ) ) {
|
||||||
|
staticConfig.SERVER_NAME = std::string(dbrow[0]);
|
||||||
|
} else {
|
||||||
|
Fatal("Can't get ServerName for Server ID %d", staticConfig.SERVER_ID );
|
||||||
|
}
|
||||||
|
if ( staticConfig.SERVER_ID ) {
|
||||||
|
Debug( 3, "Multi-server configuration detected. Server is %d.", staticConfig.SERVER_ID );
|
||||||
|
} else {
|
||||||
|
Debug( 3, "Single server configuration assumed because no Server ID or Name was specified." );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void process_configfile( char* configFile) {
|
||||||
FILE *cfg;
|
FILE *cfg;
|
||||||
char line[512];
|
char line[512];
|
||||||
if ( (cfg = fopen( ZM_CONFIG, "r")) == NULL ) {
|
if ( (cfg = fopen( configFile, "r")) == NULL ) {
|
||||||
Fatal( "Can't open %s: %s", ZM_CONFIG, strerror(errno) );
|
Fatal( "Can't open %s: %s", configFile, strerror(errno) );
|
||||||
}
|
}
|
||||||
while ( fgets( line, sizeof(line), cfg ) != NULL ) {
|
while ( fgets( line, sizeof(line), cfg ) != NULL ) {
|
||||||
char *line_ptr = line;
|
char *line_ptr = line;
|
||||||
|
@ -58,7 +124,7 @@ void zmLoadConfig() {
|
||||||
// Now look for the '=' in the middle of the line
|
// Now look for the '=' in the middle of the line
|
||||||
temp_ptr = strchr( line_ptr, '=' );
|
temp_ptr = strchr( line_ptr, '=' );
|
||||||
if ( !temp_ptr ) {
|
if ( !temp_ptr ) {
|
||||||
Warning( "Invalid data in %s: '%s'", ZM_CONFIG, line );
|
Warning( "Invalid data in %s: '%s'", configFile, line );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,40 +165,6 @@ void zmLoadConfig() {
|
||||||
}
|
}
|
||||||
} // end foreach line of the config
|
} // end foreach line of the config
|
||||||
fclose( cfg );
|
fclose( cfg );
|
||||||
zmDbConnect();
|
|
||||||
config.Load();
|
|
||||||
config.Assign();
|
|
||||||
|
|
||||||
// Populate the server config entries
|
|
||||||
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() );
|
|
||||||
zmDbRow dbrow;
|
|
||||||
if ( dbrow.fetch( sql.c_str() ) ) {
|
|
||||||
staticConfig.SERVER_ID = atoi(dbrow[0]);
|
|
||||||
} else {
|
|
||||||
Fatal("Can't get ServerId for Server %s", staticConfig.SERVER_NAME.c_str() );
|
|
||||||
}
|
|
||||||
|
|
||||||
} // 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 );
|
|
||||||
|
|
||||||
zmDbRow dbrow;
|
|
||||||
if ( dbrow.fetch( sql.c_str() ) ) {
|
|
||||||
staticConfig.SERVER_NAME = std::string(dbrow[0]);
|
|
||||||
} else {
|
|
||||||
Fatal("Can't get ServerName for Server ID %d", staticConfig.SERVER_ID );
|
|
||||||
}
|
|
||||||
if ( staticConfig.SERVER_ID ) {
|
|
||||||
Debug( 3, "Multi-server configuration detected. Server is %d.", staticConfig.SERVER_ID );
|
|
||||||
} else {
|
|
||||||
Debug( 3, "Single server configuration assumed because no Server ID or Name was specified." );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
StaticConfig staticConfig;
|
StaticConfig staticConfig;
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#define ZM_CONFIG "@ZM_CONFIG@" // Path to config file
|
#define ZM_CONFIG "@ZM_CONFIG@" // Path to config file
|
||||||
|
#define ZM_CONFIG_SUBDIR "@ZM_CONFIG_SUBDIR@" // Path to the ZoneMinder config subfolder
|
||||||
#define ZM_VERSION "@VERSION@" // ZoneMinder Version
|
#define ZM_VERSION "@VERSION@" // ZoneMinder Version
|
||||||
|
|
||||||
#define ZM_HAS_V4L1 @ZM_HAS_V4L1@
|
#define ZM_HAS_V4L1 @ZM_HAS_V4L1@
|
||||||
|
@ -58,6 +59,8 @@
|
||||||
|
|
||||||
extern void zmLoadConfig();
|
extern void zmLoadConfig();
|
||||||
|
|
||||||
|
extern void process_configfile( char* configFile );
|
||||||
|
|
||||||
struct StaticConfig
|
struct StaticConfig
|
||||||
{
|
{
|
||||||
std::string DB_HOST;
|
std::string DB_HOST;
|
||||||
|
|
|
@ -46,7 +46,7 @@ private:
|
||||||
#ifdef HAVE_LIBAVRESAMPLE
|
#ifdef HAVE_LIBAVRESAMPLE
|
||||||
AVAudioResampleContext* resample_context;
|
AVAudioResampleContext* resample_context;
|
||||||
#endif
|
#endif
|
||||||
uint8_t *converted_input_samples = NULL;
|
uint8_t *converted_input_samples;
|
||||||
|
|
||||||
const char *filename;
|
const char *filename;
|
||||||
const char *format;
|
const char *format;
|
||||||
|
|
|
@ -1,46 +1,75 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# Start MySQL
|
setup_mysql_first_time(){
|
||||||
# For Xenial the following won't start mysqld
|
if [ "$(ls /var/lib/mysql)" ]; then
|
||||||
#/usr/bin/mysqld_safe &
|
return
|
||||||
# Use this instead:
|
|
||||||
service mysql start
|
|
||||||
|
|
||||||
# Give MySQL time to wake up
|
|
||||||
SECONDS_LEFT=120
|
|
||||||
while true; do
|
|
||||||
sleep 1
|
|
||||||
mysqladmin ping
|
|
||||||
if [ $? -eq 0 ];then
|
|
||||||
break; # Success
|
|
||||||
fi
|
fi
|
||||||
let SECONDS_LEFT=SECONDS_LEFT-1
|
|
||||||
|
|
||||||
# If we have waited >120 seconds, give up
|
# Set MySQL in the volume
|
||||||
# ZM should never have a database that large!
|
rm -rf /var/lib/mysql/*
|
||||||
# if $COUNTER -lt 120
|
chown -R mysql:mysql /var/lib/mysql
|
||||||
if [ $SECONDS_LEFT -eq 0 ];then
|
mysqld --initialize-insecure
|
||||||
return -1;
|
|
||||||
fi
|
# Start MySQL
|
||||||
done
|
# For Xenial the following won't start mysqld
|
||||||
|
#/usr/bin/mysqld_safe &
|
||||||
|
# Use this instead:
|
||||||
|
service mysql start
|
||||||
|
|
||||||
# Create the ZoneMinder database
|
# Give MySQL time to wake up
|
||||||
mysql -u root < db/zm_create.sql
|
SECONDS_LEFT=120
|
||||||
|
while true; do
|
||||||
|
sleep 1
|
||||||
|
mysqladmin ping
|
||||||
|
if [ $? -eq 0 ];then
|
||||||
|
break; # Success
|
||||||
|
fi
|
||||||
|
let SECONDS_LEFT=SECONDS_LEFT-1
|
||||||
|
|
||||||
# Add the ZoneMinder DB user
|
# If we have waited >120 seconds, give up
|
||||||
mysql -u root -e "grant insert,select,update,delete,lock tables,alter on zm.* to 'zmuser'@'localhost' identified by 'zmpass';"
|
# ZM should never have a database that large!
|
||||||
|
# if $COUNTER -lt 120
|
||||||
|
if [ $SECONDS_LEFT -eq 0 ];then
|
||||||
|
return -1;
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
# Make ZM_LOGDIR
|
# Create the ZoneMinder database
|
||||||
mkdir /var/log/zm
|
mysql -u root < db/zm_create.sql
|
||||||
|
|
||||||
# Activate CGI
|
# Add the ZoneMinder DB user
|
||||||
a2enmod cgi
|
mysql -u root -e "grant insert,select,update,delete,lock tables,alter on zm.* to 'zmuser'@'localhost' identified by 'zmpass';"
|
||||||
|
|
||||||
|
# Shut down mysql cleanly:
|
||||||
|
kill $(cat /var/run/mysqld/mysqld.pid)
|
||||||
|
sleep 5
|
||||||
|
}
|
||||||
|
|
||||||
# Activate modrewrite
|
setup_mysql() {
|
||||||
a2enmod rewrite
|
# To configure MySQL if no container did it before
|
||||||
|
setup_mysql_first_time
|
||||||
|
|
||||||
|
# Add configuration to avoid SQL error when adding monitor
|
||||||
|
echo "sql_mode=NO_ENGINE_SUBSTITUTION" >> /etc/mysql/mysql.conf.d/mysqld.cnf
|
||||||
|
}
|
||||||
|
|
||||||
# Shut down mysql cleanly:
|
setup_php() {
|
||||||
kill $(cat /var/run/mysqld/mysqld.pid)
|
# Activate CGI
|
||||||
sleep 5
|
a2enmod cgi
|
||||||
|
|
||||||
|
# Activate modrewrite
|
||||||
|
a2enmod rewrite
|
||||||
|
|
||||||
|
# Setting timezone
|
||||||
|
sed -i "s#;date.timezone =#date.timezone = $PHP_TIMEZONE#" /etc/php/7.0/apache2/php.ini
|
||||||
|
|
||||||
|
# Settings rights for volume
|
||||||
|
chown -R www-data:www-data /var/lib/zoneminder/events
|
||||||
|
chown -R www-data:www-data /var/lib/zoneminder/images
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
setup_mysql
|
||||||
|
setup_php
|
||||||
|
|
||||||
exit 0
|
exit 0
|
||||||
|
|
|
@ -35,7 +35,7 @@ done
|
||||||
service apache2 restart
|
service apache2 restart
|
||||||
|
|
||||||
# Start ZoneMinder
|
# Start ZoneMinder
|
||||||
/usr/local/bin/zmpkg.pl start
|
/usr/local/bin/zmpkg.pl start && echo "Zone Minder started"
|
||||||
|
|
||||||
while :
|
while :
|
||||||
do
|
do
|
||||||
|
|
|
@ -36,24 +36,46 @@ checksanity () {
|
||||||
echo
|
echo
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create key variables used to assemble the package name
|
||||||
|
createvars () {
|
||||||
|
# We need today's date in year/month/day format
|
||||||
|
thedate=$(date +%Y%m%d)
|
||||||
|
|
||||||
|
# We need the (short) commit hash of the latest commit (rpm packaging only)
|
||||||
|
shorthash=$(git describe --long --always | awk -F - '{print $3}')
|
||||||
|
|
||||||
|
# Grab the ZoneMinder version from the contents of the version file
|
||||||
|
versionfile=$(cat version)
|
||||||
|
|
||||||
|
# git the latest (short) commit hash of the version file
|
||||||
|
versionhash=$(git log -n1 --pretty=format:%h version)
|
||||||
|
|
||||||
|
# Number of commits since the version file was last changed
|
||||||
|
numcommits=$(git rev-list ${versionhash}..HEAD --count)
|
||||||
}
|
}
|
||||||
|
|
||||||
# Check key variables before calling packpack
|
# Check key variables before calling packpack
|
||||||
checkvars () {
|
checkvars () {
|
||||||
if [ -z ${VERSION} ]; then
|
|
||||||
echo
|
|
||||||
echo "FATAL: VERSION variable was null. Cannot continue."
|
|
||||||
echo
|
|
||||||
exit 98
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -z ${RELEASE} ]; then
|
for var in $thedate $shorthash $versionfile $versionhash $numcommits; do
|
||||||
echo
|
if [ -z ${var} ]; then
|
||||||
echo "FATAL: RELEASE variable was null. Cannot Continue"
|
echo
|
||||||
echo
|
echo "FATAL: This script was unable to determine one or more key variables. Cannot continue."
|
||||||
exit 98
|
echo
|
||||||
fi
|
echo "VARIABLE DUMP"
|
||||||
|
echo "-------------"
|
||||||
|
echo
|
||||||
|
echo "thedate: ${thedate}"
|
||||||
|
echo "shorthash: ${shorthash}"
|
||||||
|
echo "versionfile: ${versionfile}"
|
||||||
|
echo "versionhash: ${versionhash}"
|
||||||
|
echo "numcommits: ${numcommits}"
|
||||||
|
echo
|
||||||
|
exit 98
|
||||||
|
fi
|
||||||
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
# Steps common to all builds
|
# Steps common to all builds
|
||||||
|
@ -131,15 +153,33 @@ installtrusty () {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# This sets the naming convention for the deb packages
|
# This sets the naming convention for the rpm packages
|
||||||
setdebpkgver () {
|
setrpmpkgname () {
|
||||||
|
|
||||||
|
createvars
|
||||||
|
|
||||||
|
# Set VERSION to the contents of the version file e.g. 1.31.0
|
||||||
|
# Set RELEASE to 1.{number of commits}.{today's date}git{short hash of HEAD} e.g. 1.82.20170605gitg7ae0b4a
|
||||||
|
export VERSION="$versionfile"
|
||||||
|
export RELEASE="1.${numcommits}.${thedate}git${shorthash}"
|
||||||
|
|
||||||
|
checkvars
|
||||||
|
|
||||||
# Set VERSION to x.xx.x+x e.g. 1.30.2+15
|
echo
|
||||||
# the last x is number of commits since release
|
echo "Packpack VERSION has been set to: ${VERSION}"
|
||||||
# Creates zoneminder packages in the format: zoneminder-{version}-{release}
|
echo "Packpack RELEASE has been set to: ${RELEASE}"
|
||||||
zmver=$(git describe --long --always | sed -n 's/^\([0-9\.]*\)-\([0-9]*\)-\([a-z0-9]*\)/\1/p')
|
echo
|
||||||
commitnum=$(git describe --long --always | sed -n 's/^\([0-9\.]*\)-\([0-9]*\)-\([a-z0-9]*\)/\2/p')
|
|
||||||
export VERSION="$zmver+$commitnum"
|
}
|
||||||
|
|
||||||
|
# This sets the naming convention for the deb packages
|
||||||
|
setdebpkgname () {
|
||||||
|
|
||||||
|
createvars
|
||||||
|
|
||||||
|
# Set VERSION to {zm version}~{today's date}.{number of commits} e.g. 1.31.0~20170605.82
|
||||||
|
# Set RELEASE to the packpack DIST variable e.g. Trusty
|
||||||
|
export VERSION="${versionfile}~${thedate}.${numcommits}"
|
||||||
export RELEASE="${DIST}"
|
export RELEASE="${DIST}"
|
||||||
|
|
||||||
checkvars
|
checkvars
|
||||||
|
@ -151,6 +191,16 @@ setdebpkgver () {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# This adds an entry to the rpm specfile changelog
|
||||||
|
setrpmchangelog () {
|
||||||
|
|
||||||
|
export CHANGELOG_NAME="Andrew Bauer"
|
||||||
|
export CHANGELOG_EMAIL="zonexpertconsulting@outlook.com"
|
||||||
|
export CHANGELOG_TEXT="Automated, development snapshot of git ${shorthash}"
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
# This adds an entry to the debian changelog
|
# This adds an entry to the debian changelog
|
||||||
setdebchangelog () {
|
setdebchangelog () {
|
||||||
DATE=`date -R`
|
DATE=`date -R`
|
||||||
|
@ -177,18 +227,7 @@ if [ "${TRAVIS_EVENT_TYPE}" == "cron" ] || [ "${TRAVIS}" != "true" ]; then
|
||||||
if [ "${OS}" == "el" ] || [ "${OS}" == "fedora" ]; then
|
if [ "${OS}" == "el" ] || [ "${OS}" == "fedora" ]; then
|
||||||
echo "Begin Redhat build..."
|
echo "Begin Redhat build..."
|
||||||
|
|
||||||
# Set VERSION to x.xx.x e.g. 1.30.2
|
setrpmpkgname
|
||||||
# Set RELEASE to x where x is number of commits since release
|
|
||||||
# Creates zoneminder packages in the format: zoneminder-{version}-{release}
|
|
||||||
export VERSION=$(git describe --long --always | sed -n 's/^\([0-9\.]*\)-\([0-9]*\)-\([a-z0-9]*\)/\1/p')
|
|
||||||
export RELEASE=$(git describe --long --always | sed -n 's/^\([0-9\.]*\)-\([0-9]*\)-\([a-z0-9]*\)/\2/p')
|
|
||||||
|
|
||||||
checkvars
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "Packpack VERSION has been set to: ${VERSION}"
|
|
||||||
echo "Packpack RELEASE has been set to: ${RELEASE}"
|
|
||||||
echo
|
|
||||||
|
|
||||||
ln -sfT distros/redhat rpm
|
ln -sfT distros/redhat rpm
|
||||||
|
|
||||||
|
@ -213,6 +252,8 @@ if [ "${TRAVIS_EVENT_TYPE}" == "cron" ] || [ "${TRAVIS}" != "true" ]; then
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
setrpmchangelog
|
||||||
|
|
||||||
echo "Starting packpack..."
|
echo "Starting packpack..."
|
||||||
packpack/packpack -f utils/packpack/redhat_package.mk redhat_package
|
packpack/packpack -f utils/packpack/redhat_package.mk redhat_package
|
||||||
|
|
||||||
|
@ -220,7 +261,7 @@ if [ "${TRAVIS_EVENT_TYPE}" == "cron" ] || [ "${TRAVIS}" != "true" ]; then
|
||||||
elif [ "${OS}" == "debian" ] || [ "${OS}" == "ubuntu" ]; then
|
elif [ "${OS}" == "debian" ] || [ "${OS}" == "ubuntu" ]; then
|
||||||
echo "Begin ${OS} ${DIST} build..."
|
echo "Begin ${OS} ${DIST} build..."
|
||||||
|
|
||||||
setdebpkgver
|
setdebpkgname
|
||||||
movecrud
|
movecrud
|
||||||
|
|
||||||
if [ "${DIST}" == "trusty" ] || [ "${DIST}" == "precise" ]; then
|
if [ "${DIST}" == "trusty" ] || [ "${DIST}" == "precise" ]; then
|
||||||
|
@ -246,7 +287,7 @@ elif [ "${OS}" == "ubuntu" ] && [ "${DIST}" == "trusty" ] && [ "${ARCH}" == "x86
|
||||||
echo "Begin Ubuntu Trusty build..."
|
echo "Begin Ubuntu Trusty build..."
|
||||||
|
|
||||||
commonprep
|
commonprep
|
||||||
setdebpkgver
|
setdebpkgname
|
||||||
movecrud
|
movecrud
|
||||||
|
|
||||||
ln -sfT distros/ubuntu1204 debian
|
ln -sfT distros/ubuntu1204 debian
|
||||||
|
|
|
@ -18,11 +18,12 @@ if ( canView( 'Events' ) ) {
|
||||||
$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 = ?'.monitorLimitSql();
|
$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 = ?'.monitorLimitSql();
|
||||||
if ( !($event = dbFetchOne( $sql, NULL, array( $_REQUEST['id'] ) )) )
|
if ( !($event = dbFetchOne( $sql, NULL, array( $_REQUEST['id'] ) )) )
|
||||||
ajaxError( 'Video Generation Failure, Unable to load event' );
|
ajaxError( 'Video Generation Failure, Unable to load event' );
|
||||||
else
|
else {
|
||||||
if ( $videoFile = createVideo( $event, $_REQUEST['videoFormat'], $_REQUEST['rate'], $_REQUEST['scale'], !empty($_REQUEST['overwrite']) ) )
|
if ( $videoFile = createVideo( $event, $_REQUEST['videoFormat'], $_REQUEST['rate'], $_REQUEST['scale'], !empty($_REQUEST['overwrite']) ) )
|
||||||
ajaxResponse( array( 'response'=>$videoFile ) );
|
ajaxResponse( array( 'response'=>$videoFile ) );
|
||||||
else
|
else
|
||||||
ajaxError( 'Video Generation Failed' );
|
ajaxError( 'Video Generation Failed' );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
$ok = true;
|
$ok = true;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -100,12 +100,12 @@ App::uses('CakeLog', 'Log');
|
||||||
CakeLog::config('debug', array(
|
CakeLog::config('debug', array(
|
||||||
'engine' => 'File',
|
'engine' => 'File',
|
||||||
'types' => array('notice', 'info', 'debug'),
|
'types' => array('notice', 'info', 'debug'),
|
||||||
'file' => '@ZM_LOGDIR@/cake_debug',
|
'file' => 'cake_debug',
|
||||||
));
|
));
|
||||||
CakeLog::config('error', array(
|
CakeLog::config('error', array(
|
||||||
'engine' => 'File',
|
'engine' => 'File',
|
||||||
'types' => array('warning', 'error', 'critical', 'alert', 'emergency'),
|
'types' => array('warning', 'error', 'critical', 'alert', 'emergency'),
|
||||||
'file' => '@ZM_LOGDIR@/cake_error',
|
'file' => 'cake_error',
|
||||||
));
|
));
|
||||||
CakeLog::config('custom_path', array(
|
CakeLog::config('custom_path', array(
|
||||||
'engine' => 'File',
|
'engine' => 'File',
|
||||||
|
|
|
@ -137,28 +137,27 @@ class Event {
|
||||||
|
|
||||||
$streamSrc = ZM_BASE_URL.ZM_PATH_ZMS;
|
$streamSrc = ZM_BASE_URL.ZM_PATH_ZMS;
|
||||||
|
|
||||||
$args[] = 'source=event&event='.$this->{'Id'};
|
$args['source'] = 'event';
|
||||||
|
$args['event'] = $this->{'Id'};
|
||||||
|
|
||||||
if ( ZM_OPT_USE_AUTH ) {
|
if ( ZM_OPT_USE_AUTH ) {
|
||||||
if ( ZM_AUTH_RELAY == 'hashed' ) {
|
if ( ZM_AUTH_RELAY == 'hashed' ) {
|
||||||
$args[] = 'auth='.generateAuthHash( ZM_AUTH_HASH_IPS );
|
$args['auth'] = generateAuthHash( ZM_AUTH_HASH_IPS );
|
||||||
} elseif ( ZM_AUTH_RELAY == 'plain' ) {
|
} elseif ( ZM_AUTH_RELAY == 'plain' ) {
|
||||||
$args[] = 'user='.$_SESSION['username'];
|
$args['user'] = $_SESSION['username'];
|
||||||
$args[] = 'pass='.$_SESSION['password'];
|
$args['pass'] = $_SESSION['password'];
|
||||||
} elseif ( ZM_AUTH_RELAY == "none" ) {
|
} elseif ( ZM_AUTH_RELAY == "none" ) {
|
||||||
$args[] = 'user='.$_SESSION['username'];
|
$args['user'] = $_SESSION['username'];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ( !in_array( 'mode=single', $args ) && !empty($GLOBALS['connkey']) ) {
|
if ( ( (!isset($args['mode'])) or ( $args['mode'] != 'single' ) ) && !empty($GLOBALS['connkey']) ) {
|
||||||
$args[] = 'connkey='.$GLOBALS['connkey'];
|
$args['connkey'] = $GLOBALS['connkey'];
|
||||||
}
|
}
|
||||||
if ( ZM_RAND_STREAM ) {
|
if ( ZM_RAND_STREAM ) {
|
||||||
$args[] = 'rand='.time();
|
$args['rand'] = time();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( count($args) ) {
|
$streamSrc .= '?'.http_build_query( $args,'', $querySep );
|
||||||
$streamSrc .= '?'.join( $querySep, $args );
|
|
||||||
}
|
|
||||||
|
|
||||||
return( $streamSrc );
|
return( $streamSrc );
|
||||||
} // end function getStreamSrc
|
} // end function getStreamSrc
|
||||||
|
|
|
@ -198,9 +198,7 @@ private $control_fields = array(
|
||||||
$args['rand'] = time();
|
$args['rand'] = time();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( count($args) ) {
|
$streamSrc .= '?'.http_build_query( $args,'', $querySep );
|
||||||
$streamSrc .= '?'.http_build_query( $args,'', $querySep );
|
|
||||||
}
|
|
||||||
|
|
||||||
return( $streamSrc );
|
return( $streamSrc );
|
||||||
} // end function getStreamSrc
|
} // end function getStreamSrc
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
// This section contains options substituted by the zmconfig.pl utility, do not edit these directly
|
// This section contains options substituted by the zmconfig.pl utility, do not edit these directly
|
||||||
//
|
//
|
||||||
define( "ZM_CONFIG", "@ZM_CONFIG@" ); // Path to config file
|
define( "ZM_CONFIG", "@ZM_CONFIG@" ); // Path to config file
|
||||||
|
define( "ZM_CONFIG_SUBDIR", "@ZM_CONFIG_SUBDIR@" ); // Path to config subfolder
|
||||||
// Define, and override any given in config file
|
// Define, and override any given in config file
|
||||||
define( "ZM_VERSION", "@VERSION@" ); // Version
|
define( "ZM_VERSION", "@VERSION@" ); // Version
|
||||||
define( "ZM_DIR_TEMP", "@ZM_TMPDIR@" );
|
define( "ZM_DIR_TEMP", "@ZM_TMPDIR@" );
|
||||||
|
@ -36,19 +37,28 @@ if ( file_exists( $localConfigFile ) && filesize( $localConfigFile ) > 0 )
|
||||||
error_log( "Warning, overriding installed $localConfigFile file with local copy" );
|
error_log( "Warning, overriding installed $localConfigFile file with local copy" );
|
||||||
$configFile = $localConfigFile;
|
$configFile = $localConfigFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
$cfg = fopen( $configFile, "r") or die("Could not open config file.");
|
# Process name, value pairs from the main config file first
|
||||||
while ( !feof($cfg) )
|
$configvals = process_configfile($configFile);
|
||||||
{
|
|
||||||
$str = fgets( $cfg, 256 );
|
# Search for user created config files. If one or more are found then
|
||||||
if ( preg_match( '/^\s*$/', $str ))
|
# update our config value array with those values
|
||||||
continue;
|
$configSubFolder = ZM_CONFIG_SUBDIR;
|
||||||
elseif ( preg_match( '/^\s*#/', $str ))
|
if ( is_dir($configSubFolder) ) {
|
||||||
continue;
|
if ( is_readable($configSubFolder) ) {
|
||||||
elseif ( preg_match( '/^\s*([^=\s]+)\s*=\s*(.*?)\s*$/', $str, $matches ))
|
foreach ( glob("$configSubFolder/*.conf") as $filename ) {
|
||||||
define( $matches[1], $matches[2] );
|
$configvals = array_replace($configvals, process_configfile($filename) );
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
error_log( "WARNING: ZoneMinder configuration subfolder found but is not readable. Check folder permissions on $configSubFolder." );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Now that our array our finalized, define each key => value
|
||||||
|
# pair in the array as a constant
|
||||||
|
foreach( $configvals as $key => $value) {
|
||||||
|
define( $key, $value );
|
||||||
}
|
}
|
||||||
fclose( $cfg );
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// This section is options normally derived from other options or configuration
|
// This section is options normally derived from other options or configuration
|
||||||
|
@ -189,5 +199,27 @@ if ( ! defined('ZM_SERVER_ID') ) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function process_configfile($configFile) {
|
||||||
|
if ( is_readable( $configFile ) ) {
|
||||||
|
$configvals = array();
|
||||||
|
|
||||||
|
$cfg = fopen( $configFile, "r") or die("Could not open config file.");
|
||||||
|
while ( !feof($cfg) )
|
||||||
|
{
|
||||||
|
$str = fgets( $cfg, 256 );
|
||||||
|
if ( preg_match( '/^\s*$/', $str ))
|
||||||
|
continue;
|
||||||
|
elseif ( preg_match( '/^\s*#/', $str ))
|
||||||
|
continue;
|
||||||
|
elseif ( preg_match( '/^\s*([^=\s]+)\s*=\s*(.*?)\s*$/', $str, $matches ))
|
||||||
|
$configvals[$matches[1]] = $matches[2];
|
||||||
|
}
|
||||||
|
fclose( $cfg );
|
||||||
|
return( $configvals );
|
||||||
|
} else {
|
||||||
|
error_log( "WARNING: ZoneMinder configuration file found but is not readable. Check file permissions on $configFile." );
|
||||||
|
return( false );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|
1441
web/lang/dk_dk.php
1441
web/lang/dk_dk.php
File diff suppressed because it is too large
Load Diff
|
@ -38,7 +38,7 @@ $eventCounts = array(
|
||||||
'title' => translate('Hour'),
|
'title' => translate('Hour'),
|
||||||
'filter' => array(
|
'filter' => array(
|
||||||
'terms' => array(
|
'terms' => array(
|
||||||
array( 'attr' => "DateTime", 'op' => ">=", 'val' => "-1 hour" ),
|
array( 'attr' => 'DateTime', 'op' => '>=', 'val' => '-1 hour' ),
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
'total' => 0,
|
'total' => 0,
|
||||||
|
@ -47,7 +47,7 @@ $eventCounts = array(
|
||||||
'title' => translate('Day'),
|
'title' => translate('Day'),
|
||||||
'filter' => array(
|
'filter' => array(
|
||||||
'terms' => array(
|
'terms' => array(
|
||||||
array( 'attr' => "DateTime", 'op' => ">=", 'val' => "-1 day" ),
|
array( 'attr' => "DateTime", 'op' => '>=', 'val' => '-1 day' ),
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
'total' => 0,
|
'total' => 0,
|
||||||
|
@ -56,7 +56,7 @@ $eventCounts = array(
|
||||||
'title' => translate('Week'),
|
'title' => translate('Week'),
|
||||||
'filter' => array(
|
'filter' => array(
|
||||||
'terms' => array(
|
'terms' => array(
|
||||||
array( 'attr' => "DateTime", 'op' => ">=", 'val' => "-7 day" ),
|
array( 'attr' => "DateTime", 'op' => '>=', 'val' => '-7 day' ),
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
'total' => 0,
|
'total' => 0,
|
||||||
|
@ -65,7 +65,7 @@ $eventCounts = array(
|
||||||
'title' => translate('Month'),
|
'title' => translate('Month'),
|
||||||
'filter' => array(
|
'filter' => array(
|
||||||
'terms' => array(
|
'terms' => array(
|
||||||
array( 'attr' => "DateTime", 'op' => ">=", 'val' => "-1 month" ),
|
array( 'attr' => "DateTime", 'op' => '>=', 'val' => '-1 month' ),
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
'total' => 0,
|
'total' => 0,
|
||||||
|
@ -74,7 +74,7 @@ $eventCounts = array(
|
||||||
'title' => translate('Archived'),
|
'title' => translate('Archived'),
|
||||||
'filter' => array(
|
'filter' => array(
|
||||||
'terms' => array(
|
'terms' => array(
|
||||||
array( 'attr' => "Archived", 'op' => "=", 'val' => "1" ),
|
array( 'attr' => "Archived", 'op' => '=', 'val' => '1' ),
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
'total' => 0,
|
'total' => 0,
|
||||||
|
|
|
@ -131,12 +131,11 @@ if ( canEdit( 'Events' ) ) {
|
||||||
<div id="archiveEvent" class="hidden"><a href="#" onclick="archiveEvent()"><?php echo translate('Archive') ?></a></div>
|
<div id="archiveEvent" class="hidden"><a href="#" onclick="archiveEvent()"><?php echo translate('Archive') ?></a></div>
|
||||||
<div id="unarchiveEvent" class="hidden"><a href="#" onclick="unarchiveEvent()"><?php echo translate('Unarchive') ?></a></div>
|
<div id="unarchiveEvent" class="hidden"><a href="#" onclick="unarchiveEvent()"><?php echo translate('Unarchive') ?></a></div>
|
||||||
<?php
|
<?php
|
||||||
|
} // end if can edit Events
|
||||||
if ( $Event->DefaultVideo() ) { ?>
|
if ( $Event->DefaultVideo() ) { ?>
|
||||||
<div id="downloadEventFile"><a href="<?php echo $Event->getStreamSrc()?>">Download MP4</a></div>
|
<div id="downloadEventFile"><a href="<?php echo $Event->getStreamSrc()?>">Download MP4</a></div>
|
||||||
<?php
|
<?php
|
||||||
} // end if Event->DefaultVideo
|
} // end if Event->DefaultVideo
|
||||||
} // end if can edit Events
|
|
||||||
if ( canView( 'Events' ) ) {
|
|
||||||
?>
|
?>
|
||||||
<div id="framesEvent"><a href="#" onclick="showEventFrames()"><?php echo translate('Frames') ?></a></div>
|
<div id="framesEvent"><a href="#" onclick="showEventFrames()"><?php echo translate('Frames') ?></a></div>
|
||||||
<?php
|
<?php
|
||||||
|
@ -173,10 +172,10 @@ if ( $Event->DefaultVideo() ) {
|
||||||
<div id="imageFeed" <?php if ( $Event->DefaultVideo() ) { ?>class="hidden"<?php } ?> >
|
<div id="imageFeed" <?php if ( $Event->DefaultVideo() ) { ?>class="hidden"<?php } ?> >
|
||||||
<?php
|
<?php
|
||||||
if ( ZM_WEB_STREAM_METHOD == 'mpeg' && ZM_MPEG_LIVE_FORMAT ) {
|
if ( ZM_WEB_STREAM_METHOD == 'mpeg' && ZM_MPEG_LIVE_FORMAT ) {
|
||||||
$streamSrc = getStreamSrc( array( 'source=event', 'mode=mpeg', 'event='.$eid, 'frame='.$fid, 'scale='.$scale, 'rate='.$rate, 'bitrate='.ZM_WEB_VIDEO_BITRATE, 'maxfps='.ZM_WEB_VIDEO_MAXFPS, 'format='.ZM_MPEG_REPLAY_FORMAT, 'replay='.$replayMode ) );
|
$streamSrc = $Event->getStreamSrc( array( 'mode'=>'mpeg', 'scale'=>$scale, 'rate'=>$rate, 'bitrate'=>ZM_WEB_VIDEO_BITRATE, 'maxfps'=>ZM_WEB_VIDEO_MAXFPS, 'format'=>ZM_MPEG_REPLAY_FORMAT, 'replay'=>$replayMode ) );
|
||||||
outputVideoStream( 'evtStream', $streamSrc, reScale( $Event->Width(), $scale ), reScale( $Event->Height(), $scale ), ZM_MPEG_LIVE_FORMAT );
|
outputVideoStream( "evtStream", $streamSrc, reScale( $Event->Width(), $scale ), reScale( $Event->Height(), $scale ), ZM_MPEG_LIVE_FORMAT );
|
||||||
} else {
|
} else {
|
||||||
$streamSrc = getStreamSrc( array( 'source=event', 'mode=jpeg', 'event='.$eid, 'frame='.$fid, 'scale='.$scale, 'rate='.$rate, 'maxfps='.ZM_WEB_VIDEO_MAXFPS, 'replay='.$replayMode) );
|
$streamSrc = $Event->getStreamSrc( array( 'mode'=>'jpeg', 'frame'=>$fid, 'scale'=>$scale, 'rate'=>$rate, 'maxfps'=>ZM_WEB_VIDEO_MAXFPS, 'replay'=>$replayMode) );
|
||||||
if ( canStreamNative() ) {
|
if ( canStreamNative() ) {
|
||||||
outputImageStream( 'evtStream', $streamSrc, reScale( $Event->Width(), $scale ), reScale( $Event->Height(), $scale ), validHtmlStr($Event->Name()) );
|
outputImageStream( 'evtStream', $streamSrc, reScale( $Event->Width(), $scale ), reScale( $Event->Height(), $scale ), validHtmlStr($Event->Name()) );
|
||||||
} else {
|
} else {
|
||||||
|
@ -247,8 +246,7 @@ if ( $Event->SaveJPEGs() & 3 ) { // frames or analysis
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<?php
|
<?php
|
||||||
} // end if SaveJPEGs() & 3 Analysis or Jpegs
|
} // end if SaveJPEGs() & 3 Analysis or Jpegs
|
||||||
} // end if canView
|
|
||||||
} // end if Event exists
|
} // end if Event exists
|
||||||
?>
|
?>
|
||||||
</div><!--page-->
|
</div><!--page-->
|
||||||
|
|
|
@ -674,9 +674,6 @@ function updateProgressBar() {
|
||||||
}
|
}
|
||||||
} // end if
|
} // end if
|
||||||
} // end function
|
} // end function
|
||||||
// ICON: Shouldn't have to set the width or make it visible
|
|
||||||
// $('progressBar').setStyle( 'width', barWidth );
|
|
||||||
// $('progressBar').removeClass( 'invisible' );
|
|
||||||
} // end function updateProgressBar()
|
} // end function updateProgressBar()
|
||||||
|
|
||||||
function handleClick( event ) {
|
function handleClick( event ) {
|
||||||
|
|
17
zm.conf.in
17
zm.conf.in
|
@ -1,13 +1,16 @@
|
||||||
# ==========================================================================
|
# ==========================================================================
|
||||||
#
|
#
|
||||||
# ZoneMinder Base Configuration, $Date$, $Revision$
|
# ZoneMinder Base Configuration File
|
||||||
#
|
#
|
||||||
# ==========================================================================
|
# ==========================================================================
|
||||||
#
|
#
|
||||||
# This file is generated by 'configure'. Care should be taken if manually
|
# *** DO NOT EDIT THIS FILE ***
|
||||||
# editing this file as an changes may be overwritten by subsequent configuration
|
# Changes made directly to this configuration file are no longer supported.
|
||||||
# or installations.
|
# They will be overwritten during an upgrade.
|
||||||
#
|
#
|
||||||
|
# Instead, create a custom configuration file, with an extention of ".conf"
|
||||||
|
# under the @ZM_CONFIG_SUBDIR@ subfolder containing your desired modifications.
|
||||||
|
#
|
||||||
|
|
||||||
# Path to installed data directory, used mostly for finding DB upgrade scripts
|
# Path to installed data directory, used mostly for finding DB upgrade scripts
|
||||||
ZM_PATH_DATA=@PKGDATADIR@
|
ZM_PATH_DATA=@PKGDATADIR@
|
||||||
|
@ -47,9 +50,3 @@ ZM_DB_USER=@ZM_DB_USER@
|
||||||
# ZoneMinder database password
|
# ZoneMinder database password
|
||||||
ZM_DB_PASS=@ZM_DB_PASS@
|
ZM_DB_PASS=@ZM_DB_PASS@
|
||||||
|
|
||||||
# Do NOT set ZM_SERVER_HOST if you are not using Multi-Server
|
|
||||||
# You have been warned
|
|
||||||
#
|
|
||||||
# The name specified here must have a corresponding entry
|
|
||||||
# in the Servers tab under Options
|
|
||||||
ZM_SERVER_HOST=
|
|
||||||
|
|
Loading…
Reference in New Issue