/* * sma -- Sendmail log analyser * * Copyright (c) 2000 - 2003 Jarkko Turkulainen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY JARKKO TURKULAINEN ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL JARKKO TURKULAINEN BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $Date: 2003/03/22 15:30:37 $ */ #include "sma.h" void html(FILE *fp) { unsigned int j, h; struct host *hptr; const char *wdtab[] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; const char *hrtab[] = { "00-01", "01-02", "02-03", "03-04", "04-05", "05-06", "06-07", "07-08", "08-09", "09-10", "10-11", "11-12", "12-13", "13-14", "14-15", "15-16", "16-17", "17-18", "18-19", "19-20", "20-21", "21-22", "22-23", "23-00" }; curr = localtime(&tval); fprintf(fp, "\n"); if (iflag) { /* Print embedded ASCII report */ fprintf(fp, "\n"); } fprintf(fp, "\n" " \n" " \n" " \n", VERSION); fprintf(fp, " sendmail log analysis report\n" " \n\n" " \n", bchar); if (puchar) { fprintf(fp, " \n" " \n"); if (plchar) fprintf(fp, " \n", plchar, puchar, pachar ? pachar : PICTURE_ALT, ppchar ? ppchar : ""); else fprintf(fp, " \n", puchar, pachar ? pachar : PICTURE_ALT, ppchar ? ppchar : ""); fprintf(fp, " \n" " \n" "
" "\"%s\"" "\"%s\"

%s

\n", Cchar); if (htchar) fprintf(fp, " %s\n", htchar); else fprintf(fp, " Generated at %s by SMA, " "version %s\n", stripn(asctime(curr)), VERSION); fprintf(fp, "
\n"); } else { fprintf(fp, "

%s

\n", Cchar); if (htchar) fprintf(fp, " %s\n", htchar); else fprintf(fp, " Generated at %s by SMA, " "version %s\n", stripn(asctime(curr)), VERSION); } fprintf(fp, "


\n\n" " \n" "

Index

\n"); for (hptr = first.next; hptr; hptr = hptr->next) { if (!(hptr->inum) || !(hptr->inum)) continue; fprintf(fp, " %s
\n", hptr->name, hptr->name); fprintf(fp, " \n"); } fprintf(fp, "

\n\n"); for (hptr = first.next; hptr; hptr = hptr->next) { if (!(hptr->inum) || !(hptr->inum)) continue; fprintf(fp, " \n", hptr->name); fprintf(fp, "

%s

\n", hptr->name); if (pgflag) { fprintf(fp, " \n", hptr->name); fprintf(fp, " General information
\n" " \n" " \n" " \n", tbchar); fprintf(fp, " \n", stripn(ctime(&hptr->ftime))); fprintf(fp, " \n" " \n" " \n", tbchar); fprintf(fp, " \n", stripn(ctime(&hptr->ltime))); fprintf(fp, " \n" " \n" " \n", tbchar); fprintf(fp, " \n", hptr->alias); fprintf(fp, " \n" " \n" " \n", tbchar); fprintf(fp, " \n", hptr->hopc); fprintf(fp, " \n" " \n" " \n", tbchar); fprintf(fp, " \n", hptr->lcerror); fprintf(fp, " \n" " \n" " \n", tbchar); fprintf(fp, " \n", hptr->oserror); fprintf(fp, " \n" " \n" " \n", tbchar); fprintf(fp, " \n", hptr->rule); fprintf(fp, " \n" " \n" " \n", tbchar); fprintf(fp, " \n", hptr->dstart); fprintf(fp, " \n" "
First log entry%s
Last log entry%s
" "Alias table rebuilds%d
" "Too many hops%d
" "Mail loops%d
" "Other SYSERR%d
" "Ruleset based rejections%d
" "Sendmail daemon restarts%d

