Blame contrib/mrtglog/mrtglog.c

Packit 667938
/*****************************
Packit 667938
 ** woho's MRTG Logfile cgi **
Packit 667938
 *****************************/
Packit 667938
#define VERSION "1.2"
Packit 667938
#include "./mrtglog.h"
Packit 667938
#include <time.h>
Packit 667938
#include <stdio.h>
Packit 667938
Packit 667938
typedef struct
Packit 667938
{
Packit 667938
time_t t;
Packit 667938
float in;
Packit 667938
float out;
Packit 667938
}	mrtg;
Packit 667938
Packit 667938
int str2time(char *s);
Packit 667938
signed long runden(float zahl);
Packit 667938
Packit 667938
/************************************/
Packit 667938
int main(int argc, char *argv[])
Packit 667938
{
Packit 667938
mrtg	ar[3000];
Packit 667938
int i, y, a1, a2, a3, a4 , a5, diff,
Packit 667938
    newmon, oldmon=13, year;
Packit 667938
char s[128], *str, *ctmp, *start, *stop, *log,
Packit 667938
     ch, ch2, ch3, hex[8];
Packit 667938
time_t t1, t2;
Packit 667938
struct tm *zeit;
Packit 667938
float  IN, OUT, ISUM=0, OSUM=0;
Packit 667938
FILE *fp;
Packit 667938
Packit 667938
if (argc==4)
Packit 667938
 {
Packit 667938
 start = argv[1];
Packit 667938
 stop  = argv[2];
Packit 667938
 log   = argv[3];
Packit 667938
 }
Packit 667938
else
Packit 667938
 {
Packit 667938
 ctmp = (char *) getenv("QUERY_STRING");
Packit 667938
//printf("%sQUERY_STRING: '%s'\n",HTMLHEAD,ctmp);
Packit 667938
 if (ctmp)
Packit 667938
  {
Packit 667938
  y = strlen(ctmp) + 1;
Packit 667938
  str = (char *)malloc (y * sizeof(char));
Packit 667938
  *str = '\0';
Packit 667938
  for (i = 0; i < strlen(ctmp); i++)
Packit 667938
   {
Packit 667938
   ch = ctmp[i];
Packit 667938
//   fflush (stdout);
Packit 667938
   if (ctmp[i] == '+') ch = ' ';
Packit 667938
   if (ctmp[i] == '%')
Packit 667938
    {
Packit 667938
    ch2 = ctmp[i+1];
Packit 667938
    ch3 = ctmp[i+2];
Packit 667938
    i += 2;
Packit 667938
    snprintf (hex, sizeof(hex), "%c%c", ch2, ch3);
Packit 667938
    ch = strtol (hex, NULL, 16);
Packit 667938
    if ((ch == 10) || (ch == 13)) ch = ' ';
Packit 667938
    }
Packit 667938
   snprintf (&str[strlen(str)], y-strlen(str),"%c",ch);
Packit 667938
   }
Packit 667938
  while (str)
Packit 667938
   { 
Packit 667938
   ctmp = str;
Packit 667938
   while (*ctmp != '=' && *ctmp != '&')  { *ctmp = tolower (*ctmp); ctmp++; }
Packit 667938
   if ((char *)strstr(str,"start") == str)
Packit 667938
    {
Packit 667938
    start = ctmp+1;
Packit 667938
    ctmp = (char *) strchr(start, '&';;
Packit 667938
    }
Packit 667938
   else if ((char *)strstr(str,"stop") == str)
Packit 667938
    {
Packit 667938
    stop = ctmp+1;
Packit 667938
    ctmp = (char *) strchr(stop, '&';;
Packit 667938
    }
Packit 667938
   else if ((char *)strstr(str,"log") == str)
Packit 667938
    {
Packit 667938
    log = ctmp+1;
Packit 667938
    ctmp = (char *) strchr(log, '&';;
Packit 667938
    }
Packit 667938
   else { printf("%sParameter '%s' Fehlerhaft\n",HTMLHEAD,str); exit(1); }
Packit 667938
   if (ctmp) { str = ctmp+1; *ctmp = '\0'; }
Packit 667938
   else str = NULL;
Packit 667938
   }
Packit 667938
  }
Packit 667938
 }
Packit 667938
Packit 667938
if  (!start || !stop || !log)
Packit 667938
 {
Packit 667938
 printf("%sUsage: mrtglog 01/05/03 31/05/03 mrtg.log # Count all traffic in May 2003\n",HTMLHEAD);
Packit 667938
 exit(1);
Packit 667938
 }
Packit 667938
Packit 667938
i = y = IN = OUT = 0;
Packit 667938
t1 = str2time(start);
Packit 667938
t2 = str2time(stop);
Packit 667938
sprintf(s,"%s%s.log",PFAD,log);
Packit 667938
fp = fopen(s,"r");
Packit 667938
if (fp)
Packit 667938
 {
Packit 667938
 while (fgets(s, 100, fp))
Packit 667938
    {
Packit 667938
	if (sscanf(s, "%d %d %d %d %d\n", &a1, &a2, &a3, &a4, &a5) == 5)
Packit 667938
	    {
Packit 667938
		ar[y].t   = a1;
Packit 667938
		ar[y].in  = a2;
Packit 667938
		ar[y].out = a3;
Packit 667938
		y++;
Packit 667938
	    }
Packit 667938
    }
Packit 667938
 fclose(fp);
Packit 667938
 }
Packit 667938
else { printf("%scan't open '%s'!\n",HTMLHEAD,s); exit(1); }
Packit 667938
Packit 667938
str = (char *) strrchr(log,'/');
Packit 667938
if (str) *str++;
Packit 667938
else str = log;
Packit 667938
if (ctmp = (char *) strstr(str,".log")) *ctmp=0;
Packit 667938
Packit 667938
printf("%s<HTML>\n<HEAD>\n<TITLE>%s %s %s %s %s %s</TITLE>\n"
Packit 667938
"<STYLE TYPE=\"text/css\">\n
Packit 667938
body {font-family:Arial,Helvetica; font-size:10pt;}\n\
Packit 667938
table,tr,td,th {font-family:Arial,Helvetica; font-size:10pt;}\n\
Packit 667938
pre {font-family:Courier; font-size:10pt;}\n\
Packit 667938
p {font-family:Arial,Helvetica; font-size:10pt;}\n\
Packit 667938
ul,ol,li {font-family:Arial,Helvetica; font-size:10pt;}\n\
Packit 667938
dt {font-family:Arial,Helvetica; font-size:10pt;}\n\
Packit 667938
dd {font-family:Arial,Helvetica; font-size:10pt;}\n\
Packit 667938
address {font-family:Arial,Helvetica; font-size:8pt; font-style:italic;}\n\
Packit 667938
h1 { font-family:Avantgarde,Arial,Helvetica; font-size:24pt; font-weight:bold;}\n\
Packit 667938
h2 { font-family:Avantgarde,Arial,Helvetica; font-size:18pt; font-weight:bold;}\n\
Packit 667938
h3 { font-family:Avantgarde,Arial,Helvetica; font-size:12pt; font-weight:bold;}\n\
Packit 667938
h4 { font-family:Avantgarde,Arial,Helvetica; font-size:10pt; font-weight:bold;}\n\
Packit 667938
h5,h6 { font-family:Avantgarde,Aria,Helvetical; font-size:10pt; font-style:italic;}\n\
Packit 667938
.small {font-family:Arial,Helvetica; font-size:8pt;}\n\
Packit 667938
.normal {font-family:Arial,Helvetica; font-size:10pt;}\n\
Packit 667938
#rot { color:#FF0000; }\n\
Packit 667938
#gruen { color:#00a000; }\n\
Packit 667938
#normal { color:#000000; }\n\
Packit 667938
-->\n</STYLE>\n</HEAD>\n\
Packit 667938
<BODY BGCOLOR=\"#FFFFFF\">\n\
Packit 667938
\n\
Packit 667938

%s

\n\
Packit 667938

%s %s %s %s %s

\n\
Packit 667938
INOUTTOTAL\n",
Packit 667938
HTMLHEAD,str,STATS,FROM,start,TO,stop,str,STATS,FROM,start,TO,stop);
Packit 667938
Packit 667938
for (i = 0; i < y; i++)
Packit 667938
 {
Packit 667938
 if ((t1 <= ar[i].t) && (ar[i].t <= t2))
Packit 667938
  {
Packit 667938
  zeit = gmtime((const time_t *)&ar[i].t);
Packit 667938
  newmon = zeit->tm_mon;
Packit 667938
  if ((oldmon != 13 && newmon != oldmon) || i+1 == y)
Packit 667938
   {
Packit 667938
   if (i+1 == y)
Packit 667938
    {
Packit 667938
    diff = ar[i].t - ar[i+1].t;
Packit 667938
    IN  = IN  + ar[i].in  * diff;
Packit 667938
    OUT = OUT + ar[i].out * diff;
Packit 667938
    }
Packit 667938
   if (IN == 0 && OUT == 0) break;
Packit 667938
   ISUM += IN; OSUM += OUT;
Packit 667938
   printf("%04i/%i%d MB%d MB%d MB\n",
Packit 667938
          year+1900,oldmon+1,runden(IN/1024/1024),runden(OUT/1024/1024),runden((IN+OUT)/1024/1024));
Packit 667938
   IN = OUT = 0;
Packit 667938
   }
Packit 667938
  if (i+1 < y)
Packit 667938
   {
Packit 667938
   oldmon = newmon;
Packit 667938
   year = zeit->tm_year;
Packit 667938
   diff = ar[i].t - ar[i+1].t;
Packit 667938
   IN  = IN  + ar[i].in  * diff;
Packit 667938
   OUT = OUT + ar[i].out * diff;
Packit 667938
   }
Packit 667938
  }
Packit 667938
 }
Packit 667938
/*if (IN != 0 || OUT != 0)
Packit 667938
 {
Packit 667938
 ISUM += IN; OSUM += OUT;
Packit 667938
 printf("%04i/%i%d MB%d MB%d MB\n",
Packit 667938
        year+1900,oldmon+1,runden(IN/1024/1024),runden(OUT/1024/1024),runden((IN+OUT)/1024/1024));
Packit 667938
 }*/
Packit 667938
printf("TOTAL%d MB%d MB%d MB\n\
Packit 667938
\n<FORM ACTION=\"%s\" method=\"GET\">\n\
Packit 667938
von <INPUT NAME=\"START\" TYPE=\"text\" VALUE=\"%s\" SIZE=\"10\" MAXLENGTH=\"8\">\n\
Packit 667938
bis <INPUT NAME=\"STOP\" TYPE=\"text\" VALUE=\"%s\" SIZE=\"10\" MAXLENGTH=\"8\">\n\
Packit 667938
<INPUT NAME=\"LOG\" TYPE=\"hidden\" VALUE=\"%s\">\n\
Packit 667938
<INPUT TYPE=\"submit\" VALUE=\"Aktualisieren\">\n\
Packit 667938
</FORM>\n

%s\n\n\

Packit 667938
<CLASS=\"small\">mrtglog %s, copyleft 2000 by http://www.netpark.at\n</BODY>\n</HTML>",
Packit 667938
runden(ISUM/1024/1024),runden(OSUM/1024/1024),runden((ISUM+OSUM)/1024/1024),
Packit 667938
argv[0],start,stop,log,INFOTEXT,VERSION);
Packit 667938
return 0;
Packit 667938
}
Packit 667938
Packit 667938
/************************************/
Packit 667938
int str2time(char *s)
Packit 667938
{
Packit 667938
    struct tm  tim;
Packit 667938
    int d, m, y;
Packit 667938
    if (sscanf(s, "%d.%d.%d", &d, &m, &y) != 3)
Packit 667938
     { printf("%scant convert %s to date\n",HTMLHEAD, s); exit(10); }
Packit 667938
    if (y < 100) y = y + 2000;    
Packit 667938
    tim.tm_sec = tim.tm_min = tim.tm_hour = 0;
Packit 667938
    tim.tm_mday = d;
Packit 667938
    tim.tm_mon  = m - 1;
Packit 667938
    tim.tm_year = y - 1900;
Packit 667938
    return mktime(&tim);
Packit 667938
}
Packit 667938
Packit 667938
/************************************/
Packit 667938
signed long runden(float zahl)
Packit 667938
{
Packit 667938
signed long basis, nachkomma;
Packit 667938
Packit 667938
if (!zahl) return 0;
Packit 667938
basis = zahl;
Packit 667938
if ((nachkomma = labs((zahl-basis)*10)) == 0) return basis;
Packit 667938
if (nachkomma > 5) { if (basis > 0) return ++basis; else return --basis; }
Packit 667938
else
Packit 667938
 if (nachkomma < 5) return basis;
Packit 667938
 else
Packit 667938
  {
Packit 667938
  nachkomma = labs((zahl-basis)*100);
Packit 667938
  if (nachkomma > 50) { if (basis > 0) return ++basis; else return --basis; }
Packit 667938
  else
Packit 667938
   if (nachkomma < 50) return basis;
Packit 667938
   else
Packit 667938
    {
Packit 667938
    nachkomma = labs((zahl-basis)*1000);
Packit 667938
    if (nachkomma > 500) { if (basis > 0) return ++basis; else return --basis; }
Packit 667938
    else
Packit 667938
     if (nachkomma < 500) return basis;
Packit 667938
     else
Packit 667938
      {
Packit 667938
      nachkomma = labs((zahl-basis)*10000);
Packit 667938
      if (nachkomma > 5000) { if (basis > 0) return ++basis; else return --basis; }
Packit 667938
      else if (nachkomma < 5000) return basis;
Packit 667938
      else return basis;
Packit 667938
      }
Packit 667938
    }
Packit 667938
  }
Packit 667938
}
Packit 667938
// and in the end, the love you take, is equal to the love you make. (John Lennon)