Merge branch 'master' into osx-port
This commit is contained in:
commit
b8ad9aa897
|
@ -104,6 +104,8 @@ mark_as_advanced(
|
||||||
ZM_PERL_MM_PARMS
|
ZM_PERL_MM_PARMS
|
||||||
ZM_PERL_SEARCH_PATH
|
ZM_PERL_SEARCH_PATH
|
||||||
ZM_TARGET_DISTRO
|
ZM_TARGET_DISTRO
|
||||||
|
ZM_PATH_MAP
|
||||||
|
ZM_PATH_ARP
|
||||||
ZM_CONFIG_DIR
|
ZM_CONFIG_DIR
|
||||||
ZM_CONFIG_SUBDIR
|
ZM_CONFIG_SUBDIR
|
||||||
ZM_SYSTEMD)
|
ZM_SYSTEMD)
|
||||||
|
@ -136,7 +138,21 @@ set(ZM_WEB_USER "" CACHE STRING
|
||||||
set(ZM_WEB_GROUP "" CACHE STRING
|
set(ZM_WEB_GROUP "" CACHE STRING
|
||||||
"The group apache or the local web server runs on,
|
"The group apache or the local web server runs on,
|
||||||
Leave empty to be the same as the web user")
|
Leave empty to be the same as the web user")
|
||||||
|
set(ZM_DIR_EVENTS "events" CACHE PATH
|
||||||
|
"Location where events are recorded to, default: events")
|
||||||
|
set(ZM_DIR_IMAGES "events" CACHE PATH
|
||||||
|
"Location where images, not directly associated with events,
|
||||||
|
are recorded to, default: images")
|
||||||
|
set(ZM_DIR_SOUNDS "sounds" CACHE PATH
|
||||||
|
"Location to look for optional sound files, default: sounds")
|
||||||
|
set(ZM_PATH_ZMS "/cgi-bin/nph-zms" CACHE PATH
|
||||||
|
"Web url to zms streaming server, default: /cgi-bin/nph-zms")
|
||||||
|
|
||||||
# Advanced
|
# Advanced
|
||||||
|
set(ZM_PATH_MAP "/dev/shm" CACHE PATH
|
||||||
|
"Location to save mapped memory files, default: /dev/shm")
|
||||||
|
set(ZM_PATH_ARP "" CACHE PATH
|
||||||
|
"Full path to compatible arp binary. Leave empty for automatic detection.")
|
||||||
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
|
set(ZM_CONFIG_SUBDIR "${ZM_CONFIG_DIR}/conf.d" CACHE PATH
|
||||||
|
@ -184,6 +200,9 @@ if((ZM_TARGET_DISTRO MATCHES "^el") OR (ZM_TARGET_DISTRO MATCHES "^fc"))
|
||||||
set(ZM_CONFIG_SUBDIR "/etc/zm/conf.d")
|
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")
|
||||||
|
set(ZM_DIR_EVENTS "/var/lib/zoneminder/events")
|
||||||
|
set(ZM_DIR_IMAGES "/var/lib/zoneminder/images")
|
||||||
|
set(ZM_PATH_ZMS "/cgi-bin-zm/nph-zms")
|
||||||
elseif(ZM_TARGET_DISTRO STREQUAL "OS13")
|
elseif(ZM_TARGET_DISTRO STREQUAL "OS13")
|
||||||
set(ZM_RUNDIR "/var/run/zoneminder")
|
set(ZM_RUNDIR "/var/run/zoneminder")
|
||||||
set(ZM_TMPDIR "/var/run/zoneminder")
|
set(ZM_TMPDIR "/var/run/zoneminder")
|
||||||
|
|
|
@ -0,0 +1,837 @@
|
||||||
|
# -*- indent-tabs-mode:nil; -*-
|
||||||
|
# vim: set expandtab:
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
#
|
||||||
|
# The MySQL Connector/C++ is licensed under the terms of the GPLv2
|
||||||
|
# <http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>, like most
|
||||||
|
# MySQL Connectors. There are special exceptions to the terms and
|
||||||
|
# conditions of the GPLv2 as it is applied to this software, see the
|
||||||
|
# FLOSS License Exception
|
||||||
|
# <http://www.mysql.com/about/legal/licensing/foss-exception.html>.
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published
|
||||||
|
# by the Free Software Foundation; version 2 of the License.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
# for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along
|
||||||
|
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
##########################################################################
|
||||||
|
|
||||||
|
##########################################################################
|
||||||
|
#
|
||||||
|
# Configuration variables, all optional, are
|
||||||
|
#
|
||||||
|
# MYSQL_DIR - Set in environment or as parameter to "cmake",
|
||||||
|
# this is the top directory of the MySQL Server or
|
||||||
|
# Connector/C install
|
||||||
|
# MYSQL_INCLUDE_DIR - Set in environment or as parameter to "cmake",
|
||||||
|
# this is the include directory where to find
|
||||||
|
# the client library
|
||||||
|
# MYSQL_LIB_DIR - Set in environment or as parameter to "cmake",
|
||||||
|
# this is the library directory where to find
|
||||||
|
# the client library
|
||||||
|
# MYSQLCLIENT_STATIC_LINKING
|
||||||
|
# - Specify that you want static linking, dynamic
|
||||||
|
# linking is the default
|
||||||
|
# MYSQLCLIENT_NO_THREADS
|
||||||
|
# - Specify to link against the single threaded
|
||||||
|
# library, "libmysqlclient". Note that in 5.5
|
||||||
|
# and up "libmysqlclient" is multithreaded and
|
||||||
|
# "libmysqlclient_r" just a soft link to it
|
||||||
|
# MYSQL_CONFIG_EXECUTABLE
|
||||||
|
# - "mysql_config" executable to use
|
||||||
|
# MYSQL_CXX_LINKAGE - Specify that client library needs C++ linking
|
||||||
|
# MYSQL_EXTRA_LIBRARIES
|
||||||
|
# - Libraries to add to the linkage
|
||||||
|
# MYSQL_CFLAGS - C compiler flags
|
||||||
|
# MYSQL_CXXFLAGS - C++ compiler flags
|
||||||
|
# MYSQL_LINK_FLAGS - User defined extra linkage flags
|
||||||
|
# FINDMYSQL_DEBUG - Set if want debug output from this script
|
||||||
|
#
|
||||||
|
# Note that most variables above, if not set by the user they will be
|
||||||
|
# set by this include file.
|
||||||
|
#
|
||||||
|
# In addition, the below CMake variables are set by this include file
|
||||||
|
#
|
||||||
|
# MYSQL_VERSION - Three position numeric version, like 5.6.41
|
||||||
|
# MYSQL_VERSION_ID - Numeric padded version, 5.13.4 => 51304
|
||||||
|
# MYSQL_NUM_VERSION - Same as MYSQL_VERSION_ID, for compatibility
|
||||||
|
# MYSQL_LIB - Path to the client library
|
||||||
|
# MYSQL_LIBRARIES - Library name, might be "-lmysqlclient" while
|
||||||
|
# MYSQL_LIB is the path to the library
|
||||||
|
# MYSQL_CLIENT_LIBS - Same as MYSQL_LIBRARIES, for compatibility
|
||||||
|
#
|
||||||
|
# (1) If MYSQL_INCLUDE_DIR or MYSQL_LIB_DIR are given, these are
|
||||||
|
# used and an error is reported if can't be used
|
||||||
|
# (2) If MYSQL_CONFIG_EXECUTABLE is given, it is used to get
|
||||||
|
# headers and libraries
|
||||||
|
# (3) If MYSQL_DIR is given and "${MYSQL_DIR}/bin/mysql_config" is
|
||||||
|
# found, then same as (2)
|
||||||
|
# (4) If MYSQL_DIR is given and no "${MYSQL_DIR}/bin/mysql_config",
|
||||||
|
# search MYSQL_DIR
|
||||||
|
#
|
||||||
|
# FIXME if we get a "mysql_config" on Windows, things needs to change
|
||||||
|
# FIXME rename the VERSION variables above
|
||||||
|
# FIXME let MYSQL_VERSION include "-beta" etc?
|
||||||
|
# FIXME can mysql_config --version be C/C verson?
|
||||||
|
# FIXME if no mysql_config, find version from include/mysql_version.h?
|
||||||
|
# #define MYSQL_SERVER_VERSION "5.7.5-m15"
|
||||||
|
# #define MYSQL_VERSION_ID 50705
|
||||||
|
# #define LIBMYSQL_VERSION "6.1.5"
|
||||||
|
# #define LIBMYSQL_VERSION_ID 60105
|
||||||
|
# FIXME can MYSQL_LIB_DIR be a list of paths?
|
||||||
|
# FIXME is MYSQLCLIENT_LIBS a better name?
|
||||||
|
# FIXME cache variables, makes them command line args?
|
||||||
|
# FIXME really do include_directories() and link_directories()? Likely
|
||||||
|
# FIXME add check that if not static, not picked up .a or mysqlclient.lib
|
||||||
|
# FIXME MYSQL_VERSION_ID need to take into account Cluster versions
|
||||||
|
# and Connector/C versions
|
||||||
|
# FIXME handle MYSQL_VERSION_ID, LIBMYSQL_VERSION and LIBMYSQL_VERSION_ID?
|
||||||
|
#
|
||||||
|
##########################################################################
|
||||||
|
|
||||||
|
|
||||||
|
##########################################################################
|
||||||
|
#
|
||||||
|
# Check the input data
|
||||||
|
#
|
||||||
|
##########################################################################
|
||||||
|
|
||||||
|
# If using both MYSQL_DIR as a cmake argument and set in environment,
|
||||||
|
# and not empty strings, they better be the same. Else stop and complain
|
||||||
|
|
||||||
|
set(ENV_OR_OPT_VARS
|
||||||
|
MYSQL_DIR
|
||||||
|
MYSQL_INCLUDE_DIR
|
||||||
|
MYSQL_LIB_DIR
|
||||||
|
MYSQL_CFLAGS
|
||||||
|
MYSQL_CXXFLAGS
|
||||||
|
MYSQL_CONFIG_EXECUTABLE
|
||||||
|
MYSQLCLIENT_STATIC_LINKING
|
||||||
|
MYSQLCLIENT_NO_THREADS
|
||||||
|
MYSQL_CXX_LINKAGE
|
||||||
|
MYSQL_EXTRA_LIBRARIES
|
||||||
|
MYSQL_LINK_FLAGS
|
||||||
|
)
|
||||||
|
|
||||||
|
# Mark the variable names that have values that are paths
|
||||||
|
set(ENV_OR_OPT_PATH_VARS
|
||||||
|
MYSQL_DIR
|
||||||
|
MYSQL_INCLUDE_DIR
|
||||||
|
MYSQL_LIB_DIR
|
||||||
|
)
|
||||||
|
|
||||||
|
foreach(_xvar ${ENV_OR_OPT_VARS})
|
||||||
|
|
||||||
|
if((DEFINED ${_xvar}) AND
|
||||||
|
(DEFINED ENV{${_xvar}}) AND
|
||||||
|
(NOT "${${_xvar}}" STREQUAL "") AND
|
||||||
|
(NOT "$ENV{${_xvar}}" STREQUAL "") AND
|
||||||
|
(NOT "$ENV{${_xvar}}" STREQUAL "${${_xvar}}"))
|
||||||
|
message(FATAL_ERROR "Please pass -D${_xvar}=... as an argument or "
|
||||||
|
"set ${_xvar} in the environment, but not both")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Now we know both are not set, set the CMake variable if needed
|
||||||
|
if((DEFINED ENV{${_xvar}}) AND (NOT "$ENV{${_xvar}}" STREQUAL ""))
|
||||||
|
set(${_xvar} $ENV{${_xvar}})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Notmalize the path if the variable is set and is a path
|
||||||
|
if(${_xvar})
|
||||||
|
list(FIND ENV_OR_OPT_PATH_VARS ${_xvar} _index)
|
||||||
|
if (${_index} GREATER -1)
|
||||||
|
file(TO_CMAKE_PATH "${${_xvar}}" ${_xvar})
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
|
||||||
|
if(MYSQL_CONFIG_EXECUTABLE)
|
||||||
|
set(_mysql_config_set_by_user 1)
|
||||||
|
else()
|
||||||
|
# If MYSQL_DIR is set, set MYSQL_CONFIG_EXECUTABLE
|
||||||
|
if((NOT WIN32) AND
|
||||||
|
(DEFINED MYSQL_DIR) AND
|
||||||
|
(EXISTS "${MYSQL_DIR}/bin/mysql_config"))
|
||||||
|
set(MYSQL_CONFIG_EXECUTABLE "${MYSQL_DIR}/bin/mysql_config")
|
||||||
|
set(_mysql_config_in_mysql_dir 1)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
##########################################################################
|
||||||
|
#
|
||||||
|
# Data and basic settings
|
||||||
|
#
|
||||||
|
##########################################################################
|
||||||
|
|
||||||
|
# Set sub directory to search in
|
||||||
|
# dist = for mysql binary distributions
|
||||||
|
# build = for custom built tree
|
||||||
|
|
||||||
|
if(CMAKE_BUILD_TYPE STREQUAL Debug)
|
||||||
|
set(_lib_suffix_dist debug)
|
||||||
|
set(_lib_suffix_build Debug)
|
||||||
|
else()
|
||||||
|
set(_lib_suffix_dist opt)
|
||||||
|
set(_lib_suffix_build Release)
|
||||||
|
add_definitions(-DDBUG_OFF) # FIXME what?!
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(_exe_fallback_path
|
||||||
|
/usr/bin
|
||||||
|
/usr/local/bin
|
||||||
|
/opt/mysql/mysql/bin
|
||||||
|
/usr/local/mysql/bin
|
||||||
|
)
|
||||||
|
|
||||||
|
set(_include_fallback_path
|
||||||
|
/usr/include/mysql
|
||||||
|
/usr/local/include/mysql
|
||||||
|
/opt/mysql/mysql/include
|
||||||
|
/opt/mysql/mysql/include/mysql
|
||||||
|
/usr/local/mysql/include
|
||||||
|
/usr/local/mysql/include/mysql
|
||||||
|
$ENV{ProgramFiles}/MySQL/*/include
|
||||||
|
$ENV{SystemDrive}/MySQL/*/include
|
||||||
|
)
|
||||||
|
|
||||||
|
set(_lib_fallback_path
|
||||||
|
/usr/lib/mysql
|
||||||
|
/usr/local/lib/mysql
|
||||||
|
/usr/local/mysql/lib
|
||||||
|
/usr/local/mysql/lib/mysql
|
||||||
|
/opt/mysql/mysql/lib
|
||||||
|
/opt/mysql/mysql/lib/mysql
|
||||||
|
$ENV{ProgramFiles}/MySQL/*/lib/${_lib_suffix_dist}
|
||||||
|
$ENV{ProgramFiles}/MySQL/*/lib
|
||||||
|
$ENV{SystemDrive}/MySQL/*/lib/${_lib_suffix_dist}
|
||||||
|
$ENV{SystemDrive}/MySQL/*/lib
|
||||||
|
)
|
||||||
|
|
||||||
|
set(_lib_subdirs
|
||||||
|
# Paths in build tree, really being too nice
|
||||||
|
libmysql/${_lib_suffix_build}
|
||||||
|
client/${_lib_suffix_build}
|
||||||
|
libmysql_r/.libs
|
||||||
|
libmysql/.libs
|
||||||
|
libmysql
|
||||||
|
# Install sub directories
|
||||||
|
lib/mysql
|
||||||
|
lib/${_lib_suffix_dist} # Need to be before "lib"
|
||||||
|
lib
|
||||||
|
)
|
||||||
|
|
||||||
|
set(_static_subdirs
|
||||||
|
mysql
|
||||||
|
${_lib_suffix_dist}
|
||||||
|
)
|
||||||
|
|
||||||
|
if(MSVC90)
|
||||||
|
set(_vs_subdir vs9)
|
||||||
|
elseif(MSVC10)
|
||||||
|
set(_vs_subdir vs10)
|
||||||
|
elseif(MSVC11)
|
||||||
|
set(_vs_subdir vs11)
|
||||||
|
elseif(MSVC12)
|
||||||
|
set(_vs_subdir vs12)
|
||||||
|
elseif(MSVC13)
|
||||||
|
set(_vs_subdir vs13)
|
||||||
|
elseif(MSVC14)
|
||||||
|
set(_vs_subdir vs14)
|
||||||
|
elseif(MSVC15)
|
||||||
|
set(_vs_subdir vs15)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(_vs_subdir)
|
||||||
|
if("${_lib_suffix_dist}" STREQUAL "debug")
|
||||||
|
set(_vs_subdir "${_vs_subdir}/debug")
|
||||||
|
endif()
|
||||||
|
list(INSERT _lib_subdirs 0 "lib/${_vs_subdir}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# For Windows, the client library name differs, so easy to
|
||||||
|
# make sure find_library() picks the right one. For Unix, it
|
||||||
|
# is the file extension that differs. In the static library
|
||||||
|
# case we know it is ".a", so we add it to the library name
|
||||||
|
# we search for to make sure it is picked in the static case.
|
||||||
|
if(WIN32)
|
||||||
|
set(_dynamic_libs "libmysql")
|
||||||
|
set(_static_libs "mysqlclient")
|
||||||
|
set(_static_lib_ext ".lib") # Careful, can be import library for DLL
|
||||||
|
elseif(MYSQLCLIENT_NO_THREADS)
|
||||||
|
# In 5.1 and below there is a single threaded library
|
||||||
|
set(_dynamic_libs "mysqlclient")
|
||||||
|
set(_static_libs "libmysqlclient.a")
|
||||||
|
set(_static_lib_ext ".a")
|
||||||
|
else()
|
||||||
|
# We try the multithreaded "libmysqlclient_r" first and if not
|
||||||
|
# there, pick "libmysqlclient" that in 5.5 and up is multithreaded
|
||||||
|
# anyway (soft link "libmysqlclient_r" is not installed MySQL Server
|
||||||
|
# 5.6 and Debian/Ubuntu and might go in 5.7 for all installs)
|
||||||
|
set(_dynamic_libs "mysqlclient_r" "mysqlclient")
|
||||||
|
set(_static_libs "libmysqlclient_r.a" "libmysqlclient.a")
|
||||||
|
set(_static_lib_ext ".a")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(MYSQLCLIENT_STATIC_LINKING)
|
||||||
|
set(_link_type "static")
|
||||||
|
set(_search_libs ${_static_libs})
|
||||||
|
else()
|
||||||
|
set(_link_type "dynamic")
|
||||||
|
set(_search_libs ${_dynamic_libs})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Just to pretty print in error messages
|
||||||
|
string(REPLACE ";" " " _pp_search_libs "${_search_libs}")
|
||||||
|
string(REPLACE ";" " " _pp_lib_subdirs "${_lib_subdirs}")
|
||||||
|
string(REPLACE ";" " " _pp_lib_fallback_path "${_lib_fallback_path}")
|
||||||
|
string(REPLACE ";" " " _pp_include_fallback_path "${_include_fallback_path}")
|
||||||
|
|
||||||
|
message(STATUS "You will link ${_link_type}ally to the MySQL client"
|
||||||
|
" library (set with -DMYSQLCLIENT_STATIC_LINKING=<bool>)")
|
||||||
|
message(STATUS "Searching for ${_link_type} libraries with the base name(s) \"${_pp_search_libs}\"")
|
||||||
|
|
||||||
|
##########################################################################
|
||||||
|
#
|
||||||
|
# Macros
|
||||||
|
#
|
||||||
|
##########################################################################
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Macro that runs "mysql_config ${_opt}" and return the line after
|
||||||
|
# trimming away ending space/newline.
|
||||||
|
#
|
||||||
|
# _mysql_conf(
|
||||||
|
# _var - output variable name, will contain a ';' separated list
|
||||||
|
# _opt - the flag to give to mysql_config
|
||||||
|
#
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
macro(_mysql_conf _var _opt)
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${MYSQL_CONFIG_EXECUTABLE} ${_opt}
|
||||||
|
OUTPUT_VARIABLE ${_var}
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
)
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Macro that runs "mysql_config ${_opt}", selects output args using a
|
||||||
|
# regex, and clean it up a bit removing space/tab/newline before
|
||||||
|
# setting it to a variable.
|
||||||
|
#
|
||||||
|
# _mysql_config(
|
||||||
|
# _var - output variable name, will contain a ';' separated list
|
||||||
|
# _regex - regular expression matching the prefix of args to select
|
||||||
|
# _opt - the flag to give to mysql_config
|
||||||
|
#
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
macro(_mysql_config _var _regex _opt)
|
||||||
|
_mysql_conf(_mysql_config_output ${_opt})
|
||||||
|
string(REGEX MATCHALL "${_regex}([^ ]+)" _mysql_config_output "${_mysql_config_output}")
|
||||||
|
string(REGEX REPLACE "^[ \t]+" "" _mysql_config_output "${_mysql_config_output}")
|
||||||
|
IF(CMAKE_SYSTEM_NAME MATCHES "SunOS")
|
||||||
|
string(REGEX REPLACE " -latomic" "" _mysql_config_output "${_mysql_config_output}")
|
||||||
|
ENDIF()
|
||||||
|
string(REGEX REPLACE "${_regex}" "" _mysql_config_output "${_mysql_config_output}")
|
||||||
|
separate_arguments(_mysql_config_output)
|
||||||
|
set(${_var} ${_mysql_config_output})
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Macro that runs "mysql_config ${_opt}" and selects output using a
|
||||||
|
# prefix regex. Cleans it up a bit removing space/tab/newline. Then
|
||||||
|
# removes the prefix on all in the list, and finally replace what
|
||||||
|
# matches another regular expression with a replacement string.
|
||||||
|
#
|
||||||
|
# _mysql_config_replace(
|
||||||
|
# _var - output variable name, will contain a ';' separated list
|
||||||
|
# _regex1 - regular expression to match out arguments
|
||||||
|
# _replace - what to replace match _regex1 with
|
||||||
|
# _regex2 - regular expression matching the prefix of args to select
|
||||||
|
# _opt - the flag to give to mysql_config
|
||||||
|
#
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
macro(_mysql_config_replace _var _regex1 _replace _regex2 _opt)
|
||||||
|
_mysql_conf(_mysql_config_output ${_opt})
|
||||||
|
string(REGEX MATCHALL "${_regex2}([^ ]+)" _mysql_config_output "${_mysql_config_output}")
|
||||||
|
string(REGEX REPLACE "^[ \t]+" "" _mysql_config_output "${_mysql_config_output}")
|
||||||
|
IF(CMAKE_SYSTEM_NAME MATCHES "SunOS")
|
||||||
|
string(REGEX REPLACE " -latomic" "" _mysql_config_output "${_mysql_config_output}")
|
||||||
|
ENDIF()
|
||||||
|
string(REGEX REPLACE "${_regex2}" "" _mysql_config_output "${_mysql_config_output}")
|
||||||
|
string(REGEX REPLACE "${_regex1}" "${_replace}" _mysql_config_output "${_mysql_config_output}")
|
||||||
|
separate_arguments(_mysql_config_output)
|
||||||
|
set(${_var} ${_mysql_config_output})
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Macro to check that we found a library and that we got the right type
|
||||||
|
#
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
macro(_check_lib_search_error _lib_dir_var _lib_var _exta_err_string)
|
||||||
|
|
||||||
|
set(_lib "${${_lib_var}}")
|
||||||
|
set(_lib_dir "${${_lib_dir_var}}")
|
||||||
|
|
||||||
|
if(FINDMYSQL_DEBUG)
|
||||||
|
message("_lib \"${_lib}\"")
|
||||||
|
message("_lib_dir \"${_lib_dir}\"")
|
||||||
|
message("_lib_var \"${_lib_var}\"")
|
||||||
|
message("_lib_dir_var \"${_lib_dir_var}\"")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(_err_string "Could not find ${_link_type} "
|
||||||
|
"\"${_pp_search_libs}\" in ${_lib_dir_var} "
|
||||||
|
"\"${_lib_dir}\" ${_exta_err_string}")
|
||||||
|
|
||||||
|
if(NOT ${_lib_var})
|
||||||
|
message(FATAL_ERROR ${_err_string})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# find_library() try find a shared library first, then a static
|
||||||
|
# one. For Windows the library has a different name, but for
|
||||||
|
# Unix only the extension differs. So we check here that we
|
||||||
|
# got the library kind we expected.
|
||||||
|
if(NOT WIN32)
|
||||||
|
if(NOT MYSQLCLIENT_STATIC_LINKING)
|
||||||
|
get_filename_component(_ext ${_lib} EXT)
|
||||||
|
if(${_ext} STREQUAL ${_static_lib_ext})
|
||||||
|
message(FATAL_ERROR ${_err_string})
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
|
||||||
|
##########################################################################
|
||||||
|
#
|
||||||
|
# Try find MYSQL_CONFIG_EXECUTABLE if not set, and find version
|
||||||
|
#
|
||||||
|
##########################################################################
|
||||||
|
|
||||||
|
if(NOT WIN32)
|
||||||
|
|
||||||
|
if(NOT MYSQL_CONFIG_EXECUTABLE)
|
||||||
|
find_program(MYSQL_CONFIG_EXECUTABLE
|
||||||
|
NAMES
|
||||||
|
mysql_config
|
||||||
|
DOC
|
||||||
|
"full path of mysql_config"
|
||||||
|
PATHS
|
||||||
|
${_exe_fallback_path}
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(MYSQL_CONFIG_EXECUTABLE)
|
||||||
|
message(STATUS "mysql_config was found ${MYSQL_CONFIG_EXECUTABLE}")
|
||||||
|
|
||||||
|
_mysql_conf(MYSQL_VERSION "--version")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
endif()
|
||||||
|
|
||||||
|
##########################################################################
|
||||||
|
#
|
||||||
|
# Find MYSQL_INCLUDE_DIR
|
||||||
|
#
|
||||||
|
##########################################################################
|
||||||
|
|
||||||
|
if(FINDMYSQL_DEBUG AND MYSQL_INCLUDE_DIR)
|
||||||
|
message("DBG: User gave MYSQL_INCLUDE_DIR = \"${MYSQL_INCLUDE_DIR}\"")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(FINDMYSQL_DEBUG AND MYSQL_DIR)
|
||||||
|
message("DBG: User gave MYSQL_DIR = \"${MYSQL_DIR}\"")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(MYSQL_INCLUDE_DIR)
|
||||||
|
|
||||||
|
if(FINDMYSQL_DEBUG)
|
||||||
|
message("DBG: Using MYSQL_INCLUDE_DIR to find \"mysql.h\"")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT EXISTS "${MYSQL_INCLUDE_DIR}/mysql.h")
|
||||||
|
message(FATAL_ERROR "MYSQL_INCLUDE_DIR given, but no \"mysql.h\" "
|
||||||
|
"in \"${MYSQL_INCLUDE_DIR}\"")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
elseif(MYSQL_DIR AND
|
||||||
|
(NOT _mysql_config_in_mysql_dir) AND
|
||||||
|
(NOT _mysql_config_set_by_user))
|
||||||
|
|
||||||
|
if(FINDMYSQL_DEBUG)
|
||||||
|
message("DBG: Using MYSQL_DIR without \"mysql_config\" to find \"mysql.h\"")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(MYSQL_INCLUDE_DIR "${MYSQL_DIR}/include")
|
||||||
|
if(NOT EXISTS "${MYSQL_INCLUDE_DIR}/mysql.h")
|
||||||
|
message(FATAL_ERROR "MYSQL_DIR given, but no \"mysql.h\" "
|
||||||
|
"in \"${MYSQL_INCLUDE_DIR}\"")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
elseif(MYSQL_CONFIG_EXECUTABLE)
|
||||||
|
|
||||||
|
if(FINDMYSQL_DEBUG)
|
||||||
|
message("DBG: Using \"mysql_config\" to find \"mysql.h\"")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# This code assumes there is just one "-I...." and that
|
||||||
|
# no space between "-I" and the path
|
||||||
|
_mysql_config(MYSQL_INCLUDE_DIR "(^| )-I" "--include")
|
||||||
|
if(NOT MYSQL_INCLUDE_DIR)
|
||||||
|
message(FATAL_ERROR "Could not find the include dir from running "
|
||||||
|
"\"${MYSQL_CONFIG_EXECUTABLE}\"")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT EXISTS "${MYSQL_INCLUDE_DIR}/mysql.h")
|
||||||
|
message(FATAL_ERROR "Could not find \"mysql.h\" in \"${MYSQL_INCLUDE_DIR}\" "
|
||||||
|
"found from running \"${MYSQL_CONFIG_EXECUTABLE}\"")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
else()
|
||||||
|
|
||||||
|
if(FINDMYSQL_DEBUG)
|
||||||
|
message("DBG: Using find_path() searching "
|
||||||
|
"\"${_pp_include_fallback_path}\" to find \"mysql.h\"")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# No specific paths, try some common install paths
|
||||||
|
find_path(MYSQL_INCLUDE_DIR mysql.h ${_include_fallback_path})
|
||||||
|
|
||||||
|
if(NOT MYSQL_INCLUDE_DIR)
|
||||||
|
message(FATAL_ERROR "Could not find \"mysql.h\" from searching "
|
||||||
|
"\"${_pp_include_fallback_path}\"")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(FINDMYSQL_DEBUG)
|
||||||
|
message("DBG: MYSQL_INCLUDE_DIR = \"${MYSQL_INCLUDE_DIR}\"")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
##########################################################################
|
||||||
|
#
|
||||||
|
# Find MYSQL_LIB_DIR, MYSQL_LIB and MYSQL_LIBRARIES
|
||||||
|
#
|
||||||
|
##########################################################################
|
||||||
|
|
||||||
|
if(FINDMYSQL_DEBUG AND MYSQL_LIB_DIR)
|
||||||
|
message("DBG: User gave MYSQL_LIB_DIR = \"${MYSQL_LIB_DIR}\"")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(MYSQL_LIB_DIR)
|
||||||
|
|
||||||
|
if(FINDMYSQL_DEBUG)
|
||||||
|
message("DBG: Using find_library() searching MYSQL_LIB_DIR")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
find_library(MYSQL_LIB
|
||||||
|
NAMES
|
||||||
|
${_search_libs}
|
||||||
|
PATHS
|
||||||
|
"${MYSQL_LIB_DIR}"
|
||||||
|
NO_DEFAULT_PATH
|
||||||
|
)
|
||||||
|
_check_lib_search_error(MYSQL_LIB_DIR MYSQL_LIB "")
|
||||||
|
set(MYSQL_LIBRARIES ${MYSQL_LIB})
|
||||||
|
|
||||||
|
elseif(MYSQL_DIR AND
|
||||||
|
(NOT _mysql_config_in_mysql_dir) AND
|
||||||
|
(NOT _mysql_config_set_by_user))
|
||||||
|
|
||||||
|
if(FINDMYSQL_DEBUG)
|
||||||
|
message("DBG: Using find_library() searching "
|
||||||
|
"MYSQL_DIR and \"${_pp_lib_subdirs}\"")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
find_library(MYSQL_LIB
|
||||||
|
NAMES
|
||||||
|
${_search_libs}
|
||||||
|
PATHS
|
||||||
|
"${MYSQL_DIR}"
|
||||||
|
PATH_SUFFIXES
|
||||||
|
${_lib_subdirs}
|
||||||
|
NO_DEFAULT_PATH
|
||||||
|
)
|
||||||
|
_check_lib_search_error(MYSQL_DIR MYSQL_LIB "in \"${_pp_lib_subdirs}\"")
|
||||||
|
get_filename_component(MYSQL_LIB_DIR "${MYSQL_LIB}" PATH)
|
||||||
|
set(MYSQL_LIBRARIES "${MYSQL_LIB}")
|
||||||
|
|
||||||
|
elseif(MYSQL_CONFIG_EXECUTABLE)
|
||||||
|
|
||||||
|
if(FINDMYSQL_DEBUG)
|
||||||
|
message("DBG: Using \"mysql_config\" to find the libraries")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# This code assumes there is just one "-L...." and that
|
||||||
|
# no space between "-L" and the path
|
||||||
|
_mysql_config(MYSQL_LIB_DIR "(^| )-L" "--libs")
|
||||||
|
|
||||||
|
IF(CMAKE_SYSTEM_NAME MATCHES "SunOS")
|
||||||
|
# This is needed to make Solaris binaries using the default runtime lib path
|
||||||
|
_mysql_config(DEV_STUDIO_RUNTIME_DIR "(^| )-R" "--libs")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
|
||||||
|
# In case mysql_config returns two paths: (0) runtime and (1) libmysqlclient
|
||||||
|
LIST(LENGTH MYSQL_LIB_DIR n)
|
||||||
|
IF( ${n} GREATER 1)
|
||||||
|
LIST(GET MYSQL_LIB_DIR 1 MYSQL_LIB_DIR)
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
if(NOT MYSQL_LIB_DIR)
|
||||||
|
message(FATAL_ERROR "Could not find the library dir from running "
|
||||||
|
"\"${MYSQL_CONFIG_EXECUTABLE}\"")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT EXISTS "${MYSQL_LIB_DIR}")
|
||||||
|
message(FATAL_ERROR "Could not find the directory \"${MYSQL_LIB_DIR}\" "
|
||||||
|
"found from running \"${MYSQL_CONFIG_EXECUTABLE}\"")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# We have the assumed MYSQL_LIB_DIR. The output from "mysql_config"
|
||||||
|
# might not be correct for static libraries, so we might need to
|
||||||
|
# adjust MYSQL_LIB_DIR later on.
|
||||||
|
|
||||||
|
if(MYSQLCLIENT_STATIC_LINKING)
|
||||||
|
|
||||||
|
# Find the static library, might be one level down
|
||||||
|
find_library(MYSQL_LIB
|
||||||
|
NAMES
|
||||||
|
${_search_libs}
|
||||||
|
PATHS
|
||||||
|
${MYSQL_LIB_DIR}
|
||||||
|
PATH_SUFFIXES
|
||||||
|
${_static_subdirs}
|
||||||
|
NO_DEFAULT_PATH
|
||||||
|
)
|
||||||
|
_check_lib_search_error(MYSQL_LIB_DIR MYSQL_LIB "in \"${_static_subdirs}\"")
|
||||||
|
|
||||||
|
# Adjust MYSQL_LIB_DIR in case it changes
|
||||||
|
get_filename_component(MYSQL_LIB_DIR "${MYSQL_LIB}" PATH)
|
||||||
|
|
||||||
|
# Replace the current library references with the full path
|
||||||
|
# to the library, i.e. the -L will be ignored
|
||||||
|
_mysql_config_replace(MYSQL_LIBRARIES
|
||||||
|
"(mysqlclient|mysqlclient_r)" "${MYSQL_LIB}" "(^| )-l" "--libs")
|
||||||
|
|
||||||
|
else()
|
||||||
|
|
||||||
|
_mysql_config(MYSQL_LIBRARIES "(^| )-l" "--libs")
|
||||||
|
FOREACH(__lib IN LISTS MYSQL_LIBRARIES)
|
||||||
|
string(REGEX MATCH "mysqlclient([^ ]*)" _matched_lib __lib)
|
||||||
|
IF(_matched_lib)
|
||||||
|
set(_search_libs ${matched_lib})
|
||||||
|
ENDIF()
|
||||||
|
ENDFOREACH()
|
||||||
|
# First library is assumed to be the client library
|
||||||
|
# list(GET MYSQL_LIBRARIES 0 _search_libs)
|
||||||
|
find_library(MYSQL_LIB
|
||||||
|
NAMES
|
||||||
|
${_search_libs}
|
||||||
|
PATHS
|
||||||
|
${MYSQL_LIB_DIR}
|
||||||
|
NO_DEFAULT_PATH
|
||||||
|
)
|
||||||
|
_check_lib_search_error(MYSQL_LIB_DIR MYSQL_LIB "")
|
||||||
|
|
||||||
|
endif()
|
||||||
|
|
||||||
|
else()
|
||||||
|
|
||||||
|
if(FINDMYSQL_DEBUG)
|
||||||
|
message("DBG: Using find_library() searching "
|
||||||
|
"\"${_pp_lib_fallback_path}\" to find the client library")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Search standard places
|
||||||
|
find_library(MYSQL_LIB
|
||||||
|
NAMES
|
||||||
|
${_search_libs}
|
||||||
|
PATHS
|
||||||
|
${_lib_fallback_path}
|
||||||
|
)
|
||||||
|
if(NOT MYSQL_LIB)
|
||||||
|
message(FATAL_ERROR "Could not find \"${_pp_search_libs}\" from searching "
|
||||||
|
"\"${_pp_lib_fallback_path}\"")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
get_filename_component(MYSQL_LIB_DIR "${MYSQL_LIB}" PATH)
|
||||||
|
|
||||||
|
endif()
|
||||||
|
|
||||||
|
##########################################################################
|
||||||
|
#
|
||||||
|
# Add more libraries to MYSQL_LIBRARIES
|
||||||
|
#
|
||||||
|
##########################################################################
|
||||||
|
|
||||||
|
# FIXME needed?!
|
||||||
|
if(MYSQLCLIENT_STATIC_LINKING AND
|
||||||
|
NOT WIN32 AND
|
||||||
|
NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
||||||
|
list(APPEND MYSQL_LIBRARIES "rt")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(MYSQL_EXTRA_LIBRARIES)
|
||||||
|
separate_arguments(MYSQL_EXTRA_LIBRARIES)
|
||||||
|
list(APPEND MYSQL_LIBRARIES ${MYSQL_EXTRA_LIBRARIES})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# For compatibility
|
||||||
|
SET(MYSQL_CLIENT_LIBS ${MYSQL_LIBRARIES})
|
||||||
|
|
||||||
|
##########################################################################
|
||||||
|
#
|
||||||
|
# If not found MySQL Serverv version, compile a small client app
|
||||||
|
# and let it write a small cmake file with the settings
|
||||||
|
#
|
||||||
|
##########################################################################
|
||||||
|
|
||||||
|
if(MYSQL_INCLUDE_DIR AND NOT MYSQL_VERSION)
|
||||||
|
|
||||||
|
# Write the C source file that will include the MySQL headers
|
||||||
|
set(GETMYSQLVERSION_SOURCEFILE "${CMAKE_CURRENT_BINARY_DIR}/getmysqlversion.c")
|
||||||
|
file(WRITE "${GETMYSQLVERSION_SOURCEFILE}"
|
||||||
|
"#include <mysql.h>\n"
|
||||||
|
"#include <stdio.h>\n"
|
||||||
|
"int main() {\n"
|
||||||
|
" printf(\"%s\", MYSQL_SERVER_VERSION);\n"
|
||||||
|
"}\n"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Compile and run the created executable, store output in MYSQL_VERSION
|
||||||
|
try_run(_run_result _compile_result
|
||||||
|
"${CMAKE_BINARY_DIR}"
|
||||||
|
"${GETMYSQLVERSION_SOURCEFILE}"
|
||||||
|
CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${MYSQL_INCLUDE_DIR}"
|
||||||
|
RUN_OUTPUT_VARIABLE MYSQL_VERSION
|
||||||
|
)
|
||||||
|
|
||||||
|
if(FINDMYSQL_DEBUG)
|
||||||
|
if(NOT _compile_result)
|
||||||
|
message("DBG: Could not compile \"getmysqlversion.c\"")
|
||||||
|
endif()
|
||||||
|
if(_run_result)
|
||||||
|
message("DBG: Running \"getmysqlversion\" returned ${_run_result}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
endif()
|
||||||
|
|
||||||
|
##########################################################################
|
||||||
|
#
|
||||||
|
# Clean up MYSQL_VERSION and create MYSQL_VERSION_ID/MYSQL_NUM_VERSION
|
||||||
|
#
|
||||||
|
##########################################################################
|
||||||
|
|
||||||
|
if(NOT MYSQL_VERSION)
|
||||||
|
message(FATAL_ERROR "Could not determine the MySQL Server version")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Clean up so only numeric, in case of "-alpha" or similar
|
||||||
|
string(REGEX MATCHALL "([0-9]+.[0-9]+.[0-9]+)" MYSQL_VERSION "${MYSQL_VERSION}")
|
||||||
|
# To create a fully numeric version, first normalize so N.NN.NN
|
||||||
|
string(REGEX REPLACE "[.]([0-9])[.]" ".0\\1." MYSQL_VERSION_ID "${MYSQL_VERSION}")
|
||||||
|
string(REGEX REPLACE "[.]([0-9])$" ".0\\1" MYSQL_VERSION_ID "${MYSQL_VERSION_ID}")
|
||||||
|
# Finally remove the dot
|
||||||
|
string(REGEX REPLACE "[.]" "" MYSQL_VERSION_ID "${MYSQL_VERSION_ID}")
|
||||||
|
set(MYSQL_NUM_VERSION ${MYSQL_VERSION_ID})
|
||||||
|
|
||||||
|
##########################################################################
|
||||||
|
#
|
||||||
|
# Try determine if to use C++ linkage, and also find C++ flags
|
||||||
|
#
|
||||||
|
##########################################################################
|
||||||
|
|
||||||
|
if(NOT WIN32)
|
||||||
|
|
||||||
|
if(MYSQL_CONFIG_EXECUTABLE)
|
||||||
|
|
||||||
|
if(NOT MYSQL_CFLAGS)
|
||||||
|
_mysql_conf(MYSQL_CFLAGS "--cflags")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT MYSQL_CXXFLAGS)
|
||||||
|
if(MYSQL_CXX_LINKAGE OR MYSQL_VERSION_ID GREATER 50603)
|
||||||
|
_mysql_conf(MYSQL_CXXFLAGS "--cxxflags")
|
||||||
|
set(MYSQL_CXX_LINKAGE 1)
|
||||||
|
else()
|
||||||
|
set(MYSQL_CXXFLAGS "${MYSQL_CFLAGS}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# FIXME this should not be needed, caller of this module should set
|
||||||
|
# it's own flags and just use the library on it's on terms
|
||||||
|
# (change the infe message if enabling this code)
|
||||||
|
# if(NOT MYSQL_LINK_FLAGS)
|
||||||
|
# # Find -mcpu -march -mt -m32 -m64 and other flags starting with "-m"
|
||||||
|
# string(REGEX MATCHALL "(^| )-m([^\r\n ]+)" MYSQL_LINK_FLAGS "${MYSQL_CXXFLAGS}")
|
||||||
|
# string(REGEX REPLACE "^ " "" MYSQL_LINK_FLAGS "${MYSQL_LINK_FLAGS}")
|
||||||
|
# string(REGEX REPLACE "; " ";" MYSQL_LINK_FLAGS "${MYSQL_LINK_FLAGS}")
|
||||||
|
# endif()
|
||||||
|
|
||||||
|
endif()
|
||||||
|
|
||||||
|
endif()
|
||||||
|
|
||||||
|
##########################################################################
|
||||||
|
#
|
||||||
|
# Inform CMake where to look for headers and libraries
|
||||||
|
#
|
||||||
|
##########################################################################
|
||||||
|
|
||||||
|
# string(TOUPPER "${CMAKE_BUILD_TYPE}" CMAKEBT)
|
||||||
|
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MYSQL_CXXFLAGS}")
|
||||||
|
# set(CMAKE_CXX_FLAGS_${CMAKEBT} "${CMAKE_CXX_FLAGS_${CMAKEBT}} ${MYSQL_CXXFLAGS}")
|
||||||
|
|
||||||
|
include_directories("${MYSQL_INCLUDE_DIR}")
|
||||||
|
link_directories("${MYSQL_LIB_DIR}")
|
||||||
|
|
||||||
|
##########################################################################
|
||||||
|
#
|
||||||
|
# Report
|
||||||
|
#
|
||||||
|
##########################################################################
|
||||||
|
|
||||||
|
message(STATUS "MySQL client environment/cmake variables set that the user can override")
|
||||||
|
|
||||||
|
message(STATUS " MYSQL_DIR : ${MYSQL_DIR}")
|
||||||
|
message(STATUS " MYSQL_INCLUDE_DIR : ${MYSQL_INCLUDE_DIR}")
|
||||||
|
message(STATUS " MYSQL_LIB_DIR : ${MYSQL_LIB_DIR}")
|
||||||
|
message(STATUS " MYSQL_CONFIG_EXECUTABLE : ${MYSQL_CONFIG_EXECUTABLE}")
|
||||||
|
message(STATUS " MYSQL_CXX_LINKAGE : ${MYSQL_CXX_LINKAGE}")
|
||||||
|
message(STATUS " MYSQL_CFLAGS : ${MYSQL_CFLAGS}")
|
||||||
|
message(STATUS " MYSQL_CXXFLAGS : ${MYSQL_CXXFLAGS}")
|
||||||
|
message(STATUS " MYSQLCLIENT_STATIC_LINKING : ${MYSQLCLIENT_STATIC_LINKING}")
|
||||||
|
message(STATUS " MYSQLCLIENT_NO_THREADS : ${MYSQLCLIENT_NO_THREADS}")
|
||||||
|
|
||||||
|
message(STATUS "MySQL client optional environment/cmake variables set by the user")
|
||||||
|
|
||||||
|
message(STATUS " MYSQL_EXTRA_LIBRARIES : ${MYSQL_EXTRA_LIBRARIES}")
|
||||||
|
message(STATUS " MYSQL_LINK_FLAGS : ${MYSQL_LINK_FLAGS}")
|
||||||
|
|
||||||
|
message(STATUS "MySQL client settings that the user can't override")
|
||||||
|
|
||||||
|
message(STATUS " MYSQL_VERSION : ${MYSQL_VERSION}")
|
||||||
|
message(STATUS " MYSQL_VERSION_ID : ${MYSQL_VERSION_ID}")
|
||||||
|
message(STATUS " MYSQL_LIB : ${MYSQL_LIB}")
|
||||||
|
message(STATUS " MYSQL_LIBRARIES : ${MYSQL_LIBRARIES}")
|
|
@ -204,6 +204,7 @@ CREATE TABLE `Events` (
|
||||||
`Messaged` tinyint(3) unsigned NOT NULL default '0',
|
`Messaged` tinyint(3) unsigned NOT NULL default '0',
|
||||||
`Executed` tinyint(3) unsigned NOT NULL default '0',
|
`Executed` tinyint(3) unsigned NOT NULL default '0',
|
||||||
`Notes` text,
|
`Notes` text,
|
||||||
|
`StateId` int(10) unsigned NOT NULL,
|
||||||
PRIMARY KEY (`Id`,`MonitorId`),
|
PRIMARY KEY (`Id`,`MonitorId`),
|
||||||
KEY `MonitorId` (`MonitorId`),
|
KEY `MonitorId` (`MonitorId`),
|
||||||
KEY `StartTime` (`StartTime`),
|
KEY `StartTime` (`StartTime`),
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
--
|
||||||
|
-- This updates a 1.30.0 database to 1.30.1
|
||||||
|
--
|
||||||
|
-- Add StateId Column to Events.
|
||||||
|
--
|
||||||
|
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*)
|
||||||
|
FROM INFORMATION_SCHEMA.COLUMNS
|
||||||
|
WHERE table_name = 'Events'
|
||||||
|
AND table_schema = DATABASE()
|
||||||
|
AND column_name = 'StateId'
|
||||||
|
) > 0,
|
||||||
|
"SELECT 'Column StateId exists in Events'",
|
||||||
|
"ALTER TABLE Events ADD `StateId` int(10) unsigned default NULL AFTER `Notes`"
|
||||||
|
));
|
||||||
|
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
|
|
@ -23,7 +23,10 @@ override_dh_auto_configure:
|
||||||
-DZM_WEB_USER=www-data \
|
-DZM_WEB_USER=www-data \
|
||||||
-DZM_WEB_GROUP=www-data \
|
-DZM_WEB_GROUP=www-data \
|
||||||
-DZM_CONFIG_SUBDIR="/etc/zm/conf.d" \
|
-DZM_CONFIG_SUBDIR="/etc/zm/conf.d" \
|
||||||
-DZM_CONFIG_DIR="/etc/zm"
|
-DZM_CONFIG_DIR="/etc/zm" \
|
||||||
|
-DZM_DIR_EVENTS="/var/cache/zoneminder/events" \
|
||||||
|
-DZM_DIR_IMAGES="/var/cache/zoneminder/images" \
|
||||||
|
-DZM_PATH_ZMS="/zm/cgi-bin/nph-zms"
|
||||||
|
|
||||||
override_dh_auto_install:
|
override_dh_auto_install:
|
||||||
dh_auto_install --buildsystem=cmake
|
dh_auto_install --buildsystem=cmake
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
%global _hardened_build 1
|
%global _hardened_build 1
|
||||||
|
|
||||||
Name: zoneminder
|
Name: zoneminder
|
||||||
Version: 1.30.4
|
Version: 1.31.0
|
||||||
Release: 1%{?dist}
|
Release: 1%{?dist}
|
||||||
Summary: A camera monitoring and analysis tool
|
Summary: A camera monitoring and analysis tool
|
||||||
Group: System Environment/Daemons
|
Group: System Environment/Daemons
|
||||||
|
@ -142,9 +142,7 @@ too much degradation of performance.
|
||||||
%{__mv} -f crud-%{crud_version} ./web/api/app/Plugin/Crud
|
%{__mv} -f crud-%{crud_version} ./web/api/app/Plugin/Crud
|
||||||
|
|
||||||
# Change the following default values
|
# Change the following default values
|
||||||
./utils/zmeditconfigdata.sh ZM_PATH_ZMS /cgi-bin-zm/nph-zms
|
|
||||||
./utils/zmeditconfigdata.sh ZM_OPT_CAMBOZOLA yes
|
./utils/zmeditconfigdata.sh ZM_OPT_CAMBOZOLA yes
|
||||||
./utils/zmeditconfigdata.sh ZM_PATH_SWAP /dev/shm
|
|
||||||
./utils/zmeditconfigdata.sh ZM_UPLOAD_FTP_LOC_DIR %{_localstatedir}/spool/zoneminder-upload
|
./utils/zmeditconfigdata.sh ZM_UPLOAD_FTP_LOC_DIR %{_localstatedir}/spool/zoneminder-upload
|
||||||
./utils/zmeditconfigdata.sh ZM_OPT_CONTROL yes
|
./utils/zmeditconfigdata.sh ZM_OPT_CONTROL yes
|
||||||
./utils/zmeditconfigdata.sh ZM_CHECK_FOR_UPDATES no
|
./utils/zmeditconfigdata.sh ZM_CHECK_FOR_UPDATES no
|
||||||
|
|
|
@ -25,7 +25,10 @@ override_dh_auto_configure:
|
||||||
-DZM_SOCKDIR="/var/run/zm" \
|
-DZM_SOCKDIR="/var/run/zm" \
|
||||||
-DZM_TMPDIR="/tmp/zm" \
|
-DZM_TMPDIR="/tmp/zm" \
|
||||||
-DZM_CGIDIR="/usr/lib/zoneminder/cgi-bin" \
|
-DZM_CGIDIR="/usr/lib/zoneminder/cgi-bin" \
|
||||||
-DZM_CONTENTDIR="/var/cache/zoneminder"
|
-DZM_CONTENTDIR="/var/cache/zoneminder" \
|
||||||
|
-DZM_DIR_EVENTS="/var/cache/zoneminder/events" \
|
||||||
|
-DZM_DIR_IMAGES="/var/cache/zoneminder/images" \
|
||||||
|
-DZM_PATH_ZMS="/zm/cgi-bin/nph-zms" \
|
||||||
|
|
||||||
override_dh_clean:
|
override_dh_clean:
|
||||||
dh_clean $(MANPAGES1)
|
dh_clean $(MANPAGES1)
|
||||||
|
|
|
@ -63,8 +63,10 @@ override_dh_auto_configure:
|
||||||
-DZM_WEB_USER=www-data \
|
-DZM_WEB_USER=www-data \
|
||||||
-DZM_WEB_GROUP=www-data \
|
-DZM_WEB_GROUP=www-data \
|
||||||
-DZM_CONFIG_SUBDIR="/etc/zm/conf.d" \
|
-DZM_CONFIG_SUBDIR="/etc/zm/conf.d" \
|
||||||
-DZM_CONFIG_DIR="/etc/zm"
|
-DZM_CONFIG_DIR="/etc/zm" \
|
||||||
|
-DZM_DIR_EVENTS="/var/cache/zoneminder/events" \
|
||||||
|
-DZM_DIR_IMAGES="/var/cache/zoneminder/images" \
|
||||||
|
-DZM_PATH_ZMS="/zm/cgi-bin/nph-zms"
|
||||||
|
|
||||||
override_dh_auto_test:
|
override_dh_auto_test:
|
||||||
# do not run tests...
|
# do not run tests...
|
||||||
|
|
|
@ -1,607 +0,0 @@
|
||||||
zoneminder (1.29.0+dfsg-1) unstable; urgency=low
|
|
||||||
|
|
||||||
* New upstream release [February 2016] (Closes: #788317, #770851).
|
|
||||||
|
|
||||||
[ Dmitry Smirnov <onlyjob@debian.org> ]
|
|
||||||
* copyright/Files-Excluded += "onvif/*" due to licensing uncertainty.
|
|
||||||
* Fixed FTBFS when built with dpkg-buildpackage -A (Closes: #806126).
|
|
||||||
* FFmpeg 2.9 support. Thanks, Andreas Cadhalpun. (Closes: #803850).
|
|
||||||
* Use "ffmpeg" instead of "avconv":
|
|
||||||
+ "libav_path.patch" replaced with "default_ffmpeg_path.patch".
|
|
||||||
* zoneminder/Depends:
|
|
||||||
- perl-modules (package-relation-with-perl-modules)
|
|
||||||
- libav-tools
|
|
||||||
* zoneminder/Recommends:
|
|
||||||
+ ffmpeg | libav-tools
|
|
||||||
* Updated Vcs URLs.
|
|
||||||
* Build/install new man pages.
|
|
||||||
* Removed obsolete lintian-overrides.
|
|
||||||
* README: grant "index" right to DB user.
|
|
||||||
* systemd: start after MySQL but do not require the latter.
|
|
||||||
* Added new patch with spelling corrections.
|
|
||||||
* Removed obsolete patches:
|
|
||||||
- 783.patch
|
|
||||||
- 980-fix-image-size.patch
|
|
||||||
- cmake-fix-confpath.patch
|
|
||||||
- cmake.patch
|
|
||||||
- cmake-gnutls.patch
|
|
||||||
- fix-html-export.patch
|
|
||||||
- format-hardening.patch
|
|
||||||
- libv4l1-videodev.h.patch
|
|
||||||
- pod_man_fixes.patch
|
|
||||||
- pod_name_fixes.patch
|
|
||||||
- pod_zmupdate-to-pod2usage.patch
|
|
||||||
- respect-privacy.patch
|
|
||||||
- zmtrigger-plus.patch
|
|
||||||
|
|
||||||
[ Vagrant Cascadian <vagrant@debian.org> ]
|
|
||||||
* Remove myself from Uploaders.
|
|
||||||
|
|
||||||
-- Dmitry Smirnov <onlyjob@debian.org> Tue, 09 Feb 2016 15:40:32 +1100
|
|
||||||
|
|
||||||
zoneminder (1.28.1-8) unstable; urgency=medium
|
|
||||||
|
|
||||||
* Patchworks:
|
|
||||||
+ New upstream "980-fix-image-size.patch".
|
|
||||||
+ New "default_cgi-path.patch" to correct default ZM_PATH_ZMS.
|
|
||||||
* postinst: set "root" as group owner for "/var/log/zm" to silence
|
|
||||||
logrotate warnings.
|
|
||||||
* Minor correction to README.Debian.
|
|
||||||
|
|
||||||
-- Dmitry Smirnov <onlyjob@debian.org> Sun, 16 Aug 2015 19:19:50 +1000
|
|
||||||
|
|
||||||
zoneminder (1.28.1-7) unstable; urgency=medium
|
|
||||||
|
|
||||||
* Build-Depends += "cakephp (<< 3.0.0~)";
|
|
||||||
Zoneminder is not compatible with latest CakePHP.
|
|
||||||
* Handle conffile removal from maintscript.
|
|
||||||
* rules: build man pages reproducibly.
|
|
||||||
* gbp.conf: renamed old style config section [git-dch] to [dch].
|
|
||||||
* README
|
|
||||||
+ added instructions to update owner of the "/etc/zm/zm.conf"
|
|
||||||
(Closes: #789327).
|
|
||||||
+ zmupdate.pl needs CREATE rights.
|
|
||||||
+ added note about required number of "fcgiwrap" workers.
|
|
||||||
* New upstream patch: "zmtrigger-plus.patch".
|
|
||||||
|
|
||||||
-- Dmitry Smirnov <onlyjob@debian.org> Mon, 20 Jul 2015 16:30:15 +1000
|
|
||||||
|
|
||||||
zoneminder (1.28.1-6) unstable; urgency=low
|
|
||||||
|
|
||||||
* New "zoneminder-doc" and "zoneminder-dbg" packages.
|
|
||||||
|
|
||||||
-- Dmitry Smirnov <onlyjob@debian.org> Sun, 19 Apr 2015 14:50:41 +1000
|
|
||||||
|
|
||||||
zoneminder (1.28.1-5) unstable; urgency=low
|
|
||||||
|
|
||||||
* Move handling of "/var/run/zm" and "/tmp/zm" from .service into .tmpfile.
|
|
||||||
Let dh_installinit do the job. Thanks, Andrew Bauer.
|
|
||||||
* Use dh_apache2 to install Apache conf file; remove old conf and symlink.
|
|
||||||
* Promote "libapache2-mod-php5 | php5-fpm" to Recommends.
|
|
||||||
* Build-Depends:
|
|
||||||
+ dh-linktree
|
|
||||||
+ cakephp (>= 2.6.3)
|
|
||||||
+ libjs-jquery
|
|
||||||
+ libjs-mootools
|
|
||||||
* Depends:
|
|
||||||
- libjs-jquery
|
|
||||||
- libjs-mootools
|
|
||||||
* Build-time replace bundled CakePHP with system one using "dh-linktree".
|
|
||||||
* Use "dh-linktree" to handle mootools and jquery symlinks.
|
|
||||||
|
|
||||||
-- Dmitry Smirnov <onlyjob@debian.org> Sun, 19 Apr 2015 11:45:01 +1000
|
|
||||||
|
|
||||||
zoneminder (1.28.1-4) unstable; urgency=low
|
|
||||||
|
|
||||||
* New patch to fix HTML export with USE_DEEP_STORAGE (closes: #723706).
|
|
||||||
* New "783.patch" to describe potential data loss in ZM_USE_DEEP_STORAGE.
|
|
||||||
* New patch to change default date format to region-neutral ISO notation
|
|
||||||
with time zone.
|
|
||||||
* Build sphinx documentation:
|
|
||||||
+ Install "zoneminder.1" man page.
|
|
||||||
+ Build-Depends += "python-sphinx | python3-sphinx"
|
|
||||||
+ Added commented "zoneminder-doc" package.
|
|
||||||
+ Added "docs.patch" to unlink distro-specific installation docs.
|
|
||||||
* rules:
|
|
||||||
+ set ZM_CONTENTDIR, ZM_SOCKDIR and ZM_TMPDIR.
|
|
||||||
+ remove mistakengly installed Perl module templates.
|
|
||||||
* Updated startup scripts to create ZM_TMPDIR.
|
|
||||||
* Hurd improvements:
|
|
||||||
+ New patch to add PATH_MAX definitions.
|
|
||||||
+ Build without MMAP support on Hurd.
|
|
||||||
+ libsys-mmap-perl [!hurd-any].
|
|
||||||
|
|
||||||
-- Dmitry Smirnov <onlyjob@debian.org> Mon, 06 Apr 2015 18:18:55 +1000
|
|
||||||
|
|
||||||
zoneminder (1.28.1-3) unstable; urgency=low
|
|
||||||
|
|
||||||
* Updated Apache2 and nginx configuration templates to support CGI.
|
|
||||||
* Updated README.Debian to document cgi-bin setup.
|
|
||||||
* Removed "/usr/share/zoneminder/www/cgi-bin" symlink.
|
|
||||||
* Added "apache2.patch" to correct Apache2 site configuration example.
|
|
||||||
* control: Suggests += "fcgiwrap".
|
|
||||||
* rules: added dh_systemd overrides to prevent automatic service
|
|
||||||
activation and start.
|
|
||||||
* Added note about manual service activation to README.Debian
|
|
||||||
(Closes: #781733).
|
|
||||||
|
|
||||||
-- Dmitry Smirnov <onlyjob@debian.org> Thu, 02 Apr 2015 23:20:20 +1100
|
|
||||||
|
|
||||||
zoneminder (1.28.1-2) unstable; urgency=low
|
|
||||||
|
|
||||||
* Removed word "Linux" from short package description.
|
|
||||||
* Build-Depends: do not require "libv4l-dev" on Hurd i.e. [!hurd-any].
|
|
||||||
* Added run-time Perl Depends:
|
|
||||||
+ libdbd-mysql-perl
|
|
||||||
+ libimage-info-perl
|
|
||||||
+ libmodule-load-conditional-perl
|
|
||||||
+ libnet-sftp-foreign-perl
|
|
||||||
+ liburi-encode-perl
|
|
||||||
* Prepare for package split: added commented "libzoneminder-perl"
|
|
||||||
and "zoneminder-dbg" packages to "debian/control".
|
|
||||||
* rules: do not install worthless ".packlist" file.
|
|
||||||
* Updated "libv4l1-videodev.h.patch" to fix v4lv1 detection in CMake.
|
|
||||||
|
|
||||||
-- Dmitry Smirnov <onlyjob@debian.org> Thu, 02 Apr 2015 13:25:19 +1100
|
|
||||||
|
|
||||||
zoneminder (1.28.1-1) unstable; urgency=low
|
|
||||||
|
|
||||||
[ Dmitry Smirnov <onlyjob@debian.org> ]
|
|
||||||
* New upstream release [February 2015].
|
|
||||||
* Upload to unstable.
|
|
||||||
* Disabled automatic database upgrades: post(inst|rm) scripts no longer
|
|
||||||
touch database or do unexpected stuff (Closes: #779254).
|
|
||||||
See README.Debian for details.
|
|
||||||
* Updated installation paths:
|
|
||||||
+ /usr/share/zoneminder --> /usr/share/zoneminder/www
|
|
||||||
+ /usr/lib/cgi-bin --> /usr/lib/zoneminder/cgi-bin
|
|
||||||
* Added logrotate config (Closes: #544826).
|
|
||||||
Thanks, Alberto Reyes.
|
|
||||||
* Native systemd service; "--with systemd" added to dh.
|
|
||||||
* Build with CMake instead of autoconf; rules clean-up.
|
|
||||||
* Build with all hardening.
|
|
||||||
* Build and install "zmupdate.pl.1" man page.
|
|
||||||
* Added nginx/php5-fpm configuration example.
|
|
||||||
* Install upstream "apache.conf" example.
|
|
||||||
* Described setup of Zoneminer web site and database in README.Debian.
|
|
||||||
* Install "/etc/zm/zm.conf" with tighter permissions.
|
|
||||||
* Added TODO.Debian.
|
|
||||||
* Added "debian/clean"; "debian/gbp.conf"; bug-presubj.
|
|
||||||
* Remove bundled Cake tests to take ~5 MB off big-usr-share.
|
|
||||||
* Standards-Version: 3.9.6; compat/debhelper to version 9.
|
|
||||||
* Vcs links to new git repository at collab-maint.
|
|
||||||
* Build-Depends:
|
|
||||||
+ dh-systemd
|
|
||||||
+ libgcrypt11-dev --> libgcrypt-dev
|
|
||||||
+ libcurl4-gnutls-dev
|
|
||||||
+ libvlc-dev
|
|
||||||
+ policykit-1 (required by "zmsystemctl.pl")
|
|
||||||
- dh-autoreconf, autoconf, automake
|
|
||||||
* Depends:
|
|
||||||
- apache2
|
|
||||||
- libapache2-mod-php5 (moved to Suggests)
|
|
||||||
- libpcre3 (invalid)
|
|
||||||
- libmodule-load-perl (obsolete; replaced with perl-modules)
|
|
||||||
- libarchive-tar-perl (obsolete; replaced with perl-modules)
|
|
||||||
- mysql-server (moved to Recommends, Closes: #759504).
|
|
||||||
- php5
|
|
||||||
+ libav-tools
|
|
||||||
+ libjs-jquery (replaces bundled component)
|
|
||||||
+ libjs-mootool (replaces bundled component)
|
|
||||||
+ libjson-any-perl (Closes: #690803).
|
|
||||||
+ perl-modules (Closes: #745819).
|
|
||||||
* Recommends:
|
|
||||||
+ apache2 | httpd
|
|
||||||
+ mysql-server | virtual-mysql-server (Closes: #732874).
|
|
||||||
* Suggests:
|
|
||||||
+ libapache2-mod-php5 | php5-fpm
|
|
||||||
+ logrotate
|
|
||||||
* Refreshed, renamed and re-ordered patches; added DEP-3 headers.
|
|
||||||
* Removed "vendor_perl" patch (applied-upstream).
|
|
||||||
* New patches:
|
|
||||||
+ cmake-fix-confpath.patch
|
|
||||||
+ cmake-gnutls.patch
|
|
||||||
+ cmake-nossl.patch
|
|
||||||
+ cmake.patch
|
|
||||||
+ format-hardening.patch
|
|
||||||
+ pod_man_fixes.patch
|
|
||||||
+ pod_name_fixes.patch
|
|
||||||
+ pod_zmupdate-to-pod2usage.patch
|
|
||||||
* Lintianisation (incomplete):
|
|
||||||
- extra-license-file
|
|
||||||
- init.d-script-missing-lsb-description
|
|
||||||
- init.d-script-does-not-source-init-functions
|
|
||||||
- privacy-breach-generic
|
|
||||||
- package-contains-empty-directory
|
|
||||||
- manpage-has-errors-from-pod2man
|
|
||||||
- manpage-has-bad-whatis-entry
|
|
||||||
- quilt-patch-missing-description
|
|
||||||
- no-dep5-copyright
|
|
||||||
* Lintian-overrides:
|
|
||||||
+ unusual-interpreter usr/bin/zmsystemctl.pl #!/usr/bin/pkexec
|
|
||||||
+ script-not-executable usr/share/zoneminder/www/api/*
|
|
||||||
+ script-with-language-extension usr/bin/*.pl
|
|
||||||
+ source-is-missing web/tools/mootools/mootools-*-yc.js
|
|
||||||
+ source-is-missing web/skins/*/js/jquery-1.4.2.min.js
|
|
||||||
+ source-contains-prebuilt-javascript-object
|
|
||||||
* Renamed files in "debian".
|
|
||||||
* watch: dfsg repacksuffix and dversionmangle.
|
|
||||||
* "debian/copyright" to Copyright-Format-1.0.
|
|
||||||
* Set myself as new Maintainer (Closes: #760314).
|
|
||||||
|
|
||||||
[ Vagrant Cascadian <vagrant@debian.org> ]
|
|
||||||
* Removed obsolete DM-Upload-Allowed flag.
|
|
||||||
* Update debian/watch to use tarballs from github.
|
|
||||||
* Add Build-Depends on libgcrypt11-dev (Closes: #745819).
|
|
||||||
* Use canonical alioth Vcs-Hg URL.
|
|
||||||
* debian/control: Add Build-Depends: libpolkit-gobject-1-dev.
|
|
||||||
* Removed configure flag "--enable-crashtrace=no", which is no longer
|
|
||||||
present upstream.
|
|
||||||
|
|
||||||
-- Dmitry Smirnov <onlyjob@debian.org> Tue, 31 Mar 2015 15:11:13 +1100
|
|
||||||
|
|
||||||
zoneminder (1.26.5-3.1) experimental; urgency=low
|
|
||||||
|
|
||||||
* Non-maintainer upload.
|
|
||||||
* Add libav10.patch and compile against libav10 (Closes: #739461)
|
|
||||||
|
|
||||||
-- Reinhard Tartler <siretart@tauware.de> Wed, 19 Mar 2014 00:31:22 +0000
|
|
||||||
|
|
||||||
zoneminder (1.26.5-3) unstable; urgency=low
|
|
||||||
|
|
||||||
|
|
||||||
* Previous release still didn't build on PPC - this has been corrected.
|
|
||||||
(Closes: #736516)
|
|
||||||
|
|
||||||
-- Peter Howard <pjh@northern-ridge.com.au> Tue, 4 Feb 2014 02:02:10 +1000
|
|
||||||
|
|
||||||
zoneminder (1.26.5-2) unstable; urgency=low
|
|
||||||
|
|
||||||
* Remove dependency on ffmpeg
|
|
||||||
(Closes: #721161)
|
|
||||||
|
|
||||||
* Builds again on non-x86 target architectures.
|
|
||||||
|
|
||||||
-- Peter Howard <pjh@northern-ridge.com.au> Thu, 23 Jan 2014 01:02:10 +1000
|
|
||||||
|
|
||||||
zoneminder (1.26.5-1) unstable; urgency=low
|
|
||||||
|
|
||||||
* New upstream version
|
|
||||||
(Closes: #694131)
|
|
||||||
* Change Build-Depends on libgnutls-dev to libgnutls-openssl-dev
|
|
||||||
(Closes: #731560)
|
|
||||||
-- Peter Howard <pjh@northern-ridge.com.au> Tue, 17 Dec 2013 01:02:10 +1000
|
|
||||||
|
|
||||||
zoneminder (1.25.0-4) unstable; urgency=high
|
|
||||||
|
|
||||||
* Add CVE-2013-0232 patch
|
|
||||||
[SECURITY] CVE-2013-0232: Shell escape commands with untrusted content.
|
|
||||||
Thanks to James McCoy <jamessan@debian.org> (Closes: #698910)
|
|
||||||
Thanks also to Salvatore Bonaccorso <carnil@debian.org>
|
|
||||||
|
|
||||||
-- Peter Howard <pjh@northern-ridge.com.au> Tue, 12 Jun 2013 12:02:10 +1000
|
|
||||||
|
|
||||||
zoneminder (1.25.0-3) unstable; urgency=low
|
|
||||||
|
|
||||||
* debian/rules: Export CFLAGS, CPPFLAGS, CXXFLAGS and LDFLAGS, to ensure
|
|
||||||
hardening build flags are enabled.
|
|
||||||
|
|
||||||
-- Vagrant Cascadian <vagrant@debian.org> Tue, 28 Aug 2012 12:10:03 -0700
|
|
||||||
|
|
||||||
zoneminder (1.25.0-2) unstable; urgency=low
|
|
||||||
|
|
||||||
[ Vagrant Cascadian ]
|
|
||||||
* Add a patch to disable checking for updated versions by default, as
|
|
||||||
upgrades should happen through package management.
|
|
||||||
* Use dpkg-buildflags in debian/rules to set default compiler flags.
|
|
||||||
* Ensure zoneminder is stopped before starting (Closes: #657407).
|
|
||||||
|
|
||||||
[ Peter Howard ]
|
|
||||||
* Fix postinst to add permission for table creation during upgrade
|
|
||||||
(Closes: #657407).
|
|
||||||
|
|
||||||
-- Vagrant Cascadian <vagrant@debian.org> Thu, 23 Aug 2012 12:40:34 -0700
|
|
||||||
|
|
||||||
zoneminder (1.25.0-1.1) unstable; urgency=low
|
|
||||||
|
|
||||||
* Non-maintainer upload.
|
|
||||||
* Fix "ftbfs with GCC-4.7": add patch Fix-FTBFS-with-gcc-4.7 from Cyril
|
|
||||||
Brulebois: fix missing <unistd.h> includes.
|
|
||||||
(Closes: #667428)
|
|
||||||
|
|
||||||
-- gregor herrmann <gregoa@debian.org> Sun, 13 May 2012 17:02:21 +0200
|
|
||||||
|
|
||||||
zoneminder (1.25.0-1) unstable; urgency=low
|
|
||||||
|
|
||||||
* Fix typo in libv4l1-videodev.h patch that caused v4l1 support to be
|
|
||||||
dropped.
|
|
||||||
* Fail to build if version in postinst doesn't match upstream version.
|
|
||||||
* Add Build-Depends: libavdevice-dev to fix MPEG streaming (Closes: #515558).
|
|
||||||
* debian/rules: Convert to using debhelper overrides.
|
|
||||||
* Set debian/compat to 7.
|
|
||||||
* Simplify debian/watch file.
|
|
||||||
* Refresh debian/patches/use_libjs-mootools.
|
|
||||||
* Refresh debian/patches/libv4l1-videodev.h.
|
|
||||||
* Remove dependencies on php4 and related packages.
|
|
||||||
* Remove build-dependencies on libmysqlclient14-dev and
|
|
||||||
libmysqlclient15-dev.
|
|
||||||
* Update Build-Depends to use libjpeg-dev instead of libjpeg62-dev
|
|
||||||
(Closes: #647114).
|
|
||||||
* Add patch to fix build by testing for C headers rather than C++ headers.
|
|
||||||
Thanks to Ryan Niebur. (Closes: #654230)
|
|
||||||
* Add a patch to fix build problems caused by API changes in libav 0.8.
|
|
||||||
Thanks again to Ryan Niebur. (Closes: #654230)
|
|
||||||
|
|
||||||
-- Vagrant Cascadian <vagrant@debian.org> Mon, 16 Jan 2012 11:58:05 -0800
|
|
||||||
|
|
||||||
zoneminder (1.24.4-1) unstable; urgency=low
|
|
||||||
|
|
||||||
[ Peter Howard ]
|
|
||||||
* Initial release of 1.24.4 (Closes: #634985).
|
|
||||||
- Fix 32/64-bit type declarations (Closes: #614404).
|
|
||||||
* Update patches.
|
|
||||||
|
|
||||||
[ Vagrant Cascadian ]
|
|
||||||
* Add patch to fix FTBFS by using libv4l1-videodev.h from libv4l-dev.
|
|
||||||
Thanks to Andreas Metzler for reporting the issue.
|
|
||||||
(Closes: #619813).
|
|
||||||
* Document adding the www-data user to the video group in README.Debian.
|
|
||||||
(Closes: #611324)
|
|
||||||
* Depend on libsys-mmap-perl to enable mapped memory support.
|
|
||||||
(Closes: #607331)
|
|
||||||
* Update libjs-mootools patch to use -nc variants (Closes: #635075).
|
|
||||||
* Depend on javascript-common, to ensure that /javascript is available in
|
|
||||||
the web server.
|
|
||||||
* Set the upstream version in postinst at build time.
|
|
||||||
* Use dh-autoreconf to properly clean up autogenerated files during build.
|
|
||||||
* Add Vcs-HG to debian/control.
|
|
||||||
* Add Build-Depends: libv4l-dev, libbz2-dev, dh-autoreconf, libsys-mmap-perl.
|
|
||||||
|
|
||||||
-- Vagrant Cascadian <vagrant@debian.org> Sun, 24 Jul 2011 16:44:30 +0200
|
|
||||||
|
|
||||||
zoneminder (1.24.2-9) unstable; urgency=low
|
|
||||||
|
|
||||||
* Apply patch from Ubuntu to fix FTBFS with ffmpeg 0.6:
|
|
||||||
- Add -D__STDC_CONSTANT_MACROS to CPPFLAGS (closes: 614080).
|
|
||||||
* Update Standards-Version to 3.9.1, no changes necessary.
|
|
||||||
|
|
||||||
-- Vagrant Cascadian <vagrant@debian.org> Sun, 20 Feb 2011 23:43:02 -0800
|
|
||||||
|
|
||||||
zoneminder (1.24.2-8) unstable; urgency=medium
|
|
||||||
|
|
||||||
[ Vagrant Cascadian ]
|
|
||||||
* Apply patch to fix V4L2 cameras without crop support (closes: #608790).
|
|
||||||
Thanks to piratebab.
|
|
||||||
* Add preinst script which aborts if dangerous symlinks exist.
|
|
||||||
(closes: #608793)
|
|
||||||
|
|
||||||
[ Peter Howard ]
|
|
||||||
* Added to README.Debian with info about images and events directories.
|
|
||||||
(closes: #608793)
|
|
||||||
|
|
||||||
-- Vagrant Cascadian <vagrant@debian.org> Sat, 15 Jan 2011 19:39:26 -0800
|
|
||||||
|
|
||||||
zoneminder (1.24.2-7) unstable; urgency=medium
|
|
||||||
|
|
||||||
* Do not set ownership of /var/cache/zoneminder when upgrading, which fixes a
|
|
||||||
regression causing upgrades to take inordinately long with large
|
|
||||||
installations (closes: #597040).
|
|
||||||
|
|
||||||
-- Vagrant Cascadian <vagrant@debian.org> Fri, 17 Sep 2010 11:24:41 -0700
|
|
||||||
|
|
||||||
zoneminder (1.24.2-6) unstable; urgency=low
|
|
||||||
|
|
||||||
* Only remove database on purge. This requires only creating the database if
|
|
||||||
it doesn't already exist, and upgrading the database only if the database
|
|
||||||
is an older version (closes: #497107).
|
|
||||||
|
|
||||||
* Do not prompt the user on database upgrades by using the --nointeractive
|
|
||||||
flag when calling zmupdate.pl from postinst (closes: #595902).
|
|
||||||
|
|
||||||
-- Vagrant Cascadian <vagrant@debian.org> Fri, 10 Sep 2010 10:06:06 -0700
|
|
||||||
|
|
||||||
zoneminder (1.24.2-5) unstable; urgency=low
|
|
||||||
|
|
||||||
[ Peter Howard ]
|
|
||||||
* Add zip dependency
|
|
||||||
(closes: #494261)
|
|
||||||
* Add debian/watch file
|
|
||||||
(closes: #545552)
|
|
||||||
* Use packaged libjs-mootools
|
|
||||||
(closes: #585590)
|
|
||||||
* Miscellaneous cleanups
|
|
||||||
|
|
||||||
[ Vagrant Cascadian ]
|
|
||||||
* Add vagrant@debian.org as uploader
|
|
||||||
* Update Standards-Version to 3.9.0, no changes necessary.
|
|
||||||
|
|
||||||
-- Vagrant Cascadian <vagrant@debian.org> Fri, 23 Jul 2010 18:12:50 -0500
|
|
||||||
|
|
||||||
zoneminder (1.24.2-4.1) unstable; urgency=low
|
|
||||||
|
|
||||||
* Non-maintainer upload.
|
|
||||||
* Fix "package removed, processes still running": apply patch to
|
|
||||||
debian/postinst by Vagrant Cascadian: use invoke-rc.d and run
|
|
||||||
mysql-related actions only when mysql is running (closes: #583648).
|
|
||||||
|
|
||||||
-- gregor herrmann <gregoa@debian.org> Thu, 01 Jul 2010 19:47:10 +0200
|
|
||||||
|
|
||||||
zoneminder (1.24.2-4) unstable; urgency=high
|
|
||||||
* Update init.d to list mysql dependency
|
|
||||||
(closes: #583505)
|
|
||||||
* Change dependency from libmime-perl to libmime-tools-perl
|
|
||||||
(closes: #585589)
|
|
||||||
* Problems in changelog format fixed
|
|
||||||
(closes: #585592)
|
|
||||||
* Fix debian-rules-ignores-make-clean-error
|
|
||||||
(closes: #585593)
|
|
||||||
-- Peter Howard <pjh@northern-ridge.com.au> Mon, 14 jun 2010 15:02:10 +1000
|
|
||||||
|
|
||||||
zoneminder (1.24.2-3) unstable; urgency=high
|
|
||||||
* Changes symbols to build with libjpeg8
|
|
||||||
(closes: #565326, #568327)
|
|
||||||
* Note: location of all perl files should have been fixed in previous release
|
|
||||||
(closes: #553096)
|
|
||||||
-- Peter Howard <pjh@northern-ridge.com.au> Mon, 26 apr 2010 15:02:10 +1000
|
|
||||||
|
|
||||||
zoneminder (1.24.2-2) unstable; urgency=high
|
|
||||||
|
|
||||||
* Remove custom perl parth from zmpkg.pl, fix location of manpages.
|
|
||||||
(closes: #551746, #553092)
|
|
||||||
* Fix GCC4.4 bug
|
|
||||||
(closes: #531717)
|
|
||||||
* Fix potential bug in postinst script
|
|
||||||
|
|
||||||
-- Peter Howard <pjh@northern-ridge.com.au> Sat, 14 Nov 2009 15:02:10 +1000
|
|
||||||
|
|
||||||
zoneminder (1.24.2-1) unstable; urgency=high
|
|
||||||
|
|
||||||
* Initial release of zoneminder 1.24.2
|
|
||||||
-- Peter Howard <pjh@northern-ridge.com.au> Fri, 11 Sep 2009 07:02:50 +1000
|
|
||||||
|
|
||||||
zoneminder (1.24.1-1) unstable; urgency=high
|
|
||||||
|
|
||||||
* Initial release of zoneminder 1.24.1, closing CVE-2008-3882,
|
|
||||||
CVE-2008-3881, CVE-2008-3880
|
|
||||||
(closes: #497640)
|
|
||||||
* Change syslog dependency to rsyslog.
|
|
||||||
(closes: #526918)
|
|
||||||
* Add missing perl dependency.
|
|
||||||
* Restore patch to disable "check for updates" by default.
|
|
||||||
* Removed spurious '$' in init script.
|
|
||||||
(closes: #486064)
|
|
||||||
* Change permission of zm.conf from 0600 to 0400 for CVE-2008-6755
|
|
||||||
(closes: #528252)
|
|
||||||
-- Peter Howard <pjh@northern-ridge.com.au> Sat, 16 May 2009 07:02:50 +1000
|
|
||||||
|
|
||||||
zoneminder (1.23.3-4) unstable; urgency=high
|
|
||||||
|
|
||||||
* update to get it building with latest unstable. Thanks to waldi@debian.org
|
|
||||||
(closes: #517569)
|
|
||||||
-- Peter Howard <pjh@northern-ridge.com.au> Thu, 16 Apr 2009 01:02:50 +1000
|
|
||||||
|
|
||||||
zoneminder (1.23.3-3) unstable; urgency=high
|
|
||||||
|
|
||||||
* ffmpeg confirmed working
|
|
||||||
(closes: #475145)
|
|
||||||
* Fix upgrade problem intrudouced in 1.23.3-1
|
|
||||||
(closes: #481637)
|
|
||||||
* Include libmime-lite-perl in dependencies
|
|
||||||
(closes: #486312)
|
|
||||||
-- Peter Howard <pjh@northern-ridge.com.au> Thu, 18 Sep 2008 01:02:50 +1000
|
|
||||||
|
|
||||||
zoneminder (1.23.3-2) unstable; urgency=high
|
|
||||||
|
|
||||||
* ffmpeg finally working?
|
|
||||||
|
|
||||||
-- Peter Howard <pjh@northern-ridge.com.au> Wed, 13 Aug 2008 01:02:50 +1000
|
|
||||||
|
|
||||||
zoneminder (1.23.3-1) unstable; urgency=high
|
|
||||||
|
|
||||||
* Initial version for 1.23.3 - security fix.
|
|
||||||
(closes: #479034)
|
|
||||||
|
|
||||||
-- Peter Howard <pjh@northern-ridge.com.au> Wed, 19 Mar 2008 01:02:50 +1000
|
|
||||||
|
|
||||||
zoneminder (1.23.2-2) unstable; urgency=low
|
|
||||||
|
|
||||||
* Update to init.d
|
|
||||||
(closes: #468856)
|
|
||||||
* Add dependency on logging daemon
|
|
||||||
(closes: #471277)
|
|
||||||
|
|
||||||
-- Peter Howard <pjh@northern-ridge.com.au> Wed, 19 Mar 2008 01:02:50 +1000
|
|
||||||
|
|
||||||
zoneminder (1.23.2-1) unstable; urgency=low
|
|
||||||
|
|
||||||
* Initial version for 1.23.2
|
|
||||||
(closes: #464152)
|
|
||||||
* Zoneminder 1.23.2 upstream includes fix for GCC 4.3
|
|
||||||
(closes: #454980)
|
|
||||||
* Includes ffmpeg patch by Alexander Kushnirenko <kushnir@uni-protvino.ru>
|
|
||||||
|
|
||||||
-- Peter Howard <pjh@northern-ridge.com.au> Sat, 01 Mar 2008 16:02:50 +1000
|
|
||||||
|
|
||||||
zoneminder (1.22.3-10) unstable; urgency=low
|
|
||||||
|
|
||||||
* Fix bug introduced in -9 where perl is put under /usr/local
|
|
||||||
(closes: #457507)
|
|
||||||
|
|
||||||
-- Peter Howard <pjh@northern-ridge.com.au> Mon, 24 Dec 2007 16:02:50 +1000
|
|
||||||
|
|
||||||
zoneminder (1.22.3-9) unstable; urgency=low
|
|
||||||
|
|
||||||
* Starting zoneminder via init script now invokes "zmfix -a"
|
|
||||||
(closes: #481637)
|
|
||||||
* Change apache2-mpm-prefork dependency to apache2
|
|
||||||
* Temp dir for export under /var/cache/zoneminder (but linked back to
|
|
||||||
/usr/share/zoneminder for now)
|
|
||||||
* Redo use of gnutls rather than openssl for md5 hashes
|
|
||||||
|
|
||||||
-- Peter Howard <pjh@northern-ridge.com.au> Mon, 10 Dec 2007 16:02:50 +1000
|
|
||||||
|
|
||||||
zoneminder (1.22.3-8) unstable; urgency=low
|
|
||||||
|
|
||||||
* Build now includes libpcre3
|
|
||||||
(closes: #437533)
|
|
||||||
* "Monitor Presets" patch now applied to package during build.
|
|
||||||
|
|
||||||
-- Peter Howard <pjh@northern-ridge.com.au> Sat, 18 Aug 2007 14:35:23 +1000
|
|
||||||
|
|
||||||
zoneminder (1.22.3-7) unstable; urgency=low
|
|
||||||
|
|
||||||
* Turn off debug trace and crash dump on build
|
|
||||||
(closes:#414857,#414891)
|
|
||||||
* Additional perl libraries added in dependencies
|
|
||||||
(closes:#416291)
|
|
||||||
* Change preferred PHP version from 4 to 5
|
|
||||||
-- Peter Howard <pjh@northern-ridge.com.au> Sun, 29 Jul 2007 15:11:13 +1000
|
|
||||||
|
|
||||||
zoneminder (1.22.3-6) unstable; urgency=low
|
|
||||||
|
|
||||||
* Removed a similar bash only statement from zmpkg.pl
|
|
||||||
(closes:414882)
|
|
||||||
|
|
||||||
-- Peter Howard <pjh@northern-ridge.com.au> Sat, 14 Apr 2007 11:46:56 +1000
|
|
||||||
|
|
||||||
zoneminder (1.22.3-5) unstable; urgency=low
|
|
||||||
|
|
||||||
* Installs with "phone home" feature turned off by default, and permissions
|
|
||||||
on /etc/zm/zm.conf fixed (now the 0600 it s hould be)
|
|
||||||
(closes:415349)
|
|
||||||
* Removed "stupid bash-ism" on mysqld check in postinst file.
|
|
||||||
|
|
||||||
-- Peter Howard <pjh@northern-ridge.com.au> Fri, 6 Apr 2007 15:50:00 +1000
|
|
||||||
|
|
||||||
zoneminder (1.22.3-4) unstable; urgency=low
|
|
||||||
|
|
||||||
* Put libmysqlclient-15-dev in front of -14-dev so sbuild works
|
|
||||||
(closes: #414410)
|
|
||||||
|
|
||||||
-- Peter Howard <pjh@northern-ridge.com.au> Mon, 12 Mar 2007 11:38:56 +1100
|
|
||||||
|
|
||||||
zoneminder (1.22.3-3) unstable; urgency=low
|
|
||||||
|
|
||||||
* Clean up of postinstall, postrm ; user "zm" definitely was a mistake
|
|
||||||
* Also in postinstall: check and start MySQL if it's not running.
|
|
||||||
* init.d script now checks if zoneminder isn't running and still returns 0
|
|
||||||
(which helps uninstalling)
|
|
||||||
* Addition of php5 dependency options as well as php4.
|
|
||||||
|
|
||||||
-- Peter Howard <pjh@northern-ridge.com.au> Mon, 26 Feb 2007 10:40:52 +1100
|
|
||||||
|
|
||||||
zoneminder (1.22.3-2) unstable; urgency=low
|
|
||||||
|
|
||||||
* Added zmuser in the mysql creation; this should fix the install problem
|
|
||||||
for people, but needs to be cleaned up (in -3)
|
|
||||||
|
|
||||||
-- Peter Howard <pjh@northern-ridge.com.au> Fri, 16 Feb 2007 14:16:03 +1100
|
|
||||||
|
|
||||||
zoneminder (1.22.3-1) unstable; urgency=low
|
|
||||||
|
|
||||||
* Initial Version. (closes: #248393)
|
|
||||||
* Patched out use of openssl; uses gnutls instead for MD5 hashes.
|
|
||||||
* Removed MakeMaker-inserted Perl licensing (with authors permission) in
|
|
||||||
various scripts; replaced with GPL.
|
|
||||||
|
|
||||||
-- Peter Howard <pjh@northern-ridge.com.au> Wed, 7 Feb 2007 14:09:01 +1100
|
|
|
@ -25,7 +25,10 @@ override_dh_auto_configure:
|
||||||
-DZM_SOCKDIR="/var/run/zm" \
|
-DZM_SOCKDIR="/var/run/zm" \
|
||||||
-DZM_TMPDIR="/tmp/zm" \
|
-DZM_TMPDIR="/tmp/zm" \
|
||||||
-DZM_CGIDIR="/usr/lib/zoneminder/cgi-bin" \
|
-DZM_CGIDIR="/usr/lib/zoneminder/cgi-bin" \
|
||||||
-DZM_CONTENTDIR="/var/cache/zoneminder"
|
-DZM_CONTENTDIR="/var/cache/zoneminder" \
|
||||||
|
-DZM_DIR_EVENTS="/var/cache/zoneminder/events" \
|
||||||
|
-DZM_DIR_IMAGES="/var/cache/zoneminder/images" \
|
||||||
|
-DZM_PATH_ZMS="/zm/cgi-bin/nph-zms"
|
||||||
|
|
||||||
override_dh_clean:
|
override_dh_clean:
|
||||||
dh_clean $(MANPAGES1)
|
dh_clean $(MANPAGES1)
|
||||||
|
|
|
@ -4,3 +4,5 @@ var/cache/zoneminder/events
|
||||||
var/cache/zoneminder/images
|
var/cache/zoneminder/images
|
||||||
var/cache/zoneminder/temp
|
var/cache/zoneminder/temp
|
||||||
usr/share/zoneminder/db
|
usr/share/zoneminder/db
|
||||||
|
etc/zm/
|
||||||
|
etc/zm/conf.d
|
||||||
|
|
|
@ -427,23 +427,6 @@ our @options = (
|
||||||
type => $types{string},
|
type => $types{string},
|
||||||
category => 'system',
|
category => 'system',
|
||||||
},
|
},
|
||||||
{
|
|
||||||
name => 'ZM_DIR_EVENTS',
|
|
||||||
default => 'events',
|
|
||||||
description => 'Directory where events are stored',
|
|
||||||
help => q`
|
|
||||||
This is the path to the events directory where all the event
|
|
||||||
images and other miscellaneous files are stored. CAUTION: The
|
|
||||||
directory you specify here cannot be outside the web root. This
|
|
||||||
is a common mistake. Most users should never change this value.
|
|
||||||
If you intend to record events to a second disk or network
|
|
||||||
share, then you should mount the drive or share directly to the
|
|
||||||
ZoneMinder events folder or follow the instructions in the
|
|
||||||
ZoneMinder Wiki titled Using a dedicated Hard Drive.
|
|
||||||
`,
|
|
||||||
type => $types{directory},
|
|
||||||
category => 'paths',
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
name => 'ZM_USE_DEEP_STORAGE',
|
name => 'ZM_USE_DEEP_STORAGE',
|
||||||
default => 'yes',
|
default => 'yes',
|
||||||
|
@ -465,68 +448,6 @@ our @options = (
|
||||||
type => $types{boolean},
|
type => $types{boolean},
|
||||||
category => 'hidden',
|
category => 'hidden',
|
||||||
},
|
},
|
||||||
{
|
|
||||||
name => 'ZM_DIR_IMAGES',
|
|
||||||
default => 'images',
|
|
||||||
description => 'Directory where the images that the ZoneMinder client generates are stored',
|
|
||||||
help => q`
|
|
||||||
ZoneMinder generates a myriad of images, mostly of which are
|
|
||||||
associated with events. For those that aren't this is where
|
|
||||||
they go. CAUTION: The directory you specify here cannot be
|
|
||||||
outside the web root. This is a common mistake. Most users
|
|
||||||
should never change this value. If you intend to save images to
|
|
||||||
a second disk or network share, then you should mount the drive
|
|
||||||
or share directly to the ZoneMinder images folder or follow the
|
|
||||||
instructions in the ZoneMinder Wiki titled Using a dedicated
|
|
||||||
Hard Drive.
|
|
||||||
`,
|
|
||||||
type => $types{directory},
|
|
||||||
category => 'paths',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name => 'ZM_DIR_SOUNDS',
|
|
||||||
default => 'sounds',
|
|
||||||
description => 'Directory to the sounds that the ZoneMinder client can use',
|
|
||||||
help => q`
|
|
||||||
ZoneMinder can optionally play a sound file when an alarm is
|
|
||||||
detected. This indicates where to look for this file. CAUTION:
|
|
||||||
The directory you specify here cannot be outside the web root.
|
|
||||||
Most users should never change this value.
|
|
||||||
`,
|
|
||||||
type => $types{directory},
|
|
||||||
category => 'paths',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name => 'ZM_DIR_EXPORTS',
|
|
||||||
default => '@ZM_TMPDIR@',
|
|
||||||
description => 'Directory where exported archives are stored',
|
|
||||||
help => q`
|
|
||||||
This is the path to the exports directory where exported
|
|
||||||
tar.gz and zip archives are stored. By default this points to
|
|
||||||
ZoneMinder's temp folder, which often sits in ram. Since exported
|
|
||||||
archives can potentially become large, it is a good idea to move
|
|
||||||
this folder to some other location on machines with low memory.
|
|
||||||
`,
|
|
||||||
type => $types{directory},
|
|
||||||
category => 'paths',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name => 'ZM_PATH_ZMS',
|
|
||||||
default => '/cgi-bin/nph-zms',
|
|
||||||
description => 'Web path to zms streaming server',
|
|
||||||
help => q`
|
|
||||||
The ZoneMinder streaming server is required to send streamed
|
|
||||||
images to your browser. It will be installed into the cgi-bin
|
|
||||||
path given at configuration time. This option determines what
|
|
||||||
the web path to the server is rather than the local path on
|
|
||||||
your machine. Ordinarily the streaming server runs in
|
|
||||||
parser-header mode however if you experience problems with
|
|
||||||
streaming you can change this to non-parsed-header (nph) mode
|
|
||||||
by changing 'zms' to 'nph-zms'.
|
|
||||||
`,
|
|
||||||
type => $types{rel_path},
|
|
||||||
category => 'paths',
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
name => 'ZM_COLOUR_JPEG_FILES',
|
name => 'ZM_COLOUR_JPEG_FILES',
|
||||||
default => 'no',
|
default => 'no',
|
||||||
|
@ -1471,83 +1392,6 @@ our @options = (
|
||||||
type => $types{boolean},
|
type => $types{boolean},
|
||||||
category => 'logging',
|
category => 'logging',
|
||||||
},
|
},
|
||||||
{
|
|
||||||
name => 'ZM_PATH_MAP',
|
|
||||||
default => '/dev/shm',
|
|
||||||
description => 'Path to the mapped memory files that that ZoneMinder can use',
|
|
||||||
help => q`
|
|
||||||
ZoneMinder has historically used IPC shared memory for shared
|
|
||||||
data between processes. This has it's advantages and
|
|
||||||
limitations. This version of ZoneMinder can use an alternate
|
|
||||||
method, mapped memory, instead with can be enabled with the
|
|
||||||
--enable--mmap directive to configure. This requires less
|
|
||||||
system configuration and is generally more flexible. However it
|
|
||||||
requires each shared data segment to map onto a filesystem
|
|
||||||
file. This option indicates where those mapped files go. You
|
|
||||||
should ensure that this location has sufficient space for these
|
|
||||||
files and for the best performance it should be a tmpfs file
|
|
||||||
system or ramdisk otherwise disk access may render this method
|
|
||||||
slower than the regular shared memory one.
|
|
||||||
`,
|
|
||||||
type => $types{abs_path},
|
|
||||||
category => 'paths',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name => 'ZM_PATH_SOCKS',
|
|
||||||
default => '@ZM_SOCKDIR@',
|
|
||||||
description => 'Path to the various Unix domain socket files that ZoneMinder uses',
|
|
||||||
help => q`
|
|
||||||
ZoneMinder generally uses Unix domain sockets where possible.
|
|
||||||
This reduces the need for port assignments and prevents
|
|
||||||
external applications from possibly compromising the daemons.
|
|
||||||
However each Unix socket requires a .sock file to be created.
|
|
||||||
This option indicates where those socket files go.
|
|
||||||
`,
|
|
||||||
type => $types{abs_path},
|
|
||||||
category => 'paths',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name => 'ZM_PATH_LOGS',
|
|
||||||
default => '@ZM_LOGDIR@',
|
|
||||||
description => 'Path to the various logs that the ZoneMinder daemons generate',
|
|
||||||
help => q`
|
|
||||||
There are various daemons that are used by ZoneMinder to
|
|
||||||
perform various tasks. Most generate helpful log files and this
|
|
||||||
is where they go. They can be deleted if not required for
|
|
||||||
debugging.
|
|
||||||
`,
|
|
||||||
type => $types{abs_path},
|
|
||||||
category => 'paths',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name => 'ZM_PATH_SWAP',
|
|
||||||
default => '@ZM_TMPDIR@',
|
|
||||||
description => 'Path to location for temporary swap images used in streaming',
|
|
||||||
help => q`
|
|
||||||
Buffered playback requires temporary swap images to be stored
|
|
||||||
for each instance of the streaming daemons. This option
|
|
||||||
determines where these images will be stored. The images will
|
|
||||||
actually be stored in sub directories beneath this location and
|
|
||||||
will be automatically cleaned up after a period of time.
|
|
||||||
`,
|
|
||||||
type => $types{abs_path},
|
|
||||||
category => 'paths',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name => 'ZM_PATH_ARP',
|
|
||||||
default => '',
|
|
||||||
description => 'Path to a supported ARP tool',
|
|
||||||
help => q`
|
|
||||||
The camera probe function uses Address Resolution Protocol in
|
|
||||||
order to find known devices on the network. Optionally supply
|
|
||||||
the full path to \"ip neigh\", \"arp -a\", or any other tool on
|
|
||||||
your system that returns ip/mac address pairs. If this field is
|
|
||||||
left empty, ZoneMinder will search for the command \"arp\" and
|
|
||||||
attempt to use that.
|
|
||||||
`,
|
|
||||||
type => $types{abs_path},
|
|
||||||
category => 'paths',
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
name => 'ZM_WEB_TITLE_PREFIX',
|
name => 'ZM_WEB_TITLE_PREFIX',
|
||||||
default => 'ZM',
|
default => 'ZM',
|
||||||
|
|
|
@ -311,6 +311,7 @@ if ( $migrateEvents ) {
|
||||||
}
|
}
|
||||||
if ( $freshen ) {
|
if ( $freshen ) {
|
||||||
print( "\nFreshening configuration in database\n" );
|
print( "\nFreshening configuration in database\n" );
|
||||||
|
migratePaths();
|
||||||
ZoneMinder::Config::loadConfigFromDB();
|
ZoneMinder::Config::loadConfigFromDB();
|
||||||
ZoneMinder::Config::saveConfigToDB();
|
ZoneMinder::Config::saveConfigToDB();
|
||||||
}
|
}
|
||||||
|
@ -458,6 +459,7 @@ if ( $version ) {
|
||||||
print( "\nUpgrading database to version ".ZM_VERSION."\n" );
|
print( "\nUpgrading database to version ".ZM_VERSION."\n" );
|
||||||
|
|
||||||
# Update config first of all
|
# Update config first of all
|
||||||
|
migratePaths();
|
||||||
ZoneMinder::Config::loadConfigFromDB();
|
ZoneMinder::Config::loadConfigFromDB();
|
||||||
ZoneMinder::Config::saveConfigToDB();
|
ZoneMinder::Config::saveConfigToDB();
|
||||||
|
|
||||||
|
@ -969,3 +971,61 @@ if ( $version ) {
|
||||||
}
|
}
|
||||||
zmDbDisconnect();
|
zmDbDisconnect();
|
||||||
exit( 0 );
|
exit( 0 );
|
||||||
|
|
||||||
|
sub migratePaths {
|
||||||
|
|
||||||
|
my $customConfigFile = "@ZM_CONFIG_SUBDIR@/zmcustom.conf";
|
||||||
|
|
||||||
|
if ( (! -e $customConfigFile ) && ( ZM_VERSION ge '1.31.0' ) && ($Config{ZM_DYN_DB_VERSION} lt '1.31.1') ) {
|
||||||
|
|
||||||
|
my %customConfig;
|
||||||
|
|
||||||
|
# Check the traditional default values for the variables previsouly found under Options -> Paths
|
||||||
|
if ( $Config{ZM_DIR_EVENTS} ne "events" ) {
|
||||||
|
$customConfig{ZM_DIR_EVENTS} = $Config{ZM_DIR_EVENTS};
|
||||||
|
}
|
||||||
|
if ( $Config{ZM_DIR_IMAGES} ne "images" ) {
|
||||||
|
$customConfig{ZM_DIR_IMAGES} = $Config{ZM_DIR_IMAGES};
|
||||||
|
}
|
||||||
|
if ( $Config{ZM_DIR_SOUNDS} ne "sounds" ) {
|
||||||
|
$customConfig{ZM_DIR_SOUNDS} = $Config{ZM_DIR_SOUNDS};
|
||||||
|
}
|
||||||
|
if ( $Config{ZM_PATH_ZMS} ne "@ZM_PATH_ZMS@" ) {
|
||||||
|
$customConfig{ZM_PATH_ZMS} = $Config{ZM_PATH_ZMS};
|
||||||
|
}
|
||||||
|
if ( $Config{ZM_PATH_MAP} ne "/dev/shm" ) {
|
||||||
|
$customConfig{ZM_PATH_MAP} = $Config{ZM_PATH_MAP};
|
||||||
|
}
|
||||||
|
if ( $Config{ZM_PATH_SOCKS} ne "@ZM_SOCKDIR@" ) {
|
||||||
|
$customConfig{ZM_PATH_SOCKS} = $Config{ZM_PATH_SOCKS};
|
||||||
|
}
|
||||||
|
if ( $Config{ZM_PATH_LOGS} ne "@ZM_LOGDIR@" ) {
|
||||||
|
$customConfig{ZM_PATH_LOGS} = $Config{ZM_PATH_LOGS};
|
||||||
|
}
|
||||||
|
if ( $Config{ZM_PATH_SWAP} ne "@ZM_TMPDIR@" ) {
|
||||||
|
$customConfig{ZM_PATH_SWAP} = $Config{ZM_PATH_SWAP};
|
||||||
|
}
|
||||||
|
if ( $Config{ZM_PATH_ARP} ne "" ) {
|
||||||
|
$customConfig{ZM_PATH_ARP} = $Config{ZM_PATH_ARP};
|
||||||
|
}
|
||||||
|
|
||||||
|
# If any variables differ from their expected default value,
|
||||||
|
# save them to a config file before they get purged from the database
|
||||||
|
if ( %customConfig ) {
|
||||||
|
print("\nMigrating custom config values from Options -> Paths\nto $customConfigFile.\n");
|
||||||
|
print("\nPlease verify these values before starting ZoneMinder.\n\n");
|
||||||
|
open(my $fh, '>', $customConfigFile) or die "Could open $customConfigFile for writing: $!.";
|
||||||
|
print $fh "# These values were autogenerated by zmupdate.pl\n";
|
||||||
|
print $fh "# You may edit these values. ZoneMinder will not overwrite them.\n";
|
||||||
|
print $fh "#\n\n";
|
||||||
|
while (my ($key, $value) = each %customConfig) {
|
||||||
|
print $fh "$key=$value\n";
|
||||||
|
}
|
||||||
|
close $fh;
|
||||||
|
my $gid = getgrnam("@ZM_WEB_GROUP@");
|
||||||
|
chown -1, $gid, $customConfigFile;
|
||||||
|
chmod 0640, $customConfigFile;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
snprintf( swap_path, sizeof(swap_path), "%s/zmswap-m%d/zmswap-q%06d", config.path_swap, monitor->Id(), connkey );
|
snprintf( swap_path, sizeof(swap_path), "%s/zmswap-m%d/zmswap-q%06d", staticConfig.PATH_SWAP.c_str(), monitor->Id(), connkey );
|
||||||
|
|
||||||
int len = snprintf(NULL, 0, "/zmswap-m%d", monitor->Id());
|
int len = snprintf(NULL, 0, "/zmswap-m%d", monitor->Id());
|
||||||
|
|
||||||
|
|
||||||
int swap_path_length = strlen(config.path_swap) + snprintf(NULL, 0, "/zmswap-m%d", monitor->Id() ) + snprintf(NULL, 0, "/zmswap-q%06d", connkey ) + 1; // +1 for NULL terminator
|
int swap_path_length = strlen(staticConfig.PATH_SWAP.c_str()) + snprintf(NULL, 0, "/zmswap-m%d", monitor->Id() ) + snprintf(NULL, 0, "/zmswap-q%06d", connkey ) + 1; // +1 for NULL terminator
|
||||||
|
|
||||||
if ( connkey && playback_buffer > 0 ) {
|
if ( connkey && playback_buffer > 0 ) {
|
||||||
|
|
||||||
|
@ -11,8 +11,8 @@ int len = snprintf(NULL, 0, "/zmswap-m%d", monitor->Id());
|
||||||
Error( "Swap Path is too long. %d > %d ", swap_path_length+max_swap_len_suffix, PATH_MAX );
|
Error( "Swap Path is too long. %d > %d ", swap_path_length+max_swap_len_suffix, PATH_MAX );
|
||||||
} else {
|
} else {
|
||||||
swap_path = (char *)malloc( swap_path_length+max_swap_len_suffix );
|
swap_path = (char *)malloc( swap_path_length+max_swap_len_suffix );
|
||||||
Debug( 3, "Checking swap image path %s", config.path_swap );
|
Debug( 3, "Checking swap image path %s", staticConfig.PATH_SWAP.c_str() );
|
||||||
strncpy( swap_path, config.path_swap, swap_path_length );
|
strncpy( swap_path, staticConfig.PATH_SWAP.c_str(), swap_path_length );
|
||||||
if ( checkSwapPath( swap_path, false ) ) {
|
if ( checkSwapPath( swap_path, false ) ) {
|
||||||
snprintf( &(swap_path[swap_path_length]), max_swap_len_suffix, "/zmswap-m%d", monitor->Id() );
|
snprintf( &(swap_path[swap_path_length]), max_swap_len_suffix, "/zmswap-m%d", monitor->Id() );
|
||||||
if ( checkSwapPath( swap_path, true ) ) {
|
if ( checkSwapPath( swap_path, true ) ) {
|
||||||
|
|
|
@ -30,9 +30,9 @@
|
||||||
|
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <sys/uio.h>
|
||||||
|
|
||||||
#if defined(BSD)
|
#if defined(BSD)
|
||||||
#include <sys/uio.h>
|
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -158,6 +158,26 @@ void process_configfile( char* configFile) {
|
||||||
staticConfig.SERVER_NAME = std::string(val_ptr);
|
staticConfig.SERVER_NAME = std::string(val_ptr);
|
||||||
else if ( strcasecmp( name_ptr, "ZM_SERVER_ID" ) == 0 )
|
else if ( strcasecmp( name_ptr, "ZM_SERVER_ID" ) == 0 )
|
||||||
staticConfig.SERVER_ID = atoi(val_ptr);
|
staticConfig.SERVER_ID = atoi(val_ptr);
|
||||||
|
else if ( strcasecmp( name_ptr, "ZM_DIR_EVENTS" ) == 0 )
|
||||||
|
staticConfig.DIR_EVENTS = std::string(val_ptr);
|
||||||
|
else if ( strcasecmp( name_ptr, "ZM_DIR_IMAGES" ) == 0 )
|
||||||
|
staticConfig.DIR_IMAGES = std::string(val_ptr);
|
||||||
|
else if ( strcasecmp( name_ptr, "ZM_DIR_SOUNDS" ) == 0 )
|
||||||
|
staticConfig.DIR_SOUNDS = std::string(val_ptr);
|
||||||
|
else if ( strcasecmp( name_ptr, "ZM_DIR_EXPORTS" ) == 0 )
|
||||||
|
staticConfig.DIR_EXPORTS = std::string(val_ptr);
|
||||||
|
else if ( strcasecmp( name_ptr, "ZM_PATH_ZMS" ) == 0 )
|
||||||
|
staticConfig.PATH_ZMS = std::string(val_ptr);
|
||||||
|
else if ( strcasecmp( name_ptr, "ZM_PATH_MAP" ) == 0 )
|
||||||
|
staticConfig.PATH_MAP = std::string(val_ptr);
|
||||||
|
else if ( strcasecmp( name_ptr, "ZM_PATH_SOCKS" ) == 0 )
|
||||||
|
staticConfig.PATH_SOCKS = std::string(val_ptr);
|
||||||
|
else if ( strcasecmp( name_ptr, "ZM_PATH_LOGS" ) == 0 )
|
||||||
|
staticConfig.PATH_LOGS = std::string(val_ptr);
|
||||||
|
else if ( strcasecmp( name_ptr, "ZM_PATH_SWAP" ) == 0 )
|
||||||
|
staticConfig.PATH_SWAP = std::string(val_ptr);
|
||||||
|
else if ( strcasecmp( name_ptr, "ZM_PATH_ARP" ) == 0 )
|
||||||
|
staticConfig.PATH_ARP = std::string(val_ptr);
|
||||||
else {
|
else {
|
||||||
// We ignore this now as there may be more parameters than the
|
// We ignore this now as there may be more parameters than the
|
||||||
// c/c++ binaries are bothered about
|
// c/c++ binaries are bothered about
|
||||||
|
|
|
@ -70,6 +70,16 @@ struct StaticConfig
|
||||||
std::string PATH_WEB;
|
std::string PATH_WEB;
|
||||||
std::string SERVER_NAME;
|
std::string SERVER_NAME;
|
||||||
unsigned int SERVER_ID;
|
unsigned int SERVER_ID;
|
||||||
|
std::string DIR_EVENTS;
|
||||||
|
std::string DIR_IMAGES;
|
||||||
|
std::string DIR_SOUNDS;
|
||||||
|
std::string DIR_EXPORTS;
|
||||||
|
std::string PATH_ZMS;
|
||||||
|
std::string PATH_MAP;
|
||||||
|
std::string PATH_SOCKS;
|
||||||
|
std::string PATH_LOGS;
|
||||||
|
std::string PATH_SWAP;
|
||||||
|
std::string PATH_ARP;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern StaticConfig staticConfig;
|
extern StaticConfig staticConfig;
|
||||||
|
|
|
@ -77,10 +77,14 @@ Event::Event( Monitor *p_monitor, struct timeval p_start_time, const std::string
|
||||||
gettimeofday( &start_time, 0 );
|
gettimeofday( &start_time, 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
static char sql[ZM_SQL_MED_BUFSIZ];
|
unsigned int state_id = 0;
|
||||||
|
if ( MYSQL_ROW dbrow = zmDbFetchOne( "SELECT Id FROM States WHERE IsActive=1" ) ) {
|
||||||
|
state_id = atoi(dbrow[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static char sql[ZM_SQL_MED_BUFSIZ];
|
||||||
struct tm *stime = localtime( &start_time.tv_sec );
|
struct tm *stime = localtime( &start_time.tv_sec );
|
||||||
snprintf( sql, sizeof(sql), "insert into Events ( MonitorId, Name, StartTime, Width, Height, Cause, Notes, Videoed ) values ( %d, 'New Event', from_unixtime( %ld ), %d, %d, '%s', '%s', '%d' )", monitor->Id(), start_time.tv_sec, monitor->Width(), monitor->Height(), cause.c_str(), notes.c_str(), videoEvent );
|
snprintf( sql, sizeof(sql), "insert into Events ( MonitorId, Name, StartTime, Width, Height, Cause, Notes, StateId, Videoed ) values ( %d, 'New Event', from_unixtime( %ld ), %d, %d, '%s', '%s', '%d', '%d' )", monitor->Id(), start_time.tv_sec, monitor->Width(), monitor->Height(), cause.c_str(), notes.c_str(), state_id, videoEvent );
|
||||||
if ( mysql_query( &dbconn, sql ) ) {
|
if ( mysql_query( &dbconn, sql ) ) {
|
||||||
Error( "Can't insert event: %s. sql was (%s)", mysql_error( &dbconn ), sql );
|
Error( "Can't insert event: %s. sql was (%s)", mysql_error( &dbconn ), sql );
|
||||||
exit( mysql_errno( &dbconn ) );
|
exit( mysql_errno( &dbconn ) );
|
||||||
|
@ -100,7 +104,7 @@ Event::Event( Monitor *p_monitor, struct timeval p_start_time, const std::string
|
||||||
|
|
||||||
if ( config.use_deep_storage ) {
|
if ( config.use_deep_storage ) {
|
||||||
char *path_ptr = path;
|
char *path_ptr = path;
|
||||||
path_ptr += snprintf( path_ptr, sizeof(path), "%s/%d", config.dir_events, monitor->Id() );
|
path_ptr += snprintf( path_ptr, sizeof(path), "%s/%d", staticConfig.DIR_EVENTS.c_str(), monitor->Id() );
|
||||||
|
|
||||||
int dt_parts[6];
|
int dt_parts[6];
|
||||||
dt_parts[0] = stime->tm_year-100;
|
dt_parts[0] = stime->tm_year-100;
|
||||||
|
@ -136,7 +140,7 @@ Event::Event( Monitor *p_monitor, struct timeval p_start_time, const std::string
|
||||||
if ( symlink( time_path, id_file ) < 0 )
|
if ( symlink( time_path, id_file ) < 0 )
|
||||||
Fatal( "Can't symlink %s -> %s: %s", id_file, path, strerror(errno));
|
Fatal( "Can't symlink %s -> %s: %s", id_file, path, strerror(errno));
|
||||||
} else {
|
} else {
|
||||||
snprintf( path, sizeof(path), "%s/%d/%d", config.dir_events, monitor->Id(), id );
|
snprintf( path, sizeof(path), "%s/%d/%d", staticConfig.DIR_EVENTS.c_str(), monitor->Id(), id );
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
stat( path, &statbuf );
|
stat( path, &statbuf );
|
||||||
|
@ -550,7 +554,7 @@ void Event::AddFrame( Image *image, struct timeval timestamp, int score, Image *
|
||||||
if ( config.record_diag_images ) {
|
if ( config.record_diag_images ) {
|
||||||
char diag_glob[PATH_MAX] = "";
|
char diag_glob[PATH_MAX] = "";
|
||||||
|
|
||||||
snprintf( diag_glob, sizeof(diag_glob), "%s/%d/diag-*.jpg", config.dir_events, monitor->Id() );
|
snprintf( diag_glob, sizeof(diag_glob), "%s/%d/diag-*.jpg", staticConfig.DIR_EVENTS.c_str(), monitor->Id() );
|
||||||
glob_t pglob;
|
glob_t pglob;
|
||||||
int glob_status = glob( diag_glob, 0, 0, &pglob );
|
int glob_status = glob( diag_glob, 0, 0, &pglob );
|
||||||
if ( glob_status != 0 ) {
|
if ( glob_status != 0 ) {
|
||||||
|
@ -674,15 +678,15 @@ bool EventStream::loadEventData( int event_id ) {
|
||||||
event_data->start_time = atoi(dbrow[2]);
|
event_data->start_time = atoi(dbrow[2]);
|
||||||
if ( config.use_deep_storage ) {
|
if ( config.use_deep_storage ) {
|
||||||
struct tm *event_time = localtime( &event_data->start_time );
|
struct tm *event_time = localtime( &event_data->start_time );
|
||||||
if ( config.dir_events[0] == '/' )
|
if ( staticConfig.DIR_EVENTS.c_str()[0] == '/' )
|
||||||
snprintf( event_data->path, sizeof(event_data->path), "%s/%ld/%02d/%02d/%02d/%02d/%02d/%02d", config.dir_events, event_data->monitor_id, event_time->tm_year-100, event_time->tm_mon+1, event_time->tm_mday, event_time->tm_hour, event_time->tm_min, event_time->tm_sec );
|
snprintf( event_data->path, sizeof(event_data->path), "%s/%ld/%02d/%02d/%02d/%02d/%02d/%02d", staticConfig.DIR_EVENTS.c_str(), event_data->monitor_id, event_time->tm_year-100, event_time->tm_mon+1, event_time->tm_mday, event_time->tm_hour, event_time->tm_min, event_time->tm_sec );
|
||||||
else
|
else
|
||||||
snprintf( event_data->path, sizeof(event_data->path), "%s/%s/%ld/%02d/%02d/%02d/%02d/%02d/%02d", staticConfig.PATH_WEB.c_str(), config.dir_events, event_data->monitor_id, event_time->tm_year-100, event_time->tm_mon+1, event_time->tm_mday, event_time->tm_hour, event_time->tm_min, event_time->tm_sec );
|
snprintf( event_data->path, sizeof(event_data->path), "%s/%s/%ld/%02d/%02d/%02d/%02d/%02d/%02d", staticConfig.PATH_WEB.c_str(), staticConfig.DIR_EVENTS.c_str(), event_data->monitor_id, event_time->tm_year-100, event_time->tm_mon+1, event_time->tm_mday, event_time->tm_hour, event_time->tm_min, event_time->tm_sec );
|
||||||
} else {
|
} else {
|
||||||
if ( config.dir_events[0] == '/' )
|
if ( staticConfig.DIR_EVENTS.c_str()[0] == '/' )
|
||||||
snprintf( event_data->path, sizeof(event_data->path), "%s/%ld/%ld", config.dir_events, event_data->monitor_id, event_data->event_id );
|
snprintf( event_data->path, sizeof(event_data->path), "%s/%ld/%ld", staticConfig.DIR_EVENTS.c_str(), event_data->monitor_id, event_data->event_id );
|
||||||
else
|
else
|
||||||
snprintf( event_data->path, sizeof(event_data->path), "%s/%s/%ld/%ld", staticConfig.PATH_WEB.c_str(), config.dir_events, event_data->monitor_id, event_data->event_id );
|
snprintf( event_data->path, sizeof(event_data->path), "%s/%s/%ld/%ld", staticConfig.PATH_WEB.c_str(), staticConfig.DIR_EVENTS.c_str(), event_data->monitor_id, event_data->event_id );
|
||||||
}
|
}
|
||||||
event_data->frame_count = dbrow[1] == NULL ? 0 : atoi(dbrow[1]);
|
event_data->frame_count = dbrow[1] == NULL ? 0 : atoi(dbrow[1]);
|
||||||
event_data->duration = atof(dbrow[3]);
|
event_data->duration = atof(dbrow[3]);
|
||||||
|
|
|
@ -413,6 +413,27 @@ static void zm_log_fps(double d, const char *postfix) {
|
||||||
Debug(1, "%1.0fk %s", d / 1000, postfix);
|
Debug(1, "%1.0fk %s", d / 1000, postfix);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
||||||
|
void zm_dump_codecpar ( const AVCodecParameters *par ) {
|
||||||
|
Debug(1, "Dumping codecpar codec_type(%d) codec_id(%d) codec_tag(%d) width(%d) height(%d)",
|
||||||
|
par->codec_type,
|
||||||
|
par->codec_id,
|
||||||
|
par->codec_tag,
|
||||||
|
par->width,
|
||||||
|
par->height
|
||||||
|
);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void zm_dump_codec ( const AVCodecContext *codec ) {
|
||||||
|
Debug(1, "Dumping codecpar codec_type(%d) codec_id(%d) width(%d) height(%d)",
|
||||||
|
codec->codec_type,
|
||||||
|
codec->codec_id,
|
||||||
|
codec->width,
|
||||||
|
codec->height
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/* "user interface" functions */
|
/* "user interface" functions */
|
||||||
void zm_dump_stream_format(AVFormatContext *ic, int i, int index, int is_output) {
|
void zm_dump_stream_format(AVFormatContext *ic, int i, int index, int is_output) {
|
||||||
char buf[256];
|
char buf[256];
|
||||||
|
|
|
@ -323,6 +323,11 @@ static av_always_inline av_const int64_t av_clip64_c(int64_t a, int64_t amin, in
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void zm_dump_stream_format(AVFormatContext *ic, int i, int index, int is_output);
|
void zm_dump_stream_format(AVFormatContext *ic, int i, int index, int is_output);
|
||||||
|
void zm_dump_codec ( const AVCodecContext *codec );
|
||||||
|
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
||||||
|
void zm_dump_codecpar ( const AVCodecParameters *par );
|
||||||
|
#endif
|
||||||
|
|
||||||
#if LIBAVCODEC_VERSION_CHECK(56, 8, 0, 60, 100)
|
#if LIBAVCODEC_VERSION_CHECK(56, 8, 0, 60, 100)
|
||||||
#define zm_av_packet_unref( packet ) av_packet_unref( packet )
|
#define zm_av_packet_unref( packet ) av_packet_unref( packet )
|
||||||
#define zm_av_packet_ref( dst, src ) av_packet_ref( dst, src )
|
#define zm_av_packet_ref( dst, src ) av_packet_ref( dst, src )
|
||||||
|
|
|
@ -146,9 +146,10 @@ int FfmpegCamera::Capture( Image &image ) {
|
||||||
|
|
||||||
int frameComplete = false;
|
int frameComplete = false;
|
||||||
while ( !frameComplete ) {
|
while ( !frameComplete ) {
|
||||||
|
int ret;
|
||||||
int avResult = av_read_frame( mFormatContext, &packet );
|
int avResult = av_read_frame( mFormatContext, &packet );
|
||||||
if ( avResult < 0 ) {
|
|
||||||
char errbuf[AV_ERROR_MAX_STRING_SIZE];
|
char errbuf[AV_ERROR_MAX_STRING_SIZE];
|
||||||
|
if ( avResult < 0 ) {
|
||||||
av_strerror(avResult, errbuf, AV_ERROR_MAX_STRING_SIZE);
|
av_strerror(avResult, errbuf, AV_ERROR_MAX_STRING_SIZE);
|
||||||
if (
|
if (
|
||||||
// Check if EOF.
|
// Check if EOF.
|
||||||
|
@ -166,9 +167,31 @@ int FfmpegCamera::Capture( Image &image ) {
|
||||||
Debug( 5, "Got packet from stream %d dts (%d) pts(%d)", packet.stream_index, packet.pts, packet.dts );
|
Debug( 5, "Got packet from stream %d dts (%d) pts(%d)", packet.stream_index, packet.pts, packet.dts );
|
||||||
// What about audio stream? Maybe someday we could do sound detection...
|
// What about audio stream? Maybe someday we could do sound detection...
|
||||||
if ( packet.stream_index == mVideoStreamId ) {
|
if ( packet.stream_index == mVideoStreamId ) {
|
||||||
int ret = zm_avcodec_decode_video( mVideoCodecContext, mRawFrame, &frameComplete, &packet );
|
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
||||||
if ( ret < 0 )
|
ret = avcodec_send_packet( mVideoCodecContext, &packet );
|
||||||
Fatal( "Unable to decode frame at frame %d", frameCount );
|
if ( ret < 0 ) {
|
||||||
|
av_strerror( ret, errbuf, AV_ERROR_MAX_STRING_SIZE );
|
||||||
|
Error( "Unable to send packet at frame %d: %s, continuing", frameCount, errbuf );
|
||||||
|
zm_av_packet_unref( &packet );
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
ret = avcodec_receive_frame( mVideoCodecContext, mRawFrame );
|
||||||
|
if ( ret < 0 ) {
|
||||||
|
av_strerror( ret, errbuf, AV_ERROR_MAX_STRING_SIZE );
|
||||||
|
Error( "Unable to send packet at frame %d: %s, continuing", frameCount, errbuf );
|
||||||
|
zm_av_packet_unref( &packet );
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
frameComplete = 1;
|
||||||
|
# else
|
||||||
|
ret = zm_avcodec_decode_video( mVideoCodecContext, mRawFrame, &frameComplete, &packet );
|
||||||
|
if ( ret < 0 ) {
|
||||||
|
av_strerror( ret, errbuf, AV_ERROR_MAX_STRING_SIZE );
|
||||||
|
Error( "Unable to decode frame at frame %d: %s, continuing", frameCount, errbuf );
|
||||||
|
zm_av_packet_unref( &packet );
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
Debug( 4, "Decoded video packet at frame %d", frameCount );
|
Debug( 4, "Decoded video packet at frame %d", frameCount );
|
||||||
|
|
||||||
|
@ -304,10 +327,14 @@ int FfmpegCamera::OpenFfmpeg() {
|
||||||
mVideoStreamId = -1;
|
mVideoStreamId = -1;
|
||||||
mAudioStreamId = -1;
|
mAudioStreamId = -1;
|
||||||
for (unsigned int i=0; i < mFormatContext->nb_streams; i++ ) {
|
for (unsigned int i=0; i < mFormatContext->nb_streams; i++ ) {
|
||||||
|
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
||||||
|
if ( mFormatContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ) {
|
||||||
|
#else
|
||||||
#if (LIBAVCODEC_VERSION_CHECK(52, 64, 0, 64, 0) || LIBAVUTIL_VERSION_CHECK(50, 14, 0, 14, 0))
|
#if (LIBAVCODEC_VERSION_CHECK(52, 64, 0, 64, 0) || LIBAVUTIL_VERSION_CHECK(50, 14, 0, 14, 0))
|
||||||
if ( mFormatContext->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO ) {
|
if ( mFormatContext->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO ) {
|
||||||
#else
|
#else
|
||||||
if ( mFormatContext->streams[i]->codec->codec_type == CODEC_TYPE_VIDEO ) {
|
if ( mFormatContext->streams[i]->codec->codec_type == CODEC_TYPE_VIDEO ) {
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
if ( mVideoStreamId == -1 ) {
|
if ( mVideoStreamId == -1 ) {
|
||||||
mVideoStreamId = i;
|
mVideoStreamId = i;
|
||||||
|
@ -317,10 +344,14 @@ int FfmpegCamera::OpenFfmpeg() {
|
||||||
Debug(2, "Have another video stream." );
|
Debug(2, "Have another video stream." );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
||||||
|
if ( mFormatContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO ) {
|
||||||
|
#else
|
||||||
#if (LIBAVCODEC_VERSION_CHECK(52, 64, 0, 64, 0) || LIBAVUTIL_VERSION_CHECK(50, 14, 0, 14, 0))
|
#if (LIBAVCODEC_VERSION_CHECK(52, 64, 0, 64, 0) || LIBAVUTIL_VERSION_CHECK(50, 14, 0, 14, 0))
|
||||||
if ( mFormatContext->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO ) {
|
if ( mFormatContext->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO ) {
|
||||||
#else
|
#else
|
||||||
if ( mFormatContext->streams[i]->codec->codec_type == CODEC_TYPE_AUDIO ) {
|
if ( mFormatContext->streams[i]->codec->codec_type == CODEC_TYPE_AUDIO ) {
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
if ( mAudioStreamId == -1 ) {
|
if ( mAudioStreamId == -1 ) {
|
||||||
mAudioStreamId = i;
|
mAudioStreamId = i;
|
||||||
|
@ -337,7 +368,12 @@ int FfmpegCamera::OpenFfmpeg() {
|
||||||
Debug ( 3, "Found video stream at index %d", mVideoStreamId );
|
Debug ( 3, "Found video stream at index %d", mVideoStreamId );
|
||||||
Debug ( 3, "Found audio stream at index %d", mAudioStreamId );
|
Debug ( 3, "Found audio stream at index %d", mAudioStreamId );
|
||||||
|
|
||||||
|
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
||||||
|
mVideoCodecContext = avcodec_alloc_context3( NULL );
|
||||||
|
avcodec_parameters_to_context( mVideoCodecContext, mFormatContext->streams[mVideoStreamId]->codecpar );
|
||||||
|
#else
|
||||||
mVideoCodecContext = mFormatContext->streams[mVideoStreamId]->codec;
|
mVideoCodecContext = mFormatContext->streams[mVideoStreamId]->codec;
|
||||||
|
#endif
|
||||||
// STolen from ispy
|
// STolen from ispy
|
||||||
//this fixes issues with rtsp streams!! woot.
|
//this fixes issues with rtsp streams!! woot.
|
||||||
//mVideoCodecContext->flags2 |= CODEC_FLAG2_FAST | CODEC_FLAG2_CHUNKS | CODEC_FLAG_LOW_DELAY; // Enable faster H264 decode.
|
//mVideoCodecContext->flags2 |= CODEC_FLAG2_FAST | CODEC_FLAG2_CHUNKS | CODEC_FLAG_LOW_DELAY; // Enable faster H264 decode.
|
||||||
|
@ -361,7 +397,12 @@ int FfmpegCamera::OpenFfmpeg() {
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( mAudioStreamId >= 0 ) {
|
if ( mAudioStreamId >= 0 ) {
|
||||||
|
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
||||||
|
mAudioCodecContext = avcodec_alloc_context3( NULL );
|
||||||
|
avcodec_parameters_to_context( mAudioCodecContext, mFormatContext->streams[mAudioStreamId]->codecpar );
|
||||||
|
#else
|
||||||
mAudioCodecContext = mFormatContext->streams[mAudioStreamId]->codec;
|
mAudioCodecContext = mFormatContext->streams[mAudioStreamId]->codec;
|
||||||
|
#endif
|
||||||
if ((mAudioCodec = avcodec_find_decoder(mAudioCodecContext->codec_id)) == NULL) {
|
if ((mAudioCodec = avcodec_find_decoder(mAudioCodecContext->codec_id)) == NULL) {
|
||||||
Debug(1, "Can't find codec for audio stream from %s", mPath.c_str());
|
Debug(1, "Can't find codec for audio stream from %s", mPath.c_str());
|
||||||
} else {
|
} else {
|
||||||
|
@ -576,12 +617,13 @@ int FfmpegCamera::CaptureAndRecord( Image &image, timeval recording, char* event
|
||||||
|
|
||||||
//Video recording
|
//Video recording
|
||||||
if ( recording.tv_sec ) {
|
if ( recording.tv_sec ) {
|
||||||
// The directory we are recording to is no longer tied to the current event.
|
|
||||||
// Need to re-init the videostore with the correct directory and start recording again
|
uint32_t last_event_id = monitor->GetLastEventId() ;
|
||||||
// for efficiency's sake, we should test for keyframe before we test for directory change...
|
|
||||||
if ( videoStore && key_frame && (strcmp(oldDirectory, event_file) != 0 ) ) {
|
if ( last_event_id != monitor->GetVideoWriterEventId() ) {
|
||||||
// don't open new videostore until we're on a key frame..would this require an offset adjustment for the event as a result?...
|
Debug(2, "Have change of event. last_event(%d), our current (%d)", last_event_id, monitor->GetVideoWriterEventId() );
|
||||||
// if we store our key frame location with the event will that be enough?
|
|
||||||
|
if ( videoStore ) {
|
||||||
Info("Re-starting video storage module");
|
Info("Re-starting video storage module");
|
||||||
|
|
||||||
// I don't know if this is important or not... but I figure we might as well write this last packet out to the store before closing it.
|
// I don't know if this is important or not... but I figure we might as well write this last packet out to the store before closing it.
|
||||||
|
@ -596,9 +638,12 @@ int FfmpegCamera::CaptureAndRecord( Image &image, timeval recording, char* event
|
||||||
|
|
||||||
delete videoStore;
|
delete videoStore;
|
||||||
videoStore = NULL;
|
videoStore = NULL;
|
||||||
|
|
||||||
|
monitor->SetVideoWriterEventId( 0 );
|
||||||
|
} // end if videoStore
|
||||||
} // end if end of recording
|
} // end if end of recording
|
||||||
|
|
||||||
if ( ( ! videoStore ) && key_frame && ( packet.stream_index == mVideoStreamId ) ) {
|
if ( last_event_id and ! videoStore ) {
|
||||||
//Instantiate the video storage module
|
//Instantiate the video storage module
|
||||||
|
|
||||||
if (record_audio) {
|
if (record_audio) {
|
||||||
|
@ -627,6 +672,7 @@ int FfmpegCamera::CaptureAndRecord( Image &image, timeval recording, char* event
|
||||||
this->getMonitor());
|
this->getMonitor());
|
||||||
} // end if record_audio
|
} // end if record_audio
|
||||||
strcpy(oldDirectory, event_file);
|
strcpy(oldDirectory, event_file);
|
||||||
|
monitor->SetVideoWriterEventId( last_event_id );
|
||||||
|
|
||||||
// Need to write out all the frames from the last keyframe?
|
// Need to write out all the frames from the last keyframe?
|
||||||
// No... need to write out all frames from when the event began. Due to PreEventFrames, this could be more than since the last keyframe.
|
// No... need to write out all frames from when the event began. Due to PreEventFrames, this could be more than since the last keyframe.
|
||||||
|
@ -664,6 +710,7 @@ int FfmpegCamera::CaptureAndRecord( Image &image, timeval recording, char* event
|
||||||
Info("Deleting videoStore instance");
|
Info("Deleting videoStore instance");
|
||||||
delete videoStore;
|
delete videoStore;
|
||||||
videoStore = NULL;
|
videoStore = NULL;
|
||||||
|
monitor->SetVideoWriterEventId( 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Buffer video packets, since we are not recording.
|
// Buffer video packets, since we are not recording.
|
||||||
|
@ -708,7 +755,7 @@ else if ( packet.pts && video_last_pts > packet.pts ) {
|
||||||
}
|
}
|
||||||
Debug(4, "about to decode video" );
|
Debug(4, "about to decode video" );
|
||||||
|
|
||||||
#if LIBAVCODEC_VERSION_CHECK(58, 0, 0, 0, 0)
|
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
||||||
ret = avcodec_send_packet( mVideoCodecContext, &packet );
|
ret = avcodec_send_packet( mVideoCodecContext, &packet );
|
||||||
if ( ret < 0 ) {
|
if ( ret < 0 ) {
|
||||||
av_strerror( ret, errbuf, AV_ERROR_MAX_STRING_SIZE );
|
av_strerror( ret, errbuf, AV_ERROR_MAX_STRING_SIZE );
|
||||||
|
@ -719,7 +766,7 @@ else if ( packet.pts && video_last_pts > packet.pts ) {
|
||||||
ret = avcodec_receive_frame( mVideoCodecContext, mRawFrame );
|
ret = avcodec_receive_frame( mVideoCodecContext, mRawFrame );
|
||||||
if ( ret < 0 ) {
|
if ( ret < 0 ) {
|
||||||
av_strerror( ret, errbuf, AV_ERROR_MAX_STRING_SIZE );
|
av_strerror( ret, errbuf, AV_ERROR_MAX_STRING_SIZE );
|
||||||
Error( "Unable to send packet at frame %d: %s, continuing", frameCount, errbuf );
|
Debug( 1, "Unable to send packet at frame %d: %s, continuing", frameCount, errbuf );
|
||||||
zm_av_packet_unref( &packet );
|
zm_av_packet_unref( &packet );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -88,7 +88,7 @@ Logger::Logger() :
|
||||||
mFileLevel( NOLOG ),
|
mFileLevel( NOLOG ),
|
||||||
mSyslogLevel( NOLOG ),
|
mSyslogLevel( NOLOG ),
|
||||||
mEffectiveLevel( NOLOG ),
|
mEffectiveLevel( NOLOG ),
|
||||||
//mLogPath( config.path_logs ),
|
//mLogPath( staticConfig.PATH_LOGS.c_str() ),
|
||||||
//mLogFile( mLogPath+"/"+mId+".log" ),
|
//mLogFile( mLogPath+"/"+mId+".log" ),
|
||||||
mDbConnected( false ),
|
mDbConnected( false ),
|
||||||
mLogFileFP( NULL ),
|
mLogFileFP( NULL ),
|
||||||
|
@ -440,7 +440,7 @@ void Logger::logFile( const std::string &logFile ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Logger::openFile() {
|
void Logger::openFile() {
|
||||||
if ( mLogFile.size() && (mLogFileFP = fopen( mLogFile.c_str() ,"w" )) == (FILE *)NULL ) {
|
if ( mLogFile.size() && (mLogFileFP = fopen( mLogFile.c_str() ,"a" )) == (FILE *)NULL ) {
|
||||||
mFileLevel = NOLOG;
|
mFileLevel = NOLOG;
|
||||||
Fatal( "fopen() for %s, error = %s", mLogFile.c_str(), strerror(errno) );
|
Fatal( "fopen() for %s, error = %s", mLogFile.c_str(), strerror(errno) );
|
||||||
}
|
}
|
||||||
|
@ -595,7 +595,7 @@ void logInit( const char *name, const Logger::Options &options ) {
|
||||||
if ( !Logger::smInstance )
|
if ( !Logger::smInstance )
|
||||||
Logger::smInstance = new Logger();
|
Logger::smInstance = new Logger();
|
||||||
Logger::Options tempOptions = options;
|
Logger::Options tempOptions = options;
|
||||||
tempOptions.mLogPath = config.path_logs;
|
tempOptions.mLogPath = staticConfig.PATH_LOGS.c_str();
|
||||||
Logger::smInstance->initialise( name, tempOptions );
|
Logger::smInstance->initialise( name, tempOptions );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -80,7 +80,7 @@ Monitor::MonitorLink::MonitorLink( int p_id, const char *p_name ) : id( p_id ) {
|
||||||
|
|
||||||
#if ZM_MEM_MAPPED
|
#if ZM_MEM_MAPPED
|
||||||
map_fd = -1;
|
map_fd = -1;
|
||||||
snprintf( mem_file, sizeof(mem_file), "%s/zm.mmap.%d", config.path_map, id );
|
snprintf( mem_file, sizeof(mem_file), "%s/zm.mmap.%d", staticConfig.PATH_MAP.c_str(), id );
|
||||||
#else // ZM_MEM_MAPPED
|
#else // ZM_MEM_MAPPED
|
||||||
shm_id = 0;
|
shm_id = 0;
|
||||||
#endif // ZM_MEM_MAPPED
|
#endif // ZM_MEM_MAPPED
|
||||||
|
@ -450,7 +450,7 @@ Monitor::Monitor(
|
||||||
if ( purpose == ANALYSIS ) {
|
if ( purpose == ANALYSIS ) {
|
||||||
static char path[PATH_MAX];
|
static char path[PATH_MAX];
|
||||||
|
|
||||||
strncpy( path, config.dir_events, sizeof(path) );
|
strncpy( path, staticConfig.DIR_EVENTS.c_str(), sizeof(path) );
|
||||||
|
|
||||||
struct stat statbuf;
|
struct stat statbuf;
|
||||||
errno = 0;
|
errno = 0;
|
||||||
|
@ -461,7 +461,7 @@ Monitor::Monitor(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf( path, sizeof(path), "%s/%d", config.dir_events, id );
|
snprintf( path, sizeof(path), "%s/%d", staticConfig.DIR_EVENTS.c_str(), id );
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
stat( path, &statbuf );
|
stat( path, &statbuf );
|
||||||
|
@ -471,8 +471,8 @@ Monitor::Monitor(
|
||||||
}
|
}
|
||||||
char temp_path[PATH_MAX];
|
char temp_path[PATH_MAX];
|
||||||
snprintf( temp_path, sizeof(temp_path), "%d", id );
|
snprintf( temp_path, sizeof(temp_path), "%d", id );
|
||||||
if ( chdir( config.dir_events ) < 0 )
|
if ( chdir( staticConfig.DIR_EVENTS.c_str() ) < 0 )
|
||||||
Fatal( "Can't change directory to '%s': %s", config.dir_events, strerror(errno) );
|
Fatal( "Can't change directory to '%s': %s", staticConfig.DIR_EVENTS.c_str(), strerror(errno) );
|
||||||
if ( symlink( temp_path, name ) < 0 )
|
if ( symlink( temp_path, name ) < 0 )
|
||||||
Fatal( "Can't symlink '%s' to '%s': %s", temp_path, name, strerror(errno) );
|
Fatal( "Can't symlink '%s' to '%s': %s", temp_path, name, strerror(errno) );
|
||||||
if ( chdir( ".." ) < 0 )
|
if ( chdir( ".." ) < 0 )
|
||||||
|
@ -497,7 +497,7 @@ Monitor::Monitor(
|
||||||
|
|
||||||
bool Monitor::connect() {
|
bool Monitor::connect() {
|
||||||
#if ZM_MEM_MAPPED
|
#if ZM_MEM_MAPPED
|
||||||
snprintf( mem_file, sizeof(mem_file), "%s/zm.mmap.%d", config.path_map, id );
|
snprintf( mem_file, sizeof(mem_file), "%s/zm.mmap.%d", staticConfig.PATH_MAP.c_str(), id );
|
||||||
map_fd = open( mem_file, O_RDWR|O_CREAT, (mode_t)0600 );
|
map_fd = open( mem_file, O_RDWR|O_CREAT, (mode_t)0600 );
|
||||||
if ( map_fd < 0 )
|
if ( map_fd < 0 )
|
||||||
Fatal( "Can't open memory map file %s, probably not enough space free: %s", mem_file, strerror(errno) );
|
Fatal( "Can't open memory map file %s, probably not enough space free: %s", mem_file, strerror(errno) );
|
||||||
|
@ -646,7 +646,7 @@ Monitor::~Monitor() {
|
||||||
|
|
||||||
if ( purpose == CAPTURE ) {
|
if ( purpose == CAPTURE ) {
|
||||||
char mmap_path[PATH_MAX] = "";
|
char mmap_path[PATH_MAX] = "";
|
||||||
snprintf( mmap_path, sizeof(mmap_path), "%s/zm.mmap.%d", config.path_map, id );
|
snprintf( mmap_path, sizeof(mmap_path), "%s/zm.mmap.%d", staticConfig.PATH_MAP.c_str(), id );
|
||||||
|
|
||||||
if ( unlink( mmap_path ) < 0 ) {
|
if ( unlink( mmap_path ) < 0 ) {
|
||||||
Warning( "Can't unlink '%s': %s", mmap_path, strerror(errno) );
|
Warning( "Can't unlink '%s': %s", mmap_path, strerror(errno) );
|
||||||
|
@ -2991,7 +2991,7 @@ unsigned int Monitor::DetectMotion( const Image &comp_image, Event::StringSet &z
|
||||||
if ( config.record_diag_images ) {
|
if ( config.record_diag_images ) {
|
||||||
static char diag_path[PATH_MAX] = "";
|
static char diag_path[PATH_MAX] = "";
|
||||||
if ( !diag_path[0] ) {
|
if ( !diag_path[0] ) {
|
||||||
snprintf( diag_path, sizeof(diag_path), "%s/%d/diag-r.jpg", config.dir_events, id );
|
snprintf( diag_path, sizeof(diag_path), "%s/%d/diag-r.jpg", staticConfig.DIR_EVENTS.c_str(), id );
|
||||||
}
|
}
|
||||||
ref_image.WriteJpeg( diag_path );
|
ref_image.WriteJpeg( diag_path );
|
||||||
}
|
}
|
||||||
|
@ -3001,7 +3001,7 @@ unsigned int Monitor::DetectMotion( const Image &comp_image, Event::StringSet &z
|
||||||
if ( config.record_diag_images ) {
|
if ( config.record_diag_images ) {
|
||||||
static char diag_path[PATH_MAX] = "";
|
static char diag_path[PATH_MAX] = "";
|
||||||
if ( !diag_path[0] ) {
|
if ( !diag_path[0] ) {
|
||||||
snprintf( diag_path, sizeof(diag_path), "%s/%d/diag-d.jpg", config.dir_events, id );
|
snprintf( diag_path, sizeof(diag_path), "%s/%d/diag-d.jpg", staticConfig.DIR_EVENTS.c_str(), id );
|
||||||
}
|
}
|
||||||
delta_image.WriteJpeg( diag_path );
|
delta_image.WriteJpeg( diag_path );
|
||||||
}
|
}
|
||||||
|
@ -3688,7 +3688,7 @@ void MonitorStream::runStream() {
|
||||||
// 15 is the max length for the swap path suffix, /zmswap-whatever, assuming max 6 digits for monitor id
|
// 15 is the max length for the swap path suffix, /zmswap-whatever, assuming max 6 digits for monitor id
|
||||||
const int max_swap_len_suffix = 15;
|
const int max_swap_len_suffix = 15;
|
||||||
|
|
||||||
int swap_path_length = strlen(config.path_swap) + 1; // +1 for NULL terminator
|
int swap_path_length = strlen(staticConfig.PATH_SWAP.c_str()) + 1; // +1 for NULL terminator
|
||||||
int subfolder1_length = snprintf(NULL, 0, "/zmswap-m%d", monitor->Id() ) + 1;
|
int subfolder1_length = snprintf(NULL, 0, "/zmswap-m%d", monitor->Id() ) + 1;
|
||||||
int subfolder2_length = snprintf(NULL, 0, "/zmswap-q%06d", connkey ) + 1;
|
int subfolder2_length = snprintf(NULL, 0, "/zmswap-q%06d", connkey ) + 1;
|
||||||
int total_swap_path_length = swap_path_length + subfolder1_length + subfolder2_length;
|
int total_swap_path_length = swap_path_length + subfolder1_length + subfolder2_length;
|
||||||
|
@ -3699,7 +3699,7 @@ void MonitorStream::runStream() {
|
||||||
Error( "Swap Path is too long. %d > %d ", total_swap_path_length+max_swap_len_suffix, PATH_MAX );
|
Error( "Swap Path is too long. %d > %d ", total_swap_path_length+max_swap_len_suffix, PATH_MAX );
|
||||||
} else {
|
} else {
|
||||||
swap_path = (char *)malloc( total_swap_path_length+max_swap_len_suffix );
|
swap_path = (char *)malloc( total_swap_path_length+max_swap_len_suffix );
|
||||||
strncpy( swap_path, config.path_swap, swap_path_length );
|
strncpy( swap_path, staticConfig.PATH_SWAP.c_str(), swap_path_length );
|
||||||
|
|
||||||
Debug( 3, "Checking swap path folder: %s", swap_path );
|
Debug( 3, "Checking swap path folder: %s", swap_path );
|
||||||
if ( checkSwapPath( swap_path, false ) ) {
|
if ( checkSwapPath( swap_path, false ) ) {
|
||||||
|
|
|
@ -157,6 +157,7 @@ protected:
|
||||||
//sizeOf(VideoStoreData) expected to be 4104 bytes on 32bit and 64bit
|
//sizeOf(VideoStoreData) expected to be 4104 bytes on 32bit and 64bit
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint32_t size;
|
uint32_t size;
|
||||||
|
uint32_t current_event;
|
||||||
char event_file[4096];
|
char event_file[4096];
|
||||||
timeval recording; // used as both bool and a pointer to the timestamp when recording should begin
|
timeval recording; // used as both bool and a pointer to the timestamp when recording should begin
|
||||||
//uint32_t frameNumber;
|
//uint32_t frameNumber;
|
||||||
|
@ -415,6 +416,9 @@ public:
|
||||||
int GetOptSaveJPEGs() const { return( savejpegspref ); }
|
int GetOptSaveJPEGs() const { return( savejpegspref ); }
|
||||||
VideoWriter GetOptVideoWriter() const { return( videowriter ); }
|
VideoWriter GetOptVideoWriter() const { return( videowriter ); }
|
||||||
const std::vector<EncoderParameter_t>* GetOptEncoderParams() const { return( &encoderparamsvec ); }
|
const std::vector<EncoderParameter_t>* GetOptEncoderParams() const { return( &encoderparamsvec ); }
|
||||||
|
uint32_t GetLastEventId() const { return shared_data->last_event; }
|
||||||
|
uint32_t GetVideoWriterEventId() const { return video_store_data->current_event; }
|
||||||
|
void SetVideoWriterEventId( uint32_t p_event_id ) { video_store_data->current_event = p_event_id; }
|
||||||
|
|
||||||
unsigned int GetPreEventCount() const { return pre_event_count; };
|
unsigned int GetPreEventCount() const { return pre_event_count; };
|
||||||
State GetState() const;
|
State GetState() const;
|
||||||
|
|
|
@ -291,7 +291,7 @@ void StreamBase::openComms()
|
||||||
if ( connkey > 0 )
|
if ( connkey > 0 )
|
||||||
{
|
{
|
||||||
|
|
||||||
unsigned int length = snprintf( sock_path_lock, sizeof(sock_path_lock), "%s/zms-%06d.lock", config.path_socks, connkey);
|
unsigned int length = snprintf( sock_path_lock, sizeof(sock_path_lock), "%s/zms-%06d.lock", staticConfig.PATH_SOCKS.c_str(), connkey);
|
||||||
if ( length >= sizeof(sock_path_lock) ) {
|
if ( length >= sizeof(sock_path_lock) ) {
|
||||||
Warning("Socket lock path was truncated.");
|
Warning("Socket lock path was truncated.");
|
||||||
length = sizeof(sock_path_lock)-1;
|
length = sizeof(sock_path_lock)-1;
|
||||||
|
@ -321,7 +321,7 @@ void StreamBase::openComms()
|
||||||
Debug(3, "Have socket %d", sd );
|
Debug(3, "Have socket %d", sd );
|
||||||
}
|
}
|
||||||
|
|
||||||
length = snprintf( loc_sock_path, sizeof(loc_sock_path), "%s/zms-%06ds.sock", config.path_socks, connkey );
|
length = snprintf( loc_sock_path, sizeof(loc_sock_path), "%s/zms-%06ds.sock", staticConfig.PATH_SOCKS.c_str(), connkey );
|
||||||
if ( length >= sizeof(loc_sock_path) ) {
|
if ( length >= sizeof(loc_sock_path) ) {
|
||||||
Warning("Socket path was truncated.");
|
Warning("Socket path was truncated.");
|
||||||
length = sizeof(loc_sock_path)-1;
|
length = sizeof(loc_sock_path)-1;
|
||||||
|
@ -339,7 +339,7 @@ void StreamBase::openComms()
|
||||||
Fatal( "Can't bind: %s", strerror(errno) );
|
Fatal( "Can't bind: %s", strerror(errno) );
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf( rem_sock_path, sizeof(rem_sock_path), "%s/zms-%06dw.sock", config.path_socks, connkey );
|
snprintf( rem_sock_path, sizeof(rem_sock_path), "%s/zms-%06dw.sock", staticConfig.PATH_SOCKS.c_str(), connkey );
|
||||||
strncpy( rem_addr.sun_path, rem_sock_path, sizeof(rem_addr.sun_path) );
|
strncpy( rem_addr.sun_path, rem_sock_path, sizeof(rem_addr.sun_path) );
|
||||||
rem_addr.sun_family = AF_UNIX;
|
rem_addr.sun_family = AF_UNIX;
|
||||||
} // end if connKey > 0
|
} // end if connKey > 0
|
||||||
|
|
|
@ -41,9 +41,10 @@ VideoStore::VideoStore(const char *filename_in, const char *format_in,
|
||||||
video_input_stream = p_video_input_stream;
|
video_input_stream = p_video_input_stream;
|
||||||
audio_input_stream = p_audio_input_stream;
|
audio_input_stream = p_audio_input_stream;
|
||||||
|
|
||||||
#if LIBAVCODEC_VERSION_CHECK(57, 0, 0, 0, 0)
|
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
||||||
video_input_context = avcodec_alloc_context3( NULL );
|
video_input_context = avcodec_alloc_context3( NULL );
|
||||||
avcodec_parameters_to_context( video_input_context, video_input_stream->codecpar );
|
avcodec_parameters_to_context( video_input_context, video_input_stream->codecpar );
|
||||||
|
zm_dump_codecpar( video_input_stream->codecpar );
|
||||||
#else
|
#else
|
||||||
video_input_context = video_input_stream->codec;
|
video_input_context = video_input_stream->codec;
|
||||||
#endif
|
#endif
|
||||||
|
@ -84,7 +85,8 @@ VideoStore::VideoStore(const char *filename_in, const char *format_in,
|
||||||
oc->metadata = pmetadata;
|
oc->metadata = pmetadata;
|
||||||
output_format = oc->oformat;
|
output_format = oc->oformat;
|
||||||
|
|
||||||
#if LIBAVCODEC_VERSION_CHECK(57, 0, 0, 0, 0)
|
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
||||||
|
|
||||||
// Since we are not re-encoding, all we have to do is copy the parameters
|
// Since we are not re-encoding, all we have to do is copy the parameters
|
||||||
video_output_context = avcodec_alloc_context3( NULL );
|
video_output_context = avcodec_alloc_context3( NULL );
|
||||||
|
|
||||||
|
@ -94,7 +96,7 @@ VideoStore::VideoStore(const char *filename_in, const char *format_in,
|
||||||
Error( "Could not initialize context parameteres");
|
Error( "Could not initialize context parameteres");
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
Debug( 2, "Success getting parameters");
|
zm_dump_codec( video_output_context );
|
||||||
}
|
}
|
||||||
|
|
||||||
video_output_stream = avformat_new_stream( oc, NULL );
|
video_output_stream = avformat_new_stream( oc, NULL );
|
||||||
|
@ -104,6 +106,11 @@ VideoStore::VideoStore(const char *filename_in, const char *format_in,
|
||||||
Debug(2, "Success creating video out stream" );
|
Debug(2, "Success creating video out stream" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( ! video_output_context->codec_tag ) {
|
||||||
|
video_output_context->codec_tag = av_codec_get_tag(oc->oformat->codec_tag, video_input_context->codec_id);
|
||||||
|
Debug(2, "No codec_tag, setting to %d", video_output_context->codec_tag );
|
||||||
|
}
|
||||||
|
|
||||||
// Now copy them to the output stream
|
// Now copy them to the output stream
|
||||||
ret = avcodec_parameters_from_context( video_output_stream->codecpar, video_output_context );
|
ret = avcodec_parameters_from_context( video_output_stream->codecpar, video_output_context );
|
||||||
if ( ret < 0 ) {
|
if ( ret < 0 ) {
|
||||||
|
@ -112,8 +119,8 @@ VideoStore::VideoStore(const char *filename_in, const char *format_in,
|
||||||
} else {
|
} else {
|
||||||
Debug(2, "Success setting parameters");
|
Debug(2, "Success setting parameters");
|
||||||
}
|
}
|
||||||
|
zm_dump_codecpar( video_output_stream->codecpar );
|
||||||
|
|
||||||
zm_dump_stream_format( oc, 0, 0, 1 );
|
|
||||||
#else
|
#else
|
||||||
video_output_stream = avformat_new_stream(oc, (AVCodec*)video_input_context->codec );
|
video_output_stream = avformat_new_stream(oc, (AVCodec*)video_input_context->codec );
|
||||||
if ( ! video_output_stream ) {
|
if ( ! video_output_stream ) {
|
||||||
|
@ -129,6 +136,15 @@ VideoStore::VideoStore(const char *filename_in, const char *format_in,
|
||||||
} else {
|
} else {
|
||||||
Debug(3, "Success copying context" );
|
Debug(3, "Success copying context" );
|
||||||
}
|
}
|
||||||
|
if ( ! video_output_context->codec_tag ) {
|
||||||
|
Debug(2, "No codec_tag");
|
||||||
|
if (! oc->oformat->codec_tag
|
||||||
|
|| av_codec_get_id (oc->oformat->codec_tag, video_input_context->codec_tag) == video_output_context->codec_id
|
||||||
|
|| av_codec_get_tag(oc->oformat->codec_tag, video_input_context->codec_id) <= 0) {
|
||||||
|
Warning("Setting codec tag");
|
||||||
|
video_output_context->codec_tag = video_input_context->codec_tag;
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Just copy them from the input, no reason to choose different
|
// Just copy them from the input, no reason to choose different
|
||||||
|
@ -146,17 +162,6 @@ VideoStore::VideoStore(const char *filename_in, const char *format_in,
|
||||||
video_output_context->time_base.den
|
video_output_context->time_base.den
|
||||||
);
|
);
|
||||||
|
|
||||||
// WHY?
|
|
||||||
//video_output_context->codec_tag = 0;
|
|
||||||
if ( ! video_output_context->codec_tag ) {
|
|
||||||
Debug(2, "No codec_tag");
|
|
||||||
if (! oc->oformat->codec_tag
|
|
||||||
|| av_codec_get_id (oc->oformat->codec_tag, video_input_context->codec_tag) == video_output_context->codec_id
|
|
||||||
|| av_codec_get_tag(oc->oformat->codec_tag, video_input_context->codec_id) <= 0) {
|
|
||||||
Warning("Setting codec tag");
|
|
||||||
video_output_context->codec_tag = video_input_context->codec_tag;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
|
if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
|
||||||
video_output_context->flags |= CODEC_FLAG_GLOBAL_HEADER;
|
video_output_context->flags |= CODEC_FLAG_GLOBAL_HEADER;
|
||||||
|
@ -190,7 +195,7 @@ VideoStore::VideoStore(const char *filename_in, const char *format_in,
|
||||||
|
|
||||||
if ( audio_input_stream ) {
|
if ( audio_input_stream ) {
|
||||||
Debug(3, "Have audio stream" );
|
Debug(3, "Have audio stream" );
|
||||||
#if LIBAVCODEC_VERSION_CHECK(57, 0, 0, 0, 0)
|
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
||||||
|
|
||||||
audio_input_context = avcodec_alloc_context3( NULL );
|
audio_input_context = avcodec_alloc_context3( NULL );
|
||||||
ret = avcodec_parameters_to_context( audio_input_context, audio_input_stream->codecpar );
|
ret = avcodec_parameters_to_context( audio_input_context, audio_input_stream->codecpar );
|
||||||
|
@ -217,19 +222,32 @@ VideoStore::VideoStore(const char *filename_in, const char *format_in,
|
||||||
} else {
|
} else {
|
||||||
Debug(2, "setting parameters");
|
Debug(2, "setting parameters");
|
||||||
|
|
||||||
#if LIBAVCODEC_VERSION_CHECK(57, 0, 0, 0, 0)
|
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
||||||
audio_output_context = avcodec_alloc_context3( NULL );
|
audio_output_context = avcodec_alloc_context3( audio_output_codec );
|
||||||
// Copy params from inputstream to context
|
// Copy params from inputstream to context
|
||||||
ret = avcodec_parameters_to_context( audio_output_context, audio_input_stream->codecpar );
|
ret = avcodec_parameters_to_context( audio_output_context, audio_input_stream->codecpar );
|
||||||
|
if (ret < 0) {
|
||||||
|
Error("Unable to copy audio params to context %s\n", av_make_error_string(ret).c_str());
|
||||||
|
}
|
||||||
|
ret = avcodec_parameters_from_context( audio_output_stream->codecpar, audio_output_context );
|
||||||
|
if (ret < 0) {
|
||||||
|
Error("Unable to copy audio params to stream %s\n", av_make_error_string(ret).c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! audio_output_context->codec_tag ) {
|
||||||
|
audio_output_context->codec_tag = av_codec_get_tag(oc->oformat->codec_tag, audio_input_context->codec_id);
|
||||||
|
Debug(2, "Setting audio codec tag to %d", audio_output_context->codec_tag );
|
||||||
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
audio_output_context = audio_output_stream->codec;
|
audio_output_context = audio_output_stream->codec;
|
||||||
ret = avcodec_copy_context(audio_output_context, audio_input_context);
|
ret = avcodec_copy_context(audio_output_context, audio_input_context);
|
||||||
|
audio_output_context->codec_tag = 0;
|
||||||
#endif
|
#endif
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
Error("Unable to copy audio context %s\n", av_make_error_string(ret).c_str());
|
Error("Unable to copy audio context %s\n", av_make_error_string(ret).c_str());
|
||||||
audio_output_stream = NULL;
|
audio_output_stream = NULL;
|
||||||
} else {
|
} else {
|
||||||
audio_output_context->codec_tag = 0;
|
|
||||||
if ( audio_output_context->channels > 1 ) {
|
if ( audio_output_context->channels > 1 ) {
|
||||||
Warning("Audio isn't mono, changing it.");
|
Warning("Audio isn't mono, changing it.");
|
||||||
audio_output_context->channels = 1;
|
audio_output_context->channels = 1;
|
||||||
|
@ -265,10 +283,10 @@ VideoStore::VideoStore(const char *filename_in, const char *format_in,
|
||||||
zm_dump_stream_format( oc, 1, 0, 1 );
|
zm_dump_stream_format( oc, 1, 0, 1 );
|
||||||
|
|
||||||
AVDictionary * opts = NULL;
|
AVDictionary * opts = NULL;
|
||||||
//av_dict_set(&opts, "movflags", "frag_custom+dash+delay_moov", 0);
|
av_dict_set(&opts, "movflags", "frag_custom+dash+delay_moov", 0);
|
||||||
//av_dict_set(&opts, "movflags", "frag_custom+dash+delay_moov", 0);
|
//av_dict_set(&opts, "movflags", "frag_custom+dash+delay_moov", 0);
|
||||||
//av_dict_set(&opts, "movflags", "frag_keyframe+empty_moov+default_base_moof", 0);
|
//av_dict_set(&opts, "movflags", "frag_keyframe+empty_moov+default_base_moof", 0);
|
||||||
if ((ret = avformat_write_header(oc, NULL)) < 0) {
|
if ((ret = avformat_write_header( oc, &opts )) < 0) {
|
||||||
//if ((ret = avformat_write_header(oc, &opts)) < 0) {
|
//if ((ret = avformat_write_header(oc, &opts)) < 0) {
|
||||||
Warning("Unable to set movflags to frag_custom+dash+delay_moov");
|
Warning("Unable to set movflags to frag_custom+dash+delay_moov");
|
||||||
/* Write the stream header, if any. */
|
/* Write the stream header, if any. */
|
||||||
|
@ -307,7 +325,7 @@ VideoStore::~VideoStore(){
|
||||||
int64_t size;
|
int64_t size;
|
||||||
|
|
||||||
while(1) {
|
while(1) {
|
||||||
#if LIBAVCODEC_VERSION_CHECK(57, 0, 0, 0, 0)
|
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
||||||
ret = avcodec_receive_packet( audio_output_context, &pkt );
|
ret = avcodec_receive_packet( audio_output_context, &pkt );
|
||||||
#else
|
#else
|
||||||
ret = avcodec_encode_audio2( audio_output_context, &pkt, NULL, &got_packet );
|
ret = avcodec_encode_audio2( audio_output_context, &pkt, NULL, &got_packet );
|
||||||
|
@ -379,7 +397,7 @@ bool VideoStore::setup_resampler() {
|
||||||
#ifdef HAVE_LIBAVRESAMPLE
|
#ifdef HAVE_LIBAVRESAMPLE
|
||||||
static char error_buffer[256];
|
static char error_buffer[256];
|
||||||
|
|
||||||
#if LIBAVCODEC_VERSION_CHECK(57, 0, 0, 0, 0)
|
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
||||||
// Newer ffmpeg wants to keep everything separate... so have to lookup our own decoder, can't reuse the one from the camera.
|
// Newer ffmpeg wants to keep everything separate... so have to lookup our own decoder, can't reuse the one from the camera.
|
||||||
AVCodec *audio_input_codec = avcodec_find_decoder(audio_input_stream->codecpar->codec_id);
|
AVCodec *audio_input_codec = avcodec_find_decoder(audio_input_stream->codecpar->codec_id);
|
||||||
#else
|
#else
|
||||||
|
@ -455,7 +473,7 @@ bool VideoStore::setup_resampler() {
|
||||||
// Now copy them to the output stream
|
// Now copy them to the output stream
|
||||||
audio_output_stream = avformat_new_stream( oc, audio_output_codec );
|
audio_output_stream = avformat_new_stream( oc, audio_output_codec );
|
||||||
|
|
||||||
#if LIBAVCODEC_VERSION_CHECK(57, 0, 0, 0, 0)
|
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
||||||
ret = avcodec_parameters_from_context( audio_output_stream->codecpar, audio_output_context );
|
ret = avcodec_parameters_from_context( audio_output_stream->codecpar, audio_output_context );
|
||||||
if ( ret < 0 ) {
|
if ( ret < 0 ) {
|
||||||
Error( "Could not initialize stream parameteres");
|
Error( "Could not initialize stream parameteres");
|
||||||
|
@ -720,7 +738,7 @@ int VideoStore::writeAudioFramePacket( AVPacket *ipkt ) {
|
||||||
if ( audio_output_codec ) {
|
if ( audio_output_codec ) {
|
||||||
#ifdef HAVE_LIBAVRESAMPLE
|
#ifdef HAVE_LIBAVRESAMPLE
|
||||||
|
|
||||||
#if LIBAVCODEC_VERSION_CHECK(57, 0, 0, 0, 0)
|
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
||||||
ret = avcodec_send_packet( audio_input_context, ipkt );
|
ret = avcodec_send_packet( audio_input_context, ipkt );
|
||||||
if ( ret < 0 ) {
|
if ( ret < 0 ) {
|
||||||
Error("avcodec_send_packet fail %s", av_make_error_string(ret).c_str());
|
Error("avcodec_send_packet fail %s", av_make_error_string(ret).c_str());
|
||||||
|
@ -800,7 +818,7 @@ int VideoStore::writeAudioFramePacket( AVPacket *ipkt ) {
|
||||||
* Encode the audio frame and store it in the temporary packet.
|
* Encode the audio frame and store it in the temporary packet.
|
||||||
* The output audio stream encoder is used to do this.
|
* The output audio stream encoder is used to do this.
|
||||||
*/
|
*/
|
||||||
#if LIBAVCODEC_VERSION_CHECK(57, 0, 0, 0, 0)
|
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
||||||
if (( ret = avcodec_send_frame( audio_output_context, output_frame ) ) < 0 ) {
|
if (( ret = avcodec_send_frame( audio_output_context, output_frame ) ) < 0 ) {
|
||||||
Error( "Could not send frame (error '%s')",
|
Error( "Could not send frame (error '%s')",
|
||||||
av_make_error_string(ret).c_str());
|
av_make_error_string(ret).c_str());
|
||||||
|
|
|
@ -112,7 +112,7 @@ void Zone::Setup(
|
||||||
if ( config.record_diag_images ) {
|
if ( config.record_diag_images ) {
|
||||||
static char diag_path[PATH_MAX] = "";
|
static char diag_path[PATH_MAX] = "";
|
||||||
if ( ! diag_path[0] ) {
|
if ( ! diag_path[0] ) {
|
||||||
snprintf( diag_path, sizeof(diag_path), "%s/%s/diag-%d-poly.jpg", config.dir_events, monitor->Name(), id);
|
snprintf( diag_path, sizeof(diag_path), "%s/%s/diag-%d-poly.jpg", staticConfig.DIR_EVENTS.c_str(), monitor->Name(), id);
|
||||||
}
|
}
|
||||||
pg_image->WriteJpeg( diag_path );
|
pg_image->WriteJpeg( diag_path );
|
||||||
}
|
}
|
||||||
|
@ -233,7 +233,7 @@ bool Zone::CheckAlarms( const Image *delta_image ) {
|
||||||
if ( config.record_diag_images ) {
|
if ( config.record_diag_images ) {
|
||||||
static char diag_path[PATH_MAX] = "";
|
static char diag_path[PATH_MAX] = "";
|
||||||
if ( ! diag_path[0] ) {
|
if ( ! diag_path[0] ) {
|
||||||
snprintf( diag_path, sizeof(diag_path), "%s/%s/diag-%d-%d.jpg", config.dir_events, monitor->Name(), id, 1 );
|
snprintf( diag_path, sizeof(diag_path), "%s/%s/diag-%d-%d.jpg", staticConfig.DIR_EVENTS.c_str(), monitor->Name(), id, 1 );
|
||||||
}
|
}
|
||||||
diff_image->WriteJpeg( diag_path );
|
diff_image->WriteJpeg( diag_path );
|
||||||
}
|
}
|
||||||
|
@ -315,7 +315,7 @@ bool Zone::CheckAlarms( const Image *delta_image ) {
|
||||||
if ( config.record_diag_images ) {
|
if ( config.record_diag_images ) {
|
||||||
static char diag_path[PATH_MAX] = "";
|
static char diag_path[PATH_MAX] = "";
|
||||||
if ( !diag_path[0] ) {
|
if ( !diag_path[0] ) {
|
||||||
snprintf( diag_path, sizeof(diag_path), "%s/%d/diag-%d-%d.jpg", config.dir_events, monitor->Id(), id, 2 );
|
snprintf( diag_path, sizeof(diag_path), "%s/%d/diag-%d-%d.jpg", staticConfig.DIR_EVENTS.c_str(), monitor->Id(), id, 2 );
|
||||||
}
|
}
|
||||||
diff_image->WriteJpeg( diag_path );
|
diff_image->WriteJpeg( diag_path );
|
||||||
}
|
}
|
||||||
|
@ -525,7 +525,7 @@ bool Zone::CheckAlarms( const Image *delta_image ) {
|
||||||
if ( config.record_diag_images ) {
|
if ( config.record_diag_images ) {
|
||||||
static char diag_path[PATH_MAX] = "";
|
static char diag_path[PATH_MAX] = "";
|
||||||
if ( !diag_path[0] ) {
|
if ( !diag_path[0] ) {
|
||||||
snprintf( diag_path, sizeof(diag_path), "%s/%d/diag-%d-%d.jpg", config.dir_events, monitor->Id(), id, 3 );
|
snprintf( diag_path, sizeof(diag_path), "%s/%d/diag-%d-%d.jpg", staticConfig.DIR_EVENTS.c_str(), monitor->Id(), id, 3 );
|
||||||
}
|
}
|
||||||
diff_image->WriteJpeg( diag_path );
|
diff_image->WriteJpeg( diag_path );
|
||||||
}
|
}
|
||||||
|
@ -572,7 +572,7 @@ bool Zone::CheckAlarms( const Image *delta_image ) {
|
||||||
if ( config.record_diag_images ) {
|
if ( config.record_diag_images ) {
|
||||||
static char diag_path[PATH_MAX] = "";
|
static char diag_path[PATH_MAX] = "";
|
||||||
if ( !diag_path[0] ) {
|
if ( !diag_path[0] ) {
|
||||||
snprintf( diag_path, sizeof(diag_path), "%s/%d/diag-%d-%d.jpg", config.dir_events, monitor->Id(), id, 4 );
|
snprintf( diag_path, sizeof(diag_path), "%s/%d/diag-%d-%d.jpg", staticConfig.DIR_EVENTS.c_str(), monitor->Id(), id, 4 );
|
||||||
}
|
}
|
||||||
diff_image->WriteJpeg( diag_path );
|
diff_image->WriteJpeg( diag_path );
|
||||||
}
|
}
|
||||||
|
@ -792,7 +792,7 @@ bool Zone::ParseZoneString( const char *zone_string, int &zone_id, int &colour,
|
||||||
zone_id = strtol( str, 0, 10 );
|
zone_id = strtol( str, 0, 10 );
|
||||||
Debug( 3, "Got zone %d from zone string", zone_id );
|
Debug( 3, "Got zone %d from zone string", zone_id );
|
||||||
if ( !ws ) {
|
if ( !ws ) {
|
||||||
delete str_ptr;
|
delete[] str_ptr;
|
||||||
return( true );
|
return( true );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -806,7 +806,7 @@ bool Zone::ParseZoneString( const char *zone_string, int &zone_id, int &colour,
|
||||||
colour = strtol( str, 0, 16 );
|
colour = strtol( str, 0, 16 );
|
||||||
Debug( 3, "Got colour %06x from zone string", colour );
|
Debug( 3, "Got colour %06x from zone string", colour );
|
||||||
if ( !ws ) {
|
if ( !ws ) {
|
||||||
delete str_ptr;
|
delete[] str_ptr;
|
||||||
return( true );
|
return( true );
|
||||||
}
|
}
|
||||||
*ws = '\0';
|
*ws = '\0';
|
||||||
|
|
|
@ -140,7 +140,7 @@ installtrusty () {
|
||||||
pkgname="build/zoneminder_${VERSION}-${RELEASE}_amd64.deb"
|
pkgname="build/zoneminder_${VERSION}-${RELEASE}_amd64.deb"
|
||||||
|
|
||||||
if [ -e $pkgname ]; then
|
if [ -e $pkgname ]; then
|
||||||
sudo gdebi --non-interactive $pkgname
|
sudo gdebi --quiet --non-interactive $pkgname
|
||||||
mysql -uzmuser -pzmpass zm < db/test.monitor.sql
|
mysql -uzmuser -pzmpass zm < db/test.monitor.sql
|
||||||
sudo /usr/bin/zmpkg.pl start
|
sudo /usr/bin/zmpkg.pl start
|
||||||
sudo /usr/bin/zmfilter.pl -f purgewhenfull
|
sudo /usr/bin/zmfilter.pl -f purgewhenfull
|
||||||
|
@ -259,7 +259,7 @@ if [ "${TRAVIS_EVENT_TYPE}" == "cron" ] || [ "${TRAVIS}" != "true" ]; then
|
||||||
mypid=$!
|
mypid=$!
|
||||||
packpack/packpack -f utils/packpack/redhat_package.mk redhat_package > buildlog.txt 2>&1
|
packpack/packpack -f utils/packpack/redhat_package.mk redhat_package > buildlog.txt 2>&1
|
||||||
kill $mypid
|
kill $mypid
|
||||||
tail -n 1000 buildlog.txt
|
tail -n 3000 buildlog.txt | grep -v ONVIF
|
||||||
|
|
||||||
# Steps common to Debian based distros
|
# Steps common to Debian based distros
|
||||||
elif [ "${OS}" == "debian" ] || [ "${OS}" == "ubuntu" ]; then
|
elif [ "${OS}" == "debian" ] || [ "${OS}" == "ubuntu" ]; then
|
||||||
|
@ -283,7 +283,7 @@ if [ "${TRAVIS_EVENT_TYPE}" == "cron" ] || [ "${TRAVIS}" != "true" ]; then
|
||||||
mypid=$!
|
mypid=$!
|
||||||
packpack/packpack > buildlog.txt 2>&1
|
packpack/packpack > buildlog.txt 2>&1
|
||||||
kill $mypid
|
kill $mypid
|
||||||
tail -n 1000 buildlog.txt
|
tail -n 3000 buildlog.txt | grep -v ONVIF
|
||||||
|
|
||||||
if [ "${OS}" == "ubuntu" ] && [ "${DIST}" == "trusty" ] && [ "${ARCH}" == "x86_64" ] && [ "${TRAVIS}" == "true" ]; then
|
if [ "${OS}" == "ubuntu" ] && [ "${DIST}" == "trusty" ] && [ "${ARCH}" == "x86_64" ] && [ "${TRAVIS}" == "true" ]; then
|
||||||
installtrusty
|
installtrusty
|
||||||
|
@ -307,7 +307,7 @@ elif [ "${OS}" == "ubuntu" ] && [ "${DIST}" == "trusty" ] && [ "${ARCH}" == "x86
|
||||||
mypid=$!
|
mypid=$!
|
||||||
packpack/packpack > buildlog.txt 2>&1
|
packpack/packpack > buildlog.txt 2>&1
|
||||||
kill $mypid
|
kill $mypid
|
||||||
tail -n 1000 buildlog.txt
|
tail -n 3000 buildlog.txt | grep -v ONVIF
|
||||||
|
|
||||||
# If we are running inside Travis then attempt to install the deb we just built
|
# If we are running inside Travis then attempt to install the deb we just built
|
||||||
if [ "${TRAVIS}" == "true" ]; then
|
if [ "${TRAVIS}" == "true" ]; then
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
if ( canEdit( 'Monitors' ) ) {
|
||||||
|
switch ( $_REQUEST['action'] ) {
|
||||||
|
case 'sort' :
|
||||||
|
{
|
||||||
|
$monitor_ids = $_POST['monitor_ids'];
|
||||||
|
# Two concurrent sorts could generate odd sortings... so lock the table.
|
||||||
|
global $dbConn;
|
||||||
|
$dbConn->beginTransaction();
|
||||||
|
$dbConn->exec( 'LOCK TABLES Monitors WRITE' );
|
||||||
|
for ( $i = 0; $i < count($monitor_ids); $i += 1 ) {
|
||||||
|
$monitor_id = $monitor_ids[$i];
|
||||||
|
$monitor_id = preg_replace( '/^monitor_id-/', '', $monitor_id );
|
||||||
|
if ( ( ! $monitor_id ) or ! ( is_integer( $monitor_id ) or ctype_digit( $monitor_id ) ) ) {
|
||||||
|
Warning( "Got $monitor_id from " . $monitor_ids[$i] );
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
dbQuery( 'UPDATE Monitors SET Sequence=? WHERE Id=?', array( $i, $monitor_id ) );
|
||||||
|
} // end for each monitor_id
|
||||||
|
$dbConn->commit();
|
||||||
|
$dbConn->exec('UNLOCK TABLES');
|
||||||
|
|
||||||
|
return;
|
||||||
|
} // end case sort
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
Warning("unknown action " . $_REQUEST['action'] );
|
||||||
|
} // end ddcase default
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Warning("Cannot edit monitors" );
|
||||||
|
}
|
||||||
|
|
||||||
|
ajaxError( 'Unrecognised action or insufficient permissions' );
|
||||||
|
|
||||||
|
?>
|
File diff suppressed because one or more lines are too long
|
@ -800,7 +800,6 @@ if ( !empty($action) ) {
|
||||||
switch( $_REQUEST['tab'] ) {
|
switch( $_REQUEST['tab'] ) {
|
||||||
case 'system' :
|
case 'system' :
|
||||||
case 'config' :
|
case 'config' :
|
||||||
case 'paths' :
|
|
||||||
$restartWarning = true;
|
$restartWarning = true;
|
||||||
break;
|
break;
|
||||||
case 'web' :
|
case 'web' :
|
||||||
|
|
|
@ -1283,6 +1283,7 @@ function parseFilter( &$filter, $saveToSession=false, $querySep='&' ) {
|
||||||
case 'MaxScore':
|
case 'MaxScore':
|
||||||
case 'Cause':
|
case 'Cause':
|
||||||
case 'Notes':
|
case 'Notes':
|
||||||
|
case 'StateId':
|
||||||
case 'Archived':
|
case 'Archived':
|
||||||
$filter['sql'] .= 'E.'.$filter['terms'][$i]['attr'];
|
$filter['sql'] .= 'E.'.$filter['terms'][$i]['attr'];
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -125,6 +125,7 @@ $SLANG = array(
|
||||||
'AttrMaxScore' => 'Max. Score',
|
'AttrMaxScore' => 'Max. Score',
|
||||||
'AttrMonitorId' => 'Monitor Id',
|
'AttrMonitorId' => 'Monitor Id',
|
||||||
'AttrMonitorName' => 'Monitor Name',
|
'AttrMonitorName' => 'Monitor Name',
|
||||||
|
'AttrStateId' => 'Run State',
|
||||||
'AttrServer' => 'Server',
|
'AttrServer' => 'Server',
|
||||||
'AttrName' => 'Name',
|
'AttrName' => 'Name',
|
||||||
'AttrNotes' => 'Notes',
|
'AttrNotes' => 'Notes',
|
||||||
|
|
|
@ -336,14 +336,14 @@ th.table-th-sort span.table-th-sort-span {
|
||||||
float: right;
|
float: right;
|
||||||
width: 12px;
|
width: 12px;
|
||||||
height: 12px;
|
height: 12px;
|
||||||
background: url("../graphics/arrow-s-u.gif") no-repeat 0 0;
|
background: url("/skins/classic/graphics/arrow-s-u.png") no-repeat 0 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
th.table-th-sort-rev span.table-th-sort-span {
|
th.table-th-sort-rev span.table-th-sort-span {
|
||||||
float: right;
|
float: right;
|
||||||
width: 12px;
|
width: 12px;
|
||||||
height: 12px;
|
height: 12px;
|
||||||
background: url("../graphics/arrow-s-d.gif") no-repeat 0 0;
|
background: url("/skins/classic/graphics/arrow-s-d.png") no-repeat 0 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.table-tr-odd {
|
.table-tr-odd {
|
||||||
|
|
|
@ -61,12 +61,8 @@
|
||||||
text-align: left;
|
text-align: left;
|
||||||
}
|
}
|
||||||
|
|
||||||
#consoleTable .colOrder {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
#consoleTable .colMark {
|
#consoleTable .colMark {
|
||||||
width: 32px;
|
width: 62px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,13 +81,3 @@
|
||||||
#consoleTable .colLeftButtons input {
|
#consoleTable .colLeftButtons input {
|
||||||
margin-right: 24px;
|
margin-right: 24px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#consoleTable .colRightButtons {
|
|
||||||
text-align: right;
|
|
||||||
padding-right: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#consoleTable .colRightButtons input {
|
|
||||||
margin: 0 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -345,14 +345,14 @@ th.table-th-sort span.table-th-sort-span {
|
||||||
float: right;
|
float: right;
|
||||||
width: 12px;
|
width: 12px;
|
||||||
height: 12px;
|
height: 12px;
|
||||||
background: url("../graphics/arrow-s-u.gif") no-repeat 0 0;
|
background: url("/skins/classic/graphics/arrow-s-u.png") no-repeat 0 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
th.table-th-sort-rev span.table-th-sort-span {
|
th.table-th-sort-rev span.table-th-sort-span {
|
||||||
float: right;
|
float: right;
|
||||||
width: 12px;
|
width: 12px;
|
||||||
height: 12px;
|
height: 12px;
|
||||||
background: url("../graphics/arrow-s-d.gif") no-repeat 0 0;
|
background: url("/skins/classic/graphics/arrow-s-d.png") no-repeat 0 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.table-tr-odd {
|
.table-tr-odd {
|
||||||
|
|
|
@ -61,12 +61,8 @@
|
||||||
text-align: left;
|
text-align: left;
|
||||||
}
|
}
|
||||||
|
|
||||||
#consoleTable .colOrder {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
#consoleTable .colMark {
|
#consoleTable .colMark {
|
||||||
width: 32px;
|
width: 62px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,13 +81,3 @@
|
||||||
#consoleTable .colLeftButtons input {
|
#consoleTable .colLeftButtons input {
|
||||||
margin-right: 24px;
|
margin-right: 24px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#consoleTable .colRightButtons {
|
|
||||||
text-align: right;
|
|
||||||
padding-right: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#consoleTable .colRightButtons input {
|
|
||||||
margin: 0 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -333,14 +333,14 @@ th.table-th-sort span.table-th-sort-span {
|
||||||
float: right;
|
float: right;
|
||||||
width: 12px;
|
width: 12px;
|
||||||
height: 12px;
|
height: 12px;
|
||||||
background: url("../graphics/arrow-s-u.gif") no-repeat 0 0;
|
background: url("/skins/classic/graphics/arrow-s-u.png") no-repeat 0 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
th.table-th-sort-rev span.table-th-sort-span {
|
th.table-th-sort-rev span.table-th-sort-span {
|
||||||
float: right;
|
float: right;
|
||||||
width: 12px;
|
width: 12px;
|
||||||
height: 12px;
|
height: 12px;
|
||||||
background: url("../graphics/arrow-s-d.gif") no-repeat 0 0;
|
background: url("/skins/classic/graphics/arrow-s-d.png") no-repeat 0 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.table-tr-odd {
|
.table-tr-odd {
|
||||||
|
|
|
@ -61,12 +61,8 @@
|
||||||
text-align: left;
|
text-align: left;
|
||||||
}
|
}
|
||||||
|
|
||||||
#consoleTable .colOrder {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
#consoleTable .colMark {
|
#consoleTable .colMark {
|
||||||
width: 32px;
|
width: 62px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,13 +81,3 @@
|
||||||
#consoleTable .colLeftButtons input {
|
#consoleTable .colLeftButtons input {
|
||||||
margin-right: 24px;
|
margin-right: 24px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#consoleTable .colRightButtons {
|
|
||||||
text-align: right;
|
|
||||||
padding-right: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#consoleTable .colRightButtons input {
|
|
||||||
margin: 0 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -49,9 +49,7 @@ function xhtmlHeaders( $file, $title ) {
|
||||||
<link rel="shortcut icon" href="graphics/favicon.ico"/>
|
<link rel="shortcut icon" href="graphics/favicon.ico"/>
|
||||||
<link rel="stylesheet" href="css/reset.css" type="text/css"/>
|
<link rel="stylesheet" href="css/reset.css" type="text/css"/>
|
||||||
<link rel="stylesheet" href="css/overlay.css" type="text/css"/>
|
<link rel="stylesheet" href="css/overlay.css" type="text/css"/>
|
||||||
<?php if ( in_array($basename, $new_views) ) { ?>
|
|
||||||
<link rel="stylesheet" href="css/bootstrap.min.css" type="text/css"/>
|
<link rel="stylesheet" href="css/bootstrap.min.css" type="text/css"/>
|
||||||
<?php } ?>
|
|
||||||
<link rel="stylesheet" href="<?php echo $skinCssFile ?>" type="text/css" media="screen"/>
|
<link rel="stylesheet" href="<?php echo $skinCssFile ?>" type="text/css" media="screen"/>
|
||||||
<?php
|
<?php
|
||||||
if ( $viewCssFile ) {
|
if ( $viewCssFile ) {
|
||||||
|
@ -74,6 +72,19 @@ function xhtmlHeaders( $file, $title ) {
|
||||||
<script type="text/javascript" src="tools/mootools/mootools-core.js"></script>
|
<script type="text/javascript" src="tools/mootools/mootools-core.js"></script>
|
||||||
<script type="text/javascript" src="tools/mootools/mootools-more.js"></script>
|
<script type="text/javascript" src="tools/mootools/mootools-more.js"></script>
|
||||||
<script type="text/javascript" src="js/mootools.ext.js"></script>
|
<script type="text/javascript" src="js/mootools.ext.js"></script>
|
||||||
|
<script type="text/javascript" src="skins/<?php echo $skin; ?>/js/jquery.js"></script>
|
||||||
|
<script type="text/javascript" src="skins/<?php echo $skin; ?>/js/jquery-ui.js"></script>
|
||||||
|
<script type="text/javascript" src="skins/<?php echo $skin; ?>/js/bootstrap.min.js"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
//<![CDATA[
|
||||||
|
<!--
|
||||||
|
var $j = jQuery.noConflict();
|
||||||
|
// $j is now an alias to the jQuery function; creating the new alias is optional.
|
||||||
|
|
||||||
|
//-->
|
||||||
|
//]]>
|
||||||
|
</script>
|
||||||
|
|
||||||
<script type="text/javascript" src="js/logger.js"></script>
|
<script type="text/javascript" src="js/logger.js"></script>
|
||||||
<script type="text/javascript" src="js/overlay.js"></script>
|
<script type="text/javascript" src="js/overlay.js"></script>
|
||||||
<?php if ( $title == 'Login' && (defined('ZM_OPT_USE_GOOG_RECAPTCHA') && ZM_OPT_USE_GOOG_RECAPTCHA) ) { ?>
|
<?php if ( $title == 'Login' && (defined('ZM_OPT_USE_GOOG_RECAPTCHA') && ZM_OPT_USE_GOOG_RECAPTCHA) ) { ?>
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
jquery-ui-1.11.3.js
|
|
@ -88,7 +88,6 @@ $maxHeight = 0;
|
||||||
$cycleCount = 0;
|
$cycleCount = 0;
|
||||||
$minSequence = 0;
|
$minSequence = 0;
|
||||||
$maxSequence = 1;
|
$maxSequence = 1;
|
||||||
$seqIdList = array();
|
|
||||||
$monitors = dbFetchAll( "select * from Monitors order by Sequence asc" );
|
$monitors = dbFetchAll( "select * from Monitors order by Sequence asc" );
|
||||||
$displayMonitors = array();
|
$displayMonitors = array();
|
||||||
for ( $i = 0; $i < count($monitors); $i++ ) {
|
for ( $i = 0; $i < count($monitors); $i++ ) {
|
||||||
|
@ -99,12 +98,6 @@ for ( $i = 0; $i < count($monitors); $i++ ) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$monitors[$i]['Show'] = true;
|
$monitors[$i]['Show'] = true;
|
||||||
if ( empty($minSequence) || ($monitors[$i]['Sequence'] < $minSequence) ) {
|
|
||||||
$minSequence = $monitors[$i]['Sequence'];
|
|
||||||
}
|
|
||||||
if ( $monitors[$i]['Sequence'] > $maxSequence ) {
|
|
||||||
$maxSequence = $monitors[$i]['Sequence'];
|
|
||||||
}
|
|
||||||
$monitors[$i]['zmc'] = zmcStatus( $monitors[$i] );
|
$monitors[$i]['zmc'] = zmcStatus( $monitors[$i] );
|
||||||
$monitors[$i]['zma'] = zmaStatus( $monitors[$i] );
|
$monitors[$i]['zma'] = zmaStatus( $monitors[$i] );
|
||||||
$monitors[$i]['ZoneCount'] = dbFetchOne( 'select count(Id) as ZoneCount from Zones where MonitorId = ?', 'ZoneCount', array($monitors[$i]['Id']) );
|
$monitors[$i]['ZoneCount'] = dbFetchOne( 'select count(Id) as ZoneCount from Zones where MonitorId = ?', 'ZoneCount', array($monitors[$i]['Id']) );
|
||||||
|
@ -125,27 +118,8 @@ for ( $i = 0; $i < count($monitors); $i++ ) {
|
||||||
if ( $maxHeight < $scaleHeight ) $maxHeight = $scaleHeight;
|
if ( $maxHeight < $scaleHeight ) $maxHeight = $scaleHeight;
|
||||||
}
|
}
|
||||||
if ( $counts ) $monitors[$i] = array_merge( $monitors[$i], $counts );
|
if ( $counts ) $monitors[$i] = array_merge( $monitors[$i], $counts );
|
||||||
$seqIdList[] = $monitors[$i]['Id'];
|
|
||||||
$displayMonitors[] = $monitors[$i];
|
$displayMonitors[] = $monitors[$i];
|
||||||
}
|
}
|
||||||
$lastId = 0;
|
|
||||||
$seqIdUpList = array();
|
|
||||||
foreach ( $seqIdList as $seqId ) {
|
|
||||||
if ( !empty($lastId) )
|
|
||||||
$seqIdUpList[$seqId] = $lastId;
|
|
||||||
else
|
|
||||||
$seqIdUpList[$seqId] = $seqId;
|
|
||||||
$lastId = $seqId;
|
|
||||||
}
|
|
||||||
$lastId = 0;
|
|
||||||
$seqIdDownList = array();
|
|
||||||
foreach ( array_reverse($seqIdList) as $seqId ) {
|
|
||||||
if ( !empty($lastId) )
|
|
||||||
$seqIdDownList[$seqId] = $lastId;
|
|
||||||
else
|
|
||||||
$seqIdDownList[$seqId] = $seqId;
|
|
||||||
$lastId = $seqId;
|
|
||||||
}
|
|
||||||
|
|
||||||
$cycleWidth = $maxWidth;
|
$cycleWidth = $maxWidth;
|
||||||
$cycleHeight = $maxHeight;
|
$cycleHeight = $maxHeight;
|
||||||
|
@ -165,9 +139,6 @@ foreach( $displayMonitors as $monitor ) {
|
||||||
$zoneCount += $monitor['ZoneCount'];
|
$zoneCount += $monitor['ZoneCount'];
|
||||||
}
|
}
|
||||||
|
|
||||||
$seqUpFile = getSkinFile( 'graphics/seq-u.png' );
|
|
||||||
$seqDownFile = getSkinFile( 'graphics/seq-d.png' );
|
|
||||||
|
|
||||||
$versionClass = (ZM_DYN_DB_VERSION&&(ZM_DYN_DB_VERSION!=ZM_VERSION))?'errorText':'';
|
$versionClass = (ZM_DYN_DB_VERSION&&(ZM_DYN_DB_VERSION!=ZM_VERSION))?'errorText':'';
|
||||||
|
|
||||||
$left_columns = 3;
|
$left_columns = 3;
|
||||||
|
@ -239,21 +210,14 @@ if ( ZM_OPT_USE_AUTH ) {
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
<th class="colZones"><?php echo translate('Zones') ?></th>
|
<th class="colZones"><?php echo translate('Zones') ?></th>
|
||||||
<?php
|
|
||||||
if ( canEdit('Monitors') ) {
|
|
||||||
?>
|
|
||||||
<th class="colOrder"><?php echo translate('Order') ?></th>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
<th class="colMark"><?php echo translate('Mark') ?></th>
|
<th class="colMark"><?php echo translate('Mark') ?></th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody id="consoleTableBody">
|
||||||
<?php
|
<?php
|
||||||
foreach( $displayMonitors as $monitor ) {
|
foreach( $displayMonitors as $monitor ) {
|
||||||
?>
|
?>
|
||||||
<tr>
|
<tr id="<?php echo 'monitor_id-'.$monitor['Id'] ?>">
|
||||||
<?php
|
<?php
|
||||||
if ( !$monitor['zmc'] ) {
|
if ( !$monitor['zmc'] ) {
|
||||||
$dclass = 'errorText';
|
$dclass = 'errorText';
|
||||||
|
@ -312,14 +276,10 @@ echo $Server->Name();
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
<td class="colZones"><?php echo makePopupLink( '?view=zones&mid='.$monitor['Id'], 'zmZones', array( 'zones', $monitor['Width'], $monitor['Height'] ), $monitor['ZoneCount'], $running && canView( 'Monitors' ) ) ?></td>
|
<td class="colZones"><?php echo makePopupLink( '?view=zones&mid='.$monitor['Id'], 'zmZones', array( 'zones', $monitor['Width'], $monitor['Height'] ), $monitor['ZoneCount'], $running && canView( 'Monitors' ) ) ?></td>
|
||||||
<?php
|
<td class="colMark">
|
||||||
if ( canEdit('Monitors') ) {
|
<input type="checkbox" name="markMids[]" value="<?php echo $monitor['Id'] ?>" onclick="setButtonStates( this )"<?php if ( !canEdit( 'Monitors' ) ) { ?> disabled="disabled"<?php } ?>/>
|
||||||
?>
|
<span class="glyphicon glyphicon-sort"></span>
|
||||||
<td class="colOrder"><?php echo makeLink( '?view='.$view.'&action=sequence&mid='.$monitor['Id'].'&smid='.$seqIdUpList[$monitor['Id']], '<img src="'.$seqUpFile.'" alt="Up"/>', $monitor['Sequence']>$minSequence ) ?><?php echo makeLink( '?view='.$view.'&action=sequence&mid='.$monitor['Id'].'&smid='.$seqIdDownList[$monitor['Id']], '<img src="'.$seqDownFile.'" alt="Down"/>', $monitor['Sequence']<$maxSequence ) ?></td>
|
</td>
|
||||||
<?php
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
<td class="colMark"><input type="checkbox" name="markMids[]" value="<?php echo $monitor['Id'] ?>" onclick="setButtonStates( this )"<?php if ( !canEdit( 'Monitors' ) ) { ?> disabled="disabled"<?php } ?>/></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<?php
|
<?php
|
||||||
}
|
}
|
||||||
|
@ -332,6 +292,8 @@ echo $Server->Name();
|
||||||
<input type="button" name="addBtn" value="<?php echo translate('AddNewMonitor') ?>" onclick="addMonitor( this )"/>
|
<input type="button" name="addBtn" value="<?php echo translate('AddNewMonitor') ?>" onclick="addMonitor( this )"/>
|
||||||
<!-- <?php echo makePopupButton( '?view=monitor', 'zmMonitor0', 'monitor', translate('AddNewMonitor'), (canEdit( 'Monitors' ) && !$user['MonitorIds']) ) ?> -->
|
<!-- <?php echo makePopupButton( '?view=monitor', 'zmMonitor0', 'monitor', translate('AddNewMonitor'), (canEdit( 'Monitors' ) && !$user['MonitorIds']) ) ?> -->
|
||||||
<?php echo makePopupButton( '?view=filter&filter[terms][0][attr]=DateTime&filter[terms][0][op]=%3c&filter[terms][0][val]=now', 'zmFilter', 'filter', translate('Filters'), canView( 'Events' ) ) ?>
|
<?php echo makePopupButton( '?view=filter&filter[terms][0][attr]=DateTime&filter[terms][0][op]=%3c&filter[terms][0][val]=now', 'zmFilter', 'filter', translate('Filters'), canView( 'Events' ) ) ?>
|
||||||
|
<input type="button" name="editBtn" value="<?php echo translate('Edit') ?>" onclick="editMonitor( this )" disabled="disabled"/>
|
||||||
|
<input type="button" name="deleteBtn" value="<?php echo translate('Delete') ?>" onclick="deleteMonitor( this )" disabled="disabled"/>
|
||||||
</td>
|
</td>
|
||||||
<?php
|
<?php
|
||||||
for ( $i = 0; $i < count($eventCounts); $i++ ) {
|
for ( $i = 0; $i < count($eventCounts); $i++ ) {
|
||||||
|
@ -342,10 +304,7 @@ for ( $i = 0; $i < count($eventCounts); $i++ ) {
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
<td class="colZones"><?php echo $zoneCount ?></td>
|
<td class="colZones"><?php echo $zoneCount ?></td>
|
||||||
<td class="colRightButtons" colspan="<?php echo canEdit('Monitors')?2:1 ?>">
|
<td class="colMark"></td>
|
||||||
<input type="button" name="editBtn" value="<?php echo translate('Edit') ?>" onclick="editMonitor( this )" disabled="disabled"/>
|
|
||||||
<input type="button" name="deleteBtn" value="<?php echo translate('Delete') ?>" onclick="deleteMonitor( this )" disabled="disabled"/>
|
|
||||||
</td>
|
|
||||||
</tr>
|
</tr>
|
||||||
</tfoot>
|
</tfoot>
|
||||||
</table>
|
</table>
|
||||||
|
|
|
@ -92,6 +92,7 @@ $attrTypes = array(
|
||||||
'DiskPercent' => translate('AttrDiskPercent'),
|
'DiskPercent' => translate('AttrDiskPercent'),
|
||||||
'DiskBlocks' => translate('AttrDiskBlocks'),
|
'DiskBlocks' => translate('AttrDiskBlocks'),
|
||||||
'SystemLoad' => translate('AttrSystemLoad'),
|
'SystemLoad' => translate('AttrSystemLoad'),
|
||||||
|
'StateId' => translate('AttrStateId'),
|
||||||
'ServerId' => translate('AttrServer'),
|
'ServerId' => translate('AttrServer'),
|
||||||
);
|
);
|
||||||
$opTypes = array(
|
$opTypes = array(
|
||||||
|
@ -209,6 +210,15 @@ for ( $i = 0; isset($_REQUEST['filter']) && $i < count($_REQUEST['filter']['term
|
||||||
<script type="text/javascript">Calendar.setup( { inputField: "filter[terms][<?php echo $i ?>][val]", ifFormat: "%Y-%m-%d", showOthers: true, weekNumbers: false });</script>
|
<script type="text/javascript">Calendar.setup( { inputField: "filter[terms][<?php echo $i ?>][val]", ifFormat: "%Y-%m-%d", showOthers: true, weekNumbers: false });</script>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</td>
|
</td>
|
||||||
|
<?php
|
||||||
|
} elseif ( $_REQUEST['filter']['terms'][$i]['attr'] == 'StateId' ) {
|
||||||
|
$states = array();
|
||||||
|
foreach ( dbFetchAll( 'SELECT Id,Name FROM States ORDER BY lower(Name) ASC' ) as $state_row ) {
|
||||||
|
$states[$state_row['Id']] = $state_row['Name'];
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
<td><?php echo buildSelect( "filter[terms][$i][op]", $opTypes ); ?></td>
|
||||||
|
<td><?php echo buildSelect( "filter[terms][$i][val]", $states ); ?></td>
|
||||||
<?php
|
<?php
|
||||||
} elseif ( $_REQUEST['filter']['terms'][$i]['attr'] == 'Weekday' ) {
|
} elseif ( $_REQUEST['filter']['terms'][$i]['attr'] == 'Weekday' ) {
|
||||||
?>
|
?>
|
||||||
|
|
|
@ -74,6 +74,27 @@ function initPage() {
|
||||||
createPopup( '?view=version', 'zmVersion', 'version' );
|
createPopup( '?view=version', 'zmVersion', 'version' );
|
||||||
if ( showDonatePopup )
|
if ( showDonatePopup )
|
||||||
createPopup( '?view=donate', 'zmDonate', 'donate' );
|
createPopup( '?view=donate', 'zmDonate', 'donate' );
|
||||||
|
|
||||||
|
// Makes table sortable
|
||||||
|
$j( function() {
|
||||||
|
$j( "#consoleTableBody" ).sortable({
|
||||||
|
handle: ".glyphicon-sort",
|
||||||
|
update: applySort,
|
||||||
|
axis:'Y' } );
|
||||||
|
$j( "#consoleTableBody" ).disableSelection();
|
||||||
|
} );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function applySort(event, ui) {
|
||||||
|
var monitor_ids = $j(this).sortable('toArray');
|
||||||
|
var ajax = new Request.JSON( {
|
||||||
|
url: '/index.php?request=console',
|
||||||
|
data: { monitor_ids: monitor_ids, action: 'sort' },
|
||||||
|
method: 'post',
|
||||||
|
timeout: AJAX_TIMEOUT
|
||||||
|
} );
|
||||||
|
ajax.send();
|
||||||
|
} // end function applySort(event,ui)
|
||||||
|
|
||||||
|
|
||||||
window.addEvent( 'domready', initPage );
|
window.addEvent( 'domready', initPage );
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
var logParms = "view=request&request=log&task=query";
|
var logParms = "view=request&request=log&task=query";
|
||||||
var logReq = new Request.JSON( { url: thisUrl, method: 'post', timeout: AJAX_TIMEOUT, link: 'cancel', onSuccess: logResponse } );
|
var logReq = new Request.JSON( { url: thisUrl, method: 'get', timeout: AJAX_TIMEOUT, link: 'cancel', onSuccess: logResponse } );
|
||||||
var logTimer = undefined;
|
var logTimer = undefined;
|
||||||
var logTable = undefined;
|
var logTable = undefined;
|
||||||
|
|
||||||
|
@ -75,7 +75,7 @@ function logResponse( respObj ) {
|
||||||
var color = document.defaultView.getComputedStyle(row.tr, null).getPropertyValue('color');
|
var color = document.defaultView.getComputedStyle(row.tr, null).getPropertyValue('color');
|
||||||
var colorParts = color.match(/^rgb.*\((\d+),\s*(\d+),\s*(\d+)/);
|
var colorParts = color.match(/^rgb.*\((\d+),\s*(\d+),\s*(\d+)/);
|
||||||
rowOrigColor = '#' + parseInt(colorParts[1]).toString(16) + parseInt(colorParts[2]).toString(16) + parseInt(colorParts[3]).toString(16);
|
rowOrigColor = '#' + parseInt(colorParts[1]).toString(16) + parseInt(colorParts[2]).toString(16) + parseInt(colorParts[3]).toString(16);
|
||||||
new Fx.Tween( row.tr, { duration: 10000, transition: Fx.Transitions.Sine } ).start( 'color', '#6495ED', rowOrigColor );
|
//new Fx.Tween( row.tr, { duration: 10000, transition: Fx.Transitions.Sine } ).start( 'color', '#6495ED', rowOrigColor );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
|
@ -77,33 +77,33 @@ function getMonitorObject( $mid = null ) {
|
||||||
} else {
|
} else {
|
||||||
$monitor = array(
|
$monitor = array(
|
||||||
'Id' => 0,
|
'Id' => 0,
|
||||||
'Name' => "willbereplaced",
|
'Name' => 'willbereplaced',
|
||||||
'Function' => "Monitor",
|
'Function' => 'Monitor',
|
||||||
'Enabled' => true,
|
'Enabled' => true,
|
||||||
'LinkedMonitors' => "",
|
'LinkedMonitors' => '',
|
||||||
'Type' => "",
|
'Type' => '',
|
||||||
'Device' => "/dev/video0",
|
'Device' => '/dev/video0',
|
||||||
'Channel' => "0",
|
'Channel' => '0',
|
||||||
'Format' => 0x000000ff,
|
'Format' => 0x000000ff,
|
||||||
'Protocol' => "",
|
'Protocol' => '',
|
||||||
'Method' => "",
|
'Method' => '',
|
||||||
'Host' => "",
|
'Host' => '',
|
||||||
'Path' => "",
|
'Path' => '',
|
||||||
'Options' => "",
|
'Options' => '',
|
||||||
'Port' => "80",
|
'Port' => "80",
|
||||||
'User' => "",
|
'User' => '',
|
||||||
'Pass' => "",
|
'Pass' => '',
|
||||||
'Colours' => 3,
|
'Colours' => 3,
|
||||||
'Palette' => 0,
|
'Palette' => 0,
|
||||||
'Width' => "320",
|
'Width' => '320',
|
||||||
'Height' => "240",
|
'Height' => '240',
|
||||||
'Orientation' => "0",
|
'Orientation' => '0',
|
||||||
'Deinterlacing' => 0,
|
'Deinterlacing' => 0,
|
||||||
'RTSPDescribe' => 0,
|
'RTSPDescribe' => 0,
|
||||||
'SaveJPEGs' => "3",
|
'SaveJPEGs' => '3',
|
||||||
'VideoWriter' => "0",
|
'VideoWriter' => '0',
|
||||||
'EncoderParameters' => "# Lines beginning with # are a comment \n# For changing quality, use the crf option\n# 1 is best, 51 is worst quality\n#crf=23\n",
|
'EncoderParameters' => "# Lines beginning with # are a comment \n# For changing quality, use the crf option\n# 1 is best, 51 is worst quality\n#crf=23\n",
|
||||||
'RecordAudio' => "0",
|
'RecordAudio' => '0',
|
||||||
'LabelFormat' => '%N - %d/%m/%y %H:%M:%S',
|
'LabelFormat' => '%N - %d/%m/%y %H:%M:%S',
|
||||||
'LabelX' => 0,
|
'LabelX' => 0,
|
||||||
'LabelY' => 0,
|
'LabelY' => 0,
|
||||||
|
@ -115,23 +115,23 @@ function getMonitorObject( $mid = null ) {
|
||||||
'StreamReplayBuffer' => 1000,
|
'StreamReplayBuffer' => 1000,
|
||||||
'AlarmFrameCount' => 1,
|
'AlarmFrameCount' => 1,
|
||||||
'Controllable' => 0,
|
'Controllable' => 0,
|
||||||
'ControlId' => "",
|
'ControlId' => '',
|
||||||
'ControlType' => 0,
|
'ControlType' => 0,
|
||||||
'ControlDevice' => "",
|
'ControlDevice' => '',
|
||||||
'ControlAddress' => "",
|
'ControlAddress' => '',
|
||||||
'AutoStopTimeout' => "",
|
'AutoStopTimeout' => '',
|
||||||
'TrackMotion' => 0,
|
'TrackMotion' => 0,
|
||||||
'TrackDelay' => "",
|
'TrackDelay' => '',
|
||||||
'ReturnLocation' => -1,
|
'ReturnLocation' => -1,
|
||||||
'ReturnDelay' => "",
|
'ReturnDelay' => '',
|
||||||
'SectionLength' => 600,
|
'SectionLength' => 600,
|
||||||
'FrameSkip' => 0,
|
'FrameSkip' => 0,
|
||||||
'MotionFrameSkip' => 0,
|
'MotionFrameSkip' => 0,
|
||||||
'EventPrefix' => 'Event-',
|
'EventPrefix' => 'Event-',
|
||||||
'AnalysisFPS' => "",
|
'AnalysisFPS' => '',
|
||||||
'AnalysisUpdateDelay' => 0,
|
'AnalysisUpdateDelay' => 0,
|
||||||
'MaxFPS' => "",
|
'MaxFPS' => '',
|
||||||
'AlarmMaxFPS' => "",
|
'AlarmMaxFPS' => '',
|
||||||
'FPSReportInterval' => 1000,
|
'FPSReportInterval' => 1000,
|
||||||
'RefBlendPerc' => 6,
|
'RefBlendPerc' => 6,
|
||||||
'AlarmRefBlendPerc' => 6,
|
'AlarmRefBlendPerc' => 6,
|
||||||
|
@ -141,7 +141,7 @@ function getMonitorObject( $mid = null ) {
|
||||||
'SignalCheckColour' => '#0000c0',
|
'SignalCheckColour' => '#0000c0',
|
||||||
'WebColour' => 'red',
|
'WebColour' => 'red',
|
||||||
'Exif' => '0',
|
'Exif' => '0',
|
||||||
'Triggers' => "",
|
'Triggers' => '',
|
||||||
'V4LMultiBuffer' => '',
|
'V4LMultiBuffer' => '',
|
||||||
'V4LCapturesPerFrame' => 1,
|
'V4LCapturesPerFrame' => 1,
|
||||||
'ServerId' => $Server['Id'],
|
'ServerId' => $Server['Id'],
|
||||||
|
@ -160,7 +160,7 @@ if ( isset( $_REQUEST['newMonitor'] ) ) {
|
||||||
$newX10Monitor = $_REQUEST['newX10Monitor'];
|
$newX10Monitor = $_REQUEST['newX10Monitor'];
|
||||||
} else {
|
} else {
|
||||||
$newMonitor = $monitor;
|
$newMonitor = $monitor;
|
||||||
$newMonitor['Triggers'] = explode( ',', isset($monitor['Triggers'])?$monitor['Triggers']:"" );
|
$newMonitor['Triggers'] = explode( ',', isset($monitor['Triggers'])?$monitor['Triggers']:'' );
|
||||||
if ( ZM_OPT_X10 )
|
if ( ZM_OPT_X10 )
|
||||||
$newX10Monitor = $x10Monitor;
|
$newX10Monitor = $x10Monitor;
|
||||||
}
|
}
|
||||||
|
@ -239,9 +239,9 @@ $rtspFFMpegMethods = array(
|
||||||
);
|
);
|
||||||
|
|
||||||
$httpMethods = array(
|
$httpMethods = array(
|
||||||
'simple' => "Simple",
|
'simple' => 'Simple',
|
||||||
'regexp' => "Regexp",
|
'regexp' => 'Regexp',
|
||||||
'jpegTags' => "JPEG Tags"
|
'jpegTags' => 'JPEG Tags'
|
||||||
);
|
);
|
||||||
|
|
||||||
if ( !ZM_PCRE )
|
if ( !ZM_PCRE )
|
||||||
|
@ -264,7 +264,7 @@ if ( ZM_HAS_V4L1 ) {
|
||||||
$v4l1MaxChannels = 15;
|
$v4l1MaxChannels = 15;
|
||||||
$v4l1DeviceChannels = array();
|
$v4l1DeviceChannels = array();
|
||||||
for ( $i = 0; $i <= $v4l1MaxChannels; $i++ )
|
for ( $i = 0; $i <= $v4l1MaxChannels; $i++ )
|
||||||
$v4l1DeviceChannels['$i'] = $i;
|
$v4l1DeviceChannels[$i] = $i;
|
||||||
|
|
||||||
$v4l1LocalPalettes = array(
|
$v4l1LocalPalettes = array(
|
||||||
translate('Grey') => 1,
|
translate('Grey') => 1,
|
||||||
|
@ -694,7 +694,7 @@ switch ( $tab ) {
|
||||||
<td>
|
<td>
|
||||||
<select name="monitorIds" size="4" multiple="multiple" onchange="updateLinkedMonitors( this )">
|
<select name="monitorIds" size="4" multiple="multiple" onchange="updateLinkedMonitors( this )">
|
||||||
<?php
|
<?php
|
||||||
$monitors = dbFetchAll( "select Id,Name from Monitors order by Sequence asc" );
|
$monitors = dbFetchAll( 'select Id,Name from Monitors order by Sequence asc' );
|
||||||
if ( !empty($newMonitor['LinkedMonitors']) )
|
if ( !empty($newMonitor['LinkedMonitors']) )
|
||||||
$monitorIds = array_flip( explode( ',', $newMonitor['LinkedMonitors'] ) );
|
$monitorIds = array_flip( explode( ',', $newMonitor['LinkedMonitors'] ) );
|
||||||
else
|
else
|
||||||
|
@ -714,8 +714,14 @@ switch ( $tab ) {
|
||||||
<?php
|
<?php
|
||||||
if ( $newMonitor['Type'] != 'Local' && $newMonitor['Type'] != 'File' ) {
|
if ( $newMonitor['Type'] != 'Local' && $newMonitor['Type'] != 'File' ) {
|
||||||
?>
|
?>
|
||||||
<tr><td><?php echo translate('MaximumFPS') ?> (<?php echo makePopupLink('?view=optionhelp&option=OPTIONS_MAXFPS', 'zmOptionHelp', 'optionhelp', '?' ) ?>)</td><td><input type="text" onclick="document.getElementById('newMonitor[MaxFPS]').innerHTML= ' CAUTION: See the help text'" name="newMonitor[MaxFPS]" value="<?php echo validHtmlStr($newMonitor['MaxFPS']) ?>" size="5"/><span id="newMonitor[MaxFPS]" style="color:red"></span></td></tr>
|
<tr>
|
||||||
<tr><td><?php echo translate('AlarmMaximumFPS') ?> (<?php echo makePopupLink('?view=optionhelp&option=OPTIONS_MAXFPS', 'zmOptionHelp', 'optionhelp', '?' ) ?>)</td><td><input type="text" onclick="document.getElementById('newMonitor[AlarmMaxFPS]').innerHTML= ' CAUTION: See the help text'" name="newMonitor[AlarmMaxFPS]" value="<?php echo validHtmlStr($newMonitor['AlarmMaxFPS']) ?>" size="5"/><span id="newMonitor[AlarmMaxFPS]" style="color:red"></span></td></tr>
|
<td><?php echo translate('MaximumFPS') ?> (<?php echo makePopupLink('?view=optionhelp&option=OPTIONS_MAXFPS', 'zmOptionHelp', 'optionhelp', '?' ) ?>)</td>
|
||||||
|
<td><input type="text" onclick="document.getElementById('newMonitor[MaxFPS]').innerHTML= ' CAUTION: See the help text'" name="newMonitor[MaxFPS]" value="<?php echo validHtmlStr($newMonitor['MaxFPS']) ?>" size="5"/><span id="newMonitor[MaxFPS]" style="color:red"></span></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><?php echo translate('AlarmMaximumFPS') ?> (<?php echo makePopupLink('?view=optionhelp&option=OPTIONS_MAXFPS', 'zmOptionHelp', 'optionhelp', '?' ) ?>)</td>
|
||||||
|
<td><input type="text" onclick="document.getElementById('newMonitor[AlarmMaxFPS]').innerHTML= ' CAUTION: See the help text'" name="newMonitor[AlarmMaxFPS]" value="<?php echo validHtmlStr($newMonitor['AlarmMaxFPS']) ?>" size="5"/><span id="newMonitor[AlarmMaxFPS]" style="color:red"></span></td>
|
||||||
|
</tr>
|
||||||
<?php
|
<?php
|
||||||
} else {
|
} else {
|
||||||
?>
|
?>
|
||||||
|
|
|
@ -31,7 +31,6 @@ $tabs['skins'] = translate('Display');
|
||||||
$tabs['system'] = translate('System');
|
$tabs['system'] = translate('System');
|
||||||
$tabs['config'] = translate('Config');
|
$tabs['config'] = translate('Config');
|
||||||
$tabs['servers'] = translate('Servers');
|
$tabs['servers'] = translate('Servers');
|
||||||
$tabs['paths'] = translate('Paths');
|
|
||||||
$tabs['web'] = translate('Web');
|
$tabs['web'] = translate('Web');
|
||||||
$tabs['images'] = translate('Images');
|
$tabs['images'] = translate('Images');
|
||||||
$tabs['logging'] = translate('Logging');
|
$tabs['logging'] = translate('Logging');
|
||||||
|
|
40
zm.conf.in
40
zm.conf.in
|
@ -50,3 +50,43 @@ ZM_DB_USER=@ZM_DB_USER@
|
||||||
# ZoneMinder database password
|
# ZoneMinder database password
|
||||||
ZM_DB_PASS=@ZM_DB_PASS@
|
ZM_DB_PASS=@ZM_DB_PASS@
|
||||||
|
|
||||||
|
# Full path to the folder events are recorded to.
|
||||||
|
# The web account user must have full read/write permission to this folder.
|
||||||
|
ZM_DIR_EVENTS=@ZM_DIR_EVENTS@
|
||||||
|
|
||||||
|
# Full path to the folder images, not directly associated with events,
|
||||||
|
# are recorded to.
|
||||||
|
# The web account user must have full read/write permission to this folder.
|
||||||
|
ZM_DIR_IMAGES=@ZM_DIR_IMAGES@
|
||||||
|
|
||||||
|
# Foldername under the webroot where ZoneMinder looks for optional sound files
|
||||||
|
# to play when an alarm is detected.
|
||||||
|
ZM_DIR_SOUNDS=@ZM_DIR_SOUNDS@
|
||||||
|
|
||||||
|
# Full path to the folder where exported archives are stored
|
||||||
|
# The web account user must have full read/write permission to this folder.
|
||||||
|
ZM_DIR_EXPORTS=@ZM_TMPDIR@
|
||||||
|
|
||||||
|
# ZoneMinder url path to the zms streaming server
|
||||||
|
ZM_PATH_ZMS=@ZM_PATH_ZMS@
|
||||||
|
|
||||||
|
# Full Path to ZoneMinder's mapped memory files
|
||||||
|
# The web account user must have full read/write permission to this folder.
|
||||||
|
ZM_PATH_MAP=@ZM_PATH_MAP@
|
||||||
|
|
||||||
|
# Full Path to ZoneMinder's socket folder
|
||||||
|
# The web account user must have full read/write permission to this folder.
|
||||||
|
ZM_PATH_SOCKS=@ZM_SOCKDIR@
|
||||||
|
|
||||||
|
# Full path to ZoneMinder's log folder
|
||||||
|
# The web account user must have full read/write permission to this folder.
|
||||||
|
ZM_PATH_LOGS=@ZM_LOGDIR@
|
||||||
|
|
||||||
|
# Full path to ZoneMinder's swap folder
|
||||||
|
# The web account user must have full read/write permission to this folder.
|
||||||
|
ZM_PATH_SWAP=@ZM_TMPDIR@
|
||||||
|
|
||||||
|
# Full path to optional arp binary
|
||||||
|
# ZoneMinder will find the arp binary automatically on most systems
|
||||||
|
ZM_PATH_ARP=@ZM_PATH_ARP@
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,7 @@
|
||||||
#cmakedefine HAVE_LIBGNUTLS 1
|
#cmakedefine HAVE_LIBGNUTLS 1
|
||||||
#cmakedefine HAVE_GNUTLS_OPENSSL_H 1
|
#cmakedefine HAVE_GNUTLS_OPENSSL_H 1
|
||||||
#cmakedefine HAVE_GNUTLS_GNUTLS_H 1
|
#cmakedefine HAVE_GNUTLS_GNUTLS_H 1
|
||||||
#cmakedefine HAVE_LIBMYSQLCLIENT 1
|
#cmakedefine HAVE_LIBMYSQL 1
|
||||||
#cmakedefine HAVE_MYSQL_H 1
|
#cmakedefine HAVE_MYSQL_H 1
|
||||||
#cmakedefine HAVE_LIBX264 1
|
#cmakedefine HAVE_LIBX264 1
|
||||||
#cmakedefine HAVE_X264_H 1
|
#cmakedefine HAVE_X264_H 1
|
||||||
|
|
Loading…
Reference in New Issue