2 * SARG Squid Analysis Report Generator http://sarg.sourceforge.net
6 * please look at http://sarg.sourceforge.net/donations.php
8 * http://sourceforge.net/projects/sarg/forums/forum/363374
9 * ---------------------------------------------------------------------
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
27 #include "include/conf.h"
28 #include "include/defs.h"
30 static void maketmp(const char *user
, const char *dirname
, int debug
, int indexonly
);
31 static void maketmp_hour(const char *user
, const char *dirname
, int indexonly
);
32 static void gravatmp_hora(const char *dirname
, const char *user
, const char *data
, const char *hora
, long long int elap
, long long int accbytes
, int indexonly
);
33 static void gravatmpf(const char *oldaccuser
, const char *dirname
, const char *oldurl
, long long int nacc
, long long int nbytes
, const char *oldmsg
, long long int nelap
, int indexonly
, long long int incache
, long long int oucache
);
34 static void gravaporuser(const char *user
, const char *dirname
, const char *url
, const char *ip
, const char *data
, const char *hora
, long long int tam
, long long int elap
, int indexonly
);
35 static void gravager(FILE *fp_gen
, const char *user
, long long int nacc
, const char *url
, long long int nbytes
, const char *ip
, const char *hora
, const char *dia
, long long int nelap
, long long int incache
, long long int oucache
);
36 static void grava_SmartFilter(const char *dirname
, const char *user
, const char *ip
, const char *data
, const char *hora
, const char *url
, const char *smart
);
44 char accdia
[11], acchora
[9], accuser
[MAXLEN
], accip
[MAXLEN
], accurl
[MAXLEN
];
45 char oldaccdia
[11], oldacchora
[9], oldaccip
[MAXLEN
];
46 char wdirname
[MAXLEN
], oldurl
[MAXLEN
], oldaccuser
[MAXLEN
];
47 char olduser
[MAXLEN
], oldmsg
[50], acccode
[MAXLEN
/2 - 1], oldacccode
[MAXLEN
/2 - 1], user
[MAXLEN
];
48 char ipantes
[MAXLEN
], nameantes
[MAXLEN
];
49 char accsmart
[MAXLEN
];
50 char crc2
[MAXLEN
/2 -1];
51 long long int nbytes
=0;
52 long long int nelap
=0;
54 long long int rtotal
=0;
55 long long int incache
=0;
56 long long int oucache
=0;
57 long long int accbytes
, accelap
;
60 struct dirent
*direntp
;
61 const char logext
[]=".log";
64 struct getwordstruct gwarea
;
70 sprintf(dirname
, "%s%s", outdir
, period
);
71 vrfydir(period
, addr
, site
, us
, email
);
74 debugaz("dirname",dirname
);
77 gperiod(dirname
,period
);
79 if(UserAgentLog
[0] != '\0' && email
[0] == '\0') useragent();
81 sprintf(wdirname
,"%s/sarg-general",dirname
);
82 if((fp_gen
=MY_FOPEN(wdirname
,"a"))==NULL
){
83 fprintf(stderr
, "SARG: (report) %s: %s\n",text
[45],wdirname
);
88 strncat(tmp
,"/sarg",5);
91 while ((direntp
= readdir( dirp
)) != NULL
) {
92 dlen
=strlen(direntp
->d_name
)-(sizeof(logext
)-1);
94 if((strcmp(direntp
->d_name
+dlen
,logext
) != 0) ||
95 (strncmp(direntp
->d_name
,"download.log",12) == 0) ||
96 (strncmp(direntp
->d_name
,"denied.log",10) == 0) ||
97 (strncmp(direntp
->d_name
,"authfail.log.unsort",19) == 0))
99 if (snprintf(tmp3
,sizeof(tmp3
),"%s/%s",tmp
,direntp
->d_name
)>=sizeof(tmp3
)) {
100 fprintf(stderr
, "SARG: (report) directory entry too long: %s/%s\n",tmp
,direntp
->d_name
);
103 if((fp_in
=MY_FOPEN(tmp3
,"r"))==NULL
){
104 fprintf(stderr
, "SARG: (report) %s: %s\n",text
[45],tmp
);
109 if (dlen
>=sizeof(user
)) continue;
110 strncpy(user
,direntp
->d_name
,dlen
);
116 strcpy(wdirname
,dirname
);
117 maketmp(user
,tmp
,debug
,indexonly
);
118 maketmp_hour(user
,tmp
,indexonly
);
122 ip2name(u2
,sizeof(u2
));
123 user_find(name
,sizeof(name
), u2
);
125 if(dotinuser
&& strchr(name
,'_')) {
126 subs(name
,sizeof(name
),"_",".");
130 bzero(html_old
, MAXLEN
);
132 while(fgets(buf
,sizeof(buf
),fp_in
)!=NULL
) {
133 getword_start(&gwarea
,buf
);
134 if (getword(accdia
,sizeof(accdia
),&gwarea
,'\t')<0 || getword(acchora
,sizeof(acchora
),&gwarea
,'\t')<0 ||
135 getword(accuser
,sizeof(accuser
),&gwarea
,'\t')<0 || getword(accip
,sizeof(accip
),&gwarea
,'\t')<0 ||
136 getword(accurl
,sizeof(accurl
),&gwarea
,'\t')<0 || getword_atoll(&accbytes
,&gwarea
,'\t')<0 ||
137 getword(acccode
,sizeof(acccode
),&gwarea
,'\t')<0) {
138 printf("SARG: Maybe you have a broken record or garbage in your %s file (%d).\n",tmp3
,__LINE__
);
141 if(strncmp(acccode
,"TCP_DENIED/407",14) == 0) continue;
142 if (getword_atoll(&accelap
,&gwarea
,'\t')<0 || getword_skip(20000,&gwarea
,'\t')<0) {
143 printf("SARG: Maybe you have a broken elapsed time in your %s file (%d).\n",tmp3
,__LINE__
);
146 if (getword(accsmart
,sizeof(accsmart
),&gwarea
,'"')<0) {
147 printf("SARG: Maybe you have a broken smart info in your %s file (%d).\n",tmp3
,__LINE__
);
151 if(accsmart
[0] != '\0') {
153 strcpy(wdirname
,dirname
);
154 grava_SmartFilter(wdirname
,accuser
,accip
,accdia
,acchora
,accurl
,accsmart
);
158 if(strcmp(accip
,ipantes
) != 0) {
159 strcpy(ipantes
,accip
);
160 ip2name(accip
,sizeof(accip
));
161 strcpy(nameantes
,accip
);
162 } else strcpy(accip
,nameantes
);
165 strcpy(wdirname
,dirname
);
166 gravatmp_hora(wdirname
,accuser
,accdia
,acchora
,accelap
,accbytes
,indexonly
);
169 strcpy(wdirname
,dirname
);
170 gravaporuser(accuser
,wdirname
,accurl
,accip
,accdia
,acchora
,accbytes
,accelap
,indexonly
);
174 strcpy(oldurl
,accurl
);
175 strcpy(oldacccode
,acccode
);
176 strcpy(oldaccuser
,accuser
);
177 strcpy(oldaccip
,accip
);
178 strcpy(oldaccdia
,accdia
);
179 strcpy(oldacchora
,acchora
);
183 if(site
[0] != '\0') {
184 if(strcmp(oldaccuser
,accuser
) != 0){
186 if(strstr(oldacccode
,"DENIED") != 0)
187 sprintf(oldmsg
,"%s",text
[46]);
188 gravatmp(oldaccuser
,oldurl
,nacc
,nbytes
,oldmsg
,nelap
,indexonly
,incache
,oucache
);
189 gravager(fp_gen
,oldaccuser
,nacc
,oldurl
,nbytes
,oldaccip
,oldacchora
,oldaccdia
,nelap
,incache
,oucache
);
197 if(strcmp(oldurl
,accurl
) != 0 || strcmp(oldaccuser
,accuser
) != 0){
199 if(strstr(oldacccode
,"DENIED") != 0)
200 sprintf(oldmsg
,"%s",text
[46]);
201 gravatmp(oldaccuser
,oldurl
,nacc
,nbytes
,oldmsg
,nelap
,indexonly
,incache
,oucache
);
202 gravager(fp_gen
,oldaccuser
,nacc
,oldurl
,nbytes
,oldaccip
,oldacchora
,oldaccdia
,nelap
,incache
,oucache
);
208 if(strcmp(oldaccuser
,accuser
) != 0)
216 if((ReportType
& REPORT_TYPE_SITE_USER_TIME_DATE
) != 0) {
219 strcpy(siteind
,accurl
);
220 for(str
=siteind
; *str
; str
++) {
221 if(*str
=='?' || *str
=='-' || *str
=='.' || *str
==':' || *str
=='/' || *str
=='\\' || *str
=='*' ||
222 *str
=='\'' || *str
=='\"' || *str
=='$' || *str
=='@')
225 sprintf(arqtt
,"%s/%s",dirname
,accuser
);
226 if(access(arqtt
, R_OK
) != 0)
228 sprintf(arqtt
,"%s/%s/tt%s-%s.html",dirname
,accuser
,accuser
,siteind
);
229 if(strlen(arqtt
) > 255) {
232 if ((fp_tt
= fopen(arqtt
, "w")) == 0) {
233 fprintf(stderr
, "SARG: (report) %s: %s\n",text
[45],arqtt
);
240 sprintf(httplink,"<font size=%s color=%s><href=http://%s>%s", \
241 FontSize,PrivacyStringColor,PrivacyString,PrivacyString);
243 sprintf(httplink,"<font size=%s><a href=\"http://%s\">%s</a>",FontSize,accurl,accurl);
246 sprintf(ltext110
,"%s",text
[110]);
247 for(str
=ltext110
; *str
; ++str
)
250 fprintf(fp_tt
, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=%s\">\n",CharSet
);
252 fputs("</head>\n",fp_tt
);
253 fprintf(fp_tt
,"<body bgcolor=\"%s\" text=\"%s\" background=\"%s\">\n",BgColor
,TxColor
,BgImage
);
254 write_logo_image(fp_tt
);
256 if(IndexTree
== INDEX_TREE_DATE
)
257 show_sarg(fp_tt
, "../../../..");
259 show_sarg(fp_tt
, "../..");
261 fputs("<div align=\"center\"><table cellpadding=\"0\" cellspacing=\"0\">\n",fp_tt
);
262 fprintf(fp_tt
,"<tr><th class=\"title\" colspan=\"2\">%s</th></tr>\n",Title
);
264 fprintf(fp_tt
,"<tr><td class=\"header_l\" colspan=\"2\">%s: %s</td></tr>\n",text
[89],period
);
265 fprintf(fp_tt
,"<tr><td class=\"header_l\" colspan=\"2\">%s: %s</td></tr>\n",text
[90],name
);
266 fprintf(fp_tt
,"<tr><td class=\"header_l\" colspan=\"2\">%s: %s, %s</td></tr>\n",text
[104],UserSortField
,UserSortOrder
);
267 fprintf(fp_tt
,"<tr><th class=\"header_c\" colspan=\"2\">%s</th></tr>\n",text
[32]);
269 fputs("</table></div>\n",fp_tt
);
270 fputs("<div align=\"center\"><table cellpadding=\"0\" cellspacing=\"2\">\n",fp_tt
);
271 fputs("<tr><td></td><td></td></tr>",fp_tt
);
273 strncpy(tmp4
,text
[110],4);
274 fprintf(fp_tt
,"<tr><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th></tr>\n",text
[91],tmp4
,text
[110]+5);
277 sprintf(html
,"<tr><td class=\"data\">%s</td><td class=\"data\">%s</td><td class=\"data\">%s</td></tr>\n",accurl
,accdia
,acchora
);
279 if(strcmp(html
,html_old
) != 0)
281 strcpy(html_old
, html
);
282 } else bzero(ltext110
, 50);
284 strcpy(crc2
,acccode
);
285 str
=strchr(crc2
,'/');
288 if(strstr(crc2
,"MISS") != 0)
290 else incache
+=accbytes
;
292 strcpy(oldurl
,accurl
);
294 if(strcmp(accuser
,oldaccuser
) != 0) {
295 strcpy(wdirname
,dirname
);
296 day_totalize(tmp
,oldaccuser
,indexonly
);
299 strcpy(oldaccuser
,accuser
);
300 strcpy(oldacccode
,acccode
);
301 strcpy(oldaccip
,accip
);
302 strcpy(oldaccdia
,accdia
);
303 strcpy(oldacchora
,acchora
);
313 if(strstr(oldacccode
,"DENIED") != 0)
314 sprintf(oldmsg
,"%s",text
[46]);
315 strcpy(wdirname
,dirname
);
316 if(strlen(oldaccuser
) == 0)
317 strcpy(oldaccuser
,accuser
);
318 gravatmpf(oldaccuser
,wdirname
,oldurl
,nacc
,nbytes
,oldmsg
,nelap
,indexonly
,incache
,oucache
);
319 strcpy(wdirname
,dirname
);
320 gravager(fp_gen
,oldaccuser
,nacc
,oldurl
,nbytes
,oldaccip
,oldacchora
,oldaccdia
,nelap
,incache
,oucache
);
322 day_totalize(tmp
,oldaccuser
,indexonly
);
326 strcpy(wdirname
,dirname
);
327 totalger(wdirname
, debug
, outdir
);
329 if(email
[0] == '\0') {
330 if((ReportType
& REPORT_TYPE_DOWNLOADS
) != 0) download_report();
332 if(DansGuardianConf
[0] != '\0') {
333 strcpy(wdirname
,dirname
);
337 strcpy(wdirname
,dirname
);
340 strcpy(wdirname
,dirname
);
343 if((ReportType
& REPORT_TYPE_TOPSITES
) != 0) topsites();
345 if((ReportType
& REPORT_TYPE_SITES_USERS
) != 0) siteuser();
348 strcpy(wdirname
,dirname
);
351 if(smartfilter
) smartfilter_report();
353 if(DansGuardianConf
[0] != '\0') dansguardian_report();
357 if((ReportType
& REPORT_TYPE_USERS_SITES
) != 0) htmlrel();
361 if(SuccessfulMsg
) fprintf(stderr
, "SARG: %s %s\n",text
[47],dirname
);
363 strcpy(wdirname
,dirname
);
364 geramail(wdirname
, debug
, outdir
, userip
, email
, TempDir
);
366 if((strcmp(email
,"stdout") != 0) && SuccessfulMsg
)
367 fprintf(stderr
, "SARG: %s %s\n",text
[48],email
);
371 strcpy(wdirname
,dirname
);
372 index_only(wdirname
, debug
);
376 2009-10-13(Frederic) This piece of code is never called so it is commented out for good.
377 if(strlen(email) < 0)
384 static void maketmp(const char *user
, const char *dirname
, int debug
, int indexonly
)
389 char wdirname
[MAXLEN
];
391 if(indexonly
) return;
392 if((ReportType
& REPORT_TYPE_USERS_SITES
) == 0) return;
394 strcpy(wdirname
,tmp
);
395 strcat(wdirname
,"/");
396 strcat(wdirname
,user
);
399 debuga("%s: %s",text
[49],wdirname
);
402 strcat(wdirname
,".utmp");
403 if((fp_ou
=fopen(wdirname
,"w"))==NULL
){
404 fprintf(stderr
, "SARG: (report) %s: %s\n",text
[45],wdirname
);
413 static void maketmp_hour(const char *user
, const char *dirname
, int indexonly
)
418 char wdirname
[MAXLEN
];
420 if(indexonly
) return;
421 if((ReportType
& REPORT_TYPE_USERS_SITES
) == 0) return;
423 strcpy(wdirname
,tmp
);
424 strcat(wdirname
,"/");
425 strcat(wdirname
,user
);
427 strcat(wdirname
,".htmp");
428 if((fp_ou
=fopen(wdirname
,"w"))==NULL
){
429 fprintf(stderr
, "SARG: (report-1) %s: %s - %s\n",text
[45],wdirname
,strerror(errno
));
438 void gravatmp(const char *oldaccuser
, const char *oldurl
, long long int nacc
, long long int nbytes
, const char *oldmsg
, long long int nelap
, int indexonly
, long long int incache
, long long int oucache
)
447 char wdirname
[MAXLEN
];
449 if(indexonly
) return;
450 if((ReportType
& REPORT_TYPE_USERS_SITES
) == 0) return;
452 if (snprintf(wdirname
,sizeof(wdirname
),"%s/%s.utmp",tmp
,oldaccuser
)>=sizeof(wdirname
)) {
453 fprintf(stderr
,"SARG: Path too long %s/%s.utmp\n",tmp
,oldaccuser
);
457 if((fp_ou
=MY_FOPEN(wdirname
,"a"))==NULL
){
458 fprintf(stderr
, "SARG: (report) %s: %s\n",text
[45],wdirname
);
462 my_lltoa(nacc
,val1
,0);
463 my_lltoa(nbytes
,val2
,0);
464 my_lltoa(nelap
,val3
,0);
465 my_lltoa(incache
,val4
,0);
466 my_lltoa(oucache
,val5
,0);
467 fprintf(fp_ou
,"%s\t%s\t%s\t%s\t%s\t%s\t%s\n",val1
,val2
,oldurl
,oldmsg
,val3
,val4
,val5
);
473 fputs("</table>\n",fp_tt
);
474 fputs("</body>\n</html>\n",fp_tt
);
483 static void gravatmp_hora(const char *dirname
, const char *user
, const char *data
, const char *hora
, long long int elap
, long long int bytes
, int indexonly
)
487 char wdirname
[MAXLEN
];
489 if(indexonly
|| ((ReportType
& REPORT_TYPE_USERS_SITES
) == 0)) return;
491 if (snprintf(wdirname
,sizeof(wdirname
),"%s/%s.htmp",tmp
,user
)>=sizeof(wdirname
)) {
492 fprintf(stderr
,"SARG: Path too long %s/%s.htmp\n",tmp
,user
);
496 if((fp_ou
=MY_FOPEN(wdirname
,"a"))==NULL
){
497 fprintf(stderr
, "SARG: (report-2) %s: %s - %s\n",text
[45],wdirname
,strerror(errno
));
501 if(strcmp(datetimeby
,"bytes") == 0) fprintf(fp_ou
,"%s\t%s\t%lld\n",data
,hora
,bytes
);
502 else fprintf(fp_ou
,"%s\t%s\t%lld\n",data
,hora
,elap
);
510 static void gravaporuser(const char *user
, const char *dirname
, const char *url
, const char *ip
, const char *data
, const char *hora
, long long int tam
, long long int elap
, int indexonly
)
514 char wdirname
[MAXLEN
];
516 if(indexonly
|| ((ReportType
& REPORT_TYPE_USERS_SITES
) == 0)) return;
518 if (snprintf(wdirname
,sizeof(wdirname
),"%s/%s.ip",tmp
,user
)>=sizeof(wdirname
)) {
519 fprintf(stderr
,"SARG: Path too long %s/%s.ip\n",tmp
,user
);
523 if((fp_ou
=MY_FOPEN(wdirname
,"a"))==NULL
){
524 fprintf(stderr
, "SARG: (report) %s: %s\n",text
[45],wdirname
);
528 fprintf(fp_ou
,"%s\t%s\t%s\t%s\t%lld\t%lld\n",ip
,url
,data
,hora
,tam
,elap
);
537 static void gravatmpf(const char *oldaccuser
, const char *dirname
, const char *oldurl
, long long int nacc
, long long int nbytes
, const char *oldmsg
, long long int nelap
, int indexonly
, long long int incache
, long long int oucache
)
541 char wdirname
[MAXLEN
];
543 if(indexonly
|| ((ReportType
& REPORT_TYPE_USERS_SITES
) == 0)) return;
545 if (snprintf(wdirname
,sizeof(wdirname
),"%s/%s.utmp",tmp
,oldaccuser
)>=sizeof(wdirname
)) {
546 fprintf(stderr
,"SARG: Path too long %s/%s.utmp\n",tmp
,oldaccuser
);
550 if((fp_ou
=MY_FOPEN(wdirname
,"a"))==NULL
){
551 fprintf(stderr
, "SARG: (report) %s: %s\n",text
[45],wdirname
);
555 my_lltoa(nacc
,val1
,0);
556 my_lltoa(nbytes
,val2
,0);
557 my_lltoa(nelap
,val3
,0);
558 my_lltoa(incache
,val4
,0);
559 my_lltoa(oucache
,val5
,0);
560 fprintf(fp_ou
,"%s\t%s\t%s\t%s\t%s\t%s\t%s\n",val1
,val2
,oldurl
,oldmsg
,val3
,val4
,val5
);
567 fputs("</table>\n",fp_tt
);
568 fputs("</body>\n</html>\n",fp_tt
);
577 static void gravager(FILE *fp_gen
, const char *user
, long long int nacc
, const char *url
, long long int nbytes
, const char *ip
, const char *hora
, const char *dia
, long long int nelap
, long long int incache
, long long int oucache
)
579 my_lltoa(nacc
,val1
,0);
580 my_lltoa(nbytes
,val2
,0);
581 my_lltoa(nelap
,val3
,0);
582 my_lltoa(incache
,val4
,0);
583 my_lltoa(oucache
,val5
,0);
584 fprintf(fp_gen
,"%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",user
,val1
,val2
,url
,ip
,hora
,dia
,val3
,val4
,val5
);
589 static void grava_SmartFilter(const char *dirname
, const char *user
, const char *ip
, const char *data
, const char *hora
, const char *url
, const char *smart
)
593 char wdirname
[MAXLEN
];
595 sprintf(wdirname
,"%s/smartfilter.unsort",dirname
);
597 if((fp_ou
=MY_FOPEN(wdirname
,"a"))==NULL
){
598 fprintf(stderr
, "SARG: (report) %s: %s\n",text
[45],wdirname
);
602 fprintf(fp_ou
,"%s\t%s\t%s\t%s\t%s\t%s\n",user
,data
,hora
,ip
,url
,smart
);
603 fputs("</body>\n</html>\n",fp_tt
);