ljr/livejournal/bin/ljmaint.pl

140 lines
3.1 KiB
Perl
Executable File

#!/usr/bin/perl
#
# <LJDEP>
# lib: Fcntl::, cgi-bin/ljlib.pl
# file: bin/maint/taskinfo.txt, bin/maint/taskinfo-local.txt
# </LJDEP>
use strict;
use vars qw(%maint %maintinfo $VERBOSE);
unless (-d $ENV{'LJHOME'}) {
die "\$LJHOME not set.\n";
}
require "$ENV{'LJHOME'}/cgi-bin/ljlib.pl";
my $MAINT = "$LJ::HOME/bin/maint";
load_tasks();
$VERBOSE = 1; # 0=quiet, 1=normal, 2=verbose
if (@ARGV)
{
## check the correctness of the taskinfo files
if ($ARGV[0] eq "--check") {
foreach my $task (keys %maintinfo)
{
my %loaded;
my $source = $maintinfo{$task}->{'source'};
unless (-e "$MAINT/$source") {
print "$task references missing file $source\n";
next;
}
unless ($loaded{$source}++) {
require "$MAINT/$source";
}
unless (ref $maint{$task} eq "CODE") {
print "$task is missing code in $source\n";
}
}
exit 0;
}
if ($ARGV[0] =~ /^-v(.?)/) {
if ($1 eq "") { $VERBOSE = 2; }
else { $VERBOSE = $1; }
shift @ARGV;
}
my @targv;
my $hit_colon = 0;
foreach my $arg (@ARGV)
{
if ($arg eq ';') {
$hit_colon = 1;
run_task(@targv);
@targv = ();
next;
}
push @targv, $arg;
}
if ($hit_colon) {
# new behavior: task1 arg1 arg2 ; task2 arg arg2
run_task(@targv);
} else {
# old behavior: task1 task2 task3 (no args, ever)
foreach my $task (@targv) {
run_task($task);
}
}
}
else
{
print "Available tasks: \n";
foreach (sort keys %maintinfo) {
print " $_ - $maintinfo{$_}->{'des'}\n";
}
}
sub run_task
{
my $task = shift;
return unless ($task);
my @args = @_;
print "Running task '$task':\n\n" if ($VERBOSE >= 1);
unless ($maintinfo{$task}) {
print "Unknown task '$task'\n";
return;
}
$LJ::LJMAINT_VERBOSE = $VERBOSE;
require "$MAINT/$maintinfo{$task}->{'source'}";
my $opts = $maintinfo{$task}{opts} || {};
my $lock = undef;
my $lockname = "mainttask-$task";
if ($opts->{'locking'} eq "per_host") {
$lockname .= "-$LJ::SERVER_NAME";
}
unless ($opts->{no_locking} ||
($lock = LJ::locker()->trylock($lockname))
) {
print "Task '$task' already running ($DDLockClient::Error). Quitting.\n" if $VERBOSE >= 1;
exit 0;
}
eval {
$maint{$task}->(@args);
};
if ( $@ ) {
print STDERR "ERROR> task $task died: $@\n\n";
}
}
sub load_tasks
{
foreach my $filename (qw(taskinfo.txt taskinfo-local.txt))
{
my $file = "$MAINT/$filename";
open (F, $file) or next;
my $source;
while (my $l = <F>) {
next if ($l =~ /^\#/);
if ($l =~ /^(\S+):\s*/) {
$source = $1;
next;
}
if ($l =~ /^\s*(\w+)\s*-\s*(.+?)\s*$/) {
$maintinfo{$1}->{'des'} = $2;
$maintinfo{$1}->{'source'} = $source;
}
}
close (F);
}
}