From 016fda22ce865df9fc36d56dc1b0256daa5e68b7 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 1 Mar 2019 12:31:41 -0500 Subject: [PATCH] reduce duplicated db code from Config. Use fully namespace'd variables so we can use require instead of use --- .../ZoneMinder/lib/ZoneMinder/Config.pm.in | 93 ++++++++----------- .../lib/ZoneMinder/ConfigData.pm.in | 2 +- scripts/ZoneMinder/lib/ZoneMinder/Database.pm | 23 ++--- scripts/ZoneMinder/lib/ZoneMinder/Logger.pm | 30 +++--- 4 files changed, 65 insertions(+), 83 deletions(-) diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Config.pm.in b/scripts/ZoneMinder/lib/ZoneMinder/Config.pm.in index 3fdeb722c..10e4b4733 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/Config.pm.in +++ b/scripts/ZoneMinder/lib/ZoneMinder/Config.pm.in @@ -30,6 +30,7 @@ use warnings; require Exporter; require ZoneMinder::Base; + use ZoneMinder::ConfigData qw(:all); our @ISA = qw(Exporter ZoneMinder::Base); @@ -57,20 +58,22 @@ our %EXPORT_TAGS = ( push( @{$EXPORT_TAGS{config}}, @EXPORT_CONFIG ); 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(); our $VERSION = $ZoneMinder::Base::VERSION; -use constant ZM_PID => "@ZM_PID@"; # Path to the ZoneMinder run pid file -use constant ZM_CONFIG => "@ZM_CONFIG@"; # Path to the ZoneMinder config file -use constant ZM_CONFIG_SUBDIR => "@ZM_CONFIG_SUBDIR@"; # Path to the ZoneMinder config subfolder +use constant ZM_PID => '@ZM_PID@'; # Path to the ZoneMinder run pid file +use constant ZM_CONFIG => '@ZM_CONFIG@'; # Path to the ZoneMinder config file +use constant ZM_CONFIG_SUBDIR => '@ZM_CONFIG_SUBDIR@'; # Path to the ZoneMinder config subfolder use Carp; +require ZoneMinder::Database; # Load the config from the database into the symbol table BEGIN { +require ZoneMinder::Database; # Process name, value pairs from the main config file first my $config_file = ZM_CONFIG; @@ -78,52 +81,25 @@ BEGIN { # Search for user created config files. If one or more are found then # update the Config hash with those values - if ( -d ZM_CONFIG_SUBDIR ) { + if ( ZM_CONFIG_SUBDIR and -d ZM_CONFIG_SUBDIR ) { if ( -R ZM_CONFIG_SUBDIR ) { - foreach my $filename ( glob ZM_CONFIG_SUBDIR."/*.conf" ) { + foreach my $filename ( glob ZM_CONFIG_SUBDIR.'/*.conf' ) { process_configfile($filename); } } else { - print( STDERR "WARNING: ZoneMinder configuration subfolder found but is not readable. Check folder permissions on ".ZM_CONFIG_SUBDIR.".\n" ); + print( STDERR 'WARNING: ZoneMinder configuration subfolder found but is not readable. Check folder permissions on '.ZM_CONFIG_SUBDIR.".\n" ); } } - use DBI; - my $socket; - my ( $host, $portOrSocket ) = ( $Config{ZM_DB_HOST} =~ /^([^:]+)(?::(.+))?$/ ); - - if ( defined($portOrSocket) ) { - if ( $portOrSocket =~ /^\// ) { - $socket = ';mysql_socket='.$portOrSocket; - } else { - $socket = ';host='.$host.';port='.$portOrSocket; - } - } else { - $socket = ';host='.$Config{ZM_DB_HOST}; - } - 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} - ); - } - my $dbh = DBI->connect( "DBI:mysql:database=".$Config{ZM_DB_NAME} - .$socket.$sslOptions - , $Config{ZM_DB_USER} - , $Config{ZM_DB_PASS} - ) or croak( "Can't connect to db" ); + my $dbh = ZoneMinder::Database::zmDbConnect(); my $sql = 'SELECT Name,Value FROM Config'; - my $sth = $dbh->prepare_cached( $sql ) or croak( "Can't prepare '$sql': ".$dbh->errstr() ); - my $res = $sth->execute() or croak( "Can't execute: ".$sth->errstr() ); + my $sth = $dbh->prepare_cached($sql) or croak("Can't prepare '$sql': ".$dbh->errstr()); + my $res = $sth->execute() or croak("Can't execute: ".$sth->errstr()); while( my $config = $sth->fetchrow_hashref() ) { $Config{$config->{Name}} = $config->{Value}; } $sth->finish(); -#$dbh->disconnect(); - # + if ( ! $Config{ZM_SERVER_ID} ) { $Config{ZM_SERVER_ID} = undef; $sth = $dbh->prepare_cached( 'SELECT * FROM Servers WHERE Name=?' ); @@ -143,25 +119,30 @@ BEGIN { sub process_configfile { my $config_file = shift; - if ( -R $config_file ) { - open( my $CONFIG, '<', $config_file ) - or croak( "Can't open config file '$config_file': $!" ); - foreach my $str ( <$CONFIG> ) { - next if ( $str =~ /^\s*$/ ); - next if ( $str =~ /^\s*#/ ); - my ( $name, $value ) = $str =~ /^\s*([^=\s]+)\s*=\s*[\'"]*(.*?)[\'"]*\s*$/; - if ( ! $name ) { - print( STDERR "Warning, bad line in $config_file: $str\n" ); - next; - } # end if - $name =~ tr/a-z/A-Z/; - $Config{$name} = $value; - } - close( $CONFIG ); - } else { - print( STDERR "WARNING: ZoneMinder configuration file found but is not readable. Check file permissions on $config_file\n" ); + if ( ! -R $config_file ) { + print(STDERR "WARNING: ZoneMinder configuration file found but is not readable. Check file permissions on $config_file\n"); + return; } - } + open( my $CONFIG, '<', $config_file ) + or croak("Can't open config file '$config_file': $!"); + foreach my $str ( <$CONFIG> ) { + next if ( $str =~ /^\s*$/ ); + next if ( $str =~ /^\s*#/ ); + my ( $name, $value ) = $str =~ /^\s*([^=\s]+)\s*=\s*[\'"]*(.*?)[\'"]*\s*$/; + if ( !$name ) { + print(STDERR "Warning, bad line in $config_file: $str\n"); + next; + } # end if + $name =~ tr/a-z/A-Z/; + #if ( !$ZoneMinder::ConfigData::options_hash{$name} ) { + #print(STDERR "Warning, unknown config option name $name in $config_file\n"); +#} else { + #print(STDERR "Warning, known config option name $name in $config_file\n"); + #} + $Config{$name} = $value; + } # end foreach config line + close($CONFIG); + } # end sub process_configfile } # end BEGIN diff --git a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in index cd53d6754..c6ec697f1 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in +++ b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in @@ -3952,7 +3952,7 @@ our %options_hash = map { ( $_->{name}, $_ ) } @options; # This function should never need to be called explicitly, except if # this module is 'require'd rather than 'use'd. See zmconfgen.pl. sub initialiseConfig { - return if ( $configInitialised ); + return if $configInitialised; # Do some initial data munging to finish the data structures # Create option ids diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Database.pm b/scripts/ZoneMinder/lib/ZoneMinder/Database.pm index 173c0033c..5c6617510 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/Database.pm +++ b/scripts/ZoneMinder/lib/ZoneMinder/Database.pm @@ -65,7 +65,8 @@ our $VERSION = $ZoneMinder::Base::VERSION; # ========================================================================== use ZoneMinder::Logger qw(:all); -use ZoneMinder::Config qw(:all); + +require ZoneMinder::Config; our $dbh = undef; @@ -87,25 +88,25 @@ sub zmDbConnect { $socket = ';host='.$host.';port='.$portOrSocket; } } else { - $socket = ';host='.$Config{ZM_DB_HOST}; + $socket = ';host='.$ZoneMinder::Config::Config{ZM_DB_HOST}; } my $sslOptions = ''; - if ( $Config{ZM_DB_SSL_CA_CERT} ) { - $sslOptions = join(';','', + if ( $ZoneMinder::Config::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} + 'mysql_ssl_ca_file='.$ZoneMinder::Config::Config{ZM_DB_SSL_CA_CERT}, + 'mysql_ssl_client_key='.$ZoneMinder::Config::Config{ZM_DB_SSL_CLIENT_KEY}, + 'mysql_ssl_client_cert='.$ZoneMinder::Config::Config{ZM_DB_SSL_CLIENT_CERT} ); } eval { $dbh = DBI->connect( - 'DBI:mysql:database='.$Config{ZM_DB_NAME} + 'DBI:mysql:database='.$ZoneMinder::Config::Config{ZM_DB_NAME} .$socket . $sslOptions . ($options?join(';', '', map { $_.'='.$$options{$_} } keys %{$options} ) : '') - , $Config{ZM_DB_USER} - , $Config{ZM_DB_PASS} + , $ZoneMinder::Config::Config{ZM_DB_USER} + , $ZoneMinder::Config::Config{ZM_DB_PASS} ); }; if ( !$dbh or $@ ) { @@ -124,7 +125,7 @@ sub zmDbConnect { } # end sub zmDbConnect sub zmDbDisconnect { - if ( defined( $dbh ) ) { + if ( defined($dbh) ) { $dbh->disconnect() or Error('Error disconnecting db? ' . $dbh->errstr()); $dbh = undef; } diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Logger.pm b/scripts/ZoneMinder/lib/ZoneMinder/Logger.pm index 8d18ade09..117f2a1ab 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/Logger.pm +++ b/scripts/ZoneMinder/lib/ZoneMinder/Logger.pm @@ -87,7 +87,7 @@ our $VERSION = $ZoneMinder::Base::VERSION; # # ========================================================================== -use ZoneMinder::Config qw(:all); +require ZoneMinder::Config; use DBI; use Carp; @@ -156,7 +156,7 @@ sub new { $this->{autoFlush} = 1; ( $this->{fileName} = $0 ) =~ s|^.*/||; - $this->{logPath} = $Config{ZM_PATH_LOGS}; + $this->{logPath} = $ZoneMinder::Config::Config{ZM_PATH_LOGS}; $this->{logFile} = $this->{logPath}.'/'.$this->{id}.'.log'; ($this->{logFile}) = $this->{logFile} =~ /^([\w\.\/]+)$/; @@ -169,7 +169,7 @@ sub new { sub BEGIN { # Fake the config variables that are used in case they are not defined yet # Only really necessary to support upgrade from previous version - if ( !eval('defined($Config{ZM_LOG_DEBUG})') ) { + if ( !eval('defined($ZoneMinder::Config::Config{ZM_LOG_DEBUG})') ) { no strict 'subs'; no strict 'refs'; my %dbgConfig = ( @@ -221,17 +221,17 @@ sub initialise( @ ) { if ( defined($options{databaseLevel}) ) { $tempDatabaseLevel = $options{databaseLevel}; } else { - $tempDatabaseLevel = $Config{ZM_LOG_LEVEL_DATABASE}; + $tempDatabaseLevel = $ZoneMinder::Config::Config{ZM_LOG_LEVEL_DATABASE}; } if ( defined($options{fileLevel}) ) { $tempFileLevel = $options{fileLevel}; } else { - $tempFileLevel = $Config{ZM_LOG_LEVEL_FILE}; + $tempFileLevel = $ZoneMinder::Config::Config{ZM_LOG_LEVEL_FILE}; } if ( defined($options{syslogLevel}) ) { $tempSyslogLevel = $options{syslogLevel}; } else { - $tempSyslogLevel = $Config{ZM_LOG_LEVEL_SYSLOG}; + $tempSyslogLevel = $ZoneMinder::Config::Config{ZM_LOG_LEVEL_SYSLOG}; } if ( defined($ENV{LOG_PRINT}) ) { @@ -245,19 +245,19 @@ sub initialise( @ ) { $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} ) { + if ( $ZoneMinder::Config::Config{ZM_LOG_DEBUG} ) { # 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}) : '' ) { + foreach my $target ( $ZoneMinder::Config::Config{ZM_LOG_DEBUG_TARGET} ? split(/\|/, $ZoneMinder::Config::Config{ZM_LOG_DEBUG_TARGET}) : '' ) { if ( $target eq $this->{id} || $target eq '_'.$this->{id} || $target eq $this->{idRoot} || $target eq '_'.$this->{idRoot} || $target eq '' ) { - if ( $Config{ZM_LOG_DEBUG_LEVEL} > NOLOG ) { - $tempLevel = $this->limit( $Config{ZM_LOG_DEBUG_LEVEL} ); - if ( $Config{ZM_LOG_DEBUG_FILE} ne '' ) { - $tempLogFile = $Config{ZM_LOG_DEBUG_FILE}; + if ( $ZoneMinder::Config::Config{ZM_LOG_DEBUG_LEVEL} > NOLOG ) { + $tempLevel = $this->limit( $ZoneMinder::Config::Config{ZM_LOG_DEBUG_LEVEL} ); + if ( $ZoneMinder::Config::Config{ZM_LOG_DEBUG_FILE} ne '' ) { + $tempLogFile = $ZoneMinder::Config::Config{ZM_LOG_DEBUG_FILE}; $tempFileLevel = $tempLevel; } } @@ -501,8 +501,8 @@ sub openFile { 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($ZoneMinder::Config::Config{ZM_WEB_USER}))[2]; + my $webGid = (getgrnam($ZoneMinder::Config::Config{ZM_WEB_GROUP}))[2]; if ( $> == 0 ) { chown( $webUid, $webGid, $this->{logFile} ) or Fatal("Can't change permissions on log file $$this{logFile}: $!"); @@ -577,7 +577,7 @@ sub logPrint { my $res = $this->{sth}->execute( $seconds+($microseconds/1000000.0), $this->{id}, - ($Config{ZM_SERVER_ID} ? $Config{ZM_SERVER_ID} : undef), + ($ZoneMinder::Config::Config{ZM_SERVER_ID} ? $ZoneMinder::Config::Config{ZM_SERVER_ID} : undef), $$, $level, $codes{$level},