mirror of
https://github.com/ZoneMinder/zoneminder.git
synced 2026-03-11 18:37:28 -04:00
Merge branch 'fix_2213' into storageareas
This commit is contained in:
@@ -363,7 +363,7 @@ MAIN: while( $loop ) {
|
||||
}
|
||||
|
||||
if ( ! $$Storage{Scheme} ) {
|
||||
Debug("Storage Scheme not set on $$Storage{Name}");
|
||||
Error("Storage Scheme not set on $$Storage{Name}");
|
||||
if ( ! chdir( $monitor_dir ) ) {
|
||||
Error( "Can't chdir directory '$$Storage{Path}/$monitor_dir': $!" );
|
||||
next;
|
||||
@@ -386,7 +386,7 @@ MAIN: while( $loop ) {
|
||||
} # if USE_DEEP_STORAGE
|
||||
Debug( 'Got '.int(keys(%$fs_events))." filesystem events for monitor $monitor_dir\n" );
|
||||
|
||||
delete_empty_directories($$Storage{Path}.'/'.$monitor_dir);
|
||||
delete_empty_subdirs($$Storage{Path}.'/'.$monitor_dir);
|
||||
} # end foreach monitor
|
||||
|
||||
if ( $cleaned ) {
|
||||
@@ -477,6 +477,10 @@ MAIN: while( $loop ) {
|
||||
next;
|
||||
}
|
||||
Debug("Event $db_event is not in fs. Should have been at ".$Event->Path());
|
||||
if ( $Event->Archived() ) {
|
||||
Warning("Event $$Event{Id} is Archived. Taking no further action on it.");
|
||||
next;
|
||||
}
|
||||
if ( ! $Event->StartTime() ) {
|
||||
Info("Event $$Event{Id} has no start time. deleting it.");
|
||||
if ( confirm() ) {
|
||||
@@ -881,6 +885,24 @@ sub deleteSwapImage {
|
||||
}
|
||||
}
|
||||
|
||||
# Deletes empty sub directories of the given path.
|
||||
# Does not delete the path if empty. Is not meant to be recursive.
|
||||
sub delete_empty_subdirs {
|
||||
my $DIR;
|
||||
if ( !opendir($DIR, $_[0]) ) {
|
||||
Error("delete_empty_directories: Can't open directory '".getcwd()."/$_[0]': $!" );
|
||||
return;
|
||||
}
|
||||
my @contents = map { ( $_ eq '.' or $_ eq '..' ) ? () : $_ } readdir( $DIR );
|
||||
Debug("delete_empty_subdirectories $_[0] has " . @contents .' entries:' . ( @contents < 2 ? join(',',@contents) : '' ));
|
||||
my @dirs = map { -d $_[0].'/'.$_ ? $_ : () } @contents;
|
||||
Debug("Have " . @dirs . " dirs");
|
||||
foreach ( @dirs ) {
|
||||
delete_empty_directories( $_[0].'/'.$_ );
|
||||
}
|
||||
closedir($DIR);
|
||||
}
|
||||
|
||||
sub delete_empty_directories {
|
||||
my $DIR;
|
||||
if ( !opendir($DIR, $_[0]) ) {
|
||||
|
||||
@@ -120,9 +120,15 @@ Event::Event(
|
||||
|
||||
char id_file[PATH_MAX];
|
||||
|
||||
char *path_ptr = path;
|
||||
path_ptr += snprintf(path_ptr, sizeof(path), "%s/%d", storage->Path(), monitor->Id());
|
||||
// Try to make the Monitor Dir. Normally this would exist, but in odd cases might not.
|
||||
if ( mkdir(path, 0755) ) {
|
||||
if ( errno != EEXIST )
|
||||
Error("Can't mkdir %s: %s", path, strerror(errno));
|
||||
}
|
||||
|
||||
if ( storage->Scheme() == Storage::DEEP ) {
|
||||
char *path_ptr = path;
|
||||
path_ptr += snprintf(path_ptr, sizeof(path), "%s/%d", storage->Path(), monitor->Id());
|
||||
|
||||
int dt_parts[6];
|
||||
dt_parts[0] = stime->tm_year-100;
|
||||
@@ -154,28 +160,24 @@ Event::Event(
|
||||
if ( symlink(time_path, id_file) < 0 )
|
||||
Error("Can't symlink %s -> %s: %s", id_file, path, strerror(errno));
|
||||
} else if ( storage->Scheme() == Storage::MEDIUM ) {
|
||||
char *path_ptr = path;
|
||||
path_ptr += snprintf(
|
||||
path_ptr, sizeof(path), "%s/%d/%04d-%02d-%02d",
|
||||
storage->Path(), monitor->Id(), stime->tm_year+1900, stime->tm_mon+1, stime->tm_mday
|
||||
path_ptr, sizeof(path), "/%04d-%02d-%02d",
|
||||
stime->tm_year+1900, stime->tm_mon+1, stime->tm_mday
|
||||
);
|
||||
if ( mkdir(path, 0755) ) {
|
||||
// FIXME This should not be fatal. Should probably move to a different storage area.
|
||||
if ( errno != EEXIST )
|
||||
Error("Can't mkdir %s: %s", path, strerror(errno));
|
||||
}
|
||||
path_ptr += snprintf(path_ptr, sizeof(path), "/%" PRIu64, id);
|
||||
if ( mkdir(path, 0755) ) {
|
||||
// FIXME This should not be fatal. Should probably move to a different storage area.
|
||||
if ( errno != EEXIST )
|
||||
Error("Can't mkdir %s: %s", path, strerror(errno));
|
||||
}
|
||||
} else {
|
||||
snprintf(path, sizeof(path), "%s/%d/%" PRIu64, storage->Path(), monitor->Id(), id);
|
||||
path_ptr += snprintf(path, sizeof(path), "/%" PRIu64, id);
|
||||
if ( mkdir(path, 0755) ) {
|
||||
if ( errno != EEXIST ) {
|
||||
if ( errno != EEXIST )
|
||||
Error("Can't mkdir %s: %s", path, strerror(errno));
|
||||
}
|
||||
}
|
||||
|
||||
// Create empty id tag file
|
||||
|
||||
@@ -14,9 +14,17 @@ $| = 1;
|
||||
|
||||
my @monitors;
|
||||
my $dbh = zmDbConnect();
|
||||
my $sql = "SELECT * FROM Monitors";
|
||||
my $sth = $dbh->prepare_cached( $sql ) or die( "Can't prepare '$sql': ".$dbh->errstr() );
|
||||
my $res = $sth->execute() or die( "Can't execute '$sql': ".$sth->errstr() );
|
||||
|
||||
my $sql = "SELECT * FROM Monitors
|
||||
WHERE find_in_set( Function, 'Modect,Mocord,Nodect' )".
|
||||
( $Config{ZM_SERVER_ID} ? 'AND ServerId=?' : '' )
|
||||
;
|
||||
|
||||
my $sth = $dbh->prepare_cached( $sql )
|
||||
or die( "Can't prepare '$sql': ".$dbh->errstr() );
|
||||
|
||||
my $res = $sth->execute()
|
||||
or die( "Can't execute '$sql': ".$sth->errstr() );
|
||||
|
||||
while ( my $monitor = $sth->fetchrow_hashref() ) {
|
||||
push( @monitors, $monitor );
|
||||
@@ -24,6 +32,12 @@ while ( my $monitor = $sth->fetchrow_hashref() ) {
|
||||
|
||||
while (1) {
|
||||
foreach my $monitor (@monitors) {
|
||||
# Check shared memory ok
|
||||
if ( !zmMemVerify( $monitor ) ) {
|
||||
zmMemInvalidate( $monitor );
|
||||
next;
|
||||
}
|
||||
|
||||
my $monitorState = zmGetMonitorState($monitor);
|
||||
printState($monitor->{Id}, $monitor->{Name}, $monitorState);
|
||||
}
|
||||
|
||||
@@ -166,12 +166,15 @@ foreach ( array_map('basename', glob('skins/'.$current_skin.'/css/*',GLOB_ONLYDI
|
||||
$userMonitors = array();
|
||||
if ( !empty($row['MonitorIds']) ) {
|
||||
foreach ( explode(',', $row['MonitorIds']) as $monitorId ) {
|
||||
// A deleted monitor will cause an error since we don't update
|
||||
// the user monitors list on monitor delete
|
||||
if ( ! isset($monitors[$monitorId]) ) continue;
|
||||
$userMonitors[] = $monitors[$monitorId]['Name'];
|
||||
}
|
||||
}
|
||||
?>
|
||||
<tr>
|
||||
<td class="colUsername"><?php echo makePopupLink( '?view=user&uid='.$row['Id'], 'zmUser', 'user', validHtmlStr($row['Username']).($user['Username']==$row['Username']?"*":""), $canEdit ) ?></td>
|
||||
<td class="colUsername"><?php echo makePopupLink('?view=user&uid='.$row['Id'], 'zmUser', 'user', validHtmlStr($row['Username']).($user['Username']==$row['Username']?"*":""), $canEdit) ?></td>
|
||||
<td class="colLanguage"><?php echo $row['Language']?validHtmlStr($row['Language']):'default' ?></td>
|
||||
<td class="colEnabled"><?php echo $row['Enabled']?translate('Yes'):translate('No') ?></td>
|
||||
<td class="colStream"><?php echo validHtmlStr($row['Stream']) ?></td>
|
||||
|
||||
Reference in New Issue
Block a user