全部博文(1144)
分类: LINUX
2009-12-09 12:11:28
#!/usr/local/bin/perl # find forwards to a particular target # qmail_find_forwards -d aol.com # Copyright 2008 Jeremy Kister. use strict; my %paths; our($opt_v,$opt_f,$opt_p,$opt_d); use Getopt::Std; getopts('vf:d:p'); die "use -v or -f\n" unless($opt_v || $opt_f); die "use -d \n" unless($opt_d); # -p for pretty 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; my %copy = %paths; if($opt_f){ $| = 1; open(LOG, ">$opt_f") || die "cannot write to $opt_f: $!\n"; } while(my($domain,$dir) = each %paths){ print "working on $domain\n" if($opt_v); if(opendir(D, $dir)){ # open vpasswd, look for .qmail inside Maildirs if(open(V, "${dir}/vpasswd")){ my $n=0; while( ){ $n++; if(/^([^:]+):[^:]+:\d+:\d+:[^:]*:([^:]+):/){ my $mailbox = $1; my $maildir = $2; if(open(F, "$maildir/.qmail")){ my $l=0; while( ){ chop; $l++; if(/\@${opt_d}/){ if($opt_p){ s/^&//; warn "${mailbox}\@${domain}: $_\n" if($opt_v); print LOG "${mailbox}\@${domain}: $_\n" if($opt_f); }else{ warn "$maildir/.qmail (line $l): $_\n" if($opt_v); print LOG "$maildir/.qmail (line $l): $_\n" if($opt_f); } } } close F; }else{ unless(-d $maildir){ warn "No maildir for $mailbox\@$domain ($dir)\n" if($opt_v); print LOG "No maildir for $mailbox\@$domain ($dir)\n" if($opt_f); } } }else{ warn "Invalid syntax at ${dir}/vpasswd:$n\n" if($opt_v); print LOG "Invalid syntax at ${dir}/vpasswd:$n\n" if($opt_f); } } close V; }else{ warn "cannot open ${dir}/vpasswd: $!\n" if($opt_v); print LOG "cannot open ${dir}/vpasswd: $!\n" if($opt_f); } foreach my $file (grep {/^\.qmail-/} readdir D){ if(open(F, "${dir}/${file}")){ my $n=0; while( ){ chop; $n++; next if(/^#/); if(/\@${opt_d}/){ if($opt_p){ s/^&//; my ($user) = $file =~ /.qmail-(.+)/; warn "${user}\@${domain}: $_\n" if($opt_v); print LOG "${user}\@${domain}: $_\n" if($opt_f); }else{ warn "${dir}/${file} (line $n): $_\n" if($opt_v); print LOG "${dir}/${file} (line $n): $_\n" if($opt_f); } } } close F; }else{ warn "could not open ${dir}/${file}: $!\n" if($opt_v); print LOG "could not open ${dir}/${file}: $!\n" if($opt_f); } } closedir D; }else{ warn "error with $domain: $dir does not exist\n" if($opt_v); print LOG "error with $domain: $dir does not exist\n" if($opt_f); } }