summaryrefslogtreecommitdiffstats
path: root/abs/core/zoneminder
diff options
context:
space:
mode:
authorJames Meyer <james.meyer@operamail.com>2013-02-19 21:10:18 (GMT)
committerJames Meyer <james.meyer@operamail.com>2013-02-19 21:10:18 (GMT)
commit2648e999d277eac5c3d331a3609bcc73fafbea71 (patch)
tree40951fb8e7fdbe28a0baa324ae615055203f1e2e /abs/core/zoneminder
parentc759b5e0c4aa6fc37412b4dee2cf9ad993fd376d (diff)
parent7e6f7ca174e1af67178dc5293a312a4a733eb095 (diff)
downloadlinhes_pkgbuild-2648e999d277eac5c3d331a3609bcc73fafbea71.zip
linhes_pkgbuild-2648e999d277eac5c3d331a3609bcc73fafbea71.tar.gz
linhes_pkgbuild-2648e999d277eac5c3d331a3609bcc73fafbea71.tar.bz2
Merge branch 'testing'
# By James Meyer (1091) and others # Via James Meyer (5) and others * testing: (1148 commits) LinHES-config: during install don't kill off lirc. This keeps the remote active all the way to the finish Change version numbers to 8.0 to match the release number. LinHES-conifg LinHES-system mythdb-initial runit-scripts supplemental-web LinHES-conifig: mv_install.py for the last partition don't go all the way to the end. Gotta leave room for gpt tables. xf86-video-ati: xorg ati driver. LinHES-config: timezip.py add syncing up of parental lvl passwords and starting level with MBE. LinHES-system: correct the logic for breaking out of the wmctrl loop. As written it would break out of the inner loop..but not the 60 iteration loop. e16_theme_settings: remove slide-in prop for new windows. For whatever reason this was preventing mplayer from being positioned correctly for appletrailers. LinHES-config, mythinstall: change case of hd_pvr and serial to all lower refs #902 zilog-firmware: firmware for TX support of the hdpvr and pvr-150 In general I can't recommend anybody using these transmitters but including the firmware just in case someone really wants to linhes-udev-rules: added hdprv_lirc rule. All of these lirc rules are limited to exactly one device. If more then one device is present then only the last device in init will get the symlink runit-scripts: fix logging for igdeamon, add support to remote init script so that the blaster is always the first device in the chain. added support specificly for hd_pvr LinHES-system: add lh_system_restore and lh_system_backup. These scripts are called from the mythmenu. refs #900 iguanair: rebuild with python 2.7 LinHES-system: msg_daemon.py fix init and nasty bug related to timeout. In a nutshell timeout wouldn't work unless a msg without a timeout was called first. linhes-udev-rules: add rules for mce,streamzap,serial lirc devices. mythinstall: recompile for matching libs mythtv: latest .25-fixes and change mythbackup/restore call lh_system_$op to replace mythbackup/mythrestore. mythbackup no longer works correctly with the new windowmanager linhes-scripts: myth2mp3, myth2x264, myth2xvid: use mythutil to get cutlist LinHES-config, supplimental-web: Fix proxy numbering for Ceton infiniTV linhes-system: add additional stuff to the system backup and also introduced an exclude file. The exclude/include files are locate in /home/mythtv/backup_config/ ...
Diffstat (limited to 'abs/core/zoneminder')
-rwxr-xr-xabs/core/zoneminder/Controls_Orbit.sql3
-rwxr-xr-xabs/core/zoneminder/Makefile.patch11
-rw-r--r--[-rwxr-xr-x]abs/core/zoneminder/PKGBUILD286
-rw-r--r--abs/core/zoneminder/__changelog17
-rwxr-xr-xabs/core/zoneminder/customdb31
-rw-r--r--abs/core/zoneminder/gen_light_zm.conf1
-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
-rw-r--r--abs/core/zoneminder/zm_gen_light.conf1
-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.install123
-rw-r--r--abs/core/zoneminder/zoneminder.service13
20 files changed, 468 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..33118bd 100755..100644
--- a/abs/core/zoneminder/PKGBUILD
+++ b/abs/core/zoneminder/PKGBUILD
@@ -1,84 +1,218 @@
-# 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=23
+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
+ zm_gen_light.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
+ #gen_light_conf
+ install -D -m0744 ${srcdir}/zm_gen_light.conf ${pkgdir}/etc/gen_light_conf.d/zoneminder.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'
+ 'c528e75443ae421cb7f63e12350c692a'
+ '81cb12b36616a299ec808ac70a809ec2')
diff --git a/abs/core/zoneminder/__changelog b/abs/core/zoneminder/__changelog
new file mode 100644
index 0000000..5ebce4d
--- /dev/null
+++ b/abs/core/zoneminder/__changelog
@@ -0,0 +1,17 @@
+Change cgidir and webdir:
+ /data/srv/
+--
+added zm.include for lighttpd
+added zm.sysctrl.conf to set the shared mem
+added zm_gen_light.conf
+--
+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
+gen_light_conf.py
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/gen_light_zm.conf b/abs/core/zoneminder/gen_light_zm.conf
new file mode 100644
index 0000000..3716bb0
--- /dev/null
+++ b/abs/core/zoneminder/gen_light_zm.conf
@@ -0,0 +1 @@
+include "/etc/lighttpd/zm.include"
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..fe8cc9e
--- /dev/null
+++ b/abs/core/zoneminder/zm.sysctrl.conf
@@ -0,0 +1,2 @@
+kernel.shmall = 2097152
+kernel.shmmax = 536870912
diff --git a/abs/core/zoneminder/zm_gen_light.conf b/abs/core/zoneminder/zm_gen_light.conf
new file mode 100644
index 0000000..3716bb0
--- /dev/null
+++ b/abs/core/zoneminder/zm_gen_light.conf
@@ -0,0 +1 @@
+include "/etc/lighttpd/zm.include"
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..bf5cd99 100755..100644
--- a/abs/core/zoneminder/zoneminder.install
+++ b/abs/core/zoneminder/zoneminder.install
@@ -1,55 +1,86 @@
-# 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
-EOF
-cat << EOF
-==> Check /etc/php/php.ini and make sure short_open_tag = On
+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
+ exit 1
+ fi
+ exit 0
+}
+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
+ install_db
+ gen_light_include.py
+ /sbin/sv hup /service/lighttpd
+#---
+}
-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
-
-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
+post_upgrade() {
+ post_install
+ /usr/bin/zmupdate.pl -f >/dev/null
+ gen_light_include.py
+ /sbin/sv hup /service/lighttpd
}
+post_remove() {
+ if [[ -d /tmp/zoneminder ]]; then
+ rm -vr /tmp/zoneminder
+ fi
+
+#--
+ gen_light_include.py
+ /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