\n" " \n" " \n" " \n" " \n" " \n" "
Inbound messages
\n" " \n" " \n" " \n", tbchar); #ifdef _WIN32 fprintf(fp, " \n", (int)hptr->inum); #else fprintf(fp, " \n", hptr->inum); #endif fprintf(fp, " \n" " \n" " \n", tbchar); #ifdef _WIN32 fprintf(fp, " \n", (double)hptr->size/(double)hptr->inum/1000); #else fprintf(fp, " \n", hptr->size/(double)hptr->inum/1000); #endif fprintf(fp, " \n" " \n" " \n", tbchar); fprintf(fp, " \n", 3600*(float)hptr->inum/(float)hptr->dtime); fprintf(fp, " \n" " \n" " \n", tbchar); fprintf(fp, " \n", 60*(float)hptr->inum/(float)hptr->dtime); fprintf(fp, " \n" " \n" " \n", tbchar); fprintf(fp, " \n", (float)hptr->inum/(float)hptr->dtime); fprintf(fp, " \n" "
Total%d%ld
Average size (kB)%.2f%.2Lf
Messages/hour%.2f
Messages/min%.2f
Messages/sec%.2f
\n" "
Outbound messages
\n" " \n" " \n" " \n", tbchar); #ifdef _WIN32 fprintf(fp, " \n", (int)hptr->gonum); #else fprintf(fp, " \n", hptr->gonum); #endif fprintf(fp, " \n" " \n" " \n", tbchar); fprintf(fp, " \n", hptr->sent); fprintf(fp, " \n" " \n" " \n", tbchar); fprintf(fp, " \n", hptr->defe); fprintf(fp, " \n" " \n" " \n", tbchar); fprintf(fp, " \n", hptr->queu); fprintf(fp, " \n" " \n" " \n", tbchar); fprintf(fp, " \n", hptr->other + hptr->hunk + hptr->uunk + hptr->service); fprintf(fp, " \n" "
Total%d%ld
Sent%d
Deferred%d
Queued%d
Other error%d
\n" "

\n\n" " [Index]\n"); fprintf(fp, " [%s]\n\n", hptr->name, hptr->name); } if (epnum) { fprintf(fp, " \n", hptr->name); fprintf(fp, "

Top envelope pairs"); fprintf(fp, "
\n"); fprintf(fp, " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n", tbchar, tbchar, tbchar, tbchar, tbchar); for (j = 0; j < (MIN(epnum, hptr->edif)); j++) { fprintf(fp, " \n"); fprintf(fp, " \n", j+1); fprintf(fp, " \n", hptr->setab[j]->fname, hptr->setab[j]->tname); fprintf(fp, " \n", hptr->setab[j]->num); #ifdef _WIN32 fprintf(fp, " \n", (double)hptr->setab[j]->size/1000000); #else fprintf(fp, " \n", hptr->setab[j]->size/1000000); #endif if (sflag) { fprintf(fp, " \n", 100*(float)hptr->setab[j]->size/(float)hptr->osize); fprintf(fp, " \n"); } else { fprintf(fp, " \n", 100*(float)hptr->setab[j]->num/(float)hptr->onum); fprintf(fp, " \n"); } } fprintf(fp, "
" "NumberSender/Recipient" "Messages" "Transfers (MB)" "%%
%d%s
%s
%d%.2f%.2Lf%.2f
%.2f

\n\n" " [Index]\n"); fprintf(fp, " [%s]\n\n", hptr->name, hptr->name); } if (lnum) { fprintf(fp, " \n", hptr->name); fprintf(fp, "

