diff --git a/.gitmodules b/.gitmodules index 0fa8df21a..fc8ea09d6 100644 --- a/.gitmodules +++ b/.gitmodules @@ -2,3 +2,6 @@ path = web/api/app/Plugin/Crud url = https://github.com/FriendsOfCake/crud.git branch = 3.0 +[submodule "web/api/app/Plugin/CakePHP-Enum-Behavior"] + path = web/api/app/Plugin/CakePHP-Enum-Behavior + url = https://github.com/asper/CakePHP-Enum-Behavior.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 4c001b98c..8b8308afc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -647,13 +647,13 @@ if(NOT ZM_NO_LIBVLC) endif(LIBVLC_LIBRARIES) endif(NOT ZM_NO_LIBVLC) -find_package(Boost 1.36.0) -if(Boost_FOUND) - include_directories(${Boost_INCLUDE_DIRS}) - set(CMAKE_REQUIRED_INCLUDES "${Boost_INCLUDE_DIRS}") - list(APPEND ZM_BIN_LIBS "${Boost_LIBRARIES}") -endif() - +#find_package(Boost 1.36.0) +#if(Boost_FOUND) + #include_directories(${Boost_INCLUDE_DIRS}) + ##set(CMAKE_REQUIRED_INCLUDES "${Boost_INCLUDE_DIRS}") + #list(APPEND ZM_BIN_LIBS "${Boost_LIBRARIES}") +#endif() +# # *** END OF LIBRARY CHECKS *** # Check for gnutls or crypto diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Event.pm b/scripts/ZoneMinder/lib/ZoneMinder/Event.pm index 1194ea56c..4bf71fa82 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/Event.pm +++ b/scripts/ZoneMinder/lib/ZoneMinder/Event.pm @@ -200,6 +200,32 @@ sub RelativePath { return $$event{RelativePath}; } +sub LinkPath { + my $event = shift; + if ( @_ ) { + $$event{LinkPath} = $_[0]; + } + + if ( ! $$event{LinkPath} ) { + if ( $$event{Scheme} eq 'Deep' ) { + if ( $event->Time() ) { + $$event{LinkPath} = join('/', + $event->{MonitorId}, + strftime( '%y/%m/%d', + localtime($event->Time()) + ), + '.'.$$event{Id} + ); + } else { + Error("Event $$event{Id} has no value for Time(), unable to determine link path"); + $$event{LinkPath} = ''; + } + } # end if Scheme + } # end if ! Path + + return $$event{LinkPath}; +} # end sub LinkPath + sub GenerateVideo { my ( $self, $rate, $fps, $scale, $size, $overwrite, $format ) = @_; @@ -292,10 +318,10 @@ sub delete { my $event = $_[0]; if ( ! ( $event->{Id} and $event->{MonitorId} and $event->{StartTime} ) ) { my ( $caller, undef, $line ) = caller; - Warning( "Can't Delete event $event->{Id} from Monitor $event->{MonitorId} $event->{StartTime} from $caller:$line\n" ); + Warning( "Can't Delete event $event->{Id} from Monitor $event->{MonitorId} StartTime:$event->{StartTime} from $caller:$line\n" ); return; } - Info( "Deleting event $event->{Id} from Monitor $event->{MonitorId} $event->{StartTime}\n" ); + Info( "Deleting event $event->{Id} from Monitor $event->{MonitorId} StartTime:$event->{StartTime}\n" ); $ZoneMinder::Database::dbh->ping(); # Do it individually to avoid locking up the table for new events my $sql = 'DELETE FROM Events WHERE Id=?'; @@ -337,50 +363,25 @@ sub delete_files { return; } - chdir( $storage_path ); + if ( ! $$event{MonitorId} ) { + Error("No monitor id assigned to event $$event{Id}"); + return; + } + my $event_path = $event->Path(); + Debug("Deleting files for Event $$event{Id} from $event_path."); + if ( $event_path ) { + ( $event_path ) = ( $event_path =~ /^(.*)$/ ); # De-taint + my $command = "/bin/rm -rf $event_path"; + ZoneMinder::General::executeShellCommand( $command ); + } if ( $$event{Scheme} eq 'Deep' ) { - if ( ! $$event{MonitorId} ) { - Error("No monitor id assigned to event $$event{Id}"); - return; + my $link_path = $event->LinkPath(); + Debug("Deleting files for Event $$event{Id} from $storage_path/$link_path."); + if ( $link_path ) { + ( $link_path ) = ( $link_path =~ /^(.*)$/ ); # De-taint + unlink( $storage_path.'/'.$link_path ) or Error( "Unable to unlink '$storage_path/$link_path': $!" ); } - Debug("Deleting files for Event $$event{Id} from $storage_path."); - my $link_path = $$event{MonitorId}.'/*/*/*/.'.$$event{Id}; -#Debug( "LP1:$link_path" ); - my @links = glob($link_path); -#Debug( "L:".$links[0].": $!" ); - if ( @links ) { - ( $link_path ) = ( $links[0] =~ /^(.*)$/ ); # De-taint -#Debug( "LP2:$link_path" ); - - ( my $day_path = $link_path ) =~ s/\.\d+//; -#Debug( "DP:$day_path" ); - my $event_path = $day_path.readlink( $link_path ); - ( $event_path ) = ( $event_path =~ /^(.*)$/ ); # De-taint -#Debug( "EP:$event_path" ); - my $command = "/bin/rm -rf $event_path"; -#Debug( "C:$command" ); - ZoneMinder::General::executeShellCommand( $command ); - - unlink( $link_path ) or Error( "Unable to unlink '$link_path': $!" ); - - my @path_parts = split( /\//, $event_path ); - for ( my $i = int(@path_parts)-2; $i >= 1; $i-- ) { - my $delete_path = join( '/', @path_parts[0..$i] ); -#Debug( "DP$i:$delete_path" ); - my @has_files = glob( join('/', $storage_path,$delete_path,'*' ) ); -#Debug( "HF1:".$has_files[0] ) if ( @has_files ); - last if ( @has_files ); - @has_files = glob( join('/', $storage_path, $delete_path, '.[0-9]*' ) ); -#Debug( "HF2:".$has_files[0] ) if ( @has_files ); - last if ( @has_files ); - my $command = "/bin/rm -rf $storage_path/$delete_path"; - ZoneMinder::General::executeShellCommand( $command ); - } - } # end if links - } else { - my $command = '/bin/rm -rf '. $storage_path . '/'. $event->RelativePath(); - ZoneMinder::General::executeShellCommand( $command ); } } # end sub delete_files diff --git a/scripts/zmfilter.pl.in b/scripts/zmfilter.pl.in index 625693bd3..4db95e58b 100644 --- a/scripts/zmfilter.pl.in +++ b/scripts/zmfilter.pl.in @@ -219,24 +219,18 @@ sub getFilters { ) ORDER BY Name'; my $sth = $dbh->prepare_cached( $sql ) or Fatal( "Unable to prepare '$sql': ".$dbh->errstr() ); - my $res; - if ( $filter_name ) { - $res = $sth->execute( $filter_name ) - or Fatal( "Unable to execute '$sql': ".$sth->errstr() ); - } else { - $res = $sth->execute() - or Fatal( "Unable to execute '$sql': ".$sth->errstr() ); - } + my $res = $sth->execute( @sql_values ) + or Fatal( "Unable to execute '$sql': ".$sth->errstr() ); 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 $sql = $filter->Sql(); + my $filter_sql = $filter->Sql(); - if ( ! $sql ) { + if ( ! $filter_sql ) { Error( "Error parsing Sql. skipping filter '$db_filter->{Name}'\n" ); next FILTER; } - push( @filters, $filter ); + push @filters, $filter; } $sth->finish(); if ( ! @filters ) { @@ -245,7 +239,7 @@ FILTER: while( my $db_filter = $sth->fetchrow_hashref() ) { Debug( "Got " . @filters . " filters" ); } - return( @filters ); + return @filters; } # end sub getFilters sub checkFilter { diff --git a/web/api/app/Config/bootstrap.php.in b/web/api/app/Config/bootstrap.php.in index d1cd7857d..4e2d99c63 100644 --- a/web/api/app/Config/bootstrap.php.in +++ b/web/api/app/Config/bootstrap.php.in @@ -70,6 +70,7 @@ Cache::config('default', array('engine' => 'Apc')); * */ CakePlugin::load('Crud'); +CakePlugin::load('CakePHP-Enum-Behavior'); /** * You can attach event listeners to the request lifecycle as Dispatcher Filter. By default CakePHP bundles two filters: diff --git a/web/api/app/Controller/MonitorsController.php b/web/api/app/Controller/MonitorsController.php index c24cd12f2..0880cc68e 100644 --- a/web/api/app/Controller/MonitorsController.php +++ b/web/api/app/Controller/MonitorsController.php @@ -15,10 +15,13 @@ class MonitorsController extends AppController { */ public $components = array('Paginator', 'RequestHandler'); + public function beforeRender() { + $this->set($this->Monitor->enumValues()); + } public function beforeFilter() { parent::beforeFilter(); $canView = $this->Session->Read('monitorPermission'); - if ($canView =='None') { + if ($canView == 'None') { throw new UnauthorizedException(__('Insufficient Privileges')); return; } @@ -109,10 +112,9 @@ class MonitorsController extends AppController { * @return void */ public function add() { - if ($this->request->is('post')) { + if ( $this->request->is('post') ) { - if ($this->Session->Read('systemPermission') != 'Edit') - { + if ( $this->Session->Read('systemPermission') != 'Edit' ) { throw new UnauthorizedException(__('Insufficient privileges')); return; } @@ -120,8 +122,15 @@ class MonitorsController extends AppController { $this->Monitor->create(); if ($this->Monitor->save($this->request->data)) { $this->daemonControl($this->Monitor->id, 'start'); - return $this->flash(__('The monitor has been saved.'), array('action' => 'index')); + //return $this->flash(__('The monitor has been saved.'), array('action' => 'index')); + $message = 'Saved'; + } else { + $message = 'Error'; } + $this->set(array( + 'message' => $message, + '_serialize' => array('message') + )); } } @@ -138,8 +147,7 @@ class MonitorsController extends AppController { if (!$this->Monitor->exists($id)) { throw new NotFoundException(__('Invalid monitor')); } - if ($this->Session->Read('monitorPermission') != 'Edit') - { + if ($this->Session->Read('monitorPermission') != 'Edit') { throw new UnauthorizedException(__('Insufficient privileges')); return; } diff --git a/web/api/app/Model/Monitor.php b/web/api/app/Model/Monitor.php index 0504dd22a..c9697b694 100644 --- a/web/api/app/Model/Monitor.php +++ b/web/api/app/Model/Monitor.php @@ -86,10 +86,10 @@ class Monitor extends AppModel { ); /** - * * hasMany associations - * * - * * @var array - * */ + * hasMany associations + * + * @var array + */ public $hasAndBelongsToMany = array( 'Group' => array( 'className' => 'Group', @@ -108,5 +108,16 @@ class Monitor extends AppModel { 'counterQuery' => '' ), ); + public $actsAs = array( + 'CakePHP-Enum-Behavior.Enum' => array( + 'Type' => array('Local','Remote','File','Ffmpeg','Libvlc','cURL'), + 'Function' => array('None','Monitor','Modect','Record','Mocord','Nodect'), + 'Orientation' => array('0','90','180','270','hori','vert'), + 'OutputCodec' => array('h264','mjpeg','mpeg1','mpeg2'), + 'OutputContainer' => array('auto','mp4','mkv'), + 'DefaultView' => array('Events','Control'), + 'Status' => array('Unknown','NotRunning','Running','NoSignal','Signal'), + ) + ); } diff --git a/web/api/app/Plugin/CakePHP-Enum-Behavior b/web/api/app/Plugin/CakePHP-Enum-Behavior new file mode 160000 index 000000000..7108489f2 --- /dev/null +++ b/web/api/app/Plugin/CakePHP-Enum-Behavior @@ -0,0 +1 @@ +Subproject commit 7108489f218c54d36d235d3af91d6da2f8311237 diff --git a/web/api/app/View/Monitors/json/add.ctp b/web/api/app/View/Monitors/json/add.ctp new file mode 100644 index 000000000..77d2dd08b --- /dev/null +++ b/web/api/app/View/Monitors/json/add.ctp @@ -0,0 +1,2 @@ +echo json_encode($message); +echo json_encode($monitor); diff --git a/web/api/app/View/Monitors/xml/add.ctp b/web/api/app/View/Monitors/xml/add.ctp new file mode 100644 index 000000000..09fb8979a --- /dev/null +++ b/web/api/app/View/Monitors/xml/add.ctp @@ -0,0 +1,2 @@ +$xml = Xml::fromArray(array('response' => $message)); +echo $xml->asXML();