#!/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();
    }
}