diff options
Diffstat (limited to 'abs/core/zoneminder')
| -rwxr-xr-x | abs/core/zoneminder/Controls_Orbit.sql | 3 | ||||
| -rwxr-xr-x | abs/core/zoneminder/Makefile.patch | 11 | ||||
| -rw-r--r--[-rwxr-xr-x] | abs/core/zoneminder/PKGBUILD | 286 | ||||
| -rw-r--r-- | abs/core/zoneminder/__changelog | 17 | ||||
| -rwxr-xr-x | abs/core/zoneminder/customdb | 31 | ||||
| -rw-r--r-- | abs/core/zoneminder/gen_light_zm.conf | 1 | ||||
| -rwxr-xr-x | abs/core/zoneminder/httpd-zm.conf | 18 | ||||
| -rw-r--r-- | abs/core/zoneminder/httpd-zoneminder.conf | 20 | ||||
| -rw-r--r-- | abs/core/zoneminder/patch-ffmpeg-0.11.patch | 60 | ||||
| -rwxr-xr-x | abs/core/zoneminder/run | 21 | ||||
| -rw-r--r-- | abs/core/zoneminder/zm.include | 4 | ||||
| -rwxr-xr-x | abs/core/zoneminder/zm.rc.d | 172 | ||||
| -rw-r--r-- | abs/core/zoneminder/zm.sysctrl.conf | 2 | ||||
| -rw-r--r-- | abs/core/zoneminder/zm_gen_light.conf | 1 | ||||
| -rwxr-xr-x | abs/core/zoneminder/zmeventbackup | 48 | ||||
| -rwxr-xr-x | abs/core/zoneminder/zmfilter.pl | 1119 | ||||
| -rwxr-xr-x | abs/core/zoneminder/zminit.arch | 143 | ||||
| -rw-r--r-- | abs/core/zoneminder/zoneminder | 63 | ||||
| -rw-r--r--[-rwxr-xr-x] | abs/core/zoneminder/zoneminder.install | 123 | ||||
| -rw-r--r-- | abs/core/zoneminder/zoneminder.service | 13 | 
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  | 
