diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Logger.pm b/scripts/ZoneMinder/lib/ZoneMinder/Logger.pm index 28e3bbbad..e710491b9 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/Logger.pm +++ b/scripts/ZoneMinder/lib/ZoneMinder/Logger.pm @@ -75,7 +75,7 @@ our %EXPORT_TAGS = ( push( @{$EXPORT_TAGS{all}}, @{$EXPORT_TAGS{$_}} ) foreach keys %EXPORT_TAGS; -our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); +our @EXPORT_OK = ( @{ $EXPORT_TAGS{all} } ); our @EXPORT = qw(); @@ -135,18 +135,19 @@ sub new { $this->{initialised} = undef; -#$this->{id} = 'zmundef'; ( $this->{id} ) = $0 =~ m|^(?:.*/)?([^/]+?)(?:\.[^/.]+)?$|; $this->{idRoot} = $this->{id}; $this->{idArgs} = ''; $this->{level} = INFO; + + # Detect if we are running in a terminal session, if so, default log level to INFO $this->{hasTerm} = -t STDERR; -if ( $this->{hasTerm} ) { - $this->{termLevel} = INFO; -} else { - $this->{termLevel} = NOLOG; -} + if ( $this->{hasTerm} ) { + $this->{termLevel} = INFO; + } else { + $this->{termLevel} = NOLOG; + } $this->{databaseLevel} = NOLOG; $this->{fileLevel} = NOLOG; $this->{syslogLevel} = NOLOG; @@ -156,7 +157,7 @@ if ( $this->{hasTerm} ) { ( $this->{fileName} = $0 ) =~ s|^.*/||; $this->{logPath} = $Config{ZM_PATH_LOGS}; - $this->{logFile} = $this->{logPath}.'/'.$this->{id}.".log"; + $this->{logFile} = $this->{logPath}.'/'.$this->{id}.'.log'; $this->{trace} = 0; @@ -175,9 +176,9 @@ sub BEGIN { ZM_LOG_LEVEL_FILE => 0, ZM_LOG_LEVEL_SYSLOG => 0, ZM_LOG_DEBUG => 0, - ZM_LOG_DEBUG_TARGET => "", + ZM_LOG_DEBUG_TARGET => '', ZM_LOG_DEBUG_LEVEL => 1, - ZM_LOG_DEBUG_FILE => "" + ZM_LOG_DEBUG_FILE => '' ); while ( my ( $name, $value ) = each( %dbgConfig ) ) { *{$name} = sub { $value }; @@ -196,13 +197,13 @@ sub initialise( @ ) { my $this = shift; my %options = @_; - $this->{id} = $options{id} if ( defined($options{id}) ); + $this->{id} = $options{id} if defined($options{id}); - $this->{logPath} = $options{logPath} if ( defined($options{logPath}) ); + $this->{logPath} = $options{logPath} if defined($options{logPath}); my $tempLogFile; - $tempLogFile = $this->{logPath}.'/'.$this->{id}.".log"; - $tempLogFile = $options{logFile} if ( defined($options{logFile}) ); + $tempLogFile = $this->{logPath}.'/'.$this->{id}.'.log'; + $tempLogFile = $options{logFile} if defined($options{logFile}); if ( my $logFile = $this->getTargettedEnv('LOG_FILE') ) { $tempLogFile = $logFile; } @@ -213,7 +214,7 @@ sub initialise( @ ) { my $tempFileLevel = $this->{fileLevel}; my $tempSyslogLevel = $this->{syslogLevel}; - $tempTermLevel = $options{termLevel} if ( defined($options{termLevel}) ); + $tempTermLevel = $options{termLevel} if defined($options{termLevel}); if ( defined($options{databaseLevel}) ) { $tempDatabaseLevel = $options{databaseLevel}; } else { @@ -230,16 +231,16 @@ sub initialise( @ ) { $tempSyslogLevel = $Config{ZM_LOG_LEVEL_SYSLOG}; } - if ( defined($ENV{'LOG_PRINT'}) ) { - $tempTermLevel = $ENV{'LOG_PRINT'}? DEBUG : NOLOG; + if ( defined($ENV{LOG_PRINT}) ) { + $tempTermLevel = $ENV{LOG_PRINT}? DEBUG : NOLOG; } my $level; - $tempLevel = $level if ( defined($level = $this->getTargettedEnv('LOG_LEVEL')) ); - $tempTermLevel = $level if ( defined($level = $this->getTargettedEnv('LOG_LEVEL_TERM')) ); - $tempDatabaseLevel = $level if ( defined($level = $this->getTargettedEnv('LOG_LEVEL_DATABASE')) ); - $tempFileLevel = $level if ( defined($level = $this->getTargettedEnv('LOG_LEVEL_FILE')) ); - $tempSyslogLevel = $level if ( defined($level = $this->getTargettedEnv('LOG_LEVEL_SYSLOG')) ); + $tempLevel = $level if defined($level = $this->getTargettedEnv('LOG_LEVEL')); + $tempTermLevel = $level if defined($level = $this->getTargettedEnv('LOG_LEVEL_TERM')); + $tempDatabaseLevel = $level if defined($level = $this->getTargettedEnv('LOG_LEVEL_DATABASE')); + $tempFileLevel = $level if defined($level = $this->getTargettedEnv('LOG_LEVEL_FILE')); + $tempSyslogLevel = $level if defined($level = $this->getTargettedEnv('LOG_LEVEL_SYSLOG')); if ( $Config{ZM_LOG_DEBUG} ) { foreach my $target ( split( /\|/, $Config{ZM_LOG_DEBUG_TARGET} ) ) { @@ -247,11 +248,11 @@ sub initialise( @ ) { || $target eq '_'.$this->{id} || $target eq $this->{idRoot} || $target eq '_'.$this->{idRoot} - || $target eq "" + || $target eq '' ) { if ( $Config{ZM_LOG_DEBUG_LEVEL} > NOLOG ) { $tempLevel = $this->limit( $Config{ZM_LOG_DEBUG_LEVEL} ); - if ( $Config{ZM_LOG_DEBUG_FILE} ne "" ) { + if ( $Config{ZM_LOG_DEBUG_FILE} ne '' ) { $tempLogFile = $Config{ZM_LOG_DEBUG_FILE}; $tempFileLevel = $tempLevel; } @@ -269,9 +270,9 @@ sub initialise( @ ) { $this->level( $tempLevel ); - $this->{trace} = $options{trace} if ( defined($options{trace}) ); + $this->{trace} = $options{trace} if defined($options{trace}); - $this->{autoFlush} = $ENV{'LOG_FLUSH'}?1:0 if ( defined($ENV{'LOG_FLUSH'}) ); + $this->{autoFlush} = $ENV{LOG_FLUSH}?1:0 if defined($ENV{LOG_FLUSH}); $this->{initialised} = !undef; @@ -303,28 +304,28 @@ sub reinitialise { # Bit of a nasty hack to reopen connections to log files and the DB my $syslogLevel = $this->syslogLevel(); $this->syslogLevel( NOLOG ); - $this->syslogLevel( $syslogLevel ) if ( $syslogLevel > NOLOG ); + $this->syslogLevel($syslogLevel) if $syslogLevel > NOLOG; my $logfileLevel = $this->fileLevel(); - $this->fileLevel( NOLOG ); - $this->fileLevel( $logfileLevel ) if ( $logfileLevel > NOLOG ); + $this->fileLevel(NOLOG); + $this->fileLevel($logfileLevel) if $logfileLevel > NOLOG; my $databaseLevel = $this->databaseLevel(); - $this->databaseLevel( NOLOG ); - $this->databaseLevel( $databaseLevel ) if ( $databaseLevel > NOLOG ); + $this->databaseLevel(NOLOG); + $this->databaseLevel($databaseLevel) if $databaseLevel > NOLOG; my $screenLevel = $this->termLevel(); - $this->termLevel( NOLOG ); - $this->termLevel( $screenLevel ) if ( $screenLevel > NOLOG ); + $this->termLevel(NOLOG); + $this->termLevel($screenLevel) if $screenLevel > NOLOG; } # Prevents undefined logging levels sub limit { my $this = shift; my $level = shift; - return( DEBUG ) if ( $level > DEBUG ); - return( NOLOG ) if ( $level < NOLOG ); - return( $level ); + return(DEBUG) if $level > DEBUG; + return(NOLOG) if $level < NOLOG; + return($level); } sub getTargettedEnv { @@ -332,32 +333,32 @@ sub getTargettedEnv { my $name = shift; my $envName = $name.'_'.$this->{id}; my $value; - $value = $ENV{$envName} if ( defined($ENV{$envName}) ); - if ( !defined($value) && $this->{id} ne $this->{idRoot} ) { + $value = $ENV{$envName} if defined($ENV{$envName}); + if ( !defined($value) and ($this->{id} ne $this->{idRoot}) ) { $envName = $name.'_'.$this->{idRoot}; - $value = $ENV{$envName} if ( defined($ENV{$envName}) ); + $value = $ENV{$envName} if defined($ENV{$envName}); } if ( !defined($value) ) { - $value = $ENV{$name} if ( defined($ENV{$name}) ); + $value = $ENV{$name} if defined($ENV{$name}); } if ( defined($value) ) { ( $value ) = $value =~ m/(.*)/; } - return( $value ); + return $value; } sub fetch { if ( !$logger ) { $logger = ZoneMinder::Logger->new(); - $logger->initialise( 'syslogLevel'=>INFO, 'databaseLevel'=>INFO ); + $logger->initialise( syslogLevel=>INFO, databaseLevel=>INFO ); } - return( $logger ); + return $logger; } sub id { my $this = shift; my $id = shift; - if ( defined($id) && $this->{id} ne $id ) { + if ( defined($id) and ($this->{id} ne $id) ) { # Remove whitespace $id =~ s/\S//g; # Replace non-alphanum with underscore @@ -371,37 +372,37 @@ sub id { } } } - return( $this->{id} ); + return $this->{id}; } sub level { my $this = shift; my $level = shift; if ( defined($level) ) { - $this->{level} = $this->limit( $level ); + $this->{level} = $this->limit($level); # effectiveLevel is the highest logging level used by any of the outputs. $this->{effectiveLevel} = NOLOG; - $this->{effectiveLevel} = $this->{termLevel} if ( $this->{termLevel} > $this->{effectiveLevel} ); - $this->{effectiveLevel} = $this->{databaseLevel} if ( $this->{databaseLevel} > $this->{effectiveLevel} ); - $this->{effectiveLevel} = $this->{fileLevel} if ( $this->{fileLevel} > $this->{effectiveLevel} ); - $this->{effectiveLevel} = $this->{syslogLevel} if ( $this->{syslogLevel} > $this->{effectiveLevel} ); + $this->{effectiveLevel} = $this->{termLevel} if $this->{termLevel} > $this->{effectiveLevel}; + $this->{effectiveLevel} = $this->{databaseLevel} if $this->{databaseLevel} > $this->{effectiveLevel}; + $this->{effectiveLevel} = $this->{fileLevel} if $this->{fileLevel} > $this->{effectiveLevel}; + $this->{effectiveLevel} = $this->{syslogLevel} if $this->{syslogLevel} > $this->{effectiveLevel}; # 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} ); } - return( $this->{level} ); + return $this->{level}; } sub debugOn { my $this = shift; - return( $this->{effectiveLevel} >= DEBUG ); + return $this->{effectiveLevel} >= DEBUG; } sub trace { my $this = shift; - $this->{trace} = $_[0] if ( @_ ); - return( $this->{trace} ); + $this->{trace} = $_[0] if @_; + return $this->{trace}; } sub termLevel { @@ -409,63 +410,62 @@ sub termLevel { my $termLevel = shift; if ( defined($termLevel) ) { # What is the point of this next lint if we are just going to overwrite it with the next line? I propose we move it down one line or remove it altogether - $termLevel = NOLOG if ( !$this->{hasTerm} ); - $termLevel = $this->limit( $termLevel ); + $termLevel = NOLOG if !$this->{hasTerm}; + $termLevel = $this->limit($termLevel); if ( $this->{termLevel} != $termLevel ) { $this->{termLevel} = $termLevel; } } - return( $this->{termLevel} ); + return $this->{termLevel}; } sub databaseLevel { my $this = shift; my $databaseLevel = shift; if ( defined($databaseLevel) ) { - $databaseLevel = $this->limit( $databaseLevel ); + $databaseLevel = $this->limit($databaseLevel); if ( $this->{databaseLevel} != $databaseLevel ) { - if ( $databaseLevel > NOLOG && $this->{databaseLevel} <= NOLOG ) { + if ( $databaseLevel > NOLOG and $this->{databaseLevel} <= NOLOG ) { if ( !$this->{dbh} ) { my $socket; my ( $host, $portOrSocket ) = ( $Config{ZM_DB_HOST} =~ /^([^:]+)(?::(.+))?$/ ); if ( defined($portOrSocket) ) { if ( $portOrSocket =~ /^\// ) { - $socket = ";mysql_socket=".$portOrSocket; + $socket = ';mysql_socket='.$portOrSocket; } else { - $socket = ";host=".$host.";port=".$portOrSocket; + $socket = ';host='.$host.';port='.$portOrSocket; } } else { - $socket = ";host=".$Config{ZM_DB_HOST}; + $socket = ';host='.$Config{ZM_DB_HOST}; } - my $sslOptions = ""; + my $sslOptions = ''; if ( $Config{ZM_DB_SSL_CA_CERT} ) { - $sslOptions = ';'.join(';', - "mysql_ssl=1", - "mysql_ssl_ca_file=".$Config{ZM_DB_SSL_CA_CERT}, - "mysql_ssl_client_key=".$Config{ZM_DB_SSL_CLIENT_KEY}, - "mysql_ssl_client_cert=".$Config{ZM_DB_SSL_CLIENT_CERT} + $sslOptions = join(';','', + 'mysql_ssl=1', + 'mysql_ssl_ca_file='.$Config{ZM_DB_SSL_CA_CERT}, + 'mysql_ssl_client_key='.$Config{ZM_DB_SSL_CLIENT_KEY}, + 'mysql_ssl_client_cert='.$Config{ZM_DB_SSL_CLIENT_CERT} ); } - $this->{dbh} = DBI->connect( "DBI:mysql:database=".$Config{ZM_DB_NAME} + $this->{dbh} = DBI->connect( 'DBI:mysql:database='.$Config{ZM_DB_NAME} .$socket.$sslOptions , $Config{ZM_DB_USER} , $Config{ZM_DB_PASS} ); if ( !$this->{dbh} ) { $databaseLevel = NOLOG; - Error( "Unable to write log entries to DB, can't connect to database '" + Error( 'Unable to write log entries to DB, can\'t connect to database ' .$Config{ZM_DB_NAME} - ."' on host '" + .' on host ' .$Config{ZM_DB_HOST} - ."'" ); } else { $this->{dbh}->{AutoCommit} = 1; - Fatal( "Can't set AutoCommit on in database connection" ) + Fatal('Can\'t set AutoCommit on in database connection' ) unless( $this->{dbh}->{AutoCommit} ); $this->{dbh}->{mysql_auto_reconnect} = 1; - Fatal( "Can't set mysql_auto_reconnect on in database connection" ) + Fatal('Can\'t set mysql_auto_reconnect on in database connection' ) unless( $this->{dbh}->{mysql_auto_reconnect} ); $this->{dbh}->trace( 0 ); } @@ -479,7 +479,7 @@ sub databaseLevel { $this->{databaseLevel} = $databaseLevel; } } - return( $this->{databaseLevel} ); + return $this->{databaseLevel}; } sub fileLevel { @@ -487,13 +487,12 @@ sub fileLevel { my $fileLevel = shift; if ( defined($fileLevel) ) { $fileLevel = $this->limit($fileLevel); - if ( $this->{fileLevel} != $fileLevel ) { - $this->closeFile() if ( $this->{fileLevel} > NOLOG ); - $this->{fileLevel} = $fileLevel; - $this->openFile() if ( $this->{fileLevel} > NOLOG ); - } + # The filename might have changed, so always close and re-open + $this->closeFile() if ( $this->{fileLevel} > NOLOG ); + $this->{fileLevel} = $fileLevel; + $this->openFile() if ( $this->{fileLevel} > NOLOG ); } - return( $this->{fileLevel} ); + return $this->{fileLevel}; } sub syslogLevel { @@ -512,7 +511,7 @@ sub syslogLevel { sub openSyslog { my $this = shift; - openlog( $this->{id}, 'pid', "local1" ); + openlog( $this->{id}, 'pid', 'local1' ); } sub closeSyslog { @@ -532,27 +531,25 @@ sub logFile { sub openFile { my $this = shift; - if ( open( $LOGFILE, ">>", $this->{logFile} ) ) { - $LOGFILE->autoflush() if ( $this->{autoFlush} ); + if ( open($LOGFILE, '>>', $this->{logFile}) ) { + $LOGFILE->autoflush() if $this->{autoFlush}; - my $webUid = (getpwnam( $Config{ZM_WEB_USER} ))[2]; - my $webGid = (getgrnam( $Config{ZM_WEB_GROUP} ))[2]; + my $webUid = (getpwnam($Config{ZM_WEB_USER}))[2]; + my $webGid = (getgrnam($Config{ZM_WEB_GROUP}))[2]; if ( $> == 0 ) { chown( $webUid, $webGid, $this->{logFile} ) - or Fatal( "Can't change permissions on log file '" - .$this->{logFile}."': $!" - ) + or Fatal("Can't change permissions on log file $$this{logFile}: $!"); } } else { - $this->fileLevel( NOLOG ); - $this->termLevel( INFO ); - Error( "Can't open log file '".$this->{logFile}."': $!" ); + $this->fileLevel(NOLOG); + $this->termLevel(INFO); + Error("Can't open log file $$this{logFile}: $!"); } } sub closeFile { - my $this = shift; - close( $LOGFILE ) if ( fileno($LOGFILE) ); + #my $this = shift; + close($LOGFILE) if fileno($LOGFILE); } sub logPrint { @@ -568,7 +565,7 @@ sub logPrint { my ($seconds, $microseconds) = gettimeofday(); my $message = sprintf( '%s.%06d %s[%d].%s [%s]' - , strftime( '%x %H:%M:%S' ,localtime( $seconds ) ) + , strftime('%x %H:%M:%S', localtime($seconds)) , $microseconds , $this->{id} , $$ @@ -576,42 +573,43 @@ sub logPrint { , $string ); if ( $this->{trace} ) { - $message = Carp::shortmess( $message ); + $message = Carp::shortmess($message); } else { $message = $message."\n"; } if ( $level <= $this->{syslogLevel} ) { - syslog( $priorities{$level}, $code." [%s]", $string ); + syslog($priorities{$level}, $code.' [%s]', $string); } - print( $LOGFILE $message ) if ( $level <= $this->{fileLevel} ); + print($LOGFILE $message) if $level <= $this->{fileLevel}; if ( $level <= $this->{databaseLevel} ) { - my $sql = 'insert into Logs ( TimeKey, Component, Pid, Level, Code, Message, File, Line ) values ( ?, ?, ?, ?, ?, ?, ?, NULL )'; - $this->{sth} = $this->{dbh}->prepare_cached( $sql ); + 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} ) { $this->{databaseLevel} = NOLOG; - Fatal( "Can't prepare log entry '$sql': ".$this->{dbh}->errstr() ); + 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->{sth}->errstr()); + } } - my $res = $this->{sth}->execute( $seconds+($microseconds/1000000.0) - , $this->{id} - , $$ - , $level - , $code - , $string - , $this->{fileName} - ); - if ( !$res ) { - $this->{databaseLevel} = NOLOG; - Fatal( "Can't execute log entry '$sql': ".$this->{sth}->errstr() ); - } - } - print( STDERR $message ) if ( $level <= $this->{termLevel} ); - } + } # end if doing db logging + print(STDERR $message) if $level <= $this->{termLevel}; + } # end if level < effectivelevel } sub logInit( ;@ ) { my %options = @_ ? @_ : (); $logger = ZoneMinder::Logger->new() if !$logger; - $logger->initialise( %options ); + $logger->initialise(%options); } sub logReinit { @@ -619,14 +617,14 @@ sub logReinit { } sub logTerm { - return unless ( $logger ); + return unless $logger; $logger->terminate(); $logger = undef; } sub logHupHandler { my $savedErrno = $!; - return unless( $logger ); + return unless $logger; fetch()->reinitialise(); logSetSignal(); $! = $savedErrno; @@ -641,88 +639,87 @@ sub logClearSignal { } sub logLevel { - return( fetch()->level( @_ ) ); + return fetch()->level(@_); } sub logDebugging { - return( fetch()->debugOn() ); + return fetch()->debugOn(); } sub logTermLevel { - return( fetch()->termLevel( @_ ) ); + return fetch()->termLevel(@_); } sub logDatabaseLevel { - return( fetch()->databaseLevel( @_ ) ); + return fetch()->databaseLevel(@_); } sub logFileLevel { - return( fetch()->fileLevel( @_ ) ); + return fetch()->fileLevel(@_); } sub logSyslogLevel { - return( fetch()->syslogLevel( @_ ) ); + return fetch()->syslogLevel(@_); } sub Mark { my $level = shift; - $level = DEBUG unless( defined($level) ); + $level = DEBUG unless defined($level); my $tag = 'Mark'; - fetch()->logPrint( $level, $tag ); + fetch()->logPrint($level, $tag); } sub Dump { my $var = shift; my $label = shift; - $label = 'VAR' unless( defined($label) ); - fetch()->logPrint( DEBUG, Data::Dumper->Dump( [ $var ], [ $label ] ) ); + $label = 'VAR' unless defined($label); + fetch()->logPrint(DEBUG, Data::Dumper->Dump([ $var ], [ $label ])); } sub debug { my $log = shift; - $log->logPrint( DEBUG, @_ ); + $log->logPrint(DEBUG, @_); } sub Debug( @ ) { - fetch()->logPrint( DEBUG, @_ ); + fetch()->logPrint(DEBUG, @_); } sub Info( @ ) { - fetch()->logPrint( INFO, @_ ); + fetch()->logPrint(INFO, @_); } sub info { my $log = shift; - $log->logPrint( INFO, @_ ); + $log->logPrint(INFO, @_); } - sub Warning( @ ) { - fetch()->logPrint( WARNING, @_ ); + fetch()->logPrint(WARNING, @_); } sub warn { my $log = shift; - $log->logPrint( WARNING, @_ ); + $log->logPrint(WARNING, @_); } sub Error( @ ) { - fetch()->logPrint( ERROR, @_ ); + fetch()->logPrint(ERROR, @_); } sub error { my $log = shift; - $log->logPrint( ERROR, @_ ); + $log->logPrint(ERROR, @_); } sub Fatal( @ ) { - fetch()->logPrint( FATAL, @_ ); + fetch()->logPrint(FATAL, @_); if ( $SIG{TERM} ne 'DEFAULT' ) { $SIG{TERM}(); } - exit( -1 ); + exit(-1); } sub Panic( @ ) { - fetch()->logPrint( PANIC, @_ ); - confess( $_[0] ); + fetch()->logPrint(PANIC, @_); + confess($_[0]); } 1; @@ -741,10 +738,10 @@ logInit( 'myproc', DEBUG ); Debug( 'This is what is happening' ); Info( 'Something interesting is happening' ); -Warning( "Something might be going wrong." ); -Error( "Something has gone wrong!!" ); -Fatal( "Something has gone badly wrong, gotta stop!!" ); -Panic( "Something fundamental has gone wrong, die with stack trace ); +Warning( 'Something might be going wrong.' ); +Error( 'Something has gone wrong!!' ); +Fatal( 'Something has gone badly wrong, gotta stop!!' ); +Panic( 'Something fundamental has gone wrong, die with stack trace' ); =head1 DESCRIPTION