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"
34 #define REPORT_EVERY_X_LINES 5000
35 #define MAX_OPEN_USER_FILES 10
39 struct userfilestruct
*next
;
40 struct userinfostruct
*user
;
44 /*@null@*/static char *userfile
=NULL
;
46 numlist weekdays
= { { 0, 1, 2, 3, 4, 5, 6 }, 7 };
47 numlist 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 };
50 static void getusers(const char *pwdfile
, int debug
);
52 int main(int argc
,char *argv
[])
63 ISACOL_Last
//last entry of the list !
71 ILF_Last
//last entry of the list !
74 FILE *fp_in
= NULL
, *fp_denied
=NULL
, *fp_authfail
=NULL
, *fp_log
=NULL
;
76 char sz_Download_Unsort
[ 20000 ] ;
77 FILE * fp_Download_Unsort
= NULL
;
89 char smartfilter
[MAXLEN
];
99 char hm
[15], hmf
[15], hmr
[15];
102 char hexclude
[MAXLEN
];
110 char denied_unsort
[MAXLEN
];
111 char denied_sort
[MAXLEN
];
112 char authfail_unsort
[MAXLEN
];
113 char start_hour
[128];
119 char user
[MAX_USER_LEN
];
120 enum InputLogFormat ilf
;
121 int ilf_count
[ILF_Last
];
133 int isa_ncols
=0,isa_cols
[ISACOL_Last
];
144 long int max_elapsed
=0;
145 long long int iyear
, imonth
, iday
;
150 unsigned long recs1
=0UL;
151 unsigned long recs2
=0UL;
152 int OutputNonZero
= REPORT_EVERY_X_LINES
;
153 bool download_flag
=false;
154 char *download_url
=NULL
;
155 struct getwordstruct gwarea
;
159 struct userinfostruct
*uinfo
;
160 struct userfilestruct
*first_user_file
, *ufile
, *ufile1
, *prev_ufile
;
162 static int convert
=0;
164 static struct option long_options
[]=
166 {"convert",no_argument
,&convert
,1},
167 {"split",no_argument
,&split
,1},
172 setlocale(LC_TIME
,"");
175 #if defined(ENABLE_NLS) && defined(HAVE_LOCALE_H)
176 if (!setlocale (LC_ALL
, "")) {
177 fprintf(stderr
,"SARG: Cannot set the locale LC_ALL to the environment variable\n");
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
));
184 if (!textdomain (PACKAGE_NAME
)) {
185 fprintf(stderr
,"SARG: Cannot set gettext domain for %s PACKAGE_NAME (%s)\n",PACKAGE_NAME
,strerror(errno
));
195 UserAgentLog
[0]='\0';
196 ExcludeHosts
[0]='\0';
197 ExcludeUsers
[0]='\0';
204 ExternalCSSFile
[0]='\0';
205 RedirectorLogFormat
[0]='\0';
207 for (ilf
=0 ; ilf
<ILF_Last
; ilf
++) ilf_count
[ilf
]=0;
209 sprintf(ExcludeCodes
,"%s/exclude_codes",SYSCONFDIR
);
210 strcpy(GraphDaysBytesBarColor
,"orange");
211 strcpy(BgColor
,"#ffffff");
212 strcpy(TxColor
,"#000000");
213 strcpy(TxBgColor
,"lavender");
214 strcpy(TiColor
,"darkblue");
217 strcpy(LogoTextColor
,"#000000");
218 strcpy(HeaderColor
,"darkblue");
219 strcpy(HeaderBgColor
,"#dddddd");
220 strcpy(LogoTextColor
,"#006699");
221 strcpy(FontSize
,"9px");
222 strcpy(TempDir
,"/tmp");
223 strcpy(OutputDir
,"/var/www/html/squid-reports");
225 strcpy(DateFormat
,"u");
226 OverwriteReport
=false;
227 RemoveTempFiles
=true;
228 strcpy(ReplaceIndex
,"index.html");
230 RecordsWithoutUser
=RECORDWITHOUTUSER_IP
;
232 strcpy(MailUtility
,"mailx");
236 strcpy(TopuserSortField
,"BYTES");
237 strcpy(UserSortField
,"BYTES");
238 strcpy(TopuserSortOrder
,"reverse");
239 strcpy(UserSortOrder
,"reverse");
240 strcpy(TopsitesSortField
,"CONNECT");
241 strcpy(TopsitesSortType
,"D");
243 strcpy(FontFace
,"Verdana,Tahoma,Arial");
244 datetimeby
=DATETIME_BYTE
;
245 strcpy(CharSet
,"ISO-8859-1");
247 strcpy(PrivacyString
,"***.***.***.***");
248 strcpy(PrivacyStringColor
,"blue");
250 TopUserFields
=TOPUSERFIELDS_NUM
| TOPUSERFIELDS_DATE_TIME
| TOPUSERFIELDS_USERID
| TOPUSERFIELDS_CONNECT
|
251 TOPUSERFIELDS_BYTES
| TOPUSERFIELDS_SETYB
| TOPUSERFIELDS_IN_CACHE_OUT
|
252 TOPUSERFIELDS_USED_TIME
| TOPUSERFIELDS_MILISEC
| TOPUSERFIELDS_PTIME
|
253 TOPUSERFIELDS_TOTAL
| TOPUSERFIELDS_AVERAGE
;
254 UserReportFields
=USERREPORTFIELDS_CONNECT
| USERREPORTFIELDS_BYTES
| USERREPORTFIELDS_SETYB
|
255 USERREPORTFIELDS_IN_CACHE_OUT
| USERREPORTFIELDS_USED_TIME
| USERREPORTFIELDS_MILISEC
|
256 USERREPORTFIELDS_PTIME
| USERREPORTFIELDS_TOTAL
| USERREPORTFIELDS_AVERAGE
;
257 strcpy(DataFileDelimiter
,";");
258 DataFileFields
=DATA_FIELD_USER
| DATA_FIELD_DATE
| DATA_FIELD_TIME
| DATA_FIELD_URL
| DATA_FIELD_CONNECT
|
259 DATA_FIELD_BYTES
| DATA_FIELD_IN_CACHE
| DATA_FIELD_OUT_CACHE
| DATA_FIELD_ELAPSED
;
260 ShowReadStatistics
=true;
261 strcpy(IndexSortOrder
,"D");
264 strcpy(ParsedOutputLog
,"no");
265 strcpy(ParsedOutputLogCompress
,"/bin/gzip -f");
266 DisplayedValues
=DISPLAY_ABBREV
;
267 strcpy(HeaderFontSize
,"9px");
268 strcpy(TitleFontSize
,"11px");
269 strcpy(AuthUserTemplateFile
,"sarg_htaccess");
270 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");
273 strcpy(GraphFont
,FONTDIR
"/DejaVuSans.ttf");
277 strcpy(Ulimit
,"20000");
278 NtlmUserFormat
=NTLMUSERFORMAT_DOMAINUSER
;
279 IndexTree
=INDEX_TREE_FILE
;
280 strcpy(RealtimeTypes
,"GET,PUT,CONNECT");
281 RealtimeUnauthRec
=REALTIME_UNAUTH_REC_SHOW
;
282 RedirectorIgnoreDate
=false;
283 DansguardianIgnoreDate
=false;
284 DataFileUrl
=DATAFILEURL_IP
;
285 strcpy(MaxElapsed
,"28800000");
286 BytesInSitesUsersReport
=0;
287 UserAuthentication
=0;
288 strcpy(LDAPHost
,"127.0.0.1");
290 LDAPProtocolVersion
=3;
293 LDAPBaseSearch
[0]='\0';
294 strcpy(LDAPFilterSearch
, "uid=%s");
295 strcpy(LDAPTargetAttr
, "cn");
319 UserInvalidChar
[0]='\0';
321 SquidGuardConf
[0]='\0';
322 DansGuardianConf
[0]='\0';
329 dansguardian_count
=0;
332 DeniedReportLimit
=10;
333 AuthfailReportLimit
=10;
334 DansGuardianReportLimit
=10;
335 SquidGuardReportLimit
=10;
336 DownloadReportLimit
=50;
345 realtime_access_log_lines
=1000;
353 bzero(IncludeUsers
, sizeof(IncludeUsers
));
354 bzero(ExcludeString
, sizeof(ExcludeString
));
355 first_user_file
=NULL
;
356 memset(&period
,0,sizeof(period
));
359 for(x
=0; x
<MAXLOGS
; x
++)
360 AccessLog
[x
][0]='\0';
361 AccessLogFromCmdLine
=0;
362 RedirectorLogFromCmdLine
=0;
364 strcpy(Title
,_("Squid User Access Report"));
366 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){
375 strcpy(uagent
,optarg
);
378 strcpy(hexclude
,optarg
);
381 strncpy(date
,optarg
,sizeof(date
)-1);
382 date
[sizeof(date
)-1]='\0';
383 date_from(date
, &dfrom
, &duntil
);
386 strcpy(email
,optarg
);
389 strcpy(ConfigFile
,optarg
);
401 if (NAccessLog
>=MAXLOGS
) {
402 debuga(_("Too many log files passed on command line with option -l.\n"));
405 if (strlen(optarg
)>=MAX_LOG_FILELEN
) {
406 debuga(_("Log file name too long passed on command line with option -l: %s\n"),optarg
);
409 strcpy(AccessLog
[NAccessLog
],optarg
);
411 AccessLogFromCmdLine
++;
414 if (NRedirectorLogs
>MAX_REDIRECTOR_LOGS
) {
415 debuga(_("Too many redirector logs passed on command line with option -L.\n"));
418 if (strlen(optarg
)>=MAX_REDIRECTOR_FILELEN
) {
419 debuga(_("Redirector log file name too long passed on command line with opton -L: %s\n"),optarg
);
422 strcpy(RedirectorLogs
[NRedirectorLogs
],optarg
);
424 RedirectorLogFromCmdLine
++;
433 strcpy(outdir
,optarg
);
448 if(strstr(optarg
,"-") == 0) {
452 getword_start(&gwarea
,optarg
);
453 if (getword(hm
,sizeof(hm
),&gwarea
,'-')<0 || getword(hmf
,sizeof(hmf
),&gwarea
,'\0')<0) {
454 debuga(_("The time range passed on the command line with option -t is invalid\n"));
458 if(sscanf(hm
,"%d:%d",&h
,&m
)!=2) {
459 debuga(_("Time period must be MM or MM:SS. Exit\n"));
462 sprintf(hm
,"%02d%02d",h
,m
);
463 if(sscanf(hmf
,"%d:%d",&h
,&m
)!=2) {
464 debuga(_("Time period must be MM or MM:SS. Exit\n"));
467 sprintf(hmf
,"%02d%02d",h
,m
);
489 debuga(_("Option -%c require an argument\n"),optopt);
505 if(debug
) debuga(_("Init\n"));
507 if(ConfigFile
[0] == '\0') snprintf(ConfigFile
,sizeof(ConfigFile
),"%s/sarg.conf",SYSCONFDIR
);
508 if(access(ConfigFile
, R_OK
) != 0) {
509 debuga(_("Cannot open config file: %s - %s\n"),ConfigFile
,strerror(errno
));
513 if(access(ConfigFile
, R_OK
) == 0)
516 if(userip
) UserIp
=true;
518 if(dns
) Ip2Name
=true;
525 if(IndexTree
== INDEX_TREE_FILE
)
526 strcpy(ImageFile
,"../images");
528 strcpy(ImageFile
,"../../../images");
531 if(DataFile
[0] != '\0')
534 if(NAccessLog
== 0) {
535 strcpy(AccessLog
[0],"/var/log/squid/access.log");
540 splitlog(AccessLog
[0], df
, dfrom
, duntil
, convert
);
544 convlog(AccessLog
[0], df
, dfrom
, duntil
);
548 load_excludecodes(ExcludeCodes
);
550 if(access(PasswdFile
, R_OK
) == 0) {
551 getusers(PasswdFile
,debug
);
555 if(hexclude
[0] == '\0')
556 strcpy(hexclude
,ExcludeHosts
);
557 if(hexclude
[0] != '\0') {
558 gethexclude(hexclude
,debug
);
562 if(ReportType
== 0) {
563 ReportType
=REPORT_TYPE_TOPUSERS
| REPORT_TYPE_TOPSITES
| REPORT_TYPE_USERS_SITES
|
564 REPORT_TYPE_SITES_USERS
| REPORT_TYPE_DATE_TIME
| REPORT_TYPE_DENIED
|
565 REPORT_TYPE_AUTH_FAILURES
| REPORT_TYPE_SITE_USER_TIME_DATE
| REPORT_TYPE_DOWNLOADS
;
568 if(access(ExcludeUsers
, R_OK
) == 0) {
569 getuexclude(ExcludeUsers
,debug
);
578 if(strcmp(ExcludeUsers
,"indexonly") == 0) indexonly
++;
579 if(Index
== INDEX_ONLY
) indexonly
++;
581 if(MaxElapsed
[0] != '\0') max_elapsed
=atol(MaxElapsed
);
583 if(outdir
[0] == '\0') strcpy(outdir
,OutputDir
);
586 if(uagent
[0] == '\0') strcpy(uagent
,UserAgentLog
);
588 if(tmp
[0] == '\0') strcpy(tmp
,TempDir
);
589 else strcpy(TempDir
,tmp
);
591 if(df
[0] == '\0') strcpy(df
,DateFormat
);
592 else strcpy(DateFormat
,df
);
596 strcpy(DateFormat
,"u");
599 IndexTree
=INDEX_TREE_FILE
;
601 if(email
[0] == '\0' && OutputEmail
[0] != '\0') strcpy(email
,OutputEmail
);
605 if(email
[0] != '\0') {
606 snprintf(wtemp2
,sizeof(wtemp2
),"%s/sarg",tmp2
);
608 strcat(tmp2
,"/sarg");
613 strcat(tmp2
,"/sarg.log");
615 sprintf(tmp3
,"%s/sarg",tmp
);
616 if(access(tmp3
, R_OK
) == 0) {
620 strcpy(denied_unsort
,tmp3
);
621 strcpy(denied_sort
,tmp3
);
622 strcpy(authfail_unsort
,tmp3
);
623 strcat(denied_unsort
,"/denied.log.unsort");
624 strcat(denied_sort
,"/denied.log");
625 strcat(authfail_unsort
,"/authfail.log.unsort");
628 debuga(_("Parameters:\n"));
629 debuga(_(" Hostname or IP address (-a) = %s\n"),addr
);
630 debuga(_(" Useragent log (-b) = %s\n"),uagent
);
631 debuga(_(" Exclude file (-c) = %s\n"),hexclude
);
632 debuga(_(" Date from-until (-d) = %s\n"),date
);
633 debuga(_(" Email address to send reports (-e) = %s\n"),email
);
634 debuga(_(" Config file (-f) = %s\n"),ConfigFile
);
635 if(strcmp(df
,"e") == 0)
636 debuga(_(" Date format (-g) = Europe (dd/mm/yyyy)\n"));
637 if(strcmp(df
,"u") == 0)
638 debuga(_(" Date format (-g) = USA (mm/dd/yyyy)\n"));
639 if(strcmp(df
,"w") == 0)
640 debuga(_(" Date format (-g) = Sites & Users (yyyy/ww)\n"));
641 debuga(_(" IP report (-i) = %s\n"),(iprel
) ? _("Yes") : _("No"));
642 for (iarq
=0 ; iarq
<NAccessLog
; iarq
++)
643 debuga(_(" Input log (-l) = %s\n"),AccessLog
[iarq
]);
644 for (iarq
=0 ; iarq
<NRedirectorLogs
; iarq
++)
645 debuga(_(" Redirector log (-L) = %s\n"),RedirectorLogs
[iarq
]);
646 debuga(_(" Resolve IP Address (-n) = %s\n"),(Ip2Name
) ? _("Yes") : _("No"));
647 debuga(_(" Output dir (-o) = %s\n"),outdir
);
648 debuga(_("Use Ip Address instead of userid (-p) = %s\n"),(UserIp
) ? _("Yes") : _("No"));
649 debuga(_(" Accessed site (-s) = %s\n"),site
);
650 debuga(_(" Time (-t) = %s\n"),hm
);
651 debuga(_(" User (-u) = %s\n"),us
);
652 debuga(_(" Temporary dir (-w) = %s\n"),tmp
);
653 debuga(_(" Debug messages (-x) = %s\n"),(debug
) ? _("Yes") : _("No"));
654 debuga(_(" Process messages (-z) = %s\n"),(debugz
) ? _("Yes") : _("No"));
659 printf(_("Parameters:\n"));
660 printf(_(" Hostname or IP address (-a) = %s\n"),addr
);
661 printf(_(" Useragent log (-b) = %s\n"),uagent
);
662 printf(_(" Exclude file (-c) = %s\n"),hexclude
);
663 printf(_(" Date from-until (-d) = %s\n"),date
);
664 printf(_(" Email address to send reports (-e) = %s\n"),email
);
665 printf(_(" Config file (-f) = %s\n"),ConfigFile
);
666 if(strcmp(df
,"e") == 0)
667 printf(_(" Date format (-g) = Europe (dd/mm/yyyy)\n"));
668 if(strcmp(df
,"u") == 0)
669 printf(_(" Date format (-g) = USA (mm/dd/yyyy)\n"));
670 if(strcmp(df
,"w") == 0)
671 printf(_(" Date format (-g) = Sites & Users (yyyy/ww)\n"));
672 printf(_(" IP report (-i) = %s\n"),(iprel
) ? _("Yes") : _("No"));
673 for (iarq
=0 ; iarq
<NAccessLog
; iarq
++)
674 printf(_(" Input log (-l) = %s\n"),AccessLog
[iarq
]);
675 for (iarq
=0 ; iarq
<NRedirectorLogs
; iarq
++)
676 printf(_(" Redirector log (-L) = %s\n"),RedirectorLogs
[iarq
]);
677 printf(_(" Resolve IP Address (-n) = %s\n"),(Ip2Name
) ? _("Yes") : _("No"));
678 printf(_(" Output dir (-o) = %s\n"),outdir
);
679 printf(_("Use Ip Address instead of userid (-p) = %s\n"),(UserIp
) ? _("Yes") : _("No"));
680 printf(_(" Accessed site (-s) = %s\n"),site
);
681 printf(_(" Time (-t) = %s\n"),hm
);
682 printf(_(" User (-u) = %s\n"),us
);
683 printf(_(" Temporary dir (-w) = %s\n"),tmp
);
684 printf(_(" Debug messages (-x) = %s\n"),(debug
) ? _("Yes") : _("No"));
685 printf(_(" Process messages (-z) = %s\n"),(debugz
) ? _("Yes") : _("No"));
686 printf(_("sarg version: %s\n"),VERSION
);
690 debuga(_("sarg version: %s\n"),VERSION
);
692 maxopenfiles
=MAX_OPEN_USER_FILES
;
694 if (Ulimit
[0] != '\0') {
699 #if defined(RLIMIT_NOFILE)
700 getrlimit (RLIMIT_NOFILE
, &rl
);
701 #elif defined(RLIMIT_OFILE)
702 getrlimit (RLIMIT_OFILE
, &rl
);
704 #warning "No rlimit resource for the number of open files"
709 rl
.rlim_cur
= atol(Ulimit
);
710 rl
.rlim_max
= atol(Ulimit
);
711 #if defined(RLIMIT_NOFILE)
712 rc
=setrlimit (RLIMIT_NOFILE
, &rl
);
713 #elif defined(RLIMIT_OFILE)
714 rc
=setrlimit (RLIMIT_OFILE
, &rl
);
716 #warning "No rlimit resource for the number of open files"
719 debuga(_("setrlimit error - %s\n"),strerror(errno
));
723 debuga("Maximum file descriptor: cur=%ld max=%ld, changed to cur="RLIM_STRING
" max="RLIM_STRING
,l1
,l2
,rl
.rlim_cur
,rl
.rlim_max
);
727 init_usertab(UserTabFile
);
729 if ((line
=longline_create())==NULL
) {
730 debuga(_("Not enough memory to read a log file\n"));
734 snprintf(sz_Download_Unsort
,sizeof(sz_Download_Unsort
),"%s/sarg/download.unsort", tmp
);
736 if(DataFile
[0]=='\0') {
737 if((ReportType
& REPORT_TYPE_DENIED
) != 0) {
738 if((fp_denied
=MY_FOPEN(denied_unsort
,"w"))==NULL
) {
739 debuga(_("(log) Cannot open file: %s - %s\n"),denied_unsort
,strerror(errno
));
744 if((ReportType
& REPORT_TYPE_DENIED
) != 0 || (ReportType
& REPORT_TYPE_AUTH_FAILURES
) != 0) {
745 if((fp_authfail
=MY_FOPEN(authfail_unsort
,"w"))==NULL
) {
746 debuga(_("(log) Cannot open file: %s - %s\n"),authfail_unsort
,strerror(errno
));
752 for (iarq
=0 ; iarq
<NAccessLog
; iarq
++) {
753 strcpy(arq
,AccessLog
[iarq
]);
757 if(strcmp(arq
,"-")==0) {
759 debuga(_("Reading access log file: from stdin\n"));
764 if (stat(arq
,&logstat
)!=0) {
765 debuga(_("Cannot get the modification time of input log file %s (%s). Processing it anyway\n"),arq
,strerror(errno
));
767 struct tm
*logtime
=localtime(&logstat
.st_mtime
);
768 if ((logtime
->tm_year
+1900)*10000+(logtime
->tm_mon
+1)*100+logtime
->tm_mday
<dfrom
) {
769 debuga(_("Ignoring old log file %s\n"),arq
);
774 fp_in
=decomp(arq
,&from_pipe
);
776 debuga(_("(log) Cannot open log file: %s - %s\n"),arq
,strerror(errno
));
779 if(debug
) debuga(_("Reading access log file: %s\n"),arq
);
784 // pre-read the file only if we have to show stats
785 if(ShowReadStatistics
&& !from_stdin
&& !from_pipe
) {
793 while ((nread
=fread(tmp4
,1,sizeof(tmp4
),fp_in
))>0) {
794 for (i
=0 ; i
<nread
; i
++)
796 if (tmp4
[i
]!='\n' && tmp4
[i
]!='\r') {
800 if (tmp4
[i
]=='\n' || tmp4
[i
]=='\r') {
807 printf(_("SARG: Records in file: %lu, reading: %3.2f%%"),recs1
,(float) 0);
812 longline_reset(line
);
814 while ((linebuf
=longline_read(fp_in
,line
))!=NULL
) {
815 blen
=strlen(linebuf
);
817 if (ilf
==ILF_Unknown
) {
818 if(strncmp(linebuf
,"#Software: Mic",14) == 0) {
819 fixendofline(linebuf
);
821 debuga(_("Log is from Microsoft ISA: %s\n"),linebuf
);
827 if(strncmp(linebuf
,"*** SARG Log ***",16) == 0) {
828 if (getperiod_fromsarglog(arqtt
,&period
)<0) {
829 debuga(_("The name of the file is invalid: %s\n"),arq
);
838 if(!fp_log
&& strcmp(ParsedOutputLog
, "no") != 0 && ilf
!=ILF_Sarg
) {
839 if(access(ParsedOutputLog
,R_OK
) != 0) {
840 my_mkdir(ParsedOutputLog
);
842 sprintf(arq_log
,"%s/sarg_temp.log",ParsedOutputLog
);
843 if((fp_log
=MY_FOPEN(arq_log
,"w"))==NULL
) {
844 debuga(_("(log) Cannot open log file: %s - %s\n"),arq_log
,strerror(errno
));
847 fputs("*** SARG Log ***\n",fp_log
);
851 if( ShowReadStatistics
&& !from_stdin
&& --OutputNonZero
<=0) {
852 double perc
= recs2
* 100. / recs1
;
853 printf(_("SARG: Records in file: %lu, reading: %3.2lf%%"),recs1
,perc
);
856 OutputNonZero
= REPORT_EVERY_X_LINES
;
858 if(blen
< 58) continue;
859 if(strstr(linebuf
,"HTTP/0.0") != 0) continue;
860 if(strstr(linebuf
,"logfile turned over") != 0) continue;
861 if(linebuf
[0] == ' ') continue;
864 if(ExcludeString
[0] != '\0') {
866 getword_start(&gwarea
,ExcludeString
);
867 while(strchr(gwarea
.current
,':') != 0) {
868 if (getword_multisep(val1
,sizeof(val1
),&gwarea
,':')<0) {
869 debuga(_("Maybe you have a broken record or garbage in your exclusion string\n"));
872 if((str
=(char *) strstr(linebuf
,val1
)) != (char *) NULL
) {
877 if(!exstring
&& (str
=(char *) strstr(linebuf
,gwarea
.current
)) != (char *) NULL
)
879 if(exstring
) continue;
884 printf("BUF=%s\n",linebuf
);
887 if (ilf
==ILF_Squid
|| ilf
==ILF_Common
|| ilf
==ILF_Unknown
) {
888 getword_start(&gwarea
,linebuf
);
889 if (getword(data
,sizeof(data
),&gwarea
,' ')<0) {
890 debuga(_("Maybe you have a broken time in your access.log file\n"));
893 if((str
=(char *) strchr(data
, '.')) != (char *) NULL
&& (str
=(char *) strchr(str
+1, '.')) != (char *) NULL
) {
897 if (getword(user
,sizeof(user
),&gwarea
,' ')<0 || getword_skip(255,&gwarea
,' ')<0) {
898 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
902 if (getword_skip(255,&gwarea
,' ')<0 || getword(user
,sizeof(user
),&gwarea
,' ')<0) {
903 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
907 if (getword(data
,sizeof(data
),&gwarea
,']')<0 || getword_skip(MAXLEN
,&gwarea
,'"')<0 ||
908 getword(fun
,sizeof(fun
),&gwarea
,' ')<0) {
909 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
912 if (getword_ptr(linebuf
,&url
,&gwarea
,' ')<0) {
913 debuga(_("Maybe you have a broken url in your %s file\n"),arq
);
916 if (getword_skip(MAXLEN
,&gwarea
,' ')<0) {
917 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
920 if (getword(code2
,sizeof(code2
),&gwarea
,' ')<0) {
921 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
924 if (getword(tam
,sizeof(tam
),&gwarea
,' ')<0) {
925 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
928 if((str
=(char *) strchr(gwarea
.current
, ' ')) != (char *) NULL
) {
929 if (getword(code
,sizeof(code
),&gwarea
,' ')<0) {
930 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
934 if (getword(code
,sizeof(code
),&gwarea
,'\0')<0) {
935 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
940 if ((str
= strchr(code
, ':')) != NULL
)
943 if(strcmp(tam
,"\0") == 0)
949 getword_start(&gwarea
,data
+1);
950 if (getword_multisep(data
,sizeof(data
),&gwarea
,':')<0){
951 debuga(_("Maybe you have a broken date in your %s file\n"),arq
);
954 if (getword_multisep(hora
,sizeof(hora
),&gwarea
,' ')<0){
955 debuga(_("Maybe you have a broken date in your %s file\n"),arq
);
958 getword_start(&gwarea
,data
);
959 if (getword_atoll(&iday
,&gwarea
,'/')<0){
960 debuga(_("Maybe you have a broken date in your %s file\n"),arq
);
963 if (getword(mes
,sizeof(mes
),&gwarea
,'/')<0){
964 debuga(_("Maybe you have a broken date in your %s file\n"),arq
);
967 if (getword_atoll(&iyear
,&gwarea
,'/')<0){
968 debuga(_("Maybe you have a broken date in your %s file\n"),arq
);
972 imonth
=month2num(mes
)+1;
973 idata
=builddia(iday
,imonth
,iyear
);
974 computedate(iyear
,imonth
,iday
,&tt
);
978 if(ilf
==ILF_Unknown
|| ilf
==ILF_Squid
) {
979 if (getword(elap
,sizeof(elap
),&gwarea
,' ')<0) {
980 debuga(_("Maybe you have a broken elapsed time in your %s file\n"),arq
);
983 while(strcmp(elap
,"") == 0 && gwarea
.current
[0] != '\0')
984 if (getword(elap
,sizeof(elap
),&gwarea
,' ')<0) {
985 debuga(_("Maybe you have a broken elapsed time in your %s file\n"),arq
);
988 if(strlen(elap
) < 1) continue;
989 if (getword(ip
,sizeof(ip
),&gwarea
,' ')<0){
990 debuga(_("Maybe you have a broken client IP address in your %s file\n"),arq
);
993 if (getword(code
,sizeof(code
),&gwarea
,' ')<0){
994 debuga(_("Maybe you have a broken result code in your %s file\n"),arq
);
997 if (getword(tam
,sizeof(tam
),&gwarea
,' ')<0){
998 debuga(_("Maybe you have a broken amount of data in your %s file\n"),arq
);
1001 if (getword(fun
,sizeof(fun
),&gwarea
,' ')<0){
1002 debuga(_("Maybe you have a broken request method in your %s file\n"),arq
);
1005 if (getword_ptr(linebuf
,&url
,&gwarea
,' ')<0){
1006 debuga(_("Maybe you have a broken url in your %s file\n"),arq
);
1009 if (getword(user
,sizeof(user
),&gwarea
,' ')<0){
1010 debuga(_("Maybe you have a broken user ID in your %s file\n"),arq
);
1019 debuga(_("Cannot convert the timestamp from the squid log file\n"));
1023 strftime(tbuf2
, sizeof(tbuf2
), "%H%M", t
);
1025 idata
=(t
->tm_year
+1900)*10000+(t
->tm_mon
+1)*100+t
->tm_mday
;
1028 if (ilf
==ILF_Sarg
) {
1029 getword_start(&gwarea
,linebuf
);
1030 if (getword(data
,sizeof(data
),&gwarea
,'\t')<0){
1031 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1034 if (getword(hora
,sizeof(hora
),&gwarea
,'\t')<0) {
1035 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1038 if (getword(user
,sizeof(user
),&gwarea
,'\t')<0) {
1039 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1042 if (getword(ip
,sizeof(ip
),&gwarea
,'\t')<0) {
1043 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1046 if (getword_ptr(linebuf
,&url
,&gwarea
,'\t')<0){
1047 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1050 if (getword(tam
,sizeof(tam
),&gwarea
,'\t')<0){
1051 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1054 if (getword(code
,sizeof(code
),&gwarea
,'\t')<0){
1055 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1058 if (getword(elap
,sizeof(elap
),&gwarea
,'\t')<0){
1059 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1062 if (getword(smartfilter
,sizeof(smartfilter
),&gwarea
,'\0')<0){
1063 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1066 getword_start(&gwarea
,data
);
1067 if (getword_atoll(&iday
,&gwarea
,'/')<0 || iday
<1 || iday
>31){
1068 debuga(_("Maybe you have a broken date in your %s file\n"),arq
);
1071 if (getword_atoll(&imonth
,&gwarea
,'/')<0 || imonth
<1 || imonth
>12){
1072 debuga(_("Maybe you have a broken date in your %s file\n"),arq
);
1075 if (getword_atoll(&iyear
,&gwarea
,'\0')<0){
1076 debuga(_("Maybe you have a broken date in your %s file\n"),arq
);
1079 idata
=builddia(iday
,imonth
,iyear
);
1080 computedate(iyear
,imonth
,iday
,&tt
);
1084 if (linebuf
[0] == '#') {
1085 int ncols
,cols
[ISACOL_Last
];
1087 fixendofline(linebuf
);
1088 getword_start(&gwarea
,linebuf
);
1089 // remove the #Fields: column at the beginning of the line
1090 if (getword_skip(1000,&gwarea
,' ')<0){
1091 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1094 for (ncols
=0 ; ncols
<ISACOL_Last
; ncols
++) cols
[ncols
]=-1;
1096 while(gwarea
.current
[0] != '\0') {
1097 if (getword(val1
,sizeof(val1
),&gwarea
,'\t')<0){
1098 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1101 if(strcmp(val1
,"c-ip") == 0) cols
[ISACOL_Ip
]=ncols
;
1102 if(strcmp(val1
,"cs-username") == 0) cols
[ISACOL_UserName
]=ncols
;
1103 if(strcmp(val1
,"date") == 0) cols
[ISACOL_Date
]=ncols
;
1104 if(strcmp(val1
,"time") == 0) cols
[ISACOL_Time
]=ncols
;
1105 if(strcmp(val1
,"time-taken") == 0) cols
[ISACOL_TimeTaken
]=ncols
;
1106 if(strcmp(val1
,"sc-bytes") == 0) cols
[ISACOL_Bytes
]=ncols
;
1107 if(strcmp(val1
,"cs-uri") == 0) cols
[ISACOL_Uri
]=ncols
;
1108 if(strcmp(val1
,"sc-status") == 0) cols
[ISACOL_Status
]=ncols
;
1111 if (cols
[ISACOL_Ip
]>=0) {
1113 for (ncols
=0 ; ncols
<ISACOL_Last
; ncols
++)
1114 isa_cols
[ncols
]=cols
[ncols
];
1118 if (!isa_ncols
) continue;
1119 getword_start(&gwarea
,linebuf
);
1120 for (x
=0 ; x
<isa_ncols
; x
++) {
1121 if (getword_ptr(linebuf
,&str
,&gwarea
,'\t')<0) {
1122 debuga(_("Maybe you have a broken record or garbage in your %s file\n"),arq
);
1125 if (x
==isa_cols
[ISACOL_Ip
]) {
1126 if (strlen(str
)>=sizeof(ip
)) {
1127 debuga(_("Maybe you have a broken IP in your %s file\n"),arq
);
1131 } else if (x
==isa_cols
[ISACOL_UserName
]) {
1132 if (strlen(str
)>=sizeof(user
)) {
1133 debuga(_("Maybe you have a broken user ID in your %s file\n"),arq
);
1137 } else if (x
==isa_cols
[ISACOL_Date
]) {
1138 if (strlen(str
)>=sizeof(data
)) {
1139 debuga(_("Maybe you have a broken date in your %s file\n"),arq
);
1143 } else if (x
==isa_cols
[ISACOL_Time
]) {
1144 if (strlen(str
)>=sizeof(hora
)) {
1145 debuga(_("Maybe you have a broken time in your %s file\n"),arq
);
1149 } else if (x
==isa_cols
[ISACOL_TimeTaken
]) {
1150 if (strlen(str
)>=sizeof(elap
)) {
1151 debuga(_("Maybe you have a broken download duration in your %s file\n"),arq
);
1155 } else if (x
==isa_cols
[ISACOL_Bytes
]) {
1156 if (strlen(str
)>=sizeof(tam
)) {
1157 debuga(_("Maybe you have a broken download size in your %s file\n"),arq
);
1161 } else if (x
==isa_cols
[ISACOL_Uri
]) {
1163 } else if (x
==isa_cols
[ISACOL_Status
]) {
1164 if (strlen(str
)>=sizeof(code
)) {
1165 debuga(_("Maybe you have a broken access code in your %s file\n"),arq
);
1172 if(strcmp(code
,"401") == 0 || strcmp(code
,"403") == 0 || strcmp(code
,"407") == 0) {
1173 sprintf(val1
,"DENIED/%s",code
);
1176 getword_start(&gwarea
,data
);
1177 if (getword_atoll(&iyear
,&gwarea
,'-')<0){
1178 debuga(_("Maybe you have a broken year in your %s file\n"),arq
);
1181 if (getword_atoll(&imonth
,&gwarea
,'-')<0){
1182 debuga(_("Maybe you have a broken month in your %s file\n"),arq
);
1185 if (getword_atoll(&iday
,&gwarea
,'\0')<0){
1186 debuga(_("Maybe you have a broken day in your %s file\n"),arq
);
1190 idata
=builddia(iday
,imonth
,iyear
);
1191 computedate(iyear
,imonth
,iday
,&tt
);
1195 debuga(_("Unknown input log file format\n"));
1199 strftime(dia
, sizeof(dia
), "%d/%m/%Y", t
);
1200 snprintf(hora
,sizeof(hora
),"%02d:%02d:%02d",t
->tm_hour
,t
->tm_min
,t
->tm_sec
);
1203 printf("DATE=%s IDATA=%d DFROM=%d DUNTIL=%d\n",date
,idata
,dfrom
,duntil
);
1205 if(date
[0] != '\0'){
1206 if(idata
< dfrom
|| idata
> duntil
) continue;
1209 // Record only hours usage which is required
1211 if( bsearch( &( t
-> tm_wday
), weekdays
.list
, weekdays
.len
,
1212 sizeof( int ), compar
) == NULL
)
1215 if( bsearch( &( t
-> tm_hour
), hours
.list
, hours
.len
,
1216 sizeof( int ), compar
) == NULL
)
1221 if(strlen(user
) > MAX_USER_LEN
) {
1222 if (debugm
) printf(_("User ID too long: %s\n"),user
);
1228 if(IncludeUsers
[0] != '\0') {
1229 sprintf(val1
,":%s:",user
);
1230 if((str
=(char *) strstr(IncludeUsers
,val1
)) == (char *) NULL
)
1235 if (debugm
) printf(_("Excluded code: %s\n"),code
);
1240 if(testvaliduserchar(user
))
1244 if((str
= strstr(user
,"%20")) != NULL
) {
1246 This is a patch introduced to solve bug #1624251 reported at sourceforge but
1247 the side effect is to truncate the name at the first space and merge the reports
1248 of people whose name is identical up to the first space.
1250 The old code used to truncate the user name at the first % if a %20 was
1251 found anywhere in the string. That means the string could be truncated
1252 at the wrong place if another % occured before the %20. This new code should
1253 avoid that problem and only truncate at the space. There is no bug
1254 report indicating that anybody noticed this.
1260 Code prior to 2.2.7 used to replace any %xx by a dot as long as a %5c was
1261 found in the user name.
1263 while((str
= strstr(user
,"%5c")) != NULL
) {
1265 for (x
=3 ; str
[x
] ; x
++) str
[x
-2]=str
[x
];
1273 The full URL is not saved in sarg log. There is no point in testing the URL to detect
1276 download_flag
=is_download_suffix(url
);
1277 if (download_flag
) {
1282 download_flag
=false;
1284 // remove any protocol:// at the beginning of the URL
1285 if ((str
= strchr(url
,'/')) != NULL
&& str
[1] == '/') {
1289 for (i
=0 ; str
[i
] ; i
++)
1295 url_hostname(url
,hostname
,sizeof(hostname
));
1299 if(url
[0] == '\0') continue;
1301 if(addr
[0] != '\0'){
1302 if(strcmp(addr
,ip
)!=0) continue;
1305 if(!vhexclude(url
)) {
1306 if (debugm
) printf(_("Excluded site: %s\n"),url
);
1315 getword_start(&gwarea
,hora
);
1317 if (getword_multisep(warea
,sizeof(warea
),&gwarea
,':')<0){
1318 debuga(_("Maybe you have a broken time in your %s file\n"),arq
);
1321 strncat(hmr
,warea
,2);
1324 strncat(hmr
,gwarea
.current
,2);
1326 if(atoi(hmr
) < atoi(hm
) || atoi(hmr
) > atoi(hmf
)) continue;
1329 if(site
[0] != '\0'){
1330 if(strstr(url
,site
)==0) continue;
1338 if(strcmp(user
,"-") == 0 || strcmp(user
," ") == 0 || strcmp(user
,"") == 0) {
1339 if(RecordsWithoutUser
== RECORDWITHOUTUSER_IP
) {
1343 if(RecordsWithoutUser
== RECORDWITHOUTUSER_IGNORE
)
1345 if(RecordsWithoutUser
== RECORDWITHOUTUSER_EVERYBODY
)
1346 strcpy(user
,"everybody");
1349 if(NtlmUserFormat
== NTLMUSERFORMAT_USER
) {
1350 if((str
= strchr(user
,'_')) != 0) {
1351 strcpy(warea
,str
+1);
1354 if((str
= strchr(user
,'+')) != 0) {
1355 strcpy(warea
,str
+1);
1363 if(strcmp(user
,us
)!=0) continue;
1367 sprintf(wuser
,":%s:",user
);
1368 if(strstr(userfile
, wuser
) == 0)
1373 if(!vuexclude(user
)) {
1374 if (debugm
) printf(_("Excluded user: %s\n"),user
);
1380 if(strcmp(user
,"-") ==0 || strcmp(user
," ") ==0 || strcmp(user
,"") ==0 || strcmp(user
,":") ==0)
1384 if(atol(elap
)>max_elapsed
) {
1390 if((str
=(char *) strstr(linebuf
, "[SmartFilter:")) != (char *) NULL
) {
1392 sprintf(smartfilter
,"\"%s\"",str
+1);
1393 } else sprintf(smartfilter
,"\"\"");
1397 for (ufile
=first_user_file
; ufile
&& strcmp(user
,ufile
->user
->id
)!=0 ; ufile
=ufile
->next
) {
1399 if (ufile
->file
) nopen
++;
1402 ufile
=malloc(sizeof(*ufile
));
1404 debuga(_("Not enough memory to store the user %s\n"),user
);
1407 memset(ufile
,0,sizeof(*ufile
));
1408 ufile
->next
=first_user_file
;
1409 first_user_file
=ufile
;
1410 uinfo
=userinfo_create(user
);
1412 uinfo
->id_is_ip
=id_is_ip
;
1415 prev_ufile
->next
=ufile
->next
;
1416 ufile
->next
=first_user_file
;
1417 first_user_file
=ufile
;
1421 if (ufile
->file
==NULL
) {
1422 if (nopen
>=maxopenfiles
) {
1424 for (ufile1
=first_user_file
; ufile1
; ufile1
=ufile1
->next
) {
1425 if (ufile1
->file
!=NULL
) {
1426 if (x
>=maxopenfiles
) {
1427 if (fclose(ufile1
->file
)==EOF
) {
1428 debuga(_("Failed to close the log file of user %s - %s\n"),ufile1
->user
->id
,strerror(errno
));
1437 if (snprintf (tmp3
, sizeof(tmp3
), "%s/sarg/%s.unsort", tmp
, ufile
->user
->filename
)>=sizeof(tmp3
)) {
1438 debuga(_("Temporary user file name too long: %s/sarg/%s.unsort\n"), tmp
, ufile
->user
->filename
);
1441 if ((ufile
->file
= MY_FOPEN (tmp3
, "a")) == NULL
) {
1442 debuga(_("(log) Cannot open temporary file: %s - %s\n"), tmp3
, strerror(errno
));
1447 /*if ( strcmp ( user , sz_Last_User ) != 0 ) {
1448 if ( fp_Write_User )
1449 fclose( fp_Write_User ) ;
1450 sprintf (tmp3, "%s/sarg/%s.unsort", tmp, user);
1452 if ((fp_Write_User = MY_FOPEN (tmp3, "a")) == NULL) {
1453 fprintf (stderr, "%s: (log) %s: %s - %s\n", argv[0], _("Cannot open temporary file"), tmp3, strerror(errno));
1456 strcpy( sz_Last_User , user ) ;
1458 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) {
1459 debuga(_("Write error in the log file of user %s\n"),user
);
1463 if(fp_log
&& ilf
!=ILF_Sarg
)
1464 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
);
1468 if(!dataonly
&& download_flag
&& download_url
&& strstr(code
,"DENIED") == 0) {
1471 if ( ! fp_Download_Unsort
) {
1472 if ((fp_Download_Unsort
= MY_FOPEN ( sz_Download_Unsort
, "a")) == NULL
) {
1473 debuga(_("(log) Cannot open temporary file: %s - %s\n"),tmp3
, strerror(errno
));
1477 fprintf(fp_Download_Unsort
,"%s\t%s\t%s\t%s\t%s\n",dia
,hora
,user
,ip
,download_url
);
1480 if((ReportType
& REPORT_TYPE_DENIED
) != 0 || (ReportType
& REPORT_TYPE_AUTH_FAILURES
) != 0) {
1481 if(fp_denied
&& strstr(code
,"DENIED/403") != 0) {
1482 fprintf(fp_denied
, "%s\t%s\t%s\t%s\t%s\n",dia
,hora
,user
,ip
,urly
);
1485 if(fp_authfail
&& (strstr(code
,"DENIED/401") != 0 || strstr(code
,"DENIED/407") != 0)) {
1486 fprintf(fp_authfail
, "%s\t%s\t%s\t%s\t%s\n",dia
,hora
,user
,ip
,urly
);
1491 if (ilf
!=ILF_Sarg
) {
1492 if(!totper
|| idata
<mindate
){
1494 memcpy(&period
.start
,t
,sizeof(*t
));
1495 strcpy(start_hour
,tbuf2
);
1497 if (!totper
|| idata
>maxdate
) {
1499 memcpy(&period
.end
,t
,sizeof(*t
));
1505 printf("IP=\t%s\n",ip
);
1506 printf("USER=\t%s\n",user
);
1507 printf("ELAP=\t%s\n",elap
);
1508 printf("DATE=\t%s\n",dia
);
1509 printf("TIME=\t%s\n",hora
);
1510 printf("FUNC=\t%s\n",fun
);
1511 printf("URL=\t%s\n",url
);
1512 printf("CODE=\t%s\n",code
);
1513 printf("LEN=\t%s\n",tam
);
1521 if( ShowReadStatistics
)
1522 printf(_("SARG: Records in file: %lu, reading: %3.2f%%\n"),recs1
, (float) 100 );
1527 debuga(_(" Records read: %ld, written: %ld, excluded: %ld\n"),totregsl
,totregsg
,totregsx
);
1529 longline_destroy(&line
);
1530 if ( fp_Download_Unsort
)
1531 fclose (fp_Download_Unsort
);
1533 for (ufile
=first_user_file
; ufile
; ufile
=ufile1
) {
1535 if (ufile
->file
!=NULL
) fclose(ufile
->file
);
1540 free_excludecodes();
1546 for (ilf
=0 ; ilf
<ILF_Last
; ilf
++) totalcount
+=ilf_count
[ilf
];
1548 if(ilf_count
[ILF_Common
]>0 && ilf_count
[ILF_Squid
]>0)
1549 debuga(_("Log with mixed records format (squid and common log)\n"));
1551 if(ilf_count
[ILF_Common
]>0 && ilf_count
[ILF_Squid
]==0)
1552 debuga(_("Common log format\n"));
1554 if(ilf_count
[ILF_Common
]==0 && ilf_count
[ILF_Squid
]>0)
1555 debuga(_("Squid log format\n"));
1557 if(ilf_count
[ILF_Sarg
]>0)
1558 debuga(_("Sarg log format\n"));
1560 if(totalcount
==0 && totregsg
)
1561 debuga(_("Log with invalid format\n"));
1565 debuga(_("No records found\n"));
1567 if(fp_denied
) fclose(fp_denied
);
1568 if(fp_authfail
) fclose(fp_authfail
);
1570 if(userfile
) free(userfile
);
1575 if (date
[0]!='\0') {
1576 char date0
[30], date1
[30];
1578 strftime(date0
,sizeof(date0
),"%d/%m/%Y",&period
.start
);
1579 strftime(date1
,sizeof(date1
),"%d/%m/%Y",&period
.end
);
1580 debuga(_("Period covered by log files: %s-%s\n"),date0
,date1
);
1581 getperiod_fromrange(&period
,dfrom
,duntil
);
1583 if (getperiod_buildtext(&period
)<0) {
1584 debuga(_("Failed to build the string representation of the date range\n"));
1589 debugaz("data",dia
);
1590 debugaz("period",period
.text
);
1594 debuga(_("Period: %s\n"),period
.text
);
1600 fclose(fp_authfail
);
1602 if(fp_log
!= NULL
) {
1604 strcpy(end_hour
,tbuf2
);
1605 strftime(val2
,sizeof(val2
),"%d%m%Y",&period
.start
);
1606 strftime(val1
,sizeof(val1
),"%d%m%Y",&period
.end
);
1607 sprintf(val4
,"%s/sarg-%s_%s-%s_%s.log",ParsedOutputLog
,val2
,start_hour
,val1
,end_hour
);
1608 if (rename(arq_log
,val4
)) {
1609 debuga(_("failed to rename %s to %s - %s\n"),arq_log
,val4
,strerror(errno
));
1611 strcpy(arq_log
,val4
);
1613 if(strcmp(ParsedOutputLogCompress
,"nocompress") != 0 && ParsedOutputLogCompress
[0] != '\0') {
1615 No double quotes around ParsedOutputLogCompress because it may contain command line options. If double quotes are
1616 necessary around the command name, put them in the configuration file.
1618 sprintf(val1
,"%s \"%s\"",ParsedOutputLogCompress
,arq_log
);
1619 cstatus
=system(val1
);
1620 if (!WIFEXITED(cstatus
) || WEXITSTATUS(cstatus
)) {
1621 debuga(_("command return status %d\n"),WEXITSTATUS(cstatus
));
1622 debuga(_("command: %s\n"),val1
);
1628 debuga(_("Sarg parsed log saved as %s\n"),arq_log
);
1631 if(DataFile
[0] == '\0' && (ReportType
& REPORT_TYPE_DENIED
) != 0) {
1632 sprintf(csort
,"sort -T \"%s\" -k 3,3 -k 5,5 -o \"%s\" \"%s\"",tmp
,denied_sort
,denied_unsort
);
1633 cstatus
=system(csort
);
1634 if (!WIFEXITED(cstatus
) || WEXITSTATUS(cstatus
)) {
1635 debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus
));
1636 debuga(_("sort command: %s\n"),csort
);
1639 unlink(denied_unsort
);
1642 sort_users_log(tmp
, debug
);
1644 if(DataFile
[0] != '\0')
1650 if((ReportType
& REPORT_TYPE_DENIED
) != 0)
1651 unlink(denied_sort
);
1653 if(strcmp(tmp
,"/tmp") != 0) {
1670 static void getusers(const char *pwdfile
, int debug
)
1679 debuga(_("Loading password file from %s\n"),pwdfile
);
1681 if ((fp_usr
= fopen(pwdfile
, "r")) == NULL
) {
1682 debuga(_("(getusers) Cannot open file %s - %s\n"),pwdfile
,strerror(errno
));
1686 if (fseek(fp_usr
, 0, SEEK_END
)==-1) {
1687 debuga(_("Failed to move till the end of the users file %s: %s\n"),pwdfile
,strerror(errno
));
1690 nreg
= ftell(fp_usr
);
1692 debuga(_("Cannot get the size of file %s\n"),pwdfile
);
1696 if (fseek(fp_usr
, 0, SEEK_SET
)==-1) {
1697 debuga(_("Failed to rewind the users file %s: %s\n"),pwdfile
,strerror(errno
));
1701 if((userfile
=(char *) malloc(nreg
))==NULL
){
1702 debuga(_("malloc error (%ld)\n"),nreg
);
1706 bzero(userfile
,nreg
);
1707 strcpy(userfile
,":");
1709 while(fgets(buf
,sizeof(buf
),fp_usr
)!=NULL
) {
1710 str
=strchr(buf
,':');
1712 debuga(_("You have an invalid user in your %s file\n"),pwdfile
);
1716 strcat(userfile
,buf
);