ljr/livejournal/bin/checkconfig.pl

196 lines
6.9 KiB
Perl
Executable File

#!/usr/bin/perl
#
my @errors;
my $err = sub {
return unless @_;
die "Problem:\n" . join('', map { " * $_\n" } @_);
};
my %dochecks; # these are the ones we'll actually do
my @checks = ( # put these in the order they should be checked in
"modules",
"env",
"database"
);
foreach my $check (@checks) { $dochecks{$check} = 1; }
my $only = 0;
arg: foreach my $arg (@ARGV) {
($w, $c) = ($arg =~ /^-(no|only)(.*)/) or die "unknown option $arg";
die "only one '-onlyfoo' option may be specified" if $w eq "only" and $only++;
foreach my $check (@checks) {
if ($check eq $c) {
if ($w eq "only") { %dochecks = ( $check => 1 ); }
else { $dochecks{$check} = 0 }
next arg;
}
}
die "unknown check '$c' (known checks: " . join(", ", @checks) . ")\n";
}
my %modules = (
"DBI" => { 'deb' => 'libdbi-perl', },
"DBD::mysql" => { 'deb' => 'libdbd-mysql-perl', },
"Digest::MD5" => { 'deb' => 'libdigest-md5-perl', },
"Digest::SHA1" => { 'deb' => 'libdigest-sha1-perl', },
"Image::Size" => { 'deb' => 'libimage-size-perl', },
"MIME::Lite" => { 'deb' => 'libmime-lite-perl', },
"MIME::Words" => { 'deb' => 'libmime-perl', },
"Compress::Zlib" => { 'deb' => 'libcompress-zlib-perl', },
"Net::SMTP" => {
'deb' => 'libnet-perl',
'opt' => "Alternative to piping into sendmail to send mail.",
},
"Net::DNS" => {
'deb' => 'libnet-dns-perl',
},
"MIME::Base64" => { 'deb' => 'libmime-base64-perl' },
"URI::URL" => { 'deb' => 'liburi-perl' },
"HTML::Tagset" => { 'deb' => 'libhtml-tagset-perl' },
"HTML::Parser" => { 'deb' => 'libhtml-parser-perl', },
"LWP::Simple" => { 'deb' => 'libwww-perl', },
"LWP::UserAgent" => { 'deb' => 'libwww-perl', },
"GD" => { 'deb' => 'libgd-perl' },
"GD::Graph" => {
'deb' => 'libgd-graph-perl',
'opt' => 'Required to make graphs for the statistics page.',
},
"Mail::Address" => { 'deb' => 'libmailtools-perl', },
"Proc::ProcessTable" => {
'deb' => 'libproc-process-perl',
'opt' => "Better reliability for starting daemons necessary for high-traffic installations.",
},
"RPC::XML" => {
'deb' => 'librpc-xml-perl',
'opt' => 'Required for outgoing XMLRPC support',
},
"SOAP::Lite" => {
'deb' => 'libsoap-lite-perl',
'opt' => 'Required for XML-RPC support.',
},
"Unicode::MapUTF8" => { 'deb' => 'libunicode-maputf8-perl', },
"Storable" => {
'deb' => 'libstorable-perl',
},
"XML::RSS" => {
'deb' => 'libxml-rss-perl',
'opt' => 'Required for retrieving RSS off of other sites (syndication).',
},
"XML::Simple" => {
'deb' => 'libxml-simple-perl',
'ver' => 2.12,
},
"String::CRC32" => {
'deb' => 'libstring-crc32-perl',
'opt' => 'Required for palette-altering of PNG files. Only necessary if you plan to make your own S2 styles that use PNGs, not GIFs.',
},
"Time::HiRes" => { 'deb' => 'libtime-hires-perl' },
"IO::WrapTie" => { 'deb' => 'libio-stringy-perl' },
"XML::Atom" => {
'deb' => 'libxml-atom-perl',
'opt' => 'Required for AtomAPI support.',
},
"Math::BigInt::GMP" => {
'opt' => 'Aides Crypt::DH so it isn\'t crazy slow.',
},
"URI::Fetch" => {
'opt' => 'Required for OpenID support.',
},
"Crypt::DH" => {
'opt' => 'Required for OpenID support.',
},
);
sub check_modules {
print "[Checking for Perl Modules....]\n";
my @debs;
foreach my $mod (sort keys %modules) {
my $rv = eval "use $mod;";
if ($@) {
my $dt = $modules{$mod};
if ($dt->{'opt'}) {
print STDERR "Missing optional module $mod: $dt->{'opt'}\n";
} else {
push @errors, "Missing perl module: $mod";
}
push @debs, $dt->{'deb'} if $dt->{'deb'};
next;
}
my $ver_want = $modules{$mod}{ver};
my $ver_got = $mod->VERSION;
if ($ver_want && $ver_got && $ver_got < $ver_want) {
push @errors, "Out of date module: $mod (need $ver_want, $ver_got installed)";
}
}
if (@debs && -e '/etc/debian_version') {
print STDERR "\n# apt-get install ", join(' ', @debs), "\n\n";
}
$err->(@errors);
}
sub check_env {
print "[Checking LJ Environment...]\n";
$err->("\$LJHOME environment variable not set.")
unless $ENV{'LJHOME'};
$err->("\$LJHOME directory doesn't exist ($ENV{'LJHOME'})")
unless -d $ENV{'LJHOME'};
# before ljconfig.pl is called, we want to call the site-local checkconfig,
# otherwise ljconfig.pl might load ljconfig-local.pl, which maybe load
# new modules to implement site-specific hooks.
my $local_config = "$ENV{'LJHOME'}/bin/checkconfig-local.pl";
if (-e $local_config) {
my $good = eval { require $local_config; };
exit 1 unless $good;
}
$err->("No ljconfig.pl file found at $ENV{'LJHOME'}/cgi-bin/ljconfig.pl")
unless -e "$ENV{'LJHOME'}/cgi-bin/ljconfig.pl";
eval { require "$ENV{'LJHOME'}/cgi-bin/ljlib.pl"; };
$err->("Failed to load ljlib.pl: $@") if $@;
# if SMTP_SERVER is set, then Net::SMTP is required, not optional.
if ($LJ::SMTP_SERVER && ! defined $Net::SMTP::VERSION) {
$err->("Net::SMTP isn't available, and you have \$LJ::SMTP_SERVER set.");
}
}
sub check_database {
print "[Checking Database...]\n";
require "$ENV{'LJHOME'}/cgi-bin/ljlib.pl";
my $dbh = LJ::get_dbh("master");
unless ($dbh) {
$err->("Couldn't get master database handle.");
}
foreach my $c (@LJ::CLUSTERS) {
my $dbc = LJ::get_cluster_master($c);
next if $dbc;
$err->("Couldn't get db handle for cluster \#$c");
}
if (%LJ::MOGILEFS_CONFIG && $LJ::MOGILEFS_CONFIG{hosts}) {
print "[Checking MogileFS client.]\n";
my $mog = LJ::mogclient();
die "Couldn't create mogilefs client." unless $mog;
}
}
foreach my $check (@checks) {
next unless $dochecks{$check};
my $cn = "check_".$check;
&$cn;
}
print "All good.\n";
print "NOTE: checkconfig.pl doesn't check everything yet\n";