|
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)
|