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