]> git.ipfire.org Git - thirdparty/sarg.git/blame - log.c
Report an error if the tail command cannot read the last lines of the log file when...
[thirdparty/sarg.git] / log.c
CommitLineData
25697a35 1/*
94ff9470 2 * SARG Squid Analysis Report Generator http://sarg.sourceforge.net
ad500baa 3 * 1998, 2010
94ff9470 4 *
25697a35 5 * SARG donations:
94ff9470 6 * please look at http://sarg.sourceforge.net/donations.php
ad500baa
FM
7 * Support:
8 * http://sourceforge.net/projects/sarg/forums/forum/363374
25697a35
GS
9 * ---------------------------------------------------------------------
10 *
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.
15 *
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.
20 *
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.
24 *
25 */
26
27#include "include/conf.h"
5f3cfd1d 28#include "include/defs.h"
25697a35 29
9b179eb0
FM
30#ifdef HAVE_GETOPT_H
31#include <getopt.h>
32#endif
33
25697a35 34#define REPORT_EVERY_X_LINES 5000
f2ec8c75
FM
35#define MAX_OPEN_USER_FILES 10
36
37struct userfilestruct
38{
39 struct userfilestruct *next;
40 struct userinfostruct *user;
41 FILE *file;
42};
25697a35 43
2824ec9b 44/*@null@*/static char *userfile=NULL;
25697a35
GS
45
46numlist weekdays = { { 0, 1, 2, 3, 4, 5, 6 }, 7 };
47numlist hours = { { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
48 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 }, 24 };
49
936c9905 50static void getusers(const char *pwdfile, int debug);
25697a35 51
25f0793f 52int main(int argc,char *argv[])
25697a35 53{
076cbab8
FM
54 enum isa_col_id {
55 ISACOL_Ip,
56 ISACOL_UserName,
57 ISACOL_Date,
58 ISACOL_Time,
59 ISACOL_TimeTaken,
60 ISACOL_Bytes,
61 ISACOL_Uri,
62 ISACOL_Status,
63 ISACOL_Last //last entry of the list !
64 };
58d7d8fe
FM
65 enum InputLogFormat {
66 ILF_Unknown,
67 ILF_Squid,
68 ILF_Common,
69 ILF_Sarg,
70 ILF_Isa,
71 ILF_Last //last entry of the list !
72 };
25697a35 73
120d768c 74 FILE *fp_in = NULL, *fp_denied=NULL, *fp_authfail=NULL, *fp_log=NULL;
25697a35
GS
75
76 char sz_Download_Unsort[ 20000 ] ;
77 FILE * fp_Download_Unsort = NULL ;
25697a35
GS
78
79 extern int optind;
80 extern int optopt;
81 extern char *optarg;
82
25f0793f 83 char data[255];
25697a35 84 char elap[255];
25697a35 85 char ip[MAXLEN];
25697a35 86 char tam[255];
25f0793f
FM
87 char fun[MAXLEN];
88 char wuser[MAXLEN];
25697a35 89 char smartfilter[MAXLEN];
2357ef77 90 char dia[128];
25697a35
GS
91 char mes[30];
92 char ano[30];
93 char hora[30];
94 char wtemp[MAXLEN];
25697a35
GS
95 char date[255];
96 char arq[255];
97 char arq_log[255];
9c7c6346 98 char hm[15], hmf[15], hmr[15];
25697a35
GS
99 int chm=0;
100 char uagent[MAXLEN];
101 char hexclude[MAXLEN];
456d78a5
FM
102 char csort[MAXLEN];
103 int cstatus;
25697a35
GS
104 char tbuf2[128];
105 char zip[20];
106 char *str;
2240dcea 107 char tmp3[MAXLEN];
f84a35a3
FM
108 char denied_unsort[MAXLEN];
109 char denied_sort[MAXLEN];
110 char authfail_unsort[MAXLEN];
ff8d5836
FM
111 char start_hour[128];
112 char end_hour[128];
ac422f9b 113 char *linebuf;
e5b2c6f0
FM
114 char hostname[512];
115 char *url;
116 char *urly;
2240dcea 117 char user[MAX_USER_LEN];
58d7d8fe
FM
118 enum InputLogFormat ilf;
119 int ilf_count[ILF_Last];
25697a35 120 int ch;
f2ec8c75 121 int x;
25697a35
GS
122 int errflg=0;
123 int puser=0;
2824ec9b
FM
124 bool fhost=false;
125 bool dns=false;
126 bool fuser=false;
25697a35 127 int idata=0;
ed1ac52f 128 int mindate=0;
fa6552b0 129 int maxdate=0;
25697a35 130 int iarq=0;
076cbab8 131 int isa_ncols=0,isa_cols[ISACOL_Last];
2824ec9b 132 bool from_stdin;
d2855b39 133 bool from_pipe;
ab950637 134 int blen;
f2ec8c75
FM
135 int maxopenfiles;
136 int nopen;
8bb4048f 137 bool id_is_ip;
2357ef77 138 long totregsl=0;
25697a35
GS
139 long totregsg=0;
140 long totregsx=0;
fa6552b0 141 bool totper=false;
58d7d8fe 142 long int max_elapsed=0;
fa6552b0 143 long long int iyear, imonth, iday;
2824ec9b 144 bool realt;
8bb4048f 145 bool userip;
fa6552b0 146 struct tm tt;
25697a35 147 struct tm *t;
7c0b0078
FM
148 unsigned long recs1=0UL;
149 unsigned long recs2=0UL;
25697a35 150 int OutputNonZero = REPORT_EVERY_X_LINES ;
2824ec9b 151 bool download_flag=false;
c36c7384 152 char *download_url=NULL;
9c7c6346 153 struct getwordstruct gwarea;
afaa3b67 154 longline line;
fa6552b0 155 time_t tnum;
c6a3ce24 156 struct stat logstat;
f2ec8c75
FM
157 struct userinfostruct *uinfo;
158 struct userfilestruct *first_user_file, *ufile, *ufile1, *prev_ufile;
9b179eb0
FM
159 static int split=0;
160 static int convert=0;
d183fb7f 161 static int output_css=0;
9b179eb0
FM
162 int option_index;
163 static struct option long_options[]=
164 {
165 {"convert",no_argument,&convert,1},
d183fb7f 166 {"css",no_argument,&output_css,1},
9b179eb0
FM
167 {"split",no_argument,&split,1},
168 {0,0,0,0}
169 };
25697a35 170
abfc169e
FM
171#ifdef HAVE_LOCALE_H
172 setlocale(LC_TIME,"");
173#endif
174
cec3eed3 175#if defined(ENABLE_NLS) && defined(HAVE_LOCALE_H)
fd46f082
FM
176 if (!setlocale (LC_ALL, "")) {
177 fprintf(stderr,"SARG: Cannot set the locale LC_ALL to the environment variable\n");
178 exit(EXIT_FAILURE);
179 }
180 if (!bindtextdomain (PACKAGE_NAME, LOCALEDIR)) {
181 fprintf(stderr,"SARG: Cannot bind to text domain %s in directory %s (%s)\n",PACKAGE_NAME,LOCALEDIR,strerror(errno));
182 exit(EXIT_FAILURE);
183 }
184 if (!textdomain (PACKAGE_NAME)) {
185 fprintf(stderr,"SARG: Cannot set gettext domain for %s PACKAGE_NAME (%s)\n",PACKAGE_NAME,strerror(errno));
186 exit(EXIT_FAILURE);
187 }
abfc169e
FM
188#endif //ENABLE_NLS
189
25697a35
GS
190 BgImage[0]='\0';
191 LogoImage[0]='\0';
192 LogoText[0]='\0';
193 PasswdFile[0]='\0';
194 OutputEmail[0]='\0';
25697a35
GS
195 UserAgentLog[0]='\0';
196 ExcludeHosts[0]='\0';
197 ExcludeUsers[0]='\0';
198 ConfigFile[0]='\0';
199 code[0]='\0';
0511cf2d 200 LastLog=0;
085c1e1f 201 ReportType=0UL;
25697a35
GS
202 UserTabFile[0]='\0';
203 BlockIt[0]='\0';
204 ExternalCSSFile[0]='\0';
1f482a8d
FM
205 RedirectorLogFormat[0]='\0';
206 NRedirectorLogs=0;
58d7d8fe 207 for (ilf=0 ; ilf<ILF_Last ; ilf++) ilf_count[ilf]=0;
25697a35 208
25697a35
GS
209 sprintf(ExcludeCodes,"%s/exclude_codes",SYSCONFDIR);
210 strcpy(GraphDaysBytesBarColor,"orange");
491b862f 211 strcpy(BgColor,"#ffffff");
25697a35
GS
212 strcpy(TxColor,"#000000");
213 strcpy(TxBgColor,"lavender");
214 strcpy(TiColor,"darkblue");
215 strcpy(Width,"80");
216 strcpy(Height,"45");
217 strcpy(LogoTextColor,"#000000");
218 strcpy(HeaderColor,"darkblue");
491b862f 219 strcpy(HeaderBgColor,"#dddddd");
94ff9470 220 strcpy(LogoTextColor,"#006699");
25697a35
GS
221 strcpy(FontSize,"9px");
222 strcpy(TempDir,"/tmp");
d6e703cc 223 strcpy(OutputDir,"/var/www/html/squid-reports");
8bb4048f 224 Ip2Name=false;
25697a35 225 strcpy(DateFormat,"u");
2824ec9b
FM
226 OverwriteReport=false;
227 RemoveTempFiles=true;
25697a35 228 strcpy(ReplaceIndex,"index.html");
0349fa24 229 Index=INDEX_YES;
f2ec8c75 230 RecordsWithoutUser=RECORDWITHOUTUSER_IP;
e6414a9d 231 UseComma=0;
25697a35 232 strcpy(MailUtility,"mailx");
c0ec9cc7 233 TopSitesNum=100;
3becf85c 234 TopUsersNum=0;
246c8489 235 UserIp=0;
15d5372b
FM
236 TopuserSort=TOPUSER_SORT_BYTES | TOPUSER_SORT_REVERSE;
237 UserSort=USER_SORT_BYTES | USER_SORT_REVERSE;
238 TopsitesSort=TOPSITE_SORT_CONNECT | TOPSITE_SORT_REVERSE;
246c8489 239 LongUrl=0;
25697a35 240 strcpy(FontFace,"Verdana,Tahoma,Arial");
ba638499 241 datetimeby=DATETIME_BYTE;
25697a35 242 strcpy(CharSet,"ISO-8859-1");
e6414a9d 243 Privacy=0;
25697a35
GS
244 strcpy(PrivacyString,"***.***.***.***");
245 strcpy(PrivacyStringColor,"blue");
2824ec9b 246 SuccessfulMsg=true;
085c1e1f
FM
247 TopUserFields=TOPUSERFIELDS_NUM | TOPUSERFIELDS_DATE_TIME | TOPUSERFIELDS_USERID | TOPUSERFIELDS_CONNECT |
248 TOPUSERFIELDS_BYTES | TOPUSERFIELDS_SETYB | TOPUSERFIELDS_IN_CACHE_OUT |
249 TOPUSERFIELDS_USED_TIME | TOPUSERFIELDS_MILISEC | TOPUSERFIELDS_PTIME |
250 TOPUSERFIELDS_TOTAL | TOPUSERFIELDS_AVERAGE;
251 UserReportFields=USERREPORTFIELDS_CONNECT | USERREPORTFIELDS_BYTES | USERREPORTFIELDS_SETYB |
252 USERREPORTFIELDS_IN_CACHE_OUT | USERREPORTFIELDS_USED_TIME | USERREPORTFIELDS_MILISEC |
253 USERREPORTFIELDS_PTIME | USERREPORTFIELDS_TOTAL | USERREPORTFIELDS_AVERAGE;
25697a35 254 strcpy(DataFileDelimiter,";");
085c1e1f
FM
255 DataFileFields=DATA_FIELD_USER | DATA_FIELD_DATE | DATA_FIELD_TIME | DATA_FIELD_URL | DATA_FIELD_CONNECT |
256 DATA_FIELD_BYTES | DATA_FIELD_IN_CACHE | DATA_FIELD_OUT_CACHE | DATA_FIELD_ELAPSED;
2824ec9b 257 ShowReadStatistics=true;
25697a35 258 strcpy(IndexSortOrder,"D");
2824ec9b
FM
259 ShowSargInfo=true;
260 ShowSargLogo=true;
25697a35 261 strcpy(ParsedOutputLog,"no");
ff8d5836 262 strcpy(ParsedOutputLogCompress,"/bin/gzip -f");
e43854ef 263 DisplayedValues=DISPLAY_ABBREV;
25697a35
GS
264 strcpy(HeaderFontSize,"9px");
265 strcpy(TitleFontSize,"11px");
d5d021c5 266 strcpy(AuthUserTemplateFile,"sarg_htaccess");
6e792ade 267 set_download_suffix("7z,ace,arj,avi,bat,bin,bz2,bzip,cab,com,cpio,dll,doc,dot,exe,gz,iso,lha,lzh,mdb,mov,mp3,mpeg,mpg,mso,nrg,ogg,ppt,rar,rtf,shs,src,sys,tar,tgz,vcd,vob,wma,wmv,zip");
2824ec9b 268 Graphs=true;
3becf85c
FM
269#if defined(FONTDIR)
270 strcpy(GraphFont,FONTDIR"/DejaVuSans.ttf");
271#else
272 GraphFont[0]='\0';
273#endif
25697a35 274 strcpy(Ulimit,"20000");
f2ec8c75 275 NtlmUserFormat=NTLMUSERFORMAT_DOMAINUSER;
0349fa24 276 IndexTree=INDEX_TREE_FILE;
491b862f 277 strcpy(RealtimeTypes,"GET,PUT,CONNECT");
71d78774 278 RealtimeUnauthRec=REALTIME_UNAUTH_REC_SHOW;
64dfb824
FM
279 RedirectorFilterOutDate=true;
280 DansguardianFilterOutDate=true;
f84a35a3 281 DataFileUrl=DATAFILEURL_IP;
d6e703cc 282 strcpy(MaxElapsed,"28800000");
e6414a9d
FM
283 BytesInSitesUsersReport=0;
284 UserAuthentication=0;
e3af0ae9 285 strcpy(LDAPHost,"127.0.0.1");
965c4a6f
FM
286 LDAPPort=389;
287 LDAPProtocolVersion=3;
e3af0ae9
PO
288 LDAPBindDN[0]='\0';
289 LDAPBindPW[0]='\0';
290 LDAPBaseSearch[0]='\0';
291 strcpy(LDAPFilterSearch, "uid=%s");
292 strcpy(LDAPTargetAttr, "cn");
25697a35
GS
293
294 dia[0]='\0';
295 mes[0]='\0';
296 ano[0]='\0';
297 hora[0]='\0';
298 tmp[0]='\0';
25697a35
GS
299 tmp3[0]='\0';
300 wtemp[0]='\0';
25697a35
GS
301 us[0]='\0';
302 date[0]='\0';
303 df[0]='\0';
304 uagent[0]='\0';
305 hexclude[0]='\0';
306 addr[0]='\0';
307 hm[0]='\0';
308 hmf[0]='\0';
309 site[0]='\0';
310 outdir[0]='\0';
311 elap[0]='\0';
312 email[0]='\0';
313 zip[0]='\0';
314 UserInvalidChar[0]='\0';
315 DataFile[0]='\0';
316 SquidGuardConf[0]='\0';
317 DansGuardianConf[0]='\0';
ff8d5836
FM
318 start_hour[0]='\0';
319 end_hour[0]='\0';
25697a35 320
25697a35
GS
321 denied_count=0;
322 download_count=0;
323 authfail_count=0;
324 dansguardian_count=0;
325 squidguard_count=0;
c0ec9cc7 326 useragent_count=0;
25697a35
GS
327 DeniedReportLimit=10;
328 AuthfailReportLimit=10;
329 DansGuardianReportLimit=10;
330 SquidGuardReportLimit=10;
94ff9470 331 DownloadReportLimit=50;
25697a35
GS
332 UserReportLimit=0;
333 debug=0;
334 debugz=0;
335 debugm=0;
2824ec9b
FM
336 iprel=false;
337 userip=false;
2824ec9b 338 realt=false;
491b862f
GS
339 realtime_refresh=3;
340 realtime_access_log_lines=1000;
341 cost=0.01;
342 nocost=50000000;
d6e703cc 343 ndownload=0;
2824ec9b 344 squid24=false;
42b117e3
FM
345 dfrom=0;
346 duntil=0;
25697a35 347
f2ec8c75
FM
348 bzero(IncludeUsers, sizeof(IncludeUsers));
349 bzero(ExcludeString, sizeof(ExcludeString));
350 first_user_file=NULL;
fa6552b0 351 memset(&period,0,sizeof(period));
25697a35 352
0a4e18e1 353 NAccessLog=0;
3becf85c 354 for(x=0; x<MAXLOGS; x++)
0a4e18e1
FM
355 AccessLog[x][0]='\0';
356 AccessLogFromCmdLine=0;
1f482a8d 357 RedirectorLogFromCmdLine=0;
25697a35 358
c36c7384 359 strcpy(Title,_("Squid User Access Report"));
25697a35 360
9b179eb0 361 while((ch = getopt_long_only(argc, argv, "a:b:c:d:e:f:g:u:l:L:o:s:t:w:hijmnprvxyz",long_options,&option_index)) != -1){
25697a35
GS
362 switch(ch)
363 {
9b179eb0
FM
364 case 0:
365 break;
25697a35
GS
366 case 'a':
367 strcpy(addr,optarg);
368 break;
369 case 'b':
370 strcpy(uagent,optarg);
371 break;
372 case 'c':
373 strcpy(hexclude,optarg);
374 break;
375 case 'd':
9c7c6346
FM
376 strncpy(date,optarg,sizeof(date)-1);
377 date[sizeof(date)-1]='\0';
42b117e3 378 date_from(date, &dfrom, &duntil);
25697a35
GS
379 break;
380 case 'e':
381 strcpy(email,optarg);
382 break;
383 case 'f':
384 strcpy(ConfigFile,optarg);
385 break;
386 case 'g':
387 strcpy(df,optarg);
388 break;
936c9905
FM
389 case 'h':
390 usage(argv[0]);
2824ec9b 391 exit(EXIT_SUCCESS);
25697a35 392 case 'i':
2824ec9b 393 iprel=true;
25697a35
GS
394 break;
395 case 'l':
0a4e18e1 396 if (NAccessLog>=MAXLOGS) {
1f482a8d
FM
397 debuga(_("Too many log files passed on command line with option -l.\n"));
398 exit(EXIT_FAILURE);
399 }
400 if (strlen(optarg)>=MAX_LOG_FILELEN) {
401 debuga(_("Log file name too long passed on command line with option -l: %s\n"),optarg);
06b39c87 402 exit(EXIT_FAILURE);
4af2f8ff 403 }
0a4e18e1
FM
404 strcpy(AccessLog[NAccessLog],optarg);
405 NAccessLog++;
406 AccessLogFromCmdLine++;
25697a35 407 break;
491b862f 408 case 'L':
1f482a8d
FM
409 if (NRedirectorLogs>MAX_REDIRECTOR_LOGS) {
410 debuga(_("Too many redirector logs passed on command line with option -L.\n"));
411 exit(EXIT_FAILURE);
412 }
413 if (strlen(optarg)>=MAX_REDIRECTOR_FILELEN) {
414 debuga(_("Redirector log file name too long passed on command line with opton -L: %s\n"),optarg);
415 exit(EXIT_FAILURE);
416 }
417 strcpy(RedirectorLogs[NRedirectorLogs],optarg);
418 NRedirectorLogs++;
419 RedirectorLogFromCmdLine++;
491b862f 420 break;
25697a35
GS
421 case 'm':
422 debugm++;
423 break;
424 case 'n':
2824ec9b 425 dns=true;
25697a35
GS
426 break;
427 case 'o':
428 strcpy(outdir,optarg);
429 break;
430 case 'p':
2824ec9b 431 userip=true;
25697a35 432 break;
491b862f 433 case 'r':
2824ec9b 434 realt=true;
491b862f 435 break;
25697a35
GS
436 case 's':
437 strcpy(site,optarg);
438 break;
439 case 't':
9c7c6346
FM
440 {
441 int h,m;
442
25697a35
GS
443 if(strstr(optarg,"-") == 0) {
444 strcpy(hm,optarg);
445 strcpy(hmf,optarg);
446 } else {
9c7c6346 447 getword_start(&gwarea,optarg);
2824ec9b 448 if (getword(hm,sizeof(hm),&gwarea,'-')<0 || getword(hmf,sizeof(hmf),&gwarea,'\0')<0) {
10210234 449 debuga(_("The time range passed on the command line with option -t is invalid\n"));
06b39c87 450 exit(EXIT_FAILURE);
4bcb77cf 451 }
25697a35 452 }
9c7c6346 453 if(sscanf(hm,"%d:%d",&h,&m)!=2) {
10210234 454 debuga(_("Time period must be MM or MM:SS. Exit\n"));
06b39c87 455 exit(EXIT_FAILURE);
25697a35 456 }
9c7c6346
FM
457 sprintf(hm,"%02d%02d",h,m);
458 if(sscanf(hmf,"%d:%d",&h,&m)!=2) {
10210234 459 debuga(_("Time period must be MM or MM:SS. Exit\n"));
06b39c87 460 exit(EXIT_FAILURE);
25697a35 461 }
9c7c6346 462 sprintf(hmf,"%02d%02d",h,m);
25697a35 463 break;
9c7c6346 464 }
25697a35
GS
465 case 'u':
466 strcpy(us,optarg);
467 break;
468 case 'v':
469 version();
470 break;
471 case 'w':
472 strcpy(tmp,optarg);
473 break;
474 case 'x':
475 debug++;
476 break;
477 case 'y':
478 langcode++;
479 break;
480 case 'z':
481 debugz++;
482 break;
9b179eb0 483 /*case ':':
10210234 484 debuga(_("Option -%c require an argument\n"),optopt);
936c9905 485 errflg++;
9b179eb0 486 break;*/
25697a35
GS
487 case '?':
488 usage(argv[0]);
06b39c87 489 exit(EXIT_FAILURE);
9b179eb0
FM
490 default:
491 abort();
25697a35 492 }
25697a35
GS
493 }
494
2824ec9b 495 if (errflg>0) {
25697a35
GS
496 usage(argv[0]);
497 exit(2);
498 }
499
ed7127e3
FM
500 if (optind<argc) {
501 for (iarq=optind ; iarq<argc ; iarq++) {
502 if (NAccessLog>=MAXLOGS) {
503 debuga(_("Too many log files passed on command line.\n"));
504 exit(EXIT_FAILURE);
505 }
506 if (strlen(argv[iarq])>=MAX_LOG_FILELEN) {
507 debuga(_("Log file name too long passed on command line: %s\n"),argv[iarq]);
508 exit(EXIT_FAILURE);
509 }
510 strcpy(AccessLog[NAccessLog],argv[iarq]);
511 NAccessLog++;
512 AccessLogFromCmdLine++;
513 }
514 }
515
10210234 516 if(debug) debuga(_("Init\n"));
25697a35 517
2824ec9b 518 if(ConfigFile[0] == '\0') snprintf(ConfigFile,sizeof(ConfigFile),"%s/sarg.conf",SYSCONFDIR);
936c9905 519 if(access(ConfigFile, R_OK) != 0) {
10210234 520 debuga(_("Cannot open config file: %s - %s\n"),ConfigFile,strerror(errno));
06b39c87 521 exit(EXIT_FAILURE);
936c9905
FM
522 }
523
25697a35 524 if(access(ConfigFile, R_OK) == 0)
d6e703cc 525 getconf();
936c9905 526
8bb4048f 527 if(userip) UserIp=true;
be081e85 528
2824ec9b 529 if(dns) Ip2Name=true;
be081e85 530
491b862f
GS
531 if(realt) {
532 realtime();
2824ec9b 533 exit(EXIT_SUCCESS);
491b862f 534 }
25697a35 535
0349fa24 536 if(IndexTree == INDEX_TREE_FILE)
491b862f
GS
537 strcpy(ImageFile,"../images");
538 else
539 strcpy(ImageFile,"../../../images");
540
25697a35 541 dataonly=0;
c274f011 542 if(DataFile[0] != '\0')
25697a35 543 dataonly++;
936c9905 544
2824ec9b 545 if(NAccessLog == 0) {
0a4e18e1
FM
546 strcpy(AccessLog[0],"/var/log/squid/access.log");
547 NAccessLog++;
25697a35
GS
548 }
549
d183fb7f
FM
550 if(output_css) {
551 css_content(stdout);
552 exit(EXIT_SUCCESS);
553 }
9b179eb0 554 if(split) {
b24165e3
FM
555 for (iarq=0 ; iarq<NAccessLog ; iarq++)
556 splitlog(AccessLog[iarq], df, dfrom, duntil, convert);
2824ec9b 557 exit(EXIT_SUCCESS);
25697a35 558 }
9b179eb0 559 if(convert) {
b24165e3
FM
560 for (iarq=0 ; iarq<NAccessLog ; iarq++)
561 convlog(AccessLog[iarq], df, dfrom, duntil);
2824ec9b 562 exit(EXIT_SUCCESS);
25697a35
GS
563 }
564
48864d28 565 load_excludecodes(ExcludeCodes);
25697a35
GS
566
567 if(access(PasswdFile, R_OK) == 0) {
568 getusers(PasswdFile,debug);
569 puser++;
570 }
571
572 if(hexclude[0] == '\0')
573 strcpy(hexclude,ExcludeHosts);
43f18f45 574 if(hexclude[0] != '\0') {
936c9905 575 gethexclude(hexclude,debug);
2824ec9b 576 fhost=true;
25697a35
GS
577 }
578
085c1e1f
FM
579 if(ReportType == 0) {
580 ReportType=REPORT_TYPE_TOPUSERS | REPORT_TYPE_TOPSITES | REPORT_TYPE_USERS_SITES |
581 REPORT_TYPE_SITES_USERS | REPORT_TYPE_DATE_TIME | REPORT_TYPE_DENIED |
582 REPORT_TYPE_AUTH_FAILURES | REPORT_TYPE_SITE_USER_TIME_DATE | REPORT_TYPE_DOWNLOADS;
583 }
25697a35
GS
584
585 if(access(ExcludeUsers, R_OK) == 0) {
586 getuexclude(ExcludeUsers,debug);
2824ec9b 587 fuser=true;
25697a35
GS
588 }
589
590 indexonly=0;
591 if(fuser) {
43f18f45 592 if(is_indexonly())
25697a35
GS
593 indexonly++;
594 }
d6e703cc 595 if(strcmp(ExcludeUsers,"indexonly") == 0) indexonly++;
0349fa24 596 if(Index == INDEX_ONLY) indexonly++;
25697a35 597
db5151ed 598 if(MaxElapsed[0] != '\0') max_elapsed=atol(MaxElapsed);
25697a35 599
db5151ed 600 if(outdir[0] == '\0') strcpy(outdir,OutputDir);
25697a35
GS
601 strcat(outdir,"/");
602
d6e703cc 603 if(uagent[0] == '\0') strcpy(uagent,UserAgentLog);
25697a35 604
d6e703cc
FM
605 if(tmp[0] == '\0') strcpy(tmp,TempDir);
606 else strcpy(TempDir,tmp);
4e302ff5
FM
607 /*
608 For historical reasons, the temporary directory is the subdirectory "sarg" of the path
609 provided by the user.
610 */
611 strcat(tmp,"/sarg");
25697a35 612
1c74d05a
FM
613 if (tmp[0]!='\0' && strncmp(outdir,tmp,strlen(tmp))==0) {
614 debuga(_("The output directory \"%s\" must be outside of the temporary directory \"%s\"\n"),outdir,tmp);
615 exit(EXIT_FAILURE);
616 }
617
d6e703cc
FM
618 if(df[0] == '\0') strcpy(df,DateFormat);
619 else strcpy(DateFormat,df);
25697a35
GS
620
621 if(df[0] == '\0') {
622 strcpy(df,"u");
623 strcpy(DateFormat,"u");
624 }
fa6552b0
FM
625 if (df[0]=='w')
626 IndexTree=INDEX_TREE_FILE;
25697a35 627
4af2f8ff 628 if(email[0] == '\0' && OutputEmail[0] != '\0') strcpy(email,OutputEmail);
25697a35 629
e6414a9d 630 if(email[0] != '\0') {
4e302ff5
FM
631 my_mkdir(tmp);
632 strcpy(outdir,tmp);
25697a35 633 strcat(outdir,"/");
d6e703cc 634 }
25697a35 635
4e302ff5
FM
636 if(access(tmp, R_OK) == 0) {
637 unlinkdir(tmp,1);
51465d08 638 }
4e302ff5
FM
639 my_mkdir(tmp);
640 snprintf(denied_unsort,sizeof(denied_unsort),"%s/denied.log.unsort",tmp);
641 snprintf(denied_sort,sizeof(denied_sort),"%s/denied.log",tmp);
642 snprintf(authfail_unsort,sizeof(authfail_unsort),"%s/authfail.log.unsort",tmp);
25697a35
GS
643
644 if(debug) {
10210234
FM
645 debuga(_("Parameters:\n"));
646 debuga(_(" Hostname or IP address (-a) = %s\n"),addr);
647 debuga(_(" Useragent log (-b) = %s\n"),uagent);
648 debuga(_(" Exclude file (-c) = %s\n"),hexclude);
649 debuga(_(" Date from-until (-d) = %s\n"),date);
650 debuga(_(" Email address to send reports (-e) = %s\n"),email);
651 debuga(_(" Config file (-f) = %s\n"),ConfigFile);
25697a35 652 if(strcmp(df,"e") == 0)
10210234 653 debuga(_(" Date format (-g) = Europe (dd/mm/yyyy)\n"));
25697a35 654 if(strcmp(df,"u") == 0)
10210234 655 debuga(_(" Date format (-g) = USA (mm/dd/yyyy)\n"));
25697a35 656 if(strcmp(df,"w") == 0)
10210234
FM
657 debuga(_(" Date format (-g) = Sites & Users (yyyy/ww)\n"));
658 debuga(_(" IP report (-i) = %s\n"),(iprel) ? _("Yes") : _("No"));
0a4e18e1 659 for (iarq=0 ; iarq<NAccessLog ; iarq++)
10210234 660 debuga(_(" Input log (-l) = %s\n"),AccessLog[iarq]);
1f482a8d
FM
661 for (iarq=0 ; iarq<NRedirectorLogs ; iarq++)
662 debuga(_(" Redirector log (-L) = %s\n"),RedirectorLogs[iarq]);
10210234
FM
663 debuga(_(" Resolve IP Address (-n) = %s\n"),(Ip2Name) ? _("Yes") : _("No"));
664 debuga(_(" Output dir (-o) = %s\n"),outdir);
665 debuga(_("Use Ip Address instead of userid (-p) = %s\n"),(UserIp) ? _("Yes") : _("No"));
666 debuga(_(" Accessed site (-s) = %s\n"),site);
667 debuga(_(" Time (-t) = %s\n"),hm);
668 debuga(_(" User (-u) = %s\n"),us);
669 debuga(_(" Temporary dir (-w) = %s\n"),tmp);
670 debuga(_(" Debug messages (-x) = %s\n"),(debug) ? _("Yes") : _("No"));
671 debuga(_(" Process messages (-z) = %s\n"),(debugz) ? _("Yes") : _("No"));
672 debuga("\n");
25697a35
GS
673 }
674
675 if(debugm) {
3c567423
FM
676 printf(_("Parameters:\n"));
677 printf(_(" Hostname or IP address (-a) = %s\n"),addr);
678 printf(_(" Useragent log (-b) = %s\n"),uagent);
679 printf(_(" Exclude file (-c) = %s\n"),hexclude);
680 printf(_(" Date from-until (-d) = %s\n"),date);
681 printf(_(" Email address to send reports (-e) = %s\n"),email);
682 printf(_(" Config file (-f) = %s\n"),ConfigFile);
25697a35 683 if(strcmp(df,"e") == 0)
3c567423 684 printf(_(" Date format (-g) = Europe (dd/mm/yyyy)\n"));
25697a35 685 if(strcmp(df,"u") == 0)
3c567423 686 printf(_(" Date format (-g) = USA (mm/dd/yyyy)\n"));
25697a35 687 if(strcmp(df,"w") == 0)
3c567423
FM
688 printf(_(" Date format (-g) = Sites & Users (yyyy/ww)\n"));
689 printf(_(" IP report (-i) = %s\n"),(iprel) ? _("Yes") : _("No"));
0a4e18e1 690 for (iarq=0 ; iarq<NAccessLog ; iarq++)
3c567423 691 printf(_(" Input log (-l) = %s\n"),AccessLog[iarq]);
1f482a8d
FM
692 for (iarq=0 ; iarq<NRedirectorLogs ; iarq++)
693 printf(_(" Redirector log (-L) = %s\n"),RedirectorLogs[iarq]);
3c567423
FM
694 printf(_(" Resolve IP Address (-n) = %s\n"),(Ip2Name) ? _("Yes") : _("No"));
695 printf(_(" Output dir (-o) = %s\n"),outdir);
696 printf(_("Use Ip Address instead of userid (-p) = %s\n"),(UserIp) ? _("Yes") : _("No"));
697 printf(_(" Accessed site (-s) = %s\n"),site);
698 printf(_(" Time (-t) = %s\n"),hm);
699 printf(_(" User (-u) = %s\n"),us);
700 printf(_(" Temporary dir (-w) = %s\n"),tmp);
701 printf(_(" Debug messages (-x) = %s\n"),(debug) ? _("Yes") : _("No"));
702 printf(_(" Process messages (-z) = %s\n"),(debugz) ? _("Yes") : _("No"));
703 printf(_("sarg version: %s\n"),VERSION);
25697a35
GS
704 }
705
d2fe0c32 706 if(debug)
10210234 707 debuga(_("sarg version: %s\n"),VERSION);
25697a35 708
04a01ed3
FM
709#ifdef ENABLE_DOUBLE_CHECK_DATA
710 debuga(_("Sarg compiled to report warnings if the output is inconsistent\n"));
711#endif
712
f2ec8c75 713 maxopenfiles=MAX_OPEN_USER_FILES;
e112fa1f 714#ifdef HAVE_RLIM_T
eee60323 715 if (Ulimit[0] != '\0') {
e112fa1f 716 struct rlimit rl;
243a9fab
FM
717 long l1, l2;
718 int rc=0;
719
25697a35 720#if defined(RLIMIT_NOFILE)
d6e703cc 721 getrlimit (RLIMIT_NOFILE, &rl);
ed1ac52f 722#elif defined(RLIMIT_OFILE)
d6e703cc 723 getrlimit (RLIMIT_OFILE, &rl);
243a9fab
FM
724#else
725#warning "No rlimit resource for the number of open files"
25697a35 726#endif
d6e703cc
FM
727 l1 = rl.rlim_cur;
728 l2 = rl.rlim_max;
729
eee60323
FM
730 rl.rlim_cur = atol(Ulimit);
731 rl.rlim_max = atol(Ulimit);
243a9fab 732#if defined(RLIMIT_NOFILE)
eee60323 733 rc=setrlimit (RLIMIT_NOFILE, &rl);
243a9fab 734#elif defined(RLIMIT_OFILE)
eee60323 735 rc=setrlimit (RLIMIT_OFILE, &rl);
243a9fab
FM
736#else
737#warning "No rlimit resource for the number of open files"
738#endif
eee60323 739 if(rc == -1) {
f2ec8c75 740 debuga(_("setrlimit error - %s\n"),strerror(errno));
d6e703cc 741 }
25697a35 742
d2fe0c32
FM
743 if(debug)
744 debuga("Maximum file descriptor: cur=%ld max=%ld, changed to cur="RLIM_STRING" max="RLIM_STRING,l1,l2,rl.rlim_cur,rl.rlim_max);
25697a35 745 }
e112fa1f 746#endif
25697a35 747
965c4a6f 748 init_usertab(UserTabFile);
25697a35 749
afaa3b67 750 if ((line=longline_create())==NULL) {
10210234 751 debuga(_("Not enough memory to read a log file\n"));
06b39c87 752 exit(EXIT_FAILURE);
ac422f9b
FM
753 }
754
4e302ff5 755 snprintf(sz_Download_Unsort,sizeof(sz_Download_Unsort),"%s/download.unsort", tmp);
25697a35 756
f84a35a3
FM
757 if(DataFile[0]=='\0') {
758 if((ReportType & REPORT_TYPE_DENIED) != 0) {
759 if((fp_denied=MY_FOPEN(denied_unsort,"w"))==NULL) {
d574e592 760 debuga(_("(log) Cannot open file: %s - %s\n"),denied_unsort,strerror(errno));
06b39c87 761 exit(EXIT_FAILURE);
f84a35a3 762 }
294cb3d7 763 }
294cb3d7 764
085c1e1f 765 if((ReportType & REPORT_TYPE_DENIED) != 0 || (ReportType & REPORT_TYPE_AUTH_FAILURES) != 0) {
f84a35a3 766 if((fp_authfail=MY_FOPEN(authfail_unsort,"w"))==NULL) {
d574e592 767 debuga(_("(log) Cannot open file: %s - %s\n"),authfail_unsort,strerror(errno));
06b39c87 768 exit(EXIT_FAILURE);
294cb3d7
FM
769 }
770 }
771 }
772
0a4e18e1
FM
773 for (iarq=0 ; iarq<NAccessLog ; iarq++) {
774 strcpy(arq,AccessLog[iarq]);
25697a35 775
936c9905 776 strcpy(arqtt,arq);
d6e703cc 777
58d7d8fe
FM
778 if(strcmp(arq,"-")==0) {
779 if(debug)
10210234 780 debuga(_("Reading access log file: from stdin\n"));
58d7d8fe 781 fp_in=stdin;
2824ec9b 782 from_stdin=true;
58d7d8fe 783 } else {
c6a3ce24
FM
784 if (date[0]!='\0') {
785 if (stat(arq,&logstat)!=0) {
786 debuga(_("Cannot get the modification time of input log file %s (%s). Processing it anyway\n"),arq,strerror(errno));
787 } else {
788 struct tm *logtime=localtime(&logstat.st_mtime);
789 if ((logtime->tm_year+1900)*10000+(logtime->tm_mon+1)*100+logtime->tm_mday<dfrom) {
790 debuga(_("Ignoring old log file %s\n"),arq);
791 continue;
792 }
793 }
794 }
d2855b39
FM
795 fp_in=decomp(arq,&from_pipe);
796 if(fp_in==NULL) {
d574e592 797 debuga(_("(log) Cannot open log file: %s - %s\n"),arq,strerror(errno));
06b39c87 798 exit(EXIT_FAILURE);
936c9905 799 }
d2855b39 800 if(debug) debuga(_("Reading access log file: %s\n"),arq);
2824ec9b 801 from_stdin=false;
25697a35 802 }
58d7d8fe 803 ilf=ILF_Unknown;
2824ec9b 804 download_flag=false;
ac422f9b 805 // pre-read the file only if we have to show stats
d2855b39 806 if(ShowReadStatistics && !from_stdin && !from_pipe) {
ac422f9b 807 size_t nread,i;
2824ec9b 808 bool skipcr=false;
afaa3b67 809 char tmp4[MAXLEN];
ac422f9b 810
7c0b0078
FM
811 recs1=0UL;
812 recs2=0UL;
25697a35 813
afaa3b67 814 while ((nread=fread(tmp4,1,sizeof(tmp4),fp_in))>0) {
ac422f9b
FM
815 for (i=0 ; i<nread ; i++)
816 if (skipcr) {
afaa3b67 817 if (tmp4[i]!='\n' && tmp4[i]!='\r') {
2824ec9b 818 skipcr=false;
ac422f9b
FM
819 }
820 } else {
afaa3b67 821 if (tmp4[i]=='\n' || tmp4[i]=='\r') {
2824ec9b 822 skipcr=true;
ac422f9b
FM
823 recs1++;
824 }
825 }
826 }
936c9905 827 rewind(fp_in);
fcdc0918
FM
828 printf(_("SARG: Records in file: %lu, reading: %3.2f%%"),recs1,(float) 0);
829 putchar('\r');
936c9905
FM
830 fflush( stdout ) ;
831 }
832
afaa3b67 833 longline_reset(line);
ac422f9b 834
afaa3b67 835 while ((linebuf=longline_read(fp_in,line))!=NULL) {
ac422f9b 836 blen=strlen(linebuf);
58d7d8fe
FM
837
838 if (ilf==ILF_Unknown) {
ac422f9b
FM
839 if(strncmp(linebuf,"#Software: Mic",14) == 0) {
840 fixendofline(linebuf);
f8ed23e3 841 if (debug)
10210234 842 debuga(_("Log is from Microsoft ISA: %s\n"),linebuf);
58d7d8fe
FM
843 ilf=ILF_Isa;
844 ilf_count[ilf]++;
845 continue;
846 }
847
ac422f9b 848 if(strncmp(linebuf,"*** SARG Log ***",16) == 0) {
fa6552b0 849 if (getperiod_fromsarglog(arqtt,&period)<0) {
10210234 850 debuga(_("The name of the file is invalid: %s\n"),arq);
06b39c87 851 exit(EXIT_FAILURE);
58d7d8fe 852 }
58d7d8fe
FM
853 ilf=ILF_Sarg;
854 ilf_count[ilf]++;
855 continue;
856 }
857 }
858
ff8d5836 859 if(!fp_log && strcmp(ParsedOutputLog, "no") != 0 && ilf!=ILF_Sarg) {
58d7d8fe 860 if(access(ParsedOutputLog,R_OK) != 0) {
ff8d5836 861 my_mkdir(ParsedOutputLog);
58d7d8fe
FM
862 }
863 sprintf(arq_log,"%s/sarg_temp.log",ParsedOutputLog);
864 if((fp_log=MY_FOPEN(arq_log,"w"))==NULL) {
d574e592 865 debuga(_("(log) Cannot open log file: %s - %s\n"),arq_log,strerror(errno));
06b39c87 866 exit(EXIT_FAILURE);
58d7d8fe
FM
867 }
868 fputs("*** SARG Log ***\n",fp_log);
869 }
870
936c9905 871 recs2++;
43273c35 872 if( ShowReadStatistics && !from_stdin && !from_pipe && --OutputNonZero<=0) {
2824ec9b 873 double perc = recs2 * 100. / recs1 ;
43273c35 874 printf(_("SARG: Records in file: %lu, reading: %3.2lf%%"),recs2,perc);
fcdc0918 875 putchar('\r');
25697a35
GS
876 fflush (stdout);
877 OutputNonZero = REPORT_EVERY_X_LINES ;
936c9905 878 }
ab950637 879 if(blen < 58) continue;
ac422f9b
FM
880 if(strstr(linebuf,"HTTP/0.0") != 0) continue;
881 if(strstr(linebuf,"logfile turned over") != 0) continue;
882 if(linebuf[0] == ' ') continue;
936c9905 883
936c9905 884 // exclude_string
9c7c6346 885 if(ExcludeString[0] != '\0') {
2824ec9b 886 bool exstring=false;
9c7c6346
FM
887 getword_start(&gwarea,ExcludeString);
888 while(strchr(gwarea.current,':') != 0) {
889 if (getword_multisep(val1,sizeof(val1),&gwarea,':')<0) {
10210234 890 debuga(_("Maybe you have a broken record or garbage in your exclusion string\n"));
06b39c87 891 exit(EXIT_FAILURE);
936c9905 892 }
2824ec9b
FM
893 if((str=(char *) strstr(linebuf,val1)) != (char *) NULL ) {
894 exstring=true;
895 break;
896 }
936c9905 897 }
2824ec9b
FM
898 if(!exstring && (str=(char *) strstr(linebuf,gwarea.current)) != (char *) NULL )
899 exstring=true;
3376a277 900 if(exstring) continue;
936c9905 901 }
936c9905 902
936c9905 903 totregsl++;
936c9905 904 if(debugm)
ac422f9b 905 printf("BUF=%s\n",linebuf);
936c9905 906
fa6552b0 907 t=NULL;
58d7d8fe 908 if (ilf==ILF_Squid || ilf==ILF_Common || ilf==ILF_Unknown) {
ac422f9b 909 getword_start(&gwarea,linebuf);
9c7c6346 910 if (getword(data,sizeof(data),&gwarea,' ')<0) {
d574e592 911 debuga(_("Maybe you have a broken time in your access.log file\n"));
06b39c87 912 exit(EXIT_FAILURE);
936c9905 913 }
fa6552b0
FM
914 if((str=(char *) strchr(data, '.')) != (char *) NULL && (str=(char *) strchr(str+1, '.')) != (char *) NULL ) {
915 strcpy(ip,data);
916 strcpy(elap,"0");
917 if(squid24) {
918 if (getword(user,sizeof(user),&gwarea,' ')<0 || getword_skip(255,&gwarea,' ')<0) {
9f70c14e 919 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
06b39c87 920 exit(EXIT_FAILURE);
ac422f9b 921 }
fa6552b0
FM
922 } else {
923 if (getword_skip(255,&gwarea,' ')<0 || getword(user,sizeof(user),&gwarea,' ')<0) {
2824ec9b
FM
924 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
925 exit(EXIT_FAILURE);
926 }
fa6552b0
FM
927 }
928 if (getword(data,sizeof(data),&gwarea,']')<0 || getword_skip(MAXLEN,&gwarea,'"')<0 ||
929 getword(fun,sizeof(fun),&gwarea,' ')<0) {
930 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
931 exit(EXIT_FAILURE);
932 }
933 if (getword_ptr(linebuf,&url,&gwarea,' ')<0) {
934 debuga(_("Maybe you have a broken url in your %s file\n"),arq);
935 exit(EXIT_FAILURE);
936 }
937 if (getword_skip(MAXLEN,&gwarea,' ')<0) {
938 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
939 exit(EXIT_FAILURE);
940 }
941 if (getword(code2,sizeof(code2),&gwarea,' ')<0) {
942 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
943 exit(EXIT_FAILURE);
944 }
945 if (getword(tam,sizeof(tam),&gwarea,' ')<0) {
946 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
947 exit(EXIT_FAILURE);
948 }
949 if((str=(char *) strchr(gwarea.current, ' ')) != (char *) NULL ) {
950 if (getword(code,sizeof(code),&gwarea,' ')<0) {
2824ec9b
FM
951 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
952 exit(EXIT_FAILURE);
953 }
fa6552b0
FM
954 } else {
955 if (getword(code,sizeof(code),&gwarea,'\0')<0) {
9f70c14e 956 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
06b39c87 957 exit(EXIT_FAILURE);
936c9905 958 }
fa6552b0
FM
959 }
960
961 if ((str = strchr(code, ':')) != NULL)
962 *str = '/';
936c9905 963
fa6552b0
FM
964 if(strcmp(tam,"\0") == 0)
965 strcpy(tam,"0");
936c9905 966
fa6552b0
FM
967 ilf=ILF_Common;
968 ilf_count[ilf]++;
936c9905 969
fa6552b0
FM
970 getword_start(&gwarea,data+1);
971 if (getword_multisep(data,sizeof(data),&gwarea,':')<0){
972 debuga(_("Maybe you have a broken date in your %s file\n"),arq);
973 exit(EXIT_FAILURE);
936c9905 974 }
fa6552b0
FM
975 if (getword_multisep(hora,sizeof(hora),&gwarea,' ')<0){
976 debuga(_("Maybe you have a broken date in your %s file\n"),arq);
977 exit(EXIT_FAILURE);
978 }
979 getword_start(&gwarea,data);
980 if (getword_atoll(&iday,&gwarea,'/')<0){
981 debuga(_("Maybe you have a broken date in your %s file\n"),arq);
982 exit(EXIT_FAILURE);
983 }
984 if (getword(mes,sizeof(mes),&gwarea,'/')<0){
985 debuga(_("Maybe you have a broken date in your %s file\n"),arq);
986 exit(EXIT_FAILURE);
987 }
988 if (getword_atoll(&iyear,&gwarea,'/')<0){
989 debuga(_("Maybe you have a broken date in your %s file\n"),arq);
990 exit(EXIT_FAILURE);
991 }
992
993 imonth=month2num(mes)+1;
994 idata=builddia(iday,imonth,iyear);
995 computedate(iyear,imonth,iday,&tt);
996 t=&tt;
936c9905
FM
997 }
998
58d7d8fe 999 if(ilf==ILF_Unknown || ilf==ILF_Squid) {
9c7c6346 1000 if (getword(elap,sizeof(elap),&gwarea,' ')<0) {
d574e592 1001 debuga(_("Maybe you have a broken elapsed time in your %s file\n"),arq);
06b39c87 1002 exit(EXIT_FAILURE);
936c9905 1003 }
9c7c6346
FM
1004 while(strcmp(elap,"") == 0 && gwarea.current[0] != '\0')
1005 if (getword(elap,sizeof(elap),&gwarea,' ')<0) {
d574e592 1006 debuga(_("Maybe you have a broken elapsed time in your %s file\n"),arq);
06b39c87 1007 exit(EXIT_FAILURE);
936c9905
FM
1008 }
1009 if(strlen(elap) < 1) continue;
9c7c6346 1010 if (getword(ip,sizeof(ip),&gwarea,' ')<0){
d574e592 1011 debuga(_("Maybe you have a broken client IP address in your %s file\n"),arq);
06b39c87 1012 exit(EXIT_FAILURE);
936c9905 1013 }
9c7c6346 1014 if (getword(code,sizeof(code),&gwarea,' ')<0){
d574e592 1015 debuga(_("Maybe you have a broken result code in your %s file\n"),arq);
06b39c87 1016 exit(EXIT_FAILURE);
936c9905 1017 }
9c7c6346 1018 if (getword(tam,sizeof(tam),&gwarea,' ')<0){
d574e592 1019 debuga(_("Maybe you have a broken amount of data in your %s file\n"),arq);
06b39c87 1020 exit(EXIT_FAILURE);
936c9905 1021 }
9c7c6346 1022 if (getword(fun,sizeof(fun),&gwarea,' ')<0){
d574e592 1023 debuga(_("Maybe you have a broken request method in your %s file\n"),arq);
06b39c87 1024 exit(EXIT_FAILURE);
936c9905 1025 }
e5b2c6f0 1026 if (getword_ptr(linebuf,&url,&gwarea,' ')<0){
10210234 1027 debuga(_("Maybe you have a broken url in your %s file\n"),arq);
06b39c87 1028 exit(EXIT_FAILURE);
936c9905 1029 }
9c7c6346 1030 if (getword(user,sizeof(user),&gwarea,' ')<0){
d574e592 1031 debuga(_("Maybe you have a broken user ID in your %s file\n"),arq);
06b39c87 1032 exit(EXIT_FAILURE);
936c9905 1033 }
58d7d8fe
FM
1034 ilf=ILF_Squid;
1035 ilf_count[ilf]++;
fa6552b0
FM
1036
1037 tnum=atoi(data);
1038 t=localtime(&tnum);
1039 if (t == NULL) {
1040 debuga(_("Cannot convert the timestamp from the squid log file\n"));
1041 exit(EXIT_FAILURE);
1042 }
1043
1044 strftime(tbuf2, sizeof(tbuf2), "%H%M", t);
1045
1046 idata=(t->tm_year+1900)*10000+(t->tm_mon+1)*100+t->tm_mday;
936c9905 1047 }
58d7d8fe
FM
1048 }
1049 if (ilf==ILF_Sarg) {
ac422f9b 1050 getword_start(&gwarea,linebuf);
ff8d5836 1051 if (getword(data,sizeof(data),&gwarea,'\t')<0){
9f70c14e 1052 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
06b39c87 1053 exit(EXIT_FAILURE);
936c9905 1054 }
ff8d5836 1055 if (getword(hora,sizeof(hora),&gwarea,'\t')<0) {
9f70c14e 1056 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
06b39c87 1057 exit(EXIT_FAILURE);
936c9905 1058 }
ff8d5836 1059 if (getword(user,sizeof(user),&gwarea,'\t')<0) {
9f70c14e 1060 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
06b39c87 1061 exit(EXIT_FAILURE);
936c9905 1062 }
ff8d5836 1063 if (getword(ip,sizeof(ip),&gwarea,'\t')<0) {
9f70c14e 1064 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
06b39c87 1065 exit(EXIT_FAILURE);
936c9905 1066 }
e5b2c6f0 1067 if (getword_ptr(linebuf,&url,&gwarea,'\t')<0){
10210234 1068 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
06b39c87 1069 exit(EXIT_FAILURE);
936c9905 1070 }
ff8d5836 1071 if (getword(tam,sizeof(tam),&gwarea,'\t')<0){
9f70c14e 1072 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
06b39c87 1073 exit(EXIT_FAILURE);
936c9905 1074 }
ff8d5836 1075 if (getword(code,sizeof(code),&gwarea,'\t')<0){
9f70c14e 1076 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
06b39c87 1077 exit(EXIT_FAILURE);
936c9905 1078 }
ff8d5836 1079 if (getword(elap,sizeof(elap),&gwarea,'\t')<0){
9f70c14e 1080 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
06b39c87 1081 exit(EXIT_FAILURE);
936c9905 1082 }
ff8d5836 1083 if (getword(smartfilter,sizeof(smartfilter),&gwarea,'\0')<0){
9f70c14e 1084 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
06b39c87 1085 exit(EXIT_FAILURE);
936c9905 1086 }
fa6552b0 1087 getword_start(&gwarea,data);
324ba7f3
FM
1088 if (getword_atoll(&iday,&gwarea,'/')<0 || iday<1 || iday>31){
1089 debuga(_("Maybe you have a broken date in your %s file\n"),arq);
1090 exit(EXIT_FAILURE);
1091 }
1092 if (getword_atoll(&imonth,&gwarea,'/')<0 || imonth<1 || imonth>12){
1093 debuga(_("Maybe you have a broken date in your %s file\n"),arq);
1094 exit(EXIT_FAILURE);
fa6552b0
FM
1095 }
1096 if (getword_atoll(&iyear,&gwarea,'\0')<0){
1097 debuga(_("Maybe you have a broken date in your %s file\n"),arq);
1098 exit(EXIT_FAILURE);
1099 }
1100 idata=builddia(iday,imonth,iyear);
1101 computedate(iyear,imonth,iday,&tt);
1102 t=&tt;
58d7d8fe
FM
1103 }
1104 if (ilf==ILF_Isa) {
ac422f9b 1105 if (linebuf[0] == '#') {
076cbab8
FM
1106 int ncols,cols[ISACOL_Last];
1107
ac422f9b
FM
1108 fixendofline(linebuf);
1109 getword_start(&gwarea,linebuf);
076cbab8 1110 // remove the #Fields: column at the beginning of the line
9c7c6346 1111 if (getword_skip(1000,&gwarea,' ')<0){
10210234 1112 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
06b39c87 1113 exit(EXIT_FAILURE);
936c9905 1114 }
076cbab8
FM
1115 for (ncols=0 ; ncols<ISACOL_Last ; ncols++) cols[ncols]=-1;
1116 ncols=0;
9c7c6346
FM
1117 while(gwarea.current[0] != '\0') {
1118 if (getword(val1,sizeof(val1),&gwarea,'\t')<0){
9f70c14e 1119 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
06b39c87 1120 exit(EXIT_FAILURE);
936c9905 1121 }
076cbab8
FM
1122 if(strcmp(val1,"c-ip") == 0) cols[ISACOL_Ip]=ncols;
1123 if(strcmp(val1,"cs-username") == 0) cols[ISACOL_UserName]=ncols;
1124 if(strcmp(val1,"date") == 0) cols[ISACOL_Date]=ncols;
1125 if(strcmp(val1,"time") == 0) cols[ISACOL_Time]=ncols;
1126 if(strcmp(val1,"time-taken") == 0) cols[ISACOL_TimeTaken]=ncols;
1127 if(strcmp(val1,"sc-bytes") == 0) cols[ISACOL_Bytes]=ncols;
1128 if(strcmp(val1,"cs-uri") == 0) cols[ISACOL_Uri]=ncols;
1129 if(strcmp(val1,"sc-status") == 0) cols[ISACOL_Status]=ncols;
1130 ncols++;
936c9905 1131 }
076cbab8
FM
1132 if (cols[ISACOL_Ip]>=0) {
1133 isa_ncols=ncols;
3376a277
FM
1134 for (ncols=0 ; ncols<ISACOL_Last ; ncols++)
1135 isa_cols[ncols]=cols[ncols];
936c9905 1136 }
076cbab8 1137 continue;
936c9905 1138 }
076cbab8 1139 if (!isa_ncols) continue;
ac422f9b 1140 getword_start(&gwarea,linebuf);
076cbab8 1141 for (x=0 ; x<isa_ncols ; x++) {
e5b2c6f0 1142 if (getword_ptr(linebuf,&str,&gwarea,'\t')<0) {
10210234 1143 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq);
06b39c87 1144 exit(EXIT_FAILURE);
936c9905 1145 }
076cbab8 1146 if (x==isa_cols[ISACOL_Ip]) {
e5b2c6f0 1147 if (strlen(str)>=sizeof(ip)) {
10210234 1148 debuga(_("Maybe you have a broken IP in your %s file\n"),arq);
06b39c87 1149 exit(EXIT_FAILURE);
5160b452 1150 }
e5b2c6f0 1151 strcpy(ip,str);
076cbab8 1152 } else if (x==isa_cols[ISACOL_UserName]) {
e5b2c6f0 1153 if (strlen(str)>=sizeof(user)) {
d574e592 1154 debuga(_("Maybe you have a broken user ID in your %s file\n"),arq);
06b39c87 1155 exit(EXIT_FAILURE);
5160b452 1156 }
e5b2c6f0 1157 strcpy(user,str);
076cbab8 1158 } else if (x==isa_cols[ISACOL_Date]) {
e5b2c6f0 1159 if (strlen(str)>=sizeof(data)) {
10210234 1160 debuga(_("Maybe you have a broken date in your %s file\n"),arq);
06b39c87 1161 exit(EXIT_FAILURE);
5160b452 1162 }
e5b2c6f0 1163 strcpy(data,str);
076cbab8 1164 } else if (x==isa_cols[ISACOL_Time]) {
e5b2c6f0 1165 if (strlen(str)>=sizeof(hora)) {
10210234 1166 debuga(_("Maybe you have a broken time in your %s file\n"),arq);
06b39c87 1167 exit(EXIT_FAILURE);
5160b452 1168 }
e5b2c6f0 1169 strcpy(hora,str);
076cbab8 1170 } else if (x==isa_cols[ISACOL_TimeTaken]) {
e5b2c6f0 1171 if (strlen(str)>=sizeof(elap)) {
10210234 1172 debuga(_("Maybe you have a broken download duration in your %s file\n"),arq);
06b39c87 1173 exit(EXIT_FAILURE);
5160b452 1174 }
e5b2c6f0 1175 strcpy(elap,str);
076cbab8 1176 } else if (x==isa_cols[ISACOL_Bytes]) {
e5b2c6f0 1177 if (strlen(str)>=sizeof(tam)) {
10210234 1178 debuga(_("Maybe you have a broken download size in your %s file\n"),arq);
06b39c87 1179 exit(EXIT_FAILURE);
5160b452 1180 }
e5b2c6f0 1181 strcpy(tam,str);
076cbab8 1182 } else if (x==isa_cols[ISACOL_Uri]) {
e5b2c6f0 1183 url=str;
076cbab8 1184 } else if (x==isa_cols[ISACOL_Status]) {
e5b2c6f0 1185 if (strlen(str)>=sizeof(code)) {
10210234 1186 debuga(_("Maybe you have a broken access code in your %s file\n"),arq);
06b39c87 1187 exit(EXIT_FAILURE);
5160b452 1188 }
e5b2c6f0 1189 strcpy(code,str);
936c9905
FM
1190 }
1191 }
1192
1193 if(strcmp(code,"401") == 0 || strcmp(code,"403") == 0 || strcmp(code,"407") == 0) {
1194 sprintf(val1,"DENIED/%s",code);
1195 strcpy(code,val1);
1196 }
9c7c6346 1197 getword_start(&gwarea,data);
fa6552b0
FM
1198 if (getword_atoll(&iyear,&gwarea,'-')<0){
1199 debuga(_("Maybe you have a broken year in your %s file\n"),arq);
06b39c87 1200 exit(EXIT_FAILURE);
936c9905 1201 }
fa6552b0
FM
1202 if (getword_atoll(&imonth,&gwarea,'-')<0){
1203 debuga(_("Maybe you have a broken month in your %s file\n"),arq);
06b39c87 1204 exit(EXIT_FAILURE);
936c9905 1205 }
fa6552b0
FM
1206 if (getword_atoll(&iday,&gwarea,'\0')<0){
1207 debuga(_("Maybe you have a broken day in your %s file\n"),arq);
06b39c87 1208 exit(EXIT_FAILURE);
936c9905 1209 }
936c9905 1210
fa6552b0
FM
1211 idata=builddia(iday,imonth,iyear);
1212 computedate(iyear,imonth,iday,&tt);
1213 t=&tt;
1214 }
1215 if (t==NULL) {
1216 debuga(_("Unknown input log file format\n"));
1217 break;
936c9905
FM
1218 }
1219
324ba7f3 1220 strftime(dia, sizeof(dia), "%d/%m/%Y", t);
43cc1649
FM
1221 snprintf(hora,sizeof(hora),"%02d:%02d:%02d",t->tm_hour,t->tm_min,t->tm_sec);
1222
936c9905
FM
1223 if(debugm)
1224 printf("DATE=%s IDATA=%d DFROM=%d DUNTIL=%d\n",date,idata,dfrom,duntil);
1225
0445cbf9
FM
1226 if(date[0] != '\0'){
1227 if(idata < dfrom || idata > duntil) continue;
1228 }
809a7534 1229
9426efec 1230 // Record only hours usage which is required
9f70c14e
FM
1231 if (t) {
1232 if( bsearch( &( t -> tm_wday ), weekdays.list, weekdays.len,
1233 sizeof( int ), compar ) == NULL )
1234 continue;
9426efec 1235
9f70c14e
FM
1236 if( bsearch( &( t -> tm_hour ), hours.list, hours.len,
1237 sizeof( int ), compar ) == NULL )
1238 continue;
1239 }
9426efec
FM
1240
1241
809a7534
FM
1242 if(strlen(user) > MAX_USER_LEN) {
1243 if (debugm) printf(_("User ID too long: %s\n"),user);
1244 totregsx++;
1245 continue;
1246 }
1247
1248 // include_users
1249 if(IncludeUsers[0] != '\0') {
1250 sprintf(val1,":%s:",user);
1251 if((str=(char *) strstr(IncludeUsers,val1)) == (char *) NULL )
1252 continue;
1253 }
1254
1255 if(vercode(code)) {
1256 if (debugm) printf(_("Excluded code: %s\n"),code);
1257 totregsx++;
1258 continue;
1259 }
1260
1261 if(testvaliduserchar(user))
1262 continue;
1263
1264#if 0
1265 if((str = strstr(user,"%20")) != NULL) {
1266 /*
1267 This is a patch introduced to solve bug #1624251 reported at sourceforge but
1268 the side effect is to truncate the name at the first space and merge the reports
1269 of people whose name is identical up to the first space.
1270
1271 The old code used to truncate the user name at the first % if a %20 was
1272 found anywhere in the string. That means the string could be truncated
1273 at the wrong place if another % occured before the %20. This new code should
1274 avoid that problem and only truncate at the space. There is no bug
1275 report indicating that anybody noticed this.
1276 */
1277 *str='\0';
1278 }
1279
1280 /*
1281 Code prior to 2.2.7 used to replace any %xx by a dot as long as a %5c was
1282 found in the user name.
1283 */
1284 while((str = strstr(user,"%5c")) != NULL) {
1285 *str='.';
1286 for (x=3 ; str[x] ; x++) str[x-2]=str[x];
1287 }
1288#endif
1289
1290 urly=url;
1291
1292 if(ilf!=ILF_Sarg) {
1293 /*
1294 The full URL is not saved in sarg log. There is no point in testing the URL to detect
1295 a downloaded file.
1296 */
1297 download_flag=is_download_suffix(url);
1298 if (download_flag) {
1299 download_url=url;
1300 download_count++;
1301 }
c36c7384 1302 } else
2824ec9b 1303 download_flag=false;
809a7534
FM
1304
1305 // remove any protocol:// at the beginning of the URL
1306 if ((str = strchr(url,'/')) != NULL && str[1] == '/') {
1307 int i;
1308
1309 str+=2;
1310 for (i=0 ; str[i] ; i++)
1311 url[i]=str[i];
1312 url[i]='\0';
1313 }
1314
1315 if(!LongUrl) {
f84a35a3 1316 url_hostname(url,hostname,sizeof(hostname));
809a7534
FM
1317 url=hostname;
1318 }
1319
0445cbf9
FM
1320 if(url[0] == '\0') continue;
1321
f2ec8c75
FM
1322 if(addr[0] != '\0'){
1323 if(strcmp(addr,ip)!=0) continue;
1324 }
1325 if(fhost) {
1326 if(!vhexclude(url)) {
1327 if (debugm) printf(_("Excluded site: %s\n"),url);
1328 totregsx++;
1329 continue;
936c9905
FM
1330 }
1331 }
25697a35 1332
f2ec8c75 1333 if(hm[0] != '\0') {
0445cbf9 1334 hmr[0]='\0';
f2ec8c75
FM
1335 chm++;
1336 getword_start(&gwarea,hora);
1337 while(chm) {
1338 if (getword_multisep(warea,sizeof(warea),&gwarea,':')<0){
10210234 1339 debuga(_("Maybe you have a broken time in your %s file\n"),arq);
06b39c87 1340 exit(EXIT_FAILURE);
f2ec8c75
FM
1341 }
1342 strncat(hmr,warea,2);
1343 chm--;
936c9905 1344 }
f2ec8c75
FM
1345 strncat(hmr,gwarea.current,2);
1346
1347 if(atoi(hmr) < atoi(hm) || atoi(hmr) > atoi(hmf)) continue;
936c9905 1348 }
f2ec8c75
FM
1349
1350 if(site[0] != '\0'){
1351 if(strstr(url,site)==0) continue;
936c9905
FM
1352 }
1353
8bb4048f 1354 if(UserIp) {
936c9905 1355 strcpy(user,ip);
8bb4048f 1356 id_is_ip=true;
f2ec8c75 1357 } else {
8bb4048f 1358 id_is_ip=false;
f2ec8c75
FM
1359 if(strcmp(user,"-") == 0 || strcmp(user," ") == 0 || strcmp(user,"") == 0) {
1360 if(RecordsWithoutUser == RECORDWITHOUTUSER_IP) {
1361 strcpy(user,ip);
8bb4048f 1362 id_is_ip=true;
f2ec8c75
FM
1363 }
1364 if(RecordsWithoutUser == RECORDWITHOUTUSER_IGNORE)
1365 continue;
1366 if(RecordsWithoutUser == RECORDWITHOUTUSER_EVERYBODY)
1367 strcpy(user,"everybody");
1368 } else {
1369 strlow(user);
1370 if(NtlmUserFormat == NTLMUSERFORMAT_USER) {
1371 if((str = strchr(user,'_')) != 0) {
1372 strcpy(warea,str+1);
1373 strcpy(user,warea);
1374 }
1375 if((str = strchr(user,'+')) != 0) {
1376 strcpy(warea,str+1);
1377 strcpy(user,warea);
1378 }
1379 }
1380 }
120d768c 1381 }
936c9905 1382
f2ec8c75
FM
1383 if(us[0] != '\0'){
1384 if(strcmp(user,us)!=0) continue;
936c9905
FM
1385 }
1386
1387 if(puser) {
1388 sprintf(wuser,":%s:",user);
1389 if(strstr(userfile, wuser) == 0)
1390 continue;
1391 }
1392
f2ec8c75
FM
1393 if(fuser) {
1394 if(!vuexclude(user)) {
1395 if (debugm) printf(_("Excluded user: %s\n"),user);
1396 totregsx++;
1397 continue;
936c9905
FM
1398 }
1399 }
1400
f2ec8c75
FM
1401 if(strcmp(user,"-") ==0 || strcmp(user," ") ==0 || strcmp(user,"") ==0 || strcmp(user,":") ==0)
1402 continue;
936c9905 1403
f2ec8c75 1404 if(max_elapsed) {
936c9905
FM
1405 if(atol(elap)>max_elapsed) {
1406 elap[0]='0';
1407 elap[1]='\0';
1408 }
1409 }
1410
f2ec8c75
FM
1411 if((str=(char *) strstr(linebuf, "[SmartFilter:")) != (char *) NULL ) {
1412 fixendofline(str);
1413 sprintf(smartfilter,"\"%s\"",str+1);
1414 } else sprintf(smartfilter,"\"\"");
1415
1416 nopen=0;
1417 prev_ufile=NULL;
1418 for (ufile=first_user_file ; ufile && strcmp(user,ufile->user->id)!=0 ; ufile=ufile->next) {
1419 prev_ufile=ufile;
1420 if (ufile->file) nopen++;
1421 }
1422 if (!ufile) {
1423 ufile=malloc(sizeof(*ufile));
1424 if (!ufile) {
10210234 1425 debuga(_("Not enough memory to store the user %s\n"),user);
06b39c87 1426 exit(EXIT_FAILURE);
f2ec8c75
FM
1427 }
1428 memset(ufile,0,sizeof(*ufile));
1429 ufile->next=first_user_file;
1430 first_user_file=ufile;
1431 uinfo=userinfo_create(user);
1432 ufile->user=uinfo;
1433 uinfo->id_is_ip=id_is_ip;
1434 } else {
1435 if (prev_ufile) {
1436 prev_ufile->next=ufile->next;
1437 ufile->next=first_user_file;
1438 first_user_file=ufile;
1439 }
1440 }
1441
1442 if (ufile->file==NULL) {
1443 if (nopen>=maxopenfiles) {
1444 x=0;
1445 for (ufile1=first_user_file ; ufile1 ; ufile1=ufile1->next) {
1446 if (ufile1->file!=NULL) {
1447 if (x>=maxopenfiles) {
43cc1649
FM
1448 if (fclose(ufile1->file)==EOF) {
1449 debuga(_("Failed to close the log file of user %s - %s\n"),ufile1->user->id,strerror(errno));
1450 exit(EXIT_FAILURE);
1451 }
f2ec8c75
FM
1452 ufile1->file=NULL;
1453 }
1454 x++;
25697a35 1455 }
936c9905 1456 }
f2ec8c75 1457 }
4e302ff5
FM
1458 if (snprintf (tmp3, sizeof(tmp3), "%s/%s.unsort", tmp, ufile->user->filename)>=sizeof(tmp3)) {
1459 debuga(_("Temporary user file name too long: %s/%s.unsort\n"), tmp, ufile->user->filename);
06b39c87 1460 exit(EXIT_FAILURE);
0445cbf9 1461 }
f2ec8c75 1462 if ((ufile->file = MY_FOPEN (tmp3, "a")) == NULL) {
9426efec 1463 debuga(_("(log) Cannot open temporary file: %s - %s\n"), tmp3, strerror(errno));
f2ec8c75
FM
1464 exit (1);
1465 }
1466 }
ac422f9b 1467
f2ec8c75
FM
1468 /*if ( strcmp ( user , sz_Last_User ) != 0 ) {
1469 if ( fp_Write_User )
1470 fclose( fp_Write_User ) ;
4e302ff5 1471 sprintf (tmp3, "%s/%s.unsort", tmp, user);
25697a35 1472
f2ec8c75 1473 if ((fp_Write_User = MY_FOPEN (tmp3, "a")) == NULL) {
c36c7384 1474 fprintf (stderr, "%s: (log) %s: %s - %s\n", argv[0], _("Cannot open temporary file"), tmp3, strerror(errno));
f2ec8c75
FM
1475 exit (1);
1476 }
1477 strcpy( sz_Last_User , user ) ;
1478 }*/
43cc1649
FM
1479 if (fprintf(ufile->file, "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",dia,hora,ip,url,tam,code,elap,smartfilter)<=0) {
1480 debuga(_("Write error in the log file of user %s\n"),user);
1481 exit(EXIT_FAILURE);
1482 }
25697a35 1483
f2ec8c75
FM
1484 if(fp_log && ilf!=ILF_Sarg)
1485 fprintf(fp_log, "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",dia,hora,user,ip,url,tam,code,elap,smartfilter);
25697a35 1486
f2ec8c75 1487 totregsg++;
936c9905 1488
f84a35a3 1489 if(!dataonly && download_flag && download_url && strstr(code,"DENIED") == 0) {
f2ec8c75 1490 ndownload = 1;
936c9905 1491
f2ec8c75
FM
1492 if ( ! fp_Download_Unsort ) {
1493 if ((fp_Download_Unsort = MY_FOPEN ( sz_Download_Unsort, "a")) == NULL) {
f2e7644d 1494 debuga(_("(log) Cannot open temporary file: %s - %s\n"),sz_Download_Unsort, strerror(errno));
f2ec8c75 1495 exit (1);
936c9905
FM
1496 }
1497 }
f2ec8c75
FM
1498 fprintf(fp_Download_Unsort,"%s\t%s\t%s\t%s\t%s\n",dia,hora,user,ip,download_url);
1499 }
1500
1501 if((ReportType & REPORT_TYPE_DENIED) != 0 || (ReportType & REPORT_TYPE_AUTH_FAILURES) != 0) {
f84a35a3 1502 if(fp_denied && strstr(code,"DENIED/403") != 0) {
f2ec8c75
FM
1503 fprintf(fp_denied, "%s\t%s\t%s\t%s\t%s\n",dia,hora,user,ip,urly);
1504 denied_count++;
1505 }
f84a35a3
FM
1506 if(fp_authfail && (strstr(code,"DENIED/401") != 0 || strstr(code,"DENIED/407") != 0)) {
1507 fprintf(fp_authfail, "%s\t%s\t%s\t%s\t%s\n",dia,hora,user,ip,urly);
f2ec8c75
FM
1508 authfail_count++;
1509 }
1510 }
936c9905 1511
fa6552b0
FM
1512 if (ilf!=ILF_Sarg) {
1513 if(!totper || idata<mindate){
1514 mindate=idata;
1515 memcpy(&period.start,t,sizeof(*t));
1516 strcpy(start_hour,tbuf2);
1517 }
1518 if (!totper || idata>maxdate) {
1519 maxdate=idata;
1520 memcpy(&period.end,t,sizeof(*t));
936c9905 1521 }
fa6552b0 1522 totper=true;
936c9905 1523 }
f2ec8c75
FM
1524
1525 if(debugm){
1526 printf("IP=\t%s\n",ip);
1527 printf("USER=\t%s\n",user);
1528 printf("ELAP=\t%s\n",elap);
1529 printf("DATE=\t%s\n",dia);
1530 printf("TIME=\t%s\n",hora);
1531 printf("FUNC=\t%s\n",fun);
1532 printf("URL=\t%s\n",url);
1533 printf("CODE=\t%s\n",code);
1534 printf("LEN=\t%s\n",tam);
1535 }
25697a35 1536 }
58d7d8fe 1537 if (!from_stdin) {
d2855b39
FM
1538 if (from_pipe)
1539 pclose(fp_in);
43273c35 1540 else {
d2855b39 1541 fclose(fp_in);
43273c35
FM
1542 if( ShowReadStatistics )
1543 printf(_("SARG: Records in file: %lu, reading: %3.2f%%\n"),recs1, (float) 100 );
1544 }
58d7d8fe 1545 }
25697a35
GS
1546 }
1547
42b117e3
FM
1548 if (debug)
1549 debuga(_(" Records read: %ld, written: %ld, excluded: %ld\n"),totregsl,totregsg,totregsx);
1550
afaa3b67 1551 longline_destroy(&line);
2357ef77 1552 if ( fp_Download_Unsort )
25697a35
GS
1553 fclose (fp_Download_Unsort);
1554
f2ec8c75
FM
1555 for (ufile=first_user_file ; ufile ; ufile=ufile1) {
1556 ufile1=ufile->next;
1557 if (ufile->file!=NULL) fclose(ufile->file);
1558 free(ufile);
1559 }
25697a35 1560
43f18f45
FM
1561 free_download();
1562 free_excludecodes();
1563 free_exclude();
1564
25697a35 1565 if(debug) {
58d7d8fe
FM
1566 int totalcount=0;
1567
1568 for (ilf=0 ; ilf<ILF_Last ; ilf++) totalcount+=ilf_count[ilf];
1569
58d7d8fe 1570 if(ilf_count[ILF_Common]>0 && ilf_count[ILF_Squid]>0)
10210234 1571 debuga(_("Log with mixed records format (squid and common log)\n"));
936c9905 1572
58d7d8fe 1573 if(ilf_count[ILF_Common]>0 && ilf_count[ILF_Squid]==0)
10210234 1574 debuga(_("Common log format\n"));
936c9905 1575
58d7d8fe 1576 if(ilf_count[ILF_Common]==0 && ilf_count[ILF_Squid]>0)
10210234 1577 debuga(_("Squid log format\n"));
25697a35 1578
58d7d8fe 1579 if(ilf_count[ILF_Sarg]>0)
10210234 1580 debuga(_("Sarg log format\n"));
936c9905 1581
42b117e3
FM
1582 if(totalcount==0 && totregsg)
1583 debuga(_("Log with invalid format\n"));
25697a35 1584 }
936c9905 1585
25697a35 1586 if(!totregsg){
9426efec
FM
1587 debuga(_("No records found\n"));
1588 debuga(_("End\n"));
42b117e3
FM
1589 if(fp_denied) fclose(fp_denied);
1590 if(fp_authfail) fclose(fp_authfail);
f2ec8c75 1591 userinfo_free();
42b117e3 1592 if(userfile) free(userfile);
cd025686 1593 close_usertab();
2824ec9b 1594 exit(EXIT_SUCCESS);
25697a35
GS
1595 }
1596
42b117e3
FM
1597 if (date[0]!='\0') {
1598 char date0[30], date1[30];
1599
1600 strftime(date0,sizeof(date0),"%d/%m/%Y",&period.start);
1601 strftime(date1,sizeof(date1),"%d/%m/%Y",&period.end);
1602 debuga(_("Period covered by log files: %s-%s\n"),date0,date1);
1603 getperiod_fromrange(&period,dfrom,duntil);
1604 }
1605 if (getperiod_buildtext(&period)<0) {
1606 debuga(_("Failed to build the string representation of the date range\n"));
1607 exit(EXIT_FAILURE);
1608 }
1609
25697a35
GS
1610 if(debugz){
1611 debugaz("data",dia);
fa6552b0 1612 debugaz("period",period.text);
25697a35
GS
1613 }
1614
d2fe0c32 1615 if(debug)
fa6552b0 1616 debuga(_("Period: %s\n"),period.text);
25697a35 1617
25697a35
GS
1618// fclose(fp_ou);
1619 if(fp_denied)
1620 fclose(fp_denied);
1621 if(fp_authfail)
1622 fclose(fp_authfail);
1623
58d7d8fe 1624 if(fp_log != NULL) {
2357ef77 1625 fclose(fp_log);
ff8d5836 1626 strcpy(end_hour,tbuf2);
fa6552b0
FM
1627 strftime(val2,sizeof(val2),"%d%m%Y",&period.start);
1628 strftime(val1,sizeof(val1),"%d%m%Y",&period.end);
ff8d5836
FM
1629 sprintf(val4,"%s/sarg-%s_%s-%s_%s.log",ParsedOutputLog,val2,start_hour,val1,end_hour);
1630 if (rename(arq_log,val4)) {
9426efec 1631 debuga(_("failed to rename %s to %s - %s\n"),arq_log,val4,strerror(errno));
ff8d5836
FM
1632 } else {
1633 strcpy(arq_log,val4);
1634
1635 if(strcmp(ParsedOutputLogCompress,"nocompress") != 0 && ParsedOutputLogCompress[0] != '\0') {
1636 /*
1637 No double quotes around ParsedOutputLogCompress because it may contain command line options. If double quotes are
1638 necessary around the command name, put them in the configuration file.
1639 */
1640 sprintf(val1,"%s \"%s\"",ParsedOutputLogCompress,arq_log);
1641 cstatus=system(val1);
1642 if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
9426efec
FM
1643 debuga(_("command return status %d\n"),WEXITSTATUS(cstatus));
1644 debuga(_("command: %s\n"),val1);
06b39c87 1645 exit(EXIT_FAILURE);
ff8d5836 1646 }
456d78a5 1647 }
25697a35 1648 }
d2fe0c32 1649 if(debug)
10210234 1650 debuga(_("Sarg parsed log saved as %s\n"),arq_log);
25697a35 1651 }
25697a35 1652
f84a35a3
FM
1653 if(DataFile[0] == '\0' && (ReportType & REPORT_TYPE_DENIED) != 0) {
1654 sprintf(csort,"sort -T \"%s\" -k 3,3 -k 5,5 -o \"%s\" \"%s\"",tmp,denied_sort,denied_unsort);
456d78a5
FM
1655 cstatus=system(csort);
1656 if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
9426efec
FM
1657 debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus));
1658 debuga(_("sort command: %s\n"),csort);
06b39c87 1659 exit(EXIT_FAILURE);
456d78a5 1660 }
f84a35a3 1661 unlink(denied_unsort);
25697a35 1662 }
936c9905 1663
491b862f 1664 sort_users_log(tmp, debug);
25697a35 1665
4157aa09 1666 if(DataFile[0] != '\0')
25697a35
GS
1667 data_file(tmp);
1668 else
1669 gerarel();
1670
085c1e1f 1671 if((ReportType & REPORT_TYPE_DENIED) != 0)
f84a35a3 1672 unlink(denied_sort);
936c9905 1673
d6e703cc 1674 if(strcmp(tmp,"/tmp") != 0) {
51465d08 1675 unlinkdir(tmp,0);
d6e703cc 1676 }
25697a35 1677
f2ec8c75 1678 userinfo_free();
491b862f
GS
1679 if(userfile)
1680 free(userfile);
cd025686 1681 close_usertab();
491b862f 1682
d6e703cc 1683 if(debug)
10210234 1684 debuga(_("End\n"));
d6e703cc 1685
2824ec9b 1686 exit(EXIT_SUCCESS);
25697a35
GS
1687
1688}
1689
1690
936c9905 1691static void getusers(const char *pwdfile, int debug)
25697a35
GS
1692{
1693
1694 FILE *fp_usr;
1695 char buf[255];
936c9905 1696 char *str;
39186a2f 1697 long int nreg=0;
25697a35 1698
d2fe0c32 1699 if(debug)
d574e592 1700 debuga(_("Loading password file from %s\n"),pwdfile);
25697a35
GS
1701
1702 if ((fp_usr = fopen(pwdfile, "r")) == NULL) {
d574e592 1703 debuga(_("(getusers) Cannot open file %s - %s\n"),pwdfile,strerror(errno));
06b39c87 1704 exit(EXIT_FAILURE);
25697a35
GS
1705 }
1706
6443bf6d
FM
1707 if (fseek(fp_usr, 0, SEEK_END)==-1) {
1708 debuga(_("Failed to move till the end of the users file %s: %s\n"),pwdfile,strerror(errno));
1709 exit(EXIT_FAILURE);
1710 }
d6dfc139 1711 nreg = ftell(fp_usr);
5355d243 1712 if (nreg<0) {
9426efec 1713 debuga(_("Cannot get the size of file %s\n"),pwdfile);
06b39c87 1714 exit(EXIT_FAILURE);
5355d243 1715 }
936c9905 1716 nreg = nreg+5000;
6443bf6d
FM
1717 if (fseek(fp_usr, 0, SEEK_SET)==-1) {
1718 debuga(_("Failed to rewind the users file %s: %s\n"),pwdfile,strerror(errno));
1719 exit(EXIT_FAILURE);
1720 }
25697a35
GS
1721
1722 if((userfile=(char *) malloc(nreg))==NULL){
d574e592 1723 debuga(_("malloc error (%ld)\n"),nreg);
06b39c87 1724 exit(EXIT_FAILURE);
25697a35
GS
1725 }
1726
1727 bzero(userfile,nreg);
936c9905
FM
1728 strcpy(userfile,":");
1729
1730 while(fgets(buf,sizeof(buf),fp_usr)!=NULL) {
1731 str=strchr(buf,':');
1732 if (!str) {
d574e592 1733 debuga(_("You have an invalid user in your %s file\n"),pwdfile);
06b39c87 1734 exit(EXIT_FAILURE);
936c9905 1735 }
2824ec9b 1736 str[1]='\0';
936c9905 1737 strcat(userfile,buf);
25697a35
GS
1738 }
1739
1740 fclose(fp_usr);
1741
1742 return;
1743}