summaryrefslogtreecommitdiffstats
path: root/abs
diff options
context:
space:
mode:
Diffstat (limited to 'abs')
-rwxr-xr-xabs/core/zoneminder/Controls_Orbit.sql3
-rwxr-xr-xabs/core/zoneminder/Makefile.patch11
-rw-r--r--[-rwxr-xr-x]abs/core/zoneminder/PKGBUILD281
-rw-r--r--abs/core/zoneminder/__changelog15
-rwxr-xr-xabs/core/zoneminder/customdb31
-rwxr-xr-xabs/core/zoneminder/httpd-zm.conf18
-rw-r--r--abs/core/zoneminder/httpd-zoneminder.conf20
-rw-r--r--abs/core/zoneminder/patch-ffmpeg-0.11.patch60
-rwxr-xr-xabs/core/zoneminder/run21
-rw-r--r--abs/core/zoneminder/zm.include4
-rwxr-xr-xabs/core/zoneminder/zm.rc.d172
-rw-r--r--abs/core/zoneminder/zm.sysctrl.conf2
-rwxr-xr-xabs/core/zoneminder/zmeventbackup48
-rwxr-xr-xabs/core/zoneminder/zmfilter.pl1119
-rwxr-xr-xabs/core/zoneminder/zminit.arch143
-rw-r--r--abs/core/zoneminder/zoneminder63
-rw-r--r--[-rwxr-xr-x]abs/core/zoneminder/zoneminder.install139
-rw-r--r--abs/core/zoneminder/zoneminder.service13
18 files changed, 475 insertions, 1688 deletions
diff --git a/abs/core/zoneminder/Controls_Orbit.sql b/abs/core/zoneminder/Controls_Orbit.sql
deleted file mode 100755
index 23224e4..0000000
--- a/abs/core/zoneminder/Controls_Orbit.sql
+++ /dev/null
@@ -1,3 +0,0 @@
-
-INSERT INTO `Controls` VALUES (7,'Orbit','Remote','mjpgStreamer',0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,-7000,7000,200,200,1,100,100,0,0,1,-2000,2000,10,100,1,200,200,0,0,0,0);
-
diff --git a/abs/core/zoneminder/Makefile.patch b/abs/core/zoneminder/Makefile.patch
deleted file mode 100755
index efafc48..0000000
--- a/abs/core/zoneminder/Makefile.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- ZoneMinder-1.24.0.orig/Makefile 2008-03-13 17:41:47.000000000 -0700
-+++ ZoneMinder-1.24.0/Makefile 2008-03-15 06:21:22.000000000 -0700
-@@ -815,7 +815,7 @@
- # Yes, you are correct. This is a HACK!
- install-data-hook:
- ( cd $(DESTDIR)$(sysconfdir); chown $(webuser):$(webgroup) $(sysconf_DATA); chmod 600 $(sysconf_DATA) )
-- ( if ! test -e $(ZM_RUNDIR); then mkdir -p $(ZM_RUNDIR); fi; if test "$(ZM_RUNDIR)" != "/var/run"; then chown $(webuser):$(webgroup) $(ZM_RUNDIR); chmod u+w $(ZM_RUNDIR); fi )
-+ ( if ! test -e $(DESTDIR)$(ZM_RUNDIR); then mkdir -p $(DESTDIR)$(ZM_RUNDIR); fi; if test "$(DESTDIR)$(ZM_RUNDIR)" != "/var/run"; then chown $(webuser):$(webgroup) $(DESTDIR)$(ZM_RUNDIR); chmod u+w $(DESTDIR)$(ZM_RUNDIR); fi )
- ( if ! test -e $(ZM_TMPDIR); then mkdir -m 700 -p $(ZM_TMPDIR); fi; if test "$(ZM_TMPDIR)" != "/tmp"; then chown $(webuser):$(webgroup) $(ZM_TMPDIR); chmod u+w $(ZM_TMPDIR); fi )
- ( if ! test -e $(ZM_LOGDIR); then mkdir -p $(ZM_LOGDIR); fi; if test "$(ZM_LOGDIR)" != "/var/log"; then chown $(webuser):$(webgroup) $(ZM_LOGDIR); chmod u+w $(ZM_LOGDIR); fi )
-
diff --git a/abs/core/zoneminder/PKGBUILD b/abs/core/zoneminder/PKGBUILD
index 6b5c6c8..4dc5c63 100755..100644
--- a/abs/core/zoneminder/PKGBUILD
+++ b/abs/core/zoneminder/PKGBUILD
@@ -1,84 +1,213 @@
-# This is a ZoneMinder PKGBUILD file.
-# Contributor: Ross melin <rdmelin@gmail.com>
+# Maintainer: Vojtech Aschenbrenner <v@asch.cz>
+# Contributor: Jason Gardner <buhrietoe@gmail.com>
+# Contributor: Ross melin <rdmelin@gmail.com>
+# Maintainer (Parabola): Márcio Silva <coadde@lavabit.com>
+# Contributor (Parabola): André Silva <emulatorman@lavabit.com>
+
+# based of debian squeeze package
pkgname=zoneminder
pkgver=1.25.0
-pkgrel=2
-pkgdesc="Capture, analyse, record and monitor video security cameras."
-arch=('i686' 'x86_64')
-url="http://www.zoneminder.com"
-license=('GPL')
-depends=('cambozola' 'apache' 'php' 'mysql' 'pcre' 'openssl' 'ffmpeg' 'perl-php-serialization' 'perl-libwww' 'perl-date-manip' 'perl-unicode-map' 'perl-dbi' 'perl-dbd-mysql' 'perl-io-stringy' 'perl-mime-lite' 'perl-timedate' 'perl-x10' 'perl-time-modules' 'perl-net-smtp-ssl' 'perl-sys-mmap' 'sudo' 'libv4l')
-makedepends=()
-install=zoneminder.install
-source=("http://www2.zoneminder.com/downloads/ZoneMinder-${pkgver}.tar.gz"
-zm.rc.d
-Controls_Orbit.sql
-zminit.arch
-customdb
-httpd-zm.conf
-zmfilter.pl
-zmeventbackup
-Makefile.patch
-run)
+pkgrel=22
+pkgdesc='Capture, analyse, record and monitor video security cameras'
+arch=(
+ i686
+ x86_64
+ mips64el
+)
+backup=(
+ etc/zm.conf
+)
+url="http://www.$pkgname.com"
+license=(
+ GPL
+)
+depends=(
+ #apache
+ lighttpd
+ cambozola
+ #ffmpeg-static
+ ffmpeg
+ gnutls
+ mysql
+ perl-archive-zip
+ perl-date-manip
+ perl-dbd-mysql
+ perl-dbi
+ perl-expect
+ perl-libwww
+ perl-mime-lite
+ perl-mime-tools
+ perl-php-serialization
+ perl-net-sftp-foreign
+ perl-sys-mmap
+ perl-time-modules
+ perl-x10
+ php
+ #php-apache
+ php-gd
+ php-mcrypt
+)
+makedepends=(
+ netpbm
+)
+optdepends=(
+ netpbm
+)
+install=$pkgname.install
+source=(
+ http://www.$pkgname.com/downloads/ZoneMinder-$pkgver.tar.gz
+ httpd-$pkgname.conf
+ $pkgname
+ $pkgname.service
+ patch-ffmpeg-0.11.patch
+ zm.include
+ zm.sysctrl.conf
+)
+
build() {
- cd "$srcdir/ZoneMinder-$pkgver"
-
- cat ../Controls_Orbit.sql >> db/zm_create.sql.in
- ./configure --prefix=/usr \
- --sysconfdir=/etc \
- --with-webuser=http \
- --with-webgroup=http \
- --with-mysql=/usr \
- --with-webdir=/srv/zoneminder/www \
- --with-cgidir=/srv/zoneminder/cgi-bin \
- --bindir=/srv/zoneminder/bin \
- ZM_SSL_LIB=openssl \
- CPPFLAGS=-D__STDC_CONSTANT_MACROS
- # goddamn chown line just mucks everything up, we'll chown it in the install
- # script.
- sed -i '/chown/d' Makefile
- make || return 1
- make DESTDIR="$pkgdir" install || return 1
-
- install -D -m 700 $startdir/src/zminit.arch $startdir/pkg/usr/lib/zm/bin/zminit
- install -D -m 700 $startdir/src/zm.rc.d $startdir/pkg/etc/rc.d/zm
- install -D -m 700 scripts/zmdbbackup $startdir/pkg/usr/lib/zm/bin/zmdbbackup
- install -D -m 700 scripts/zmdbrestore $startdir/pkg/usr/lib/zm/bin/zmdbrestore
- install -D -m 700 scripts/zmeventdump $startdir/pkg/usr/lib/zm/bin/zmeventdump
- install -D -m 700 scripts/zmlogrotate.conf $startdir/pkg/etc/logrotate.d/zm
- install -D -m 700 $startdir/src/zmeventbackup $startdir/pkg/etc/cron.hourly/zmeventbackup
- install -D -m 755 scripts/zmfilter.pl $startdir/pkg/usr/lib/zm/bin/zmfilter.pl
- install -D -m 755 scripts/zmupdate.pl $startdir/pkg/usr/lib/zm/bin/zmupdate.pl
-
- mkdir -p $startdir/pkg/etc/httpd/conf/extra/
- install -m 644 $startdir/src/httpd-zm.conf $startdir/pkg/etc/httpd/conf/extra/httpd-zm.conf
-
- install -D -m 700 $startdir/src/customdb $startdir/pkg/usr/lib/zm/upgrade/customdb
- install -D db/zm*.sql $startdir/pkg/usr/lib/zm/upgrade/
-
- mkdir -p $startdir/pkg/var/run/zm
- mkdir -p $startdir/pkg/var/lib/zm
-
- #install runit files
- mkdir -p $pkgdir/etc/sv/zm
- install -D -m 755 $srcdir/run $pkgdir/etc/sv/zm
-
- ### remove special files
- find $startdir/pkg/ -name "perllocal.pod" \
- -o -name ".packlist" \
- -o -name "*.bs" \
- |xargs -i rm -f {}
+ cd $srcdir/ZoneMinder-$pkgver
+
+ # ZM_RUNDIR need change to run dir
+ export CPPFLAGS=-D__STDC_CONSTANT_MACROS\
+ ZM_LOGDIR=/var/log/$pkgname\
+ ZM_RUNDIR=/tmp/$pkgname\
+ ZM_SSL_LIB=gnutls\
+ ZM_TMPDIR=/tmp/$pkgname
+
+ # Patch for GCC 4.7.x
+ sed -i -e 's/^#include <errno.h>/#include <errno.h>\n#include <unistd.h>/'\
+ src/zm_logger.cpp || read
+ sed -i -e 's/^#include <pthread.h>/#include <pthread.h>\n#include <unistd.h>/'\
+ src/zm_thread.h || read
+
+ # Patch for automake 1.12
+ sed -i -e '/am__api_version=/ s/1.11/1.12/'\
+ configure || read
+
+ # Patch for disable ZM_CHECK_FOR_UPDATES
+ sed -i -e '/ZM_CHECK_FOR_UPDATES/,+1 s/yes/no/'\
+ scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in || read
+
+ # Patch for support html5 video and flv
+ sed -i -e '/ZM_MPEG_LIVE_FORMAT/,+1 s/swf/webm/;/ZM_MPEG_REPLAY_FORMAT/,+1 s/swf/webm/;
+ /ZM_FFMPEG_FORMATS/,+1 s/mpg mpeg wmv asf avi\* mov swf 3gp\*\*/mpg mpeg wmv asf avi\* mov flv swf 3gp\*\* webm ogg h254/'\
+ scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in || read
+
+ # Patch for change path run dir
+ sed -i -e '/ZM_PATH_SOCKS/,+1 s/TMP/RUN/'\
+ scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in || read
+
+ # Patch for change ZM name to ZoneMinder
+ sed -i -e '/ZM_WEB_TITLE_PREFIX/,+1 s/"ZM"/"ZoneMinder"/'\
+ scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in || read
+
+ # Patch for v4l1 compat support
+ sed -i -e "s/$ENV{SHELL} = \'\/bin\/sh\' if exists $ENV{SHELL};/$ENV{SHELL} = \'\/bin\/sh\' if exists $ENV{SHELL};\n$ENV{LD_PRELOAD} = \'\/usr\/lib\/libv4l\/v4l1compat.so\' ;/"\
+ scripts/zmdc.pl.in || read
+
+ # Patch for add more socket tries
+ sed -i -e '/$max_socket_tries/ s/3/15/'\
+ web/ajax/stream.php || read
+
+ # Patch for wrong "suppported"
+ sed -i -e 's/suppported/supported/'\
+ src/zm_local_camera.cpp || read
+
+ # Patch for type cast in linux-libre kernel 3.5
+ sed -i -e 's/enum v4l2_buf_type type = v4l2_data.fmt.type;/enum v4l2_buf_type type = (v4l2_buf_type)v4l2_data.fmt.type;/'\
+ src/zm_local_camera.cpp || read
+
+ # Patch for drop custom perl install paths
+ sed -i -e '/# Slight hack for non-standard perl install paths/,+10 d;
+ s/^AC_SUBST(ZM_CONFIG,"$SYSCONFDIR\/zm.conf")/AC_SUBST(ZM_CONFIG,"$SYSCONFDIR\/zm.conf")\n\nEXTRA_PERL_LIB="# Include from system perl paths only"\nPERL_MM_PARMS="INSTALLDIRS=vendor"/'\
+ configure.ac
+
+ # Patch for support new ffmpeg
+ patch -p1 < $srcdir/patch-ffmpeg-0.11.patch
+# sed -i -e 's/if ( av_open_input_file( \&mFormatContext, mPath.c_str(), NULL, 0, NULL ) !=0 )/if ( avformat_open_input( \&mFormatContext, mPath.c_str(), NULL, NULL ) !=0 )/;
+# s/if ( avcodec_open( mCodecContext, mCodec ) < 0 )/if ( avcodec_open2( mCodecContext, mCodec, NULL ) < 0 )/'\
+# src/zm_ffmpeg_camera.cpp
+# sed -i -e 's/if ( av_set_parameters(ofc, NULL) < 0 )/\/\*\n \* Removed in last ffmpeg\n \* if ( av_set_parameters(ofc, NULL) < 0 )/;
+# /Panic( "Invalid output format parameters" );/,+1 s/}/}\*/;
+# /if ( avio_open(&ofc->pb, filename, URL_WRONLY) < 0 )/ s/URL_WRONLY/AVIO_FLAG_WRITE/;
+# s/av_write_header(ofc);/avformat_write_header(ofc, NULL);/'\
+# src/zm_mpeg.cpp
+ sed -i -e 's/avcodec_init/avcodec_open/'\
+ configure{,.ac}
+
+ # Patch for support ffmpeg with <libavutil/mathematics.h> and C library
+ sed -i -e 's/^extern "C" {/extern "C" {\n#ifdef _STDINT_H\n#undef _STDINT_H\n#endif\n#include <stdint.h>/
+ s/^#include <libavutil\/avutil.h>/#include <libavutil\/avutil.h>\n#include <libavutil\/mathematics.h>/'\
+ src/zm_ffmpeg.h
+ sed -i -e 's/^AM_CONFIG_HEADER(config.h)/AM_CONFIG_HEADER(config.h)\n\nAC_SUBST([AM_CXXFLAGS], [-D__STDC_CONSTANT_MACROS])/;
+ s/^AC_CHECK_HEADERS(mysql\/mysql.h,,AC_MSG_ERROR(zm requires MySQL headers - check that MySQL development packages are installed),)/AC_CHECK_HEADERS(mysql\/mysql.h,,AC_MSG_ERROR(zm requires MySQL headers - check that MySQL development packages are installed),)\nAC_LANG_PUSH([C])/;
+ s/^AC_CHECK_HEADERS(libswscale\/swscale.h,,,)/AC_CHECK_HEADERS(libswscale\/swscale.h,,,)\nAC_LANG_POP([C])/'\
+ configure.ac
+
+ # Patch for wrong install run, tmp and log dir
+ sed -i -e '/ install-data-hook/d;/install-data-hook:/d;/# Yes, you are correct. This is a HACK!/d;
+ / ( cd $(DESTDIR)$(sysconfdir); chown $(webuser):$(webgroup) $(sysconf_DATA); chmod 600 $(sysconf_DATA) )/d;
+ / ( if ! test -e $(ZM_RUNDIR); then mkdir -p $(ZM_RUNDIR); fi; if test "$(ZM_RUNDIR)" != "\/var\/run"; then chown $(webuser):$(webgroup) $(ZM_RUNDIR); chmod u+w $(ZM_RUNDIR); fi )/d;
+ / ( if ! test -e $(ZM_TMPDIR); then mkdir -m 700 -p $(ZM_TMPDIR); fi; if test "$(ZM_TMPDIR)" != "\/tmp"; then chown $(webuser):$(webgroup) $(ZM_TMPDIR); chmod u+w $(ZM_TMPDIR); fi )/d;
+ / ( if ! test -e $(ZM_LOGDIR); then mkdir -p $(ZM_LOGDIR); fi; if test "$(ZM_LOGDIR)" != "\/var\/log"; then chown $(webuser):$(webgroup) $(ZM_LOGDIR); chmod u+w $(ZM_LOGDIR); fi )/,+1 d'\
+ Makefile.{am,in}
+
+ ./configure --prefix=/usr\
+ --enable-crashtrace=no\
+ --enable-debug=no\
+ --enable-mmap=yes\
+ --sysconfdir=/etc\
+ --with-cgidir=/data/srv/httpd/cgi-bin\
+ --with-extralibs='-L/usr/lib -L/usr/lib/mysql'\
+ --with-ffmpeg=/usr\
+ --with-libarch=lib\
+ --with-mysql=/usr\
+ --with-webdir=/data/srv/httpd/$pkgname\
+ --with-webgroup=http\
+ --with-webhost=localhost\
+ --with-webuser=http
+
+ make V=0
+}
+
+package() {
+ cd $srcdir/ZoneMinder-$pkgver
+
+ make DESTDIR=$pkgdir install
+
+ mkdir -p $pkgdir/{etc/{httpd/conf/extra,rc.d},data/srv/httpd/{cgi-bin,$pkgname},usr/{lib/systemd/system,share/{license/$pkgname,$pkgname/db}},var/{cache/$pkgname,log/$pkgname}}
+
+ chown -R http.http $pkgdir/{etc/zm.conf,var/{cache/$pkgname,log/$pkgname}}
+ chmod 0700 $pkgdir/etc/zm.conf
+
+ for i in events images temp; do
+ mv $pkgdir/data/srv/httpd/$pkgname/$i $pkgdir/var/cache/$pkgname/$i
+ ln -s /var/cache/$pkgname/$i $pkgdir/data/srv/httpd/$pkgname/$i
+ chown -h http.http $pkgdir/data/srv/httpd/$pkgname/$i
+ done
+
+ ln -s /data/srv/httpd/cgi-bin $pkgdir/data/srv/httpd/$pkgname
+ chown -h http.http $pkgdir/data/srv/httpd/{cgi-bin,$pkgname,$pkgname/cgi-bin}
+
+ ln -s /usr/share/cambozola/cambozola.jar $pkgdir/data/srv/httpd/$pkgname
+ mkdir -p $pkgdir/etc/lighttpd
+ install -D -m 644 $srcdir/zm.include $pkgdir/etc/lighttpd/
+ #sysctrl conf
+ install -o root -g root -D -m 0755 $srcdir/zm.sysctrl.conf $startdir/pkg/etc/sysctl.d/zm.conf
+
+ install -D -m 644 $srcdir/httpd-$pkgname.conf $pkgdir/etc/httpd/conf/extra
+ install -D -m 644 $srcdir/$pkgname $pkgdir/etc/rc.d
+ install -D -m 644 $srcdir/$pkgname.service $pkgdir/usr/lib/systemd/system
+ install -D -m 644 COPYING $pkgdir/usr/share/license/$pkgname
+ install -D -m 644 db/zm*.sql $pkgdir/usr/share/$pkgname/db
}
md5sums=('eaefa14befd482154970541252aa1a39'
- 'b20fb25b187eb6abb21321e153a7fb25'
- '5033bc098bf497c8aed1fc1b3c9c5f9c'
- 'f9720872736f26d17bc49d8725b75ae4'
- '4ace13d1e20934abe192ef7372c75988'
- '00201eba9c0a5d1ed14b10cc55410698'
- '80c52cc3575073a7462ff6a54886a345'
- '8b40137b6ff54f2fb26104b70edd22e9'
- 'bb308c2393e947a224d56862c85a3ad9'
- '0c7024c355ce36828627bed10d965202')
+ '72380d8793a784ec24cb6809aea4a739'
+ '034b61cda8849fc3001849e76ef26041'
+ 'ca3fe00739707b9f92eaaa9034d4da2b'
+ '81c8be870260142e2633eedf73c72040'
+ '9d93f9b7b0a1384df533efde19ed3021'
+ '9a60f8b9af050220e1cb86da438952b3')
diff --git a/abs/core/zoneminder/__changelog b/abs/core/zoneminder/__changelog
new file mode 100644
index 0000000..e7181bc
--- /dev/null
+++ b/abs/core/zoneminder/__changelog
@@ -0,0 +1,15 @@
+Change cgidir and webdir:
+ /data/srv/
+--
+added zm.include for lighttpd
+added zm.sysctrl.conf to set the shared mem
+--
+run file
+
+--
+
+Install file
+Removed modifications of php.ini
+Added remove/add of zm.include in post install/remove
+added install_db
+add http to video group
diff --git a/abs/core/zoneminder/customdb b/abs/core/zoneminder/customdb
deleted file mode 100755
index 82dfc48..0000000
--- a/abs/core/zoneminder/customdb
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/bin/sh
-DBHOST=$1
-DBNAME=$2
-USERNAME=$3
-PASSWORD=$4
-
-ZM_PATH_ZMS=/cgi-zm/nph-zms
-ZM_PATH_SOCKS=/var/lib/zm/socks
-ZM_PATH_LOGS=/var/log/zm
-ZM_WEB_LIST_THUMBS=1
-ZM_WEB_MONTAGE_WIDTH=320
-ZM_WEB_MONTAGE_HEIGHT=240
-ZM_OPT_CAMBOZOLA=1
-ZM_OPT_MPEG=ffmpeg
-ZM_PATH_FFMPEG=/usr/bin/ffmpeg
-ZM_OPT_NETPBM=1
-ZM_EXTRA_DEBUG_LOG=/var/log/zm/zm_debug.log
-ZM_OPT_USE_AUTH=0
-
-sql=/tmp/$$
-echo "" >$sql
-for n in ZM_PATH_ZMS ZM_PATH_SOCKS ZM_PATH_LOGS ZM_WEB_LIST_THUMBS ZM_WEB_MONTAGE_WIDTH ZM_WEB_MONTAGE_HEIGHT ZM_OPT_CAMBOZOLA ZM_OPT_MPEG ZM_PATH_FFMPEG ZM_OPT_NETPBM ZM_EXTRA_DEBUG_LOG ZM_OPT_USE_AUTH; do
- eval "val=\$$n"
- echo "UPDATE Config SET Value='$val' WHERE Name='$n';" >>$sql
-done
-
-cat $sql | mysql --user=$USERNAME --password=$PASSWORD --host=$DBHOST $DBNAME
-rm -f $sql
-
-
-exit 0
diff --git a/abs/core/zoneminder/httpd-zm.conf b/abs/core/zoneminder/httpd-zm.conf
deleted file mode 100755
index bdd29d7..0000000
--- a/abs/core/zoneminder/httpd-zm.conf
+++ /dev/null
@@ -1,18 +0,0 @@
-# /etc/httpd/conf/extra/httpd-zm.conf
-# Config for zoneminder web app
-
-Alias /zm "/var/lib/zm/www"
-<Directory "/var/lib/zm/www">
- Options -Indexes MultiViews FollowSymLinks
- AllowOverride All
- Order allow,deny
- Allow from all
-</Directory>
-
-ScriptAlias /cgi-zm "/var/lib/zm/cgi-bin"
-<Directory "/var/lib/zm/cgi-bin">
- AllowOverride All
- Options ExecCGI
- Order allow,deny
- Allow from all
-</Directory>
diff --git a/abs/core/zoneminder/httpd-zoneminder.conf b/abs/core/zoneminder/httpd-zoneminder.conf
new file mode 100644
index 0000000..aeb089b
--- /dev/null
+++ b/abs/core/zoneminder/httpd-zoneminder.conf
@@ -0,0 +1,20 @@
+# /etc/httpd/conf/extra/httpd-zm.conf
+# Config for zoneminder web app
+
+Alias /zm "/srv/http/zoneminder"
+<Directory "/srv/http/zoneminder">
+ Options -Indexes MultiViews FollowSymLinks
+ AllowOverride None
+ Order allow,deny
+ Allow from all
+ # The code unfortunately uses short tags in many places
+ php_value short_open_tag On
+</Directory>
+
+ScriptAlias /cgi-bin "/srv/http/cgi-bin"
+<Directory "/srv/http/cgi-bin">
+ AllowOverride None
+ Options ExecCGI FollowSymLinks
+ Order allow,deny
+ Allow from all
+</Directory>
diff --git a/abs/core/zoneminder/patch-ffmpeg-0.11.patch b/abs/core/zoneminder/patch-ffmpeg-0.11.patch
new file mode 100644
index 0000000..ac56e4c
--- /dev/null
+++ b/abs/core/zoneminder/patch-ffmpeg-0.11.patch
@@ -0,0 +1,60 @@
+diff --git a/src/zm_ffmpeg_camera.cpp b/src/zm_ffmpeg_camera.cpp
+index 42927f6..61df606 100644
+--- a/src/zm_ffmpeg_camera.cpp
++++ b/src/zm_ffmpeg_camera.cpp
+@@ -91,7 +91,7 @@ int FfmpegCamera::PrimeCapture()
+ Info( "Priming capture from %s", mPath.c_str() );
+
+ // Open the input, not necessarily a file
+- if ( av_open_input_file( &mFormatContext, mPath.c_str(), NULL, 0, NULL ) !=0 )
++ if ( avformat_open_input( &mFormatContext, mPath.c_str(), NULL, NULL ) !=0 )
+ Fatal( "Unable to open input %s due to: %s", mPath.c_str(), strerror(errno) );
+
+ // Locate stream info from input
+@@ -122,7 +122,7 @@ int FfmpegCamera::PrimeCapture()
+ Fatal( "Can't find codec for video stream from %s", mPath.c_str() );
+
+ // Open the codec
+- if ( avcodec_open( mCodecContext, mCodec ) < 0 )
++ if ( avcodec_open2( mCodecContext, mCodec, NULL ) < 0 )
+ Fatal( "Unable to open codec for video stream from %s", mPath.c_str() );
+
+ // Allocate space for the native video frame
+
+diff --git a/src/zm_mpeg.cpp b/src/zm_mpeg.cpp
+index f5de2a4..d614346 100644
+--- a/src/zm_mpeg.cpp
++++ b/src/zm_mpeg.cpp
+@@ -130,10 +130,12 @@ void VideoStream::SetParameters()
+ {
+ /* set the output parameters (must be done even if no
+ parameters). */
+- if ( av_set_parameters(ofc, NULL) < 0 )
++ /*
++ * Removed in last ffmpeg
++ * if ( av_set_parameters(ofc, NULL) < 0 )
+ {
+ Panic( "Invalid output format parameters" );
+- }
++ }*/
+ //dump_format(ofc, 0, filename, 1);
+ }
+
+@@ -222,7 +224,7 @@ void VideoStream::OpenStream()
+ if ( !(of->flags & AVFMT_NOFILE) )
+ {
+ #if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(51,2,1)
+- if ( avio_open(&ofc->pb, filename, URL_WRONLY) < 0 )
++ if ( avio_open(&ofc->pb, filename, AVIO_FLAG_WRITE) < 0 )
+ #else
+ if ( url_fopen(&ofc->pb, filename, URL_WRONLY) < 0 )
+ #endif
+@@ -241,7 +243,7 @@ void VideoStream::OpenStream()
+ }
+
+ /* write the stream header, if any */
+- av_write_header(ofc);
++ avformat_write_header(ofc, NULL);
+ }
+
+ VideoStream::VideoStream( const char *filename, const char *format, int bitrate, double frame_rate, int colours, int subpixelorder, int width, int height )
diff --git a/abs/core/zoneminder/run b/abs/core/zoneminder/run
deleted file mode 100755
index ce61c24..0000000
--- a/abs/core/zoneminder/run
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-export TERM=linux
-. /etc/rc.conf
-. /etc/rc.d/functions
-
-while true ; do
- PID=`pidof -x zmdc.pl`
- if test -n "$PID" ; then
- sleep 60
- continue
- fi
- stat_runit "Starting ZoneMinder"
- /etc/rc.d/zm start
- if test $? -ne 0 ; then
- stat_fail
- else
- add_daemon zm
- stat_done
- fi
- sleep 30
-done
diff --git a/abs/core/zoneminder/zm.include b/abs/core/zoneminder/zm.include
new file mode 100644
index 0000000..63ffc50
--- /dev/null
+++ b/abs/core/zoneminder/zm.include
@@ -0,0 +1,4 @@
+alias.url += (
+ "/zm" => "/data/srv/httpd/zoneminder/"
+)
+
diff --git a/abs/core/zoneminder/zm.rc.d b/abs/core/zoneminder/zm.rc.d
deleted file mode 100755
index 60f684b..0000000
--- a/abs/core/zoneminder/zm.rc.d
+++ /dev/null
@@ -1,172 +0,0 @@
-#!/bin/bash
-
-# Source function library.
-. /etc/rc.conf
-. /etc/rc.d/functions
-
-prog=ZoneMinder
-ZM_VERSION="1.24.0"
-ZM_PATH_BIN="/usr/lib/zm/bin"
-ZM_CONFIG="/etc/zm.conf"
-command="$ZM_PATH_BIN/zmpkg.pl"
-
-loadconf()
-{
- if [ -f $ZM_CONFIG ]; then
- . $ZM_CONFIG
- else
- echo "ERROR: $ZM_CONFIG not found.
-"
- return 1
- fi
-}
-
-# Check for old config and update if needed
-checkcfg()
-{
- # Check config
- if [ "$ZM_DB_HOST" = "" -o "$ZM_DB_NAME" = "" -o "$ZM_DB_USER" = "" -o "$ZM_DB_PASS" = "" ]; then
- echo "In $ZM_CONFIG there should not be null values.
-"
- return 1
- loadconf
- fi
-}
-
-checkdb()
-{
- # Check database exisits and version
- GetVer="select Value from Config where Name='ZM_DYN_DB_VERSION'"
- OLD_VERSION=`echo $GetVer | mysql -B -h $ZM_DB_HOST -u $ZM_DB_USER -p$ZM_DB_PASS $ZM_DB_NAME | grep -v '^Value'`
- if [ "$OLD_VERSION" = "" ]; then
- GetVer="select Value from Config where Name='ZM_DYN_CURR_VERSION'"
- OLD_VERSION=`echo $GetVer | mysql -B -h $ZM_DB_HOST -u $ZM_DB_USER -p$ZM_DB_PASS $ZM_DB_NAME | grep -v '^Value'`
- if [ "$OLD_VERSION" = "" ]; then
- echo "You must run $ZM_PATH_BIN/zminit manually
-"
- return 1
- fi
- fi
- RETVAL=$?
-
- if [ $RETVAL != 0 ]; then
- tbls=`mysql -h $ZM_DB_HOST -u $ZM_DB_USER -p$ZM_DB_PASS -s -e 'show tables' $ZM_DB_NAME`
- RETVAL=$?
- if [ $RETVAL = 0 ]; then
- echo "Initialize $prog database:
-"
- echo tbls | grep Config >/dev/null 2>&1
- RETVAL=$?
- if [ $RETVAL != 0 ]; then
- mysql -B -h $ZM_DB_HOST -u $ZM_DB_USER -p$ZM_DB_PASS $ZM_DB_NAME < $ZM_PATH_UPDATE/zm_create.sql
- RETVAL=$?
- [ $RETVAL = 0 ] && stat_done
- [ $RETVAL != 0 ] && stat_fail
- echo
- return $RETVAL
- fi
- ( cd $ZM_PATH_UPDATE; perl $ZM_PATH_BIN/zmupdate.pl -f )
- RETVAL=$?
- [ $RETVAL = 0 ] && stat_done
- [ $RETVAL != 0 ] && stat_fail
- echo
- return $RETVAL
- else
- echo "No access to ZoneMinder database.
-Run $ZM_PATH_BIN/zminit manually.
-"
- return $RETVAL
- fi
- else
- [ "$ZM_VERSION" = "$OLD_VERSION" ] && return 0
- echo "Upgrade %s database: " "$prog"
- $ZM_PATH_BIN/zmupdate.pl --version=$OLD_VERSION --noi && ( cd $ZM_PATH_UPDATE; perl $ZM_PATH_BIN/zmupdate.pl -f )
- RETVAL=$?
- [ $RETVAL = 0 ] && stat_done
- [ $RETVAL != 0 ] && stat_fail
- echo
- return $RETVAL
- fi
-}
-
-start()
-{
- loadconf || return $?
- checkcfg || return $?
- checkdb || return $?
- stat_busy "Starting $prog"
- [ -d /var/run/zm ] || mkdir -m 774 /var/run/zm
- chown -R $ZM_WEB_USER:$ZM_WEB_GROUP /var/run/zm
- GetPath="select Value from Config where Name='ZM_PATH_SOCKS'"
- ZM_PATH_SOCK=`echo $GetPath | mysql -B -h $ZM_DB_HOST -u $ZM_DB_USER -p$ZM_DB_PASS $ZM_DB_NAME | grep -v '^Value'`
- [ -d $ZM_PATH_SOCK ] || mkdir -m 774 -p $ZM_PATH_SOCK
- sudo -u $ZM_WEB_USER test -O $ZM_PATH_SOCK \
- || chown -R $ZM_WEB_USER:$ZM_WEB_GROUP $ZM_PATH_SOCK
- # Setup the log dir
- [ -d /var/log/zm ] || mkdir /var/log/zm
- for logs in zmaudit.log zmdc.log zmfilter.log zmpkg.log zmupdate.log zmwatch.log; do
- touch /var/log/zm/$logs
- done
- chown -R $ZM_WEB_USER:$ZM_WEB_GROUP /var/log/zm
- $command start
- RETVAL=$?
- [ $RETVAL = 0 ] && stat_done
- [ $RETVAL != 0 ] && stat_fail
- #[ $RETVAL = 0 ] && touch /var/lock/subsys/zm
- return $RETVAL
-}
-
-stop()
-{
- stat_busy "Stopping $prog"
- $command stop
- RETVAL=$?
- [ $RETVAL = 0 ] && stat_done
- [ $RETVAL != 0 ] && stat_fail
- #[ $RETVAL = 0 ] && rm -f /var/lock/subsys/zm
-}
-
-status()
-{
- result=`$command status`
- if [ "$result" = "running" ]; then
- echo "ZoneMinder is running
-"
- RETVAL=0
- else
- echo "ZoneMinder is stopped
-"
- RETVAL=1
- fi
-}
-
-case "$1" in
- 'start')
- start
- ;;
- 'stop')
- stop
- ;;
- 'restart')
- stop
- start
- ;;
- 'condrestart')
- loadconf
- checkcfg
- result=`$ZM_PATH_BIN/zmdc.pl check`
- if [ "$result" = "running" ]; then
- $ZM_PATH_BIN/zmdc.pl shutdown > /dev/null
- start
- fi
- ;;
- 'status')
- status
- ;;
- *)
- echo "Usage: zm { start | stop | restart | condrestart | status }
-"
- RETVAL=1
- ;;
-esac
-exit $RETVAL
diff --git a/abs/core/zoneminder/zm.sysctrl.conf b/abs/core/zoneminder/zm.sysctrl.conf
new file mode 100644
index 0000000..4f62a37
--- /dev/null
+++ b/abs/core/zoneminder/zm.sysctrl.conf
@@ -0,0 +1,2 @@
+kernel.shmall = 2097152
+kernel.shmmax = 4294967296
diff --git a/abs/core/zoneminder/zmeventbackup b/abs/core/zoneminder/zmeventbackup
deleted file mode 100755
index 71c9538..0000000
--- a/abs/core/zoneminder/zmeventbackup
+++ /dev/null
@@ -1,48 +0,0 @@
-#!/bin/bash
-#===============================================================================
-#
-# FILE: eventdump.sh
-#
-# USAGE: ./eventdump.sh
-#
-# DESCRIPTION: Uses mysqldump to create a .sql file for individual zm
-# events to make Event table recovery possible by doing a
-# 'find' search in ZoneMinder the events directory
-#
-# OPTIONS: ---
-# REQUIREMENTS: --- mysqldump
-# BUGS: ---
-# NOTES: ---
-# AUTHOR: Ross Melin <rdmelin@gmail.com>
-# COMPANY:
-# VERSION: 1.0
-# CREATED: 03/06/2008 11:51:19 AM PST
-# REVISION: ---
-#===============================================================================
-
-# Edit these to suit your configuration
-ZM_CONFIG=/etc/zm.conf
-MYSQLDUMP=/usr/bin/mysqldump
-EVENTSDIR=/var/lib/zm/www/events
-
-# The rest should not need editing
-
-# Get the mysql user and password
-source $ZM_CONFIG
-MYDUMPOPTS="--user=$ZM_DB_USER --password=$ZM_DB_PASS --skip-opt --compact --quick --no-create-info"
-
-
-for tag in $(find $EVENTSDIR -amin -65 -name ".[0-9]*")
- do
- EVENT_PATH=$(echo $tag |cut -f 1 -d .)
- EVENT_ID=$(echo $tag |cut -f 2 -d .)
- # Dump the sql statements needed to reload the Events, Frames and Stats tables
-
- echo "-- ZM_DB_VERSION=$ZM_VERSION
-" > $EVENT_PATH.sql
-
- $MYSQLDUMP $MYDUMPOPTS --where="Id=$EVENT_ID" zm Events >> $EVENT_PATH.sql
- $MYSQLDUMP $MYDUMPOPTS --where="Eventid=$EVENT_ID" zm Frames >> $EVENT_PATH.sql
- $MYSQLDUMP $MYDUMPOPTS --where="Eventid=$EVENT_ID" zm Stats >> $EVENT_PATH.sql
-
-done
diff --git a/abs/core/zoneminder/zmfilter.pl b/abs/core/zoneminder/zmfilter.pl
deleted file mode 100755
index 7875937..0000000
--- a/abs/core/zoneminder/zmfilter.pl
+++ /dev/null
@@ -1,1119 +0,0 @@
-#!/usr/bin/perl -wT
-#
-# ==========================================================================
-#
-# ZoneMinder Event Filter Script, $Date: 2008-10-09 10:17:07 +0100 (Thu, 09 Oct 2008) $, $Revision: 2659 $
-# 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 script continuously monitors the recorded events for the given
-# monitor and applies any filters which would delete and/or upload
-# matching events
-#
-use strict;
-use bytes;
-
-# ==========================================================================
-#
-# These are the elements you can edit to suit your installation
-#
-# ==========================================================================
-
-use constant DBG_ID => "zmfilter"; # Tag that appears in debug to identify source
-use constant DBG_LEVEL => 0; # 0 is errors, warnings and info only, > 0 for debug
-
-use constant START_DELAY => 5; # How long to wait before starting
-
-# ==========================================================================
-#
-# You shouldn't need to change anything from here downwards
-#
-# ==========================================================================
-
-use ZoneMinder;
-use DBI;
-use POSIX;
-use Time::HiRes qw/gettimeofday/;
-use Date::Manip;
-use Getopt::Long;
-use PHP::Serialization qw(serialize unserialize);
-use Data::Dumper;
-
-use constant EVENT_PATH => ZM_PATH_WEB.'/'.ZM_DIR_EVENTS;
-
-zmDbgInit( DBG_ID, level=>DBG_LEVEL );
-zmDbgSetSignal();
-
-if ( ZM_OPT_UPLOAD )
-{
- # Comment these out if you don't have them and don't want to upload
- # or don't want to use that format
- if ( ZM_UPLOAD_ARCH_FORMAT eq "zip" )
- {
- require Archive::Zip;
- import Archive::Zip qw( :ERROR_CODES :CONSTANTS );
- }
- else
- {
- require Archive::Tar;
- }
- require Net::FTP;
-}
-
-if ( ZM_OPT_EMAIL )
-{
- if ( ZM_NEW_MAIL_MODULES )
- {
- require MIME::Lite;
- require Net::SMTP;
- }
- else
- {
- require MIME::Entity;
- }
-}
-
-if ( ZM_OPT_MESSAGE )
-{
- if ( ZM_NEW_MAIL_MODULES )
- {
- require MIME::Lite;
- require Net::SMTP;
- }
- else
- {
- require MIME::Entity;
- }
-}
-
-
-$| = 1;
-
-$ENV{PATH} = '/bin:/usr/bin';
-$ENV{SHELL} = '/bin/sh' if exists $ENV{SHELL};
-delete @ENV{qw(IFS CDPATH ENV BASH_ENV)};
-
-my $delay = ZM_FILTER_EXECUTE_INTERVAL;
-my $event_id = 0;
-my $filter_parm = "";
-
-sub Usage
-{
- print( "
-Usage: zmfilter.pl [-f <filter name>,--filter=<filter name>]
-Parameters are :-
--f<filter name>, --filter=<filter name> - The name of a specific filter to run
-");
- exit( -1 );
-}
-
-#
-# More or less replicates the equivalent PHP function
-#
-sub strtotime
-{
- my $dt_str = shift;
- return( UnixDate( $dt_str, '%s' ) );
-}
-
-#
-# More or less replicates the equivalent PHP function
-#
-sub str_repeat
-{
- my $string = shift;
- my $count = shift;
- return( ${string}x${count} );
-}
-
-# Formats a date into MySQL format
-sub DateTimeToSQL
-{
- my $dt_str = shift;
- my $dt_val = strtotime( $dt_str );
- if ( !$dt_val )
- {
- Error( "Unable to parse date string '$dt_str'\n" );
- return( undef );
- }
- return( strftime( "%Y-%m-%d %H:%M:%S", localtime( $dt_val ) ) );
-}
-
-if ( !GetOptions( 'filter=s'=>\$filter_parm ) )
-{
- Usage();
-}
-
-chdir( EVENT_PATH );
-
-my $dbh = zmDbConnect();
-
-if ( $filter_parm )
-{
- Info( "Scanning for events using filter '$filter_parm'\n" );
-}
-else
-{
- Info( "Scanning for events\n" );
-}
-
-if ( !$filter_parm )
-{
- sleep( START_DELAY );
-}
-
-my $filters;
-my $last_action = 0;
-
-while( 1 )
-{
- if ( (time() - $last_action) > ZM_FILTER_RELOAD_DELAY )
- {
- Debug( "Reloading filters\n" );
- $last_action = time();
- $filters = getFilters( $filter_parm );
- }
-
- foreach my $filter ( @$filters )
- {
- checkFilter( $filter );
- }
-
- last if ( $filter_parm );
-
- Debug( "Sleeping for $delay seconds\n" );
- sleep( $delay );
-}
-
-sub getDiskPercent
-{
- my $command = "df .";
- my $df = qx( $command );
- my $space = -1;
- if ( $df =~ /\s(\d+)%/ms )
- {
- $space = $1;
- }
- return( $space );
-}
-
-sub getDiskBlocks
-{
- my $command = "df .";
- my $df = qx( $command );
- my $space = -1;
- if ( $df =~ /\s(\d+)\s+\d+\s+\d+%/ms )
- {
- $space = $1;
- }
- return( $space );
-}
-
-sub getLoad
-{
- my $command = "uptime .";
- my $uptime = qx( $command );
- my $load = -1;
- if ( $uptime =~ /load average:\s+([\d.]+)/ms )
- {
- $load = $1;
- Info( "Load: $load" );
- }
- return( $load );
-}
-
-sub getFilters
-{
- my $filter_name = shift;
-
- my @filters;
- my $sql = "select * from Filters where";
- if ( $filter_name )
- {
- $sql .= " Name = ? and";
- }
- else
- {
- $sql .= " Background = 1 and";
- }
- $sql .= " (AutoArchive = 1 or AutoVideo = 1 or AutoUpload = 1 or AutoEmail = 1 or AutoMessage = 1 or AutoExecute = 1 or AutoDelete = 1) order by Name";
- my $sth = $dbh->prepare_cached( $sql ) or Fatal( "Can't prepare '$sql': ".$dbh->errstr() );
- my $res;
- if ( $filter_name )
- {
- $res = $sth->execute( $filter_name ) or Fatal( "Can't execute '$sql': ".$sth->errstr() );
- }
- else
- {
- $res = $sth->execute() or Fatal( "Can't execute '$sql': ".$sth->errstr() );
- }
- FILTER: while( my $db_filter = $sth->fetchrow_hashref() )
- {
- Debug( "Found filter '$db_filter->{Name}'\n" );
- my $filter_expr = unserialize( $db_filter->{Query} );
- my $sql = "select E.Id,E.MonitorId,M.Name as MonitorName,M.DefaultRate,M.DefaultScale,E.Name,E.Cause,E.Notes,E.StartTime,unix_timestamp(E.StartTime) as Time,E.Length,E.Frames,E.AlarmFrames,E.TotScore,E.AvgScore,E.MaxScore,E.Archived,E.Videoed,E.Uploaded,E.Emailed,E.Messaged,E.Executed from Events as E inner join Monitors as M on M.Id = E.MonitorId where not isnull(E.EndTime)";
- $db_filter->{Sql} = '';
-
- if ( @{$filter_expr->{terms}} )
- {
- for ( my $i = 0; $i < @{$filter_expr->{terms}}; $i++ )
- {
- if ( exists($filter_expr->{terms}[$i]->{cnj}) )
- {
- $db_filter->{Sql} .= " ".$filter_expr->{terms}[$i]->{cnj}." ";
- }
- if ( exists($filter_expr->{terms}[$i]->{obr}) )
- {
- $db_filter->{Sql} .= " ".str_repeat( "(", $filter_expr->{terms}[$i]->{obr} )." ";
- }
- my $value = $filter_expr->{terms}[$i]->{val};
- my @value_list;
- if ( $filter_expr->{terms}[$i]->{attr} )
- {
- if ( $filter_expr->{terms}[$i]->{attr} =~ /^Monitor/ )
- {
- my ( $temp_attr_name ) = $filter_expr->{terms}[$i]->{attr} =~ /^Monitor(.+)$/;
- $db_filter->{Sql} .= "M.".$temp_attr_name;
- }
- elsif ( $filter_expr->{terms}[$i]->{attr} eq 'DateTime' )
- {
- $db_filter->{Sql} .= "E.StartTime";
- }
- elsif ( $filter_expr->{terms}[$i]->{attr} eq 'Date' )
- {
- $db_filter->{Sql} .= "to_days( E.StartTime )";
- }
- elsif ( $filter_expr->{terms}[$i]->{attr} eq 'Time' )
- {
- $db_filter->{Sql} .= "extract( hour_second from E.StartTime )";
- }
- elsif ( $filter_expr->{terms}[$i]->{attr} eq 'Weekday' )
- {
- $db_filter->{Sql} .= "weekday( E.StartTime )";
- }
- elsif ( $filter_expr->{terms}[$i]->{attr} eq 'DiskPercent' )
- {
- $db_filter->{Sql} .= "zmDiskPercent";
- $db_filter->{HasDiskPercent} = !undef;
- }
- elsif ( $filter_expr->{terms}[$i]->{attr} eq 'DiskBlocks' )
- {
- $db_filter->{Sql} .= "zmDiskBlocks";
- $db_filter->{HasDiskBlocks} = !undef;
- }
- elsif ( $filter_expr->{terms}[$i]->{attr} eq 'SystemLoad' )
- {
- $db_filter->{Sql} .= "zmSystemLoad";
- $db_filter->{HasSystemLoad} = !undef;
- }
- else
- {
- $db_filter->{Sql} .= "E.".$filter_expr->{terms}[$i]->{attr};
- }
-
- ( my $stripped_value = $value ) =~ s/^["\']+?(.+)["\']+?$/$1/;
- foreach my $temp_value ( split( '/["\'\s]*?,["\'\s]*?/', $stripped_value ) )
- {
- if ( $filter_expr->{terms}[$i]->{attr} =~ /^Monitor/ )
- {
- $value = "'$temp_value'";
- }
- elsif ( $filter_expr->{terms}[$i]->{attr} eq 'Name' || $filter_expr->{terms}[$i]->{attr} eq 'Cause' || $filter_expr->{terms}[$i]->{attr} eq 'Notes' )
- {
- $value = "'$temp_value'";
- }
- elsif ( $filter_expr->{terms}[$i]->{attr} eq 'DateTime' )
- {
- $value = DateTimeToSQL( $temp_value );
- if ( !$value )
- {
- Error( "Error parsing date/time '$temp_value', skipping filter '$db_filter->{Name}'\n" );
- next FILTER;
- }
- $value = "'$value'";
- }
- elsif ( $filter_expr->{terms}[$i]->{attr} eq 'Date' )
- {
- $value = DateTimeToSQL( $temp_value );
- if ( !$value )
- {
- Error( "Error parsing date/time '$temp_value', skipping filter '$db_filter->{Name}'\n" );
- next FILTER;
- }
- $value = "to_days( '$value' )";
- }
- elsif ( $filter_expr->{terms}[$i]->{attr} eq 'Time' )
- {
- $value = DateTimeToSQL( $temp_value );
- if ( !$value )
- {
- Error( "Error parsing date/time '$temp_value', skipping filter '$db_filter->{Name}'\n" );
- next FILTER;
- }
- $value = "extract( hour_second from '$value' )";
- }
- else
- {
- $value = $temp_value;
- }
- push( @value_list, $value );
- }
- }
- if ( $filter_expr->{terms}[$i]->{op} )
- {
- if ( $filter_expr->{terms}[$i]->{op} eq '=~' )
- {
- $db_filter->{Sql} .= " regexp $value";
- }
- elsif ( $filter_expr->{terms}[$i]->{op} eq '!~' )
- {
- $db_filter->{Sql} .= " not regexp $value";
- }
- elsif ( $filter_expr->{terms}[$i]->{op} eq '=[]' )
- {
- $db_filter->{Sql} .= " in (".join( ",", @value_list ).")";
- }
- elsif ( $filter_expr->{terms}[$i]->{op} eq '!~' )
- {
- $db_filter->{Sql} .= " not in (".join( ",", @value_list ).")";
- }
- else
- {
- $db_filter->{Sql} .= " ".$filter_expr->{terms}[$i]->{op}." $value";
- }
- }
- if ( exists($filter_expr->{terms}[$i]->{cbr}) )
- {
- $db_filter->{Sql} .= " ".str_repeat( ")", $filter_expr->{terms}[$i]->{cbr} )." ";
- }
- }
- }
- if ( $db_filter->{Sql} )
- {
- $sql .= " and ( ".$db_filter->{Sql}." )";
- }
- my @auto_terms;
- if ( $db_filter->{AutoArchive} )
- {
- push( @auto_terms, "E.Archived = 0" )
- }
- if ( $db_filter->{AutoVideo} )
- {
- push( @auto_terms, "E.Videoed = 0" )
- }
- if ( $db_filter->{AutoUpload} )
- {
- push( @auto_terms, "E.Uploaded = 0" )
- }
- if ( $db_filter->{AutoEmail} )
- {
- push( @auto_terms, "E.Emailed = 0" )
- }
- if ( $db_filter->{AutoMessage} )
- {
- push( @auto_terms, "E.Messaged = 0" )
- }
- if ( $db_filter->{AutoExecute} )
- {
- push( @auto_terms, "E.Executed = 0" )
- }
- if ( @auto_terms )
- {
- $sql .= " and ( ".join( " or ", @auto_terms )." )";
- }
- if ( !$filter_expr->{sort_field} )
- {
- $filter_expr->{sort_field} = 'StartTime';
- $filter_expr->{sort_asc} = 0;
- }
- my $sort_column = '';
- if ( $filter_expr->{sort_field} eq 'Id' )
- {
- $sort_column = "E.Id";
- }
- elsif ( $filter_expr->{sort_field} eq 'MonitorName' )
- {
- $sort_column = "M.Name";
- }
- elsif ( $filter_expr->{sort_field} eq 'Name' )
- {
- $sort_column = "E.Name";
- }
- elsif ( $filter_expr->{sort_field} eq 'StartTime' )
- {
- $sort_column = "E.StartTime";
- }
- elsif ( $filter_expr->{sort_field} eq 'Secs' )
- {
- $sort_column = "E.Length";
- }
- elsif ( $filter_expr->{sort_field} eq 'Frames' )
- {
- $sort_column = "E.Frames";
- }
- elsif ( $filter_expr->{sort_field} eq 'AlarmFrames' )
- {
- $sort_column = "E.AlarmFrames";
- }
- elsif ( $filter_expr->{sort_field} eq 'TotScore' )
- {
- $sort_column = "E.TotScore";
- }
- elsif ( $filter_expr->{sort_field} eq 'AvgScore' )
- {
- $sort_column = "E.AvgScore";
- }
- elsif ( $filter_expr->{sort_field} eq 'MaxScore' )
- {
- $sort_column = "E.MaxScore";
- }
- else
- {
- $sort_column = "E.StartTime";
- }
- my $sort_order = $filter_expr->{sort_asc}?"asc":"desc";
- $sql .= " order by ".$sort_column." ".$sort_order;
- if ( $filter_expr->{limit} )
- {
- $sql .= " limit 0,".$filter_expr->{limit};
- }
- Debug( "SQL:$sql\n" );
- $db_filter->{Sql} = $sql;
- if ( $db_filter->{AutoExecute} )
- {
- my $script = $db_filter->{AutoExecuteCmd};
- $script =~ s/\s.*$//;
- if ( !-e $script )
- {
- Error( "Auto execute script '$script' not found, skipping filter '$db_filter->{Name}'\n" );
- next FILTER;
-
- }
- elsif ( !-x $script )
- {
- Error( "Auto execute script '$script' not executable, skipping filter '$db_filter->{Name}'\n" );
- next FILTER;
- }
- }
- push( @filters, $db_filter );
- }
- $sth->finish();
-
- return( \@filters );
-}
-
-sub checkFilter
-{
- my $filter = shift;
-
- Debug( "Checking filter '$filter->{Name}'".
- ($filter->{AutoDelete}?", delete":"").
- ($filter->{AutoArchive}?", archive":"").
- ($filter->{AutoVideo}?", video":"").
- ($filter->{AutoUpload}?", upload":"").
- ($filter->{AutoEmail}?", email":"").
- ($filter->{AutoMessage}?", message":"").
- ($filter->{AutoExecute}?", execute":"").
- "\n"
- );
- my $sql = $filter->{Sql};
-
- if ( $filter->{HasDiskPercent} )
- {
- my $disk_percent = getDiskPercent();
- $sql =~ s/zmDiskPercent/$disk_percent/g;
- }
- if ( $filter->{HasDiskBlocks} )
- {
- my $disk_blocks = getDiskBlocks();
- $sql =~ s/zmDiskBlocks/$disk_blocks/g;
- }
- if ( $filter->{HasSystemLoad} )
- {
- my $load = getLoad();
- $sql =~ s/zmSystemLoad/$load/g;
- }
-
- my $sth = $dbh->prepare_cached( $sql ) or Fatal( "Can't prepare '$sql': ".$dbh->errstr() );
- my $res = $sth->execute();
- if ( !$res )
- {
- Error( "Can't execute filter '$sql', ignoring: ".$sth->errstr() );
- return;
- }
-
- while( my $event = $sth->fetchrow_hashref() )
- {
- Debug( "Checking event $event->{Id}\n" );
- my $delete_ok = !undef;
- if ( $filter->{AutoArchive} )
- {
- Info( "Archiving event $event->{Id}\n" );
- # Do it individually to avoid locking up the table for new events
- my $sql = "update Events set Archived = 1 where Id = ?";
- my $sth = $dbh->prepare_cached( $sql ) or Fatal( "Can't prepare '$sql': ".$dbh->errstr() );
- my $res = $sth->execute( $event->{Id} ) or Fatal( "Can't execute '$sql': ".$sth->errstr() );
- }
- if ( ZM_OPT_FFMPEG && $filter->{AutoVideo} )
- {
- if ( !$event->{Videoed} )
- {
- $delete_ok = undef if ( !generateVideo( $filter, $event ) );
- }
- }
- if ( ZM_OPT_EMAIL && $filter->{AutoEmail} )
- {
- if ( !$event->{Emailed} )
- {
- $delete_ok = undef if ( !sendEmail( $filter, $event ) );
- }
- }
- if ( ZM_OPT_MESSAGE && $filter->{AutoMessage} )
- {
- if ( !$event->{Messaged} )
- {
- $delete_ok = undef if ( !sendMessage( $filter, $event ) );
- }
- }
- if ( ZM_OPT_UPLOAD && $filter->{AutoUpload} )
- {
- if ( !$event->{Uploaded} )
- {
- $delete_ok = undef if ( !uploadArchFile( $filter, $event ) );
- }
- }
- if ( $filter->{AutoExecute} )
- {
- if ( !$event->{Execute} )
- {
- $delete_ok = undef if ( !executeCommand( $filter, $event ) );
- }
- }
- if ( $filter->{AutoDelete} )
- {
- if ( $delete_ok )
- {
- Info( "Deleting event $event->{Id}\n" );
- # Do it individually to avoid locking up the table for new events
- my $sql = "delete from Events where Id = ?";
- my $sth = $dbh->prepare_cached( $sql ) or Fatal( "Can't prepare '$sql': ".$dbh->errstr() );
- my $res = $sth->execute( $event->{Id} ) or Fatal( "Can't execute '$sql': ".$sth->errstr() );
-
- if ( !ZM_OPT_FAST_DELETE )
- {
- my $sql = "delete from Frames where EventId = ?";
- my $sth = $dbh->prepare_cached( $sql ) or Fatal( "Can't prepare '$sql': ".$dbh->errstr() );
- my $res = $sth->execute( $event->{Id} ) or Fatal( "Can't execute '$sql': ".$sth->errstr() );
-
- $sql = "delete from Stats where EventId = ?";
- $sth = $dbh->prepare_cached( $sql ) or Fatal( "Can't prepare '$sql': ".$dbh->errstr() );
- $res = $sth->execute( $event->{Id} ) or Fatal( "Can't execute '$sql': ".$sth->errstr() );
-
- deleteEventFiles( $event->{Id}, $event->{MonitorId} );
- }
- }
- else
- {
- Error( "Unable to delete event $event->{Id} as previous operations failed\n" );
- }
- }
- }
- $sth->finish();
-}
-
-sub generateVideo
-{
- my $filter = shift;
- my $event = shift;
- my $phone = shift;
-
- my $rate = $event->{DefaultRate}/100;
- my $scale = $event->{DefaultScale}/100;
- my $format;
-
- my @ffmpeg_formats = split( /\s+/, ZM_FFMPEG_FORMATS );
- my $default_video_format;
- my $default_phone_format;
- foreach my $ffmpeg_format( @ffmpeg_formats )
- {
- if ( $ffmpeg_format =~ /^(.+)\*\*$/ )
- {
- $default_phone_format = $1;
- }
- elsif ( $ffmpeg_format =~ /^(.+)\*$/ )
- {
- $default_video_format = $1;
- }
- }
-
- if ( $phone && $default_phone_format )
- {
- $format = $default_phone_format;
- }
- elsif ( $default_video_format )
- {
- $format = $default_video_format;
- }
- else
- {
- $format = $ffmpeg_formats[0];
- }
-
- my $command = ZM_PATH_BIN."/zmvideo.pl -e ".$event->{Id}." -r ".$rate." -s ".$scale." -f ".$format;
- my $output = qx($command);
- chomp( $output );
- my $status = $? >> 8;
- if ( $status || DBG_LEVEL > 0 )
- {
- Debug( "Output: $output\n" );
- }
- if ( $status )
- {
- Error( "Video generation '$command' failed with status: $status\n" );
- if ( wantarray() )
- {
- return( undef, undef );
- }
- return( 0 );
- }
- else
- {
- my $sql = "update Events set Videoed = 1 where Id = ?";
- my $sth = $dbh->prepare_cached( $sql ) or Fatal( "Can't prepare '$sql': ".$dbh->errstr() );
- my $res = $sth->execute( $event->{Id} ) or Fatal( "Can't execute '$sql': ".$sth->errstr() );
- if ( wantarray() )
- {
- return( $format, sprintf( "%s/%s", getEventPath( $event ), $output ) );
- }
- }
- return( 1 );
-}
-
-sub uploadArchFile
-{
- my $filter = shift;
- my $event = shift;
- if ( !ZM_UPLOAD_FTP_HOST )
- {
- Error( "Cannot upload archive as no FTP host defined" );
- return( 0 );
- }
-
- my $arch_file = ZM_UPLOAD_FTP_LOC_DIR.'/'.$event->{MonitorName}.'-'.$event->{Id};
- my $arch_image_path = getEventPath( $event )."/".((ZM_UPLOAD_ARCH_ANALYSE)?'{*analyse,*capture}':'*capture').".jpg";
- my @arch_image_files = glob($arch_image_path);
-
- my $arch_error;
- if ( ZM_UPLOAD_ARCH_FORMAT eq "zip" )
- {
- $arch_file .= '.zip';
- my $zip = Archive::Zip->new();
- Info( "Creating upload file '$arch_file', ".int(@arch_image_files)." files\n" );
-
- my $status = &AZ_OK;
- foreach my $image_file ( @arch_image_files )
- {
- Info( "Adding $image_file\n" );
- my $member = $zip->addFile( $image_file );
- last unless ( $member );
- $member->desiredCompressionMethod( (ZM_UPLOAD_ARCH_COMPRESS)?&COMPRESSION_DEFLATED:&COMPRESSION_STORED );
- }
- $status = $zip->writeToFileNamed( $arch_file );
-
- if ( $arch_error = ($status != &AZ_OK) )
- {
- Error( "Zip error: $status\n " );
- }
- }
- elsif ( ZM_UPLOAD_ARCH_FORMAT eq "tar" )
- {
- if ( ZM_UPLOAD_ARCH_COMPRESS )
- {
- $arch_file .= '.tar.gz';
- }
- else
- {
- $arch_file .= '.tar';
- }
- Info( "Creating upload file '$arch_file', ".int(@arch_image_files)." files\n" );
-
- if ( $arch_error = !Archive::Tar->create_archive( $arch_file, ZM_UPLOAD_ARCH_COMPRESS, @arch_image_files ) )
- {
- Error( "Tar error: ".Archive::Tar->error()."\n " );
- }
- }
-
- if ( $arch_error )
- {
- return( 0 );
- }
- else
- {
- Info( "Uploading to ".ZM_UPLOAD_FTP_HOST."\n" );
- my $ftp = Net::FTP->new( ZM_UPLOAD_FTP_HOST, Timeout=>ZM_UPLOAD_FTP_TIMEOUT, Passive=>ZM_UPLOAD_FTP_PASSIVE, Debug=>ZM_UPLOAD_FTP_DEBUG );
- if ( !$ftp )
- {
- warn( "Can't create ftp connection: $@" );
- return( 0 );
- }
-
- $ftp->login( ZM_UPLOAD_FTP_USER, ZM_UPLOAD_FTP_PASS ) or warn( "FTP - Can't login" );
- $ftp->binary() or warn( "FTP - Can't go binary" );
- $ftp->cwd( ZM_UPLOAD_FTP_REM_DIR ) or warn( "FTP - Can't cwd" );
- $ftp->put( $arch_file ) or warn( "FTP - Can't upload '$arch_file'" );
- $ftp->quit() or warn( "FTP - Can't quit" );
- unlink( $arch_file );
- my $sql = "update Events set Uploaded = 1 where Id = ?";
- my $sth = $dbh->prepare_cached( $sql ) or Fatal( "Can't prepare '$sql': ".$dbh->errstr() );
- my $res = $sth->execute( $event->{Id} ) or Fatal( "Can't execute '$sql': ".$sth->errstr() );
- }
- return( 1 );
-}
-
-sub substituteTags
-{
- my $text = shift;
- my $filter = shift;
- my $event = shift;
- my $attachments_ref = shift;
-
- # First we'd better check what we need to get
- # We have a filter and an event, do we need any more
- # monitor information?
- my $need_monitor = $text =~ /%(?:MET|MEH|MED|MEW|MEN|MEA)%/;
-
- my $monitor = {};
- if ( $need_monitor )
- {
- my $db_now = strftime( "%Y-%m-%d %H:%M:%S", localtime() );
- my $sql = "select M.Id, count(E.Id) as EventCount, count(if(E.Archived,1,NULL)) as ArchEventCount, count(if(E.StartTime>'$db_now' - INTERVAL 1 HOUR && E.Archived = 0,1,NULL)) as HourEventCount, count(if(E.StartTime>'$db_now' - INTERVAL 1 DAY && E.Archived = 0,1,NULL)) as DayEventCount, count(if(E.StartTime>'$db_now' - INTERVAL 7 DAY && E.Archived = 0,1,NULL)) as WeekEventCount, count(if(E.StartTime>'$db_now' - INTERVAL 1 MONTH && E.Archived = 0,1,NULL)) as MonthEventCount from Monitors as M left join Events as E on E.MonitorId = M.Id where MonitorId = ? group by E.MonitorId order by Id";
- my $sth = $dbh->prepare_cached( $sql ) or Fatal( "Can't prepare '$sql': ".$dbh->errstr() );
- my $res = $sth->execute( $event->{MonitorId} ) or Fatal( "Can't execute '$sql': ".$sth->errstr() );
- $monitor = $sth->fetchrow_hashref();
- $sth->finish();
- return() if ( !$monitor );
- }
-
- # Do we need the image information too?
- my $need_images = $text =~ /%(?:EPI1|EPIM|EI1|EIM)%/;
- my $first_alarm_frame;
- my $max_alarm_frame;
- my $max_alarm_score = 0;
- if ( $need_images )
- {
- my $sql = "select * from Frames where EventId = ? and Type = 'Alarm' order by FrameId";
- my $sth = $dbh->prepare_cached( $sql ) or Fatal( "Can't prepare '$sql': ".$dbh->errstr() );
- my $res = $sth->execute( $event->{Id} ) or Fatal( "Can't execute '$sql': ".$sth->errstr() );
- while( my $frame = $sth->fetchrow_hashref() )
- {
- if ( !$first_alarm_frame )
- {
- $first_alarm_frame = $frame;
- }
- if ( $frame->{Score} > $max_alarm_score )
- {
- $max_alarm_frame = $frame;
- $max_alarm_score = $frame->{Score};
- }
- }
- $sth->finish();
- }
-
- my $url = ZM_URL;
- $text =~ s/%ZP%/$url/g;
- $text =~ s/%MN%/$event->{MonitorName}/g;
- $text =~ s/%MET%/$monitor->{EventCount}/g;
- $text =~ s/%MEH%/$monitor->{HourEventCount}/g;
- $text =~ s/%MED%/$monitor->{DayEventCount}/g;
- $text =~ s/%MEW%/$monitor->{WeekEventCount}/g;
- $text =~ s/%MEM%/$monitor->{MonthEventCount}/g;
- $text =~ s/%MEA%/$monitor->{ArchEventCount}/g;
- $text =~ s/%MP%/$url?view=watch&mid=$event->{MonitorId}/g;
- $text =~ s/%MPS%/$url?view=watchfeed&mid=$event->{MonitorId}&mode=stream/g;
- $text =~ s/%MPI%/$url?view=watchfeed&mid=$event->{MonitorId}&mode=still/g;
- $text =~ s/%EP%/$url?view=event&mid=$event->{MonitorId}&eid=$event->{Id}/g;
- $text =~ s/%EPS%/$url?view=event&mode=stream&mid=$event->{MonitorId}&eid=$event->{Id}/g;
- $text =~ s/%EPI%/$url?view=event&mode=still&mid=$event->{MonitorId}&eid=$event->{Id}/g;
- $text =~ s/%EI%/$event->{Id}/g;
- $text =~ s/%EN%/$event->{Name}/g;
- $text =~ s/%EC%/$event->{Cause}/g;
- $text =~ s/%ED%/$event->{Notes}/g;
- $text =~ s/%ET%/$event->{StartTime}/g;
- $text =~ s/%EL%/$event->{Length}/g;
- $text =~ s/%EF%/$event->{Frames}/g;
- $text =~ s/%EFA%/$event->{AlarmFrames}/g;
- $text =~ s/%EST%/$event->{TotScore}/g;
- $text =~ s/%ESA%/$event->{AvgScore}/g;
- $text =~ s/%ESM%/$event->{MaxScore}/g;
- if ( $first_alarm_frame )
- {
- $text =~ s/%EPI1%/$url?view=frame&mid=$event->{MonitorId}&eid=$event->{Id}&fid=$first_alarm_frame->{FrameId}/g;
- $text =~ s/%EPIM%/$url?view=frame&mid=$event->{MonitorId}&eid=$event->{Id}&fid=$max_alarm_frame->{FrameId}/g;
- if ( $attachments_ref && $text =~ s/%EI1%//g )
- {
- push( @$attachments_ref, { type=>"image/jpeg", path=>sprintf( "%s/%0".ZM_EVENT_IMAGE_DIGITS."d-capture.jpg", getEventPath( $event ), $first_alarm_frame->{FrameId} ) } );
- }
- if ( $attachments_ref && $text =~ s/%EIM%//g )
- {
- # Don't attach the same image twice
- if ( !@$attachments_ref || ($first_alarm_frame->{FrameId} != $max_alarm_frame->{FrameId} ) )
- {
- push( @$attachments_ref, { type=>"image/jpeg", path=>sprintf( "%s/%0".ZM_EVENT_IMAGE_DIGITS."d-capture.jpg", getEventPath( $event ), $max_alarm_frame->{FrameId} ) } );
- }
- }
- }
- if ( $attachments_ref && ZM_OPT_FFMPEG )
- {
- if ( $text =~ s/%EV%//g )
- {
- my ( $format, $path ) = generateVideo( $filter, $event );
- if ( !$format )
- {
- return( undef );
- }
- push( @$attachments_ref, { type=>"video/$format", path=>$path } );
- }
- if ( $text =~ s/%EVM%//g )
- {
- my ( $format, $path ) = generateVideo( $filter, $event, 1 );
- if ( !$format )
- {
- return( undef );
- }
- push( @$attachments_ref, { type=>"video/$format", path=>$path } );
- }
- }
- $text =~ s/%FN%/$filter->{Name}/g;
- ( my $filter_name = $filter->{Name} ) =~ s/ /+/g;
- $text =~ s/%FP%/$url?view=filter&mid=$event->{MonitorId}&filter_name=$filter_name/g;
-
- return( $text );
-}
-
-sub sendEmail
-{
- my $filter = shift;
- my $event = shift;
-
- if ( !ZM_FROM_EMAIL )
- {
- warn( "No 'from' email address defined, not sending email" );
- return( 0 );
- }
- if ( !ZM_EMAIL_ADDRESS )
- {
- warn( "No email address defined, not sending email" );
- return( 0 );
- }
-
- Info( "Creating notification email\n" );
-
- my $subject = substituteTags( ZM_EMAIL_SUBJECT, $filter, $event );
- return( 0 ) if ( !$subject );
- my @attachments;
- my $body = substituteTags( ZM_EMAIL_BODY, $filter, $event, \@attachments );
- return( 0 ) if ( !$body );
-
- Info( "Sending notification email '$subject'\n" );
-
- eval
- {
- if ( ZM_NEW_MAIL_MODULES )
- {
- ### Create the multipart container
- my $mail = MIME::Lite->new (
- From => ZM_FROM_EMAIL,
- To => ZM_EMAIL_ADDRESS,
- Subject => $subject,
- Type => "multipart/mixed"
- );
- ### Add the text message part
- $mail->attach (
- Type => "TEXT",
- Data => $body
- );
- ### Add the attachments
- foreach my $attachment ( @attachments )
- {
- Info( "Attaching '$attachment->{path}\n" );
- $mail->attach(
- Path => $attachment->{path},
- Type => $attachment->{type},
- Disposition => "attachment"
- );
- }
- ### Send the Message
- MIME::Lite->send( "smtp", ZM_EMAIL_HOST, Timeout=>60 );
- $mail->send();
- }
- else
- {
- my $from_email = substituteTags( ZM_FROM_EMAIL );
- my $email_address = substituteTags( ZM_EMAIL_ADDRESS );
- my @attachpaths ;
- foreach my $attachment ( @attachments )
- {
- push(@attachpaths, $attachment->{path} );
- }
- my $attachstring ;
- if ( @attachpaths )
- {
- $attachstring = join(" -a "," ", @attachpaths);
- }
- Info( "Executing /usr/bin/email -s \" $subject\" $attachstring -f $from_email $email_address \n" );
- my $mail = `/usr/bin/email -s \"$subject\" $attachstring -f $from_email $email_address << EOF $body `;
- }
- };
- if ( $@ )
- {
- warn( "Can't send email: $@" );
- return( 0 );
- }
- else
- {
- Info( "Notification email sent\n" );
- }
- my $sql = "update Events set Emailed = 1 where Id = ?";
- my $sth = $dbh->prepare_cached( $sql ) or Fatal( "Can't prepare '$sql': ".$dbh->errstr() );
- my $res = $sth->execute( $event->{Id} ) or Fatal( "Can't execute '$sql': ".$sth->errstr() );
-
- return( 1 );
-}
-
-sub sendMessage
-{
- my $filter = shift;
- my $event = shift;
-
- if ( !ZM_FROM_EMAIL )
- {
- warn( "No 'from' email address defined, not sending message" );
- return( 0 );
- }
- if ( !ZM_MESSAGE_ADDRESS )
- {
- warn( "No message address defined, not sending message" );
- return( 0 );
- }
-
- Info( "Creating notification message\n" );
-
- my $subject = substituteTags( ZM_MESSAGE_SUBJECT, $filter, $event );
- return( 0 ) if ( !$subject );
- my @attachments;
- my $body = substituteTags( ZM_MESSAGE_BODY, $filter, $event, \@attachments );
- return( 0 ) if ( !$body );
-
- Info( "Sending notification message '$subject'\n" );
-
- eval
- {
- if ( ZM_NEW_MAIL_MODULES )
- {
- ### Create the multipart container
- my $mail = MIME::Lite->new (
- From => ZM_FROM_EMAIL,
- To => ZM_MESSAGE_ADDRESS,
- Subject => $subject,
- Type => "multipart/mixed"
- );
- ### Add the text message part
- $mail->attach (
- Type => "TEXT",
- Data => $body
- );
- ### Add the attachments
- foreach my $attachment ( @attachments )
- {
- Info( "Attaching '$attachment->{path}\n" );
- $mail->attach(
- Path => $attachment->{path},
- Type => $attachment->{type},
- Disposition => "attachment"
- );
- }
- ### Send the Message
- MIME::Lite->send( "smtp", ZM_EMAIL_HOST, Timeout=>60 );
- $mail->send();
- }
- else
- {
- my $from_email = substituteTags( ZM_FROM_EMAIL );
- my $email_address = substituteTags( ZM_EMAIL_ADDRESS );
- my @attachpaths ;
- foreach my $attachment ( @attachments )
- {
- push(@attachpaths, $attachment->{path} );
- }
- my $attachstring ;
- if ( @attachpaths )
- {
- $attachstring = join(" -a "," ", @attachpaths);
- }
- Info( "Executing /usr/bin/email -s \" $subject\" $attachstring -f $from_email $email_address \n" );
- my $mail = `/usr/bin/email -s \"$subject\" $attachstring -f $from_email $email_address << EOF $body `;
- }
- };
- if ( $@ )
- {
- warn( "Can't send email: $@" );
- return( 0 );
- }
- else
- {
- Info( "Notification message sent\n" );
- }
- my $sql = "update Events set Messaged = 1 where Id = ?";
- my $sth = $dbh->prepare_cached( $sql ) or Fatal( "Can't prepare '$sql': ".$dbh->errstr() );
- my $res = $sth->execute( $event->{Id} ) or Fatal( "Can't execute '$sql': ".$sth->errstr() );
-
- return( 1 );
-}
-
-sub executeCommand
-{
- my $filter = shift;
- my $event = shift;
-
- my $event_path = getEventPath( $event );
-
- my $command = $filter->{AutoExecuteCmd};
- $command .= " $event_path";
-
- Info( "Executing '$command'\n" );
- my $output = qx($command);
- my $status = $? >> 8;
- if ( $status || DBG_LEVEL > 0 )
- {
- chomp( $output );
- Debug( "Output: $output\n" );
- }
- if ( $status )
- {
- Error( "Command '$command' exited with status: $status\n" );
- return( 0 );
- }
- else
- {
- my $sql = "update Events set Executed = 1 where Id = ?";
- my $sth = $dbh->prepare_cached( $sql ) or Fatal( "Can't prepare '$sql': ".$dbh->errstr() );
- my $res = $sth->execute( $event->{Id} ) or Fatal( "Can't execute '$sql': ".$sth->errstr() );
- }
- return( 1 );
-}
-
diff --git a/abs/core/zoneminder/zminit.arch b/abs/core/zoneminder/zminit.arch
deleted file mode 100755
index 01b6658..0000000
--- a/abs/core/zoneminder/zminit.arch
+++ /dev/null
@@ -1,143 +0,0 @@
-#!/bin/sh
-
-
-ZM_CONFIG=/etc/zm.conf
-
-
-
-loadcfg() {
- if [ -f $ZM_CONFIG ]; then
- . $ZM_CONFIG
- else
- echo "ERROR: $ZM_CONFIG not found."
- exit 1
- fi
- }
-chkmysql(){
- #FIXME
- /etc/rc.d/mysqld restart || (echo "mysql is not availible" && exit 1 )
- }
-
-getmylogin(){
- echo "Enter MySQL Administrator username"
- echo "(Default: root and password is blank)"
- echo -n "MySQL Admin: "
- read MYADMIN
- echo -n "Password: "
- read MYPASS
- if [ "X$MYPASS" != "X" ]; then MYPASS="-p$MYPASS"; fi
- echo "\q" |mysql -u $MYADMIN $MYPASS || exit 0
-
- }
-
-checkdb()
-{
- # Check database exisits and version
- exists=$(echo "show databases" |mysql -u $MYADMIN "$MYPASS" |grep zm)
- if [ "$exists" = "zm" ]; then
- OLD_VERSION=$(echo "select Value from Config where Name = 'ZM_DYN_DB_VERSION';" | mysql -u $MYADMIN $MYPASS zm |grep -v '^Value')
-
- case $OLD_VERSION in
- "")
- echo "A zm database exists, but the version is unknown"
- echo "Updating is unlikely to succeed"
- ;;
- "$ZM_VERSION")
- echo "The zm database appears to be up to date"
- echo "If this is incorrect, edit $ZM_CONFIG to reflect the current version"
- ;;
- *)
- echo "A database fron zm-$OLD_VERSION exists already"
- ;;
- esac
-
- while [ true ]
- do
- echo "Choose one of the following options:"
- echo "[U]pdate the database"
- echo "[D]rop the old database and reinitialize"
- echo "[E]xit and do nothing"
- read OPTION
- case $OPTION in
- "U"|"u")
- /etc/rc.d/zm restart
- exit 0
- ;;
- "D"|"d")
- echo "drop database zm;"|mysql -u $MYADMIN $MYPASS
- return
- ;;
- "E"|"e")
- exit 0
- ;;
- esac
- done
- fi
-}
-
-checkcfg(){
-for n in ZM_DB_HOST ZM_DB_NAME ZM_DB_USER ZM_DB_PASS; do
- eval "val=\$$n"
- if [ "$val" = "" ]; then
- echo "ERROR($ZM_CONFIG): $n should not be empty."
- echo "Enter a $n for ZM to use the Database."
- if [ "$n" = "ZM_DB_PASS" ]; then
- echo -n "Will not echo on screen $n : "
- stty -echo # Turns off screen echo.
- read newval
- stty echo # Restores screen echo.
- echo ""
- ### The following can be used to generate a random password
- # randstr newval 16
- else
- echo -n "$n : "
- read newval
- fi
- cp $ZM_CONFIG /tmp/$$ &&
- sed 's/^'$n='.*$/'$n=$newval'/g' /tmp/$$ >$ZM_CONFIG
-
- fi
-done
-
-if [ "$ZM_DB_HOST" = "localhost" ]; then
- ClientHost=localhost
-else
- ClientHost=`hostname`
-fi
-}
-
-reloadcfg(){
-loadcfg
-}
-
-initdb(){
-sql=/tmp/zm.crdb.sql
-echo "" >$sql
-chmod 600 $sql
-
-echo "CREATE DATABASE $ZM_DB_NAME;" >>$sql
-echo "USE $ZM_DB_NAME;" >>$sql
-
-echo "GRANT all on $ZM_DB_NAME.* TO '$ZM_DB_USER'@'$ClientHost' IDENTIFIED BY '$ZM_DB_PASS';" >>$sql
-
-cat $sql | mysql -B -h $ZM_DB_HOST -u $MYADMIN $MYPASS
-rm -f $sql
-
-cat $ZM_PATH_UPDATE/zm_create.sql | mysql -h $ZM_DB_HOST -u $ZM_DB_USER -p$ZM_DB_PASS $ZM_DB_NAME
-( cd $ZM_PATH_UPDATE; perl $ZM_PATH_BIN/zmupdate.pl -f )
-
- $ZM_PATH_UPDATE/customdb $ZM_DB_HOST $ZM_DB_NAME $ZM_DB_USER $ZM_DB_PASS
-}
-
-
-
-loadcfg
-getmylogin
-checkdb
-checkcfg
-reloadcfg
-initdb
-
-
-
-
diff --git a/abs/core/zoneminder/zoneminder b/abs/core/zoneminder/zoneminder
new file mode 100644
index 0000000..c4cbf4d
--- /dev/null
+++ b/abs/core/zoneminder/zoneminder
@@ -0,0 +1,63 @@
+#!/bin/bash
+
+daemon_name=zm
+
+. /etc/rc.conf
+. /etc/rc.d/functions
+
+case "$1" in
+ start)
+ stat_busy "Starting Zoneminder"
+ /usr/bin/zmfix -a
+ if /usr/bin/zmpkg.pl start >/dev/null ; then
+ add_daemon $daemon_name
+ stat_done
+ else
+ stat_fail
+ exit 1
+ fi
+ ;;
+
+ stop)
+ stat_busy "Stopping Zoneminder"
+ if /usr/bin/zmpkg.pl stop >/dev/null ; then
+ rm_daemon $daemon_name
+ stat_done
+ else
+ stat_fail
+ exit 1
+ fi
+ ;;
+
+ reload)
+ stat_busy "Reloading Zoneminder"
+ if /usr/bin/zmpkg.pl graceful >/dev/null ; then
+ add_daemon $daemon_name
+ stat_done
+ else
+ stat_fail
+ exit 1
+ fi
+ ;;
+
+ restart)
+ stat_busy "Restarting Zoneminder"
+ if /usr/bin/zmpkg.pl restart >/dev/null ; then
+ add_daemon $daemon_name
+ stat_done
+ else
+ stat_fail
+ exit 1
+ fi
+ ;;
+
+ status)
+ stat_busy "Checking Zoneminder status";
+ ck_status $daemon_name
+ ;;
+
+ *)
+ echo "usage: $0 {start|stop|reload|restart|status}"
+esac
+
+exit 0
diff --git a/abs/core/zoneminder/zoneminder.install b/abs/core/zoneminder/zoneminder.install
index 250749f..c2e1cb8 100755..100644
--- a/abs/core/zoneminder/zoneminder.install
+++ b/abs/core/zoneminder/zoneminder.install
@@ -1,55 +1,102 @@
-# zoneminder.install
-## arg 1: the new package version
-post_install() {
- ln -s /usr/share/cambozola/cambozola.jar /srv/zoneminder/www/
- chown -R http.http /srv/zoneminder
- chown http.http /etc/zm.conf
- cat << EOF
-Note:
-==> To initialize the ZoneMinder database run (as root)
-==> /usr/lib/zm/bin/zminit
-EOF
+install_db() {
+ . /etc/systemconfig
+ if [ $SystemType = Master_backend -o $SystemType = Standalone ]
+ then
+ mysql -e "use zm" > /dev/null
+ rc=$?
+ if [ $rc = 1 ]
+ then
+ echo "Installing zoneminder database zm"
+ cat /usr/share/zoneminder/db/zm_create.sql | mysql
+ echo 'grant lock tables, alter,select,insert,update,delete on zm.* to 'zmuser'@localhost identified by "zmpass";' | mysql
+ fi
+ else
+ echo "Will only init the database for StandAlone or Master_backend LinHES systems"
+ fi
+ }
-cat << EOF
-==> Check /etc/php/php.ini and make sure these are uncommented
-==> extension=gd.so
-==> extension=gettext.so
-==> extension=mcrypt.so
-==> extension=mysql.so
-==> extension=mysqli.so
-==> extension=session.so
-==> extension=sockets.so
+pre_install() {
+ set -e
+ abort=false
+ if [ -L /srv/http/zoneminder/events ]; then
+ l=$(readlink /srv/http/zoneminder/events)
+ if [ $l != /var/cache/zoneminder/events ]; then
+ abort=true
+ fi
+ fi
+ if [ -L /srv/http/zoneminder/images ]; then
+ l=$(readlink /srv/http/zoneminder/images)
+ if [ $l != /var/cache/zoneminder/images ]; then
+ abort=true
+ fi
+ fi
+ if [ $abort = true ]; then
+ cat >&2 << EOF
+Aborting installation of zoneminder due to non-default symlinks in
+/srv/http/zoneminder for the images and/or events directory, which could
+result in loss of data. Please move your data in each of these directories to
+/var/cache/zoneminder before installing zoneminder from the package.
EOF
-cat << EOF
-==> Check /etc/php/php.ini and make sure short_open_tag = On
-EOF
-
+ exit 1
+ fi
+ exit 0
+}
-cat /etc/php/php.ini |grep "^open_basedir.*/etc/" | \
-grep "/var/lib/zm/www">/dev/null || cat << EOF
-==> You must edit /etc/php/php.ini and add to open_basedir "/etc/" and
-==> "/var/lib/zm/" like so
-==> open_basedir = /home/:/tmp/:/usr/share/pear/:/etc/:/var/lib/zm/
-==> Otherwise ZoneMinder will be unable to read /etc/zm.conf
-==> or display its own web directory
-EOF
+post_install() {
+ if [[ -d /var/log/zoneminder ]]; then
+ chmod 0755 /var/log/zoneminder
+ chown http.http /var/log/zoneminder
+ else
+ mkdir -m 0755 /var/log/zoneminder
+ chown http.http /var/log/zoneminder
+ fi
+ if [[ -d /tmp/zoneminder ]]; then
+ chmod 0700 /tmp/zoneminder
+ chown http.http /tmp/zoneminder
+ else
+ mkdir -m 0700 /tmp/zoneminder
+ chown http.http /tmp/zoneminder
+ fi
+#---
+ usermod -G video http
+ COUNT=`grep -c "zm.include" /etc/lighttpd/conf.include`
+ if [ $COUNT == 0 ]
+ then
+ echo "==> Adding zm.include to conf.include"
+ echo "include \"/etc/lighttpd/zm.include\"" >> /etc/lighttpd/conf.include
+ fi
+ echo
+ echo "==> Forcing a re-read of lighttpd's configuration file."
+ echo ""
+ /sbin/sv hup /service/lighttpd
-cat << EOF
-Note:
-==> You must edit /etc/httpd/conf/httpd.conf and uncomment/add the line
-==> LoadModule php5_module modules/libphp5.so
-==> You must also add these lines:
-==> Include conf/extra/php5_module.conf
-==> Include /etc/httpd/conf/extra/httpd-zm.conf
-EOF
-touch /var/lib/zm/zm_backup.sql
+ install_db
+#---
+}
+post_upgrade() {
+ post_install
+ /usr/bin/zmupdate.pl -f >/dev/null
}
+post_remove() {
+ if [[ -d /tmp/zoneminder ]]; then
+ rm -vr /tmp/zoneminder
+ fi
+
+#--
+ COUNT=`grep -c "zm.include" /etc/lighttpd/conf.include`
+ if [ $COUNT -gt 0 ]
+ then
+ echo "==> Removing zm.include from conf.include"
+ sed -i 's#include \"/etc/lighttpd/zm.include\"##' -i /etc/lighttpd/conf.include
+ fi
+
+
+ echo
+ echo "==> Forcing a re-read of lighttpd's configuration file."
+ echo ""
+ /sbin/sv hup /service/lighttpd
+#--
-## arg 1: the new package version
-## arg 2: the old package version
-post_upgrade() {
-/usr/lib/zm/bin/zmupdate.pl -f >/dev/null
}
-# vim:set ts=2 sw=2 et:
diff --git a/abs/core/zoneminder/zoneminder.service b/abs/core/zoneminder/zoneminder.service
new file mode 100644
index 0000000..05cae6f
--- /dev/null
+++ b/abs/core/zoneminder/zoneminder.service
@@ -0,0 +1,13 @@
+[Unit]
+Description=Capture, analyse, record and monitor video security cameras
+After=network.target remote-fs.target
+Required=mysqld.service
+
+[Service]
+Type=forking
+ExecStart=/usr/bin/zmpkg.pl start
+ExecRestart=/usr/bin/zmpkg.pl restart
+ExecStop=/usr/bin/zmpkg.pl stop
+
+[Install]
+WantedBy=multi-user.target