144 lines
4 KiB
Perl
144 lines
4 KiB
Perl
# 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;
|