mrtglog.c
上传用户:shbosideng
上传日期:2013-05-04
资源大小:1555k
文件大小:7k
源码类别:

SNMP编程

开发平台:

C/C++

  1. /*****************************
  2.  ** woho's MRTG Logfile cgi **
  3.  *****************************/
  4. #define VERSION "1.2"
  5. #include "./mrtglog.h"
  6. #include <time.h>
  7. #include <stdio.h>
  8. typedef struct
  9. {
  10. time_t t;
  11. float in;
  12. float out;
  13. } mrtg;
  14. int str2time(char *s);
  15. signed long runden(float zahl);
  16. /************************************/
  17. int main(int argc, char *argv[])
  18. {
  19. mrtg ar[3000];
  20. int i, y, a1, a2, a3, a4 , a5, diff,
  21.     newmon, oldmon=13, year;
  22. char s[128], *str, *ctmp, *start, *stop, *log,
  23.      ch, ch2, ch3, hex[8];
  24. time_t t1, t2;
  25. struct tm *zeit;
  26. float  IN, OUT, ISUM=0, OSUM=0;
  27. FILE *fp;
  28. if (argc==4)
  29.  {
  30.  start = argv[1];
  31.  stop  = argv[2];
  32.  log   = argv[3];
  33.  }
  34. else
  35.  {
  36.  ctmp = (char *) getenv("QUERY_STRING");
  37. //printf("%sQUERY_STRING: '%s'n",HTMLHEAD,ctmp);
  38.  if (ctmp)
  39.   {
  40.   y = strlen(ctmp) + 1;
  41.   str = (char *)malloc (y * sizeof(char));
  42.   *str = '';
  43.   for (i = 0; i < strlen(ctmp); i++)
  44.    {
  45.    ch = ctmp[i];
  46. //   fflush (stdout);
  47.    if (ctmp[i] == '+') ch = ' ';
  48.    if (ctmp[i] == '%')
  49.     {
  50.     ch2 = ctmp[i+1];
  51.     ch3 = ctmp[i+2];
  52.     i += 2;
  53.     snprintf (hex, sizeof(hex), "%c%c", ch2, ch3);
  54.     ch = strtol (hex, NULL, 16);
  55.     if ((ch == 10) || (ch == 13)) ch = ' ';
  56.     }
  57.    snprintf (&str[strlen(str)], y-strlen(str),"%c",ch);
  58.    }
  59.   while (str)
  60.    { 
  61.    ctmp = str;
  62.    while (*ctmp != '=' && *ctmp != '&')  { *ctmp = tolower (*ctmp); ctmp++; }
  63.    if ((char *)strstr(str,"start") == str)
  64.     {
  65.     start = ctmp+1;
  66.     ctmp = (char *) strchr(start, '&');
  67.     }
  68.    else if ((char *)strstr(str,"stop") == str)
  69.     {
  70.     stop = ctmp+1;
  71.     ctmp = (char *) strchr(stop, '&');
  72.     }
  73.    else if ((char *)strstr(str,"log") == str)
  74.     {
  75.     log = ctmp+1;
  76.     ctmp = (char *) strchr(log, '&');
  77.     }
  78.    else { printf("%sParameter '%s' Fehlerhaftn",HTMLHEAD,str); exit(1); }
  79.    if (ctmp) { str = ctmp+1; *ctmp = ''; }
  80.    else str = NULL;
  81.    }
  82.   }
  83.  }
  84. if  (!start || !stop || !log)
  85.  {
  86.  printf("%sUsage: mrtglog 01/05/03 31/05/03 mrtg.log # Count all traffic in May 2003n",HTMLHEAD);
  87.  exit(1);
  88.  }
  89. i = y = IN = OUT = 0;
  90. t1 = str2time(start);
  91. t2 = str2time(stop);
  92. sprintf(s,"%s%s.log",PFAD,log);
  93. fp = fopen(s,"r");
  94. if (fp)
  95.  {
  96.  while (fgets(s, 100, fp))
  97.     {
  98. if (sscanf(s, "%d %d %d %d %dn", &a1, &a2, &a3, &a4, &a5) == 5)
  99.     {
  100. ar[y].t   = a1;
  101. ar[y].in  = a2;
  102. ar[y].out = a3;
  103. y++;
  104.     }
  105.     }
  106.  fclose(fp);
  107.  }
  108. else { printf("%scan't open '%s'!n",HTMLHEAD,s); exit(1); }
  109. str = (char *) strrchr(log,'/');
  110. if (str) *str++;
  111. else str = log;
  112. if (ctmp = (char *) strstr(str,".log")) *ctmp=0;
  113. printf("%s<HTML>n<HEAD>n<TITLE>%s %s %s %s %s %s</TITLE>n"
  114. "<STYLE TYPE="text/css">n<!--n
  115. body {font-family:Arial,Helvetica; font-size:10pt;}n
  116. table,tr,td,th {font-family:Arial,Helvetica; font-size:10pt;}n
  117. pre {font-family:Courier; font-size:10pt;}n
  118. p {font-family:Arial,Helvetica; font-size:10pt;}n
  119. ul,ol,li {font-family:Arial,Helvetica; font-size:10pt;}n
  120. dt {font-family:Arial,Helvetica; font-size:10pt;}n
  121. dd {font-family:Arial,Helvetica; font-size:10pt;}n
  122. address {font-family:Arial,Helvetica; font-size:8pt; font-style:italic;}n
  123. h1 { font-family:Avantgarde,Arial,Helvetica; font-size:24pt; font-weight:bold;}n
  124. h2 { font-family:Avantgarde,Arial,Helvetica; font-size:18pt; font-weight:bold;}n
  125. h3 { font-family:Avantgarde,Arial,Helvetica; font-size:12pt; font-weight:bold;}n
  126. h4 { font-family:Avantgarde,Arial,Helvetica; font-size:10pt; font-weight:bold;}n
  127. h5,h6 { font-family:Avantgarde,Aria,Helvetical; font-size:10pt; font-style:italic;}n
  128. .small {font-family:Arial,Helvetica; font-size:8pt;}n
  129. .normal {font-family:Arial,Helvetica; font-size:10pt;}n
  130. #rot { color:#FF0000; }n
  131. #gruen { color:#00a000; }n
  132. #normal { color:#000000; }n
  133. -->n</STYLE>n</HEAD>n
  134. <BODY BGCOLOR="#FFFFFF">n
  135. <TABLE CELLSPANNING=10 CELLPADDING=5 CELLSPACING=0 BGCOLOR=#D5FFD5 BORDER=1>n
  136. <TR><TD COLSPAN=4 ALIGN=CENTER><H1 ID="rot">%s</H1>n
  137. <H3>%s %s %s %s %s</H3></TD></TR>n
  138. <TR><TH COLSPAN=2  ALIGN=RIGHT>IN</TH><TH ALIGN=RIGHT>OUT</TH><TH ALIGN=RIGHT>TOTAL</TH></TR>n",
  139. HTMLHEAD,str,STATS,FROM,start,TO,stop,str,STATS,FROM,start,TO,stop);
  140. for (i = 0; i < y; i++)
  141.  {
  142.  if ((t1 <= ar[i].t) && (ar[i].t <= t2))
  143.   {
  144.   zeit = gmtime((const time_t *)&ar[i].t);
  145.   newmon = zeit->tm_mon;
  146.   if ((oldmon != 13 && newmon != oldmon) || i+1 == y)
  147.    {
  148.    if (i+1 == y)
  149.     {
  150.     diff = ar[i].t - ar[i+1].t;
  151.     IN  = IN  + ar[i].in  * diff;
  152.     OUT = OUT + ar[i].out * diff;
  153.     }
  154.    if (IN == 0 && OUT == 0) break;
  155.    ISUM += IN; OSUM += OUT;
  156.    printf("<TR><TD ALIGN=RIGHT>%04i/%i</TD><TD ALIGN=RIGHT>%d MB</TD><TD ALIGN=RIGHT>%d MB</TD><TD ALIGN=RIGHT>%d MB</TD></TR>n",
  157.           year+1900,oldmon+1,runden(IN/1024/1024),runden(OUT/1024/1024),runden((IN+OUT)/1024/1024));
  158.    IN = OUT = 0;
  159.    }
  160.   if (i+1 < y)
  161.    {
  162.    oldmon = newmon;
  163.    year = zeit->tm_year;
  164.    diff = ar[i].t - ar[i+1].t;
  165.    IN  = IN  + ar[i].in  * diff;
  166.    OUT = OUT + ar[i].out * diff;
  167.    }
  168.   }
  169.  }
  170. /*if (IN != 0 || OUT != 0)
  171.  {
  172.  ISUM += IN; OSUM += OUT;
  173.  printf("<TR><TD ALIGN=RIGHT>%04i/%i</TD><TD ALIGN=RIGHT>%d MB</TD><TD ALIGN=RIGHT>%d MB</TD><TD ALIGN=RIGHT>%d MB</TD></TR>n",
  174.         year+1900,oldmon+1,runden(IN/1024/1024),runden(OUT/1024/1024),runden((IN+OUT)/1024/1024));
  175.  }*/
  176. printf("<TR><TD ALIGN=RIGHT><B>TOTAL</B></TD><TD ALIGN=RIGHT>%d MB</TD><TD ALIGN=RIGHT>%d MB</TD><TD ALIGN=RIGHT>%d MB</TD></TR>n
  177. <TR><TD COLSPAN=4 WIDH=100%>n<FORM ACTION="%s" method="GET">n
  178. von <INPUT NAME="START" TYPE="text" VALUE="%s" SIZE="10" MAXLENGTH="8">n
  179. bis <INPUT NAME="STOP" TYPE="text" VALUE="%s" SIZE="10" MAXLENGTH="8">n
  180. <INPUT NAME="LOG" TYPE="hidden" VALUE="%s">n
  181. <INPUT TYPE="submit" VALUE="Aktualisieren">n
  182. </FORM>n<P ALIGN=JUSTIFY CLASS="small">%s</TD></TR>n</TABLE>n
  183. <CLASS="small">mrtglog %s, copyleft 2000 by <A HREF="http://www.netpark.at">http://www.netpark.at</A>n</BODY>n</HTML>",
  184. runden(ISUM/1024/1024),runden(OSUM/1024/1024),runden((ISUM+OSUM)/1024/1024),
  185. argv[0],start,stop,log,INFOTEXT,VERSION);
  186. return 0;
  187. }
  188. /************************************/
  189. int str2time(char *s)
  190. {
  191.     struct tm  tim;
  192.     int d, m, y;
  193.     if (sscanf(s, "%d.%d.%d", &d, &m, &y) != 3)
  194.      { printf("%scant convert %s to daten",HTMLHEAD, s); exit(10); }
  195.     if (y < 100) y = y + 2000;    
  196.     tim.tm_sec = tim.tm_min = tim.tm_hour = 0;
  197.     tim.tm_mday = d;
  198.     tim.tm_mon  = m - 1;
  199.     tim.tm_year = y - 1900;
  200.     return mktime(&tim);
  201. }
  202. /************************************/
  203. signed long runden(float zahl)
  204. {
  205. signed long basis, nachkomma;
  206. if (!zahl) return 0;
  207. basis = zahl;
  208. if ((nachkomma = labs((zahl-basis)*10)) == 0) return basis;
  209. if (nachkomma > 5) { if (basis > 0) return ++basis; else return --basis; }
  210. else
  211.  if (nachkomma < 5) return basis;
  212.  else
  213.   {
  214.   nachkomma = labs((zahl-basis)*100);
  215.   if (nachkomma > 50) { if (basis > 0) return ++basis; else return --basis; }
  216.   else
  217.    if (nachkomma < 50) return basis;
  218.    else
  219.     {
  220.     nachkomma = labs((zahl-basis)*1000);
  221.     if (nachkomma > 500) { if (basis > 0) return ++basis; else return --basis; }
  222.     else
  223.      if (nachkomma < 500) return basis;
  224.      else
  225.       {
  226.       nachkomma = labs((zahl-basis)*10000);
  227.       if (nachkomma > 5000) { if (basis > 0) return ++basis; else return --basis; }
  228.       else if (nachkomma < 5000) return basis;
  229.       else return basis;
  230.       }
  231.     }
  232.   }
  233. }
  234. // and in the end, the love you take, is equal to the love you make. (John Lennon)