全部博文(1144)
分类: LINUX
2009-12-09 12:10:24
#!/usr/local/bin/perl # make sure all .qmail-defaults contain something smelling valid # Copyright 2008 Jeremy Kister. use strict; my ($y,$m,$d) = (localtime())[5,4,3]; $y += 1900; $m++; my $mon = sprintf('%.2d', $m); my $day = sprintf('%.2d', $d); my $date = $y . $mon . $day; my(%dir,%nuked); my $DEBUG; opendir(D, '/var/qmail/queue/mess/') || die "cannot opendir queue/mess: $!\n"; my @subdirs = (grep {!/^\./} readdir D); # conf-split closedir D; # trim log, my @log; if(open(LOG, "/export/home/misc_logs/defaultbounce")){ while(){ push @log, $_; } close LOG; my $i=1; open(LOG, ">/export/home/misc_logs/defaultbounce.tmp") || die "cannot write to defaultbounce.tmp: $!\n"; foreach my $line (reverse @log){ print LOG $line; last if($i == 10000); $i++; } close LOG; rename("/export/home/misc_logs/defaultbounce.tmp","/export/home/misc_logs/defaultbounce") || die "cannot rename tmp: $!\n"; } ## end trim log open(LOG, ">>/export/home/misc_logs/defaultbounce") || die "cannot open defaultbounce for append: $!\n"; my $V = (shift) ? 1 : undef; my %paths; print "gathering mx authoritative data..\n"; open(A, '/var/qmail/users/assign') || die "cannot open assign: $!\n"; while(){ if(/^\+.+-:([^:]+):\d+:\d+:([^:]+):-::$/){ if((-f "$2/vpasswd") && (! -l "$2")){ $paths{$1} = $2; } } } close A; while(my($domain,$dir) = each %paths){ print "working on $domain...\n" if($V); my $rename = 0; if(open(V, "$dir/.qmail-default")){ open(N, ">$dir/.qmail-default.new") || die "cannot write to $dir/.qmail-default.new: $!\n"; my $line=0; while( ){ $line++; if(/bounce-no-mailbox/){ print N; next; }elsif(/delete/){ # change these to bounce-no-mailbox print LOG "[${date}]: $dir/.qmail-default:$line (changed to bounce-no-mailbox)\n"; print N "|/home/vpopmail/bin/vdelivermail '' bounce-no-mailbox\n"; $rename = 1; }elsif(/\'\'\s(\S+)/){ my $maildir = $1; if($maildir =~ /\S+\@\S+\.\S+/){ print N; next; } if(-d $maildir){ # find out if this mailbox is being used my $ago = ($^T - 5184000); # 60 days ago if((stat("$maildir/lastauth"))[9] < $ago){ print LOG "[${date}]: $dir/.qmail-default:$line (unchecked default box)\n"; print N "|/home/vpopmail/bin/vdelivermail '' bounce-no-mailbox\n"; $rename = 1; # now delete mailbox, or nuke the maildir if postmaster #my ($user) = $maildir =~ s#.*/##g; ## WTF?? my $user = $maildir; $user =~ s#.*/##g; if($user eq 'postmaster'){ print LOG "[${date}]: nuking mail for postmaster\@$domain\n"; foreach my $place ('new','cur'){ opendir(D, "$maildir/Maildir/$place") || die "cant opendir $place: $!\n"; foreach my $file (grep {!/^\./} readdir D){ unlink("$maildir/Maildir/$place/$file") || die "cant unlink $file: $!\n"; } closedir D; } }else{ print LOG "[${date}]: deleting ${user}\@${domain}\n"; my ($error) = `/home/vpopmail/bin/vdeluser $user\@$domain 2>&1`; warn "$error\n" if($error); } }else{ print N; } }else{ print LOG "[${date}]: $dir/.qmail-default:$line (maildir doesnt exist)\n"; print N "|/home/vpopmail/bin/vdelivermail '' bounce-no-mailbox\n"; $rename = 1; } } } close V; close N; if($line > 1){ print LOG "[${date}]: $dir/.qmail-default contains $line commands\n"; } if($rename == 1){ print LOG "[${date}]: renaming $dir/.qmail-default.new\n"; rename("$dir/.qmail-default.new","$dir/.qmail-default") || die "cant rename $dir/.qm: $!\n"; chown(32008,30011,"$dir/.qmail-default") || die "cant chown $dir/.qmail-default: $!\n"; }else{ unlink("$dir/.qmail-default.new") || die "cannot unlink $dir/.qmail-default.new"; } }else{ print LOG "[${date}]: no .qmail-default for $domain ($dir)\n"; } } close L;