Top envelope senders"); if (sef) fprintf(fp, " (filter: %s)
\n", sef); else fprintf(fp, "
\n"); fprintf(fp, " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n", tbchar, tbchar, tbchar, tbchar, tbchar); for (j = 0; j < (MIN(lnum, hptr->idif)); j++) { fprintf(fp, " \n"); fprintf(fp, " \n", j+1); fprintf(fp, " \n", hptr->sitab[j]->name); fprintf(fp, " \n", hptr->sitab[j]->num); #ifdef _WIN32 fprintf(fp, " \n", (double)hptr->sitab[j]->size/1000000); #else fprintf(fp, " \n", hptr->sitab[j]->size/1000000); #endif if (sflag) { fprintf(fp, " \n", 100*(float)hptr->sitab[j]->size/(float)hptr->isize); fprintf(fp, " \n"); } else { fprintf(fp, " \n", 100*(float)hptr->sitab[j]->num/(float)hptr->inum); fprintf(fp, " \n"); } } fprintf(fp, "
" "NumberSender" "Messages" "Transfers (MB)" "%%
%d%s%d%.2f%.2Lf%.2f
%.2f

\n\n" " [Index]\n"); fprintf(fp, " [%s]\n\n", hptr->name, hptr->name); } if (lrnum) { fprintf(fp, " \n", hptr->name); fprintf(fp, "

Top envelope recipients"); if (ref) fprintf(fp, " (filter: %s)
\n", ref); else fprintf(fp, "
\n"); fprintf(fp, " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n", tbchar, tbchar, tbchar, tbchar, tbchar); for (j = 0; j < (MIN(lrnum, hptr->odif)); j++) { fprintf(fp, " \n"); fprintf(fp, " \n", j+1); fprintf(fp, " \n", hptr->sotab[j]->name); fprintf(fp, " \n", hptr->sotab[j]->num); #ifdef _WIN32 fprintf(fp, " \n", (double)hptr->sotab[j]->size/1000000); #else fprintf(fp, " \n", hptr->sotab[j]->size/1000000); #endif if (sflag) { fprintf(fp, " \n", 100*(float)hptr->sotab[j]->size/(float)hptr->osize); fprintf(fp, " \n"); } else { fprintf(fp, " \n", 100*(float)hptr->sotab[j]->num/(float)hptr->onum); fprintf(fp, " \n"); } } fprintf(fp, "
" "NumberRecipient" "Messages" "Transfers (MB)" "%%
%d%s%d%.2f%.2Lf%.2f
%.2f

\n\n" " [Index]\n"); fprintf(fp, " [%s]\n\n", hptr->name, hptr->name); } if (rpnum) { fprintf(fp, " \n", hptr->name); fprintf(fp, "

Top relay pairs"); fprintf(fp, "
\n"); fprintf(fp, " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n", tbchar, tbchar, tbchar, tbchar, tbchar); for (j = 0; j < (MIN(rpnum, hptr->rrdif)); j++) { fprintf(fp, " \n"); fprintf(fp, " \n", j+1); fprintf(fp, " \n", hptr->srtab[j]->fname, hptr->srtab[j]->tname); fprintf(fp, " \n", hptr->srtab[j]->num); #ifdef _WIN32 fprintf(fp, " \n", (double)hptr->srtab[j]->size/1000000); #else fprintf(fp, " \n", hptr->srtab[j]->size/1000000); #endif if (sflag) { fprintf(fp, " \n", 100*(float)hptr->srtab[j]->size/(float)hptr->osize); fprintf(fp, " \n"); } else { fprintf(fp, " \n", 100*(float)hptr->srtab[j]->num/(float)hptr->onum); fprintf(fp, " \n"); } } fprintf(fp, "
" "NumberSender relay/Recipient relay" "Messages" "Transfers (MB)" "%%
%d%s
%s
%d%.2f%.2Lf%.2f
%.2f

\n\n" " [Index]\n"); fprintf(fp, " [%s]\n\n", hptr->name, hptr->name); } if (rnum) { fprintf(fp, " \n", hptr->name); fprintf(fp, "

