From 1e8e710f5aba4cca962cfdf8659a9b46658176e2 Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Sun, 10 Aug 2014 08:47:11 -0500 Subject: [PATCH] full systemd support --- .travis.yml | 2 +- CMakeLists.txt | 11 +++- cmake/Modules/FindGLIB2.cmake | 55 ++++++++++++++++++ cmake/Modules/FindPolkit.cmake | 63 +++++++++++++++++++++ configure.ac | 11 +++- distros/fedora/zoneminder.cmake.f19.spec | 8 ++- distros/fedora/zoneminder.f19.spec | 8 ++- distros/opensuse/zoneminder.cmake.OS13.spec | 8 ++- distros/redhat/zoneminder.cmake.el6.spec | 8 ++- distros/redhat/zoneminder.el6.spec | 8 ++- misc/CMakeLists.txt | 7 +++ misc/Makefile.am | 12 +++- misc/com.zoneminder.systemctl.policy.in | 22 +++++++ misc/com.zoneminder.systemctl.rules.in | 7 +++ misc/zoneminder.service.in | 18 ++++++ scripts/CMakeLists.txt | 5 +- scripts/Makefile.am | 4 +- scripts/zmpkg.pl.in | 40 +++++++++++++ scripts/zmsystemctl.pl | 52 +++++++++++++++++ 19 files changed, 331 insertions(+), 18 deletions(-) create mode 100644 cmake/Modules/FindGLIB2.cmake create mode 100644 cmake/Modules/FindPolkit.cmake create mode 100644 misc/com.zoneminder.systemctl.policy.in create mode 100644 misc/com.zoneminder.systemctl.rules.in create mode 100644 misc/zoneminder.service.in create mode 100644 scripts/zmsystemctl.pl diff --git a/.travis.yml b/.travis.yml index 2fbe33bed..e4332caa8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,7 +18,7 @@ compiler: - gcc before_install: - sudo apt-get update -qq - - sudo apt-get install -y -qq zlib1g-dev apache2 mysql-server php5 php5-mysql build-essential libmysqlclient-dev libssl-dev libbz2-dev libpcre3-dev libdbi-perl libarchive-zip-perl libdate-manip-perl libdevice-serialport-perl libmime-perl libwww-perl libdbd-mysql-perl libsys-mmap-perl yasm automake autoconf cmake libjpeg-turbo8-dev apache2-mpm-prefork libapache2-mod-php5 php5-cli libtheora-dev libvorbis-dev libvpx-dev libx264-dev 2>&1 > /dev/null + - sudo apt-get install -y -qq libpolkit-gobject-1-dev zlib1g-dev apache2 mysql-server php5 php5-mysql build-essential libmysqlclient-dev libssl-dev libbz2-dev libpcre3-dev libdbi-perl libarchive-zip-perl libdate-manip-perl libdevice-serialport-perl libmime-perl libwww-perl libdbd-mysql-perl libsys-mmap-perl yasm automake autoconf cmake libjpeg-turbo8-dev apache2-mpm-prefork libapache2-mod-php5 php5-cli libtheora-dev libvorbis-dev libvpx-dev libx264-dev 2>&1 > /dev/null install: - git clone --depth=10 --branch=master git://source.ffmpeg.org/ffmpeg.git - cd ffmpeg diff --git a/CMakeLists.txt b/CMakeLists.txt index a093dba92..005e889cf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -476,6 +476,12 @@ endif(NOT ZM_WEB_GROUP) message(STATUS "Using web user: ${ZM_WEB_USER}") message(STATUS "Using web group: ${ZM_WEB_GROUP}") +# Check for polkit +find_package(Polkit) +if(NOT POLKIT_FOUND) + message(FATAL_ERROR "Running ZoneMinder requires polkit. Building ZoneMinder requires the polkit development package.") +endif(NOT POLKIT_FOUND) + # Some variables that zm expects set(ZM_PID "${ZM_RUNDIR}/zm.pid") set(ZM_CONFIG "/${CMAKE_INSTALL_SYSCONFDIR}/zm.conf") @@ -502,16 +508,15 @@ add_subdirectory(src) add_subdirectory(scripts) add_subdirectory(db) add_subdirectory(web) +add_subdirectory(misc) -# Process misc subdirectories +# Process distro subdirectories if(ZM_TARGET_DISTRO STREQUAL "f19") add_subdirectory(distros/fedora) elseif(ZM_TARGET_DISTRO STREQUAL "el6") add_subdirectory(distros/redhat) elseif(ZM_TARGET_DISTRO STREQUAL "OS13") add_subdirectory(distros/opensuse) -else(ZM_TARGET_DISTRO STREQUAL "el6") - add_subdirectory(misc) endif(ZM_TARGET_DISTRO STREQUAL "f19") # Print optional libraries detection status diff --git a/cmake/Modules/FindGLIB2.cmake b/cmake/Modules/FindGLIB2.cmake new file mode 100644 index 000000000..083144dea --- /dev/null +++ b/cmake/Modules/FindGLIB2.cmake @@ -0,0 +1,55 @@ +# - Try to find the GLIB2 libraries +# Once done this will define +# +# GLIB2_FOUND - system has glib2 +# GLIB2_INCLUDE_DIR - the glib2 include directory +# GLIB2_LIBRARIES - glib2 library + +# Copyright (c) 2008 Laurent Montel, +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + + +if(GLIB2_INCLUDE_DIR AND GLIB2_LIBRARIES) + # Already in cache, be silent + set(GLIB2_FIND_QUIETLY TRUE) +endif(GLIB2_INCLUDE_DIR AND GLIB2_LIBRARIES) + +if (NOT WIN32) + find_package(PkgConfig) + if (PKG_CONFIG_FOUND) + pkg_check_modules(PC_LibGLIB2 glib-2.0) + endif (PKG_CONFIG_FOUND) +endif(NOT WIN32) + +if (PC_LibGLIB2_INCLUDEDIR) + set(GLIB2_MAIN_INCLUDE_DIR ${PC_LibGLIB2_INCLUDEDIR}) +else (PC_LibGLIB2_INCLUDEDIR) + find_path(GLIB2_MAIN_INCLUDE_DIR NAMES glib.h PATH_SUFFIXES glib-2.0) +endif (PC_LibGLIB2_INCLUDEDIR) + +# search the glibconfig.h include dir under the same root where the library is found +find_library(GLIB2_LIBRARIES + NAMES glib-2.0 + HINTS ${PC_LibGLIB2_LIBDIR} +) + +get_filename_component(glib2LibDir "${GLIB2_LIBRARIES}" PATH) + +find_path(GLIB2_INTERNAL_INCLUDE_DIR glibconfig.h + PATH_SUFFIXES glib-2.0/include + HINTS ${PC_LibGLIB2_INCLUDEDIR} "${glib2LibDir}" ${CMAKE_SYSTEM_LIBRARY_PATH}) + +set(GLIB2_INCLUDE_DIR "${GLIB2_MAIN_INCLUDE_DIR}") + +# not sure if this include dir is optional or required +# for now it is optional +if(GLIB2_INTERNAL_INCLUDE_DIR) + set(GLIB2_INCLUDE_DIR ${GLIB2_INCLUDE_DIR} "${GLIB2_INTERNAL_INCLUDE_DIR}") +endif(GLIB2_INTERNAL_INCLUDE_DIR) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(GLIB2 DEFAULT_MSG GLIB2_LIBRARIES GLIB2_MAIN_INCLUDE_DIR) + +mark_as_advanced(GLIB2_INCLUDE_DIR GLIB2_LIBRARIES) diff --git a/cmake/Modules/FindPolkit.cmake b/cmake/Modules/FindPolkit.cmake new file mode 100644 index 000000000..62b386a90 --- /dev/null +++ b/cmake/Modules/FindPolkit.cmake @@ -0,0 +1,63 @@ + # - Try to find Polkit + # Once done this will define + # + # POLKIT_FOUND - system has Polkit + # POLKIT_INCLUDE_DIRS - Polkit's include directories + # POLKIT_AGENT_INCLUDE_DIRS - Polkit-agent's include directories + # POLKIT_LIBRARIES - Link this to use polkit's gobject library + # POLKIT_AGENT_LIBRARY - Link this to use the agent wrapper in polkit + # POLKIT_DEFINITIONS - Compiler switches required for using Polkit + # Copyright (c) 2009, Dario Freddi, + # + # Redistribution and use is allowed according to the terms of the BSD license. + # For details see the accompanying COPYING-CMAKE-SCRIPTS file. + #NOTE: Polkit agent library is disabled! + if (POLKIT_INCLUDE_DIR AND POLKIT_LIB) + set(POLKIT_FIND_QUIETLY TRUE) + endif (POLKIT_INCLUDE_DIR AND POLKIT_LIB) + if (NOT WIN32) + # use pkg-config to get the directories and then use these values + # in the FIND_PATH() and FIND_LIBRARY() calls + find_package(PkgConfig) + pkg_check_modules(PC_POLKIT polkit-gobject-1) + #pkg_check_modules(PC_POLKIT_AGENT polkit-agent-1) + set(POLKIT_DEFINITIONS ${PC_POLKIT_CFLAGS_OTHER}) + endif (NOT WIN32) + # We must include glib paths too... which sucks balls + find_package(GLIB2) + find_path( GLIB_CONFIG_INCLUDE_DIR + NAMES glibconfig.h + PATH_SUFFIXES glib-2.0/include + HINTS ${PC_POLKIT_INCLUDE_DIRS} + ) + find_path( POLKIT_INCLUDE_DIR + NAMES polkit/polkit.h + PATH_SUFFIXES polkit-1 + HINTS ${PC_POLKIT_INCLUDE_DIRS} + ) + #find_path( POLKIT_AGENT_INCLUDE_DIR + # NAMES polkitagent/polkitagent.h + # PATH_SUFFIXES polkit-1 + # HINTS ${PC_POLKIT_AGENT_INCLUDE_DIRS} + #) + #set(POLKIT_INCLUDE_DIRS ${GLIB2_INCLUDE_DIR} ${_POLKIT_INCLUDE_DIR}) + #set(POLKIT_AGENT_INCLUDE_DIRS ${GLIB2_INCLUDE_DIR} ${_POLKIT_AGENT_INCLUDE_DIR}) + find_library( POLKIT_LIBRARIES + NAMES polkit-gobject-1 + HINTS ${PC_POLKIT_LIBDIR} + ) + #find_library( POLKIT_AGENT_LIBRARY + # NAMES polkit-agent-1 + # HINTS ${PC_POLKIT_AGENT_LIBDIR} + #) + #set(POLKIT_LIBRARIES ${_POLKIT_LIBRARIES} ${GLIB2_LIBRARIES}) + #set(POLKIT_AGENT_LIBRARY ${_POLKIT_AGENT_LIBRARY} ${GLIB2_LIBRARIES}) + include(FindPackageHandleStandardArgs) + # handle the QUIETLY and REQUIRED arguments and set POLKIT_FOUND to TRUE if + # all listed variables are TRUE + #find_package_handle_standard_args(Polkit DEFAULT_MSG POLKIT_LIBRARIES POLKIT_AGENT_LIBRARY + # POLKIT_INCLUDE_DIR POLKIT_AGENT_INCLUDE_DIR GLIB2_FOUND) + find_package_handle_standard_args(Polkit DEFAULT_MSG POLKIT_LIBRARIES + POLKIT_INCLUDE_DIR GLIB2_FOUND) + mark_as_advanced(POLKIT_INCLUDE_DIRS POLKIT_AGENT_INCLUDE_DIRS POLKIT_LIBRARIES POLKIT_AGENT_LIBRARY GLIB_INCLUDE_DIR) + set(POLKIT_POLICY_FILES_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/share/polkit-1/actions) diff --git a/configure.ac b/configure.ac index 5bf6c6d40..49538528c 100644 --- a/configure.ac +++ b/configure.ac @@ -123,6 +123,15 @@ AC_SUBST(MARIADB_LIBS) AC_SUBST(MARIADB_CFLAGS) LDFLAGS="$LDFLAGS ${MARIADB_LIBS}" +POLKIT_PREFIX=/usr +AC_ARG_WITH(polkit, +[ --with-polkit= prefix of polkit root directory, default /usr], +[POLKIT_PREFIX=$with_polkit], +AC_MSG_WARN([You can call configure with the --with-polkit option. +This tells configure where to place the polkit policy files.]) +) +AC_SUBST(POLKIT_PREFIX) +PKG_CHECK_MODULES(POLKIT, polkit-gobject-1) FFMPEG_PREFIX=/usr AC_ARG_WITH(ffmpeg, @@ -433,7 +442,7 @@ AC_SUBST(PERL_MM_PARMS) AC_SUBST(EXTRA_PERL_LIB) -AC_CONFIG_FILES([Makefile zm.conf zmconfgen.pl db/Makefile db/zm_create.sql misc/Makefile misc/apache.conf misc/logrotate.conf misc/syslog.conf scripts/Makefile scripts/zm scripts/zmaudit.pl scripts/zmcontrol.pl scripts/zmdc.pl scripts/zmfilter.pl scripts/zmpkg.pl scripts/zmtrack.pl scripts/zmcamtool.pl scripts/zmtrigger.pl scripts/zmupdate.pl scripts/zmvideo.pl scripts/zmwatch.pl scripts/zmx10.pl scripts/zmdbbackup scripts/zmdbrestore scripts/zmeventdump scripts/zmlogrotate.conf scripts/ZoneMinder/lib/ZoneMinder/Base.pm scripts/ZoneMinder/lib/ZoneMinder/Config.pm scripts/ZoneMinder/lib/ZoneMinder/Memory.pm scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm src/Makefile src/zm_config.h web/Makefile web/ajax/Makefile web/css/Makefile web/graphics/Makefile web/includes/Makefile web/includes/config.php web/js/Makefile web/lang/Makefile web/skins/Makefile web/skins/classic/Makefile web/skins/classic/ajax/Makefile web/skins/classic/css/Makefile web/skins/classic/graphics/Makefile web/skins/classic/includes/Makefile web/skins/classic/js/Makefile web/skins/classic/lang/Makefile web/skins/classic/views/Makefile web/skins/classic/views/css/Makefile web/skins/classic/views/js/Makefile web/skins/mobile/Makefile web/skins/mobile/ajax/Makefile web/skins/mobile/css/Makefile web/skins/mobile/graphics/Makefile web/skins/mobile/includes/Makefile web/skins/mobile/lang/Makefile web/skins/mobile/views/Makefile web/skins/mobile/views/css/Makefile web/tools/Makefile web/tools/mootools/Makefile web/views/Makefile web/skins/xml/Makefile web/skins/xml/views/Makefile web/skins/xml/includes/Makefile web/skins/flat/Makefile web/skins/flat/ajax/Makefile web/skins/flat/css/Makefile web/skins/flat/graphics/Makefile web/skins/flat/includes/Makefile web/skins/flat/js/Makefile web/skins/flat/lang/Makefile web/skins/flat/views/Makefile web/skins/flat/views/css/Makefile web/skins/flat/views/js/Makefile]) +AC_CONFIG_FILES([Makefile zm.conf zmconfgen.pl db/Makefile db/zm_create.sql misc/Makefile misc/apache.conf misc/logrotate.conf misc/syslog.conf misc/com.zoneminder.systemctl.policy misc/com.zoneminder.systemctl.rules scripts/Makefile scripts/zm scripts/zmaudit.pl scripts/zmcontrol.pl scripts/zmdc.pl scripts/zmfilter.pl scripts/zmpkg.pl scripts/zmtrack.pl scripts/zmcamtool.pl scripts/zmtrigger.pl scripts/zmupdate.pl scripts/zmvideo.pl scripts/zmwatch.pl scripts/zmx10.pl scripts/zmdbbackup scripts/zmdbrestore scripts/zmeventdump scripts/zmlogrotate.conf scripts/ZoneMinder/lib/ZoneMinder/Base.pm scripts/ZoneMinder/lib/ZoneMinder/Config.pm scripts/ZoneMinder/lib/ZoneMinder/Memory.pm scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm src/Makefile src/zm_config.h web/Makefile web/ajax/Makefile web/css/Makefile web/graphics/Makefile web/includes/Makefile web/includes/config.php web/js/Makefile web/lang/Makefile web/skins/Makefile web/skins/classic/Makefile web/skins/classic/ajax/Makefile web/skins/classic/css/Makefile web/skins/classic/graphics/Makefile web/skins/classic/includes/Makefile web/skins/classic/js/Makefile web/skins/classic/lang/Makefile web/skins/classic/views/Makefile web/skins/classic/views/css/Makefile web/skins/classic/views/js/Makefile web/skins/mobile/Makefile web/skins/mobile/ajax/Makefile web/skins/mobile/css/Makefile web/skins/mobile/graphics/Makefile web/skins/mobile/includes/Makefile web/skins/mobile/lang/Makefile web/skins/mobile/views/Makefile web/skins/mobile/views/css/Makefile web/tools/Makefile web/tools/mootools/Makefile web/views/Makefile web/skins/xml/Makefile web/skins/xml/views/Makefile web/skins/xml/includes/Makefile web/skins/flat/Makefile web/skins/flat/ajax/Makefile web/skins/flat/css/Makefile web/skins/flat/graphics/Makefile web/skins/flat/includes/Makefile web/skins/flat/js/Makefile web/skins/flat/lang/Makefile web/skins/flat/views/Makefile web/skins/flat/views/css/Makefile web/skins/flat/views/js/Makefile]) # Create the definitions for compilation and defaults for the database AC_CONFIG_COMMANDS([src/zm_config_defines.h],[perl ./zmconfgen.pl]) diff --git a/distros/fedora/zoneminder.cmake.f19.spec b/distros/fedora/zoneminder.cmake.f19.spec index 8609baa35..3a039132a 100644 --- a/distros/fedora/zoneminder.cmake.f19.spec +++ b/distros/fedora/zoneminder.cmake.f19.spec @@ -37,10 +37,10 @@ BuildRequires: gcc gcc-c++ vlc-devel libcurl-devel %{!?_without_ffmpeg:BuildRequires: ffmpeg-devel} %{!?_without_x10:BuildRequires: perl(X10::ActiveHome) perl(Astro::SunTime)} # cmake needs the following installed at build time due to the way it auto-detects certain parameters -BuildRequires: httpd +BuildRequires: httpd polkit-devel %{!?_without_ffmpeg:BuildRequires: ffmpeg} -Requires: httpd php php-mysql cambozola +Requires: httpd php php-mysql cambozola polkit Requires: libjpeg-turbo vlc-core libcurl Requires: perl(:MODULE_COMPAT_%(eval "`%{__perl} -V:version`"; echo $version)) Requires: perl(DBD::mysql) perl(Archive::Tar) perl(Archive::Zip) @@ -149,6 +149,7 @@ fi %{_bindir}/zmvideo.pl %{_bindir}/zmwatch.pl %{_bindir}/zmcamtool.pl +%{_bindir}/zmsystemctl.pl %{!?_without_x10:%{_bindir}/zmx10.pl} %{perl_vendorlib}/ZoneMinder* @@ -161,6 +162,9 @@ fi %{_datadir}/zoneminder/db %{_datadir}/zoneminder/www +%{_datadir}/polkit-1/actions/com.zoneminder.systemctl.policy +%{_datadir}/polkit-1/rules.d/com.zoneminder.systemctl.rules + %dir %attr(755,%{zmuid_final},%{zmgid_final}) /var/lib/zoneminder %dir %attr(755,%{zmuid_final},%{zmgid_final}) /var/lib/zoneminder/events %dir %attr(755,%{zmuid_final},%{zmgid_final}) /var/lib/zoneminder/images diff --git a/distros/fedora/zoneminder.f19.spec b/distros/fedora/zoneminder.f19.spec index f383b5c0e..49349fc1f 100644 --- a/distros/fedora/zoneminder.f19.spec +++ b/distros/fedora/zoneminder.f19.spec @@ -49,11 +49,11 @@ BuildRequires: perl(PHP::Serialization) perl(Sys::Mmap) BuildRequires: perl(Time::HiRes) perl(Net::SFTP::Foreign) BuildRequires: perl(Expect) perl(Sys::Syslog) BuildRequires: gcc gcc-c++ vlc-devel libcurl-devel -BuildRequires: autoconf autoconf-archive +BuildRequires: autoconf autoconf-archive polkit-devel %{!?_without_ffmpeg:BuildRequires: ffmpeg-devel} %{!?_without_x10:BuildRequires: perl(X10::ActiveHome) perl(Astro::SunTime)} -Requires: httpd php php-mysql cambozola +Requires: httpd php php-mysql cambozola polkit Requires: libjpeg-turbo libcurl vlc-core ffmpeg Requires: perl(:MODULE_COMPAT_%(eval "`%{__perl} -V:version`"; echo $version)) Requires: perl(DBD::mysql) perl(Archive::Tar) perl(Archive::Zip) @@ -240,6 +240,7 @@ fi %{_bindir}/zmvideo.pl %{_bindir}/zmwatch.pl %{_bindir}/zmcamtool.pl +%{_bindir}/zmsystemctl.pl %{!?_without_x10:%{_bindir}/zmx10.pl} %{perl_vendorlib}/ZoneMinder* @@ -250,6 +251,9 @@ fi %{_datadir}/zoneminder/db %{_datadir}/zoneminder/www +%{_datadir}/polkit-1/actions/com.zoneminder.systemctl.policy +%{_datadir}/polkit-1/rules.d/com.zoneminder.systemctl.rules + %dir %attr(755,%{zmuid_final},%{zmgid_final}) /var/lib/zoneminder %dir %attr(755,%{zmuid_final},%{zmgid_final}) /var/lib/zoneminder/events %dir %attr(755,%{zmuid_final},%{zmgid_final}) /var/lib/zoneminder/images diff --git a/distros/opensuse/zoneminder.cmake.OS13.spec b/distros/opensuse/zoneminder.cmake.OS13.spec index 51723d46d..e1a55d3cb 100644 --- a/distros/opensuse/zoneminder.cmake.OS13.spec +++ b/distros/opensuse/zoneminder.cmake.OS13.spec @@ -26,13 +26,13 @@ Source: ZoneMinder-%{version}.tar.gz # patch no longer necessary as OpenSuse now in standard build # Patch1: zoneminder-1.26.5-opensuse.patch -BuildRequires: cmake +BuildRequires: cmake polkit-devel BuildRequires: perl-DBI perl-DBD-mysql perl-Date-Manip perl-Sys-Mmap BuildRequires: libjpeg62 libjpeg62-devel libmysqld-devel libSDL-devel libgcrypt-devel libgnutls-devel BuildRequires: libffmpeg-devel x264 BuildRequires: pcre-devel w32codec-all -Requires: apache2 apache2-mod_php5 mysql +Requires: apache2 apache2-mod_php5 mysql polkit Requires: ffmpeg libavformat55 Requires: php php-mysql Requires: perl(:MODULE_COMPAT_%(eval "`%{__perl} -V:version`"; echo $version)) @@ -158,6 +158,10 @@ fi %{webcgi}/nph-zms %{webcgi}/zms %{webroot}/zoneminder + +%{_datadir}/polkit-1/actions/com.zoneminder.systemctl.policy +%{_datadir}/polkit-1/rules.d/com.zoneminder.systemctl.rules + %dir %attr(755,%{zmuid_final},%{zmgid_final}) %{webroot}/zoneminder/events %dir %attr(755,%{zmuid_final},%{zmgid_final}) %{webroot}/zoneminder/images %dir %attr(755,%{zmuid_final},%{zmgid_final}) %{webroot}/zoneminder/temp diff --git a/distros/redhat/zoneminder.cmake.el6.spec b/distros/redhat/zoneminder.cmake.el6.spec index c877c0081..bc5d1a251 100644 --- a/distros/redhat/zoneminder.cmake.el6.spec +++ b/distros/redhat/zoneminder.cmake.el6.spec @@ -28,11 +28,11 @@ BuildRequires: perl(MIME::Entity) perl(MIME::Lite) BuildRequires: perl(PHP::Serialization) perl(Sys::Mmap) BuildRequires: perl(Time::HiRes) perl(Net::SFTP::Foreign) BuildRequires: perl(Expect) perl(X10::ActiveHome) perl(Astro::SunTime) -BuildRequires: libcurl-devel vlc-devel ffmpeg-devel +BuildRequires: libcurl-devel vlc-devel ffmpeg-devel polkit-devel # cmake needs the following installed at build time due to the way it auto-detects certain parameters BuildRequires: httpd ffmpeg -Requires: httpd php php-mysql mysql-server libjpeg-turbo +Requires: httpd php php-mysql mysql-server libjpeg-turbo polkit Requires: perl(:MODULE_COMPAT_%(eval "`%{__perl} -V:version`"; echo $version)) Requires: perl(DBD::mysql) perl(Archive::Tar) perl(Archive::Zip) Requires: perl(MIME::Entity) perl(MIME::Lite) perl(Net::SMTP) perl(Net::FTP) @@ -138,6 +138,7 @@ rm -rf %{_docdir}/%{name}-%{version} %{_bindir}/zmvideo.pl %{_bindir}/zmwatch.pl %{_bindir}/zmcamtool.pl +%{_bindir}/zmsystemctl.pl %{_bindir}/zmx10.pl %{perl_vendorlib}/ZoneMinder* @@ -149,6 +150,9 @@ rm -rf %{_docdir}/%{name}-%{version} %{_datadir}/%{name}/db %{_datadir}/%{name}/www +%{_datadir}/polkit-1/actions/com.zoneminder.systemctl.policy +%{_datadir}/polkit-1/rules.d/com.zoneminder.systemctl.rules + %dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/lib/zoneminder %dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/lib/zoneminder/events %dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/lib/zoneminder/images diff --git a/distros/redhat/zoneminder.el6.spec b/distros/redhat/zoneminder.el6.spec index e5ad7d4c0..6f7d0be02 100644 --- a/distros/redhat/zoneminder.el6.spec +++ b/distros/redhat/zoneminder.el6.spec @@ -47,9 +47,9 @@ BuildRequires: perl(MIME::Entity) perl(MIME::Lite) BuildRequires: perl(PHP::Serialization) perl(Sys::Mmap) BuildRequires: perl(Time::HiRes) perl(Net::SFTP::Foreign) BuildRequires: perl(Expect) perl(X10::ActiveHome) perl(Astro::SunTime) -BuildRequires: libcurl-devel vlc-devel ffmpeg-devel >= 0.4.9 +BuildRequires: libcurl-devel vlc-devel polkit-devel ffmpeg-devel >= 0.4.9 -Requires: httpd php php-mysql mysql-server libjpeg-turbo +Requires: httpd php php-mysql mysql-server libjpeg-turbo polkit Requires: perl(:MODULE_COMPAT_%(eval "`%{__perl} -V:version`"; echo $version)) Requires: perl(DBD::mysql) perl(Archive::Tar) perl(Archive::Zip) Requires: perl(MIME::Entity) perl(MIME::Lite) perl(Net::SMTP) perl(Net::FTP) @@ -245,6 +245,7 @@ fi %{_bindir}/zmvideo.pl %{_bindir}/zmwatch.pl %{_bindir}/zmcamtool.pl +%{_bindir}/zmsystemctl.pl %{_bindir}/zmx10.pl %{perl_vendorlib}/ZoneMinder* @@ -255,6 +256,9 @@ fi %{_datadir}/%{name}/db %{_datadir}/%{name}/www +%{_datadir}/polkit-1/actions/com.zoneminder.systemctl.policy +%{_datadir}/polkit-1/rules.d/com.zoneminder.systemctl.rules + %dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/lib/zoneminder %dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/lib/zoneminder/events %dir %attr(755,%{zmuid_final},%{zmgid_final}) %{_localstatedir}/lib/zoneminder/images diff --git a/misc/CMakeLists.txt b/misc/CMakeLists.txt index c1dbcabb9..c09f630e0 100644 --- a/misc/CMakeLists.txt +++ b/misc/CMakeLists.txt @@ -4,7 +4,14 @@ configure_file(apache.conf.in "${CMAKE_CURRENT_BINARY_DIR}/apache.conf" @ONLY) configure_file(logrotate.conf.in "${CMAKE_CURRENT_BINARY_DIR}/logrotate.conf" @ONLY) configure_file(syslog.conf.in "${CMAKE_CURRENT_BINARY_DIR}/syslog.conf" @ONLY) +configure_file(com.zoneminder.systemctl.policy.in "${CMAKE_CURRENT_BINARY_DIR}/com.zoneminder.systemctl.policy" @ONLY) +configure_file(com.zoneminder.systemctl.rules.in "${CMAKE_CURRENT_BINARY_DIR}/com.zoneminder.systemctl.rules" @ONLY) +configure_file(zoneminder.service.in "${CMAKE_CURRENT_BINARY_DIR}/zoneminder.service" @ONLY) # Do not install the misc files by default #install(FILES "${CMAKE_CURRENT_BINARY_DIR}/apache.conf" "${CMAKE_CURRENT_BINARY_DIR}/logrotate.conf" "${CMAKE_CURRENT_BINARY_DIR}/syslog.conf" DESTINATION "${CMAKE_INSTALL_DATADIR}/zoneminder/misc") +# Install Policykit rules and actions into the proper folders +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/com.zoneminder.systemctl.policy" DESTINATION "${PC_POLKIT_PREFIX}/${CMAKE_INSTALL_DATAROOTDIR}/polkit-1/actions") +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/com.zoneminder.systemctl.rules" DESTINATION "${PC_POLKIT_PREFIX}/${CMAKE_INSTALL_DATAROOTDIR}/polkit-1/rules.d") + diff --git a/misc/Makefile.am b/misc/Makefile.am index 3cd03a090..b854d66f6 100644 --- a/misc/Makefile.am +++ b/misc/Makefile.am @@ -3,4 +3,14 @@ AUTOMAKE_OPTIONS = gnu EXTRA_DIST = \ apache.conf.in \ logrotate.conf.in \ - syslog.conf.in + syslog.conf.in \ + zoneminder.service.in \ + com.zoneminder.systemctl.policy.in \ + com.zoneminder.systemctl.rules.in + +polkit_actiondir = @POLKIT_PREFIX@/share/polkit-1/actions +dist_polkit_action_DATA = com.zoneminder.systemctl.policy + +polkit_rulesdir = @POLKIT_PREFIX@/share/polkit-1/rules.d +dist_polkit_rules_DATA = com.zoneminder.systemctl.rules + diff --git a/misc/com.zoneminder.systemctl.policy.in b/misc/com.zoneminder.systemctl.policy.in new file mode 100644 index 000000000..d688e4983 --- /dev/null +++ b/misc/com.zoneminder.systemctl.policy.in @@ -0,0 +1,22 @@ + + + + + The ZoneMinder Project + http://www.zoneminder.com/ + + + Allow the ZoneMinder webuser to run zmsystemctl.pl + The ZoneMinder webuser is trusted to run zmsystemctl.pl + + yes + yes + yes + + /usr/bin/perl + @BINDIR@/zmsystemctl.pl + + + diff --git a/misc/com.zoneminder.systemctl.rules.in b/misc/com.zoneminder.systemctl.rules.in new file mode 100644 index 000000000..d101dad69 --- /dev/null +++ b/misc/com.zoneminder.systemctl.rules.in @@ -0,0 +1,7 @@ +polkit.addRule(function(action, subject) { + if (action.id == "com.zoneminder.policykit.pkexec.run-zmsystemctl" && + subject.user != "@WEB_USER@") { + return polkit.Result.NO; + } + +}); diff --git a/misc/zoneminder.service.in b/misc/zoneminder.service.in new file mode 100644 index 000000000..d6c726949 --- /dev/null +++ b/misc/zoneminder.service.in @@ -0,0 +1,18 @@ +# ZoneMinder systemd unit file +# This file is intended to work with all Linux distributions + +[Unit] +Description=ZoneMinder CCTV recording and security system +After=network.target mysqld.service httpd.service +Requires=mysqld.service httpd.service + +[Service] +User=@WEB_USER@ +Type=forking +ExecStart=@BINDIR@/zmpkg.pl start +ExecReload=@BINDIR@/zmpkg.pl restart +ExecStop=/bin/bash -c '[[ "$(@BINDIR@/pgrep zmdc.pl)" > 0 ]] && @BINDIR@/zmpkg.pl stop' + +[Install] +WantedBy=multi-user.target + diff --git a/scripts/CMakeLists.txt b/scripts/CMakeLists.txt index f9dd29f47..53148fc06 100644 --- a/scripts/CMakeLists.txt +++ b/scripts/CMakeLists.txt @@ -24,7 +24,10 @@ configure_file(zm.in "${CMAKE_CURRENT_BINARY_DIR}/zm" @ONLY) #configure_file(zmeventdump.in zmeventdump @ONLY) # Install the perl scripts -install(FILES "${CMAKE_CURRENT_BINARY_DIR}/zmaudit.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmcontrol.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmdc.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmfilter.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmpkg.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmtrack.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmtrigger.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmupdate.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmvideo.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmwatch.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmcamtool.pl" DESTINATION "${CMAKE_INSTALL_FULL_BINDIR}" PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/zmaudit.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmcontrol.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmdc.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmfilter.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmpkg.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmtrack.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmtrigger.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmupdate.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmvideo.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmwatch.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmcamtool.pl" "${CMAKE_CURRENT_BINARY_DIR}/zmsystemctl.pl" DESTINATION "${CMAKE_INSTALL_FULL_BINDIR}" PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) if(NOT ZM_NO_X10) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/zmx10.pl" DESTINATION "${CMAKE_INSTALL_FULL_BINDIR}" PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) endif(NOT ZM_NO_X10) +if(ZM_SYSTEMD) + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/zmsystemctl.pl" DESTINATION "${CMAKE_INSTALL_FULL_BINDIR}" PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) +endif(ZM_SYSTEMD) diff --git a/scripts/Makefile.am b/scripts/Makefile.am index 626b64e01..8f9859d49 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -18,7 +18,8 @@ bin_SCRIPTS = \ zmvideo.pl \ zmcontrol.pl \ zmtrack.pl \ - zmcamtool.pl + zmcamtool.pl \ + zmsystemctl.pl SUBDIRS = \ . \ @@ -70,3 +71,4 @@ EXTRA_DIST = \ zmdbrestore.in \ zmeventdump.in \ zmlogrotate.conf.in + diff --git a/scripts/zmpkg.pl.in b/scripts/zmpkg.pl.in index b69c78b71..6d4fc7085 100644 --- a/scripts/zmpkg.pl.in +++ b/scripts/zmpkg.pl.in @@ -123,6 +123,18 @@ if ( $command eq "state" ) $command = "restart"; } +# Check if we are running systemd and if we have been called by the system +if ( $command =~ /^(start|stop|restart)$/ ) +{ + # We have to detaint to keep perl from complaining + $command = $1; + + if ( systemdRunning() && !calledBysystem() ) { + qx(@BINDIR@/zmsystemctl.pl $command); + $command = ""; + } +} + if ( $command =~ /^(?:stop|restart)$/ ) { my $status = runCommand( "zmdc.pl check" ); @@ -245,4 +257,32 @@ if ( $command eq "logrot" ) exit( $retval ); +sub systemdRunning +{ + my $result = 0; + + my $output = qx(ps -o comm="" 1); + chomp( $output ); + + if ($output =~ /systemd/) { + $result = 1; + } + + return $result; +} + +sub calledBysystem +{ + my $result = 0; + my $ppid = getppid(); + + my $output = qx(ps -o comm="" $ppid); + chomp( $output ); + + if ($output =~ /^(?:systemd|init)$/) { + $result = 1; + } + + return $result; +} __END__ diff --git a/scripts/zmsystemctl.pl b/scripts/zmsystemctl.pl new file mode 100644 index 000000000..711c95a71 --- /dev/null +++ b/scripts/zmsystemctl.pl @@ -0,0 +1,52 @@ +#!/usr/bin/pkexec /usr/bin/perl +# +# ========================================================================== +# +# ZoneMinder Update Script, $Date$, $Revision$ +# Copyright (C) 2001-2008 Philip Coombes +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# ========================================================================== +# +# This is a wrapper script that allows zoneminder to start and stop itself +# in a manner that keeps it in-sync with systemd. This script is intended +# to be called internally by zoneminder and may not give the desired results +# if run from the command line. +# +use warnings; +use strict; +use bytes; +use ZoneMinder::Logger qw(:all); + +my $command = $ARGV[0]; + +if ( (scalar(@ARGV) == 1) && ($command =~ /^(start|stop|restart)$/ )) { + $command = $1; +} else { + die(" USAGE: zmsystemctl.pl \n"); +} + +my $path = qx(which systemctl); +chomp($path); + +my $status = $? >> 8; +if ( !$path || $status ) { + Fatal( "Unable to determine systemctl executable. Is systemd in use?" ); +} + +Info( "Redirecting command through systemctl\n" ); +exec("$path $command zoneminder"); +