#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

my $QPDIR = get_qp_dir();
my $logfile = "$QPDIR/log/main/current";

my $is_ip  = 0;
my $search = $ARGV[0];

if ( ! $search ) {
    die "\nusage: $0 [ ip_address | PID ]\n\n";
};

if ( $search =~ /^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$/ ) {
    #print "it's an IP\n";
    $is_ip++;
};

open my $LOG, '<', $logfile or die "unable to open $logfile\n";

if ( $is_ip ) {    # look for the connection start message for the IP
    my $ip_matches;
    while ( defined (my $line = <$LOG>) ) {
        next if ! $line;
        my ( $tai, $pid, $mess ) = split /\s/, $line, 3;
        if ( 'Connection from ' eq substr( $mess, 0, 16 ) ) {
            my ( $ip ) = (split /\s+/, $mess)[-1];  # IP is last word
            $ip = substr $ip, 1, -1;                # trim off brackets
            if ( $ip eq $search ) {
                $ip_matches++;
                $search = $pid;
                $is_ip = 0;
            };
        };
    };
    seek $LOG, 0, 0;
    die "no pid found for ip $search\n" if $is_ip;
    print "showing the last of $ip_matches connnections from $ARGV[0]\n";
};

print "showing QP message PID $search\n";

while ( defined (my $line = <$LOG>) ) {
    next if ! $line;
    my ( $tai, $pid, $mess ) = split /\s/, $line, 3;
    next if ! $pid;
    print $mess if ( $pid eq $search );
};
close $LOG;


sub get_qp_dir {
    foreach my $user ( qw/ qpsmtpd smtpd / ) {
        my ($homedir) = (getpwnam( $user ))[7] or next;

        if ( -d "$homedir/plugins" ) {
            return "$homedir";
        };
        foreach my $s ( qw/ smtpd qpsmtpd qpsmtpd-dev / ) {
            if ( -d "$homedir/$s/plugins" ) {
                return "$homedir/$s";
            };
        };
    };
    if ( -d "./plugins" ) {
        return Cwd::getcwd();
    };
};