Top relay addresses, sender"); if (srf) fprintf(fp, " (filter: %s)
\n", srf); else fprintf(fp, "
\n"); fprintf(fp, " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n", tbchar, tbchar, tbchar, tbchar, tbchar); for (j = 0; j < (MIN(rnum, hptr->ridif)); j++) { fprintf(fp, " \n"); fprintf(fp, " \n", j+1); fprintf(fp, " \n", hptr->rsitab[j]->name); fprintf(fp, " \n", hptr->rsitab[j]->num); #ifdef _WIN32 fprintf(fp, " \n", (double)hptr->rsitab[j]->size/1000000); #else fprintf(fp, " \n", hptr->rsitab[j]->size/1000000); #endif if (sflag) { fprintf(fp, " \n", 100*(float)hptr->rsitab[j]->size/(float)hptr->isize); } else { fprintf(fp, " \n", 100*(float)hptr->rsitab[j]->num/(float)hptr->rinum); } fprintf(fp, " \n"); } fprintf(fp, "
" "NumberRelay" "Messages" "Transfers (MB)" "%%
%d%s%d%.2f%.2Lf%.2f%.2f

\n\n" " [Index]\n"); fprintf(fp, " [%s]\n\n", hptr->name, hptr->name); } if (rrnum) { fprintf(fp, " \n", hptr->name); fprintf(fp, "

Top relay addresses, recipient"); if (rrf) fprintf(fp, " (filter: %s)
\n", rrf); else fprintf(fp, "
\n"); fprintf(fp, " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n", tbchar, tbchar, tbchar, tbchar, tbchar); for (j = 0; j < (MIN(rrnum, hptr->rodif)); j++) { fprintf(fp, " \n"); fprintf(fp, " \n", j+1); fprintf(fp, " \n", hptr->rsotab[j]->name); fprintf(fp, " \n", hptr->rsotab[j]->num); #ifdef _WIN32 fprintf(fp, " \n", (double)hptr->rsotab[j]->size/1000000); #else fprintf(fp, " \n", hptr->rsotab[j]->size/1000000); #endif if (sflag) { fprintf(fp, " \n", 100*(float)hptr->rsotab[j]->size/(float)hptr->osize); } else { fprintf(fp, " \n", 100*(float)hptr->rsotab[j]->num/(float)hptr->ronum); } fprintf(fp, " \n"); } fprintf(fp, "
" "NumberRelay" "Messages" "Transfers (MB)" "%%
%d%s%d%.2f%.2Lf%.2f%.2f

\n\n" " [Index]\n"); fprintf(fp, " [%s]\n\n", hptr->name, hptr->name); } if (stnum) { fprintf(fp, " \n", hptr->name); fprintf(fp, "

Top status messages"); fprintf(fp, "
\n"); fprintf(fp, " \n" " \n" " \n" " \n" " \n" " \n" " \n", tbchar, tbchar, tbchar, tbchar); for (j = 0; j < (MIN(stnum, hptr->sdif)); j++) { fprintf(fp, " \n"); fprintf(fp, " \n", j+1); fprintf(fp, " \n", hptr->ssttab[j]->num); fprintf(fp, " \n", 100*(float)hptr->ssttab[j]->num/(float)hptr->onum); fprintf(fp, " \n", hptr->ssttab[j]->name); fprintf(fp, " \n"); } fprintf(fp, "
" "NumberMsgs%%" "Status
%d%d%.2f%s

\n\n" " [Index]\n"); fprintf(fp, " [%s]\n\n", hptr->name, hptr->name); } if (rsnum) { fprintf(fp, " \n", hptr->name); fprintf(fp, "

Top ruleset rejections"); fprintf(fp, "
\n"); fprintf(fp, " \n" " \n" " \n" " \n" " \n" " \n" " \n", tbchar, tbchar, tbchar, tbchar, rsrnum ? "Reason / Top relays" : "Reason"); for (j = 0; j < (MIN(rsnum, hptr->rdif)); j++) { fprintf(fp, " \n"); fprintf(fp, " \n", j+1); fprintf(fp, " \n", hptr->sruletab[j]->num); fprintf(fp, " \n", 100*(float)hptr->sruletab[j]->num/(float)hptr->rule); fprintf(fp, " \n"); fprintf(fp, " \n"); if (rsrnum) { for (h = 0; h < (MIN(rsrnum, hptr->sruletab[j]->reldif)); h++) { fprintf(fp, " \n"); fprintf(fp, " \n"); fprintf(fp, " \n", hptr->sruletab[j]->srrelaytab[h]->num); fprintf(fp, " \n", 100*(float)hptr->sruletab[j]->srrelaytab[h]->num/(float)hptr->sruletab[j]->num); fprintf(fp, " \n", hptr->sruletab[j]->srrelaytab[h]->name); fprintf(fp, " \n"); } } } fprintf(fp, "
" "NumberMsgs%%" "%s
%d%d%.2f"); while (*(hptr->sruletab[j]->name) != '\0') { if (*(hptr->sruletab[j]->name) == '<') fprintf(fp, "<"); else if (*(hptr->sruletab[j]->name) == '>') fprintf(fp, ">"); else fputc(*(hptr->sruletab[j]->name), fp); hptr->sruletab[j]->name++; } fprintf(fp, "
%d%.2f%s

\n\n" " [Index]\n"); fprintf(fp, " [%s]\n\n", hptr->name, hptr->name); } if (!nflag) { fprintf(fp, "

\n", hptr->name); fprintf(fp, " \n" " \n" " \n" " \n" " \n" "
Inbound messages per day
\n" " \n" " \n" " \n" " \n" " \n" " \n", tbchar, tbchar, tbchar); for (j = 0; j < 7; j++) { if (hptr->idd[j]) { fprintf(fp, " \n"); fprintf(fp, " \n", tbchar, wdtab[j]); fprintf(fp, " \n", hptr->idd[j]); fprintf(fp, " \n", hptr->fidd[j]); fprintf(fp, " \n"); } } fprintf(fp, "
DayTotalAverage
" "%s%d%.2f
\n" "
Outbound messages per day
\n" " \n" " \n" " \n" " \n" " \n" " \n", tbchar, tbchar, tbchar); for (j = 0; j < 7; j++) { if (hptr->odd[j]) { fprintf(fp, " \n" " \n", tbchar, wdtab[j]); fprintf(fp, " \n", hptr->odd[j]); fprintf(fp, " \n", hptr->fodd[j]); fprintf(fp, " \n"); } } fprintf(fp, "
DayTotalAverage
" "%s%d%.2f
\n" "

\n" " \n" " \n" " \n" " \n" " \n" "
Inbound messages per hour
\n" " \n" " \n" " \n" " \n" " \n" " \n", tbchar, tbchar, tbchar); for (j = 0; j < 24; j++) { if (hptr->ihh[j]) { fprintf(fp, " \n"); fprintf(fp, " \n", tbchar, hrtab[j]); fprintf(fp, " \n", hptr->ihh[j]); fprintf(fp, " \n", hptr->fihh[j]); fprintf(fp, " \n"); } } fprintf(fp, "
HourTotalAverage
" "%s%d%.2f
\n" "
Outbound messages per hour
\n" " \n" " \n" " \n" " \n" " \n" " \n", tbchar, tbchar, tbchar); for (j = 0; j < 24; j++) { if (hptr->ohh[j]) { fprintf(fp, " \n"); fprintf(fp, " \n", tbchar, hrtab[j]); fprintf(fp, " \n", hptr->ohh[j]); fprintf(fp, " \n", hptr->fohh[j]); fprintf(fp, " \n"); } } fprintf(fp, "
HourTotalAverage
" "%s%d%.2f
\n" "

\n\n" " [Index]\n"); fprintf(fp, " [%s]\n\n", hptr->name, hptr->name); } fprintf(fp, "


\n"); } if (ftchar) fprintf(fp, " %s\n", ftchar); else fprintf(fp, " Copyright (c) 2000 - 2003" " Jarkko Turkulainen. All rights reserved.\n"); fprintf(fp, " \n\n"); }