?? graph.c
字號:
#include <unistd.h>#include <setjmp.h>#include <signal.h>#include <string.h>#include <netdb.h>#include <netinet/in.h>#include <sys/types.h>#include <sys/socket.h>#include <time.h>#include "bandwidthd.h"#ifdef HAVE_ARPA_NAMESER_H#include <arpa/nameser.h>#endif#ifdef HAVE_RESOLV_H#include <resolv.h>#endifextern unsigned int SubnetCount;extern struct config config;jmp_buf dnsjump;static void rdnslngjmp(int signal);void rdns(char *Buffer, unsigned long IP) // This takes over sigalarm! {#ifdef HAVE_RESOLV_H char DNSError[] = "DNS Timeout: Correct to speed up graphing"; char None[] = "Configure DNS to reverse this IP"; char TooManyDNSTimeouts[] = "Too many dns timeouts, reverse lookups suspended"; struct hostent *hostent; char chrIP[50]; static int Init = TRUE; static int DNSTimeouts = 0; // This is reset for each run because we're forked unsigned long addr = htonl(IP); _res.retrans = 1; _res.retry = 2; if (Init) { signal(SIGALRM, rdnslngjmp); Init = FALSE; } if (DNSTimeouts > 100) { syslog(LOG_ERR, "Too many dns timeouts, reverse lookups suspended"); strncpy(Buffer, TooManyDNSTimeouts, 253); Buffer[254] = '\0'; return; } if (setjmp(dnsjump) == 0) { alarm(10); // Don't let gethostbyaddr hold us up too long hostent = gethostbyaddr((char *) &addr, 4, AF_INET); // (char *)&Data->IP alarm(0); if (hostent) sprintf(Buffer, "%s", hostent->h_name); else { strncpy(Buffer, None, 253); Buffer[254] = '\0'; } } else // Our alarm timed out { HostIp2CharIp(IP, chrIP); syslog(LOG_ERR, "DNS timeout for %s: This problem reduces graphing performance", chrIP); DNSTimeouts++; strncpy(Buffer, DNSError, 253); Buffer[254] = '\0'; }#else Buffer[0] = '\0';#endif }static void rdnslngjmp(int signal) { longjmp(dnsjump, 1); }void swap(struct SummaryData **a, struct SummaryData **b) { struct SummaryData *temp; temp = *a; *a = *b; *b = temp;}void QuickSortSummaryData(struct SummaryData *SummaryData[], int left, int right) { int i,j,center; unsigned long long pivot; if (left==right) return; if (left+1==right) { if (SummaryData[left]->Total < SummaryData[right]->Total) swap(&SummaryData[left],&SummaryData[right]); return; } /* use the median-of-three method for picking pivot */ center = (left+right)/2; if (SummaryData[left]->Total < SummaryData[center]->Total) swap(&SummaryData[left],&SummaryData[center]); if (SummaryData[left]->Total < SummaryData[right]->Total) swap(&SummaryData[left],&SummaryData[right]); if (SummaryData[center]->Total < SummaryData[right]->Total) swap(&SummaryData[center],&SummaryData[right]); pivot = SummaryData[center]->Total; swap(&SummaryData[center],&SummaryData[right-1]); /* hide the pivot */ i = left; j = right - 1; do { do { ++i; } while (SummaryData[i]->Total > pivot); do { --j; } while (SummaryData[j]->Total < pivot); swap(&SummaryData[i],&SummaryData[j]); } while (j > i); swap(&SummaryData[i],&SummaryData[j]); /* undo last swap */ swap(&SummaryData[i],&SummaryData[right-1]); /* restore pivot */ QuickSortSummaryData(SummaryData,left,i-1); QuickSortSummaryData(SummaryData,i+1,right);}#define NumFactor 1024static void FormatNum(unsigned long long n, char *buf, int len) { double f; if (n<NumFactor) { snprintf(buf,len,"<td align=\"right\"><tt>%i </tt></td>",(int)n); return; } f = n; f /= NumFactor; if (f<NumFactor) { snprintf(buf,len,"<td align=\"right\"><tt>%.1fK</tt></td>",f); return; } f /= NumFactor; if (f<NumFactor) { snprintf(buf,len,"<td align=\"right\"><tt>%.1fM</tt></td>",f); return; } f /= NumFactor; if (f<NumFactor) { snprintf(buf,len,"<td align=\"right\"><tt>%.1fG</tt></td>",f); return; } f /= NumFactor; snprintf(buf,len,"<td align=\"right\"><tt>%.1fT</tt></td>\n",f);}void PrintTableLine(FILE *stream, struct SummaryData *Data, int Counter) { char Buffer1[50]; char Buffer2[50]; char Buffer3[50]; char Buffer4[50]; char Buffer4b[50]; char Buffer5[50]; char Buffer5b[50]; char Buffer6[50]; char Buffer7[50]; char Buffer8[50]; // First convert the info to nice, human readable stuff if (Data->IP == 0) strcpy(Buffer1, "Total"); else HostIp2CharIp(Data->IP, Buffer1); FormatNum(Data->Total, Buffer2, 50); FormatNum(Data->TotalSent, Buffer3, 50); FormatNum(Data->TotalReceived, Buffer4, 50); FormatNum(Data->FTP, Buffer4b, 50); FormatNum(Data->HTTP, Buffer5, 50); FormatNum(Data->P2P, Buffer5b, 50); FormatNum(Data->TCP, Buffer6, 50); FormatNum(Data->UDP, Buffer7, 50); FormatNum(Data->ICMP, Buffer8, 50); if (Counter%4 == 0 || (Counter-1)%4 == 0) fprintf(stream, "<TR>"); else fprintf(stream, "<TR bgcolor=lightblue>"); if (Data->Graph) fprintf(stream, "<TD><a href=\"#%s-%c\">%s</a></TD>%s%s%s%s%s%s%s%s%s</TR>\n", Buffer1, // Ip config.tag, Buffer1, // Ip Buffer2, // Total Buffer3, // TotalSent Buffer4, // TotalReceived Buffer4b, // FTP Buffer5, // HTTP Buffer5b, // P2P Buffer6, // TCP Buffer7, // UDP Buffer8); // ICMP else fprintf(stream, "<TD>%s</TD>%s%s%s%s%s%s%s%s%s</TR>\n", Buffer1, // Ip Buffer2, // Total Buffer3, // TotalSent Buffer4, // TotalReceived Buffer4b, // FTP Buffer5, // HTTP Buffer5b, // P2P Buffer6, // TCP Buffer7, // UDP Buffer8); // ICMP }void MakeIndexPages(int NumIps, struct SummaryData *SummaryData[]) { int SubnetCounter; int Counter, tCounter; time_t WriteTime; char filename[] = "./htdocs/index2.html"; char *PeriodDesc; FILE *file; char Buffer1[50]; char Buffer2[50]; char HostName[255]; WriteTime = time(NULL); QuickSortSummaryData(SummaryData, 0, NumIps-1); //////////////////////////////////////////////// // Print main index page if (config.tag == '1') { if ((file = fopen("./htdocs/index.html", "wt")) == NULL) { syslog(LOG_ERR, "Failed to open ./htdocs/index.html"); exit(1); } } else { filename[14] = config.tag; if ((file = fopen(filename, "wt")) == NULL) { syslog(LOG_ERR, "Failed to open %s", filename); exit(1); } } switch (config.tag) { case '1': PeriodDesc = "Daily"; break; case '2': PeriodDesc = "Weekly"; break; case '3': PeriodDesc = "Monthly"; break; case '4': PeriodDesc = "Yearly"; break; default: PeriodDesc = ""; break; } fprintf(file, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n"); fprintf(file, "<HTML>\n<HEAD>\n<TITLE>Bandwidthd</TITLE>\n"); if (config.meta_refresh) fprintf(file, "<META HTTP-EQUIV=\"REFRESH\" content=\"%u\">\n", config.meta_refresh); fprintf(file, "<META HTTP-EQUIV=\"EXPIRES\" content=\"-1\">\n"); fprintf(file, "<META HTTP-EQUIV=\"PRAGMA\" content=\"no-cache\">\n"); fprintf(file, "</HEAD>\n<BODY vlink=blue>\n%s<br>\n<center><img src=\"logo.gif\" ALT=\"Logo\"><BR>\n", ctime(&WriteTime)); fprintf(file, "Programmed by David Hinkle, Commissioned by <a href=\"http://www.derbytech.com\">DerbyTech</a> wireless networking.<BR>"); fprintf(file, "<BR>\n - <a href=\"index.html\">Daily</a> -- <a href=\"index2.html\">Weekly</a> -- "); fprintf(file, "<a href=\"index3.html\">Monthly</a> -- <a href=\"index4.html\">Yearly</a> - <BR>\n"); fprintf(file, "<BR>\nPick a Subnet:<BR>\n"); if (config.tag == '1') fprintf(file, "- <a href=\"index.html\">Top20</a> -"); else fprintf(file, "- <a href=\"index%c.html\">Top20</a> -", config.tag); for (Counter = 0; Counter < SubnetCount; Counter++) { HostIp2CharIp(SubnetTable[Counter].ip, Buffer1); fprintf(file, "- <a href=\"Subnet-%c-%s.html\">%s</a> -", config.tag, Buffer1, Buffer1); } ///// TOP 20 fprintf(file, "<H1>Top 20 IPs by Traffic - %s</H1></center>", PeriodDesc); fprintf(file, "<center>\n<table width=\"100%%\" border=1 cellspacing=0>\n"); // PASS 1: Write out the table fprintf(file, "<TR bgcolor=lightblue><TD>Ip and Name<TD align=center>Total<TD align=center>Total Sent<TD align=center>Total Received<TD align=center>FTP<TD align=center>HTTP<TD align=center>P2P<TD align=center>TCP<TD align=center>UDP<TD align=center>ICMP\n"); for (Counter=0; Counter < 21 && Counter < NumIps; Counter++) PrintTableLine(file, SummaryData[Counter], Counter); fprintf(file, "</table></center>\n"); // PASS 2: The graphs for (Counter=0; Counter < 21 && Counter < NumIps; Counter++) if (SummaryData[Counter]->Graph) { if (SummaryData[Counter]->IP == 0) { strcpy(Buffer1, "Total"); strcpy(HostName, "Total of all subnets"); } else { HostIp2CharIp(SummaryData[Counter]->IP, Buffer1); rdns(HostName, SummaryData[Counter]->IP); } fprintf(file, "<a name=\"%s-%c\"></a><H1><a href=\"#top\">(Top)</a> %s - %s</H1><BR>\nSend:<br>\n<img src=%s-%c-S.png ALT=\"Sent traffic for %s\"><BR>\n<img src=legend.gif ALT=\"Legend\"><br>\nReceived:<br>\n<img src=%s-%c-R.png ALT=\"Sent traffic for %s\"><BR>\n<img src=legend.gif ALT=\"Legend\"><br>\n<BR>\n", Buffer1, config.tag, Buffer1, HostName, Buffer1, config.tag, Buffer1, Buffer1, config.tag, Buffer1); } fprintf(file, "</BODY></HTML>\n"); fclose(file); //////////////////////////////////////////////// // Print each subnet page for (SubnetCounter = 0; SubnetCounter < SubnetCount; SubnetCounter++) { HostIp2CharIp(SubnetTable[SubnetCounter].ip, Buffer1);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -