diff --git a/distros/debian/apache.conf b/distros/debian/apache.conf
index 9a5e026901..b0a22c4d8f 100644
--- a/distros/debian/apache.conf
+++ b/distros/debian/apache.conf
@@ -2,7 +2,7 @@ Alias /zm /usr/share/zoneminder/www
- Options +ExecCGI
+ Options -Indexes +ExecCGI
AllowOverride All
AddHandler fcgid-script .php
FCGIWrapper /usr/bin/php5-cgi
@@ -12,7 +12,7 @@ Alias /zm /usr/share/zoneminder/www
- Options Indexes FollowSymLinks
+ Options -Indexes +FollowSymLinks
DirectoryIndex index.php
diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Database.pm b/scripts/ZoneMinder/lib/ZoneMinder/Database.pm
index 9e8e041c8f..19374543ea 100644
--- a/scripts/ZoneMinder/lib/ZoneMinder/Database.pm
+++ b/scripts/ZoneMinder/lib/ZoneMinder/Database.pm
@@ -75,9 +75,11 @@ sub zmDbConnect {
if ( $force ) {
zmDbDisconnect();
}
- if ( !defined( $dbh ) ) {
+ my $options = shift;
+
+ if ( ( ! defined( $dbh ) ) or ! $dbh->ping() ) {
+ my ( $host, $portOrSocket ) = ( $ZoneMinder::Config::Config{ZM_DB_HOST} =~ /^([^:]+)(?::(.+))?$/ );
my $socket;
- my ( $host, $portOrSocket ) = ( $Config{ZM_DB_HOST} =~ /^([^:]+)(?::(.+))?$/ );
if ( defined($portOrSocket) ) {
if ( $portOrSocket =~ /^\// ) {
@@ -89,7 +91,7 @@ sub zmDbConnect {
$socket = ";host=".$Config{ZM_DB_HOST};
}
$dbh = DBI->connect( "DBI:mysql:database=".$Config{ZM_DB_NAME}
- .$socket
+ .$socket . ($options?';'.join(';', map { $_.'='.$$options{$_} } keys %{$options} ) : '' )
, $Config{ZM_DB_USER}
, $Config{ZM_DB_PASS}
);
diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm b/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm
index fe54e5a865..75d0e6ad4c 100644
--- a/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm
+++ b/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm
@@ -28,31 +28,14 @@ use 5.006;
use strict;
use warnings;
-require Exporter;
require ZoneMinder::Base;
require Date::Manip;
-our @ISA = qw(Exporter ZoneMinder::Base);
-
-# Items to export into callers namespace by default. Note: do not export
-# names by default without a very good reason. Use EXPORT_OK instead.
-# Do not simply export all your public functions/methods/constants.
-
-# This allows declaration use ZoneMinder ':all';
-# If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
-# will save memory.
-our %EXPORT_TAGS = (
- 'functions' => [ qw(
- ) ]
- );
-push( @{$EXPORT_TAGS{all}}, @{$EXPORT_TAGS{$_}} ) foreach keys %EXPORT_TAGS;
-
-our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
-
-our @EXPORT = qw();
-
-our $VERSION = $ZoneMinder::Base::VERSION;
+use parent qw(ZoneMinder::Object);
+use vars qw/ $table $primary_key /;
+$table = 'Filters';
+$primary_key = 'Id';
# ==========================================================================
#
# General Utility Functions
@@ -62,40 +45,10 @@ our $VERSION = $ZoneMinder::Base::VERSION;
use ZoneMinder::Config qw(:all);
use ZoneMinder::Logger qw(:all);
use ZoneMinder::Database qw(:all);
+require ZoneMinder::Server;
use POSIX;
-sub new {
- my ( $parent, $id, $data ) = @_;
-
- my $self = {};
- bless $self, $parent;
- $$self{dbh} = $ZoneMinder::Database::dbh;
-#zmDbConnect();
- if ( ( $$self{Id} = $id ) or $data ) {
-#$log->debug("loading $parent $id") if $debug or DEBUG_ALL;
- $self->load( $data );
- }
- return $self;
-} # end sub new
-
-sub load {
- my ( $self, $data ) = @_;
- my $type = ref $self;
- if ( ! $data ) {
-#$log->debug("Object::load Loading from db $type");
- $data = $$self{dbh}->selectrow_hashref( 'SELECT * FROM Filter WHERE Id=?', {}, $$self{Id} );
- if ( ! $data ) {
- Error( "Failure to load Filter record for $$self{Id}: Reason: " . $$self{dbh}->errstr );
- } else {
- Debug( 3, "Loaded Filter $$self{Id}" );
- } # end if
- } # end if ! $data
- if ( $data and %$data ) {
- @$self{keys %$data} = values %$data;
- } # end if
-} # end sub load
-
sub Name {
if ( @_ > 1 ) {
$_[0]{Name} = $_[1];
@@ -142,7 +95,6 @@ sub find_one {
sub Execute {
my $self = $_[0];
-
my $sql = $self->Sql();
if ( $self->{HasDiskPercent} ) {
@@ -158,8 +110,9 @@ sub Execute {
$sql =~ s/zmSystemLoad/$load/g;
}
- my $sth = $$self{dbh}->prepare_cached( $sql )
- or Fatal( "Can't prepare '$sql': ".$$self{dbh}->errstr() );
+ Debug("Filter::Execute SQL ($sql)");
+ my $sth = $ZoneMinder::Database::dbh->prepare_cached( $sql )
+ or Fatal( "Can't prepare '$sql': ".$ZoneMinder::Database::dbh->errstr() );
my $res = $sth->execute();
if ( !$res ) {
Error( "Can't execute filter '$sql', ignoring: ".$sth->errstr() );
@@ -171,6 +124,7 @@ sub Execute {
push @results, $event;
}
$sth->finish();
+ Debug("Loaded " . @results . " events for filter $_[0]{Name} using query ($sql)");
return @results;
}
@@ -308,6 +262,8 @@ sub Sql {
if ( $self->{AutoArchive} ) {
push @auto_terms, "E.Archived = 0";
}
+ # Don't do this, it prevents re-generation and concatenation.
+ # If the file already exists, then the video won't be re-recreated
if ( $self->{AutoVideo} ) {
push @auto_terms, "E.Videoed = 0";
}
@@ -359,14 +315,13 @@ sub Sql {
if ( $filter_expr->{limit} ) {
$sql .= " limit 0,".$filter_expr->{limit};
}
- Debug( "SQL:$sql\n" );
$self->{Sql} = $sql;
} # end if has Sql
return $self->{Sql};
} # end sub Sql
sub getDiskPercent {
- my $command = "df .";
+ my $command = "df " . ($_[0] ? $_[0] : '.');
my $df = qx( $command );
my $space = -1;
if ( $df =~ /\s(\d+)%/ms ) {
diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Object.pm b/scripts/ZoneMinder/lib/ZoneMinder/Object.pm
new file mode 100644
index 0000000000..b87e111a62
--- /dev/null
+++ b/scripts/ZoneMinder/lib/ZoneMinder/Object.pm
@@ -0,0 +1,150 @@
+# ==========================================================================
+#
+# ZoneMinder Object Module, $Date$, $Revision$
+# Copyright (C) 2001-2017 ZoneMinder LLC
+#
+# 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 module contains the common definitions and functions used by the rest
+# of the ZoneMinder scripts
+#
+package ZoneMinder::Object;
+
+use 5.006;
+use strict;
+use warnings;
+
+require ZoneMinder::Base;
+
+our @ISA = qw(ZoneMinder::Base);
+
+# ==========================================================================
+#
+# General Utility Functions
+#
+# ==========================================================================
+
+use ZoneMinder::Config qw(:all);
+use ZoneMinder::Logger qw(:all);
+use ZoneMinder::Database qw(:all);
+
+use vars qw/ $AUTOLOAD /;
+
+sub new {
+ my ( $parent, $id, $data ) = @_;
+
+ my $self = {};
+ bless $self, $parent;
+ no strict 'refs';
+ my $primary_key = ${$parent.'::primary_key'};
+ if ( ! $primary_key ) {
+ Error( 'NO primary_key for type ' . $parent );
+ return;
+ } # end if
+ if ( ( $$self{$primary_key} = $id ) or $data ) {
+#$log->debug("loading $parent $id") if $debug or DEBUG_ALL;
+ $self->load( $data );
+ }
+ return $self;
+} # end sub new
+
+sub load {
+ my ( $self, $data ) = @_;
+ my $type = ref $self;
+ if ( ! $data ) {
+ no strict 'refs';
+ my $table = ${$type.'::table'};
+ if ( ! $table ) {
+ Error( 'NO table for type ' . $type );
+ return;
+ } # end if
+ my $primary_key = ${$type.'::primary_key'};
+ if ( ! $primary_key ) {
+ Error( 'NO primary_key for type ' . $type );
+ return;
+ } # end if
+
+ if ( ! $$self{$primary_key} ) {
+ my ( $caller, undef, $line ) = caller;
+ Error( (ref $self) . "::load called without $primary_key from $caller:$line");
+ } else {
+#$log->debug("Object::load Loading from db $type");
+ Debug("Loading $type from $table WHERE $primary_key = $$self{$primary_key}");
+ $data = $ZoneMinder::Database::dbh->selectrow_hashref( "SELECT * FROM $table WHERE $primary_key=?", {}, $$self{$primary_key} );
+ if ( ! $data ) {
+ if ( $ZoneMinder::Database::dbh->errstr ) {
+ Error( "Failure to load Object record for $$self{$primary_key}: Reason: " . $ZoneMinder::Database::dbh->errstr );
+ } else {
+ Debug("No Results Loading $type from $table WHERE $primary_key = $$self{$primary_key}");
+ } # end if
+ } # end if
+ } # end if
+ } # end if ! $data
+ if ( $data and %$data ) {
+ @$self{keys %$data} = values %$data;
+ } # end if
+} # end sub load
+
+sub AUTOLOAD {
+ my ( $self, $newvalue ) = @_;
+ my $type = ref($_[0]);
+ my $name = $AUTOLOAD;
+ $name =~ s/.*://;
+ if ( @_ > 1 ) {
+ return $_[0]{$name} = $_[1];
+ }
+ return $_[0]{$name};
+}
+
+
+1;
+__END__
+
+# Below is stub documentation for your module. You'd better edit it!
+
+=head1 NAME
+
+ZoneMinder::Object
+
+=head1 SYNOPSIS
+
+ use parent ZoneMinder::Object;
+
+ This package should likely not be used directly, as it is meant mainly to be a parent for all other ZoneMinder classes.
+
+=head1 DESCRIPTION
+
+ A base Object to act as parent for other ZoneMinder Objects.
+
+=head2 EXPORT
+
+None by default.
+
+=head1 AUTHOR
+
+Isaac Connor, Eisaac@zoneminder.comE
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (C) 2001-2017 ZoneMinder LLC
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself, either Perl version 5.8.3 or,
+at your option, any later version of Perl 5 you may have available.
+
+
+=cut