allow to match smtp entries by time and rel_line_nr, allow multiple '-q' options

Note: SMTP only entries do not have a valid qmgr ID
This commit is contained in:
Dietmar Maurer 2017-09-18 08:55:32 +02:00
parent e600e0f1bd
commit a101f17a59

View File

@ -85,6 +85,18 @@ struct _TOList {
TOList *next; TOList *next;
}; };
#define MatchTypeQID 1
#define MatchTypeRelLineNr 2
typedef struct _MatchList MatchList;
struct _MatchList {
unsigned int mtype;
char *id;
time_t ltime;
unsigned long rel_line_nr;
MatchList *next;
};
#ifdef DEBUG #ifdef DEBUG
GHashTable *smtpd_debug_alloc; GHashTable *smtpd_debug_alloc;
GHashTable *qmgr_debug_alloc; GHashTable *qmgr_debug_alloc;
@ -125,9 +137,9 @@ typedef struct {
time_t start; time_t start;
time_t end; time_t end;
time_t ctime; time_t ctime;
MatchList *match_list;
char *server; char *server;
char *msgid; char *msgid;
char *qid;
char *strmatch; char *strmatch;
unsigned long limit; unsigned long limit;
unsigned long count; unsigned long count;
@ -169,6 +181,10 @@ struct _SEntry {
char *connect; char *connect;
// time,rel_line_nr is used as cursor/ID
time_t ltime;
unsigned long rel_line_nr;
//unsigned int external:1; // not from local host //unsigned int external:1; // not from local host
unsigned int disconnect:1; unsigned int disconnect:1;
unsigned int strmatch:1; unsigned int strmatch:1;
@ -230,8 +246,8 @@ char *epool_strdup (EPool *ep, const char *s);
void loglist_print (LogList *loglist); void loglist_print (LogList *loglist);
void loglist_add (EPool *ep, LogList *loglist, const char *text, int len, unsigned long linenr); void loglist_add (EPool *ep, LogList *loglist, const char *text, int len, unsigned long linenr);
SEntry *sentry_new (int pid); SEntry *sentry_new (int pid, time_t ltime, unsigned long rel_line_nr);
SEntry *sentry_get (LParser *parser, int pid); SEntry *sentry_get (LParser *parser, int pid, time_t ltime, unsigned long rel_line_nr);
void sentry_ref_add (SEntry *sentry, QEntry *qentry); void sentry_ref_add (SEntry *sentry, QEntry *qentry);
int sentry_ref_del (SEntry *sentry, QEntry *qentry); int sentry_ref_del (SEntry *sentry, QEntry *qentry);
void sentry_ref_finalize (LParser *parser, SEntry *sentry); void sentry_ref_finalize (LParser *parser, SEntry *sentry);
@ -508,7 +524,7 @@ loglist_add (EPool *ep, LogList *loglist, const char *text, int len, unsigned lo
} }
SEntry* SEntry*
sentry_new (int pid) sentry_new (int pid, time_t ltime, unsigned long rel_line_nr)
{ {
SEntry *sentry; SEntry *sentry;
SList *blocks; SList *blocks;
@ -516,6 +532,8 @@ sentry_new (int pid)
sentry = (SEntry *)g_slice_alloc0(EPOOL_BLOCK_SIZE); sentry = (SEntry *)g_slice_alloc0(EPOOL_BLOCK_SIZE);
sentry->pid = pid; sentry->pid = pid;
sentry->ltime = ltime;
sentry->rel_line_nr = rel_line_nr;
#ifdef EPOOL_DEBUG #ifdef EPOOL_DEBUG
sentry->ep.allocated += EPOOL_BLOCK_SIZE; sentry->ep.allocated += EPOOL_BLOCK_SIZE;
@ -550,7 +568,7 @@ sentry_new (int pid)
} }
SEntry * SEntry *
sentry_get (LParser *parser, int pid) sentry_get (LParser *parser, int pid, time_t ltime, unsigned long rel_line_nr)
{ {
SEntry *sentry; SEntry *sentry;
@ -558,7 +576,7 @@ sentry_get (LParser *parser, int pid)
return sentry; return sentry;
} else { } else {
if ((sentry = sentry_new (pid))) { if ((sentry = sentry_new (pid, ltime, rel_line_nr))) {
g_hash_table_insert (parser->smtpd_h, &sentry->pid, sentry); g_hash_table_insert (parser->smtpd_h, &sentry->pid, sentry);
} }
@ -704,13 +722,32 @@ sentry_print (LParser *parser, SEntry *sentry)
{ {
NQList *nq; NQList *nq;
if (parser->msgid || parser->qid) return; if (parser->msgid) return;
if (parser->server) { if (parser->server) {
if (!sentry->connect) return; if (!sentry->connect) return;
if (!strcasestr (sentry->connect, parser->server)) return; if (!strcasestr (sentry->connect, parser->server)) return;
} }
MatchList *match = parser->match_list;
if (match) {
int found = 0;
while(match) {
if (match->mtype == MatchTypeQID) {
return;
} else if (match->mtype == MatchTypeRelLineNr) {
if (match->ltime == sentry->ltime && match->rel_line_nr == sentry->rel_line_nr) {
found = 1;
break;
}
} else {
g_error("implement me");
}
match = match->next;
}
if (!found) return;
}
if (parser->from || parser->to || if (parser->from || parser->to ||
parser->exclude_greylist || parser->exclude_ndrs) { parser->exclude_greylist || parser->exclude_ndrs) {
nq = sentry->nqlist; nq = sentry->nqlist;
@ -755,7 +792,9 @@ sentry_print (LParser *parser, SEntry *sentry)
nq = sentry->nqlist; nq = sentry->nqlist;
while (nq) { while (nq) {
if (nq->from && nq->to && nq->dstatus) { if (nq->from && nq->to && nq->dstatus) {
printf ("TO:%08lX:00000000000:%c: from <%s> to <%s>\n", nq->ltime, nq->dstatus, nq->from, nq->to); printf ("TO:%08lX:T%08lXL%08lX:%c: from <%s> to <%s>\n", nq->ltime,
sentry->ltime, sentry->rel_line_nr, nq->dstatus,
nq->from, nq->to);
parser->count++; parser->count++;
} }
nq = nq->next; nq = nq->next;
@ -981,12 +1020,27 @@ qentry_print (LParser *parser, QEntry *qentry)
if (strcasecmp (parser->msgid, qentry->msgid)) return; if (strcasecmp (parser->msgid, qentry->msgid)) return;
} }
if (parser->qid) { MatchList *match = parser->match_list;
if (match) {
int found = 0; int found = 0;
if (fe && !strcmp (fe->logid, parser->qid)) found = 1; while(match) {
if (!strcmp (qentry->qid, parser->qid)) found = 1; if (match->mtype == MatchTypeQID) {
if ((fe && !strcmp (fe->logid, match->id)) ||
if (!found) return; (!strcmp (qentry->qid, match->id))) {
found = 1;
break;
}
} else if (match->mtype == MatchTypeRelLineNr) {
if (se && match->ltime == se->ltime && match->rel_line_nr == se->rel_line_nr) {
found = 1;
break;
}
} else {
g_error("implement me");
}
match = match->next;
}
if (!found) return;
} }
if (parser->server) { if (parser->server) {
@ -1476,7 +1530,7 @@ parse_time (const char **text, int len)
// parse month // parse month
int csum = (line[0]<<16) + (line[1]<<8) + line[2]; int csum = (line[0]<<16) + (line[1]<<8) + line[2];
switch (csum) { switch (csum) {
case 4874606: mon = 0; break; case 4874606: mon = 0; break;
case 4613474: mon = 1; break; case 4613474: mon = 1; break;
@ -1711,12 +1765,13 @@ main (int argc, char * const argv[])
int found = 0; int found = 0;
int csum_prog; int csum_prog;
unsigned long lines = 0; unsigned long lines = 0;
unsigned long rel_line_nr = 0;
char qidbuf[30]; char qidbuf[30];
int i; int i;
struct tm *ltime; struct tm *ltime;
struct timeval tv; struct timeval tv;
time_t ctime, start, end; time_t ctime, next_ctime, start, end;
LParser *parser; LParser *parser;
int opt; int opt;
@ -1753,7 +1808,21 @@ main (int argc, char * const argv[])
} else if (opt == 'm') { } else if (opt == 'm') {
parser->msgid = epool_strdup (&parser->ep, optarg); parser->msgid = epool_strdup (&parser->ep, optarg);
} else if (opt == 'q') { } else if (opt == 'q') {
parser->qid = epool_strdup (&parser->ep, optarg); time_t ltime;
unsigned long rel_line_nr;
MatchList *match = (MatchList *)epool_alloc(&parser->ep, sizeof(MatchList));
if (sscanf(optarg, "T%08lXL%08lX", &ltime, &rel_line_nr) == 2) {
match->mtype = MatchTypeRelLineNr;
match->ltime = ltime;
match->rel_line_nr = rel_line_nr;
match->next = parser->match_list;
parser->match_list = match;
} else {
match->mtype = MatchTypeQID;
match->id = epool_strdup(&parser->ep, optarg);
match->next = parser->match_list;
parser->match_list = match;
}
} else if (opt == 'x') { } else if (opt == 'x') {
parser->strmatch = epool_strdup (&parser->ep, optarg); parser->strmatch = epool_strdup (&parser->ep, optarg);
} else if (opt == 'l') { } else if (opt == 'l') {
@ -1851,7 +1920,19 @@ main (int argc, char * const argv[])
if (parser->to) printf ("# Recipient: %s\n", parser->to); if (parser->to) printf ("# Recipient: %s\n", parser->to);
if (parser->server) printf ("# Server: %s\n", parser->server); if (parser->server) printf ("# Server: %s\n", parser->server);
if (parser->msgid) printf ("# MsgID: %s\n", parser->msgid); if (parser->msgid) printf ("# MsgID: %s\n", parser->msgid);
if (parser->qid) printf ("# QID: %s\n", parser->qid);
MatchList *match = parser->match_list;
while (match) {
if (match->mtype == MatchTypeQID) {
printf ("# QID: %s\n", match->id);
} else if (match->mtype == MatchTypeRelLineNr) {
printf ("# QID: T%08lXL%08lX\n", match->ltime, match->rel_line_nr);
} else {
g_error("internal error - unknown match type %d\n", match->mtype);
}
match = match->next;
}
if (parser->strmatch) printf ("# Match: %s\n", parser->strmatch); if (parser->strmatch) printf ("# Match: %s\n", parser->strmatch);
strftime (linebuf, 256, "%F %T", gmtime (&parser->start)); strftime (linebuf, 256, "%F %T", gmtime (&parser->start));
@ -1900,9 +1981,20 @@ main (int argc, char * const argv[])
int pid = 0; int pid = 0;
cpos = line; cpos = line;
if (!(ctime = parse_time (&cpos, len))) {
next_ctime = parse_time (&cpos, len);
if (!next_ctime) {
continue; continue;
} }
if (next_ctime != ctime) {
rel_line_nr = 0;
} else {
rel_line_nr++;
}
ctime = next_ctime;
if (ctime < start) continue; if (ctime < start) continue;
if (ctime > end) break; if (ctime > end) break;
@ -2101,7 +2193,7 @@ main (int argc, char * const argv[])
if (*cpos != '>') continue; if (*cpos != '>') continue;
if (!(se = sentry_get (parser, pid))) { if (!(se = sentry_get (parser, pid, ctime, rel_line_nr))) {
continue; continue;
} }
@ -2263,7 +2355,7 @@ main (int argc, char * const argv[])
continue; continue;
} }
if (!(se = sentry_get (parser, pid))) { if (!(se = sentry_get (parser, pid, ctime, rel_line_nr))) {
continue; continue;
} }