From 35617a6cf7963cc8e37d9e9509d4d062997a0b5a Mon Sep 17 00:00:00 2001 From: dreaddy Date: Mon, 2 Nov 2015 22:16:10 -0500 Subject: [PATCH 01/90] #1128 - Added option to enable send email by ssmtp mail. Option for custom ssmtp path. Conditional checks for new options in filter --- .../lib/ZoneMinder/ConfigData.pm.in | 28 +++++++++++++++++++ scripts/zmfilter.pl.in | 20 +++++++++++-- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in index 7fff3d62e..d5da2eb9d 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in +++ b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in @@ -4045,6 +4045,34 @@ body = "ZM alarm detected - %EL% secs, %EF%/%EFA% frames, t%EST%/m%ESM%/a%ESA% s type => $types{string}, category => "eyeZm", }, + { + name => "ZM_SSMTP_MAIL", + default => "no", + description => "Use a SSMTP mail server if available. NEW_MAIL_MODULES must be enabled", + requires => [ + { name => "ZM_OPT_EMAIL", value => "yes" }, + { name => "ZM_OPT_MESSAGE", value => "yes" }, + { name => "ZM_NEW_MAIL_MODULES", value => "yes" } + ], + help => qqq(" + Please visit the following wiki page for more information on setting up ssmtp: http://www.zoneminder.com/wiki/index.php/How_to_get_ssmtp_working_with_Zoneminder. + "), + type => $types{boolean}, + category => "mail", + }, + { + name => "ZM_SSMTP_PATH", + default => "", + description => "SSMTP path custom location", + requires => [ + { name => "ZM_SSMTP_MAIL", value => "yes" } + ], + help => qqq(" + Please visit the following wiki page for more information on setting up ssmtp: http://www.zoneminder.com/wiki/index.php/How_to_get_ssmtp_working_with_Zoneminder. + "), + type => $types{string}, + category => "mail", + }, ); our %options_hash = map { ( $_->{name}, $_ ) } @options; diff --git a/scripts/zmfilter.pl.in b/scripts/zmfilter.pl.in index 54f372262..d038488b4 100755 --- a/scripts/zmfilter.pl.in +++ b/scripts/zmfilter.pl.in @@ -1165,9 +1165,25 @@ sub sendEmail Disposition => "attachment" ); } + if ( $Config{ZM_SSMTP_MAIL} ){ + + my $ssmtp_location = qx('which ssmtp'); + + if( $Config{ZM_SSMTP_PATH} ){ + + $ssmtp_location = $Config{ZM_SSMTP_PATH} + } + + $mail->send( 'sendmail', $ssmtp_location, $Config{ZM_EMAIL_ADDRESS} ); + + }else{ + + MIME::Lite->send( "smtp", $Config{ZM_EMAIL_HOST}, Timeout=>60 ); + $mail->send(); + } ### Send the Message - MIME::Lite->send( "smtp", $Config{ZM_EMAIL_HOST}, Timeout=>60 ); - $mail->send(); + #MIME::Lite->send( "smtp", $Config{ZM_EMAIL_HOST}, Timeout=>60 ); + #$mail->send(); } else { From ced0240fc3817a5dd724875d5327501db877a77e Mon Sep 17 00:00:00 2001 From: dreaddy Date: Fri, 6 Nov 2015 10:43:30 -0500 Subject: [PATCH 02/90] Use the ssmtp path set in options first. shell command if ssmtp path empty. display debug suggesting set ssmtp path in option. --- scripts/zmfilter.pl.in | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/scripts/zmfilter.pl.in b/scripts/zmfilter.pl.in index d038488b4..7e335a30f 100755 --- a/scripts/zmfilter.pl.in +++ b/scripts/zmfilter.pl.in @@ -1167,11 +1167,17 @@ sub sendEmail } if ( $Config{ZM_SSMTP_MAIL} ){ - my $ssmtp_location = qx('which ssmtp'); + my $ssmtp_location = $Config{ZM_SSMTP_PATH} - if( $Config{ZM_SSMTP_PATH} ){ + if( ! $ssmtp_location ){ + + $ssmtp_location = qx('which ssmtp'); + + if ( logDebugging() ) + { + Debug( "which ssmtp: $ssmtp_location - set ssmtp path in options to suppress this message\n" ); + } - $ssmtp_location = $Config{ZM_SSMTP_PATH} } $mail->send( 'sendmail', $ssmtp_location, $Config{ZM_EMAIL_ADDRESS} ); From 92401193a76d7b45d8a4aeacb4236ddf9f47d547 Mon Sep 17 00:00:00 2001 From: dreaddy Date: Fri, 6 Nov 2015 11:19:12 -0500 Subject: [PATCH 03/90] Add missing semicolon --- scripts/zmfilter.pl.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/zmfilter.pl.in b/scripts/zmfilter.pl.in index 7e335a30f..042539907 100755 --- a/scripts/zmfilter.pl.in +++ b/scripts/zmfilter.pl.in @@ -1167,7 +1167,7 @@ sub sendEmail } if ( $Config{ZM_SSMTP_MAIL} ){ - my $ssmtp_location = $Config{ZM_SSMTP_PATH} + my $ssmtp_location = $Config{ZM_SSMTP_PATH}; if( ! $ssmtp_location ){ From 3479af78bd84c7ead3dc18b29fae12c65abf3ca2 Mon Sep 17 00:00:00 2001 From: dreaddy Date: Fri, 6 Nov 2015 13:36:29 -0500 Subject: [PATCH 04/90] Add more verbose help --- scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in index d5da2eb9d..49fa87f8b 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in +++ b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in @@ -4055,7 +4055,9 @@ body = "ZM alarm detected - %EL% secs, %EF%/%EFA% frames, t%EST%/m%ESM%/a%ESA% s { name => "ZM_NEW_MAIL_MODULES", value => "yes" } ], help => qqq(" - Please visit the following wiki page for more information on setting up ssmtp: http://www.zoneminder.com/wiki/index.php/How_to_get_ssmtp_working_with_Zoneminder. + +SSMTP is a lightweight and efficient method to send email. The SSMTP application is not installed by default. NEW_MAIL_MODULES must also be enabled Please visit: http://www.zoneminder.com/wiki/index.php/How_to_get_ssmtp_working_with_Zoneminder setup and configuration help. + "), type => $types{boolean}, category => "mail", @@ -4063,12 +4065,12 @@ body = "ZM alarm detected - %EL% secs, %EF%/%EFA% frames, t%EST%/m%ESM%/a%ESA% s { name => "ZM_SSMTP_PATH", default => "", - description => "SSMTP path custom location", + description => "SSMTP executable path", requires => [ { name => "ZM_SSMTP_MAIL", value => "yes" } ], help => qqq(" - Please visit the following wiki page for more information on setting up ssmtp: http://www.zoneminder.com/wiki/index.php/How_to_get_ssmtp_working_with_Zoneminder. +Recommend setting the path to the SSMTP application. If path is not defined. Zoneminder will try to determined the path via shell command. Example path: /usr/sbin/ssmtp. "), type => $types{string}, category => "mail", From 7365c053e6bcd67ef960d6de89bf722b44a3280f Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 17 Dec 2015 12:56:40 -0500 Subject: [PATCH 05/90] Create a Filter object, out of some of the code in zmfilter.pl. The purpose is to be able to use it elsewhere like zmvideo.pl. --- scripts/ZoneMinder/lib/ZoneMinder/Filter.pm | 494 +++++++++++++++++++ scripts/ZoneMinder/lib/ZoneMinder/Storage.pm | 160 ++++++ 2 files changed, 654 insertions(+) create mode 100644 scripts/ZoneMinder/lib/ZoneMinder/Filter.pm create mode 100644 scripts/ZoneMinder/lib/ZoneMinder/Storage.pm diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm b/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm new file mode 100644 index 000000000..4888636a6 --- /dev/null +++ b/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm @@ -0,0 +1,494 @@ +# ========================================================================== +# +# ZoneMinder Filter Module, $Date$, $Revision$ +# Copyright (C) 2001-2008 Philip Coombes +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# ========================================================================== +# +# This module contains the common definitions and functions used by the rest +# of the ZoneMinder scripts +# +package ZoneMinder::Filter; + +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; + +# ========================================================================== +# +# General Utility Functions +# +# ========================================================================== + +use ZoneMinder::Config qw(:all); +use ZoneMinder::Logger qw(:all); +use ZoneMinder::Database qw(:all); + +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]; + } + return $_[0]{Name}; +} # end sub Path + +sub find { + +} +sub Execute { + my $self = $_[0]; + + my $sql = $self->Sql(); + + if ( $self->{HasDiskPercent} ) + { + my $disk_percent = getDiskPercent(); + $sql =~ s/zmDiskPercent/$disk_percent/g; + } + if ( $self->{HasDiskBlocks} ) + { + my $disk_blocks = getDiskBlocks(); + $sql =~ s/zmDiskBlocks/$disk_blocks/g; + } + if ( $self->{HasSystemLoad} ) + { + my $load = getLoad(); + $sql =~ s/zmSystemLoad/$load/g; + } + + my $sth = $$self{dbh}->prepare_cached( $sql ) + or Fatal( "Can't prepare '$sql': ".$$self{dbh}->errstr() ); + my $res = $sth->execute(); + if ( !$res ) + { + Error( "Can't execute filter '$sql', ignoring: ".$sth->errstr() ); + return; + } + my @results; + + while( my $event = $sth->fetchrow_hashref() ) { + push @results, $event; + } + $sth->finish(); + return @results; +} + +sub Sql { + my $self = $_[0]; + if ( ! $$self{Sql} ) { + my $filter_expr = ZoneMinder::General::jsonDecode( $self->{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 + "; + $self->{Sql} = ''; + + if ( $filter_expr->{terms} ) { + for ( my $i = 0; $i < @{$filter_expr->{terms}}; $i++ ) { + if ( exists($filter_expr->{terms}[$i]->{cnj}) ) { + $self->{Sql} .= " ".$filter_expr->{terms}[$i]->{cnj}." "; + } + if ( exists($filter_expr->{terms}[$i]->{obr}) ) { + $self->{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(.+)$/; + $self->{Sql} .= "M.".$temp_attr_name; + } elsif ( $filter_expr->{terms}[$i]->{attr} eq 'DateTime' ) { + $self->{Sql} .= "E.StartTime"; + } elsif ( $filter_expr->{terms}[$i]->{attr} eq 'Date' ) { + $self->{Sql} .= "to_days( E.StartTime )"; + } elsif ( $filter_expr->{terms}[$i]->{attr} eq 'Time' ) { + $self->{Sql} .= "extract( hour_second from E.StartTime )"; + } elsif ( $filter_expr->{terms}[$i]->{attr} eq 'Weekday' ) { + $self->{Sql} .= "weekday( E.StartTime )"; + } elsif ( $filter_expr->{terms}[$i]->{attr} eq 'DiskPercent' ) { + $self->{Sql} .= "zmDiskPercent"; + $self->{HasDiskPercent} = !undef; + } elsif ( $filter_expr->{terms}[$i]->{attr} eq 'DiskBlocks' ) { + $self->{Sql} .= "zmDiskBlocks"; + $self->{HasDiskBlocks} = !undef; + } elsif ( $filter_expr->{terms}[$i]->{attr} eq 'SystemLoad' ) { + $self->{Sql} .= "zmSystemLoad"; + $self->{HasSystemLoad} = !undef; + } else { + $self->{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 '$self->{Name}'\n" ); + return; + } + $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 '$self->{Name}'\n" ); + return; + } + $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 '$self->{Name}'\n" ); + return; + } + $value = "extract( hour_second from '$value' )"; + } else { + $value = $temp_value; + } + push( @value_list, $value ); + } # end foreach temp_value + } # end if has an attr + if ( $filter_expr->{terms}[$i]->{op} ) { + if ( $filter_expr->{terms}[$i]->{op} eq '=~' ) { + $self->{Sql} .= " regexp $value"; + } elsif ( $filter_expr->{terms}[$i]->{op} eq '!~' ) { + $self->{Sql} .= " not regexp $value"; + } elsif ( $filter_expr->{terms}[$i]->{op} eq '=[]' ) { + $self->{Sql} .= " in (".join( ",", @value_list ).")"; + } elsif ( $filter_expr->{terms}[$i]->{op} eq '!~' ) { + $self->{Sql} .= " not in (".join( ",", @value_list ).")"; + } else { + $self->{Sql} .= " ".$filter_expr->{terms}[$i]->{op}." $value"; + } + } # end if has an operator + if ( exists($filter_expr->{terms}[$i]->{cbr}) ) { + $self->{Sql} .= " ".str_repeat( ")", $filter_expr->{terms}[$i]->{cbr} )." "; + } + } # end foreach term + } # end if terms + + if ( $self->{Sql} ) + { + if ( $self->{AutoMessage} ) + { + # Include all events, including events that are still ongoing + # and have no EndTime yet + $sql .= " and ( ".$self->{Sql}." )"; + } + else + { + # Only include closed events (events with valid EndTime) + $sql .= " where not isnull(E.EndTime) and ( ".$self->{Sql}." )"; + } + } + my @auto_terms; + if ( $self->{AutoArchive} ) + { + push( @auto_terms, "E.Archived = 0" ) + } + if ( $self->{AutoVideo} ) + { + push( @auto_terms, "E.Videoed = 0" ) + } + if ( $self->{AutoUpload} ) + { + push( @auto_terms, "E.Uploaded = 0" ) + } + if ( $self->{AutoEmail} ) + { + push( @auto_terms, "E.Emailed = 0" ) + } + if ( $self->{AutoMessage} ) + { + push( @auto_terms, "E.Messaged = 0" ) + } + if ( $self->{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" ); + $self->{Sql} = $sql; + } # end if has Sql + return $self->{Sql}; +} # end sub Sql + +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 ); +} + +# +# More or less replicates the equivalent PHP function +# +sub strtotime +{ + my $dt_str = shift; + return( Date::Manip::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 ) ) ); +} + +1; +__END__ +# Below is stub documentation for your module. You'd better edit it! + +=head1 NAME + +ZoneMinder::Database - Perl extension for blah blah blah + +=head1 SYNOPSIS + + use ZoneMinder::Filter; + blah blah blah + +=head1 DESCRIPTION + +Stub documentation for ZoneMinder, created by h2xs. It looks like the +author of the extension was negligent enough to leave the stub +unedited. + +Blah blah blah. + +=head2 EXPORT + +None by default. + + + +=head1 SEE ALSO + +Mention other useful documentation such as the documentation of +related modules or operating system documentation (such as man pages +in UNIX), or any relevant external documentation such as RFCs or +standards. + +If you have a mailing list set up for your module, mention it here. + +If you have a web site set up for your module, mention it here. + +=head1 AUTHOR + +Philip Coombes, Ephilip.coombes@zoneminder.comE + +=head1 COPYRIGHT AND LICENSE + +Copyright (C) 2001-2008 Philip Coombes + +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 diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Storage.pm b/scripts/ZoneMinder/lib/ZoneMinder/Storage.pm new file mode 100644 index 000000000..d89599e61 --- /dev/null +++ b/scripts/ZoneMinder/lib/ZoneMinder/Storage.pm @@ -0,0 +1,160 @@ +# ========================================================================== +# +# ZoneMinder Storage Module, $Date$, $Revision$ +# Copyright (C) 2001-2008 Philip Coombes +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# ========================================================================== +# +# This module contains the common definitions and functions used by the rest +# of the ZoneMinder scripts +# +package ZoneMinder::Storage; + +use 5.006; +use strict; +use warnings; + +require Exporter; +require ZoneMinder::Base; + +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; + +# ========================================================================== +# +# General Utility Functions +# +# ========================================================================== + +use ZoneMinder::Config qw(:all); +use ZoneMinder::Logger qw(:all); +use ZoneMinder::Database qw(:all); + +use POSIX; + +sub new { + my ( $parent, $id, $data ) = @_; + + my $self = {}; + bless $self, $parent; + if ( ( $$self{id} = $id ) or $data ) { +#$log->debug("loading $parent $id") if $debug or DEBUG_ALL; + $self->load( $data ); + } +} # end sub new + +sub load { + my ( $self, $data ) = @_; + my $type = ref $self; + if ( ! $data ) { +#$log->debug("Object::load Loading from db $type"); + $data = $ZoneMinder::dbh->selectrow_hashref( 'SELECT * FROM Storage WHERE Id=?', {}, $$self{Id} ); + if ( ! $data ) { + if ( $ZoneMinder::dbh->errstr ) { + Error( "Failure to load Storage record for $$self{id}: Reason: " . $ZoneMinder::dbh->errstr ); + } # end if + } # end if + } # end if ! $data + if ( $data and %$data ) { + @$self{keys %$data} = values %$data; + } # end if +} # end sub load + +sub Path { + if ( @_ > 1 ) { + $_[0]{Path} = $_[1]; + } + return $_[0]{Path}; +} # end sub Path + +sub Name { + if ( @_ > 1 ) { + $_[0]{Name} = $_[1]; + } + return $_[0]{Name}; +} # end sub Path + +1; +__END__ +# Below is stub documentation for your module. You'd better edit it! + +=head1 NAME + +ZoneMinder::Database - Perl extension for blah blah blah + +=head1 SYNOPSIS + + use ZoneMinder::Storage; + blah blah blah + +=head1 DESCRIPTION + +Stub documentation for ZoneMinder, created by h2xs. It looks like the +author of the extension was negligent enough to leave the stub +unedited. + +Blah blah blah. + +=head2 EXPORT + +None by default. + + + +=head1 SEE ALSO + +Mention other useful documentation such as the documentation of +related modules or operating system documentation (such as man pages +in UNIX), or any relevant external documentation such as RFCs or +standards. + +If you have a mailing list set up for your module, mention it here. + +If you have a web site set up for your module, mention it here. + +=head1 AUTHOR + +Philip Coombes, Ephilip.coombes@zoneminder.comE + +=head1 COPYRIGHT AND LICENSE + +Copyright (C) 2001-2008 Philip Coombes + +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 From 64f65b55cc3c1b98a1b47347fbe6b794a99ca2e5 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 17 Dec 2015 12:57:14 -0500 Subject: [PATCH 06/90] use new Filter object to do some of the heavy lifting in zmfilter.pl --- scripts/zmfilter.pl.in | 362 ++--------------------------------------- 1 file changed, 13 insertions(+), 349 deletions(-) diff --git a/scripts/zmfilter.pl.in b/scripts/zmfilter.pl.in index 54f372262..7e6c63563 100755 --- a/scripts/zmfilter.pl.in +++ b/scripts/zmfilter.pl.in @@ -60,10 +60,11 @@ use constant START_DELAY => 5; # How long to wait before starting @EXTRA_PERL_LIB@ use ZoneMinder; +require ZoneMinder::Filter; use DBI; use POSIX; use Time::HiRes qw/gettimeofday/; -use Date::Manip; +#use Date::Manip; use Getopt::Long; use autouse 'Pod::Usage'=>qw(pod2usage); use autouse 'Data::Dumper'=>qw(Dumper); @@ -137,36 +138,6 @@ my $filter_parm = ""; my $version = 0; # -# 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 ) ) ); -} GetOptions( 'filter=s' =>\$filter_parm, @@ -299,298 +270,18 @@ sub getFilters } FILTER: while( my $db_filter = $sth->fetchrow_hashref() ) { + my $filter = new ZoneMinder::Filter( $$db_filter{Id}, $db_filter ); Debug( "Found filter '$db_filter->{Name}'\n" ); - my $filter_expr = jsonDecode( $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 - "; - $db_filter->{Sql} = ''; + my $sql = $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} ) - { - if ( $db_filter->{AutoMessage} ) - { - # Include all events, including events that are still ongoing - # and have no EndTime yet - $sql .= " and ( ".$db_filter->{Sql}." )"; - } - else - { - # Only include closed events (events with valid EndTime) - $sql .= " where not isnull(E.EndTime) 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 ); + if ( ! $sql ) { + Error( "Error parsing Sql. skipping filter '$db_filter->{Name}'\n" ); + next FILTER; + } + push( @filters, $filter ); } $sth->finish(); - + Debug( "Got " . @filters . " filters" ); return( \@filters ); } @@ -608,37 +299,11 @@ sub checkFilter ($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() ) - { + foreach my $event ( $filter->Execute() ) { Debug( "Checking event $event->{Id}\n" ); my $delete_ok = !undef; +$dbh->ping(); if ( $filter->{AutoArchive} ) { Info( "Archiving event $event->{Id}\n" ); @@ -647,7 +312,7 @@ sub checkFilter 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() ); + or Error( "Can't execute '$sql': ".$sth->errstr() ); } if ( $Config{ZM_OPT_FFMPEG} && $filter->{AutoVideo} ) { @@ -719,7 +384,6 @@ sub checkFilter } } } - $sth->finish(); } sub generateVideo From 7a979bb8919b7372dfdbcfd701b22fbfc05db63f Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 17 Dec 2015 13:11:15 -0500 Subject: [PATCH 07/90] remove duplicated routines --- scripts/zmfilter.pl.in | 37 ------------------------------------- 1 file changed, 37 deletions(-) diff --git a/scripts/zmfilter.pl.in b/scripts/zmfilter.pl.in index 7e6c63563..ca0e1565e 100755 --- a/scripts/zmfilter.pl.in +++ b/scripts/zmfilter.pl.in @@ -196,43 +196,6 @@ while( 1 ) 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; From 6f3402261341db1792a4b33dbbd69b013bc5d672 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 17 Dec 2015 13:11:32 -0500 Subject: [PATCH 08/90] add find and find_one routines --- scripts/ZoneMinder/lib/ZoneMinder/Filter.pm | 34 ++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm b/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm index 4888636a6..b6985c4aa 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm +++ b/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm @@ -104,8 +104,40 @@ sub Name { } # end sub Path sub find { - + shift if $_[0] eq 'ZoneMinder::Filter'; + my %sql_filters = @_; + + my $sql = 'SELECT * FROM Filters'; + my @sql_filters; + my @sql_values; + + if ( exists $sql_filters{Name} ) { + push @sql_filters .= ' Name = ? '; + push @sql_values, $sql_filters{Name}; + } + + $sql .= ' WHERE ' . join(' AND ', @sql_filters ) if @sql_filters; + $sql .= ' LIMIT ' . $sql_filters{limit} if $sql_filters; + + my $sth = $ZoneMinder::Database::dbh->prepare_cached( $sql ) + or Fatal( "Can't prepare '$sql': ".$ZoneMinder::Database::dbh->errstr() ); + my $res = $sth->execute( @sql_values ) + or Fatal( "Can't execute '$sql': ".$sth->errstr() ); + + my @results; + + while( my $db_filter = $sth->fetchrow_hashref() ) { + my $filter = new ZoneMinder::Filter( $$db_filter{Id}, $db_filter ); + push @results, $filter; + } # end while + return @results; } + +sub find_one { + my @results = find(@_); + return $results[0] if @results; +} + sub Execute { my $self = $_[0]; From 9db9d243f2c926f86ab4253ca06da07520edf0cc Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 17 Dec 2015 13:12:37 -0500 Subject: [PATCH 09/90] Fix --- scripts/ZoneMinder/lib/ZoneMinder/Filter.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm b/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm index b6985c4aa..e7b8fd0f6 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm +++ b/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm @@ -112,7 +112,7 @@ sub find { my @sql_values; if ( exists $sql_filters{Name} ) { - push @sql_filters .= ' Name = ? '; + push @sql_filters , ' Name = ? '; push @sql_values, $sql_filters{Name}; } From c71d1e52ac915642010acb48f0d870f37ab6a690 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 17 Dec 2015 13:13:04 -0500 Subject: [PATCH 10/90] Fix --- scripts/ZoneMinder/lib/ZoneMinder/Filter.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm b/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm index e7b8fd0f6..b7806ec4a 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm +++ b/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm @@ -117,7 +117,7 @@ sub find { } $sql .= ' WHERE ' . join(' AND ', @sql_filters ) if @sql_filters; - $sql .= ' LIMIT ' . $sql_filters{limit} if $sql_filters; + $sql .= ' LIMIT ' . $sql_filters{limit} if $sql_filters{limit}; my $sth = $ZoneMinder::Database::dbh->prepare_cached( $sql ) or Fatal( "Can't prepare '$sql': ".$ZoneMinder::Database::dbh->errstr() ); From b32ef7751b224a7ef0ac9854d48d472d97df95dd Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 17 Dec 2015 14:36:40 -0500 Subject: [PATCH 11/90] implement the options to generate videos for events specified by a stored filter. Also implement ability to generate a concatenated video of all events specified by the filter. --- scripts/zmvideo.pl.in | 236 ++++++++++++++++++------------------------ 1 file changed, 103 insertions(+), 133 deletions(-) diff --git a/scripts/zmvideo.pl.in b/scripts/zmvideo.pl.in index 6a63502ee..19bf00eb5 100644 --- a/scripts/zmvideo.pl.in +++ b/scripts/zmvideo.pl.in @@ -27,7 +27,7 @@ zmvideo.pl - ZoneMinder Video Creation Script =head1 SYNOPSIS - zmvideo.pl -e ,--event= [--format ] + zmvideo.pl [ -e ,--event= | --filter= ] [--format ] [--rate=] [--scale=] [--fps=] @@ -40,15 +40,18 @@ This script is used to create MPEG videos of events for the web pages or as email attachments. =head1 OPTIONS - - -e, --event= - What event to create the video for - -f, --format= - What format to create the video in, default is mpg. For ffmpeg only. - -r, --rate= - Relative rate, 1 = realtime, 2 = double speed, 0.5 = half speed etc. - -s, --scale= - Scale, 1 = normal, 2 = double size, 0.5 = half size etc. - -F, --fps= - Absolute frame rate, in frames per second - -S, --size= - Absolute video size, WxH or other specification supported by ffmpeg - -o, --overwrite - Whether to overwrite an existing file, off by default. - -v, --version - Outputs the currently installed version of ZoneMinder + -c[=filename], --concat[=filename] - When creating videos for multiple events, create a concatenated video as well. + - If not specified, filename is taken from filter name. + -e, --event= - What event to create the video for + --filter_name= - The name of a saved filter to generate a video for all events returned by it. + --filter_id= - The id of a saved filter to generate a video for all events returned by it. + -f, --format= - What format to create the video in, default is mpg. For ffmpeg only. + -r, --rate= - Relative rate, 1 = realtime, 2 = double speed, 0.5 = half speed etc. + -s, --scale= - Scale, 1 = normal, 2 = double size, 0.5 = half size etc. + -F, --fps= - Absolute frame rate, in frames per second + -S, --size= - Absolute video size, WxH or other specification supported by ffmpeg + -o, --overwrite - Whether to overwrite an existing file, off by default. + -v, --version - Outputs the currently installed version of ZoneMinder =cut use strict; @@ -62,10 +65,13 @@ use bytes; @EXTRA_PERL_LIB@ use ZoneMinder; +require ZoneMinder::Filter; +require ZoneMinder::Event; use DBI; use autouse 'Data::Dumper'=>qw(Dumper); use POSIX qw(strftime); use Getopt::Long qw(:config no_ignore_case ); +use Cwd; use autouse 'Pod::Usage'=>qw(pod2usage); $| = 1; @@ -77,6 +83,9 @@ delete @ENV{qw(IFS CDPATH ENV BASH_ENV)}; logInit(); my $event_id; +my $concat_name; +my $filter_name; +my $filter_id; my $format = 'mpg'; my $rate = ''; my $scale = ''; @@ -95,7 +104,10 @@ for ( my $i = 0; $i < @formats; $i++ ) } GetOptions( - 'event=i' =>\$event_id, + 'concat|c:s' =>\$concat_name, + 'event|e=i' =>\$event_id, + 'filter_name=s' =>\$filter_name, + 'filter_id=i' =>\$filter_id, 'format|f=s' =>\$format, 'rate|r=f' =>\$rate, 'scale|s=f' =>\$scale, @@ -110,9 +122,9 @@ if ( $version ) { exit(0); } -if ( !$event_id || $event_id < 0 ) +if ( !( $filter_id or $filter_name or $event_id ) || $event_id < 0 ) { - print( STDERR "Please give a valid event id\n" ); + print( STDERR "Please give a valid event id or filter name\n" ); pod2usage(-exitstatus => -1); } @@ -164,128 +176,86 @@ $size = $detaint_size; my $dbh = zmDbConnect(); -my @filters; +my $cwd = getcwd; + +my $video_name; +my @event_ids; +if ( $event_id ) { + @event_ids = ( $event_id ); + +} elsif ( $filter_name or $filter_id ) { + my $Filter = ZoneMinder::Filter->find_one( + ($filter_name ? ( Name => $filter_name ) : () ), + ($filter_id ? ( Id => $filter_name ) : () ), + ); + if ( ! $Filter ) { + Fatal("Filter $filter_name $filter_id not found."); + } + @event_ids = map { $_->{Id} }$Filter->Execute(); + Fatal( "No events found for $filter_name") if ! @event_ids; + $concat_name = $filter_name if $concat_name eq ''; +} + my $sql = " SELECT max(F.Delta)-min(F.Delta) as FullLength, - E.*, - unix_timestamp(E.StartTime) as Time, - M.Name as MonitorName, - M.Width as MonitorWidth, - M.Height as MonitorHeight, - M.Palette - FROM Frames as F - INNER JOIN Events as E on F.EventId = E.Id - INNER JOIN Monitors as M on E.MonitorId = M.Id - WHERE EventId = '$event_id' - GROUP BY F.EventId" -; -my $sth = $dbh->prepare_cached( $sql ) - or Fatal( "Can't prepare '$sql': ".$dbh->errstr() ); -my $res = $sth->execute() - or Fatal( "Can't execute: ".$sth->errstr() ); -my $event = $sth->fetchrow_hashref(); -$sth->finish(); -my $event_path = getEventPath( $event ); -chdir( $event_path ); -( my $video_name = $event->{Name} ) =~ s/\s/_/g; + E.*, + unix_timestamp(E.StartTime) as Time, + M.Name as MonitorName, + M.Width as MonitorWidth, + M.Height as MonitorHeight, + M.Palette + FROM Frames as F + INNER JOIN Events as E on F.EventId = E.Id + INNER JOIN Monitors as M on E.MonitorId = M.Id + WHERE EventId = ? + GROUP BY F.EventId" + ; +my $sth = $dbh->prepare_cached( $sql ) or Fatal( "Can't prepare '$sql': ".$dbh->errstr() ); -my @file_parts; -if ( $rate ) -{ - my $file_rate = $rate; - $file_rate =~ s/\./_/; - $file_rate =~ s/_00//; - $file_rate =~ s/(_\d+)0+$/$1/; - $file_rate = 'r'.$file_rate; - push( @file_parts, $file_rate ); -} -elsif ( $fps ) -{ - my $file_fps = $fps; - $file_fps =~ s/\./_/; - $file_fps =~ s/_00//; - $file_fps =~ s/(_\d+)0+$/$1/; - $file_fps = 'R'.$file_fps; - push( @file_parts, $file_fps ); -} - -if ( $scale ) -{ - my $file_scale = $scale; - $file_scale =~ s/\./_/; - $file_scale =~ s/_00//; - $file_scale =~ s/(_\d+)0+$/$1/; - $file_scale = 's'.$file_scale; - push( @file_parts, $file_scale ); -} -elsif ( $size ) -{ - my $file_size = 'S'.$size; - push( @file_parts, $file_size ); -} -my $video_file = "$video_name-".$file_parts[0]."-".$file_parts[1].".$format"; - -if ( $overwrite || !-s $video_file ) -{ - Info( "Creating video file $video_file for event $event->{Id}\n" ); - - my $frame_rate = sprintf( "%.2f", $event->{Frames}/$event->{FullLength} ); - if ( $rate ) - { - if ( $rate != 1.0 ) - { - $frame_rate *= $rate; - } - } - elsif ( $fps ) - { - $frame_rate = $fps; - } - - my $width = $event->{MonitorWidth}; - my $height = $event->{MonitorHeight}; - my $video_size = " ${width}x${height}"; - - if ( $scale ) - { - if ( $scale != 1.0 ) - { - $width = int($width*$scale); - $height = int($height*$scale); - $video_size = " ${width}x${height}"; - } - } - elsif ( $size ) - { - $video_size = $size; - } - - my $command = $Config{ZM_PATH_FFMPEG} - ." -y -r $frame_rate " - .$Config{ZM_FFMPEG_INPUT_OPTIONS} - ." -i %0" - .$Config{ZM_EVENT_IMAGE_DIGITS} - ."d-capture.jpg -s $video_size " - .$Config{ZM_FFMPEG_OUTPUT_OPTIONS} - ." '$video_file' > ffmpeg.log 2>&1" - ; - Debug( $command."\n" ); - my $output = qx($command); - - my $status = $? >> 8; - if ( $status ) - { - Error( "Unable to generate video, check " - .$event_path."/ffmpeg.log for details" - ); - exit( -1 ); - } - - Info( "Finished $video_file\n" ); -} -else -{ - Info( "Video file $video_file already exists for event $event->{Id}\n" ); +my @video_files; +foreach my $event_id ( @event_ids ) { + + my $res = $sth->execute( $event_id ) + or Fatal( "Can't execute: ".$sth->errstr() ); + my $event = $sth->fetchrow_hashref(); + + my $Event = new ZoneMinder::Event( $$event{Id}, $event ); + my $video_file = $Event->GenerateVideo( $rate, $fps, $scale, $size, $overwrite, $format ); + if ( $video_file ) { + push @video_files, $video_file; + } +} # end foreach event_id + +if ( $concat_name ) { + ($cwd) = $cwd =~ /(.*)/; # detaint + chdir( $cwd ); + ($concat_name ) = $concat_name =~ /([\-A-Za-z0-9_\.]*)/; + my $concat_list_file = "/tmp/$concat_name.concat.lst"; + + my $video_file = $concat_name . '.'. $detaint_format; + + open( my $fd, '>', $concat_list_file ) or die "Can't open $concat_list_file: $!"; + foreach ( @video_files ) { + print $fd "file '$_'\n"; + } + close $fd; + my $command = $Config{ZM_PATH_FFMPEG} + . " -f concat -i $concat_list_file -c copy " + ." '$video_file' > ffmpeg.log 2>&1" + ; + Debug( $command."\n" ); + my $output = qx($command); + + my $status = $? >> 8; + + unlink $concat_list_file; + if ( $status ) + { + Error( "Unable to generate video, check /ffmpeg.log for details"); + exit(-1); + } + } +#unlink $input_file_list; #print( STDOUT $event->{MonitorId}.'/'.$event->{Id}.'/'.$video_file."\n" ); -print( STDOUT $video_file."\n" ); +#print( STDOUT $video_file."\n" ); exit( 0 ); From d035753971485a6c16a807642d580d89d2ee4ade Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 17 Dec 2015 14:38:18 -0500 Subject: [PATCH 12/90] Add the event class. Also, remove the unused Storage class --- scripts/ZoneMinder/lib/ZoneMinder/Event.pm | 330 +++++++++++++++++++ scripts/ZoneMinder/lib/ZoneMinder/Storage.pm | 160 --------- 2 files changed, 330 insertions(+), 160 deletions(-) create mode 100644 scripts/ZoneMinder/lib/ZoneMinder/Event.pm delete mode 100644 scripts/ZoneMinder/lib/ZoneMinder/Storage.pm diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Event.pm b/scripts/ZoneMinder/lib/ZoneMinder/Event.pm new file mode 100644 index 000000000..67c117460 --- /dev/null +++ b/scripts/ZoneMinder/lib/ZoneMinder/Event.pm @@ -0,0 +1,330 @@ +# ========================================================================== +# +# ZoneMinder Event Module, $Date$, $Revision$ +# Copyright (C) 2001-2008 Philip Coombes +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# ========================================================================== +# +# This module contains the common definitions and functions used by the rest +# of the ZoneMinder scripts +# +package ZoneMinder::Event; + +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; + +# ========================================================================== +# +# General Utility Functions +# +# ========================================================================== + +use ZoneMinder::Config qw(:all); +use ZoneMinder::Logger qw(:all); +use ZoneMinder::Database qw(:all); + +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 Events WHERE Id=?', {}, $$self{Id} ); + if ( ! $data ) { + Error( "Failure to load Event record for $$self{Id}: Reason: " . $$self{dbh}->errstr ); + } else { + Debug( 3, "Loaded Event $$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]; + } + return $_[0]{Name}; +} # end sub Path + +sub find { + shift if $_[0] eq 'ZoneMinder::Event'; + my %sql_filters = @_; + + my $sql = 'SELECT * FROM Events'; + my @sql_filters; + my @sql_values; + + if ( exists $sql_filters{Name} ) { + push @sql_filters , ' Name = ? '; + push @sql_values, $sql_filters{Name}; + } + + $sql .= ' WHERE ' . join(' AND ', @sql_filters ) if @sql_filters; + $sql .= ' LIMIT ' . $sql_filters{limit} if $sql_filters{limit}; + + my $sth = $ZoneMinder::Database::dbh->prepare_cached( $sql ) + or Fatal( "Can't prepare '$sql': ".$ZoneMinder::Database::dbh->errstr() ); + my $res = $sth->execute( @sql_values ) + or Fatal( "Can't execute '$sql': ".$sth->errstr() ); + + my @results; + + while( my $db_filter = $sth->fetchrow_hashref() ) { + my $filter = new ZoneMinder::Event( $$db_filter{Id}, $db_filter ); + push @results, $filter; + } # end while + return @results; +} + +sub find_one { + my @results = find(@_); + return $results[0] if @results; +} + +sub getEventPath +{ + my $event = shift; + + my $event_path = ""; + if ( $Config{ZM_USE_DEEP_STORAGE} ) + { + $event_path = $Config{ZM_DIR_EVENTS} + .'/'.$event->{MonitorId} + .'/'.strftime( "%y/%m/%d/%H/%M/%S", + localtime($event->{Time}) + ) + ; + } + else + { + $event_path = $Config{ZM_DIR_EVENTS} + .'/'.$event->{MonitorId} + .'/'.$event->{Id} + ; + } + + if ( index($Config{ZM_DIR_EVENTS},'/') != 0 ){ + $event_path = $Config{ZM_PATH_WEB} + .'/'.$event_path + ; + } + return( $event_path ); +} + +sub GenerateVideo { + my ( $self, $rate, $fps, $scale, $size, $overwrite, $format ) = @_; + + my $event_path = getEventPath( $self ); + chdir( $event_path ); + ( my $video_name = $self->{Name} ) =~ s/\s/_/g; + + my @file_parts; + if ( $rate ) + { + my $file_rate = $rate; + $file_rate =~ s/\./_/; + $file_rate =~ s/_00//; + $file_rate =~ s/(_\d+)0+$/$1/; + $file_rate = 'r'.$file_rate; + push( @file_parts, $file_rate ); + } + elsif ( $fps ) + { + my $file_fps = $fps; + $file_fps =~ s/\./_/; + $file_fps =~ s/_00//; + $file_fps =~ s/(_\d+)0+$/$1/; + $file_fps = 'R'.$file_fps; + push( @file_parts, $file_fps ); + } + + if ( $scale ) + { + my $file_scale = $scale; + $file_scale =~ s/\./_/; + $file_scale =~ s/_00//; + $file_scale =~ s/(_\d+)0+$/$1/; + $file_scale = 's'.$file_scale; + push( @file_parts, $file_scale ); + } + elsif ( $size ) + { + my $file_size = 'S'.$size; + push( @file_parts, $file_size ); + } + my $video_file = "$video_name-".$file_parts[0]."-".$file_parts[1].".$format"; + if ( $overwrite || !-s $video_file ) + { + Info( "Creating video file $video_file for event $self->{Id}\n" ); + + my $frame_rate = sprintf( "%.2f", $self->{Frames}/$self->{FullLength} ); + if ( $rate ) + { + if ( $rate != 1.0 ) + { + $frame_rate *= $rate; + } + } + elsif ( $fps ) + { + $frame_rate = $fps; + } + + my $width = $self->{MonitorWidth}; + my $height = $self->{MonitorHeight}; + my $video_size = " ${width}x${height}"; + + if ( $scale ) + { + if ( $scale != 1.0 ) + { + $width = int($width*$scale); + $height = int($height*$scale); + $video_size = " ${width}x${height}"; + } + } + elsif ( $size ) + { + $video_size = $size; + } + my $command = $Config{ZM_PATH_FFMPEG} + ." -y -r $frame_rate " + .$Config{ZM_FFMPEG_INPUT_OPTIONS} + ." -i %0" + .$Config{ZM_EVENT_IMAGE_DIGITS} + ."d-capture.jpg -s $video_size " +#. " -f concat -i /tmp/event_files.txt" + ." -s $video_size " + .$Config{ZM_FFMPEG_OUTPUT_OPTIONS} + ." '$video_file' > ffmpeg.log 2>&1" + ; + Debug( $command."\n" ); + my $output = qx($command); + + my $status = $? >> 8; + if ( $status ) + { + Error( "Unable to generate video, check " + .$event_path."/ffmpeg.log for details" + ); + return; + } + + Info( "Finished $video_file\n" ); + return $event_path.'/'.$video_file; + } else { + Info( "Video file $video_file already exists for event $self->{Id}\n" ); + return $event_path.'/'.$video_file; + } + return; +} # end sub GenerateVideo + +1; +__END__ +# Below is stub documentation for your module. You'd better edit it! + +=head1 NAME + +ZoneMinder::Database - Perl extension for blah blah blah + +=head1 SYNOPSIS + + use ZoneMinder::Event; + blah blah blah + +=head1 DESCRIPTION + +Stub documentation for ZoneMinder, created by h2xs. It looks like the +author of the extension was negligent enough to leave the stub +unedited. + +Blah blah blah. + +=head2 EXPORT + +None by default. + + + +=head1 SEE ALSO + +Mention other useful documentation such as the documentation of +related modules or operating system documentation (such as man pages +in UNIX), or any relevant external documentation such as RFCs or +standards. + +If you have a mailing list set up for your module, mention it here. + +If you have a web site set up for your module, mention it here. + +=head1 AUTHOR + +Philip Coombes, Ephilip.coombes@zoneminder.comE + +=head1 COPYRIGHT AND LICENSE + +Copyright (C) 2001-2008 Philip Coombes + +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 diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Storage.pm b/scripts/ZoneMinder/lib/ZoneMinder/Storage.pm deleted file mode 100644 index d89599e61..000000000 --- a/scripts/ZoneMinder/lib/ZoneMinder/Storage.pm +++ /dev/null @@ -1,160 +0,0 @@ -# ========================================================================== -# -# ZoneMinder Storage Module, $Date$, $Revision$ -# Copyright (C) 2001-2008 Philip Coombes -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# ========================================================================== -# -# This module contains the common definitions and functions used by the rest -# of the ZoneMinder scripts -# -package ZoneMinder::Storage; - -use 5.006; -use strict; -use warnings; - -require Exporter; -require ZoneMinder::Base; - -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; - -# ========================================================================== -# -# General Utility Functions -# -# ========================================================================== - -use ZoneMinder::Config qw(:all); -use ZoneMinder::Logger qw(:all); -use ZoneMinder::Database qw(:all); - -use POSIX; - -sub new { - my ( $parent, $id, $data ) = @_; - - my $self = {}; - bless $self, $parent; - if ( ( $$self{id} = $id ) or $data ) { -#$log->debug("loading $parent $id") if $debug or DEBUG_ALL; - $self->load( $data ); - } -} # end sub new - -sub load { - my ( $self, $data ) = @_; - my $type = ref $self; - if ( ! $data ) { -#$log->debug("Object::load Loading from db $type"); - $data = $ZoneMinder::dbh->selectrow_hashref( 'SELECT * FROM Storage WHERE Id=?', {}, $$self{Id} ); - if ( ! $data ) { - if ( $ZoneMinder::dbh->errstr ) { - Error( "Failure to load Storage record for $$self{id}: Reason: " . $ZoneMinder::dbh->errstr ); - } # end if - } # end if - } # end if ! $data - if ( $data and %$data ) { - @$self{keys %$data} = values %$data; - } # end if -} # end sub load - -sub Path { - if ( @_ > 1 ) { - $_[0]{Path} = $_[1]; - } - return $_[0]{Path}; -} # end sub Path - -sub Name { - if ( @_ > 1 ) { - $_[0]{Name} = $_[1]; - } - return $_[0]{Name}; -} # end sub Path - -1; -__END__ -# Below is stub documentation for your module. You'd better edit it! - -=head1 NAME - -ZoneMinder::Database - Perl extension for blah blah blah - -=head1 SYNOPSIS - - use ZoneMinder::Storage; - blah blah blah - -=head1 DESCRIPTION - -Stub documentation for ZoneMinder, created by h2xs. It looks like the -author of the extension was negligent enough to leave the stub -unedited. - -Blah blah blah. - -=head2 EXPORT - -None by default. - - - -=head1 SEE ALSO - -Mention other useful documentation such as the documentation of -related modules or operating system documentation (such as man pages -in UNIX), or any relevant external documentation such as RFCs or -standards. - -If you have a mailing list set up for your module, mention it here. - -If you have a web site set up for your module, mention it here. - -=head1 AUTHOR - -Philip Coombes, Ephilip.coombes@zoneminder.comE - -=head1 COPYRIGHT AND LICENSE - -Copyright (C) 2001-2008 Philip Coombes - -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 From 5150829a9fb325aa00de4a790b1b06a7198c8abe Mon Sep 17 00:00:00 2001 From: SteveGilvarry Date: Sat, 13 Feb 2016 16:22:44 +1100 Subject: [PATCH 13/90] Convert to Travis Trusty --- .travis.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d44973e2e..59018e553 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,6 @@ language: cpp +sudo: required +dist: trusty notifications: irc: "chat.freenode.net#zoneminder-dev" branches: @@ -24,7 +26,7 @@ before_install: - sudo apt-get update -qq - sudo apt-get install -y -qq libpolkit-gobject-1-dev zlib1g-dev apache2 mysql-server php5 php5-mysql build-essential libmysqlclient-dev libssl-dev libbz2-dev libpcre3-dev libdbi-perl libarchive-zip-perl libdate-manip-perl libdevice-serialport-perl libmime-perl libwww-perl libdbd-mysql-perl libsys-mmap-perl yasm automake autoconf cmake libjpeg-turbo8-dev apache2-mpm-prefork libapache2-mod-php5 php5-cli libtheora-dev libvorbis-dev libvpx-dev libx264-dev libvlccore-dev libvlc-dev libvlccore5 libvlc5 2>&1 > /dev/null install: - - git clone -b n2.8.1 --depth=1 git://source.ffmpeg.org/ffmpeg.git + - git clone -b n2.8.6 --depth=1 git://source.ffmpeg.org/ffmpeg.git - cd ffmpeg - ./configure --enable-shared --enable-swscale --enable-gpl --enable-libx264 --enable-libvpx --enable-libvorbis --enable-libtheora - make -j `grep processor /proc/cpuinfo|wc -l` From 4303aa4fe28c3db2b8392e0de7de4db887223eaa Mon Sep 17 00:00:00 2001 From: SteveGilvarry Date: Sat, 13 Feb 2016 16:34:49 +1100 Subject: [PATCH 14/90] Remove libvlc5 and libvlccore5, also attempt clang builds --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 59018e553..eeb99bd96 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,9 +22,10 @@ env: - ZM_BUILDMETHOD=autotools compiler: - gcc + - clang before_install: - sudo apt-get update -qq - - sudo apt-get install -y -qq libpolkit-gobject-1-dev zlib1g-dev apache2 mysql-server php5 php5-mysql build-essential libmysqlclient-dev libssl-dev libbz2-dev libpcre3-dev libdbi-perl libarchive-zip-perl libdate-manip-perl libdevice-serialport-perl libmime-perl libwww-perl libdbd-mysql-perl libsys-mmap-perl yasm automake autoconf cmake libjpeg-turbo8-dev apache2-mpm-prefork libapache2-mod-php5 php5-cli libtheora-dev libvorbis-dev libvpx-dev libx264-dev libvlccore-dev libvlc-dev libvlccore5 libvlc5 2>&1 > /dev/null + - sudo apt-get install -y -qq libpolkit-gobject-1-dev zlib1g-dev apache2 mysql-server php5 php5-mysql build-essential libmysqlclient-dev libssl-dev libbz2-dev libpcre3-dev libdbi-perl libarchive-zip-perl libdate-manip-perl libdevice-serialport-perl libmime-perl libwww-perl libdbd-mysql-perl libsys-mmap-perl yasm automake autoconf cmake libjpeg-turbo8-dev apache2-mpm-prefork libapache2-mod-php5 php5-cli libtheora-dev libvorbis-dev libvpx-dev libx264-dev libvlccore-dev libvlc-dev 2>&1 > /dev/null install: - git clone -b n2.8.6 --depth=1 git://source.ffmpeg.org/ffmpeg.git - cd ffmpeg From 4fd984f30b23fc86e6ddf28d16fe5cea16259266 Mon Sep 17 00:00:00 2001 From: SteveGilvarry Date: Thu, 25 Feb 2016 22:32:18 +1100 Subject: [PATCH 15/90] ffmpeg 3.0.0 build --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index eeb99bd96..c4bd95bc9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,7 +27,7 @@ before_install: - sudo apt-get update -qq - sudo apt-get install -y -qq libpolkit-gobject-1-dev zlib1g-dev apache2 mysql-server php5 php5-mysql build-essential libmysqlclient-dev libssl-dev libbz2-dev libpcre3-dev libdbi-perl libarchive-zip-perl libdate-manip-perl libdevice-serialport-perl libmime-perl libwww-perl libdbd-mysql-perl libsys-mmap-perl yasm automake autoconf cmake libjpeg-turbo8-dev apache2-mpm-prefork libapache2-mod-php5 php5-cli libtheora-dev libvorbis-dev libvpx-dev libx264-dev libvlccore-dev libvlc-dev 2>&1 > /dev/null install: - - git clone -b n2.8.6 --depth=1 git://source.ffmpeg.org/ffmpeg.git + - git clone -b n3.0.0 --depth=1 git://source.ffmpeg.org/ffmpeg.git - cd ffmpeg - ./configure --enable-shared --enable-swscale --enable-gpl --enable-libx264 --enable-libvpx --enable-libvorbis --enable-libtheora - make -j `grep processor /proc/cpuinfo|wc -l` From b53e9e7dadfbd09d754408046aebce3a49133fc5 Mon Sep 17 00:00:00 2001 From: SteveGilvarry Date: Thu, 25 Feb 2016 22:38:19 +1100 Subject: [PATCH 16/90] ffmpeg 3.0 too many 0000s --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c4bd95bc9..03fcb2c2b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,7 +27,7 @@ before_install: - sudo apt-get update -qq - sudo apt-get install -y -qq libpolkit-gobject-1-dev zlib1g-dev apache2 mysql-server php5 php5-mysql build-essential libmysqlclient-dev libssl-dev libbz2-dev libpcre3-dev libdbi-perl libarchive-zip-perl libdate-manip-perl libdevice-serialport-perl libmime-perl libwww-perl libdbd-mysql-perl libsys-mmap-perl yasm automake autoconf cmake libjpeg-turbo8-dev apache2-mpm-prefork libapache2-mod-php5 php5-cli libtheora-dev libvorbis-dev libvpx-dev libx264-dev libvlccore-dev libvlc-dev 2>&1 > /dev/null install: - - git clone -b n3.0.0 --depth=1 git://source.ffmpeg.org/ffmpeg.git + - git clone -b n3.0 --depth=1 git://source.ffmpeg.org/ffmpeg.git - cd ffmpeg - ./configure --enable-shared --enable-swscale --enable-gpl --enable-libx264 --enable-libvpx --enable-libvorbis --enable-libtheora - make -j `grep processor /proc/cpuinfo|wc -l` From 5ff427d9e9d90417852908c574415f9873af7265 Mon Sep 17 00:00:00 2001 From: SteveGilvarry Date: Tue, 29 Dec 2015 01:05:40 +1100 Subject: [PATCH 17/90] Removed Autotools Makefile.am Conflicts: Makefile.am misc/Makefile.am src/Makefile.am web/includes/Makefile.am web/js/Makefile.am web/skins/classic/css/classic/views/Makefile.am web/skins/classic/css/flat/views/Makefile.am web/skins/classic/views/Makefile.am web/skins/classic/views/js/Makefile.am --- Makefile.am | 40 ------ db/Makefile.am | 14 -- misc/Makefile.am | 17 --- onvif/Makefile.am | 26 ---- onvif/scripts/Makefile.am | 5 - scripts/Makefile.am | 75 ---------- src/Makefile.am | 135 ------------------ web/Makefile.am | 35 ----- web/ajax/Makefile.am | 12 -- web/css/Makefile.am | 8 -- web/graphics/Makefile.am | 8 -- web/includes/Makefile.am | 19 --- web/js/Makefile.am | 8 -- web/lang/Makefile.am | 25 ---- web/skins/Makefile.am | 6 - web/skins/classic/Makefile.am | 15 -- web/skins/classic/ajax/Makefile.am | 5 - web/skins/classic/css/Makefile.am | 7 - web/skins/classic/css/classic/Makefile.am | 10 -- .../classic/css/classic/views/Makefile.am | 31 ---- web/skins/classic/css/dark/Makefile.am | 10 -- web/skins/classic/css/dark/views/Makefile.am | 31 ---- web/skins/classic/css/flat/Makefile.am | 10 -- web/skins/classic/css/flat/views/Makefile.am | 31 ---- web/skins/classic/graphics/Makefile.am | 23 --- web/skins/classic/includes/Makefile.am | 11 -- web/skins/classic/js/Makefile.am | 10 -- web/skins/classic/lang/Makefile.am | 5 - web/skins/classic/views/Makefile.am | 57 -------- web/skins/classic/views/js/Makefile.am | 50 ------- web/skins/mobile/Makefile.am | 14 -- web/skins/mobile/ajax/Makefile.am | 5 - web/skins/mobile/css/Makefile.am | 6 - web/skins/mobile/graphics/Makefile.am | 5 - web/skins/mobile/includes/Makefile.am | 9 -- web/skins/mobile/lang/Makefile.am | 5 - web/skins/mobile/views/Makefile.am | 22 --- web/skins/mobile/views/css/Makefile.am | 6 - web/skins/xml/Makefile.am | 10 -- web/skins/xml/includes/Makefile.am | 8 -- web/skins/xml/views/Makefile.am | 11 -- web/tools/Makefile.am | 4 - web/tools/mootools/Makefile.am | 16 --- web/views/Makefile.am | 6 - 44 files changed, 866 deletions(-) delete mode 100644 Makefile.am delete mode 100644 db/Makefile.am delete mode 100644 misc/Makefile.am delete mode 100644 onvif/Makefile.am delete mode 100644 onvif/scripts/Makefile.am delete mode 100644 scripts/Makefile.am delete mode 100644 src/Makefile.am delete mode 100644 web/Makefile.am delete mode 100644 web/ajax/Makefile.am delete mode 100644 web/css/Makefile.am delete mode 100644 web/graphics/Makefile.am delete mode 100644 web/includes/Makefile.am delete mode 100644 web/js/Makefile.am delete mode 100644 web/lang/Makefile.am delete mode 100644 web/skins/Makefile.am delete mode 100644 web/skins/classic/Makefile.am delete mode 100644 web/skins/classic/ajax/Makefile.am delete mode 100644 web/skins/classic/css/Makefile.am delete mode 100644 web/skins/classic/css/classic/Makefile.am delete mode 100644 web/skins/classic/css/classic/views/Makefile.am delete mode 100644 web/skins/classic/css/dark/Makefile.am delete mode 100644 web/skins/classic/css/dark/views/Makefile.am delete mode 100644 web/skins/classic/css/flat/Makefile.am delete mode 100644 web/skins/classic/css/flat/views/Makefile.am delete mode 100644 web/skins/classic/graphics/Makefile.am delete mode 100644 web/skins/classic/includes/Makefile.am delete mode 100644 web/skins/classic/js/Makefile.am delete mode 100644 web/skins/classic/lang/Makefile.am delete mode 100644 web/skins/classic/views/Makefile.am delete mode 100644 web/skins/classic/views/js/Makefile.am delete mode 100644 web/skins/mobile/Makefile.am delete mode 100644 web/skins/mobile/ajax/Makefile.am delete mode 100644 web/skins/mobile/css/Makefile.am delete mode 100644 web/skins/mobile/graphics/Makefile.am delete mode 100644 web/skins/mobile/includes/Makefile.am delete mode 100644 web/skins/mobile/lang/Makefile.am delete mode 100644 web/skins/mobile/views/Makefile.am delete mode 100644 web/skins/mobile/views/css/Makefile.am delete mode 100644 web/skins/xml/Makefile.am delete mode 100644 web/skins/xml/includes/Makefile.am delete mode 100644 web/skins/xml/views/Makefile.am delete mode 100644 web/tools/Makefile.am delete mode 100644 web/tools/mootools/Makefile.am delete mode 100644 web/views/Makefile.am diff --git a/Makefile.am b/Makefile.am deleted file mode 100644 index 62f767e75..000000000 --- a/Makefile.am +++ /dev/null @@ -1,40 +0,0 @@ -AUTOMAKE_OPTIONS = foreign -ACLOCAL_AMFLAGS = -I m4 - -# And these to the user and group of your webserver -webuser = @WEB_USER@ -webgroup = @WEB_GROUP@ -zmconfigdir = @ZM_CONFIG_DIR@ - -zmconfig_DATA = \ - zm.conf - -if COND_ONVIF - MAYBE_ONVIF = onvif -endif - -SUBDIRS = \ - src \ - web \ - scripts \ - db \ - misc \ - $(MAYBE_ONVIF) - -EXTRA_DIST = \ - zm.conf.in \ - zmconfgen.pl.in - -# Yes, you are correct. This is a HACK! -install-data-hook: - ( cd $(DESTDIR)$(zmconfigdir); chown $(webuser):$(webgroup) $(zmconfig_DATA); chmod 600 $(zmconfig_DATA) ) - ( 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 $(DESTDIR)$(ZM_SOCKDIR); then mkdir -p $(DESTDIR)$(ZM_SOCKDIR); fi; if test "$(DESTDIR)$(ZM_SOCKDIR)" != "/var/run"; then chown $(webuser):$(webgroup) $(DESTDIR)$(ZM_SOCKDIR); chmod u+w $(DESTDIR)$(ZM_SOCKDIR); fi ) - ( if ! test -e $(DESTDIR)$(ZM_TMPDIR); then mkdir -m 700 -p $(DESTDIR)$(ZM_TMPDIR); fi; if test "$(DESTDIR)$(ZM_TMPDIR)" != "/tmp" && test "$(DESTDIR)$(ZM_TMPDIR)" != "/var/tmp"; then chown $(webuser):$(webgroup) $(DESTDIR)$(ZM_TMPDIR); chmod u+w $(DESTDIR)$(ZM_TMPDIR); fi ) - -uninstall-hook: - @-( cd $(DESTDIR)$(webdir); rm -rf events graphics images sounds temp ) - @-( if test "$(DESTDIR)$(ZM_RUNDIR)" != "/var/run"; then rm -rf $(DESTDIR)$(ZM_RUNDIR); fi ) - @-( if test "$(DESTDIR)$(ZM_SOCKDIR)" != "/var/run"; then rm -rf $(DESTDIR)$(ZM_SOCKDIR); fi ) - @-( if test "$(DESTDIR)$(ZM_TMPDIR)" != "/tmp" && test "$(DESTDIR)$(ZM_TMPDIR)" != "/var/tmp"; then rm -rf $(DESTDIR)$(ZM_TMPDIR); fi ) - @-( if test "$(DESTDIR)$(ZM_LOGDIR)" != "/var/log"; then rm -rf $(DESTDIR)$(ZM_LOGDIR); fi ) diff --git a/db/Makefile.am b/db/Makefile.am deleted file mode 100644 index 9cb4e197c..000000000 --- a/db/Makefile.am +++ /dev/null @@ -1,14 +0,0 @@ -AUTOMAKE_OPTIONS = foreign - -zmdbdatadir = $(pkgdatadir)/db - -EXTRA_DIST = \ - zm_create.sql.in \ - $(dbupgrade_scripts) - -dist_zmdbdata_DATA = \ - zm_create.sql \ - $(dbupgrade_scripts) - -dbupgrade_scripts = $(wildcard zm_update-*.sql) - diff --git a/misc/Makefile.am b/misc/Makefile.am deleted file mode 100644 index 5578e4373..000000000 --- a/misc/Makefile.am +++ /dev/null @@ -1,17 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -EXTRA_DIST = \ - apache.conf.in \ - logrotate.conf.in \ - syslog.conf.in \ - zoneminder-tmpfiles.conf.in \ - zoneminder.service.in \ - com.zoneminder.systemctl.policy.in \ - com.zoneminder.systemctl.rules.in - -polkit_actiondir = @POLKIT_PREFIX@/share/polkit-1/actions -dist_polkit_action_DATA = com.zoneminder.systemctl.policy - -polkit_rulesdir = @POLKIT_PREFIX@/share/polkit-1/rules.d -dist_polkit_rules_DATA = com.zoneminder.systemctl.rules - diff --git a/onvif/Makefile.am b/onvif/Makefile.am deleted file mode 100644 index 8cc9d700a..000000000 --- a/onvif/Makefile.am +++ /dev/null @@ -1,26 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -# Ack! Nasty hack to get modules Makefile regenerated if wiped with make clean -all-local: proxy/Makefile modules/Makefile - -proxy/Makefile: proxy/Makefile.PL - ( cd proxy; perl Makefile.PL ) - -modules/Makefile: modules/Makefile.PL - ( cd modules; perl Makefile.PL ) - -SUBDIRS = \ - . \ - proxy \ - modules \ - scripts - - -EXTRA_DIST = \ - proxy/Makefile.PL \ - proxy/lib \ - modules/Makefile.PL \ - modules/lib \ - wsdl \ - doc \ - patches diff --git a/onvif/scripts/Makefile.am b/onvif/scripts/Makefile.am deleted file mode 100644 index 80db9755c..000000000 --- a/onvif/scripts/Makefile.am +++ /dev/null @@ -1,5 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -bin_SCRIPTS = \ - zmonvif-probe.pl - diff --git a/scripts/Makefile.am b/scripts/Makefile.am deleted file mode 100644 index 5eacd8203..000000000 --- a/scripts/Makefile.am +++ /dev/null @@ -1,75 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -# Ack! Nasty hack to get modules Makefile regenerated if wiped with make clean -all-local: ZoneMinder/Makefile - -ZoneMinder/Makefile: ZoneMinder/Makefile.PL - ( cd ZoneMinder; perl Makefile.PL ) - -bin_SCRIPTS = \ - zmdc.pl \ - zmaudit.pl \ - zmfilter.pl \ - zmtrigger.pl \ - zmx10.pl \ - zmwatch.pl \ - zmpkg.pl \ - zmupdate.pl \ - zmvideo.pl \ - zmcontrol.pl \ - zmtrack.pl \ - zmcamtool.pl \ - zmsystemctl.pl - -SUBDIRS = \ - . \ - ZoneMinder - -EXTRA_DIST = \ - zmdc.pl.in \ - zmaudit.pl.in \ - zmfilter.pl.in \ - zmtrigger.pl.in \ - zmx10.pl.in \ - zmwatch.pl.in \ - zmpkg.pl.in \ - zmupdate.pl.in \ - zmvideo.pl.in \ - zmcontrol.pl.in \ - zmtrack.pl.in \ - zmcamtool.pl.in \ - zmsystemctl.pl.in \ - ZoneMinder/Makefile.PL \ - ZoneMinder/README \ - ZoneMinder/Changes \ - ZoneMinder/META.yml \ - ZoneMinder/MANIFEST \ - ZoneMinder/t/ZoneMinder.t \ - ZoneMinder/lib/ZoneMinder.pm \ - ZoneMinder/lib/ZoneMinder/Base.pm.in \ - ZoneMinder/lib/ZoneMinder/Config.pm.in \ - ZoneMinder/lib/ZoneMinder/Logger.pm \ - ZoneMinder/lib/ZoneMinder/General.pm \ - ZoneMinder/lib/ZoneMinder/Database.pm \ - ZoneMinder/lib/ZoneMinder/Memory.pm.in \ - ZoneMinder/lib/ZoneMinder/Memory/Shared.pm \ - ZoneMinder/lib/ZoneMinder/Memory/Mapped.pm \ - ZoneMinder/lib/ZoneMinder/ConfigAdmin.pm \ - ZoneMinder/lib/ZoneMinder/ConfigData.pm.in \ - ZoneMinder/lib/ZoneMinder/Control.pm \ - ZoneMinder/lib/ZoneMinder/Control \ - ZoneMinder/lib/ZoneMinder/Trigger/Channel.pm \ - ZoneMinder/lib/ZoneMinder/Trigger/Channel/Handle.pm \ - ZoneMinder/lib/ZoneMinder/Trigger/Channel/Spawning.pm \ - ZoneMinder/lib/ZoneMinder/Trigger/Channel/Inet.pm \ - ZoneMinder/lib/ZoneMinder/Trigger/Channel/Unix.pm \ - ZoneMinder/lib/ZoneMinder/Trigger/Channel/File.pm \ - ZoneMinder/lib/ZoneMinder/Trigger/Channel/Serial.pm \ - ZoneMinder/lib/ZoneMinder/Trigger/Connection.pm \ - ZoneMinder/lib/ZoneMinder/Trigger/Connection/Example.pm \ - zm.in \ - zmdbbackup.in \ - zmdbrestore.in \ - zmeventdump.in \ - zmlogrotate.conf.in - diff --git a/src/Makefile.am b/src/Makefile.am deleted file mode 100644 index 9314daac0..000000000 --- a/src/Makefile.am +++ /dev/null @@ -1,135 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -AM_CPPFLAGS = @MYSQL_CFLAGS@ @MARIADB_CFLAGS@ @FFMPEG_CFLAGS@ -Wall -finline-functions -fomit-frame-pointer -#AM_CXXFLAGS = -frepo - -CLEANFILES = *.rpo - -# This should be set to your CGI directory -cgidir = @CGI_PREFIX@ -# And these to the user and group of your webserver -webuser = @WEB_USER@ -webgroup = @WEB_GROUP@ - -bin_PROGRAMS = \ - zmc \ - zma \ - zmu \ - zms \ - zmf \ - zmstreamer - -zm_SOURCES = \ - zm_box.cpp \ - zm_buffer.cpp \ - zm_camera.cpp \ - zm_comms.cpp \ - zm_config.cpp \ - zm_coord.cpp \ - zm_curl_camera.cpp \ - zm.cpp \ - zm_db.cpp \ - zm_logger.cpp \ - zm_event.cpp \ - zm_exception.cpp \ - zm_file_camera.cpp \ - zm_ffmpeg_camera.cpp \ - zm_image.cpp \ - zm_jpeg.cpp \ - zm_libvlc_camera.cpp \ - zm_local_camera.cpp \ - zm_monitor.cpp \ - zm_ffmpeg.cpp \ - zm_mpeg.cpp \ - zm_poly.cpp \ - zm_regexp.cpp \ - zm_remote_camera.cpp \ - zm_remote_camera_http.cpp \ - zm_remote_camera_rtsp.cpp \ - zm_rtp.cpp \ - zm_rtp_ctrl.cpp \ - zm_rtp_data.cpp \ - zm_rtp_source.cpp \ - zm_rtsp.cpp \ - zm_rtsp_auth.cpp \ - zm_sdp.cpp \ - zm_signal.cpp \ - zm_stream.cpp \ - zm_thread.cpp \ - zm_time.cpp \ - zm_timer.cpp \ - zm_user.cpp \ - zm_utils.cpp \ - zm_zone.cpp - -zmc_SOURCES = zmc.cpp $(zm_SOURCES) -zma_SOURCES = zma.cpp $(zm_SOURCES) -zms_SOURCES = zms.cpp $(zm_SOURCES) -zmu_SOURCES = zmu.cpp $(zm_SOURCES) -zmf_SOURCES = zmf.cpp $(zm_SOURCES) -zmstreamer_SOURCES = zmstreamer.cpp $(zm_SOURCES) - -noinst_HEADERS = \ - jinclude.h \ - zm_box.h \ - zm_buffer.h \ - zm_camera.h \ - zm_comms.h \ - zm_config_defines.h \ - zm_config.h \ - zm_coord.h \ - zm_curl_camera.h \ - zm_db.h \ - zm_logger.h \ - zm_event.h \ - zm_exception.h \ - zmf.h \ - zm_file_camera.h \ - zm_ffmpeg_camera.h \ - zm_font.h \ - zm_font.h \ - zm.h \ - zm_image.h \ - zm_jpeg.h \ - zm_libvlc_camera.h \ - zm_local_camera.h \ - zm_mem_utils.h \ - zm_monitor.h \ - zm_ffmpeg.h \ - zm_mpeg.h \ - zm_poly.h \ - zm_regexp.h \ - zm_remote_camera.h \ - zm_remote_camera_http.h \ - zm_remote_camera_rtsp.h \ - zm_rgb.h \ - zm_rtp_ctrl.h \ - zm_rtp_data.h \ - zm_rtp.h \ - zm_rtp_source.h \ - zm_rtsp.h \ - zm_sdp.h \ - zm_signal.h \ - zm_stream.h \ - zm_thread.h \ - zm_time.h \ - zm_timer.h \ - zm_user.h \ - zm_utils.h \ - zm_zone.h - -EXTRA_DIST = \ - zm_config.h.in \ - zm_threaddata.cpp - -dist-hook: - @( rm $(distdir)/zm_config.h ) - -# Yes, you are correct. This is a HACK! -install-exec-hook: - ( cd $(DESTDIR)@bindir@; mkdir -p $(DESTDIR)$(cgidir); mv zms $(DESTDIR)$(cgidir) ) - ( cd $(DESTDIR)$(cgidir); chown $(webuser):$(webgroup) zms; ln -f zms nph-zms ) - -uninstall-hook: - ( cd $(DESTDIR)$(cgidir); rm -f zms nph-zms ) - diff --git a/web/Makefile.am b/web/Makefile.am deleted file mode 100644 index 077a4ff91..000000000 --- a/web/Makefile.am +++ /dev/null @@ -1,35 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -# This should be set to your web directory -webdir = @WEB_PREFIX@ -# And these to the user and group of your webserver -webuser = @WEB_USER@ -webgroup = @WEB_GROUP@ - -SUBDIRS = \ - ajax \ - css \ - graphics \ - includes \ - js \ - lang \ - skins \ - tools \ - views - -dist_web_DATA = \ - index.php - -# Yes, you are correct. This is a HACK! -install-data-hook: - ( cd $(DESTDIR)$(webdir); chown $(webuser):$(webgroup) $(dist_web_DATA) ) - ( cd $(DESTDIR)$(webdir); chown -R $(webuser):$(webgroup) $(SUBDIRS) ) - @-( cd $(DESTDIR)$(webdir); if ! test -e events; then mkdir events; fi; chown $(webuser):$(webgroup) events; chmod u+w events ) - @-( cd $(DESTDIR)$(webdir); if ! test -e images; then mkdir images; fi; chown $(webuser):$(webgroup) images; chmod u+w images ) - @-( cd $(DESTDIR)$(webdir); if ! test -e sounds; then mkdir sounds; fi; chown $(webuser):$(webgroup) sounds; chmod u+w sounds ) - @-( cd $(DESTDIR)$(webdir); if ! test -e tools; then mkdir tools; fi; chown $(webuser):$(webgroup) tools; chmod u+w tools ) - @-( cd $(DESTDIR)$(webdir); if ! test -e temp; then mkdir temp; fi; chown $(webuser):$(webgroup) temp; chmod u+w temp ) - -uninstall-hook: - @-( cd $(DESTDIR)$(webdir); rm -rf $(SUBDIRS) ) - @-( cd $(DESTDIR)$(webdir); rm -rf events images sounds tools temp ) diff --git a/web/ajax/Makefile.am b/web/ajax/Makefile.am deleted file mode 100644 index ef79e6cae..000000000 --- a/web/ajax/Makefile.am +++ /dev/null @@ -1,12 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/ajax - -dist_web_DATA = \ - alarm.php \ - control.php \ - event.php \ - log.php \ - status.php \ - stream.php \ - zone.php diff --git a/web/css/Makefile.am b/web/css/Makefile.am deleted file mode 100644 index 917b8f389..000000000 --- a/web/css/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/css - -dist_web_DATA = \ - reset.css \ - spinner.css \ - overlay.css diff --git a/web/graphics/Makefile.am b/web/graphics/Makefile.am deleted file mode 100644 index ec252c82e..000000000 --- a/web/graphics/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/graphics - -dist_web_DATA = \ - favicon.ico \ - spinner.gif \ - transparent.gif diff --git a/web/includes/Makefile.am b/web/includes/Makefile.am deleted file mode 100644 index d4a1ece9b..000000000 --- a/web/includes/Makefile.am +++ /dev/null @@ -1,19 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/includes - -web_DATA = \ - config.php - -dist_web_DATA = \ - Monitor.php \ - Server.php \ - actions.php \ - database.php \ - functions.php \ - control_functions.php \ - lang.php \ - logger.php - -EXTRA_DIST = \ - config.php.in diff --git a/web/js/Makefile.am b/web/js/Makefile.am deleted file mode 100644 index 21c10613e..000000000 --- a/web/js/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/js - -dist_web_DATA = \ - logger.js \ - overlay.js \ - mootools.ext.js diff --git a/web/lang/Makefile.am b/web/lang/Makefile.am deleted file mode 100644 index 22d256a2e..000000000 --- a/web/lang/Makefile.am +++ /dev/null @@ -1,25 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/lang - -dist_web_DATA = \ - big5_big5.php \ - cn_zh.php \ - cs_cz.php \ - de_de.php \ - dk_dk.php \ - et_ee.php \ - en_gb.php \ - en_us.php \ - es_ar.php \ - fr_fr.php \ - he_il.php \ - hu_hu.php \ - it_it.php \ - ja_jp.php \ - nl_nl.php \ - pl_pl.php \ - pt_br.php \ - ro_ro.php \ - ru_ru.php \ - se_se.php diff --git a/web/skins/Makefile.am b/web/skins/Makefile.am deleted file mode 100644 index ae0abd8e8..000000000 --- a/web/skins/Makefile.am +++ /dev/null @@ -1,6 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -SUBDIRS = \ - classic \ - mobile \ - xml diff --git a/web/skins/classic/Makefile.am b/web/skins/classic/Makefile.am deleted file mode 100644 index 986beae0d..000000000 --- a/web/skins/classic/Makefile.am +++ /dev/null @@ -1,15 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/classic - -SUBDIRS = \ - ajax \ - css \ - graphics \ - includes \ - js \ - lang \ - views - -dist_web_DATA = \ - skin.php diff --git a/web/skins/classic/ajax/Makefile.am b/web/skins/classic/ajax/Makefile.am deleted file mode 100644 index f910cbc5c..000000000 --- a/web/skins/classic/ajax/Makefile.am +++ /dev/null @@ -1,5 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/classic/ajax - -dist_web_DATA = # No files here diff --git a/web/skins/classic/css/Makefile.am b/web/skins/classic/css/Makefile.am deleted file mode 100644 index 2c43d2e47..000000000 --- a/web/skins/classic/css/Makefile.am +++ /dev/null @@ -1,7 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/classic/css - -SUBDIRS = dark \ - flat \ - classic diff --git a/web/skins/classic/css/classic/Makefile.am b/web/skins/classic/css/classic/Makefile.am deleted file mode 100644 index 48dc58ab7..000000000 --- a/web/skins/classic/css/classic/Makefile.am +++ /dev/null @@ -1,10 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/classic/css/classic - -SUBDIRS = views - -dist_web_DATA = \ - skin.css \ - control.css \ - export.css diff --git a/web/skins/classic/css/classic/views/Makefile.am b/web/skins/classic/css/classic/views/Makefile.am deleted file mode 100644 index d07eaac4f..000000000 --- a/web/skins/classic/css/classic/views/Makefile.am +++ /dev/null @@ -1,31 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/classic/css/classic/views - -dist_web_DATA = \ - console.css \ - controlcaps.css \ - control.css \ - devices.css \ - event.css \ - events.css \ - export.css \ - filter.css \ - frame.css \ - frames.css \ - groups.css \ - log.css \ - monitor.css \ - montage_2wide.css \ - montage_3wide50enlarge.css \ - montage_3wide.css \ - montage_4wide.css \ - montage.css \ - montage_freeform.css \ - options.css \ - stats.css \ - timeline.css \ - timeline.css.php \ - video.css \ - watch.css \ - zone.css diff --git a/web/skins/classic/css/dark/Makefile.am b/web/skins/classic/css/dark/Makefile.am deleted file mode 100644 index 6961860eb..000000000 --- a/web/skins/classic/css/dark/Makefile.am +++ /dev/null @@ -1,10 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/classic/css/dark - -SUBDIRS = views - -dist_web_DATA = \ - skin.css \ - control.css \ - export.css diff --git a/web/skins/classic/css/dark/views/Makefile.am b/web/skins/classic/css/dark/views/Makefile.am deleted file mode 100644 index 2180d6432..000000000 --- a/web/skins/classic/css/dark/views/Makefile.am +++ /dev/null @@ -1,31 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/classic/css/dark/views - -dist_web_DATA = \ - console.css \ - controlcaps.css \ - control.css \ - devices.css \ - event.css \ - events.css \ - export.css \ - filter.css \ - frame.css \ - frames.css \ - groups.css \ - log.css \ - monitor.css \ - montage_2wide.css \ - montage_3wide50enlarge.css \ - montage_3wide.css \ - montage_4wide.css \ - montage.css \ - montage_freeform.css \ - options.css \ - stats.css \ - timeline.css \ - timeline.css.php \ - video.css \ - watch.css \ - zone.css diff --git a/web/skins/classic/css/flat/Makefile.am b/web/skins/classic/css/flat/Makefile.am deleted file mode 100644 index 297982929..000000000 --- a/web/skins/classic/css/flat/Makefile.am +++ /dev/null @@ -1,10 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/classic/css/flat - -SUBDIRS = views - -dist_web_DATA = \ - skin.css \ - control.css \ - export.css diff --git a/web/skins/classic/css/flat/views/Makefile.am b/web/skins/classic/css/flat/views/Makefile.am deleted file mode 100644 index dff0aa29b..000000000 --- a/web/skins/classic/css/flat/views/Makefile.am +++ /dev/null @@ -1,31 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/classic/css/flat/views - -dist_web_DATA = \ - console.css \ - controlcaps.css \ - control.css \ - devices.css \ - event.css \ - events.css \ - export.css \ - filter.css \ - frame.css \ - frames.css \ - groups.css \ - log.css \ - monitor.css \ - montage_2wide.css \ - montage_3wide50enlarge.css \ - montage_3wide.css \ - montage_4wide.css \ - montage.css \ - montage_freeform.css \ - options.css \ - stats.css \ - timeline.css \ - timeline.css.php \ - video.css \ - watch.css \ - zone.css diff --git a/web/skins/classic/graphics/Makefile.am b/web/skins/classic/graphics/Makefile.am deleted file mode 100644 index c5c7b6bba..000000000 --- a/web/skins/classic/graphics/Makefile.am +++ /dev/null @@ -1,23 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/classic/graphics - -dist_web_DATA = \ - arrow-d.gif \ - arrow-dl.gif \ - arrow-dr.gif \ - arrow-l-d.gif \ - arrow-l.gif \ - arrow-l-u.gif \ - arrow-r.gif \ - arrow-s-d.gif \ - arrow-s-u.gif \ - arrow-u.gif \ - arrow-ul.gif \ - arrow-ur.gif \ - center.gif \ - point-g.gif \ - point-o.gif \ - point-r.gif \ - seq-d.gif \ - seq-u.gif diff --git a/web/skins/classic/includes/Makefile.am b/web/skins/classic/includes/Makefile.am deleted file mode 100644 index 690df231a..000000000 --- a/web/skins/classic/includes/Makefile.am +++ /dev/null @@ -1,11 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/classic/includes - -dist_web_DATA = \ - init.php \ - config.php \ - functions.php \ - control_functions.php \ - export_functions.php \ - timeline_functions.php diff --git a/web/skins/classic/js/Makefile.am b/web/skins/classic/js/Makefile.am deleted file mode 100644 index 3f5ffdda2..000000000 --- a/web/skins/classic/js/Makefile.am +++ /dev/null @@ -1,10 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/classic/js - -dist_web_DATA = \ - skin.js \ - classic.js \ - dark.js \ - flat.js \ - skin.js.php diff --git a/web/skins/classic/lang/Makefile.am b/web/skins/classic/lang/Makefile.am deleted file mode 100644 index 6a089b4fa..000000000 --- a/web/skins/classic/lang/Makefile.am +++ /dev/null @@ -1,5 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/classic/lang - -dist_web_DATA = # No files here diff --git a/web/skins/classic/views/Makefile.am b/web/skins/classic/views/Makefile.am deleted file mode 100644 index 4167a886b..000000000 --- a/web/skins/classic/views/Makefile.am +++ /dev/null @@ -1,57 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -SUBDIRS = \ - js - -webdir = @WEB_PREFIX@/skins/classic/views - -dist_web_DATA = \ - bandwidth.php \ - blank.php \ - console.php \ - controlcap.php \ - controlcaps.php \ - control.php \ - controlpreset.php \ - cycle.php \ - device.php \ - devices.php \ - donate.php \ - error.php \ - eventdetail.php \ - event.php \ - events.php \ - export.php \ - filter.php \ - filtersave.php \ - frame.php \ - frames.php \ - function.php \ - group.php \ - groups.php \ - log.php \ - login.php \ - logout.php \ - Makefile.am \ - monitor.php \ - monitorpreset.php \ - monitorprobe.php \ - montage.php \ - montagereview.php \ - none.php \ - onvifprobe.php \ - optionhelp.php \ - options.php \ - postlogin.php \ - server.php \ - settings.php \ - state.php \ - stats.php \ - status.php \ - timeline.php \ - user.php \ - version.php \ - video.php \ - watch.php \ - zone.php \ - zones.php diff --git a/web/skins/classic/views/js/Makefile.am b/web/skins/classic/views/js/Makefile.am deleted file mode 100644 index 73c74fafe..000000000 --- a/web/skins/classic/views/js/Makefile.am +++ /dev/null @@ -1,50 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/classic/views/js - -dist_web_DATA = \ - console.js \ - console.js.php \ - control.js \ - controlpreset.js \ - controlpreset.js.php \ - cycle.js \ - cycle.js.php \ - devices.js \ - donate.js \ - donate.js.php \ - event.js \ - event.js.php \ - events.js \ - events.js.php \ - export.js \ - export.js.php \ - filter.js \ - filter.js.php \ - group.js \ - groups.js \ - log.js \ - login.js \ - Makefile.am \ - monitor.js \ - monitor.js.php \ - monitorpreset.js \ - monitorprobe.js \ - montage.js \ - montage.js.php \ - onvifprobe.js \ - options.js.php \ - postlogin.js.php \ - state.js \ - state.js.php \ - timeline.js \ - timeline.js.php \ - user.js \ - version.js \ - version.js.php \ - video.js \ - video.js.php \ - watch.js \ - watch.js.php \ - zone.js \ - zone.js.php diff --git a/web/skins/mobile/Makefile.am b/web/skins/mobile/Makefile.am deleted file mode 100644 index 35051fade..000000000 --- a/web/skins/mobile/Makefile.am +++ /dev/null @@ -1,14 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/mobile - -SUBDIRS = \ - ajax \ - css \ - graphics \ - includes \ - lang \ - views - -dist_web_DATA = \ - skin.php diff --git a/web/skins/mobile/ajax/Makefile.am b/web/skins/mobile/ajax/Makefile.am deleted file mode 100644 index 0558929c0..000000000 --- a/web/skins/mobile/ajax/Makefile.am +++ /dev/null @@ -1,5 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/mobile/ajax - -dist_web_DATA = # No files here diff --git a/web/skins/mobile/css/Makefile.am b/web/skins/mobile/css/Makefile.am deleted file mode 100644 index 6353e163e..000000000 --- a/web/skins/mobile/css/Makefile.am +++ /dev/null @@ -1,6 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/mobile/css - -dist_web_DATA = \ - skin.css diff --git a/web/skins/mobile/graphics/Makefile.am b/web/skins/mobile/graphics/Makefile.am deleted file mode 100644 index dfd43bef7..000000000 --- a/web/skins/mobile/graphics/Makefile.am +++ /dev/null @@ -1,5 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/mobile/graphics - -dist_web_DATA = # No files here diff --git a/web/skins/mobile/includes/Makefile.am b/web/skins/mobile/includes/Makefile.am deleted file mode 100644 index c88ad435a..000000000 --- a/web/skins/mobile/includes/Makefile.am +++ /dev/null @@ -1,9 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/mobile/includes - -dist_web_DATA = \ - init.php \ - config.php \ - functions.php \ - control_functions.php diff --git a/web/skins/mobile/lang/Makefile.am b/web/skins/mobile/lang/Makefile.am deleted file mode 100644 index 5084203fb..000000000 --- a/web/skins/mobile/lang/Makefile.am +++ /dev/null @@ -1,5 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/mobile/lang - -dist_web_DATA = # No files here diff --git a/web/skins/mobile/views/Makefile.am b/web/skins/mobile/views/Makefile.am deleted file mode 100644 index c7d175ca3..000000000 --- a/web/skins/mobile/views/Makefile.am +++ /dev/null @@ -1,22 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -SUBDIRS = \ - css - -webdir = @WEB_PREFIX@/skins/mobile/views - -dist_web_DATA = \ - console.php \ - devices.php \ - error.php \ - eventdetails.php \ - event.php \ - events.php \ - filter.php \ - frame.php \ - function.php \ - login.php \ - montage.php \ - state.php \ - video.php \ - watch.php diff --git a/web/skins/mobile/views/css/Makefile.am b/web/skins/mobile/views/css/Makefile.am deleted file mode 100644 index 86e0ff0a3..000000000 --- a/web/skins/mobile/views/css/Makefile.am +++ /dev/null @@ -1,6 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/mobile/views/css - -dist_web_DATA = \ - console.css diff --git a/web/skins/xml/Makefile.am b/web/skins/xml/Makefile.am deleted file mode 100644 index 2c30d19a3..000000000 --- a/web/skins/xml/Makefile.am +++ /dev/null @@ -1,10 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/xml - -SUBDIRS = \ - includes \ - views - -dist_web_DATA = \ - skin.php diff --git a/web/skins/xml/includes/Makefile.am b/web/skins/xml/includes/Makefile.am deleted file mode 100644 index c6128f8a2..000000000 --- a/web/skins/xml/includes/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/skins/xml/includes - -dist_web_DATA = \ - init.php \ - config.php \ - functions.php diff --git a/web/skins/xml/views/Makefile.am b/web/skins/xml/views/Makefile.am deleted file mode 100644 index ab9147ae4..000000000 --- a/web/skins/xml/views/Makefile.am +++ /dev/null @@ -1,11 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -SUBDIRS = - -webdir = @WEB_PREFIX@/skins/xml/views - -dist_web_DATA = \ - console.php \ - actions.php \ - none.php \ - notfound.png diff --git a/web/tools/Makefile.am b/web/tools/Makefile.am deleted file mode 100644 index 29c91bc02..000000000 --- a/web/tools/Makefile.am +++ /dev/null @@ -1,4 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -SUBDIRS = \ - mootools diff --git a/web/tools/mootools/Makefile.am b/web/tools/mootools/Makefile.am deleted file mode 100644 index 89b17ab8d..000000000 --- a/web/tools/mootools/Makefile.am +++ /dev/null @@ -1,16 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/tools/mootools - -dist_web_DATA = \ - mootools-core-1.4.5-compat.js \ - mootools-more-1.5.1.js - -# Yes, you are correct. This is a HACK! -install-data-hook: - ( cd $(DESTDIR)$(webdir); rm -f mootools-core.js mootools-more.js ) - ( cd $(DESTDIR)$(webdir); ln -sf mootools-core-1.4.5-compat.js mootools-core.js ) - ( cd $(DESTDIR)$(webdir); ln -sf mootools-more-1.5.1.js mootools-more.js ) - -uninstall-hook: - @-( cd $(DESTDIR)$(webdir); rm -f mootools-* ) diff --git a/web/views/Makefile.am b/web/views/Makefile.am deleted file mode 100644 index 6ecec9d8b..000000000 --- a/web/views/Makefile.am +++ /dev/null @@ -1,6 +0,0 @@ -AUTOMAKE_OPTIONS = gnu - -webdir = @WEB_PREFIX@/views - -dist_web_DATA = file.php \ - image.php From e4a72f7653925ac2ffaf9969fb53d00990732238 Mon Sep 17 00:00:00 2001 From: SteveGilvarry Date: Tue, 29 Dec 2015 01:25:37 +1100 Subject: [PATCH 18/90] Remove more Autotools files and edit travis to no longer build Autotools Conflicts: .travis.yml bootstrap.sh configure.ac --- .travis.yml | 7 - acinclude.m4 | 74 ------ bootstrap.sh | 5 - configure.ac | 509 ---------------------------------------- m4/ac_check_sendfile.m4 | 63 ----- 5 files changed, 658 deletions(-) delete mode 100644 acinclude.m4 delete mode 100755 bootstrap.sh delete mode 100644 configure.ac delete mode 100644 m4/ac_check_sendfile.m4 diff --git a/.travis.yml b/.travis.yml index d44973e2e..835f267f3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,7 +17,6 @@ env: - CXXFLAGS="$CFLAGS" matrix: - ZM_BUILDMETHOD=cmake - - ZM_BUILDMETHOD=autotools compiler: - gcc before_install: @@ -32,16 +31,10 @@ install: - sudo make install-libs before_script: - cd $TRAVIS_BUILD_DIR - - if [ "$ZM_BUILDMETHOD" = "autotools" ]; then libtoolize -v --force; fi - - if [ "$ZM_BUILDMETHOD" = "autotools" ]; then aclocal -I m4; fi - - if [ "$ZM_BUILDMETHOD" = "autotools" ]; then autoheader; fi - - if [ "$ZM_BUILDMETHOD" = "autotools" ]; then automake --force-missing --add-missing; fi - - if [ "$ZM_BUILDMETHOD" = "autotools" ]; then autoconf; fi - mysql -uroot -e "CREATE DATABASE IF NOT EXISTS zm" - mysql -uroot -e "GRANT ALL ON zm.* TO 'zmuser'@'localhost' IDENTIFIED BY 'zmpass'"; - mysql -uroot -e "FLUSH PRIVILEGES" script: - - if [ "$ZM_BUILDMETHOD" = "autotools" ]; then ./configure --prefix=/usr --with-libarch=lib/$DEB_HOST_GNU_TYPE --host=$DEB_HOST_GNU_TYPE --build=$DEB_BUILD_GNU_TYPE --with-mysql=/usr --with-ffmpeg=/usr --with-webdir=/usr/share/zoneminder/www --with-cgidir=/usr/libexec/zoneminder/cgi-bin --with-webuser=www-data --with-webgroup=www-data --enable-crashtrace=yes --disable-debug --enable-mmap=yes ZM_SSL_LIB=openssl; fi - if [ "$ZM_BUILDMETHOD" = "cmake" ]; then cmake -DCMAKE_INSTALL_PREFIX="/usr"; fi - make - sudo make install diff --git a/acinclude.m4 b/acinclude.m4 deleted file mode 100644 index 605842149..000000000 --- a/acinclude.m4 +++ /dev/null @@ -1,74 +0,0 @@ -AC_DEFUN([AC_DEFINE_DIR], [ - prefix_NONE= - exec_prefix_NONE= - test "x$prefix" = xNONE && prefix_NONE=yes && prefix=$ac_default_prefix - test "x$exec_prefix" = xNONE && exec_prefix_NONE=yes && exec_prefix=$prefix -dnl In Autoconf 2.60, ${datadir} refers to ${datarootdir}, which in turn -dnl refers to ${prefix}. Thus we have to use `eval' twice. - eval ac_define_dir="\"[$]$2\"" - eval ac_define_dir="\"$ac_define_dir\"" - AC_SUBST($1, "$ac_define_dir") - AC_DEFINE_UNQUOTED($1, "$ac_define_dir", [$3]) - test "$prefix_NONE" && prefix=NONE - test "$exec_prefix_NONE" && exec_prefix=NONE -]) - -AC_DEFUN([AC_PROG_PERL_VERSION],[dnl -# Make sure we have perl -if test -z "$PERL"; then -AC_CHECK_PROG(PERL,perl,perl) -fi - -# Check if version of Perl is sufficient -ac_perl_version="$1" - -if test "x$PERL" != "x"; then - AC_MSG_CHECKING(for perl version greater than or equal to $ac_perl_version) - # NB: It would be nice to log the error if there is one, but we cannot rely - # on autoconf internals - $PERL -e "use $ac_perl_version;" > /dev/null 2>&1 - if test $? -ne 0; then - AC_MSG_RESULT(no); - $3 - else - AC_MSG_RESULT(ok); - $2 - fi -else - AC_MSG_WARN(could not find perl) -fi -])dnl - -AC_DEFUN([AC_PROG_PERL_MODULES],[dnl -ac_perl_modules="$1" -# Make sure we have perl -if test -z "$PERL"; then -AC_CHECK_PROG(PERL,perl,perl) -fi - -if test "x$PERL" != x; then - ac_perl_modules_failed=0 - for ac_perl_module in $ac_perl_modules; do - AC_MSG_CHECKING(for perl module $ac_perl_module) - - # Would be nice to log result here, but can't rely on autoconf internals - $PERL "-M$ac_perl_module" -e exit > /dev/null 2>&1 - if test $? -ne 0; then - AC_MSG_RESULT(no); - ac_perl_modules_failed=1 - else - AC_MSG_RESULT(ok); - fi - done - - # Run optional shell commands - if test "$ac_perl_modules_failed" = 0; then - : - $2 - else - : - $3 - fi -else - AC_MSG_WARN(could not find perl) -fi])dnl diff --git a/bootstrap.sh b/bootstrap.sh deleted file mode 100755 index 0bc041f18..000000000 --- a/bootstrap.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -aclocal -I m4 -autoheader -automake --add-missing -autoconf diff --git a/configure.ac b/configure.ac deleted file mode 100644 index b10dd44d5..000000000 --- a/configure.ac +++ /dev/null @@ -1,509 +0,0 @@ -# -# Building ZoneMinder via Autotools will be depreciated soon -# For instructions on building with cmake, please see INSTALL -# -AC_PREREQ(2.59) -AC_INIT(zm,1.29.0,[http://www.zoneminder.com/forums/ - Please check FAQ first],zoneminder,http://www.zoneminder.com/downloads.html) -AM_INIT_AUTOMAKE -AC_CONFIG_SRCDIR(src/zm.h) -AC_CONFIG_HEADERS(config.h) -AC_CONFIG_MACRO_DIR([m4]) - -AC_SUBST([AM_CXXFLAGS], [-D__STDC_CONSTANT_MACROS]) - -AC_SUBST(VERSION) -# -# Platform specific setup -# -############################# -AC_CANONICAL_HOST -# Check for which host we are on and setup a few things -# specifically based on the host -case $host_os in - darwin* ) - # Do something specific for mac - HOST_OS='darwin' - ;; - linux*) - # Do something specific for linux - HOST_OS='linux' - ;; - *BSD*) - # Do something specific for BSD - HOST_OS='BSD' - AC_DEFINE(BSD,1,"This is a BSD system") - ;; - *bsd*) - # Do something specific for BSD - HOST_OS='BSD' - AC_DEFINE(BSD,1,"This is a BSD system") - ;; - *solaris*) - # Do something specific for Solaris - HOST_OS='solaris' - AC_DEFINE(SOLARIS,1,"We are running a Solaroid OS [tested on OmniOS]") - ;; - *) - #Default Case - AC_MSG_ERROR([Your platform is not currently supported]) - ;; -esac - -AC_SUBST(HOST_OS) - -AC_ARG_VAR(ZM_DB_TYPE,[Type of the ZoneMinder database, default mysql]) -AC_ARG_VAR(ZM_DB_HOST,[Hostname where ZoneMinder database located, default localhost]) -AC_ARG_VAR(ZM_DB_NAME,[Name of ZoneMinder database, default zm]) -AC_ARG_VAR(ZM_DB_USER,[Name of ZoneMinder database user, default zmuser]) -AC_ARG_VAR(ZM_DB_PASS,[Password of ZoneMinder database user, default zmpass]) -AC_ARG_VAR(ZM_SSL_LIB,[Library to use for ssl functions, default gnutls]) -AC_ARG_VAR(ZM_MYSQL_ENGINE,[MySQL engine to use with database, default InnoDB]) -AC_ARG_VAR(ZM_RUNDIR,[Location of transient process files, default /var/run/zm]) -AC_ARG_VAR(ZM_SOCKDIR,[Location of Unix domain socket files, default /var/run/zm]) -AC_ARG_VAR(ZM_TMPDIR,[Location of temporary files, default /var/tmp/zm]) -AC_ARG_VAR(ZM_LOGDIR,[Location of generated log files, default /var/log/zm]) -AC_ARG_VAR(ZM_CONFIG_DIR,[Location of ZoneMinder configuration, default system config directory]) - -if test "$ZM_DB_TYPE" == ""; then - AC_SUBST(ZM_DB_TYPE,[mysql]) -fi -if test "$ZM_DB_HOST" == ""; then - AC_SUBST(ZM_DB_HOST,[localhost]) -fi -if test "$ZM_DB_NAME" == ""; then - AC_SUBST(ZM_DB_NAME,[zm]) -fi -if test "$ZM_DB_USER" == ""; then - AC_SUBST(ZM_DB_USER,[zmuser]) -fi -if test "$ZM_DB_PASS" == ""; then - AC_SUBST(ZM_DB_PASS,[zmpass]) -fi -if test "$ZM_SSL_LIB" == ""; then - AC_SUBST(ZM_SSL_LIB,gnutls) -fi -if test "$ZM_MYSQL_ENGINE" == ""; then - AC_SUBST(ZM_MYSQL_ENGINE,InnoDB) -fi -if test "$ZM_RUNDIR" == ""; then - AC_SUBST(ZM_RUNDIR,[/var/run/zm]) -fi -if test "$ZM_SOCKDIR" == ""; then - AC_SUBST(ZM_SOCKDIR,[/var/run/zm]) -fi -if test "$ZM_TMPDIR" == ""; then - AC_SUBST(ZM_TMPDIR,[/tmp/zm]) -fi -if test "$ZM_LOGDIR" == ""; then - AC_SUBST(ZM_LOGDIR,[/var/log/zm]) -fi -AC_DEFINE_DIR([SYSCONFDIR],[sysconfdir],[Expanded configuration directory]) -if test "$ZM_CONFIG_DIR" == ""; then - AC_SUBST(ZM_CONFIG_DIR,[$SYSCONFDIR]) -fi - -LIB_ARCH=lib -AC_ARG_WITH(libarch, - [ --with-libarch= architecture library path to use, default lib], - [LIB_ARCH=$with_libarch], - AC_MSG_WARN([You can call configure with the --with-libarch option. - This tells configure where to find architecture specific libraries. - The default of 'lib' is usually ok but 64 bit machines may require lib64. - e.g. --with-libarch=lib or --with-libarch=lib64]) -) -AC_SUBST(LIB_ARCH) - -LDFLAGS="-L/usr/lib/${build_alias} ${LDFLAGS}" - -MYSQL_PREFIX=/usr -AC_ARG_WITH(mysql, - [ --with-mysql= prefix of MySQL installation, default /usr], - [MYSQL_PREFIX=$with_mysql], - AC_MSG_WARN([You can call configure with the --with-mysql option. - This tells configure where to find the MySql C library and headers if configure cannot - locate them automatically. - e.g. --with-mysql=/usr/local or --with-mysql=/usr]) -) -AC_SUBST(MYSQL_PREFIX) -MYSQL_LIBS="-L${MYSQL_PREFIX}/${LIB_ARCH}/mysql" -MYSQL_CFLAGS="-I${MYSQL_PREFIX}/include" -AC_SUBST(MYSQL_LIBS) -AC_SUBST(MYSQL_CFLAGS) -LDFLAGS="$LDFLAGS ${MYSQL_LIBS}" - - -MARIADB_PREFIX=/usr -AC_ARG_WITH(mariadb, - [ --with-mariadb= prefix of MariaDB installation, default /usr], - [MYSQL_PREFIX=$with_mariadb], - AC_MSG_WARN([You can call configure with the --with-mariadb option. - This tells configure where to find the mariaDB C library and headers if configure cannot - locate them automatically. - e.g. --with-mariadb=/usr/local or --with-mariadb=/usr]) -) -AC_SUBST(MARIADB_PREFIX) -MARIADB_LIBS="-L${MARIADB_PREFIX}/${LIB_ARCH}/mariadb" -MARIADB_CFLAGS="-I${MARIADB_PREFIX}/include" -AC_SUBST(MARIADB_LIBS) -AC_SUBST(MARIADB_CFLAGS) -LDFLAGS="$LDFLAGS ${MARIADB_LIBS}" - -POLKIT_PREFIX=/usr -AC_ARG_WITH(polkit, -[ --with-polkit= prefix of polkit root directory, default /usr], -[POLKIT_PREFIX=$with_polkit], -AC_MSG_WARN([You can call configure with the --with-polkit option. -This tells configure where to place the polkit policy files.]) -) -AC_SUBST(POLKIT_PREFIX) -PKG_CHECK_MODULES(POLKIT, polkit-gobject-1) - -FFMPEG_PREFIX=/usr -AC_ARG_WITH(ffmpeg, - [ --with-ffmpeg= prefix of ffmpeg root directory for libavcodec etc, default /usr], - [FFMPEG_PREFIX=$with_ffmpeg], - AC_MSG_WARN([You can call configure with the --with-ffmpeg option. - This tells configure where to find the ffmpeg root directory within which are the libavcodec - and libavformat files that can be used to build true MPEG streaming into ZoneMinder. Ensure that - your copy of ffmpeg has installed libraries as well as binaries (use 'make installlib'). If you - are using a local install of ffmpeg you may have to remove or rename a previous real installation - as the headers and libraries from that will probably be picked up before your local copy. - e.g. --with-ffmpeg=/usr/local]) -) -AC_SUBST(FFMPEG_PREFIX) -FFMPEG_LIBS="-L${FFMPEG_PREFIX}/${LIB_ARCH}" -FFMPEG_CFLAGS="-I${FFMPEG_PREFIX}/include -D__STDC_CONSTANT_MACROS" -AC_SUBST(FFMPEG_LIBS) -AC_SUBST(FFMPEG_CFLAGS) - -LDFLAGS="${FFMPEG_LIBS} $LDFLAGS" -CFLAGS="${FFMPEG_CFLAGS} $CFLAGS" -CPPFLAGS="${FFMPEG_CFLAGS} $CPPFLAGS" - -EXTRA_LIBS= -AC_ARG_WITH(extralibs, - [ --with-extralibs="" string containing extra libraries to pass to link, default empty], - [EXTRA_LIBS=$with_extralibs], - AC_MSG_WARN([You can call configure with the --with-extralibs option. - Ordinarily you will need to use this option only when your copy of ffmpeg has been built - with support for additional formats and you would use this option to detail which additional - libraries ffmpeg was built with so that it is able to link successfully with ZoneMinder. - You will need to wrap this option in quotes if it contains any spaces. - e.g. --with-extralibs="-lmp3lame"]) -) -AC_SUBST(EXTRA_LIBS) - -LDFLAGS="$LDFLAGS ${EXTRA_LIBS}" - -AC_ARG_WITH(webdir, - [ --with-webdir= prefix of web directory], - [WEB_PREFIX=$with_webdir], - AC_MSG_ERROR([You must call configure with the --with-webdir option. - This tells configure where to install PHP and web files and scripts. - e.g. --with-webdir=/var/www/html or --with-webdir=/www/vhtdocs/]) -) -AC_SUBST(WEB_PREFIX) - -AC_ARG_WITH(cgidir, - [ --with-cgidir= prefix of cgi directory], - [CGI_PREFIX=$with_cgidir], - AC_MSG_ERROR([You must call configure with the --with-cgidir option. - This tells configure where to install cgi files and scripts. - e.g. --with-cgidir=/var/www/cgi-bin or --with-webdir=/www/vhtdocs//cgi-bin]) -) -AC_SUBST(CGI_PREFIX) - -WEB_USER=apache -AC_ARG_WITH(webuser, - [ --with-webuser= name of web user, default apache], - [WEB_USER=$with_webuser], - AC_MSG_WARN([You can call configure with the --with-webuser option. - This tells configure what the user name of the web user is if it is not the default of 'apache'. - e.g. --with-webuser=apache or --with-webuser=web]) -) -AC_SUBST(WEB_USER) - -WEB_GROUP=apache -AC_ARG_WITH(webgroup, - [ --with-webgroup= name of web group, default apache], - [WEB_GROUP=$with_webgroup], - AC_MSG_WARN([You can call configure with the --with-webgroup option. - This tells configure what the group name of the web group is if it is not the default of 'apache'. - e.g. --with-webgroup=apache or --with-webgroup=web]) -) -AC_SUBST(WEB_GROUP) - -WEB_HOST=zm.local -AC_ARG_WITH(webhost, - [ --with-webhost= name of web hostname, default zm.local], - [WEB_HOST=$with_webhost], - AC_MSG_WARN([You can call configure with the --with-webhost option. - This tells configure what the host name is for name based virtual hosting. This is only used to populate the sample web/zmHttpd.conf file. - e.g. --with-webhost=zm.localdomain]) -) -AC_SUBST(WEB_HOST) - -ENABLE_DEBUG=yes -AC_ARG_ENABLE(debug, - [ --enable-debug= enable or disable debug, default enabled], - [ENABLE_DEBUG=$enable_debug], - AC_MSG_WARN([You can call configure with the --enable-debug= or --disable-debug option. - This tells configure whether to compile ZoneMinder with debug included. Although debug is included - by default it is not output unless explicitly switched on elsewhere. These checks may induce a - small penalty on performance and if you are after squeezing the maximum possible performance out - of ZoneMinder you may use this switch to prevent debug from being compiled in. - e.g. --enable-debug=yes or --disable-debug]) -) -if test "$ENABLE_DEBUG" != "yes"; then - AC_DEFINE(ZM_DBG_OFF,1,"Whether debug is switched off and compiled out") -fi - -ENABLE_MMAP=yes -AC_ARG_ENABLE(mmap, - [ --enable-mmap= enable or disabled mapped memory versus shared memory, default mapped], - [ENABLE_MMAP=$enable_mmap], - AC_MSG_WARN([You can call configure with the --enable-mmap= or --disable-mmap option. - This tells configure whether to compile ZoneMinder with mmap support rather than IPC shared - memory. This is a feature that uses memory mapped into files which all processes can share. - Memory mapping requires less configuration and is more flexible than shared memory but may - slow down your system unless the mapped files are configured to reside on a fast or RAM based - filesystem which will normally be the case by default. - e.g. --enable-mmap=yes or --disable-mmap]) -) -if test "$ENABLE_MMAP" == "yes"; then - AC_DEFINE(ZM_MEM_MAPPED,1,"Whether to use mapped rather than shared memory") -else - AC_DEFINE(ZM_MEM_MAPPED,0,"Whether to use mapped rather than shared memory") -fi -AC_SUBST(ENABLE_MMAP) - -ENABLE_ONVIF=no -AC_ARG_ENABLE(onvif, - [ --enable-onvif= enable or disable basic onvif support, default disabled], - [ENABLE_ONVIF=$enable_onvif], - AC_MSG_WARN([You can call configure with the --enable-onvif= or --enable-onvif option. - This tells configure whether to compile ZoneMinder with basic ONVIF support. This feature will - probe for ONVIF compliant cameras on your network and allow you the option to auto-configure them as - monitors in zoneminder. This option is EXPERIMENTAL and may not work with all cameras that claim to - be ONVIF compliant. - e.g. --enable-onvif=yes or --disable-onvif]) -) -AM_CONDITIONAL([COND_ONVIF], [test "$enable_onvif" = yes]) - -# Compiler -AC_LANG_CPLUSPLUS -if test "$ENABLE_ONVIF" == "yes"; then - AC_SUBST(ZM_HAS_ONVIF,1) -else - AC_SUBST(ZM_HAS_ONVIF,0) -fi - -# Checks for programs. -AC_PROG_CXX -AC_PROG_CC -AC_PROG_INSTALL -AC_PROG_LN_S -AC_PROG_RANLIB -AC_PROG_MAKE_SET - -# Checks for typedefs, structures, and compiler characteristics. -AC_HEADER_STDBOOL -AC_C_CONST -AC_TYPE_UID_T -AC_C_INLINE -AC_TYPE_MODE_T -AC_TYPE_SIZE_T -AC_HEADER_TIME -AC_STRUCT_TM -AC_TYPE_SIGNAL - -AC_CHECK_TYPES(siginfo_t,,,[#include ]) -AC_CHECK_TYPES(ucontext_t,,,[#include ]) - -# Checks for library functions. -AC_PROG_GCC_TRADITIONAL -AC_FUNC_MALLOC -AC_FUNC_MMAP -AC_FUNC_SELECT_ARGTYPES -AC_FUNC_STAT -AC_FUNC_STRFTIME -AC_FUNC_STRTOD -AC_FUNC_VPRINTF -AC_CHECK_FUNCS([gethostbyname gethostname gettimeofday memmove memset mkdir munmap posix_memalign putenv select sendfile socket sqrt strcasecmp strchr strcspn strerror strncasecmp strrchr strspn strstr strtol strtoull]) -AC_CHECK_FUNCS([syscall sleep usleep ioctl ioctlsocket sigaction]) -# this is required for freebsd to compile. Look for it in m4/ac_check_sendfile.m4 -AC_CHECK_SENDFILE -# Other programs -AC_CHECK_PROG(OPT_FFMPEG,ffmpeg,yes,no) -AC_PATH_PROG(PATH_FFMPEG,ffmpeg) - -# Checks for libraries. -AC_CHECK_LIB(rt,clock_gettime,,AC_MSG_ERROR(zm requires librt)) -AC_SEARCH_LIBS(mysql_init,[mysqlclient mariadbclient],,AC_MSG_ERROR(zm requires libmysqlclient.a or libmariadbclient.a)) -AC_CHECK_LIB(jpeg,jpeg_start_compress,,AC_MSG_ERROR(zm requires libjpeg.a)) -AC_CHECK_LIB(pthread,pthread_create,,AC_MSG_ERROR(zm requires libpthread.a)) -if test "$BSD" == "0"; then -AC_CHECK_LIB(dl,dlsym,,AC_MSG_ERROR(zm requires libdl.a)) -fi -if test "$ZM_SSL_LIB" == "openssl"; then -AC_CHECK_HEADERS(openssl/md5.h,,AC_MSG_WARN(zm requires openssl/md5.h header to be installed for openssl),) -AC_CHECK_LIB(crypto,MD5,,AC_MSG_WARN([libcrypto.a is required for authenticated streaming - use ZM_SSL_LIB option to select gnutls instead])) -else -AC_CHECK_HEADERS(gnutls/openssl.h,AC_SUBST(ZM_HAS_GNUTLS_OPENSSL,1),AC_SUBST(ZM_HAS_GNUTLS_OPENSSL,0),) -AC_CHECK_HEADERS(gnutls/gnutls.h,AC_SUBST(ZM_HAS_GNUTLS,1),AC_SUBST(ZM_HAS_GNUTLS,0),) -if test "$ZM_HAS_GNUTLS_OPENSSL" == "0" && test "$ZM_HAS_GNUTLS" == "0"; then -AC_MSG_WARN(gnutls is required for authenticated streaming - use ZM_SSL_LIB option to select openssl instead) -fi -AC_CHECK_HEADERS(gcrypt.h,,AC_MSG_WARN(zm requires libgcrypt headers to be installed for gnutls),) -AC_CHECK_LIB(gcrypt,gcry_check_version,,AC_MSG_WARN([libgcrypt.a is required for authenticated streaming - use ZM_SSL_LIB option to select openssl instead])) -AC_CHECK_LIB(gnutls,gnutls_fingerprint,,AC_MSG_WARN([libgnutls.a is required for authenticated streaming - use ZM_SSL_LIB option to select openssl instead])) -if test "$ZM_HAS_GNUTLS_OPENSSL" == "1"; then -AC_CHECK_LIB(gnutls-openssl,MD5,,AC_MSG_WARN([libgnutls.a is required for authenticated streaming - use ZM_SSL_LIB option to select openssl instead])) -fi -fi -AC_CHECK_LIB(pcre,pcre_compile,,AC_MSG_WARN(libpcre.a may be required for remote/network camera support)) -AC_CHECK_LIB(z,zlibVersion) -AC_CHECK_LIB(x264,x264_predict_16x16_init) -AC_CHECK_LIB(avutil,av_malloc,,AC_MSG_WARN(libavutil.a may be required for MPEG streaming)) -# Don't bother to warn about this one -AC_CHECK_LIB(avcore,av_image_copy,,) -AC_CHECK_LIB(avcodec,avcodec_version,,AC_MSG_WARN(libavcodec.a is required for MPEG streaming)) -AC_CHECK_LIB(avformat,avformat_version,,AC_MSG_WARN(libavformat.a is required for MPEG streaming)) -#AC_CHECK_LIB(avcodec,avcodec_open,,AC_MSG_WARN(libavcodec.a is required for MPEG streaming)) -#AC_CHECK_LIB(avformat,av_new_stream,,AC_MSG_WARN(libavformat.a is required for MPEG streaming)) -AC_CHECK_LIB(avdevice,avdevice_register_all,,AC_MSG_WARN(libavdevice.a may be required for MPEG streaming)) -AC_CHECK_LIB(swscale,sws_scale,,,-lswscale) -AC_CHECK_LIB(vlc,libvlc_new,,AC_MSG_WARN(libvlc.a may be required for streaming)) -AC_CHECK_LIB(bz2,BZ2_bzCompress,,AC_MSG_WARN(zm requires libbz2.a for recent versions of ffmpeg)) -AC_CHECK_LIB(z,compress,,) -AC_CHECK_LIB(curl,curl_global_init,,) - -# Checks for header files. -AC_FUNC_ALLOCA -AC_HEADER_STDC -AC_CHECK_HEADERS([fcntl.h limits.h memory.h stddef.h stdlib.h string.h strings.h sys/param.h sys/time.h syslog.h unistd.h values.h]) -AC_CHECK_HEADERS([netdb.h netinet/in.h arpa/inet.h sys/ioctl.h sys/socket.h sys/un.h glob.h sys/sendfile.h]) -AC_CHECK_HEADERS(execinfo.h,,,) -AC_CHECK_HEADERS(ucontext.h,,,) -AC_CHECK_HEADERS(sys/syscall.h,,,) -AC_CHECK_HEADERS(pthread.h,,,) - -# Check for Video for Linux 1 Header Files -ZM_HAS_V4L1=0 -AC_CHECK_HEADERS([libv4l1-videodev.h linux/videodev.h],[ZM_HAS_V4L1=1; break;],,) -AC_SUBST(ZM_HAS_V4L1) - -# Check for Video for Linux 2 Header Files -ZM_HAS_V4L2=0 -AC_CHECK_HEADERS(linux/videodev2.h,ZM_HAS_V4L2=1,,) -AC_SUBST(ZM_HAS_V4L2) - -# Set global Video for Linux flag -ZM_HAS_V4L=0 -if test "$ZM_HAS_V4L1" == "1" || test "$ZM_HAS_V4L2" == "1"; then -ZM_HAS_V4L=1 -else -AC_MSG_WARN(zm requires Video4Linux or Video4Linux2 to be installed for analog or USB camera support) -fi -AC_SUBST(ZM_HAS_V4L) - -AC_CHECK_HEADERS(jpeglib.h,,AC_MSG_ERROR(zm requires libjpeg headers to be installed),) -AC_CHECK_HEADERS(mysql/mysql.h,,AC_MSG_ERROR(zm requires MySQL headers - check that MySQL development packages are installed),) -AC_LANG_PUSH([C]) -AC_CHECK_HEADERS(libavutil/avutil.h,,,) -AC_CHECK_HEADERS(libavcodec/avcodec.h,,,) -AC_CHECK_HEADERS(libavformat/avformat.h,,,) -AC_CHECK_HEADERS(libswscale/swscale.h,,,) -AC_LANG_POP([C]) -AC_CHECK_HEADERS(pcre/pcre.h,AC_SUBST(ZM_PCRE,"1"),,) -AC_CHECK_HEADERS(pcre.h,AC_SUBST(ZM_PCRE,"1"),,) -if test "$ENABLE_MMAP" == "yes"; then -AC_CHECK_HEADERS(sys/mman.h,,,) -AC_CHECK_HEADERS(fcntl.h,,,) -else -AC_CHECK_HEADERS(sys/ipc.h,,,) -AC_CHECK_HEADERS(sys/shm.h,,,) -fi -AC_CHECK_HEADERS(zlib.h,,,) -AC_CHECK_HEADERS(vlc/vlc.h,,,) -AC_CHECK_HEADERS(curl/curl.h,,,) - -if test "$ZM_SSL_LIB" == "openssl"; then -AC_CHECK_DECLS(MD5,,AC_MSG_ERROR([zm requires openssl/md5.h - use ZM_SSL_LIB option to select gnutls instead]),[#include -#include ]) -else -if test "$ZM_HAS_GNUTLS_OPENSSL" == "1"; then -AC_CHECK_DECLS(MD5,,AC_MSG_ERROR([zm requires gnutls/openssl.h - use ZM_SSL_LIB option to select openssl instead]),[#include -#include ]) -else -AC_CHECK_DECLS(gnutls_fingerprint,,AC_MSG_ERROR([zm requires gnutls/gnutls.h - use ZM_SSL_LIB option to select openssl instead]),[#include -#include ]) -fi -fi -AC_CHECK_DECLS(backtrace,,,[#include ]) -AC_CHECK_DECLS(backtrace_symbols,,,[#include ]) -AC_CHECK_LIB(execinfo,backtrace) - -AC_SUBST(LDFLAGS) - -AC_PROG_PERL_VERSION(5.6.0) - -# Compulsory perl modules -AC_PROG_PERL_MODULES(Sys::Syslog,,AC_MSG_ERROR(zm requires SYS:Syslog)) -AC_PROG_PERL_MODULES(DBI,,AC_MSG_ERROR(zm requires DBI)) -AC_PROG_PERL_MODULES(DBD::mysql,,AC_MSG_ERROR(zm requires DBD::mysql)) -AC_PROG_PERL_MODULES(Getopt::Long,,AC_MSG_ERROR(zm requires Getopt::Long)) -AC_PROG_PERL_MODULES(Time::HiRes,,AC_MSG_ERROR(zm requires Time::HiRes)) -AC_PROG_PERL_MODULES(Date::Manip,,AC_MSG_ERROR(zm requires Date::Manip)) -AC_PROG_PERL_MODULES(LWP::UserAgent,,AC_MSG_ERROR(zm requires LWP::UserAgent)) -AC_PROG_PERL_MODULES(ExtUtils::MakeMaker,,AC_MSG_ERROR(zm requires ExtUtils::MakeMaker)) -if test "$ENABLE_MMAP" == "yes"; then -AC_PROG_PERL_MODULES(Sys::Mmap,,AC_MSG_ERROR(zm requires Sys::Mmap for mapped memory - set --enable-mmap=no to use IPC shared memory instead)) -fi - -# Optional perl modules -AC_PROG_PERL_MODULES(Module::Load,,AC_MSG_WARN(Module::Load is required for PTZ camera control)) -AC_PROG_PERL_MODULES(Device::SerialPort,,AC_MSG_WARN(Device::SerialPort is required for RS232/RS485 PTZ camera control)) -AC_PROG_PERL_MODULES(Net::FTP,,AC_MSG_WARN(Net::FTP is required for automatic event uploading using ftp)) -AC_PROG_PERL_MODULES(Net::SFTP::Foreign,,AC_MSG_WARN(Net::SFTP::Foreign is required for automatic event uploading using sftp)) -AC_PROG_PERL_MODULES(Expect,,AC_MSG_WARN(Expect is required for automatic event uploading using sftp)) -AC_PROG_PERL_MODULES(Archive::Tar,,AC_MSG_WARN(Archive::Tar may be required for automatic event uploading)) -AC_PROG_PERL_MODULES(Archive::Zip,,AC_MSG_WARN(Archive::Zip may be required for automatic event uploading)) -AC_PROG_PERL_MODULES(Net::SMTP,,AC_MSG_WARN(Net::SMTP may be required for automatic event email notification)) -AC_PROG_PERL_MODULES(MIME::Lite,,AC_MSG_WARN(MIME::Lite may be required for automatic event email notification)) -AC_PROG_PERL_MODULES(MIME::Entity,,AC_MSG_WARN(MIME::Entity may be required for automatic event email notification)) -AC_PROG_PERL_MODULES(X10::ActiveHome,,AC_MSG_WARN(X10::ActiveHome is required for X.10 support)) - -AC_DEFINE_DIR([BINDIR],[bindir],[Expanded binary directory]) -AC_DEFINE_DIR([LIBDIR],[libdir],[Expanded library directory]) -AC_DEFINE_DIR([DATADIR],[datadir],[Expanded data directory]) -AC_SUBST(PKGDATADIR,"$DATADIR/$PACKAGE") -AC_SUBST(ZM_PID,"$ZM_RUNDIR/zm.pid") -#AC_DEFINE_DIR([SYSCONFDIR],[sysconfdir],[Expanded configuration directory]) -#AC_SUBST(ZM_CONFIG,"$SYSCONFDIR/zm.conf") -AC_SUBST(ZM_CONFIG,"$ZM_CONFIG_DIR/zm.conf") - -# Slight hack for non-standard perl install paths -if test "$prefix" != "NONE"; then - PERL_SITE_PREFIX=`perl -V:siteprefix | sed -e "s/.*='\(.*\)';/\1/"` - PERL_SITE_LIB=`perl -V:installsitelib | sed -e "s/.*='\(.*\)';/\1/"` - PERL_LIB_PATH=`echo $PERL_SITE_LIB | sed -e "s|^$PERL_SITE_PREFIX||"` - EXTRA_PERL_LIB="use lib '$prefix$PERL_LIB_PATH'; # Include custom perl install path" - PERL_MM_PARMS="\"PREFIX=$prefix INSTALLDIRS=vendor\"" -else - EXTRA_PERL_LIB="# Include from system perl paths only" - PERL_MM_PARMS="\"INSTALLDIRS=vendor\"" -fi -AC_SUBST(PERL_MM_PARMS) -AC_SUBST(EXTRA_PERL_LIB) - -AC_CONFIG_FILES([Makefile zm.conf zmconfgen.pl db/Makefile db/zm_create.sql misc/Makefile misc/apache.conf misc/logrotate.conf misc/syslog.conf misc/com.zoneminder.systemctl.policy misc/com.zoneminder.systemctl.rules onvif/Makefile onvif/scripts/Makefile scripts/Makefile scripts/zm scripts/zmaudit.pl scripts/zmcontrol.pl scripts/zmdc.pl scripts/zmfilter.pl scripts/zmpkg.pl scripts/zmtrack.pl scripts/zmcamtool.pl scripts/zmsystemctl.pl scripts/zmtrigger.pl scripts/zmupdate.pl scripts/zmvideo.pl scripts/zmwatch.pl scripts/zmx10.pl scripts/zmdbbackup scripts/zmdbrestore scripts/zmeventdump scripts/zmlogrotate.conf scripts/ZoneMinder/lib/ZoneMinder/Base.pm scripts/ZoneMinder/lib/ZoneMinder/Config.pm scripts/ZoneMinder/lib/ZoneMinder/Memory.pm scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm src/Makefile src/zm_config.h web/Makefile web/ajax/Makefile web/css/Makefile web/graphics/Makefile web/includes/Makefile web/includes/config.php web/js/Makefile web/lang/Makefile web/skins/Makefile web/skins/classic/Makefile web/skins/classic/ajax/Makefile web/skins/classic/css/Makefile web/skins/classic/css/classic/Makefile web/skins/classic/css/classic/views/Makefile web/skins/classic/css/dark/Makefile web/skins/classic/css/dark/views/Makefile web/skins/classic/css/flat/Makefile web/skins/classic/css/flat/views/Makefile web/skins/classic/graphics/Makefile web/skins/classic/includes/Makefile web/skins/classic/js/Makefile web/skins/classic/lang/Makefile web/skins/classic/views/Makefile web/skins/classic/views/js/Makefile web/skins/mobile/Makefile web/skins/mobile/ajax/Makefile web/skins/mobile/css/Makefile web/skins/mobile/graphics/Makefile web/skins/mobile/includes/Makefile web/skins/mobile/lang/Makefile web/skins/mobile/views/Makefile web/skins/mobile/views/css/Makefile web/tools/Makefile web/tools/mootools/Makefile web/views/Makefile web/skins/xml/Makefile web/skins/xml/views/Makefile web/skins/xml/includes/Makefile]) - -# Create the definitions for compilation and defaults for the database -AC_CONFIG_COMMANDS([src/zm_config_defines.h],[perl ./zmconfgen.pl]) -# Manually generate the perl Makefile maker -AC_CONFIG_COMMANDS([scripts/ZoneMinder/Makefile],[(cd scripts/ZoneMinder; echo "perl Makefile.PL $PERL_MM_PARMS"; perl Makefile.PL $PERL_MM_PARMS)],[PERL_MM_PARMS=$PERL_MM_PARMS]) -AC_CONFIG_COMMANDS([onvif/modules/Makefile],[(cd onvif/modules; echo "perl Makefile.PL $PERL_MM_PARMS"; perl Makefile.PL $PERL_MM_PARMS)],[PERL_MM_PARMS=$PERL_MM_PARMS]) -AC_CONFIG_COMMANDS([onvif/proxy/Makefile],[(cd onvif/proxy; echo "perl Makefile.PL $PERL_MM_PARMS"; perl Makefile.PL $PERL_MM_PARMS)],[PERL_MM_PARMS=$PERL_MM_PARMS]) - -AC_OUTPUT diff --git a/m4/ac_check_sendfile.m4 b/m4/ac_check_sendfile.m4 deleted file mode 100644 index 12605d588..000000000 --- a/m4/ac_check_sendfile.m4 +++ /dev/null @@ -1,63 +0,0 @@ -AC_DEFUN([AC_CHECK_SENDFILE],[ -AC_MSG_CHECKING([whether sendfile() is supported and what prototype it has]) - -saved_CFLAGS="$CFLAGS" -CFLAGS="$CFLAGS -Werror-implicit-function-declaration" -ac_sendfile_supported=no -AC_TRY_LINK([#include - #include ], - [sendfile(1, 1, NULL, 0);], - [ - AC_DEFINE(HAVE_SENDFILE4_SUPPORT, 1, - [Define this if Linux/Solaris sendfile() is supported]) - AC_MSG_RESULT([Linux sendfile()]) - ac_sendfile_supported=yes - ], []) - -if test x$ac_sendfile_supported = xno; then - dnl Checking wether we need libsendfile - dnl Presumably on Solaris - AC_CHECK_LIB(sendfile, sendfile, - [ - AC_DEFINE(HAVE_SENDFILE4_SUPPORT, 1, - [Define this if Linux/Solaris sendfile() is supported]) - SENDFILE_LIBS="-lsendfile" - AC_SUBST(SENDFILE_LIBS) - AC_MSG_RESULT([Solaris sendfile()]) - ac_sendfile_supported=yes - ], []) -fi - -if test x$ac_sendfile_supported = xno; then - dnl Checking wether we have FreeBSD-like sendfile() support. - AC_TRY_LINK([#include - #include ], - [sendfile(1, 1, 0, 0, NULL, NULL, 0);], - [ - AC_DEFINE(HAVE_SENDFILE7_SUPPORT, 1, - [Define this if FreeBSD sendfile() is supported]) - AC_MSG_RESULT([FreeBSD sendfile()]) - ac_sendfile_supported=yes - ], []) -fi - -if test x$ac_sendfile_supported = xno; then - dnl Checking wether we have MacOS-like sendfile() support. - AC_TRY_LINK([#include - #include - #include ], - [sendfile(1, 1, 0, NULL, NULL, 0);], - [ - AC_DEFINE(HAVE_SENDFILE6_SUPPORT, 1, - [Define this if MacOS sendfile() is supported]) - AC_MSG_RESULT([MacOS sendfile()]) - ac_sendfile_supported=yes - ], []) -fi - -CFLAGS="$saved_CFLAGS" - -if test x$ac_sendfile_supported = xno; then - AC_MSG_RESULT([no sendfile() support, using read/send]) -fi -]) From e6d57da0d4f6ddd1e369431ffbc505408b1b4188 Mon Sep 17 00:00:00 2001 From: SteveGilvarry Date: Tue, 29 Dec 2015 01:37:16 +1100 Subject: [PATCH 19/90] Remove the mobile skin folder --- web/skins/mobile/css/skin.css | 311 ------------------ web/skins/mobile/includes/config.php | 63 ---- .../mobile/includes/control_functions.php | 184 ----------- web/skins/mobile/includes/functions.php | 66 ---- web/skins/mobile/includes/init.php | 29 -- web/skins/mobile/skin.php | 97 ------ web/skins/mobile/views/console.php | 178 ---------- web/skins/mobile/views/css/console.css | 16 - web/skins/mobile/views/devices.php | 73 ---- web/skins/mobile/views/error.php | 34 -- web/skins/mobile/views/event.php | 147 --------- web/skins/mobile/views/eventdetails.php | 86 ----- web/skins/mobile/views/events.php | 157 --------- web/skins/mobile/views/filter.php | 71 ---- web/skins/mobile/views/frame.php | 73 ---- web/skins/mobile/views/function.php | 66 ---- web/skins/mobile/views/login.php | 54 --- web/skins/mobile/views/montage.php | 75 ----- web/skins/mobile/views/state.php | 77 ----- web/skins/mobile/views/video.php | 226 ------------- web/skins/mobile/views/watch.php | 154 --------- 21 files changed, 2237 deletions(-) delete mode 100644 web/skins/mobile/css/skin.css delete mode 100644 web/skins/mobile/includes/config.php delete mode 100644 web/skins/mobile/includes/control_functions.php delete mode 100644 web/skins/mobile/includes/functions.php delete mode 100644 web/skins/mobile/includes/init.php delete mode 100644 web/skins/mobile/skin.php delete mode 100644 web/skins/mobile/views/console.php delete mode 100644 web/skins/mobile/views/css/console.css delete mode 100644 web/skins/mobile/views/devices.php delete mode 100644 web/skins/mobile/views/error.php delete mode 100644 web/skins/mobile/views/event.php delete mode 100644 web/skins/mobile/views/eventdetails.php delete mode 100644 web/skins/mobile/views/events.php delete mode 100644 web/skins/mobile/views/filter.php delete mode 100644 web/skins/mobile/views/frame.php delete mode 100644 web/skins/mobile/views/function.php delete mode 100644 web/skins/mobile/views/login.php delete mode 100644 web/skins/mobile/views/montage.php delete mode 100644 web/skins/mobile/views/state.php delete mode 100644 web/skins/mobile/views/video.php delete mode 100644 web/skins/mobile/views/watch.php diff --git a/web/skins/mobile/css/skin.css b/web/skins/mobile/css/skin.css deleted file mode 100644 index b996392a3..000000000 --- a/web/skins/mobile/css/skin.css +++ /dev/null @@ -1,311 +0,0 @@ -/* - * Primary look and feel styles - */ - -body { - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: 100%; - color: #333333; - font-weight: normal; - text-align: center; -} - -h1 { - font-family: inherit; - font-size: 120%; - color: #000066; - font-weight: bold; -} - -h2 { - font-family: inherit; - font-size: 110%; - color: #000066; - font-weight: bold; -} - -h3 { - font-family: inherit; - font-size: 100%; - color: #016A9D; - font-weight: bold; -} - -p { - font-family: inherit; - font-size: 100%; - color: #333333; - font-weight: normal; -} - -th { - font-weight: bold; - color: #016A9D; -} - -a:link { - color: #7F7FB2; - text-decoration: none; -} - -a:visited { - color: #7F7FB2; - text-decoration: none; -} - -a:hover { - color: #666699; - text-decoration: underline; -} - -label { - margin-right: 4px; -} - -input,textarea,select { - border: 1px #7F7FB2 solid; - font-family: inherit; - font-size: 100%; - color: #333333; -} - -input[type=text], input[type=password], textarea { - padding: 1px; -} - -input.noborder { - border: 0; -} - -input[disabled] { - color: #888888; -} - -img.normal { - border: white solid 1px; -} - -img.alarm { - border: red solid 1px; -} - -hr { - height: 1px; - width: 100%; - border: 0; - color: #7f7fb2; - background-color: #7f7fb2; -} - -/* - * Major league table for multiple inputs or presentation - */ - -#content table.major { - margin: 4px auto; - width: 100%; - border-collapse: collapse; -} - -#content table.major tr.highlight { - background-color: #eeeeee; -} - -#content table.major thead tr th { - padding-top: 6px; - padding-bottom: 6px; - vertical-align: middle; -} - -#content table.major tfoot td { - padding-top: 6px; - padding-bottom: 6px; - vertical-align: middle; -} - -#content table.major th, #content table.major td { - border: 1px solid #7f7fb2; - padding: 3px; - text-align: left; -} - -#content table.major th { - vertical-align: bottom; -} - -#content table.major td { - vertical-align: middle; -} - -#content table.major th[scope=row] { - padding: 4px 3px 3px; - vertical-align: top; - text-align: right; -} - -#content table.major .colMark, #content table.major .colSelect { - text-align: center; -} -/* - * Lesser table for very simple forms - */ - -#content table.minor { - width: 200px; - margin: 0 auto; -} - -#content table.minor td { - padding: 4px; -} - -#content table.minor .colLeft { - width: 50%; - text-align: right; -} - -#content table.minor .colRight { - width: 50%; - text-align: left; -} - -#content table.minor input[type=submit] -{ - margin-top: 4px; - padding: 0 2px; - font-size: 120%; -} - -/* - * Behavior classes - */ -.error { - /*font-family: Verdana, Arial, Helvetica, sans-serif;*/ - font-size: 100%; - color: #DC143C; - font-weight: bold; -} - -.warn { - /*font-family: Verdana, Arial, Helvetica, sans-serif;*/ - font-size: 100%; - color: #FF8C00; - font-weight: bold; -} - -.info { - /*font-family: Verdana, Arial, Helvetica, sans-serif;*/ - font-size: 100%; - color: #688E23; - font-weight: bold; -} - -.errorText { - color: #DC143C; -} - -.warnText { - color: #FF8C00; -} - -.infoText { - color: #688E23; -} - -.disabledText { - font-style: italic; -} - -/* - * Generic useful classes, especially with mootools - */ - -.hidden { - display: none; -} - -.invisible { - visibility: hidden; -} - -.nowrap { - white-space: nowrap; -} - -div.clear { - clear: both; -} - -/* - * Primary layout styles - */ - -#page { - width: 100%; -} - -#header { - width: 98%; - line-height: 24px; - margin: 4px auto 0; - clear: both; -} - -#header h2 { - left: 0; -} - -#headerControl { -} - -#headerButtons { - float: right; -} - -#headerButtons a { - margin-left: 8px; -} - -#content { - width: 98%; - margin: 4px auto; - line-height: 130%; - text-align: center; - clear: both; -} - -#contentTable { - width: 100%; -} - -#content p { - margin-top: 4px; -} - -#content p.textblock { - text-align: justify; - padding: 4px; -} - -#content > input[type=submit], #content > input[type=button] { - margin-top: 4px; -} - -#content table input[type=submit], #content table input[type=button] { - margin-top: 0; -} - -#contentButtons { - margin: 4px auto 0; -} - -#contentButtons input, #contentButtons a { - margin: 0 4px; -} - -#footer { - width: 98%; - margin: 4px auto 0; - clear: both; -} - diff --git a/web/skins/mobile/includes/config.php b/web/skins/mobile/includes/config.php deleted file mode 100644 index fc1eba9bb..000000000 --- a/web/skins/mobile/includes/config.php +++ /dev/null @@ -1,63 +0,0 @@ - "50x", - "2000" => "20x", - "500" => "5x", - "200" => "2x", - "100" => translate('Real'), - "50" => "1/2x", -); - -$scales = array( - "400" => "4x", - "300" => "3x", - "200" => "2x", - "150" => "1.5x", - "100" => translate('Actual'), - "75" => "3/4x", - "50" => "1/2x", - "33" => "1/3x", - "25" => "1/4x", -); - -switch ( $_COOKIE['zmBandwidth'] ) -{ - case "phone" : // Very incomplete at present - { - define( "ZM_WEB_CAN_STREAM", ZM_WEB_P_CAN_STREAM ); // Override the automatic detection of browser streaming capability - define( "ZM_WEB_STREAM_METHOD", ZM_WEB_P_STREAM_METHOD ); // Which method should be used to send video streams to your brow - define( "ZM_WEB_DEFAULT_SCALE", ZM_WEB_P_DEFAULT_SCALE ); // What the default scaling factor applied to 'live' or 'event' views is (%) - define( "ZM_WEB_DEFAULT_RATE", ZM_WEB_P_DEFAULT_RATE ); // What the default replay rate factor applied to 'event' views is (%) - define( "ZM_WEB_VIDEO_BITRATE", ZM_WEB_P_VIDEO_BITRATE ); // What the bitrate of any streamed video should be - define( "ZM_WEB_VIDEO_MAXFPS", ZM_WEB_P_VIDEO_MAXFPS ); // What the maximum frame rate of any streamed video should be - define( "ZM_WEB_SCALE_THUMBS", ZM_WEB_P_SCALE_THUMBS ); // Image scaling for thumbnails, bandwidth versus cpu in rescaling - define( "ZM_WEB_AJAX_TIMEOUT", ZM_WEB_P_AJAX_TIMEOUT ); // Timeout to use for Ajax requests, no timeout used if unset - - break; - } -} - -?> diff --git a/web/skins/mobile/includes/control_functions.php b/web/skins/mobile/includes/control_functions.php deleted file mode 100644 index 3a12cf467..000000000 --- a/web/skins/mobile/includes/control_functions.php +++ /dev/null @@ -1,184 +0,0 @@ - -
-
-
- -
- - " name="preset" value=""/> - -
-
-
-
- diff --git a/web/skins/mobile/includes/functions.php b/web/skins/mobile/includes/functions.php deleted file mode 100644 index aadbe435f..000000000 --- a/web/skins/mobile/includes/functions.php +++ /dev/null @@ -1,66 +0,0 @@ -'."\n" ); -?> - - - - <?php echo ZM_WEB_TITLE_PREFIX ?> - <?php echo $title ?> - - - - - - - - - - - diff --git a/web/skins/mobile/includes/init.php b/web/skins/mobile/includes/init.php deleted file mode 100644 index ae92bcdee..000000000 --- a/web/skins/mobile/includes/init.php +++ /dev/null @@ -1,29 +0,0 @@ - diff --git a/web/skins/mobile/skin.php b/web/skins/mobile/skin.php deleted file mode 100644 index 51ea63e01..000000000 --- a/web/skins/mobile/skin.php +++ /dev/null @@ -1,97 +0,0 @@ -GetDeviceCapabilitiesFromAgent($_SERVER['HTTP_USER_AGENT']); - - //print_r( $wurfl->wurfl_agent ); - if ( $wurfl->wurfl_agent ) - { - if ( $wurfl->getDeviceCapability( 'html_wi_oma_xhtmlmp_1_0' ) ) - { - $device['width'] = $wurfl->getDeviceCapability( 'resolution_width' ); - $device['height'] = $wurfl->getDeviceCapability( 'resolution_height' ); - } - } -} -else -{ - // This is an example of using fixed device strings to just match your phone etc - $devices = array( - array( 'name'=>"Motorola V600", 'ua_match'=>"MOT-V600", 'skin'=>"mobile", 'cookies'=>false, 'width'=>176, 'height'=>220 ), - ); - - foreach ( $devices as $tempDevice ) - { - if ( preg_match( '/'.$tempDevice['ua_match'].'/', $_SERVER['HTTP_USER_AGENT'] ) ) - { - $skin = $tempDevice['skin']; - $cookies = $tempDevice['cookies']; - break; - } - } -} - -foreach ( getSkinIncludes( 'includes/config.php' ) as $includeFile ) - require_once $includeFile; - -foreach ( getSkinIncludes( 'includes/functions.php' ) as $includeFile ) - require_once $includeFile; - -if ( empty($view) ) - $view = isset($user)?'console':'login'; - -if ( !isset($user) && ZM_OPT_USE_AUTH && ZM_AUTH_TYPE == "remote" && !empty( $_SERVER['REMOTE_USER']) ) -{ - $view = "postlogin"; - $action = "login"; - $_REQUEST['username'] = $_SERVER['REMOTE_USER']; -} - -// If there are additional actions -foreach ( getSkinIncludes( 'includes/actions.php' ) as $includeFile ) - require_once $includeFile; - -?> diff --git a/web/skins/mobile/views/console.php b/web/skins/mobile/views/console.php deleted file mode 100644 index 50b5f4775..000000000 --- a/web/skins/mobile/views/console.php +++ /dev/null @@ -1,178 +0,0 @@ - array( - "terms" => array( - array( "attr" => "Archived", "op" => "=", "val" => "0" ), - array( "cnj" => "and", "attr" => "DateTime", "op" => ">=", "val" => "-1 hour" ), - ) - ), - ), - // Today - array( - "filter" => array( - "terms" => array( - array( "attr" => "Archived", "op" => "=", "val" => "0" ), - array( "cnj" => "and", "attr" => "DateTime", "op" => ">=", "val" => "today" ), - ) - ), - ), -); - -$running = daemonCheck(); -$status = $running?translate('Running'):translate('Stopped'); - -if ( $group = dbFetchOne( "select * from Groups where Name = 'Mobile'" ) ) - $groupIds = array_flip(explode( ',', $group['MonitorIds'] )); - -$maxWidth = 0; -$maxHeight = 0; -$cycleCount = 0; -$monitors = dbFetchAll( "select * from Monitors order by Sequence asc" ); -for ( $i = 0; $i < count($monitors); $i++ ) -{ - if ( !visibleMonitor( $monitors[$i]['Id'] ) ) - { - continue; - } - if ( $group && !empty($groupIds) && !array_key_exists( $monitors[$i]['Id'], $groupIds ) ) - { - continue; - } - $monitors[$i]['Show'] = true; - $monitors[$i]['zmc'] = zmcStatus( $monitors[$i] ); - $monitors[$i]['zma'] = zmaStatus( $monitors[$i] ); - $counts = array(); - for ( $j = 0; $j < count($eventCounts); $j++ ) - { - $filter = addFilterTerm( $eventCounts[$j]['filter'], count($eventCounts[$j]['filter']['terms']), array( "cnj" => "and", "attr" => "MonitorId", "op" => "=", "val" => $monitors[$i]['Id'] ) ); - parseFilter( $filter, false, '&' ); - $counts[] = "count(if(1".$filter['sql'].",1,NULL)) as EventCount$j"; - $monitors[$i]['eventCounts'][$j]['filter'] = $filter; - } - $sql = "select ".join($counts,", ")." from Events as E where MonitorId = '".$monitors[$i]['Id']."'"; - $counts = dbFetchOne( $sql ); - if ( $monitors[$i]['Function'] != 'None' ) - { - $cycleCount++; - if ( $maxWidth < $monitors[$i]['Width'] ) $maxWidth = $monitors[$i]['Width']; - if ( $maxHeight < $monitors[$i]['Height'] ) $maxHeight = $monitors[$i]['Height']; - } - $monitors[$i] = array_merge( $monitors[$i], $counts ); -} - -xhtmlHeaders( __FILE__, translate('Console') ); -?> - -
- -
- - - - - - - - - - - - - - - - - 1 ) { -?> - - - - - - - -
".substr( $monitor['Function'], 0, 4 )."", canEdit( 'Monitors' ) ) ?>
  
-
-
- - diff --git a/web/skins/mobile/views/css/console.css b/web/skins/mobile/views/css/console.css deleted file mode 100644 index 49c711039..000000000 --- a/web/skins/mobile/views/css/console.css +++ /dev/null @@ -1,16 +0,0 @@ -#systemTime { - float: left; -} - -#systemState { - margin: 0 auto; - text-align: center; -} - -#systemStats { - float: right; -} - -td.colEvents { - text-align: right; -} diff --git a/web/skins/mobile/views/devices.php b/web/skins/mobile/views/devices.php deleted file mode 100644 index add0a6bc5..000000000 --- a/web/skins/mobile/views/devices.php +++ /dev/null @@ -1,73 +0,0 @@ - - -
- -
- - - - - - - - -
-

-
-
- - diff --git a/web/skins/mobile/views/error.php b/web/skins/mobile/views/error.php deleted file mode 100644 index 33e99f09a..000000000 --- a/web/skins/mobile/views/error.php +++ /dev/null @@ -1,34 +0,0 @@ - - -
- -
-

-

-
-
- - diff --git a/web/skins/mobile/views/event.php b/web/skins/mobile/views/event.php deleted file mode 100644 index ead6b6eae..000000000 --- a/web/skins/mobile/views/event.php +++ /dev/null @@ -1,147 +0,0 @@ -= ?".$_REQUEST['filter']['sql'].$midSql." order by $sortColumn asc"; -} -$result = dbQuery( $sql, array( $event[$_REQUEST['sort_field']] ) ); -while ( $row = dbFetchNext( $result ) ) -{ - if ( $row['Id'] == $_REQUEST['eid'] ) - { - $prevEvent = dbFetchNext( $result ); - break; - } -} - -$sql = "select E.* from Events as E inner join Monitors as M on E.MonitorId = M.Id where $sortColumn ".($sortOrder=='asc'?'>=':'<=').' ?'.$_REQUEST['filter']['sql'].$midSql." order by $sortColumn $sortOrder"; -$result = dbQuery( $sql, array($event[$_REQUEST['sort_field']]) ); -while ( $row = dbFetchNext( $result ) ) -{ - if ( $row['Id'] == $_REQUEST['eid'] ) - { - $nextEvent = dbFetchNext( $result ); - break; - } -} - -$framesPerPage = 15; -$framesPerLine = 3; -$maxShortcuts = 3; - -$paged = $event['Frames'] > $framesPerPage; - -if ( $paged && !empty($_REQUEST['page']) ) -{ - $loFrameId = (($_REQUEST['page']-1)*$framesPerPage)+1; - $hiFrameId = min( $_REQUEST['page']*$framesPerPage, $event['Frames'] ); -} -else -{ - $loFrameId = 1; - $hiFrameId = $event['Frames']; -} - -$sql = 'SELECT * FROM Frames WHERE EventID = ?'; -if ( $paged && !empty($_REQUEST['page']) ) - $sql .= " and FrameId between $loFrameId and $hiFrameId"; -$sql .= " order by FrameId"; -$frames = dbFetchAll( $sql, NULL, array( $_REQUEST['eid'] ) ); - -$scale = getDeviceScale( $event['Width'], $event['Height'], $framesPerLine+0.3 ); - -$pages = (int)ceil($event['Frames']/$framesPerPage); -if ( !empty($_REQUEST['fid']) ) - $_REQUEST['page'] = ($_REQUEST['fid']/$framesPerPage)+1; - -$pagination = getPagination( $pages, $_REQUEST['page'], $maxShortcuts, '&eid='.$_REQUEST['eid'].$filterQuery.$sortQuery, '&' ); - -xhtmlHeaders( __FILE__, translate('Event').' - '.$event['Name'] ); -?> - -
- -
- -

- -
- - <?php echo $frame['Type'] ?>/<?php echo $frame['Type']=='Alarm'?$frame['Score']:0 ?> - -
-
-
- - diff --git a/web/skins/mobile/views/eventdetails.php b/web/skins/mobile/views/eventdetails.php deleted file mode 100644 index deee5eef2..000000000 --- a/web/skins/mobile/views/eventdetails.php +++ /dev/null @@ -1,86 +0,0 @@ - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
s
()
//
-
- 1 - <?php echo $frame['FrameId'] ?> -
-
- - -
-
-
- - diff --git a/web/skins/mobile/views/events.php b/web/skins/mobile/views/events.php deleted file mode 100644 index 40dd6eff8..000000000 --- a/web/skins/mobile/views/events.php +++ /dev/null @@ -1,157 +0,0 @@ -$deviceLines)?$deviceLines:$limitLeft; - } - $eventsSql .= " limit $limitStart, $limitAmount"; -} -elseif ( !empty( $_REQUEST['limit'] ) ) -{ - $eventsSql .= " limit 0, ".$_REQUEST['limit']; -} - -$nEvents = dbFetchOne( $countSql, 'EventCount' ); -if ( !empty($limit) && $nEvents > $_REQUEST['limit'] ) -{ - $nEvents = $_REQUEST['limit']; -} -$pages = (int)ceil($nEvents/$deviceLines); - -$maxShortcuts = 3; -$pagination = getPagination( $pages, $_REQUEST['page'], $maxShortcuts, $filterQuery.$sortQuery.'&limit='.$_REQUEST['limit'], '&' ); - -xhtmlHeaders( __FILE__, translate('Events') ); -?> - -
- -
- -

- - - - - - - - - - - - - - - - - - - -
-

-
-
- - diff --git a/web/skins/mobile/views/filter.php b/web/skins/mobile/views/filter.php deleted file mode 100644 index 4613f3c3c..000000000 --- a/web/skins/mobile/views/filter.php +++ /dev/null @@ -1,71 +0,0 @@ - - -
- -
-
- - 0 ) -{ -?> -
- -
-
- -
- -

- -
-
-
- - diff --git a/web/skins/mobile/views/frame.php b/web/skins/mobile/views/frame.php deleted file mode 100644 index f9bb41633..000000000 --- a/web/skins/mobile/views/frame.php +++ /dev/null @@ -1,73 +0,0 @@ - - -
- -
- "> -
- 1 ) { ?> - << - 1 ) { ?> - < - - > - - >> - -
-
-
- - diff --git a/web/skins/mobile/views/function.php b/web/skins/mobile/views/function.php deleted file mode 100644 index 421d91063..000000000 --- a/web/skins/mobile/views/function.php +++ /dev/null @@ -1,66 +0,0 @@ - - -
- -
-
- -
- -
-
- checked="checked"/> -
-
- -
-
-
-
- - diff --git a/web/skins/mobile/views/login.php b/web/skins/mobile/views/login.php deleted file mode 100644 index 6eb0b7db9..000000000 --- a/web/skins/mobile/views/login.php +++ /dev/null @@ -1,54 +0,0 @@ - - -
- -
-
- - - - - - - - - - -
" size="12"/>
-
- -
-
-
-
- - diff --git a/web/skins/mobile/views/montage.php b/web/skins/mobile/views/montage.php deleted file mode 100644 index 8311fe6f4..000000000 --- a/web/skins/mobile/views/montage.php +++ /dev/null @@ -1,75 +0,0 @@ - - -
- -
-
- - <?php echo $monitor['Name'] ?> - -
-
-
-
- - diff --git a/web/skins/mobile/views/state.php b/web/skins/mobile/views/state.php deleted file mode 100644 index 51cf71624..000000000 --- a/web/skins/mobile/views/state.php +++ /dev/null @@ -1,77 +0,0 @@ - - -
- -
-
- - -
- -
-
-
-
- - diff --git a/web/skins/mobile/views/video.php b/web/skins/mobile/views/video.php deleted file mode 100644 index 8f7ac8654..000000000 --- a/web/skins/mobile/views/video.php +++ /dev/null @@ -1,226 +0,0 @@ -= 352 && $deviceHeight >= 288 ) - $videoSize = "352x288"; -elseif ( $deviceWidth >= 176 && $deviceHeight >= 144 ) - $videoSize = "176x144"; -else - $videoSize = "128x96"; - -$eventWidth = $event['Width']; -$eventHeight = $event['Height']; - -if ( !isset( $rate ) ) - $_REQUEST['rate'] = reScale( RATE_BASE, $event['DefaultRate'], ZM_WEB_DEFAULT_RATE ); - -$eventPath = ZM_DIR_EVENTS.'/'.getEventPath( $event ); - -$videoFormats = array(); -$ffmpegFormats = preg_split( '/\s+/', ZM_FFMPEG_FORMATS ); -foreach ( $ffmpegFormats as $ffmpegFormat ) -{ - preg_match( '/^([^*]+)(\**)$/', $ffmpegFormat, $matches ); - $videoFormats[$matches[1]] = $matches[1]; - if ( $matches[2] == '*' ) - $defaultVideoFormat = $matches[1]; - elseif ( $matches[2] == '**' ) - $defaultPhoneFormat = $matches[1]; -} -if ( !isset($_REQUEST['videoFormat']) ) -{ - if ( isset($defaultPhoneFormat) ) - $_REQUEST['videoFormat'] = $defaultPhoneFormat; - elseif ( isset($defaultVideoFormat) ) - $_REQUEST['videoFormat'] = $defaultVideoFormat; - else - $videoFormat = $ffmpegFormats[0]; -} - -if ( !empty($_REQUEST['generate']) ) -{ - $videoFile = createVideo( $event, $_REQUEST['videoFormat'], $_REQUEST['rate'], $videoSize, !empty($_REQUEST['overwrite']) ); -} - -$videoFiles = array(); -if ( $dir = opendir( $eventPath ) ) -{ - while ( ($file = readdir( $dir )) !== false ) - { - $file = $eventPath.'/'.$file; - if ( is_file( $file ) ) - { - if ( preg_match( '/-S([\da-z]+)\.(?:'.join( '|', $videoFormats ).')$/', $file, $matches ) ) - { - if ( $matches[1] == $videoSize ) - { - $videoFiles[] = $file; - } - } - } - } - closedir( $dir ); -} - -if ( isset($_REQUEST['download']) ) -{ - header( "Content-type: ".getMimeType($videoFiles[$_REQUEST['download']])); - header( "Content-length: ".filesize($videoFiles[$_REQUEST['download']])); - header( "Content-disposition: attachment; filename=".preg_replace( "/^.*\//", "", $videoFiles[$_REQUEST['download']] )."; size=".filesize($videoFiles[$_REQUEST['download']]) ); - readfile( $videoFiles[$_REQUEST['download']] ); - exit; -} - -xhtmlHeaders( __FILE__, translate('Video').' - '.$event['Name'] ); -?> - -
-
-
- - - - - - - - - - - - - - -
checked="checked"/>
-
-
- -

- -

- - -

- - - - - - - - - 0 ) - { - $index = 0; - foreach ( $videoFiles as $file ) - { - preg_match( '/^(.+)-((?:r[_\d]+)|(?:F[_\d]+))-((?:s[_\d]+)|(?:S[0-9a-z]+))\.([^.]+)$/', $file, $matches ); - if ( preg_match( '/^r(.+)$/', $matches[2], $temp_matches ) ) - { - $rate = (int)(100 * preg_replace( '/_/', '.', $temp_matches[1] ) ); - $rateText = isset($rates[$rate])?$rates[$rate]:($rate."x"); - } - elseif ( preg_match( '/^F(.+)$/', $matches[2], $temp_matches ) ) - { - $rateText = $temp_matches[1]."fps"; - } - if ( preg_match( '/^s(.+)$/', $matches[3], $temp_matches ) ) - { - $scale = (int)(100 * preg_replace( '/_/', '.', $temp_matches[1] ) ); - $scaleText = isset($scales[$scale])?$scales[$scale]:($scale."x"); - } - elseif ( preg_match( '/^S(.+)$/', $matches[3], $temp_matches ) ) - { - $scaleText = $temp_matches[1]; - } -?> - - - - - - - - -
 / 
- -

- -
-
- - diff --git a/web/skins/mobile/views/watch.php b/web/skins/mobile/views/watch.php deleted file mode 100644 index b61001db9..000000000 --- a/web/skins/mobile/views/watch.php +++ /dev/null @@ -1,154 +0,0 @@ - - -
-
-

 -  fps

-

- - - -

- -
- -
- -
- - - -
- -
-
- - From 7c7d7b245c09e31c5bd362b10422d672259ddd93 Mon Sep 17 00:00:00 2001 From: SteveGilvarry Date: Tue, 29 Dec 2015 01:38:16 +1100 Subject: [PATCH 20/90] Remove the XML skin folder --- web/skins/xml/includes/config.php | 155 ---------- web/skins/xml/includes/functions.php | 447 --------------------------- web/skins/xml/includes/init.php | 2 - web/skins/xml/skin.php | 47 --- web/skins/xml/views/actions.php | 392 ----------------------- web/skins/xml/views/console.php | 259 ---------------- web/skins/xml/views/none.php | 0 web/skins/xml/views/notfound.png | Bin 7332 -> 0 bytes 8 files changed, 1302 deletions(-) delete mode 100644 web/skins/xml/includes/config.php delete mode 100644 web/skins/xml/includes/functions.php delete mode 100644 web/skins/xml/includes/init.php delete mode 100644 web/skins/xml/skin.php delete mode 100644 web/skins/xml/views/actions.php delete mode 100644 web/skins/xml/views/console.php delete mode 100644 web/skins/xml/views/none.php delete mode 100644 web/skins/xml/views/notfound.png diff --git a/web/skins/xml/includes/config.php b/web/skins/xml/includes/config.php deleted file mode 100644 index 66d3af5ee..000000000 --- a/web/skins/xml/includes/config.php +++ /dev/null @@ -1,155 +0,0 @@ - "100x", - "5000" => "50x", - "2500" => "25x", - "1000" => "10x", - "400" => "4x", - "200" => "2x", - "100" => translate('Real'), - "50" => "1/2x", - "25" => "1/4x", -); - -$scales = array( - "400" => "4x", - "300" => "3x", - "200" => "2x", - "150" => "1.5x", - "100" => translate('Actual'), - "75" => "3/4x", - "50" => "1/2x", - "33" => "1/3x", - "25" => "1/4x", -); - -$bwArray = array( - "high" => translate('High'), - "medium" => translate('Medium'), - "low" => translate('Low') -); - -/* Check if ZM_WEB_L_CAN_STREAM and ZM_WEB_L_STREAM_METHOD are defined */ -if (!defined("ZM_WEB_L_CAN_STREAM")) { - define ("ZM_WEB_L_CAN_STREAM", 1); - define ("ZM_WEB_M_CAN_STREAM", 1); - define ("ZM_WEB_H_CAN_STREAM", 1); -} -if (!defined("ZM_WEB_L_STREAM_METHOD")) { - define ("ZM_WEB_L_STREAM_METHOD", "jpeg"); - define ("ZM_WEB_M_STREAM_METHOD", "jpeg"); - define ("ZM_WEB_H_STREAM_METHOD", "jpeg"); -} - -switch ( $_COOKIE['zmBandwidth'] ) -{ - case "high" : - { - define( "ZM_WEB_REFRESH_MAIN", ZM_WEB_H_REFRESH_MAIN ); // How often (in seconds) the main console window refreshes - define( "ZM_WEB_REFRESH_CYCLE", ZM_WEB_H_REFRESH_CYCLE ); // How often the cycle watch windows swaps to the next monitor - define( "ZM_WEB_REFRESH_IMAGE", ZM_WEB_H_REFRESH_IMAGE ); // How often the watched image is refreshed (if not streaming) - define( "ZM_WEB_REFRESH_STATUS", ZM_WEB_H_REFRESH_STATUS ); // How often the little status frame refreshes itself in the watch window - define( "ZM_WEB_REFRESH_EVENTS", ZM_WEB_H_REFRESH_EVENTS ); // How often the event listing is refreshed in the watch window, only for recent events - define( "ZM_WEB_CAN_STREAM", ZM_WEB_H_CAN_STREAM ); // Override the automatic detection of browser streaming capability - define( "ZM_WEB_STREAM_METHOD", ZM_WEB_H_STREAM_METHOD ); // Which method should be used to send video streams to your browser - define( "ZM_WEB_DEFAULT_SCALE", ZM_WEB_H_DEFAULT_SCALE ); // What the default scaling factor applied to 'live' or 'event' views is (%) - define( "ZM_WEB_DEFAULT_RATE", ZM_WEB_H_DEFAULT_RATE ); // What the default replay rate factor applied to 'event' views is (%) - define( "ZM_WEB_VIDEO_BITRATE", ZM_WEB_H_VIDEO_BITRATE ); // What the bitrate of any streamed video should be - define( "ZM_WEB_VIDEO_MAXFPS", ZM_WEB_H_VIDEO_MAXFPS ); // What the maximum frame rate of any streamed video should be - define( "ZM_WEB_SCALE_THUMBS", ZM_WEB_H_SCALE_THUMBS ); // Image scaling for thumbnails, bandwidth versus cpu in rescaling - define( "ZM_WEB_EVENTS_VIEW", ZM_WEB_H_EVENTS_VIEW ); // What the default view of multiple events should be. - define( "ZM_WEB_SHOW_PROGRESS", ZM_WEB_H_SHOW_PROGRESS ); // Whether to show the progress of replay in event view. - define( "ZM_WEB_AJAX_TIMEOUT", ZM_WEB_H_AJAX_TIMEOUT ); // Timeout to use for Ajax requests, no timeout used if unset - break; - } - case "medium" : - { - define( "ZM_WEB_REFRESH_MAIN", ZM_WEB_M_REFRESH_MAIN ); // How often (in seconds) the main console window refreshes - define( "ZM_WEB_REFRESH_CYCLE", ZM_WEB_M_REFRESH_CYCLE ); // How often the cycle watch windows swaps to the next monitor - define( "ZM_WEB_REFRESH_IMAGE", ZM_WEB_M_REFRESH_IMAGE ); // How often the watched image is refreshed (if not streaming) - define( "ZM_WEB_REFRESH_STATUS", ZM_WEB_M_REFRESH_STATUS ); // How often the little status frame refreshes itself in the watch window - define( "ZM_WEB_REFRESH_EVENTS", ZM_WEB_M_REFRESH_EVENTS ); // How often the event listing is refreshed in the watch window, only for recent events - define( "ZM_WEB_CAN_STREAM", ZM_WEB_M_CAN_STREAM ); // Override the automatic detection of browser streaming capability - define( "ZM_WEB_STREAM_METHOD", ZM_WEB_M_STREAM_METHOD ); // Which method should be used to send video streams to your browser - define( "ZM_WEB_DEFAULT_SCALE", ZM_WEB_M_DEFAULT_SCALE ); // What the default scaling factor applied to 'live' or 'event' views is (%) - define( "ZM_WEB_DEFAULT_RATE", ZM_WEB_M_DEFAULT_RATE ); // What the default replay rate factor applied to 'event' views is (%) - define( "ZM_WEB_VIDEO_BITRATE", ZM_WEB_M_VIDEO_BITRATE ); // What the bitrate of any streamed video should be - define( "ZM_WEB_VIDEO_MAXFPS", ZM_WEB_M_VIDEO_MAXFPS ); // What the maximum frame rate of any streamed video should be - define( "ZM_WEB_SCALE_THUMBS", ZM_WEB_M_SCALE_THUMBS ); // Image scaling for thumbnails, bandwidth versus cpu in rescaling - define( "ZM_WEB_EVENTS_VIEW", ZM_WEB_M_EVENTS_VIEW ); // What the default view of multiple events should be. - define( "ZM_WEB_SHOW_PROGRESS", ZM_WEB_M_SHOW_PROGRESS ); // Whether to show the progress of replay in event view. - define( "ZM_WEB_AJAX_TIMEOUT", ZM_WEB_M_AJAX_TIMEOUT ); // Timeout to use for Ajax requests, no timeout used if unset - break; - } - case "low" : - { - define( "ZM_WEB_REFRESH_MAIN", ZM_WEB_L_REFRESH_MAIN ); // How often (in seconds) the main console window refreshes - define( "ZM_WEB_REFRESH_CYCLE", ZM_WEB_L_REFRESH_CYCLE ); // How often the cycle watch windows swaps to the next monitor - define( "ZM_WEB_REFRESH_IMAGE", ZM_WEB_L_REFRESH_IMAGE ); // How often the watched image is refreshed (if not streaming) - define( "ZM_WEB_REFRESH_STATUS", ZM_WEB_L_REFRESH_STATUS ); // How often the little status frame refreshes itself in the watch window - define( "ZM_WEB_REFRESH_EVENTS", ZM_WEB_L_REFRESH_EVENTS ); // How often the event listing is refreshed in the watch window, only for recent events - define( "ZM_WEB_CAN_STREAM", ZM_WEB_L_CAN_STREAM ); // Override the automatic detection of browser streaming capability - define( "ZM_WEB_STREAM_METHOD", ZM_WEB_L_STREAM_METHOD ); // Which method should be used to send video streams to your browser - define( "ZM_WEB_DEFAULT_SCALE", ZM_WEB_L_DEFAULT_SCALE ); // What the default scaling factor applied to 'live' or 'event' views is (%) - define( "ZM_WEB_DEFAULT_RATE", ZM_WEB_L_DEFAULT_RATE ); // What the default replay rate factor applied to 'event' views is (%) - define( "ZM_WEB_VIDEO_BITRATE", ZM_WEB_L_VIDEO_BITRATE ); // What the bitrate of any streamed video should be - define( "ZM_WEB_VIDEO_MAXFPS", ZM_WEB_L_VIDEO_MAXFPS ); // What the maximum frame rate of any streamed video should be - define( "ZM_WEB_SCALE_THUMBS", ZM_WEB_L_SCALE_THUMBS ); // Image scaling for thumbnails, bandwidth versus cpu in rescaling - define( "ZM_WEB_EVENTS_VIEW", ZM_WEB_L_EVENTS_VIEW ); // What the default view of multiple events should be. - define( "ZM_WEB_SHOW_PROGRESS", ZM_WEB_L_SHOW_PROGRESS ); // Whether to show the progress of replay in event view. - define( "ZM_WEB_AJAX_TIMEOUT", ZM_WEB_L_AJAX_TIMEOUT ); // Timeout to use for Ajax requests, no timeout used if unset - break; - } -} - -?> diff --git a/web/skins/xml/includes/functions.php b/web/skins/xml/includes/functions.php deleted file mode 100644 index b84e65464..000000000 --- a/web/skins/xml/includes/functions.php +++ /dev/null @@ -1,447 +0,0 @@ - $maj) return 1; - if ((getClientVerMaj() == $maj) && (getClientVerMin() >= $min)) return 1; - return 0; -} -function logXmlErr($str) -{ - logXml($str, 1); -} -function logXml($str, $err = 0) -{ - if (!defined("ZM_EYEZM_DEBUG")) { - /* Check session variable */ - if (isset($_SESSION['xml_debug'])) define("ZM_EYEZM_DEBUG", $_SESSION['xml_debug']); - else define ("ZM_EYEZM_DEBUG", "0"); - } - if (!defined("ZM_EYEZM_LOG_TO_FILE")) { - /* Check session variable */ - if (isset($_SESSION['xml_log_to_file'])) define("ZM_EYEZM_LOG_TO_FILE", $_SESSION['xml_log_to_file']); - else define ("ZM_EYEZM_LOG_TO_FILE", "1"); - } - if (!defined("ZM_EYEZM_LOG_FILE")) { - /* Check session variable */ - if (isset($_SESSION['xml_log_file'])) define("ZM_EYEZM_LOG_FILE", $_SESSION['xml_log_file']); - else define ("ZM_EYEZM_LOG_FILE", "/tmp/zm_xml.log"); - } - /* Only log if debug is enabled */ - if (ZM_EYEZM_DEBUG == 0) return; - /* Logging is enabled, set log string */ - $logstr = "XML_LOG (".($err?"ERROR":"NOTICE")."): ".$str.(ZM_EYEZM_LOG_TO_FILE?"\n":""); - if (ZM_EYEZM_LOG_TO_FILE) { - error_log("[".date("r")."] ".$logstr, 3, ZM_EYEZM_LOG_FILE); - } else { - error_log($logstr); - } -} -/* Returns defval if varname is not set, otherwise return varname */ -function getset($varname, $defval) -{ - if (isset($_GET[$varname])) return $_GET[$varname]; - return $defval; -} -function xml_header() -{ - header ("content-type: text/xml"); - echo ""; -} -function xml_tag_val($tag, $val) -{ - echo "<".$tag.">".$val.""; -} -function xml_tag_sec($tag, $open) -{ - if ($open) $tok = "<"; - else $tok = ""; -} -function xhtmlHeaders( $file, $title ) -{ -?> - - - - - - - /dev/null")) > 0) { - /* More than one match */ - return TRUE; - } else { - /* Check -formats tag also if we fail -codecs */ - if (preg_match("/\b".$codec."\b/", shell_exec(getFfmpegPath()." -formats 2> /dev/null")) > 0) return TRUE; - return FALSE; - } -} -function exeExists($exepath) -{ - $path = trim($exepath); - return (file_exists($path) && is_readable($path) && ($path != "")); -} -/* Returns whether ffmpeg exists or not */ -function ffmpegExists() -{ - return exeExists(getFfmpegPath()); -} -/* Returns with PHP-GD exists */ -function gdExists() -{ - if (extension_loaded('gd') && function_exists('gd_info')) { - return TRUE; - } - return FALSE; -} - -function getFfmpeg264FoutParms($br, $fout) -{ - $ffparms = "-analyzeduration 0 -acodec copy"; - $ffparms .= " -vcodec libx264 -b ".$br; - $ffparms .= " -flags +loop -cmp +chroma -partitions +parti4x4+partp8x8+partb8x8"; - $ffparms .= " -subq 5 -trellis 1 -refs 1 -coder 0 -me_range 16 -keyint_min 25"; - $ffparms .= " -sc_threshold 40 -i_qfactor 0.71 -bt 16k"; - $ffparms .= " -rc_eq 'blurCplx^(1-qComp)' -qcomp 0.6"; - $ffparms .= " -qmin 10 -qmax 51 -qdiff 4 -level 30"; - $ffparms .= " -g 30 -analyzeduration 0 -async 2 ".$fout." 2> /dev/null"; - return $ffparms; -} -/** Return FFMPEG parameters for H264 streaming */ -function getFfmpeg264Str($width, $height, $br, $fin, $fout) -{ - $ffparms = getFfmpeg264FoutParms($br, $fout); - $ffstr = getFfmpegPath()." -t ".ZM_EYEZM_H264_MAX_DURATION." -analyzeduration 0 -i "; - $ffstr .= $fin." -f mpegts ".$ffparms; - return $ffstr; -} -/** Returns true when monitor exists */ -function isMonitor($monitor) -{ - $query = "select Id from Monitors where Id = ?"; - $res = dbFetchOne($query, NULL, array($monitor)); - if ($res) return TRUE; - logXml("Monitor ID ".$monitor." does not exist"); - return FALSE; -} -/** Returns the width and height of a monitor */ -function getMonitorDims($monitor) -{ - $query = "select Width,Height from Monitors where Id = ?"; - $res = dbFetchOne($query, NULL, array( $monitor ) ); - return $res; -} -/** Returns the temp directory for H264 encoding */ -function getTempDir() -{ - /* Assume that the directory structure is /skins/xml/views */ - return dirname(__FILE__)."/../../../temp"; -} -/** Returns the name of the m3u8 playlist based on monitor */ -function m3u8fname($monitor) { - return "stream_".$monitor.".m3u8"; -} - -/** Erases the M3u8 and TS file names for a given monitor */ -function eraseH264Files($monitor) { - /** NOTE: This command executes an 'rm' command, so $monitor parameter - * should be properly validated before executing */ - /* Remove wdir/.m3u8 and wdir/sample_*.ts */ - shell_exec("rm -f ".getTempDir()."/".m3u8fname($monitor)." ".getTempDir()."/sample_".$monitor."*.ts"); -} -function kill264proc($monitor) { - /** NOTE: This command executes an 'kill' command, so $monitor parameter - * should be properly validated before executing */ - $pid = trim(shell_exec("pgrep -f -x \"zmstreamer -m ".$monitor."\"")); - if ($pid == "") { - logXml("No PID found for ZMStreamer to kill"); - } else { - shell_exec("kill -9 ".$pid); - logXml("Killed process ".$pid." for Monitor ".$monitor); - } -} -/** Return the command-line shell function to setup H264 stream */ -function stream264fn ($mid, $width, $height, $br) { - $cdir = "./temp"; - $zmstrm = "zmstreamer -m ".$mid." 2> /dev/null"; - $ffstr = getFfmpeg264Str($width, $height, $br, "-", "-"); - $seg = "segmenter - ".ZM_EYEZM_SEG_DURATION." ".$cdir."/sample_".$mid." ".$cdir."/".m3u8fname($mid)." ../ 2> /dev/null"; - $url = $zmstrm . " | ".$ffstr." | " . $seg; - return "nohup ".$url." & echo $!"; -} - -/** Generate the web-page presented to the viewer when using H264 */ -function h264vidHtml($width, $height, $monitor, $br, $thumbsrc) { - function printTermLink() { - $str = "H264 Streaming Launching...
Tap to re-load if stream fails"; - $str2 = "document.getElementById(\"loaddiv\").innerHTML = \"".$str."\";"; - echo $str2; - - } - $ajaxUrl = "?view=actions&action=spawn264&&monitor=".$monitor."&br=".$br; - /* Call these two directly to bypass server blocking issues */ - $ajax2Url = "./skins/xml/views/actions.php?action=chk264&monitor=".$monitor; - $ajax2Url .= "&timeout=".ZM_EYEZM_H264_TIMEOUT; - $ajax3Url = "./skins/xml/views/actions.php?action=kill264&monitor=".$monitor; -?> - - - - - - - -
-
-Initializing H264 Stream ()...
-This may take a few seconds -
-
- -
- -
- - - diff --git a/web/skins/xml/includes/init.php b/web/skins/xml/includes/init.php deleted file mode 100644 index acb6c3546..000000000 --- a/web/skins/xml/includes/init.php +++ /dev/null @@ -1,2 +0,0 @@ - diff --git a/web/skins/xml/skin.php b/web/skins/xml/skin.php deleted file mode 100644 index c88718c4e..000000000 --- a/web/skins/xml/skin.php +++ /dev/null @@ -1,47 +0,0 @@ - diff --git a/web/skins/xml/views/actions.php b/web/skins/xml/views/actions.php deleted file mode 100644 index 73e206af6..000000000 --- a/web/skins/xml/views/actions.php +++ /dev/null @@ -1,392 +0,0 @@ - */ - if (!canEdit('Events')) { - logXmlErr("User ".$user['Username']. " doesn't have edit Events perms"); - exit; - } - if (!isset($_REQUEST['eid'])) { - logXmlErr("EID not set for action delete-event"); - exit; - } - $eid = validInteger($_REQUEST['eid']); - $url = "./index.php?view=request&request=event&id=".$eid."&action=delete"; - header("Location: ".$url); - exit; - - } else if (!strcmp($action, "spawn264")) { - /* ACTION: Spawn 264 streaming process. - * Parms: [br|width|height] */ - if (!canView('Stream')) { - logXmlErr("User ".$user['Username']. " doesn't have view Stream perms"); - exit; - } - if (!isset($_GET['monitor'])) { - logXmlErr("Not all parameters specified for spawn264"); - exit; - } - $monitor = validInteger($_REQUEST['monitor']); - if (!isMonitor($monitor)) exit; - $dims = getMonitorDims($monitor); - $width = validInteger(getset('width', $dims['Width'])); - $height = validInteger(getset('height', $dims['Height'])); - $br = validString(getset('br', ZM_EYEZM_H264_DEFAULT_BR)); - /* Check that we can stream first */ - if (!canStream264()) { - /* canStream264 will print out error */ - exit; - } - $streamUrl = stream264fn($monitor, $width, $height, $br); - logXml("Using H264 Pipe Function: ".$streamUrl); - $pid = shell_exec($streamUrl); - logXml("Streaming Process for monitor ".$monitor." ended, cleaning up files"); - eraseH264Files($monitor); - exit; - - } else if (!strcmp($action, "kill264")) { - /* ACTION: Kill existing H264 stream process and cleanup files. - * Parms: . - * NOTE: This will be called directly by path, so include files - * may not be available */ - session_start(); - require_once(dirname(__FILE__)."/../includes/functions.php"); - if (!isset($_GET['monitor'])) { - logXmlErr("Not all parameters specified for kill264"); - exit; - } - $monitor = validInteger($_GET['monitor']); - kill264proc($monitor); - logXml("Killed Segmenter process for monitor ".$monitor); - exit; - - } else if (!strcmp($action, "chk264")) { - /* ACTION: Simply stalls while checking for 264 file. - * Parms: - * NOTE: This will be called directly by path, so include files - * may not be available */ - session_start(); - require_once(dirname(__FILE__)."/../includes/functions.php"); - if (!isset($_GET['monitor']) || !isset($_GET['timeout'])) { - logXmlErr("Monitor not specified for chk264"); - exit; - } - $monitor = validInteger($_GET['monitor']); - $path = getTempDir()."/".m3u8fname($monitor); - /* Wait for the second sample to become available */ - $tsfile = getTempDir()."/sample_".$monitor."-2.ts"; - /* Setup timeout */ - $startTime = time(); - $timeout = validInteger($_GET['timeout']); - while (!file_exists($path) || !file_exists($tsfile)) { - if (time() > $startTime + $timeout) { - logXmlErr("Timed out waiting for stream to start, exiting..."); - kill264proc($monitor); - exit; - } - usleep(10000); - } - logXml("File exists, stream created after ".(time()-$startTime)." sec"); - exit; - - } else if (!strcmp($action, "feed")) { - /* ACTION: View a feed. Parms: [height|width|fps|scale|vcodec|br] */ - if (!canView('Stream')) { - logXmlErr("User ".$user['Username']. " doesn't have view Stream perms"); - exit; - } - /* Check that required variables are set */ - if (!isset($_REQUEST['monitor'])) { - logXmlErr("Not all parameters set for action view-feed"); - exit; - } - $monitor = validInteger($_REQUEST['monitor']); - if (!isMonitor($monitor)) exit; - $dims = getMonitorDims($monitor); - $width = validInteger(getset('width', $dims['Width'])); - $height = validInteger(getset('height', $dims['Height'])); - $fps = validInteger(getset('fps', ZM_WEB_VIDEO_MAXFPS)); - $scale = validInteger(getset('scale', 100)); - $vcodec = validString(getset('vcodec', ZM_EYEZM_FEED_VCODEC)); - /* Select which codec we want */ - if (!strcmp($vcodec, "h264")) { - /* Validate that we can in fact stream H264 */ - if (!canStream264()) { - /* canStream264 will print out error if - * there is one */ - echo "Server cannot stream H264. Check eyeZm log for details"; - exit; - } - if (!requireVer("1", "2")) { - echo "H264 Streaming requires eyeZm v1.2 or above"; - logXmlErr("H264 Streaming requires eyeZm v1.2 or above"); - exit; - } - $br = validString(getset('br', ZM_EYEZM_H264_DEFAULT_BR)); - /* H264 processing */ - noCacheHeaders(); - /* Kill any existing processes and files */ - kill264proc($monitor); - eraseH264Files($monitor); - logXml("Streaming H264 on Monitor ".$monitor.", ".$width."x".$height." @".$br); - /* Get thumbnail source */ - $thumbsrc = - getStreamSrc( array( - "mode=single", - "monitor=".$monitor, - "scale=".$scale, - "maxfps=".$fps, - "buffer=1000" - ) ); - logXml("Using thumbnail image from ".$thumbsrc); - /* Generate H264 Web-page */ - echo "\n"; - h264vidHtml($width, $height, $monitor, $br, $thumbsrc); - } else if (!strcmp($vcodec, "mjpeg")) { - /* MJPEG streaming */ - /* If $fps=0, get a single-shot */ - if (!$fps) { - /* single-shot */ - $streamSrc = - getStreamSrc( array( - "mode=single", - "monitor=".$monitor, - "scale=".$scale, - "maxfps=0", - "buffer=1000" - ) ); - } else { - $streamSrc = - getStreamSrc( array( - "mode=jpeg", - "monitor=".$monitor, - "scale=".$scale, - "maxfps=".$fps, - "buffer=1000" - ) ); - } - noCacheHeaders(); - xhtmlHeaders( __FILE__, "Stream" ); - logXml("Streaming MJPEG on Monitor ".$monitor.", ".$width."x".$height." @".$fps."fps"); - echo "\n"; - echo "\n"; - echo "
\n"; - logXml("Using stream source: ".$streamSrc); - outputImageStream("liveStream", $streamSrc, $width, $height, "stream"); - echo "
"; - } else { - logXmlErr("Unsupported codec ".$vcodec." selected for streaming"); - echo("Unsupported codec ".$vcodec." selected for streaming"); - } - exit; - - } else if (!strcmp($action, "vevent")) { - /* ACTION: View an event. Parms: [fps|vcodec|br] */ - if (!canView('Events')) { - logXmlErr("User ".$user['Username']. " doesn't have view Events perms"); - exit; - } - if (!isset($_GET['eid'])) { - logXmlErr("Not all parameters set for Action View-event"); - exit; - } - /* Grab event from the database */ - $eid = validInteger($_GET['eid']); - $eventsSql = "select E.Id, E.MonitorId, E.Name, E.StartTime, E.Length, E.Frames from Events as E where E.Id = ?"; - $event = dbFetchOne($eventsSql, NULL, array( $eid ) ); - /* Check if exists */ - if (!$event) { - logxmlErr("Requested event ID ".$eid." does not exist"); - exit; - } - /* Calculate FPS */ - $fps = validInteger(getset('fps',ceil($event['Frames'] / $event['Length']))); - $vcodec = validString(getset('vcodec', ZM_EYEZM_EVENT_VCODEC)); - $baseURL = ZM_PATH_WEB."/".getEventPathSafe($event); - /* Here we validate the codec. - * Check that FFMPEG exists and supports codecs */ - if (!strcmp($vcodec, "mpeg4")) { - if (!ffmpegSupportsCodec("mpeg4")) { - logXmlErr("FFMPEG not installed, accessible in path/ZM_PATH_FFMPEG, or doesn't support mpeg4"); - exit; - } - /* Can generate, we are good to go */ - $fname = "capture.mov"; - $ffparms = "-vcodec mpeg4 -r ".ZM_EYEZM_EVENT_FPS." ".$baseURL."/".$fname." 2> /dev/null"; - - } else if (!strcmp($vcodec, "h264")) { - if (!ffmpegSupportsCodec("libx264")) { - logXmlErr("FFMPEG not installed, accessible in path/ZM_PATH_FFMPEG, or doesn't support H264"); - exit; - } - if (!requireVer("1","2")) { - logXmlErr("H264 Event viewing requires eyeZm v1.2 or greater"); - exit; - } - /* Good to go */ - $fname = "capture.mp4"; - $ffparms = getFfmpeg264FoutParms( - validString(getset('br',ZM_EYEZM_H264_DEFAULT_EVBR)), - $baseURL."/".$fname); - - } else { - logXmlErr("Unknown codec ".$vcodec." selected for event viewing"); - exit; - } - logXml("Selected ".$vcodec." for viewing event ".$event['Id']); - $fnameOut = $baseURL."/".$fname; - $shellCmd = getFfmpegPath()." -y -r ".$fps." -i ".$baseURL."/%0".ZM_EVENT_IMAGE_DIGITS."d-capture.jpg"; - $shellCmd .= " ".$ffparms; - logXml("Encoding event with command: ".$shellCmd); - $shellOutput = shell_exec($shellCmd); - /* Check that file exists */ - if (!file_exists(trim($fnameOut))) { - logXmlErr("Generate Event ".$event['Id']." file ".$fnameOut." does not exist"); - exit; - } - $url = "./".getEventPathSafe($event)."/".$fname; - logXml("Loading Event URL ".$url); - header("Location: ".$url); - exit; - - } else if (!strcmp($action, "vframe")) { - /* ACTION: View a frame given by an event and frame-id. Parms: [alarm | analyze | qty | scale] - * If 'alarm' is set, the returned frame will be the -th alarm frame. If 'analyze' is set, - * the returned frame will be the %03d-analyse frame instead of %03d-capture, if ZM_CREATE_ANALYSIS_IMAGES - * is set. Otherwise it just returns the captured frame. - * If qty is set, it will apply a quality factor from 0-100, and if width is set, it will scale the jpeg accordingly - */ - if (!isset($_GET['eid']) || !isset($_GET['frame'])) { - logXmlErr("Not all parameters set for action view-frame"); - exit; - } - $eid = validInteger($_GET['eid']); - $frame = validInteger($_GET['frame']); - $eventsSql = "select E.Id, E.MonitorId, E.Name, E.StartTime, E.Length, E.Frames from Events as E where E.Id = ?"; - $event = dbFetchOne($eventsSql, NULL, array( $eid ) ); - $qty = validInteger(getset('qty', 100)); - if ($qty > 100) $qty = 100; - $scale = validInteger(getset('scale', 100)); - if (!$event) { - logxmlErr("Requested event ID ".$eid." does not exist"); - exit; - } - /* Figure out the frame number. If 'alarm' is not set, this is just equal to the parameter. - * If 'alarm' is set, need to query DB and grab the -th item */ - if (isset($_GET['alarm'])) { - $frameSql = "select * from Frames as F where F.EventId=? and (F.Type = 'Alarm') order by F.FrameId"; - $i=0; - foreach (dbFetchAll($frameSql, NULL, array($eid) ) as $dbframe) { - if ($i == $frame) { - $frame = $dbframe['FrameId']; - break; - } - $i++; - } - } - if (isset($_GET['analyze']) && ZM_CREATE_ANALYSIS_IMAGES) { - $suffix = "analyse"; - } else { - $suffix = "capture"; - } - /* A frame index of 0 is invalid, so if we see this, just use frame 1 */ - if (!$frame) $frame = 1; - /* Suffix based on 'analyze' */ - $fname = sprintf("%0".ZM_EVENT_IMAGE_DIGITS."d-%s.jpg", $frame, $suffix); - $url = "./".getEventPathSafe($event)."/".$fname; - if (!file_exists($url)) { - logXmlErr("Invalid frame image requested: ".$url); - $url = "./skins/xml/views/notfound.png"; - } - /* Check if the image needs any processing - check for GD if requested */ - if (($scale != 100) || ($qty < 100)) { - if (!gdExists()) { - logXmlErr("Lib GD is not loaded, but required for image scaling functions"); - $url = "./skins/xml/views/notfound.png"; - } else if (!$img = imagecreatefromjpeg($url)) { - logXmlErr("Could not load JPEG from ".$url); - $url = "./skins/xml/views/notfound.png"; - } else { - /* GD exists and we read the file ok */ - header('Content-type: image/jpeg'); - /* Check if resizing is needed */ - if ($scale != 100) { - list($width_orig, $height_orig) = getimagesize($url); - $width_new = $width_orig * ($scale/100); - $height_new = $height_orig * ($scale/100); - $img_new = imagecreatetruecolor($width_new, $height_new); - imagecopyresampled($img_new, $img, 0, 0, 0, 0, $width_new, $height_new, $width_orig, $height_orig); - imagejpeg($img_new, NULL, $qty); - } else { - imagejpeg($img, NULL, $qty); - } - exit; - } - } - header("Location: ".$url); - exit; - - } else if (!strcmp($action, "state")) { - /* ACTION: Change the state of the system. Parms: */ - if (!canEdit('System')) { - logXmlErr("User ".$user['Username']. " doesn't have edit System perms"); - exit; - } - if (!isset($_GET['state'])) { - logXmlErr("Server state not specified for action"); - exit; - } - $url = "./index.php?view=none&action=state&runState=".validString($_GET['state']); - header("Location: ".$url); - exit; - - } else if (!strcmp($action, "func")) { - /* ACTION: Change state of the monitor. Parms: */ - if (!canEdit('Monitors')) { - logXmlErr("User ".$user['Username']. " doesn't have monitors Edit perms"); - exit; - } - if (!isset($_GET['mid']) || !isset($_GET['func']) || !isset($_GET['en'])) { - logXmlErr("Not all parameters specified for action Monitor state"); - exit; - } - $mid = validInteger($_GET['mid']); - if (!isMonitor($mid)) exit; - $url = "./index.php?view=none&action=function&mid=".$mid."&newFunction=".validString($_GET['func'])."&newEnabled=".validString($_GET['en']); - header("Location: ".$url); - exit; - - } else if (!strcmp($action, "vlog")) { - /* ACTION: View log file. Must have debug and log to file enabled, and sufficient perms - * Parms: [lines] */ - if (!canEdit('System')) { - logXmlErr("Insufficient permissions to view log file"); - echo "Insufficient permissions to view log file"; - exit; - } - if (!ZM_EYEZM_DEBUG || !ZM_EYEZM_LOG_TO_FILE) { - echo "eyeZm Debug (EYEZM_DEBUG) or log-to-file (EYEZM_LOG_TO_FILE) not enabled. Please enable first"; - exit; - } - if (!file_exists(ZM_EYEZM_LOG_FILE)) { - echo "Log file ".ZM_EYEZM_LOG_FILE." doesn't exist"; - exit; - } - $lines = validInteger(getset('lines',ZM_EYEZM_LOG_LINES)); - logXml("Returning last ".$lines." lines of eyeZm Log from ".ZM_EYEZM_LOG_FILE); - echo shell_exec("tail -n ".$lines." ".ZM_EYEZM_LOG_FILE); - echo "\n\n--- Showing last ".$lines." lines ---\n"; - echo "--- End of Log ---\n\n"; - } -} -?> diff --git a/web/skins/xml/views/console.php b/web/skins/xml/views/console.php deleted file mode 100644 index b512bc13a..000000000 --- a/web/skins/xml/views/console.php +++ /dev/null @@ -1,259 +0,0 @@ - translate('Events'), - "filter" => array( - "terms" => array( - ) - ), - ), - array( - "title" => translate('Hour'), - "filter" => array( - "terms" => array( - array( "attr" => "Archived", "op" => "=", "val" => "0" ), - array( "cnj" => "and", "attr" => "DateTime", "op" => ">=", "val" => "-1 hour" ), - ) - ), - ), - array( - "title" => translate('Day'), - "filter" => array( - "terms" => array( - array( "attr" => "Archived", "op" => "=", "val" => "0" ), - array( "cnj" => "and", "attr" => "DateTime", "op" => ">=", "val" => "-1 day" ), - ) - ), - ), - array( - "title" => translate('Week'), - "filter" => array( - "terms" => array( - array( "attr" => "Archived", "op" => "=", "val" => "0" ), - array( "cnj" => "and", "attr" => "DateTime", "op" => ">=", "val" => "-7 day" ), - ) - ), - ), - array( - "title" => translate('Month'), - "filter" => array( - "terms" => array( - array( "attr" => "Archived", "op" => "=", "val" => "0" ), - array( "cnj" => "and", "attr" => "DateTime", "op" => ">=", "val" => "-1 month" ), - ) - ), - ), - array( - "title" => translate('Archived'), - "filter" => array( - "terms" => array( - array( "attr" => "Archived", "op" => "=", "val" => "1" ), - ) - ), - ), -); - -$running = daemonCheck(); -$status = $running?translate('Running'):translate('Stopped'); - -if ( $group = dbFetchOne( 'SELECT * FROM Groups WHERE Id = ?', NULL, array(empty($_COOKIE['zmGroup'])?0:$_COOKIE['zmGroup']) ) ) - $groupIds = array_flip(split( ',', $group['MonitorIds'] )); - -$maxWidth = 0; -$maxHeight = 0; -$cycleCount = 0; -$minSequence = 0; -$maxSequence = 1; -$seqIdList = array(); -$monitors = dbFetchAll( "select * from Monitors order by Sequence asc" ); -$displayMonitors = array(); -for ( $i = 0; $i < count($monitors); $i++ ) -{ - if ( !visibleMonitor( $monitors[$i]['Id'] ) ) - { - continue; - } - if ( $group && !empty($groupIds) && !array_key_exists( $monitors[$i]['Id'], $groupIds ) ) - { - continue; - } - $monitors[$i]['Show'] = true; - if ( empty($minSequence) || ($monitors[$i]['Sequence'] < $minSequence) ) - { - $minSequence = $monitors[$i]['Sequence']; - } - if ( $monitors[$i]['Sequence'] > $maxSequence ) - { - $maxSequence = $monitors[$i]['Sequence']; - } - if (isset($_GET['nostatus'])) { - $monitors[$i]['zmc'] = 1; - $monitors[$i]['zma'] = 1; - } else { - $monitors[$i]['zmc'] = zmcStatus( $monitors[$i] ); - $monitors[$i]['zma'] = zmaStatus( $monitors[$i] ); - } - $monitors[$i]['ZoneCount'] = dbFetchOne( 'select count(Id) as ZoneCount from Zones where MonitorId = ?', 'ZoneCount', array($monitors[$i]['Id']) ); - $counts = array(); - for ( $j = 0; $j < count($eventCounts); $j++ ) - { - $filter = addFilterTerm( $eventCounts[$j]['filter'], count($eventCounts[$j]['filter']['terms']), array( "cnj" => "and", "attr" => "MonitorId", "op" => "=", "val" => $monitors[$i]['Id'] ) ); - parseFilter( $filter ); - $counts[] = "count(if(1".$filter['sql'].",1,NULL)) as EventCount$j"; - $monitors[$i]['eventCounts'][$j]['filter'] = $filter; - } - $sql = 'SELECT '.join($counts,", ").' from Events as E where MonitorId = ?'; - $counts = dbFetchOne( $sql, NULL, array( $monitors[$i]['Id'] ) ); - if ( $monitors[$i]['Function'] != 'None' ) - { - $cycleCount++; - $scaleWidth = reScale( $monitors[$i]['Width'], $monitors[$i]['DefaultScale'], ZM_WEB_DEFAULT_SCALE ); - $scaleHeight = reScale( $monitors[$i]['Height'], $monitors[$i]['DefaultScale'], ZM_WEB_DEFAULT_SCALE ); - if ( $maxWidth < $scaleWidth ) $maxWidth = $scaleWidth; - if ( $maxHeight < $scaleHeight ) $maxHeight = $scaleHeight; - } - $monitors[$i] = array_merge( $monitors[$i], $counts ); - $seqIdList[] = $monitors[$i]['Id']; - $displayMonitors[] = $monitors[$i]; -} -$states = dbFetchAll("select * from States"); -/* XML Dump Starts here */ -xml_header(); -/* Print out the general section */ -xml_tag_sec("ZM_XML", 1); -xml_tag_sec("GENERAL", 1); -xml_tag_val("RUNNING", $running); -xml_tag_val("PROTOVER", ZM_EYEZM_PROTOCOL_VERSION); -xml_tag_val("FEATURESET", ZM_EYEZM_FEATURE_SET); -xml_tag_val("VERSION", ZM_VERSION); -xml_tag_val("CANSTR264", canStream264(1)); -xml_tag_val("GD", gdExists()); -xml_tag_val("FVCODEC", ZM_EYEZM_FEED_VCODEC); -xml_tag_val("FVTMT", ZM_EYEZM_H264_TIMEOUT); -xml_tag_val("USER", $user['Username']); -xml_tag_val("UID", $user['Id']); -/* Permissions block */ -xml_tag_sec("PERMS", 1); -xml_tag_val("STREAM", $user['Stream']); -xml_tag_val("EVENTS", $user['Events']); -xml_tag_val("CONTROL", $user['Control']); -xml_tag_val("MONITORS", $user['Monitors']); -xml_tag_val("DEVICES", $user['Devices']); -xml_tag_val("SYSTEM", $user['System']); -xml_tag_sec("PERMS", 0); -/* End permissions block */ -if (canEdit('System')) { - if ($running) { - xml_tag_val("STATE", "stop"); - xml_tag_val("STATE", "restart"); - } else { - xml_tag_val("STATE", "start"); - } - foreach ($states as $state) { - xml_tag_val("STATE", $state['Name']); - } -} -/* End general section */ -xml_tag_sec("GENERAL", 0); -/* Print out the monitors section */ -xml_tag_sec("MONITOR_LIST", 1); -foreach( $displayMonitors as $monitor ) -{ - if (!canView('Monitors')) continue; - xml_tag_sec("MONITOR", 1); - xml_tag_val("ID", $monitor['Id']); - xml_tag_val("NAME", $monitor['Name']); - xml_tag_val("FUNCTION", $monitor['Function']); - xml_tag_val("NUMEVENTS", $monitor['EventCount0']); - xml_tag_val("ENABLED", $monitor['Enabled']); - xml_tag_val("ZMC", $monitor['zmc']); - xml_tag_val("ZMA", $monitor['zma']); - xml_tag_val("STATE", ($monitor['zmc']!=1)?"ERROR":( - ($monitor['zma']==1)?"OK":"WARN")); - xml_tag_val("WIDTH", $monitor['Width']); - xml_tag_val("HEIGHT", $monitor['Height']); - - /* Form the data-base query for this monitor */ - $pageOffset = 0; - $offset = 0; - if (isset($_GET['numEvents'])) { - $numEvents = validInteger($_GET['numEvents']); - $eventsSql = "select E.Id,E.MonitorId,M.Name As MonitorName,E.Cause,E.Name,E.StartTime,E.Length,E.Frames,E.AlarmFrames,E.TotScore,E.AvgScore,E.MaxScore,E.Archived from Monitors as M inner join Events as E on (M.Id = E.MonitorId) and ( E.MonitorId = ? ) order by E.StartTime desc"; - $eventsSql .= " limit ".$numEvents; - /* If there is an pageOff tag for this monitor, then retrieve the offset. Otherwise, don't specify offset */ - if (isset($_GET['pageOff'.$monitor['Id']])) { - /* If pageOffset is greater than we actually have, - * we need to adjust it */ - $pageOffset = validInteger($_GET['pageOff'.$monitor['Id']]); - if ($pageOffset >= ceil($monitor['EventCount0']/$numEvents)) { - $pageOffset = 0; - } - $offset = $pageOffset * $numEvents; - } - $eventsSql .= " offset ".$offset; - } else { - unset($eventsSql); - } - xml_tag_val("PAGEOFF", $pageOffset); - xml_tag_sec("EVENTS",1); - if (canView('Events') && isset($eventsSql)) { - foreach ( dbFetchAll( $eventsSql, NULL, array($monitor['Id']) ) as $event ) - { - xml_tag_sec("EVENT",1); - xml_tag_val("ID",$event['Id']); - xml_tag_val("NAME",$event['Name']); - xml_tag_val("TIME", strftime( STRF_FMT_DATETIME_SHORTER, strtotime($event['StartTime']))); - xml_tag_val("DURATION", $event['Length']); - xml_tag_val("FRAMES", $event['Frames']); - xml_tag_val("FPS", ($event['Length'] > 0)?ceil($event['Frames']/$event['Length']):0); - xml_tag_val("TOTSCORE", $event['TotScore']); - xml_tag_val("AVGSCORE", $event['AvgScore']); - xml_tag_val("MAXSCORE", $event['MaxScore']); - /* Grab the max frame-id from Frames table. If AlarmFrames = 0, don't try - * to grab any frames, and just signal the max frame index as index 0 */ - $fridx = 1; - $alarmFrames = 1; - if ($event['AlarmFrames']) { - $framesSql = "SELECT FrameId FROM Frames WHERE (Type = 'Alarm') and (EventId = ?) ORDER BY Score DESC LIMIT 1"; - $fr = dbFetchOne($framesSql, NULL, array( $event['Id'] ) ); - $fridx = $fr['FrameId']; - $alarmFrames = $event['AlarmFrames']; - } - xml_tag_val("ALARMFRAMES", $alarmFrames); - xml_tag_val("MAXFRAMEID", $fridx); - xml_tag_sec("EVENT",0); - } - } - xml_tag_sec("EVENTS",0); - xml_tag_sec("MONITOR", 0); -} -xml_tag_sec("MONITOR_LIST", 0); -xml_tag_sec("ZM_XML", 0); -?> diff --git a/web/skins/xml/views/none.php b/web/skins/xml/views/none.php deleted file mode 100644 index e69de29bb..000000000 diff --git a/web/skins/xml/views/notfound.png b/web/skins/xml/views/notfound.png deleted file mode 100644 index 219706897647c72375b90298de2d8a6622b7093d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7332 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 R>Js3hJyX?HsZ+9j^?#`>R7U^+ From 6b169af655fcdd3a5f93f7723b440e76d2479e66 Mon Sep 17 00:00:00 2001 From: SteveGilvarry Date: Tue, 29 Dec 2015 02:00:33 +1100 Subject: [PATCH 21/90] Remove eyezm configdata Conflicts: scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in --- .../lib/ZoneMinder/ConfigData.pm.in | 135 ------------------ 1 file changed, 135 deletions(-) diff --git a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in index 703d47c30..c9d48f52f 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in +++ b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in @@ -3942,141 +3942,6 @@ body = "ZM alarm detected - %EL% secs, %EF%/%EFA% frames, t%EST%/m%ESM%/a%ESA% s readonly => 1, category => "dynamic", }, - { - name => "ZM_EYEZM_DEBUG", - default => "no", - description => "Switch additional debugging on for eyeZm Plugin", - help => qqq(" - Enable or Disable extra debugging from the eyeZm Plugin. Extra - debugging information will be displayed in it's own file - (EYEZM_LOG_TO_FILE is set), or your Apache error log - "), - type => $types{boolean}, - category => "eyeZm", - }, - { - name => "ZM_EYEZM_LOG_TO_FILE", - default => "yes", - description => "When eyeZm Debugging is enabled, enabling this logs output to it's own file", - help => qqq(" - When EYEZM_DEBUG is on and EYEZM_LOG_TO_FILE is on, output - generated from the eyeZm Plugin will go to it's own file. - Otherwise it will go to the apache error log. - "), - type => $types{boolean}, - category => "eyeZm", - }, - { - name => "ZM_EYEZM_LOG_FILE", - default => "@ZM_LOGDIR@/zm_xml.log", - description => "Default filename to use when logging eyeZm Output and EYEZM_LOG_TO_FILE is enabled", - help => qqq(" - This file will contain it's own output from the eyeZm Plugin - when EYEZM_LOG_TO_FILE and EYEZM_DEBUG are both enabled - "), - type => $types{string}, - category => "eyeZm", - }, - { - name => "ZM_EYEZM_EVENT_VCODEC", - default => "mpeg4", - description => "Default video-codec to use for encoding events", - help => qqq(" - The eyeZm Plugin calls FFMPEG externally to encode the captured - images. If your FFMPEG is not built with support for H264, - change this to MPEG-4. If using H264, please check - http://www.eyezm.com for H264 requirements and that your eyeZm - version supports H264 (v1.2+). - "), - type => { - db_type =>"string", - hint =>"mpeg4|h264", - pattern =>qr|^([mh])|i, - format =>q( $1 =~ /^m/ ? "mpeg4" : "h264" ) - }, - category => "eyeZm", - }, - { - name => "ZM_EYEZM_FEED_VCODEC", - default => "mjpeg", - description => "Default video-codec to use for streaming the live feed", - help => qqq(" - Determines whether the live stream is generated using native - MJPEG streaming with ZoneMinder, or H264 using FFMPEG and - HTML-5 streaming. If using H264, please check - http://www.eyezm.com for H264 requirements and that your eyeZm - version supports H264 (v1.2+). This is just a default - parameter, and can be overridden with eyeZm. - "), - type => { - db_type =>"string", - hint =>"mjpeg|h264", - pattern =>qr|^([mh])|i, - format =>q( $1 =~ /^m/ ? "mjpeg" : "h264" ) - }, - category => "eyeZm", - }, - { - name => "ZM_EYEZM_H264_DEFAULT_BR", - default => "96k", - description => "Default bit-rate to use with FFMPEG for H264 streaming", - help => qqq(" - When using the eyeZm Plugin to stream H264 data, FFMPEG - requires a bitrate to control the quality and bandwidth of the - video. This should be specified in a format acceptable to - FFMPEG. The default value is sufficient for most installations. - This is just a default parameter, and can be overridden with - eyeZm. - "), - type => $types{string}, - category => "eyeZm", - }, - { - name => "ZM_EYEZM_H264_DEFAULT_EVBR", - default => "128k", - description => "Default bit-rate to use with FFMPEG for H264 event viewing", - help => qqq(" - When using the eyeZm Plugin to view events in H264, FFMPEG - requires a bitrate to control the quality and bandwidth of the - video. This should be specified in a format acceptable to - FFMPEG. The default value is sufficient for most installations. - This is just a default parameter, and can be overridden with - eyeZm. - "), - type => $types{string}, - category => "eyeZm", - }, - { - name => "ZM_EYEZM_H264_TIMEOUT", - default => "20", - description => "Timeout (sec) to wait for H264 stream to start before terminating", - help => qqq(" - The eyeZm Plugin will attempt to spawn an H264 stream when - requested, and require that it complete within the timeout - specified. If you have a slow system or find through the logs - that the H264 stream is not starting because the timeout is - expiring, even though FFMPEG is running, try increasing this - value. If you have a fast system, decreasing this value can - improve the responsiveness when there are issues starting H264 - streams - "), - type => $types{string}, - category => "eyeZm", - }, - { - name => "ZM_EYEZM_SEG_DURATION", - default => "3", - description => "Segment duration used for streaming using HTTP-5 Streaming protocol", - help => qqq(" - The HTTP-5 Live Streaming Protocol segments the input video - stream into small chunks of a duration specified by this - parameter. Increasing the segment duration will help with - choppy connections on the other end, but will increase the - latency in starting a stream. - "), - type => $types{string}, - category => "eyeZm", - }, ); our %options_hash = map { ( $_->{name}, $_ ) } @options; From 4837585601abd50da8fc89e6737aedf6836a5dc0 Mon Sep 17 00:00:00 2001 From: SteveGilvarry Date: Tue, 29 Dec 2015 02:35:43 +1100 Subject: [PATCH 22/90] Deleted eyezm options documentation and references to it in other areas of documentation. Removed zmstreamer.cpp. Conflicts: src/zmstreamer.cpp --- docs/userguide/components.rst | 9 +- docs/userguide/options.rst | 1 - docs/userguide/options/options_eyezm.rst | 26 --- src/zmstreamer.cpp | 252 ----------------------- web/skins/classic/views/options.php | 1 - 5 files changed, 3 insertions(+), 286 deletions(-) delete mode 100644 docs/userguide/options/options_eyezm.rst delete mode 100644 src/zmstreamer.cpp diff --git a/docs/userguide/components.rst b/docs/userguide/components.rst index ebedc8c7e..48aff0be4 100644 --- a/docs/userguide/components.rst +++ b/docs/userguide/components.rst @@ -26,16 +26,13 @@ Binaries PHP --- -As well as this there are the web PHP files in the web directory. Currently these consist of 4 possible skins. +As well as this there are the web PHP files in the web directory. Currently these consist of a single skin with Classic and Flat styles. **Classic** Original ZoneMinder skin **Flat** - An updated version of classic skin, retaining the same layout with a more modern style -**XML** - Displays certain views as XML. Used by eyeZM as an interfacing skin (Note that eyeZM no longer seems to work with later versions of Zoneminder). New developers of 3rd party clients should use the API instead (:doc:`../api`) -**Mobile** - A skin that displays views in a more condensed and single page format, likely suitable for smaller mobile devices, should one choose to access the ZoneMinder console using such devices. Note that there are also third party mobile clients one could use (:doc:`mobile`) + An updated version of Classic skin, retaining the same layout with a more modern style. Originally a skin this is now just a CSS style. + Perl ---- diff --git a/docs/userguide/options.rst b/docs/userguide/options.rst index 4a0b357f6..8f7fbad30 100644 --- a/docs/userguide/options.rst +++ b/docs/userguide/options.rst @@ -20,5 +20,4 @@ If you have changed the value of an option you should then ‘save’ it. A numb options/options_x10 options/options_bw options/options_phonebw - options/options_eyezm options/options_users diff --git a/docs/userguide/options/options_eyezm.rst b/docs/userguide/options/options_eyezm.rst deleted file mode 100644 index 21c780bc0..000000000 --- a/docs/userguide/options/options_eyezm.rst +++ /dev/null @@ -1,26 +0,0 @@ -Options - eyeZM ---------------- - -.. NOTE:: - eyeZM does not seem to be actively maintained by the developers and does not work with later versions of ZoneMinder. - - -.. image:: images/Options_eyezm.png - -EYEZM_DEBUG - Enable or Disable extra debugging from the eyeZm Plugin. Extra debugging information will be displayed in it's own file (EYEZM_LOG_TO_FILE is set), or your Apache error log - -EYEZM_LOG_TO_FILE - When EYEZM_DEBUG is on and EYEZM_LOG_TO_FILE is on, output generated from the eyeZm Plugin will go to it's own file. Otherwise it will go to the apache error log. - -EYEZM_LOG_FILE - Default filename to use when logging eyeZm Output and EYEZM_LOG_TO_FILE is enabled. This file will contain it's own output from the eyeZm Plugin when EYEZM_LOG_TO_FILE and EYEZM_DEBUG are both enabled. - -EYEZM_EVENT_VCODEC - The eyeZm Plugin calls FFMPEG externally to encode the captured images. If your FFMPEG is not built with support for H264, change this to MPEG-4. If using H264, please check http://www.eyezm.com for H264 requirements and that your eyeZm version supports H264 (v1.2+). - -EYEZM_FEED_VCODEC - Determines whether the live stream is generated using native MJPEG streaming with ZoneMinder, or H264 using FFMPEG and HTML-5 streaming. If using H264, please check http://www.eyezm.com for H264 requirements and that your eyeZm version supports H264 (v1.2+). This is just a default parameter, and can be overridden with eyeZm. - -EYEZM_H264_DEFAULT_BR - Default bit-rate to use with FFMPEG for H264 streaming. When using the eyeZm Plugin to stream H264 data, FFMPEG requires a bitrate to control the quality and bandwidth of the video. This should be specified in a format acceptable to FFMPEG. The default value is sufficient for most installations. This is just a default parameter, and can be overridden with eyeZm. - -EYEZM_H264_DEFAULT_EVBR - Default bit-rate to use with FFMPEG for H264 event viewing. When using the eyeZm Plugin to view events in H264, FFMPEG requires a bitrate to control the quality and bandwidth of the video. This should be specified in a format acceptable to FFMPEG. The default value is sufficient for most installations. This is just a default parameter, and can be overridden with eyeZm. - -EYEZM_H264_TIMEOUT - Timeout (sec) to wait for H264 stream to start before terminating. The eyeZm Plugin will attempt to spawn an H264 stream when requested, and require that it complete within the timeout specified. If you have a slow system or find through the logs that the H264 stream is not starting because the timeout is expiring, even though FFMPEG is running, try increasing this value. If you have a fast system, decreasing this value can improve the responsiveness when there are issues starting H264 streams. - -EYEZM_SEG_DURATION - Segment duration used for streaming using HTTP-5 Streaming protocol. The HTTP-5 Live Streaming Protocol segments the input video stream into small chunks of a duration specified by this parameter. Increasing the segment duration will help with choppy connections on the other end, but will increase the latency in starting a stream. diff --git a/src/zmstreamer.cpp b/src/zmstreamer.cpp deleted file mode 100644 index a16e50704..000000000 --- a/src/zmstreamer.cpp +++ /dev/null @@ -1,252 +0,0 @@ -// -// ZoneMinder Streamer, $Date: 2010-10-14 23:21:00 +0200 (Thu, 14 Oct 2010) $ -// Copyright (C) 2001-2010 Philip Coombes, Chris Kistner -// -// This program is based on revision 3143 of -// http://svn.zoneminder.com/svn/zm/trunk/src/zms.cpp -// -// 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. - -/* - -=head1 NAME - -zmstreamer - eyeZM video streamer - -=head1 SYNOPSIS - - zmstreamer -e - zmstreamer -o - zmstreamer -u - zmstreamer -f - zmstreamer -s - zmstreamer -b - zmstreamer -m - zmstreamer -d - zmstreamer -i - zmstreamer -? - zmstreamer -h - zmstreamer -v - -=head1 DESCRIPTION - -*DEPRECIATED* The xml skin and all files associated with the xml skin are now -depreciated. Please use the ZoneMinder API instead. - -This binary works in conjunction with the XML skin to stream video to iPhones -running the eyeZm app. - -=head1 OPTIONS - - -e - Specify output mode: mpeg/jpg/zip/single/raw. - -o - Specify output format. - -u - Specify buffer size in ms. - -f - Specify maximum framerate. - -s - Specify scale. - -b - Specify bitrate. - -m - Specify monitor id. - -d - 0 = off, 1 = no streaming, 2 = with streaming. - -i, -?, -h - Display usage information - -v - Print the installed version of ZoneMinder - -=cut - -*/ - -#include -#include - -#include -#include - -#include "zm.h" -#include "zm_db.h" -#include "zm_user.h" -#include "zm_signal.h" -#include "zm_monitor.h" -#include "zm_stream.h" - -// Possible command-line options -#define OPTIONS "e:o:u:f:s:b:m:d:i:?:h:v" - -// Default ZMS values -#define ZMS_DEFAULT_DEBUG 0 -#define ZMS_DEFAULT_ID 1 -#define ZMS_DEFAULT_BITRATE 100000 -#define ZMS_DEFAULT_SCALE 100 -#define ZMS_DEFAULT_MODE "mpeg" -#define ZMS_DEFAULT_FORMAT "asf" -#define ZMS_DEFAULT_FPS 25.0 -#define ZMS_DEFAULT_BUFFER 1000 - -int main(int argc, char** argv) { - self = argv[0]; - // Set initial values to the default values - int debug = ZMS_DEFAULT_DEBUG; - int id = ZMS_DEFAULT_ID; - int bitrate = ZMS_DEFAULT_BITRATE; - int scale = ZMS_DEFAULT_SCALE; - char mode[32]; - sprintf(mode, "%s", ZMS_DEFAULT_MODE); - char format[32]; - sprintf(format, "%s", ZMS_DEFAULT_FORMAT); - double maxfps = ZMS_DEFAULT_FPS; - int buffer = ZMS_DEFAULT_BUFFER; - - // Parse command-line options - int arg; - while ((arg = getopt(argc, argv, OPTIONS)) != -1) { - switch (arg) { - case 'e': - sprintf(mode, "%s", optarg); - break; - case 'o': - sprintf(format, "%s", optarg); - break; - case 'u': - buffer = atoi(optarg); - break; - case 'f': - maxfps = atof(optarg); - break; - case 's': - scale = atoi(optarg); - break; - case 'b': - bitrate = atoi(optarg); - break; - case 'm': - id = atoi(optarg); - break; - case 'd': - debug = atoi(optarg); - break; - case 'h': - case 'i': - case '?': - printf("-e : Specify output mode: mpeg/jpg/zip/single/raw. Default = %s\n", ZMS_DEFAULT_MODE); - printf("-o : Specify output format. Default = %s\n", ZMS_DEFAULT_FORMAT); - printf("-u : Specify buffer size in ms. Default = %d\n", ZMS_DEFAULT_BUFFER); - printf("-f : Specify maximum framerate. Default = %lf\n", ZMS_DEFAULT_FPS); - printf("-s : Specify scale. Default = %d\n", ZMS_DEFAULT_SCALE); - printf("-b : Specify bitrate. Default = %d\n", ZMS_DEFAULT_BITRATE); - printf("-m : Specify monitor id. Default = %d\n", ZMS_DEFAULT_ID); - printf("-d : 0 = off, 1 = no streaming, 2 = with streaming. Default = 0\n"); - printf("-i or -? or -h: This information\n"); - printf("-v : This installed version of ZoneMinder\n"); - return EXIT_SUCCESS; - case 'v': - std::cout << ZM_VERSION << "\n"; - exit(0); - } - } - - // Set stream type - StreamBase::StreamType streamtype; - if (!strcasecmp("raw", mode)) - streamtype = MonitorStream::STREAM_RAW; - else if (!strcasecmp("mpeg", mode)) - streamtype = MonitorStream::STREAM_MPEG; - else if (!strcasecmp("jpg", mode)) - streamtype = MonitorStream::STREAM_JPEG; - else if (!strcasecmp("single", mode)) - streamtype = MonitorStream::STREAM_SINGLE; - else if (!strcasecmp("zip", mode)) - streamtype = MonitorStream::STREAM_ZIP; - else - streamtype = MonitorStream::STREAM_MPEG; - - if (debug) { - // Show stream parameters - printf("Stream parameters:\n"); - switch (streamtype) { - case MonitorStream::STREAM_MPEG: - printf("Output mode (-e) = %s\n", "mpeg"); - printf("Output format (-o) = %s\n", format); - break; - default: - printf("Output mode (-e) = %s\n", mode); - } - printf("Buffer size (-u) = %d ms\n", buffer); - printf("Maximum FPS (-f) = %lf FPS\n", maxfps); - printf("Scale (-s) = %d%%\n", scale); - printf("Bitrate (-b) = %d bps\n", bitrate); - printf("Monitor Id (-m) = %d\n", id); - } - - if (debug) { - // Set ZM debugger to print to stdout - printf("Setting up ZoneMinder debugger to print to stdout..."); - setenv("ZM_DBG_PRINT", "1", 1); - printf("Done.\n"); - } - - // Loading ZM configurations - printf("Loading ZoneMinder configurations..."); - zmLoadConfig(); - printf("Done.\n"); - - logInit("zmstreamer"); - - ssedetect(); - - // Setting stream parameters - MonitorStream stream; - stream.setStreamScale(scale); // default = 100 (scale) - stream.setStreamReplayRate(100); // default = 100 (rate) - stream.setStreamMaxFPS(maxfps); // default = 10 (maxfps) - if (debug) stream.setStreamTTL(1); - else stream.setStreamTTL(0); // default = 0 (ttl) - stream.setStreamQueue(0); // default = 0 (connkey) - stream.setStreamBuffer(buffer); // default = 0 (buffer) - stream.setStreamStart(id); // default = 0 (monitor_id) - stream.setStreamType(streamtype); - if (streamtype == MonitorStream::STREAM_MPEG) { -#if HAVE_LIBAVCODEC - if (debug) printf("HAVE_LIBAVCODEC is set\n"); - stream.setStreamFormat(format); // default = "" (format) - stream.setStreamBitrate(bitrate); // default = 100000 (bitrate) -#else - fprintf(stderr, "MPEG streaming is disabled.\nYou should configure with the --with-ffmpeg option and rebuild to use this functionality.\n"); - logTerm(); - zmDbClose(); - return EXIT_FAILURE; -#endif - } - - if (debug != 1) { - if (debug) printf("Running stream..."); - - // Output headers - fprintf(stdout, "Server: ZoneMinder Video Server/%s\r\n", ZM_VERSION); - time_t now = time(0); - char date_string[64]; - strftime(date_string, sizeof (date_string) - 1, "%a, %d %b %Y %H:%M:%S GMT", gmtime(&now)); - fprintf(stdout, "Expires: Mon, 26 Jul 1997 05:00:00 GMT\r\n"); - fprintf(stdout, "Last-Modified: %s\r\n", date_string); - fprintf(stdout, "Cache-Control: no-store, no-cache, must-revalidate\r\n"); - fprintf(stdout, "Cache-Control: post-check=0, pre-check=0\r\n"); - fprintf(stdout, "Pragma: no-cache\r\n"); - - // Run stream - stream.runStream(); - } - if (debug) printf("Done.\n"); - - logTerm(); - zmDbClose(); - - return (EXIT_SUCCESS); -} diff --git a/web/skins/classic/views/options.php b/web/skins/classic/views/options.php index 9c3b4a418..30ea85f43 100644 --- a/web/skins/classic/views/options.php +++ b/web/skins/classic/views/options.php @@ -43,7 +43,6 @@ $tabs['highband'] = translate('HighBW'); $tabs['medband'] = translate('MediumBW'); $tabs['lowband'] = translate('LowBW'); $tabs['phoneband'] = translate('PhoneBW'); -$tabs['eyeZm'] = "eyeZm"; $tabs['users'] = translate('Users'); if ( isset($_REQUEST['tab']) ) From 0277a66700fdaa047a709f26b64a4bf5d4af2213 Mon Sep 17 00:00:00 2001 From: SteveGilvarry Date: Tue, 29 Dec 2015 03:03:04 +1100 Subject: [PATCH 23/90] Remove eyezm from distros and Cmake. Conflicts: distros/debian8/control --- .gitignore | 1 - distros/debian8/control | 23 +------------------ distros/debian8/zoneminder-ui-mobile.install | 1 - distros/debian8/zoneminder-ui-xml.install | 1 - .../fedora/archive/zoneminder.cmake.f19.spec | 1 - distros/fedora/archive/zoneminder.f19.spec | 1 - distros/fedora/archive/zoneminder.f20.spec | 1 - distros/fedora/archive/zoneminder.f21.spec | 1 - distros/fedora/zoneminder.f22.spec | 1 - distros/fedora/zoneminder.f23.spec | 1 - distros/redhat/archive/zoneminder.el6.spec | 1 - distros/redhat/zoneminder.el6.spec | 1 - distros/redhat/zoneminder.el7.spec | 1 - .../ubuntu1504_cmake_split_packages/control | 23 +------------------ .../zoneminder-ui-mobile.install | 1 - .../zoneminder-ui-xml.install | 1 - src/CMakeLists.txt | 8 +++---- 17 files changed, 5 insertions(+), 63 deletions(-) delete mode 100644 distros/debian8/zoneminder-ui-mobile.install delete mode 100644 distros/debian8/zoneminder-ui-xml.install delete mode 100644 distros/ubuntu1504_cmake_split_packages/zoneminder-ui-mobile.install delete mode 100644 distros/ubuntu1504_cmake_split_packages/zoneminder-ui-xml.install diff --git a/.gitignore b/.gitignore index fa066279c..bd66e684a 100644 --- a/.gitignore +++ b/.gitignore @@ -63,7 +63,6 @@ src/zma src/zmc src/zmf src/zms -src/zmstreamer src/zmu web/includes/config.php zm.conf diff --git a/distros/debian8/control b/distros/debian8/control index af5ba9ad0..4ab0c07e6 100644 --- a/distros/debian8/control +++ b/distros/debian8/control @@ -13,9 +13,7 @@ Depends: ${misc:Depends}, zoneminder-database (>= ${source:Version}), zoneminder-core (>= ${binary:Version}), zoneminder-ui-base (>= ${source:Version}), - zoneminder-ui-classic (>= ${source:Version}), - zoneminder-ui-mobile (>= ${source:Version}), - zoneminder-ui-xml (>= ${source:Version}) + zoneminder-ui-classic (>= ${source:Version}) Description: Video camera security and surveillance solution (metapackage) ZoneMinder is intended for use in single or multi-camera video security applications, including commercial or home CCTV, theft prevention and child @@ -101,22 +99,3 @@ Description: Classic web user interface for ZoneMinder ZoneMinder is a video camera security and surveillance solution. . This package provides the classic web user interface. - -Package: zoneminder-ui-mobile -Section: web -Architecture: all -Depends: zoneminder-ui-base (>= ${source:Version}), ${misc:Depends} -Description: Mobile web user interface for ZoneMinder - ZoneMinder is a video camera security and surveillance solution. - . - This package provides the web user interface for mobile devices. - -Package: zoneminder-ui-xml -Section: web -Architecture: all -Depends: zoneminder-ui-base (>= ${source:Version}), ${misc:Depends} -Description: XML interface for ZoneMinder - ZoneMinder is a video camera security and surveillance solution. - . - This package provides a XML interface mainly intended for use with the eyeZm - iPhone Application, but can be used with any other custom programs as well. diff --git a/distros/debian8/zoneminder-ui-mobile.install b/distros/debian8/zoneminder-ui-mobile.install deleted file mode 100644 index 464bb74eb..000000000 --- a/distros/debian8/zoneminder-ui-mobile.install +++ /dev/null @@ -1 +0,0 @@ -usr/share/zoneminder/skins/mobile diff --git a/distros/debian8/zoneminder-ui-xml.install b/distros/debian8/zoneminder-ui-xml.install deleted file mode 100644 index 6617707f8..000000000 --- a/distros/debian8/zoneminder-ui-xml.install +++ /dev/null @@ -1 +0,0 @@ -usr/share/zoneminder/skins/xml diff --git a/distros/fedora/archive/zoneminder.cmake.f19.spec b/distros/fedora/archive/zoneminder.cmake.f19.spec index 771209247..0af88f41f 100644 --- a/distros/fedora/archive/zoneminder.cmake.f19.spec +++ b/distros/fedora/archive/zoneminder.cmake.f19.spec @@ -140,7 +140,6 @@ fi # zmfix removed from zoneminder 1.26.6 #%attr(4755,root,root) %{_bindir}/zmfix %{_bindir}/zmpkg.pl -%{_bindir}/zmstreamer %{_bindir}/zmtrack.pl %{_bindir}/zmtrigger.pl %{_bindir}/zmu diff --git a/distros/fedora/archive/zoneminder.f19.spec b/distros/fedora/archive/zoneminder.f19.spec index 11a8ba249..d1be12aa2 100644 --- a/distros/fedora/archive/zoneminder.f19.spec +++ b/distros/fedora/archive/zoneminder.f19.spec @@ -232,7 +232,6 @@ fi # zmfix removed from zoneminder 1.26.6 #%attr(4755,root,root) %{_bindir}/zmfix %{_bindir}/zmpkg.pl -%{_bindir}/zmstreamer %{_bindir}/zmtrack.pl %{_bindir}/zmtrigger.pl %{_bindir}/zmu diff --git a/distros/fedora/archive/zoneminder.f20.spec b/distros/fedora/archive/zoneminder.f20.spec index b06db673d..513a9cfee 100644 --- a/distros/fedora/archive/zoneminder.f20.spec +++ b/distros/fedora/archive/zoneminder.f20.spec @@ -142,7 +142,6 @@ fi %{_bindir}/zmf %{_bindir}/zmfilter.pl %{_bindir}/zmpkg.pl -%{_bindir}/zmstreamer %{_bindir}/zmtrack.pl %{_bindir}/zmtrigger.pl %{_bindir}/zmu diff --git a/distros/fedora/archive/zoneminder.f21.spec b/distros/fedora/archive/zoneminder.f21.spec index 6dfabceea..35662bf6c 100644 --- a/distros/fedora/archive/zoneminder.f21.spec +++ b/distros/fedora/archive/zoneminder.f21.spec @@ -142,7 +142,6 @@ fi %{_bindir}/zmf %{_bindir}/zmfilter.pl %{_bindir}/zmpkg.pl -%{_bindir}/zmstreamer %{_bindir}/zmtrack.pl %{_bindir}/zmtrigger.pl %{_bindir}/zmu diff --git a/distros/fedora/zoneminder.f22.spec b/distros/fedora/zoneminder.f22.spec index 9beef6319..40343090f 100644 --- a/distros/fedora/zoneminder.f22.spec +++ b/distros/fedora/zoneminder.f22.spec @@ -154,7 +154,6 @@ fi %{_bindir}/zmf %{_bindir}/zmfilter.pl %{_bindir}/zmpkg.pl -%{_bindir}/zmstreamer %{_bindir}/zmtrack.pl %{_bindir}/zmtrigger.pl %{_bindir}/zmu diff --git a/distros/fedora/zoneminder.f23.spec b/distros/fedora/zoneminder.f23.spec index 14b653117..6fabd143d 100644 --- a/distros/fedora/zoneminder.f23.spec +++ b/distros/fedora/zoneminder.f23.spec @@ -154,7 +154,6 @@ fi %{_bindir}/zmf %{_bindir}/zmfilter.pl %{_bindir}/zmpkg.pl -%{_bindir}/zmstreamer %{_bindir}/zmtrack.pl %{_bindir}/zmtrigger.pl %{_bindir}/zmu diff --git a/distros/redhat/archive/zoneminder.el6.spec b/distros/redhat/archive/zoneminder.el6.spec index d61a153e7..46bce099a 100644 --- a/distros/redhat/archive/zoneminder.el6.spec +++ b/distros/redhat/archive/zoneminder.el6.spec @@ -237,7 +237,6 @@ fi # zmfix removed from zoneminder 1.26.6 #%attr(4755,root,root) %{_bindir}/zmfix %{_bindir}/zmpkg.pl -%{_bindir}/zmstreamer %{_bindir}/zmtrack.pl %{_bindir}/zmtrigger.pl %{_bindir}/zmu diff --git a/distros/redhat/zoneminder.el6.spec b/distros/redhat/zoneminder.el6.spec index 82406d431..1059d5930 100644 --- a/distros/redhat/zoneminder.el6.spec +++ b/distros/redhat/zoneminder.el6.spec @@ -145,7 +145,6 @@ rm -rf %{_docdir}/%{name}-%{version} %{_bindir}/zmf %{_bindir}/zmfilter.pl %{_bindir}/zmpkg.pl -%{_bindir}/zmstreamer %{_bindir}/zmtrack.pl %{_bindir}/zmtrigger.pl %{_bindir}/zmu diff --git a/distros/redhat/zoneminder.el7.spec b/distros/redhat/zoneminder.el7.spec index c350553b3..6dd0f5e1d 100644 --- a/distros/redhat/zoneminder.el7.spec +++ b/distros/redhat/zoneminder.el7.spec @@ -154,7 +154,6 @@ fi %{_bindir}/zmf %{_bindir}/zmfilter.pl %{_bindir}/zmpkg.pl -%{_bindir}/zmstreamer %{_bindir}/zmtrack.pl %{_bindir}/zmtrigger.pl %{_bindir}/zmu diff --git a/distros/ubuntu1504_cmake_split_packages/control b/distros/ubuntu1504_cmake_split_packages/control index 4a152c46b..6b6692414 100644 --- a/distros/ubuntu1504_cmake_split_packages/control +++ b/distros/ubuntu1504_cmake_split_packages/control @@ -28,9 +28,7 @@ Depends: ${misc:Depends}, zoneminder-database (>= ${source:Version}), zoneminder-core (>= ${binary:Version}), zoneminder-ui-base (>= ${source:Version}), - zoneminder-ui-classic (>= ${source:Version}), - zoneminder-ui-mobile (>= ${source:Version}), - zoneminder-ui-xml (>= ${source:Version}) + zoneminder-ui-classic (>= ${source:Version}) Description: Video camera security and surveillance solution (metapackage) ZoneMinder is intended for use in single or multi-camera video security applications, including commercial or home CCTV, theft prevention and child @@ -117,25 +115,6 @@ Description: Classic web user interface for ZoneMinder . This package provides the classic web user interface. -Package: zoneminder-ui-mobile -Section: web -Architecture: all -Depends: zoneminder-ui-base (>= ${source:Version}), ${misc:Depends} -Description: Mobile web user interface for ZoneMinder - ZoneMinder is a video camera security and surveillance solution. - . - This package provides the web user interface for mobile devices. - -Package: zoneminder-ui-xml -Section: web -Architecture: all -Depends: zoneminder-ui-base (>= ${source:Version}), ${misc:Depends} -Description: XML interface for ZoneMinder - ZoneMinder is a video camera security and surveillance solution. - . - This package provides a XML interface mainly intended for use with the eyeZm - iPhone Application, but can be used with any other custom programs as well. - Package: zoneminder-ui-api Section: web Architecture: all diff --git a/distros/ubuntu1504_cmake_split_packages/zoneminder-ui-mobile.install b/distros/ubuntu1504_cmake_split_packages/zoneminder-ui-mobile.install deleted file mode 100644 index 464bb74eb..000000000 --- a/distros/ubuntu1504_cmake_split_packages/zoneminder-ui-mobile.install +++ /dev/null @@ -1 +0,0 @@ -usr/share/zoneminder/skins/mobile diff --git a/distros/ubuntu1504_cmake_split_packages/zoneminder-ui-xml.install b/distros/ubuntu1504_cmake_split_packages/zoneminder-ui-xml.install deleted file mode 100644 index 6617707f8..000000000 --- a/distros/ubuntu1504_cmake_split_packages/zoneminder-ui-xml.install +++ /dev/null @@ -1 +0,0 @@ -usr/share/zoneminder/skins/xml diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ea254ac2f..9876e2a87 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -14,21 +14,19 @@ add_executable(zma zma.cpp) add_executable(zmu zmu.cpp) add_executable(zmf zmf.cpp) add_executable(zms zms.cpp) -add_executable(zmstreamer zmstreamer.cpp) target_link_libraries(zmc zm ${ZM_EXTRA_LIBS} ${ZM_BIN_LIBS}) target_link_libraries(zma zm ${ZM_EXTRA_LIBS} ${ZM_BIN_LIBS}) target_link_libraries(zmu zm ${ZM_EXTRA_LIBS} ${ZM_BIN_LIBS}) target_link_libraries(zmf zm ${ZM_EXTRA_LIBS} ${ZM_BIN_LIBS}) target_link_libraries(zms zm ${ZM_EXTRA_LIBS} ${ZM_BIN_LIBS}) -target_link_libraries(zmstreamer zm ${ZM_EXTRA_LIBS} ${ZM_BIN_LIBS}) # Generate man files for the binaries destined for the bin folder -FOREACH(CBINARY zma zmc zmf zmu zmstreamer) +FOREACH(CBINARY zma zmc zmf zmu) POD2MAN(${CMAKE_CURRENT_SOURCE_DIR}/${CBINARY}.cpp zoneminder-${CBINARY} 8) -ENDFOREACH(CBINARY zma zmc zmf zmu zmstreamer) +ENDFOREACH(CBINARY zma zmc zmf zmu) -install(TARGETS zmc zma zmu zmf zmstreamer RUNTIME DESTINATION "${CMAKE_INSTALL_FULL_BINDIR}" PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) +install(TARGETS zmc zma zmu zmf RUNTIME DESTINATION "${CMAKE_INSTALL_FULL_BINDIR}" PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) install(TARGETS zms RUNTIME DESTINATION "${ZM_CGIDIR}" PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) install(CODE "execute_process(COMMAND ln -sf zms nph-zms WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})" ) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/nph-zms DESTINATION "${ZM_CGIDIR}") From d40bf89b17995af756adb76326c4894e41318530 Mon Sep 17 00:00:00 2001 From: SteveGilvarry Date: Tue, 29 Dec 2015 08:04:02 +1100 Subject: [PATCH 24/90] Remove Phone BW settings used with mobile skin --- docs/userguide/options.rst | 1 - docs/userguide/options/options_phonebw.rst | 20 --- .../lib/ZoneMinder/ConfigData.pm.in | 155 ------------------ web/includes/actions.php | 1 - web/skins/classic/views/options.php | 1 - 5 files changed, 178 deletions(-) delete mode 100644 docs/userguide/options/options_phonebw.rst diff --git a/docs/userguide/options.rst b/docs/userguide/options.rst index 8f7fbad30..8186d8b6a 100644 --- a/docs/userguide/options.rst +++ b/docs/userguide/options.rst @@ -19,5 +19,4 @@ If you have changed the value of an option you should then ‘save’ it. A numb options/options_upload options/options_x10 options/options_bw - options/options_phonebw options/options_users diff --git a/docs/userguide/options/options_phonebw.rst b/docs/userguide/options/options_phonebw.rst deleted file mode 100644 index e2389bccf..000000000 --- a/docs/userguide/options/options_phonebw.rst +++ /dev/null @@ -1,20 +0,0 @@ -Options - Phone Bandwidth -------------------------- - -.. image:: images/Options_BW_Phone.png - -WEB_P_CAN_STREAM - Override the automatic detection of browser streaming capability. If you know that your browser can handle image streams of the type 'multipart/x-mixed-replace' but ZoneMinder does not detect this correctly you can set this option to ensure that the stream is delivered with or without the use of the Cambozola plugin. Selecting 'yes' will tell ZoneMinder that your browser can handle the streams natively, 'no' means that it can't and so the plugin will be used while 'auto' lets ZoneMinder decide. - -WEB_P_STREAM_METHOD - ZoneMinder can be configured to use either mpeg encoded video or a series or still jpeg images when sending video streams. This option defines which is used. If you choose mpeg you should ensure that you have the appropriate plugins available on your browser whereas choosing jpeg will work natively on Mozilla and related browsers and with a Java applet on Internet Explorer" - -WEB_P_DEFAULT_SCALE - Normally ZoneMinder will display 'live' or 'event' streams in their native size. However if you have monitors with large dimensions or a slow link you may prefer to reduce this size, alternatively for small monitors you can enlarge it. This options lets you specify what the default scaling factor will be. It is expressed as a percentage so 100 is normal size, 200 is double size etc. - -WEB_P_DEFAULT_RATE - Normally ZoneMinder will display 'event' streams at their native rate, i.e. as close to real-time as possible. However if you have long events it is often convenient to replay them at a faster rate for review. This option lets you specify what the default replay rate will be. It is expressed as a percentage so 100 is normal rate, 200 is double speed etc. - -WEB_P_VIDEO_BITRATE - When encoding real video via the ffmpeg library a bit rate can be specified which roughly corresponds to the available bandwidth used for the stream. This setting effectively corresponds to a 'quality' setting for the video. A low value will result in a blocky image whereas a high value will produce a clearer view. Note that this setting does not control the frame rate of the video however the quality of the video produced is affected both by this setting and the frame rate that the video is produced at. A higher frame rate at a particular bit rate result in individual frames being at a lower quality. - -WEB_P_VIDEO_MAXFPS - When using streamed video the main control is the bitrate which determines how much data can be transmitted. However a lower bitrate at high frame rates results in a lower quality image. This option allows you to limit the maximum frame rate to ensure that video quality is maintained. An additional advantage is that encoding video at high frame rates is a processor intensive task when for the most part a very high frame rate offers little perceptible improvement over one that has a more manageable resource requirement. Note, this option is implemented as a cap beyond which binary reduction takes place. So if you have a device capturing at 15fps and set this option to 10fps then the video is not produced at 10fps, but rather at 7.5fps (15 divided by 2) as the final frame rate must be the original divided by a power of 2. - -WEB_P_SCALE_THUMBS - If unset, this option sends the whole image to the browser which resizes it in the window. If set the image is scaled down on the server before sending a reduced size image to the browser to conserve bandwidth at the cost of cpu on the server. Note that ZM can only perform the resizing if the appropriate PHP graphics functionality is installed. This is usually available in the php-gd package. - -WEB_P_AJAX_TIMEOUT - The newer versions of the live feed and event views use Ajax to request information from the server and populate the views dynamically. This option allows you to specify a timeout if required after which requests are abandoned. A timeout may be necessary if requests would overwise hang such as on a slow connection. This would tend to consume a lot of browser memory and make the interface unresponsive. Ordinarily no requests should timeout so this setting should be set to a value greater than the slowest expected response. This value is in milliseconds but if set to zero then no timeout will be used. \ No newline at end of file diff --git a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in index c9d48f52f..0c421fec6 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in +++ b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in @@ -3721,161 +3721,6 @@ body = "ZM alarm detected - %EL% secs, %EF%/%EFA% frames, t%EST%/m%ESM%/a%ESA% s type => $types{integer}, category => "lowband", }, - { - name => "ZM_WEB_P_CAN_STREAM", - default => "auto", - description => "Override the automatic detection of browser streaming capability", - help => qqq(" - If you know that your browser can handle image streams of the - type 'multipart/x-mixed-replace' but ZoneMinder does not detect - this correctly you can set this option to ensure that the - stream is delivered with or without the use of the Cambozola - plugin. Selecting 'yes' will tell ZoneMinder that your browser - can handle the streams natively, 'no' means that it can't and - so the plugin will be used while 'auto' lets ZoneMinder decide. - "), - type => $types{tristate}, - category => "phoneband", - }, - { - name => "ZM_WEB_P_STREAM_METHOD", - default => "jpeg", - description => "Which method should be used to send video streams to your browser.", - help => qqq(" - ZoneMinder can be configured to use either mpeg encoded video - or a series or still jpeg images when sending video streams. - This option defines which is used. If you choose mpeg you - should ensure that you have the appropriate plugins available - on your browser whereas choosing jpeg will work natively on - Mozilla and related browsers and with a Java applet on Internet - Explorer - "), - type => { - db_type =>"string", - hint =>"mpeg|jpeg", - pattern =>qr|^([mj])|i, - format =>q( $1 =~ /^m/ ? "mpeg" : "jpeg" ) - }, - category => "phoneband", - }, - { - name => "ZM_WEB_P_DEFAULT_SCALE", - default => "100", - description => "What the default scaling factor applied to 'live' or 'event' views is (%)", - help => qqq(" - Normally ZoneMinder will display 'live' or 'event' streams in - their native size. However if you have monitors with large - dimensions or a slow link you may prefer to reduce this size, - alternatively for small monitors you can enlarge it. This - options lets you specify what the default scaling factor will - be. It is expressed as a percentage so 100 is normal size, 200 - is double size etc. - "), - type => { - db_type =>"integer", - hint =>"25|33|50|75|100|150|200|300|400", - pattern =>qr|^(\d+)$|, format=>q( $1 ) - }, - category => "phoneband", - }, - { - name => "ZM_WEB_P_DEFAULT_RATE", - default => "100", - description => "What the default replay rate factor applied to 'event' views is (%)", - help => qqq(" - Normally ZoneMinder will display 'event' streams at their - native rate, i.e. as close to real-time as possible. However if - you have long events it is often convenient to replay them at a - faster rate for review. This option lets you specify what the - default replay rate will be. It is expressed as a percentage so - 100 is normal rate, 200 is double speed etc. - "), - type => { - db_type =>"integer", - hint =>"25|50|100|150|200|400|1000|2500|5000|10000", - pattern =>qr|^(\d+)$|, - format =>q( $1 ) - }, - category => "phoneband", - }, - { - name => "ZM_WEB_P_VIDEO_BITRATE", - default => "8000", - description => "What the bitrate of the video encoded stream should be set to", - help => qqq(" - When encoding real video via the ffmpeg library a bit rate can - be specified which roughly corresponds to the available - bandwidth used for the stream. This setting effectively - corresponds to a 'quality' setting for the video. A low value - will result in a blocky image whereas a high value will produce - a clearer view. Note that this setting does not control the - frame rate of the video however the quality of the video - produced is affected both by this setting and the frame rate - that the video is produced at. A higher frame rate at a - particular bit rate result in individual frames being at a - lower quality. - "), - type => $types{integer}, - category => "phoneband", - }, - { - name => "ZM_WEB_P_VIDEO_MAXFPS", - default => "5", - description => "What the maximum frame rate for streamed video should be", - help => qqq(" - When using streamed video the main control is the bitrate which - determines how much data can be transmitted. However a lower - bitrate at high frame rates results in a lower quality image. - This option allows you to limit the maximum frame rate to - ensure that video quality is maintained. An additional - advantage is that encoding video at high frame rates is a - processor intensive task when for the most part a very high - frame rate offers little perceptible improvement over one that - has a more manageable resource requirement. Note, this option - is implemented as a cap beyond which binary reduction takes - place. So if you have a device capturing at 15fps and set this - option to 10fps then the video is not produced at 10fps, but - rather at 7.5fps (15 divided by 2) as the final frame rate must - be the original divided by a power of 2. - "), - type => $types{integer}, - category => "phoneband", - }, - { - name => "ZM_WEB_P_SCALE_THUMBS", - default => "yes", - description => "Scale thumbnails in events, bandwidth versus cpu in rescaling", - help => qqq(" - If unset, this option sends the whole image to the browser - which resizes it in the window. If set the image is scaled down - on the server before sending a reduced size image to the - browser to conserve bandwidth at the cost of cpu on the server. - Note that ZM can only perform the resizing if the appropriate - PHP graphics functionality is installed. This is usually - available in the php-gd package. - "), - type => $types{boolean}, - category => "phoneband", - }, - { - name => "ZM_WEB_P_AJAX_TIMEOUT", - default => "10000", - description => "How long to wait for Ajax request responses (ms)", - help => qqq(" - The newer versions of the live feed and event views use Ajax to - request information from the server and populate the views - dynamically. This option allows you to specify a timeout if - required after which requests are abandoned. A timeout may be - necessary if requests would overwise hang such as on a slow - connection. This would tend to consume a lot of browser memory - and make the interface unresponsive. Ordinarily no requests - should timeout so this setting should be set to a value greater - than the slowest expected response. This value is in - milliseconds but if set to zero then no timeout will be used. - "), - type => $types{integer}, - category => "phoneband", - }, { name => "ZM_DYN_LAST_VERSION", default => "", diff --git a/web/includes/actions.php b/web/includes/actions.php index 7de7a8238..4cd056116 100644 --- a/web/includes/actions.php +++ b/web/includes/actions.php @@ -921,7 +921,6 @@ if ( !empty($action) ) case "highband" : case "medband" : case "lowband" : - case "phoneband" : break; } } diff --git a/web/skins/classic/views/options.php b/web/skins/classic/views/options.php index 30ea85f43..1140b7bfd 100644 --- a/web/skins/classic/views/options.php +++ b/web/skins/classic/views/options.php @@ -42,7 +42,6 @@ $tabs['x10'] = translate('X10'); $tabs['highband'] = translate('HighBW'); $tabs['medband'] = translate('MediumBW'); $tabs['lowband'] = translate('LowBW'); -$tabs['phoneband'] = translate('PhoneBW'); $tabs['users'] = translate('Users'); if ( isset($_REQUEST['tab']) ) From ecce87b779832d2e4e800207a969fbf728bf7887 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 31 Mar 2016 14:43:22 -0400 Subject: [PATCH 25/90] mamke status a member so that we aren't return the address of a local variable --- src/zm_thread.cpp | 13 ++++++------- src/zm_thread.h | 5 +++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/zm_thread.cpp b/src/zm_thread.cpp index 09cf0da3f..4e05156a0 100644 --- a/src/zm_thread.cpp +++ b/src/zm_thread.cpp @@ -253,7 +253,7 @@ void *Thread::mThreadFunc( void *arg ) Debug( 2, "Invoking thread" ); Thread *thisPtr = (Thread *)arg; - void *status = 0; + thisPtr->status = 0; try { thisPtr->mThreadMutex.lock(); @@ -261,19 +261,18 @@ void *Thread::mThreadFunc( void *arg ) thisPtr->mThreadCondition.signal(); thisPtr->mThreadMutex.unlock(); thisPtr->mRunning = true; - int run=(thisPtr->run()); - status = (void *)&run; + thisPtr->status = thisPtr->run(); thisPtr->mRunning = false; - Debug( 2, "Exiting thread, status %p", status ); + Debug( 2, "Exiting thread, status %p", (void *)&(thisPtr->status) ); + return (void *)&(thisPtr->status); } catch ( const ThreadException &e ) { Error( "%s", e.getMessage().c_str() ); thisPtr->mRunning = false; - status = (void *)-1; - Debug( 2, "Exiting thread after exception, status %p", status ); + Debug( 2, "Exiting thread after exception, status %p", (void *)-1 ); + return (void *)-1; } - return( status ); } void Thread::start() diff --git a/src/zm_thread.h b/src/zm_thread.h index 615bec6aa..de2b1a6e4 100644 --- a/src/zm_thread.h +++ b/src/zm_thread.h @@ -224,6 +224,7 @@ protected: #endif bool mStarted; bool mRunning; + int status; // Used in various funcions to get around return a local variable protected: Thread(); @@ -253,10 +254,10 @@ return tid; return( pthread_self() ); } #endif - void exit( int status = 0 ) + void exit( int p_status = 0 ) { //INFO( "Exiting" ); - pthread_exit( (void *)&status ); + pthread_exit( (void *)&p_status ); } static void *mThreadFunc( void *arg ); From a31660c1f6d8e8e32fc6ea6ac43eaf88756f5c31 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Mon, 4 Apr 2016 10:45:58 -0400 Subject: [PATCH 26/90] Remove the code looks for zm.conf in the current dir. --- scripts/ZoneMinder/lib/ZoneMinder/Config.pm.in | 6 ------ 1 file changed, 6 deletions(-) diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Config.pm.in b/scripts/ZoneMinder/lib/ZoneMinder/Config.pm.in index 0c5a82a30..3a226cdc8 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/Config.pm.in +++ b/scripts/ZoneMinder/lib/ZoneMinder/Config.pm.in @@ -66,12 +66,6 @@ use Carp; BEGIN { my $config_file = ZM_CONFIG; - ( my $local_config_file = $config_file ) =~ s|^.*/|./|; - if ( -s $local_config_file and -r $local_config_file ) - { - print( STDERR "Warning, overriding installed $local_config_file file with local copy\n" ); - $config_file = $local_config_file; - } open( my $CONFIG, "<", $config_file ) or croak( "Can't open config file '$config_file': $!" ); foreach my $str ( <$CONFIG> ) From 02eb36040a42f34c4b4bf3bcd7486ec1d7fd6e36 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Mon, 4 Apr 2016 12:01:37 -0400 Subject: [PATCH 27/90] fix bad code --- web/includes/functions.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/includes/functions.php b/web/includes/functions.php index 800f03f4d..8b69926da 100644 --- a/web/includes/functions.php +++ b/web/includes/functions.php @@ -982,7 +982,7 @@ function daemonControl( $command, $daemon=false, $args=false ) function zmcControl( $monitor, $mode=false ) { - if ( (!ZM_SERVER) or ( ZM_SERVER==$monitor[ServerId}) ) { + if ( (!ZM_SERVER) or ( ZM_SERVER==$monitor['ServerId'] ) ) { $row = NULL; if ( $monitor['Type'] == "Local" ) { @@ -1013,7 +1013,7 @@ function zmcControl( $monitor, $mode=false ) function zmaControl( $monitor, $mode=false ) { - if ( (!ZM_SERVER) or ( ZM_SERVER==$monitor[ServerId}) ) { + if ( (!ZM_SERVER) or ( ZM_SERVER==$monitor['ServerId'] ) ) { if ( !is_array( $monitor ) ) { $monitor = dbFetchOne( "select C.*, M.* from Monitors as M left join Controls as C on (M.ControlId = C.Id ) where M.Id=?", NULL, array($monitor) ); From 0b13f9d76f07455ab6411615f1ffb40130a79406 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Mon, 4 Apr 2016 14:58:07 -0400 Subject: [PATCH 28/90] reload stream on scale change --- web/skins/classic/views/js/watch.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/web/skins/classic/views/js/watch.js b/web/skins/classic/views/js/watch.js index 9c39c897a..c686ea430 100644 --- a/web/skins/classic/views/js/watch.js +++ b/web/skins/classic/views/js/watch.js @@ -37,9 +37,14 @@ function changeScale() /*Stream could be an applet so can't use moo tools*/ var streamImg = document.getElementById('liveStream'); - streamImg.style.width = newWidth + "px"; - streamImg.style.height = newHeight + "px"; + if ( streamImg ) { + streamImg.style.width = newWidth + "px"; + streamImg.style.height = newHeight + "px"; + streamImg.src = streamImg.src.replace(/scale=\d+/i,'scale='+scale); + } else { + console.error("No element found for liveStream."); + } } var alarmState = STATE_IDLE; From 123a1a898a55b71b4aeccf82c1be622a4d4b4d68 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Mon, 4 Apr 2016 15:04:09 -0400 Subject: [PATCH 29/90] try to reload the image stream on error. --- web/skins/classic/views/js/watch.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/web/skins/classic/views/js/watch.js b/web/skins/classic/views/js/watch.js index 9c39c897a..5f412e214 100644 --- a/web/skins/classic/views/js/watch.js +++ b/web/skins/classic/views/js/watch.js @@ -205,8 +205,13 @@ function getStreamCmdResponse( respObj, respText ) $('enableDisableAlarms').removeClass( 'hidden' ); } } - else + else { checkStreamForErrors("getStreamCmdResponse",respObj);//log them + // Try to reload the image stream. + var streamImg = document.getElementById('liveStream'); + if ( streamImg ) + streamImg.src = streamImg.src.replace(/rand=\d+/i,'rand='+Math.floor((Math.random() * 1000000) )); + } var streamCmdTimeout = statusRefreshTimeout; if ( alarmState == STATE_ALARM || alarmState == STATE_ALERT ) From ed741687101c293d05868d8d16c32c41e27b3ca6 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Mon, 4 Apr 2016 15:14:14 -0400 Subject: [PATCH 30/90] increase the size of the Pid field in Logs to accomodate FreeBSD --- db/zm_create.sql.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/zm_create.sql.in b/db/zm_create.sql.in index 3614bfedd..029f20989 100644 --- a/db/zm_create.sql.in +++ b/db/zm_create.sql.in @@ -270,7 +270,7 @@ CREATE TABLE `Logs` ( `TimeKey` decimal(16,6) NOT NULL, `Component` varchar(32) NOT NULL, `ServerId` int(10) unsigned, - `Pid` smallint(6) DEFAULT NULL, + `Pid` int(10) DEFAULT NULL, `Level` tinyint(3) NOT NULL, `Code` char(3) NOT NULL, `Message` text NOT NULL, From 397eb1a01ba5340818ab3150cb68e01f46a08bbc Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Mon, 4 Apr 2016 15:14:42 -0400 Subject: [PATCH 31/90] increase the size of the Pid field in Logs to accomodate FreeBSD --- db/zm_update-1.29.1.sql | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 db/zm_update-1.29.1.sql diff --git a/db/zm_update-1.29.1.sql b/db/zm_update-1.29.1.sql new file mode 100644 index 000000000..8fd43c318 --- /dev/null +++ b/db/zm_update-1.29.1.sql @@ -0,0 +1,7 @@ +-- +-- This updates a 1.29.0 database to 1.29.1 +-- +-- + +-- Increase the size of the Pid field for FreeBSD +ALTER TABLE Logs MODIFY Pid int(10); From 711343a5cc8e4d6ed48e9faf46e573a49f30022d Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Mon, 4 Apr 2016 16:34:21 -0400 Subject: [PATCH 32/90] fix ZM_SERVER_ID instead of ZM_SERVER --- web/includes/functions.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/includes/functions.php b/web/includes/functions.php index 8b69926da..25d81bb44 100644 --- a/web/includes/functions.php +++ b/web/includes/functions.php @@ -982,7 +982,7 @@ function daemonControl( $command, $daemon=false, $args=false ) function zmcControl( $monitor, $mode=false ) { - if ( (!ZM_SERVER) or ( ZM_SERVER==$monitor['ServerId'] ) ) { + if ( (!defined('ZM_SERVER_ID')) or ( ZM_SERVER_ID==$monitor['ServerId'] ) ) { $row = NULL; if ( $monitor['Type'] == "Local" ) { @@ -1013,7 +1013,7 @@ function zmcControl( $monitor, $mode=false ) function zmaControl( $monitor, $mode=false ) { - if ( (!ZM_SERVER) or ( ZM_SERVER==$monitor['ServerId'] ) ) { + if ( (!defined('ZM_SERVER_ID')) or ( ZM_SERVER_ID==$monitor['ServerId'] ) ) { if ( !is_array( $monitor ) ) { $monitor = dbFetchOne( "select C.*, M.* from Monitors as M left join Controls as C on (M.ControlId = C.Id ) where M.Id=?", NULL, array($monitor) ); From 0f1a53089137807196c39e0553cb08ee2304fad4 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 5 Apr 2016 09:03:37 -0400 Subject: [PATCH 33/90] ciontrol files need spaces on multi-line lines --- distros/debian/control | 60 +++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/distros/debian/control b/distros/debian/control index 538b24770..c7becfa64 100644 --- a/distros/debian/control +++ b/distros/debian/control @@ -3,41 +3,41 @@ Section: net Priority: optional Maintainer: Isaac Connor Build-Depends: debhelper (>= 9), autoconf, automake, quilt , libtool, dh-autoreconf -,libgnutls-dev|libgnutls28-dev -,libmysqlclient-dev | libmariadbclient-dev, libdbd-mysql-perl -,libjpeg8-dev|libjpeg9-dev|libjpeg62-turbo-dev -,libpcre3-dev -,libavcodec-dev, libavformat-dev (>= 3:0.svn20090204), libswscale-dev (>= 3:0.svn20090204), libavutil-dev, libavdevice-dev -,libv4l-dev (>= 0.8.3), libvlccore-dev, libvlc-dev -,libbz2-dev -,libsys-mmap-perl -,libnetpbm10-dev -,libcurl4-gnutls-dev | libcurl4-nss-dev | libcurl4-openssl-dev -,libgcrypt11-dev|libgcrypt20-dev, libpolkit-gobject-1-dev + ,libgnutls-dev|libgnutls28-dev + ,libmysqlclient-dev | libmariadbclient-dev, libdbd-mysql-perl + ,libjpeg8-dev|libjpeg9-dev|libjpeg62-turbo-dev + ,libpcre3-dev + ,libavcodec-dev, libavformat-dev (>= 3:0.svn20090204), libswscale-dev (>= 3:0.svn20090204), libavutil-dev, libavdevice-dev + ,libv4l-dev (>= 0.8.3), libvlccore-dev, libvlc-dev + ,libbz2-dev + ,libsys-mmap-perl + ,libnetpbm10-dev + ,libcurl4-gnutls-dev | libcurl4-nss-dev | libcurl4-openssl-dev + ,libgcrypt11-dev|libgcrypt20-dev, libpolkit-gobject-1-dev Standards-Version: 3.9.4 Package: zoneminder Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, ${perl:Depends} -, apache2, libapache2-mod-php5 | libapache2-mod-fcgid -, php5, php5-mysql|php5-mysqlnd, libphp-serialization-perl -, libdate-manip-perl, libmime-lite-perl, libmime-tools-perl -, mariadb-client|mysql-client -, libwww-perl, libarchive-tar-perl, libarchive-zip-perl -, libdevice-serialport-perl, libpcre3 -, ffmpeg | libav-tools -, rsyslog | system-log-daemon -, libmodule-load-perl, libsys-mmap-perl, libjson-any-perl -, netpbm -, libavdevice53 | libavdevice55 -, libjpeg8|libjpeg9|libjpeg62-turbo -, zip -, libnet-sftp-foreign-perl, libio-pty-perl, libexpect-perl -, libvlccore5 | libvlccore7 | libvlccore8, libvlc5 -, libcurl4-gnutls-dev | libcurl4-nss-dev | libcurl4-openssl-dev -, libpolkit-gobject-1-0, liburi-encode-perl, php5-gd -, libdata-dump-perl, libclass-std-fast-perl, libsoap-wsdl-perl, libio-socket-multicast-perl, libdigest-sha-perl -, libsys-cpu-perl, libsys-meminfo-perl + , apache2, libapache2-mod-php5 | libapache2-mod-fcgid + , php5, php5-mysql|php5-mysqlnd, libphp-serialization-perl + , libdate-manip-perl, libmime-lite-perl, libmime-tools-perl + , mariadb-client|mysql-client + , libwww-perl, libarchive-tar-perl, libarchive-zip-perl + , libdevice-serialport-perl, libpcre3 + , ffmpeg | libav-tools + , rsyslog | system-log-daemon + , libmodule-load-perl, libsys-mmap-perl, libjson-any-perl + , netpbm + , libavdevice53 | libavdevice55 + , libjpeg8|libjpeg9|libjpeg62-turbo + , zip + , libnet-sftp-foreign-perl, libio-pty-perl, libexpect-perl + , libvlccore5 | libvlccore7 | libvlccore8, libvlc5 + , libcurl4-gnutls-dev | libcurl4-nss-dev | libcurl4-openssl-dev + , libpolkit-gobject-1-0, liburi-encode-perl, php5-gd + , libdata-dump-perl, libclass-std-fast-perl, libsoap-wsdl-perl, libio-socket-multicast-perl, libdigest-sha-perl + , libsys-cpu-perl, libsys-meminfo-perl Recommends: mysql-server|mariadb-server Description: Video camera security and surveillance solution ZoneMinder is intended for use in single or multi-camera video security From 9c5b47404dad74e5f6593263ff4689a711403609 Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Wed, 6 Apr 2016 06:45:21 -0500 Subject: [PATCH 34/90] Update CMakeLists.txt --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b2014e1c1..11fffd2f9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -182,7 +182,7 @@ elseif(ZM_TARGET_DISTRO STREQUAL "OS13") set(ZM_WEB_GROUP "www") set(ZM_WEBDIR "/srv/www/htdocs/zoneminder") set(ZM_CGIDIR "/srv/www/cgi-bin") -elseif(ZM_TARGET_DISTRO STREQUAL "freeBSD") +elseif(ZM_TARGET_DISTRO STREQUAL "FreeBSD") set(ZM_RUNDIR "/var/run/zm") set(ZM_SOCKDIR "/var/run/zm") set(ZM_TMPDIR "/var/tmp/zm") From 3e5a4b64815aff33ad8118febe23d5b1bb8ff859 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 6 Apr 2016 08:43:20 -0400 Subject: [PATCH 35/90] remove autotools builds, replace them with cmake versions --- distros/debian/README.source | 5 - distros/debian/changelog | 29 + distros/debian/control | 61 +- distros/debian/copyright | 35 ++ distros/debian/dirs | 1 - distros/debian/init.d | 9 +- distros/debian/install | 10 +- distros/debian/links | 1 - distros/debian/patches/series | 0 distros/debian/postinst | 4 +- distros/debian/postrm | 10 +- distros/debian/preinst | 0 distros/debian/rules | 81 +-- distros/debian8/README.Debian | 51 -- distros/debian8/apache.conf | 9 - distros/debian8/changelog | 41 -- distros/debian8/compat | 1 - distros/debian8/control | 103 ---- distros/debian8/copyright | 22 - distros/debian8/docs | 1 - distros/debian8/libzoneminder-perl.install | 4 - distros/debian8/po/POTFILES.in | 3 - distros/debian8/po/fr.po | 252 -------- distros/debian8/po/templates.pot | 222 ------- distros/debian8/rules | 154 ----- distros/debian8/source/local-options | 0 distros/debian8/source/options | 1 - distros/debian8/zoneminder-core.config | 11 - distros/debian8/zoneminder-core.dirs | 4 - distros/debian8/zoneminder-core.install | 4 - distros/debian8/zoneminder-core.links | 3 - distros/debian8/zoneminder-core.postinst | 80 --- distros/debian8/zoneminder-core.postrm | 37 -- distros/debian8/zoneminder-core.preinst | 33 - distros/debian8/zoneminder-core.templates | 19 - .../debian8/zoneminder-core.zoneminder.init | 36 -- .../zoneminder-core.zoneminder.service | 19 - .../zoneminder-core.zoneminder.tmpfile | 1 - distros/debian8/zoneminder-database.config | 142 ----- distros/debian8/zoneminder-database.dirs | 3 - distros/debian8/zoneminder-database.install | 1 - distros/debian8/zoneminder-database.postinst | 79 --- distros/debian8/zoneminder-database.postrm | 34 - distros/debian8/zoneminder-database.prerm | 22 - distros/debian8/zoneminder-database.templates | 58 -- distros/debian8/zoneminder-ui-base.config | 20 - distros/debian8/zoneminder-ui-base.install | 11 - distros/debian8/zoneminder-ui-base.links | 1 - distros/debian8/zoneminder-ui-base.postinst | 48 -- distros/debian8/zoneminder-ui-base.postrm | 41 -- distros/debian8/zoneminder-ui-base.templates | 7 - distros/debian8/zoneminder-ui-classic.install | 1 - distros/debian_cmake/README.Debian | 51 -- distros/debian_cmake/apache.conf | 9 - distros/debian_cmake/changelog | 47 -- distros/debian_cmake/compat | 1 - distros/debian_cmake/control | 71 --- distros/debian_cmake/copyright | 57 -- distros/debian_cmake/dirs | 5 - distros/debian_cmake/docs | 1 - distros/debian_cmake/init.d | 88 --- distros/debian_cmake/install | 8 - distros/debian_cmake/links | 3 - distros/debian_cmake/postinst | 53 -- distros/debian_cmake/postrm | 11 - distros/debian_cmake/preinst | 32 - distros/debian_cmake/rules | 41 -- distros/debian_cmake/watch | 3 - distros/{ubuntu1204_cmake => ubuntu1204}/NEWS | 0 distros/ubuntu1204/README.Debian | 125 +++- .../TODO.Debian | 0 distros/ubuntu1204/apache.conf | 21 - distros/ubuntu1204/changelog | 579 ++++++++++++++++-- .../{ubuntu1204_cmake => ubuntu1204}/clean | 0 .../conf/apache2/zoneminder.conf | 0 distros/ubuntu1204/control | 172 ++++-- distros/ubuntu1204/copyright | 184 +++++- distros/ubuntu1204/dirs | 6 - distros/ubuntu1204/docs | 1 - .../examples/nginx.conf | 0 .../{ubuntu1204_cmake => ubuntu1204}/gbp.conf | 0 distros/ubuntu1204/init.d | 91 --- distros/ubuntu1204/install | 12 - .../libzoneminder-perl.install | 0 distros/ubuntu1204/links | 4 - .../patches/default_cgi-path.patch | 0 distros/ubuntu1204/patches/series | 2 + .../patches/use_libjs-mootools.patch | 0 distros/ubuntu1204/postinst | 53 -- distros/ubuntu1204/postrm | 9 - distros/ubuntu1204/preinst | 32 - distros/ubuntu1204/rules | 110 ++-- distros/{debian8 => ubuntu1204}/source/format | 0 .../source/lintian-overrides | 0 distros/ubuntu1204/watch | 8 +- .../zoneminder-doc.doc-base | 0 .../zoneminder-doc.install | 0 .../zoneminder-doc.links | 0 .../zoneminder.apache2 | 0 .../zoneminder.bug-presubj | 0 .../zoneminder.dirs | 0 .../zoneminder.docs | 0 .../zoneminder.examples | 0 .../zoneminder.init | 0 .../zoneminder.install | 0 .../zoneminder.links | 0 .../zoneminder.linktrees | 0 .../zoneminder.lintian-overrides | 0 .../zoneminder.logrotate | 0 .../zoneminder.maintscript | 0 .../zoneminder.manpages | 0 .../zoneminder.postinst | 0 .../zoneminder.postrm | 0 .../zoneminder.preinst | 0 .../zoneminder.service | 0 .../zoneminder.tmpfile | 0 distros/ubuntu1204_cmake/README.Debian | 160 ----- distros/ubuntu1204_cmake/changelog | 573 ----------------- distros/ubuntu1204_cmake/compat | 1 - distros/ubuntu1204_cmake/control | 138 ----- distros/ubuntu1204_cmake/copyright | 174 ------ distros/ubuntu1204_cmake/patches/series | 2 - distros/ubuntu1204_cmake/rules | 87 --- distros/ubuntu1204_cmake/watch | 7 - distros/{ubuntu1504_cmake => ubuntu1504}/NEWS | 0 distros/ubuntu1504/README.Debian | 125 +++- .../TODO.Debian | 0 distros/ubuntu1504/apache.conf | 9 - distros/ubuntu1504/changelog | 579 ++++++++++++++++-- .../{ubuntu1504_cmake => ubuntu1504}/clean | 0 .../conf/apache2/zoneminder.conf | 0 distros/ubuntu1504/control | 174 ++++-- distros/ubuntu1504/copyright | 184 +++++- distros/ubuntu1504/dirs | 6 - distros/ubuntu1504/docs | 1 - .../examples/nginx.conf | 0 .../{ubuntu1504_cmake => ubuntu1504}/gbp.conf | 0 distros/ubuntu1504/install | 12 - .../libzoneminder-perl.install | 0 distros/ubuntu1504/links | 4 - .../patches/default_cgi-path.patch | 0 distros/ubuntu1504/patches/series | 2 + .../patches/use_libjs-mootools.patch | 0 distros/ubuntu1504/postinst | 53 -- distros/ubuntu1504/postrm | 9 - distros/ubuntu1504/preinst | 32 - distros/ubuntu1504/rules | 116 ++-- .../source/format | 0 .../source/lintian-overrides | 0 distros/ubuntu1504/watch | 8 +- .../zoneminder-doc.doc-base | 0 .../zoneminder-doc.install | 0 .../zoneminder-doc.links | 0 .../zoneminder.apache2 | 0 .../zoneminder.bug-presubj | 0 .../zoneminder.dirs | 0 .../zoneminder.docs | 0 .../zoneminder.examples | 0 .../zoneminder.init | 0 .../zoneminder.install | 0 .../zoneminder.links | 0 .../zoneminder.linktrees | 0 .../zoneminder.lintian-overrides | 0 .../zoneminder.logrotate | 0 .../zoneminder.maintscript | 0 .../zoneminder.manpages | 0 .../zoneminder.postinst | 0 .../zoneminder.postrm | 0 .../zoneminder.preinst | 0 distros/ubuntu1504/zoneminder.service | 32 +- distros/ubuntu1504/zoneminder.tmpfile | 2 +- distros/ubuntu1504_cmake/README.Debian | 160 ----- distros/ubuntu1504_cmake/changelog | 573 ----------------- distros/ubuntu1504_cmake/compat | 1 - distros/ubuntu1504_cmake/control | 146 ----- distros/ubuntu1504_cmake/copyright | 174 ------ distros/ubuntu1504_cmake/patches/series | 2 - distros/ubuntu1504_cmake/rules | 93 --- distros/ubuntu1504_cmake/source/format | 1 - distros/ubuntu1504_cmake/watch | 7 - distros/ubuntu1504_cmake/zoneminder.service | 20 - distros/ubuntu1504_cmake/zoneminder.tmpfile | 2 - 182 files changed, 2182 insertions(+), 5202 deletions(-) delete mode 100644 distros/debian/README.source delete mode 100644 distros/debian/patches/series mode change 100755 => 100644 distros/debian/preinst delete mode 100644 distros/debian8/README.Debian delete mode 100644 distros/debian8/apache.conf delete mode 100644 distros/debian8/changelog delete mode 100644 distros/debian8/compat delete mode 100644 distros/debian8/control delete mode 100644 distros/debian8/copyright delete mode 100644 distros/debian8/docs delete mode 100644 distros/debian8/libzoneminder-perl.install delete mode 100644 distros/debian8/po/POTFILES.in delete mode 100644 distros/debian8/po/fr.po delete mode 100644 distros/debian8/po/templates.pot delete mode 100755 distros/debian8/rules delete mode 100644 distros/debian8/source/local-options delete mode 100644 distros/debian8/source/options delete mode 100644 distros/debian8/zoneminder-core.config delete mode 100644 distros/debian8/zoneminder-core.dirs delete mode 100644 distros/debian8/zoneminder-core.install delete mode 100644 distros/debian8/zoneminder-core.links delete mode 100644 distros/debian8/zoneminder-core.postinst delete mode 100644 distros/debian8/zoneminder-core.postrm delete mode 100644 distros/debian8/zoneminder-core.preinst delete mode 100644 distros/debian8/zoneminder-core.templates delete mode 100644 distros/debian8/zoneminder-core.zoneminder.init delete mode 100644 distros/debian8/zoneminder-core.zoneminder.service delete mode 100644 distros/debian8/zoneminder-core.zoneminder.tmpfile delete mode 100644 distros/debian8/zoneminder-database.config delete mode 100644 distros/debian8/zoneminder-database.dirs delete mode 100644 distros/debian8/zoneminder-database.install delete mode 100644 distros/debian8/zoneminder-database.postinst delete mode 100644 distros/debian8/zoneminder-database.postrm delete mode 100644 distros/debian8/zoneminder-database.prerm delete mode 100644 distros/debian8/zoneminder-database.templates delete mode 100644 distros/debian8/zoneminder-ui-base.config delete mode 100644 distros/debian8/zoneminder-ui-base.install delete mode 100644 distros/debian8/zoneminder-ui-base.links delete mode 100644 distros/debian8/zoneminder-ui-base.postinst delete mode 100644 distros/debian8/zoneminder-ui-base.postrm delete mode 100644 distros/debian8/zoneminder-ui-base.templates delete mode 100644 distros/debian8/zoneminder-ui-classic.install delete mode 100644 distros/debian_cmake/README.Debian delete mode 100644 distros/debian_cmake/apache.conf delete mode 100644 distros/debian_cmake/changelog delete mode 100644 distros/debian_cmake/compat delete mode 100644 distros/debian_cmake/control delete mode 100644 distros/debian_cmake/copyright delete mode 100644 distros/debian_cmake/dirs delete mode 100644 distros/debian_cmake/docs delete mode 100644 distros/debian_cmake/init.d delete mode 100644 distros/debian_cmake/install delete mode 100644 distros/debian_cmake/links delete mode 100644 distros/debian_cmake/postinst delete mode 100644 distros/debian_cmake/postrm delete mode 100644 distros/debian_cmake/preinst delete mode 100755 distros/debian_cmake/rules delete mode 100644 distros/debian_cmake/watch rename distros/{ubuntu1204_cmake => ubuntu1204}/NEWS (100%) rename distros/{ubuntu1204_cmake => ubuntu1204}/TODO.Debian (100%) delete mode 100644 distros/ubuntu1204/apache.conf rename distros/{ubuntu1204_cmake => ubuntu1204}/clean (100%) rename distros/{ubuntu1204_cmake => ubuntu1204}/conf/apache2/zoneminder.conf (100%) delete mode 100644 distros/ubuntu1204/dirs delete mode 100644 distros/ubuntu1204/docs rename distros/{ubuntu1204_cmake => ubuntu1204}/examples/nginx.conf (100%) rename distros/{ubuntu1204_cmake => ubuntu1204}/gbp.conf (100%) delete mode 100644 distros/ubuntu1204/init.d delete mode 100644 distros/ubuntu1204/install rename distros/{ubuntu1204_cmake => ubuntu1204}/libzoneminder-perl.install (100%) delete mode 100644 distros/ubuntu1204/links rename distros/{ubuntu1204_cmake => ubuntu1204}/patches/default_cgi-path.patch (100%) rename distros/{ubuntu1204_cmake => ubuntu1204}/patches/use_libjs-mootools.patch (100%) delete mode 100644 distros/ubuntu1204/postinst delete mode 100644 distros/ubuntu1204/postrm delete mode 100755 distros/ubuntu1204/preinst rename distros/{debian8 => ubuntu1204}/source/format (100%) rename distros/{ubuntu1204_cmake => ubuntu1204}/source/lintian-overrides (100%) rename distros/{ubuntu1204_cmake => ubuntu1204}/zoneminder-doc.doc-base (100%) rename distros/{ubuntu1204_cmake => ubuntu1204}/zoneminder-doc.install (100%) rename distros/{ubuntu1204_cmake => ubuntu1204}/zoneminder-doc.links (100%) rename distros/{ubuntu1204_cmake => ubuntu1204}/zoneminder.apache2 (100%) rename distros/{ubuntu1204_cmake => ubuntu1204}/zoneminder.bug-presubj (100%) rename distros/{ubuntu1204_cmake => ubuntu1204}/zoneminder.dirs (100%) rename distros/{ubuntu1204_cmake => ubuntu1204}/zoneminder.docs (100%) rename distros/{ubuntu1204_cmake => ubuntu1204}/zoneminder.examples (100%) rename distros/{ubuntu1204_cmake => ubuntu1204}/zoneminder.init (100%) rename distros/{ubuntu1204_cmake => ubuntu1204}/zoneminder.install (100%) rename distros/{ubuntu1204_cmake => ubuntu1204}/zoneminder.links (100%) rename distros/{ubuntu1204_cmake => ubuntu1204}/zoneminder.linktrees (100%) rename distros/{ubuntu1204_cmake => ubuntu1204}/zoneminder.lintian-overrides (100%) rename distros/{ubuntu1204_cmake => ubuntu1204}/zoneminder.logrotate (100%) rename distros/{ubuntu1204_cmake => ubuntu1204}/zoneminder.maintscript (100%) rename distros/{ubuntu1204_cmake => ubuntu1204}/zoneminder.manpages (100%) rename distros/{ubuntu1204_cmake => ubuntu1204}/zoneminder.postinst (100%) rename distros/{ubuntu1204_cmake => ubuntu1204}/zoneminder.postrm (100%) rename distros/{ubuntu1204_cmake => ubuntu1204}/zoneminder.preinst (100%) rename distros/{ubuntu1204_cmake => ubuntu1204}/zoneminder.service (100%) rename distros/{ubuntu1204_cmake => ubuntu1204}/zoneminder.tmpfile (100%) delete mode 100644 distros/ubuntu1204_cmake/README.Debian delete mode 100644 distros/ubuntu1204_cmake/changelog delete mode 100644 distros/ubuntu1204_cmake/compat delete mode 100644 distros/ubuntu1204_cmake/control delete mode 100644 distros/ubuntu1204_cmake/copyright delete mode 100644 distros/ubuntu1204_cmake/patches/series delete mode 100755 distros/ubuntu1204_cmake/rules delete mode 100644 distros/ubuntu1204_cmake/watch rename distros/{ubuntu1504_cmake => ubuntu1504}/NEWS (100%) rename distros/{ubuntu1504_cmake => ubuntu1504}/TODO.Debian (100%) delete mode 100644 distros/ubuntu1504/apache.conf rename distros/{ubuntu1504_cmake => ubuntu1504}/clean (100%) rename distros/{ubuntu1504_cmake => ubuntu1504}/conf/apache2/zoneminder.conf (100%) delete mode 100644 distros/ubuntu1504/dirs delete mode 100644 distros/ubuntu1504/docs rename distros/{ubuntu1504_cmake => ubuntu1504}/examples/nginx.conf (100%) rename distros/{ubuntu1504_cmake => ubuntu1504}/gbp.conf (100%) delete mode 100644 distros/ubuntu1504/install rename distros/{ubuntu1504_cmake => ubuntu1504}/libzoneminder-perl.install (100%) delete mode 100644 distros/ubuntu1504/links rename distros/{ubuntu1504_cmake => ubuntu1504}/patches/default_cgi-path.patch (100%) rename distros/{ubuntu1504_cmake => ubuntu1504}/patches/use_libjs-mootools.patch (100%) delete mode 100644 distros/ubuntu1504/postinst delete mode 100644 distros/ubuntu1504/postrm delete mode 100755 distros/ubuntu1504/preinst rename distros/{ubuntu1204_cmake => ubuntu1504}/source/format (100%) rename distros/{ubuntu1504_cmake => ubuntu1504}/source/lintian-overrides (100%) rename distros/{ubuntu1504_cmake => ubuntu1504}/zoneminder-doc.doc-base (100%) rename distros/{ubuntu1504_cmake => ubuntu1504}/zoneminder-doc.install (100%) rename distros/{ubuntu1504_cmake => ubuntu1504}/zoneminder-doc.links (100%) rename distros/{ubuntu1504_cmake => ubuntu1504}/zoneminder.apache2 (100%) rename distros/{ubuntu1504_cmake => ubuntu1504}/zoneminder.bug-presubj (100%) rename distros/{ubuntu1504_cmake => ubuntu1504}/zoneminder.dirs (100%) rename distros/{ubuntu1504_cmake => ubuntu1504}/zoneminder.docs (100%) rename distros/{ubuntu1504_cmake => ubuntu1504}/zoneminder.examples (100%) rename distros/{ubuntu1504_cmake => ubuntu1504}/zoneminder.init (100%) rename distros/{ubuntu1504_cmake => ubuntu1504}/zoneminder.install (100%) rename distros/{ubuntu1504_cmake => ubuntu1504}/zoneminder.links (100%) rename distros/{ubuntu1504_cmake => ubuntu1504}/zoneminder.linktrees (100%) rename distros/{ubuntu1504_cmake => ubuntu1504}/zoneminder.lintian-overrides (100%) rename distros/{ubuntu1504_cmake => ubuntu1504}/zoneminder.logrotate (100%) rename distros/{ubuntu1504_cmake => ubuntu1504}/zoneminder.maintscript (100%) rename distros/{ubuntu1504_cmake => ubuntu1504}/zoneminder.manpages (100%) rename distros/{ubuntu1504_cmake => ubuntu1504}/zoneminder.postinst (100%) rename distros/{ubuntu1504_cmake => ubuntu1504}/zoneminder.postrm (100%) rename distros/{ubuntu1504_cmake => ubuntu1504}/zoneminder.preinst (100%) delete mode 100644 distros/ubuntu1504_cmake/README.Debian delete mode 100644 distros/ubuntu1504_cmake/changelog delete mode 100644 distros/ubuntu1504_cmake/compat delete mode 100644 distros/ubuntu1504_cmake/control delete mode 100644 distros/ubuntu1504_cmake/copyright delete mode 100644 distros/ubuntu1504_cmake/patches/series delete mode 100755 distros/ubuntu1504_cmake/rules delete mode 100644 distros/ubuntu1504_cmake/source/format delete mode 100644 distros/ubuntu1504_cmake/watch delete mode 100644 distros/ubuntu1504_cmake/zoneminder.service delete mode 100644 distros/ubuntu1504_cmake/zoneminder.tmpfile diff --git a/distros/debian/README.source b/distros/debian/README.source deleted file mode 100644 index 646e55d86..000000000 --- a/distros/debian/README.source +++ /dev/null @@ -1,5 +0,0 @@ -This package uses quilt to manage all modifications to the upstream source. -Changes are stored in the source package as diffs in debian/patches and applied -during the build. - -See /usr/share/doc/quilt/README.source for a detailed explanation. diff --git a/distros/debian/changelog b/distros/debian/changelog index ceebf9367..46f1e2bd9 100644 --- a/distros/debian/changelog +++ b/distros/debian/changelog @@ -1,3 +1,32 @@ +zoneminder (1.28.108-nmu2015100101) wheezy; urgency=low + + * + + -- Isaac Connor Thu, 01 Oct 2015 18:20:29 +0000 + +zoneminder (1.28.107-nmu2015092401) wheezy; urgency=low + + * + + -- Isaac Connor Thu, 24 Sep 2015 14:15:46 +0000 + +zoneminder (1.28.1+106-nmu2015091001) wheezy; urgency=low + + * + + -- Isaac Connor Thu, 10 Sep 2015 18:03:43 +0000 + +zoneminder (1.28.0-0.1) wheezy; urgency=low + + * Use CMake instead of Autotools to simplify + debian/rules and have less build-depends. + * Some lintian love in debian/{control,copyright} + and perl ZoneMinder modules. + * Don't purge database if we use a remote + MySQL server. + + -- Cosme Domínguez Díaz Sun, 09 Nov 2014 02:20:20 +0100 + zoneminder (1.28.0-wheezy) wheezy; urgency=medium * Release diff --git a/distros/debian/control b/distros/debian/control index c7becfa64..3b11f37b8 100644 --- a/distros/debian/control +++ b/distros/debian/control @@ -2,45 +2,46 @@ Source: zoneminder Section: net Priority: optional Maintainer: Isaac Connor -Build-Depends: debhelper (>= 9), autoconf, automake, quilt , libtool, dh-autoreconf - ,libgnutls-dev|libgnutls28-dev - ,libmysqlclient-dev | libmariadbclient-dev, libdbd-mysql-perl - ,libjpeg8-dev|libjpeg9-dev|libjpeg62-turbo-dev - ,libpcre3-dev - ,libavcodec-dev, libavformat-dev (>= 3:0.svn20090204), libswscale-dev (>= 3:0.svn20090204), libavutil-dev, libavdevice-dev - ,libv4l-dev (>= 0.8.3), libvlccore-dev, libvlc-dev - ,libbz2-dev - ,libsys-mmap-perl - ,libnetpbm10-dev - ,libcurl4-gnutls-dev | libcurl4-nss-dev | libcurl4-openssl-dev - ,libgcrypt11-dev|libgcrypt20-dev, libpolkit-gobject-1-dev +Build-Depends: debhelper (>= 9), cmake + , libphp-serialization-perl + , libgnutls28-dev | libgnutls-dev + , libmysqlclient-dev | libmariadbclient-dev + , libjpeg8-dev + , libpcre3-dev + , libavcodec-dev, libavformat-dev (>= 3:0.svn20090204), libswscale-dev (>= 3:0.svn20090204), libavutil-dev + , libv4l-dev (>= 0.8.3) + , libbz2-dev + , libav-tools + , libnetpbm10-dev + , libavdevice-dev + , libvlccore-dev, libvlc-dev + , libcurl4-gnutls-dev | libcurl4-nss-dev | libcurl4-openssl-dev + , libgcrypt11-dev, libpolkit-gobject-1-dev Standards-Version: 3.9.4 Package: zoneminder Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, ${perl:Depends} - , apache2, libapache2-mod-php5 | libapache2-mod-fcgid - , php5, php5-mysql|php5-mysqlnd, libphp-serialization-perl - , libdate-manip-perl, libmime-lite-perl, libmime-tools-perl - , mariadb-client|mysql-client - , libwww-perl, libarchive-tar-perl, libarchive-zip-perl - , libdevice-serialport-perl, libpcre3 - , ffmpeg | libav-tools - , rsyslog | system-log-daemon + , apache2 | httpd, libapache2-mod-php5 | libapache2-mod-fcgid | php5-fpm + , php5-mysqlnd | php5-mysql + , mariadb-client | mysql-client + , libphp-serialization-perl + , libdate-manip-perl, libmime-lite-perl, libmime-tools-perl, libdbd-mysql-perl + , libwww-perl, libarchive-tar-perl, libarchive-zip-perl, libdevice-serialport-perl , libmodule-load-perl, libsys-mmap-perl, libjson-any-perl - , netpbm - , libavdevice53 | libavdevice55 - , libjpeg8|libjpeg9|libjpeg62-turbo - , zip , libnet-sftp-foreign-perl, libio-pty-perl, libexpect-perl - , libvlccore5 | libvlccore7 | libvlccore8, libvlc5 - , libcurl4-gnutls-dev | libcurl4-nss-dev | libcurl4-openssl-dev - , libpolkit-gobject-1-0, liburi-encode-perl, php5-gd , libdata-dump-perl, libclass-std-fast-perl, libsoap-wsdl-perl, libio-socket-multicast-perl, libdigest-sha-perl , libsys-cpu-perl, libsys-meminfo-perl -Recommends: mysql-server|mariadb-server + , libpcre3 + , libav-tools, libavdevice53 + , rsyslog | system-log-daemon + , netpbm , libjpeg8 + , zip + , libvlccore5 | libvlccore7, libvlc5 + , libpolkit-gobject-1-0, php5-gd +Recommends: mysql-server | mariadb-server Description: Video camera security and surveillance solution - ZoneMinder is intended for use in single or multi-camera video security + ZoneMinder is intended for use in single or multi-camera video security applications, including commercial or home CCTV, theft prevention and child or family member or home monitoring and other care scenarios. It supports capture, analysis, recording, and monitoring of video data coming @@ -52,9 +53,9 @@ Description: Video camera security and surveillance solution via X.10 or other protocols. Package: zoneminder-dbg +Architecture: any Section: debug Priority: extra -Architecture: any Depends: zoneminder (= ${binary:Version}), ${misc:Depends} Description: Debugging symbols for zoneminder. ZoneMinder is a video camera security and surveillance solution. diff --git a/distros/debian/copyright b/distros/debian/copyright index a177502a0..1c10c59db 100644 --- a/distros/debian/copyright +++ b/distros/debian/copyright @@ -20,3 +20,38 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA On Debian GNU/Linux systems, the text of the GPL can be found in /usr/share/common-licenses/GPL. + +/usr/share/zoneminder/api/lib/Cake/*: +Copyright: + +Copyright (c) 2005-2013, Cake Software Foundation, Inc. + +License: + +CakePHP(tm) : The Rapid Development PHP Framework (http://cakephp.org) + +The MIT License + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +Cake Software Foundation, Inc. +1785 E. Sahara Avenue, +Suite 490-204 +Las Vegas, Nevada 89104, +United States of America. diff --git a/distros/debian/dirs b/distros/debian/dirs index 4178482c1..9e29e6113 100644 --- a/distros/debian/dirs +++ b/distros/debian/dirs @@ -3,4 +3,3 @@ var/lib/zm var/cache/zoneminder/events var/cache/zoneminder/images var/cache/zoneminder/temp -usr/share/zoneminder/db diff --git a/distros/debian/init.d b/distros/debian/init.d index f22143c38..036bb695d 100644 --- a/distros/debian/init.d +++ b/distros/debian/init.d @@ -24,12 +24,10 @@ command="$ZM_PATH_BIN/zmpkg.pl" start() { echo -n "Starting $prog: " export TZ=:/etc/localtime - mkdir -p $RUNDIR && chown www-data:www-data $RUNDIR - mkdir -p $TMPDIR && chown www-data:www-data $TMPDIR + mkdir -p $RUNDIR $TMPDIR && chown www-data:www-data $RUNDIR $TMPDIR $command start RETVAL=$? - [ $RETVAL = 0 ] && echo success - [ $RETVAL != 0 ] && echo failure + [ $RETVAL = 0 ] && echo success || echo failure echo [ $RETVAL = 0 ] && touch /var/lock/zm return $RETVAL @@ -52,8 +50,7 @@ stop() { else $command stop RETVAL=$? - [ $RETVAL = 0 ] && echo success - [ $RETVAL != 0 ] && echo failure + [ $RETVAL = 0 ] && echo success || echo failure echo [ $RETVAL = 0 ] && rm -f /var/lock/zm fi diff --git a/distros/debian/install b/distros/debian/install index 4b0009cea..97c5f7a03 100644 --- a/distros/debian/install +++ b/distros/debian/install @@ -1,12 +1,8 @@ usr/bin -usr/lib/cgi-bin +usr/lib/zoneminder/cgi-bin usr/share/man usr/share/perl5/ZoneMinder usr/share/perl5/ZoneMinder.pm -usr/share/polkit-1/actions -usr/share/polkit-1/rules.d -usr/share/zoneminder +usr/share/zoneminder/db +usr/share/zoneminder/www etc/zm -db/zm_create.sql usr/share/zoneminder/db -db/zm_update-*.sql usr/share/zoneminder/db -debian/apache.conf etc/zm diff --git a/distros/debian/links b/distros/debian/links index 9715ee428..5560a100a 100644 --- a/distros/debian/links +++ b/distros/debian/links @@ -1,4 +1,3 @@ var/cache/zoneminder/events usr/share/zoneminder/events var/cache/zoneminder/images usr/share/zoneminder/images var/cache/zoneminder/temp usr/share/zoneminder/temp -usr/lib/cgi-bin usr/share/zoneminder/cgi-bin diff --git a/distros/debian/patches/series b/distros/debian/patches/series deleted file mode 100644 index e69de29bb..000000000 diff --git a/distros/debian/postinst b/distros/debian/postinst index 42a3bb1dc..d06f9c641 100644 --- a/distros/debian/postinst +++ b/distros/debian/postinst @@ -15,7 +15,7 @@ if [ "$1" = "configure" ]; then # test if database if already present... if ! $(echo quit | mysql --defaults-file=/etc/mysql/debian.cnf zm > /dev/null 2> /dev/null) ; then cat /usr/share/zoneminder/db/zm_create.sql | mysql --defaults-file=/etc/mysql/debian.cnf - echo 'grant lock tables, alter,select,insert,update,delete,create,index on zm.* to 'zmuser'@localhost identified by "zmpass";' | mysql --defaults-file=/etc/mysql/debian.cnf mysql + echo 'grant lock tables, alter,select,insert,update,delete on zm.* to 'zmuser'@localhost identified by "zmpass";' | mysql --defaults-file=/etc/mysql/debian.cnf mysql fi invoke-rc.d zoneminder stop || true @@ -47,8 +47,6 @@ if [ "$1" = "configure" ]; then chown www-data:www-data -R /var/cache/zoneminder else chown www-data:www-data /var/log/zm - - echo 'grant lock tables, create, index, alter on zm.* to 'zmuser'@localhost identified by "zmpass";' | mysql --defaults-file=/etc/mysql/debian.cnf mysql zmupdate.pl fi fi diff --git a/distros/debian/postrm b/distros/debian/postrm index 28a00a7a0..fde590981 100644 --- a/distros/debian/postrm +++ b/distros/debian/postrm @@ -1,9 +1,11 @@ #! /bin/sh -# set -e # to be reinstated later +set -e if [ "$1" = "purge" ]; then - echo 'delete from user where User="zmuser";' | mysql --defaults-file=/etc/mysql/debian.cnf mysql - echo 'delete from db where User="zmuser";' | mysql --defaults-file=/etc/mysql/debian.cnf mysql - mysqladmin --defaults-file=/etc/mysql/debian.cnf -f drop zm + if [ -e "/etc/init.d/mysql" ]; then + echo 'delete from user where User="zmuser";' | mysql --defaults-file=/etc/mysql/debian.cnf mysql + echo 'delete from db where User="zmuser";' | mysql --defaults-file=/etc/mysql/debian.cnf mysql + mysqladmin --defaults-file=/etc/mysql/debian.cnf -f drop zm + fi fi #DEBHELPER# diff --git a/distros/debian/preinst b/distros/debian/preinst old mode 100755 new mode 100644 diff --git a/distros/debian/rules b/distros/debian/rules index d07d3b823..4bdc7cb0c 100755 --- a/distros/debian/rules +++ b/distros/debian/rules @@ -1,66 +1,41 @@ #!/usr/bin/make -f # -*- makefile -*- -# Sample debian/rules that uses debhelper. -# This file was originally written by Joey Hess and Craig Small. -# As a special exception, when this file is copied by dh-make into a -# dh-make output file, you may use that output file without restriction. -# This special exception was added by Craig Small in version 0.37 of dh-make. - # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 -# These are used for cross-compiling and for saving the configure script -# from having to guess our platform (since we know it already) -DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) -DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) - -CFLAGS = -Wall -g -CPPFLAGS = -D__STDC_CONSTANT_MACROS -CXXFLAGS = -DHAVE_LIBCRYPTO - -ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) - CFLAGS += -O0 -else - CFLAGS += -O2 -endif - -%: - dh $@ --with quilt,autoreconf +export CFLAGS = -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -pipe +export CXXFLAGS = -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -pipe +INSTDIR = debian/tmp override_dh_auto_configure: - CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" dh_auto_configure -- --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) --sysconfdir=/etc/zm --prefix=/usr --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info --with-mysql=/usr --with-mariadb=/usr --with-webdir=/usr/share/zoneminder --with-ffmpeg=/usr --with-cgidir=/usr/lib/cgi-bin --with-webuser=www-data --with-webgroup=www-data --enable-crashtrace=no --enable-mmap=yes + dh_auto_configure -- \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_SKIP_RPATH=ON \ + -DCMAKE_VERBOSE_MAKEFILE=OFF \ + -DCMAKE_COLOR_MAKEFILE=ON \ + -DZM_RUNDIR=/var/run/zm \ + -DZM_SOCKDIR=/var/run/zm \ + -DZM_TMPDIR=/var/tmp/zm \ + -DZM_LOGDIR=/var/log/zm \ + -DZM_WEBDIR=/usr/share/zoneminder/www \ + -DZM_CONTENTDIR=/var/cache/zoneminder \ + -DZM_CGIDIR=/usr/lib/zoneminder/cgi-bin \ + -DZM_WEB_USER=www-data \ + -DZM_WEB_GROUP=www-data \ + -DCMAKE_INSTALL_SYSCONFDIR=etc/zm -override_dh_clean: - # Add here commands to clean up after the build process. - [ ! -f Makefile ] || $(MAKE) distclean - dh_clean - -override_dh_install: - dh_install --fail-missing - # - # NOTE: This is a short-term kludge; hopefully changes in the next - # upstream version will render this unnecessary. - rm -rf debian/zoneminder/usr/share/zoneminder/events - rm -rf debian/zoneminder/usr/share/zoneminder/images - rm -rf debian/zoneminder/usr/share/zoneminder/temp - dh_link var/cache/zoneminder/events usr/share/zoneminder/events - dh_link var/cache/zoneminder/images usr/share/zoneminder/images - dh_link var/cache/zoneminder/temp usr/share/zoneminder/temp - # - # This is a slightly lesser kludge; moving the cgi stuff to - # /usr/share/zoneminder/cgi-bin breaks one set of behavior, - # having it just in /usr/lib/cgi-bin breaks another bit of - # behavior. - # - dh_link usr/lib/cgi-bin usr/share/zoneminder/cgi-bin - -override_dh_fixperms: - dh_fixperms - chown root:root debian/zoneminder/etc/zm/zm.conf +override_dh_auto_install: + dh_auto_install --buildsystem=cmake + install -D -m 0644 debian/apache.conf $(INSTDIR)/etc/zm/apache.conf + rm $(INSTDIR)/usr/share/zoneminder/api/lib/Cake/LICENSE.txt + rm $(INSTDIR)/usr/share/zoneminder/api/.gitignore + rm -r $(INSTDIR)/usr/share/zoneminder/api/lib/Cake/Test override_dh_auto_test: # do not run tests... -.PHONY: override_dh_strip override_dh_strip: - dh_strip --dbg-package=zoneminder-dbg + dh_strip --dbg-package=zoneminder-dbg + +%: + dh $@ --buildsystem=cmake --parallel diff --git a/distros/debian8/README.Debian b/distros/debian8/README.Debian deleted file mode 100644 index a49b6be72..000000000 --- a/distros/debian8/README.Debian +++ /dev/null @@ -1,51 +0,0 @@ -zoneminder for Debian ---------------------- - -There is one manual step to get the web interface working. -You need to link /etc/zm/apache.conf to /etc/apache2/conf.d/zoneminder.conf, -then reload the apache config (i.e. /etc/init.d/apache2 reload) - -Changing the location for images and events -------------------------------------------- - -Zoneminder, in its upstream form, stores data in /usr/share/zoneminder/. This -package modifies that by changing /usr/share/zoneminder/images and -/usr/share/zoneminder/events to symlinks to directories under -/var/cache/zoneminder. - -There are numerous places these could be put and ways to do it. But, at the -moment, if you change this, an upgrade will fail with a warning about these -locations having changed (the reason for this was that previously, an upgrade -would silently revert the changes and cause event loss - refer -bug #608793). - -If you do want to change the location, here are a couple of suggestions. - -These lines would mount /dev/sdX1 to /video_storage, and then 'link' /video_storage -to the locations that ZoneMinder expects them to be at. - - /dev/sdX1 /video_storage ext4 defaults 0 2 - /video_storage/zoneminder/images /var/cache/zoneminder/images none bind 0 2 - /video_storage/zoneminder/events /var/cache/zoneminder/events none bind 0 2 - - or if you have a separate partition for each: - - /dev/sdX1 /var/cache/zoneminder/images ext4 defaults 0 2 - /dev/sdX2 /var/cache/zoneminder/events ext4 defaults 0 2 - - - - -- Peter Howard , Sun, 16 Jan 2010 01:35:51 +1100 - -Access to /dev/video* ---------------------- - -For cameras which require access to /dev/video*, zoneminder may need the -www-data user added to the video group in order to see those cameras: - - adduser www-data video - -Note that all web applications running on the zoneminder server will then have -access to all video devices on the system. - - -- Vagrant Cascadian Sun, 27 Mar 2011 13:06:56 -0700 diff --git a/distros/debian8/apache.conf b/distros/debian8/apache.conf deleted file mode 100644 index 965c67f86..000000000 --- a/distros/debian8/apache.conf +++ /dev/null @@ -1,9 +0,0 @@ -Alias /zm /usr/share/zoneminder/www - - - php_flag register_globals off - Options Indexes FollowSymLinks - - DirectoryIndex index.php - - diff --git a/distros/debian8/changelog b/distros/debian8/changelog deleted file mode 100644 index 0035f1e36..000000000 --- a/distros/debian8/changelog +++ /dev/null @@ -1,41 +0,0 @@ -zoneminder (1.28.0+nmu1) testing; urgency=medium - - * Non-maintainer upload - * Split the debian package into several packages - * Switch to native source format - - -- Emmanuel Papin Thu, 15 Jan 2015 20:00:08 +0100 - -zoneminder (1.28.0-0.2) testing; urgency=medium - - * Non-maintainer upload. - * Upstream release for debian jessie - * Package dependencies updated - * debhelper version upgraded - * Standards-Version upgraded - * Use debhelper commands instead of standard commands - * Install man pages in /usr/share/man (patch added) - * Switch to quilt - * Switch to systemd - * Some lintian fixes - - -- Emmanuel Papin Wed, 26 Nov 2014 00:26:01 +0100 - -zoneminder (1.28.0-0.1) stable; urgency=medium - - * Release - - -- Isaac Connor Fri, 17 Oct 2014 09:27:22 -0400 - -zoneminder (1.27.99+1-testing-SNAPSHOT2014072901) testing; urgency=medium - - * improve error messages - * Make zmupdate re-run the most recent patch so that people running the daily builds get their db updates - - -- Isaac Connor Tue, 29 Jul 2014 14:50:20 -0400 - -zoneminder (1.27.0+1-testing-v4ltomonitor-1) testing; urgency=high - - * Snapshot release - - - -- Isaac Connor Wed, 09 Jul 2014 21:35:29 -0400 diff --git a/distros/debian8/compat b/distros/debian8/compat deleted file mode 100644 index ec635144f..000000000 --- a/distros/debian8/compat +++ /dev/null @@ -1 +0,0 @@ -9 diff --git a/distros/debian8/control b/distros/debian8/control deleted file mode 100644 index dcee8d28c..000000000 --- a/distros/debian8/control +++ /dev/null @@ -1,103 +0,0 @@ -Source: zoneminder -Section: net -Priority: optional -Maintainer: Isaac Connor -Build-Depends: debhelper (>= 9), po-debconf (>= 1.0), dh-systemd (>= 1.5), autoconf, automake, libphp-serialization-perl, libgnutls28-dev, libmysqlclient-dev | libmariadbclient-dev, libdbd-mysql-perl, libdate-manip-perl, libwww-perl, libjpeg8-dev | libjpeg9-dev | libjpeg62-turbo-dev, libpcre3-dev, libavcodec-dev, libavformat-dev (>= 3:0.svn20090204), libswscale-dev (>= 3:0.svn20090204), libavutil-dev, libv4l-dev (>= 0.8.3), libbz2-dev, libtool, libsys-mmap-perl, libnetpbm10-dev, libavdevice-dev, libdevice-serialport-perl, libarchive-zip-perl, libmime-lite-perl, dh-autoreconf, libvlccore-dev, libvlc-dev, libcurl4-gnutls-dev | libcurl4-nss-dev | libcurl4-openssl-dev, libgcrypt11-dev | libgcrypt20-dev, libpolkit-gobject-1-dev, libdbi-perl, libnet-sftp-foreign-perl, libexpect-perl, libmime-tools-perl -Standards-Version: 3.9.6 - -Package: zoneminder -Section: metapackages -Architecture: all -Depends: ${misc:Depends}, - libzoneminder-perl (>= ${source:Version}), - zoneminder-database (>= ${source:Version}), - zoneminder-core (>= ${binary:Version}), - zoneminder-ui-base (>= ${source:Version}), - zoneminder-ui-classic (>= ${source:Version}) -Description: Video camera security and surveillance solution (metapackage) - ZoneMinder is intended for use in single or multi-camera video security - applications, including commercial or home CCTV, theft prevention and child - or family member or home monitoring and other care scenarios. It - supports capture, analysis, recording, and monitoring of video data coming - from one or more video or network cameras attached to a Linux system. - ZoneMinder also support web and semi-automatic control of Pan/Tilt/Zoom - cameras using a variety of protocols. It is suitable for use as a home - video security system and for commercial or professional video security - and surveillance. It can also be integrated into a home automation system - via X.10 or other protocols. - -Package: libzoneminder-perl -Section: perl -Architecture: all -Depends: ${misc:Depends}, ${perl:Depends}, libdbi-perl, - libdevice-serialport-perl, libimage-info-perl, libjson-any-perl, - libsys-mmap-perl, liburi-encode-perl, libwww-perl -Description: Perl libraries for ZoneMinder - ZoneMinder is a video camera security and surveillance solution. - . - This package provides the libraries for the perl scripts, it can be used to - write custom interfaces as well. - -Package: zoneminder-database -Section: database -Architecture: all -Depends: ${misc:Depends}, debconf, dbconfig-common, - mysql-client | mariadb-client -Recommends: mysql-server | mariadb-server -Description: Database management package for ZoneMinder - ZoneMinder is a video camera security and surveillance solution. - . - This package provides the sql files and maintenance scripts to perform all the - database operations (installation, upgrade or removal) on a local or a remote - server. - -Package: zoneminder-core -Section: video -Architecture: any -Depends: libzoneminder-perl (= ${source:Version}), - zoneminder-database (= ${source:Version}), ${shlibs:Depends}, ${misc:Depends}, - ${perl:Depends}, libarchive-tar-perl, libarchive-zip-perl, libdate-manip-perl, - libdbi-perl, libmodule-load-conditional-perl, libmime-lite-perl, - libmime-tools-perl, libnet-sftp-foreign-perl, libphp-serialization-perl - debconf, ffmpeg | libav-tools, rsyslog | system-log-daemon, netpbm, zip, - policykit-1, apache2 -, libsys-cpu-perl, libsys-meminfo-perl -, libdata-dump-perl, libclass-std-fast-perl, libsoap-wsdl-perl, libio-socket-multicast-perl, libdigest-sha-perl -Description: Core binaries and perl scripts for ZoneMinder - ZoneMinder is a video camera security and surveillance solution. - . - This package provides the executable compiled binaries which do the main video - processing work and the perl scripts which perform helper and/or external - interface tasks. - -Package: zoneminder-core-dbg -Priority: extra -Section: debug -Architecture: any -Depends: zoneminder-core (= ${binary:Version}), ${misc:Depends} -Description: Debugging symbols for ZoneMinder - ZoneMinder is a video camera security and surveillance solution. - . - This package provides the debugging symbols for the executable compiled - binaries. - -Package: zoneminder-ui-base -Section: web -Architecture: any -Depends: zoneminder-core (= ${binary:Version}), ${shlibs:Depends}, - ${misc:Depends}, debconf, apache2, libapache2-mod-php5 | libapache2-mod-fcgid, - php5, php5-mysql | php5-mysqlnd, php5-gd -Description: Essential files for ZoneMinder's web user interface - ZoneMinder is a video camera security and surveillance solution. - . - This package provides the essential web files and maintenance scripts to set up - a basic web environment. - -Package: zoneminder-ui-classic -Section: web -Architecture: all -Depends: zoneminder-ui-base (>= ${source:Version}), ${misc:Depends} -Description: Classic web user interface for ZoneMinder - ZoneMinder is a video camera security and surveillance solution. - . - This package provides the classic web user interface. diff --git a/distros/debian8/copyright b/distros/debian8/copyright deleted file mode 100644 index a177502a0..000000000 --- a/distros/debian8/copyright +++ /dev/null @@ -1,22 +0,0 @@ -Copyright: - -Copyright 2002 Philip Coombes - -License: - -This package 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 package 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 package; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -On Debian GNU/Linux systems, the text of the GPL can be found in -/usr/share/common-licenses/GPL. diff --git a/distros/debian8/docs b/distros/debian8/docs deleted file mode 100644 index b43bf86b5..000000000 --- a/distros/debian8/docs +++ /dev/null @@ -1 +0,0 @@ -README.md diff --git a/distros/debian8/libzoneminder-perl.install b/distros/debian8/libzoneminder-perl.install deleted file mode 100644 index 792ffc15e..000000000 --- a/distros/debian8/libzoneminder-perl.install +++ /dev/null @@ -1,4 +0,0 @@ -usr/share/perl5/ZoneMinder -usr/share/perl5/ZoneMinder.pm -debian/tmp/usr/share/man/man3/ZoneMinder.3pm -debian/tmp/usr/share/man/man3/ZoneMinder::* diff --git a/distros/debian8/po/POTFILES.in b/distros/debian8/po/POTFILES.in deleted file mode 100644 index 5b155907e..000000000 --- a/distros/debian8/po/POTFILES.in +++ /dev/null @@ -1,3 +0,0 @@ -[type: gettext/rfc822deb] zoneminder-core.templates -[type: gettext/rfc822deb] zoneminder-database.templates -[type: gettext/rfc822deb] zoneminder-ui-base.templates diff --git a/distros/debian8/po/fr.po b/distros/debian8/po/fr.po deleted file mode 100644 index 85ced7fd2..000000000 --- a/distros/debian8/po/fr.po +++ /dev/null @@ -1,252 +0,0 @@ -# debconf french translation file for ZoneMinder. -# Copyright (C) 2001-2008 Philip Coombes -# This file is distributed under the same license as the zoneminder package. -# First author: Emmanuel Papin , 2014. -# -msgid "" -msgstr "" -"Project-Id-Version: zoneminder\n" -"Report-Msgid-Bugs-To: zoneminder@packages.debian.org\n" -"POT-Creation-Date: 2014-12-16 12:34+0100\n" -"PO-Revision-Date: 2014-12-07 00:40+0100\n" -"Last-Translator: Emmanuel Papin \n" -"Language-Team: French \n" -"Language: fr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#. Type: boolean -#. Description -#: ../zoneminder-core.templates:1001 -msgid "Delete this non empty directory?" -msgstr "Supprimer ce répertoire non vide ?" - -#. Type: boolean -#. Description -#: ../zoneminder-core.templates:1001 -msgid "" -"A purge of the ZoneMinder package is performed but the directory '/var/cache/" -"zoneminder' is not empty so it will not be deleted." -msgstr "" -"Une purge du paquet ZoneMinder est en cours mais le répertoire '/var/cache/" -"zoneminder' n'est pas vide et sera donc conservé." - -#. Type: boolean -#. Description -#: ../zoneminder-core.templates:1001 -msgid "" -"Please consider that this directory is designed to contain data resulting " -"from event detection. Therefore, \"proof of evidence\" could be lost!\"" -msgstr "" -"Veuillez considérer que ce répertoire est conçu pour contenir des données " -"résultants de la détection d'événements. Par conséquent, des preuves " -"pourraient être perdues !" - -#. Type: boolean -#. Description -#: ../zoneminder-core.templates:1001 -msgid "" -"If you are not sure of your decision, please do not delete this directory " -"but perform a manual checkup." -msgstr "" -"Si vous n'êtes pas sûr de votre décision, veuillez conserver ce répertoire " -"et effectuer une vérification manuelle." - -#. Type: boolean -#. Description -#: ../zoneminder-core.templates:2001 -msgid "Deletion confirmed?" -msgstr "Supression confirmée ?" - -#. Type: boolean -#. Description -#: ../zoneminder-core.templates:2001 -msgid "" -"You have allowed the deletion of directory '/var/cache/zoneminder' although " -"it may contain critical data." -msgstr "" -"Vous avez autorisé la suppression du répertoire '/var/cache/zoneminder' bien " -"qu'il puisse contenir des données critiques." - -#. Type: select -#. Choices -#: ../zoneminder-database.templates:1001 -msgid "local" -msgstr "local" - -#. Type: select -#. Choices -#: ../zoneminder-database.templates:1001 -msgid "remote" -msgstr "distant" - -#. Type: select -#. Description -#: ../zoneminder-database.templates:1002 -msgid "Database location:" -msgstr "Emplacement de la base de donnée :" - -#. Type: select -#. Description -#: ../zoneminder-database.templates:1002 -msgid "" -"A database server is required to run ZoneMinder. The database can be " -"installed either locally or remotely on a machine of your network." -msgstr "" -"Un serveur de base de données est requis pour ZoneMinder. La base de donnée " -"peut être installée localement ou à distance sur une machine de votre réseau." - -#. Type: select -#. Description -#: ../zoneminder-database.templates:1002 -msgid "" -"If you choose a remote location, you will have to select the 'tcp/ip' " -"connection method and enter the hostname or ip address of the remote machine " -"in the next configuration screens." -msgstr "" -"Si vous choisissez un emplacement distant, vous devrez sélectionner la " -"méthode de connexion 'tcp/ip' et entrer le nom réseau ou l'adresse ip de la " -"machine distante dans les écrans de configuration suivants." - -#. Type: error -#. Description -#: ../zoneminder-database.templates:2001 -msgid "No local database server is available:" -msgstr "Aucun serveur local de base de données n'est disponible :" - -#. Type: error -#. Description -#: ../zoneminder-database.templates:2001 -msgid "" -"Currently ZoneMinder supports mysql or mariadb database server but none of " -"them appears to be installed on this machine." -msgstr "" -"Actuellement ZoneMinder supporte les serveurs de base de données mysql et " -"mariadb mais aucun d'entre eux n'est installé sur cette machine." - -#. Type: error -#. Description -#: ../zoneminder-database.templates:2001 -msgid "" -"In order to complete ZoneMinder's installation, after ending of this " -"assistant, please install a compatible database server and then restart the " -"assistant by invoking:" -msgstr "" -"Afin de compléter l'installation de ZoneMinder, après la fermeture de cet " -"assitant, veuillez installer un serveur de base de données compatible et " -"ensuite redémarrez l'assistant en invoquant :" - -#. Type: error -#. Description -#. Type: error -#. Description -#: ../zoneminder-database.templates:2001 ../zoneminder-database.templates:3001 -msgid "$ sudo dpkg-reconfigure zoneminder" -msgstr "$ sudo dpkg-reconfigure zoneminder" - -#. Type: error -#. Description -#: ../zoneminder-database.templates:3001 -msgid "Remote database servers are not allowed:" -msgstr "Les serveurs de base de données distants ne sont pas autorisés :" - -#. Type: error -#. Description -#: ../zoneminder-database.templates:3001 -msgid "" -"The current configuration of dbconfig-common does not allow installation of " -"a database on remote servers." -msgstr "" -"La configuration actuelle de dbconfig-common ne permet pas l'installation de " -"bases de données sur des serveurs distants." - -#. Type: error -#. Description -#: ../zoneminder-database.templates:3001 -msgid "" -"In order to reconfigure dbconfig-common, please invoke the following command " -"after ending of this assistant:" -msgstr "" -"Afin de reconfigurer dbconfig-common, veuillez invoquer la commande suivante " -"après la fermeture de cet assitant :" - -#. Type: error -#. Description -#: ../zoneminder-database.templates:3001 -msgid "$ sudo dpkg-reconfigure dbconfig-common" -msgstr "$ sudo dpkg-reconfigure dbconfig-common" - -#. Type: error -#. Description -#: ../zoneminder-database.templates:3001 -msgid "" -"Then, to complete ZoneMinder's installation, please restart this assistant " -"by invoking:" -msgstr "" -"Ensuite, pour compléter l'installation de ZoneMinder, veuillez redémarrer " -"cet assistant en invoquant :" - -#. Type: password -#. Description -#: ../zoneminder-database.templates:4001 -msgid "New password for the ZoneMinder 'admin' user:" -msgstr "Nouveau mot de passe pour le compte 'admin' de ZoneMinder :" - -#. Type: password -#. Description -#: ../zoneminder-database.templates:4001 -msgid "Please enter the password of the default administrative user." -msgstr "Veuillez entrer le mot de passe du compte administrateur par défaut." - -#. Type: password -#. Description -#: ../zoneminder-database.templates:4001 -msgid "" -"While not mandatory, it is highly recommended that you set a custom password " -"for the administrative 'admin' user." -msgstr "" -"Bien que cela ne soit pas obligatoire, il est fortement recommandé de " -"fournir un mot de passe personnalisé pour le compte administrateur 'admin'." - -#. Type: password -#. Description -#: ../zoneminder-database.templates:4001 -msgid "If this field is left blank, the password will not be changed." -msgstr "Si le champ est laissé vide, le mot de passe ne sera pas changé." - -#. Type: password -#. Description -#: ../zoneminder-database.templates:5001 -msgid "Repeat password for the ZoneMinder 'admin' user:" -msgstr "Répéter le mot de passe pour le compte 'admin' de ZoneMinder :" - -#. Type: error -#. Description -#: ../zoneminder-database.templates:6001 -msgid "Password input error" -msgstr "Erreur de mot de passe" - -#. Type: error -#. Description -#: ../zoneminder-database.templates:6001 -msgid "The two passwords you entered were not the same. Please try again." -msgstr "" -"Les deux mots de passe saisis ne sont pas les mêmes. Veuillez essayer à " -"nouveau." - -#. Type: multiselect -#. Description -#: ../zoneminder-ui-base.templates:1001 -msgid "Web server to reconfigure automatically:" -msgstr "Serveur web à reconfigurer automatiquement :" - -#. Type: multiselect -#. Description -#: ../zoneminder-ui-base.templates:1001 -msgid "" -"Please choose the web server that should be automatically configured for " -"ZoneMinder's web portal access." -msgstr "" -"Veuillez choisir le serveur web à reconfigurer automatiquement pour l'accès " -"au portail web de ZoneMinder." diff --git a/distros/debian8/po/templates.pot b/distros/debian8/po/templates.pot deleted file mode 100644 index 941a4094e..000000000 --- a/distros/debian8/po/templates.pot +++ /dev/null @@ -1,222 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: zoneminder\n" -"Report-Msgid-Bugs-To: zoneminder@packages.debian.org\n" -"POT-Creation-Date: 2014-12-16 12:34+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#. Type: boolean -#. Description -#: ../zoneminder-core.templates:1001 -msgid "Delete this non empty directory?" -msgstr "" - -#. Type: boolean -#. Description -#: ../zoneminder-core.templates:1001 -msgid "" -"A purge of the ZoneMinder package is performed but the directory '/var/cache/" -"zoneminder' is not empty so it will not be deleted." -msgstr "" - -#. Type: boolean -#. Description -#: ../zoneminder-core.templates:1001 -msgid "" -"Please consider that this directory is designed to contain data resulting " -"from event detection. Therefore, \"proof of evidence\" could be lost!\"" -msgstr "" - -#. Type: boolean -#. Description -#: ../zoneminder-core.templates:1001 -msgid "" -"If you are not sure of your decision, please do not delete this directory " -"but perform a manual checkup." -msgstr "" - -#. Type: boolean -#. Description -#: ../zoneminder-core.templates:2001 -msgid "Deletion confirmed?" -msgstr "" - -#. Type: boolean -#. Description -#: ../zoneminder-core.templates:2001 -msgid "" -"You have allowed the deletion of directory '/var/cache/zoneminder' although " -"it may contain critical data." -msgstr "" - -#. Type: select -#. Choices -#: ../zoneminder-database.templates:1001 -msgid "local" -msgstr "" - -#. Type: select -#. Choices -#: ../zoneminder-database.templates:1001 -msgid "remote" -msgstr "" - -#. Type: select -#. Description -#: ../zoneminder-database.templates:1002 -msgid "Database location:" -msgstr "" - -#. Type: select -#. Description -#: ../zoneminder-database.templates:1002 -msgid "" -"A database server is required to run ZoneMinder. The database can be " -"installed either locally or remotely on a machine of your network." -msgstr "" - -#. Type: select -#. Description -#: ../zoneminder-database.templates:1002 -msgid "" -"If you choose a remote location, you will have to select the 'tcp/ip' " -"connection method and enter the hostname or ip address of the remote machine " -"in the next configuration screens." -msgstr "" - -#. Type: error -#. Description -#: ../zoneminder-database.templates:2001 -msgid "No local database server is available:" -msgstr "" - -#. Type: error -#. Description -#: ../zoneminder-database.templates:2001 -msgid "" -"Currently ZoneMinder supports mysql or mariadb database server but none of " -"them appears to be installed on this machine." -msgstr "" - -#. Type: error -#. Description -#: ../zoneminder-database.templates:2001 -msgid "" -"In order to complete ZoneMinder's installation, after ending of this " -"assistant, please install a compatible database server and then restart the " -"assistant by invoking:" -msgstr "" - -#. Type: error -#. Description -#. Type: error -#. Description -#: ../zoneminder-database.templates:2001 ../zoneminder-database.templates:3001 -msgid "$ sudo dpkg-reconfigure zoneminder" -msgstr "" - -#. Type: error -#. Description -#: ../zoneminder-database.templates:3001 -msgid "Remote database servers are not allowed:" -msgstr "" - -#. Type: error -#. Description -#: ../zoneminder-database.templates:3001 -msgid "" -"The current configuration of dbconfig-common does not allow installation of " -"a database on remote servers." -msgstr "" - -#. Type: error -#. Description -#: ../zoneminder-database.templates:3001 -msgid "" -"In order to reconfigure dbconfig-common, please invoke the following command " -"after ending of this assistant:" -msgstr "" - -#. Type: error -#. Description -#: ../zoneminder-database.templates:3001 -msgid "$ sudo dpkg-reconfigure dbconfig-common" -msgstr "" - -#. Type: error -#. Description -#: ../zoneminder-database.templates:3001 -msgid "" -"Then, to complete ZoneMinder's installation, please restart this assistant " -"by invoking:" -msgstr "" - -#. Type: password -#. Description -#: ../zoneminder-database.templates:4001 -msgid "New password for the ZoneMinder 'admin' user:" -msgstr "" - -#. Type: password -#. Description -#: ../zoneminder-database.templates:4001 -msgid "Please enter the password of the default administrative user." -msgstr "" - -#. Type: password -#. Description -#: ../zoneminder-database.templates:4001 -msgid "" -"While not mandatory, it is highly recommended that you set a custom password " -"for the administrative 'admin' user." -msgstr "" - -#. Type: password -#. Description -#: ../zoneminder-database.templates:4001 -msgid "If this field is left blank, the password will not be changed." -msgstr "" - -#. Type: password -#. Description -#: ../zoneminder-database.templates:5001 -msgid "Repeat password for the ZoneMinder 'admin' user:" -msgstr "" - -#. Type: error -#. Description -#: ../zoneminder-database.templates:6001 -msgid "Password input error" -msgstr "" - -#. Type: error -#. Description -#: ../zoneminder-database.templates:6001 -msgid "The two passwords you entered were not the same. Please try again." -msgstr "" - -#. Type: multiselect -#. Description -#: ../zoneminder-ui-base.templates:1001 -msgid "Web server to reconfigure automatically:" -msgstr "" - -#. Type: multiselect -#. Description -#: ../zoneminder-ui-base.templates:1001 -msgid "" -"Please choose the web server that should be automatically configured for " -"ZoneMinder's web portal access." -msgstr "" diff --git a/distros/debian8/rules b/distros/debian8/rules deleted file mode 100755 index 3364d8750..000000000 --- a/distros/debian8/rules +++ /dev/null @@ -1,154 +0,0 @@ -#!/usr/bin/make -f -# -*- makefile -*- -# Sample debian/rules that uses debhelper. -# This file was originally written by Joey Hess and Craig Small. -# As a special exception, when this file is copied by dh-make into a -# dh-make output file, you may use that output file without restriction. -# This special exception was added by Craig Small in version 0.37 of dh-make. - -# Uncomment this to turn on verbose mode. -#export DH_VERBOSE=1 - -# These are used for cross-compiling and for saving the configure script -# from having to guess our platform (since we know it already) -DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) -DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) - -CFLAGS = -Wall -CPPFLAGS = -D__STDC_CONSTANT_MACROS -CXXFLAGS = -DHAVE_LIBCRYPTO - -ifneq (,$(findstring debug,$(DEB_BUILD_OPTIONS))) -DEBOPT = --enable-debug -CFLAGS += -g -CXXFLAGS += -g -else -DEBOPT = -endif - -ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) -CFLAGS += -O0 -else -CFLAGS += -O2 -endif - -# These are used to get the most recent version of the original sources from github -UURL = $(shell git config --get remote.origin.url) -BRANCH = $(shell git rev-parse --abbrev-ref HEAD) -HEAD = $(shell git rev-parse HEAD) -PKD = $(abspath $(dir $(MAKEFILE_LIST))) -PKG = $(word 2,$(shell dpkg-parsechangelog -l$(PKD)/changelog | grep ^Source)) -VER ?= $(shell dpkg-parsechangelog -l$(PKD)/changelog | perl -ne 'print $$1 if m{^Version:\s+(?:\d+:)?(\d.*)(?:\-|\+nmu\d+.*)};') -DTYPE = -TARBALL = ../$(PKG)_$(VER)$(DTYPE).orig.tar.xz - -%: - dh $@ --with autoreconf,systemd - -override_dh_auto_configure: - CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" dh_auto_configure -- \ - --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) \ - --sysconfdir=/etc/zm --prefix=/usr --mandir=\$${prefix}/share/man \ - --infodir=\$${prefix}/share/info --with-mysql=/usr \ - --with-mariadb=/usr --with-webdir=/usr/share/zoneminder \ - --with-ffmpeg=/usr --with-cgidir=/usr/lib/cgi-bin \ - --with-webuser=www-data --with-webgroup=www-data \ - --enable-crashtrace=no --enable-mmap=yes $(DEBOPT) - -override_dh_clean: - # Add here commands to clean up after the build process. - [ ! -f Makefile ] || $(MAKE) distclean - dh_clean src/zm_config_defines.h - # - # Delete remaining auto-generated Makefile if Makefile.in exists - find $(CURDIR)/ -type f -name "Makefile" | while read file; do \ - [ -f $$file.in ] && rm -f $$file; \ - done || true - # - # Delete remaining auto-generated Makefile.in if Makefile.am exists - find $(CURDIR)/ -type f -name "Makefile.in" | while read filein; do \ - fileam=`echo $$filein | sed 's/\(.*\)\.in/\1\.am/'`; \ - [ -f $$fileam ] && rm -f $$filein; \ - done || true - -override_dh_install: - dh_install --fail-missing - # - # NOTE: This is a short-term kludge; hopefully changes in the next - # upstream version will render this unnecessary. - rm -rf debian/zoneminder/usr/share/zoneminder/events - rm -rf debian/zoneminder/usr/share/zoneminder/images - rm -rf debian/zoneminder/usr/share/zoneminder/temp - # The link stuff for these folders has been moved to - # zoneminder-core.links file - # - # This is a slightly lesser kludge; moving the cgi stuff to - # /usr/share/zoneminder/cgi-bin breaks one set of behavior, - # having it just in /usr/lib/cgi-bin breaks another bit of - # behavior. - # The link stuff for /usr/share/zoneminder/cgi-bin has been moved to - # zoneminder-ui-base.links file - -override_dh_installinit: - dh_installinit --package=zoneminder-core --name=zoneminder - -override_dh_systemd_start: - dh_systemd_start --package=zoneminder-core --name=zoneminder \ - --restart-after-upgrade - -override_dh_systemd_enable: - dh_systemd_enable --package=zoneminder-core --name=zoneminder - -override_dh_fixperms: - dh_fixperms - # - # As requested by the Debian Webapps Policy Manual §3.2.1 - chown root:www-data debian/zoneminder-core/etc/zm/zm.conf - chmod 640 debian/zoneminder-core/etc/zm/zm.conf - -override_dh_auto_test: - # do not run tests... - -.PHONY: override_dh_strip -override_dh_strip: - dh_strip --dbg-package=zoneminder-core-dbg - -# Inspired by https://wiki.debian.org/onlyjob/get-orig-source -.PHONY: get-orig-source -get-orig-source: $(TARBALL) $(info I: $(PKG)_$(VER)$(DTYPE)) - @ - -$(TARBALL): - $(if $(wildcard $(PKG)-$(VER)),$(error folder '$(PKG)-$(VER)' exists, aborting...)) - @echo "# Cloning origin repository..."; \ - if ! git clone $(UURL) $(PKG)-$(VER); then \ - $(RM) -r $(PKG)-$(VER); \ - echo "failed to clone repository, aborting..."; \ - false; \ - fi - @if [ $(BRANCH) != "master" ]; then \ - cd $(PKG)-$(VER); \ - echo "# Not on master branch, fetching origin branch '$(BRANCH)'..."; \ - git fetch origin $(BRANCH):$(BRANCH) || false; \ - echo "# Switching to branch '$(BRANCH)'..."; \ - git checkout $(BRANCH) || false; \ - fi - @echo "# Checking local source..." - @if [ $$(cd $(PKG)-$(VER) && git rev-parse HEAD) = $(HEAD) ]; then \ - echo "even with origin, ok"; \ - true; \ - else \ - echo "not even with origin, aborting..."; \ - false; \ - fi - @echo "# Setting times..." - @cd $(PKG)-$(VER) \ - && for F in $$(git ls-tree -r --name-only HEAD | sed -e "s/\s/\*/g"); do \ - touch --no-dereference -d "$$(git log -1 --format="%ai" -- $$F)" "$$F"; \ - done - @echo "# Cleaning-up..." - cd $(PKG)-$(VER) && $(RM) -r .git - @echo "# Packing file '$(TARBALL)'..." - @find -L "$(PKG)-$(VER)" -xdev -type f -print | sort \ - | XZ_OPT="-6v" tar -caf "$(TARBALL)" -T- --owner=root --group=root --mode=a+rX \ - && $(RM) -r "$(PKG)-$(VER)" diff --git a/distros/debian8/source/local-options b/distros/debian8/source/local-options deleted file mode 100644 index e69de29bb..000000000 diff --git a/distros/debian8/source/options b/distros/debian8/source/options deleted file mode 100644 index 8bd61fce6..000000000 --- a/distros/debian8/source/options +++ /dev/null @@ -1 +0,0 @@ -extend-diff-ignore = "(^|/)(config\.sub|config\.guess|Makefile|aclocal.m4|compile|config.h.in|configure|depcomp|install-sh|missing)$" diff --git a/distros/debian8/zoneminder-core.config b/distros/debian8/zoneminder-core.config deleted file mode 100644 index 2a15a599e..000000000 --- a/distros/debian8/zoneminder-core.config +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh -# config maintainer script for zoneminder-core package - -set -e - -# Source the debconf stuff -. /usr/share/debconf/confmodule - -#DEBHELPER# - -exit 0 diff --git a/distros/debian8/zoneminder-core.dirs b/distros/debian8/zoneminder-core.dirs deleted file mode 100644 index 350c32aff..000000000 --- a/distros/debian8/zoneminder-core.dirs +++ /dev/null @@ -1,4 +0,0 @@ -var/log/zm -var/cache/zoneminder/events -var/cache/zoneminder/images -var/cache/zoneminder/temp diff --git a/distros/debian8/zoneminder-core.install b/distros/debian8/zoneminder-core.install deleted file mode 100644 index afd9ada95..000000000 --- a/distros/debian8/zoneminder-core.install +++ /dev/null @@ -1,4 +0,0 @@ -etc/zm -usr/bin -usr/share/polkit-1/actions -usr/share/polkit-1/rules.d diff --git a/distros/debian8/zoneminder-core.links b/distros/debian8/zoneminder-core.links deleted file mode 100644 index 5560a100a..000000000 --- a/distros/debian8/zoneminder-core.links +++ /dev/null @@ -1,3 +0,0 @@ -var/cache/zoneminder/events usr/share/zoneminder/events -var/cache/zoneminder/images usr/share/zoneminder/images -var/cache/zoneminder/temp usr/share/zoneminder/temp diff --git a/distros/debian8/zoneminder-core.postinst b/distros/debian8/zoneminder-core.postinst deleted file mode 100644 index b1552e73b..000000000 --- a/distros/debian8/zoneminder-core.postinst +++ /dev/null @@ -1,80 +0,0 @@ -#! /bin/sh -# postinst maintainer script for zoneminder-core package - -set -e - -# Source the debconf stuff -. /usr/share/debconf/confmodule - -# Source the config file -CONFIGFILE=/etc/zm/zm.conf -. $CONFIGFILE - -# Do this when the package is installed, upgraded or reconfigured -if [ "$1" = "configure" ] || [ "$1" = "reconfigure" ]; then - - # Retrieve data from dbconfig (inputs from user) - . /etc/dbconfig-common/zoneminder.conf - - # ZoneMinder config file handling - # Inspired by: http://manpages.debian.org/cgi-bin/man.cgi?query=debconf-devel&sektion=7 - - # Backup the config file - cp -a -f $CONFIGFILE ${CONFIGFILE}.postinst.bak - - # Redeclare variables if missing in config file - test -z $dbc_dbserver || grep -Eq "^ *ZM_DB_HOST=" $CONFIGFILE \ - || echo "ZM_DB_HOST=" >> ${CONFIGFILE}.postinst.bak - test -z $dbc_dbname || grep -Eq "^ *ZM_DB_NAME=" $CONFIGFILE \ - || echo "ZM_DB_NAME=" >> ${CONFIGFILE}.postinst.bak - test -z $dbc_dbuser || grep -Eq "^ *ZM_DB_USER=" $CONFIGFILE \ - || echo "ZM_DB_USER=" >> ${CONFIGFILE}.postinst.bak - test -z $dbc_dbpass || grep -Eq "^ *ZM_DB_PASS=" $CONFIGFILE \ - || echo "ZM_DB_PASS=" >> ${CONFIGFILE}.postinst.bak - - # Prevent ZM_DB_HOST to be empty if user selected the 'unix socket' method - if test -z $dbc_dbserver; then - dbc_dbserver_override="localhost" - else - dbc_dbserver_override=$dbc_dbserver - fi - - # Update variables in config file - sed -i "s/^ *ZM_DB_HOST=.*/ZM_DB_HOST=$dbc_dbserver_override/" \ - ${CONFIGFILE}.postinst.bak - test -z $dbc_dbname || sed -i "s/^ *ZM_DB_NAME=.*/ZM_DB_NAME=$dbc_dbname/" \ - ${CONFIGFILE}.postinst.bak - test -z $dbc_dbuser || sed -i "s/^ *ZM_DB_USER=.*/ZM_DB_USER=$dbc_dbuser/" \ - ${CONFIGFILE}.postinst.bak - test -z $dbc_dbpass || sed -i "s/^ *ZM_DB_PASS=.*/ZM_DB_PASS=$dbc_dbpass/" \ - ${CONFIGFILE}.postinst.bak - - # Clean-up backup file - mv -f ${CONFIGFILE}.postinst.bak $CONFIGFILE - - - # Set some file permissions - chown $ZM_WEB_USER:$ZM_WEB_GROUP /var/log/zm - if [ -z "$2" ]; then - chown $ZM_WEB_USER:$ZM_WEB_GROUP -R /var/cache/zoneminder - fi - # As requested by the Debian Webapps Policy Manual §3.2.1 - chown root:${ZM_WEB_GROUP} $CONFIGFILE - chmod 640 $CONFIGFILE -fi - -# Do this every time the package is installed or upgraded -# Test for database presence to avoid failure of zmupdate.pl -if [ "$dbc_install" = "true" ] && [ "$1" = "configure" ]; then - - # Ensure zoneminder is stopped - deb-systemd-invoke stop zoneminder.service || exit $? - - # Run the ZoneMinder update tool - zmupdate.pl --nointeractive - -fi - -#DEBHELPER# - -exit 0 diff --git a/distros/debian8/zoneminder-core.postrm b/distros/debian8/zoneminder-core.postrm deleted file mode 100644 index d75e75e8b..000000000 --- a/distros/debian8/zoneminder-core.postrm +++ /dev/null @@ -1,37 +0,0 @@ -#! /bin/sh -# postrm maintainer script for zoneminder-core package - -set -e - -# Source the debconf stuff -if [ -f /usr/share/debconf/confmodule ]; then - . /usr/share/debconf/confmodule -fi - -if [ "$1" = "purge" ]; then - - # Ask the user if we have to remove the cache directory even if not empty - if [ -d /var/cache/zoneminder ] \ - && [ ! $(find /var/cache/zoneminder -maxdepth 0 -type d -empty 2>/dev/null) ]; then - RET="" - db_input high zoneminder/ask_delete || true - db_go || true - db_get zoneminder/ask_delete - if [ "$RET" = "true" ]; then - RET="" - db_input high zoneminder/ask_delete_again || true - db_go || true - db_get zoneminder/ask_delete_again - if [ "$RET" = "true" ]; then - rm -rf /var/cache/zoneminder - fi - fi - fi -fi - -#DEBHELPER# - -# postrm rm may freeze without that -db_stop - -exit 0 diff --git a/distros/debian8/zoneminder-core.preinst b/distros/debian8/zoneminder-core.preinst deleted file mode 100644 index 3ed1ef661..000000000 --- a/distros/debian8/zoneminder-core.preinst +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/sh -# preinst maintainer script for zoneminder-core package - -set -e - -abort=false -if [ -L /usr/share/zoneminder/events ]; then - l=$(readlink /usr/share/zoneminder/events) - if [ "$l" != "/var/cache/zoneminder/events" ]; then - abort=true - fi -fi -if [ -L /usr/share/zoneminder/images ]; then - l=$(readlink /usr/share/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 -/usr/share/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 - -#DEBHELPER# - -exit 0 diff --git a/distros/debian8/zoneminder-core.templates b/distros/debian8/zoneminder-core.templates deleted file mode 100644 index 35fdefd7a..000000000 --- a/distros/debian8/zoneminder-core.templates +++ /dev/null @@ -1,19 +0,0 @@ -Template: zoneminder/ask_delete -Type: boolean -Default: false -_Description: Delete this non empty directory? - A purge of the ZoneMinder package is performed but the directory - '/var/cache/zoneminder' is not empty so it will not be deleted. - . - Please consider that this directory is designed to contain data resulting from - event detection. Therefore, "proof of evidence" could be lost!" - . - If you are not sure of your decision, please do not delete this directory but - perform a manual checkup. - -Template: zoneminder/ask_delete_again -Type: boolean -Default: false -_Description: Deletion confirmed? - You have allowed the deletion of directory '/var/cache/zoneminder' although - it may contain critical data. diff --git a/distros/debian8/zoneminder-core.zoneminder.init b/distros/debian8/zoneminder-core.zoneminder.init deleted file mode 100644 index 41d3cb9dc..000000000 --- a/distros/debian8/zoneminder-core.zoneminder.init +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/sh -# -### BEGIN INIT INFO -# Provides: zoneminder -# Required-Start: -# Required-Stop: -# Default-Start: 2 3 4 5 -# Default-Stop: 0 1 6 -# Short-Description: Do nothing more than fixing a lintian error -# Description: This script is provided by the Zoneminder package -# Zomeminder init configuration has been switched to systemd -# This dummy script can be safely deleted; It does nothing -# more than fixing a lintian error when testing the package -### END INIT INFO - -. /lib/lsb/init-functions - -case "$1" in - start) - ;; - stop) - ;; - status) - ;; - restart|reload) - ;; - force-reload) - ;; - *) - echo "Usage: ${0:-} {start|stop|status|restart|reload|force-reload}" >&2 - exit 1 - ;; -esac - -exit 0 - diff --git a/distros/debian8/zoneminder-core.zoneminder.service b/distros/debian8/zoneminder-core.zoneminder.service deleted file mode 100644 index d82270024..000000000 --- a/distros/debian8/zoneminder-core.zoneminder.service +++ /dev/null @@ -1,19 +0,0 @@ -# ZoneMinder systemd unit file -# This file is intended to work with debian distributions - -[Unit] -Description=ZoneMinder CCTV recording and security system -After=network.target mysql.service apache2.service -Requires=apache2.service -Wants=mysql.service - -[Service] -User=www-data -Type=forking -ExecStart=/usr/bin/zmpkg.pl start -ExecReload=/usr/bin/zmpkg.pl restart -ExecStop=/usr/bin/zmpkg.pl stop -PIDFile=/var/run/zm/zm.pid - -[Install] -WantedBy=multi-user.target diff --git a/distros/debian8/zoneminder-core.zoneminder.tmpfile b/distros/debian8/zoneminder-core.zoneminder.tmpfile deleted file mode 100644 index 6ea70bf35..000000000 --- a/distros/debian8/zoneminder-core.zoneminder.tmpfile +++ /dev/null @@ -1 +0,0 @@ -d /var/run/zm 0755 www-data www-data diff --git a/distros/debian8/zoneminder-database.config b/distros/debian8/zoneminder-database.config deleted file mode 100644 index f6a84d36d..000000000 --- a/distros/debian8/zoneminder-database.config +++ /dev/null @@ -1,142 +0,0 @@ -#!/bin/sh -# config maintainer script for zoneminder - -set -e - -# Source the debconf stuff -. /usr/share/debconf/confmodule - -# Set the first version in which dbconfig-common was introduced in the package -dbc_first_version="1.28.0" - -CONFIGFILE=/etc/zm/zm.conf -if [ -e $CONFIGFILE ]; then - # Source the config file if exists - . $CONFIGFILE -elif [ -e ${CONFIGFILE}.dpkg-new ]; then - # If no config file, source the config file which is going to be installed - # by the core package - . ${CONFIGFILE}.dpkg-new -else - # If no config file is going to be installed, set some default values - ZM_DB_HOST= - ZM_DB_NAME="zm" - ZM_DB_USER="zmuser" -fi - -# Set some variables for the dbconfig-common stuff -dbc_dbserver="$ZM_DB_HOST" -dbc_dbname="$ZM_DB_NAME" -dbc_dbuser="$ZM_DB_USER" - -if [ -f /usr/share/dbconfig-common/dpkg/config ]; then - - # Default use dbconfig-common - dbc_install="true" - - # Currently we only support mysql database - dbc_dbtypes="mysql" - - # Set authentication method to password - dbc_authmethod_user="password" - - # Source the dbconfig-common stuff - . /usr/share/dbconfig-common/dpkg/config -fi - -# Do this when the package is installed, upgraded or reconfigured -# Most of answers are cached so the questions will not be asked again -if [ "$1" = "configure" ] || [ "$1" = "reconfigure" ]; then - - # Ask the user if the database shall be installed locally or remotely - db_input high zoneminder/debconf_dblocation || true - db_go || true - db_get zoneminder/debconf_dblocation - - if [ "$RET" = "local" ]; then - if [ ! -e "/usr/sbin/mysqld" ]; then - # Display a message and exit if the user want a local database but - # no database server is available - db_input high zoneminder/debconf_dblocalmissingerror || true - db_go || true - exit 0 - else - # Set the database server to localhost - dbc_dbserver="localhost" - fi - else - # Source the dbconfig main configuration file - if [ -f /etc/dbconfig-common/config ]; then - . /etc/dbconfig-common/config - fi - if [ "$dbc_remote_questions_default" = "false" ]; then - # Display a message and exit if the dbconfig configuration does not - # allow installation of remote databases - # Note: To overcome this issue, we could think to override the - # default setting by using dbc_remote_questions_default='true' in - # maintainer scripts but unfortunately this does not work due to - # current dbconfig design - # More information here: - # https://bugs.launchpad.net/ubuntu/+source/dbconfig-common/+bug/1065331 - db_input high zoneminder/debconf_dbconfigerror || true - db_go || true - exit 0 - fi - fi - - # Ask the user for all database settings - dbc_go zoneminder $@ - - # Ask the user for the password of the database administrator if the user - # has not yet answered to this question. - # This situation may occur if the user skipped the database creation step - # when reconfiguring the package. - RET="" - db_get zoneminder/mysql/admin-pass - if [ -z "$RET" ]; then - db_input high zoneminder/mysql/admin-pass || true - db_go || true - fi - - # Do this only when not upgrading the package (no old version in argument) - if [ -z "$2" ]; then - # Ask for the password of 'admin' user - while :; do - RET="" - db_input high zoneminder/admin_password || true - db_go || true - db_get zoneminder/admin_password - # If password isn't empty we ask for password verification - if [ -z "$RET" ]; then - db_fset zoneminder/admin_password seen false - db_fset zoneminder/admin_password_again seen false - break - fi - ROOT_PW="$RET" - db_input high zoneminder/admin_password_again || true - db_go || true - db_get zoneminder/admin_password_again - if [ "$RET" = "$ROOT_PW" ]; then - ROOT_PW="" - break - fi - db_fset zoneminder/password_mismatch seen false - db_input critical zoneminder/password_mismatch || true - db_set zoneminder/admin_password "" - db_set zoneminder/admin_password_again "" - db_go || true - done - else - # If we are upgrading the package, set an empty password to disable - # password update in ZoneMinder database - db_set zoneminder/admin_password "" - fi - # Set the seen flag to not ask this question again if no password is - # provided - db_fset zoneminder/admin_password seen true - -fi - -#DEBHELPER# - -exit 0 diff --git a/distros/debian8/zoneminder-database.dirs b/distros/debian8/zoneminder-database.dirs deleted file mode 100644 index b37463a9e..000000000 --- a/distros/debian8/zoneminder-database.dirs +++ /dev/null @@ -1,3 +0,0 @@ -usr/share/zoneminder/db -usr/share/dbconfig-common/data/zoneminder/install -usr/share/dbconfig-common/data/zoneminder/upgrade/mysql diff --git a/distros/debian8/zoneminder-database.install b/distros/debian8/zoneminder-database.install deleted file mode 100644 index 756c5bbfa..000000000 --- a/distros/debian8/zoneminder-database.install +++ /dev/null @@ -1 +0,0 @@ -usr/share/zoneminder/db diff --git a/distros/debian8/zoneminder-database.postinst b/distros/debian8/zoneminder-database.postinst deleted file mode 100644 index 41d4e5b5b..000000000 --- a/distros/debian8/zoneminder-database.postinst +++ /dev/null @@ -1,79 +0,0 @@ -#! /bin/sh -# postinst maintainer script for zoneminder-db package - -set -e - -# Source the debconf stuff -. /usr/share/debconf/confmodule - -mysql_update() { - - # Source the dbconfig stuff - . /usr/share/dbconfig-common/internal/mysql - - # Update the password of the hard-coded default 'admin' account - test -z $ADMIN_PASSWORD || dbc_mysql_exec_command "UPDATE Users SET Password = password('$ADMIN_PASSWORD') WHERE Username = 'admin';" || true - - # Update the database version - dbc_mysql_exec_command "UPDATE Config SET Value = '$DB_VERSION' WHERE Name = 'ZM_DYN_DB_VERSION';" || true -} - -if [ -f /usr/share/dbconfig-common/dpkg/postinst ]; then - - # Set the first version in which dbconfig-common was introduced in the package - dbc_first_version="1.28.0" - - # Set the database type - dbc_dbtypes="mysql" - - # Source the dbconfig-common stuff - . /usr/share/dbconfig-common/dpkg/postinst -fi - -# Do this when the package is installed, upgraded or reconfigured -if [ "$1" = "configure" ] || [ "$1" = "reconfigure" ]; then - - # Install sql database create file for dbconfig - # (needed at first package installation) - if [ ! -f /usr/share/dbconfig-common/data/zoneminder/install/mysql ]; then - install -m 644 /usr/share/zoneminder/db/zm_create.sql \ - /usr/share/dbconfig-common/data/zoneminder/install/mysql - # Remove unneeded sql requests - # dbconfig will create the underlying database - sed -i "/^ *CREATE DATABASE /d" \ - /usr/share/dbconfig-common/data/zoneminder/install/mysql - sed -i "/^ *USE /d" \ - /usr/share/dbconfig-common/data/zoneminder/install/mysql - fi - - # Symlink sql update files for dbconfig (needed when upgrading the package) - for sqlfile in /usr/share/zoneminder/db/zm_update-*.sql; do - lnk=`echo $sqlfile | sed "s/^\/usr\/share\/zoneminder\/db\/zm_update-\(.*\)\.sql/\1/"` - if [ ! -L /usr/share/dbconfig-common/data/zoneminder/upgrade/mysql/$lnk ]; then - ln -sf $sqlfile \ - /usr/share/dbconfig-common/data/zoneminder/upgrade/mysql/$lnk - fi - done || true - - # Create the underlying database and populate it - # dbconfig will take care of applying any updates which are newer than the - # previously installed version - dbc_go zoneminder $@ - - # Get the password of ZoneMinder user 'admin' from debconf - db_get zoneminder/admin_password - ADMIN_PASSWORD=$RET - - # Remove the password from debconf database - test -z $ADMIN_PASSWORD || db_reset zoneminder/admin_password || true - - # Get the lastest database version from dbconfig upgrade folder - DB_VERSION=$(ls -rv /usr/share/dbconfig-common/data/zoneminder/upgrade/$dbc_dbtypes | head -1) - - # Update the default admin account and database version - mysql_update -fi - -#DEBHELPER# - -exit 0 diff --git a/distros/debian8/zoneminder-database.postrm b/distros/debian8/zoneminder-database.postrm deleted file mode 100644 index 231f01ad7..000000000 --- a/distros/debian8/zoneminder-database.postrm +++ /dev/null @@ -1,34 +0,0 @@ -#! /bin/sh -# postrm maintainer script for zoneminder-db package - -set -e - -# Source the debconf stuff -if [ -f /usr/share/debconf/confmodule ]; then - . /usr/share/debconf/confmodule -fi - -# Source the dbconfig stuff -if [ -f /usr/share/dbconfig-common/dpkg/postrm ]; then - . /usr/share/dbconfig-common/dpkg/postrm - # Ask the user what do to with dbconfig when removing the package - dbc_go zoneminder $@ -fi - -if [ "$1" = "remove" ] || [ "$1" = "purge" ]; then - # Remove dbconfig stuff added in postinst script - rm -rf /usr/share/dbconfig-common/data/zoneminder - # No need to manually remove the zm database, dbconfig take care of this -fi - -if [ "$1" = "purge" ]; then - # Delete a potential remaining file used in postinst script - rm -f /etc/zm/zm.conf.postinst.bak -fi - -#DEBHELPER# - -# postrm rm may freeze without that -db_stop - -exit 0 diff --git a/distros/debian8/zoneminder-database.prerm b/distros/debian8/zoneminder-database.prerm deleted file mode 100644 index 31786116a..000000000 --- a/distros/debian8/zoneminder-database.prerm +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh -# prerm script for zoneminder-db package - -set -e - -# Source the debconf stuff if file exists -if [ -f /usr/share/debconf/confmodule ]; then - . /usr/share/debconf/confmodule -fi - -# If dbconfig-common is installed and has been used by zoneminder -if [ -f /usr/share/dbconfig-common/dpkg/prerm ] \ - && [ -f /etc/dbconfig-common/zoneminder.conf ]; then - # Source the dbconfig stuff - . /usr/share/dbconfig-common/dpkg/prerm - # Ask the user what do to with dbconfig before removing the package - dbc_go zoneminder $@ -fi - -# #DEBHELPER# - -exit 0 diff --git a/distros/debian8/zoneminder-database.templates b/distros/debian8/zoneminder-database.templates deleted file mode 100644 index 4de4342f6..000000000 --- a/distros/debian8/zoneminder-database.templates +++ /dev/null @@ -1,58 +0,0 @@ -Template: zoneminder/debconf_dblocation -Type: select -__Choices: local, remote -Default: local -_Description: Database location: - A database server is required to run ZoneMinder. The database can be installed - either locally or remotely on a machine of your network. - . - If you choose a remote location, you will have to select the 'tcp/ip' - connection method and enter the hostname or ip address of the remote machine - in the next configuration screens. - -Template: zoneminder/debconf_dblocalmissingerror -Type: error -_Description: No local database server is available: - Currently ZoneMinder supports mysql or mariadb database server but none of them - appears to be installed on this machine. - . - In order to complete ZoneMinder's installation, after ending of this assistant, - please install a compatible database server and then restart the assistant by - invoking: - . - $ sudo dpkg-reconfigure zoneminder - -Template: zoneminder/debconf_dbconfigerror -Type: error -_Description: Remote database servers are not allowed: - The current configuration of dbconfig-common does not allow installation of - a database on remote servers. - . - In order to reconfigure dbconfig-common, please invoke the following command - after ending of this assistant: - . - $ sudo dpkg-reconfigure dbconfig-common - . - Then, to complete ZoneMinder's installation, please restart this assistant by - invoking: - . - $ sudo dpkg-reconfigure zoneminder - -Template: zoneminder/admin_password -Type: password -_Description: New password for the ZoneMinder 'admin' user: - Please enter the password of the default administrative user. - . - While not mandatory, it is highly recommended that you set a custom password - for the administrative 'admin' user. - . - If this field is left blank, the password will not be changed. - -Template: zoneminder/admin_password_again -Type: password -_Description: Repeat password for the ZoneMinder 'admin' user: - -Template: zoneminder/password_mismatch -Type: error -_Description: Password input error - The two passwords you entered were not the same. Please try again. diff --git a/distros/debian8/zoneminder-ui-base.config b/distros/debian8/zoneminder-ui-base.config deleted file mode 100644 index 2660208a8..000000000 --- a/distros/debian8/zoneminder-ui-base.config +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/sh -# config maintainer script for zoneminder-ui-base package - -set -e - -# Source the debconf stuff -. /usr/share/debconf/confmodule - -# Do this when the package is installed, upgraded or reconfigured -# Most of answers are cached so the questions will not be asked again -if [ "$1" = "configure" ] || [ "$1" = "reconfigure" ]; then - - # Ask the user for the web server(s) to configure - db_input high zoneminder/webserver || true - db_go || true -fi - -#DEBHELPER# - -exit 0 diff --git a/distros/debian8/zoneminder-ui-base.install b/distros/debian8/zoneminder-ui-base.install deleted file mode 100644 index f72b569be..000000000 --- a/distros/debian8/zoneminder-ui-base.install +++ /dev/null @@ -1,11 +0,0 @@ -debian/apache.conf etc/zm -usr/lib/cgi-bin -usr/share/zoneminder/ajax -usr/share/zoneminder/css -usr/share/zoneminder/graphics -usr/share/zoneminder/includes -usr/share/zoneminder/index.php -usr/share/zoneminder/js -usr/share/zoneminder/lang -usr/share/zoneminder/tools -usr/share/zoneminder/views diff --git a/distros/debian8/zoneminder-ui-base.links b/distros/debian8/zoneminder-ui-base.links deleted file mode 100644 index b00a147d6..000000000 --- a/distros/debian8/zoneminder-ui-base.links +++ /dev/null @@ -1 +0,0 @@ -usr/lib/cgi-bin usr/share/zoneminder/cgi-bin diff --git a/distros/debian8/zoneminder-ui-base.postinst b/distros/debian8/zoneminder-ui-base.postinst deleted file mode 100644 index a5bce3c98..000000000 --- a/distros/debian8/zoneminder-ui-base.postinst +++ /dev/null @@ -1,48 +0,0 @@ -#! /bin/sh -# postinst maintainer script for zoneminder-ui-base package - -set -e - -# Source the debconf stuff -. /usr/share/debconf/confmodule - -apache_install() { - - mkdir -p /etc/apache2/conf-available - ln -sf ../../zm/apache.conf /etc/apache2/conf-available/zoneminder.conf - - COMMON_STATE=$(dpkg-query -f '${Status}' -W 'apache2.2-common' 2>/dev/null | awk '{print $3}' || true) - - if [ -e /usr/share/apache2/apache2-maintscript-helper ] ; then - . /usr/share/apache2/apache2-maintscript-helper - apache2_invoke enconf zoneminder - elif [ "$COMMON_STATE" = "installed" ] || [ "$COMMON_STATE" = "unpacked" ] ; then - [ -d /etc/apache2/conf.d/ ] && [ ! -L /etc/apache2/conf.d/zoneminder.conf ] && ln -s ../conf-available/zoneminder.conf /etc/apache2/conf.d/zoneminder.conf - fi - - # Enable CGI script module in apache (not enabled by default on jessie) - a2enmod cgi >/dev/null 2>&1 - - # Reload the web server - deb-systemd-invoke reload apache2.service || true -} - -# Do this when the package is installed, upgraded or reconfigured -if [ "$1" = "configure" ] || [ "$1" = "reconfigure" ]; then - - # Configure the web server - db_get zoneminder/webserver - webservers="$RET" - - for webserver in $webservers; do - webserver=${webserver%,} - # Currently we only support apache2 - if [ "$webserver" = "apache2" ] ; then - apache_install $1 - fi - done -fi - -#DEBHELPER# - -exit 0 diff --git a/distros/debian8/zoneminder-ui-base.postrm b/distros/debian8/zoneminder-ui-base.postrm deleted file mode 100644 index fd4d0d6d8..000000000 --- a/distros/debian8/zoneminder-ui-base.postrm +++ /dev/null @@ -1,41 +0,0 @@ -#! /bin/sh -# postrm maintainer script for zoneminder-ui-base package - -set -e - -# Source the debconf stuff -if [ -f /usr/share/debconf/confmodule ]; then - . /usr/share/debconf/confmodule -fi - -apache_remove() { - COMMON_STATE=$(dpkg-query -f '${Status}' -W 'apache2.2-common' 2>/dev/null | awk '{print $3}' || true) - if [ -e /usr/share/apache2/apache2-maintscript-helper ] ; then - . /usr/share/apache2/apache2-maintscript-helper - apache2_invoke disconf zoneminder - elif [ "$COMMON_STATE" = "installed" ] || [ "$COMMON_STATE" = "unpacked" ] ; then - rm -f /etc/apache2/conf.d/zoneminder.conf - fi - rm -f /etc/apache2/conf-available/zoneminder.conf - # Reload the web server - deb-systemd-invoke reload apache2.service || true -} - -if [ "$1" = "remove" ] || [ "$1" = "purge" ]; then - # Deconfigure the web server - db_get zoneminder/webserver || true - for webserver in $RET; do - webserver=${webserver%,} - # Currently we only support apache2 - if [ "$webserver" = "apache2" ] ; then - apache_remove $1 - fi - done -fi - -#DEBHELPER# - -# postrm rm may freeze without that -db_stop - -exit 0 diff --git a/distros/debian8/zoneminder-ui-base.templates b/distros/debian8/zoneminder-ui-base.templates deleted file mode 100644 index 31e70277f..000000000 --- a/distros/debian8/zoneminder-ui-base.templates +++ /dev/null @@ -1,7 +0,0 @@ -Template: zoneminder/webserver -Type: multiselect -Choices: apache2 -Default: apache2 -_Description: Web server to reconfigure automatically: - Please choose the web server that should be automatically configured for - ZoneMinder's web portal access. diff --git a/distros/debian8/zoneminder-ui-classic.install b/distros/debian8/zoneminder-ui-classic.install deleted file mode 100644 index 9532d9dc9..000000000 --- a/distros/debian8/zoneminder-ui-classic.install +++ /dev/null @@ -1 +0,0 @@ -usr/share/zoneminder/skins/classic diff --git a/distros/debian_cmake/README.Debian b/distros/debian_cmake/README.Debian deleted file mode 100644 index a49b6be72..000000000 --- a/distros/debian_cmake/README.Debian +++ /dev/null @@ -1,51 +0,0 @@ -zoneminder for Debian ---------------------- - -There is one manual step to get the web interface working. -You need to link /etc/zm/apache.conf to /etc/apache2/conf.d/zoneminder.conf, -then reload the apache config (i.e. /etc/init.d/apache2 reload) - -Changing the location for images and events -------------------------------------------- - -Zoneminder, in its upstream form, stores data in /usr/share/zoneminder/. This -package modifies that by changing /usr/share/zoneminder/images and -/usr/share/zoneminder/events to symlinks to directories under -/var/cache/zoneminder. - -There are numerous places these could be put and ways to do it. But, at the -moment, if you change this, an upgrade will fail with a warning about these -locations having changed (the reason for this was that previously, an upgrade -would silently revert the changes and cause event loss - refer -bug #608793). - -If you do want to change the location, here are a couple of suggestions. - -These lines would mount /dev/sdX1 to /video_storage, and then 'link' /video_storage -to the locations that ZoneMinder expects them to be at. - - /dev/sdX1 /video_storage ext4 defaults 0 2 - /video_storage/zoneminder/images /var/cache/zoneminder/images none bind 0 2 - /video_storage/zoneminder/events /var/cache/zoneminder/events none bind 0 2 - - or if you have a separate partition for each: - - /dev/sdX1 /var/cache/zoneminder/images ext4 defaults 0 2 - /dev/sdX2 /var/cache/zoneminder/events ext4 defaults 0 2 - - - - -- Peter Howard , Sun, 16 Jan 2010 01:35:51 +1100 - -Access to /dev/video* ---------------------- - -For cameras which require access to /dev/video*, zoneminder may need the -www-data user added to the video group in order to see those cameras: - - adduser www-data video - -Note that all web applications running on the zoneminder server will then have -access to all video devices on the system. - - -- Vagrant Cascadian Sun, 27 Mar 2011 13:06:56 -0700 diff --git a/distros/debian_cmake/apache.conf b/distros/debian_cmake/apache.conf deleted file mode 100644 index 965c67f86..000000000 --- a/distros/debian_cmake/apache.conf +++ /dev/null @@ -1,9 +0,0 @@ -Alias /zm /usr/share/zoneminder/www - - - php_flag register_globals off - Options Indexes FollowSymLinks - - DirectoryIndex index.php - - diff --git a/distros/debian_cmake/changelog b/distros/debian_cmake/changelog deleted file mode 100644 index 46f1e2bd9..000000000 --- a/distros/debian_cmake/changelog +++ /dev/null @@ -1,47 +0,0 @@ -zoneminder (1.28.108-nmu2015100101) wheezy; urgency=low - - * - - -- Isaac Connor Thu, 01 Oct 2015 18:20:29 +0000 - -zoneminder (1.28.107-nmu2015092401) wheezy; urgency=low - - * - - -- Isaac Connor Thu, 24 Sep 2015 14:15:46 +0000 - -zoneminder (1.28.1+106-nmu2015091001) wheezy; urgency=low - - * - - -- Isaac Connor Thu, 10 Sep 2015 18:03:43 +0000 - -zoneminder (1.28.0-0.1) wheezy; urgency=low - - * Use CMake instead of Autotools to simplify - debian/rules and have less build-depends. - * Some lintian love in debian/{control,copyright} - and perl ZoneMinder modules. - * Don't purge database if we use a remote - MySQL server. - - -- Cosme Domínguez Díaz Sun, 09 Nov 2014 02:20:20 +0100 - -zoneminder (1.28.0-wheezy) wheezy; urgency=medium - - * Release - - -- Isaac Connor Fri, 17 Oct 2014 09:27:22 -0400 - -zoneminder (1.27.99+1-testing-SNAPSHOT2014072901) testing; urgency=medium - - * improve error messages - * Make zmupdate re-run the most recent patch so that people running the daily builds get their db updates - - -- Isaac Connor Tue, 29 Jul 2014 14:50:20 -0400 - -zoneminder (1.27.0+1-testing-v4ltomonitor-1) testing; urgency=high - - * Snapshot release - - - -- Isaac Connor Wed, 09 Jul 2014 21:35:29 -0400 diff --git a/distros/debian_cmake/compat b/distros/debian_cmake/compat deleted file mode 100644 index ec635144f..000000000 --- a/distros/debian_cmake/compat +++ /dev/null @@ -1 +0,0 @@ -9 diff --git a/distros/debian_cmake/control b/distros/debian_cmake/control deleted file mode 100644 index 3b11f37b8..000000000 --- a/distros/debian_cmake/control +++ /dev/null @@ -1,71 +0,0 @@ -Source: zoneminder -Section: net -Priority: optional -Maintainer: Isaac Connor -Build-Depends: debhelper (>= 9), cmake - , libphp-serialization-perl - , libgnutls28-dev | libgnutls-dev - , libmysqlclient-dev | libmariadbclient-dev - , libjpeg8-dev - , libpcre3-dev - , libavcodec-dev, libavformat-dev (>= 3:0.svn20090204), libswscale-dev (>= 3:0.svn20090204), libavutil-dev - , libv4l-dev (>= 0.8.3) - , libbz2-dev - , libav-tools - , libnetpbm10-dev - , libavdevice-dev - , libvlccore-dev, libvlc-dev - , libcurl4-gnutls-dev | libcurl4-nss-dev | libcurl4-openssl-dev - , libgcrypt11-dev, libpolkit-gobject-1-dev -Standards-Version: 3.9.4 - -Package: zoneminder -Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends}, ${perl:Depends} - , apache2 | httpd, libapache2-mod-php5 | libapache2-mod-fcgid | php5-fpm - , php5-mysqlnd | php5-mysql - , mariadb-client | mysql-client - , libphp-serialization-perl - , libdate-manip-perl, libmime-lite-perl, libmime-tools-perl, libdbd-mysql-perl - , libwww-perl, libarchive-tar-perl, libarchive-zip-perl, libdevice-serialport-perl - , libmodule-load-perl, libsys-mmap-perl, libjson-any-perl - , libnet-sftp-foreign-perl, libio-pty-perl, libexpect-perl - , libdata-dump-perl, libclass-std-fast-perl, libsoap-wsdl-perl, libio-socket-multicast-perl, libdigest-sha-perl - , libsys-cpu-perl, libsys-meminfo-perl - , libpcre3 - , libav-tools, libavdevice53 - , rsyslog | system-log-daemon - , netpbm , libjpeg8 - , zip - , libvlccore5 | libvlccore7, libvlc5 - , libpolkit-gobject-1-0, php5-gd -Recommends: mysql-server | mariadb-server -Description: Video camera security and surveillance solution - ZoneMinder is intended for use in single or multi-camera video security - applications, including commercial or home CCTV, theft prevention and child - or family member or home monitoring and other care scenarios. It - supports capture, analysis, recording, and monitoring of video data coming - from one or more video or network cameras attached to a Linux system. - ZoneMinder also support web and semi-automatic control of Pan/Tilt/Zoom - cameras using a variety of protocols. It is suitable for use as a home - video security system and for commercial or professional video security - and surveillance. It can also be integrated into a home automation system - via X.10 or other protocols. - -Package: zoneminder-dbg -Architecture: any -Section: debug -Priority: extra -Depends: zoneminder (= ${binary:Version}), ${misc:Depends} -Description: Debugging symbols for zoneminder. - ZoneMinder is a video camera security and surveillance solution. - ZoneMinder is intended for use in single or multi-camera video security - applications, including commercial or home CCTV, theft prevention and child - or family member or home monitoring and other care scenarios. It - supports capture, analysis, recording, and monitoring of video data coming - from one or more video or network cameras attached to a Linux system. - ZoneMinder also support web and semi-automatic control of Pan/Tilt/Zoom - cameras using a variety of protocols. It is suitable for use as a home - video security system and for commercial or professional video security - and surveillance. It can also be integrated into a home automation system - via X.10 or other protocols. diff --git a/distros/debian_cmake/copyright b/distros/debian_cmake/copyright deleted file mode 100644 index 1c10c59db..000000000 --- a/distros/debian_cmake/copyright +++ /dev/null @@ -1,57 +0,0 @@ -Copyright: - -Copyright 2002 Philip Coombes - -License: - -This package 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 package 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 package; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -On Debian GNU/Linux systems, the text of the GPL can be found in -/usr/share/common-licenses/GPL. - -/usr/share/zoneminder/api/lib/Cake/*: -Copyright: - -Copyright (c) 2005-2013, Cake Software Foundation, Inc. - -License: - -CakePHP(tm) : The Rapid Development PHP Framework (http://cakephp.org) - -The MIT License - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - -Cake Software Foundation, Inc. -1785 E. Sahara Avenue, -Suite 490-204 -Las Vegas, Nevada 89104, -United States of America. diff --git a/distros/debian_cmake/dirs b/distros/debian_cmake/dirs deleted file mode 100644 index 9e29e6113..000000000 --- a/distros/debian_cmake/dirs +++ /dev/null @@ -1,5 +0,0 @@ -var/log/zm -var/lib/zm -var/cache/zoneminder/events -var/cache/zoneminder/images -var/cache/zoneminder/temp diff --git a/distros/debian_cmake/docs b/distros/debian_cmake/docs deleted file mode 100644 index b43bf86b5..000000000 --- a/distros/debian_cmake/docs +++ /dev/null @@ -1 +0,0 @@ -README.md diff --git a/distros/debian_cmake/init.d b/distros/debian_cmake/init.d deleted file mode 100644 index 036bb695d..000000000 --- a/distros/debian_cmake/init.d +++ /dev/null @@ -1,88 +0,0 @@ -#!/bin/sh -### BEGIN INIT INFO -# Provides: zoneminder -# Required-Start: $network $remote_fs $syslog -# Required-Stop: $network $remote_fs $syslog -# Should-Start: mysql -# Should-Stop: mysql -# Default-Start: 2 3 4 5 -# Default-Stop: 0 1 6 -# Short-Description: Control ZoneMinder as a Service -### END INIT INFO -# description: Control ZoneMinder as a Service -# chkconfig: 2345 20 20 - -# Source function library. -#. /etc/rc.d/init.d/functions - -prog=ZoneMinder -ZM_PATH_BIN="/usr/bin" -RUNDIR=/var/run/zm -TMPDIR=/tmp/zm -command="$ZM_PATH_BIN/zmpkg.pl" - -start() { - echo -n "Starting $prog: " - export TZ=:/etc/localtime - mkdir -p $RUNDIR $TMPDIR && chown www-data:www-data $RUNDIR $TMPDIR - $command start - RETVAL=$? - [ $RETVAL = 0 ] && echo success || echo failure - echo - [ $RETVAL = 0 ] && touch /var/lock/zm - return $RETVAL -} -stop() { - echo -n "Stopping $prog: " - # - # Why is this status check being done? - # as $command stop returns 1 if zoneminder - # is stopped, which will result in - # this returning 1, which will stuff - # dpkg when it tries to stop zoneminder before - # uninstalling . . . - # - result=`$command status` - if [ ! "$result" = "running" ]; then - echo "Zoneminder already stopped" - echo - RETVAL=0 - else - $command stop - RETVAL=$? - [ $RETVAL = 0 ] && echo success || echo failure - echo - [ $RETVAL = 0 ] && rm -f /var/lock/zm - fi -} -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' | 'force-reload') - stop - start - ;; -'status') - status - ;; -*) - echo "Usage: $0 { start | stop | restart | status }" - RETVAL=1 - ;; -esac -exit $RETVAL diff --git a/distros/debian_cmake/install b/distros/debian_cmake/install deleted file mode 100644 index 97c5f7a03..000000000 --- a/distros/debian_cmake/install +++ /dev/null @@ -1,8 +0,0 @@ -usr/bin -usr/lib/zoneminder/cgi-bin -usr/share/man -usr/share/perl5/ZoneMinder -usr/share/perl5/ZoneMinder.pm -usr/share/zoneminder/db -usr/share/zoneminder/www -etc/zm diff --git a/distros/debian_cmake/links b/distros/debian_cmake/links deleted file mode 100644 index 5560a100a..000000000 --- a/distros/debian_cmake/links +++ /dev/null @@ -1,3 +0,0 @@ -var/cache/zoneminder/events usr/share/zoneminder/events -var/cache/zoneminder/images usr/share/zoneminder/images -var/cache/zoneminder/temp usr/share/zoneminder/temp diff --git a/distros/debian_cmake/postinst b/distros/debian_cmake/postinst deleted file mode 100644 index d06f9c641..000000000 --- a/distros/debian_cmake/postinst +++ /dev/null @@ -1,53 +0,0 @@ -#! /bin/sh - -set -e - -if [ "$1" = "configure" ]; then - if [ -e "/etc/init.d/mysql" ]; then - # - # Get mysql started if it isn't - # - if ! $(/etc/init.d/mysql status >/dev/null 2>&1); then - invoke-rc.d mysql start - fi - if $(/etc/init.d/mysql status >/dev/null 2>&1); then - mysqladmin --defaults-file=/etc/mysql/debian.cnf -f reload - # test if database if already present... - if ! $(echo quit | mysql --defaults-file=/etc/mysql/debian.cnf zm > /dev/null 2> /dev/null) ; then - cat /usr/share/zoneminder/db/zm_create.sql | mysql --defaults-file=/etc/mysql/debian.cnf - echo 'grant lock tables, alter,select,insert,update,delete on zm.* to 'zmuser'@localhost identified by "zmpass";' | mysql --defaults-file=/etc/mysql/debian.cnf mysql - fi - - invoke-rc.d zoneminder stop || true - zmupdate.pl --nointeractive - - else - echo 'NOTE: mysql not running, please start mysql and run dpkg-reconfigure zoneminder when it is running.' - fi - else - echo 'mysql not found, assuming remote server.' - fi - chown www-data:www-data /var/log/zm - chown www-data:www-data /var/lib/zm/ - if [ -z "$2" ]; then - chown www-data:www-data -R /var/cache/zoneminder - fi -fi -# Ensure zoneminder is stopped... -if [ -x "/etc/init.d/zoneminder" ]; then - if invoke-rc.d zoneminder status ; then - invoke-rc.d zoneminder stop || exit $? - fi -fi - -if [ "$1" = "configure" ]; then - if [ -z "$2" ]; then - chown www-data:www-data /var/log/zm - chown www-data:www-data /var/lib/zm/ - chown www-data:www-data -R /var/cache/zoneminder - else - chown www-data:www-data /var/log/zm - zmupdate.pl - fi -fi -#DEBHELPER# diff --git a/distros/debian_cmake/postrm b/distros/debian_cmake/postrm deleted file mode 100644 index fde590981..000000000 --- a/distros/debian_cmake/postrm +++ /dev/null @@ -1,11 +0,0 @@ -#! /bin/sh -set -e - -if [ "$1" = "purge" ]; then - if [ -e "/etc/init.d/mysql" ]; then - echo 'delete from user where User="zmuser";' | mysql --defaults-file=/etc/mysql/debian.cnf mysql - echo 'delete from db where User="zmuser";' | mysql --defaults-file=/etc/mysql/debian.cnf mysql - mysqladmin --defaults-file=/etc/mysql/debian.cnf -f drop zm - fi -fi -#DEBHELPER# diff --git a/distros/debian_cmake/preinst b/distros/debian_cmake/preinst deleted file mode 100644 index 6cd01ba55..000000000 --- a/distros/debian_cmake/preinst +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/sh - -set -e - -abort=false -if [ -L /usr/share/zoneminder/events ]; then - l=$(readlink /usr/share/zoneminder/events) - if [ "$l" != "/var/cache/zoneminder/events" ]; then - abort=true - fi -fi -if [ -L /usr/share/zoneminder/images ]; then - l=$(readlink /usr/share/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 -/usr/share/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 - -#DEBHELPER# - -exit 0 diff --git a/distros/debian_cmake/rules b/distros/debian_cmake/rules deleted file mode 100755 index 4bdc7cb0c..000000000 --- a/distros/debian_cmake/rules +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/make -f -# -*- makefile -*- -# Uncomment this to turn on verbose mode. -#export DH_VERBOSE=1 - -export CFLAGS = -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -pipe -export CXXFLAGS = -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -pipe -INSTDIR = debian/tmp - -override_dh_auto_configure: - dh_auto_configure -- \ - -DCMAKE_INSTALL_PREFIX=/usr \ - -DCMAKE_SKIP_RPATH=ON \ - -DCMAKE_VERBOSE_MAKEFILE=OFF \ - -DCMAKE_COLOR_MAKEFILE=ON \ - -DZM_RUNDIR=/var/run/zm \ - -DZM_SOCKDIR=/var/run/zm \ - -DZM_TMPDIR=/var/tmp/zm \ - -DZM_LOGDIR=/var/log/zm \ - -DZM_WEBDIR=/usr/share/zoneminder/www \ - -DZM_CONTENTDIR=/var/cache/zoneminder \ - -DZM_CGIDIR=/usr/lib/zoneminder/cgi-bin \ - -DZM_WEB_USER=www-data \ - -DZM_WEB_GROUP=www-data \ - -DCMAKE_INSTALL_SYSCONFDIR=etc/zm - -override_dh_auto_install: - dh_auto_install --buildsystem=cmake - install -D -m 0644 debian/apache.conf $(INSTDIR)/etc/zm/apache.conf - rm $(INSTDIR)/usr/share/zoneminder/api/lib/Cake/LICENSE.txt - rm $(INSTDIR)/usr/share/zoneminder/api/.gitignore - rm -r $(INSTDIR)/usr/share/zoneminder/api/lib/Cake/Test - -override_dh_auto_test: - # do not run tests... - -override_dh_strip: - dh_strip --dbg-package=zoneminder-dbg - -%: - dh $@ --buildsystem=cmake --parallel diff --git a/distros/debian_cmake/watch b/distros/debian_cmake/watch deleted file mode 100644 index 5a8a9c4d7..000000000 --- a/distros/debian_cmake/watch +++ /dev/null @@ -1,3 +0,0 @@ -version=3 -http://www.zoneminder.com/downloads.html \ - .*/ZoneMinder-(.*).tar.gz diff --git a/distros/ubuntu1204_cmake/NEWS b/distros/ubuntu1204/NEWS similarity index 100% rename from distros/ubuntu1204_cmake/NEWS rename to distros/ubuntu1204/NEWS diff --git a/distros/ubuntu1204/README.Debian b/distros/ubuntu1204/README.Debian index b8ea413e3..2ba809fe4 100644 --- a/distros/ubuntu1204/README.Debian +++ b/distros/ubuntu1204/README.Debian @@ -1,9 +1,120 @@ -zoneminder for Debian +Zoneminder for Debian --------------------- -There is one manual step to get the web interface working. -You need to link /etc/zm/apache.conf to /etc/apache2/conf.d/zoneminder.conf, -then reload the apache config (i.e. /etc/init.d/apache2 reload) +Initializing database +--------------------- + + pv /usr/share/zoneminder/db/zm_create.sql | sudo mysql --defaults-file=/etc/mysql/debian.cnf +OR + cat /usr/share/zoneminder/db/zm_create.sql | sudo mysql --defaults-file=/etc/mysql/debian.cnf + + echo 'grant lock tables,alter,create,select,insert,update,delete on zm.* to 'zmuser'@localhost identified by "zmpass";'\ + | sudo mysql --defaults-file=/etc/mysql/debian.cnf mysql + +Hint: generate secure password with `pwgen` and update "/etc/zm/zm.conf" +accordingly. + +The following command can help to ensure that zoneminder can read its +configuration file: + + chgrp -c www-data /etc/zm/zm.conf + + +Upgrading database +------------------ + +Prior to 1.28.1 database upgrade was performed automatically. +"zoneminder" service will refuse to start with outdated database. + +Assuming that database is on "localhost" then the following command can be +used to upgrade "zm" database: + + zmupdate.pl + +Additional permissions may be required to perform upgrade: + + echo 'grant lock tables, create, alter on zm.* to 'zmuser'@localhost identified by "zmpass";'\ + | sudo mysql --defaults-file=/etc/mysql/debian.cnf mysql + +The following command prints the current version of zoneminder database: + + echo 'select Value from Config where Name = "ZM_DYN_CURR_VERSION";' \ + | sudo mysql --defaults-file=/etc/mysql/debian.cnf --skip-column-names zm + + +Enabling service +---------------- + +By default Zoneminder service is not starting automatically and need to be +manually activated once database is configured: + +On systemd: + + sudo systemctl enable zoneminder.service + +On SysV: + + sudo update-rc.d zoneminder enable + + +Web server set-up +----------------- + +There are few manual steps to get the web interface working: + +## Apache2 + +Apache can be configured as folder "/zm" using sample .conf: + + sudo a2enconf zoneminder + +Alternatively Apache web site configuration template can be used to setup +zoneminder as "http://zoneminder": + + sudo cp -v /usr/share/doc/zoneminder/examples/apache.conf /etc/apache2/sites-available/ + sudo a2ensite zoneminder.conf + +Common configuration steps for Apache2: + + sudo a2enmod cgi + sudo service apache2 reload + + +## nginx / fcgiwrap + +Nginx needs "php5-fpm" package to support PHP and "fcgiwrap" package +for binary "cgi-bin" applications: + + sudo apt-get install php5-fpm fcgiwrap + +To enable a URL alias that makes Zoneminder available from + + http://yourserver/zm + +the following line is to be added to "server" section of a web site +configuration: + + include /usr/share/doc/zoneminder/examples/nginx.conf; + +For "default" web site it would be sufficient to include the above +statement to the file + + /etc/nginx/sites-enabled/default + +To avoid problems with feeds from multiple cameras "fcgiwrap" should be +configured to start at least as many processes as there are cameras. +It can be done by adjusting DAEMON_OPTS in "/etc/default/fcgiwrap". +Systemd users may be affected by the following bug: + + http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=792705 + + +## Note: + +When Zoneminder web site is running it may be necessary to set +Options/Paths/PATH_ZMS to "/zm/cgi-bin/nph-zms" or according to chosen web +site configuration. + Changing the location for images and events ------------------------------------------- @@ -33,19 +144,17 @@ These lines in fstab could allow you to bind-mount an alternate location /dev/sdX1 /var/cache/zoneminder/images ext3 defaults 0 2 /dev/sdX2 /var/cache/zoneminder/events ext3 defaults 0 2 - - -- Peter Howard , Sun, 16 Jan 2010 01:35:51 +1100 Access to /dev/video* --------------------- -For cameras which require access to /dev/video*, zoneminder may need the +For cameras which require access to /dev/video*, zoneminder may need the www-data user added to the video group in order to see those cameras: adduser www-data video -Note that all web applications running on the zoneminder server will then have +Note that all web applications running on the zoneminder server will then have access to all video devices on the system. -- Vagrant Cascadian Sun, 27 Mar 2011 13:06:56 -0700 diff --git a/distros/ubuntu1204_cmake/TODO.Debian b/distros/ubuntu1204/TODO.Debian similarity index 100% rename from distros/ubuntu1204_cmake/TODO.Debian rename to distros/ubuntu1204/TODO.Debian diff --git a/distros/ubuntu1204/apache.conf b/distros/ubuntu1204/apache.conf deleted file mode 100644 index 262db423f..000000000 --- a/distros/ubuntu1204/apache.conf +++ /dev/null @@ -1,21 +0,0 @@ -Alias /zm /usr/share/zoneminder/www - - - - Options +ExecCGI - AllowOverride All - AddHandler fcgid-script .php - FCGIWrapper /usr/bin/php5-cgi - Order allow,deny - Allow from all - - - - - php_flag register_globals off - Options Indexes FollowSymLinks - - DirectoryIndex index.php - - - diff --git a/distros/ubuntu1204/changelog b/distros/ubuntu1204/changelog index 09571c21b..74cf1d0b8 100644 --- a/distros/ubuntu1204/changelog +++ b/distros/ubuntu1204/changelog @@ -1,94 +1,573 @@ -zoneminder (1.28.1+1-trusty-SNAPSHOT2015071501) trusty; urgency=medium +zoneminder (1.28.1+1-vivid-SNAPSHOT2015081701) vivid; urgency=medium - * fix for issue #586 and #932 - * fix for db not being upgraded - * version upgraded to .100 + * include api, switch to cmake build - -- Isaac Connor Wed, 15 Jul 2015 11:56:28 -0400 + -- Isaac Connor Mon, 17 Aug 2015 10:29:23 -0400 -zoneminder (1.28.1+1-trusty-SNAPSHOT2015030201) trusty; urgency=medium - * maybe fix for RTSP Basic Auth - * Also remove dependency on netpbm +zoneminder (1.28.1-8) unstable; urgency=medium - -- Isaac Connor Mon, 02 Mar 2015 11:25:59 -0500 + * Patchworks: + + New upstream "980-fix-image-size.patch". + + New "default_cgi-path.patch" to correct default ZM_PATH_ZMS. + * postinst: set "root" as group owner for "/var/log/zm" to silence + logrotate warnings. + * Minor correction to README.Debian. -zoneminder (1.28.1+1-utopic-SNAPSHOT2015022301) utopic; urgency=medium + -- Dmitry Smirnov Sun, 16 Aug 2015 19:19:50 +1000 - * Big merge of onvif support and some fixes. +zoneminder (1.28.1-7) unstable; urgency=medium - -- Isaac Connor Mon, 23 Feb 2015 19:45:45 -0500 + * Build-Depends += "cakephp (<< 3.0.0~)"; + Zoneminder is not compatible with latest CakePHP. + * Handle conffile removal from maintscript. + * rules: build man pages reproducibly. + * gbp.conf: renamed old style config section [git-dch] to [dch]. + * README + + added instructions to update owner of the "/etc/zm/zm.conf" + (Closes: #789327). + + zmupdate.pl needs CREATE rights. + + added note about required number of "fcgiwrap" workers. + * New upstream patch: "zmtrigger-plus.patch". -zoneminder (1.28.0+1-trusty-SNAPSHOT2015021201) trusty; urgency=medium + -- Dmitry Smirnov Mon, 20 Jul 2015 16:30:15 +1000 - * add mysql-client-5.6 as a dependency instaed of mysql-client. +zoneminder (1.28.1-6) unstable; urgency=low - -- Isaac Connor Fri, 13 Feb 2015 09:35:13 -0500 + * New "zoneminder-doc" and "zoneminder-dbg" packages. -zoneminder (1.28.0+1-trusty-SNAPSHOT2015011101) trusty; urgency=medium + -- Dmitry Smirnov Sun, 19 Apr 2015 14:50:41 +1000 - * small changes +zoneminder (1.28.1-5) unstable; urgency=low - -- Isaac Connor Fri, 12 Dec 2014 16:38:36 -0500 + * Move handling of "/var/run/zm" and "/tmp/zm" from .service into .tmpfile. + Let dh_installinit do the job. Thanks, Andrew Bauer. + * Use dh_apache2 to install Apache conf file; remove old conf and symlink. + * Promote "libapache2-mod-php5 | php5-fpm" to Recommends. + * Build-Depends: + + dh-linktree + + cakephp (>= 2.6.3) + + libjs-jquery + + libjs-mootools + * Depends: + - libjs-jquery + - libjs-mootools + * Build-time replace bundled CakePHP with system one using "dh-linktree". + * Use "dh-linktree" to handle mootools and jquery symlinks. -zoneminder (1.28.0+1-utopic-SNAPSHOT2014112001) utopic; urgency=medium + -- Dmitry Smirnov Sun, 19 Apr 2015 11:45:01 +1000 - * Various fixes and developments since 1.28.0. Includes Digest-Auth for HTTP and better for RTSP +zoneminder (1.28.1-4) unstable; urgency=low - -- Isaac Connor Thu, 20 Nov 2014 10:57:57 -0500 + * New patch to fix HTML export with USE_DEEP_STORAGE (closes: #723706). + * New "783.patch" to describe potential data loss in ZM_USE_DEEP_STORAGE. + * New patch to change default date format to region-neutral ISO notation + with time zone. + * Build sphinx documentation: + + Install "zoneminder.1" man page. + + Build-Depends += "python-sphinx | python3-sphinx" + + Added commented "zoneminder-doc" package. + + Added "docs.patch" to unlink distro-specific installation docs. + * rules: + + set ZM_CONTENTDIR, ZM_SOCKDIR and ZM_TMPDIR. + + remove mistakengly installed Perl module templates. + * Updated startup scripts to create ZM_TMPDIR. + * Hurd improvements: + + New patch to add PATH_MAX definitions. + + Build without MMAP support on Hurd. + + libsys-mmap-perl [!hurd-any]. -zoneminder (1.28.0-trusty) trusty; urgency=medium + -- Dmitry Smirnov Mon, 06 Apr 2015 18:18:55 +1000 - * Release +zoneminder (1.28.1-3) unstable; urgency=low - -- Isaac Connor Fri, 17 Oct 2014 09:25:55 -0400 + * Updated Apache2 and nginx configuration templates to support CGI. + * Updated README.Debian to document cgi-bin setup. + * Removed "/usr/share/zoneminder/www/cgi-bin" symlink. + * Added "apache2.patch" to correct Apache2 site configuration example. + * control: Suggests += "fcgiwrap". + * rules: added dh_systemd overrides to prevent automatic service + activation and start. + * Added note about manual service activation to README.Debian + (Closes: #781733). -zoneminder (1.27.99+1-trusty-SNAPSHOT2014101401) trusty; urgency=medium + -- Dmitry Smirnov Thu, 02 Apr 2015 23:20:20 +1100 - * Several PR merges in big push for 1.28.0 +zoneminder (1.28.1-2) unstable; urgency=low - -- Isaac Connor Tue, 14 Oct 2014 09:28:29 -0400 + * Removed word "Linux" from short package description. + * Build-Depends: do not require "libv4l-dev" on Hurd i.e. [!hurd-any]. + * Added run-time Perl Depends: + + libdbd-mysql-perl + + libimage-info-perl + + libmodule-load-conditional-perl + + libnet-sftp-foreign-perl + + liburi-encode-perl + * Prepare for package split: added commented "libzoneminder-perl" + and "zoneminder-dbg" packages to "debian/control". + * rules: do not install worthless ".packlist" file. + * Updated "libv4l1-videodev.h.patch" to fix v4lv1 detection in CMake. -zoneminder (1.27.99+1-trusty-SNAPSHOT2014092601) trusty; urgency=medium + -- Dmitry Smirnov Thu, 02 Apr 2015 13:25:19 +1100 - * style updates and db fixes for database logging filters +zoneminder (1.28.1-1) unstable; urgency=low - -- Isaac Connor Fri, 26 Sep 2014 14:44:45 -0400 + [ Dmitry Smirnov ] + * New upstream release [February 2015]. + * Upload to unstable. + * Disabled automatic database upgrades: post(inst|rm) scripts no longer + touch database or do unexpected stuff (Closes: #779254). + See README.Debian for details. + * Updated installation paths: + + /usr/share/zoneminder --> /usr/share/zoneminder/www + + /usr/lib/cgi-bin --> /usr/lib/zoneminder/cgi-bin + * Added logrotate config (Closes: #544826). + Thanks, Alberto Reyes. + * Native systemd service; "--with systemd" added to dh. + * Build with CMake instead of autoconf; rules clean-up. + * Build with all hardening. + * Build and install "zmupdate.pl.1" man page. + * Added nginx/php5-fpm configuration example. + * Install upstream "apache.conf" example. + * Described setup of Zoneminer web site and database in README.Debian. + * Install "/etc/zm/zm.conf" with tighter permissions. + * Added TODO.Debian. + * Added "debian/clean"; "debian/gbp.conf"; bug-presubj. + * Remove bundled Cake tests to take ~5 MB off big-usr-share. + * Standards-Version: 3.9.6; compat/debhelper to version 9. + * Vcs links to new git repository at collab-maint. + * Build-Depends: + + dh-systemd + + libgcrypt11-dev --> libgcrypt-dev + + libcurl4-gnutls-dev + + libvlc-dev + + policykit-1 (required by "zmsystemctl.pl") + - dh-autoreconf, autoconf, automake + * Depends: + - apache2 + - libapache2-mod-php5 (moved to Suggests) + - libpcre3 (invalid) + - libmodule-load-perl (obsolete; replaced with perl-modules) + - libarchive-tar-perl (obsolete; replaced with perl-modules) + - mysql-server (moved to Recommends, Closes: #759504). + - php5 + + libav-tools + + libjs-jquery (replaces bundled component) + + libjs-mootool (replaces bundled component) + + libjson-any-perl (Closes: #690803). + + perl-modules (Closes: #745819). + * Recommends: + + apache2 | httpd + + mysql-server | virtual-mysql-server (Closes: #732874). + * Suggests: + + libapache2-mod-php5 | php5-fpm + + logrotate + * Refreshed, renamed and re-ordered patches; added DEP-3 headers. + * Removed "vendor_perl" patch (applied-upstream). + * New patches: + + cmake-fix-confpath.patch + + cmake-gnutls.patch + + cmake-nossl.patch + + cmake.patch + + format-hardening.patch + + pod_man_fixes.patch + + pod_name_fixes.patch + + pod_zmupdate-to-pod2usage.patch + * Lintianisation (incomplete): + - extra-license-file + - init.d-script-missing-lsb-description + - init.d-script-does-not-source-init-functions + - privacy-breach-generic + - package-contains-empty-directory + - manpage-has-errors-from-pod2man + - manpage-has-bad-whatis-entry + - quilt-patch-missing-description + - no-dep5-copyright + * Lintian-overrides: + + unusual-interpreter usr/bin/zmsystemctl.pl #!/usr/bin/pkexec + + script-not-executable usr/share/zoneminder/www/api/* + + script-with-language-extension usr/bin/*.pl + + source-is-missing web/tools/mootools/mootools-*-yc.js + + source-is-missing web/skins/*/js/jquery-1.4.2.min.js + + source-contains-prebuilt-javascript-object + * Renamed files in "debian". + * watch: dfsg repacksuffix and dversionmangle. + * "debian/copyright" to Copyright-Format-1.0. + * Set myself as new Maintainer (Closes: #760314). -zoneminder (1.27.99+1-trusty-SNAPSHOT2014090801) trusty; urgency=medium + [ Vagrant Cascadian ] + * Removed obsolete DM-Upload-Allowed flag. + * Update debian/watch to use tarballs from github. + * Add Build-Depends on libgcrypt11-dev (Closes: #745819). + * Use canonical alioth Vcs-Hg URL. + * debian/control: Add Build-Depends: libpolkit-gobject-1-dev. + * Removed configure flag "--enable-crashtrace=no", which is no longer + present upstream. - * several segfault fixes for local cameras + -- Dmitry Smirnov Tue, 31 Mar 2015 15:11:13 +1100 - -- Isaac Connor Mon, 08 Sep 2014 16:56:57 -0400 +zoneminder (1.26.5-3.1) experimental; urgency=low -zoneminder (1.27.99+1-trusty-SNAPSHOT2014090701) trusty; urgency=medium + * Non-maintainer upload. + * Add libav10.patch and compile against libav10 (Closes: #739461) - * Fix segfaults for local cameras, also now includes the systemd support patch + -- Reinhard Tartler Wed, 19 Mar 2014 00:31:22 +0000 - -- Isaac Connor Sun, 07 Sep 2014 17:19:01 -0400 +zoneminder (1.26.5-3) unstable; urgency=low -zoneminder (1.27.99+1-trusty-SNAPSHOT2014082102) trusty; urgency=medium - * Fix UI inputs for v4l multibuffer and captures per frame + * Previous release still didn't build on PPC - this has been corrected. + (Closes: #736516) - -- Isaac Connor Thu, 21 Aug 2014 12:03:31 -0400 + -- Peter Howard Tue, 4 Feb 2014 02:02:10 +1000 -zoneminder (1.27.99+1-trusty-SNAPSHOT2014082101) trusty; urgency=medium +zoneminder (1.26.5-2) unstable; urgency=low - * fall back to Config table values for V4l MultiBUffer and Captures Per Frame - * add mention of monitor page settings for thse in the config table + * Remove dependency on ffmpeg + (Closes: #721161) - -- Isaac Connor Thu, 21 Aug 2014 10:04:46 -0400 + * Builds again on non-x86 target architectures. -zoneminder (1.27.99+1-precise-SNAPSHOT2014080601) precise; urgency=medium + -- Peter Howard Thu, 23 Jan 2014 01:02:10 +1000 - * improve error messages - * Make zmupdate re-run the most recent patch so that people running the daily builds get their db updates +zoneminder (1.26.5-1) unstable; urgency=low - -- Isaac Connor Wed, 06 Aug 2014 20:20:20 -0400 + * New upstream version + (Closes: #694131) + * Change Build-Depends on libgnutls-dev to libgnutls-openssl-dev + (Closes: #731560) + -- Peter Howard Tue, 17 Dec 2013 01:02:10 +1000 -zoneminder (1.27.0+1-trusty-v4ltomonitor-1) trusty; urgency=high +zoneminder (1.25.0-4) unstable; urgency=high - * Snapshot release - + * Add CVE-2013-0232 patch + [SECURITY] CVE-2013-0232: Shell escape commands with untrusted content. + Thanks to James McCoy (Closes: #698910) + Thanks also to Salvatore Bonaccorso - -- Isaac Connor Wed, 09 Jul 2014 21:35:29 -0400 + -- Peter Howard Tue, 12 Jun 2013 12:02:10 +1000 + +zoneminder (1.25.0-3) unstable; urgency=low + + * debian/rules: Export CFLAGS, CPPFLAGS, CXXFLAGS and LDFLAGS, to ensure + hardening build flags are enabled. + + -- Vagrant Cascadian Tue, 28 Aug 2012 12:10:03 -0700 + +zoneminder (1.25.0-2) unstable; urgency=low + + [ Vagrant Cascadian ] + * Add a patch to disable checking for updated versions by default, as + upgrades should happen through package management. + * Use dpkg-buildflags in debian/rules to set default compiler flags. + * Ensure zoneminder is stopped before starting (Closes: #657407). + + [ Peter Howard ] + * Fix postinst to add permission for table creation during upgrade + (Closes: #657407). + + -- Vagrant Cascadian Thu, 23 Aug 2012 12:40:34 -0700 + +zoneminder (1.25.0-1.1) unstable; urgency=low + + * Non-maintainer upload. + * Fix "ftbfs with GCC-4.7": add patch Fix-FTBFS-with-gcc-4.7 from Cyril + Brulebois: fix missing includes. + (Closes: #667428) + + -- gregor herrmann Sun, 13 May 2012 17:02:21 +0200 + +zoneminder (1.25.0-1) unstable; urgency=low + + * Fix typo in libv4l1-videodev.h patch that caused v4l1 support to be + dropped. + * Fail to build if version in postinst doesn't match upstream version. + * Add Build-Depends: libavdevice-dev to fix MPEG streaming (Closes: #515558). + * debian/rules: Convert to using debhelper overrides. + * Set debian/compat to 7. + * Simplify debian/watch file. + * Refresh debian/patches/use_libjs-mootools. + * Refresh debian/patches/libv4l1-videodev.h. + * Remove dependencies on php4 and related packages. + * Remove build-dependencies on libmysqlclient14-dev and + libmysqlclient15-dev. + * Update Build-Depends to use libjpeg-dev instead of libjpeg62-dev + (Closes: #647114). + * Add patch to fix build by testing for C headers rather than C++ headers. + Thanks to Ryan Niebur. (Closes: #654230) + * Add a patch to fix build problems caused by API changes in libav 0.8. + Thanks again to Ryan Niebur. (Closes: #654230) + + -- Vagrant Cascadian Mon, 16 Jan 2012 11:58:05 -0800 + +zoneminder (1.24.4-1) unstable; urgency=low + + [ Peter Howard ] + * Initial release of 1.24.4 (Closes: #634985). + - Fix 32/64-bit type declarations (Closes: #614404). + * Update patches. + + [ Vagrant Cascadian ] + * Add patch to fix FTBFS by using libv4l1-videodev.h from libv4l-dev. + Thanks to Andreas Metzler for reporting the issue. + (Closes: #619813). + * Document adding the www-data user to the video group in README.Debian. + (Closes: #611324) + * Depend on libsys-mmap-perl to enable mapped memory support. + (Closes: #607331) + * Update libjs-mootools patch to use -nc variants (Closes: #635075). + * Depend on javascript-common, to ensure that /javascript is available in + the web server. + * Set the upstream version in postinst at build time. + * Use dh-autoreconf to properly clean up autogenerated files during build. + * Add Vcs-HG to debian/control. + * Add Build-Depends: libv4l-dev, libbz2-dev, dh-autoreconf, libsys-mmap-perl. + + -- Vagrant Cascadian Sun, 24 Jul 2011 16:44:30 +0200 + +zoneminder (1.24.2-9) unstable; urgency=low + + * Apply patch from Ubuntu to fix FTBFS with ffmpeg 0.6: + - Add -D__STDC_CONSTANT_MACROS to CPPFLAGS (closes: 614080). + * Update Standards-Version to 3.9.1, no changes necessary. + + -- Vagrant Cascadian Sun, 20 Feb 2011 23:43:02 -0800 + +zoneminder (1.24.2-8) unstable; urgency=medium + + [ Vagrant Cascadian ] + * Apply patch to fix V4L2 cameras without crop support (closes: #608790). + Thanks to piratebab. + * Add preinst script which aborts if dangerous symlinks exist. + (closes: #608793) + + [ Peter Howard ] + * Added to README.Debian with info about images and events directories. + (closes: #608793) + + -- Vagrant Cascadian Sat, 15 Jan 2011 19:39:26 -0800 + +zoneminder (1.24.2-7) unstable; urgency=medium + + * Do not set ownership of /var/cache/zoneminder when upgrading, which fixes a + regression causing upgrades to take inordinately long with large + installations (closes: #597040). + + -- Vagrant Cascadian Fri, 17 Sep 2010 11:24:41 -0700 + +zoneminder (1.24.2-6) unstable; urgency=low + + * Only remove database on purge. This requires only creating the database if + it doesn't already exist, and upgrading the database only if the database + is an older version (closes: #497107). + + * Do not prompt the user on database upgrades by using the --nointeractive + flag when calling zmupdate.pl from postinst (closes: #595902). + + -- Vagrant Cascadian Fri, 10 Sep 2010 10:06:06 -0700 + +zoneminder (1.24.2-5) unstable; urgency=low + + [ Peter Howard ] + * Add zip dependency + (closes: #494261) + * Add debian/watch file + (closes: #545552) + * Use packaged libjs-mootools + (closes: #585590) + * Miscellaneous cleanups + + [ Vagrant Cascadian ] + * Add vagrant@debian.org as uploader + * Update Standards-Version to 3.9.0, no changes necessary. + + -- Vagrant Cascadian Fri, 23 Jul 2010 18:12:50 -0500 + +zoneminder (1.24.2-4.1) unstable; urgency=low + + * Non-maintainer upload. + * Fix "package removed, processes still running": apply patch to + debian/postinst by Vagrant Cascadian: use invoke-rc.d and run + mysql-related actions only when mysql is running (closes: #583648). + + -- gregor herrmann Thu, 01 Jul 2010 19:47:10 +0200 + +zoneminder (1.24.2-4) unstable; urgency=high + * Update init.d to list mysql dependency + (closes: #583505) + * Change depenency from libmime-perl to libmime-tools-perl + (closes: #585589) + * Problems in changelog format fixed + (closes: #585592) + * Fix debian-rules-ignores-make-clean-error + (closes: #585593) + -- Peter Howard Mon, 14 jun 2010 15:02:10 +1000 + +zoneminder (1.24.2-3) unstable; urgency=high + * Changes symbols to build with libjpeg8 + (closes: #565326, #568327) + * Note: location of all perl files should have been fixed in previous release + (closes: #553096) + -- Peter Howard Mon, 26 apr 2010 15:02:10 +1000 + +zoneminder (1.24.2-2) unstable; urgency=high + + * Remove custom perl parth from zmpkg.pl, fix location of manpages. + (closes: #551746, #553092) + * Fix GCC4.4 bug + (closes: #531717) + * Fix potential bug in postinst script + + -- Peter Howard Sat, 14 Nov 2009 15:02:10 +1000 + +zoneminder (1.24.2-1) unstable; urgency=high + + * Initial release of zoneminder 1.24.2 + -- Peter Howard Fri, 11 Sep 2009 07:02:50 +1000 + +zoneminder (1.24.1-1) unstable; urgency=high + + * Initial release of zoneminder 1.24.1, closing CVE-2008-3882, + CVE-2008-3881, CVE-2008-3880 + (closes: #497640) + * Change syslog dependency to rsyslog. + (closes: #526918) + * Add missing perl depenency. + * Restore patch to disable "check for updates" by default. + * Removed spurious '$' in init script. + (closes: #486064) + * Change permission of zm.conf from 0600 to 0400 for CVE-2008-6755 + (closes: #528252) + -- Peter Howard Sat, 16 May 2009 07:02:50 +1000 + +zoneminder (1.23.3-4) unstable; urgency=high + + * update to get it building with latest unstable. Thanks to waldi@debian.org + (closes: #517569) + -- Peter Howard Thu, 16 Apr 2009 01:02:50 +1000 + +zoneminder (1.23.3-3) unstable; urgency=high + + * ffmpeg confirmed working + (closes: #475145) + * Fix upgrade problem intrudouced in 1.23.3-1 + (closes: #481637) + * Include libmime-lite-perl in dependencies + (closes: #486312) + -- Peter Howard Thu, 18 Sep 2008 01:02:50 +1000 + +zoneminder (1.23.3-2) unstable; urgency=high + + * ffmpeg finally working? + + -- Peter Howard Wed, 13 Aug 2008 01:02:50 +1000 + +zoneminder (1.23.3-1) unstable; urgency=high + + * Initial version for 1.23.3 - security fix. + (closes: #479034) + + -- Peter Howard Wed, 19 Mar 2008 01:02:50 +1000 + +zoneminder (1.23.2-2) unstable; urgency=low + + * Update to init.d + (closes: #468856) + * Add dependency on logging daemon + (closes: #471277) + + -- Peter Howard Wed, 19 Mar 2008 01:02:50 +1000 + +zoneminder (1.23.2-1) unstable; urgency=low + + * Initial version for 1.23.2 + (closes: #464152) + * Zoneminder 1.23.2 upstream includes fix for GCC 4.3 + (closes: #454980) + * Includes ffmpeg patch by Alexander Kushnirenko + + -- Peter Howard Sat, 01 Mar 2008 16:02:50 +1000 + +zoneminder (1.22.3-10) unstable; urgency=low + + * Fix bug introduced in -9 where perl is put under /usr/local + (closes: #457507) + + -- Peter Howard Mon, 24 Dec 2007 16:02:50 +1000 + +zoneminder (1.22.3-9) unstable; urgency=low + + * Starting zoneminder via init script now invokes "zmfix -a" + (closes: #481637) + * Change apache2-mpm-prefork dependency to apache2 + * Temp dir for export under /var/cache/zoneminder (but linked back to + /usr/share/zoneminder for now) + * Redo use of gnutls rather than openssl for md5 hashes + + -- Peter Howard Mon, 10 Dec 2007 16:02:50 +1000 + +zoneminder (1.22.3-8) unstable; urgency=low + + * Build now includes libpcre3 + (closes: #437533) + * "Monitor Presets" patch now applied to package during build. + + -- Peter Howard Sat, 18 Aug 2007 14:35:23 +1000 + +zoneminder (1.22.3-7) unstable; urgency=low + + * Turn off debug trace and crash dump on build + (closes:#414857,#414891) + * Additional perl libraries added in dependencies + (closes:#416291) + * Change preferred PHP version from 4 to 5 + -- Peter Howard Sun, 29 Jul 2007 15:11:13 +1000 + +zoneminder (1.22.3-6) unstable; urgency=low + + * Removed a similar bash only statement from zmpkg.pl + (closes:414882) + + -- Peter Howard Sat, 14 Apr 2007 11:46:56 +1000 + +zoneminder (1.22.3-5) unstable; urgency=low + + * Installs with "phone home" feature turned off by default, and permissions + on /etc/zm/zm.conf fixed (now the 0600 it s hould be) + (closes:415349) + * Removed "stupid bash-ism" on mysqld check in postinst file. + + -- Peter Howard Fri, 6 Apr 2007 15:50:00 +1000 + +zoneminder (1.22.3-4) unstable; urgency=low + + * Put libmysqlclient-15-dev in front of -14-dev so sbuild works + (closes: #414410) + + -- Peter Howard Mon, 12 Mar 2007 11:38:56 +1100 + +zoneminder (1.22.3-3) unstable; urgency=low + + * Clean up of postinstall, postrm ; user "zm" definitely was a mistake + * Also in postinstall: check and start MySQL if it's not running. + * init.d script now checks if zoneminder isn't running and still returns 0 + (which helps uninstalling) + * Addition of php5 dependency options as well as php4. + + -- Peter Howard Mon, 26 Feb 2007 10:40:52 +1100 + +zoneminder (1.22.3-2) unstable; urgency=low + + * Added zmuser in the mysql creation; this should fix the install problem + for people, but needs to be cleaned up (in -3) + + -- Peter Howard Fri, 16 Feb 2007 14:16:03 +1100 + +zoneminder (1.22.3-1) unstable; urgency=low + + * Initial Version. (closes: #248393) + * Patched out use of openssl; uses gnutls instead for MD5 hashes. + * Removed MakeMaker-inserted Perl licensing (with authors permission) in + various scripts; replaced with GPL. + + -- Peter Howard Wed, 7 Feb 2007 14:09:01 +1100 diff --git a/distros/ubuntu1204_cmake/clean b/distros/ubuntu1204/clean similarity index 100% rename from distros/ubuntu1204_cmake/clean rename to distros/ubuntu1204/clean diff --git a/distros/ubuntu1204_cmake/conf/apache2/zoneminder.conf b/distros/ubuntu1204/conf/apache2/zoneminder.conf similarity index 100% rename from distros/ubuntu1204_cmake/conf/apache2/zoneminder.conf rename to distros/ubuntu1204/conf/apache2/zoneminder.conf diff --git a/distros/ubuntu1204/control b/distros/ubuntu1204/control index 6e3fcab6b..6368d9417 100644 --- a/distros/ubuntu1204/control +++ b/distros/ubuntu1204/control @@ -1,63 +1,64 @@ Source: zoneminder Section: net Priority: optional -Maintainer: Isaac Connor -Build-Depends: debhelper (>= 9), autoconf, automake, quilt, dh-autoreconf, libtool - ,libgnutls-dev - ,libmysqlclient-dev | libmariadbclient-dev - ,libjpeg8-dev|libjpeg9-dev|libjpeg62-turbo-dev - ,libpcre3-dev - ,libavcodec-dev, libavformat-dev (>= 3:0.svn20090204), libswscale-dev (>= 3:0.svn20090204), libavutil-dev - ,libv4l-dev (>= 0.8.3) - ,libbz2-dev - ,libavdevice-dev - ,libvlccore-dev, libvlc-dev - ,libcurl4-gnutls-dev | libcurl4-nss-dev | libcurl4-openssl-dev - ,libgcrypt11-dev, libpolkit-gobject-1-dev +Maintainer: Dmitry Smirnov +Uploaders: Vagrant Cascadian +Build-Depends: debhelper (>= 9), python-sphinx | python3-sphinx, apache2-dev, dh-linktree + ,cmake + ,libavcodec-dev, libavformat-dev (>= 3:0.svn20090204), libswscale-dev (>= 3:0.svn20090204), libavutil-dev, libavdevice-dev + ,libbz2-dev + ,libgcrypt-dev + ,libcurl4-gnutls-dev + ,libgnutls-openssl-dev + ,libjpeg8-dev|libjpeg9-dev|libjpeg62-turbo-dev, + ,libmysqlclient-dev + ,libpcre3-dev + ,libpolkit-gobject-1-dev + ,libv4l-dev (>= 0.8.3) [!hurd-any] + ,libvlc-dev +# Unbundled (dh_linktree): + ,libjs-jquery + ,libjs-mootools Standards-Version: 3.9.4 +Homepage: http://www.zoneminder.com/ +Vcs-Browser: http://anonscm.debian.org/cgit/collab-maint/zoneminder.git +Vcs-Git: git://anonscm.debian.org/collab-maint/zoneminder.git Package: zoneminder Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, ${perl:Depends} - ,apache2, libapache2-mod-php5 | libapache2-mod-fcgid, php5, php5-mysql|php5-mysqlnd - ,mariadb-client|mysql-client|mysql-client-5.6 - ,libpcre3 - ,ffmpeg | libav-tools - ,rsyslog | system-log-daemon - ,libphp-serialization-perl, libdate-manip-perl, libmime-lite-perl, libmime-tools-perl - ,libwww-perl, libarchive-tar-perl, libarchive-zip-perl, libdevice-serialport-perl - ,libdbd-mysql-perl - ,libmodule-load-perl, libsys-mmap-perl, libjson-any-perl - ,libnet-sftp-foreign-perl, libio-pty-perl, libexpect-perl, liburi-encode-perl - ,libdata-dump-perl, libclass-std-fast-perl, libsoap-wsdl-perl, libio-socket-multicast-perl, libdigest-sha-perl - ,libsys-cpu-perl, libsys-meminfo-perl - ,libavdevice53 | libavdevice55 - ,libjpeg8|libjpeg9|libjpeg62-turbo - ,zip - ,libvlccore5 | libvlccore7 | libvlccore8, libvlc5 - ,libcurl4-gnutls-dev | libcurl4-nss-dev | libcurl4-openssl-dev - ,libpolkit-gobject-1-0 - ,php5-gd -Recommends: mysql-server|mariadb-server -Description: Video camera security and surveillance solution - ZoneMinder is intended for use in single or multi-camera video security - applications, including commercial or home CCTV, theft prevention and child - or family member or home monitoring and other care scenarios. It - supports capture, analysis, recording, and monitoring of video data coming - from one or more video or network cameras attached to a Linux system. - ZoneMinder also support web and semi-automatic control of Pan/Tilt/Zoom - cameras using a variety of protocols. It is suitable for use as a home - video security system and for commercial or professional video security - and surveillance. It can also be integrated into a home automation system - via X.10 or other protocols. - -Package: zoneminder-dbg -Section: debug -Priority: extra -Architecture: any -Depends: zoneminder (= ${binary:Version}), ${misc:Depends} -Description: Debugging symbols for zoneminder. - ZoneMinder is a video camera security and surveillance solution. + ,javascript-common + ,libav-tools|ffmpeg + ,libdate-manip-perl + ,libdbd-mysql-perl + ,libmime-lite-perl + ,libmime-tools-perl + ,libphp-serialization-perl + ,libmodule-load-conditional-perl + ,libnet-sftp-foreign-perl +# ,libzoneminder-perl (= ${source:Version}) + ,libarchive-zip-perl + ,libdbd-mysql-perl + ,libdevice-serialport-perl + ,libimage-info-perl + ,libjson-any-perl + ,libsys-mmap-perl [!hurd-any] + ,liburi-encode-perl + ,libwww-perl + ,mysql-client | virtual-mysql-client + ,perl-modules + ,php5-mysql, php5-gd + ,policykit-1 + ,rsyslog | system-log-daemon + ,zip + ,libdata-dump-perl, libclass-std-fast-perl, libsoap-wsdl-perl, libio-socket-multicast-perl, libdigest-sha-perl + , libsys-cpu-perl, libsys-meminfo-perl +Recommends: ${misc:Recommends} + ,libapache2-mod-php5 | php5-fpm + ,mysql-server | virtual-mysql-server + ,zoneminder-doc (>= ${source:Version}) +Suggests: fcgiwrap, logrotate +Description: video camera security and surveillance solution ZoneMinder is intended for use in single or multi-camera video security applications, including commercial or home CCTV, theft prevention and child or family member or home monitoring and other care scenarios. It @@ -68,3 +69,70 @@ Description: Debugging symbols for zoneminder. video security system and for commercial or professional video security and surveillance. It can also be integrated into a home automation system via X.10 or other protocols. + +#Package: libzoneminder-perl +#Section: perl +#Architecture: all +#Multi-Arch: foreign +#Depends: ${misc:Depends}, ${perl:Depends} +# ,libarchive-zip-perl +# ,libdbd-mysql-perl +# ,libdevice-serialport-perl +# ,libimage-info-perl +# ,libjson-any-perl +# ,libsys-mmap-perl [!hurd-any] +# ,liburi-encode-perl +# ,libwww-perl +#Description: ZoneMinder Perl libraries +# ZoneMinder is intended for use in single or multi-camera video security +# applications, including commercial or home CCTV, theft prevention and child +# or family member or home monitoring and other care scenarios. It +# supports capture, analysis, recording, and monitoring of video data coming +# from one or more video or network cameras attached to a Linux system. +# ZoneMinder also support web and semi-automatic control of Pan/Tilt/Zoom +# cameras using a variety of protocols. It is suitable for use as a home +# video security system and for commercial or professional video security +# and surveillance. It can also be integrated into a home automation system +# via X.10 or other protocols. +# . +# This package provides ZoneMinder Perl libraries; it can be used to +# write custom interfaces as well. + +Package: zoneminder-doc +Section: doc +Architecture: all +Multi-Arch: foreign +Depends: ${misc:Depends}, ${sphinxdoc:Depends} +Suggests: www-browser +Description: ZoneMinder documentation + ZoneMinder is intended for use in single or multi-camera video security + applications, including commercial or home CCTV, theft prevention and child + or family member or home monitoring and other care scenarios. It + supports capture, analysis, recording, and monitoring of video data coming + from one or more video or network cameras attached to a Linux system. + ZoneMinder also support web and semi-automatic control of Pan/Tilt/Zoom + cameras using a variety of protocols. It is suitable for use as a home + video security system and for commercial or professional video security + and surveillance. It can also be integrated into a home automation system + via X.10 or other protocols. + . + This package provides ZoneMinder documentation in HTML format. + +Package: zoneminder-dbg +Section: debug +Priority: extra +Architecture: any +Depends: zoneminder (= ${binary:Version}), ${misc:Depends} +Description: Zoneminder -- debugging symbols + ZoneMinder is intended for use in single or multi-camera video security + applications, including commercial or home CCTV, theft prevention and child + or family member or home monitoring and other care scenarios. It + supports capture, analysis, recording, and monitoring of video data coming + from one or more video or network cameras attached to a Linux system. + ZoneMinder also support web and semi-automatic control of Pan/Tilt/Zoom + cameras using a variety of protocols. It is suitable for use as a home + video security system and for commercial or professional video security + and surveillance. It can also be integrated into a home automation system + via X.10 or other protocols. + . + This package provides debugging symbols diff --git a/distros/ubuntu1204/copyright b/distros/ubuntu1204/copyright index a177502a0..c48025a25 100644 --- a/distros/ubuntu1204/copyright +++ b/distros/ubuntu1204/copyright @@ -1,22 +1,174 @@ +Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: ZoneMinder +Upstream-Contact: Philip Coombes +Source: https://github.com/ZoneMinder/ZoneMinder +Comment: + This package was originally debianized by matrix + on Mon, 7 Mar 2005 02:07:57 -0500. + It was re-done for submission to the Debian project by Peter Howard + on Fri, 8 Dec 2006 10:19:43 +1100 +Files-Excluded: + web/skins/*/js/jquery-* + web/tools/mootools/*-yc.js + +Files: * +Copyright: 2001-2014 Philip Coombes + 2008 Brian Rudy + 2014 Vincent Giovannone + 2013 Tim Craig + 2003-2008 Corey DeLasaux + 2001-2010 Chris Kistner +License: GPL-2+ + +Files: distros/* +Copyright: 2001-2008 Philip Coombes + 2014 Isaac Connor + 2005 Serg Oskin +License: GPL-2+ + +Files: web/skins/*/js/jquery-* +Copyright: 2010 John Resig + 2010 The Dojo Foundation +License: GPL-2 or Expat +Comment: + Dual licensed under the MIT or GPL Version 2 licenses. + http://jquery.org/license + . + Includes Sizzle.js http://sizzlejs.com/ + Released under the MIT, BSD, and GPL Licenses. + +Files: web/tools/mootools/*.js +Copyright: 2009 Marcelo Jorge Vieira (metal) + 2006-2010 Valerio Proietti (http://mad4milk.net/) +License: Expat + +Files: web/api/* +Copyright: 2005-2013 Cake Software Foundation, Inc. (http://cakefoundation.org) +License: Expat + +Files: + cmake/Modules/CheckPrototypeDefinition*.cmake + cmake/Modules/FindGLIB2.cmake + cmake/Modules/FindPolkit.cmake + cmake/Modules/GNUInstallDirs.cmake Copyright: + 2005-2011 Kitware, Inc. + 2010-2011 Andreas Schneider + 2009 Dario Freddi + 2008 Laurent Montel, + 2011 Nikita Krupen'ko +License: BSD-3-clause + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + . + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + . + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + . + * The names of Kitware, Inc., the Insight Consortium, or the names of + any consortium members, or of any contributors, may not be used to + endorse or promote products derived from this software without + specific prior written permission. + . + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -Copyright 2002 Philip Coombes +Files: cmake/Modules/FindPerlModules.cmake +Copyright: 2012 Iowa State University +License: Boost-1.0 + Boost Software License - Version 1.0 - August 17th, 2003 + . + Permission is hereby granted, free of charge, to any person or organization + obtaining a copy of the software and accompanying documentation covered by + this license (the "Software") to use, reproduce, display, distribute, + execute, and transmit the Software, and to prepare derivative works of the + Software, and to permit third-parties to whom the Software is furnished to + do so, all subject to the following: + . + The copyright notices in the Software and this entire statement, including + the above license grant, this restriction and the following disclaimer, + must be included in all copies of the Software, in whole or in part, and + all derivative works of the Software, unless such copies or derivative + works are solely in the form of machine-executable object code generated by + a source language processor. + . + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT + SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE + FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. -License: +Files: debian/* +Copyright: 2015 Dmitry Smirnov + 2007-2014 Peter Howard + 2010-2012 Vagrant Cascadian + 2001-2008 Philip Coombes +License: GPL-2+ -This package 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. +License: Expat + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + . + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + . + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. -This package 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. +License: GPL-2+ + This package 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 package 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 package; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + . + The complete text of the GNU General Public License version 2 + can be found in "/usr/share/common-licenses/GPL-2". -You should have received a copy of the GNU General Public -License along with this package; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -On Debian GNU/Linux systems, the text of the GPL can be found in -/usr/share/common-licenses/GPL. +License: GPL-2 + This package 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; version 2 of the License. + . + This package 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 package; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + . + The complete text of the GNU General Public License version 2 + can be found in "/usr/share/common-licenses/GPL-2". diff --git a/distros/ubuntu1204/dirs b/distros/ubuntu1204/dirs deleted file mode 100644 index 4178482c1..000000000 --- a/distros/ubuntu1204/dirs +++ /dev/null @@ -1,6 +0,0 @@ -var/log/zm -var/lib/zm -var/cache/zoneminder/events -var/cache/zoneminder/images -var/cache/zoneminder/temp -usr/share/zoneminder/db diff --git a/distros/ubuntu1204/docs b/distros/ubuntu1204/docs deleted file mode 100644 index b43bf86b5..000000000 --- a/distros/ubuntu1204/docs +++ /dev/null @@ -1 +0,0 @@ -README.md diff --git a/distros/ubuntu1204_cmake/examples/nginx.conf b/distros/ubuntu1204/examples/nginx.conf similarity index 100% rename from distros/ubuntu1204_cmake/examples/nginx.conf rename to distros/ubuntu1204/examples/nginx.conf diff --git a/distros/ubuntu1204_cmake/gbp.conf b/distros/ubuntu1204/gbp.conf similarity index 100% rename from distros/ubuntu1204_cmake/gbp.conf rename to distros/ubuntu1204/gbp.conf diff --git a/distros/ubuntu1204/init.d b/distros/ubuntu1204/init.d deleted file mode 100644 index f22143c38..000000000 --- a/distros/ubuntu1204/init.d +++ /dev/null @@ -1,91 +0,0 @@ -#!/bin/sh -### BEGIN INIT INFO -# Provides: zoneminder -# Required-Start: $network $remote_fs $syslog -# Required-Stop: $network $remote_fs $syslog -# Should-Start: mysql -# Should-Stop: mysql -# Default-Start: 2 3 4 5 -# Default-Stop: 0 1 6 -# Short-Description: Control ZoneMinder as a Service -### END INIT INFO -# description: Control ZoneMinder as a Service -# chkconfig: 2345 20 20 - -# Source function library. -#. /etc/rc.d/init.d/functions - -prog=ZoneMinder -ZM_PATH_BIN="/usr/bin" -RUNDIR=/var/run/zm -TMPDIR=/tmp/zm -command="$ZM_PATH_BIN/zmpkg.pl" - -start() { - echo -n "Starting $prog: " - export TZ=:/etc/localtime - mkdir -p $RUNDIR && chown www-data:www-data $RUNDIR - mkdir -p $TMPDIR && chown www-data:www-data $TMPDIR - $command start - RETVAL=$? - [ $RETVAL = 0 ] && echo success - [ $RETVAL != 0 ] && echo failure - echo - [ $RETVAL = 0 ] && touch /var/lock/zm - return $RETVAL -} -stop() { - echo -n "Stopping $prog: " - # - # Why is this status check being done? - # as $command stop returns 1 if zoneminder - # is stopped, which will result in - # this returning 1, which will stuff - # dpkg when it tries to stop zoneminder before - # uninstalling . . . - # - result=`$command status` - if [ ! "$result" = "running" ]; then - echo "Zoneminder already stopped" - echo - RETVAL=0 - else - $command stop - RETVAL=$? - [ $RETVAL = 0 ] && echo success - [ $RETVAL != 0 ] && echo failure - echo - [ $RETVAL = 0 ] && rm -f /var/lock/zm - fi -} -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' | 'force-reload') - stop - start - ;; -'status') - status - ;; -*) - echo "Usage: $0 { start | stop | restart | status }" - RETVAL=1 - ;; -esac -exit $RETVAL diff --git a/distros/ubuntu1204/install b/distros/ubuntu1204/install deleted file mode 100644 index 4b0009cea..000000000 --- a/distros/ubuntu1204/install +++ /dev/null @@ -1,12 +0,0 @@ -usr/bin -usr/lib/cgi-bin -usr/share/man -usr/share/perl5/ZoneMinder -usr/share/perl5/ZoneMinder.pm -usr/share/polkit-1/actions -usr/share/polkit-1/rules.d -usr/share/zoneminder -etc/zm -db/zm_create.sql usr/share/zoneminder/db -db/zm_update-*.sql usr/share/zoneminder/db -debian/apache.conf etc/zm diff --git a/distros/ubuntu1204_cmake/libzoneminder-perl.install b/distros/ubuntu1204/libzoneminder-perl.install similarity index 100% rename from distros/ubuntu1204_cmake/libzoneminder-perl.install rename to distros/ubuntu1204/libzoneminder-perl.install diff --git a/distros/ubuntu1204/links b/distros/ubuntu1204/links deleted file mode 100644 index 9715ee428..000000000 --- a/distros/ubuntu1204/links +++ /dev/null @@ -1,4 +0,0 @@ -var/cache/zoneminder/events usr/share/zoneminder/events -var/cache/zoneminder/images usr/share/zoneminder/images -var/cache/zoneminder/temp usr/share/zoneminder/temp -usr/lib/cgi-bin usr/share/zoneminder/cgi-bin diff --git a/distros/ubuntu1204_cmake/patches/default_cgi-path.patch b/distros/ubuntu1204/patches/default_cgi-path.patch similarity index 100% rename from distros/ubuntu1204_cmake/patches/default_cgi-path.patch rename to distros/ubuntu1204/patches/default_cgi-path.patch diff --git a/distros/ubuntu1204/patches/series b/distros/ubuntu1204/patches/series index e69de29bb..fc70f4006 100644 --- a/distros/ubuntu1204/patches/series +++ b/distros/ubuntu1204/patches/series @@ -0,0 +1,2 @@ +default_cgi-path.patch +use_libjs-mootools.patch diff --git a/distros/ubuntu1204_cmake/patches/use_libjs-mootools.patch b/distros/ubuntu1204/patches/use_libjs-mootools.patch similarity index 100% rename from distros/ubuntu1204_cmake/patches/use_libjs-mootools.patch rename to distros/ubuntu1204/patches/use_libjs-mootools.patch diff --git a/distros/ubuntu1204/postinst b/distros/ubuntu1204/postinst deleted file mode 100644 index d06f9c641..000000000 --- a/distros/ubuntu1204/postinst +++ /dev/null @@ -1,53 +0,0 @@ -#! /bin/sh - -set -e - -if [ "$1" = "configure" ]; then - if [ -e "/etc/init.d/mysql" ]; then - # - # Get mysql started if it isn't - # - if ! $(/etc/init.d/mysql status >/dev/null 2>&1); then - invoke-rc.d mysql start - fi - if $(/etc/init.d/mysql status >/dev/null 2>&1); then - mysqladmin --defaults-file=/etc/mysql/debian.cnf -f reload - # test if database if already present... - if ! $(echo quit | mysql --defaults-file=/etc/mysql/debian.cnf zm > /dev/null 2> /dev/null) ; then - cat /usr/share/zoneminder/db/zm_create.sql | mysql --defaults-file=/etc/mysql/debian.cnf - echo 'grant lock tables, alter,select,insert,update,delete on zm.* to 'zmuser'@localhost identified by "zmpass";' | mysql --defaults-file=/etc/mysql/debian.cnf mysql - fi - - invoke-rc.d zoneminder stop || true - zmupdate.pl --nointeractive - - else - echo 'NOTE: mysql not running, please start mysql and run dpkg-reconfigure zoneminder when it is running.' - fi - else - echo 'mysql not found, assuming remote server.' - fi - chown www-data:www-data /var/log/zm - chown www-data:www-data /var/lib/zm/ - if [ -z "$2" ]; then - chown www-data:www-data -R /var/cache/zoneminder - fi -fi -# Ensure zoneminder is stopped... -if [ -x "/etc/init.d/zoneminder" ]; then - if invoke-rc.d zoneminder status ; then - invoke-rc.d zoneminder stop || exit $? - fi -fi - -if [ "$1" = "configure" ]; then - if [ -z "$2" ]; then - chown www-data:www-data /var/log/zm - chown www-data:www-data /var/lib/zm/ - chown www-data:www-data -R /var/cache/zoneminder - else - chown www-data:www-data /var/log/zm - zmupdate.pl - fi -fi -#DEBHELPER# diff --git a/distros/ubuntu1204/postrm b/distros/ubuntu1204/postrm deleted file mode 100644 index 28a00a7a0..000000000 --- a/distros/ubuntu1204/postrm +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh -# set -e # to be reinstated later - -if [ "$1" = "purge" ]; then - echo 'delete from user where User="zmuser";' | mysql --defaults-file=/etc/mysql/debian.cnf mysql - echo 'delete from db where User="zmuser";' | mysql --defaults-file=/etc/mysql/debian.cnf mysql - mysqladmin --defaults-file=/etc/mysql/debian.cnf -f drop zm -fi -#DEBHELPER# diff --git a/distros/ubuntu1204/preinst b/distros/ubuntu1204/preinst deleted file mode 100755 index 6cd01ba55..000000000 --- a/distros/ubuntu1204/preinst +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/sh - -set -e - -abort=false -if [ -L /usr/share/zoneminder/events ]; then - l=$(readlink /usr/share/zoneminder/events) - if [ "$l" != "/var/cache/zoneminder/events" ]; then - abort=true - fi -fi -if [ -L /usr/share/zoneminder/images ]; then - l=$(readlink /usr/share/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 -/usr/share/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 - -#DEBHELPER# - -exit 0 diff --git a/distros/ubuntu1204/rules b/distros/ubuntu1204/rules index e25e5514d..b467c870f 100755 --- a/distros/ubuntu1204/rules +++ b/distros/ubuntu1204/rules @@ -1,67 +1,87 @@ #!/usr/bin/make -f # -*- makefile -*- -# Sample debian/rules that uses debhelper. -# This file was originally written by Joey Hess and Craig Small. -# As a special exception, when this file is copied by dh-make into a -# dh-make output file, you may use that output file without restriction. -# This special exception was added by Craig Small in version 0.37 of dh-make. # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 -# These are used for cross-compiling and for saving the configure script -# from having to guess our platform (since we know it already) -DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) -DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) +export DEB_BUILD_MAINT_OPTIONS = hardening=+all +export DEB_LDFLAGS_MAINT_APPEND += -Wl,--as-needed -CFLAGS = -Wall -g -CPPFLAGS = -D__STDC_CONSTANT_MACROS -CXXFLAGS = -DHAVE_LIBCRYPTO - -ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) - CFLAGS += -O0 -else - CFLAGS += -O2 +ifeq ($(DEB_BUILD_ARCH_OS),hurd) +ARGS:= -DZM_NO_MMAP=ON endif %: - dh $@ --with quilt,autoreconf + dh $@ --parallel --buildsystem=cmake --builddirectory=dbuild \ + --with sphinxdoc,apache2,linktree override_dh_auto_configure: - CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" dh_auto_configure -- --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) --sysconfdir=/etc/zm --prefix=/usr --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info --with-mysql=/usr --with-mariadb=/usr --with-webdir=/usr/share/zoneminder --with-ffmpeg=/usr --with-cgidir=/usr/lib/cgi-bin --with-webuser=www-data --with-webgroup=www-data --enable-crashtrace=no --enable-mmap=yes + dh_auto_configure -- $(ARGS) \ + -DCMAKE_VERBOSE_MAKEFILE=ON \ + -DCMAKE_BUILD_TYPE=Release \ + -DZM_CONFIG_DIR="/etc/zm" \ + -DZM_RUNDIR="/var/run/zm" \ + -DZM_SOCKDIR="/var/run/zm" \ + -DZM_TMPDIR="/tmp/zm" \ + -DZM_CGIDIR="/usr/lib/zoneminder/cgi-bin" \ + -DZM_CONTENTDIR="/var/cache/zoneminder" override_dh_clean: - # Add here commands to clean up after the build process. - [ ! -f Makefile ] || $(MAKE) distclean - dh_clean + dh_clean $(MANPAGES1) + $(RM) -r docs/_build docs/installationguide -override_dh_install: - dh_install --fail-missing - # - # NOTE: This is a short-term kludge; hopefully changes in the next - # upstream version will render this unnecessary. - rm -rf debian/zoneminder/usr/share/zoneminder/events - rm -rf debian/zoneminder/usr/share/zoneminder/images - rm -rf debian/zoneminder/usr/share/zoneminder/temp - dh_link var/cache/zoneminder/events usr/share/zoneminder/events - dh_link var/cache/zoneminder/images usr/share/zoneminder/images - dh_link var/cache/zoneminder/temp usr/share/zoneminder/temp +build-indep: + #$(MAKE) -C docs text + $(MAKE) -C docs html - # - # This is a slightly lesser kludge; moving the cgi stuff to - # /usr/share/zoneminder/cgi-bin breaks one set of behavior, - # having it just in /usr/lib/cgi-bin breaks another bit of - # behavior. - # - dh_link usr/lib/cgi-bin usr/share/zoneminder/cgi-bin +MANPAGES1 = dbuild/scripts/zmupdate.pl.1 +$(MANPAGES1): + # generate man page(s): + pod2man -s1 --stderr --utf8 $(patsubst %.1, %, $@) $@ + +## reproducible build: +LAST_CHANGE=$(shell dpkg-parsechangelog -S Date) +BUILD_DATE=$(shell LC_ALL=C date -u "+%B %d, %Y" -d "$(LAST_CHANGE)") +override_dh_installman: $(MANPAGES1) + $(MAKE) -C docs man SPHINXOPTS="-D today=\"$(BUILD_DATE)\"" + dh_installman --language=C $(MANPAGES1) + +override_dh_auto_install: + dh_auto_install --destdir=$(CURDIR)/debian/tmp + # remove worthless files: + $(RM) -v $(CURDIR)/debian/tmp/usr/share/perl5/*/*/*/.packlist + $(RM) -v $(CURDIR)/debian/tmp/usr/share/perl5/*/*.in + # remove empty directories: + find $(CURDIR)/debian/tmp/usr -type d -empty -delete -printf 'removed %p\n' + # remove extra-license-file: + $(RM) -v $(CURDIR)/debian/tmp/usr/share/zoneminder/www/api/lib/Cake/LICENSE.txt override_dh_fixperms: dh_fixperms - chown root:root debian/zoneminder/etc/zm/zm.conf + ## 637685 + chmod -c o-r $(CURDIR)/debian/zoneminder/etc/zm/zm.conf -override_dh_auto_test: - # do not run tests... +override_dh_installinit: + dh_installinit --no-start + +override_dh_apache2: + dh_apache2 --noenable -.PHONY: override_dh_strip override_dh_strip: - dh_strip --dbg-package=zoneminder-dbg + [ -d "$(CURDIR)/debian/zoneminder-dbg" ] \ + && dh_strip --dbg-package=zoneminder-dbg \ + || dh_strip + +#%: +# dh $@ --parallel --buildsystem=autoconf --with autoreconf +# +#override_dh_auto_configure: +# dh_auto_configure -- \ +# --sysconfdir=/etc/zm \ +# --with-mysql=/usr \ +# --with-webdir=/usr/share/zoneminder \ +# --with-ffmpeg=/usr \ +# --with-cgidir=/usr/lib/cgi-bin \ +# --with-webuser=www-data \ +# --with-webgroup=www-data \ +# --enable-mmap=yes diff --git a/distros/debian8/source/format b/distros/ubuntu1204/source/format similarity index 100% rename from distros/debian8/source/format rename to distros/ubuntu1204/source/format diff --git a/distros/ubuntu1204_cmake/source/lintian-overrides b/distros/ubuntu1204/source/lintian-overrides similarity index 100% rename from distros/ubuntu1204_cmake/source/lintian-overrides rename to distros/ubuntu1204/source/lintian-overrides diff --git a/distros/ubuntu1204/watch b/distros/ubuntu1204/watch index 5a8a9c4d7..7ee690edb 100644 --- a/distros/ubuntu1204/watch +++ b/distros/ubuntu1204/watch @@ -1,3 +1,7 @@ version=3 -http://www.zoneminder.com/downloads.html \ - .*/ZoneMinder-(.*).tar.gz + +opts=\ +repacksuffix=+dfsg,\ +dversionmangle=s{\+dfsg\d*}{},\ + https://github.com/ZoneMinder/ZoneMinder/releases \ + .*/ZoneMinder/archive/v(.*).tar.gz diff --git a/distros/ubuntu1204_cmake/zoneminder-doc.doc-base b/distros/ubuntu1204/zoneminder-doc.doc-base similarity index 100% rename from distros/ubuntu1204_cmake/zoneminder-doc.doc-base rename to distros/ubuntu1204/zoneminder-doc.doc-base diff --git a/distros/ubuntu1204_cmake/zoneminder-doc.install b/distros/ubuntu1204/zoneminder-doc.install similarity index 100% rename from distros/ubuntu1204_cmake/zoneminder-doc.install rename to distros/ubuntu1204/zoneminder-doc.install diff --git a/distros/ubuntu1204_cmake/zoneminder-doc.links b/distros/ubuntu1204/zoneminder-doc.links similarity index 100% rename from distros/ubuntu1204_cmake/zoneminder-doc.links rename to distros/ubuntu1204/zoneminder-doc.links diff --git a/distros/ubuntu1204_cmake/zoneminder.apache2 b/distros/ubuntu1204/zoneminder.apache2 similarity index 100% rename from distros/ubuntu1204_cmake/zoneminder.apache2 rename to distros/ubuntu1204/zoneminder.apache2 diff --git a/distros/ubuntu1204_cmake/zoneminder.bug-presubj b/distros/ubuntu1204/zoneminder.bug-presubj similarity index 100% rename from distros/ubuntu1204_cmake/zoneminder.bug-presubj rename to distros/ubuntu1204/zoneminder.bug-presubj diff --git a/distros/ubuntu1204_cmake/zoneminder.dirs b/distros/ubuntu1204/zoneminder.dirs similarity index 100% rename from distros/ubuntu1204_cmake/zoneminder.dirs rename to distros/ubuntu1204/zoneminder.dirs diff --git a/distros/ubuntu1204_cmake/zoneminder.docs b/distros/ubuntu1204/zoneminder.docs similarity index 100% rename from distros/ubuntu1204_cmake/zoneminder.docs rename to distros/ubuntu1204/zoneminder.docs diff --git a/distros/ubuntu1204_cmake/zoneminder.examples b/distros/ubuntu1204/zoneminder.examples similarity index 100% rename from distros/ubuntu1204_cmake/zoneminder.examples rename to distros/ubuntu1204/zoneminder.examples diff --git a/distros/ubuntu1204_cmake/zoneminder.init b/distros/ubuntu1204/zoneminder.init similarity index 100% rename from distros/ubuntu1204_cmake/zoneminder.init rename to distros/ubuntu1204/zoneminder.init diff --git a/distros/ubuntu1204_cmake/zoneminder.install b/distros/ubuntu1204/zoneminder.install similarity index 100% rename from distros/ubuntu1204_cmake/zoneminder.install rename to distros/ubuntu1204/zoneminder.install diff --git a/distros/ubuntu1204_cmake/zoneminder.links b/distros/ubuntu1204/zoneminder.links similarity index 100% rename from distros/ubuntu1204_cmake/zoneminder.links rename to distros/ubuntu1204/zoneminder.links diff --git a/distros/ubuntu1204_cmake/zoneminder.linktrees b/distros/ubuntu1204/zoneminder.linktrees similarity index 100% rename from distros/ubuntu1204_cmake/zoneminder.linktrees rename to distros/ubuntu1204/zoneminder.linktrees diff --git a/distros/ubuntu1204_cmake/zoneminder.lintian-overrides b/distros/ubuntu1204/zoneminder.lintian-overrides similarity index 100% rename from distros/ubuntu1204_cmake/zoneminder.lintian-overrides rename to distros/ubuntu1204/zoneminder.lintian-overrides diff --git a/distros/ubuntu1204_cmake/zoneminder.logrotate b/distros/ubuntu1204/zoneminder.logrotate similarity index 100% rename from distros/ubuntu1204_cmake/zoneminder.logrotate rename to distros/ubuntu1204/zoneminder.logrotate diff --git a/distros/ubuntu1204_cmake/zoneminder.maintscript b/distros/ubuntu1204/zoneminder.maintscript similarity index 100% rename from distros/ubuntu1204_cmake/zoneminder.maintscript rename to distros/ubuntu1204/zoneminder.maintscript diff --git a/distros/ubuntu1204_cmake/zoneminder.manpages b/distros/ubuntu1204/zoneminder.manpages similarity index 100% rename from distros/ubuntu1204_cmake/zoneminder.manpages rename to distros/ubuntu1204/zoneminder.manpages diff --git a/distros/ubuntu1204_cmake/zoneminder.postinst b/distros/ubuntu1204/zoneminder.postinst similarity index 100% rename from distros/ubuntu1204_cmake/zoneminder.postinst rename to distros/ubuntu1204/zoneminder.postinst diff --git a/distros/ubuntu1204_cmake/zoneminder.postrm b/distros/ubuntu1204/zoneminder.postrm similarity index 100% rename from distros/ubuntu1204_cmake/zoneminder.postrm rename to distros/ubuntu1204/zoneminder.postrm diff --git a/distros/ubuntu1204_cmake/zoneminder.preinst b/distros/ubuntu1204/zoneminder.preinst similarity index 100% rename from distros/ubuntu1204_cmake/zoneminder.preinst rename to distros/ubuntu1204/zoneminder.preinst diff --git a/distros/ubuntu1204_cmake/zoneminder.service b/distros/ubuntu1204/zoneminder.service similarity index 100% rename from distros/ubuntu1204_cmake/zoneminder.service rename to distros/ubuntu1204/zoneminder.service diff --git a/distros/ubuntu1204_cmake/zoneminder.tmpfile b/distros/ubuntu1204/zoneminder.tmpfile similarity index 100% rename from distros/ubuntu1204_cmake/zoneminder.tmpfile rename to distros/ubuntu1204/zoneminder.tmpfile diff --git a/distros/ubuntu1204_cmake/README.Debian b/distros/ubuntu1204_cmake/README.Debian deleted file mode 100644 index 2ba809fe4..000000000 --- a/distros/ubuntu1204_cmake/README.Debian +++ /dev/null @@ -1,160 +0,0 @@ -Zoneminder for Debian ---------------------- - -Initializing database ---------------------- - - pv /usr/share/zoneminder/db/zm_create.sql | sudo mysql --defaults-file=/etc/mysql/debian.cnf -OR - cat /usr/share/zoneminder/db/zm_create.sql | sudo mysql --defaults-file=/etc/mysql/debian.cnf - - echo 'grant lock tables,alter,create,select,insert,update,delete on zm.* to 'zmuser'@localhost identified by "zmpass";'\ - | sudo mysql --defaults-file=/etc/mysql/debian.cnf mysql - -Hint: generate secure password with `pwgen` and update "/etc/zm/zm.conf" -accordingly. - -The following command can help to ensure that zoneminder can read its -configuration file: - - chgrp -c www-data /etc/zm/zm.conf - - -Upgrading database ------------------- - -Prior to 1.28.1 database upgrade was performed automatically. -"zoneminder" service will refuse to start with outdated database. - -Assuming that database is on "localhost" then the following command can be -used to upgrade "zm" database: - - zmupdate.pl - -Additional permissions may be required to perform upgrade: - - echo 'grant lock tables, create, alter on zm.* to 'zmuser'@localhost identified by "zmpass";'\ - | sudo mysql --defaults-file=/etc/mysql/debian.cnf mysql - -The following command prints the current version of zoneminder database: - - echo 'select Value from Config where Name = "ZM_DYN_CURR_VERSION";' \ - | sudo mysql --defaults-file=/etc/mysql/debian.cnf --skip-column-names zm - - -Enabling service ----------------- - -By default Zoneminder service is not starting automatically and need to be -manually activated once database is configured: - -On systemd: - - sudo systemctl enable zoneminder.service - -On SysV: - - sudo update-rc.d zoneminder enable - - -Web server set-up ------------------ - -There are few manual steps to get the web interface working: - -## Apache2 - -Apache can be configured as folder "/zm" using sample .conf: - - sudo a2enconf zoneminder - -Alternatively Apache web site configuration template can be used to setup -zoneminder as "http://zoneminder": - - sudo cp -v /usr/share/doc/zoneminder/examples/apache.conf /etc/apache2/sites-available/ - sudo a2ensite zoneminder.conf - -Common configuration steps for Apache2: - - sudo a2enmod cgi - sudo service apache2 reload - - -## nginx / fcgiwrap - -Nginx needs "php5-fpm" package to support PHP and "fcgiwrap" package -for binary "cgi-bin" applications: - - sudo apt-get install php5-fpm fcgiwrap - -To enable a URL alias that makes Zoneminder available from - - http://yourserver/zm - -the following line is to be added to "server" section of a web site -configuration: - - include /usr/share/doc/zoneminder/examples/nginx.conf; - -For "default" web site it would be sufficient to include the above -statement to the file - - /etc/nginx/sites-enabled/default - -To avoid problems with feeds from multiple cameras "fcgiwrap" should be -configured to start at least as many processes as there are cameras. -It can be done by adjusting DAEMON_OPTS in "/etc/default/fcgiwrap". -Systemd users may be affected by the following bug: - - http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=792705 - - -## Note: - -When Zoneminder web site is running it may be necessary to set -Options/Paths/PATH_ZMS to "/zm/cgi-bin/nph-zms" or according to chosen web -site configuration. - - -Changing the location for images and events -------------------------------------------- - -Zoneminder, in its upstream form, stores data in /usr/share/zoneminder/. This -package modifies that by changing /usr/share/zoneminder/images and -/usr/share/zoneminder/events to symlinks to directories under -/var/cache/zoneminder. - -There are numerous places these could be put and ways to do it. But, at the -moment, if you change this, an upgrade will fail with a warning about these -locations having changed (the reason for this was that previously, an upgrade -would silently revert the changes and cause event loss - refer -bug #608793). - -If you do want to change the location, here are a couple of suggestions. -(thanks to vagrant@freegeek.org): - -These lines in fstab could allow you to bind-mount an alternate location - - /dev/sdX1 /otherdrive ext3 defaults 0 2 - /otherdrive/zoneminder/images /var/cache/zoneminder/images bind defaults 0 2 - /otherdrive/zoneminder/events /var/cache/zoneminder/events bind defaults 0 2 - - or if you have a separate partition for each: - - /dev/sdX1 /var/cache/zoneminder/images ext3 defaults 0 2 - /dev/sdX2 /var/cache/zoneminder/events ext3 defaults 0 2 - - -- Peter Howard , Sun, 16 Jan 2010 01:35:51 +1100 - -Access to /dev/video* ---------------------- - -For cameras which require access to /dev/video*, zoneminder may need the -www-data user added to the video group in order to see those cameras: - - adduser www-data video - -Note that all web applications running on the zoneminder server will then have -access to all video devices on the system. - - -- Vagrant Cascadian Sun, 27 Mar 2011 13:06:56 -0700 diff --git a/distros/ubuntu1204_cmake/changelog b/distros/ubuntu1204_cmake/changelog deleted file mode 100644 index 74cf1d0b8..000000000 --- a/distros/ubuntu1204_cmake/changelog +++ /dev/null @@ -1,573 +0,0 @@ -zoneminder (1.28.1+1-vivid-SNAPSHOT2015081701) vivid; urgency=medium - - * include api, switch to cmake build - - -- Isaac Connor Mon, 17 Aug 2015 10:29:23 -0400 - - -zoneminder (1.28.1-8) unstable; urgency=medium - - * Patchworks: - + New upstream "980-fix-image-size.patch". - + New "default_cgi-path.patch" to correct default ZM_PATH_ZMS. - * postinst: set "root" as group owner for "/var/log/zm" to silence - logrotate warnings. - * Minor correction to README.Debian. - - -- Dmitry Smirnov Sun, 16 Aug 2015 19:19:50 +1000 - -zoneminder (1.28.1-7) unstable; urgency=medium - - * Build-Depends += "cakephp (<< 3.0.0~)"; - Zoneminder is not compatible with latest CakePHP. - * Handle conffile removal from maintscript. - * rules: build man pages reproducibly. - * gbp.conf: renamed old style config section [git-dch] to [dch]. - * README - + added instructions to update owner of the "/etc/zm/zm.conf" - (Closes: #789327). - + zmupdate.pl needs CREATE rights. - + added note about required number of "fcgiwrap" workers. - * New upstream patch: "zmtrigger-plus.patch". - - -- Dmitry Smirnov Mon, 20 Jul 2015 16:30:15 +1000 - -zoneminder (1.28.1-6) unstable; urgency=low - - * New "zoneminder-doc" and "zoneminder-dbg" packages. - - -- Dmitry Smirnov Sun, 19 Apr 2015 14:50:41 +1000 - -zoneminder (1.28.1-5) unstable; urgency=low - - * Move handling of "/var/run/zm" and "/tmp/zm" from .service into .tmpfile. - Let dh_installinit do the job. Thanks, Andrew Bauer. - * Use dh_apache2 to install Apache conf file; remove old conf and symlink. - * Promote "libapache2-mod-php5 | php5-fpm" to Recommends. - * Build-Depends: - + dh-linktree - + cakephp (>= 2.6.3) - + libjs-jquery - + libjs-mootools - * Depends: - - libjs-jquery - - libjs-mootools - * Build-time replace bundled CakePHP with system one using "dh-linktree". - * Use "dh-linktree" to handle mootools and jquery symlinks. - - -- Dmitry Smirnov Sun, 19 Apr 2015 11:45:01 +1000 - -zoneminder (1.28.1-4) unstable; urgency=low - - * New patch to fix HTML export with USE_DEEP_STORAGE (closes: #723706). - * New "783.patch" to describe potential data loss in ZM_USE_DEEP_STORAGE. - * New patch to change default date format to region-neutral ISO notation - with time zone. - * Build sphinx documentation: - + Install "zoneminder.1" man page. - + Build-Depends += "python-sphinx | python3-sphinx" - + Added commented "zoneminder-doc" package. - + Added "docs.patch" to unlink distro-specific installation docs. - * rules: - + set ZM_CONTENTDIR, ZM_SOCKDIR and ZM_TMPDIR. - + remove mistakengly installed Perl module templates. - * Updated startup scripts to create ZM_TMPDIR. - * Hurd improvements: - + New patch to add PATH_MAX definitions. - + Build without MMAP support on Hurd. - + libsys-mmap-perl [!hurd-any]. - - -- Dmitry Smirnov Mon, 06 Apr 2015 18:18:55 +1000 - -zoneminder (1.28.1-3) unstable; urgency=low - - * Updated Apache2 and nginx configuration templates to support CGI. - * Updated README.Debian to document cgi-bin setup. - * Removed "/usr/share/zoneminder/www/cgi-bin" symlink. - * Added "apache2.patch" to correct Apache2 site configuration example. - * control: Suggests += "fcgiwrap". - * rules: added dh_systemd overrides to prevent automatic service - activation and start. - * Added note about manual service activation to README.Debian - (Closes: #781733). - - -- Dmitry Smirnov Thu, 02 Apr 2015 23:20:20 +1100 - -zoneminder (1.28.1-2) unstable; urgency=low - - * Removed word "Linux" from short package description. - * Build-Depends: do not require "libv4l-dev" on Hurd i.e. [!hurd-any]. - * Added run-time Perl Depends: - + libdbd-mysql-perl - + libimage-info-perl - + libmodule-load-conditional-perl - + libnet-sftp-foreign-perl - + liburi-encode-perl - * Prepare for package split: added commented "libzoneminder-perl" - and "zoneminder-dbg" packages to "debian/control". - * rules: do not install worthless ".packlist" file. - * Updated "libv4l1-videodev.h.patch" to fix v4lv1 detection in CMake. - - -- Dmitry Smirnov Thu, 02 Apr 2015 13:25:19 +1100 - -zoneminder (1.28.1-1) unstable; urgency=low - - [ Dmitry Smirnov ] - * New upstream release [February 2015]. - * Upload to unstable. - * Disabled automatic database upgrades: post(inst|rm) scripts no longer - touch database or do unexpected stuff (Closes: #779254). - See README.Debian for details. - * Updated installation paths: - + /usr/share/zoneminder --> /usr/share/zoneminder/www - + /usr/lib/cgi-bin --> /usr/lib/zoneminder/cgi-bin - * Added logrotate config (Closes: #544826). - Thanks, Alberto Reyes. - * Native systemd service; "--with systemd" added to dh. - * Build with CMake instead of autoconf; rules clean-up. - * Build with all hardening. - * Build and install "zmupdate.pl.1" man page. - * Added nginx/php5-fpm configuration example. - * Install upstream "apache.conf" example. - * Described setup of Zoneminer web site and database in README.Debian. - * Install "/etc/zm/zm.conf" with tighter permissions. - * Added TODO.Debian. - * Added "debian/clean"; "debian/gbp.conf"; bug-presubj. - * Remove bundled Cake tests to take ~5 MB off big-usr-share. - * Standards-Version: 3.9.6; compat/debhelper to version 9. - * Vcs links to new git repository at collab-maint. - * Build-Depends: - + dh-systemd - + libgcrypt11-dev --> libgcrypt-dev - + libcurl4-gnutls-dev - + libvlc-dev - + policykit-1 (required by "zmsystemctl.pl") - - dh-autoreconf, autoconf, automake - * Depends: - - apache2 - - libapache2-mod-php5 (moved to Suggests) - - libpcre3 (invalid) - - libmodule-load-perl (obsolete; replaced with perl-modules) - - libarchive-tar-perl (obsolete; replaced with perl-modules) - - mysql-server (moved to Recommends, Closes: #759504). - - php5 - + libav-tools - + libjs-jquery (replaces bundled component) - + libjs-mootool (replaces bundled component) - + libjson-any-perl (Closes: #690803). - + perl-modules (Closes: #745819). - * Recommends: - + apache2 | httpd - + mysql-server | virtual-mysql-server (Closes: #732874). - * Suggests: - + libapache2-mod-php5 | php5-fpm - + logrotate - * Refreshed, renamed and re-ordered patches; added DEP-3 headers. - * Removed "vendor_perl" patch (applied-upstream). - * New patches: - + cmake-fix-confpath.patch - + cmake-gnutls.patch - + cmake-nossl.patch - + cmake.patch - + format-hardening.patch - + pod_man_fixes.patch - + pod_name_fixes.patch - + pod_zmupdate-to-pod2usage.patch - * Lintianisation (incomplete): - - extra-license-file - - init.d-script-missing-lsb-description - - init.d-script-does-not-source-init-functions - - privacy-breach-generic - - package-contains-empty-directory - - manpage-has-errors-from-pod2man - - manpage-has-bad-whatis-entry - - quilt-patch-missing-description - - no-dep5-copyright - * Lintian-overrides: - + unusual-interpreter usr/bin/zmsystemctl.pl #!/usr/bin/pkexec - + script-not-executable usr/share/zoneminder/www/api/* - + script-with-language-extension usr/bin/*.pl - + source-is-missing web/tools/mootools/mootools-*-yc.js - + source-is-missing web/skins/*/js/jquery-1.4.2.min.js - + source-contains-prebuilt-javascript-object - * Renamed files in "debian". - * watch: dfsg repacksuffix and dversionmangle. - * "debian/copyright" to Copyright-Format-1.0. - * Set myself as new Maintainer (Closes: #760314). - - [ Vagrant Cascadian ] - * Removed obsolete DM-Upload-Allowed flag. - * Update debian/watch to use tarballs from github. - * Add Build-Depends on libgcrypt11-dev (Closes: #745819). - * Use canonical alioth Vcs-Hg URL. - * debian/control: Add Build-Depends: libpolkit-gobject-1-dev. - * Removed configure flag "--enable-crashtrace=no", which is no longer - present upstream. - - -- Dmitry Smirnov Tue, 31 Mar 2015 15:11:13 +1100 - -zoneminder (1.26.5-3.1) experimental; urgency=low - - * Non-maintainer upload. - * Add libav10.patch and compile against libav10 (Closes: #739461) - - -- Reinhard Tartler Wed, 19 Mar 2014 00:31:22 +0000 - -zoneminder (1.26.5-3) unstable; urgency=low - - - * Previous release still didn't build on PPC - this has been corrected. - (Closes: #736516) - - -- Peter Howard Tue, 4 Feb 2014 02:02:10 +1000 - -zoneminder (1.26.5-2) unstable; urgency=low - - * Remove dependency on ffmpeg - (Closes: #721161) - - * Builds again on non-x86 target architectures. - - -- Peter Howard Thu, 23 Jan 2014 01:02:10 +1000 - -zoneminder (1.26.5-1) unstable; urgency=low - - * New upstream version - (Closes: #694131) - * Change Build-Depends on libgnutls-dev to libgnutls-openssl-dev - (Closes: #731560) - -- Peter Howard Tue, 17 Dec 2013 01:02:10 +1000 - -zoneminder (1.25.0-4) unstable; urgency=high - - * Add CVE-2013-0232 patch - [SECURITY] CVE-2013-0232: Shell escape commands with untrusted content. - Thanks to James McCoy (Closes: #698910) - Thanks also to Salvatore Bonaccorso - - -- Peter Howard Tue, 12 Jun 2013 12:02:10 +1000 - -zoneminder (1.25.0-3) unstable; urgency=low - - * debian/rules: Export CFLAGS, CPPFLAGS, CXXFLAGS and LDFLAGS, to ensure - hardening build flags are enabled. - - -- Vagrant Cascadian Tue, 28 Aug 2012 12:10:03 -0700 - -zoneminder (1.25.0-2) unstable; urgency=low - - [ Vagrant Cascadian ] - * Add a patch to disable checking for updated versions by default, as - upgrades should happen through package management. - * Use dpkg-buildflags in debian/rules to set default compiler flags. - * Ensure zoneminder is stopped before starting (Closes: #657407). - - [ Peter Howard ] - * Fix postinst to add permission for table creation during upgrade - (Closes: #657407). - - -- Vagrant Cascadian Thu, 23 Aug 2012 12:40:34 -0700 - -zoneminder (1.25.0-1.1) unstable; urgency=low - - * Non-maintainer upload. - * Fix "ftbfs with GCC-4.7": add patch Fix-FTBFS-with-gcc-4.7 from Cyril - Brulebois: fix missing includes. - (Closes: #667428) - - -- gregor herrmann Sun, 13 May 2012 17:02:21 +0200 - -zoneminder (1.25.0-1) unstable; urgency=low - - * Fix typo in libv4l1-videodev.h patch that caused v4l1 support to be - dropped. - * Fail to build if version in postinst doesn't match upstream version. - * Add Build-Depends: libavdevice-dev to fix MPEG streaming (Closes: #515558). - * debian/rules: Convert to using debhelper overrides. - * Set debian/compat to 7. - * Simplify debian/watch file. - * Refresh debian/patches/use_libjs-mootools. - * Refresh debian/patches/libv4l1-videodev.h. - * Remove dependencies on php4 and related packages. - * Remove build-dependencies on libmysqlclient14-dev and - libmysqlclient15-dev. - * Update Build-Depends to use libjpeg-dev instead of libjpeg62-dev - (Closes: #647114). - * Add patch to fix build by testing for C headers rather than C++ headers. - Thanks to Ryan Niebur. (Closes: #654230) - * Add a patch to fix build problems caused by API changes in libav 0.8. - Thanks again to Ryan Niebur. (Closes: #654230) - - -- Vagrant Cascadian Mon, 16 Jan 2012 11:58:05 -0800 - -zoneminder (1.24.4-1) unstable; urgency=low - - [ Peter Howard ] - * Initial release of 1.24.4 (Closes: #634985). - - Fix 32/64-bit type declarations (Closes: #614404). - * Update patches. - - [ Vagrant Cascadian ] - * Add patch to fix FTBFS by using libv4l1-videodev.h from libv4l-dev. - Thanks to Andreas Metzler for reporting the issue. - (Closes: #619813). - * Document adding the www-data user to the video group in README.Debian. - (Closes: #611324) - * Depend on libsys-mmap-perl to enable mapped memory support. - (Closes: #607331) - * Update libjs-mootools patch to use -nc variants (Closes: #635075). - * Depend on javascript-common, to ensure that /javascript is available in - the web server. - * Set the upstream version in postinst at build time. - * Use dh-autoreconf to properly clean up autogenerated files during build. - * Add Vcs-HG to debian/control. - * Add Build-Depends: libv4l-dev, libbz2-dev, dh-autoreconf, libsys-mmap-perl. - - -- Vagrant Cascadian Sun, 24 Jul 2011 16:44:30 +0200 - -zoneminder (1.24.2-9) unstable; urgency=low - - * Apply patch from Ubuntu to fix FTBFS with ffmpeg 0.6: - - Add -D__STDC_CONSTANT_MACROS to CPPFLAGS (closes: 614080). - * Update Standards-Version to 3.9.1, no changes necessary. - - -- Vagrant Cascadian Sun, 20 Feb 2011 23:43:02 -0800 - -zoneminder (1.24.2-8) unstable; urgency=medium - - [ Vagrant Cascadian ] - * Apply patch to fix V4L2 cameras without crop support (closes: #608790). - Thanks to piratebab. - * Add preinst script which aborts if dangerous symlinks exist. - (closes: #608793) - - [ Peter Howard ] - * Added to README.Debian with info about images and events directories. - (closes: #608793) - - -- Vagrant Cascadian Sat, 15 Jan 2011 19:39:26 -0800 - -zoneminder (1.24.2-7) unstable; urgency=medium - - * Do not set ownership of /var/cache/zoneminder when upgrading, which fixes a - regression causing upgrades to take inordinately long with large - installations (closes: #597040). - - -- Vagrant Cascadian Fri, 17 Sep 2010 11:24:41 -0700 - -zoneminder (1.24.2-6) unstable; urgency=low - - * Only remove database on purge. This requires only creating the database if - it doesn't already exist, and upgrading the database only if the database - is an older version (closes: #497107). - - * Do not prompt the user on database upgrades by using the --nointeractive - flag when calling zmupdate.pl from postinst (closes: #595902). - - -- Vagrant Cascadian Fri, 10 Sep 2010 10:06:06 -0700 - -zoneminder (1.24.2-5) unstable; urgency=low - - [ Peter Howard ] - * Add zip dependency - (closes: #494261) - * Add debian/watch file - (closes: #545552) - * Use packaged libjs-mootools - (closes: #585590) - * Miscellaneous cleanups - - [ Vagrant Cascadian ] - * Add vagrant@debian.org as uploader - * Update Standards-Version to 3.9.0, no changes necessary. - - -- Vagrant Cascadian Fri, 23 Jul 2010 18:12:50 -0500 - -zoneminder (1.24.2-4.1) unstable; urgency=low - - * Non-maintainer upload. - * Fix "package removed, processes still running": apply patch to - debian/postinst by Vagrant Cascadian: use invoke-rc.d and run - mysql-related actions only when mysql is running (closes: #583648). - - -- gregor herrmann Thu, 01 Jul 2010 19:47:10 +0200 - -zoneminder (1.24.2-4) unstable; urgency=high - * Update init.d to list mysql dependency - (closes: #583505) - * Change depenency from libmime-perl to libmime-tools-perl - (closes: #585589) - * Problems in changelog format fixed - (closes: #585592) - * Fix debian-rules-ignores-make-clean-error - (closes: #585593) - -- Peter Howard Mon, 14 jun 2010 15:02:10 +1000 - -zoneminder (1.24.2-3) unstable; urgency=high - * Changes symbols to build with libjpeg8 - (closes: #565326, #568327) - * Note: location of all perl files should have been fixed in previous release - (closes: #553096) - -- Peter Howard Mon, 26 apr 2010 15:02:10 +1000 - -zoneminder (1.24.2-2) unstable; urgency=high - - * Remove custom perl parth from zmpkg.pl, fix location of manpages. - (closes: #551746, #553092) - * Fix GCC4.4 bug - (closes: #531717) - * Fix potential bug in postinst script - - -- Peter Howard Sat, 14 Nov 2009 15:02:10 +1000 - -zoneminder (1.24.2-1) unstable; urgency=high - - * Initial release of zoneminder 1.24.2 - -- Peter Howard Fri, 11 Sep 2009 07:02:50 +1000 - -zoneminder (1.24.1-1) unstable; urgency=high - - * Initial release of zoneminder 1.24.1, closing CVE-2008-3882, - CVE-2008-3881, CVE-2008-3880 - (closes: #497640) - * Change syslog dependency to rsyslog. - (closes: #526918) - * Add missing perl depenency. - * Restore patch to disable "check for updates" by default. - * Removed spurious '$' in init script. - (closes: #486064) - * Change permission of zm.conf from 0600 to 0400 for CVE-2008-6755 - (closes: #528252) - -- Peter Howard Sat, 16 May 2009 07:02:50 +1000 - -zoneminder (1.23.3-4) unstable; urgency=high - - * update to get it building with latest unstable. Thanks to waldi@debian.org - (closes: #517569) - -- Peter Howard Thu, 16 Apr 2009 01:02:50 +1000 - -zoneminder (1.23.3-3) unstable; urgency=high - - * ffmpeg confirmed working - (closes: #475145) - * Fix upgrade problem intrudouced in 1.23.3-1 - (closes: #481637) - * Include libmime-lite-perl in dependencies - (closes: #486312) - -- Peter Howard Thu, 18 Sep 2008 01:02:50 +1000 - -zoneminder (1.23.3-2) unstable; urgency=high - - * ffmpeg finally working? - - -- Peter Howard Wed, 13 Aug 2008 01:02:50 +1000 - -zoneminder (1.23.3-1) unstable; urgency=high - - * Initial version for 1.23.3 - security fix. - (closes: #479034) - - -- Peter Howard Wed, 19 Mar 2008 01:02:50 +1000 - -zoneminder (1.23.2-2) unstable; urgency=low - - * Update to init.d - (closes: #468856) - * Add dependency on logging daemon - (closes: #471277) - - -- Peter Howard Wed, 19 Mar 2008 01:02:50 +1000 - -zoneminder (1.23.2-1) unstable; urgency=low - - * Initial version for 1.23.2 - (closes: #464152) - * Zoneminder 1.23.2 upstream includes fix for GCC 4.3 - (closes: #454980) - * Includes ffmpeg patch by Alexander Kushnirenko - - -- Peter Howard Sat, 01 Mar 2008 16:02:50 +1000 - -zoneminder (1.22.3-10) unstable; urgency=low - - * Fix bug introduced in -9 where perl is put under /usr/local - (closes: #457507) - - -- Peter Howard Mon, 24 Dec 2007 16:02:50 +1000 - -zoneminder (1.22.3-9) unstable; urgency=low - - * Starting zoneminder via init script now invokes "zmfix -a" - (closes: #481637) - * Change apache2-mpm-prefork dependency to apache2 - * Temp dir for export under /var/cache/zoneminder (but linked back to - /usr/share/zoneminder for now) - * Redo use of gnutls rather than openssl for md5 hashes - - -- Peter Howard Mon, 10 Dec 2007 16:02:50 +1000 - -zoneminder (1.22.3-8) unstable; urgency=low - - * Build now includes libpcre3 - (closes: #437533) - * "Monitor Presets" patch now applied to package during build. - - -- Peter Howard Sat, 18 Aug 2007 14:35:23 +1000 - -zoneminder (1.22.3-7) unstable; urgency=low - - * Turn off debug trace and crash dump on build - (closes:#414857,#414891) - * Additional perl libraries added in dependencies - (closes:#416291) - * Change preferred PHP version from 4 to 5 - -- Peter Howard Sun, 29 Jul 2007 15:11:13 +1000 - -zoneminder (1.22.3-6) unstable; urgency=low - - * Removed a similar bash only statement from zmpkg.pl - (closes:414882) - - -- Peter Howard Sat, 14 Apr 2007 11:46:56 +1000 - -zoneminder (1.22.3-5) unstable; urgency=low - - * Installs with "phone home" feature turned off by default, and permissions - on /etc/zm/zm.conf fixed (now the 0600 it s hould be) - (closes:415349) - * Removed "stupid bash-ism" on mysqld check in postinst file. - - -- Peter Howard Fri, 6 Apr 2007 15:50:00 +1000 - -zoneminder (1.22.3-4) unstable; urgency=low - - * Put libmysqlclient-15-dev in front of -14-dev so sbuild works - (closes: #414410) - - -- Peter Howard Mon, 12 Mar 2007 11:38:56 +1100 - -zoneminder (1.22.3-3) unstable; urgency=low - - * Clean up of postinstall, postrm ; user "zm" definitely was a mistake - * Also in postinstall: check and start MySQL if it's not running. - * init.d script now checks if zoneminder isn't running and still returns 0 - (which helps uninstalling) - * Addition of php5 dependency options as well as php4. - - -- Peter Howard Mon, 26 Feb 2007 10:40:52 +1100 - -zoneminder (1.22.3-2) unstable; urgency=low - - * Added zmuser in the mysql creation; this should fix the install problem - for people, but needs to be cleaned up (in -3) - - -- Peter Howard Fri, 16 Feb 2007 14:16:03 +1100 - -zoneminder (1.22.3-1) unstable; urgency=low - - * Initial Version. (closes: #248393) - * Patched out use of openssl; uses gnutls instead for MD5 hashes. - * Removed MakeMaker-inserted Perl licensing (with authors permission) in - various scripts; replaced with GPL. - - -- Peter Howard Wed, 7 Feb 2007 14:09:01 +1100 diff --git a/distros/ubuntu1204_cmake/compat b/distros/ubuntu1204_cmake/compat deleted file mode 100644 index ec635144f..000000000 --- a/distros/ubuntu1204_cmake/compat +++ /dev/null @@ -1 +0,0 @@ -9 diff --git a/distros/ubuntu1204_cmake/control b/distros/ubuntu1204_cmake/control deleted file mode 100644 index 6368d9417..000000000 --- a/distros/ubuntu1204_cmake/control +++ /dev/null @@ -1,138 +0,0 @@ -Source: zoneminder -Section: net -Priority: optional -Maintainer: Dmitry Smirnov -Uploaders: Vagrant Cascadian -Build-Depends: debhelper (>= 9), python-sphinx | python3-sphinx, apache2-dev, dh-linktree - ,cmake - ,libavcodec-dev, libavformat-dev (>= 3:0.svn20090204), libswscale-dev (>= 3:0.svn20090204), libavutil-dev, libavdevice-dev - ,libbz2-dev - ,libgcrypt-dev - ,libcurl4-gnutls-dev - ,libgnutls-openssl-dev - ,libjpeg8-dev|libjpeg9-dev|libjpeg62-turbo-dev, - ,libmysqlclient-dev - ,libpcre3-dev - ,libpolkit-gobject-1-dev - ,libv4l-dev (>= 0.8.3) [!hurd-any] - ,libvlc-dev -# Unbundled (dh_linktree): - ,libjs-jquery - ,libjs-mootools -Standards-Version: 3.9.4 -Homepage: http://www.zoneminder.com/ -Vcs-Browser: http://anonscm.debian.org/cgit/collab-maint/zoneminder.git -Vcs-Git: git://anonscm.debian.org/collab-maint/zoneminder.git - -Package: zoneminder -Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends}, ${perl:Depends} - ,javascript-common - ,libav-tools|ffmpeg - ,libdate-manip-perl - ,libdbd-mysql-perl - ,libmime-lite-perl - ,libmime-tools-perl - ,libphp-serialization-perl - ,libmodule-load-conditional-perl - ,libnet-sftp-foreign-perl -# ,libzoneminder-perl (= ${source:Version}) - ,libarchive-zip-perl - ,libdbd-mysql-perl - ,libdevice-serialport-perl - ,libimage-info-perl - ,libjson-any-perl - ,libsys-mmap-perl [!hurd-any] - ,liburi-encode-perl - ,libwww-perl - ,mysql-client | virtual-mysql-client - ,perl-modules - ,php5-mysql, php5-gd - ,policykit-1 - ,rsyslog | system-log-daemon - ,zip - ,libdata-dump-perl, libclass-std-fast-perl, libsoap-wsdl-perl, libio-socket-multicast-perl, libdigest-sha-perl - , libsys-cpu-perl, libsys-meminfo-perl -Recommends: ${misc:Recommends} - ,libapache2-mod-php5 | php5-fpm - ,mysql-server | virtual-mysql-server - ,zoneminder-doc (>= ${source:Version}) -Suggests: fcgiwrap, logrotate -Description: video camera security and surveillance solution - ZoneMinder is intended for use in single or multi-camera video security - applications, including commercial or home CCTV, theft prevention and child - or family member or home monitoring and other care scenarios. It - supports capture, analysis, recording, and monitoring of video data coming - from one or more video or network cameras attached to a Linux system. - ZoneMinder also support web and semi-automatic control of Pan/Tilt/Zoom - cameras using a variety of protocols. It is suitable for use as a home - video security system and for commercial or professional video security - and surveillance. It can also be integrated into a home automation system - via X.10 or other protocols. - -#Package: libzoneminder-perl -#Section: perl -#Architecture: all -#Multi-Arch: foreign -#Depends: ${misc:Depends}, ${perl:Depends} -# ,libarchive-zip-perl -# ,libdbd-mysql-perl -# ,libdevice-serialport-perl -# ,libimage-info-perl -# ,libjson-any-perl -# ,libsys-mmap-perl [!hurd-any] -# ,liburi-encode-perl -# ,libwww-perl -#Description: ZoneMinder Perl libraries -# ZoneMinder is intended for use in single or multi-camera video security -# applications, including commercial or home CCTV, theft prevention and child -# or family member or home monitoring and other care scenarios. It -# supports capture, analysis, recording, and monitoring of video data coming -# from one or more video or network cameras attached to a Linux system. -# ZoneMinder also support web and semi-automatic control of Pan/Tilt/Zoom -# cameras using a variety of protocols. It is suitable for use as a home -# video security system and for commercial or professional video security -# and surveillance. It can also be integrated into a home automation system -# via X.10 or other protocols. -# . -# This package provides ZoneMinder Perl libraries; it can be used to -# write custom interfaces as well. - -Package: zoneminder-doc -Section: doc -Architecture: all -Multi-Arch: foreign -Depends: ${misc:Depends}, ${sphinxdoc:Depends} -Suggests: www-browser -Description: ZoneMinder documentation - ZoneMinder is intended for use in single or multi-camera video security - applications, including commercial or home CCTV, theft prevention and child - or family member or home monitoring and other care scenarios. It - supports capture, analysis, recording, and monitoring of video data coming - from one or more video or network cameras attached to a Linux system. - ZoneMinder also support web and semi-automatic control of Pan/Tilt/Zoom - cameras using a variety of protocols. It is suitable for use as a home - video security system and for commercial or professional video security - and surveillance. It can also be integrated into a home automation system - via X.10 or other protocols. - . - This package provides ZoneMinder documentation in HTML format. - -Package: zoneminder-dbg -Section: debug -Priority: extra -Architecture: any -Depends: zoneminder (= ${binary:Version}), ${misc:Depends} -Description: Zoneminder -- debugging symbols - ZoneMinder is intended for use in single or multi-camera video security - applications, including commercial or home CCTV, theft prevention and child - or family member or home monitoring and other care scenarios. It - supports capture, analysis, recording, and monitoring of video data coming - from one or more video or network cameras attached to a Linux system. - ZoneMinder also support web and semi-automatic control of Pan/Tilt/Zoom - cameras using a variety of protocols. It is suitable for use as a home - video security system and for commercial or professional video security - and surveillance. It can also be integrated into a home automation system - via X.10 or other protocols. - . - This package provides debugging symbols diff --git a/distros/ubuntu1204_cmake/copyright b/distros/ubuntu1204_cmake/copyright deleted file mode 100644 index c48025a25..000000000 --- a/distros/ubuntu1204_cmake/copyright +++ /dev/null @@ -1,174 +0,0 @@ -Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ -Upstream-Name: ZoneMinder -Upstream-Contact: Philip Coombes -Source: https://github.com/ZoneMinder/ZoneMinder -Comment: - This package was originally debianized by matrix - on Mon, 7 Mar 2005 02:07:57 -0500. - It was re-done for submission to the Debian project by Peter Howard - on Fri, 8 Dec 2006 10:19:43 +1100 -Files-Excluded: - web/skins/*/js/jquery-* - web/tools/mootools/*-yc.js - -Files: * -Copyright: 2001-2014 Philip Coombes - 2008 Brian Rudy - 2014 Vincent Giovannone - 2013 Tim Craig - 2003-2008 Corey DeLasaux - 2001-2010 Chris Kistner -License: GPL-2+ - -Files: distros/* -Copyright: 2001-2008 Philip Coombes - 2014 Isaac Connor - 2005 Serg Oskin -License: GPL-2+ - -Files: web/skins/*/js/jquery-* -Copyright: 2010 John Resig - 2010 The Dojo Foundation -License: GPL-2 or Expat -Comment: - Dual licensed under the MIT or GPL Version 2 licenses. - http://jquery.org/license - . - Includes Sizzle.js http://sizzlejs.com/ - Released under the MIT, BSD, and GPL Licenses. - -Files: web/tools/mootools/*.js -Copyright: 2009 Marcelo Jorge Vieira (metal) - 2006-2010 Valerio Proietti (http://mad4milk.net/) -License: Expat - -Files: web/api/* -Copyright: 2005-2013 Cake Software Foundation, Inc. (http://cakefoundation.org) -License: Expat - -Files: - cmake/Modules/CheckPrototypeDefinition*.cmake - cmake/Modules/FindGLIB2.cmake - cmake/Modules/FindPolkit.cmake - cmake/Modules/GNUInstallDirs.cmake -Copyright: - 2005-2011 Kitware, Inc. - 2010-2011 Andreas Schneider - 2009 Dario Freddi - 2008 Laurent Montel, - 2011 Nikita Krupen'ko -License: BSD-3-clause - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - . - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - . - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - . - * The names of Kitware, Inc., the Insight Consortium, or the names of - any consortium members, or of any contributors, may not be used to - endorse or promote products derived from this software without - specific prior written permission. - . - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -Files: cmake/Modules/FindPerlModules.cmake -Copyright: 2012 Iowa State University -License: Boost-1.0 - Boost Software License - Version 1.0 - August 17th, 2003 - . - Permission is hereby granted, free of charge, to any person or organization - obtaining a copy of the software and accompanying documentation covered by - this license (the "Software") to use, reproduce, display, distribute, - execute, and transmit the Software, and to prepare derivative works of the - Software, and to permit third-parties to whom the Software is furnished to - do so, all subject to the following: - . - The copyright notices in the Software and this entire statement, including - the above license grant, this restriction and the following disclaimer, - must be included in all copies of the Software, in whole or in part, and - all derivative works of the Software, unless such copies or derivative - works are solely in the form of machine-executable object code generated by - a source language processor. - . - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT - SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE - FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - -Files: debian/* -Copyright: 2015 Dmitry Smirnov - 2007-2014 Peter Howard - 2010-2012 Vagrant Cascadian - 2001-2008 Philip Coombes -License: GPL-2+ - -License: Expat - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - . - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - . - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - -License: GPL-2+ - This package 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 package 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 package; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - . - The complete text of the GNU General Public License version 2 - can be found in "/usr/share/common-licenses/GPL-2". - -License: GPL-2 - This package 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; version 2 of the License. - . - This package 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 package; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - . - The complete text of the GNU General Public License version 2 - can be found in "/usr/share/common-licenses/GPL-2". diff --git a/distros/ubuntu1204_cmake/patches/series b/distros/ubuntu1204_cmake/patches/series deleted file mode 100644 index fc70f4006..000000000 --- a/distros/ubuntu1204_cmake/patches/series +++ /dev/null @@ -1,2 +0,0 @@ -default_cgi-path.patch -use_libjs-mootools.patch diff --git a/distros/ubuntu1204_cmake/rules b/distros/ubuntu1204_cmake/rules deleted file mode 100755 index b467c870f..000000000 --- a/distros/ubuntu1204_cmake/rules +++ /dev/null @@ -1,87 +0,0 @@ -#!/usr/bin/make -f -# -*- makefile -*- - -# Uncomment this to turn on verbose mode. -#export DH_VERBOSE=1 - -export DEB_BUILD_MAINT_OPTIONS = hardening=+all -export DEB_LDFLAGS_MAINT_APPEND += -Wl,--as-needed - -ifeq ($(DEB_BUILD_ARCH_OS),hurd) -ARGS:= -DZM_NO_MMAP=ON -endif - -%: - dh $@ --parallel --buildsystem=cmake --builddirectory=dbuild \ - --with sphinxdoc,apache2,linktree - -override_dh_auto_configure: - dh_auto_configure -- $(ARGS) \ - -DCMAKE_VERBOSE_MAKEFILE=ON \ - -DCMAKE_BUILD_TYPE=Release \ - -DZM_CONFIG_DIR="/etc/zm" \ - -DZM_RUNDIR="/var/run/zm" \ - -DZM_SOCKDIR="/var/run/zm" \ - -DZM_TMPDIR="/tmp/zm" \ - -DZM_CGIDIR="/usr/lib/zoneminder/cgi-bin" \ - -DZM_CONTENTDIR="/var/cache/zoneminder" - -override_dh_clean: - dh_clean $(MANPAGES1) - $(RM) -r docs/_build docs/installationguide - -build-indep: - #$(MAKE) -C docs text - $(MAKE) -C docs html - -MANPAGES1 = dbuild/scripts/zmupdate.pl.1 -$(MANPAGES1): - # generate man page(s): - pod2man -s1 --stderr --utf8 $(patsubst %.1, %, $@) $@ - -## reproducible build: -LAST_CHANGE=$(shell dpkg-parsechangelog -S Date) -BUILD_DATE=$(shell LC_ALL=C date -u "+%B %d, %Y" -d "$(LAST_CHANGE)") -override_dh_installman: $(MANPAGES1) - $(MAKE) -C docs man SPHINXOPTS="-D today=\"$(BUILD_DATE)\"" - dh_installman --language=C $(MANPAGES1) - -override_dh_auto_install: - dh_auto_install --destdir=$(CURDIR)/debian/tmp - # remove worthless files: - $(RM) -v $(CURDIR)/debian/tmp/usr/share/perl5/*/*/*/.packlist - $(RM) -v $(CURDIR)/debian/tmp/usr/share/perl5/*/*.in - # remove empty directories: - find $(CURDIR)/debian/tmp/usr -type d -empty -delete -printf 'removed %p\n' - # remove extra-license-file: - $(RM) -v $(CURDIR)/debian/tmp/usr/share/zoneminder/www/api/lib/Cake/LICENSE.txt - -override_dh_fixperms: - dh_fixperms - ## 637685 - chmod -c o-r $(CURDIR)/debian/zoneminder/etc/zm/zm.conf - -override_dh_installinit: - dh_installinit --no-start - -override_dh_apache2: - dh_apache2 --noenable - -override_dh_strip: - [ -d "$(CURDIR)/debian/zoneminder-dbg" ] \ - && dh_strip --dbg-package=zoneminder-dbg \ - || dh_strip - -#%: -# dh $@ --parallel --buildsystem=autoconf --with autoreconf -# -#override_dh_auto_configure: -# dh_auto_configure -- \ -# --sysconfdir=/etc/zm \ -# --with-mysql=/usr \ -# --with-webdir=/usr/share/zoneminder \ -# --with-ffmpeg=/usr \ -# --with-cgidir=/usr/lib/cgi-bin \ -# --with-webuser=www-data \ -# --with-webgroup=www-data \ -# --enable-mmap=yes diff --git a/distros/ubuntu1204_cmake/watch b/distros/ubuntu1204_cmake/watch deleted file mode 100644 index 7ee690edb..000000000 --- a/distros/ubuntu1204_cmake/watch +++ /dev/null @@ -1,7 +0,0 @@ -version=3 - -opts=\ -repacksuffix=+dfsg,\ -dversionmangle=s{\+dfsg\d*}{},\ - https://github.com/ZoneMinder/ZoneMinder/releases \ - .*/ZoneMinder/archive/v(.*).tar.gz diff --git a/distros/ubuntu1504_cmake/NEWS b/distros/ubuntu1504/NEWS similarity index 100% rename from distros/ubuntu1504_cmake/NEWS rename to distros/ubuntu1504/NEWS diff --git a/distros/ubuntu1504/README.Debian b/distros/ubuntu1504/README.Debian index b8ea413e3..8182e0678 100644 --- a/distros/ubuntu1504/README.Debian +++ b/distros/ubuntu1504/README.Debian @@ -1,9 +1,120 @@ -zoneminder for Debian +Zoneminder for Debian --------------------- -There is one manual step to get the web interface working. -You need to link /etc/zm/apache.conf to /etc/apache2/conf.d/zoneminder.conf, -then reload the apache config (i.e. /etc/init.d/apache2 reload) +Initializing database +--------------------- + + pv /usr/share/zoneminder/db/zm_create.sql | sudo mysql --defaults-file=/etc/mysql/debian.cnf +OR + cat /usr/share/zoneminder/db/zm_create.sql | sudo mysql --defaults-file=/etc/mysql/debian.cnf + + echo 'grant lock tables,alter,create,index,select,insert,update,delete on zm.* to 'zmuser'@localhost identified by "zmpass";'\ + | sudo mysql --defaults-file=/etc/mysql/debian.cnf mysql + +Hint: generate secure password with `pwgen` and update "/etc/zm/zm.conf" +accordingly. + +The following command can help to ensure that zoneminder can read its +configuration file: + + chgrp -c www-data /etc/zm/zm.conf + + +Upgrading database +------------------ + +Prior to 1.28.1 database upgrade was performed automatically. +"zoneminder" service will refuse to start with outdated database. + +Assuming that database is on "localhost" then the following command can be +used to upgrade "zm" database: + + zmupdate.pl + +Additional permissions may be required to perform upgrade: + + echo 'grant lock tables, create, alter on zm.* to 'zmuser'@localhost identified by "zmpass";'\ + | sudo mysql --defaults-file=/etc/mysql/debian.cnf mysql + +The following command prints the current version of zoneminder database: + + echo 'select Value from Config where Name = "ZM_DYN_CURR_VERSION";' \ + | sudo mysql --defaults-file=/etc/mysql/debian.cnf --skip-column-names zm + + +Enabling service +---------------- + +By default Zoneminder service is not starting automatically and need to be +manually activated once database is configured: + +On systemd: + + sudo systemctl enable zoneminder.service + +On SysV: + + sudo update-rc.d zoneminder enable + + +Web server set-up +----------------- + +There are few manual steps to get the web interface working: + +## Apache2 + +Apache can be configured as folder "/zm" using sample .conf: + + sudo a2enconf zoneminder + +Alternatively Apache web site configuration template can be used to setup +zoneminder as "http://zoneminder": + + sudo cp -v /usr/share/doc/zoneminder/examples/apache.conf /etc/apache2/sites-available/ + sudo a2ensite zoneminder.conf + +Common configuration steps for Apache2: + + sudo a2enmod cgi + sudo service apache2 reload + + +## nginx / fcgiwrap + +Nginx needs "php5-fpm" package to support PHP and "fcgiwrap" package +for binary "cgi-bin" applications: + + sudo apt-get install php5-fpm fcgiwrap + +To enable a URL alias that makes Zoneminder available from + + http://yourserver/zm + +the following line is to be added to "server" section of a web site +configuration: + + include /usr/share/doc/zoneminder/examples/nginx.conf; + +For "default" web site it would be sufficient to include the above +statement to the file + + /etc/nginx/sites-enabled/default + +To avoid problems with feeds from multiple cameras "fcgiwrap" should be +configured to start at least as many processes as there are cameras. +It can be done by adjusting DAEMON_OPTS in "/etc/default/fcgiwrap". +Systemd users may be affected by the following bug: + + http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=792705 + + +## Note: + +When Zoneminder web site is running it may be necessary to set +Options/Paths/PATH_ZMS to "/zm/cgi-bin/nph-zms" or according to chosen web +site configuration. + Changing the location for images and events ------------------------------------------- @@ -33,19 +144,17 @@ These lines in fstab could allow you to bind-mount an alternate location /dev/sdX1 /var/cache/zoneminder/images ext3 defaults 0 2 /dev/sdX2 /var/cache/zoneminder/events ext3 defaults 0 2 - - -- Peter Howard , Sun, 16 Jan 2010 01:35:51 +1100 Access to /dev/video* --------------------- -For cameras which require access to /dev/video*, zoneminder may need the +For cameras which require access to /dev/video*, zoneminder may need the www-data user added to the video group in order to see those cameras: adduser www-data video -Note that all web applications running on the zoneminder server will then have +Note that all web applications running on the zoneminder server will then have access to all video devices on the system. -- Vagrant Cascadian Sun, 27 Mar 2011 13:06:56 -0700 diff --git a/distros/ubuntu1504_cmake/TODO.Debian b/distros/ubuntu1504/TODO.Debian similarity index 100% rename from distros/ubuntu1504_cmake/TODO.Debian rename to distros/ubuntu1504/TODO.Debian diff --git a/distros/ubuntu1504/apache.conf b/distros/ubuntu1504/apache.conf deleted file mode 100644 index 965c67f86..000000000 --- a/distros/ubuntu1504/apache.conf +++ /dev/null @@ -1,9 +0,0 @@ -Alias /zm /usr/share/zoneminder/www - - - php_flag register_globals off - Options Indexes FollowSymLinks - - DirectoryIndex index.php - - diff --git a/distros/ubuntu1504/changelog b/distros/ubuntu1504/changelog index 9dea00498..74cf1d0b8 100644 --- a/distros/ubuntu1504/changelog +++ b/distros/ubuntu1504/changelog @@ -1,94 +1,573 @@ -zoneminder (1.28.1+1-vivid-SNAPSHOT2015071501) vivid; urgency=medium +zoneminder (1.28.1+1-vivid-SNAPSHOT2015081701) vivid; urgency=medium - * fix for issue #586 and #932 - * fix for db not being upgraded - * version upgraded to .100 + * include api, switch to cmake build - -- Isaac Connor Wed, 15 Jul 2015 11:56:28 -0400 + -- Isaac Connor Mon, 17 Aug 2015 10:29:23 -0400 -zoneminder (1.28.1+1-trusty-SNAPSHOT2015030201) trusty; urgency=medium - * maybe fix for RTSP Basic Auth - * Also remove dependency on netpbm +zoneminder (1.28.1-8) unstable; urgency=medium - -- Isaac Connor Mon, 02 Mar 2015 11:25:59 -0500 + * Patchworks: + + New upstream "980-fix-image-size.patch". + + New "default_cgi-path.patch" to correct default ZM_PATH_ZMS. + * postinst: set "root" as group owner for "/var/log/zm" to silence + logrotate warnings. + * Minor correction to README.Debian. -zoneminder (1.28.1+1-utopic-SNAPSHOT2015022301) utopic; urgency=medium + -- Dmitry Smirnov Sun, 16 Aug 2015 19:19:50 +1000 - * Big merge of onvif support and some fixes. +zoneminder (1.28.1-7) unstable; urgency=medium - -- Isaac Connor Mon, 23 Feb 2015 19:45:45 -0500 + * Build-Depends += "cakephp (<< 3.0.0~)"; + Zoneminder is not compatible with latest CakePHP. + * Handle conffile removal from maintscript. + * rules: build man pages reproducibly. + * gbp.conf: renamed old style config section [git-dch] to [dch]. + * README + + added instructions to update owner of the "/etc/zm/zm.conf" + (Closes: #789327). + + zmupdate.pl needs CREATE rights. + + added note about required number of "fcgiwrap" workers. + * New upstream patch: "zmtrigger-plus.patch". -zoneminder (1.28.0+1-trusty-SNAPSHOT2015021201) trusty; urgency=medium + -- Dmitry Smirnov Mon, 20 Jul 2015 16:30:15 +1000 - * add mysql-client-5.6 as a dependency instaed of mysql-client. +zoneminder (1.28.1-6) unstable; urgency=low - -- Isaac Connor Fri, 13 Feb 2015 09:35:13 -0500 + * New "zoneminder-doc" and "zoneminder-dbg" packages. -zoneminder (1.28.0+1-trusty-SNAPSHOT2015011101) trusty; urgency=medium + -- Dmitry Smirnov Sun, 19 Apr 2015 14:50:41 +1000 - * small changes +zoneminder (1.28.1-5) unstable; urgency=low - -- Isaac Connor Fri, 12 Dec 2014 16:38:36 -0500 + * Move handling of "/var/run/zm" and "/tmp/zm" from .service into .tmpfile. + Let dh_installinit do the job. Thanks, Andrew Bauer. + * Use dh_apache2 to install Apache conf file; remove old conf and symlink. + * Promote "libapache2-mod-php5 | php5-fpm" to Recommends. + * Build-Depends: + + dh-linktree + + cakephp (>= 2.6.3) + + libjs-jquery + + libjs-mootools + * Depends: + - libjs-jquery + - libjs-mootools + * Build-time replace bundled CakePHP with system one using "dh-linktree". + * Use "dh-linktree" to handle mootools and jquery symlinks. -zoneminder (1.28.0+1-utopic-SNAPSHOT2014112001) utopic; urgency=medium + -- Dmitry Smirnov Sun, 19 Apr 2015 11:45:01 +1000 - * Various fixes and developments since 1.28.0. Includes Digest-Auth for HTTP and better for RTSP +zoneminder (1.28.1-4) unstable; urgency=low - -- Isaac Connor Thu, 20 Nov 2014 10:57:57 -0500 + * New patch to fix HTML export with USE_DEEP_STORAGE (closes: #723706). + * New "783.patch" to describe potential data loss in ZM_USE_DEEP_STORAGE. + * New patch to change default date format to region-neutral ISO notation + with time zone. + * Build sphinx documentation: + + Install "zoneminder.1" man page. + + Build-Depends += "python-sphinx | python3-sphinx" + + Added commented "zoneminder-doc" package. + + Added "docs.patch" to unlink distro-specific installation docs. + * rules: + + set ZM_CONTENTDIR, ZM_SOCKDIR and ZM_TMPDIR. + + remove mistakengly installed Perl module templates. + * Updated startup scripts to create ZM_TMPDIR. + * Hurd improvements: + + New patch to add PATH_MAX definitions. + + Build without MMAP support on Hurd. + + libsys-mmap-perl [!hurd-any]. -zoneminder (1.28.0-trusty) trusty; urgency=medium + -- Dmitry Smirnov Mon, 06 Apr 2015 18:18:55 +1000 - * Release +zoneminder (1.28.1-3) unstable; urgency=low - -- Isaac Connor Fri, 17 Oct 2014 09:25:55 -0400 + * Updated Apache2 and nginx configuration templates to support CGI. + * Updated README.Debian to document cgi-bin setup. + * Removed "/usr/share/zoneminder/www/cgi-bin" symlink. + * Added "apache2.patch" to correct Apache2 site configuration example. + * control: Suggests += "fcgiwrap". + * rules: added dh_systemd overrides to prevent automatic service + activation and start. + * Added note about manual service activation to README.Debian + (Closes: #781733). -zoneminder (1.27.99+1-trusty-SNAPSHOT2014101401) trusty; urgency=medium + -- Dmitry Smirnov Thu, 02 Apr 2015 23:20:20 +1100 - * Several PR merges in big push for 1.28.0 +zoneminder (1.28.1-2) unstable; urgency=low - -- Isaac Connor Tue, 14 Oct 2014 09:28:29 -0400 + * Removed word "Linux" from short package description. + * Build-Depends: do not require "libv4l-dev" on Hurd i.e. [!hurd-any]. + * Added run-time Perl Depends: + + libdbd-mysql-perl + + libimage-info-perl + + libmodule-load-conditional-perl + + libnet-sftp-foreign-perl + + liburi-encode-perl + * Prepare for package split: added commented "libzoneminder-perl" + and "zoneminder-dbg" packages to "debian/control". + * rules: do not install worthless ".packlist" file. + * Updated "libv4l1-videodev.h.patch" to fix v4lv1 detection in CMake. -zoneminder (1.27.99+1-trusty-SNAPSHOT2014092601) trusty; urgency=medium + -- Dmitry Smirnov Thu, 02 Apr 2015 13:25:19 +1100 - * style updates and db fixes for database logging filters +zoneminder (1.28.1-1) unstable; urgency=low - -- Isaac Connor Fri, 26 Sep 2014 14:44:45 -0400 + [ Dmitry Smirnov ] + * New upstream release [February 2015]. + * Upload to unstable. + * Disabled automatic database upgrades: post(inst|rm) scripts no longer + touch database or do unexpected stuff (Closes: #779254). + See README.Debian for details. + * Updated installation paths: + + /usr/share/zoneminder --> /usr/share/zoneminder/www + + /usr/lib/cgi-bin --> /usr/lib/zoneminder/cgi-bin + * Added logrotate config (Closes: #544826). + Thanks, Alberto Reyes. + * Native systemd service; "--with systemd" added to dh. + * Build with CMake instead of autoconf; rules clean-up. + * Build with all hardening. + * Build and install "zmupdate.pl.1" man page. + * Added nginx/php5-fpm configuration example. + * Install upstream "apache.conf" example. + * Described setup of Zoneminer web site and database in README.Debian. + * Install "/etc/zm/zm.conf" with tighter permissions. + * Added TODO.Debian. + * Added "debian/clean"; "debian/gbp.conf"; bug-presubj. + * Remove bundled Cake tests to take ~5 MB off big-usr-share. + * Standards-Version: 3.9.6; compat/debhelper to version 9. + * Vcs links to new git repository at collab-maint. + * Build-Depends: + + dh-systemd + + libgcrypt11-dev --> libgcrypt-dev + + libcurl4-gnutls-dev + + libvlc-dev + + policykit-1 (required by "zmsystemctl.pl") + - dh-autoreconf, autoconf, automake + * Depends: + - apache2 + - libapache2-mod-php5 (moved to Suggests) + - libpcre3 (invalid) + - libmodule-load-perl (obsolete; replaced with perl-modules) + - libarchive-tar-perl (obsolete; replaced with perl-modules) + - mysql-server (moved to Recommends, Closes: #759504). + - php5 + + libav-tools + + libjs-jquery (replaces bundled component) + + libjs-mootool (replaces bundled component) + + libjson-any-perl (Closes: #690803). + + perl-modules (Closes: #745819). + * Recommends: + + apache2 | httpd + + mysql-server | virtual-mysql-server (Closes: #732874). + * Suggests: + + libapache2-mod-php5 | php5-fpm + + logrotate + * Refreshed, renamed and re-ordered patches; added DEP-3 headers. + * Removed "vendor_perl" patch (applied-upstream). + * New patches: + + cmake-fix-confpath.patch + + cmake-gnutls.patch + + cmake-nossl.patch + + cmake.patch + + format-hardening.patch + + pod_man_fixes.patch + + pod_name_fixes.patch + + pod_zmupdate-to-pod2usage.patch + * Lintianisation (incomplete): + - extra-license-file + - init.d-script-missing-lsb-description + - init.d-script-does-not-source-init-functions + - privacy-breach-generic + - package-contains-empty-directory + - manpage-has-errors-from-pod2man + - manpage-has-bad-whatis-entry + - quilt-patch-missing-description + - no-dep5-copyright + * Lintian-overrides: + + unusual-interpreter usr/bin/zmsystemctl.pl #!/usr/bin/pkexec + + script-not-executable usr/share/zoneminder/www/api/* + + script-with-language-extension usr/bin/*.pl + + source-is-missing web/tools/mootools/mootools-*-yc.js + + source-is-missing web/skins/*/js/jquery-1.4.2.min.js + + source-contains-prebuilt-javascript-object + * Renamed files in "debian". + * watch: dfsg repacksuffix and dversionmangle. + * "debian/copyright" to Copyright-Format-1.0. + * Set myself as new Maintainer (Closes: #760314). -zoneminder (1.27.99+1-trusty-SNAPSHOT2014090801) trusty; urgency=medium + [ Vagrant Cascadian ] + * Removed obsolete DM-Upload-Allowed flag. + * Update debian/watch to use tarballs from github. + * Add Build-Depends on libgcrypt11-dev (Closes: #745819). + * Use canonical alioth Vcs-Hg URL. + * debian/control: Add Build-Depends: libpolkit-gobject-1-dev. + * Removed configure flag "--enable-crashtrace=no", which is no longer + present upstream. - * several segfault fixes for local cameras + -- Dmitry Smirnov Tue, 31 Mar 2015 15:11:13 +1100 - -- Isaac Connor Mon, 08 Sep 2014 16:56:57 -0400 +zoneminder (1.26.5-3.1) experimental; urgency=low -zoneminder (1.27.99+1-trusty-SNAPSHOT2014090701) trusty; urgency=medium + * Non-maintainer upload. + * Add libav10.patch and compile against libav10 (Closes: #739461) - * Fix segfaults for local cameras, also now includes the systemd support patch + -- Reinhard Tartler Wed, 19 Mar 2014 00:31:22 +0000 - -- Isaac Connor Sun, 07 Sep 2014 17:19:01 -0400 +zoneminder (1.26.5-3) unstable; urgency=low -zoneminder (1.27.99+1-trusty-SNAPSHOT2014082102) trusty; urgency=medium - * Fix UI inputs for v4l multibuffer and captures per frame + * Previous release still didn't build on PPC - this has been corrected. + (Closes: #736516) - -- Isaac Connor Thu, 21 Aug 2014 12:03:31 -0400 + -- Peter Howard Tue, 4 Feb 2014 02:02:10 +1000 -zoneminder (1.27.99+1-trusty-SNAPSHOT2014082101) trusty; urgency=medium +zoneminder (1.26.5-2) unstable; urgency=low - * fall back to Config table values for V4l MultiBUffer and Captures Per Frame - * add mention of monitor page settings for thse in the config table + * Remove dependency on ffmpeg + (Closes: #721161) - -- Isaac Connor Thu, 21 Aug 2014 10:04:46 -0400 + * Builds again on non-x86 target architectures. -zoneminder (1.27.99+1-precise-SNAPSHOT2014080601) precise; urgency=medium + -- Peter Howard Thu, 23 Jan 2014 01:02:10 +1000 - * improve error messages - * Make zmupdate re-run the most recent patch so that people running the daily builds get their db updates +zoneminder (1.26.5-1) unstable; urgency=low - -- Isaac Connor Wed, 06 Aug 2014 20:20:20 -0400 + * New upstream version + (Closes: #694131) + * Change Build-Depends on libgnutls-dev to libgnutls-openssl-dev + (Closes: #731560) + -- Peter Howard Tue, 17 Dec 2013 01:02:10 +1000 -zoneminder (1.27.0+1-trusty-v4ltomonitor-1) trusty; urgency=high +zoneminder (1.25.0-4) unstable; urgency=high - * Snapshot release - + * Add CVE-2013-0232 patch + [SECURITY] CVE-2013-0232: Shell escape commands with untrusted content. + Thanks to James McCoy (Closes: #698910) + Thanks also to Salvatore Bonaccorso - -- Isaac Connor Wed, 09 Jul 2014 21:35:29 -0400 + -- Peter Howard Tue, 12 Jun 2013 12:02:10 +1000 + +zoneminder (1.25.0-3) unstable; urgency=low + + * debian/rules: Export CFLAGS, CPPFLAGS, CXXFLAGS and LDFLAGS, to ensure + hardening build flags are enabled. + + -- Vagrant Cascadian Tue, 28 Aug 2012 12:10:03 -0700 + +zoneminder (1.25.0-2) unstable; urgency=low + + [ Vagrant Cascadian ] + * Add a patch to disable checking for updated versions by default, as + upgrades should happen through package management. + * Use dpkg-buildflags in debian/rules to set default compiler flags. + * Ensure zoneminder is stopped before starting (Closes: #657407). + + [ Peter Howard ] + * Fix postinst to add permission for table creation during upgrade + (Closes: #657407). + + -- Vagrant Cascadian Thu, 23 Aug 2012 12:40:34 -0700 + +zoneminder (1.25.0-1.1) unstable; urgency=low + + * Non-maintainer upload. + * Fix "ftbfs with GCC-4.7": add patch Fix-FTBFS-with-gcc-4.7 from Cyril + Brulebois: fix missing includes. + (Closes: #667428) + + -- gregor herrmann Sun, 13 May 2012 17:02:21 +0200 + +zoneminder (1.25.0-1) unstable; urgency=low + + * Fix typo in libv4l1-videodev.h patch that caused v4l1 support to be + dropped. + * Fail to build if version in postinst doesn't match upstream version. + * Add Build-Depends: libavdevice-dev to fix MPEG streaming (Closes: #515558). + * debian/rules: Convert to using debhelper overrides. + * Set debian/compat to 7. + * Simplify debian/watch file. + * Refresh debian/patches/use_libjs-mootools. + * Refresh debian/patches/libv4l1-videodev.h. + * Remove dependencies on php4 and related packages. + * Remove build-dependencies on libmysqlclient14-dev and + libmysqlclient15-dev. + * Update Build-Depends to use libjpeg-dev instead of libjpeg62-dev + (Closes: #647114). + * Add patch to fix build by testing for C headers rather than C++ headers. + Thanks to Ryan Niebur. (Closes: #654230) + * Add a patch to fix build problems caused by API changes in libav 0.8. + Thanks again to Ryan Niebur. (Closes: #654230) + + -- Vagrant Cascadian Mon, 16 Jan 2012 11:58:05 -0800 + +zoneminder (1.24.4-1) unstable; urgency=low + + [ Peter Howard ] + * Initial release of 1.24.4 (Closes: #634985). + - Fix 32/64-bit type declarations (Closes: #614404). + * Update patches. + + [ Vagrant Cascadian ] + * Add patch to fix FTBFS by using libv4l1-videodev.h from libv4l-dev. + Thanks to Andreas Metzler for reporting the issue. + (Closes: #619813). + * Document adding the www-data user to the video group in README.Debian. + (Closes: #611324) + * Depend on libsys-mmap-perl to enable mapped memory support. + (Closes: #607331) + * Update libjs-mootools patch to use -nc variants (Closes: #635075). + * Depend on javascript-common, to ensure that /javascript is available in + the web server. + * Set the upstream version in postinst at build time. + * Use dh-autoreconf to properly clean up autogenerated files during build. + * Add Vcs-HG to debian/control. + * Add Build-Depends: libv4l-dev, libbz2-dev, dh-autoreconf, libsys-mmap-perl. + + -- Vagrant Cascadian Sun, 24 Jul 2011 16:44:30 +0200 + +zoneminder (1.24.2-9) unstable; urgency=low + + * Apply patch from Ubuntu to fix FTBFS with ffmpeg 0.6: + - Add -D__STDC_CONSTANT_MACROS to CPPFLAGS (closes: 614080). + * Update Standards-Version to 3.9.1, no changes necessary. + + -- Vagrant Cascadian Sun, 20 Feb 2011 23:43:02 -0800 + +zoneminder (1.24.2-8) unstable; urgency=medium + + [ Vagrant Cascadian ] + * Apply patch to fix V4L2 cameras without crop support (closes: #608790). + Thanks to piratebab. + * Add preinst script which aborts if dangerous symlinks exist. + (closes: #608793) + + [ Peter Howard ] + * Added to README.Debian with info about images and events directories. + (closes: #608793) + + -- Vagrant Cascadian Sat, 15 Jan 2011 19:39:26 -0800 + +zoneminder (1.24.2-7) unstable; urgency=medium + + * Do not set ownership of /var/cache/zoneminder when upgrading, which fixes a + regression causing upgrades to take inordinately long with large + installations (closes: #597040). + + -- Vagrant Cascadian Fri, 17 Sep 2010 11:24:41 -0700 + +zoneminder (1.24.2-6) unstable; urgency=low + + * Only remove database on purge. This requires only creating the database if + it doesn't already exist, and upgrading the database only if the database + is an older version (closes: #497107). + + * Do not prompt the user on database upgrades by using the --nointeractive + flag when calling zmupdate.pl from postinst (closes: #595902). + + -- Vagrant Cascadian Fri, 10 Sep 2010 10:06:06 -0700 + +zoneminder (1.24.2-5) unstable; urgency=low + + [ Peter Howard ] + * Add zip dependency + (closes: #494261) + * Add debian/watch file + (closes: #545552) + * Use packaged libjs-mootools + (closes: #585590) + * Miscellaneous cleanups + + [ Vagrant Cascadian ] + * Add vagrant@debian.org as uploader + * Update Standards-Version to 3.9.0, no changes necessary. + + -- Vagrant Cascadian Fri, 23 Jul 2010 18:12:50 -0500 + +zoneminder (1.24.2-4.1) unstable; urgency=low + + * Non-maintainer upload. + * Fix "package removed, processes still running": apply patch to + debian/postinst by Vagrant Cascadian: use invoke-rc.d and run + mysql-related actions only when mysql is running (closes: #583648). + + -- gregor herrmann Thu, 01 Jul 2010 19:47:10 +0200 + +zoneminder (1.24.2-4) unstable; urgency=high + * Update init.d to list mysql dependency + (closes: #583505) + * Change depenency from libmime-perl to libmime-tools-perl + (closes: #585589) + * Problems in changelog format fixed + (closes: #585592) + * Fix debian-rules-ignores-make-clean-error + (closes: #585593) + -- Peter Howard Mon, 14 jun 2010 15:02:10 +1000 + +zoneminder (1.24.2-3) unstable; urgency=high + * Changes symbols to build with libjpeg8 + (closes: #565326, #568327) + * Note: location of all perl files should have been fixed in previous release + (closes: #553096) + -- Peter Howard Mon, 26 apr 2010 15:02:10 +1000 + +zoneminder (1.24.2-2) unstable; urgency=high + + * Remove custom perl parth from zmpkg.pl, fix location of manpages. + (closes: #551746, #553092) + * Fix GCC4.4 bug + (closes: #531717) + * Fix potential bug in postinst script + + -- Peter Howard Sat, 14 Nov 2009 15:02:10 +1000 + +zoneminder (1.24.2-1) unstable; urgency=high + + * Initial release of zoneminder 1.24.2 + -- Peter Howard Fri, 11 Sep 2009 07:02:50 +1000 + +zoneminder (1.24.1-1) unstable; urgency=high + + * Initial release of zoneminder 1.24.1, closing CVE-2008-3882, + CVE-2008-3881, CVE-2008-3880 + (closes: #497640) + * Change syslog dependency to rsyslog. + (closes: #526918) + * Add missing perl depenency. + * Restore patch to disable "check for updates" by default. + * Removed spurious '$' in init script. + (closes: #486064) + * Change permission of zm.conf from 0600 to 0400 for CVE-2008-6755 + (closes: #528252) + -- Peter Howard Sat, 16 May 2009 07:02:50 +1000 + +zoneminder (1.23.3-4) unstable; urgency=high + + * update to get it building with latest unstable. Thanks to waldi@debian.org + (closes: #517569) + -- Peter Howard Thu, 16 Apr 2009 01:02:50 +1000 + +zoneminder (1.23.3-3) unstable; urgency=high + + * ffmpeg confirmed working + (closes: #475145) + * Fix upgrade problem intrudouced in 1.23.3-1 + (closes: #481637) + * Include libmime-lite-perl in dependencies + (closes: #486312) + -- Peter Howard Thu, 18 Sep 2008 01:02:50 +1000 + +zoneminder (1.23.3-2) unstable; urgency=high + + * ffmpeg finally working? + + -- Peter Howard Wed, 13 Aug 2008 01:02:50 +1000 + +zoneminder (1.23.3-1) unstable; urgency=high + + * Initial version for 1.23.3 - security fix. + (closes: #479034) + + -- Peter Howard Wed, 19 Mar 2008 01:02:50 +1000 + +zoneminder (1.23.2-2) unstable; urgency=low + + * Update to init.d + (closes: #468856) + * Add dependency on logging daemon + (closes: #471277) + + -- Peter Howard Wed, 19 Mar 2008 01:02:50 +1000 + +zoneminder (1.23.2-1) unstable; urgency=low + + * Initial version for 1.23.2 + (closes: #464152) + * Zoneminder 1.23.2 upstream includes fix for GCC 4.3 + (closes: #454980) + * Includes ffmpeg patch by Alexander Kushnirenko + + -- Peter Howard Sat, 01 Mar 2008 16:02:50 +1000 + +zoneminder (1.22.3-10) unstable; urgency=low + + * Fix bug introduced in -9 where perl is put under /usr/local + (closes: #457507) + + -- Peter Howard Mon, 24 Dec 2007 16:02:50 +1000 + +zoneminder (1.22.3-9) unstable; urgency=low + + * Starting zoneminder via init script now invokes "zmfix -a" + (closes: #481637) + * Change apache2-mpm-prefork dependency to apache2 + * Temp dir for export under /var/cache/zoneminder (but linked back to + /usr/share/zoneminder for now) + * Redo use of gnutls rather than openssl for md5 hashes + + -- Peter Howard Mon, 10 Dec 2007 16:02:50 +1000 + +zoneminder (1.22.3-8) unstable; urgency=low + + * Build now includes libpcre3 + (closes: #437533) + * "Monitor Presets" patch now applied to package during build. + + -- Peter Howard Sat, 18 Aug 2007 14:35:23 +1000 + +zoneminder (1.22.3-7) unstable; urgency=low + + * Turn off debug trace and crash dump on build + (closes:#414857,#414891) + * Additional perl libraries added in dependencies + (closes:#416291) + * Change preferred PHP version from 4 to 5 + -- Peter Howard Sun, 29 Jul 2007 15:11:13 +1000 + +zoneminder (1.22.3-6) unstable; urgency=low + + * Removed a similar bash only statement from zmpkg.pl + (closes:414882) + + -- Peter Howard Sat, 14 Apr 2007 11:46:56 +1000 + +zoneminder (1.22.3-5) unstable; urgency=low + + * Installs with "phone home" feature turned off by default, and permissions + on /etc/zm/zm.conf fixed (now the 0600 it s hould be) + (closes:415349) + * Removed "stupid bash-ism" on mysqld check in postinst file. + + -- Peter Howard Fri, 6 Apr 2007 15:50:00 +1000 + +zoneminder (1.22.3-4) unstable; urgency=low + + * Put libmysqlclient-15-dev in front of -14-dev so sbuild works + (closes: #414410) + + -- Peter Howard Mon, 12 Mar 2007 11:38:56 +1100 + +zoneminder (1.22.3-3) unstable; urgency=low + + * Clean up of postinstall, postrm ; user "zm" definitely was a mistake + * Also in postinstall: check and start MySQL if it's not running. + * init.d script now checks if zoneminder isn't running and still returns 0 + (which helps uninstalling) + * Addition of php5 dependency options as well as php4. + + -- Peter Howard Mon, 26 Feb 2007 10:40:52 +1100 + +zoneminder (1.22.3-2) unstable; urgency=low + + * Added zmuser in the mysql creation; this should fix the install problem + for people, but needs to be cleaned up (in -3) + + -- Peter Howard Fri, 16 Feb 2007 14:16:03 +1100 + +zoneminder (1.22.3-1) unstable; urgency=low + + * Initial Version. (closes: #248393) + * Patched out use of openssl; uses gnutls instead for MD5 hashes. + * Removed MakeMaker-inserted Perl licensing (with authors permission) in + various scripts; replaced with GPL. + + -- Peter Howard Wed, 7 Feb 2007 14:09:01 +1100 diff --git a/distros/ubuntu1504_cmake/clean b/distros/ubuntu1504/clean similarity index 100% rename from distros/ubuntu1504_cmake/clean rename to distros/ubuntu1504/clean diff --git a/distros/ubuntu1504_cmake/conf/apache2/zoneminder.conf b/distros/ubuntu1504/conf/apache2/zoneminder.conf similarity index 100% rename from distros/ubuntu1504_cmake/conf/apache2/zoneminder.conf rename to distros/ubuntu1504/conf/apache2/zoneminder.conf diff --git a/distros/ubuntu1504/control b/distros/ubuntu1504/control index dddecf61e..50dee74c6 100644 --- a/distros/ubuntu1504/control +++ b/distros/ubuntu1504/control @@ -1,59 +1,72 @@ Source: zoneminder Section: net Priority: optional -Maintainer: Isaac Connor -Build-Depends: debhelper (>= 9), dh-systemd (>= 1.5), autoconf, automake, quilt, libtool, dh-autoreconf - , libgnutls-dev - , libmysqlclient-dev | libmariadbclient-dev - , libjpeg8-dev|libjpeg9-dev|libjpeg62-turbo-dev, libpcre3-dev - , libavcodec-ffmpeg-dev, libavformat-ffmpeg-dev, libswscale-ffmpeg-dev, libavutil-ffmpeg-dev, libavdevice-ffmpeg-dev - , libv4l-dev (>= 0.8.3), libbz2-dev - , libvlccore-dev, libvlc-dev - , libcurl4-gnutls-dev | libcurl4-nss-dev | libcurl4-openssl-dev - , libgcrypt11-dev, libpolkit-gobject-1-dev +Maintainer: Dmitry Smirnov +Uploaders: Vagrant Cascadian +Build-Depends: debhelper (>= 9), dh-systemd, python-sphinx | python3-sphinx, apache2-dev, dh-linktree + ,cmake + ,libavcodec-ffmpeg-dev, libavformat-ffmpeg-dev, libswscale-ffmpeg-dev, libavutil-ffmpeg-dev, libavdevice-ffmpeg-dev + ,libbz2-dev + ,libgcrypt-dev + ,libcurl4-gnutls-dev + ,libgnutls-openssl-dev + ,libjpeg-dev + ,libmysqlclient-dev + ,libpcre3-dev + ,libpolkit-gobject-1-dev + ,libv4l-dev (>= 0.8.3) [!hurd-any] + ,libvlc-dev + ,libdate-manip-perl + ,libdbd-mysql-perl + ,libphp-serialization-perl + ,libsys-mmap-perl [!hurd-any] + ,libwww-perl +# Unbundled (dh_linktree): + ,libjs-jquery + ,libjs-mootools Standards-Version: 3.9.6 Homepage: http://www.zoneminder.com/ +Vcs-Browser: http://anonscm.debian.org/cgit/collab-maint/zoneminder.git +Vcs-Git: git://anonscm.debian.org/collab-maint/zoneminder.git Package: zoneminder Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, ${perl:Depends} - , apache2, libapache2-mod-php5 | libapache2-mod-fcgid, php5, php5-mysql|php5-mysqlnd - , mariadb-client|mysql-client|mysql-client-5.6 - , libphp-serialization-perl, libdate-manip-perl, libmime-lite-perl, libmime-tools-perl - , libwww-perl, libarchive-tar-perl, libarchive-zip-perl, libdevice-serialport-perl - , libmodule-load-perl, libsys-mmap-perl, libjson-any-perl - , libnet-sftp-foreign-perl , libio-pty-perl, libexpect-perl , liburi-encode-perl , libdbd-mysql-perl - , libdata-dump-perl, libclass-std-fast-perl, libsoap-wsdl-perl, libio-socket-multicast-perl, libdigest-sha-perl - , libsys-cpu-perl, libsys-meminfo-perl - , libpcre3 - , ffmpeg, libavdevice-ffmpeg56 - , rsyslog | system-log-daemon - , libjpeg8|libjpeg9|libjpeg62-turbo - , zip - , libvlccore5 | libvlccore7 | libvlccore8, libvlc5 - , libcurl4-gnutls-dev | libcurl4-nss-dev | libcurl4-openssl-dev - , libpolkit-gobject-1-0 - , php5-gd -Recommends: mysql-server|mariadb-server -Description: Video camera security and surveillance solution - ZoneMinder is intended for use in single or multi-camera video security - applications, including commercial or home CCTV, theft prevention and child - or family member or home monitoring and other care scenarios. It - supports capture, analysis, recording, and monitoring of video data coming - from one or more video or network cameras attached to a Linux system. - ZoneMinder also support web and semi-automatic control of Pan/Tilt/Zoom - cameras using a variety of protocols. It is suitable for use as a home - video security system and for commercial or professional video security - and surveillance. It can also be integrated into a home automation system - via X.10 or other protocols. - -Package: zoneminder-dbg -Section: debug -Priority: extra -Architecture: any -Depends: zoneminder (= ${binary:Version}), ${misc:Depends} -Description: Debugging symbols for zoneminder. - ZoneMinder is a video camera security and surveillance solution. + ,javascript-common + ,libav-tools + ,libdate-manip-perl + ,libdbd-mysql-perl + ,libmime-lite-perl + ,libmime-tools-perl + ,libphp-serialization-perl + ,libmodule-load-conditional-perl + ,libnet-sftp-foreign-perl + ,libarchive-zip-perl + ,libdbd-mysql-perl + ,libdevice-serialport-perl + ,libimage-info-perl + ,libjson-any-perl + ,libsys-mmap-perl [!hurd-any] + ,liburi-encode-perl + ,libwww-perl + ,libdata-dump-perl + ,libclass-std-fast-perl + ,libsoap-wsdl-perl + ,libio-socket-multicast-perl + ,libdigest-sha-perl + ,libsys-cpu-perl, libsys-meminfo-perl + ,mysql-client | virtual-mysql-client + ,perl-modules + ,php5-mysql + ,policykit-1 + ,rsyslog | system-log-daemon + ,zip +Recommends: ${misc:Recommends} + ,libapache2-mod-php5 | php5-fpm + ,mysql-server | virtual-mysql-server + ,zoneminder-doc (>= ${source:Version}) +Suggests: fcgiwrap, logrotate +Description: video camera security and surveillance solution ZoneMinder is intended for use in single or multi-camera video security applications, including commercial or home CCTV, theft prevention and child or family member or home monitoring and other care scenarios. It @@ -64,3 +77,70 @@ Description: Debugging symbols for zoneminder. video security system and for commercial or professional video security and surveillance. It can also be integrated into a home automation system via X.10 or other protocols. + +#Package: libzoneminder-perl +#Section: perl +#Architecture: all +#Multi-Arch: foreign +#Depends: ${misc:Depends}, ${perl:Depends} +# ,libarchive-zip-perl +# ,libdbd-mysql-perl +# ,libdevice-serialport-perl +# ,libimage-info-perl +# ,libjson-any-perl +# ,libsys-mmap-perl [!hurd-any] +# ,liburi-encode-perl +# ,libwww-perl +#Description: ZoneMinder Perl libraries +# ZoneMinder is intended for use in single or multi-camera video security +# applications, including commercial or home CCTV, theft prevention and child +# or family member or home monitoring and other care scenarios. It +# supports capture, analysis, recording, and monitoring of video data coming +# from one or more video or network cameras attached to a Linux system. +# ZoneMinder also support web and semi-automatic control of Pan/Tilt/Zoom +# cameras using a variety of protocols. It is suitable for use as a home +# video security system and for commercial or professional video security +# and surveillance. It can also be integrated into a home automation system +# via X.10 or other protocols. +# . +# This package provides ZoneMinder Perl libraries; it can be used to +# write custom interfaces as well. + +Package: zoneminder-doc +Section: doc +Architecture: all +Multi-Arch: foreign +Depends: ${misc:Depends}, ${sphinxdoc:Depends}, python-sphinx-rtd-theme | python3-sphinx-rtd-theme +Suggests: www-browser +Description: ZoneMinder documentation + ZoneMinder is intended for use in single or multi-camera video security + applications, including commercial or home CCTV, theft prevention and child + or family member or home monitoring and other care scenarios. It + supports capture, analysis, recording, and monitoring of video data coming + from one or more video or network cameras attached to a Linux system. + ZoneMinder also support web and semi-automatic control of Pan/Tilt/Zoom + cameras using a variety of protocols. It is suitable for use as a home + video security system and for commercial or professional video security + and surveillance. It can also be integrated into a home automation system + via X.10 or other protocols. + . + This package provides ZoneMinder documentation in HTML format. + +Package: zoneminder-dbg +Section: debug +Priority: extra +Architecture: any +Depends: zoneminder (= ${binary:Version}), ${misc:Depends} +Description: Zoneminder -- debugging symbols + ZoneMinder is intended for use in single or multi-camera video security + applications, including commercial or home CCTV, theft prevention and child + or family member or home monitoring and other care scenarios. It + supports capture, analysis, recording, and monitoring of video data coming + from one or more video or network cameras attached to a Linux system. + ZoneMinder also support web and semi-automatic control of Pan/Tilt/Zoom + cameras using a variety of protocols. It is suitable for use as a home + video security system and for commercial or professional video security + and surveillance. It can also be integrated into a home automation system + via X.10 or other protocols. + . + This package provides debugging symbols diff --git a/distros/ubuntu1504/copyright b/distros/ubuntu1504/copyright index a177502a0..c48025a25 100644 --- a/distros/ubuntu1504/copyright +++ b/distros/ubuntu1504/copyright @@ -1,22 +1,174 @@ +Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: ZoneMinder +Upstream-Contact: Philip Coombes +Source: https://github.com/ZoneMinder/ZoneMinder +Comment: + This package was originally debianized by matrix + on Mon, 7 Mar 2005 02:07:57 -0500. + It was re-done for submission to the Debian project by Peter Howard + on Fri, 8 Dec 2006 10:19:43 +1100 +Files-Excluded: + web/skins/*/js/jquery-* + web/tools/mootools/*-yc.js + +Files: * +Copyright: 2001-2014 Philip Coombes + 2008 Brian Rudy + 2014 Vincent Giovannone + 2013 Tim Craig + 2003-2008 Corey DeLasaux + 2001-2010 Chris Kistner +License: GPL-2+ + +Files: distros/* +Copyright: 2001-2008 Philip Coombes + 2014 Isaac Connor + 2005 Serg Oskin +License: GPL-2+ + +Files: web/skins/*/js/jquery-* +Copyright: 2010 John Resig + 2010 The Dojo Foundation +License: GPL-2 or Expat +Comment: + Dual licensed under the MIT or GPL Version 2 licenses. + http://jquery.org/license + . + Includes Sizzle.js http://sizzlejs.com/ + Released under the MIT, BSD, and GPL Licenses. + +Files: web/tools/mootools/*.js +Copyright: 2009 Marcelo Jorge Vieira (metal) + 2006-2010 Valerio Proietti (http://mad4milk.net/) +License: Expat + +Files: web/api/* +Copyright: 2005-2013 Cake Software Foundation, Inc. (http://cakefoundation.org) +License: Expat + +Files: + cmake/Modules/CheckPrototypeDefinition*.cmake + cmake/Modules/FindGLIB2.cmake + cmake/Modules/FindPolkit.cmake + cmake/Modules/GNUInstallDirs.cmake Copyright: + 2005-2011 Kitware, Inc. + 2010-2011 Andreas Schneider + 2009 Dario Freddi + 2008 Laurent Montel, + 2011 Nikita Krupen'ko +License: BSD-3-clause + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + . + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + . + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + . + * The names of Kitware, Inc., the Insight Consortium, or the names of + any consortium members, or of any contributors, may not be used to + endorse or promote products derived from this software without + specific prior written permission. + . + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -Copyright 2002 Philip Coombes +Files: cmake/Modules/FindPerlModules.cmake +Copyright: 2012 Iowa State University +License: Boost-1.0 + Boost Software License - Version 1.0 - August 17th, 2003 + . + Permission is hereby granted, free of charge, to any person or organization + obtaining a copy of the software and accompanying documentation covered by + this license (the "Software") to use, reproduce, display, distribute, + execute, and transmit the Software, and to prepare derivative works of the + Software, and to permit third-parties to whom the Software is furnished to + do so, all subject to the following: + . + The copyright notices in the Software and this entire statement, including + the above license grant, this restriction and the following disclaimer, + must be included in all copies of the Software, in whole or in part, and + all derivative works of the Software, unless such copies or derivative + works are solely in the form of machine-executable object code generated by + a source language processor. + . + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT + SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE + FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. -License: +Files: debian/* +Copyright: 2015 Dmitry Smirnov + 2007-2014 Peter Howard + 2010-2012 Vagrant Cascadian + 2001-2008 Philip Coombes +License: GPL-2+ -This package 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. +License: Expat + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + . + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + . + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. -This package 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. +License: GPL-2+ + This package 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 package 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 package; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + . + The complete text of the GNU General Public License version 2 + can be found in "/usr/share/common-licenses/GPL-2". -You should have received a copy of the GNU General Public -License along with this package; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -On Debian GNU/Linux systems, the text of the GPL can be found in -/usr/share/common-licenses/GPL. +License: GPL-2 + This package 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; version 2 of the License. + . + This package 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 package; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + . + The complete text of the GNU General Public License version 2 + can be found in "/usr/share/common-licenses/GPL-2". diff --git a/distros/ubuntu1504/dirs b/distros/ubuntu1504/dirs deleted file mode 100644 index 4178482c1..000000000 --- a/distros/ubuntu1504/dirs +++ /dev/null @@ -1,6 +0,0 @@ -var/log/zm -var/lib/zm -var/cache/zoneminder/events -var/cache/zoneminder/images -var/cache/zoneminder/temp -usr/share/zoneminder/db diff --git a/distros/ubuntu1504/docs b/distros/ubuntu1504/docs deleted file mode 100644 index b43bf86b5..000000000 --- a/distros/ubuntu1504/docs +++ /dev/null @@ -1 +0,0 @@ -README.md diff --git a/distros/ubuntu1504_cmake/examples/nginx.conf b/distros/ubuntu1504/examples/nginx.conf similarity index 100% rename from distros/ubuntu1504_cmake/examples/nginx.conf rename to distros/ubuntu1504/examples/nginx.conf diff --git a/distros/ubuntu1504_cmake/gbp.conf b/distros/ubuntu1504/gbp.conf similarity index 100% rename from distros/ubuntu1504_cmake/gbp.conf rename to distros/ubuntu1504/gbp.conf diff --git a/distros/ubuntu1504/install b/distros/ubuntu1504/install deleted file mode 100644 index 4b0009cea..000000000 --- a/distros/ubuntu1504/install +++ /dev/null @@ -1,12 +0,0 @@ -usr/bin -usr/lib/cgi-bin -usr/share/man -usr/share/perl5/ZoneMinder -usr/share/perl5/ZoneMinder.pm -usr/share/polkit-1/actions -usr/share/polkit-1/rules.d -usr/share/zoneminder -etc/zm -db/zm_create.sql usr/share/zoneminder/db -db/zm_update-*.sql usr/share/zoneminder/db -debian/apache.conf etc/zm diff --git a/distros/ubuntu1504_cmake/libzoneminder-perl.install b/distros/ubuntu1504/libzoneminder-perl.install similarity index 100% rename from distros/ubuntu1504_cmake/libzoneminder-perl.install rename to distros/ubuntu1504/libzoneminder-perl.install diff --git a/distros/ubuntu1504/links b/distros/ubuntu1504/links deleted file mode 100644 index 2de75e323..000000000 --- a/distros/ubuntu1504/links +++ /dev/null @@ -1,4 +0,0 @@ -var/cache/zoneminder/events usr/share/zoneminder/www/events -var/cache/zoneminder/images usr/share/zoneminder/www/images -var/cache/zoneminder/temp usr/share/zoneminder/www/temp -usr/lib/cgi-bin usr/lib/zoneminder/cgi-bin diff --git a/distros/ubuntu1504_cmake/patches/default_cgi-path.patch b/distros/ubuntu1504/patches/default_cgi-path.patch similarity index 100% rename from distros/ubuntu1504_cmake/patches/default_cgi-path.patch rename to distros/ubuntu1504/patches/default_cgi-path.patch diff --git a/distros/ubuntu1504/patches/series b/distros/ubuntu1504/patches/series index e69de29bb..fc70f4006 100644 --- a/distros/ubuntu1504/patches/series +++ b/distros/ubuntu1504/patches/series @@ -0,0 +1,2 @@ +default_cgi-path.patch +use_libjs-mootools.patch diff --git a/distros/ubuntu1504_cmake/patches/use_libjs-mootools.patch b/distros/ubuntu1504/patches/use_libjs-mootools.patch similarity index 100% rename from distros/ubuntu1504_cmake/patches/use_libjs-mootools.patch rename to distros/ubuntu1504/patches/use_libjs-mootools.patch diff --git a/distros/ubuntu1504/postinst b/distros/ubuntu1504/postinst deleted file mode 100644 index e009a9799..000000000 --- a/distros/ubuntu1504/postinst +++ /dev/null @@ -1,53 +0,0 @@ -#! /bin/sh - -set -e - -if [ "$1" = "configure" ]; then - if [ -e "/lib/systemd/system/mysql.service" ]; then - # - # Get mysql started if it isn't - # - if ! $(systemctl is-active mysql >/dev/null 2>&1); then - systemctl start mysql - fi - if $(systemctl is-active mysql >/dev/null 2>&1); then - mysqladmin --defaults-file=/etc/mysql/debian.cnf -f reload - # test if database if already present... - if ! $(echo quit | mysql --defaults-file=/etc/mysql/debian.cnf zm > /dev/null 2> /dev/null) ; then - cat /usr/share/zoneminder/db/zm_create.sql | mysql --defaults-file=/etc/mysql/debian.cnf - echo 'grant lock tables, alter,select,insert,update,delete on zm.* to 'zmuser'@localhost identified by "zmpass";' | mysql --defaults-file=/etc/mysql/debian.cnf mysql - fi - - systemctl stop zoneminder || true #not sure about "|| true" - zmupdate.pl --nointeractive - - else - echo 'NOTE: mysql not running, please start mysql and run dpkg-reconfigure zoneminder when it is running.' - fi - else - echo 'mysql not found, assuming remote server.' - fi - chown www-data:www-data /var/log/zm - chown www-data:www-data /var/lib/zm/ - if [ -z "$2" ]; then - chown www-data:www-data -R /var/cache/zoneminder - fi -fi -# Ensure zoneminder is stopped... -if [ -e "/lib/systemd/system/zoneminder.service" ]; then #changed from -x to -e, could be wrong - if systemctl is-active zoneminder >/dev/null 2>&1 ; then - systemctl stop zoneminder || exit $? - fi -fi - -if [ "$1" = "configure" ]; then - if [ -z "$2" ]; then - chown www-data:www-data /var/log/zm - chown www-data:www-data /var/lib/zm/ - chown www-data:www-data -R /var/cache/zoneminder - else - chown www-data:www-data /var/log/zm - zmupdate.pl - fi -fi -#DEBHELPER# diff --git a/distros/ubuntu1504/postrm b/distros/ubuntu1504/postrm deleted file mode 100644 index 28a00a7a0..000000000 --- a/distros/ubuntu1504/postrm +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh -# set -e # to be reinstated later - -if [ "$1" = "purge" ]; then - echo 'delete from user where User="zmuser";' | mysql --defaults-file=/etc/mysql/debian.cnf mysql - echo 'delete from db where User="zmuser";' | mysql --defaults-file=/etc/mysql/debian.cnf mysql - mysqladmin --defaults-file=/etc/mysql/debian.cnf -f drop zm -fi -#DEBHELPER# diff --git a/distros/ubuntu1504/preinst b/distros/ubuntu1504/preinst deleted file mode 100755 index f35723bc0..000000000 --- a/distros/ubuntu1504/preinst +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/sh - -set -e - -abort=false -if [ -L /usr/share/zoneminder/www/events ]; then - l=$(readlink /usr/share/zoneminder/www/events) - if [ "$l" != "/var/cache/zoneminder/events" ]; then - abort=true - fi -fi -if [ -L /usr/share/zoneminder/www/images ]; then - l=$(readlink /usr/share/zoneminder/www/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 -/usr/share/zoneminder/www 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/www before installing zoneminder from the package. -EOF - exit 1 - -fi - -#DEBHELPER# - -exit 0 diff --git a/distros/ubuntu1504/rules b/distros/ubuntu1504/rules index 9fe5e92d8..bf8012aa8 100755 --- a/distros/ubuntu1504/rules +++ b/distros/ubuntu1504/rules @@ -1,67 +1,93 @@ #!/usr/bin/make -f # -*- makefile -*- -# Sample debian/rules that uses debhelper. -# This file was originally written by Joey Hess and Craig Small. -# As a special exception, when this file is copied by dh-make into a -# dh-make output file, you may use that output file without restriction. -# This special exception was added by Craig Small in version 0.37 of dh-make. # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 -# These are used for cross-compiling and for saving the configure script -# from having to guess our platform (since we know it already) -DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) -DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) +export DEB_BUILD_MAINT_OPTIONS = hardening=+all +export DEB_LDFLAGS_MAINT_APPEND += -Wl,--as-needed -CFLAGS = -Wall -g -CPPFLAGS = -D__STDC_CONSTANT_MACROS -CXXFLAGS = -DHAVE_LIBCRYPTO - -ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) - CFLAGS += -O0 -else - CFLAGS += -O2 +ifeq ($(DEB_BUILD_ARCH_OS),hurd) +ARGS:= -DZM_NO_MMAP=ON endif %: - dh $@ --with quilt,autoreconf,systemd + dh $@ --parallel --buildsystem=cmake --builddirectory=dbuild \ + --with systemd,sphinxdoc,apache2,linktree override_dh_auto_configure: - CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" dh_auto_configure -- --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) --sysconfdir=/etc/zm --prefix=/usr --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info --with-mysql=/usr --with-mariadb=/usr --with-webdir=/usr/share/zoneminder --with-ffmpeg=/usr --with-cgidir=/usr/lib/cgi-bin --with-webuser=www-data --with-webgroup=www-data --enable-crashtrace=no --enable-mmap=yes + dh_auto_configure -- $(ARGS) \ + -DCMAKE_VERBOSE_MAKEFILE=ON \ + -DCMAKE_BUILD_TYPE=Release \ + -DZM_CONFIG_DIR="/etc/zm" \ + -DZM_RUNDIR="/var/run/zm" \ + -DZM_SOCKDIR="/var/run/zm" \ + -DZM_TMPDIR="/tmp/zm" \ + -DZM_CGIDIR="/usr/lib/zoneminder/cgi-bin" \ + -DZM_CONTENTDIR="/var/cache/zoneminder" override_dh_clean: - # Add here commands to clean up after the build process. - [ ! -f Makefile ] || $(MAKE) distclean - dh_clean + dh_clean $(MANPAGES1) + $(RM) -r docs/_build docs/installationguide -override_dh_install: - dh_install --fail-missing - # - # NOTE: This is a short-term kludge; hopefully changes in the next - # upstream version will render this unnecessary. - rm -rf debian/zoneminder/usr/share/zoneminder/www/events - rm -rf debian/zoneminder/usr/share/zoneminder/www/images - rm -rf debian/zoneminder/usr/share/zoneminder/temp - dh_link var/cache/zoneminder/events usr/share/zoneminder/www/events - dh_link var/cache/zoneminder/images usr/share/zoneminder/www/images - dh_link var/cache/zoneminder/temp usr/share/zoneminder/www/temp +build-indep: + #$(MAKE) -C docs text + $(MAKE) -C docs html - # - # This is a slightly lesser kludge; moving the cgi stuff to - # /usr/share/zoneminder/cgi-bin breaks one set of behavior, - # having it just in /usr/lib/cgi-bin breaks another bit of - # behavior. - # - dh_link usr/lib/cgi-bin usr/lib/zoneminder/cgi-bin +MANPAGES1 = dbuild/scripts/zmupdate.pl.1 +$(MANPAGES1): + # generate man page(s): + pod2man -s1 --stderr --utf8 $(patsubst %.1, %, $@) $@ + +## reproducible build: +LAST_CHANGE=$(shell dpkg-parsechangelog -S Date) +BUILD_DATE=$(shell LC_ALL=C date -u "+%B %d, %Y" -d "$(LAST_CHANGE)") +override_dh_installman: $(MANPAGES1) + $(MAKE) -C docs man SPHINXOPTS="-D today=\"$(BUILD_DATE)\"" + dh_installman --language=C $(MANPAGES1) + +override_dh_auto_install: + dh_auto_install --destdir=$(CURDIR)/debian/tmp + # remove worthless files: + $(RM) -v $(CURDIR)/debian/tmp/usr/share/perl5/*/*/*/.packlist + $(RM) -v $(CURDIR)/debian/tmp/usr/share/perl5/*/*.in + # remove empty directories: + find $(CURDIR)/debian/tmp/usr -type d -empty -delete -printf 'removed %p\n' + # remove extra-license-file: + $(RM) -v $(CURDIR)/debian/tmp/usr/share/zoneminder/www/api/lib/Cake/LICENSE.txt override_dh_fixperms: dh_fixperms - chown root:root debian/zoneminder/etc/zm/zm.conf + ## 637685 + chmod -c o-r $(CURDIR)/debian/zoneminder/etc/zm/zm.conf -override_dh_auto_test: - # do not run tests... +override_dh_installinit: + dh_installinit --no-start + +override_dh_systemd_start: + dh_systemd_start --no-start + +override_dh_systemd_enable: + dh_systemd_enable --no-enable + +override_dh_apache2: + dh_apache2 --noenable -.PHONY: override_dh_strip override_dh_strip: - dh_strip --dbg-package=zoneminder-dbg + [ -d "$(CURDIR)/debian/zoneminder-dbg" ] \ + && dh_strip --dbg-package=zoneminder-dbg \ + || dh_strip + +#%: +# dh $@ --parallel --buildsystem=autoconf --with autoreconf +# +#override_dh_auto_configure: +# dh_auto_configure -- \ +# --sysconfdir=/etc/zm \ +# --with-mysql=/usr \ +# --with-webdir=/usr/share/zoneminder \ +# --with-ffmpeg=/usr \ +# --with-cgidir=/usr/lib/cgi-bin \ +# --with-webuser=www-data \ +# --with-webgroup=www-data \ +# --enable-mmap=yes diff --git a/distros/ubuntu1204_cmake/source/format b/distros/ubuntu1504/source/format similarity index 100% rename from distros/ubuntu1204_cmake/source/format rename to distros/ubuntu1504/source/format diff --git a/distros/ubuntu1504_cmake/source/lintian-overrides b/distros/ubuntu1504/source/lintian-overrides similarity index 100% rename from distros/ubuntu1504_cmake/source/lintian-overrides rename to distros/ubuntu1504/source/lintian-overrides diff --git a/distros/ubuntu1504/watch b/distros/ubuntu1504/watch index 5a8a9c4d7..7ee690edb 100644 --- a/distros/ubuntu1504/watch +++ b/distros/ubuntu1504/watch @@ -1,3 +1,7 @@ version=3 -http://www.zoneminder.com/downloads.html \ - .*/ZoneMinder-(.*).tar.gz + +opts=\ +repacksuffix=+dfsg,\ +dversionmangle=s{\+dfsg\d*}{},\ + https://github.com/ZoneMinder/ZoneMinder/releases \ + .*/ZoneMinder/archive/v(.*).tar.gz diff --git a/distros/ubuntu1504_cmake/zoneminder-doc.doc-base b/distros/ubuntu1504/zoneminder-doc.doc-base similarity index 100% rename from distros/ubuntu1504_cmake/zoneminder-doc.doc-base rename to distros/ubuntu1504/zoneminder-doc.doc-base diff --git a/distros/ubuntu1504_cmake/zoneminder-doc.install b/distros/ubuntu1504/zoneminder-doc.install similarity index 100% rename from distros/ubuntu1504_cmake/zoneminder-doc.install rename to distros/ubuntu1504/zoneminder-doc.install diff --git a/distros/ubuntu1504_cmake/zoneminder-doc.links b/distros/ubuntu1504/zoneminder-doc.links similarity index 100% rename from distros/ubuntu1504_cmake/zoneminder-doc.links rename to distros/ubuntu1504/zoneminder-doc.links diff --git a/distros/ubuntu1504_cmake/zoneminder.apache2 b/distros/ubuntu1504/zoneminder.apache2 similarity index 100% rename from distros/ubuntu1504_cmake/zoneminder.apache2 rename to distros/ubuntu1504/zoneminder.apache2 diff --git a/distros/ubuntu1504_cmake/zoneminder.bug-presubj b/distros/ubuntu1504/zoneminder.bug-presubj similarity index 100% rename from distros/ubuntu1504_cmake/zoneminder.bug-presubj rename to distros/ubuntu1504/zoneminder.bug-presubj diff --git a/distros/ubuntu1504_cmake/zoneminder.dirs b/distros/ubuntu1504/zoneminder.dirs similarity index 100% rename from distros/ubuntu1504_cmake/zoneminder.dirs rename to distros/ubuntu1504/zoneminder.dirs diff --git a/distros/ubuntu1504_cmake/zoneminder.docs b/distros/ubuntu1504/zoneminder.docs similarity index 100% rename from distros/ubuntu1504_cmake/zoneminder.docs rename to distros/ubuntu1504/zoneminder.docs diff --git a/distros/ubuntu1504_cmake/zoneminder.examples b/distros/ubuntu1504/zoneminder.examples similarity index 100% rename from distros/ubuntu1504_cmake/zoneminder.examples rename to distros/ubuntu1504/zoneminder.examples diff --git a/distros/ubuntu1504_cmake/zoneminder.init b/distros/ubuntu1504/zoneminder.init similarity index 100% rename from distros/ubuntu1504_cmake/zoneminder.init rename to distros/ubuntu1504/zoneminder.init diff --git a/distros/ubuntu1504_cmake/zoneminder.install b/distros/ubuntu1504/zoneminder.install similarity index 100% rename from distros/ubuntu1504_cmake/zoneminder.install rename to distros/ubuntu1504/zoneminder.install diff --git a/distros/ubuntu1504_cmake/zoneminder.links b/distros/ubuntu1504/zoneminder.links similarity index 100% rename from distros/ubuntu1504_cmake/zoneminder.links rename to distros/ubuntu1504/zoneminder.links diff --git a/distros/ubuntu1504_cmake/zoneminder.linktrees b/distros/ubuntu1504/zoneminder.linktrees similarity index 100% rename from distros/ubuntu1504_cmake/zoneminder.linktrees rename to distros/ubuntu1504/zoneminder.linktrees diff --git a/distros/ubuntu1504_cmake/zoneminder.lintian-overrides b/distros/ubuntu1504/zoneminder.lintian-overrides similarity index 100% rename from distros/ubuntu1504_cmake/zoneminder.lintian-overrides rename to distros/ubuntu1504/zoneminder.lintian-overrides diff --git a/distros/ubuntu1504_cmake/zoneminder.logrotate b/distros/ubuntu1504/zoneminder.logrotate similarity index 100% rename from distros/ubuntu1504_cmake/zoneminder.logrotate rename to distros/ubuntu1504/zoneminder.logrotate diff --git a/distros/ubuntu1504_cmake/zoneminder.maintscript b/distros/ubuntu1504/zoneminder.maintscript similarity index 100% rename from distros/ubuntu1504_cmake/zoneminder.maintscript rename to distros/ubuntu1504/zoneminder.maintscript diff --git a/distros/ubuntu1504_cmake/zoneminder.manpages b/distros/ubuntu1504/zoneminder.manpages similarity index 100% rename from distros/ubuntu1504_cmake/zoneminder.manpages rename to distros/ubuntu1504/zoneminder.manpages diff --git a/distros/ubuntu1504_cmake/zoneminder.postinst b/distros/ubuntu1504/zoneminder.postinst similarity index 100% rename from distros/ubuntu1504_cmake/zoneminder.postinst rename to distros/ubuntu1504/zoneminder.postinst diff --git a/distros/ubuntu1504_cmake/zoneminder.postrm b/distros/ubuntu1504/zoneminder.postrm similarity index 100% rename from distros/ubuntu1504_cmake/zoneminder.postrm rename to distros/ubuntu1504/zoneminder.postrm diff --git a/distros/ubuntu1504_cmake/zoneminder.preinst b/distros/ubuntu1504/zoneminder.preinst similarity index 100% rename from distros/ubuntu1504_cmake/zoneminder.preinst rename to distros/ubuntu1504/zoneminder.preinst diff --git a/distros/ubuntu1504/zoneminder.service b/distros/ubuntu1504/zoneminder.service index 3ce608a49..e3575c039 100644 --- a/distros/ubuntu1504/zoneminder.service +++ b/distros/ubuntu1504/zoneminder.service @@ -1,16 +1,20 @@ # ZoneMinder systemd unit file - # This file is intended to work with all Linux distributions - [Unit] - Description=ZoneMinder CCTV recording and security system - After=network.target mysql.service apache2.service - Requires=mysql.service apache2.service - [Service] - User=www-data - Type=forking - ExecStart=/usr/bin/zmpkg.pl start - ExecReload=/usr/bin/zmpkg.pl restart - ExecStop=/usr/bin/zmpkg.pl stop - PIDFile="/run/zm/zm.pid" - [Install] - WantedBy=multi-user.target +# This file is intended to work with Debian distributions +[Unit] +Description=ZoneMinder CCTV recording and surveillance system +After=network.target mysql.service +# Remarked out so that it will start ZM on machines that don't have mysql installed +#Requires=mysql.service + +[Service] +#User=www-data +Type=forking +ExecStart=/usr/bin/zmpkg.pl start +ExecReload=/usr/bin/zmpkg.pl restart +ExecStop=/usr/bin/zmpkg.pl stop +PIDFile=/var/run/zm/zm.pid +Restart=on-abnormal + +[Install] +WantedBy=multi-user.target diff --git a/distros/ubuntu1504/zoneminder.tmpfile b/distros/ubuntu1504/zoneminder.tmpfile index 036883750..d307c6640 100644 --- a/distros/ubuntu1504/zoneminder.tmpfile +++ b/distros/ubuntu1504/zoneminder.tmpfile @@ -1,2 +1,2 @@ d /var/run/zm 0755 www-data www-data - +d /tmp/zm 0755 www-data www-data diff --git a/distros/ubuntu1504_cmake/README.Debian b/distros/ubuntu1504_cmake/README.Debian deleted file mode 100644 index 8182e0678..000000000 --- a/distros/ubuntu1504_cmake/README.Debian +++ /dev/null @@ -1,160 +0,0 @@ -Zoneminder for Debian ---------------------- - -Initializing database ---------------------- - - pv /usr/share/zoneminder/db/zm_create.sql | sudo mysql --defaults-file=/etc/mysql/debian.cnf -OR - cat /usr/share/zoneminder/db/zm_create.sql | sudo mysql --defaults-file=/etc/mysql/debian.cnf - - echo 'grant lock tables,alter,create,index,select,insert,update,delete on zm.* to 'zmuser'@localhost identified by "zmpass";'\ - | sudo mysql --defaults-file=/etc/mysql/debian.cnf mysql - -Hint: generate secure password with `pwgen` and update "/etc/zm/zm.conf" -accordingly. - -The following command can help to ensure that zoneminder can read its -configuration file: - - chgrp -c www-data /etc/zm/zm.conf - - -Upgrading database ------------------- - -Prior to 1.28.1 database upgrade was performed automatically. -"zoneminder" service will refuse to start with outdated database. - -Assuming that database is on "localhost" then the following command can be -used to upgrade "zm" database: - - zmupdate.pl - -Additional permissions may be required to perform upgrade: - - echo 'grant lock tables, create, alter on zm.* to 'zmuser'@localhost identified by "zmpass";'\ - | sudo mysql --defaults-file=/etc/mysql/debian.cnf mysql - -The following command prints the current version of zoneminder database: - - echo 'select Value from Config where Name = "ZM_DYN_CURR_VERSION";' \ - | sudo mysql --defaults-file=/etc/mysql/debian.cnf --skip-column-names zm - - -Enabling service ----------------- - -By default Zoneminder service is not starting automatically and need to be -manually activated once database is configured: - -On systemd: - - sudo systemctl enable zoneminder.service - -On SysV: - - sudo update-rc.d zoneminder enable - - -Web server set-up ------------------ - -There are few manual steps to get the web interface working: - -## Apache2 - -Apache can be configured as folder "/zm" using sample .conf: - - sudo a2enconf zoneminder - -Alternatively Apache web site configuration template can be used to setup -zoneminder as "http://zoneminder": - - sudo cp -v /usr/share/doc/zoneminder/examples/apache.conf /etc/apache2/sites-available/ - sudo a2ensite zoneminder.conf - -Common configuration steps for Apache2: - - sudo a2enmod cgi - sudo service apache2 reload - - -## nginx / fcgiwrap - -Nginx needs "php5-fpm" package to support PHP and "fcgiwrap" package -for binary "cgi-bin" applications: - - sudo apt-get install php5-fpm fcgiwrap - -To enable a URL alias that makes Zoneminder available from - - http://yourserver/zm - -the following line is to be added to "server" section of a web site -configuration: - - include /usr/share/doc/zoneminder/examples/nginx.conf; - -For "default" web site it would be sufficient to include the above -statement to the file - - /etc/nginx/sites-enabled/default - -To avoid problems with feeds from multiple cameras "fcgiwrap" should be -configured to start at least as many processes as there are cameras. -It can be done by adjusting DAEMON_OPTS in "/etc/default/fcgiwrap". -Systemd users may be affected by the following bug: - - http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=792705 - - -## Note: - -When Zoneminder web site is running it may be necessary to set -Options/Paths/PATH_ZMS to "/zm/cgi-bin/nph-zms" or according to chosen web -site configuration. - - -Changing the location for images and events -------------------------------------------- - -Zoneminder, in its upstream form, stores data in /usr/share/zoneminder/. This -package modifies that by changing /usr/share/zoneminder/images and -/usr/share/zoneminder/events to symlinks to directories under -/var/cache/zoneminder. - -There are numerous places these could be put and ways to do it. But, at the -moment, if you change this, an upgrade will fail with a warning about these -locations having changed (the reason for this was that previously, an upgrade -would silently revert the changes and cause event loss - refer -bug #608793). - -If you do want to change the location, here are a couple of suggestions. -(thanks to vagrant@freegeek.org): - -These lines in fstab could allow you to bind-mount an alternate location - - /dev/sdX1 /otherdrive ext3 defaults 0 2 - /otherdrive/zoneminder/images /var/cache/zoneminder/images bind defaults 0 2 - /otherdrive/zoneminder/events /var/cache/zoneminder/events bind defaults 0 2 - - or if you have a separate partition for each: - - /dev/sdX1 /var/cache/zoneminder/images ext3 defaults 0 2 - /dev/sdX2 /var/cache/zoneminder/events ext3 defaults 0 2 - - -- Peter Howard , Sun, 16 Jan 2010 01:35:51 +1100 - -Access to /dev/video* ---------------------- - -For cameras which require access to /dev/video*, zoneminder may need the -www-data user added to the video group in order to see those cameras: - - adduser www-data video - -Note that all web applications running on the zoneminder server will then have -access to all video devices on the system. - - -- Vagrant Cascadian Sun, 27 Mar 2011 13:06:56 -0700 diff --git a/distros/ubuntu1504_cmake/changelog b/distros/ubuntu1504_cmake/changelog deleted file mode 100644 index 74cf1d0b8..000000000 --- a/distros/ubuntu1504_cmake/changelog +++ /dev/null @@ -1,573 +0,0 @@ -zoneminder (1.28.1+1-vivid-SNAPSHOT2015081701) vivid; urgency=medium - - * include api, switch to cmake build - - -- Isaac Connor Mon, 17 Aug 2015 10:29:23 -0400 - - -zoneminder (1.28.1-8) unstable; urgency=medium - - * Patchworks: - + New upstream "980-fix-image-size.patch". - + New "default_cgi-path.patch" to correct default ZM_PATH_ZMS. - * postinst: set "root" as group owner for "/var/log/zm" to silence - logrotate warnings. - * Minor correction to README.Debian. - - -- Dmitry Smirnov Sun, 16 Aug 2015 19:19:50 +1000 - -zoneminder (1.28.1-7) unstable; urgency=medium - - * Build-Depends += "cakephp (<< 3.0.0~)"; - Zoneminder is not compatible with latest CakePHP. - * Handle conffile removal from maintscript. - * rules: build man pages reproducibly. - * gbp.conf: renamed old style config section [git-dch] to [dch]. - * README - + added instructions to update owner of the "/etc/zm/zm.conf" - (Closes: #789327). - + zmupdate.pl needs CREATE rights. - + added note about required number of "fcgiwrap" workers. - * New upstream patch: "zmtrigger-plus.patch". - - -- Dmitry Smirnov Mon, 20 Jul 2015 16:30:15 +1000 - -zoneminder (1.28.1-6) unstable; urgency=low - - * New "zoneminder-doc" and "zoneminder-dbg" packages. - - -- Dmitry Smirnov Sun, 19 Apr 2015 14:50:41 +1000 - -zoneminder (1.28.1-5) unstable; urgency=low - - * Move handling of "/var/run/zm" and "/tmp/zm" from .service into .tmpfile. - Let dh_installinit do the job. Thanks, Andrew Bauer. - * Use dh_apache2 to install Apache conf file; remove old conf and symlink. - * Promote "libapache2-mod-php5 | php5-fpm" to Recommends. - * Build-Depends: - + dh-linktree - + cakephp (>= 2.6.3) - + libjs-jquery - + libjs-mootools - * Depends: - - libjs-jquery - - libjs-mootools - * Build-time replace bundled CakePHP with system one using "dh-linktree". - * Use "dh-linktree" to handle mootools and jquery symlinks. - - -- Dmitry Smirnov Sun, 19 Apr 2015 11:45:01 +1000 - -zoneminder (1.28.1-4) unstable; urgency=low - - * New patch to fix HTML export with USE_DEEP_STORAGE (closes: #723706). - * New "783.patch" to describe potential data loss in ZM_USE_DEEP_STORAGE. - * New patch to change default date format to region-neutral ISO notation - with time zone. - * Build sphinx documentation: - + Install "zoneminder.1" man page. - + Build-Depends += "python-sphinx | python3-sphinx" - + Added commented "zoneminder-doc" package. - + Added "docs.patch" to unlink distro-specific installation docs. - * rules: - + set ZM_CONTENTDIR, ZM_SOCKDIR and ZM_TMPDIR. - + remove mistakengly installed Perl module templates. - * Updated startup scripts to create ZM_TMPDIR. - * Hurd improvements: - + New patch to add PATH_MAX definitions. - + Build without MMAP support on Hurd. - + libsys-mmap-perl [!hurd-any]. - - -- Dmitry Smirnov Mon, 06 Apr 2015 18:18:55 +1000 - -zoneminder (1.28.1-3) unstable; urgency=low - - * Updated Apache2 and nginx configuration templates to support CGI. - * Updated README.Debian to document cgi-bin setup. - * Removed "/usr/share/zoneminder/www/cgi-bin" symlink. - * Added "apache2.patch" to correct Apache2 site configuration example. - * control: Suggests += "fcgiwrap". - * rules: added dh_systemd overrides to prevent automatic service - activation and start. - * Added note about manual service activation to README.Debian - (Closes: #781733). - - -- Dmitry Smirnov Thu, 02 Apr 2015 23:20:20 +1100 - -zoneminder (1.28.1-2) unstable; urgency=low - - * Removed word "Linux" from short package description. - * Build-Depends: do not require "libv4l-dev" on Hurd i.e. [!hurd-any]. - * Added run-time Perl Depends: - + libdbd-mysql-perl - + libimage-info-perl - + libmodule-load-conditional-perl - + libnet-sftp-foreign-perl - + liburi-encode-perl - * Prepare for package split: added commented "libzoneminder-perl" - and "zoneminder-dbg" packages to "debian/control". - * rules: do not install worthless ".packlist" file. - * Updated "libv4l1-videodev.h.patch" to fix v4lv1 detection in CMake. - - -- Dmitry Smirnov Thu, 02 Apr 2015 13:25:19 +1100 - -zoneminder (1.28.1-1) unstable; urgency=low - - [ Dmitry Smirnov ] - * New upstream release [February 2015]. - * Upload to unstable. - * Disabled automatic database upgrades: post(inst|rm) scripts no longer - touch database or do unexpected stuff (Closes: #779254). - See README.Debian for details. - * Updated installation paths: - + /usr/share/zoneminder --> /usr/share/zoneminder/www - + /usr/lib/cgi-bin --> /usr/lib/zoneminder/cgi-bin - * Added logrotate config (Closes: #544826). - Thanks, Alberto Reyes. - * Native systemd service; "--with systemd" added to dh. - * Build with CMake instead of autoconf; rules clean-up. - * Build with all hardening. - * Build and install "zmupdate.pl.1" man page. - * Added nginx/php5-fpm configuration example. - * Install upstream "apache.conf" example. - * Described setup of Zoneminer web site and database in README.Debian. - * Install "/etc/zm/zm.conf" with tighter permissions. - * Added TODO.Debian. - * Added "debian/clean"; "debian/gbp.conf"; bug-presubj. - * Remove bundled Cake tests to take ~5 MB off big-usr-share. - * Standards-Version: 3.9.6; compat/debhelper to version 9. - * Vcs links to new git repository at collab-maint. - * Build-Depends: - + dh-systemd - + libgcrypt11-dev --> libgcrypt-dev - + libcurl4-gnutls-dev - + libvlc-dev - + policykit-1 (required by "zmsystemctl.pl") - - dh-autoreconf, autoconf, automake - * Depends: - - apache2 - - libapache2-mod-php5 (moved to Suggests) - - libpcre3 (invalid) - - libmodule-load-perl (obsolete; replaced with perl-modules) - - libarchive-tar-perl (obsolete; replaced with perl-modules) - - mysql-server (moved to Recommends, Closes: #759504). - - php5 - + libav-tools - + libjs-jquery (replaces bundled component) - + libjs-mootool (replaces bundled component) - + libjson-any-perl (Closes: #690803). - + perl-modules (Closes: #745819). - * Recommends: - + apache2 | httpd - + mysql-server | virtual-mysql-server (Closes: #732874). - * Suggests: - + libapache2-mod-php5 | php5-fpm - + logrotate - * Refreshed, renamed and re-ordered patches; added DEP-3 headers. - * Removed "vendor_perl" patch (applied-upstream). - * New patches: - + cmake-fix-confpath.patch - + cmake-gnutls.patch - + cmake-nossl.patch - + cmake.patch - + format-hardening.patch - + pod_man_fixes.patch - + pod_name_fixes.patch - + pod_zmupdate-to-pod2usage.patch - * Lintianisation (incomplete): - - extra-license-file - - init.d-script-missing-lsb-description - - init.d-script-does-not-source-init-functions - - privacy-breach-generic - - package-contains-empty-directory - - manpage-has-errors-from-pod2man - - manpage-has-bad-whatis-entry - - quilt-patch-missing-description - - no-dep5-copyright - * Lintian-overrides: - + unusual-interpreter usr/bin/zmsystemctl.pl #!/usr/bin/pkexec - + script-not-executable usr/share/zoneminder/www/api/* - + script-with-language-extension usr/bin/*.pl - + source-is-missing web/tools/mootools/mootools-*-yc.js - + source-is-missing web/skins/*/js/jquery-1.4.2.min.js - + source-contains-prebuilt-javascript-object - * Renamed files in "debian". - * watch: dfsg repacksuffix and dversionmangle. - * "debian/copyright" to Copyright-Format-1.0. - * Set myself as new Maintainer (Closes: #760314). - - [ Vagrant Cascadian ] - * Removed obsolete DM-Upload-Allowed flag. - * Update debian/watch to use tarballs from github. - * Add Build-Depends on libgcrypt11-dev (Closes: #745819). - * Use canonical alioth Vcs-Hg URL. - * debian/control: Add Build-Depends: libpolkit-gobject-1-dev. - * Removed configure flag "--enable-crashtrace=no", which is no longer - present upstream. - - -- Dmitry Smirnov Tue, 31 Mar 2015 15:11:13 +1100 - -zoneminder (1.26.5-3.1) experimental; urgency=low - - * Non-maintainer upload. - * Add libav10.patch and compile against libav10 (Closes: #739461) - - -- Reinhard Tartler Wed, 19 Mar 2014 00:31:22 +0000 - -zoneminder (1.26.5-3) unstable; urgency=low - - - * Previous release still didn't build on PPC - this has been corrected. - (Closes: #736516) - - -- Peter Howard Tue, 4 Feb 2014 02:02:10 +1000 - -zoneminder (1.26.5-2) unstable; urgency=low - - * Remove dependency on ffmpeg - (Closes: #721161) - - * Builds again on non-x86 target architectures. - - -- Peter Howard Thu, 23 Jan 2014 01:02:10 +1000 - -zoneminder (1.26.5-1) unstable; urgency=low - - * New upstream version - (Closes: #694131) - * Change Build-Depends on libgnutls-dev to libgnutls-openssl-dev - (Closes: #731560) - -- Peter Howard Tue, 17 Dec 2013 01:02:10 +1000 - -zoneminder (1.25.0-4) unstable; urgency=high - - * Add CVE-2013-0232 patch - [SECURITY] CVE-2013-0232: Shell escape commands with untrusted content. - Thanks to James McCoy (Closes: #698910) - Thanks also to Salvatore Bonaccorso - - -- Peter Howard Tue, 12 Jun 2013 12:02:10 +1000 - -zoneminder (1.25.0-3) unstable; urgency=low - - * debian/rules: Export CFLAGS, CPPFLAGS, CXXFLAGS and LDFLAGS, to ensure - hardening build flags are enabled. - - -- Vagrant Cascadian Tue, 28 Aug 2012 12:10:03 -0700 - -zoneminder (1.25.0-2) unstable; urgency=low - - [ Vagrant Cascadian ] - * Add a patch to disable checking for updated versions by default, as - upgrades should happen through package management. - * Use dpkg-buildflags in debian/rules to set default compiler flags. - * Ensure zoneminder is stopped before starting (Closes: #657407). - - [ Peter Howard ] - * Fix postinst to add permission for table creation during upgrade - (Closes: #657407). - - -- Vagrant Cascadian Thu, 23 Aug 2012 12:40:34 -0700 - -zoneminder (1.25.0-1.1) unstable; urgency=low - - * Non-maintainer upload. - * Fix "ftbfs with GCC-4.7": add patch Fix-FTBFS-with-gcc-4.7 from Cyril - Brulebois: fix missing includes. - (Closes: #667428) - - -- gregor herrmann Sun, 13 May 2012 17:02:21 +0200 - -zoneminder (1.25.0-1) unstable; urgency=low - - * Fix typo in libv4l1-videodev.h patch that caused v4l1 support to be - dropped. - * Fail to build if version in postinst doesn't match upstream version. - * Add Build-Depends: libavdevice-dev to fix MPEG streaming (Closes: #515558). - * debian/rules: Convert to using debhelper overrides. - * Set debian/compat to 7. - * Simplify debian/watch file. - * Refresh debian/patches/use_libjs-mootools. - * Refresh debian/patches/libv4l1-videodev.h. - * Remove dependencies on php4 and related packages. - * Remove build-dependencies on libmysqlclient14-dev and - libmysqlclient15-dev. - * Update Build-Depends to use libjpeg-dev instead of libjpeg62-dev - (Closes: #647114). - * Add patch to fix build by testing for C headers rather than C++ headers. - Thanks to Ryan Niebur. (Closes: #654230) - * Add a patch to fix build problems caused by API changes in libav 0.8. - Thanks again to Ryan Niebur. (Closes: #654230) - - -- Vagrant Cascadian Mon, 16 Jan 2012 11:58:05 -0800 - -zoneminder (1.24.4-1) unstable; urgency=low - - [ Peter Howard ] - * Initial release of 1.24.4 (Closes: #634985). - - Fix 32/64-bit type declarations (Closes: #614404). - * Update patches. - - [ Vagrant Cascadian ] - * Add patch to fix FTBFS by using libv4l1-videodev.h from libv4l-dev. - Thanks to Andreas Metzler for reporting the issue. - (Closes: #619813). - * Document adding the www-data user to the video group in README.Debian. - (Closes: #611324) - * Depend on libsys-mmap-perl to enable mapped memory support. - (Closes: #607331) - * Update libjs-mootools patch to use -nc variants (Closes: #635075). - * Depend on javascript-common, to ensure that /javascript is available in - the web server. - * Set the upstream version in postinst at build time. - * Use dh-autoreconf to properly clean up autogenerated files during build. - * Add Vcs-HG to debian/control. - * Add Build-Depends: libv4l-dev, libbz2-dev, dh-autoreconf, libsys-mmap-perl. - - -- Vagrant Cascadian Sun, 24 Jul 2011 16:44:30 +0200 - -zoneminder (1.24.2-9) unstable; urgency=low - - * Apply patch from Ubuntu to fix FTBFS with ffmpeg 0.6: - - Add -D__STDC_CONSTANT_MACROS to CPPFLAGS (closes: 614080). - * Update Standards-Version to 3.9.1, no changes necessary. - - -- Vagrant Cascadian Sun, 20 Feb 2011 23:43:02 -0800 - -zoneminder (1.24.2-8) unstable; urgency=medium - - [ Vagrant Cascadian ] - * Apply patch to fix V4L2 cameras without crop support (closes: #608790). - Thanks to piratebab. - * Add preinst script which aborts if dangerous symlinks exist. - (closes: #608793) - - [ Peter Howard ] - * Added to README.Debian with info about images and events directories. - (closes: #608793) - - -- Vagrant Cascadian Sat, 15 Jan 2011 19:39:26 -0800 - -zoneminder (1.24.2-7) unstable; urgency=medium - - * Do not set ownership of /var/cache/zoneminder when upgrading, which fixes a - regression causing upgrades to take inordinately long with large - installations (closes: #597040). - - -- Vagrant Cascadian Fri, 17 Sep 2010 11:24:41 -0700 - -zoneminder (1.24.2-6) unstable; urgency=low - - * Only remove database on purge. This requires only creating the database if - it doesn't already exist, and upgrading the database only if the database - is an older version (closes: #497107). - - * Do not prompt the user on database upgrades by using the --nointeractive - flag when calling zmupdate.pl from postinst (closes: #595902). - - -- Vagrant Cascadian Fri, 10 Sep 2010 10:06:06 -0700 - -zoneminder (1.24.2-5) unstable; urgency=low - - [ Peter Howard ] - * Add zip dependency - (closes: #494261) - * Add debian/watch file - (closes: #545552) - * Use packaged libjs-mootools - (closes: #585590) - * Miscellaneous cleanups - - [ Vagrant Cascadian ] - * Add vagrant@debian.org as uploader - * Update Standards-Version to 3.9.0, no changes necessary. - - -- Vagrant Cascadian Fri, 23 Jul 2010 18:12:50 -0500 - -zoneminder (1.24.2-4.1) unstable; urgency=low - - * Non-maintainer upload. - * Fix "package removed, processes still running": apply patch to - debian/postinst by Vagrant Cascadian: use invoke-rc.d and run - mysql-related actions only when mysql is running (closes: #583648). - - -- gregor herrmann Thu, 01 Jul 2010 19:47:10 +0200 - -zoneminder (1.24.2-4) unstable; urgency=high - * Update init.d to list mysql dependency - (closes: #583505) - * Change depenency from libmime-perl to libmime-tools-perl - (closes: #585589) - * Problems in changelog format fixed - (closes: #585592) - * Fix debian-rules-ignores-make-clean-error - (closes: #585593) - -- Peter Howard Mon, 14 jun 2010 15:02:10 +1000 - -zoneminder (1.24.2-3) unstable; urgency=high - * Changes symbols to build with libjpeg8 - (closes: #565326, #568327) - * Note: location of all perl files should have been fixed in previous release - (closes: #553096) - -- Peter Howard Mon, 26 apr 2010 15:02:10 +1000 - -zoneminder (1.24.2-2) unstable; urgency=high - - * Remove custom perl parth from zmpkg.pl, fix location of manpages. - (closes: #551746, #553092) - * Fix GCC4.4 bug - (closes: #531717) - * Fix potential bug in postinst script - - -- Peter Howard Sat, 14 Nov 2009 15:02:10 +1000 - -zoneminder (1.24.2-1) unstable; urgency=high - - * Initial release of zoneminder 1.24.2 - -- Peter Howard Fri, 11 Sep 2009 07:02:50 +1000 - -zoneminder (1.24.1-1) unstable; urgency=high - - * Initial release of zoneminder 1.24.1, closing CVE-2008-3882, - CVE-2008-3881, CVE-2008-3880 - (closes: #497640) - * Change syslog dependency to rsyslog. - (closes: #526918) - * Add missing perl depenency. - * Restore patch to disable "check for updates" by default. - * Removed spurious '$' in init script. - (closes: #486064) - * Change permission of zm.conf from 0600 to 0400 for CVE-2008-6755 - (closes: #528252) - -- Peter Howard Sat, 16 May 2009 07:02:50 +1000 - -zoneminder (1.23.3-4) unstable; urgency=high - - * update to get it building with latest unstable. Thanks to waldi@debian.org - (closes: #517569) - -- Peter Howard Thu, 16 Apr 2009 01:02:50 +1000 - -zoneminder (1.23.3-3) unstable; urgency=high - - * ffmpeg confirmed working - (closes: #475145) - * Fix upgrade problem intrudouced in 1.23.3-1 - (closes: #481637) - * Include libmime-lite-perl in dependencies - (closes: #486312) - -- Peter Howard Thu, 18 Sep 2008 01:02:50 +1000 - -zoneminder (1.23.3-2) unstable; urgency=high - - * ffmpeg finally working? - - -- Peter Howard Wed, 13 Aug 2008 01:02:50 +1000 - -zoneminder (1.23.3-1) unstable; urgency=high - - * Initial version for 1.23.3 - security fix. - (closes: #479034) - - -- Peter Howard Wed, 19 Mar 2008 01:02:50 +1000 - -zoneminder (1.23.2-2) unstable; urgency=low - - * Update to init.d - (closes: #468856) - * Add dependency on logging daemon - (closes: #471277) - - -- Peter Howard Wed, 19 Mar 2008 01:02:50 +1000 - -zoneminder (1.23.2-1) unstable; urgency=low - - * Initial version for 1.23.2 - (closes: #464152) - * Zoneminder 1.23.2 upstream includes fix for GCC 4.3 - (closes: #454980) - * Includes ffmpeg patch by Alexander Kushnirenko - - -- Peter Howard Sat, 01 Mar 2008 16:02:50 +1000 - -zoneminder (1.22.3-10) unstable; urgency=low - - * Fix bug introduced in -9 where perl is put under /usr/local - (closes: #457507) - - -- Peter Howard Mon, 24 Dec 2007 16:02:50 +1000 - -zoneminder (1.22.3-9) unstable; urgency=low - - * Starting zoneminder via init script now invokes "zmfix -a" - (closes: #481637) - * Change apache2-mpm-prefork dependency to apache2 - * Temp dir for export under /var/cache/zoneminder (but linked back to - /usr/share/zoneminder for now) - * Redo use of gnutls rather than openssl for md5 hashes - - -- Peter Howard Mon, 10 Dec 2007 16:02:50 +1000 - -zoneminder (1.22.3-8) unstable; urgency=low - - * Build now includes libpcre3 - (closes: #437533) - * "Monitor Presets" patch now applied to package during build. - - -- Peter Howard Sat, 18 Aug 2007 14:35:23 +1000 - -zoneminder (1.22.3-7) unstable; urgency=low - - * Turn off debug trace and crash dump on build - (closes:#414857,#414891) - * Additional perl libraries added in dependencies - (closes:#416291) - * Change preferred PHP version from 4 to 5 - -- Peter Howard Sun, 29 Jul 2007 15:11:13 +1000 - -zoneminder (1.22.3-6) unstable; urgency=low - - * Removed a similar bash only statement from zmpkg.pl - (closes:414882) - - -- Peter Howard Sat, 14 Apr 2007 11:46:56 +1000 - -zoneminder (1.22.3-5) unstable; urgency=low - - * Installs with "phone home" feature turned off by default, and permissions - on /etc/zm/zm.conf fixed (now the 0600 it s hould be) - (closes:415349) - * Removed "stupid bash-ism" on mysqld check in postinst file. - - -- Peter Howard Fri, 6 Apr 2007 15:50:00 +1000 - -zoneminder (1.22.3-4) unstable; urgency=low - - * Put libmysqlclient-15-dev in front of -14-dev so sbuild works - (closes: #414410) - - -- Peter Howard Mon, 12 Mar 2007 11:38:56 +1100 - -zoneminder (1.22.3-3) unstable; urgency=low - - * Clean up of postinstall, postrm ; user "zm" definitely was a mistake - * Also in postinstall: check and start MySQL if it's not running. - * init.d script now checks if zoneminder isn't running and still returns 0 - (which helps uninstalling) - * Addition of php5 dependency options as well as php4. - - -- Peter Howard Mon, 26 Feb 2007 10:40:52 +1100 - -zoneminder (1.22.3-2) unstable; urgency=low - - * Added zmuser in the mysql creation; this should fix the install problem - for people, but needs to be cleaned up (in -3) - - -- Peter Howard Fri, 16 Feb 2007 14:16:03 +1100 - -zoneminder (1.22.3-1) unstable; urgency=low - - * Initial Version. (closes: #248393) - * Patched out use of openssl; uses gnutls instead for MD5 hashes. - * Removed MakeMaker-inserted Perl licensing (with authors permission) in - various scripts; replaced with GPL. - - -- Peter Howard Wed, 7 Feb 2007 14:09:01 +1100 diff --git a/distros/ubuntu1504_cmake/compat b/distros/ubuntu1504_cmake/compat deleted file mode 100644 index ec635144f..000000000 --- a/distros/ubuntu1504_cmake/compat +++ /dev/null @@ -1 +0,0 @@ -9 diff --git a/distros/ubuntu1504_cmake/control b/distros/ubuntu1504_cmake/control deleted file mode 100644 index 50dee74c6..000000000 --- a/distros/ubuntu1504_cmake/control +++ /dev/null @@ -1,146 +0,0 @@ -Source: zoneminder -Section: net -Priority: optional -Maintainer: Dmitry Smirnov -Uploaders: Vagrant Cascadian -Build-Depends: debhelper (>= 9), dh-systemd, python-sphinx | python3-sphinx, apache2-dev, dh-linktree - ,cmake - ,libavcodec-ffmpeg-dev, libavformat-ffmpeg-dev, libswscale-ffmpeg-dev, libavutil-ffmpeg-dev, libavdevice-ffmpeg-dev - ,libbz2-dev - ,libgcrypt-dev - ,libcurl4-gnutls-dev - ,libgnutls-openssl-dev - ,libjpeg-dev - ,libmysqlclient-dev - ,libpcre3-dev - ,libpolkit-gobject-1-dev - ,libv4l-dev (>= 0.8.3) [!hurd-any] - ,libvlc-dev - ,libdate-manip-perl - ,libdbd-mysql-perl - ,libphp-serialization-perl - ,libsys-mmap-perl [!hurd-any] - ,libwww-perl -# Unbundled (dh_linktree): - ,libjs-jquery - ,libjs-mootools -Standards-Version: 3.9.6 -Homepage: http://www.zoneminder.com/ -Vcs-Browser: http://anonscm.debian.org/cgit/collab-maint/zoneminder.git -Vcs-Git: git://anonscm.debian.org/collab-maint/zoneminder.git - -Package: zoneminder -Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends}, ${perl:Depends} - ,javascript-common - ,libav-tools - ,libdate-manip-perl - ,libdbd-mysql-perl - ,libmime-lite-perl - ,libmime-tools-perl - ,libphp-serialization-perl - ,libmodule-load-conditional-perl - ,libnet-sftp-foreign-perl - ,libarchive-zip-perl - ,libdbd-mysql-perl - ,libdevice-serialport-perl - ,libimage-info-perl - ,libjson-any-perl - ,libsys-mmap-perl [!hurd-any] - ,liburi-encode-perl - ,libwww-perl - ,libdata-dump-perl - ,libclass-std-fast-perl - ,libsoap-wsdl-perl - ,libio-socket-multicast-perl - ,libdigest-sha-perl - ,libsys-cpu-perl, libsys-meminfo-perl - ,mysql-client | virtual-mysql-client - ,perl-modules - ,php5-mysql - ,policykit-1 - ,rsyslog | system-log-daemon - ,zip -Recommends: ${misc:Recommends} - ,libapache2-mod-php5 | php5-fpm - ,mysql-server | virtual-mysql-server - ,zoneminder-doc (>= ${source:Version}) -Suggests: fcgiwrap, logrotate -Description: video camera security and surveillance solution - ZoneMinder is intended for use in single or multi-camera video security - applications, including commercial or home CCTV, theft prevention and child - or family member or home monitoring and other care scenarios. It - supports capture, analysis, recording, and monitoring of video data coming - from one or more video or network cameras attached to a Linux system. - ZoneMinder also support web and semi-automatic control of Pan/Tilt/Zoom - cameras using a variety of protocols. It is suitable for use as a home - video security system and for commercial or professional video security - and surveillance. It can also be integrated into a home automation system - via X.10 or other protocols. - -#Package: libzoneminder-perl -#Section: perl -#Architecture: all -#Multi-Arch: foreign -#Depends: ${misc:Depends}, ${perl:Depends} -# ,libarchive-zip-perl -# ,libdbd-mysql-perl -# ,libdevice-serialport-perl -# ,libimage-info-perl -# ,libjson-any-perl -# ,libsys-mmap-perl [!hurd-any] -# ,liburi-encode-perl -# ,libwww-perl -#Description: ZoneMinder Perl libraries -# ZoneMinder is intended for use in single or multi-camera video security -# applications, including commercial or home CCTV, theft prevention and child -# or family member or home monitoring and other care scenarios. It -# supports capture, analysis, recording, and monitoring of video data coming -# from one or more video or network cameras attached to a Linux system. -# ZoneMinder also support web and semi-automatic control of Pan/Tilt/Zoom -# cameras using a variety of protocols. It is suitable for use as a home -# video security system and for commercial or professional video security -# and surveillance. It can also be integrated into a home automation system -# via X.10 or other protocols. -# . -# This package provides ZoneMinder Perl libraries; it can be used to -# write custom interfaces as well. - -Package: zoneminder-doc -Section: doc -Architecture: all -Multi-Arch: foreign -Depends: ${misc:Depends}, ${sphinxdoc:Depends}, python-sphinx-rtd-theme | python3-sphinx-rtd-theme -Suggests: www-browser -Description: ZoneMinder documentation - ZoneMinder is intended for use in single or multi-camera video security - applications, including commercial or home CCTV, theft prevention and child - or family member or home monitoring and other care scenarios. It - supports capture, analysis, recording, and monitoring of video data coming - from one or more video or network cameras attached to a Linux system. - ZoneMinder also support web and semi-automatic control of Pan/Tilt/Zoom - cameras using a variety of protocols. It is suitable for use as a home - video security system and for commercial or professional video security - and surveillance. It can also be integrated into a home automation system - via X.10 or other protocols. - . - This package provides ZoneMinder documentation in HTML format. - -Package: zoneminder-dbg -Section: debug -Priority: extra -Architecture: any -Depends: zoneminder (= ${binary:Version}), ${misc:Depends} -Description: Zoneminder -- debugging symbols - ZoneMinder is intended for use in single or multi-camera video security - applications, including commercial or home CCTV, theft prevention and child - or family member or home monitoring and other care scenarios. It - supports capture, analysis, recording, and monitoring of video data coming - from one or more video or network cameras attached to a Linux system. - ZoneMinder also support web and semi-automatic control of Pan/Tilt/Zoom - cameras using a variety of protocols. It is suitable for use as a home - video security system and for commercial or professional video security - and surveillance. It can also be integrated into a home automation system - via X.10 or other protocols. - . - This package provides debugging symbols diff --git a/distros/ubuntu1504_cmake/copyright b/distros/ubuntu1504_cmake/copyright deleted file mode 100644 index c48025a25..000000000 --- a/distros/ubuntu1504_cmake/copyright +++ /dev/null @@ -1,174 +0,0 @@ -Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ -Upstream-Name: ZoneMinder -Upstream-Contact: Philip Coombes -Source: https://github.com/ZoneMinder/ZoneMinder -Comment: - This package was originally debianized by matrix - on Mon, 7 Mar 2005 02:07:57 -0500. - It was re-done for submission to the Debian project by Peter Howard - on Fri, 8 Dec 2006 10:19:43 +1100 -Files-Excluded: - web/skins/*/js/jquery-* - web/tools/mootools/*-yc.js - -Files: * -Copyright: 2001-2014 Philip Coombes - 2008 Brian Rudy - 2014 Vincent Giovannone - 2013 Tim Craig - 2003-2008 Corey DeLasaux - 2001-2010 Chris Kistner -License: GPL-2+ - -Files: distros/* -Copyright: 2001-2008 Philip Coombes - 2014 Isaac Connor - 2005 Serg Oskin -License: GPL-2+ - -Files: web/skins/*/js/jquery-* -Copyright: 2010 John Resig - 2010 The Dojo Foundation -License: GPL-2 or Expat -Comment: - Dual licensed under the MIT or GPL Version 2 licenses. - http://jquery.org/license - . - Includes Sizzle.js http://sizzlejs.com/ - Released under the MIT, BSD, and GPL Licenses. - -Files: web/tools/mootools/*.js -Copyright: 2009 Marcelo Jorge Vieira (metal) - 2006-2010 Valerio Proietti (http://mad4milk.net/) -License: Expat - -Files: web/api/* -Copyright: 2005-2013 Cake Software Foundation, Inc. (http://cakefoundation.org) -License: Expat - -Files: - cmake/Modules/CheckPrototypeDefinition*.cmake - cmake/Modules/FindGLIB2.cmake - cmake/Modules/FindPolkit.cmake - cmake/Modules/GNUInstallDirs.cmake -Copyright: - 2005-2011 Kitware, Inc. - 2010-2011 Andreas Schneider - 2009 Dario Freddi - 2008 Laurent Montel, - 2011 Nikita Krupen'ko -License: BSD-3-clause - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - . - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - . - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - . - * The names of Kitware, Inc., the Insight Consortium, or the names of - any consortium members, or of any contributors, may not be used to - endorse or promote products derived from this software without - specific prior written permission. - . - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -Files: cmake/Modules/FindPerlModules.cmake -Copyright: 2012 Iowa State University -License: Boost-1.0 - Boost Software License - Version 1.0 - August 17th, 2003 - . - Permission is hereby granted, free of charge, to any person or organization - obtaining a copy of the software and accompanying documentation covered by - this license (the "Software") to use, reproduce, display, distribute, - execute, and transmit the Software, and to prepare derivative works of the - Software, and to permit third-parties to whom the Software is furnished to - do so, all subject to the following: - . - The copyright notices in the Software and this entire statement, including - the above license grant, this restriction and the following disclaimer, - must be included in all copies of the Software, in whole or in part, and - all derivative works of the Software, unless such copies or derivative - works are solely in the form of machine-executable object code generated by - a source language processor. - . - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT - SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE - FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - -Files: debian/* -Copyright: 2015 Dmitry Smirnov - 2007-2014 Peter Howard - 2010-2012 Vagrant Cascadian - 2001-2008 Philip Coombes -License: GPL-2+ - -License: Expat - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - . - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - . - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - -License: GPL-2+ - This package 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 package 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 package; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - . - The complete text of the GNU General Public License version 2 - can be found in "/usr/share/common-licenses/GPL-2". - -License: GPL-2 - This package 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; version 2 of the License. - . - This package 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 package; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - . - The complete text of the GNU General Public License version 2 - can be found in "/usr/share/common-licenses/GPL-2". diff --git a/distros/ubuntu1504_cmake/patches/series b/distros/ubuntu1504_cmake/patches/series deleted file mode 100644 index fc70f4006..000000000 --- a/distros/ubuntu1504_cmake/patches/series +++ /dev/null @@ -1,2 +0,0 @@ -default_cgi-path.patch -use_libjs-mootools.patch diff --git a/distros/ubuntu1504_cmake/rules b/distros/ubuntu1504_cmake/rules deleted file mode 100755 index bf8012aa8..000000000 --- a/distros/ubuntu1504_cmake/rules +++ /dev/null @@ -1,93 +0,0 @@ -#!/usr/bin/make -f -# -*- makefile -*- - -# Uncomment this to turn on verbose mode. -#export DH_VERBOSE=1 - -export DEB_BUILD_MAINT_OPTIONS = hardening=+all -export DEB_LDFLAGS_MAINT_APPEND += -Wl,--as-needed - -ifeq ($(DEB_BUILD_ARCH_OS),hurd) -ARGS:= -DZM_NO_MMAP=ON -endif - -%: - dh $@ --parallel --buildsystem=cmake --builddirectory=dbuild \ - --with systemd,sphinxdoc,apache2,linktree - -override_dh_auto_configure: - dh_auto_configure -- $(ARGS) \ - -DCMAKE_VERBOSE_MAKEFILE=ON \ - -DCMAKE_BUILD_TYPE=Release \ - -DZM_CONFIG_DIR="/etc/zm" \ - -DZM_RUNDIR="/var/run/zm" \ - -DZM_SOCKDIR="/var/run/zm" \ - -DZM_TMPDIR="/tmp/zm" \ - -DZM_CGIDIR="/usr/lib/zoneminder/cgi-bin" \ - -DZM_CONTENTDIR="/var/cache/zoneminder" - -override_dh_clean: - dh_clean $(MANPAGES1) - $(RM) -r docs/_build docs/installationguide - -build-indep: - #$(MAKE) -C docs text - $(MAKE) -C docs html - -MANPAGES1 = dbuild/scripts/zmupdate.pl.1 -$(MANPAGES1): - # generate man page(s): - pod2man -s1 --stderr --utf8 $(patsubst %.1, %, $@) $@ - -## reproducible build: -LAST_CHANGE=$(shell dpkg-parsechangelog -S Date) -BUILD_DATE=$(shell LC_ALL=C date -u "+%B %d, %Y" -d "$(LAST_CHANGE)") -override_dh_installman: $(MANPAGES1) - $(MAKE) -C docs man SPHINXOPTS="-D today=\"$(BUILD_DATE)\"" - dh_installman --language=C $(MANPAGES1) - -override_dh_auto_install: - dh_auto_install --destdir=$(CURDIR)/debian/tmp - # remove worthless files: - $(RM) -v $(CURDIR)/debian/tmp/usr/share/perl5/*/*/*/.packlist - $(RM) -v $(CURDIR)/debian/tmp/usr/share/perl5/*/*.in - # remove empty directories: - find $(CURDIR)/debian/tmp/usr -type d -empty -delete -printf 'removed %p\n' - # remove extra-license-file: - $(RM) -v $(CURDIR)/debian/tmp/usr/share/zoneminder/www/api/lib/Cake/LICENSE.txt - -override_dh_fixperms: - dh_fixperms - ## 637685 - chmod -c o-r $(CURDIR)/debian/zoneminder/etc/zm/zm.conf - -override_dh_installinit: - dh_installinit --no-start - -override_dh_systemd_start: - dh_systemd_start --no-start - -override_dh_systemd_enable: - dh_systemd_enable --no-enable - -override_dh_apache2: - dh_apache2 --noenable - -override_dh_strip: - [ -d "$(CURDIR)/debian/zoneminder-dbg" ] \ - && dh_strip --dbg-package=zoneminder-dbg \ - || dh_strip - -#%: -# dh $@ --parallel --buildsystem=autoconf --with autoreconf -# -#override_dh_auto_configure: -# dh_auto_configure -- \ -# --sysconfdir=/etc/zm \ -# --with-mysql=/usr \ -# --with-webdir=/usr/share/zoneminder \ -# --with-ffmpeg=/usr \ -# --with-cgidir=/usr/lib/cgi-bin \ -# --with-webuser=www-data \ -# --with-webgroup=www-data \ -# --enable-mmap=yes diff --git a/distros/ubuntu1504_cmake/source/format b/distros/ubuntu1504_cmake/source/format deleted file mode 100644 index 89ae9db8f..000000000 --- a/distros/ubuntu1504_cmake/source/format +++ /dev/null @@ -1 +0,0 @@ -3.0 (native) diff --git a/distros/ubuntu1504_cmake/watch b/distros/ubuntu1504_cmake/watch deleted file mode 100644 index 7ee690edb..000000000 --- a/distros/ubuntu1504_cmake/watch +++ /dev/null @@ -1,7 +0,0 @@ -version=3 - -opts=\ -repacksuffix=+dfsg,\ -dversionmangle=s{\+dfsg\d*}{},\ - https://github.com/ZoneMinder/ZoneMinder/releases \ - .*/ZoneMinder/archive/v(.*).tar.gz diff --git a/distros/ubuntu1504_cmake/zoneminder.service b/distros/ubuntu1504_cmake/zoneminder.service deleted file mode 100644 index e3575c039..000000000 --- a/distros/ubuntu1504_cmake/zoneminder.service +++ /dev/null @@ -1,20 +0,0 @@ -# ZoneMinder systemd unit file -# This file is intended to work with Debian distributions - -[Unit] -Description=ZoneMinder CCTV recording and surveillance system -After=network.target mysql.service -# Remarked out so that it will start ZM on machines that don't have mysql installed -#Requires=mysql.service - -[Service] -#User=www-data -Type=forking -ExecStart=/usr/bin/zmpkg.pl start -ExecReload=/usr/bin/zmpkg.pl restart -ExecStop=/usr/bin/zmpkg.pl stop -PIDFile=/var/run/zm/zm.pid -Restart=on-abnormal - -[Install] -WantedBy=multi-user.target diff --git a/distros/ubuntu1504_cmake/zoneminder.tmpfile b/distros/ubuntu1504_cmake/zoneminder.tmpfile deleted file mode 100644 index d307c6640..000000000 --- a/distros/ubuntu1504_cmake/zoneminder.tmpfile +++ /dev/null @@ -1,2 +0,0 @@ -d /var/run/zm 0755 www-data www-data -d /tmp/zm 0755 www-data www-data From ad13d889feb583fe7e52a14a1e83f3a752deff6d Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Wed, 6 Apr 2016 09:30:47 -0500 Subject: [PATCH 36/90] bump version from 1.29.0 to 1.29.1 --- CMakeLists.txt | 2 +- version | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 11fffd2f9..dc301dfb1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,7 @@ # cmake_minimum_required (VERSION 2.6) project (zoneminder) -set(zoneminder_VERSION "1.29.0") +set(zoneminder_VERSION "1.29.1") # make API version a minor of ZM version set(zoneminder_API_VERSION "${zoneminder_VERSION}.1") diff --git a/version b/version index 5e57fb895..83cf0d951 100644 --- a/version +++ b/version @@ -1 +1 @@ -1.29.0 +1.29.1 From 7645e299133e7b12f3f8308f73600469a00e22f0 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 6 Apr 2016 12:27:24 -0400 Subject: [PATCH 37/90] fix distro dirs, because the cmake versions have been renamed to not have cmake in them --- utils/do_debian_package.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/do_debian_package.sh b/utils/do_debian_package.sh index 6fff59967..f594f05d3 100755 --- a/utils/do_debian_package.sh +++ b/utils/do_debian_package.sh @@ -47,9 +47,9 @@ cd zoneminder_$VERSION-$DISTRO-$SNAPSHOT.orig git submodule init git submodule update --init --recursive if [ $DISTRO == "trusty" ]; then -ln -sf distros/ubuntu1204_cmake debian +ln -sf distros/ubuntu1204 debian else -ln -sf distros/ubuntu1504_cmake debian +ln -sf distros/ubuntu1504 debian fi; # Auto-install all ZoneMinder's depedencies using the Debian control file From fb05e1baadb051b4e7b2d0d109881a535b98e2fe Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 6 Apr 2016 13:01:20 -0400 Subject: [PATCH 38/90] grant requires rights regardless of password --- distros/debian/postinst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/distros/debian/postinst b/distros/debian/postinst index d06f9c641..2a370e4ea 100644 --- a/distros/debian/postinst +++ b/distros/debian/postinst @@ -15,11 +15,12 @@ if [ "$1" = "configure" ]; then # test if database if already present... if ! $(echo quit | mysql --defaults-file=/etc/mysql/debian.cnf zm > /dev/null 2> /dev/null) ; then cat /usr/share/zoneminder/db/zm_create.sql | mysql --defaults-file=/etc/mysql/debian.cnf - echo 'grant lock tables, alter,select,insert,update,delete on zm.* to 'zmuser'@localhost identified by "zmpass";' | mysql --defaults-file=/etc/mysql/debian.cnf mysql + echo 'grant lock tables, alter,select,insert,update,delete,create,index on zm.* to 'zmuser'@localhost;' | mysql --defaults-file=/etc/mysql/debian.cnf mysql fi invoke-rc.d zoneminder stop || true zmupdate.pl --nointeractive + zmupdate.pl --nointeractive -f else echo 'NOTE: mysql not running, please start mysql and run dpkg-reconfigure zoneminder when it is running.' From cf76360ecba9a6bb0dad10bfe0b3fac9f1b6a487 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 6 Apr 2016 13:03:24 -0400 Subject: [PATCH 39/90] bring up to date with the one in debian --- distros/ubuntu1204/zoneminder.postinst | 49 +++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 4 deletions(-) diff --git a/distros/ubuntu1204/zoneminder.postinst b/distros/ubuntu1204/zoneminder.postinst index e7810e468..293af766f 100644 --- a/distros/ubuntu1204/zoneminder.postinst +++ b/distros/ubuntu1204/zoneminder.postinst @@ -3,11 +3,52 @@ set -e if [ "$1" = "configure" ]; then - chown www-data:root /var/log/zm - chown www-data:www-data /var/lib/zm - if [ -z "$2" ]; then - chown www-data:www-data -R /var/cache/zoneminder + if [ -e "/etc/init.d/mysql" ]; then + # + # Get mysql started if it isn't + # + if ! $(/etc/init.d/mysql status >/dev/null 2>&1); then + invoke-rc.d mysql start fi + if $(/etc/init.d/mysql status >/dev/null 2>&1); then + mysqladmin --defaults-file=/etc/mysql/debian.cnf -f reload + # test if database if already present... + if ! $(echo quit | mysql --defaults-file=/etc/mysql/debian.cnf zm > /dev/null 2> /dev/null) ; then + cat /usr/share/zoneminder/db/zm_create.sql | mysql --defaults-file=/etc/mysql/debian.cnf + echo 'grant lock tables, alter,select,insert,update,delete,create,index on zm.* to 'zmuser'@localhost;' | mysql --defaults-file=/etc/mysql/debian.cnf mysql + fi + + invoke-rc.d zoneminder stop || true + zmupdate.pl --nointeractive + zmupdate.pl --nointeractive -f + + else + echo 'NOTE: mysql not running, please start mysql and run dpkg-reconfigure zoneminder when it is running.' + fi + else + echo 'mysql not found, assuming remote server.' + fi + chown www-data:www-data /var/log/zm + chown www-data:www-data /var/lib/zm/ + if [ -z "$2" ]; then + chown www-data:www-data -R /var/cache/zoneminder + fi +fi +# Ensure zoneminder is stopped... +if [ -x "/etc/init.d/zoneminder" ]; then + if invoke-rc.d zoneminder status ; then + invoke-rc.d zoneminder stop || exit $? + fi +fi + +if [ "$1" = "configure" ]; then + if [ -z "$2" ]; then + chown www-data:www-data /var/log/zm + chown www-data:www-data /var/lib/zm/ + chown www-data:www-data -R /var/cache/zoneminder + else + chown www-data:www-data /var/log/zm + fi fi #DEBHELPER# From 699b6458d522144e92c7e995796e3931368a5fbf Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 6 Apr 2016 13:08:30 -0400 Subject: [PATCH 40/90] bring up to date with debian postinst. Will not install the db, create the user and will run zmupdate. --- distros/ubuntu1504/zoneminder.postinst | 41 +++++++++++++++++++------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/distros/ubuntu1504/zoneminder.postinst b/distros/ubuntu1504/zoneminder.postinst index 82b256e6b..812b904e3 100644 --- a/distros/ubuntu1504/zoneminder.postinst +++ b/distros/ubuntu1504/zoneminder.postinst @@ -5,11 +5,11 @@ set -e . /etc/zm/zm.conf if [ "$1" = "configure" ]; then - chown www-data:root /var/log/zm - chown www-data:www-data /var/lib/zm - if [ -z "$2" ]; then - chown www-data:www-data -R /var/cache/zoneminder - fi + chown www-data:root /var/log/zm + chown www-data:www-data /var/lib/zm + if [ -z "$2" ]; then + chown www-data:www-data -R /var/cache/zoneminder + fi # Do this every time the package is installed or upgraded # Test for database presence to avoid failure of zmupdate.pl @@ -18,12 +18,33 @@ if [ "$1" = "configure" ]; then deb-systemd-invoke stop zoneminder.service || exit $? if [ "$ZM_DB_HOST" = "localhost" ]; then - echo 'grant lock tables, create, index, alter on zm.* to 'zmuser'@localhost identified by "zmpass";' | mysql --defaults-file=/etc/mysql/debian.cnf mysql - # Run the ZoneMinder update tool - zmupdate.pl --nointeractive - else + # + # Get mysql started if it isn't + # + if ! $(/etc/init.d/mysql status >/dev/null 2>&1); then + invoke-rc.d mysql start + fi + if $(/etc/init.d/mysql status >/dev/null 2>&1); then + mysqladmin --defaults-file=/etc/mysql/debian.cnf -f reload + # test if database if already present... + if ! $(echo quit | mysql --defaults-file=/etc/mysql/debian.cnf zm > /dev/null 2> /dev/null) ; then + cat /usr/share/zoneminder/db/zm_create.sql | mysql --defaults-file=/etc/mysql/debian.cnf + # This creates the user. + echo 'grant lock tables, alter,select,insert,update,delete,create,index on zm.* to 'zmuser'@localhost;' | mysql --defaults-file=/etc/mysql/debian.cnf mysql + else + echo 'grant lock tables, create, index, alter on zm.* to 'zmuser'@localhost;' | mysql --defaults-file=/etc/mysql/debian.cnf mysql + fi + + invoke-rc.d zoneminder stop || true + zmupdate.pl --nointeractive + zmupdate.pl --nointeractive -f + + else + echo 'NOTE: mysql not running, please start mysql and run dpkg-reconfigure zoneminder when it is running.' + fi + else echo "Not doing database upgrade due to remote db server ($ZM_DB_HOST)" - fi; + fi fi From 6199a54838d125198698ca8613109c1d9aec2ba6 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 6 Apr 2016 13:45:46 -0400 Subject: [PATCH 41/90] more work, check for local db, check for existence of mysql, sync up between debian ubuntu1204 ubuntu1504 --- distros/debian/postinst | 81 ++++++++++++------------ distros/ubuntu1204/zoneminder.postinst | 85 +++++++++++++------------- distros/ubuntu1504/zoneminder.postinst | 58 ++++++++++-------- 3 files changed, 115 insertions(+), 109 deletions(-) diff --git a/distros/debian/postinst b/distros/debian/postinst index 2a370e4ea..64bedff22 100644 --- a/distros/debian/postinst +++ b/distros/debian/postinst @@ -3,52 +3,51 @@ set -e if [ "$1" = "configure" ]; then - if [ -e "/etc/init.d/mysql" ]; then - # - # Get mysql started if it isn't - # - if ! $(/etc/init.d/mysql status >/dev/null 2>&1); then - invoke-rc.d mysql start - fi - if $(/etc/init.d/mysql status >/dev/null 2>&1); then - mysqladmin --defaults-file=/etc/mysql/debian.cnf -f reload - # test if database if already present... - if ! $(echo quit | mysql --defaults-file=/etc/mysql/debian.cnf zm > /dev/null 2> /dev/null) ; then - cat /usr/share/zoneminder/db/zm_create.sql | mysql --defaults-file=/etc/mysql/debian.cnf - echo 'grant lock tables, alter,select,insert,update,delete,create,index on zm.* to 'zmuser'@localhost;' | mysql --defaults-file=/etc/mysql/debian.cnf mysql - fi - invoke-rc.d zoneminder stop || true - zmupdate.pl --nointeractive - zmupdate.pl --nointeractive -f + . /etc/zm/zm.conf - else - echo 'NOTE: mysql not running, please start mysql and run dpkg-reconfigure zoneminder when it is running.' - fi - else - echo 'mysql not found, assuming remote server.' - fi - chown www-data:www-data /var/log/zm - chown www-data:www-data /var/lib/zm/ + # The logs can contain passwords, etc... so by setting group root, only www-data can read them, not people in the www-data group. + chown www-data:root /var/log/zm + chown www-data:www-data /var/lib/zm if [ -z "$2" ]; then - chown www-data:www-data -R /var/cache/zoneminder + chown www-data:www-data -R /var/cache/zoneminder fi -fi -# Ensure zoneminder is stopped... -if [ -x "/etc/init.d/zoneminder" ]; then - if invoke-rc.d zoneminder status ; then - invoke-rc.d zoneminder stop || exit $? + + # Do this every time the package is installed or upgraded + + if [ "$ZM_DB_HOST" = "localhost" ]; then + if [ -e "/etc/init.d/mysql" ]; then + # + # Get mysql started if it isn't + # + if ! $(/etc/init.d/mysql status >/dev/null 2>&1); then + invoke-rc.d mysql start + fi + if $(/etc/init.d/mysql status >/dev/null 2>&1); then + mysqladmin --defaults-file=/etc/mysql/debian.cnf -f reload + # test if database if already present... + if ! $(echo quit | mysql --defaults-file=/etc/mysql/debian.cnf zm > /dev/null 2> /dev/null) ; then + cat /usr/share/zoneminder/db/zm_create.sql | mysql --defaults-file=/etc/mysql/debian.cnf + # This creates the user. + echo 'grant lock tables, alter,select,insert,update,delete,create,index on zm.* to 'zmuser'@localhost;' | mysql --defaults-file=/etc/mysql/debian.cnf mysql + else + echo 'grant lock tables, alter,select,insert,update,delete,create,index on zm.* to 'zmuser'@localhost;' | mysql --defaults-file=/etc/mysql/debian.cnf mysql + fi + + # Ensure zoneminder is stopped + invoke-rc.d zoneminder stop || true + zmupdate.pl --nointeractive + zmupdate.pl --nointeractive -f + invoke-rc.d zoneminder start || true + else + echo 'NOTE: mysql not running, please start mysql and run dpkg-reconfigure zoneminder when it is running.' + fi + else + echo 'mysql not found, assuming remote server.' fi -fi - -if [ "$1" = "configure" ]; then - if [ -z "$2" ]; then - chown www-data:www-data /var/log/zm - chown www-data:www-data /var/lib/zm/ - chown www-data:www-data -R /var/cache/zoneminder else - chown www-data:www-data /var/log/zm - zmupdate.pl - fi + echo "Not doing database upgrade due to remote db server ($ZM_DB_HOST)" + fi + fi #DEBHELPER# diff --git a/distros/ubuntu1204/zoneminder.postinst b/distros/ubuntu1204/zoneminder.postinst index 293af766f..81101a1a6 100644 --- a/distros/ubuntu1204/zoneminder.postinst +++ b/distros/ubuntu1204/zoneminder.postinst @@ -3,52 +3,51 @@ set -e if [ "$1" = "configure" ]; then - if [ -e "/etc/init.d/mysql" ]; then - # - # Get mysql started if it isn't - # - if ! $(/etc/init.d/mysql status >/dev/null 2>&1); then - invoke-rc.d mysql start - fi - if $(/etc/init.d/mysql status >/dev/null 2>&1); then - mysqladmin --defaults-file=/etc/mysql/debian.cnf -f reload - # test if database if already present... - if ! $(echo quit | mysql --defaults-file=/etc/mysql/debian.cnf zm > /dev/null 2> /dev/null) ; then - cat /usr/share/zoneminder/db/zm_create.sql | mysql --defaults-file=/etc/mysql/debian.cnf - echo 'grant lock tables, alter,select,insert,update,delete,create,index on zm.* to 'zmuser'@localhost;' | mysql --defaults-file=/etc/mysql/debian.cnf mysql - fi - invoke-rc.d zoneminder stop || true - zmupdate.pl --nointeractive - zmupdate.pl --nointeractive -f + . /etc/zm/zm.conf - else - echo 'NOTE: mysql not running, please start mysql and run dpkg-reconfigure zoneminder when it is running.' - fi - else - echo 'mysql not found, assuming remote server.' - fi - chown www-data:www-data /var/log/zm - chown www-data:www-data /var/lib/zm/ - if [ -z "$2" ]; then - chown www-data:www-data -R /var/cache/zoneminder - fi -fi -# Ensure zoneminder is stopped... -if [ -x "/etc/init.d/zoneminder" ]; then - if invoke-rc.d zoneminder status ; then - invoke-rc.d zoneminder stop || exit $? + # The logs can contain passwords, etc... so by setting group root, only www-data can read them, not people in the www-data group + chown www-data:root /var/log/zm + chown www-data:www-data /var/lib/zm + if [ -z "$2" ]; then + chown www-data:www-data -R /var/cache/zoneminder + fi + + # Do this every time the package is installed or upgraded + + if [ "$ZM_DB_HOST" = "localhost" ]; then + if [ -e "/etc/init.d/mysql" ]; then + # + # Get mysql started if it isn't + # + if ! $(/etc/init.d/mysql status >/dev/null 2>&1); then + invoke-rc.d mysql start + fi + if $(/etc/init.d/mysql status >/dev/null 2>&1); then + mysqladmin --defaults-file=/etc/mysql/debian.cnf -f reload + # test if database if already present... + if ! $(echo quit | mysql --defaults-file=/etc/mysql/debian.cnf zm > /dev/null 2> /dev/null) ; then + cat /usr/share/zoneminder/db/zm_create.sql | mysql --defaults-file=/etc/mysql/debian.cnf + # This creates the user. + echo 'grant lock tables, alter,select,insert,update,delete,create,index on zm.* to 'zmuser'@localhost identified by "zmpass";' | mysql --defaults-file=/etc/mysql/debian.cnf mysql + else + echo 'grant lock tables, alter,select,insert,update,delete,create,index on zm.* to 'zmuser'@localhost;' | mysql --defaults-file=/etc/mysql/debian.cnf mysql + fi + + # Ensure zoneminder is stopped + invoke-rc.d zoneminder stop || true + zmupdate.pl --nointeractive + zmupdate.pl --nointeractive -f + invoke-rc.d zoneminder start || true + else + echo 'NOTE: mysql not running, please start mysql and run dpkg-reconfigure zoneminder when it is running.' + fi + else + echo 'mysql not found, assuming remote server.' fi -fi - -if [ "$1" = "configure" ]; then - if [ -z "$2" ]; then - chown www-data:www-data /var/log/zm - chown www-data:www-data /var/lib/zm/ - chown www-data:www-data -R /var/cache/zoneminder - else - chown www-data:www-data /var/log/zm - fi + else + echo "Not doing database upgrade due to remote db server ($ZM_DB_HOST)" + fi fi #DEBHELPER# diff --git a/distros/ubuntu1504/zoneminder.postinst b/distros/ubuntu1504/zoneminder.postinst index 812b904e3..086bda4cd 100644 --- a/distros/ubuntu1504/zoneminder.postinst +++ b/distros/ubuntu1504/zoneminder.postinst @@ -2,9 +2,11 @@ set -e -. /etc/zm/zm.conf - if [ "$1" = "configure" ]; then + + . /etc/zm/zm.conf + + # The logs can contain passwords, etc... so by setting group root, only www-data can read them, not people in the www-data group chown www-data:root /var/log/zm chown www-data:www-data /var/lib/zm if [ -z "$2" ]; then @@ -12,36 +14,42 @@ if [ "$1" = "configure" ]; then fi # Do this every time the package is installed or upgraded - # Test for database presence to avoid failure of zmupdate.pl - - # Ensure zoneminder is stopped - deb-systemd-invoke stop zoneminder.service || exit $? if [ "$ZM_DB_HOST" = "localhost" ]; then - # - # Get mysql started if it isn't - # - if ! $(/etc/init.d/mysql status >/dev/null 2>&1); then - invoke-rc.d mysql start - fi - if $(/etc/init.d/mysql status >/dev/null 2>&1); then - mysqladmin --defaults-file=/etc/mysql/debian.cnf -f reload - # test if database if already present... - if ! $(echo quit | mysql --defaults-file=/etc/mysql/debian.cnf zm > /dev/null 2> /dev/null) ; then - cat /usr/share/zoneminder/db/zm_create.sql | mysql --defaults-file=/etc/mysql/debian.cnf - # This creates the user. - echo 'grant lock tables, alter,select,insert,update,delete,create,index on zm.* to 'zmuser'@localhost;' | mysql --defaults-file=/etc/mysql/debian.cnf mysql - else - echo 'grant lock tables, create, index, alter on zm.* to 'zmuser'@localhost;' | mysql --defaults-file=/etc/mysql/debian.cnf mysql + + if [ -e "/etc/init.d/mysql" ]; then + + # + # Get mysql started if it isn't + # + if ! $(/etc/init.d/mysql status >/dev/null 2>&1); then + deb-systemd-invoke start mysql.service || exit $? fi - invoke-rc.d zoneminder stop || true - zmupdate.pl --nointeractive - zmupdate.pl --nointeractive -f + if $(/etc/init.d/mysql status >/dev/null 2>&1); then + mysqladmin --defaults-file=/etc/mysql/debian.cnf -f reload + # test if database if already present... + if ! $(echo quit | mysql --defaults-file=/etc/mysql/debian.cnf zm > /dev/null 2> /dev/null) ; then + cat /usr/share/zoneminder/db/zm_create.sql | mysql --defaults-file=/etc/mysql/debian.cnf + # This creates the user. + echo 'grant lock tables, alter,select,insert,update,delete,create,index on zm.* to 'zmuser'@localhost identified by "zmpass";' | mysql --defaults-file=/etc/mysql/debian.cnf mysql + else + echo 'grant lock tables, alter,select,insert,update,deletecreate, index on zm.* to 'zmuser'@localhost;' | mysql --defaults-file=/etc/mysql/debian.cnf mysql + fi + # Ensure zoneminder is stopped + deb-systemd-invoke stop zoneminder.service || exit $? + zmupdate.pl --nointeractive + zmupdate.pl --nointeractive -f + deb-systemd-invoke start zoneminder.service || exit $? + + else + echo 'NOTE: mysql not running, please start mysql and run dpkg-reconfigure zoneminder when it is running.' + fi else - echo 'NOTE: mysql not running, please start mysql and run dpkg-reconfigure zoneminder when it is running.' + echo 'mysql not found, assuming remote server.' fi + else echo "Not doing database upgrade due to remote db server ($ZM_DB_HOST)" fi From 6cdbcfc9e68790ffbebc4254a2669b91b70fa36c Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 6 Apr 2016 13:55:18 -0400 Subject: [PATCH 42/90] add back identified by --- distros/debian/postinst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/distros/debian/postinst b/distros/debian/postinst index 64bedff22..85bf9c164 100644 --- a/distros/debian/postinst +++ b/distros/debian/postinst @@ -29,7 +29,7 @@ if [ "$1" = "configure" ]; then if ! $(echo quit | mysql --defaults-file=/etc/mysql/debian.cnf zm > /dev/null 2> /dev/null) ; then cat /usr/share/zoneminder/db/zm_create.sql | mysql --defaults-file=/etc/mysql/debian.cnf # This creates the user. - echo 'grant lock tables, alter,select,insert,update,delete,create,index on zm.* to 'zmuser'@localhost;' | mysql --defaults-file=/etc/mysql/debian.cnf mysql + echo 'grant lock tables, alter,select,insert,update,delete,create,index on zm.* to 'zmuser'@localhost identified by "zmpass";' | mysql --defaults-file=/etc/mysql/debian.cnf mysql else echo 'grant lock tables, alter,select,insert,update,delete,create,index on zm.* to 'zmuser'@localhost;' | mysql --defaults-file=/etc/mysql/debian.cnf mysql fi From 3dd010b40ad76acc4fa718a3c43320528877cc92 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 6 Apr 2016 15:44:56 -0400 Subject: [PATCH 43/90] User and and instead of defaults --- distros/ubuntu1504/zoneminder.postinst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/distros/ubuntu1504/zoneminder.postinst b/distros/ubuntu1504/zoneminder.postinst index 086bda4cd..cf1c5e218 100644 --- a/distros/ubuntu1504/zoneminder.postinst +++ b/distros/ubuntu1504/zoneminder.postinst @@ -32,9 +32,9 @@ if [ "$1" = "configure" ]; then if ! $(echo quit | mysql --defaults-file=/etc/mysql/debian.cnf zm > /dev/null 2> /dev/null) ; then cat /usr/share/zoneminder/db/zm_create.sql | mysql --defaults-file=/etc/mysql/debian.cnf # This creates the user. - echo 'grant lock tables, alter,select,insert,update,delete,create,index on zm.* to 'zmuser'@localhost identified by "zmpass";' | mysql --defaults-file=/etc/mysql/debian.cnf mysql + echo 'grant lock tables,alter,select,insert,update,delete,create,index on $ZM_DB_NAME.* to '$ZM_DB_USER'@localhost identified by "$ZM_DB_PASS";' | mysql --defaults-file=/etc/mysql/debian.cnf mysql else - echo 'grant lock tables, alter,select,insert,update,deletecreate, index on zm.* to 'zmuser'@localhost;' | mysql --defaults-file=/etc/mysql/debian.cnf mysql + echo 'grant lock tables,alter,select,insert,update,delete,create,index on $ZM_DB_NAME.* to '$ZM_DB_USER'@localhost;' | mysql --defaults-file=/etc/mysql/debian.cnf mysql fi # Ensure zoneminder is stopped From e473839704a5243913745ebf8844b1df4ad65afe Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 6 Apr 2016 15:50:51 -0400 Subject: [PATCH 44/90] substitute ZM_DB_NAME,ZM_DB_USER and ZM_DB_PASS from zm.conf for defaults --- distros/debian/postinst | 4 ++-- distros/ubuntu1204/zoneminder.postinst | 4 ++-- distros/ubuntu1504/zoneminder.postinst | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/distros/debian/postinst b/distros/debian/postinst index 85bf9c164..8bb4d23eb 100644 --- a/distros/debian/postinst +++ b/distros/debian/postinst @@ -29,9 +29,9 @@ if [ "$1" = "configure" ]; then if ! $(echo quit | mysql --defaults-file=/etc/mysql/debian.cnf zm > /dev/null 2> /dev/null) ; then cat /usr/share/zoneminder/db/zm_create.sql | mysql --defaults-file=/etc/mysql/debian.cnf # This creates the user. - echo 'grant lock tables, alter,select,insert,update,delete,create,index on zm.* to 'zmuser'@localhost identified by "zmpass";' | mysql --defaults-file=/etc/mysql/debian.cnf mysql + echo "grant lock tables, alter,select,insert,update,delete,create,index on ${ZM_DB_NAME}.* to '${ZM_DB_USER}'@localhost identified by \"${ZM_DB_PASS}\";" | mysql --defaults-file=/etc/mysql/debian.cnf mysql else - echo 'grant lock tables, alter,select,insert,update,delete,create,index on zm.* to 'zmuser'@localhost;' | mysql --defaults-file=/etc/mysql/debian.cnf mysql + echo "grant lock tables, alter,select,insert,update,delete,create,index on ${ZM_DB_NAME}.* to '${ZM_DB_USER}'@localhost;" | mysql --defaults-file=/etc/mysql/debian.cnf mysql fi # Ensure zoneminder is stopped diff --git a/distros/ubuntu1204/zoneminder.postinst b/distros/ubuntu1204/zoneminder.postinst index 81101a1a6..1bfd41d42 100644 --- a/distros/ubuntu1204/zoneminder.postinst +++ b/distros/ubuntu1204/zoneminder.postinst @@ -29,9 +29,9 @@ if [ "$1" = "configure" ]; then if ! $(echo quit | mysql --defaults-file=/etc/mysql/debian.cnf zm > /dev/null 2> /dev/null) ; then cat /usr/share/zoneminder/db/zm_create.sql | mysql --defaults-file=/etc/mysql/debian.cnf # This creates the user. - echo 'grant lock tables, alter,select,insert,update,delete,create,index on zm.* to 'zmuser'@localhost identified by "zmpass";' | mysql --defaults-file=/etc/mysql/debian.cnf mysql + echo "grant lock tables, alter,select,insert,update,delete,create,index on ${ZM_DB_NAME}.* to '${ZM_DB_USER}'@localhost identified by \"${ZM_DB_PASS}\";" | mysql --defaults-file=/etc/mysql/debian.cnf mysql else - echo 'grant lock tables, alter,select,insert,update,delete,create,index on zm.* to 'zmuser'@localhost;' | mysql --defaults-file=/etc/mysql/debian.cnf mysql + echo "grant lock tables, alter,select,insert,update,delete,create,index on ${ZM_DB_NAME}.* to '${ZM_DB_USER}'@localhost;" | mysql --defaults-file=/etc/mysql/debian.cnf mysql fi # Ensure zoneminder is stopped diff --git a/distros/ubuntu1504/zoneminder.postinst b/distros/ubuntu1504/zoneminder.postinst index cf1c5e218..c45474e1d 100644 --- a/distros/ubuntu1504/zoneminder.postinst +++ b/distros/ubuntu1504/zoneminder.postinst @@ -32,9 +32,9 @@ if [ "$1" = "configure" ]; then if ! $(echo quit | mysql --defaults-file=/etc/mysql/debian.cnf zm > /dev/null 2> /dev/null) ; then cat /usr/share/zoneminder/db/zm_create.sql | mysql --defaults-file=/etc/mysql/debian.cnf # This creates the user. - echo 'grant lock tables,alter,select,insert,update,delete,create,index on $ZM_DB_NAME.* to '$ZM_DB_USER'@localhost identified by "$ZM_DB_PASS";' | mysql --defaults-file=/etc/mysql/debian.cnf mysql + echo "grant lock tables,alter,select,insert,update,delete,create,index on ${ZM_DB_NAME}.* to '${ZM_DB_USER}'@localhost identified by \"${ZM_DB_PASS}\";" | mysql --defaults-file=/etc/mysql/debian.cnf mysql else - echo 'grant lock tables,alter,select,insert,update,delete,create,index on $ZM_DB_NAME.* to '$ZM_DB_USER'@localhost;' | mysql --defaults-file=/etc/mysql/debian.cnf mysql + echo "grant lock tables,alter,select,insert,update,delete,create,index on ${ZM_DB_NAME}.* to '${ZM_DB_USER}'@localhost;" | mysql --defaults-file=/etc/mysql/debian.cnf mysql fi # Ensure zoneminder is stopped From 176220f1bf8005a912eed03b8fbdd35a0efc42a0 Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Fri, 8 Apr 2016 07:44:30 -0500 Subject: [PATCH 45/90] Update version Bumping back to 1.29.0 Note to all: We need to remember to bump this at the moment we create our next release --- version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version b/version index 83cf0d951..5e57fb895 100644 --- a/version +++ b/version @@ -1 +1 @@ -1.29.1 +1.29.0 From 3be3a3ada20a084e7071457e4c47cbb784f253c9 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 8 Apr 2016 10:46:51 -0400 Subject: [PATCH 46/90] convert the monitor variable to a Monitor object, replace the static zone image with a stream, and use SVG to draw the zones --- web/skins/classic/views/zones.php | 69 +++++++++++++++++++++++-------- 1 file changed, 51 insertions(+), 18 deletions(-) diff --git a/web/skins/classic/views/zones.php b/web/skins/classic/views/zones.php index 9182dc98f..71e979015 100644 --- a/web/skins/classic/views/zones.php +++ b/web/skins/classic/views/zones.php @@ -26,11 +26,7 @@ if ( !canView( 'Monitors' ) ) $mid = validInt($_REQUEST['mid']); $wd = getcwd(); -chdir( ZM_DIR_IMAGES ); -$status = exec( escapeshellcmd( getZmuCommand( " -m ".$mid." -z" ) ) ); -chdir( $wd ); - -$monitor = dbFetchMonitor( $mid ); +$monitor = new Monitor( $mid ); $zones = array(); foreach( dbFetchAll( 'select * from Zones where MonitorId = ? order by Area desc', NULL, array($mid) ) as $row ) @@ -42,8 +38,6 @@ foreach( dbFetchAll( 'select * from Zones where MonitorId = ? order by Area desc } } -$image = 'Zones'.$monitor['Id'].'.jpg'; - xhtmlHeaders(__FILE__, translate('Zones') ); ?> @@ -53,18 +47,57 @@ xhtmlHeaders(__FILE__, translate('Zones') );

- getStreamSrc( array( "mode=".$streamMode, "scale=".$scale, "bitrate=".ZM_WEB_VIDEO_BITRATE, "maxfps=".ZM_WEB_VIDEO_MAXFPS, "format=".ZM_MPEG_LIVE_FORMAT ) ); +} +elseif ( canStream() ) { -?> - <?php echo htmlspecialchars($zone['Name']) ?> -getStreamSrc( array( "mode=".$streamMode, "scale=".$scale, "maxfps=".ZM_WEB_VIDEO_MAXFPS, "buffer=".$monitor->StreamReplayBuffer() ) ); +} +else +{ + $streamMode = "single"; + $streamSrc = $monitor->getStreamSrc( array( "mode=".$streamMode, "scale=".$scale ) ); + Info( "The system has fallen back to single jpeg mode for streaming. Consider enabling Cambozola or upgrading the client browser."); } ?> - - - zones +zonesWidth(), $scale ), reScale( $monitor->Height(), $scale ), ZM_MPEG_LIVE_FORMAT, $monitor->Name() ); +} +elseif ( $streamMode == "jpeg" ) +{ + if ( canStreamNative() ) + outputImageStream( "liveStream", $streamSrc, reScale( $monitor->Width(), $scale ), reScale( $monitor->Height(), $scale ), $monitor->Name() ); + elseif ( canStreamApplet() ) + outputHelperStream( "liveStream", $streamSrc, reScale( $monitor->Width(), $scale ), reScale( $monitor->Height(), $scale ), $monitor->Name() ); +} +else +{ + outputImageStill( "liveStream", $streamSrc, reScale( $monitor->Width(), $scale ), reScale( $monitor->Height(), $scale ), $monitor->Name() ); +} +?>"/> + + + + + + + Sorry, your browser does not support inline SVG +
@@ -84,9 +117,9 @@ foreach( $zones as $zone ) { ?> - + -  /  +  / Width()*$monitor->Height()) ) ?> disabled="disabled"/>
- disabled="disabled"/> + disabled="disabled"/>
From 3056069f3f9377312e4f6c75ad405b9998ea5558 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 8 Apr 2016 11:06:34 -0400 Subject: [PATCH 47/90] introduce getStreamHTML which returns the required HTML to give you a live image --- web/includes/functions.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/web/includes/functions.php b/web/includes/functions.php index 25d81bb44..27f450d37 100644 --- a/web/includes/functions.php +++ b/web/includes/functions.php @@ -2486,4 +2486,22 @@ function validHtmlStr( $input ) return( htmlspecialchars( $input, ENT_QUOTES ) ); } +function getStreamHTML( $monitor, $scale=100 ) { +//FIXME, the width and height of the image need to be scaled. + if ( ZM_WEB_STREAM_METHOD == 'mpeg' && ZM_MPEG_LIVE_FORMAT ) { + $streamSrc = $monitor->getStreamSrc( array( "mode=mpeg", "scale=".$scale, "bitrate=".ZM_WEB_VIDEO_BITRATE, "maxfps=".ZM_WEB_VIDEO_MAXFPS, "format=".ZM_MPEG_LIVE_FORMAT ) ); + outputVideoStream( "liveStream", $streamSrc, reScale( $monitor->Width(), $scale ), reScale( $monitor->Height(), $scale ), ZM_MPEG_LIVE_FORMAT, $monitor->Name() ); + } else if ( canStream() ) { + $streamSrc = $monitor->getStreamSrc( array( 'mode=jpeg', 'scale='.$scale, 'maxfps='.ZM_WEB_VIDEO_MAXFPS, 'buffer='.$monitor->StreamReplayBuffer() ) ); + if ( canStreamNative() ) + outputImageStream( "liveStream", $streamSrc, reScale( $monitor->Width(), $scale ), reScale( $monitor->Height(), $scale ), $monitor->Name() ); + elseif ( canStreamApplet() ) + outputHelperStream( "liveStream", $streamSrc, reScale( $monitor->Width(), $scale ), reScale( $monitor->Height(), $scale ), $monitor->Name() ); + } else { + $streamSrc = $monitor->getStreamSrc( array( 'mode=single', "scale=".$scale ) ); + outputImageStill( "liveStream", $streamSrc, reScale( $monitor->Width(), $scale ), reScale( $monitor->Height(), $scale ), $monitor->Name() ); + Info( "The system has fallen back to single jpeg mode for streaming. Consider enabling Cambozola or upgrading the client browser."); + } +} // end function getStreamHTML + ?> From 79552e5393c31abe4b311f252efbe9452c3b3af2 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 8 Apr 2016 11:11:09 -0400 Subject: [PATCH 48/90] use new getStreamHTML --- web/skins/classic/views/zones.php | 36 +------------------------------ 1 file changed, 1 insertion(+), 35 deletions(-) diff --git a/web/skins/classic/views/zones.php b/web/skins/classic/views/zones.php index 71e979015..69519a53a 100644 --- a/web/skins/classic/views/zones.php +++ b/web/skins/classic/views/zones.php @@ -47,41 +47,7 @@ xhtmlHeaders(__FILE__, translate('Zones') );

-getStreamSrc( array( "mode=".$streamMode, "scale=".$scale, "bitrate=".ZM_WEB_VIDEO_BITRATE, "maxfps=".ZM_WEB_VIDEO_MAXFPS, "format=".ZM_MPEG_LIVE_FORMAT ) ); -} -elseif ( canStream() ) -{ - $streamMode = "jpeg"; - $streamSrc = $monitor->getStreamSrc( array( "mode=".$streamMode, "scale=".$scale, "maxfps=".ZM_WEB_VIDEO_MAXFPS, "buffer=".$monitor->StreamReplayBuffer() ) ); -} -else -{ - $streamMode = "single"; - $streamSrc = $monitor->getStreamSrc( array( "mode=".$streamMode, "scale=".$scale ) ); - Info( "The system has fallen back to single jpeg mode for streaming. Consider enabling Cambozola or upgrading the client browser."); -} -?> -zonesWidth(), $scale ), reScale( $monitor->Height(), $scale ), ZM_MPEG_LIVE_FORMAT, $monitor->Name() ); -} -elseif ( $streamMode == "jpeg" ) -{ - if ( canStreamNative() ) - outputImageStream( "liveStream", $streamSrc, reScale( $monitor->Width(), $scale ), reScale( $monitor->Height(), $scale ), $monitor->Name() ); - elseif ( canStreamApplet() ) - outputHelperStream( "liveStream", $streamSrc, reScale( $monitor->Width(), $scale ), reScale( $monitor->Height(), $scale ), $monitor->Name() ); -} -else -{ - outputImageStill( "liveStream", $streamSrc, reScale( $monitor->Width(), $scale ), reScale( $monitor->Height(), $scale ), $monitor->Name() ); -} -?>"/> + Date: Fri, 8 Apr 2016 11:17:16 -0400 Subject: [PATCH 49/90] convert points to circles, because squares are not centered on the point.. but a circle is --- web/skins/classic/views/zones.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/web/skins/classic/views/zones.php b/web/skins/classic/views/zones.php index 69519a53a..785cff8f3 100644 --- a/web/skins/classic/views/zones.php +++ b/web/skins/classic/views/zones.php @@ -25,7 +25,6 @@ if ( !canView( 'Monitors' ) ) } $mid = validInt($_REQUEST['mid']); -$wd = getcwd(); $monitor = new Monitor( $mid ); $zones = array(); @@ -57,7 +56,7 @@ xhtmlHeaders(__FILE__, translate('Zones') ); foreach ( explode(' ', $zone['Coords'] ) as $point ) { $xy = explode(',', $point ); ?> - + Date: Fri, 8 Apr 2016 12:32:26 -0400 Subject: [PATCH 50/90] update SVG polygon points on point update --- web/skins/classic/views/js/zone.js | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/web/skins/classic/views/js/zone.js b/web/skins/classic/views/js/zone.js index 43d51e3a8..06f59479b 100644 --- a/web/skins/classic/views/js/zone.js +++ b/web/skins/classic/views/js/zone.js @@ -304,19 +304,6 @@ function unsetActivePoint( index ) $('point'+index).removeClass( 'active' ); } -function updateZoneImageResponse( respObj, respText ) -{ - if ( respObj.result == 'Ok' ) - { - document.zoneForm.elements['submitBtn'].disabled = ( selfIntersecting = respObj.selfIntersecting ); - document.zoneForm.elements['newZone[Area]'].value = zone.Area = respObj.area; - if ( document.zoneForm.elements['newZone[Units]'].value == 'Pixels' ) - document.zoneForm.elements['newZone[TempArea]'].value = document.zoneForm.elements['newZone[Area]'].value; - - var newImage = new Asset.image( respObj.zoneImage, { 'onload': function() { $('zoneImage').src = newImage.src; } } ); - } -} - function getCoordString() { var coords = new Array(); @@ -327,9 +314,6 @@ function getCoordString() function updateZoneImage() { - var parms = "view=request&request=zone&action=zoneImage&mid="+zone.MonitorId+"&zid="+zone.Id+"&coords="+getCoordString(); - var query = new Request.JSON( { url: thisUrl, method: 'post', timeout: AJAX_TIMEOUT, data: parms, onSuccess: updateZoneImageResponse } ); - query.send(); } function fixActivePoint( index ) @@ -360,6 +344,10 @@ function updateActivePoint( index ) $('newZone[Points]['+index+'][y]').value = y; zone['Points'][index].x = x; zone['Points'][index].y = y; + var Point = $('zonePoly').points.getItem(index); + Point.x =x; + Point.y =y; + } function addPoint( index ) @@ -397,8 +385,9 @@ function updateX( index ) point.setStyle( 'left', x+'px' ); zone['Points'][index].x = x; - - updateZoneImage(); + var Point = $('zonePoly').points.getItem(index); + Point.x =x; + Point.y =y; } function updateY( index ) @@ -410,8 +399,9 @@ function updateY( index ) point.setStyle( 'top', y+'px' ); zone['Points'][index].y = y; - - updateZoneImage(); + var Point = $('zonePoly').points.getItem(index); + Point.x =x; + Point.y =y; } function saveChanges( element ) From 7da6e1e5a1d99be9c368ffb1224e2e6953ab7eaf Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 8 Apr 2016 12:36:09 -0400 Subject: [PATCH 51/90] use stream for image, add SVG polygon --- web/skins/classic/views/zone.php | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/web/skins/classic/views/zone.php b/web/skins/classic/views/zone.php index 69c0919e9..01d5464bf 100644 --- a/web/skins/classic/views/zone.php +++ b/web/skins/classic/views/zone.php @@ -59,7 +59,7 @@ foreach ( getEnumValues( 'Zones', 'CheckMethod' ) as $optCheckMethod ) $optCheckMethods[$optCheckMethod] = $optCheckMethod; } -$monitor = dbFetchMonitor ( $mid ); +$monitor = new Monitor( $mid ); $minX = 0; $maxX = $monitor['Width']-1; @@ -100,6 +100,7 @@ if ( !isset($newZone) ) ); } $zone['Points'] = coordsToPoints( $zone['Coords'] ); + $zone['AreaCoords'] = preg_replace( '/\s+/', ',', $zone['Coords'] ); $newZone = $zone; } @@ -115,15 +116,6 @@ $newZone['Coords'] = pointsToCoords( $newZone['Points'] ); $newZone['Area'] = getPolyArea( $newZone['Points'] ); $selfIntersecting = isSelfIntersecting( $newZone['Points'] ); -$wd = getcwd(); -chdir( ZM_DIR_IMAGES ); -$command = getZmuCommand( " -m ".$mid." -z" ); -$command .= '"'.$zid.' '.$hicolor.' '.$newZone['Coords'].'"'; -$status = exec( escapeshellcmd( $command ) ); -chdir( $wd ); - -$zoneImage = ZM_DIR_IMAGES.'/Zones'.$monitor['Id'].'.jpg?'.time(); - $focusWindow = true; xhtmlHeaders(__FILE__, translate('Zone') ); @@ -218,7 +210,11 @@ xhtmlHeaders(__FILE__, translate('Zone') );
- Zone Image + + + + Sorry, your browser does not support inline SVG +
From f20945bf8482836d13ed1d47f117cf45684570d8 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 8 Apr 2016 13:13:10 -0400 Subject: [PATCH 52/90] update zone points in SVG --- web/skins/classic/views/js/zone.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/web/skins/classic/views/js/zone.js b/web/skins/classic/views/js/zone.js index 06f59479b..f2a275242 100644 --- a/web/skins/classic/views/js/zone.js +++ b/web/skins/classic/views/js/zone.js @@ -314,6 +314,15 @@ function getCoordString() function updateZoneImage() { + var SVG = $('zoneSVG'); + var Poly = $('zonePoly'); + Poly.points.clear(); + for ( var i = 0; i < zone['Points'].length; i++ ) { + var Point = SVG.createSVGPoint(); + Point.x = zone['Points'][i].x; + Point.y = zone['Points'][i].y; + Poly.points.appendItem( Point ); + } } function fixActivePoint( index ) @@ -362,6 +371,7 @@ function addPoint( index ) else zone['Points'].splice( nextIndex, 0, { 'x': newX, 'y': newY } ); drawZonePoints(); + updateZoneImage(); //setActivePoint( nextIndex ); } @@ -461,6 +471,8 @@ function drawZonePoints() row.inject( tables[i%tables.length].getElement( 'tbody' ) ); } + // Sets up the SVG polygon + updateZoneImage(); } function initPage() From 0ce85137dceeec193d705466671d6ca029cd85f4 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 8 Apr 2016 13:39:31 -0400 Subject: [PATCH 53/90] remove points. Don't need them here --- web/skins/classic/views/zones.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/web/skins/classic/views/zones.php b/web/skins/classic/views/zones.php index 785cff8f3..4553201d8 100644 --- a/web/skins/classic/views/zones.php +++ b/web/skins/classic/views/zones.php @@ -53,12 +53,6 @@ xhtmlHeaders(__FILE__, translate('Zones') ); ?> - - Sorry, your browser does not support inline SVG From f749ff47ead942d4ffa0846daf35689f4f1c60f7 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 8 Apr 2016 13:40:32 -0400 Subject: [PATCH 54/90] convert to monitor object --- web/skins/classic/views/js/zone.js.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/skins/classic/views/js/zone.js.php b/web/skins/classic/views/js/zone.js.php index 7e3145378..3ed7b1669 100644 --- a/web/skins/classic/views/js/zone.js.php +++ b/web/skins/classic/views/js/zone.js.php @@ -46,8 +46,8 @@ zone['Points'][] = { 'x': -var maxX = ; -var maxY = ; +var maxX = Width()-1 ?>; +var maxY = Height()-1 ?>; var selfIntersecting = ; var selfIntersectingString = ''; From 22f207602b2a681ba352660d024d88ac8b03d512 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 8 Apr 2016 13:43:00 -0400 Subject: [PATCH 55/90] add css for the svg zones --- web/skins/classic/css/classic/views/zone.css | 20 +++++++++++++++++++ web/skins/classic/css/classic/views/zones.css | 20 +++++++++++++++++++ web/skins/classic/css/dark/views/zone.css | 20 +++++++++++++++++++ web/skins/classic/css/dark/views/zones.css | 20 +++++++++++++++++++ web/skins/classic/css/flat/views/zone.css | 20 +++++++++++++++++++ web/skins/classic/css/flat/views/zones.css | 20 +++++++++++++++++++ 6 files changed, 120 insertions(+) create mode 100644 web/skins/classic/css/classic/views/zones.css create mode 100644 web/skins/classic/css/dark/views/zones.css create mode 100644 web/skins/classic/css/flat/views/zones.css diff --git a/web/skins/classic/css/classic/views/zone.css b/web/skins/classic/css/classic/views/zone.css index a86c5d1e4..52611f5ea 100644 --- a/web/skins/classic/css/classic/views/zone.css +++ b/web/skins/classic/css/classic/views/zone.css @@ -93,3 +93,23 @@ #zonePoints table a { margin: 0 2px; } +.zones polygon { + fill-opacity: 0.25; + stroke-width: 2px; +} +.Active { + stroke: #ff0000; + fill: #ff0000; +} +.Inclusive { + stroke: #FFA500; + fill: #FFA500; +} +.Exclusive { + stroke: #800080; + fill: #800080; +} +.Preclusive { + stroke: #0000FF; + fill: #0000FF; +} diff --git a/web/skins/classic/css/classic/views/zones.css b/web/skins/classic/css/classic/views/zones.css new file mode 100644 index 000000000..9952e5db4 --- /dev/null +++ b/web/skins/classic/css/classic/views/zones.css @@ -0,0 +1,20 @@ +.zones polygon { + fill-opacity: 0.25; + stroke-width: 2px; +} +.Active { + stroke: #ff0000; + fill: #ff0000; +} +.Inclusive { + stroke: #FFA500; + fill: #FFA500; +} +.Exclusive { + stroke: #800080; + fill: #800080; +} +.Preclusive { + stroke: #0000FF; + fill: #0000FF; +} diff --git a/web/skins/classic/css/dark/views/zone.css b/web/skins/classic/css/dark/views/zone.css index a86c5d1e4..52611f5ea 100644 --- a/web/skins/classic/css/dark/views/zone.css +++ b/web/skins/classic/css/dark/views/zone.css @@ -93,3 +93,23 @@ #zonePoints table a { margin: 0 2px; } +.zones polygon { + fill-opacity: 0.25; + stroke-width: 2px; +} +.Active { + stroke: #ff0000; + fill: #ff0000; +} +.Inclusive { + stroke: #FFA500; + fill: #FFA500; +} +.Exclusive { + stroke: #800080; + fill: #800080; +} +.Preclusive { + stroke: #0000FF; + fill: #0000FF; +} diff --git a/web/skins/classic/css/dark/views/zones.css b/web/skins/classic/css/dark/views/zones.css new file mode 100644 index 000000000..9952e5db4 --- /dev/null +++ b/web/skins/classic/css/dark/views/zones.css @@ -0,0 +1,20 @@ +.zones polygon { + fill-opacity: 0.25; + stroke-width: 2px; +} +.Active { + stroke: #ff0000; + fill: #ff0000; +} +.Inclusive { + stroke: #FFA500; + fill: #FFA500; +} +.Exclusive { + stroke: #800080; + fill: #800080; +} +.Preclusive { + stroke: #0000FF; + fill: #0000FF; +} diff --git a/web/skins/classic/css/flat/views/zone.css b/web/skins/classic/css/flat/views/zone.css index a86c5d1e4..52611f5ea 100644 --- a/web/skins/classic/css/flat/views/zone.css +++ b/web/skins/classic/css/flat/views/zone.css @@ -93,3 +93,23 @@ #zonePoints table a { margin: 0 2px; } +.zones polygon { + fill-opacity: 0.25; + stroke-width: 2px; +} +.Active { + stroke: #ff0000; + fill: #ff0000; +} +.Inclusive { + stroke: #FFA500; + fill: #FFA500; +} +.Exclusive { + stroke: #800080; + fill: #800080; +} +.Preclusive { + stroke: #0000FF; + fill: #0000FF; +} diff --git a/web/skins/classic/css/flat/views/zones.css b/web/skins/classic/css/flat/views/zones.css new file mode 100644 index 000000000..9952e5db4 --- /dev/null +++ b/web/skins/classic/css/flat/views/zones.css @@ -0,0 +1,20 @@ +.zones polygon { + fill-opacity: 0.25; + stroke-width: 2px; +} +.Active { + stroke: #ff0000; + fill: #ff0000; +} +.Inclusive { + stroke: #FFA500; + fill: #FFA500; +} +.Exclusive { + stroke: #800080; + fill: #800080; +} +.Preclusive { + stroke: #0000FF; + fill: #0000FF; +} From bbd33cc159902dec94b48a0b20e0174fb1cadf62 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 8 Apr 2016 13:56:49 -0400 Subject: [PATCH 56/90] add monitor class so we don't have to everywhere else --- web/index.php | 1 + 1 file changed, 1 insertion(+) diff --git a/web/index.php b/web/index.php index 72e6dc8c0..b26e6d3e6 100644 --- a/web/index.php +++ b/web/index.php @@ -49,6 +49,7 @@ if ( false ) require_once( 'includes/config.php' ); require_once( 'includes/logger.php' ); require_once( 'includes/Server.php' ); +require_once( 'includes/Monitor.php' ); if ( isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == 'on' ) { From 758a0341ceb3a5415d21f9a33a4afe861ccff79c Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 8 Apr 2016 14:09:59 -0400 Subject: [PATCH 57/90] convert monitor to object --- web/skins/classic/views/zone.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/web/skins/classic/views/zone.php b/web/skins/classic/views/zone.php index 01d5464bf..910faa50a 100644 --- a/web/skins/classic/views/zone.php +++ b/web/skins/classic/views/zone.php @@ -62,25 +62,25 @@ foreach ( getEnumValues( 'Zones', 'CheckMethod' ) as $optCheckMethod ) $monitor = new Monitor( $mid ); $minX = 0; -$maxX = $monitor['Width']-1; +$maxX = $monitor->Width()-1; $minY = 0; -$maxY = $monitor['Height']-1; +$maxY = $monitor->Height()-1; if ( !isset($newZone) ) { if ( $zid > 0 ) { - $zone = dbFetchOne( 'SELECT * FROM Zones WHERE MonitorId = ? AND Id=?', NULL, array( $monitor['Id'], $zid ) ); + $zone = dbFetchOne( 'SELECT * FROM Zones WHERE MonitorId = ? AND Id=?', NULL, array( $monitor->Id(), $zid ) ); } else { $zone = array( 'Name' => translate('New'), 'Id' => 0, - 'MonitorId' => $monitor['Id'], + 'MonitorId' => $monitor->Id(), 'NumCoords' => 4, 'Coords' => sprintf( "%d,%d %d,%d, %d,%d %d,%d", $minX, $minY, $maxX, $minY, $maxX, $maxY, $minX, $maxY ), - 'Area' => $monitor['Width'] * $monitor['Height'], + 'Area' => $monitor->Width() * $monitor->Height(), 'AlarmRGB' => 0xff0000, 'CheckMethod' => 'Blobs', 'MinPixelThreshold' => '', @@ -123,7 +123,7 @@ xhtmlHeaders(__FILE__, translate('Zone') );
@@ -209,7 +209,7 @@ xhtmlHeaders(__FILE__, translate('Zone') );
-
+
From b10c6ee0936f978bb4ba63db0c5404f8139bbf38 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 8 Apr 2016 14:23:44 -0400 Subject: [PATCH 58/90] fix Monitor capitalisation --- web/skins/classic/views/zones.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/skins/classic/views/zones.php b/web/skins/classic/views/zones.php index 4553201d8..4043917a0 100644 --- a/web/skins/classic/views/zones.php +++ b/web/skins/classic/views/zones.php @@ -47,7 +47,7 @@ xhtmlHeaders(__FILE__, translate('Zones') );
- + From c73e768f1ff76cf4e81c09c7de1ef13b3d206de9 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 8 Apr 2016 14:25:19 -0400 Subject: [PATCH 59/90] put in the onclick for the zone to open the edit page --- web/skins/classic/views/zones.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/skins/classic/views/zones.php b/web/skins/classic/views/zones.php index 4043917a0..ba7654a26 100644 --- a/web/skins/classic/views/zones.php +++ b/web/skins/classic/views/zones.php @@ -51,7 +51,7 @@ xhtmlHeaders(__FILE__, translate('Zones') ); - + From 6d27a857aa68dd87e3b87f3e48f55558d1bbf699 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 8 Apr 2016 14:38:50 -0400 Subject: [PATCH 60/90] put a zones class on the svg --- web/skins/classic/views/zones.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/skins/classic/views/zones.php b/web/skins/classic/views/zones.php index ba7654a26..940cce72a 100644 --- a/web/skins/classic/views/zones.php +++ b/web/skins/classic/views/zones.php @@ -47,7 +47,7 @@ xhtmlHeaders(__FILE__, translate('Zones') );
- + From dafdf1a28913b0d7997cb9a1c9c25f4ebfbf05a0 Mon Sep 17 00:00:00 2001 From: Andy Bauer Date: Fri, 8 Apr 2016 19:22:27 -0500 Subject: [PATCH 61/90] rpm specfile changes --- distros/fedora/zonemidner.f22.spec | 1 - distros/fedora/zoneminder.f22.spec | 409 +---------------------------- distros/fedora/zoneminder.f23.spec | 1 + distros/redhat/zoneminder.el6.spec | 1 + distros/redhat/zoneminder.el7.spec | 1 + 5 files changed, 4 insertions(+), 409 deletions(-) delete mode 120000 distros/fedora/zonemidner.f22.spec mode change 100644 => 120000 distros/fedora/zoneminder.f22.spec diff --git a/distros/fedora/zonemidner.f22.spec b/distros/fedora/zonemidner.f22.spec deleted file mode 120000 index 808e7cb9f..000000000 --- a/distros/fedora/zonemidner.f22.spec +++ /dev/null @@ -1 +0,0 @@ -zoneminder.f23.spec \ No newline at end of file diff --git a/distros/fedora/zoneminder.f22.spec b/distros/fedora/zoneminder.f22.spec deleted file mode 100644 index 40343090f..000000000 --- a/distros/fedora/zoneminder.f22.spec +++ /dev/null @@ -1,408 +0,0 @@ -%define zmuid $(id -un) -%define zmgid $(id -gn) -%define zmuid_final apache -%define zmgid_final apache - -%global _hardened_build 1 - -### Delete the lines below to build with ffmpeg and/or x10 -%define _without_ffmpeg 1 -%define _without_x10 1 - -Name: zoneminder -Version: 1.29.0 -Release: 1%{?dist} -Summary: A camera monitoring and analysis tool -Group: System Environment/Daemons -# jscalendar is LGPL (any version): http://www.dynarch.com/projects/calendar/ -# Mootools is inder the MIT license: http://mootools.net/ -License: GPLv2+ and LGPLv2+ and MIT -URL: http://www.zoneminder.com/ - -#Source: https://github.com/ZoneMinder/ZoneMinder/archive/v%{version}.tar.gz -Source: ZoneMinder-%{version}.tar.gz - -BuildRequires: cmake gnutls-devel systemd-units bzip2-devel -BuildRequires: mariadb-devel pcre-devel libjpeg-turbo-devel -BuildRequires: perl(Archive::Tar) perl(Archive::Zip) perl-podlators -BuildRequires: perl(Date::Manip) perl(DBD::mysql) -BuildRequires: perl(ExtUtils::MakeMaker) perl(LWP::UserAgent) -BuildRequires: perl(MIME::Entity) perl(MIME::Lite) -BuildRequires: perl(PHP::Serialization) perl(Sys::Mmap) -BuildRequires: perl(Time::HiRes) perl(Net::SFTP::Foreign) -BuildRequires: perl(Expect) perl(Sys::Syslog) -BuildRequires: gcc gcc-c++ vlc-devel libcurl-devel libv4l-devel -%{!?_without_ffmpeg:BuildRequires: ffmpeg-devel} -%{!?_without_x10:BuildRequires: perl(X10::ActiveHome) perl(Astro::SunTime)} -# cmake needs the following installed at build time due to the way it auto-detects certain parameters -BuildRequires: httpd polkit-devel -%{!?_without_ffmpeg:BuildRequires: ffmpeg} - -Requires: httpd php php-gd php-mysql cambozola polkit net-tools psmisc -Requires: libjpeg-turbo vlc-core libcurl -Requires: perl(:MODULE_COMPAT_%(eval "`%{__perl} -V:version`"; echo $version)) -Requires: perl(DBD::mysql) perl(Archive::Tar) perl(Archive::Zip) -Requires: perl(MIME::Entity) perl(MIME::Lite) perl(Net::SMTP) perl(Net::FTP) -Requires: perl(LWP::Protocol::https) -%{!?_without_ffmpeg:Requires: ffmpeg} - -Requires(post): systemd-units systemd-sysv -Requires(post): /usr/bin/gpasswd -Requires(post): /usr/bin/less -Requires(preun): systemd-units -Requires(postun): systemd-units - -%description -ZoneMinder is a set of applications which is intended to provide a complete -solution allowing you to capture, analyse, record and monitor any cameras you -have attached to a Linux based machine. It is designed to run on kernels which -support the Video For Linux (V4L) interface and has been tested with cameras -attached to BTTV cards, various USB cameras and IP network cameras. It is -designed to support as many cameras as you can attach to your computer without -too much degradation of performance. - -%prep -%setup -q -n ZoneMinder-%{version} - -# Change the following default values -./utils/zmeditconfigdata.sh ZM_PATH_ZMS /cgi-bin-zm/nph-zms -./utils/zmeditconfigdata.sh ZM_OPT_CAMBOZOLA yes -./utils/zmeditconfigdata.sh ZM_PATH_SWAP /dev/shm -./utils/zmeditconfigdata.sh ZM_UPLOAD_FTP_LOC_DIR /var/spool/zoneminder-upload -./utils/zmeditconfigdata.sh ZM_OPT_CONTROL yes -./utils/zmeditconfigdata.sh ZM_CHECK_FOR_UPDATES no -./utils/zmeditconfigdata.sh ZM_DYN_SHOW_DONATE_REMINDER no - -%build -%cmake \ - -DZM_TARGET_DISTRO="f22" \ -%{?_without_ffmpeg:-DZM_NO_FFMPEG=ON} \ -%{?_without_x10:-DZM_NO_X10=ON} \ - . - -make %{?_smp_mflags} - -%install -export DESTDIR=%{buildroot} -make install - -%post -if [ $1 -eq 1 ] ; then - # Initial installation - /bin/systemctl daemon-reload >/dev/null 2>&1 || : -fi - -# Allow zoneminder access to local video sources, serial ports, and x10 -/usr/bin/gpasswd -a %{zmuid_final} video -/usr/bin/gpasswd -a %{zmuid_final} dialout - -# Upgrade from a previous version of zoneminder -if [ $1 -eq 2 ] ; then - # Freshen the database - /usr/bin/zmupdate.pl -f - - # We can't run this automatically when new sql account permissions need to - # be manually added first - # Run zmupdate non-interactively - #/usr/bin/zmupdate.pl --nointeractive -fi - -# Warn the end user to read the README file -echo -e "\nVERY IMPORTANT: Before starting ZoneMinder, read README.Fedora to finish the\ninstallation or upgrade!\n" -echo -e "\nThe README file is located here: %{_docdir}/%{name}\n" - -%preun -if [ $1 -eq 0 ] ; then - # Package removal, not upgrade - /bin/systemctl --no-reload disable zoneminder.service > /dev/null 2>&1 || : - /bin/systemctl stop zoneminder.service > /dev/null 2>&1 || : -fi - -%postun -/bin/systemctl daemon-reload >/dev/null 2>&1 || : -if [ $1 -ge 1 ] ; then - # Package upgrade, not uninstall - /bin/systemctl try-restart zoneminder.service >/dev/null 2>&1 || : -fi - -%triggerun -- zoneminder < 1.25.0-4 -# Save the current service runlevel info -# User must manually run systemd-sysv-convert --apply zoneminder -# to migrate them to systemd targets -/usr/bin/systemd-sysv-convert --save zoneminder >/dev/null 2>&1 ||: - -# Run these because the SysV package being removed won't do them -/sbin/chkconfig --del zoneminder >/dev/null 2>&1 || : -/bin/systemctl try-restart zoneminder.service >/dev/null 2>&1 || : - - -%files -%defattr(-,root,root,-) -%doc AUTHORS COPYING README.md distros/fedora/README.Fedora distros/fedora/README.https distros/fedora/jscalendar-doc -%config %attr(640,root,%{zmgid_final}) /etc/zm/zm.conf -%config(noreplace) %attr(644,root,root) /etc/httpd/conf.d/zoneminder.conf -%config(noreplace) /etc/tmpfiles.d/zoneminder.conf -%config(noreplace) /etc/logrotate.d/zoneminder - -%{_unitdir}/zoneminder.service - -%{_bindir}/zma -%{_bindir}/zmaudit.pl -%{_bindir}/zmc -%{_bindir}/zmcontrol.pl -%{_bindir}/zmdc.pl -%{_bindir}/zmf -%{_bindir}/zmfilter.pl -%{_bindir}/zmpkg.pl -%{_bindir}/zmtrack.pl -%{_bindir}/zmtrigger.pl -%{_bindir}/zmu -%{_bindir}/zmupdate.pl -%{_bindir}/zmvideo.pl -%{_bindir}/zmwatch.pl -%{_bindir}/zmcamtool.pl -%{_bindir}/zmsystemctl.pl -%{!?_without_x10:%{_bindir}/zmx10.pl} - -%{perl_vendorlib}/ZoneMinder* -%{_mandir}/man*/* -%dir %{_libexecdir}/zoneminder -%{_libexecdir}/zoneminder/cgi-bin -%dir %{_datadir}/zoneminder -%{_datadir}/zoneminder/db -%{_datadir}/zoneminder/www - -%{_datadir}/polkit-1/actions/com.zoneminder.systemctl.policy -%{_datadir}/polkit-1/rules.d/com.zoneminder.systemctl.rules - -%dir %attr(755,%{zmuid_final},%{zmgid_final}) /var/lib/zoneminder -%dir %attr(755,%{zmuid_final},%{zmgid_final}) /var/lib/zoneminder/events -%dir %attr(755,%{zmuid_final},%{zmgid_final}) /var/lib/zoneminder/images -%dir %attr(755,%{zmuid_final},%{zmgid_final}) /var/lib/zoneminder/sock -%dir %attr(755,%{zmuid_final},%{zmgid_final}) /var/lib/zoneminder/swap -%dir %attr(755,%{zmuid_final},%{zmgid_final}) /var/lib/zoneminder/temp -%dir %attr(755,%{zmuid_final},%{zmgid_final}) /var/log/zoneminder -%dir %attr(755,%{zmuid_final},%{zmgid_final}) /var/spool/zoneminder-upload -%dir %attr(755,%{zmuid_final},%{zmgid_final}) /run/zoneminder - - -%changelog -* Sat Feb 14 2015 Andrew Bauer - 1.28.1 -- Bump version for 1.28.1 release on Fedora 21. - -* Sun Oct 5 2014 Andrew Bauer - 1.28.0 -- Bump version for 1.28.0 release. - -* Fri Mar 14 2014 Andrew Bauer - 1.27 -- Tweak build requirements for cmake - -* Sat Feb 01 2014 Andrew Bauer - 1.27 -- Add zmcamtool.pl. Bump version for 1.27 release. - -* Mon Dec 16 2013 Andrew Bauer - 1.26.5 -- This is a bug fixe release -- RTSP fixes, cmake enhancements, couple other misc fixes - -* Mon Oct 07 2013 Andrew Bauer - 1.26.4 -- Initial cmake build. - -* Sat Oct 05 2013 Andrew Bauer - 1.26.4 -- Fedora specific path changes have been moved to zoneminder-1.26.0-defaults.patch -- All files are now part of the zoneminder source tree. Update specfile accordingly. - -* Sat Sep 21 2013 Andrew Bauer - 1.26.3 -- Initial rebuild for ZoneMinder 1.26.3 release. - -* Fri Feb 15 2013 Fedora Release Engineering - 1.25.0-13 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild - -* Mon Jan 21 2013 Adam Tkac - 1.25.0-12 -- rebuild due to "jpeg8-ABI" feature drop - -* Mon Jan 7 2013 Remi Collet - 1.25.0-11 -- fix configuration file for httpd 2.4, #871502 - -* Fri Dec 21 2012 Adam Tkac - 1.25.0-10 -- rebuild against new libjpeg - -* Thu Aug 09 2012 Jason L Tibbitts III - 1.25.0-9 -- Add patch to work around v4l2 api breakage in 3.5 kernel. - -* Sun Jul 22 2012 Fedora Release Engineering - 1.25.0-8 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild - -* Sat Jun 23 2012 Petr Pisar - 1.25.0-7 -- Perl 5.16 rebuild - -* Wed Mar 21 2012 Jason L Tibbitts III - 1.25.0-6 -- Fix stupid thinko in sql modifications. - -* Sat Feb 25 2012 Jason L Tibbitts III - 1.25.0-5 -- Clean up macro usage. - -* Sat Feb 25 2012 Jason L Tibbitts III - 1.25.0-4 -- Convert to systemd. -- Add tmpfiles.d configuration since the initscript isn't around to create - /run/zoneminder. -- Remove some pointless executable permissions. -- Add logrotate file. - -* Wed Feb 22 2012 Jason L Tibbitts III - 1.25.0-3 -- Update README.Fedora to reference systemctl and mention timezone info in - php.ini. -- Add proper default for EYEZM_LOG_TO_FILE. - - -* Thu Feb 09 2012 Jason L Tibbitts III - 1.25.0-2 -- Rebuild for new pcre. - -* Thu Jan 19 2012 Jason L Tibbitts III - 1.25.0-1 -- Update to 1.25.0 -- Fix gcc4.7 build problems. -- Drop gcc4.4 build fixes; for whatever reason they now break the build. -- Clean up old patches. -- Force setting of ZM_TMPDIR and ZM_RUNDIR. - -* Sat Jan 14 2012 Fedora Release Engineering - 1.24.4-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild - -* Thu Sep 15 2011 Jason L Tibbitts III - 1.24.4-3 -- Re-add the dist-tag that somehow got lost. - -* Thu Sep 15 2011 Jason L Tibbitts III - 1.24.4-2 -- Add patch for bug 711780 - fix syntax issue in Mapped.pm. -- Undo that patch, and undo another which was the cause of the whole mess. -- Fix up other patches so ZM_PATH_BUILD is both defined and useful. -- Make sure database creation mods actually take. -- Update Fedora-specific docs with some additional info. -- Use bundled mootools (javascript, so no guideline violation). -- Update download location. -- Update the gcrypt patch to actually work. -- Upstream changed the tarball without changing the version to patch a - vulnerability, so redownload. - -* Sun Aug 14 2011 Jason L Tibbitts III - 1.24.4-1 -- Initial attempt to upgrade to 1.24.4. -- Add patch from BZ 460310 to build against libgcrypt instead of requiring the - gnutls openssl libs. - -* Thu Jul 21 2011 Petr Sabata - 1.24.3-7.20110324svn3310 -- Perl mass rebuild - -* Wed Jul 20 2011 Petr Sabata - 1.24.3-6.20110324svn3310 -- Perl mass rebuild - -* Mon May 09 2011 Jason L Tibbitts III - 1.24.3-5.20110324svn3310 -- Bump for gnutls update. - -* Thu Mar 24 2011 Jason L Tibbitts III - 1.24.3-4.20110324svn3310 -- Update to latest 1.24.3 subversion. Turns out that what upstream was calling - 1.24.3 is really just an occasionally updated devel snapshot. -- Rebase various patches. - -* Wed Mar 23 2011 Dan Horák - 1.24.3-3 -- rebuilt for mysql 5.5.10 (soname bump in libmysqlclient) - -* Tue Feb 08 2011 Fedora Release Engineering - 1.24.3-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild - -* Tue Jan 25 2011 Jason L Tibbitts III - 1.24.3-1 -- Update to latest upstream version. -- Rebase patches. -- Initial incomplete attempt to disable v4l1 support. - -* Fri Jan 21 2011 Jason L Tibbitts III - 1.24.2-6 -- Unbundle cambozola; instead link to the separately pacakged copy. -- Remove BuildRoot:, %%clean and buildroot cleaning in %%install. -- Git rid of mixed space/tab usage by removing all tabs. -- Remove unnecessary Conflicts: line. -- Attempt to force short_open_tag on for the code directories. -- Move default location of sockets, swaps, logfiles and some temporary files to - make more sense and allow things to work better with a future selinux policy. -- Fix errors in README.Fedora. - -* Wed Jun 02 2010 Marcela Maslanova - 1.24.2-5 -- Mass rebuild with perl-5.12.0 - -* Fri Dec 4 2009 Stepan Kasal - 1.24.2-4 -- rebuild against perl 5.10.1 -- use Perl vendorarch and archlib variables correctly - -* Mon Jul 27 2009 Fedora Release Engineering - 1.24.2-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild - -* Wed Jul 22 2009 Jason L Tibbitts III - 1.24.2-2 -- Bump release since 1.24.2-1 was mistakenly tagged a few months ago. - -* Wed Jul 22 2009 Jason L Tibbitts III - 1.24.2-1 -- Initial update to 1.24.2. -- Rebase patches. -- Update mootools download location. -- Update to mootools 1.2.3. -- Add additional dependencies for some optional features. - -* Sat Apr 11 2009 Martin Ebourne - 1.24.1-3 -- Remove unused Sys::Mmap perl dependency RPM is finding - -* Sat Apr 11 2009 Martin Ebourne - 1.24.1-2 -- Update gcc44 patch to disable -frepo, seems to be broken with gcc44 -- Added noffmpeg patch to make building outside mock easier - -* Sat Mar 21 2009 Martin Ebourne - 1.24.1-1 -- Patch for gcc 4.4 compilation errors -- Upgrade to 1.24.1 - -* Wed Feb 25 2009 Fedora Release Engineering - 1.23.3-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild - -* Sat Jan 24 2009 Caolán McNamara - 1.23.3-3 -- rebuild for dependencies - -* Mon Dec 15 2008 Martin Ebourne - 1.23.3-2 -- Fix permissions on zm.conf - -* Fri Jul 11 2008 Jason L Tibbitts III - 1.23.3-1 -- Initial attempt at packaging 1.23. - -* Tue Jul 1 2008 Martin Ebourne - 1.22.3-15 -- Add perl module compat dependency, bz #453590 - -* Tue May 6 2008 Martin Ebourne - 1.22.3-14 -- Remove default runlevel, bz #441315 - -* Mon Apr 28 2008 Jason L Tibbitts III - 1.22.3-13 -- Backport patch for CVE-2008-1381 from 1.23.3 to 1.22.3. - -* Tue Feb 19 2008 Fedora Release Engineering - 1.22.3-12 -- Autorebuild for GCC 4.3 - -* Thu Jan 3 2008 Martin Ebourne - 1.22.3-11 -- Fix compilation on gcc 4.3 - -* Thu Dec 6 2007 Martin Ebourne - 1.22.3-10 -- Rebuild for new openssl - -* Thu Aug 2 2007 Martin Ebourne - 1.22.3-8 -- Fix licence tag - -* Thu Jul 12 2007 Martin Ebourne - 1.22.3-7 -- Fixes from testing by Jitz including missing dependencies and database creation - -* Sat Jun 30 2007 Martin Ebourne - 1.22.3-6 -- Disable crashtrace on ppc - -* Sat Jun 30 2007 Martin Ebourne - 1.22.3-5 -- Fix uid for directories in /var/lib/zoneminder - -* Tue Jun 26 2007 Martin Ebourne - 1.22.3-4 -- Added perl Archive::Tar dependency -- Disabled web interface due to lack of access control on the event images - -* Sun Jun 10 2007 Martin Ebourne - 1.22.3-3 -- Changes recommended in review by Jason Tibbitts - -* Mon Apr 2 2007 Martin Ebourne - 1.22.3-2 -- Standardised on package name of zoneminder - -* Thu Dec 28 2006 Martin Ebourne - 1.22.3-1 -- First version. Uses some parts from zm-1.20.1 by Corey DeLasaux and Serg Oskin diff --git a/distros/fedora/zoneminder.f22.spec b/distros/fedora/zoneminder.f22.spec new file mode 120000 index 000000000..808e7cb9f --- /dev/null +++ b/distros/fedora/zoneminder.f22.spec @@ -0,0 +1 @@ +zoneminder.f23.spec \ No newline at end of file diff --git a/distros/fedora/zoneminder.f23.spec b/distros/fedora/zoneminder.f23.spec index 1f44e5671..5335b90cc 100644 --- a/distros/fedora/zoneminder.f23.spec +++ b/distros/fedora/zoneminder.f23.spec @@ -179,6 +179,7 @@ fi %{perl_vendorlib}/ONVIF* %{perl_vendorlib}/WSDiscovery* %{perl_vendorlib}/WSSecurity* +%{perl_vendorlib}/WSNotification* %{_mandir}/man*/* %dir %{_libexecdir}/zoneminder %{_libexecdir}/zoneminder/cgi-bin diff --git a/distros/redhat/zoneminder.el6.spec b/distros/redhat/zoneminder.el6.spec index baf89ca8a..0b7770b50 100644 --- a/distros/redhat/zoneminder.el6.spec +++ b/distros/redhat/zoneminder.el6.spec @@ -168,6 +168,7 @@ rm -rf %{_docdir}/%{name}-%{version} %{perl_vendorlib}/ONVIF* %{perl_vendorlib}/WSDiscovery* %{perl_vendorlib}/WSSecurity* +%{perl_vendorlib}/WSNotification* %{_mandir}/man*/* %dir %{_libexecdir}/%{name} %{_libexecdir}/%{name}/cgi-bin diff --git a/distros/redhat/zoneminder.el7.spec b/distros/redhat/zoneminder.el7.spec index 3ec03b746..b72e0bbe7 100644 --- a/distros/redhat/zoneminder.el7.spec +++ b/distros/redhat/zoneminder.el7.spec @@ -177,6 +177,7 @@ fi %{perl_vendorlib}/ONVIF* %{perl_vendorlib}/WSDiscovery* %{perl_vendorlib}/WSSecurity* +%{perl_vendorlib}/WSNotification* %{_mandir}/man*/* %dir %{_libexecdir}/zoneminder %{_libexecdir}/zoneminder/cgi-bin From e90024c0d05741c3bbe06c91a9fdd3009a7a0e0c Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Sat, 9 Apr 2016 09:27:12 -0400 Subject: [PATCH 62/90] Better Error logging on disk_total_space failure --- web/includes/functions.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/web/includes/functions.php b/web/includes/functions.php index 25d81bb44..6d95253a3 100644 --- a/web/includes/functions.php +++ b/web/includes/functions.php @@ -1668,6 +1668,10 @@ function getLoad() function getDiskPercent() { $total = disk_total_space(ZM_DIR_EVENTS); + if ( ! $total ) { + Error("disk_total_space returned false for " . ZM_DIR_EVENTS ); + return 0; + } $space = round(($total - disk_free_space(ZM_DIR_EVENTS)) / $total * 100); return( $space ); } From a6500bc61e7c19fc279ff3d2439fcc65cccac839 Mon Sep 17 00:00:00 2001 From: "Jan M. Hochstein" Date: Sat, 9 Apr 2016 16:53:41 +0200 Subject: [PATCH 63/90] Added XML header in serializer --- onvif/modules/lib/ONVIF/Serializer/Base.pm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/onvif/modules/lib/ONVIF/Serializer/Base.pm b/onvif/modules/lib/ONVIF/Serializer/Base.pm index 7bab331cf..adbb173c6 100644 --- a/onvif/modules/lib/ONVIF/Serializer/Base.pm +++ b/onvif/modules/lib/ONVIF/Serializer/Base.pm @@ -97,8 +97,11 @@ sub serialize { my $soap_prefix = $opt->{ namespace }->{ $SOAP_NS }; - # envelope start with namespaces - my $xml = "<$soap_prefix\:Envelope "; + # XML starts with header + my $xml = "\n"; + + # envelope starts with namespaces + $xml .= "<$soap_prefix\:Envelope "; while (my ($uri, $prefix) = each %{ $opt->{ namespace } }) { From ce6f8da098644ed7db8c46861f478bf588ee2b75 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Sat, 9 Apr 2016 11:23:35 -0400 Subject: [PATCH 64/90] Use PDO::error_string instead of mysql_error --- web/includes/database.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/includes/database.php b/web/includes/database.php index 2d7bfd7a9..809145032 100644 --- a/web/includes/database.php +++ b/web/includes/database.php @@ -81,7 +81,7 @@ function dbLog( $sql, $update=false ) function dbError( $sql ) { - Fatal( "SQL-ERR '".mysql_error()."', statement was '".$sql."'" ); + Fatal( "SQL-ERR '".$dbConn->errorInfo()."', statement was '".$sql."'" ); } function dbEscape( $string ) From feb7b36f11e259fe0c64e60a00aa751d928d662f Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Sat, 9 Apr 2016 11:23:52 -0400 Subject: [PATCH 65/90] use a local variable to prevent modifying the arguments --- web/includes/functions.php | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/web/includes/functions.php b/web/includes/functions.php index 6d95253a3..41b000a4d 100644 --- a/web/includes/functions.php +++ b/web/includes/functions.php @@ -1307,26 +1307,30 @@ function executeFilter( $filter ) return( $status ); } +# This takes more than one scale amount, so it runs through each and alters dimension. +# I can't imagine why you would want to do that. function reScale( $dimension, $dummy ) { + $new_dimension = $dimension; for ( $i = 1; $i < func_num_args(); $i++ ) { $scale = func_get_arg( $i ); if ( !empty($scale) && $scale != SCALE_BASE ) - $dimension = (int)(($dimension*$scale)/SCALE_BASE); + $new_dimension = (int)(($new_dimension*$scale)/SCALE_BASE); } - return( $dimension ); + return( $new_dimension ); } function deScale( $dimension, $dummy ) { + $new_dimension = $dimension; for ( $i = 1; $i < func_num_args(); $i++ ) { $scale = func_get_arg( $i ); if ( !empty($scale) && $scale != SCALE_BASE ) - $dimension = (int)(($dimension*SCALE_BASE)/$scale); + $new_dimension = (int)(($new_dimension*SCALE_BASE)/$scale); } - return( $dimension ); + return( $new_dimension ); } function monitorLimitSql() From 0c8e0ac220fa651a3a959e293ff6ac2b0a553bca Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Sat, 9 Apr 2016 11:24:59 -0400 Subject: [PATCH 66/90] change quotes to prevent php7 complaint --- web/skins/classic/views/zone.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/skins/classic/views/zone.php b/web/skins/classic/views/zone.php index 69c0919e9..48bffe0b0 100644 --- a/web/skins/classic/views/zone.php +++ b/web/skins/classic/views/zone.php @@ -29,7 +29,7 @@ $zid = !empty($_REQUEST['zid'])?validInt($_REQUEST['zid']):0; $scale = SCALE_BASE; -$hicolor = "0x00ff00"; // Green +$hicolor = '0x00ff00'; // Green $presets = array(); $presetNames = array(); From c0c543e02996f5e08111c63436f0371e280d4d11 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Sat, 9 Apr 2016 11:25:56 -0400 Subject: [PATCH 67/90] change quotes to prevent php7 complaint --- web/ajax/zone.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/ajax/zone.php b/web/ajax/zone.php index 905ef7ac1..bfa77a922 100644 --- a/web/ajax/zone.php +++ b/web/ajax/zone.php @@ -17,7 +17,7 @@ if ( canView( 'Monitors' ) ) { $wd = getcwd(); chdir( ZM_DIR_IMAGES ); - $hiColor = "0x00ff00"; + $hiColor = '0x00ff00'; $command = getZmuCommand( " -m ".$_REQUEST['mid']." -z" ); if ( !isset($_REQUEST['zid']) ) From c1526b8fe5567ad386d957ffb337fb01d9273284 Mon Sep 17 00:00:00 2001 From: Jon Burgess Date: Sat, 9 Apr 2016 17:02:36 +0100 Subject: [PATCH 68/90] ONVIF: Fix probe type header and add To header --- onvif/scripts/zmonvif-probe.pl | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/onvif/scripts/zmonvif-probe.pl b/onvif/scripts/zmonvif-probe.pl index 6f318ef5e..93c12959f 100755 --- a/onvif/scripts/zmonvif-probe.pl +++ b/onvif/scripts/zmonvif-probe.pl @@ -31,6 +31,7 @@ require ONVIF::Client; require WSDiscovery10::Interfaces::WSDiscovery::WSDiscoveryPort; require WSDiscovery10::Elements::Types; require WSDiscovery10::Elements::Scopes; +require WSDiscovery10::Elements::To; require WSDiscovery::TransportUDP; @@ -178,9 +179,10 @@ sub discover my $result = $svc_discover->ProbeOp( { # WSDiscovery::Types::ProbeType - Types => { 'dn:NetworkVideoTransmitter', 'tds:Device' }, # QNameListType + Types => 'http://www.onvif.org/ver10/network/wsdl:NetworkVideoTransmitter http://www.onvif.org/ver10/device/wsdl:Device', # QNameListType Scopes => { value => '' }, - },, + }, + WSDiscovery10::Elements::To->new({ value => 'urn:schemas-xmlsoap-org:ws:2005:04:discovery' }) ); # print $result . "\n"; @@ -197,9 +199,10 @@ sub discover $result = $svc_discover->ProbeOp( { # WSDiscovery::Types::ProbeType - Types => { 'dn:NetworkVideoTransmitter', 'tds:Device' }, # QNameListType + Types => 'http://www.onvif.org/ver10/network/wsdl:NetworkVideoTransmitter http://www.onvif.org/ver10/device/wsdl:Device', # QNameListType Scopes => { value => '' }, - },, + }, + WSDiscovery10::Elements::To->new({ value => 'urn:schemas-xmlsoap-org:ws:2005:04:discovery' }) ); # print $result . "\n"; From e7d35d16bcda32643f2f7e18f55dce7cffe97a12 Mon Sep 17 00:00:00 2001 From: Andy Bauer Date: Sat, 9 Apr 2016 21:34:30 -0500 Subject: [PATCH 69/90] add monitor alarm state and fps to zone edit view --- web/skins/classic/views/js/zone.js | 238 ++++++++++++++++++++++++- web/skins/classic/views/js/zone.js.php | 52 ++++++ web/skins/classic/views/zone.php | 9 +- 3 files changed, 295 insertions(+), 4 deletions(-) diff --git a/web/skins/classic/views/js/zone.js b/web/skins/classic/views/js/zone.js index f2a275242..4e4db8306 100644 --- a/web/skins/classic/views/js/zone.js +++ b/web/skins/classic/views/js/zone.js @@ -475,8 +475,216 @@ function drawZonePoints() updateZoneImage(); } -function initPage() +// +// Imported from watch.js and modified for new zone edit view +// + +function setButtonState( element, butClass ) { + element.className = butClass; + element.disabled = (butClass != 'inactive'); +} + +var alarmState = STATE_IDLE; +var lastAlarmState = STATE_IDLE; + +function setAlarmState( currentAlarmState ) { + alarmState = currentAlarmState; + + var stateString = "Unknown"; + var stateClass = ""; + if ( alarmState == STATE_ALARM ) + stateClass = "alarm"; + else if ( alarmState == STATE_ALERT ) + stateClass = "alert"; + $('stateValue').set( 'text', stateStrings[alarmState] ); + if ( stateClass ) + $('stateValue').setProperty( 'class', stateClass ); + else + $('stateValue').removeProperty( 'class' ); + + var isAlarmed = ( alarmState == STATE_ALARM || alarmState == STATE_ALERT ); + var wasAlarmed = ( lastAlarmState == STATE_ALARM || lastAlarmState == STATE_ALERT ); + + var newAlarm = ( isAlarmed && !wasAlarmed ); + var oldAlarm = ( !isAlarmed && wasAlarmed ); + + if ( newAlarm ) + { + if ( SOUND_ON_ALARM ) + { + // Enable the alarm sound + if ( !canPlayPauseAudio ) + $('alarmSound').removeClass( 'hidden' ); + else + $('MediaPlayer').Play(); + } + } + if ( SOUND_ON_ALARM ) + { + if ( oldAlarm ) + { + // Disable alarm sound + if ( !canPlayPauseAudio ) + $('alarmSound').addClass( 'hidden' ); + else + $('MediaPlayer').Stop(); + } + } + lastAlarmState = alarmState; +} + +var streamCmdParms = "view=request&request=stream&connkey="+connKey; +var streamCmdReq = new Request.JSON( { url: monitorUrl+thisUrl, method: 'post', timeout: AJAX_TIMEOUT, link: 'cancel', onSuccess: getStreamCmdResponse } ); +var streamCmdTimer = null; + +var streamStatus; + +function getStreamCmdResponse( respObj, respText ) { + watchdogOk("stream"); + if ( streamCmdTimer ) + streamCmdTimer = clearTimeout( streamCmdTimer ); + + if ( respObj.result == 'Ok' ) { + streamStatus = respObj.status; + $('fpsValue').set( 'text', streamStatus.fps ); + + setAlarmState( streamStatus.state ); + + var delayString = secsToTime( streamStatus.delay ); + + if ( streamStatus.paused == true ) + { + streamCmdPause( false ); + } else if ( streamStatus.delayed == true && streamStatus.rate == 1 ) { + streamCmdPlay( false ); + } + } else { + checkStreamForErrors("getStreamCmdResponse",respObj);//log them + // Try to reload the image stream. + var streamImg = document.getElementById('liveStream'); + if ( streamImg ) + streamImg.src = streamImg.src.replace(/rand=\d+/i,'rand='+Math.floor((Math.random() * 1000000) )); + } + + var streamCmdTimeout = statusRefreshTimeout; + if ( alarmState == STATE_ALARM || alarmState == STATE_ALERT ) + streamCmdTimeout = streamCmdTimeout/5; + streamCmdTimer = streamCmdQuery.delay( streamCmdTimeout ); +} + +var streamPause = false; + +function streamCmdPauseToggle() { + if ( streamPause == true ) { + streamCmdPlay( true ); + streamPause = false; + document.getElementById("pauseBtn").value = pauseString; + } else { + streamCmdPause( true ); + streamPause = true; + document.getElementById("pauseBtn").value = playString; + } +} + +function streamCmdPause( action ) { + if ( action ) + streamCmdReq.send( streamCmdParms+"&command="+CMD_PAUSE ); +} + +function streamCmdPlay( action ) { + if ( action ) + streamCmdReq.send( streamCmdParms+"&command="+CMD_PLAY ); +} + +function streamCmdStop( action ) { + if ( action ) + streamCmdReq.send( streamCmdParms+"&command="+CMD_STOP ); +} + +function streamCmdQuery() { + streamCmdReq.send( streamCmdParms+"&command="+CMD_QUERY ); +} + +var statusCmdParms = "view=request&request=status&entity=monitor&id="+monitorId+"&element[]=Status&element[]=FrameRate"; +var statusCmdReq = new Request.JSON( { url: monitorUrl+thisUrl, method: 'post', data: statusCmdParms, timeout: AJAX_TIMEOUT, link: 'cancel', onSuccess: getStatusCmdResponse } ); +var statusCmdTimer = null; + +function getStatusCmdResponse( respObj, respText ) { + watchdogOk("status"); + if ( statusCmdTimer ) + statusCmdTimer = clearTimeout( statusCmdTimer ); + + if ( respObj.result == 'Ok' ) + { + $('fpsValue').set( 'text', respObj.monitor.FrameRate ); + setAlarmState( respObj.monitor.Status ); + } + else + checkStreamForErrors("getStatusCmdResponse",respObj); + + var statusCmdTimeout = statusRefreshTimeout; + if ( alarmState == STATE_ALARM || alarmState == STATE_ALERT ) + statusCmdTimeout = statusCmdTimeout/5; + statusCmdTimer = statusCmdQuery.delay( statusCmdTimeout ); +} + +function statusCmdQuery() { + statusCmdReq.send(); +} + +var tempImage = null; + +function fetchImage( streamImage ) { + var now = new Date(); + if ( !tempImage ) + tempImage = new Element( 'img' ); + tempImage.setProperty( 'src', streamSrc+'&'+now.getTime() ); + $(streamImage).setProperty( 'src', tempImage.getProperty( 'src' ) ); +} + +function appletRefresh() { + if ( streamStatus && (!streamStatus.paused && !streamStatus.delayed) ) + { + var streamImg = $('liveStream'); + var parent = streamImg.getParent(); + streamImg.dispose(); + streamImg.inject( parent ); + if ( appletRefreshTime ) + appletRefresh.delay( appletRefreshTime*1000 ); + } + else + { + appletRefresh.delay( 15*1000 ); //if we are paused or delayed check every 15 seconds if we are live yet... + } +} + +var watchdogInactive = { + 'stream': false, + 'status': false +}; + +var watchdogFunctions = { + 'stream': streamCmdQuery, + 'status': statusCmdQuery +}; + +//Make sure the various refreshes are still taking effect +function watchdogCheck( type ) { + if ( watchdogInactive[type] ) { + console.log( "Detected streamWatch of type: " + type + " stopped, restarting" ); + watchdogFunctions[type](); + watchdogInactive[type] = false; + } else { + watchdogInactive[type] = true; + } +} + +function watchdogOk( type ) { + watchdogInactive[type] = false; +} + +function initPage() { var form = document.zoneForm; //form.elements['newZone[Name]'].disabled = true; @@ -503,13 +711,37 @@ function initPage() applyZoneType(); - if ( form.elements['newZone[Units]'].value == 'Percent' ) - { + if ( form.elements['newZone[Units]'].value == 'Percent' ) { applyZoneUnits(); } applyCheckMethod(); drawZonePoints(); + +// +// Imported from watch.js and modified for new zone edit view +// + + if ( streamMode == "single" ) { + statusCmdTimer = statusCmdQuery.delay( (Math.random()+0.1)*statusRefreshTimeout ); + watchdogCheck.pass('status').periodical(statusRefreshTimeout*2); + } else { + streamCmdTimer = streamCmdQuery.delay( (Math.random()+0.1)*statusRefreshTimeout ); + watchdogCheck.pass('stream').periodical(statusRefreshTimeout*2); + } + + if ( canStreamNative || streamMode == "single" ) { + var streamImg = $('imageFrame').getElement('img'); + if ( !streamImg ) + streamImg = $('imageFrame').getElement('object'); + if ( streamMode == "single" ) { + streamImg.addEvent( 'click', fetchImage.pass( streamImg ) ); + fetchImage.pass( streamImg ).periodical( imageRefreshTimeout ); + } + } + + if ( refreshApplet && appletRefreshTime ) + appletRefresh.delay( appletRefreshTime*1000 ); } window.addEvent( 'domready', initPage ); diff --git a/web/skins/classic/views/js/zone.js.php b/web/skins/classic/views/js/zone.js.php index 3ed7b1669..85f606d2a 100644 --- a/web/skins/classic/views/js/zone.js.php +++ b/web/skins/classic/views/js/zone.js.php @@ -65,3 +65,55 @@ var minBlobAreaLtMaxString = ''; var minBlobsUnsetString = ''; var minBlobsLtMaxString = ''; + +// +// Imported from watch.js.php and modified for new zone edit view +// + +var STATE_IDLE = ; +var STATE_PREALARM = ; +var STATE_ALARM = ; +var STATE_ALERT = ; +var STATE_TAPE = ; + +var stateStrings = new Array(); +stateStrings[STATE_IDLE] = ""; +stateStrings[STATE_PREALARM] = ""; +stateStrings[STATE_ALARM] = ""; +stateStrings[STATE_ALERT] = ""; +stateStrings[STATE_TAPE] = ""; + +var pauseString = ""; +var playString = ""; + +var deleteString = ""; + +var CMD_PAUSE = ; +var CMD_PLAY = ; +var CMD_STOP = ; +var CMD_QUERY = ; + +var SCALE_BASE = ; + +var SOUND_ON_ALARM = ; + +var streamMode = ""; + +var connKey = ''; + +var monitorId = Id() ?>; +var monitorUrl = 'Server()->Url() ) ?>'; + +var streamSrc = ""; + +var statusRefreshTimeout = ; +var imageRefreshTimeout = ; + +var canEditMonitors = ; +var canStreamNative = ; + +var canPlayPauseAudio = Browser.ie; + +var refreshApplet = ; +var appletRefreshTime = ; + diff --git a/web/skins/classic/views/zone.php b/web/skins/classic/views/zone.php index 910faa50a..2d124caf1 100644 --- a/web/skins/classic/views/zone.php +++ b/web/skins/classic/views/zone.php @@ -117,6 +117,7 @@ $newZone['Area'] = getPolyArea( $newZone['Points'] ); $selfIntersecting = isSelfIntersecting( $newZone['Points'] ); $focusWindow = true; +$connkey = generateConnKey(); xhtmlHeaders(__FILE__, translate('Zone') ); ?> @@ -217,6 +218,12 @@ xhtmlHeaders(__FILE__, translate('Zone') );
+
 -  fps
+
@@ -265,7 +272,7 @@ for ( $i = 0; $i < $pointCols; $i++ )
- disabled="disabled"/> + disabled="disabled"/>
From 988d611d034db69e9177ce5eaef4ab25109f1e0e Mon Sep 17 00:00:00 2001 From: Andy Bauer Date: Sat, 9 Apr 2016 21:37:00 -0500 Subject: [PATCH 70/90] remove unused code --- web/skins/classic/views/zone.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/web/skins/classic/views/zone.php b/web/skins/classic/views/zone.php index 2d124caf1..1eb2f0a86 100644 --- a/web/skins/classic/views/zone.php +++ b/web/skins/classic/views/zone.php @@ -219,11 +219,6 @@ xhtmlHeaders(__FILE__, translate('Zone') );
 -  fps
- From fbb2a527e65ce466d92a67d619e3b1cb2b82e216 Mon Sep 17 00:00:00 2001 From: Andy Bauer Date: Sun, 10 Apr 2016 07:55:45 -0500 Subject: [PATCH 71/90] remove setButtonState. it is not needed. --- web/skins/classic/views/js/zone.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/web/skins/classic/views/js/zone.js b/web/skins/classic/views/js/zone.js index 4e4db8306..a5d666e69 100644 --- a/web/skins/classic/views/js/zone.js +++ b/web/skins/classic/views/js/zone.js @@ -479,11 +479,6 @@ function drawZonePoints() // Imported from watch.js and modified for new zone edit view // -function setButtonState( element, butClass ) { - element.className = butClass; - element.disabled = (butClass != 'inactive'); -} - var alarmState = STATE_IDLE; var lastAlarmState = STATE_IDLE; From e5bf2d245cbdc1cc3bcc05cf71b47b83eeb07566 Mon Sep 17 00:00:00 2001 From: Andy Bauer Date: Sun, 10 Apr 2016 15:33:55 -0500 Subject: [PATCH 72/90] quit the stream in zones.php when zone.php is called --- web/includes/config.php.in | 1 + web/skins/classic/views/js/zones.js | 9 +++++++++ web/skins/classic/views/js/zones.js.php | 4 ++++ web/skins/classic/views/zones.php | 6 ++++-- 4 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 web/skins/classic/views/js/zones.js create mode 100644 web/skins/classic/views/js/zones.js.php diff --git a/web/includes/config.php.in b/web/includes/config.php.in index 2ca819210..ba96d9a54 100644 --- a/web/includes/config.php.in +++ b/web/includes/config.php.in @@ -104,6 +104,7 @@ define( "CMD_PREV", 12 ); define( "CMD_NEXT", 13 ); define( "CMD_SEEK", 14 ); define( "CMD_VARPLAY", 15 ); +define( "CMD_QUIT", 17 ); define( "CMD_QUERY", 99 ); // diff --git a/web/skins/classic/views/js/zones.js b/web/skins/classic/views/js/zones.js new file mode 100644 index 000000000..2ae6e8b5e --- /dev/null +++ b/web/skins/classic/views/js/zones.js @@ -0,0 +1,9 @@ +var streamCmdParms = "view=request&request=stream&connkey="+connKey; +var streamCmdReq = new Request.JSON( { url: monitorUrl+thisUrl, method: 'post', timeout: AJAX_TIMEOUT, link: 'cancel' } ); +var streamCmdTimer = null; + +function streamCmdQuit( action ) { + if ( action ) + streamCmdReq.send( streamCmdParms+"&command="+CMD_QUIT ); +} + diff --git a/web/skins/classic/views/js/zones.js.php b/web/skins/classic/views/js/zones.js.php new file mode 100644 index 000000000..ca234085e --- /dev/null +++ b/web/skins/classic/views/js/zones.js.php @@ -0,0 +1,4 @@ +var connKey = ''; +var monitorUrl = 'Server()->Url() ) ?>'; +var CMD_QUIT = ; + diff --git a/web/skins/classic/views/zones.php b/web/skins/classic/views/zones.php index 940cce72a..3aa776c6b 100644 --- a/web/skins/classic/views/zones.php +++ b/web/skins/classic/views/zones.php @@ -37,6 +37,8 @@ foreach( dbFetchAll( 'select * from Zones where MonitorId = ? order by Area desc } } +$connkey = generateConnKey(); + xhtmlHeaders(__FILE__, translate('Zones') ); ?> @@ -51,7 +53,7 @@ xhtmlHeaders(__FILE__, translate('Zones') ); - + @@ -76,7 +78,7 @@ foreach( $zones as $zone ) { ?> - + From 39a30ff51b4106fa9956de4b2736740b2992e9fb Mon Sep 17 00:00:00 2001 From: Andy Bauer Date: Sun, 10 Apr 2016 15:59:13 -0500 Subject: [PATCH 73/90] refresh parent when cancel is clicked --- web/skins/classic/views/js/zones.js | 1 - web/skins/classic/views/zone.php | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/web/skins/classic/views/js/zones.js b/web/skins/classic/views/js/zones.js index 2ae6e8b5e..b453ab4f5 100644 --- a/web/skins/classic/views/js/zones.js +++ b/web/skins/classic/views/js/zones.js @@ -1,6 +1,5 @@ var streamCmdParms = "view=request&request=stream&connkey="+connKey; var streamCmdReq = new Request.JSON( { url: monitorUrl+thisUrl, method: 'post', timeout: AJAX_TIMEOUT, link: 'cancel' } ); -var streamCmdTimer = null; function streamCmdQuit( action ) { if ( action ) diff --git a/web/skins/classic/views/zone.php b/web/skins/classic/views/zone.php index 1eb2f0a86..df8af56bd 100644 --- a/web/skins/classic/views/zone.php +++ b/web/skins/classic/views/zone.php @@ -267,7 +267,7 @@ for ( $i = 0; $i < $pointCols; $i++ )
 / Width()*$monitor->Height()) ) ?> disabled="disabled"/>
- disabled="disabled"/> + disabled="disabled"/> From 5542788a45692c040f7e987eb2af33db976a44f6 Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Sun, 10 Apr 2016 18:45:38 -0500 Subject: [PATCH 74/90] make cannot write to content dir an error, rather than fatal --- web/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/index.php b/web/index.php index 72e6dc8c0..9bb2a8ca8 100644 --- a/web/index.php +++ b/web/index.php @@ -143,7 +143,7 @@ CORSHeaders(); // Check for valid content dirs if ( !is_writable(ZM_DIR_EVENTS) || !is_writable(ZM_DIR_IMAGES) ) { - Fatal( "Cannot write to content dirs('".ZM_DIR_EVENTS."','".ZM_DIR_IMAGES."'). Check that these exist and are owned by the web account user"); + Error( "Cannot write to content dirs('".ZM_DIR_EVENTS."','".ZM_DIR_IMAGES."'). Check that these exist and are owned by the web account user"); } if ( isset($_REQUEST['view']) ) From 859a55e1ef3653663f947b8012df7dcc30b9141a Mon Sep 17 00:00:00 2001 From: Pliable Pixels Date: Wed, 13 Apr 2016 12:54:22 -0400 Subject: [PATCH 75/90] updated documentation to include runstates --- docs/faq.rst | 2 ++ docs/userguide/gettingstarted.rst | 8 +++++++- .../getting-started-understand-console.png | Bin 235535 -> 235246 bytes docs/userguide/images/runstates.png | Bin 0 -> 44618 bytes 4 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 docs/userguide/images/runstates.png diff --git a/docs/faq.rst b/docs/faq.rst index 5aa736ee8..1c5c36d09 100644 --- a/docs/faq.rst +++ b/docs/faq.rst @@ -514,6 +514,8 @@ You do not need to rebuild ZM for X10 support. You will need to install the perl Extending Zoneminder ------------------------ +.. _runstate_cron_example: + How can I get ZM to do different things at different times of day or week? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/docs/userguide/gettingstarted.rst b/docs/userguide/gettingstarted.rst index 73f6e2783..b2e92f63f 100644 --- a/docs/userguide/gettingstarted.rst +++ b/docs/userguide/gettingstarted.rst @@ -67,8 +67,14 @@ own empty screen. * **D**: This is the core of ZoneMinder - recording events. It gives you a count of how many events were recorded over the hour, day, week, month. * **E**: These are the "Zones". Zones are areas within the camera that you mark as 'hotspots' for motion detection. Simply put, when you first configure your monitors (cameras), by default Zoneminder uses the entire field of view of the camera to detect motion. You may not want this. You may want to create "zones" specifically for detecting motion and ignore others. For example, lets consider a room with a fan that spins. You surely don't want to consider the fan moving continuously a reason for triggering a record? Probably not - in that case, you'd leave the fan out while making your zones. * **F**: This is the "source" column that tells you the type of the camera - if its an IP camera, a USB camera or more. In this example, they are all IP cameras. Note the color red on item F ? Well that means there is something wrong with that camera. No wonder the log also shows red. Good indication for you to tap on logs and investigate -* **G**: This defines how Zoneminder will record events. There are various modes. In brief Modect == record if a motion is detected,Record = always record 24x7, Mocord = always record PLUS detect motion, Monitor = just provide a live view but don't record anytime, Nodect = Don't record till an externa entity via zmtrigger tells Zoneminder to (this is advanced usage). +* **G**: This defines how Zoneminder will record events. There are various modes. In brief Modect == record if a motion is detected,Record = always record 24x7, Mocord = always record PLUS detect motion, Monitor = just provide a live view but don't record anytime, Nodect = Don't record till an external entity via zmtrigger tells Zoneminder to (this is advanced usage). * **H**: If you click on these links you can view a "Montage" of all your configured monitors or cycle through each one +* **I**: One of the most often missed features is the ability of ZoneMinder to maintain "run states". If you click on the "Running" text, ZoneMinder brings up a popup that allows you to define additional "states" (referred to as runstates). A runstate is essentially a snapshot that records the state of each monitor and you can switch between states easily. For example, you might have a run state defined that switches all monitors to "monitor" mode in which they are not recording anything while another state that sets some of the monitors to "modect". Why would you want this? A great example is to disable recording when you are at home and enable when you are away, based on time of day or other triggers. You can switch states by selecting an appropriate state manually, or do it automatically via cron jobs, for example. An example of using cron to automatically switch is provided in the :ref:`FAQ `. More esoteric examples of switching run states based on phone location can be found `here `__. + +Here is an example of multiple run states that I've defined. Each one of these runstates changes the mode of specific monitors depending on time of day and other conditions. Use your imagination to decide which conditions require state changes. + +.. image:: images/runstates.png + Adding Monitors diff --git a/docs/userguide/images/getting-started-understand-console.png b/docs/userguide/images/getting-started-understand-console.png index 805917f23b405cd534bbe9c9a664ce68bacfdc9f..f332b497769ccfc920d72f631084d2a52714afe8 100644 GIT binary patch delta 212041 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

+8wiE@vH`-Coov*jcPb}3zu)?SWi=tzX%FXS% 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 z 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 z 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

vc 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

0^+OI86XNQyt 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 !(1y}! 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

SvTNaWKgML))nvnV_K0Qq6~$mwra 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 GeEeURWG>PG diff --git a/docs/userguide/images/runstates.png b/docs/userguide/images/runstates.png new file mode 100644 index 0000000000000000000000000000000000000000..ced74cb55344658ff031d8f8bef9224eb51a3e33 GIT binary patch literal 44618 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 Date: Thu, 14 Apr 2016 13:53:10 -0400 Subject: [PATCH 76/90] Clone feature added --- web/lang/en_gb.php | 1 + web/skins/classic/views/console.php | 20 +- web/skins/classic/views/js/console.js | 32 +++ web/skins/classic/views/js/console.js.php | 4 +- web/skins/classic/views/monitor.php | 232 ++++++++++++---------- 5 files changed, 178 insertions(+), 111 deletions(-) diff --git a/web/lang/en_gb.php b/web/lang/en_gb.php index e2c2aac7c..d559a567a 100644 --- a/web/lang/en_gb.php +++ b/web/lang/en_gb.php @@ -230,6 +230,7 @@ $SLANG = array( 'ChooseLogFormat' => 'Choose a log format', 'ChooseLogSelection' => 'Choose a log selection', 'ChoosePreset' => 'Choose Preset', + 'CloneMonitor' => 'Clone Monitor', 'Close' => 'Close', 'Colour' => 'Colour', 'Command' => 'Command', diff --git a/web/skins/classic/views/console.php b/web/skins/classic/views/console.php index 070c85b59..dbf0ea2f4 100644 --- a/web/skins/classic/views/console.php +++ b/web/skins/classic/views/console.php @@ -77,8 +77,8 @@ $run_state = dbFetchOne('select Name from States where IsActive = 1', 'Name' ); $group = NULL; if ( ! empty($_COOKIE['zmGroup']) ) { - if ( $group = dbFetchOne( 'select * from Groups where Id = ?', NULL, array($_COOKIE['zmGroup'])) ) - $groupIds = array_flip(explode( ',', $group['MonitorIds'] )); + if ( $group = dbFetchOne( 'select * from Groups where Id = ?', NULL, array($_COOKIE['zmGroup'])) ) + $groupIds = array_flip(explode( ',', $group['MonitorIds'] )); } noCacheHeaders(); @@ -182,6 +182,7 @@ $seqDownFile = getSkinFile( 'graphics/seq-d.gif' ); $versionClass = (ZM_DYN_DB_VERSION&&(ZM_DYN_DB_VERSION!=ZM_VERSION))?'errorText':''; + xhtmlHeaders( __FILE__, translate('Console') ); ?> @@ -243,7 +244,7 @@ else - + - + + '.translate('Fn'.$monitor['Function']).( empty($monitor['Enabled']) ? ', disabled' : '' ) .'', canEdit( 'Monitors' ) ) ?> - Name(); ?> @@ -330,9 +332,9 @@ echo $Server->Name(); '.$shortpath.'', canEdit( 'Monitors' ) ) ?> diff --git a/web/skins/classic/views/js/console.js b/web/skins/classic/views/js/console.js index 5182a5fd5..99f175c23 100644 --- a/web/skins/classic/views/js/console.js +++ b/web/skins/classic/views/js/console.js @@ -1,3 +1,6 @@ +var jsTranslatedAddText; +var jsTranslatedCloneText; + function setButtonStates( element ) { var form = element.form; @@ -15,9 +18,36 @@ function setButtonStates( element ) } $(element).getParent( 'tr' ).toggleClass( 'highlight' ); form.editBtn.disabled = (checked!=1); + form.addBtn.value = (checked==1) ? jsTranslatedCloneText:jsTranslatedAddText; + form.deleteBtn.disabled = (checked==0); } +function addMonitor( element) +{ + + var form = element.form; + var dupParam; + var monitorId=-1; + if (form.addBtn.value == jsTranslatedCloneText) + { + // get the value of the first checkbox + for ( var i = 0; i < form.elements.length; i++ ) + { + if ( form.elements[i].type == "checkbox" ) + { + if ( form.elements[i].checked ) + { + monitorId = form.elements[i].value; + break; + } + } + } + } + dupParam = (monitorId == -1 ) ? '': '&dupId='+monitorId; + createPopup( '?view=monitor'+dupParam, 'zmMonitor0','monitor' ); +} + function editMonitor( element ) { var form = element.form; @@ -55,6 +85,8 @@ function reloadWindow() function initPage() { + jsTranslatedAddText = translatedAddText; + jsTranslatedCloneText = translatedCloneText; reloadWindow.periodical( consoleRefreshTimeout ); if ( showVersionPopup ) createPopup( '?view=version', 'zmVersion', 'version' ); diff --git a/web/skins/classic/views/js/console.js.php b/web/skins/classic/views/js/console.js.php index 93cf0cdb7..98417a985 100644 --- a/web/skins/classic/views/js/console.js.php +++ b/web/skins/classic/views/js/console.js.php @@ -26,7 +26,7 @@ elseif ( ZM_DYN_SHOW_DONATE_REMINDER ) ?> var showVersionPopup = ; var showDonatePopup = ; - - +var translatedAddText = ""; +var translatedCloneText = ""; diff --git a/web/skins/classic/views/monitor.php b/web/skins/classic/views/monitor.php index c55d77187..9f4375eae 100644 --- a/web/skins/classic/views/monitor.php +++ b/web/skins/classic/views/monitor.php @@ -42,11 +42,11 @@ if ( isset($_REQUEST['tab']) ) else $tab = "general"; - $Server = null; + $Server = null; if ( defined( 'ZM_SERVER_ID' ) ) { $Server = dbFetchOne( 'SELECT * FROM Servers WHERE Id=?', NULL, array( ZM_SERVER_ID ) ); - } - if ( ! $Server ) { + } + if ( ! $Server ) { $Server = array( 'Id' => '' ); } @@ -56,74 +56,11 @@ if ( ! empty($_REQUEST['mid']) ) { $x10Monitor = dbFetchOne( 'SELECT * FROM TriggersX10 WHERE MonitorId = ?', NULL, array($_REQUEST['mid']) ); } else { - $nextId = getTableAutoInc( 'Monitors' ); - $monitor = array( - 'Id' => 0, - 'Name' => translate('Monitor').'-'.$nextId, - 'Function' => "Monitor", - 'Enabled' => true, - 'LinkedMonitors' => "", - 'Type' => "", - 'Device' => "/dev/video0", - 'Channel' => "0", - 'Format' => 0x000000ff, - 'Protocol' => "", - 'Method' => "", - 'Host' => "", - 'Path' => "", - 'Options' => "", - 'Port' => "80", - 'User' => "", - 'Pass' => "", - 'Colours' => 3, - 'Palette' => 0, - 'Width' => "320", - 'Height' => "240", - 'Orientation' => "0", - 'Deinterlacing' => 0, - 'RTSPDescribe' => 0, - 'LabelFormat' => '%N - %d/%m/%y %H:%M:%S', - 'LabelX' => 0, - 'LabelY' => 0, - 'LabelSize' => 1, - 'ImageBufferCount' => 50, - 'WarmupCount' => 25, - 'PreEventCount' => 25, - 'PostEventCount' => 25, - 'StreamReplayBuffer' => 1000, - 'AlarmFrameCount' => 1, - 'Controllable' => 0, - 'ControlId' => "", - 'ControlType' => 0, - 'ControlDevice' => "", - 'ControlAddress' => "", - 'AutoStopTimeout' => "", - 'TrackMotion' => 0, - 'TrackDelay' => "", - 'ReturnLocation' => -1, - 'ReturnDelay' => "", - 'SectionLength' => 600, - 'FrameSkip' => 0, - 'MotionFrameSkip' => 0, - 'EventPrefix' => 'Event-', - 'AnalysisFPS' => "", - 'AnalysisUpdateDelay' => 0, - 'MaxFPS' => "", - 'AlarmMaxFPS' => "", - 'FPSReportInterval' => 1000, - 'RefBlendPerc' => 6, - 'AlarmRefBlendPerc' => 6, - 'DefaultView' => 'Events', - 'DefaultRate' => '100', - 'DefaultScale' => '100', - 'SignalCheckColour' => '#0000c0', - 'WebColour' => 'red', - 'Exif' => '0', - 'Triggers' => "", - 'V4LMultiBuffer' => '', - 'V4LCapturesPerFrame' => 1, - 'ServerId' => $Server['Id'], - ); + $nextId = getTableAutoInc( 'Monitors' ); + $monitor = getMonitorObject($_REQUEST['dupId']); + $clonedName = $monitor['Name']; + $monitor['Name'] = translate('Monitor').'-'.$nextId; + $monitor['Id']='0'; } if ( ZM_OPT_X10 && empty($x10Monitor) ) @@ -135,6 +72,85 @@ if ( ZM_OPT_X10 && empty($x10Monitor) ) ); } +function getMonitorObject( $mid = null) +{ + if ($mid !== null) + { + $monitor = dbFetchMonitor($mid); + } + else + { + $monitor = array( + 'Id' => 0, + 'Name' => "willbereplaced", + 'Function' => "Monitor", + 'Enabled' => true, + 'LinkedMonitors' => "", + 'Type' => "", + 'Device' => "/dev/video0", + 'Channel' => "0", + 'Format' => 0x000000ff, + 'Protocol' => "", + 'Method' => "", + 'Host' => "", + 'Path' => "", + 'Options' => "", + 'Port' => "80", + 'User' => "", + 'Pass' => "", + 'Colours' => 3, + 'Palette' => 0, + 'Width' => "320", + 'Height' => "240", + 'Orientation' => "0", + 'Deinterlacing' => 0, + 'RTSPDescribe' => 0, + 'LabelFormat' => '%N - %d/%m/%y %H:%M:%S', + 'LabelX' => 0, + 'LabelY' => 0, + 'LabelSize' => 1, + 'ImageBufferCount' => 50, + 'WarmupCount' => 25, + 'PreEventCount' => 25, + 'PostEventCount' => 25, + 'StreamReplayBuffer' => 1000, + 'AlarmFrameCount' => 1, + 'Controllable' => 0, + 'ControlId' => "", + 'ControlType' => 0, + 'ControlDevice' => "", + 'ControlAddress' => "", + 'AutoStopTimeout' => "", + 'TrackMotion' => 0, + 'TrackDelay' => "", + 'ReturnLocation' => -1, + 'ReturnDelay' => "", + 'SectionLength' => 600, + 'FrameSkip' => 0, + 'MotionFrameSkip' => 0, + 'EventPrefix' => 'Event-', + 'AnalysisFPS' => "", + 'AnalysisUpdateDelay' => 0, + 'MaxFPS' => "", + 'AlarmMaxFPS' => "", + 'FPSReportInterval' => 1000, + 'RefBlendPerc' => 6, + 'AlarmRefBlendPerc' => 6, + 'DefaultView' => 'Events', + 'DefaultRate' => '100', + 'DefaultScale' => '100', + 'SignalCheckColour' => '#0000c0', + 'WebColour' => 'red', + 'Exif' => '0', + 'Triggers' => "", + 'V4LMultiBuffer' => '', + 'V4LCapturesPerFrame' => 1, + 'ServerId' => $Server['Id'], + ); + } + return ($monitor); +} + function fourcc( $a, $b, $c, $d ) { return( ord($a) | (ord($b) << 8) | (ord($c) << 16) | (ord($d) << 24) ); @@ -450,16 +466,31 @@ xhtmlHeaders(__FILE__, translate('Monitor')." - ".validHtmlStr($monitor['Name']) if ( canEdit( 'Monitors' ) ) { ?> + + + +

+ Configuration cloned from Monitor: +
+ + +
- - - + + +
'None'); - $result = dbQuery( 'SELECT * FROM Servers ORDER BY Name'); - $results = $result->fetchALL(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'Server' ); - foreach ( $results as $row => $server_obj ) { - $servers[$server_obj->Id] = $server_obj->Name(); - } + $servers = array(''=>'None'); + $result = dbQuery( 'SELECT * FROM Servers ORDER BY Name'); + $results = $result->fetchALL(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'Server' ); + foreach ( $results as $row => $server_obj ) { + $servers[$server_obj->Id] = $server_obj->Name(); + } ?> - + @@ -775,15 +806,15 @@ switch ( $tab ) - - /> - - /> - - /> - - - + + /> + + /> + + /> + + + - + -  () +  () @@ -956,8 +987,9 @@ switch ( $tab )
disabled="disabled"/>
+ - + From 50f2747bb4dac3d9ff7892aeb5880b7db28d3171 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 15 Apr 2016 16:11:53 -0400 Subject: [PATCH 77/90] remove the if(pages>1) so that the if > line always happens --- web/skins/classic/views/events.php | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/web/skins/classic/views/events.php b/web/skins/classic/views/events.php index 7d0669177..b7d707b22 100644 --- a/web/skins/classic/views/events.php +++ b/web/skins/classic/views/events.php @@ -66,13 +66,11 @@ if ( !empty($limit) && $nEvents > $limit ) $nEvents = $limit; } $pages = (int)ceil($nEvents/ZM_WEB_EVENTS_PER_PAGE); -if ( $pages > 1 ) { - if ( !empty($page) ) { - if ( $page < 0 ) - $page = 1; - if ( $page > $pages ) - $page = $pages; - } +if ( !empty($page) ) { + if ( $page < 0 ) + $page = 1; + if ( $page > $pages ) + $page = $pages; } if ( !empty($page) ) { $limitStart = (($page-1)*ZM_WEB_EVENTS_PER_PAGE); From 7058b0862acd7b6a5f1a415514fce8d5087fcfec Mon Sep 17 00:00:00 2001 From: abi Date: Sat, 16 Apr 2016 16:39:58 +0300 Subject: [PATCH 78/90] suppressed warnings of killall for FreeBSD --- scripts/zmdc.pl.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/zmdc.pl.in b/scripts/zmdc.pl.in index b068b9a49..36d5e922a 100644 --- a/scripts/zmdc.pl.in +++ b/scripts/zmdc.pl.in @@ -862,7 +862,7 @@ sub killAll my $killall; if ( '@HOST_OS@' eq 'BSD' ) { - $killall = 'killall -'; + $killall = 'killall -q -'; } elsif ( '@HOST_OS@' eq 'solaris' ) { $killall = 'pkill -'; } else { From d424a297c431121164bf7a97216cee34aa729319 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Sun, 17 Apr 2016 09:29:55 -0400 Subject: [PATCH 79/90] need php5-gd --- distros/ubuntu1504/control | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/distros/ubuntu1504/control b/distros/ubuntu1504/control index 50dee74c6..c1b7d958f 100644 --- a/distros/ubuntu1504/control +++ b/distros/ubuntu1504/control @@ -57,7 +57,7 @@ Depends: ${shlibs:Depends}, ${misc:Depends}, ${perl:Depends} ,libsys-cpu-perl, libsys-meminfo-perl ,mysql-client | virtual-mysql-client ,perl-modules - ,php5-mysql + ,php5-mysql, php5-gd ,policykit-1 ,rsyslog | system-log-daemon ,zip From b2d02a64f4ba5b293404aa51e18e2074a1fed7b3 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 19 Apr 2016 12:02:58 -0400 Subject: [PATCH 80/90] reload stream after error --- web/skins/classic/views/js/montage.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/web/skins/classic/views/js/montage.js b/web/skins/classic/views/js/montage.js index fe4559201..1367bc8b1 100644 --- a/web/skins/classic/views/js/montage.js +++ b/web/skins/classic/views/js/montage.js @@ -35,6 +35,7 @@ function Monitor( index, id, connKey ) if ( this.streamCmdTimer ) this.streamCmdTimer = clearTimeout( this.streamCmdTimer ); + var stream = document.getElementById( "liveStream"+this.id ); if ( respObj.result == 'Ok' ) { this.status = respObj.status; @@ -57,7 +58,6 @@ function Monitor( index, id, connKey ) this.setStateClass( $('monitor'+this.index), stateClass ); /*Stream could be an applet so can't use moo tools*/ - var stream = document.getElementById( "liveStream"+this.id ); stream.className = stateClass; var isAlarmed = ( this.alarmState == STATE_ALARM || this.alarmState == STATE_ALERT ); @@ -90,6 +90,10 @@ function Monitor( index, id, connKey ) else { console.error( respObj.message ); + // Try to reload the image stream. + if ( stream ) + stream.src = stream.src.replace(/rand=\d+/i,'rand='+Math.floor((Math.random() * 1000000) )); + } var streamCmdTimeout = statusRefreshTimeout; if ( this.alarmState == STATE_ALARM || this.alarmState == STATE_ALERT ) From 02a56b811bbaa01f54540fef1c971c807d424002 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 20 Apr 2016 14:38:51 -0400 Subject: [PATCH 81/90] Don't be recursive when chowning /var/cache/zoneminder --- distros/debian/postinst | 2 +- distros/ubuntu1204/zoneminder.postinst | 2 +- distros/ubuntu1504/zoneminder.postinst | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/distros/debian/postinst b/distros/debian/postinst index 8bb4d23eb..39e3dfc32 100644 --- a/distros/debian/postinst +++ b/distros/debian/postinst @@ -10,7 +10,7 @@ if [ "$1" = "configure" ]; then chown www-data:root /var/log/zm chown www-data:www-data /var/lib/zm if [ -z "$2" ]; then - chown www-data:www-data -R /var/cache/zoneminder + chown www-data:www-data /var/cache/zoneminder /var/cache/zoneminder/* fi # Do this every time the package is installed or upgraded diff --git a/distros/ubuntu1204/zoneminder.postinst b/distros/ubuntu1204/zoneminder.postinst index 1bfd41d42..7c01cdde4 100644 --- a/distros/ubuntu1204/zoneminder.postinst +++ b/distros/ubuntu1204/zoneminder.postinst @@ -10,7 +10,7 @@ if [ "$1" = "configure" ]; then chown www-data:root /var/log/zm chown www-data:www-data /var/lib/zm if [ -z "$2" ]; then - chown www-data:www-data -R /var/cache/zoneminder + chown www-data:www-data /var/cache/zoneminder /var/cache/zoneminder/* fi # Do this every time the package is installed or upgraded diff --git a/distros/ubuntu1504/zoneminder.postinst b/distros/ubuntu1504/zoneminder.postinst index c45474e1d..64699d1ca 100644 --- a/distros/ubuntu1504/zoneminder.postinst +++ b/distros/ubuntu1504/zoneminder.postinst @@ -10,7 +10,7 @@ if [ "$1" = "configure" ]; then chown www-data:root /var/log/zm chown www-data:www-data /var/lib/zm if [ -z "$2" ]; then - chown www-data:www-data -R /var/cache/zoneminder + chown www-data:www-data /var/cache/zoneminder /var/cache/zoneminder/* fi # Do this every time the package is installed or upgraded From 1072327dd13d5f8d0a63a3d5ba2b2dc14468f7e8 Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Thu, 21 Apr 2016 08:01:13 -0500 Subject: [PATCH 82/90] remove extra quote --- scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in index d4bb9bd38..fc4143d8a 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in +++ b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in @@ -3830,7 +3830,7 @@ body = "ZM alarm detected - %EL% secs, %EF%/%EFA% frames, t%EST%/m%ESM%/a%ESA% s default => "no", description => qqq(" Use a SSMTP mail server if available. - NEW_MAIL_MODULES must be enabled" + NEW_MAIL_MODULES must be enabled "), requires => [ { name => "ZM_OPT_EMAIL", value => "yes" }, From 26a45d5fa9ccac2964177e24d409ade66de95bde Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Mon, 25 Apr 2016 13:55:28 -0400 Subject: [PATCH 83/90] Don't rotate dimensions when constructing the monitor because they are already rotated --- src/zm_monitor.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/zm_monitor.cpp b/src/zm_monitor.cpp index e96997ebc..e66256dea 100644 --- a/src/zm_monitor.cpp +++ b/src/zm_monitor.cpp @@ -306,8 +306,12 @@ Monitor::Monitor( server_id( p_server_id ), function( (Function)p_function ), enabled( p_enabled ), - width( (p_orientation==ROTATE_90||p_orientation==ROTATE_270)?p_camera->Height():p_camera->Width() ), - height( (p_orientation==ROTATE_90||p_orientation==ROTATE_270)?p_camera->Width():p_camera->Height() ), + // When we instantiate the camera, the dimensions are rotated. So if we rotate them again here, we undo the rotation. + // With this change, calls to Monitor->Width and Height will give the rotated dimesions.So this will trickle down + width( p_camera->Width() ), + height( p_camera->Height() ), + //width( (p_orientation==ROTATE_90||p_orientation==ROTATE_270)?p_camera->Height():p_camera->Width() ), + //height( (p_orientation==ROTATE_90||p_orientation==ROTATE_270)?p_camera->Width():p_camera->Height() ), orientation( (Orientation)p_orientation ), deinterlacing( p_deinterlacing ), label_coord( p_label_coord ), From 85798932ee3f9bb69b357c7825369a88e084d99b Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Mon, 25 Apr 2016 14:10:26 -0400 Subject: [PATCH 84/90] Use Event Width and Height, not the Monitor Width and Height. THe Monitor dimensions are not rotated --- web/skins/classic/views/event.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/skins/classic/views/event.php b/web/skins/classic/views/event.php index a0b97e35e..d3a185f33 100644 --- a/web/skins/classic/views/event.php +++ b/web/skins/classic/views/event.php @@ -27,7 +27,7 @@ if ( !canView( 'Events' ) ) $eid = validInt( $_REQUEST['eid'] ); $fid = !empty($_REQUEST['fid'])?validInt($_REQUEST['fid']):1; -$sql = 'SELECT E.*,M.Name AS MonitorName,M.Width,M.Height,M.DefaultRate,M.DefaultScale FROM Events AS E INNER JOIN Monitors AS M ON E.MonitorId = M.Id WHERE E.Id = ?'; +$sql = 'SELECT E.*,M.Name AS MonitorName,E.Width,E.Height,M.DefaultRate,M.DefaultScale FROM Events AS E INNER JOIN Monitors AS M ON E.MonitorId = M.Id WHERE E.Id = ?'; $sql_values = array( $eid ); if ( $user['MonitorIds'] ) { From 8c53925fdc75c47d894eeda1cd4156ee9ffeabb1 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Mon, 25 Apr 2016 16:00:34 -0400 Subject: [PATCH 85/90] redo rotation fix. cameras have to be given the width and height that the camera will be sending. The monitor will report rotated dimensions. --- src/zm_monitor.cpp | 67 +++++++++++++++++----------------------------- src/zm_monitor.h | 4 +-- 2 files changed, 26 insertions(+), 45 deletions(-) diff --git a/src/zm_monitor.cpp b/src/zm_monitor.cpp index e66256dea..4fe59b5e8 100644 --- a/src/zm_monitor.cpp +++ b/src/zm_monitor.cpp @@ -306,12 +306,8 @@ Monitor::Monitor( server_id( p_server_id ), function( (Function)p_function ), enabled( p_enabled ), - // When we instantiate the camera, the dimensions are rotated. So if we rotate them again here, we undo the rotation. - // With this change, calls to Monitor->Width and Height will give the rotated dimesions.So this will trickle down width( p_camera->Width() ), height( p_camera->Height() ), - //width( (p_orientation==ROTATE_90||p_orientation==ROTATE_270)?p_camera->Height():p_camera->Width() ), - //height( (p_orientation==ROTATE_90||p_orientation==ROTATE_270)?p_camera->Width():p_camera->Height() ), orientation( (Orientation)p_orientation ), deinterlacing( p_deinterlacing ), label_coord( p_label_coord ), @@ -2150,9 +2146,6 @@ Debug( 1, "Got %d for v4l_captures_per_frame", v4l_captures_per_frame ); col++; bool embed_exif = (*dbrow[col] != '0'); col++; - int cam_width = ((orientation==ROTATE_90||orientation==ROTATE_270)?height:width); - int cam_height = ((orientation==ROTATE_90||orientation==ROTATE_270)?width:height); - int extras = (deinterlacing>>24)&0xff; Camera *camera = new LocalCamera( @@ -2163,8 +2156,8 @@ Debug( 1, "Got %d for v4l_captures_per_frame", v4l_captures_per_frame ); v4l_multi_buffer, v4l_captures_per_frame, method, - cam_width, - cam_height, + width, + height, colours, palette, brightness, @@ -2306,9 +2299,6 @@ int Monitor::LoadRemoteMonitors( const char *protocol, const char *host, const c int track_motion = atoi(dbrow[col]); col++; bool embed_exif = (*dbrow[col] != '0'); col++; - int cam_width = ((orientation==ROTATE_90||orientation==ROTATE_270)?height:width); - int cam_height = ((orientation==ROTATE_90||orientation==ROTATE_270)?width:height); - Camera *camera = 0; if ( protocol == "http" ) { @@ -2318,8 +2308,8 @@ int Monitor::LoadRemoteMonitors( const char *protocol, const char *host, const c host, // Host port, // Port path, // Path - cam_width, - cam_height, + width, + height, colours, brightness, contrast, @@ -2337,8 +2327,8 @@ int Monitor::LoadRemoteMonitors( const char *protocol, const char *host, const c host, // Host port, // Port path, // Path - cam_width, - cam_height, + width, + height, rtsp_describe, colours, brightness, @@ -2481,14 +2471,11 @@ int Monitor::LoadFileMonitors( const char *file, Monitor **&monitors, Purpose pu int track_motion = atoi(dbrow[col]); col++; bool embed_exif = (*dbrow[col] != '0'); col++; - int cam_width = ((orientation==ROTATE_90||orientation==ROTATE_270)?height:width); - int cam_height = ((orientation==ROTATE_90||orientation==ROTATE_270)?width:height); - Camera *camera = new FileCamera( id, path, // File - cam_width, - cam_height, + width, + height, colours, brightness, contrast, @@ -2626,16 +2613,13 @@ int Monitor::LoadFfmpegMonitors( const char *file, Monitor **&monitors, Purpose int track_motion = atoi(dbrow[col]); col++; bool embed_exif = (*dbrow[col] != '0'); col++; - int cam_width = ((orientation==ROTATE_90||orientation==ROTATE_270)?height:width); - int cam_height = ((orientation==ROTATE_90||orientation==ROTATE_270)?width:height); - Camera *camera = new FfmpegCamera( id, path, // File method, options, - cam_width, - cam_height, + width, + height, colours, brightness, contrast, @@ -2796,9 +2780,6 @@ Debug( 1, "Got %d for v4l_captures_per_frame", v4l_captures_per_frame ); col++; bool embed_exif = (*dbrow[col] != '0'); col++; - int cam_width = ((orientation==ROTATE_90||orientation==ROTATE_270)?height:width); - int cam_height = ((orientation==ROTATE_90||orientation==ROTATE_270)?width:height); - int extras = (deinterlacing>>24)&0xff; Camera *camera = 0; @@ -2813,8 +2794,8 @@ Debug( 1, "Got %d for v4l_captures_per_frame", v4l_captures_per_frame ); v4l_multi_buffer, v4l_captures_per_frame, method, - cam_width, - cam_height, + width, + height, colours, palette, brightness, @@ -2838,8 +2819,8 @@ Debug( 1, "Got %d for v4l_captures_per_frame", v4l_captures_per_frame ); host.c_str(), port.c_str(), path.c_str(), - cam_width, - cam_height, + width, + height, colours, brightness, contrast, @@ -2857,8 +2838,8 @@ Debug( 1, "Got %d for v4l_captures_per_frame", v4l_captures_per_frame ); host.c_str(), port.c_str(), path.c_str(), - cam_width, - cam_height, + width, + height, rtsp_describe, colours, brightness, @@ -2881,8 +2862,8 @@ Debug( 1, "Got %d for v4l_captures_per_frame", v4l_captures_per_frame ); camera = new FileCamera( id, path.c_str(), - cam_width, - cam_height, + width, + height, colours, brightness, contrast, @@ -2899,8 +2880,8 @@ Debug( 1, "Got %d for v4l_captures_per_frame", v4l_captures_per_frame ); path.c_str(), method, options, - cam_width, - cam_height, + width, + height, colours, brightness, contrast, @@ -2920,8 +2901,8 @@ Debug( 1, "Got %d for v4l_captures_per_frame", v4l_captures_per_frame ); path.c_str(), method, options, - cam_width, - cam_height, + width, + height, colours, brightness, contrast, @@ -2941,8 +2922,8 @@ Debug( 1, "Got %d for v4l_captures_per_frame", v4l_captures_per_frame ); path.c_str(), user.c_str(), pass.c_str(), - cam_width, - cam_height, + width, + height, colours, brightness, contrast, diff --git a/src/zm_monitor.h b/src/zm_monitor.h index a9cd05674..d1a619a4c 100644 --- a/src/zm_monitor.h +++ b/src/zm_monitor.h @@ -358,8 +358,8 @@ public: return( embed_exif ); } - unsigned int Width() const { return( width ); } - unsigned int Height() const { return( height ); } + unsigned int Width() const { return( (p_orientation==ROTATE_90||p_orientation==ROTATE_270)?p_camera->Height():p_camera->Width() ); } + unsigned int Height() const { return( (p_orientation==ROTATE_90||p_orientation==ROTATE_270)?p_camera->Width():p_camera->Height() ); } unsigned int Colours() const { return( camera->Colours() ); } unsigned int SubpixelOrder() const { return( camera->SubpixelOrder() ); } From 2d8c484792a9518a0c308c6d8d2e6ade06959b6b Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Mon, 25 Apr 2016 16:48:26 -0400 Subject: [PATCH 86/90] rotate dimensions when instantiating the Monitor object --- src/zm_monitor.cpp | 4 ++-- src/zm_monitor.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/zm_monitor.cpp b/src/zm_monitor.cpp index 4fe59b5e8..e9998c181 100644 --- a/src/zm_monitor.cpp +++ b/src/zm_monitor.cpp @@ -306,8 +306,8 @@ Monitor::Monitor( server_id( p_server_id ), function( (Function)p_function ), enabled( p_enabled ), - width( p_camera->Width() ), - height( p_camera->Height() ), + width( (p_orientation==ROTATE_90||p_orientation==ROTATE_270)?p_camera->Height():p_camera->Width() ), + height( (p_orientation==ROTATE_90||p_orientation==ROTATE_270)?p_camera->Width():p_camera->Height() ), orientation( (Orientation)p_orientation ), deinterlacing( p_deinterlacing ), label_coord( p_label_coord ), diff --git a/src/zm_monitor.h b/src/zm_monitor.h index d1a619a4c..a9cd05674 100644 --- a/src/zm_monitor.h +++ b/src/zm_monitor.h @@ -358,8 +358,8 @@ public: return( embed_exif ); } - unsigned int Width() const { return( (p_orientation==ROTATE_90||p_orientation==ROTATE_270)?p_camera->Height():p_camera->Width() ); } - unsigned int Height() const { return( (p_orientation==ROTATE_90||p_orientation==ROTATE_270)?p_camera->Width():p_camera->Height() ); } + unsigned int Width() const { return( width ); } + unsigned int Height() const { return( height ); } unsigned int Colours() const { return( camera->Colours() ); } unsigned int SubpixelOrder() const { return( camera->SubpixelOrder() ); } From 9aff84fbbb6759b03e20196695e73a2e75325dff Mon Sep 17 00:00:00 2001 From: abi Date: Tue, 26 Apr 2016 21:53:50 +0300 Subject: [PATCH 87/90] unbreak build under FreeBSD 32 bit II --- src/zm_event.cpp | 2 +- src/zm_event.h | 4 ++-- src/zms.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/zm_event.cpp b/src/zm_event.cpp index 89973d1e4..c52fdebcd 100644 --- a/src/zm_event.cpp +++ b/src/zm_event.cpp @@ -715,7 +715,7 @@ bool EventStream::loadInitialEventData( int monitor_id, time_t event_time ) return( true ); } -bool EventStream::loadInitialEventData( int init_event_id, int init_frame_id ) +bool EventStream::loadInitialEventData( int init_event_id, unsigned int init_frame_id ) { loadEventData( init_event_id ); diff --git a/src/zm_event.h b/src/zm_event.h index f50a5bf06..f4a87e558 100644 --- a/src/zm_event.h +++ b/src/zm_event.h @@ -230,7 +230,7 @@ protected: protected: bool loadEventData( int event_id ); - bool loadInitialEventData( int init_event_id, int init_frame_id ); + bool loadInitialEventData( int init_event_id, unsigned int init_frame_id ); bool loadInitialEventData( int monitor_id, time_t event_time ); void checkEventLoaded(); @@ -249,7 +249,7 @@ public: event_data = 0; } - void setStreamStart( int init_event_id, int init_frame_id=0 ) + void setStreamStart( int init_event_id, unsigned int init_frame_id=0 ) { loadInitialEventData( init_event_id, init_frame_id ); loadMonitor( event_data->monitor_id ); diff --git a/src/zms.cpp b/src/zms.cpp index 9a7fcc941..f80c4f9db 100644 --- a/src/zms.cpp +++ b/src/zms.cpp @@ -62,7 +62,7 @@ int main( int argc, const char *argv[] ) int monitor_id = 0; time_t event_time = 0; int event_id = 0; - int frame_id = 1; + unsigned int frame_id = 1; unsigned int scale = 100; unsigned int rate = 100; double maxfps = 10.0; From 7d7249f328786b35ee91c635c3dd75a1e2e53324 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 26 Apr 2016 15:48:21 -0400 Subject: [PATCH 88/90] use std::string instead of C strings. Mostly this will quiet build warnings on FreeBSD and removes the potential for buffer overflows --- src/zmu.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/zmu.cpp b/src/zmu.cpp index a1e8887bd..3680c468a 100644 --- a/src/zmu.cpp +++ b/src/zmu.cpp @@ -757,15 +757,14 @@ int main( int argc, char *argv[] ) if ( function & ZMU_LIST ) { - char sql[ZM_SQL_SML_BUFSIZ]; - strncpy( sql, "select Id, Function+0 from Monitors", sizeof(sql) ); + std::string sql = "select Id, Function+0 from Monitors"; if ( !verbose ) { - strncat( sql, " where Function != 'None'", sizeof(sql)-strlen(sql) ); + sql += "where Function != 'None'"; } - strncat( sql, " order by Id asc", sizeof(sql)-strlen(sql) ); + sql += " order by Id asc"; - if ( mysql_query( &dbconn, sql ) ) + if ( mysql_query( &dbconn, sql.c_str() ) ) { Error( "Can't run query: %s", mysql_error( &dbconn ) ); exit( mysql_errno( &dbconn ) ); From 5d88acb8a6dc46eca074785cd838a1332732f1f9 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 26 Apr 2016 16:03:26 -0400 Subject: [PATCH 89/90] re-arrange a few lines to remove some duplicate ifdef's. And move the cr2 def into the area that uses it to remove build warnings on freebsd --- src/zm_signal.cpp | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/src/zm_signal.cpp b/src/zm_signal.cpp index 91e1bc4ba..26cfb763a 100644 --- a/src/zm_signal.cpp +++ b/src/zm_signal.cpp @@ -47,15 +47,12 @@ RETSIGTYPE zm_die_handler(int signal, siginfo_t * info, void *context) RETSIGTYPE zm_die_handler(int signal) #endif { -#if (defined(__i386__) || defined(__x86_64__)) - void *cr2 = 0; - void *ip = 0; -#endif Error("Got signal %d (%s), crashing", signal, strsignal(signal)); - #if (defined(__i386__) || defined(__x86_64__)) + void *ip = 0; // Get more information if available -#if ( HAVE_SIGINFO_T && HAVE_UCONTEXT_T ) + #if ( HAVE_SIGINFO_T && HAVE_UCONTEXT_T ) + void *cr2 = 0; if (info && context) { Debug(1, @@ -65,19 +62,19 @@ RETSIGTYPE zm_die_handler(int signal) ucontext_t *uc = (ucontext_t *) context; cr2 = info->si_addr; -#if defined(__x86_64__) - #ifdef __FreeBSD_kernel__ + #if defined(__x86_64__) + #ifdef __FreeBSD_kernel__ ip = (void *)(uc->uc_mcontext.mc_rip); - #else + #else ip = (void *)(uc->uc_mcontext.gregs[REG_RIP]); - #endif -#else - #ifdef __FreeBSD_kernel__ + #endif + #else + #ifdef __FreeBSD_kernel__ ip = (void *)(uc->uc_mcontext.mc_eip); - #else + #else ip = (void *)(uc->uc_mcontext.gregs[REG_EIP]); - #endif -#endif // defined(__x86_64__) + #endif + #endif // defined(__x86_64__) // Print the signal address and instruction pointer if available if (ip) { @@ -86,11 +83,11 @@ RETSIGTYPE zm_die_handler(int signal) Error("Signal address is %p, no instruction pointer", cr2); } } -#endif // ( HAVE_SIGINFO_T && HAVE_UCONTEXT_T ) + #endif // ( HAVE_SIGINFO_T && HAVE_UCONTEXT_T ) // Print backtrace if enabled and available -#if ( !defined(ZM_NO_CRASHTRACE) && HAVE_DECL_BACKTRACE && HAVE_DECL_BACKTRACE_SYMBOLS ) + #if ( !defined(ZM_NO_CRASHTRACE) && HAVE_DECL_BACKTRACE && HAVE_DECL_BACKTRACE_SYMBOLS ) void *trace[TRACE_SIZE]; int trace_size = 0; trace_size = backtrace(trace, TRACE_SIZE); @@ -111,7 +108,7 @@ RETSIGTYPE zm_die_handler(int signal) Info("Backtrace complete, please execute the following command for more information"); Info(cmd); -#endif // ( !defined(ZM_NO_CRASHTRACE) && HAVE_DECL_BACKTRACE && HAVE_DECL_BACKTRACE_SYMBOLS ) + #endif // ( !defined(ZM_NO_CRASHTRACE) && HAVE_DECL_BACKTRACE && HAVE_DECL_BACKTRACE_SYMBOLS ) #endif // (defined(__i386__) || defined(__x86_64__) exit(signal); } From 69d5065ebfa0fd026aec538c722a30e0347f431d Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 26 Apr 2016 16:05:37 -0400 Subject: [PATCH 90/90] move ip down as well --- src/zm_signal.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zm_signal.cpp b/src/zm_signal.cpp index 26cfb763a..bbc40e916 100644 --- a/src/zm_signal.cpp +++ b/src/zm_signal.cpp @@ -49,9 +49,9 @@ RETSIGTYPE zm_die_handler(int signal) { Error("Got signal %d (%s), crashing", signal, strsignal(signal)); #if (defined(__i386__) || defined(__x86_64__)) - void *ip = 0; // Get more information if available #if ( HAVE_SIGINFO_T && HAVE_UCONTEXT_T ) + void *ip = 0; void *cr2 = 0; if (info && context) {