#!/usr/local/bin/perl

#
# parse argv
#

if ( $#ARGV == -1 ) {
    $conf='';
    $rcptpat='';
    $sendpat='';
    $del=0;
}
else {
    if ( $ARGV[0] eq '-c' ) {
	$conf = $ARGV[1];
	shift(@ARGV);
	shift(@ARGV);
	if ( $> != 0 ) {
	    &usage;
	}
    }
    if ( $ARGV[0] eq '-d' ) {
	$del = 1;
	shift(@ARGV);
	# TODO: testen, ob postsuper -d id auch ohne root tut ?
	if ( $> != 0 ) {
	    &usage;
	}
    }
    if ( $ARGV[0] eq '-e' ) {
	$rcptpat = $ARGV[1];
	shift(@ARGV);
	shift(@ARGV);
    }
    if ( $ARGV[0] eq '-s' ) {
	$sendpat = $ARGV[1];
	shift(@ARGV);
	shift(@ARGV);
    }
    if ( $#ARGV ne -1 ) {
	&usage;
    }
}

if ( $del == 1 && $sendpat eq '' && $rcptpat eq '' ) {
    print "You do not want to delete the whole queue, aborting\n";
    exit(2);
}

if ( $conf ne '' ) {
    @inp = `/usr/local/sbin/postqueue -c $conf -p`;
}
else {
    @inp = `/usr/local/sbin/postqueue -p`;
}

# print "input: $#inp\n";
chop(@inp);

# Aufgabe: alle loeschen, die als empfaenger pavel.kolar@brunel.de haben ?

# Q: was bedeutet * nach der qid ?
# A: lt. manual postqueue: file in /var/spool/postfix/active/

# Q: Was bedeutet error-message ?
# A: file liegt in deferred/<char>/1933B552F08
#    error liegt in defer/<char>/1933B552F08
#    daher: wenn geloescht werden muss, dann auch dieses file
#    und: pruefen, welche prozesse darauf aktiv sind

# Q: Findet postqueue -p auch msgs in incoming ?
# A: Nein

# wie loeschen ? A: mit postsuper -d <id>
# mailq | grep pattern | awk '{print substr($1,1,10)}' | postsuper -d -
# problem: ids werden reused (!), rein theoretisch kann also die
#   falsche mail genuked werden

$state = 0;
my(@rcpt);
foreach $i (1..$#inp-1) {

    if ( $state == 0 ) {
	$line = $inp[$i];
	( $qid, $sz, $dayname, $mon, $daynum, $time, $sender ) =
	    split(/ +/,$line);
	if ( $qid =~ /\*$/ || $qid =~ /\!$/ ) {
	    chop($qid);
	}
	$state = 1;
	# reset recipients
	@rcpt = ();
	next;
    }
    if ( $state == 1 ) {
	# fall: Empfaenger
	if ( $inp[$i] =~ /^\s*\(/ ) {
	    # its some message, ignore it for now
	    next;
	}
	elsif ( $inp[$i] =~ /^\s+\S/ ) {
	    ( undef, $adr ) = split (/ +/, $inp[$i] );
	    push(@rcpt, $adr);
	}
	elsif ( $inp[$i] eq '' ) {
	    # seperation line
	    $state = 0;
	    $sz{$qid} = $sz;
	    $sender{$qid} = $sender;
	    $rcpt{$qid} = join(' ',@rcpt);
	    $stamp{$qid} = "$dayname $mon $daynum $time";
	    next;
	}
    }
}

foreach $qid (keys(%sz)) {
    $sz = $sz{$qid};
    $sender = $sender{$qid};
    $rcpt = $rcpt{$qid};
    $stamp = $stamp{$qid};
    next if ( $sendpat ne '' && $sender !~ /$sendpat/ );
    next if ( $rcptpat ne '' && $rcpt !~ /$rcptpat/ );
    if ( $del == 1 ) {
	if ( $conf ne '' ) {
	    $res=`postsuper -c $conf -d $qid 2>/dev/null`;
	}
	else {
	    $res=`postsuper -d $qid 2>/dev/null`;
	}
	print "deleted ";
	
    }
    print "$qid $sz $stamp $sender $rcpt\n";
}

sub usage {
    print "usage: $0 [-c otherconfig] [-d] [-e empfaenger] [-s sender]\n";
    print " -c dir	dieses configdir wird verwendet -- only as root\n";
    print " -d		es wird geloescht -- only as root\n";
    print " -e		muster im empfaenger\n";
    print " -s		muster im sender\n";
    print " -S		groesse\n";
    print "\n";
    print "Ausgabeformat: queueid size sender empfaenger\n";

    exit(1);
}

