-#!/usr/bin/perl -w
+#!/usr/bin/perl -w
# cleanup for F*EX service
#
use Digest::MD5 'md5_hex';
use constant DS => 60*60*24;
-
+
# do not run as CGI!
exit if $ENV{SCRIPT_NAME};
# use fex.ph for site configuration!
our ($FEXHOME);
-our ($spooldir,$logdir,$docdir);
+our ($spooldir,@logdir,$docdir);
our ($akeydir,$ukeydir,$dkeydir,$skeydir,$gkeydir,$xkeydir,$lockdir);
our ($durl,$debug,$autodelete,$hostname,$admin,$admin_pw,$bcc);
$keep_default = 5;
# load common code, local config : $HOME/lib/fex.ph
require "$FEXLIB/fex.pp" or die "$0: cannot load $FEXLIB/fex.pp - $!\n";
-# localized functions
+my $logdir = $logdir[0];
+
+# localized functions
# (needed for reminder and account reactivation e-mails)
foreach my $lf (glob "$FEXHOME/locale/*/lib/lf.pl") { require $lf }
$isodate = isodate($today);
chdir $spooldir or die "$0: $spooldir - $!\n";
-open L,">>$logdir/cleanup.log";
+# open L,">>$logdir/cleanup.log";
# clean up regular spool
opendir $spooldir,'.' or die "$0: $spooldir - $!\n";
while ($to = readdir $spooldir) {
- next if $to !~ /@/ or -l $to;
- if (@demo and -f "$to/.demo" and time > mtime("$to/.demo")+$demo[1]*DS) {
+ next if $to =~ /^\./;
+ next if $to !~ /@/ or $_ = readlink($to) and not /\//;
+ next unless -d $to;
+ if (@demo and -f "$to/.demo" and time > lmtime("$to/.demo")+$demo[1]*DS) {
logdel($to,"demo user $to deleted");
next;
}
- if (-d $to and $to !~ /^\./) {
- unless (opendir TO,$to) {
- warn "$0: $spooldir/$to - $!\n";
- next;
- }
- while ($from = readdir TO) {
- next if $from !~ /@/;
- if ($from eq '@GROUP') {
- foreach $group (glob "$to/$from/*") {
- if (readlink $group and not -f $group) {
- logdel($group,"$group deleted (master has gone)");
- }
+ unless (opendir TO,$to) {
+ warn "$0: $spooldir/$to - $!\n";
+ next;
+ }
+ while ($from = readdir TO) {
+ next if $from !~ /@/;
+ if ($from eq '@GROUP') {
+ foreach $group (glob "$to/$from/*") {
+ if (readlink $group and not -f $group) {
+ logdel($group,"$group deleted (master has gone)");
}
- } else {
- if (-d "$to/$from" and $from !~ /^\./) {
- unless (opendir FROM,"$to/$from") {
- warn "$0: $spooldir/$to/$from - $!\n";
- next;
- }
- while ($file = readdir FROM) {
- next if $file eq '.' or $file eq '..';
- if (-d "$to/$from/$file" and $file !~ /^\./) {
- cleanup($to,$from,$file);
- rmdir "$to/$from/$file" unless $opt_d;
- }
+ }
+ } else {
+ if (-d "$to/$from" and $from !~ /^\./) {
+ unless (opendir FROM,"$to/$from") {
+ warn "$0: $spooldir/$to/$from - $!\n";
+ next;
+ }
+ while ($file = readdir FROM) {
+ next if $file eq '.' or $file eq '..';
+ if (-d "$to/$from/$file" and $file !~ /^\./) {
+ cleanup($to,$from,$file);
+ rmdir "$to/$from/$file" unless $opt_d;
}
- closedir FROM;
- rmdir "$to/$from" unless $opt_d;
}
+ closedir FROM;
+ rmdir "$to/$from" unless $opt_d;
}
}
- closedir TO;
- unless (-f "$to/\@PERSISTENT" or $to eq $admin) {
- @glob = glob "$to/*/* $to/\@MAINUSER/* $to/\@GROUP/*";
- unless (@glob or -f "$to/\@") {
- logdel($to,"$to deleted");
- }
- $user = $to;
- if ($login_check and -l "$user/.login") {
- my $lc = &$login_check(readlink("$user/.login"));
- if ($lc) {
- if (-f "$user/\@~" and not "$user/@") {
- rename "$user/\@~","$user/@" unless $opt_d;
- logv("$isodate $user reanimated (login_check)");
- }
- } else {
- rename "$user/@","$user/\@~" unless $opt_d;
- logv("$user deactivated (login_check)");
+ }
+ closedir TO;
+ unless (-f "$to/\@PERSISTENT" or $to eq $admin) {
+ @glob = glob "$to/*/* $to/\@MAINUSER/* $to/\@GROUP/*";
+ unless (@glob or -f "$to/\@") {
+ logdel($to,"$to deleted");
+ }
+ $user = $to;
+ if ($login_check and -l "$user/.login") {
+ my $lc = &$login_check(readlink("$user/.login"));
+ if ($lc) {
+ if (-f "$user/\@~" and not "$user/@") {
+ rename "$user/\@~","$user/@" unless $opt_d;
+ logv("$user reanimated (login_check)");
}
+ } else {
+ rename "$user/@","$user/\@~" unless $opt_d;
+ logv("$user deactivated (login_check)");
}
}
}
# clean up download key lookup directory
if (chdir $dkeydir and opendir D,'.') {
while ($file = readdir D) {
- if ($link = readlink $file and
+ if ($link = readlink $file and
(not -l "$link/dkey" or readlink "$link/dkey" ne $file)) {
logdel($file,".dkeys/$file deleted");
}
while ($file = readdir D) {
next if $file eq '.' or $file eq '..';
if (($link = readlink $file and not -e "$link/upload"
- or -f $file and time > mtime($file)+DS)) {
+ or -f $file and time > lmtime($file)+DS)) {
logdel($file,".ukeys/$file deleted");
}
}
# clean up authorization key lookup directory
if (chdir $akeydir and opendir D,'.') {
while ($file = readdir D) {
- if (-l $file and time > mtime($file)+DS) {
+ if (-l $file and time > (lmtime($file)||0)+DS) {
logdel($file,".akeys/$file deleted");
}
}
# clean up lock directory
if (chdir $lockdir and opendir D,'.') {
while ($file = readdir D) {
- if (-f $file and time > mtime($file)+DS) {
+ if (-f $file and time > lmtime($file)+DS) {
logdel($file,".locks/$file deleted");
}
}
if (chdir "$spooldir/.error" and opendir D,'.') {
while ($file = readdir D) {
if (-f $file) {
- $mtime = mtime($file);
+ $mtime = lmtime($file);
if ($mtime and $today > 10*$keep_default*DS+$mtime) {
if ($opt_d) { print "unlink .error/$file\n" }
else { logdel($file,".error/$file deleted") }
}
# clean up debug directory
-if (chdir "$logdir/.debug" and opendir D,'.') {
+if (chdir "$spooldir/.debug" and opendir D,'.') {
while ($file = readdir D) {
if (-f $file) {
- $mtime = mtime($file);
+ $mtime = lmtime($file);
if ($mtime and $today > $keep_default*DS+$mtime) {
# logdel($file,".debug/$file deleted");
if ($opt_d) { print "unlink .debug/$file\n" }
# clean up old OKEYs
chdir $spooldir;
foreach my $okey (glob '*/@OKEY/*') {
- if (time > mtime($okey)+30*DS) {
+ if (time > lmtime($okey)+30*DS) {
logdel($okey,"$okey deleted");
}
}
if (chdir "$spooldir/.reg" and opendir D,'.') {
while ($file = readdir D) {
if (-f $file) {
- $mtime = mtime($file);
+ $mtime = lmtime($file);
if ($mtime and $today > $mtime+DS) {
logdel($file,".reg/$file deleted");
}
closedir D;
}
-# send account expiration warning
+# send account expiration warning
if ($account_expire and $account_expire =~ /^(\d+)/) {
my $expire = $1;
if (chdir $spooldir) {
next if $user =~ /^(fexmaster|fexmail)/ or $user eq $admin;
next if -l "$user/.login";
- if (time > mtime($user)+$expire*DS) {
+ if (time > lmtime($user)+$expire*DS) {
# print "$spooldir/$user\n";
- my $locale = readlink "$user/\@LOCALE";
+ local $locale = readlink "$user/\@LOCALE";
$locale = 'english' unless $locale and $reactivation{$locale};
&{$reactivation{$locale}}($expire,$user);
sleep 1;
}
}
-close L;
-
# vhosts
exit if $opt_V;
if (%vhost) {
}
}
-if ($notify_newrelease or not defined $notify_newrelease) {
+if ($notify_newrelease and $notify_newrelease !~ /^no$/i
+ or not defined $notify_newrelease) {
$notify_newrelease ||= $admin;
$newnew = $new = '';
$snew = $FEXHOME.'/doc/new';
$_ = slurp("$FEXHOME/doc/version")||'';
if (/(\d+)/) { $qn = "new?$hostname:$1" }
else { $qn = "new?$hostname:0" }
+ print "checking for new F*EX release\n" if $opt_v;
for (1..3) {
sleep rand(10);
- $newnew = `wget -qO- http://fex.rus.uni-stuttgart.de/$qn 2>/dev/null`;
- last if $newnew =~ /release/;
$newnew = `wget -qO- http://fex.belwue.de/$qn 2>/dev/null`;
last if $newnew =~ /release/;
+ # $newnew = `wget -qO- http://fex.rus.uni-stuttgart.de/$qn 2>/dev/null`;
+ # last if $newnew =~ /release/;
};
if ($newnew =~ /release/) {
if ($newnew ne $new) {
my $kf = "$to/$from/$file/keep";
my $ef = "$to/$from/$file/error";
local $_;
-
+
$keep = readlink $kf || readlink "$to/\@KEEP" || $keep_default;
$file = "$to/$from/$file";
if ($file =~ /\/ADDRESS_BOOK/) {
logdel($file,"$file deleted");
} elsif (-d $file and not -f $data) {
- if ($mtime = mtime("$file/upload")) {
+ if ($mtime = lmtime("$file/upload")) {
if ($today > $mtime+DS) {
verbose("rmrf $file (today=$today mtime_upload=$mtime)");
logdel($file,"$file deleted");
}
- } elsif ($mtime = mtime("$file/error")) {
+ } elsif ($mtime = lmtime("$file/error")) {
if ($today > 3*$keep*DS+$mtime) {
verbose("rmrf $file (today=$today mtime_error=$mtime keep=$keep)");
logdel($file,"$file deleted");
$delay = autodelete($file);
$delay = 1 if $delay !~ /^\d+$/;
$delay--;
- $mtime = mtime($download);
- if ($mtime and $today > $delay*DS+$mtime
+ $mtime = lmtime($download);
+ if ($mtime and $today > $delay*DS+$mtime
and logdel($data,"$data deleted")) {
if (open $ef,'>',$ef) {
printf {$ef} "%s has been autodeleted after download at %s\n",
- filename($file),isodate(mtime($download));
+ filename($file),isodate(lmtime($download));
close $ef;
}
}
} elsif (-f $data) {
my $reactivation = $file =~ m{/\Q$admin/reactivation.txt\E$};
$warn = $reactivation ? $keep-5 : $keep-2;
- $mtime = mtime("$file/filename") || mtime($data) || 0;
+ $mtime = lmtime("$file/filename") || lmtime($data) || 0;
if ($today > $mtime+$keep*DS) {
if ($account_expire and $reactivation) {
if ($account_expire =~ /delete/) {
# also _fexmail_*
logdel($file,"$file deleted") and
verbose("rmrf $file (today=$today mtime_upload=$mtime)");
- } elsif (logdel($data,"$data deleted")) {
+ } elsif (logdel($data,"$data deleted")) {
verbose("unlink $data (today=$today mtime=$mtime keep=$keep)");
if (open $ef,'>',$ef) {
$filename = $file;
}
}
}
- }
+ }
elsif ($file !~ /STDFEX$/ and
- $mtime+$warn*DS < $today and
+ $mtime+$warn*DS < $today and
$dkey = readlink("$file/dkey") and
- not -s $download and
- not -f $notify and
- (readlink("$to/\@REMINDER")||'yes') ne 'no')
+ not -s $download and
+ not -f $notify and
+ (readlink("$to/\@REMINDER")||'yes') ne 'no')
{
my $locale = readlink "$to/\@LOCALE" || readlink "$file/\@LOCALE";
$locale = 'english' unless $locale and $notify{$locale};
chomp ($comment = <$c>||'');
close $c;
}
- &{$notify{$locale}}(
+ if (&{$notify{$locale}}(
status => 'remind',
dkey => $dkey,
filename => filename($file),
comment => $comment,
warn => int(($mtime-$today)/DS)+$keep,
autodelete => autodelete($file),
- );
- open $notify,'>',$notify;
- close $notify;
- print "sent reminder for $file\n" if -t or $opt_v;
+ )) {
+ open $notify,'>',$notify;
+ close $notify;
+ print "sent reminder for $file\n" if -t or $opt_v;
+ } else {
+ warn "$0: reminder notification for $file failed\n";
+ }
}
}
}
chomp($autodelete = <$adf>||'');
close $adf;
}
-
- return $autodelete||$::autodelete;
-}
-sub mtime {
- my @s = lstat shift;
- return @s ? $s[9] : undef;
+ return $autodelete||$::autodelete;
}
sub logdel {
if ($status = rmrf($file)) {
logv($msg);
} else {
- print L "$isodate $file DEL FAILED : $!\n";
- warn "$file DEL FAILED : $!\n" if -t or $opt_v;
+ logv("$file DEL FAILED : $!");
+ warn "$file DEL FAILED : $!\n" if -t or $opt_v;
}
}
-
+
return $status;
}
sub logv {
my $msg = shift;
- print L "$isodate $msg\n" unless $opt_d;
+
print "$msg\n" if -t or $opt_v;
+
+ unless ($opt_d) {
+ foreach my $ld (@logdir) {
+ if (open my $log,">>$ld/cleanup.log") {
+ print {$log} "$isodate $msg\n";
+ close $log;
+ }
+ }
+ }
}
}
}
}
+
+
+sub lmtime {
+ my @s = lstat(shift);
+ return @s?$s[9]:0;
+}