]>
git.ipfire.org Git - thirdparty/sarg.git/blob - report.c
2 * AUTHOR: Pedro Lineu Orso pedro.orso@gmail.com
4 * SARG Squid Analysis Report Generator http://sarg.sourceforge.net
7 * please look at http://sarg.sourceforge.net/donations.php
8 * ---------------------------------------------------------------------
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
26 #include "include/conf.h"
27 #include "include/defs.h"
34 char accdia
[ 11 ], acchora
[ 9 ], accuser
[ MAXLEN
], accip
[ MAXLEN
], accurl
[ MAXLEN
], accbytes
[ 12 ], accelap
[ 10 ];
35 char oldaccdia
[ 11 ], oldacchora
[ 9 ], oldaccip
[ MAXLEN
], wdir
[ MAXLEN
], per1
[ MAXLEN
];
36 char wdirname
[ MAXLEN
], oldurl
[ MAXLEN
], oldaccuser
[ MAXLEN
];
37 char olduser
[ MAXLEN
], oldmsg
[ 50 ], acccode
[ 50 ], oldaccelap
[ 10 ], oldacccode
[ 50 ], user
[ MAXLEN
];
38 char ipantes
[ MAXLEN
], nameantes
[ MAXLEN
], wdname
[ MAXLEN
], wname2
[ MAXLEN
];
39 char accsmart
[ MAXLEN
];
42 long long int nbytes
= 0 ;
43 long long int nelap
= 0 ;
45 long long int rtotal
= 0 ;
46 long long int incache
= 0 ;
47 long long int oucache
= 0 ;
50 struct dirent
* direntp
;
56 sprintf ( dirname
, "%s%s" , outdir
, period
);
57 sprintf ( wdir
, "%s%s" , outdir
, period
);
59 vrfydir ( wdir
, per1
, addr
, site
, us
, email
);
62 debugaz ( "dirname" , dirname
);
66 strcpy ( wdirname
, dirname
);
69 if ( strlen ( UserAgentLog
) > 0 && email
[ 0 ] == '\0' ) useragent ();
72 strncat ( tmp
, "/sarg" , 5 );
75 while (( direntp
= readdir ( dirp
)) != NULL
) {
76 if (( strstr ( direntp
-> d_name
, ".log" ) == 0 ) ||
77 ( strncmp ( direntp
-> d_name
, "download.log" , 12 ) == 0 ) ||
78 ( strncmp ( direntp
-> d_name
, "denied.log" , 10 ) == 0 ) ||
79 ( strncmp ( direntp
-> d_name
, "authfail.log.unsort" , 19 ) == 0 ))
81 sprintf ( tmp3
, "%s/%s" , tmp
, direntp
-> d_name
);
82 if (( fp_in
= fopen ( tmp3
, "r" ))== NULL
){
83 fprintf ( stderr
, "SARG: (report) %s: %s \n " , text
[ 45 ], tmp
);
87 strcpy ( wdname
, direntp
-> d_name
);
89 if ( getword ( wname2
, sizeof ( wname2
), wdname
, '.' )< 0 ) {
90 printf ( "SARG: Maybe you have a broken record or garbage in your %s directory. \n " , tmp
);
95 if ( strcmp ( wdname
, "log" ) != 0 ) {
100 strcpy ( wdirname
, dirname
);
101 maketmp ( user
, tmp
, debug
, indexonly
);
102 maketmp_hour ( user
, tmp
, indexonly
);
105 bzero ( html_old
, MAXLEN
);
107 while ( fgets ( buf
, sizeof ( buf
), fp_in
)!= NULL
) {
108 if ( getword ( accdia
, sizeof ( accdia
), buf
, ' ' )< 0 || getword ( acchora
, sizeof ( acchora
), buf
, ' ' )< 0 ||
109 getword ( accuser
, sizeof ( accuser
), buf
, ' ' )< 0 || getword ( accip
, sizeof ( accip
), buf
, ' ' )< 0 ||
110 getword ( accurl
, sizeof ( accurl
), buf
, ' ' )< 0 || getword ( accbytes
, sizeof ( accbytes
), buf
, ' ' )< 0 ||
111 getword ( acccode
, sizeof ( acccode
), buf
, ' ' )< 0 ) {
112 printf ( "SARG: Maybe you have a broken record or garbage in your %s file. \n " , tmp3
);
115 if ( strncmp ( acccode
, "TCP_DENIED/407" , 14 ) == 0 ) continue ;
116 if ( getword ( accelap
, sizeof ( accelap
), buf
, ' ' )< 0 || getword ( accsmart
, sizeof ( accsmart
), buf
, ' ' )< 0 ||
117 getword ( accsmart
, sizeof ( accsmart
), buf
, '"' )< 0 ) {
118 printf ( "SARG: Maybe you have a broken record or garbage in your %s file. \n " , tmp3
);
122 if ( strlen ( accsmart
) > 0 ) {
124 strcpy ( wdirname
, dirname
);
125 grava_SmartFilter ( wdirname
, accuser
, accip
, accdia
, acchora
, accurl
, accsmart
);
128 if ( strcmp ( Ip2Name
, "yes" ) == 0 ) {
129 if ( strcmp ( accip
, ipantes
) != 0 ) {
130 strcpy ( ipantes
, accip
);
132 strcpy ( nameantes
, accip
);
133 } else strcpy ( accip
, nameantes
);
136 strcpy ( wdirname
, dirname
);
137 gravatmp_hora ( wdirname
, accuser
, accdia
, acchora
, accelap
, accbytes
, indexonly
);
140 strcpy ( wdirname
, dirname
);
141 gravaporuser ( accuser
, wdirname
, accurl
, accip
, accdia
, acchora
, accbytes
, accelap
, indexonly
);
145 strcpy ( oldurl
, accurl
);
146 strcpy ( oldacccode
, acccode
);
147 strcpy ( oldaccelap
, accelap
);
148 strcpy ( oldaccuser
, accuser
);
149 strcpy ( oldaccip
, accip
);
150 strcpy ( oldaccdia
, accdia
);
151 strcpy ( oldacchora
, acchora
);
155 if ( site
[ 0 ] != '\0' ) {
156 if ( strcmp ( oldaccuser
, accuser
) != 0 ){
158 if ( strstr ( oldacccode
, "DENIED" ) != 0 )
159 sprintf ( oldmsg
, "%s" , text
[ 46 ]);
160 gravatmp ( oldaccuser
, wdirname
, oldurl
, nacc
, nbytes
, oldmsg
, nelap
, indexonly
, incache
, oucache
);
161 gravager ( wdirname
, oldaccuser
, nacc
, oldurl
, nbytes
, oldaccip
, oldacchora
, oldaccdia
, nelap
,
170 if ( strcmp ( oldurl
, accurl
) != 0 || strcmp ( oldaccuser
, accuser
) != 0 ){
172 if ( strstr ( oldacccode
, "DENIED" ) != 0 )
173 sprintf ( oldmsg
, "%s" , text
[ 46 ]);
174 strcpy ( wdirname
, dirname
);
175 gravatmp ( oldaccuser
, wdirname
, oldurl
, nacc
, nbytes
, oldmsg
, nelap
, indexonly
, incache
, oucache
);
176 strcpy ( wdirname
, dirname
);
177 gravager ( wdirname
, oldaccuser
, nacc
, oldurl
, nbytes
, oldaccip
, oldacchora
, oldaccdia
, nelap
, incache
, oucache
);
183 if ( strcmp ( oldaccuser
, accuser
) != 0 )
188 nbytes
+= my_atoll ( accbytes
);
189 nelap
+= my_atoll ( accelap
);
191 if ( strstr ( ReportType
, "site_user_time_date" ) != 0 ) {
194 strcpy ( siteind
, accurl
);
196 for ( z1
= 0 ; z1
< strlen ( str
); z1
++) {
197 if ( str
[ z1
]== '?' || str
[ z1
]== '-' || str
[ z1
]== '.' || str
[ z1
]== ':' || str
[ z1
]== '/' || str
[ z1
]== ' \\ ' )
200 sprintf ( arqtt
, "%s/%s" , dirname
, accuser
);
201 if ( access ( arqtt
, R_OK
) != 0 )
203 sprintf ( arqtt
, "%s/%s/tt%s-%s.html" , dirname
, accuser
, accuser
, siteind
);
204 if ( strlen ( arqtt
) > 255 ) {
205 strncpy ( val7
, arqtt
, 255 );
209 if (( fp_tt
= fopen ( arqtt
, "w" )) == 0 ) {
210 fprintf ( stderr
, "SARG: (report) %s: %s \n " , text
[ 45 ], arqtt
);
215 if ( strcmp ( Privacy
, "yes" ) == 0 )
216 sprintf ( httplink
, "<font size=%s color=%s><href=http://%s>%s" , \
217 FontSize
, PrivacyStringColor
, PrivacyString
, PrivacyString
);
219 sprintf ( httplink
, "<font size=%s><a href=http://%s>%s</A>" , FontSize
, accurl
, accurl
);
221 sprintf ( ltext110
, "%s" , text
[ 110 ]);
223 for ( s
= ltext110
; * s
; ++ s
)
227 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
);
229 fputs ( "</head> \n " , fp_tt
);
230 fprintf ( fp_tt
, "<body bgcolor=%s text=%s background='%s'> \n " , BgColor
, TxColor
, BgImage
);
231 if ( strlen ( LogoImage
) > 0 ) fprintf ( fp_tt
, "<center><table cellpadding= \" 0 \" cellspacing= \" 0 \" > \n <tr><th class= \" logo \" ><img src='%s' border=0 align=absmiddle width=%s height=%s> %s</th></tr> \n <tr><td height= \" 5 \" ></td></tr> \n </table> \n " , LogoImage
, Width
, Height
, LogoText
);
233 if ( strcmp ( IndexTree
, "date" ) == 0 )
234 show_sarg ( fp_tt
, "../../../.." );
236 show_sarg ( fp_tt
, "../.." );
238 fputs ( "<center><table cellpadding=0 cellspacing=0> \n " , fp_tt
);
239 fprintf ( fp_tt
, "<tr><th class= \" title \" colspan= \" 2 \" >%s</th></tr> \n " , Title
);
242 if ( strcmp ( Ip2Name
, "yes" ) == 0 )
244 if ( UserTabFile
[ 0 ] != '\0' ) {
245 sprintf ( warea
, ":%s:" , u2
);
246 if (( str
=( char *) strstr ( userfile
, warea
)) != ( char *) NULL
) {
248 str2
=( char *) strstr ( str
+ 1 , ":" );
251 while ( str2
[ z1
] != ':' ) {
255 } else strcpy ( name
, u2
);
256 } else strcpy ( name
, u2
);
258 if ( dotinuser
&& strstr ( name
, "_" )) {
259 str2
=( char *) subs ( name
, "_" , "." );
263 fprintf ( fp_tt
, "<tr><td class= \" header \" colspan= \" 2 \" >%s: %s</td></tr> \n " , text
[ 89 ], period
);
264 fprintf ( fp_tt
, "<tr><td class= \" header \" colspan= \" 2 \" >%s: %s</td></tr> \n " , text
[ 90 ], name
);
265 fprintf ( fp_tt
, "<tr><td class= \" header \" colspan= \" 2 \" >%s: %s, %s</td></tr> \n " , text
[ 104 ], UserSortField
, UserSortOrder
);
266 fprintf ( fp_tt
, "<tr><th class= \" header3 \" colspan=2>%s</th></tr> \n " , text
[ 32 ]);
268 fputs ( "</table></center> \n " , fp_tt
);
269 fputs ( "<center><table cellpadding= \" 0 \" cellspacing= \" 2 \" > \n " , fp_tt
);
270 fputs ( "<tr><td></td><td></td></tr>" , fp_tt
);
272 strncpy ( tmp4
, text
[ 110 ], 4 );
273 fprintf ( fp_tt
, "<tr><th class= \" header \" >%s</th><th class= \" header \" >%s</th><th class= \" header \" >%s</th></tr> \n " , text
[ 91 ], tmp4
, text
[ 110 ]+ 5 );
276 sprintf ( html
, "<tr><td class= \" data \" >%s</td><td class= \" data \" >%s</td><td class= \" data \" >%s</td></tr> \n " , accurl
, accdia
, acchora
);
278 if ( strcmp ( html
, html_old
) != 0 )
280 strcpy ( html_old
, html
);
281 } else bzero ( ltext110
, 50 );
283 strcpy ( wcrc
, acccode
);
284 if ( getword ( crc2
, sizeof ( crc2
), wcrc
, '/' )< 0 ) {
285 printf ( "SARG: Maybe you have a broken record or garbage in your %s file. \n " , tmp3
);
289 if ( strstr ( crc2
, "MISS" ) != 0 )
290 oucache
+= my_atoll ( accbytes
);
291 else incache
+= my_atoll ( accbytes
);
293 strcpy ( oldurl
, accurl
);
295 if ( strcmp ( accuser
, oldaccuser
) != 0 ) {
296 strcpy ( wdirname
, dirname
);
297 day_totalize ( tmp
, oldaccuser
, indexonly
);
300 strcpy ( oldaccuser
, accuser
);
301 strcpy ( oldacccode
, acccode
);
302 strcpy ( oldaccelap
, accelap
);
303 strcpy ( oldaccip
, accip
);
304 strcpy ( oldaccdia
, accdia
);
305 strcpy ( oldacchora
, acchora
);
314 if ( strstr ( oldacccode
, "DENIED" ) != 0 )
315 sprintf ( oldmsg
, "%s" , text
[ 46 ]);
316 strcpy ( wdirname
, dirname
);
317 if ( strlen ( oldaccuser
) == 0 )
318 strcpy ( oldaccuser
, accuser
);
319 gravatmpf ( oldaccuser
, wdirname
, oldurl
, nacc
, nbytes
, oldmsg
, nelap
, indexonly
, incache
, oucache
);
320 strcpy ( wdirname
, dirname
);
321 gravager ( wdirname
, oldaccuser
, nacc
, oldurl
, nbytes
, oldaccip
, oldacchora
, oldaccdia
, nelap
, incache
, oucache
);
322 strcpy ( wdirname
, dirname
);
323 day_totalize ( tmp
, oldaccuser
, indexonly
);
327 strcpy ( wdirname
, dirname
);
328 totalger ( wdirname
, debug
, outdir
);
330 if ( strlen ( email
) == 0 ) {
331 if ( strstr ( ReportType
, "downloads" ) != 0 ) download_report ();
333 if ( strlen ( DansGuardianConf
) > 0 ) {
334 strcpy ( wdirname
, dirname
);
338 strcpy ( wdirname
, dirname
);
341 strcpy ( wdirname
, dirname
);
344 if ( strstr ( ReportType
, "topsites" ) != 0 ) topsites ();
346 if ( strstr ( ReportType
, "sites_users" ) != 0 ) siteuser ();
349 strcpy ( wdirname
, dirname
);
352 if ( smartfilter
) smartfilter_report ();
354 if ( strlen ( DansGuardianConf
) > 0 ) dansguardian_report ();
358 if ( strstr ( ReportType
, "users_sites" ) != 0 ) htmlrel ();
362 if ( strncmp ( SuccessfulMsg
, "yes" , 3 ) == 0 ) fprintf ( stderr
, "SARG: %s %s \n " , text
[ 47 ], dirname
);
364 strcpy ( wdirname
, dirname
);
365 geramail ( wdirname
, debug
, outdir
, userip
, email
, TempDir
);
367 if (( strcmp ( email
, "stdout" ) != 0 ) && ( strncmp ( SuccessfulMsg
, "yes" , 3 ) == 0 ))
368 fprintf ( stderr
, "SARG: %s %s \n " , text
[ 48 ], email
);
372 strcpy ( wdirname
, dirname
);
373 index_only ( wdirname
, debug
);
376 if ( strlen ( email
) < 0 )
383 void maketmp ( char * user
, char * dirname
, int debug
, int indexonly
)
388 char wdirname
[ MAXLEN
];
390 if ( indexonly
) return ;
391 if ( strstr ( ReportType
, "users_sites" ) == 0 ) return ;
393 strcpy ( wdirname
, tmp
);
394 strcat ( wdirname
, "/" );
395 strcat ( wdirname
, user
);
398 sprintf ( msg
, "%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 void maketmp_hour ( char * user
, char * dirname
, int indexonly
)
418 char wdirname
[ MAXLEN
];
420 if ( indexonly
) return ;
421 if ( strstr ( ReportType
, "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 ( char * oldaccuser
, char * dirname
, char * oldurl
, long long int nacc
, long long int nbytes
, char * oldmsg
, long long int nelap
, int indexonly
, long long int incache
, long long int oucache
)
443 char wdirname
[ MAXLEN
];
445 if ( indexonly
) return ;
446 if ( strstr ( ReportType
, "users_sites" ) == 0 ) return ;
448 strcpy ( wdirname
, tmp
);
449 strcat ( wdirname
, "/" );
450 strcat ( wdirname
, oldaccuser
);
451 strcat ( wdirname
, ".utmp" );
453 if (( fp_ou
= fopen ( wdirname
, "a" ))== NULL
){
454 fprintf ( stderr
, "SARG: (report) %s: %s \n " , text
[ 45 ], wdirname
);
458 my_lltoa ( nacc
, val1
, 15 );
459 my_lltoa ( nbytes
, val2
, 15 );
460 my_lltoa ( nelap
, val3
, 15 );
461 my_lltoa ( incache
, val4
, 15 );
462 my_lltoa ( oucache
, val5
, 15 );
463 fprintf ( fp_ou
, "%s %s %s %s %s %s %s \n " , val1
, val2
, oldurl
, oldmsg
, val3
, val4
, val5
);
469 fputs ( "</table> \n " , fp_tt
);
470 fputs ( "</body> \n </html> \n " , fp_tt
);
479 void gravatmp_hora ( char * dirname
, char * user
, char * data
, char * hora
, char * elap
, char * bytes
, int indexonly
)
484 char wdirname
[ MAXLEN
];
486 if ( indexonly
|| ( strstr ( ReportType
, "users_sites" ) == 0 )) return ;
488 strcpy ( wdirname
, tmp
);
489 strcat ( wdirname
, "/" );
490 strcat ( wdirname
, user
);
491 strcat ( wdirname
, ".htmp" );
493 if (( fp_ou
= fopen ( wdirname
, "a" ))== NULL
){
494 fprintf ( stderr
, "SARG: (report-2) %s: %s - %s \n " , text
[ 45 ], wdirname
, strerror ( errno
));
498 if ( strcmp ( datetimeby
, "bytes" ) == 0 ) fprintf ( fp_ou
, "%s %s %s \n " , data
, hora
, bytes
);
499 else fprintf ( fp_ou
, "%s %s %s \n " , data
, hora
, elap
);
507 void gravaporuser ( char * user
, char * dirname
, char * url
, char * ip
, char * data
, char * hora
, char * tam
, char * elap
, int indexonly
)
512 char wdirname
[ MAXLEN
];
514 if ( indexonly
|| ( strstr ( ReportType
, "users_sites" ) == 0 )) return ;
516 strcpy ( wdirname
, tmp
);
517 strcat ( wdirname
, "/" );
518 strcat ( wdirname
, user
);
519 strcat ( wdirname
, ".ip" );
521 if (( fp_ou
= fopen ( wdirname
, "a" ))== NULL
){
522 fprintf ( stderr
, "SARG: (report) %s: %s \n " , text
[ 45 ], wdirname
);
526 fprintf ( fp_ou
, "%s %s %s %s %s %s \n " , ip
, url
, data
, hora
, tam
, elap
);
535 void gravatmpf ( char * oldaccuser
, char * dirname
, char * oldurl
, long long int nacc
, long long int nbytes
, char * oldmsg
, long long int nelap
, int indexonly
, long long int incache
, long long int oucache
)
540 char wdirname
[ MAXLEN
];
542 if ( indexonly
|| ( strstr ( ReportType
, "users_sites" ) == 0 )) return ;
544 strcpy ( wdirname
, tmp
);
545 strcat ( wdirname
, "/" );
546 strcat ( wdirname
, oldaccuser
);
547 strcat ( wdirname
, ".utmp" );
549 if (( fp_ou
= fopen ( wdirname
, "a" ))== NULL
){
550 fprintf ( stderr
, "SARG: (report) %s: %s \n " , text
[ 45 ], wdirname
);
554 my_lltoa ( nacc
, val1
, 15 );
555 my_lltoa ( nbytes
, val2
, 15 );
556 my_lltoa ( nelap
, val3
, 15 );
557 my_lltoa ( incache
, val4
, 15 );
558 my_lltoa ( oucache
, val5
, 15 );
559 fprintf ( fp_ou
, "%s %s %s %s %s %s %s \n " , val1
, val2
, oldurl
, oldmsg
, val3
, val4
, val5
);
566 fputs ( "</table> \n " , fp_tt
);
567 fputs ( "</html> \n " , fp_tt
);
576 void gravager ( char * dirname
, char * user
, long long int nacc
, char * url
, long long int nbytes
, char * ip
, char * hora
, char * dia
, long long int nelap
, long long int incache
, long long int oucache
)
582 strcat ( dirname
, "sarg-general" );
584 if (( fp_ou
= fopen ( dirname
, "a" ))== NULL
){
585 fprintf ( stderr
, "SARG: (report) %s: %s \n " , text
[ 45 ], dirname
);
589 my_lltoa ( nacc
, val1
, 15 );
590 my_lltoa ( nbytes
, val2
, 15 );
591 my_lltoa ( nelap
, val3
, 15 );
592 my_lltoa ( incache
, val4
, 15 );
593 my_lltoa ( oucache
, val5
, 15 );
594 fprintf ( fp_ou
, "%s %s %s %s %s %s %s %s %s %s \n " , user
, val1
, val2
, url
, ip
, hora
, dia
, val3
, val4
, val5
);
601 void grava_SmartFilter ( char * dirname
, char * user
, char * ip
, char * data
, char * hora
, char * url
, char * smart
)
606 char wdirname
[ MAXLEN
];
608 sprintf ( wdirname
, "%s/smartfilter.unsort" , dirname
);
610 if (( fp_ou
= fopen ( wdirname
, "a" ))== NULL
){
611 fprintf ( stderr
, "SARG: (report) %s: %s \n " , text
[ 45 ], wdirname
);
615 fprintf ( fp_ou
, "%s %s %s %s %s %s \n " , user
, data
, hora
, ip
, url
, smart
);
616 fputs ( "</body> \n </html> \n " , fp_tt
);