mourningdove/cgi-bin/LJ/Config.pm

145 lines
4 KiB
Perl
Raw Normal View History

2026-05-24 01:03:05 +00:00
# This code was forked from the LiveJournal project owned and operated
# by Live Journal, Inc. The code has been modified and expanded by
# Dreamwidth Studios, LLC. These files were originally licensed under
# the terms of the license supplied by Live Journal, Inc, which can
# currently be found at:
#
# http://code.livejournal.org/trac/livejournal/browser/trunk/LICENSE-LiveJournal.txt
#
# In accordance with the original license, this code and all its
# modifications are provided under the GNU General Public License.
# A copy of that license can be found in the LICENSE file included as
# part of this distribution.
#
# this is a module to handle the configuration of a LJ server
package LJ::Config;
use strict;
use warnings;
use LJ::Directories;
$LJ::HOME ||= $ENV{LJHOME};
$LJ::CONFIG_LOADED = 0;
$LJ::CACHE_CONFIG_MODTIME = 0;
# what files to check for config, ORDER MATTERS, please go from most specific
# to least specific. files later in the chain should be careful to not clobber
# anything.
@LJ::CONFIG_FILES = $LJ::_T_CONFIG
? (
(
map { LJ::resolve_file($_) }
qw(
t/config-test-private.pl
t/config-test.pl
)
),
(
map { $LJ::HOME . "/" . $_ }
qw(
cgi-bin/LJ/Global/Defaults.pm
)
)
)
: (
(
map { LJ::resolve_file($_) }
qw(
etc/config-private.pl
etc/config-local.pl
etc/config.pl
)
),
(
map { $LJ::HOME . "/" . $_ }
qw(
cgi-bin/LJ/Global/Defaults.pm
)
)
);
# loads all configurations from scratch
sub load {
my $class = shift;
my %opts = @_;
return if !$opts{force} && $LJ::CONFIG_LOADED;
__PACKAGE__->load_config;
$LJ::CONFIG_LOADED = 1;
}
sub reload {
__PACKAGE__->load( force => 1 );
eval {
# these need to be loaded after ljconfig
#
$LJ::DBIRole->set_sources( \%LJ::DBINFO );
LJ::MemCache::reload_conf();
};
warn "Errors reloading config: $@" if $@;
}
# load configuration files
sub load_config {
foreach my $fn (@LJ::CONFIG_FILES) {
do $fn
if -e $fn;
}
$LJ::CACHE_CONFIG_MODTIME_LASTCHECK = time();
}
# handle reloading at the start of a new web request
sub start_request_reload {
# check the modtime of etc/config.pl and reload if necessary
# only do a stat every 10 seconds and then only reload
# if the file has changed
my $now = time();
if ( $now - $LJ::CACHE_CONFIG_MODTIME_LASTCHECK > 10 ) {
my $modtime;
foreach my $fn (@LJ::CONFIG_FILES) {
next unless -e $fn;
my $cmodtime = ( stat($fn) )[9];
$modtime = $cmodtime
if !defined $modtime || $modtime < $cmodtime;
}
if ( !$LJ::CACHE_CONFIG_MODTIME || $modtime > $LJ::CACHE_CONFIG_MODTIME ) {
# reload config and update cached modtime
$LJ::CACHE_CONFIG_MODTIME = $modtime;
__PACKAGE__->reload;
$LJ::DEBUG_HOOK{'pre_save_bak_stats'}->() if $LJ::DEBUG_HOOK{'pre_save_bak_stats'};
# save a backup of the original config value
%LJ::_ORIG_CONFIG = ();
$LJ::_ORIG_CONFIG{$_} = ${ $LJ::{$_} }
foreach qw(IMGPREFIX JSPREFIX STATPREFIX WSTATPREFIX USERPIC_ROOT SITEROOT);
$LJ::LOCKER_OBJ = undef;
if ( $modtime > $now - 60 ) {
# show to stderr current reloads. won't show
# reloads happening from new apache children
# forking off the parent who got the inital config loaded
# hours/days ago and then the "updated" config which is
# a different hours/days ago.
#
# only print when we're in web-context
print STDERR "[$$] Configuration file(s) reloaded.\n"
if eval { BML::get_request() };
}
}
$LJ::CACHE_CONFIG_MODTIME_LASTCHECK = $now;
}
}
1;