diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Logger.pm b/scripts/ZoneMinder/lib/ZoneMinder/Logger.pm index 1f56c0a11..213b83dac 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/Logger.pm +++ b/scripts/ZoneMinder/lib/ZoneMinder/Logger.pm @@ -245,7 +245,8 @@ sub initialise( @ ) { $tempSyslogLevel = $level if defined($level = $this->getTargettedEnv('LOG_LEVEL_SYSLOG')); if ( $Config{ZM_LOG_DEBUG} ) { - foreach my $target ( split( /\|/, $Config{ZM_LOG_DEBUG_TARGET} ) ) { + # Splitting on an empty string doesn't return an empty string, it returns an empty array + foreach my $target ( $Config{ZM_LOG_DEBUG_TARGET} ? split(/\|/, $Config{ZM_LOG_DEBUG_TARGET}) : '' ) { if ( $target eq $this->{id} || $target eq '_'.$this->{id} || $target eq $this->{idRoot} @@ -278,6 +279,9 @@ sub initialise( @ ) { $this->{initialised} = !undef; + # this function can get called on a previously initialized log Object, so clean any sth's + $this->{sth} = undef; + Debug( 'LogOpts: level='.$codes{$this->{level}} .'/'.$codes{$this->{effectiveLevel}} .', screen='.$codes{$this->{termLevel}} @@ -319,6 +323,8 @@ sub reinitialise { my $screenLevel = $this->termLevel(); $this->termLevel(NOLOG); $this->termLevel($screenLevel) if $screenLevel > NOLOG; + + $this->{sth} = undef; } # Prevents undefined logging levels @@ -392,6 +398,12 @@ sub level { # ICON: I am remarking this out because I don't see the point of having an effective level, if we are just going to set it to level. #$this->{effectiveLevel} = $this->{level} if ( $this->{level} > $this->{effectiveLevel} ); + # ICON: The point is that LOG_DEBUG can be set either in db or in env var and will get passed in here. + # So this will turn on debug, even if not output has Debug level turned on. I think it should be the other way around + + # ICON: Let's try this line instead. effectiveLevel is 1 DEBUG from above, but LOG_DEBUG is off, then $this->level will be 0, and + # so effectiveLevel will become 0 + $this->{effectiveLevel} = $this->{level} if ( $this->{level} < $this->{effectiveLevel} ); } return $this->{level}; } @@ -517,55 +529,59 @@ sub logPrint { if ( $level <= $this->{effectiveLevel} ) { $string =~ s/[\r\n]+$//g; - - my $code = $codes{$level}; + if ( $level <= $this->{syslogLevel} ) { + syslog($priorities{$level}, $codes{$level}.' [%s]', $string); + } my ($seconds, $microseconds) = gettimeofday(); - my $message = sprintf( - '%s.%06d %s[%d].%s [%s]' - , strftime('%x %H:%M:%S', localtime($seconds)) - , $microseconds - , $this->{id} - , $$ - , $code - , $string - ); - if ( $this->{trace} ) { - $message = Carp::shortmess($message); - } else { - $message = $message."\n"; + if ( $level <= $this->{fileLevel} or $level <= $this->{termLevel} ) { + my $message = sprintf( + '%s.%06d %s[%d].%s [%s]' + , strftime('%x %H:%M:%S', localtime($seconds)) + , $microseconds + , $this->{id} + , $$ + , $codes{$level} + , $string + ); + if ( $this->{trace} ) { + $message = Carp::shortmess($message); + } else { + $message = $message."\n"; + } + print($LOGFILE $message) if $level <= $this->{fileLevel}; + print(STDERR $message) if $level <= $this->{termLevel}; } - if ( $level <= $this->{syslogLevel} ) { - syslog($priorities{$level}, $code.' [%s]', $string); - } - print($LOGFILE $message) if $level <= $this->{fileLevel}; - print(STDERR $message) if $level <= $this->{termLevel}; if ( $level <= $this->{databaseLevel} ) { - if ( ( $this->{dbh} and $this->{dbh}->ping() ) or ( $this->{dbh} = ZoneMinder::Database::zmDbConnect() ) ) { - - - my $sql = 'INSERT INTO Logs ( TimeKey, Component, Pid, Level, Code, Message, File, Line ) VALUES ( ?, ?, ?, ?, ?, ?, ?, NULL )'; - $this->{sth} = $this->{dbh}->prepare_cached($sql) if ! $this->{sth}; - if ( !$this->{sth} ) { + if ( ! ( $this->{dbh} and $this->{dbh}->ping() ) ) { + $this->{sth} = undef; + if ( ! ( $this->{dbh} = ZoneMinder::Database::zmDbConnect() ) ) { + print(STDERR "Can't log to database: "); $this->{databaseLevel} = NOLOG; - Error("Can't prepare log entry '$sql': ".$this->{dbh}->errstr()); - } else { - my $res = $this->{sth}->execute($seconds+($microseconds/1000000.0) - , $this->{id} - , $$ - , $level - , $code - , $string - , $this->{fileName} - ); - if ( !$res ) { - $this->{databaseLevel} = NOLOG; - Error("Can't execute log entry '$sql': ".$this->{dbh}->errstr()); - } + return; } - } else { - print(STDERR "Can't log to database: "); + } + + my $sql = 'INSERT INTO Logs ( TimeKey, Component, Pid, Level, Code, Message, File, Line ) VALUES ( ?, ?, ?, ?, ?, ?, ?, NULL )'; + $this->{sth} = $this->{dbh}->prepare_cached($sql) if ! $this->{sth}; + if ( !$this->{sth} ) { + $this->{databaseLevel} = NOLOG; + Error("Can't prepare log entry '$sql': ".$this->{dbh}->errstr()); + return; + } + + my $res = $this->{sth}->execute($seconds+($microseconds/1000000.0) + , $this->{id} + , $$ + , $level + , $codes{$level} + , $string + , $this->{fileName} + ); + if ( !$res ) { + $this->{databaseLevel} = NOLOG; + Error("Can't execute log entry '$sql': ".$this->{dbh}->errstr()); } } # end if doing db logging } # end if level < effectivelevel diff --git a/scripts/zmdc.pl.in b/scripts/zmdc.pl.in index 8eaf7de4c..3e8d816e4 100644 --- a/scripts/zmdc.pl.in +++ b/scripts/zmdc.pl.in @@ -245,6 +245,16 @@ our %terminating_processes; our $zm_terminate = 0; sub run { + + # Call this first otherwise stdout/stderror redirects to the pidfile = bad + if ( open(my $PID, '>', ZM_PID) ) { + print($PID $$); + close($PID); + } else { + # Log not initialized at this point so use die instead + die "Can't open pid file at ".ZM_PID."\n"; + } + my $fd = 0; # THis also closes dbh and CLIENT and SERVER @@ -254,6 +264,8 @@ sub run { setpgrp(); + # dbh got closed with the rest of the fd's above, so need to reconnect. + my $dbh = zmDbConnect(1); logInit(); dPrint(ZoneMinder::Logger::INFO, 'Server starting at ' @@ -261,18 +273,10 @@ sub run { ."\n" ); - if ( open(my $PID, '>', ZM_PID) ) { - print($PID $$); - close($PID); - } else { - Error("Can't open pid file at " . ZM_PID); - } - # Tell any existing processes to die, wait 1 second between TERM and KILL killAll(1); dPrint(ZoneMinder::Logger::INFO, 'Socket should be open at ' .main::SOCK_FILE); - my $dbh = zmDbConnect(1); socket(SERVER, PF_UNIX, SOCK_STREAM, 0) or Fatal("Can't open socket: $!"); unlink(main::SOCK_FILE) or Error('Unable to unlink ' . main::SOCK_FILE .". Error message was: $!") if -e main::SOCK_FILE; bind(SERVER, $saddr) or Fatal("Can't bind to " . main::SOCK_FILE . ": $!"); @@ -365,9 +369,7 @@ sub run { #print( "Select timed out\n" ); } -Debug("restartPending"); restartPending(); -Debug("check_for_processes_to_kill"); check_for_processes_to_kill(); } # end while @@ -396,7 +398,6 @@ sub dPrint { my $logLevel = shift; # One thought here, if no client exists to read these... does it block? if ( fileno(CLIENT) ) { - Debug("Have fileno for CLIENT, printing "); print CLIENT @_ } if ( $logLevel == ZoneMinder::Logger::DEBUG ) { @@ -435,7 +436,7 @@ sub start { sigprocmask(SIG_BLOCK, $blockset, $sigset) or Fatal("Can't block SIGCHLD: $!"); if ( my $cpid = fork() ) { # This logReinit is required. Not sure why. - logReinit(); + #logReinit(); $process->{pid} = $cpid; $process->{started} = time(); diff --git a/scripts/zmpkg.pl.in b/scripts/zmpkg.pl.in index e146f76c8..d11e04d5a 100644 --- a/scripts/zmpkg.pl.in +++ b/scripts/zmpkg.pl.in @@ -149,21 +149,8 @@ if ( $command =~ /^(start|stop|restart)$/ ) { $command = $1; if ( systemdRunning() && !calledBysystem() ) { - Info("Redirecting command through systemctl"); - my $path = qx(which systemctl); - Info("Path is $path"); - Info("Status is $?"); - my $status = $? >> 8; - Info("Status is $status"); - ( $path ) = $path =~ /^(.*)$/; - - if ( !$path || $status ) { - Fatal('Unable to determine systemctl executable. Is systemd in use?'); - } - Info("exec $path $command zoneminder"); - exec("$path $command zoneminder"); - } else { - Debug("called by SystemD"); + qx(@BINDIR@/zmsystemctl.pl $command); + $command = ''; } } diff --git a/src/zm_logger.cpp b/src/zm_logger.cpp index 409736ca8..2851742ca 100644 --- a/src/zm_logger.cpp +++ b/src/zm_logger.cpp @@ -38,7 +38,7 @@ #endif bool Logger::smInitialised = false; -Logger *Logger::smInstance = 0; +Logger *Logger::smInstance = NULL; Logger::StringMap Logger::smCodes; Logger::IntMap Logger::smSyslogPriorities; @@ -58,9 +58,9 @@ static void subtractTime( struct timeval * const tp1, struct timeval * const tp2 void Logger::usrHandler( int sig ) { Logger *logger = fetch(); if ( sig == SIGUSR1 ) - logger->level( logger->level()+1 ); + logger->level(logger->level()+1); else if ( sig == SIGUSR2 ) - logger->level( logger->level()-1 ); + logger->level(logger->level()-1); Info("Logger - Level changed to %d", logger->level()); } @@ -79,7 +79,7 @@ Logger::Logger() : mFlush(false) { if ( smInstance ) { - Panic( "Attempt to create second instance of Logger class" ); + Panic("Attempt to create second instance of Logger class"); } if ( !smInitialised ) { @@ -133,11 +133,11 @@ void Logger::initialise(const std::string &id, const Options &options) { std::string tempLogFile; - if ( (envPtr = getTargettedEnv("LOG_FILE")) ) + if ( (envPtr = getTargettedEnv("LOG_FILE")) ) { tempLogFile = envPtr; - else if ( options.mLogFile.size() ) + } else if ( options.mLogFile.size() ) { tempLogFile = options.mLogFile; - else { + } else { if ( options.mLogPath.size() ) { mLogPath = options.mLogPath; } @@ -169,7 +169,7 @@ void Logger::initialise(const std::string &id, const Options &options) { tempSyslogLevel = config.log_level_syslog >= DEBUG1 ? DEBUG9 : config.log_level_syslog; // Legacy - if ( (envPtr = getenv( "LOG_PRINT" )) ) + if ( (envPtr = getenv("LOG_PRINT")) ) tempTerminalLevel = atoi(envPtr) ? DEBUG9 : NOLOG; if ( (envPtr = getTargettedEnv("LOG_LEVEL")) ) @@ -218,7 +218,7 @@ void Logger::initialise(const std::string &id, const Options &options) { mFlush = false; if ( (envPtr = getenv("LOG_FLUSH")) ) { - mFlush = atoi( envPtr ); + mFlush = atoi(envPtr); } else if ( config.log_debug ) { mFlush = true; } @@ -571,12 +571,12 @@ void Logger::logPrint( bool hex, const char * const filepath, const int line, co } } -void logInit( const char *name, const Logger::Options &options ) { +void logInit(const char *name, const Logger::Options &options) { if ( !Logger::smInstance ) Logger::smInstance = new Logger(); Logger::Options tempOptions = options; tempOptions.mLogPath = staticConfig.PATH_LOGS; - Logger::smInstance->initialise( name, tempOptions ); + Logger::smInstance->initialise(name, tempOptions); } void logTerm() { diff --git a/src/zm_monitorstream.cpp b/src/zm_monitorstream.cpp index 48d83200c..63383f2ae 100644 --- a/src/zm_monitorstream.cpp +++ b/src/zm_monitorstream.cpp @@ -633,7 +633,7 @@ Debug(2, "Have checking command Queue for connkey: %d", connkey ); // Send the next frame Monitor::Snapshot *snap = &monitor->image_buffer[index]; - //Debug(2, "sending Frame."); + Debug(2, "sending Frame."); if ( !sendFrame(snap->image, snap->timestamp) ) { Debug(2, "sendFrame failed, quiting."); zm_terminate = true; @@ -687,7 +687,7 @@ Debug(2, "Have checking command Queue for connkey: %d", connkey ); } // end if buffered playback frame_count++; } else { - Debug(5,"Waiting for capture"); + Debug(4,"Waiting for capture last_write_index=%u", monitor->shared_data->last_write_index); } // end if ( (unsigned int)last_read_index != monitor->shared_data->last_write_index ) unsigned long sleep_time = (unsigned long)((1000000 * ZM_RATE_BASE)/((base_fps?base_fps:1)*abs(replay_rate*2))); diff --git a/src/zm_video.cpp b/src/zm_video.cpp index 22379f2b3..07bedc683 100644 --- a/src/zm_video.cpp +++ b/src/zm_video.cpp @@ -376,7 +376,10 @@ int X264MP4Writer::x264config() { x264params.b_annexb = 0; /* TODO: Setup error handler */ - // x264params.i_log_level = X264_LOG_DEBUG; + if ( logDebugging() ) + x264params.i_log_level = X264_LOG_DEBUG; + else + x264params.i_log_level = X264_LOG_NONE; /* Process user parameters (excluding preset, tune and profile) */ for ( unsigned int i = 0; i < user_params.size(); i++ ) { diff --git a/src/zma.cpp b/src/zma.cpp index 83035f011..33dedbe54 100644 --- a/src/zma.cpp +++ b/src/zma.cpp @@ -83,7 +83,7 @@ int main( int argc, char *argv[] ) { while (1) { int option_index = 0; - int c = getopt_long (argc, argv, "m:h:v", long_options, &option_index); + int c = getopt_long(argc, argv, "m:h:v", long_options, &option_index); if ( c == -1 ) { break; } @@ -144,7 +144,7 @@ int main( int argc, char *argv[] ) { unsigned int analysis_update_delay = monitor->GetAnalysisUpdateDelay(); time_t last_analysis_update_time, cur_time; monitor->UpdateAdaptiveSkip(); - last_analysis_update_time = time( 0 ); + last_analysis_update_time = time(0); while( (!zm_terminate) && monitor->ShmValid() ) { // Process the next image @@ -181,5 +181,5 @@ int main( int argc, char *argv[] ) { Image::Deinitialise(); logTerm(); zmDbClose(); - return( 0 ); + return 0; } diff --git a/web/api/app/Plugin/CakePHP-Enum-Behavior b/web/api/app/Plugin/CakePHP-Enum-Behavior index ea90c0cd7..ca91b87fd 160000 --- a/web/api/app/Plugin/CakePHP-Enum-Behavior +++ b/web/api/app/Plugin/CakePHP-Enum-Behavior @@ -1 +1 @@ -Subproject commit ea90c0cd7f6e24333a90885e563b5d30b793db29 +Subproject commit ca91b87fda8e006e4fca2ed870f24f9a29c2905d diff --git a/web/api/app/Plugin/Crud b/web/api/app/Plugin/Crud index 0bd63fb46..c3976f147 160000 --- a/web/api/app/Plugin/Crud +++ b/web/api/app/Plugin/Crud @@ -1 +1 @@ -Subproject commit 0bd63fb464957080ead342db58ca9e01532cf1ef +Subproject commit c3976f1478c681b0bbc132ec3a3e82c3984eeed5 diff --git a/web/skins/classic/css/classic/views/watch.css b/web/skins/classic/css/classic/views/watch.css index 4ebb30dda..247be4f05 100644 --- a/web/skins/classic/css/classic/views/watch.css +++ b/web/skins/classic/css/classic/views/watch.css @@ -38,13 +38,6 @@ text-align: center; } -#dvrControls input { - height: 20px; - width: 28px; - padding-bottom: 3px; - margin: 0 3px; -} - #dvrControls input[disabled] { color: #aaaaaa; } diff --git a/web/skins/classic/views/console.php b/web/skins/classic/views/console.php index 119a223eb..864bb956f 100644 --- a/web/skins/classic/views/console.php +++ b/web/skins/classic/views/console.php @@ -223,7 +223,7 @@ ob_start(); - + - +